diff options
| author | Alexander Pickering <alexandermpickering@gmail.com> | 2016-10-24 19:00:58 -0400 |
|---|---|---|
| committer | Alexander Pickering <alexandermpickering@gmail.com> | 2016-10-24 19:00:58 -0400 |
| commit | 9ae67530dc4be9eaab7b1243330e810d1d5a6fee (patch) | |
| tree | 974d87689dd51b767f91735563ed6cf030c1ad87 /entities | |
| parent | 74c7a160da34897ebdf18aaff02b8c9b65809949 (diff) | |
| download | artery-9ae67530dc4be9eaab7b1243330e810d1d5a6fee.tar.gz artery-9ae67530dc4be9eaab7b1243330e810d1d5a6fee.tar.bz2 artery-9ae67530dc4be9eaab7b1243330e810d1d5a6fee.zip | |
Added npc system
Diffstat (limited to 'entities')
| -rw-r--r-- | entities/entities/npc_huntable/cl_init.lua | 66 | ||||
| -rw-r--r-- | entities/entities/npc_huntable/init.lua | 70 | ||||
| -rw-r--r-- | entities/entities/npc_huntable/shared.lua | 144 |
3 files changed, 280 insertions, 0 deletions
diff --git a/entities/entities/npc_huntable/cl_init.lua b/entities/entities/npc_huntable/cl_init.lua new file mode 100644 index 0000000..f941737 --- /dev/null +++ b/entities/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/entities/entities/npc_huntable/init.lua b/entities/entities/npc_huntable/init.lua new file mode 100644 index 0000000..b136878 --- /dev/null +++ b/entities/entities/npc_huntable/init.lua @@ -0,0 +1,70 @@ +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_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.OnSpawn) then + self:OnSpawn() + end +end + +function ENT:OnInjured(dmg) + if self.OnDammage ~= nil then + self:OnDammage(dmg) + 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!") + + 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 = ents.Create("ws_item") + drop.Item = GetItemByName(itemname) + drop:SetModel(drop.Item.Model) + drop:SetPos(self:GetPos() + (self:GetUp() * heightoffset)) + drop:Spawn() + heightoffset = heightoffset + 10 + end + end + + self:BecomeRagdoll(dmg) +end diff --git a/entities/entities/npc_huntable/shared.lua b/entities/entities/npc_huntable/shared.lua new file mode 100644 index 0000000..2f34721 --- /dev/null +++ b/entities/entities/npc_huntable/shared.lua @@ -0,0 +1,144 @@ +ENT.Base = "base_nextbot" +--ART stuff +ENT.Drops = nil +ENT.OnDammage = nil +ENT.Speed = 0 +ENT.Model = nil +ENT.Behave = nil +ENT.Act = nil + +--[[--------------------------------------------------------- +Name: OnRemove +Desc: Called just before entity is deleted +---------------------------------------------------------]] +function ENT:OnRemove() +end + + +function ENT:DefaultBehaviour() + self.lastrun = CurTime() + while (true) do + print("Inside defaultbehaviour") + local delta = CurTime() - self.lastrun + self:AI(delta) + --Main loop for ai + --print("Going into behavior for " .. self.Name) + --Update aware enemies + if self.TargetPos ~= nil then + self:MoveToPos(self.TargetPos,{ + ["lookahead"] = 5, + ["tolerance"] = 50, + ["draw"] = true, + ["maxage"] = 20, + ["repath"] = 4, + }) + end + self.lastrun = CurTime() + coroutine.yield() + end + + coroutine.yield() +end + + +function ENT:AI(num) + print("Inside behaveupdate") + 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(0, #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 + + 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 |
