AddCSLuaFile( "cl_init.lua" ) AddCSLuaFile( "shared.lua" ) include('shared.lua') ENT.HealthVal = 800 ENT.FireMode = 0 ENT.Target = nil ENT.MaxGDistance = math.random(800,1400) ENT.Weapon = "sent_GAU12equalizer" ENT.HitPercentPrimary = 0 ENT.HitPercentSecondary = 0 ENT.DeathTimer = 0 ENT.Destroyed = false ENT.Burning = false ENT.IsOverWater = false ENT.RollVal = 0 ENT.RollVal2 = 0 ENT.YawVal = 0 ENT.LagCompensate = 450 ENT.HitTabPrimary = { {4000,3501,10}; {3500,3001,20}; {3000,2501,30}; {2500,2001,55}; {2000,1001,70}; {1000,0,100}; } ENT.HitTabSecondary = { {4000,3501,100}; {3500,3001,100}; {3000,2501,69}; {2500,2001,54}; {2000,1001,69}; {1000,0,0}; } local CrashDebris = { {"models/props_citizen_tech/Firetrap_PropaneCanister01a.mdl"}; {"models/props_junk/iBeam01a.mdl"}; {"models/props_combine/tprotato2_chunk04.mdl"}; {"models/props_wasteland/barricade001a_chunk05.mdl"}; {"models/props_wasteland/gear02.mdl"}; {"models/props_c17/playground_teetertoter_stan.mdl"}; {"models/props_vehicles/carparts_muffler01a.mdl"}; {"models/props_c17/canisterchunk01a.mdl"}; {"models/props_c17/utilityconnecter006c.mdl"}; {"models/props_combine/tprotato2_chunk01.mdl"}; {"models/props_c17/TrapPropeller_Engine.mdl"}; {"models/props_wasteland/cafeteria_bench001a_Chunk02.mdl"}; {"models/props_c17/oildrumchunk01a.mdl"}; {"models/props_c17/oildrumchunk01e.mdl"}; {"models/props_c17/canisterchunk02h.mdl"}; {"models/props_c17/oildrumchunk01d.mdl"}; {"models/props_c17/oildrumchunk01c.mdl"}; {"models/props_c17/oildrumchunk01b.mdl"}; {"models/props_combine/tprotato2_chunk01.mdl"}; } for k,v in pairs(CrashDebris) do util.PrecacheModel(tostring(v)) end function ENT:Initialize() self:SetModel( "models/harrier.mdl" ) self.Entity:PhysicsInit( SOLID_VPHYSICS ) self.Entity:SetMoveType( MOVETYPE_VPHYSICS ) self.Entity:SetSolid( SOLID_VPHYSICS ) self.Entity:SetHullType( HULL_LARGE ) self.Entity:SetHealth(self.HealthVal) self.Entity:SetVar('FireSecondary',CurTime()) self.Entity:SetVar('FireFlares',CurTime()) local pos = {} self.Missile = {} pos[1] = self.Entity:GetPos()+self.Entity:GetRight()*139 +self.Entity:GetUp()*-30 +self.Entity:GetForward()*-40 pos[2] = self.Entity:GetPos()+self.Entity:GetRight()*83 +self.Entity:GetUp()*-30 +self.Entity:GetForward()*-40 pos[3] = self.Entity:GetPos()+self.Entity:GetRight()*-139 +self.Entity:GetUp()*-30 +self.Entity:GetForward()*-40 pos[4] = self.Entity:GetPos()+self.Entity:GetRight()*-83 +self.Entity:GetUp()*-30 +self.Entity:GetForward()*-40 for i=1,4 do self.Missile[i] = ents.Create("prop_physics_override") self.Missile[i]:SetPos(pos[i]) self.Missile[i]:SetModel("models/props_phx/amraam.mdl") self.Missile[i]:SetAngles(self.Entity:GetAngles()) self.Missile[i]:SetParent(self.Entity) self.Missile[i]:SetSolid(SOLID_NONE) self.Missile[i]:Spawn() end self.EngineMux = {} local esound = {} esound[1] = "physics/metal/canister_scrape_smooth_loop1.wav" esound[2] = "physics/cardboard/cardboard_box_scrape_smooth_loop1.wav" esound[3] = "ambient/levels/canals/dam_water_loop2.wav" for i=1,3 do self.EngineMux[i] = CreateSound(self.Entity,esound[i]) end self.Pitch = 80 self.EngineMux[1]:PlayEx(500,self.Pitch) self.EngineMux[2]:PlayEx(500,self.Pitch) self.EngineMux[3]:PlayEx(500,self.Pitch) self.wep = ents.Create(self.Weapon) self.wep:SetPos(self.Entity:GetPos()+self.Entity:GetRight()*-46 + self.Entity:GetForward()*128 +self.Entity:GetUp()*13) self.wep:SetAngles(self.Entity:GetAngles()) self.wep:Spawn() self.wep:SetParent(self.Entity) self.wep:SetOwner(self.Entity) self.wep:SetPhysicsAttacker(self.Entity) self.wep:SetSolid( SOLID_NONE ) self.CycleTarget = ents.Create("info_target") self.CycleTarget:SetPos(self.Entity:GetPos()+Vector(1024,1024,1024)) self.CycleTarget:Activate() self.CycleTarget:Spawn() self.PhysObj = self.Entity:GetPhysicsObject() if (self.PhysObj:IsValid()) then self.PhysObj:Wake() self.PhysObj:EnableGravity(false) end end local function death(ent) if (ent == nil) then return end local explo = EffectData() explo:SetOrigin(ent:GetPos()) util.Effect("Explosion", explo) end function ENT:OnTakeDamage(dmginfo) if (self.Destroyed == true) then return end self.Entity:TakePhysicsDamage(dmginfo) self.HealthVal = self.HealthVal - dmginfo:GetDamage() if (self.HealthVal < 200 && self.Burning == false) then self.Burning = true end if self.HealthVal < 5 then self.Destroyed = true self.PhysObj:EnableGravity(true) self.PhysObj:EnableDrag(true) self.PhysObj:SetMass(2000) self.Entity:Ignite(60,100) for i=1,10 do local vx=i/4 timer.Simple(vx,function() death(self.Entity) end) end end if (self.Target == self.CycleTarget) then self.Target = dmginfo:GetInflictor() end end function ENT:PhysicsSimulate( pobj, delta) pobj:Wake() local CSC = {} CSC.secondstoarrive = 0.5 CSC.pos = self.Entity:GetPos()+self.Entity:GetForward()*self.LagCompensate+100 CSC.angle = (self.Target:GetPos() - self.Entity:GetPos()):Angle() CSC.maxangular = 50000 CSC.maxangulardamp = 80000 CSC.maxspeed = 1000000 CSC.maxspeeddamp = 10000 SC.dampfactor = 0.99 CSC.teleportdistance = 6000 CSC.deltatime = delta pobj:ComputeShadowControl(pr) end function ENT:PhysicsCollide( data, physobj ) if (data.HitEntity:GetClass() == "prop_combine_ball") then local fx =EffectData() fx:SetOrigin(data.HitPos) fx:SetEntity(data.HitEntity) fx:SetStart(data.HitPos) fx:SetScale(4) util.Effect("CballExplode",fx) data.HitEntity:Remove() return false end end function ENT:CalculateHitchance(ent) local dist = (Vector(self.Entity:GetPos().x,self.Entity:GetPos().y,0) - Vector(ent:GetPos().x,ent:GetPos().y,0)):Length() for k,v in pairs(self.HitTabPrimary) do if v[1] > dist && v[2] < dist then self.HitPercentPrimary = v[3] end end for _,p in pairs(self.HitTabSecondary) do if p[1] > dist && p[2] < dist then self.HitPercentSecondary = p[3] end end if self.HitPercentPrimary > self.HitPercentSecondary then self:AttackEnemy(1) else self:AttackEnemy(2) end end function ENT:Barrage(pos) if (self.Target:WaterLevel() > 0) then return end -- just no local r = ents.Create("sent_javeline_rocket") r:SetPos(pos+self.Entity:GetForward()*128) r:SetAngles(self:GetAngles()) r:Spawn() r:SetOwner(self.Entity) r:SetPhysicsAttacker(self.Entity) r.Target = self.Target r:GetPhysicsObject():SetVelocity(self.PhysObj:GetVelocity()) end function ENT:AttackEnemy(frm) if (frm == 1) then self.wep.ShouldAttack = true elseif (frm == 2) then self.wep.ShouldAttack = false if (!self:CheckLOS(self.Target)) then return end local TSR = self.Entity:GetVar('FireSecondary',0) if (TSR + 25) > CurTime() then return end self.Entity:SetVar('FireSecondary',CurTime()) for i=1,4 do local vx=i*1.2 timer.Simple(vx,function() self:Barrage(self.Missile[i]:GetPos()) end) end end end function ENT:CheckLOS(ent) if (self.Target == ent && ent:WaterLevel() > 2) then return true end local tr={} tr.start=self.Entity:GetPos()+self.Entity:GetForward()*512 tr.endpos=ent:GetPos()+Vector(0,0,78) tr.filter=self.Entity local tra = util.TraceLine(tr) if (!tra.Hit) then return true else return false end return false end function ENT:ScanForEnemies() for k,v in pairs(ents.FindInSphere(self.Entity:GetPos(),10600)) do if (v != self.Entity && v:GetClass() != "npc_harrier" && v:GetClass() != "npc_missile_homer") then if (v:IsPlayer() || v:IsNPC()) then self.Target = v end end if (self.Target == nil) then self.Target = self.CycleTarget end end end function ENT:Think() if (self.Destroyed == true) then local effectdata = EffectData() effectdata:SetOrigin( self.Entity:GetPos() + self.Entity:GetRight() * math.random(-62,62) + self.Entity:GetForward() * math.random(-62,62) ) util.Effect( "immolate", effectdata ) self.wep.ShouldAttack = false self.DeathTimer = self.DeathTimer + 1 if self.DeathTimer > 70 then self:DeathFX() end return end --sm_rcon lua_run for k,v in pairs(ents.FindByClass("npc_harrier")) do ErrorNotifyEveryone(math.Clamp(v.PhysObj:GetVelocity():Length()/5 +30,0,255)) end self.Pitch = math.Clamp(math.floor(self.PhysObj:GetVelocity():Length()/3.3 + 50),0,255) for i=1,3 do self.EngineMux[i]:ChangePitch(self.Pitch) end self:ScanForEnemies() self.LagCompensate = math.floor(self.PhysObj:GetVelocity():Length()/2 +100) self.mVel = self.PhysObj:GetVelocity() self.gVec = (self.Target:GetPos() - self.Entity:GetPos()) -- + Vector(0,0,280) self.gNormal = self.gVec:Normalize() self.gAng = (self.Target:GetPos() - self.Entity:GetPos()):Angle() -- + Vector(0,0,280) self.mAng = Angle(0,self:GetAngles().y,0) -- self:GetAngles()-- self.mYaw = self.Entity:VecAngD(self.gAng.y,self.mAng.y) self.mPitch = self.Entity:VecAngD(self.gAng.p,self.mAng.y) self.tarDist = self.Entity:GetPos():Distance(self.Target:GetPos()) self.HeightDifference = (Vector(0,0,self.Target:GetPos().z) - Vector(0,0,self.Entity:GetPos().z )):Length() if (self.HeightDifference < self.MaxGDistance) then self.PhysObj:ApplyForceCenter(self.Entity:GetUp()*7400) end if (self.Entity:VecAngD(self.gAng.y,self.mAng.y) > 1) then self.RollVal = self.RollVal - 0.5 if self.RollVal <= -20 then self.RollVal = -20 end elseif (self.Entity:VecAngD(self.gAng.y,self.mAng.y) < -1) then self.RollVal = self.RollVal + 0.5 if self.RollVal >= 20 then self.RollVal = 20 end end if self.Entity:GetAngles():Forward():Dot((self.Target:GetPos() - self.Entity:GetPos()):GetNormalized()) > 0.4 && self.tarDist < 1400 then if (self.Entity:VecAngD(self.gAng.p,self.mAng.p) < -1) then -- print("Pitching up") self.RollVal2 = self.RollVal2 - 1 if self.RollVal2 <= -23 then self.RollVal2 = -23 end elseif (self.Entity:VecAngD(self.gAng.p,self.mAng.p) > 1) then self.RollVal2 = self.RollVal2 + 1 if self.RollVal2 >= 23 then self.RollVal2 = 23 end -- print("Pitching down") end elseif self.Entity:GetAngles():Forward():Dot((self.Target:GetPos() - self.Entity:GetPos()):GetNormalized()) < 0.4 then if self.RollVal2 > 0 then self.RollVal2 = self.RollVal2 - 1 if self.RollVal2 < 0 then self.RollVal2 = 0 end elseif self.RollVal2 < 0 then self.RollVal2 = self.RollVal2 + 1 if self.RollVal2 > 0 then self.RollVal2 = 0 end end end self.mAng2 = Angle(self.RollVal2,self:GetAngles().y,self.RollVal) if (self.mYaw > 3) then self.PhysObj:SetAngle(self.mAng2+Angle(0,3,0)) self.PhysObj:SetVelocity(self.mVel) elseif (self.mYaw < -3) then self.PhysObj:SetAngle(self.mAng2+Angle(0,-3,0)) self.PhysObj:SetVelocity(self.mVel) elseif (self.mYaw > -3 && self.mYaw < 3) then self.RollVal = math.sin(CurTime())*7 end if self.tarDist > 2000 then if self.Target:WaterLevel() > 0 then self.PhysObj:ApplyForceCenter((self.gNormal * 5200)) self.PhysObj:ApplyForceCenter((self.Entity:GetForward() * 35200)) self.PhysObj:ApplyForceCenter(self.Entity:GetUp()*4000) else self.PhysObj:ApplyForceCenter(( self.gNormal * 29530)) self.PhysObj:SetVelocity(self.Entity:GetForward()*1400) end elseif (self.tarDist > 2900 && self.Entity:GetForward():Dot((self.Target:GetPos() - self.Entity:GetPos()):GetNormalized()) >= 0.75)then self.PhysObj:ApplyForceCenter(( self.gNormal * 19530)) self.PhysObj:SetVelocity(self.Entity:GetForward()*1900) elseif (self.tarDist < 2000) then self.PhysObj:ApplyForceCenter(( self.gNormal * 28530)) self.PhysObj:ApplyForceCenter((self.Entity:GetForward() * 14200)) end if (self.Entity:GetForward():Dot((self.Target:GetPos() - self.Entity:GetPos()):GetNormalized()) >= 0.65) then if(self.Target == self.CycleTarget) then return end if (!self:CheckLOS(self.Target)) then return end self:CalculateHitchance(self.Target) end if ((Vector(self.Target:GetPos().x,self.Target:GetPos().y,0) - Vector(self.Entity:GetPos().x,self.Entity:GetPos().y,0)):Length() < 2000 && self.Target:WaterLevel() > 1) then self.IsOverWater = true else self.IsOverWater = false end local ft1={} ft1.start=self.Entity:GetPos() + self.Entity:GetForward()*90 ft1.endpos=self.Entity:GetPos()+self.Entity:GetForward()*712 ft1.filter=self.Entity local tr1=util.TraceLine(ft1) local dt1={} dt1.start=self.Entity:GetPos()+self.Entity:GetUp()*-100 dt1.endpos=self.Entity:GetPos()+self.Entity:GetUp()*-700 dt1.filter=self.Entity local tr2=util.TraceLine(dt1) if (tr2.Hit) then self.PhysObj:ApplyForceCenter(self.Entity:GetUp()*20200) self.PhysObj:ApplyForceCenter(self.Entity:GetForward()*5600) self.RollVal2 = self.RollVal2 - 0.2 end if (tr1.Hit) then self.PhysObj:ApplyForceCenter(self.Entity:GetUp()*14400) self.RollVal2 = self.RollVal2 - 0.2 end self:FlareDefence() for i=1,2 do local fx=EffectData() fx:SetOrigin(self.Entity:GetPos()+self.Entity:GetRight()*math.random(-100,100) + self.Entity:GetForward()*-16*i) util.Effect("neurotecHeatwave",fx) end end function ENT:FlareDefence() for k,v in pairs(ents.FindInSphere(self:GetPos(),1024)) do if (string.find(v:GetClass(),"prop_combine_ball")) then v:Remove() return end if (string.find(v:GetClass(),"missile") || string.find(v:GetClass(),"rocket")) then if (v:GetClass() == "sent_javeline_rocket") then return end local TSF = self.Entity:GetVar('FireFlares',0) if (TSF + 3) > CurTime() then return end self.Entity:SetVar('FireFlares',CurTime()) for i=1,5 do local xss = i*30 local flare = ents.Create("nn_flare") flare:SetPos(self.Entity:GetPos()+self.Entity:GetUp()*-72 + self.Entity:GetForward()*xss ) flare:Spawn() end end end end function ENT:VecAngD(a,b) local r = a - b if r < -180 then r = r + 360 end if r > 180 then r = r - 360 end return r end function ENT:DeathFX() local explo = EffectData() explo:SetOrigin(self.Entity:GetPos()) util.Effect("Explosion", explo) for i=0,3 do local explo1 = EffectData() explo1:SetOrigin(self.Entity:GetPos()+i*self.Entity:GetForward()*64) explo1:SetScale(7.25) util.Effect("HelicopterMegaBomb", explo1) end for k,v in pairs(CrashDebris) do local cdeb = ents.Create("prop_physics") cdeb:SetModel(tostring(v[1])) cdeb:SetPos(self.Entity:GetPos()+Vector(math.random(-64,64),math.random(-64,64),math.random(128,256))) cdeb:SetSolid(6) cdeb:SetMaterial("models/props_pipes/GutterMetal01a") cdeb:Spawn() cdeb:Fire("ignite","",0) cdeb:Fire("kill","",15) local f1 = EffectData() f1:SetOrigin(cdeb:GetPos()) util.Effect("immolate",f1) end implode( self:GetPos(), 128, 512, -600000000 ) for i=1,10 do local fx=EffectData() fx:SetOrigin(self.Entity:GetPos()+Vector(math.random(-256,256),math.random(-256,256),math.random(-256,256))) fx:SetScale(20*i) util.Effect("Firecloud",fx) end local fx1=EffectData() fx1:SetOrigin(self.Entity:GetPos()) util.Effect("ShockWave2000",fx1) self.Entity:EmitSound("ambient/explosions/explode_"..math.random(1,4)..".wav",200,100) util.BlastDamage( self.Entity, self.Entity,self.Entity:GetPos(), 1628, 100 ) self.Entity:Remove() end function ENT:OnRemove() for i=1,3 do self.EngineMux[i]:Stop() end self.Entity:Remove() self.wep:Remove() for i=1,4 do self.Missile[i]:Remove() end end