velox/Code/Base/VeloXBase.Phys.cs
2025-11-25 19:16:40 +07:00

71 lines
1.4 KiB
C#

using Sandbox;
namespace VeloX;
public abstract partial class VeloXBase
{
private Vector3 linForce;
private Vector3 angForce;
protected const float BrakeForce = 4500f;
protected const float HandbrakeForce = 35000f;
protected void PhysicsSimulate()
{
if ( Body.Sleeping && Input.AnalogMove.x == 0 )
return;
var drag = AngularDrag;
var mass = Body.Mass;
var angVel = Body.AngularVelocity;
linForce.x = 0;
linForce.y = 0;
linForce.z = 0;
angForce = angForce.WithX( angVel.x * drag.x * mass * 1000 );
angForce = angForce.WithY( angVel.y * drag.y * mass * 1000 );
angForce = angForce.WithZ( angVel.z * drag.z * mass * 1000 );
if ( Wheels.Count > 0 )
{
Vector3 vehVel = Body.Velocity;
Vector3 vehAngVel = Body.AngularVelocity;
var dt = Time.Delta;
CombinedLoad = 0;
foreach ( var v in Wheels )
CombinedLoad += v.Fz;
foreach ( var v in Wheels )
{
if ( v.IsFront )
{
v.BrakeTorque = SwappedBrakes * BrakeForce * 1.3f;
}
else
{
v.BrakeTorque = SwappedBrakes * BrakeForce * 0.7f;
v.BrakeTorque += Handbrake * HandbrakeForce;
}
if ( TotalSpeed < 1 && !AnyInput )
{
v.BrakeTorque = HandbrakeForce;
}
v.Update( this, in dt );
v.DoPhysics( in dt );
}
Body.Velocity = vehVel;
Body.AngularVelocity = vehAngVel;
}
Body.ApplyForce( linForce );
Body.ApplyTorque( angForce );
}
}