add sborka
This commit is contained in:
105
garrysmod/addons/lvs_base/lua/effects/lvs_carexhaust_pop.lua
Normal file
105
garrysmod/addons/lvs_base/lua/effects/lvs_carexhaust_pop.lua
Normal file
@@ -0,0 +1,105 @@
|
||||
|
||||
EFFECT.GlowMat = Material( "effects/yellowflare" )
|
||||
EFFECT.FireMat = Material( "effects/muzzleflash2" )
|
||||
|
||||
function EFFECT:Init( data )
|
||||
self.Pos = data:GetOrigin()
|
||||
self.Ang = data:GetAngles()
|
||||
self.Ent = data:GetEntity()
|
||||
|
||||
local volume = math.Clamp( data:GetMagnitude(), 0, 1 )
|
||||
|
||||
local T = CurTime()
|
||||
|
||||
self.LifeTime = 0.25
|
||||
self.LifeTimePop = 0.1
|
||||
|
||||
self.DieTime = T + self.LifeTime
|
||||
self.DieTimePop = T + self.LifeTimePop
|
||||
|
||||
self.Scale = math.Rand( 0.25, 1 )
|
||||
|
||||
if not IsValid( self.Ent ) then return end
|
||||
|
||||
local Pos = self.Ent:LocalToWorld( self.Pos )
|
||||
|
||||
self:SetPos( Pos )
|
||||
|
||||
local ply = LocalPlayer()
|
||||
|
||||
if not IsValid( ply ) then return end
|
||||
|
||||
local veh = ply:lvsGetVehicle()
|
||||
|
||||
if IsValid( veh ) and veh == self.Ent then
|
||||
local pod = ply:GetVehicle()
|
||||
|
||||
if IsValid( pod ) and not pod:GetThirdPersonMode() then
|
||||
sound.Play( "lvs/vehicles/generic/exhaust_pop_interior"..math.random(1,12)..".ogg", Pos, 75, math.random(98,105), volume )
|
||||
|
||||
return
|
||||
end
|
||||
end
|
||||
|
||||
local dlight = DynamicLight( self.Ent:EntIndex() * math.random(1,4), true )
|
||||
|
||||
if dlight then
|
||||
dlight.pos = Pos
|
||||
dlight.r = 255
|
||||
dlight.g = 180
|
||||
dlight.b = 100
|
||||
dlight.brightness = 1
|
||||
dlight.Decay = 2000
|
||||
dlight.Size = 400
|
||||
dlight.DieTime = CurTime() + 0.2
|
||||
end
|
||||
|
||||
sound.Play( "lvs/vehicles/generic/exhaust_pop"..math.random(1,16)..".ogg", Pos, 75, math.random(98,105), volume )
|
||||
end
|
||||
|
||||
function EFFECT:Think()
|
||||
if not IsValid( self.Ent ) then return false end
|
||||
|
||||
if self.DieTime < CurTime() then return false end
|
||||
|
||||
self:SetPos( self.Ent:LocalToWorld( self.Pos ) )
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
|
||||
function EFFECT:Render()
|
||||
if not IsValid( self.Ent ) or not self.Pos then return end
|
||||
|
||||
self:RenderSmoke()
|
||||
end
|
||||
|
||||
function EFFECT:RenderSmoke()
|
||||
if not self.Pos or not self.Ang or not self.Scale then return end
|
||||
|
||||
local T = CurTime()
|
||||
|
||||
local ScalePop = math.Clamp( (self.DieTimePop - T) / self.LifeTimePop, 0, 1 )
|
||||
local InvScalePop = 1 - ScalePop
|
||||
|
||||
local Scale = (self.DieTime - T) / self.LifeTime
|
||||
local InvScale = 1 - Scale
|
||||
|
||||
local Pos = self.Ent:LocalToWorld( self.Pos )
|
||||
local Ang = self.Ent:LocalToWorldAngles( self.Ang )
|
||||
|
||||
local FlameSize = 5 * Scale ^ 2
|
||||
render.SetMaterial( self.FireMat )
|
||||
for i = 1, 12 do
|
||||
render.DrawSprite( Pos + Ang:Forward() * InvScale * 20 + VectorRand() * 2, FlameSize, FlameSize, color_white )
|
||||
end
|
||||
|
||||
if InvScalePop <= 0 then return end
|
||||
|
||||
local GlowSize = 60 * InvScalePop * self.Scale
|
||||
local A255 = 255 * ScalePop
|
||||
|
||||
render.SetMaterial( self.GlowMat )
|
||||
render.DrawSprite( Pos, GlowSize, GlowSize, Color(A255,A255,A255,A255) )
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user