79 lines
2.6 KiB
Lua
79 lines
2.6 KiB
Lua
function EFFECT:Init(data)
|
|
if CurTime() < 1 then self:Remove() return end
|
|
|
|
local pos = data:GetOrigin()
|
|
local dir = data:GetNormal()
|
|
|
|
self.EndTime = CurTime() + 0.2
|
|
self.TrailEnt = data:GetEntity()
|
|
if !IsValid(self.TrailEnt) then self:Remove() return end
|
|
|
|
local emitter = ParticleEmitter(pos)
|
|
|
|
local tr = util.TraceLine({
|
|
start = pos,
|
|
endpos = pos - Vector(0, 0, 2048),
|
|
mask = MASK_SOLID_BRUSHONLY
|
|
})
|
|
|
|
pos = pos - dir * 32
|
|
local amt = 12 + math.ceil(tr.Fraction / 20)
|
|
|
|
for i = 1, amt do
|
|
local _, a = LocalToWorld(Vector(), Angle((i / amt) * 360, 90, 0), pos, dir:Angle())
|
|
local smoke = emitter:Add("particle/smokestack", pos)
|
|
smoke:SetVelocity(dir * -(150 + tr.Fraction * 100) + (300 - tr.Fraction * 100) * a:Up())
|
|
smoke:SetStartAlpha(20 + tr.Fraction * 50)
|
|
smoke:SetEndAlpha(0)
|
|
smoke:SetStartSize(8)
|
|
smoke:SetEndSize(24 + tr.Fraction * 16)
|
|
smoke:SetRoll(math.Rand(-180, 180))
|
|
smoke:SetRollDelta(math.Rand(-0.2, 0.2))
|
|
smoke:SetColor(200, 200, 200)
|
|
smoke:SetAirResistance(50)
|
|
smoke:SetCollide(false)
|
|
smoke:SetBounce(0.2)
|
|
smoke:SetLighting(false)
|
|
smoke:SetDieTime(0.15 + tr.Fraction * 0.6)
|
|
end
|
|
|
|
emitter:Finish()
|
|
end
|
|
|
|
function EFFECT:Think()
|
|
if CurTime() > self.EndTime or !IsValid(self.TrailEnt) or (self.TrailEnt:IsPlayer() and !self.TrailEnt:Alive()) then
|
|
return false
|
|
end
|
|
return true
|
|
end
|
|
|
|
function EFFECT:Render()
|
|
if self.TrailEnt:IsOnGround() then
|
|
local pos = self.TrailEnt:GetPos() + Vector(math.Rand(-8, 8), math.Rand(-8, 8), 4)
|
|
local dir = self.TrailEnt:GetVelocity():GetNormalized()
|
|
local vel = self.TrailEnt:GetVelocity():Length()
|
|
|
|
local emitter = ParticleEmitter(pos)
|
|
|
|
if engine.TickCount() % 2 == 0 then
|
|
local smoke = emitter:Add("particle/smokestack", pos)
|
|
smoke:SetVelocity(VectorRand() * (50 + math.min(vel, 500) * 0.25) + dir * math.min(vel, 500) + Vector(0, 0, 200 - math.min(vel, 200)))
|
|
smoke:SetGravity(Vector(0, 0, -400))
|
|
smoke:SetStartAlpha(50)
|
|
smoke:SetEndAlpha(0)
|
|
smoke:SetStartSize(4)
|
|
smoke:SetEndSize(32)
|
|
smoke:SetRoll(math.Rand(-180, 180))
|
|
smoke:SetRollDelta(math.Rand(-0.2, 0.2))
|
|
smoke:SetColor(200, 200, 200)
|
|
smoke:SetAirResistance(25)
|
|
smoke:SetCollide(true)
|
|
smoke:SetBounce(0.2)
|
|
smoke:SetLighting(true)
|
|
smoke:SetDieTime(math.Rand(0.75, 1))
|
|
end
|
|
|
|
emitter:Finish()
|
|
end
|
|
end
|