rott/kf_sources/Engine/Classes/SVehicle.uc
2026-07-14 20:27:09 +07:00

153 lines
3.9 KiB
Ucode

//=============================================================================
// SVehicle
// karma physics subclass of vehicle, including networking support
//=============================================================================
class SVehicle extends Vehicle
native
abstract;
cpptext
{
#ifdef WITH_KARMA
// Actor interface.
virtual void PostBeginPlay();
virtual void Destroy();
virtual void PostNetReceive();
virtual void PostNetReceiveLocation();
virtual void PostEditChange();
virtual void setPhysics(BYTE NewPhysics, AActor *NewFloor, FVector NewFloorV);
virtual void TickSimulated( FLOAT DeltaSeconds );
virtual void TickAuthoritative( FLOAT DeltaSeconds );
virtual void physKarma(FLOAT DeltaTime);
virtual void preContactUpdate();
virtual void preKarmaStep(FLOAT DeltaTime);
// SVehicle interface.
virtual void UpdateVehicle(FLOAT DeltaTime);
#endif
}
var (SVehicle) editinline export array<SVehicleWheel> Wheels; // Wheel data
var const bool bVehicleOnGround; // OUTPUT: True if _any_ SVehicleWheel is currently touching the ground (ignores contacts with chassis etc)
//// PHYSICS ////
var (SVehicle) float VehicleMass;
var (SVehicle) float FlipTorque, FlipTime;
var float FlipScale, FlipTimeLeft;
var vector FlipAxis;
//// EFFECTS ////
var (SVehicle) class<Actor> DestroyEffectClass; // Effect spawned when vehicle is destroyed
// Useful function for plotting data to real-time graph on screen.
native final function GraphData(string DataName, float DataValue);
// You got some new info from the server (ie. VehicleState has some new info).
event VehicleStateReceived();
// Do script car model stuff here - but DONT create/destroy anything.
native event UpdateVehicle( float DeltaTime );
// Do any general vehicle set-up when it gets spawned.
simulated function PostNetBeginPlay()
{
Super.PostNetBeginPlay();
// Make sure params are up to date.
SVehicleUpdateParams();
}
function JumpOffPawn() {}
// Called when a parameter of the overall articulated actor has changed (like PostEditChange)
// The script must then call KUpdateConstraintParams or Actor Karma mutators as appropriate.
simulated event SVehicleUpdateParams()
{
KSetMass(VehicleMass);
}
function Flip(vector HitNormal, float ForceScale)
{
if (!bCanFlip)
return;
FlipTimeLeft = FlipTime;
FlipScale = ForceScale;
FlipAxis = HitNormal;
FlipAxis.Z = 0;
enable('Tick');
}
simulated function KApplyForce(out vector Force, out vector Torque)
{
local float torqueScale;
local vector worldUp, torqueAxis;
Super.KApplyForce(Force, Torque);
if (FlipTimeLeft <= 0)
return;
worldUp = vect(0, 0, 1) >> Rotation;
torqueAxis = Normal(FlipAxis Cross worldUp);
// Torque scaled by how far over we are.
// This will be between 0 and PI - so convert to between 0 and 1.
torqueScale = Acos(worldUp Dot vect(0, 0, 1))/3.1416;
Torque = FlipScale * FlipTorque * torqueScale * torqueAxis;
}
simulated function Tick(float deltaTime)
{
Super.Tick(deltaTime);
if (FlipTimeLeft > 0)
{
KWake();
FlipTimeLeft -= deltaTime;
if (FlipTimeLeft <= 0 && !bDriving)
disable('Tick');
}
}
simulated function Destroyed()
{
// Trigger any effects for destruction
if ( DestroyEffectClass != None )
Spawn(DestroyEffectClass, , , Location, Rotation);
super.Destroyed();
}
// Includes properties from KActor
defaultproperties
{
VehicleMass=1.0
Physics=PHYS_Karma
bEdShouldSnap=True
bStatic=False
bShadowCast=False
bCollideActors=True
bCollideWorld=False
bProjTarget=True
bBlockActors=True
bBlockNonZeroExtentTraces=True
bBlockZeroExtentTraces=True
bWorldGeometry=False
bBlockKarma=True
bAcceptsProjectors=True
bCanBeBaseForPawns=True
bAlwaysRelevant=false
RemoteRole=ROLE_SimulatedProxy
bNetInitialRotation=True
bSpecialCalcView=True
bDramaticLighting=True
FlipTorque=300
FlipTime=2
}