summaryrefslogtreecommitdiff
path: root/lua/entities/npc_huntable
diff options
context:
space:
mode:
authorAlexander Pickering <alexandermpickering@gmail.com>2017-08-07 18:22:29 -0400
committerAlexander Pickering <alexandermpickering@gmail.com>2017-08-07 18:22:29 -0400
commitdaa59a7835c350a09dcb207c714acf57828137f3 (patch)
treeae2c00da0e546447ca17a9c5d8492310e5e93f27 /lua/entities/npc_huntable
downloadartery_editor-daa59a7835c350a09dcb207c714acf57828137f3.tar.gz
artery_editor-daa59a7835c350a09dcb207c714acf57828137f3.tar.bz2
artery_editor-daa59a7835c350a09dcb207c714acf57828137f3.zip
Inital Commit
Diffstat (limited to 'lua/entities/npc_huntable')
-rw-r--r--lua/entities/npc_huntable/cl_init.lua66
-rw-r--r--lua/entities/npc_huntable/init.lua80
-rw-r--r--lua/entities/npc_huntable/shared.lua180
3 files changed, 326 insertions, 0 deletions
diff --git a/lua/entities/npc_huntable/cl_init.lua b/lua/entities/npc_huntable/cl_init.lua
new file mode 100644
index 0000000..f941737
--- /dev/null
+++ b/lua/entities/npc_huntable/cl_init.lua
@@ -0,0 +1,66 @@
+include('shared.lua')
+
+ENT.RenderGroup = RENDERGROUP_BOTH
+
+/*---------------------------------------------------------
+ Name: Draw
+ Desc: Draw it!
+---------------------------------------------------------*/
+function ENT:Draw()
+ self:DrawModel()
+end
+
+/*---------------------------------------------------------
+ Name: DrawTranslucent
+ Desc: Draw translucent
+---------------------------------------------------------*/
+function ENT:DrawTranslucent()
+
+ // This is here just to make it backwards compatible.
+ // You shouldn't really be drawing your model here unless it's translucent
+
+ self:Draw()
+
+end
+
+/*---------------------------------------------------------
+ Name: BuildBonePositions
+ Desc:
+---------------------------------------------------------*/
+function ENT:BuildBonePositions( NumBones, NumPhysBones )
+
+ // You can use this section to position the bones of
+ // any animated model using self:SetBonePosition( BoneNum, Pos, Angle )
+
+ // This will override any animation data and isn't meant as a
+ // replacement for animations. We're using this to position the limbs
+ // of ragdolls.
+
+end
+
+
+
+/*---------------------------------------------------------
+ Name: SetRagdollBones
+ Desc:
+---------------------------------------------------------*/
+function ENT:SetRagdollBones( bIn )
+
+ // If this is set to true then the engine will call
+ // DoRagdollBone (below) for each ragdoll bone.
+ // It will then automatically fill in the rest of the bones
+
+ self.m_bRagdollSetup = bIn
+
+end
+
+
+/*---------------------------------------------------------
+ Name: DoRagdollBone
+ Desc:
+---------------------------------------------------------*/
+function ENT:DoRagdollBone( PhysBoneNum, BoneNum )
+
+ // self:SetBonePosition( BoneNum, Pos, Angle )
+
+end
diff --git a/lua/entities/npc_huntable/init.lua b/lua/entities/npc_huntable/init.lua
new file mode 100644
index 0000000..fcc8532
--- /dev/null
+++ b/lua/entities/npc_huntable/init.lua
@@ -0,0 +1,80 @@
+AddCSLuaFile("cl_init.lua")
+AddCSLuaFile("shared.lua")
+include("shared.lua")
+local applyfields = {"Model", "Stats"}
+
+function ENT:Initialize()
+ --print("NPC spawned!")
+ --self:SetMoveType(MOVETYPE_STEP)
+ --self:SetSolid(SOLID_OBB)
+ --self:SetCollisionGroup(COLLISION_GROUP_PUSHAWAY )
+
+ --self:SetCollisionGroup(COLLISION_GROUP_INTERACTIVE)
+ for _, v in pairs(applyfields) do
+ assert(self[v], "NPC created without " .. v .. " this might be a bug!")
+ end
+
+ self:SetModel(self.Model)
+
+ if (self.Stats["Vitality"]) then
+ self:SetHealth(self.Stats["Vitality"])
+ else
+ print("NPC created with no stat for vitality, this might be a bug!")
+ end
+
+ if (self.Stats["Accel"]) then
+ self.loco:SetAcceleration(self.Stats["Accel"])
+ end
+
+ if (self.Stats["Decel"]) then
+ self.loco:SetDeceleration(self.Stats["Decel"])
+ end
+
+ if (self.Stats["Step"]) then
+ self.loco:SetJumpHeight(self.Stats["Step"])
+ end
+
+ if self.Stats["Speed"] then
+ self.loco:SetDesiredSpeed(self.Stats["Speed"])
+ end
+
+ if (self.OnSpawn) then
+ self:OnSpawn()
+ end
+end
+
+function ENT:OnInjured(dmg)
+ print("Ent OnInjured fired! dmg was", dmg)
+ if self.OnDammage ~= nil then
+ self:OnDammage(dmg)
+ end
+end
+
+function ENT:OnContact(ent)
+ if self.OnCollide ~= nil then
+ self:OnCollide(ent)
+ end
+end
+
+function ENT:OnKilled(dmg)
+ if (CLIENT) then return end
+ if not self.Drops then return end
+ --print("Looks like we have some drops")
+ --error("You need to code how item drops work!")
+ local itemstodrop = {}
+
+ for k, v in pairs(self.Drops) do
+ local rng = math.random(0, 100)
+ local itemname = self.Drops[k][1]
+ local itemchance = self.Drops[k][2]
+ local heightoffset = 10
+
+ if rng < itemchance then
+ --local drop = ART.GetItemByName(itemname)
+ --print("Createing a drop of",drop)
+ --ART.CreateDroppedItem(drop, self:GetPos())
+ end
+ end
+
+ self:BecomeRagdoll(dmg)
+end
diff --git a/lua/entities/npc_huntable/shared.lua b/lua/entities/npc_huntable/shared.lua
new file mode 100644
index 0000000..e42c100
--- /dev/null
+++ b/lua/entities/npc_huntable/shared.lua
@@ -0,0 +1,180 @@
+ENT.Base = "base_nextbot"
+--ART stuff
+ENT.Drops = nil
+ENT.OnDammage = nil
+ENT.Speed = 0
+ENT.Model = nil
+ENT.Behave = nil
+ENT.Act = nil
+ENT.AutomaticFrameAdvance = true
+
+--[[---------------------------------------------------------
+Name: OnRemove
+Desc: Called just before entity is deleted
+---------------------------------------------------------]]
+function ENT:OnRemove()
+end
+
+
+function ENT:DefaultBehaviour()
+ print("In default behavior")
+ self.lastrun = CurTime()
+
+ --Set some stuff up for navigation
+ local path = Path( "Follow" )
+ path:SetMinLookAheadDistance( self.lookahead or 300 )
+ path:SetGoalTolerance( self.goaltolarance or 100)
+ path:Draw()
+ local delta = CurTime() - self.lastrun
+ self:AI(delta)
+ while (true) do
+ --print("Inside defaultbehaviour's while")
+
+ --Sets all the values needed for the rest of this function to do it's thing
+ --Main loop for ai
+
+ --print("Going into behavior for " .. self.Name)
+ --Update aware enemies
+ delta = CurTime() - self.lastrun
+ --print("delta was", delta)
+ if delta > 0.1 then
+ --print('Running ai')
+ self:AI(delta)
+ self.lastrun = CurTime()
+ end
+
+ if self.TargetPos ~= nil then
+ if ( !path:IsValid() ) then print("Path wasn't valid!") end
+ if ( path:GetAge() > 0.1 ) then -- Since we are following the player we have to constantly repath
+ path:Compute( self, self.TargetPos ) -- Compute the path towards the enemy's position again
+ path:Update( self ) -- This function moves the bot along the path
+ end
+
+
+ if ( true ) then path:Draw() end
+ -- If we're stuck then call the HandleStuck function and abandon
+ if ( self.loco:IsStuck() ) then
+ --self:HandleStuck()
+ --return "stuck"
+ end
+
+ --return "ok"
+ end
+ coroutine.yield()
+ end
+
+ coroutine.yield()
+end
+
+
+function ENT:AI(num)
+ --print("Inside ai")
+ local players = player.GetAll()
+
+ for k, v in pairs(players) do
+ local dist = v:GetPos():Distance(self:GetPos())
+ if (dist < self.Stats["AwareDist"]) then
+ table.insert(self.AwareEnemies, v)
+ end
+ end
+
+ --Find the enemy with the highest priority
+ local maxpriority = -1
+ local maxprioritytarget = nil
+
+ for k, v in pairs(self.AwareEnemies) do
+ local priority = self:AttackPriority(v)
+
+ if (priority == nil) then
+ --print("Nill priority hit after ")
+ --PrintTable(self)
+ end
+
+ if (priority > maxpriority) then
+ maxpriority = priority
+ maxprioritytarget = v
+ end
+ end
+
+ self.Target = maxprioritytarget
+ --print("My target is",self.Target)
+ --If we can't find anyone to attack, just stay idle
+ if (self.Target == nil) then
+ --print("Couldn't find anyone to attack!")
+ --Play an idle sequence
+ local randanim = math.Round(math.Rand(1, #self.IdleSequences))
+ print("Playing sequence",self.IdleSequences[randanim])
+ self:PlaySequenceAndWait(self.IdleSequences[randanim])
+ self:StartActivity(ACT_IDLE)
+ print("Acting idle")
+ --If there's noone within 4000 units, just remove ourselves to save server resources
+ local closest = 5000
+
+ for k, v in pairs(player.GetAll()) do
+ local thisdist = self:GetPos():Distance(v:GetPos())
+
+ if (thisdist < closest) then
+ closest = thisdist
+ end
+ end
+
+ if (closest > 4000) then
+ --print("Closes player is " .. closest .. " removeing self...")
+ self:BecomeRagdoll(DamageInfo())
+ end
+ else
+ --We have a target to attack!
+ --Find which attack will do the most dammage
+ local maxdammage = -1
+ local maxdammagefunc = nil
+
+ for k, v in pairs(self.Attacks) do
+ local dammagefunc = nil
+ local attackfunc = nil
+
+ for i, j in pairs(v) do
+ dammagefunc = i
+ attackfunc = j
+ end
+
+ local dammage = dammagefunc(self, self.Target)
+
+ if (dammage > maxdammage) then
+ maxdammage = dammage
+ maxdammagefunc = attackfunc
+ end
+ end
+
+ --Do that attack
+ if (maxdammagefunc) then
+ maxdammagefunc(self, self.Target)
+ end
+ end
+
+ --[[
+ print("Before running, behavethread was", self.BehaveThread)
+ local ok, message = coroutine.resume( self.BehaveThread )
+ if not ok then
+ self.BehaveThread = nil
+ Msg( self, "error: ", message, "\n" );
+ end
+ ]]
+
+ if (self.Act) then
+ self:Act(num)
+ else
+ print("NPC spawned without an Act function, this might be an error!")
+ end
+
+end
+
+function ENT:RunBehaviour()
+ print("Running behavior")
+ if (self.Behave) then
+ print("Doing self.behave")
+ self:Behave()
+ else
+ print("Doing default behavior")
+ self:DefaultBehaviour()
+ end
+end