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/shared.lua | |
| download | artery_editor-daa59a7835c350a09dcb207c714acf57828137f3.tar.gz artery_editor-daa59a7835c350a09dcb207c714acf57828137f3.tar.bz2 artery_editor-daa59a7835c350a09dcb207c714acf57828137f3.zip | |
Inital Commit
Diffstat (limited to 'lua/entities/npc_huntable/shared.lua')
| -rw-r--r-- | lua/entities/npc_huntable/shared.lua | 180 |
1 files changed, 180 insertions, 0 deletions
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 |
