Files
VnUtest/garrysmod/addons/tacrp/lua/effects/tacrp_divesmoke.lua
2026-03-31 10:27:04 +03:00

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