add sborka
This commit is contained in:
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user