96 lines
2.8 KiB
Lua
96 lines
2.8 KiB
Lua
|
|
AddCSLuaFile()
|
||
|
|
|
||
|
|
ENT.Type = "ai"
|
||
|
|
ENT.Base = "base_ai"
|
||
|
|
ENT.AutomaticFrameAdvance = true
|
||
|
|
|
||
|
|
local debug_show_ragdoll_targets = CreateConVar("zcnpci_debug_show_ragdoll_targets", 0, bit.bor(FCVAR_ARCHIVE, FCVAR_REPLICATED))
|
||
|
|
|
||
|
|
local function UpdateRelationship(ent, me)
|
||
|
|
if !IsValid(ent) or !ent:IsNPC() then return end
|
||
|
|
|
||
|
|
if ent:Disposition(me.dummy_entity) == D_HT then
|
||
|
|
ent:AddEntityRelationship(me, D_HT)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
local function RemoveRelationship(ent, me)
|
||
|
|
if !IsValid(ent) or !ent:IsNPC() then return end
|
||
|
|
|
||
|
|
if ent:Disposition(me.dummy_entity) == D_HT then
|
||
|
|
ent:AddEntityRelationship(me, D_NU)
|
||
|
|
ent:ClearEnemyMemory(me)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
function ENT:Initialize()
|
||
|
|
if SERVER then
|
||
|
|
self:SetModel("models/maxofs2d/hover_basic.mdl")
|
||
|
|
self:SetCollisionGroup(COLLISION_GROUP_DEBRIS)
|
||
|
|
self:SetHullType(HULL_TINY_CENTERED)
|
||
|
|
self:SetNoDraw(!debug_show_ragdoll_targets:GetBool())
|
||
|
|
self.dummy_entity = ents.Create(self.ragdoll_to_follow.class_in_previous_life)
|
||
|
|
self.last_stop_targeting = debug_show_ragdoll_targets:GetBool()
|
||
|
|
|
||
|
|
hook.Add("OnEntityCreated", "zcnpci-"..self:GetCreationID(), function(new_entity)
|
||
|
|
if !IsValid(new_entity) or !new_entity:IsNPC() then return end
|
||
|
|
|
||
|
|
if !self.last_stop_targeting then
|
||
|
|
UpdateRelationship(new_entity, self)
|
||
|
|
end
|
||
|
|
end)
|
||
|
|
|
||
|
|
for i,ent in ipairs(ents.GetAll()) do
|
||
|
|
UpdateRelationship(ent, self)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
function ENT:Think()
|
||
|
|
if SERVER then
|
||
|
|
local ragdoll = self.ragdoll_to_follow
|
||
|
|
if !IsValid(ragdoll) then return end
|
||
|
|
|
||
|
|
self:SetPos(ragdoll:GetPos())
|
||
|
|
|
||
|
|
self:SetNoDraw(!debug_show_ragdoll_targets:GetBool())
|
||
|
|
|
||
|
|
if !ragdoll.organism then return true end
|
||
|
|
|
||
|
|
local should_stop_targeting = (
|
||
|
|
(ragdoll.organism.consciousness <= 0.4) or
|
||
|
|
(ragdoll.organism.critical)
|
||
|
|
)
|
||
|
|
|
||
|
|
if should_stop_targeting != self.last_stop_targeting then
|
||
|
|
self.last_stop_targeting = should_stop_targeting
|
||
|
|
|
||
|
|
if should_stop_targeting then
|
||
|
|
self:SetColor(Color(255, 0, 0))
|
||
|
|
for i,ent in ipairs(ents.GetAll()) do
|
||
|
|
RemoveRelationship(ent, self)
|
||
|
|
end
|
||
|
|
else
|
||
|
|
self:SetColor(Color(0, 255, 0))
|
||
|
|
for i,ent in ipairs(ents.GetAll()) do
|
||
|
|
UpdateRelationship(ent, self)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
|
||
|
|
self:NextThink(CurTime())
|
||
|
|
end
|
||
|
|
|
||
|
|
return true
|
||
|
|
end
|
||
|
|
|
||
|
|
function ENT:OnRemove()
|
||
|
|
if SERVER then
|
||
|
|
print("I AM DYING!!!!!!")
|
||
|
|
for i,ent in ipairs(ents.GetAll()) do
|
||
|
|
RemoveRelationship(ent, self)
|
||
|
|
end
|
||
|
|
hook.Remove("OnEntityCreated", "zcnpci-"..self:GetCreationID())
|
||
|
|
end
|
||
|
|
end
|