AddCSLuaFile( "cl_init.lua" ) AddCSLuaFile( "shared.lua" ) include('shared.lua') ENT.Alerted = false ENT.loaded = false ENT.Facing = false ENT.Enemy = nil ENT.bleeds = 0 ENT.StartHealth = 7000 ENT.PlayerFriendly = 1 ENT.AttackingMelee = false ENT.State = 0 //1 is moving to enemy, 2 is staying put ENT.LastPos = Vector(0,0,0) function ENT:Initialize() self:SetModel( "models/vehicles/m1a1abrams_turret.mdl" ) //self:PhysicsInit( SOLID_VPHYSICS ) //self:SetMoveType( MOVETYPE_VPHYSICS ) self.FiringGun = false self.Friends = {""} self:SetHealth(self.StartHealth) self.Enemy = NULL end function ENT:OnTakeDamage(dmg) self:SetHealth(self:Health() - dmg:GetDamage()) if dmg:GetAttacker():GetClass() != self:GetClass() && math.random(1,7) == 1 then self:ResetEnemy() self:AddEntityRelationship( dmg:GetAttacker(), 1, 10 ) self.Enemy = dmg:GetAttacker() end self.Alerted = true if self:Health() <= 0 && self.FiringGun == false then //run on death print("DIED!!!") self:KilledDan() end end function ENT:Think() if self.Enemy:IsValid() == false then self.Enemy = NULL elseif self.Enemy:Health(health) <= 0 then self.Enemy = NULL elseif self.Enemy == self then self.Enemy = NULL end //print(self.TakingCover) if self:Health() > 0 && GetConVarNumber("ai_disabled") == 0 then //print( "Think start" ); //Get all the npc's and other entities. local enttable = ents.FindByClass("npc_*") local monstertable = ents.FindByClass("monster_*") table.Add(monstertable,enttable)//merge //sort through each ent. //for _, x in pairs(monstertable) do // if (!ents) then print( "No Entities!" ); return end // if (x:GetClass() != self:GetClass() && x:GetClass() != "npc_grenade_frag") && x:IsNPC() then // x:AddEntityRelationship( self, 1, 10 ) // end //end //sort through each ent. for _, x in pairs(monstertable) do if (!ents) then print( "No Entities!" ); return end if (x:GetClass() != self:GetClass() && x:GetClass() != "npc_grenade_frag" && x:IsNPC()) then if x:GetClass() != "npc_tank" && x:GetClass() != "npc_tank_turrent" && x:GetClass() != "npc_citizen" && x:GetClass() != "npc_barney" && x:GetClass() != "npc_eli" && x:GetClass() != "npc_monk" && x:GetClass() != "npc_alyx" && x:GetClass() != "npc_mossman" && x:GetClass() != "npc_vortigaunt" && x:GetClass() != "npc_dog" then x:AddEntityRelationship( self, 1, 10 ) else x:AddEntityRelationship( self, 3, 10 ) end end end local friends = ents.FindByClass("npc_soldier") for _, x in pairs(friends) do x:AddEntityRelationship( self, 3, 10 ) end local friends = ents.FindByClass("npc_tank") for _, x in pairs(friends) do x:AddEntityRelationship( self, 3, 10 ) end local friends = ents.FindByClass("npc_tank_turrent") for _, x in pairs(friends) do x:AddEntityRelationship( self, 3, 10 ) end local friends = ents.FindByClass("npc_citizen") for _, x in pairs(friends) do x:AddEntityRelationship( self, 3, 10 ) end local friends = ents.FindByClass("npc_eli") for _, x in pairs(friends) do x:AddEntityRelationship( self, 3, 10 ) end local friends = ents.FindByClass("npc_alyx") for _, x in pairs(friends) do x:AddEntityRelationship( self, 3, 10 ) end local friends = ents.FindByClass("npc_monk") for _, x in pairs(friends) do x:AddEntityRelationship( self, 3, 10 ) end local friends = ents.FindByClass("npc_barney") for _, x in pairs(friends) do x:AddEntityRelationship( self, 3, 10 ) end local friends = ents.FindByClass("npc_mossman") for _, x in pairs(friends) do x:AddEntityRelationship( self, 3, 10 ) end local friends = ents.FindByClass("npc_vortigaunt") for _, x in pairs(friends) do x:AddEntityRelationship( self, 3, 10 ) end local friends = ents.FindByClass("npc_dog") for _, x in pairs(friends) do x:AddEntityRelationship( self, 3, 10 ) end self:FindEnemyDan() //set the turrents location to our own //self.myturrent:SetPos(self:GetPos()) //self.myturrent:SetAngles(Angle(self:GetAngles().p,self.myturrent:GetAngles().y,self:GetAngles().r)) //move if self.State == 0 then if self.Enemy == NULL then self.State = 1 else //apply movement local wantedangle = (self.Enemy:GetPos() - self:GetPos() + Vector(0,0,80)):Angle() local currentangle = self:GetAngles() local anglediff = self:GetAngleDiff(wantedangle.y,currentangle.y+180) local pitchdiff = self:GetAngleDiff(wantedangle.p,currentangle.p) local heightratio = (self.Enemy:GetPos().z - self:GetPos().z ) / self:GetPos():Distance(Vector(self.Enemy:GetPos().x,self.Enemy:GetPos().y,self:GetPos().z)) if math.abs(anglediff) < 5 && self.FiringGun == false && math.abs(heightratio) < 0.15 && self:GetPos():Distance(self.Enemy:GetPos()) > 400 && self:HasLOS() then self.FiringGun = true self.Facing = true self:ShootGun() elseif anglediff > 5 then self:SetLocalAngles( self:GetLocalAngles() + Angle(0,2,0)) self.Facing = false elseif anglediff < -5 then self:SetLocalAngles( self:GetLocalAngles() + Angle(0,-2,0)) self.Facing = false end end end end end function ENT:GetAngleDiff(angle1 , angle2) local result = angle1 - angle2 if result < -180 then result = result + 360 end if result > 180 then result = result - 360 end //print(result) return result end function ENT:SelectSchedule() if self:Health() > 0 then local haslos = self:HasLOS() local distance = 0 local enemy_pos = 0 if self.Enemy:IsValid() == false then self.Enemy = NULL elseif self.Enemy:Health(health) <= 0 then self.Enemy = NULL elseif self.Enemy == self then self.Enemy = NULL end if self.Enemy == NULL || self.Enemy:IsValid() == false then//no enemy self:FindEnemyDan() //print( "No Enemy!" ); //play idle sounds every now and then else //print( "Enemy!" ); enemy_pos = self.Enemy:GetPos() distance = self:GetPos():Distance(enemy_pos) //distance = 4000 if distance > 4000 then//if too far away self.State = 1//move to him elseif distance < 4000 && distance > 400 then//if in reasonable distance self.State = 0//stay put else//if too close self.State = 0//run them over end end end end function ENT:FindEnemyDan() local MyNearbyTargets = ents.FindInSphere(self:GetPos(),1500) //local ClosestDistance = 3000 if (!MyNearbyTargets) then print( "No Targets!" ); return end for k,v in pairs(MyNearbyTargets) do if v:Disposition(self) == 1 || (v:IsPlayer() && self.PlayerFriendly == 0 && GetConVarNumber("ai_ignoreplayers") == 0) then if (v:GetClass() != self:GetClass()) && v != self then self:ResetEnemy() self:AddEntityRelationship( v, 1, 10 ) self.Enemy = v //alerted self.Alerted = true return end end end MyNearbyTargets = ents.FindInSphere(self:GetPos(),5000) if (!MyNearbyTargets) then print( "No Targets!" ); return end for k,v in pairs(MyNearbyTargets) do if v:Disposition(self) == 1 || (v:IsPlayer() && self.PlayerFriendly == 0 && GetConVarNumber("ai_ignoreplayers") == 0) then if (v:GetClass() != self:GetClass()) && v != self then self:ResetEnemy() self:AddEntityRelationship( v, 1, 10 ) self.Enemy = v //alerted self.Alerted = true return end end end //if ClosestDistance == 4000 then self.Enemy = NULL //end end function ENT:StopHurtSounds() end function ENT:KilledDan() //create ragdoll local ragdoll = ents.Create( "prop_physics" ) ragdoll:SetModel( self:GetModel() ) ragdoll:SetPos( self:GetPos() ) ragdoll:SetAngles( self:GetAngles() ) ragdoll:Spawn() ragdoll:SetSkin( self:GetSkin() ) ragdoll:SetColor( self:GetColor() ) ragdoll:SetMaterial( self:GetMaterial() ) //my code undo.AddEntity(ragdoll) cleanup.ReplaceEntity(self,ragdoll) //ignight ragdoll if on fire. if self:IsOnFire() then ragdoll:Ignite( math.Rand( 8, 10 ), 0 ) end //position bones the same way. for i=1,128 do local bone = ragdoll:GetPhysicsObjectNum( i ) if ValidEntity( bone ) then local bonepos, boneang = self:GetBonePosition( ragdoll:TranslatePhysBoneToBone( i ) ) bone:SetPos( bonepos ) bone:SetAngle( boneang ) end end ragdoll:SetVelocity(Vector(0,0,math.random(1000,5000))) if( GetConVarNumber("ai_keepragdolls") == 0 ) then ragdoll:SetCollisionGroup( 1 )//COLLISION_GROUP_DEBRIS ) ragdoll:Fire( "FadeAndRemove", "", 15 ) end //ragdoll:GetPhysicsObject():AddAngleVelocity(Angle(math.random(-10,10),math.random(-10,10),math.random(-10,10))) end function ENT:ResetEnemy() local enttable = ents.FindByClass("npc_*") local monstertable = ents.FindByClass("monster_*") table.Add(monstertable,enttable)//merge //sort through each ent. for _, x in pairs(monstertable) do //print(x) if (!ents) then print( "No Entities!" ); return end if (x:GetClass() != self:GetClass()) then self:AddEntityRelationship( x, 2, 10 ) end //print("Relationship Complete") end self:AddRelationship("player D_NU 10") self.Enemy = NULL end function ENT:OnRemove() end function ENT:HasLOS() if self.Enemy:IsValid() then //local shootpos = self:GetAimVector()*(self:GetPos():Distance(self.Enemy:GetPos())) + self:GetPos()+Vector(0,0,100)+self:GetForward()*-200 //local shootpos = self.Enemy:GetPos() local tracedata = {} tracedata.start = self:GetPos() tracedata.endpos = self.Enemy:GetPos() tracedata.filter = self local trace = util.TraceLine(tracedata) if trace.HitWorld == false then return true else return false end end print ("no enemy!") return false end ///---------------------[OBSOLETE]------------------------------- /* function ENT:ExplodeShell() local trace = util.QuickTrace(self:GetPos()+Vector(0,0,100)+self:GetForward()*-200,self.LastPos-self:GetPos()+Vector(0,0,-30),self) local explosion_position local ent = trace.Entity if self:HasLOS() == false || ent:IsValid() == false then explosion_position = trace.HitPos else explosion_position = ent:GetPos() end local bar = ents.Create("env_shake") bar:SetPos(explosion_position) bar:SetKeyValue("amplitude","8") bar:SetKeyValue("radius","4000") bar:SetKeyValue("duration","0.75") bar:SetKeyValue("frequency","128") bar:Fire( "StartShake", 0, 0 ) local blargity = EffectData() blargity:SetStart(explosion_position) blargity:SetOrigin(explosion_position) blargity:SetScale(500) //blargity:SetAngle(self:GetForward():Angle()+Angle(0,180,0)) WorldSound("ambient/explosions/explode_8.wav",explosion_position,500,100) util.Effect("HelicopterMegaBomb",blargity) util.Effect("ThumperDust",blargity) util.Effect( "Explosion", blargity ) self.FiringGun = false util.BlastDamage(self,self,explosion_position,200,200) end */ ///---------------------[/OBSOLETE]------------------------------- function ENT:FireShell() if self.Facing == true && self.Enemy != nil && self.Enemy != NULL then self.LastPos = self.Enemy:GetPos() self:EmitSound("ambient/explosions/explode_4.wav",500,100) //local effectdata = EffectData() //effectdata:SetStart(self:GetPos()+Vector(0,0,80)+self:GetForward()*-200) //effectdata:SetOrigin(self:GetPos()+Vector(0,0,80)+self:GetForward()*-200) //effectdata:SetScale(5) //effectdata:SetAngle(self:GetForward():Angle()) //util.Effect("MuzzleFlash",effectdata) local flash = ents.Create("env_muzzleflash") flash:SetPos(self:GetPos()+Vector(0,0,64)+self:GetForward()*-230) flash:SetKeyValue("scale","5") flash:SetKeyValue("angles",tostring(self:GetForward():Angle())) flash:Fire( "Fire", 0, 0 ) //fire local shoot_vector = (self.Enemy:GetPos() - self:GetPos()) shoot_vector:Normalize() local rocket = ents.Create("proj_dan_tank_shot") rocket:SetPos(self:LocalToWorld(Vector(-250,0,64))) rocket:SetAngles(shoot_vector:Angle()) rocket:Activate() rocket:Spawn() local phy = rocket:GetPhysicsObject() if phy:IsValid() then phy:ApplyForceCenter((shoot_vector * 750000)) end self.loaded = false self.FiringGun = false else self.loaded = true self.FiringGun = false self.Facing = false end end function ENT:ShootGun() self:EmitSound("vehicles/tank_readyfire1.wav",400,100) if (self:GetEnemy() != nil && self:GetEnemy() != NULL) then if self:GetEnemy():IsNPC() then self:GetEnemy():SetSchedule(SCHED_HIDE_AND_RELOAD) end end if self.loaded == false then timer.Simple( 2.5, function() self:FireShell() end) elseif self.Facing == true then self:FireShell() end end