diff options
| author | Alexander Pickering <alexandermpickering@gmail.com> | 2017-08-07 18:22:29 -0400 |
|---|---|---|
| committer | Alexander Pickering <alexandermpickering@gmail.com> | 2017-08-07 18:22:29 -0400 |
| commit | daa59a7835c350a09dcb207c714acf57828137f3 (patch) | |
| tree | ae2c00da0e546447ca17a9c5d8492310e5e93f27 /lua/entities/npc_huntable | |
| download | artery_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.lua | 66 | ||||
| -rw-r--r-- | lua/entities/npc_huntable/init.lua | 80 | ||||
| -rw-r--r-- | lua/entities/npc_huntable/shared.lua | 180 |
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 |
