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,64 @@
include("shared.lua")
local up = Vector(0,0,1)
local down = Vector(0,0,-1)
function ENT:DoVehicleFX()
local EntTable = self:GetTable()
local Vel = self:GetVelocity():Length()
if EntTable._WindSFX then
EntTable._WindSFX:ChangeVolume( math.Clamp( (Vel * EntTable.GroundEffectsMultiplier - 1200) / 2800,0,1 ), 0.25 )
end
local T = CurTime()
if (EntTable.nextFX or 0) < T then
EntTable.nextFX = T + 0.01
self:DoAdvancedWaterEffects( EntTable, Vel )
end
end
function ENT:DoAdvancedWaterEffects( EntTable, Vel )
local pos = self:LocalToWorld( self:OBBCenter() )
local traceSky = util.TraceLine( {
start = pos,
endpos = pos + up * 50000,
filter = self:GetCrosshairFilterEnts()
} )
local traceWater = util.TraceLine( {
start = traceSky.HitPos,
endpos = pos + down * 50000,
filter = self:GetCrosshairFilterEnts(),
mask = MASK_WATER
} )
local traceSoil = util.TraceLine( {
start = traceSky.HitPos,
endpos = pos + down * 50000,
filter = self:GetCrosshairFilterEnts(),
mask = MASK_ALL
} )
if traceSoil.HitPos.z > traceWater.HitPos.z then
if EntTable._WaterSFX then
EntTable._WaterSFX:ChangeVolume( 0, 0.25 )
end
return
end
if EntTable._WaterSFX then
EntTable._WaterSFX:ChangeVolume( math.min(Vel / EntTable.MaxVelocity,1) ^ 2, 0.25 )
EntTable._WaterSFX:ChangePitch( math.Clamp((Vel / EntTable.MaxVelocity) * 50,80,150), 0.5 )
end
local effectdata = EffectData()
effectdata:SetOrigin( traceWater.HitPos )
effectdata:SetEntity( self )
util.Effect( "lvs_physics_water_advanced", effectdata )
end

View File

@@ -0,0 +1,167 @@
AddCSLuaFile( "shared.lua" )
AddCSLuaFile( "cl_init.lua" )
include("shared.lua")
include("sv_controls.lua")
include("sv_components.lua")
function ENT:EnableManualTransmission()
return false
end
function ENT:DisableManualTransmission()
return false
end
function ENT:SpawnFunction( ply, tr, ClassName )
local startpos = ply:GetShootPos()
local endpos = startpos + ply:GetAimVector() * 10000
local waterTrace = util.TraceLine( {
start = startpos,
endpos = endpos,
mask = MASK_WATER,
filter = ply
} )
if waterTrace.Hit and ((waterTrace.HitPos - startpos):Length() < (tr.HitPos - startpos):Length()) then
tr = waterTrace
end
if not tr.Hit then return end
local ent = ents.Create( ClassName )
ent:StoreCPPI( ply )
ent:SetPos( tr.HitPos + tr.HitNormal * ent.SpawnNormalOffset )
ent:SetAngles( Angle(0, ply:EyeAngles().y, 0 ) )
ent:Spawn()
ent:Activate()
return ent
end
function ENT:RunAI()
end
function ENT:GetEnginePos()
local Engine = self:GetEngine()
if IsValid( Engine ) then return Engine:GetPos() end
return self:LocalToWorld( self:OBBCenter() )
end
local up = Vector(0,0,1)
local down = Vector(0,0,-1)
function ENT:PhysicsSimulate( phys, deltatime )
if self:GetEngineActive() then phys:Wake() end
local EntTable = self:GetTable()
local pos = self:GetEnginePos()
local traceSky = util.TraceLine( {
start = pos,
endpos = pos + up * 50000,
filter = self:GetCrosshairFilterEnts()
} )
local traceData = {
start = traceSky.HitPos,
endpos = pos + down * 50000,
filter = self:GetCrosshairFilterEnts()
}
pos = phys:LocalToWorld( phys:GetMassCenter() )
local traceSoil = util.TraceLine( traceData )
traceData.mask = MASK_WATER
local traceWater = util.TraceLine( traceData )
local EngineInWater = traceWater.Hit
local Engine = self:GetEngine()
if IsValid( Engine ) then
traceData.start = Engine:GetPos()
traceData.endpos = Engine:LocalToWorld( Vector(0,0,-EntTable.EngineSplashDistance) )
EngineInWater = util.TraceLine( traceData ).Hit
end
if not EngineInWater then return vector_origin, vector_origin, SIM_NOTHING end
local BuoyancyForce = math.min( math.max( traceWater.HitPos.z - pos.z + EntTable.FloatHeight, 0 ), 10 )
local Grav = physenv.GetGravity()
local Vel = phys:GetVelocity()
local AngVel = phys:GetAngleVelocity()
local mul = BuoyancyForce / 10
local invmul = math.Clamp( 1 - mul, 0, 1 )
local Force = (-Grav + Vector(0,0,-Vel.z * invmul * EntTable.FloatForce)) * mul
local ForcePos = pos + self:GetUp() * BuoyancyForce
local ForceLinear, ForceAngle = phys:CalculateForceOffset( Force, ForcePos )
ForceAngle = (ForceAngle - AngVel * invmul * 2) * 15 * EntTable.ForceAngleMultiplier
local VelL = self:WorldToLocal( self:GetPos() + Vel )
local Thrust = self:GetThrust()
local ThrustStrength = math.abs( self:GetThrustStrenght() )
local SteerInput = self:GetSteer()
local Steer = SteerInput * math.Clamp( ThrustStrength + math.min(math.abs( VelL.x ) / math.min( EntTable.MaxVelocity, EntTable.MaxVelocityReverse ), 1 ), 0, 1 )
local Brake = self:GetBrake()
if Brake > 0 then
Steer = Steer * -Brake
end
local Pitch = -(math.max( math.cos( CurTime() * EntTable.FloatWaveFrequency + self:EntIndex() * 1337 ), 0 ) * VelL.x * 0.25 * EntTable.FloatWaveIntensity + Thrust * 0.25 * math.Clamp( VelL.x / EntTable.MaxVelocity,0,1) * EntTable.FloatThrottleIntensity)
local Yaw = Steer * EntTable.TurnForceYaw
local Roll = - AngVel.x * 5 - Steer * EntTable.TurnForceRoll
if math.abs( SteerInput ) < 1 and BuoyancyForce > 0 and not self:IsPlayerHolding() then
Yaw = Yaw - AngVel.z * math.max( ((1 - math.abs( SteerInput )) ^ 2) * 100 - 100 * ThrustStrength, 1 )
end
ForceLinear:Add( self:GetForward() * Thrust + self:GetRight() * VelL.y )
ForceAngle:Add( Vector(Roll,Pitch,Yaw) )
local FloatExp = math.max( self:GetUp().z, 0 ) ^ EntTable.FloatExponent
ForceLinear:Mul( FloatExp )
ForceAngle:Mul( FloatExp )
return self:PhysicsSimulateOverride( ForceAngle, ForceLinear, phys, deltatime, SIM_GLOBAL_ACCELERATION )
end
function ENT:PhysicsSimulateOverride( ForceAngle, ForceLinear, phys, deltatime, simulate )
return ForceAngle, ForceLinear, simulate
end
function ENT:ApproachTargetAngle( TargetAngle )
local pod = self:GetDriverSeat()
if not IsValid( pod ) then return end
local ang = pod:GetAngles()
ang:RotateAroundAxis( self:GetUp(), 90 )
local Forward = ang:Right()
local View = pod:WorldToLocalAngles( TargetAngle ):Forward()
local Reversed = false
if self:AngleBetweenNormal( View, ang:Forward() ) < 90 then
Reversed = self:GetReverse()
end
local LocalAngSteer = (self:AngleBetweenNormal( View, ang:Right() ) - 90) / self.MouseSteerAngle
local Steer = (math.min( math.abs( LocalAngSteer ), 1 ) ^ self.MouseSteerExponent * self:Sign( LocalAngSteer ))
self:SetSteer( Steer )
end

View File

@@ -0,0 +1,101 @@
ENT.Base = "lvs_base_wheeldrive"
ENT.PrintName = "[LVS] Base Boat"
ENT.Author = "Luna"
ENT.Information = "Luna's Vehicle Script"
ENT.Category = "[LVS]"
ENT.Spawnable = false
ENT.AdminSpawnable = false
ENT.MaxHealth = 600
ENT.MaxHealthEngine = 50
ENT.MaxHealthFuelTank = 10
ENT.EngineIdleRPM = 1000
ENT.EngineMaxRPM = 6000
ENT.EngineSplash = false
ENT.EngineSplashStartSize = 50
ENT.EngineSplashEndSize = 200
ENT.EngineSplashVelocity = 500
ENT.EngineSplashVelocityRandomAdd = 200
ENT.EngineSplashThrowAngle = 0
ENT.EngineSplashDistance = 100
ENT.DeleteOnExplode = true
ENT.lvsAllowEngineTool = false
ENT.lvsShowInSpawner = false
ENT.AllowSuperCharger = false
ENT.AllowTurbo = false
ENT.FloatHeight = 0
ENT.FloatForce = 20
ENT.FloatWaveFrequency = 5
ENT.FloatExponent = 2
ENT.FloatWaveIntensity = 1
ENT.FloatThrottleIntensity = 1
ENT.TurnRate = 5
ENT.TurnForceYaw = 600
ENT.TurnForceRoll = 400
ENT.MaxThrust = 1000
ENT.MaxVelocity = 1000
ENT.MaxVelocityReverse = 350
ENT.MinVelocityAutoBrake = 200
ENT.ForceLinearMultiplier = 1
ENT.ForceAngleMultiplier = 1
function ENT:GetVehicleType()
return "boat"
end
function ENT:UpdateAnimation( ply, velocity, maxseqgroundspeed )
ply:SetPlaybackRate( 1 )
if CLIENT then
if ply == self:GetDriver() then
ply:SetPoseParameter( "vehicle_steer", -self:GetSteer() )
ply:InvalidateBoneCache()
end
GAMEMODE:GrabEarAnimation( ply )
GAMEMODE:MouthMoveAnimation( ply )
end
return false
end
function ENT:GetThrust()
return self:GetThrustStrenght() * self.MaxThrust
end
function ENT:GetThrustStrenght()
local EntTable = self:GetTable()
local VelL = self:WorldToLocal( self:GetPos() + self:GetVelocity() )
local DesiredVelocity = EntTable.MaxVelocity * self:GetThrottle() - EntTable.MaxVelocityReverse * self:GetBrake()
if DesiredVelocity == 0 and math.abs( VelL.x ) > EntTable.MinVelocityAutoBrake then
return 0
end
return math.Clamp((DesiredVelocity - VelL.x) / EntTable.MaxVelocity,-1,1)
end
function ENT:GetGear()
return -1
end
function ENT:IsManualTransmission()
return false
end

View File

@@ -0,0 +1,55 @@
function ENT:AddEngine( pos, ang, mins, maxs )
if IsValid( self:GetEngine() ) then return end
ang = ang or angle_zero
mins = mins or Vector(-10,-10,-10)
maxs = maxs or Vector(10,10,10)
local Engine = ents.Create( "lvs_powerboat_engine" )
if not IsValid( Engine ) then
self:Remove()
print("LVS: Failed to create engine entity. Vehicle terminated.")
return
end
Engine:SetPos( self:LocalToWorld( pos ) )
Engine:SetAngles( self:LocalToWorldAngles( ang ) )
Engine:Spawn()
Engine:Activate()
Engine:SetParent( self )
Engine:SetBase( self )
Engine:SetMaxHP( self.MaxHealthEngine )
Engine:SetHP( self.MaxHealthEngine )
self:SetEngine( Engine )
self:DeleteOnRemove( Engine )
self:TransferCPPI( Engine )
debugoverlay.BoxAngles( self:LocalToWorld( pos ), mins, maxs, self:LocalToWorldAngles( ang ), 15, Color( 0, 255, 255, 255 ) )
self:AddDS( {
pos = pos,
ang = ang,
mins = mins,
maxs = maxs,
Callback = function( tbl, ent, dmginfo )
local Engine = self:GetEngine()
if not IsValid( Engine ) then return end
Engine:TakeTransmittedDamage( dmginfo )
if not Engine:GetDestroyed() then
dmginfo:ScaleDamage( 0.25 )
end
end
} )
return Engine
end

View File

@@ -0,0 +1,46 @@
function ENT:CalcMouseSteer( ply )
self:ApproachTargetAngle( ply:EyeAngles() )
end
function ENT:CalcSteer( ply, Steer )
local KeyLeft = ply:lvsKeyDown( "CAR_STEER_LEFT" )
local KeyRight = ply:lvsKeyDown( "CAR_STEER_RIGHT" )
local Steer = (KeyLeft and 1 or 0) - (KeyRight and 1 or 0)
self:LerpSteer( Steer )
end
function ENT:LerpSteer( Steer )
local Rate = FrameTime() * self.TurnRate
local Cur = self:GetSteer()
local New = Cur + math.Clamp(Steer - Cur,-Rate,Rate)
self:SetSteer( New )
end
function ENT:CalcThrottle( ply )
local KeyThrottle = ply:lvsKeyDown( "CAR_THROTTLE" )
local KeyBrake = ply:lvsKeyDown( "CAR_BRAKE" )
if KeyBrake then
KeyThrottle = false
end
local ThrottleValue = ply:lvsKeyDown( "CAR_THROTTLE_MOD" ) and self:GetMaxThrottle() or 0.5
local Throttle = KeyThrottle and ThrottleValue or 0
local Brake = KeyBrake and ThrottleValue or 0
self:LerpThrottle( Throttle )
self:LerpBrake( Brake )
end
function ENT:CalcHandbrake( ply )
end
function ENT:CalcTransmission( ply, T )
end
function ENT:OnHandbrakeActiveChanged( Active )
end