AddCSLuaFile() ENT.Base = "base_nextbot" ENT.Spawnable = false ENT.BaseDamage = math.random(30,50) ENT.Owner = nil local pain = {"npc/zombie/zombie_pain1.wav", "npc/zombie/zombie_pain2.wav", "npc/zombie/zombie_pain3.wav", "npc/zombie/zombie_pain4.wav", "npc/zombie/zombie_pain5.wav", "npc/zombie/zombie_pain6.wav"} ENT.Damages = {} function ENT:Initialize() self:SetModel( "models/zombie/zm_classic_01.mdl" ); self:DrawShadow(false) self:SetCustomCollisionCheck( true ) self.Entity:SetCollisionBounds( Vector(-4,-4,0), Vector(4,4,64) ) self:SetHealth(200) if(#ents.FindInSphere(self:GetPos(),32) > 0) then self:SetPos(self:GetPos() + Vector(math.random(-64),math.random(64),0)) end self.Damages = {} end function ENT:OnInjured(dmg) local c = math.random(1,5) if(dmg:GetAttacker():IsPlayer() || dmg:GetAttacker():IsNPC()) then self.Enemy = dmg:GetAttacker() end if(c == 1) then self:EmitSound(table.Random(pain),100,120) end if(dmg:GetAttacker():IsPlayer()) then local b = false for k,v in pairs(self.Damages) do if(v[1] == dmg:GetAttacker()) then v[2] = v[2] + dmg:GetDamage() b = true break end end if(!b) then table.insert(self.Damages,{dmg:GetAttacker(),dmg:GetDamage()}) end end end local die = {"npc/zombie/zombie_die1.wav", "npc/zombie/zombie_die2.wav", "npc/zombie/zombie_die3.wav", "npc/zombie/zombie_voice_idle6.wav", "npc/zombie/zombie_voice_idle11.wav"} local str = "" function ENT:OnKilled( dmginfo ) hook.Call( "OnNPCKilled", GAMEMODE, self, dmginfo:GetAttacker(), dmginfo:GetInflictor() ) self:EmitSound(table.Random(die),75,170) self:KickTheBucket(dmginfo) self:BecomeRagdoll( dmginfo ) if(IsValid(dmginfo:GetAttacker()) && dmginfo:GetAttacker():IsPlayer()) then dmginfo:GetAttacker():AddFrags(1) end str = "" table.sort(self.Damages,function(a,b) return a[2] > b[2] end) for k,v in pairs(self.Damages) do v[1]:SetNWInt("Money",v[1]:GetNWInt("Money",0) + (#self.Damages-k)*10) if(k == 1) then str = str.."in first place, we have "..v[1]:Nick().." with "..v[2] elseif(k == 2) then str = str.." and then "..v[1]:Nick().." with "..v[2]..", " elseif(k != #self.Damages) then str = str.."#"..k.." "..v[1]:Nick().." with "..v[2].." " else str = str.." and finnally "..v[1]:Nick().." with "..v[2].."." end end net.WriteString(str) net.Broadcast() end ENT.State = 0 ENT.Enemy = nil ENT.CanAttack = false function ENT:IsNPC() return true end function ENT:HaveEnemy() if(IsValid(self.Enemy)) then if(self.Enemy:GetPos():Distance(self:GetPos()) > 9999) then self.Enemy = nil end end return IsValid(self.Enemy) end local claw = {"npc/zombie/claw_strike1.wav", "npc/zombie/claw_strike2.wav", "npc/zombie/claw_strike3.wav"} ENT.AttackAnims = {"attackA","attackB","attackC","attackD","attackE","attackF"} function ENT:DispatchAttack() if(self:HaveEnemy() && self:GetPos():Distance(self.Enemy:GetPos()) < 80) then self:EmitSound(claw[math.random(1,3)],75) self:SetSequence(self.AttackAnims[math.random(1,#self.AttackAnims)],1) if(self:HaveEnemy()) then self.loco:FaceTowards( self.Enemy:GetPos() ) end timer.Simple(0.25,function() local Trace = util.QuickTrace( self:GetPos() + Vector(0,0,40), self:GetForward()*80 , { self } ) if(IsValid(Trace.Entity)) then Trace.Entity:TakeDamage(self.BaseDamage + math.random(-self.BaseDamage/5,self.BaseDamage/5),self,self) if(Trace.Entity:Health() <= 0) then self.Enemy = nil end end end) coroutine.wait(0.75) end self.State = 1 end local idl = {"npc/zombie/zombie_voice_idle1.wav", "npc/zombie/zombie_voice_idle2.wav", "npc/zombie/zombie_voice_idle3.wav", "npc/zombie/zombie_voice_idle4.wav", "npc/zombie/zombie_voice_idle5.wav", "npc/zombie/zombie_voice_idle7.wav", "npc/zombie/zombie_voice_idle8.wav", "npc/zombie/zombie_voice_idle9.wav", "npc/zombie/zombie_voice_idle10.wav", "npc/zombie/zombie_voice_idle12.wav", "npc/zombie/zombie_voice_idle13.wav", "npc/zombie/zombie_voice_idle14.wav"} local warn = {"npc/zombie_poison/pz_die1.wav", "npc/zombie_poison/pz_die2.wav", "npc/zombie_poison/pz_idle2.wav", "npc/zombie_poison/pz_warn2.wav"} function ENT:RunBehaviour() while ( true ) do self:StartActivity( ACT_WALK,1 ) self:SetPlaybackRate(1) self.loco:SetDesiredSpeed( (100 + math.random(10,50))*0.75 ) if(IsValid(self.Enemy) && self.Enemy:Team() == 0) then self.Enemy = nil end if ( !self:HaveEnemy() ) then for k,v in pairs(ents.FindInSphere(self:GetPos(),99999)) do if(IsValid(v) && v:GetClass() == "barricade" && v:GetPos():Distance(self:GetPos()) < 256) then self.Enemy = v self:EmitSound(warn[math.random(1,#warn)],75) end if(IsValid(v) && v:IsPlayer()) then if(v:Team() != 0) then self.Enemy = v self:EmitSound(warn[math.random(1,#warn)],75) end end end if(!IsValid(self.Enemy)) then self:MoveToPos( self:GetPos() + Vector( math.Rand( -1, 1 ), math.Rand( -1, 1 ), 0 ) * 400 ) end else self.loco:FaceTowards( self.Enemy:GetPos() ) local op = {} op.tolerance = 15 op.maxage = 0.25 self:MoveToPos( self.Enemy:GetPos() - self:GetForward()*48,op ) self.loco:FaceTowards( self.Enemy:GetPos() ) if(self:GetPos():Distance(self.Enemy:GetPos()) > 128) then local int = math.random(1,100) if(int == 50) then self:EmitSound(idl[math.random(1,#idl)],75) end else coroutine.yield() end self:DispatchAttack() end coroutine.yield() end end function ENT:KickTheBucket(dmg) local killer = dmg:GetAttacker() local old = killer:GetNWInt("killcount") killer:SetNWInt("killcount", old + 1) local oldm = killer:GetNWInt("Money") killer:SetNWInt("Money", oldm + 1) NumZombies = NumZombies - 1 local itemnumber = math.random(1,ItemChance[DiffLevel]) local itemtype = "lol" if itemnumber == 1 then itemtype = "tcure" elseif (itemnumber >= 2 && itemnumber <= 4) then itemtype = "spray" elseif (itemnumber >= 5 && itemnumber <= 10) then itemtype = "pammo" elseif (itemnumber >= 11 && itemnumber <= 14) then itemtype = "bammo" elseif (itemnumber >= 15 && itemnumber <= 19) then itemtype = "mammo" elseif (itemnumber >= 20 && itemnumber <= 24) then itemtype = "rammo" elseif (itemnumber >= 25 && itemnumber <= 27) then itemtype = "landmine" elseif (itemnumber >= 28 && itemnumber <= 30) then itemtype = "c4" end if itemtype != "lol" then local item = ents.Create("item_"..itemtype) item:SetPos(self.Entity:GetPos()) item:Spawn() item:Activate( ) timer.Simple(30, function() if item:IsValid() then item:Remove() end end) end end list.Set( "NPC", "Zombiez", { Name = "Zombie", Class = "snpc_zombie", Category = "GO-Fortress" } )