ACF_CustomMod/lua/effects/acf_ap_penetration/init.lua

199 lines
6.2 KiB
Lua

local ACFEnts = list.Get("ACFEnts")
local GunTable = ACFEnts["Guns"]
/*---------------------------------------------------------
Initializes the effect. The data is a table of data
which was passed from the server.
---------------------------------------------------------*/
function EFFECT:Init( data )
self.Ent = data:GetEntity()
self.Caliber = self.Ent:GetNetworkedInt( "Caliber" ) or 10
self.Origin = data:GetOrigin()
self.DirVec = data:GetNormal()
self.Velocity = data:GetScale() --Mass of the projectile in kg
self.Mass = data:GetMagnitude() --Velocity of the projectile in gmod units
self.Emitter = ParticleEmitter( self.Origin )
self.Scale = math.max(self.Mass * (self.Velocity/39.37)/100,1)^0.3
local ImpactTr = { }
ImpactTr.start = self.Origin - self.DirVec*20
ImpactTr.endpos = self.Origin + self.DirVec*20
local Impact = util.TraceLine(ImpactTr) --Trace to see if it will hit anything
self.Normal = Impact.HitNormal
sound.Play( "/acf_other/penetratingshots/0000029"..math.random(2,5)..".wav", Impact.HitPos, math.Clamp(self.Mass*200,65,500), math.Clamp(self.Velocity*0.01,25,255), 1 )
--self.Entity:EmitSound( "ambient/explosions/explode_1.wav" , 100 + self.Radius*10, 200 - self.Radius*10 )
-- Material Enum
-- 65 ANTLION
-- 66 BLOODYFLESH
-- 67 CONCRETE / NODRAW
-- 68 DIRT
-- 70 FLESH
-- 71 GRATE
-- 72 ALIENFLESH
-- 73 CLIP
-- 76 PLASTIC
-- 77 METAL
-- 78 SAND
-- 79 FOLIAGE
-- 80 COMPUTER
-- 83 SLOSH
-- 84 TILE
-- 86 VENT
-- 87 WOOD
-- 89 GLASS
local Mat = Impact.MatType
if Mat == 71 or Mat == 73 or Mat == 77 or Mat == 80 then -- Metal
self:Metal()
else -- Nonspecific
self:Concrete()
end
end
function EFFECT:Metal()
util.Decal("GunShot1", self.Origin + self.DirVec*10, self.Origin - self.DirVec*10)
for i=0, 4*self.Scale do
local Debris = self.Emitter:Add( "effects/fleck_tile"..math.random(1,2), self.Origin )
if (Debris) then
Debris:SetVelocity ( self.Normal * math.random( 20,40*self.Scale) + VectorRand() * math.random( 25,50*self.Scale) )
Debris:SetLifeTime( 0 )
Debris:SetDieTime( math.Rand( 1.5 , 3 )*self.Scale/3 )
Debris:SetStartAlpha( 255 )
Debris:SetEndAlpha( 0 )
Debris:SetStartSize( 1*self.Scale )
Debris:SetEndSize( 1*self.Scale )
Debris:SetRoll( math.Rand(0, 360) )
Debris:SetRollDelta( math.Rand(-3, 3) )
Debris:SetAirResistance( 100 )
Debris:SetGravity( Vector( 0, 0, -650 ) )
Debris:SetColor( 120,120,120 )
end
end
for i=0, 5*self.Scale do
local Embers = self.Emitter:Add( "particles/flamelet"..math.random(1,5), self.Origin )
if (Embers) then
Embers:SetVelocity ( (self.Normal - VectorRand()) * math.random(30*self.Scale,80*self.Scale) )
Embers:SetLifeTime( 0 )
Embers:SetDieTime( math.Rand( 0.3 , 1 )*self.Scale/5 )
Embers:SetStartAlpha( 255 )
Embers:SetEndAlpha( 0 )
Embers:SetStartSize( 2*self.Scale )
Embers:SetEndSize( 0*self.Scale )
Embers:SetStartLength( 5*self.Scale )
Embers:SetEndLength ( 0*self.Scale )
Embers:SetRoll( math.Rand(0, 360) )
Embers:SetRollDelta( math.Rand(-0.2, 0.2) )
Embers:SetAirResistance( 20 )
Embers:SetGravity( VectorRand()*10 )
Embers:SetColor( 200,200,200 )
end
end
local Sparks = EffectData()
Sparks:SetOrigin( self.Origin )
Sparks:SetNormal( self.Normal )
Sparks:SetMagnitude( self.Scale )
Sparks:SetScale( self.Scale )
Sparks:SetRadius( self.Scale )
util.Effect( "Sparks", Sparks )
end
function EFFECT:Concrete()
util.Decal("GunShot1", self.Origin + self.DirVec*10, self.Origin - self.DirVec*10)
for i=0, 4*self.Scale do
local Debris = self.Emitter:Add( "effects/fleck_tile"..math.random(1,2), self.Origin )
if (Debris) then
Debris:SetVelocity ( self.Normal * math.random( 20,40*self.Scale) + VectorRand() * math.random( 25,50*self.Scale) )
Debris:SetLifeTime( 0 )
Debris:SetDieTime( math.Rand( 1.5 , 3 )*self.Scale/3 )
Debris:SetStartAlpha( 255 )
Debris:SetEndAlpha( 0 )
Debris:SetStartSize( 1*self.Scale )
Debris:SetEndSize( 1*self.Scale )
Debris:SetRoll( math.Rand(0, 360) )
Debris:SetRollDelta( math.Rand(-3, 3) )
Debris:SetAirResistance( 100 )
Debris:SetGravity( Vector( 0, 0, -650 ) )
Debris:SetColor( 120,120,120 )
end
end
for i=0, 3*self.Scale do
local Smoke = self.Emitter:Add( "particle/smokesprites_000"..math.random(1,9), self.Origin )
if (Smoke) then
Smoke:SetVelocity( self.Normal * math.random( 20,40*self.Scale) + VectorRand() * math.random( 25,50*self.Scale) )
Smoke:SetLifeTime( 0 )
Smoke:SetDieTime( math.Rand( 1 , 2 )*self.Scale/3 )
Smoke:SetStartAlpha( math.Rand( 50, 150 ) )
Smoke:SetEndAlpha( 0 )
Smoke:SetStartSize( 1*self.Scale )
Smoke:SetEndSize( 2*self.Scale )
Smoke:SetRoll( math.Rand(150, 360) )
Smoke:SetRollDelta( math.Rand(-0.2, 0.2) )
Smoke:SetAirResistance( 200 )
Smoke:SetGravity( Vector( math.random(-5,5)*self.Scale, math.random(-5,5)*self.Scale, -50 ) )
Smoke:SetColor( 90,90,90 )
end
end
for i=0, 5*self.Scale do
local Embers = self.Emitter:Add( "particles/flamelet"..math.random(1,5), self.Origin )
if (Embers) then
Embers:SetVelocity ( (self.Normal - VectorRand()) * math.random(30*self.Scale,80*self.Scale) )
Embers:SetLifeTime( 0 )
Embers:SetDieTime( math.Rand( 0.3 , 1 )*self.Scale/5 )
Embers:SetStartAlpha( 255 )
Embers:SetEndAlpha( 0 )
Embers:SetStartSize( 5*self.Scale )
Embers:SetEndSize( 0*self.Scale )
Embers:SetStartLength( 5*self.Scale )
Embers:SetEndLength ( 0*self.Scale )
Embers:SetRoll( math.Rand(0, 360) )
Embers:SetRollDelta( math.Rand(-0.2, 0.2) )
Embers:SetAirResistance( 20 )
Embers:SetGravity( VectorRand()*10 )
Embers:SetColor( 200,200,200 )
end
end
local Sparks = EffectData()
Sparks:SetOrigin( self.Origin )
Sparks:SetNormal( self.Normal )
Sparks:SetMagnitude( self.Scale )
Sparks:SetScale( self.Scale )
Sparks:SetRadius( self.Scale )
util.Effect( "Sparks", Sparks )
end
/*---------------------------------------------------------
THINK
---------------------------------------------------------*/
function EFFECT:Think( )
return false
end
/*---------------------------------------------------------
Draw the effect
---------------------------------------------------------*/
function EFFECT:Render()
end