192 lines
3.9 KiB
Lua
192 lines
3.9 KiB
Lua
AddCSLuaFile()
|
|
|
|
ENT.Type = "anim"
|
|
ENT.DoNotDuplicate = true
|
|
|
|
function ENT:SetupDataTables()
|
|
self:NetworkVar( "Entity",0, "Base" )
|
|
self:NetworkVar( "Entity",1, "DoorHandler" )
|
|
|
|
self:NetworkVar( "Float",0, "Fuel" )
|
|
self:NetworkVar( "Float",1, "NWSize" )
|
|
self:NetworkVar( "Float",2, "HP" )
|
|
self:NetworkVar( "Float",3, "MaxHP" )
|
|
|
|
self:NetworkVar( "Int",0, "FuelType" )
|
|
|
|
self:NetworkVar( "Bool",0, "Destroyed" )
|
|
|
|
if SERVER then
|
|
self:SetMaxHP( 100 )
|
|
self:SetHP( 100 )
|
|
self:SetFuel( 1 )
|
|
self:NetworkVarNotify( "Fuel", self.OnFuelChanged )
|
|
end
|
|
end
|
|
|
|
function ENT:SetSize( num )
|
|
self:SetNWSize( num )
|
|
end
|
|
|
|
function ENT:GetSize()
|
|
return self:GetNWSize() * LVS.FuelScale
|
|
end
|
|
|
|
if SERVER then
|
|
function ENT:Initialize()
|
|
self:SetMoveType( MOVETYPE_NONE )
|
|
self:SetSolid( SOLID_NONE )
|
|
self:DrawShadow( false )
|
|
debugoverlay.Cross( self:GetPos(), 20, 5, Color( 255, 93, 0 ) )
|
|
end
|
|
|
|
function ENT:ExtinguishAndRepair()
|
|
self:SetHP( self:GetMaxHP() )
|
|
self:SetDestroyed( false )
|
|
end
|
|
|
|
function ENT:Think()
|
|
self:NextThink( CurTime() + 1 )
|
|
|
|
if self:GetDestroyed() then
|
|
local Base = self:GetBase()
|
|
|
|
if not IsValid( Base ) then return end
|
|
|
|
if self:GetFuel() > 0 then
|
|
local dmg = DamageInfo()
|
|
dmg:SetDamage( 10 )
|
|
dmg:SetAttacker( IsValid( Base.LastAttacker ) and Base.LastAttacker or game.GetWorld() )
|
|
dmg:SetInflictor( IsValid( Base.LastInflictor ) and Base.LastInflictor or game.GetWorld() )
|
|
dmg:SetDamageType( DMG_BURN )
|
|
Base:TakeDamageInfo( dmg )
|
|
|
|
self:SetFuel( math.max( self:GetFuel() - 0.05, 0 ) )
|
|
else
|
|
self:SetDestroyed( false )
|
|
end
|
|
else
|
|
local base = self:GetBase()
|
|
|
|
if IsValid( base ) and base:GetEngineActive() then
|
|
self:SetFuel( math.max( self:GetFuel() - (1 / self:GetSize()) * base:GetThrottle() ^ 2, 0 ) )
|
|
end
|
|
end
|
|
|
|
return true
|
|
end
|
|
|
|
function ENT:TakeTransmittedDamage( dmginfo )
|
|
if self:GetDestroyed() then return end
|
|
|
|
local Damage = dmginfo:GetDamage()
|
|
|
|
if Damage <= 0 then return end
|
|
|
|
local CurHealth = self:GetHP()
|
|
|
|
local NewHealth = math.Clamp( CurHealth - Damage, 0, self:GetMaxHP() )
|
|
|
|
self:SetHP( NewHealth )
|
|
|
|
if NewHealth <= 0 then
|
|
self:SetDestroyed( true )
|
|
end
|
|
end
|
|
|
|
function ENT:OnTakeDamage( dmginfo )
|
|
if not dmginfo:IsDamageType( DMG_BURN ) then return end
|
|
|
|
self:TakeTransmittedDamage( dmginfo )
|
|
end
|
|
|
|
function ENT:OnFuelChanged( name, old, new)
|
|
if new == old then return end
|
|
|
|
if new <= 0 then
|
|
local base = self:GetBase()
|
|
|
|
if not IsValid( base ) then return end
|
|
|
|
base:ShutDownEngine()
|
|
|
|
local engine = base:GetEngine()
|
|
|
|
if not IsValid( engine ) then return end
|
|
|
|
engine:EmitSound("vehicles/jetski/jetski_off.wav")
|
|
end
|
|
end
|
|
|
|
return
|
|
end
|
|
|
|
function ENT:Initialize()
|
|
end
|
|
|
|
function ENT:RemoveFireSound()
|
|
if self.FireBurnSND then
|
|
self.FireBurnSND:Stop()
|
|
self.FireBurnSND = nil
|
|
end
|
|
|
|
self.ShouldStopFire = nil
|
|
end
|
|
|
|
function ENT:StopFireSound()
|
|
if self.ShouldStopFire or not self.FireBurnSND then return end
|
|
|
|
self.ShouldStopFire = true
|
|
|
|
self:EmitSound("ambient/fire/mtov_flame2.wav")
|
|
|
|
self.FireBurnSND:ChangeVolume( 0, 0.5 )
|
|
|
|
timer.Simple( 1, function()
|
|
if not IsValid( self ) then return end
|
|
|
|
self:RemoveFireSound()
|
|
end )
|
|
end
|
|
|
|
function ENT:StartFireSound()
|
|
if self.ShouldStopFire or self.FireBurnSND then return end
|
|
|
|
self.FireBurnSND = CreateSound( self, "ambient/fire/firebig.wav" )
|
|
self.FireBurnSND:PlayEx(0,100)
|
|
self.FireBurnSND:ChangeVolume( LVS.EngineVolume, 1 )
|
|
|
|
self:EmitSound("ambient/fire/gascan_ignite1.wav")
|
|
end
|
|
|
|
function ENT:OnRemove()
|
|
self:RemoveFireSound()
|
|
end
|
|
|
|
function ENT:Draw()
|
|
end
|
|
|
|
function ENT:Think()
|
|
self:SetNextClientThink( CurTime() + 0.05 )
|
|
|
|
self:DamageFX()
|
|
|
|
return true
|
|
end
|
|
|
|
function ENT:DamageFX()
|
|
if not self:GetDestroyed() or self:GetFuel() <= 0 then
|
|
self:StopFireSound()
|
|
|
|
return
|
|
end
|
|
|
|
self:StartFireSound()
|
|
|
|
local effectdata = EffectData()
|
|
effectdata:SetOrigin( self:GetPos() )
|
|
effectdata:SetEntity( self:GetBase() )
|
|
util.Effect( "lvs_carfueltank_fire", effectdata )
|
|
end
|
|
|