Advertisement
Silverlan

Lua Animation Event system for SNPCs

Sep 28th, 2011
254
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 3.27 KB | None | 0 0
  1. AE_INVALID = -1
  2. AE_EMPTY = 0
  3. AE_NPC_LEFTFOOT = 1
  4. AE_NPC_RIGHTFOOT = 2
  5. AE_NPC_BODYDROP_LIGHT = 3
  6. AE_NPC_BODYDROP_HEAVY = 4
  7. AE_NPC_SWISHSOUND = 5
  8. AE_NPC_180TURN = 6
  9. AE_NPC_ITEM_PICKUP = 7
  10. AE_NPC_WEAPON_DROP = 8
  11. AE_NPC_WEAPON_SET_SEQUENCE_NAME = 9
  12. AE_NPC_WEAPON_SET_SEQUENCE_NUMBER = 10
  13. AE_NPC_WEAPON_SET_ACTIVITY = 11
  14. AE_NPC_HOLSTER = 12
  15. AE_NPC_DRAW = 13
  16. AE_NPC_WEAPON_FIRE = 14
  17. AE_CL_PLAYSOUND = 15
  18. AE_SV_PLAYSOUND = 16
  19. AE_CL_STOPSOUND = 17
  20. AE_START_SCRIPTED_EFFECT = 18
  21. AE_STOP_SCRIPTED_EFFECT = 19
  22. AE_CLIENT_EFFECT_ATTACH = 20
  23. AE_MUZZLEFLASH = 21
  24. AE_NPC_MUZZLEFLASH = 22
  25. AE_THUMPER_THUMP = 23
  26. AE_AMMOCRATE_PICKUP_AMMO = 24
  27. AE_NPC_RAGDOLL = 25
  28. AE_NPC_ADDGESTURE = 26
  29. AE_NPC_RESTARTGESTURE = 27
  30. AE_NPC_ATTACK_BROADCAST = 28
  31. AE_NPC_HURT_INTERACTION_PARTNER = 29
  32. AE_NPC_SET_INTERACTION_CANTDIE = 30
  33. AE_SV_DUSTTRAIL = 31
  34. AE_CL_CREATE_PARTICLE_EFFECT = 32
  35. AE_RAGDOLL = 33
  36. AE_CL_ENABLE_BODYGROUP = 34
  37. AE_CL_DISABLE_BODYGROUP = 35
  38. AE_CL_BODYGROUP_SET_VALUE = 36
  39. AE_CL_BODYGROUP_SET_VALUE_CMODEL_WPN = 37
  40. AE_WPN_PRIMARYATTACK = 38
  41. AE_WPN_INCREMENTAMMO = 39
  42. AE_WPN_HIDE = 40
  43. AE_WPN_UNHIDE = 41
  44. AE_WPN_PLAYWPNSOUND = 42
  45. LAST_SHARED_ANIMEVENT = 43
  46.  
  47. local tbAnimationFrames = {
  48.     ["idle"] = 35   -- Amount of frames this animation has
  49. } -- Animations that aren't defined here, can't have animation events
  50. local bFramesInitialized
  51. function ENT:Initialize()
  52.     -- default NPC initialization stuff (model has to be set here!)
  53.     if(!bFramesInitialized) then    -- this is stupid, but I'm too tired to think of something better right now
  54.         bFramesInitialized = true
  55.         for seq, numFrames in pairs(tbAnimationFrames) do
  56.             tbAnimationFrames[self:LookupSequence(seq)] = tbAnimationFrames[seq]
  57.             tbAnimationFrames[seq] = nil
  58.         end
  59.     end
  60.     self.m_tbAnimEvents = {}
  61.     self.m_frameLast = -1
  62.     self.m_seqLast = -1
  63.     self:AddAnimationEvent(self:LookupSequence("idle"),35,AE_NPC_LEFTFOOT)  -- example animation event for a left footstep sound
  64. end
  65.  
  66. function ENT:AddAnimationEvent(seq,frame,ev)    -- Sequence ID, target frame and animation event
  67.     if(!tbAnimationFrames[seq]) then return end
  68.     self.m_tbAnimEvents[seq] = self.m_tbAnimEvents[seq] || {}
  69.     self.m_tbAnimEvents[seq][frame] = self.m_tbAnimEvents[seq][frame] || {}
  70.     table.insert(self.m_tbAnimEvents[seq][frame],ev)
  71. end
  72.  
  73. function ENT:Think()
  74.     local seq = self:GetSequence()
  75.     if(self.m_tbAnimEvents[seq]) then
  76.         if(self.m_seqLast != seq) then self.m_seqLast = seq; self.m_frameLast = -1 end
  77.         local frameNew = math.floor(self:GetCycle() *tbAnimationFrames[seq])    -- Despite what the wiki says, GetCycle doesn't return the frame, but a float between 0 and 1
  78.         for frame = self.m_frameLast +1,frameNew do -- a loop, just in case the think function is too slow to catch all frame changes
  79.             if(self.m_tbAnimEvents[seq][frame]) then
  80.                 for _, ev in ipairs(self.m_tbAnimEvents[seq][frame]) do
  81.                     self:HandleAnimationEvent(ev)
  82.                 end
  83.             end
  84.         end
  85.         self.m_frameLast = frameNew
  86.     end
  87.     self:NextThink(CurTime())
  88.     return true
  89. end
  90.  
  91. function ENT:HandleAnimationEvent(ev)
  92.     if(ev == AE_NPC_LEFTFOOT) then self:EmitSound("npc/stalker/stalker_footstep_left" .. math.random(1,2) .. ".wav",75,100)
  93.     elseif(ev == AE_NPC_RIGHTFOOT) then self:EmitSound("npc/stalker/stalker_footstep_right" .. math.random(1,2) .. ".wav",75,100)
  94.     else -- other events
  95.     end
  96. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement