Car.c
class CarTypeclass CarOwnerStateclass CarMoveclass Carclass CarControllerenum CarSoundCtrlenum CarFluidenum CarGearboxTypeenum CarGearenum CarAutomaticGearboxModeenum CarWheelWaterState
//! Car's sound controller list. (native, do not change or extend)
enum CarSoundCtrl
{
// simulation
ENGINE, //!< indicates if engine is ON
RPM, //!< engine's RPM
SPEED, //!< speed of the car in km/h
// miscellaneous
DOORS, //!< indicates if doors are open
PLAYER //!< indicates if driver is controlled by player
};
//! Type of vehicle's fluid. (native, do not change or extend)
enum CarFluid
{
FUEL,
OIL,
BRAKE,
COOLANT,
USER1, //!< reserved for user / modding support
USER2, //!< reserved for user / modding support
USER3, //!< reserved for user / modding support
USER4 //!< reserved for user / modding support
};
//! Enumerated gearbox types. (native, do not change or extend)
enum CarGearboxType
{
MANUAL, //!< classic manual transmission with friction plates between engine and gearbox
AUTOMATIC //!< automatic transmission with torque converter between engine and gearbox
}
//! Enumerated vehicle's gears. (native, do not change or extend)
enum CarGear
{
REVERSE,
NEUTRAL,
FIRST,
SECOND,
THIRD,
FOURTH,
FIFTH,
SIXTH,
SEVENTH,
EIGTH,
NINTH,
TENTH,
ELEVENTH,
TWELFTH,
THIRTEENTH,
FOURTEENTH,
FIFTEENTH,
SIXTEENTH
};
//! Enumerated automatic gearbox modes. (native, do not change or extend)
enum CarAutomaticGearboxMode
{
P, //!< park
R, //!< reverse
N, //!< neutral
D //!< drive
};
//! Enumerated car wheel water state. (native, do not change or extend)
enum CarWheelWaterState
{
ON_LAND, //!< if the wheel is on or above land
IN_WATER, //!< if the wheel is partially within some water plane
UNDER_WATER //!< if the wheel is under a water plane
};
class CarType : TransportType
{
};
class CarOwnerState : TransportOwnerState
{
};
class CarMove : TransportMove
{
};
//! Native class for cars - handles physics simulation
class Car extends Transport
{
//!
protected override event typename GetOwnerStateType()
{
return CarOwnerState;
}
//!
protected override event typename GetMoveType()
{
return CarMove;
}
//! Returns the current speed of the vehicle in km/h.
proto native float GetSpeedometer();
//! Returns the current speed of the vehicle in km/h. Value is absolute
float GetSpeedometerAbsolute()
{
return Math.AbsFloat(GetSpeedometer());
}
override bool IsAreaAtDoorFree( int currentSeat, float maxAllowedObjHeight = 0.5, float horizontalExtents = 0.5, float playerHeight = 1.7 )
{
vector transform[4];
vector extents;
extents[0] = horizontalExtents;
extents[1] = playerHeight;
extents[2] = horizontalExtents;
float speed = GetSpeedometerAbsolute();
if (speed > 8)
extents[2] = extents[2] * 6;
if (speed > 8)
extents[0] = 2;
return IsAreaAtDoorFree( currentSeat, maxAllowedObjHeight, extents, transform );
}
override Shape DebugFreeAreaAtDoor( int currentSeat, float maxAllowedObjHeight = 0.5, float horizontalExtents = 0.5, float playerHeight = 1.7 )
{
int color = ARGB(20, 0, 255, 0);
vector transform[4];
vector extents;
extents[0] = horizontalExtents;
extents[1] = playerHeight;
extents[2] = horizontalExtents;
float speed = GetSpeedometerAbsolute();
if (speed > 8)
extents[2] = extents[2] * 6;
if (speed > 8)
extents[0] = 2;
if (!IsAreaAtDoorFree( currentSeat, maxAllowedObjHeight, extents, transform ))
{
color = ARGB(20, 255, 0, 0);
}
Shape shape = Debug.DrawBox(-extents * 0.5, extents * 0.5, color);
shape.SetMatrix(transform);
return shape;
}
protected bool DetectFlippedUsingWheels(VehicleFlippedContext ctx, bool disallowSide)
{
if (disallowSide && (vector.Dot(GetDirectionUp(), vector.Up) < 0.7))
{
// return as "flipped", vehicle isn't pointing enough up to be reasonably certain
return true;
}
int wheelCount = WheelCount();
for (int wheelIdx = 0; wheelIdx < wheelCount; wheelIdx++)
{
if (!WheelHasContact(wheelIdx))
{
// wheel not in contact, then we could be flipped, we assume there exist other predicates
return true;
}
}
// all wheels in contact (or zero registered wheels), then we are in contact
return false;
}
//! Returns the current steering value in range <-1, 1>.
proto native float GetSteering();
//! Sets the future steering value.
proto native void SetSteering(float value, bool unused0 = false);
//! Returns the actual throttle value in range <0, 1>.
proto native float GetThrottle();
//! Sets the future throttle value.
proto native void SetThrottle(float value);
//! Returns the value of how much the clutch is disengaged.
proto native int GetClutch();
//! Sets the future clutch value.
proto native void SetClutch(float value);
//! Returns the current brake value in range <0, 1>.
proto native float GetBrake();
//! Sets the future brake value
proto native void SetBrake(float value, float unused0 = 0, bool unused1 = false);
//! Returns the current handbrake value in range <0, 1>.
proto native float GetHandbrake();
//! Sets the future handbrake value
proto native void SetHandbrake(float value);
//! Sets if brakes should activate without a driver present
proto native void SetBrakesActivateWithoutDriver(bool activate = true);
//! Returns engine's min operating rpm
proto native float EngineGetRPMMin();
//! Returns engine's idle rpm before engine stalls.
proto native float EngineGetRPMIdle();
//! Returns engine's max rpm before engine blows up.
proto native float EngineGetRPMMax();
//! Returns engine's maximal working rpm without damaging the engine.
proto native float EngineGetRPMRedline();
//! Returns engine's rpm value.
proto native float EngineGetRPM();
//! Returns true when engine is running, false otherwise.
proto native bool EngineIsOn();
//! Starts the engine.
proto native void EngineStart();
//! Stops the engine.
proto native void EngineStop();
//! Get actual position of engine (model space)
proto native vector GetEnginePos();
//! Override the position of engine (model space)
proto native void SetEnginePos(vector pos);
//! Returns the index of the current gear, -1 if there is no engine.
proto native int GetCurrentGear();
//! Returns the index of the future gear, -1 if there is no engine.
proto native int GetGear();
//! Returns the index of the neutral gear.
proto native int GetNeutralGear();
//! Returns the number of gears.
proto native int GetGearCount();
//! Shifts the future gear up, triggering gearbox simulation.
proto native void ShiftUp();
//! Shifts the future gear to selected gear, triggering gearbox simulation.
proto native void ShiftTo(int gear);
//! Shifts the future gear down, triggering gearbox simulation.
proto native void ShiftDown();
//! Returns gearbox type. See CarGearboxType enum for more info.
proto native CarGearboxType GearboxGetType();
//! Returns gearbox mode. This is useful when car has automatic gearbox.
proto native CarAutomaticGearboxMode GearboxGetMode();
//! Returns true if any of the wheels are locked in terms of its movement.
proto native bool WheelIsAnyLocked();
/*!
Returns the raw angular velocity of the wheel, unstable value
\param[in] wheelIdx index of the wheel, they are counted from left-front to rear-right
*/
proto native float WheelGetAngularVelocity( int wheelIdx );
/*!
Returns true if given wheel is making any contact
\param[in] wheelIdx index of the wheel, they are counted from left-front to rear-right
*/
proto native bool WheelHasContact( int wheelIdx );
/*!
Returns the position of contact in world space, only valid if there was an actual contact
\param[in] wheelIdx index of the wheel, they are counted from left-front to rear-right
*/
proto native vector WheelGetContactPosition( int wheelIdx );
/*!
Returns the normal of contact in world space, only valid if there was an actual contact
\param[in] wheelIdx index of the wheel, they are counted from left-front to rear-right
*/
proto native vector WheelGetContactNormal( int wheelIdx );
/*!
Returns the direction pointing forwards that the wheel is facing
\param[in] wheelIdx index of the wheel, they are counted from left-front to rear-right
*/
proto native vector WheelGetDirection( int wheelIdx );
/*!
Returns the surface that the wheel is nearby
\param[in] wheelIdx index of the wheel, they are counted from left-front to rear-right
*/
proto native SurfaceInfo WheelGetSurface( int wheelIdx );
/*!
Returns the state that the wheel is in with water
\param[in] wheelIdx index of the wheel, they are counted from left-front to rear-right
*/
proto native CarWheelWaterState WheelGetWaterState( int wheelIdx );
/*!
Returns the entity attached that represents the wheel
\param[in] wheelIdx index of the wheel, they are counted from left-front to rear-right
*/
proto native EntityAI WheelGetEntity( int wheelIdx );
/*!
Returns true if given wheel is locked in terms of its movement.
\param[in] wheelIdx index of the wheel, they are counted from left-front to rear-right
*/
proto native bool WheelIsLocked( int wheelIdx );
//! How many wheel can be attached to a car (hubs only)
proto native int WheelCount();
//! Number of actually attached wheels (hubs only)
proto native int WheelCountPresent();
/*!
Returns tank capacity for the specified vehicle's fluid.
\param fluid the specified fluid type
*/
proto native float GetFluidCapacity(CarFluid fluid);
/*!
Returns fraction value (in range <0, 1>)
of the current state of the specified vehicle's fluid.
\param[in] fluid the specified fluid type
*/
proto native float GetFluidFraction(CarFluid fluid);
//! Removes from the specified fluid the specified amount.
proto native void Leak(CarFluid fluid, float amount);
//! Removes all the specified fluid from vehicle.
proto native void LeakAll(CarFluid fluid);
//! Adds to the specified fluid the specified amount.
proto native void Fill(CarFluid fluid, float amount);
/*!
Is called every time the game wants to start the engine.
\return true if the engine can start, false otherwise.
*/
bool OnBeforeEngineStart()
{
// engine can start by default
return true;
}
/*!
Is called every time the engine starts.
*/
void OnEngineStart() {}
/*!
Is called every time the engine stops.
*/
void OnEngineStop() {}
/*!
Is called every time when the simulation changed gear.
\param[in] newGear new gear level
\param[in] oldGear previous gear level before gear shift
*/
void OnGearChanged(int newGear, int oldGear)
{
}
/*!
Is called every time when the specified vehicle's fluid level changes.
This callback is called on owner only.
\param[in] fluid fluid identifier, \see CarFluid
\param[in] newValue new fluid level
\param[in] oldValue previous fluid level before change
*/
void OnFluidChanged(CarFluid fluid, float newValue, float oldValue) {}
/*!
Is called every sound simulation step.
In this callback, user can modify behaviour of sound controllers.
\param[in] ctrl sound controller identifier, \see CarSoundCtrl
\param[in] oldValue already computed value by the game code
\return new value of the specified sound controller.
*/
float OnSound(CarSoundCtrl ctrl, float oldValue)
{
// just use the computed value by the game code
return oldValue;
}
[Obsolete("no replacement")]
proto native void ForcePosition(vector pos);
[Obsolete("no replacement")]
proto native void ForceDirection(vector dir);
[Obsolete("Use methods directly on Car")]
proto native CarController GetController();
[Obsolete("Use Car.IsTurbo")]
proto native float GetThrustTurbo();
[Obsolete("Use Car.IsGentle")]
proto native float GetThrustGentle();
[Obsolete("Use Car.GetThrottle")]
proto native float GetThrust();
[Obsolete("Use Car.SetThrottle/Car.SetTurbo/Car.SetGentle")]
proto native void SetThrust(float in, float gentle = 0, float turbo = 0);
[Obsolete("no replacement")];
proto native void SetClutchState(bool in);
[Obsolete("Use Car.GetGearCount")]
proto native int GetGearsCount();
};
//! DEPRECATED class left for backwards compatibility, methods are available on car itself now
class CarController
{
private void CarController() {}
private void ~CarController() {}
//! Returns the current steering value in range <-1, 1>.
proto float GetSteering();
/*!
Sets the steering value.
\param in should be in range <-1, 1>
\param analog indicates if the input value was taken from analog controller
*/
proto void SetSteering( float in, bool analog = false );
//! Returns the current thrust turbo modifier value in range <0, 1>.
proto float GetThrustTurbo();
//! Returns the current thrust gentle modifier value in range <0, 1>.
proto float GetThrustGentle();
//! Returns the current thrust value in range <0, 1>.
proto float GetThrust();
/*!
Sets the thrust value.
\param in should be in range <0, 1>
\param gentle should be in range <0, 1>, thrust modifier
\param turbo should be in range <0, 1>, thrust modifier
*/
proto void SetThrust( float in, float gentle = 0, float turbo = 0 );
//! Returns the current brake value in range <0, 1>.
proto float GetBrake();
/*!
Sets the brake value.
\param in should be in range <0, 1>
\param panic should be in range <0, 1>
*/
proto void SetBrake( float in, float panic = 0 );
//! Returns index of the current gear.
proto int GetGear();
proto void ShiftUp();
proto void ShiftTo( CarGear gear );
proto void ShiftDown();
};