All pastes #1323148 Raw Edit

Hoffa

public lua v1 · immutable
#1323148 ·published 2009-01-30 22:25 UTC
rendered paste body
AddCSLuaFile( "cl_init.lua" )AddCSLuaFile( "shared.lua" )include('shared.lua')ENT.HealthVal = 800ENT.FireMode = 0ENT.Target = nilENT.MaxGDistance = math.random(800,1400)ENT.Weapon = "sent_GAU12equalizer"ENT.HitPercentPrimary = 0ENT.HitPercentSecondary = 0ENT.DeathTimer = 0ENT.Destroyed = falseENT.Burning = falseENT.IsOverWater = falseENT.RollVal = 0ENT.RollVal2 = 0ENT.YawVal = 0ENT.LagCompensate = 450ENT.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))endfunction 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 endlocal function death(ent)if (ent == nil) then return end		local explo = EffectData()		explo:SetOrigin(ent:GetPos())		util.Effect("Explosion", explo)endfunction ENT:OnTakeDamage(dmginfo)if (self.Destroyed == true) then return endself.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()	endendfunction 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)endfunction 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	endendfunction 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)	endendfunction 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())endfunction 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	endendfunction ENT:CheckLOS(ent)if (self.Target == ent && ent:WaterLevel() > 2) then return true endlocal tr={}tr.start=self.Entity:GetPos()+self.Entity:GetForward()*512tr.endpos=ent:GetPos()+Vector(0,0,78)tr.filter=self.Entitylocal tra = util.TraceLine(tr)	if (!tra.Hit) then		return true		else		return false		end	return falseendfunction 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	endendfunction 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)	endendfunction 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	endendfunction 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 rend   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()endfunction 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()	endend