add sborka
This commit is contained in:
311
garrysmod/addons/lvs_base/lua/entities/lvs_fire.lua
Normal file
311
garrysmod/addons/lvs_base/lua/entities/lvs_fire.lua
Normal file
@@ -0,0 +1,311 @@
|
||||
AddCSLuaFile()
|
||||
|
||||
ENT.Type = "anim"
|
||||
|
||||
ENT.PrintName = "Fire"
|
||||
ENT.Author = "Luna"
|
||||
ENT.Information = "Luna's Vehicle Script"
|
||||
ENT.Category = "[LVS]"
|
||||
|
||||
ENT.Spawnable = false
|
||||
ENT.AdminOnly = false
|
||||
|
||||
ENT.RenderGroup = RENDERGROUP_BOTH
|
||||
|
||||
function ENT:SetupDataTables()
|
||||
self:NetworkVar( "Entity", 0, "Emitter" )
|
||||
self:NetworkVar( "Float", 0, "LifeTime" )
|
||||
self:NetworkVar( "Float", 1, "DieTime" )
|
||||
|
||||
if SERVER then
|
||||
self:SetLifeTime( math.Rand(8,12) )
|
||||
end
|
||||
end
|
||||
|
||||
function ENT:GetSize()
|
||||
return math.min( (self:GetDieTime() - CurTime()) / self:GetLifeTime() * 10, 1) ^ 2
|
||||
end
|
||||
|
||||
if SERVER then
|
||||
function ENT:SpawnFunction( ply, tr, ClassName )
|
||||
if not tr.Hit then return end
|
||||
|
||||
local ent = ents.Create( ClassName )
|
||||
ent:SetPos( tr.HitPos + tr.HitNormal )
|
||||
ent:SetAngles( tr.HitNormal:Angle() + Angle(90,0,0) )
|
||||
ent:Spawn()
|
||||
ent:Activate()
|
||||
|
||||
return ent
|
||||
end
|
||||
|
||||
function ENT:SetDamage( num ) self._dmg = num end
|
||||
function ENT:SetAttacker( ent ) self._attacker = ent end
|
||||
|
||||
function ENT:GetAttacker() return self._attacker or NULL end
|
||||
function ENT:GetDamage() return (self._dmg or 3) end
|
||||
|
||||
function ENT:SendDamage( victim, pos )
|
||||
if not IsValid( victim ) then return end
|
||||
|
||||
if victim:IsPlayer() and victim:InVehicle() and victim:GetCollisionGroup() ~= COLLISION_GROUP_PLAYER then return end
|
||||
|
||||
local attacker = self:GetAttacker()
|
||||
|
||||
local dmg = DamageInfo()
|
||||
dmg:SetDamage( self:GetDamage() )
|
||||
dmg:SetAttacker( IsValid( attacker ) and attacker or game.GetWorld() )
|
||||
dmg:SetInflictor( self )
|
||||
dmg:SetDamageType( DMG_BURN + DMG_PREVENT_PHYSICS_FORCE )
|
||||
dmg:SetDamagePosition( pos or vector_origin )
|
||||
victim:TakeDamageInfo( dmg )
|
||||
end
|
||||
|
||||
function ENT:Initialize()
|
||||
self:SetMoveType( MOVETYPE_NONE )
|
||||
self:SetSolid( SOLID_NONE )
|
||||
self:DrawShadow( false )
|
||||
|
||||
self:SetDieTime( CurTime() + self:GetLifeTime() )
|
||||
|
||||
if self:WaterLevel() > 0 then self:Remove() end
|
||||
end
|
||||
|
||||
function ENT:Think()
|
||||
local T = CurTime()
|
||||
|
||||
self:NextThink( T )
|
||||
|
||||
if T > self:GetDieTime() then
|
||||
self:Remove()
|
||||
end
|
||||
|
||||
local EntTable = self:GetTable()
|
||||
|
||||
if (EntTable._NextDamage or 0) < T then
|
||||
EntTable._NextDamage = T + 0.5
|
||||
|
||||
local Size = self:GetSize()
|
||||
local startpos = self:LocalToWorld( Vector(0,0,1) )
|
||||
local endpos = self:LocalToWorld( Vector(0,0,Size * 120) )
|
||||
|
||||
local maxs = Vector(80,80,0) * Size
|
||||
local mins = Vector(-80,-80,0) * Size
|
||||
|
||||
local trace = util.TraceHull( {
|
||||
start = startpos,
|
||||
endpos = endpos,
|
||||
maxs = maxs,
|
||||
mins = mins,
|
||||
filter = self,
|
||||
} )
|
||||
|
||||
if not trace.Hit or not IsValid( trace.Entity ) then return true end
|
||||
|
||||
self:SendDamage( trace.Entity, trace.HitPos, 1 )
|
||||
end
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
function ENT:PhysicsCollide( data, physobj )
|
||||
end
|
||||
|
||||
function ENT:OnRemove()
|
||||
end
|
||||
|
||||
return
|
||||
end
|
||||
|
||||
local GlowMat = Material( "sprites/light_glow02_add" )
|
||||
local Materials = {
|
||||
"particle/smokesprites_0001",
|
||||
"particle/smokesprites_0002",
|
||||
"particle/smokesprites_0003",
|
||||
"particle/smokesprites_0004",
|
||||
"particle/smokesprites_0005",
|
||||
"particle/smokesprites_0006",
|
||||
"particle/smokesprites_0007",
|
||||
"particle/smokesprites_0008",
|
||||
"particle/smokesprites_0009",
|
||||
"particle/smokesprites_0010",
|
||||
"particle/smokesprites_0011",
|
||||
"particle/smokesprites_0012",
|
||||
"particle/smokesprites_0013",
|
||||
"particle/smokesprites_0014",
|
||||
"particle/smokesprites_0015",
|
||||
"particle/smokesprites_0016"
|
||||
}
|
||||
|
||||
function ENT:Initialize()
|
||||
self.snd = CreateSound(self, "ambient/fire/fire_small_loop"..math.random(1,2)..".wav")
|
||||
self.snd:SetSoundLevel( 60 )
|
||||
self.snd:Play()
|
||||
end
|
||||
|
||||
function ENT:Draw( flags )
|
||||
end
|
||||
|
||||
function ENT:DrawTranslucent( flags )
|
||||
local Size = self:GetSize() * 200
|
||||
|
||||
render.SetMaterial( GlowMat )
|
||||
render.DrawSprite( self:GetPos(), Size, Size, Color( 255, 150, 75, 255) )
|
||||
end
|
||||
|
||||
function ENT:SoundStop()
|
||||
if self.snd then
|
||||
self.snd:Stop()
|
||||
end
|
||||
end
|
||||
|
||||
function ENT:OnRemove()
|
||||
self:SoundStop()
|
||||
self:StopEmitter()
|
||||
self:StopEmitter3D()
|
||||
end
|
||||
|
||||
function ENT:GetParticleEmitter( Pos )
|
||||
local EntTable = self:GetTable()
|
||||
|
||||
local T = CurTime()
|
||||
|
||||
if IsValid( EntTable.Emitter ) and (EntTable.EmitterTime or 0) > T then
|
||||
return EntTable.Emitter
|
||||
end
|
||||
|
||||
self:StopEmitter()
|
||||
|
||||
EntTable.Emitter = ParticleEmitter( Pos, false )
|
||||
EntTable.EmitterTime = T + 2
|
||||
|
||||
return EntTable.Emitter
|
||||
end
|
||||
|
||||
function ENT:EmitFire()
|
||||
local Pos = self:GetPos()
|
||||
local Dir = self:GetUp()
|
||||
|
||||
local emitter = self:GetParticleEmitter( Pos )
|
||||
local emitter3D = self:GetParticleEmitter3D( Pos )
|
||||
|
||||
if not IsValid( emitter ) or not IsValid( emitter3D ) then return end
|
||||
|
||||
local particle = emitter3D:Add( "effects/lvs_base/flamelet"..math.random(1,5), Pos )
|
||||
|
||||
local Size = self:GetSize()
|
||||
|
||||
if particle then
|
||||
particle:SetStartSize( 20 * Size )
|
||||
particle:SetEndSize( 60 * Size )
|
||||
particle:SetDieTime( math.Rand(0.5,1) )
|
||||
particle:SetStartAlpha( 255 )
|
||||
particle:SetEndAlpha( 0 )
|
||||
particle:SetRollDelta( math.Rand(-2,2) )
|
||||
particle:SetAngles( Dir:Angle() )
|
||||
end
|
||||
|
||||
local fparticle = emitter:Add( "effects/lvs_base/fire", Pos )
|
||||
if fparticle then
|
||||
fparticle:SetVelocity( (VectorRand() * 30 + Dir * 100) * Size )
|
||||
fparticle:SetDieTime( math.Rand(0.6,0.8) )
|
||||
fparticle:SetAirResistance( 0 )
|
||||
|
||||
fparticle:SetStartAlpha( 255 )
|
||||
fparticle:SetEndAlpha( 255 )
|
||||
|
||||
fparticle:SetStartSize( 40 * Size )
|
||||
fparticle:SetEndSize( 0 )
|
||||
|
||||
fparticle:SetRollDelta( math.Rand(-2,2) )
|
||||
fparticle:SetColor( 255,255,255 )
|
||||
fparticle:SetGravity( Vector( 0, 0, 100 ) * Size )
|
||||
fparticle:SetCollide( false )
|
||||
end
|
||||
|
||||
local fparticle = emitter:Add( "effects/lvs_base/flamelet"..math.random(1,5), Pos )
|
||||
if fparticle then
|
||||
fparticle:SetVelocity( VectorRand() * 25 * Size )
|
||||
fparticle:SetDieTime( math.Rand(0.4,0.8) )
|
||||
fparticle:SetStartAlpha( 150 )
|
||||
fparticle:SetEndAlpha( 0 )
|
||||
fparticle:SetStartSize( 0 )
|
||||
fparticle:SetEndSize( math.Rand(60,80) * Size )
|
||||
fparticle:SetColor( 255, 255, 255 )
|
||||
fparticle:SetGravity( Vector(0,0,100) * Size )
|
||||
fparticle:SetRollDelta( math.Rand(-2,2) )
|
||||
fparticle:SetAirResistance( 0 )
|
||||
end
|
||||
|
||||
for i = 0, 6 do
|
||||
local eparticle = emitter:Add( "effects/fire_embers"..math.random(1,2), Pos )
|
||||
|
||||
if not eparticle then continue end
|
||||
|
||||
eparticle:SetVelocity( VectorRand() * 400 * Size )
|
||||
eparticle:SetDieTime( math.Rand(0.4,0.6) )
|
||||
eparticle:SetStartAlpha( 255 )
|
||||
eparticle:SetEndAlpha( 0 )
|
||||
eparticle:SetStartSize( 20 * Size )
|
||||
eparticle:SetEndSize( 0 )
|
||||
eparticle:SetColor( 255, 255, 255 )
|
||||
eparticle:SetGravity( Vector(0,0,600) * Size )
|
||||
eparticle:SetRollDelta( math.Rand(-8,8) )
|
||||
eparticle:SetAirResistance( 300 * Size )
|
||||
end
|
||||
|
||||
if math.random(1,3) ~= 1 then return end
|
||||
|
||||
local sparticle = emitter:Add( Materials[ math.random(1, #Materials ) ], Pos )
|
||||
if sparticle then
|
||||
sparticle:SetVelocity( Dir * 400 * Size )
|
||||
sparticle:SetDieTime( math.Rand(2,4) )
|
||||
sparticle:SetAirResistance( 500 )
|
||||
sparticle:SetStartAlpha( 125 )
|
||||
sparticle:SetStartSize( 0 )
|
||||
sparticle:SetEndSize( 200 * Size )
|
||||
sparticle:SetRoll( math.Rand(-3,3) )
|
||||
sparticle:SetRollDelta( math.Rand(-1,1) )
|
||||
sparticle:SetColor( 0, 0, 0 )
|
||||
sparticle:SetGravity( Vector( 0, 0, 800 ) * Size )
|
||||
sparticle:SetCollide( false )
|
||||
end
|
||||
end
|
||||
|
||||
function ENT:Think()
|
||||
self:EmitFire()
|
||||
|
||||
self:SetNextClientThink( CurTime() + math.Rand(0.01,0.4) )
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
function ENT:GetParticleEmitter3D( Pos )
|
||||
local EntTable = self:GetTable()
|
||||
|
||||
local T = CurTime()
|
||||
|
||||
if IsValid( EntTable.Emitter3D ) and (EntTable.EmitterTime3D or 0) > T then
|
||||
return EntTable.Emitter3D
|
||||
end
|
||||
|
||||
self:StopEmitter3D()
|
||||
|
||||
EntTable.Emitter3D = ParticleEmitter( Pos, true )
|
||||
EntTable.EmitterTime3D = T + 2
|
||||
|
||||
return EntTable.Emitter3D
|
||||
end
|
||||
|
||||
|
||||
function ENT:StopEmitter()
|
||||
if not IsValid( self.Emitter ) then return end
|
||||
|
||||
self.Emitter:Finish()
|
||||
end
|
||||
|
||||
function ENT:StopEmitter3D()
|
||||
if not IsValid( self.Emitter3D ) then return end
|
||||
|
||||
self.Emitter3D:Finish()
|
||||
end
|
||||
Reference in New Issue
Block a user