add sborka

This commit is contained in:
2026-03-31 10:27:04 +03:00
commit f5e5f56c84
2345 changed files with 382127 additions and 0 deletions

View File

@@ -0,0 +1,255 @@
AddCSLuaFile()
ENT.Type = "anim"
ENT.Spawnable = false
ENT.AdminSpawnable = false
ENT.DoNotDuplicate = true
ENT._LVS = true
function ENT:SetupDataTables()
self:NetworkVar( "Entity",0, "Base" )
end
if SERVER then
function ENT:Initialize()
self:SetMoveType( MOVETYPE_NONE )
self:SetSolid( SOLID_NONE )
self:DrawShadow( false )
debugoverlay.Cross( self:GetPos(), 50, 5, Color( 0, 255, 255 ) )
end
function ENT:CheckWater( Base )
if bit.band( util.PointContents( self:GetPos() ), CONTENTS_WATER ) ~= CONTENTS_WATER then
if self.CountWater then
self.CountWater = nil
end
return
end
if Base.WaterLevelAutoStop > 3 then return end
self.CountWater = (self.CountWater or 0) + 1
if self.CountWater < 4 then return end
Base:StopEngine()
end
function ENT:Think()
local Base = self:GetBase()
if IsValid( Base ) and Base:GetEngineActive() then
self:CheckWater( Base )
end
self:NextThink( CurTime() + 1 )
return true
end
function ENT:OnTakeDamage( dmginfo )
end
function ENT:UpdateTransmitState()
return TRANSMIT_ALWAYS
end
return
end
ENT._oldEnActive = false
ENT._ActiveSounds = {}
function ENT:Initialize()
end
function ENT:StopSounds()
for id, sound in pairs( self._ActiveSounds ) do
if istable( sound ) then
for _, snd in pairs( sound ) do
if snd then
snd:Stop()
end
end
else
sound:Stop()
end
self._ActiveSounds[ id ] = nil
end
end
function ENT:HandleEngineSounds( vehicle )
local ply = LocalPlayer()
local pod = ply:GetVehicle()
local Throttle = vehicle:GetThrottle()
local Volume = (0.6 + math.max( vehicle:GetThrustStrenght(), 0 ) * 0.4) * Throttle
local Doppler = vehicle:CalcDoppler( ply )
local DrivingMe = ply:lvsGetVehicle() == vehicle
local VolumeSetNow = false
local FirstPerson = false
if IsValid( pod ) then
local ThirdPerson = pod:GetThirdPersonMode()
if ThirdPerson ~= self._lvsoldTP then
self._lvsoldTP = ThirdPerson
VolumeSetNow = DrivingMe
end
FirstPerson = DrivingMe and not ThirdPerson
end
if DrivingMe ~= self._lvsoldDrivingMe then
self._lvsoldDrivingMe = DrivingMe
self:StopSounds()
self._oldEnActive = nil
return
end
local FT = RealFrameTime()
local THR = (0.8 + (math.max( vehicle:GetVelocity():Length() / vehicle.MaxVelocity, 1 ) - vehicle:GetThrustStrenght()) * 0.2) * Throttle
for id, sound in pairs( self._ActiveSounds ) do
if not sound then continue end
local data = self.EngineSounds[ id ]
local Pitch = math.Clamp( data.Pitch + THR * data.PitchMul, data.PitchMin, data.PitchMax )
local PitchMul = data.UseDoppler and Doppler or 1
local Volume = InActive and 0 or math.min( Volume * LVS.EngineVolume * 1.25, 1 )
if istable( sound ) then
sound.ext:ChangePitch( math.Clamp( Pitch * PitchMul, 0, 255 ), 0.2 )
if sound.int then sound.int:ChangePitch( math.Clamp( Pitch, 0, 255 ), 0.2 ) end
local fadespeed = VolumeSetNow and 0 or 0.1
if FirstPerson then
sound.ext:ChangeVolume( 0, 0 )
if vehicle:HasActiveSoundEmitters() then
Volume = Volume * 0.25
fadespeed = fadespeed * 0.5
end
if sound.int then sound.int:ChangeVolume( Volume, fadespeed ) end
else
sound.ext:ChangeVolume( Volume, fadespeed )
if sound.int then sound.int:ChangeVolume( 0, 0 ) end
end
else
sound:ChangePitch( math.Clamp( Pitch * PitchMul, 0, 255 ), 0.1 )
sound:ChangeVolume( Volume, data.FadeSpeed )
end
end
end
function ENT:OnEngineActiveChanged( Active )
if not Active then self:StopSounds() return end
local ply = LocalPlayer()
local DrivingMe = ply:lvsGetVehicle() == self:GetBase()
for id, data in pairs( self.EngineSounds ) do
if not isstring( data.sound ) then continue end
self.EngineSounds[ id ].Pitch = data.Pitch or 0
self.EngineSounds[ id ].PitchMin = data.PitchMin or 0
self.EngineSounds[ id ].PitchMax = data.PitchMax or 255
self.EngineSounds[ id ].PitchMul = data.PitchMul or 100
self.EngineSounds[ id ].Volume = data.Volume or 1
self.EngineSounds[ id ].VolumeMin = data.VolumeMin or 0
self.EngineSounds[ id ].VolumeMax = data.VolumeMax or 1
self.EngineSounds[ id ].SoundLevel = data.SoundLevel or 100
self.EngineSounds[ id ].UseDoppler = data.UseDoppler ~= false
if data.sound_int and data.sound_int ~= data.sound and DrivingMe then
local sound = CreateSound( self, data.sound )
sound:SetSoundLevel( data.SoundLevel )
sound:PlayEx(0,100)
if data.sound_int == "" then
self._ActiveSounds[ id ] = {
ext = sound,
int = false,
}
else
local sound_interior = CreateSound( self, data.sound_int )
sound_interior:SetSoundLevel( data.SoundLevel )
sound_interior:PlayEx(0,100)
self._ActiveSounds[ id ] = {
ext = sound,
int = sound_interior,
}
end
else
local sound = CreateSound( self, data.sound )
sound:SetSoundLevel( data.SoundLevel )
sound:PlayEx(0,100)
self._ActiveSounds[ id ] = sound
end
end
end
function ENT:Think()
local vehicle = self:GetBase()
if not IsValid( vehicle ) then return end
self:DamageFX( vehicle )
if not self.EngineSounds then
self.EngineSounds = vehicle.EngineSounds
return
end
local EngineActive = vehicle:GetEngineActive()
if self._oldEnActive ~= EngineActive then
self._oldEnActive = EngineActive
self:OnEngineActiveChanged( EngineActive )
end
if EngineActive then
self:HandleEngineSounds( vehicle )
end
end
function ENT:OnRemove()
self:StopSounds()
end
function ENT:Draw()
end
function ENT:DrawTranslucent()
end
function ENT:DamageFX( vehicle )
local T = CurTime()
local HP = vehicle:GetHP()
local MaxHP = vehicle:GetMaxHP()
if HP <= 0 or HP > MaxHP * 0.5 or (self.nextDFX or 0) > T then return end
self.nextDFX = T + 0.05
local effectdata = EffectData()
effectdata:SetOrigin( self:GetPos() )
effectdata:SetEntity( vehicle )
util.Effect( "lvs_engine_blacksmoke", effectdata )
end