Skip to content

Commit

Permalink
Refactor CVehicleSAInterface (#1717)
Browse files Browse the repository at this point in the history
* Refactor CVehicleSAInterface

* Tweak parameter name in CVehicle::SetTrainDirection

* Fix train flags (thanks qaisjp)

* Remove useless comment

* More train flags fixes

Co-authored-by: saml1er <danishroar@gmail.com>
  • Loading branch information
saml1er and codenulls committed Oct 16, 2020
1 parent a708e68 commit e8d8954
Show file tree
Hide file tree
Showing 10 changed files with 296 additions and 240 deletions.
2 changes: 1 addition & 1 deletion Client/game_sa/CAutomobileSA.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ CAutomobileSA::CAutomobileSA(eVehicleTypes dwModelID, unsigned char ucVariation,
*/
// create our mirror classes
for (int i = 0; i < MAX_DOORS; i++)
this->door[i] = new CDoorSA(&((CAutomobileSAInterface*)this->GetInterface())->doors[i]);
this->door[i] = new CDoorSA(&((CAutomobileSAInterface*)this->GetInterface())->m_doors[i]);
/*}
*/
}
Expand Down
229 changes: 125 additions & 104 deletions Client/game_sa/CAutomobileSA.h
Original file line number Diff line number Diff line change
Expand Up @@ -56,117 +56,138 @@
#define MAX_PASSENGER_COUNT 8
#define MAX_DOORS 6 // also in CDamageManager

// this is collision data (confirmed)
class CAutomobileSAUnknownInterface // 40 bytes
enum eCarNodes
{
FLOAT detachablesPosX; // 996
FLOAT detachablesPosY; // 1000
FLOAT detachablesPosZ; // 1004
FLOAT Unknown187; // 1008
FLOAT Unknown188; // 1012
FLOAT Unknown189; // 1016
FLOAT Unknown190; // 1020
FLOAT Unknown191; // 1024
DWORD Unknown192; // 1028
FLOAT Unknown193; // 1032
CAR_NODE_NONE = 0,
CAR_NODE_CHASSIS = 1,
CAR_NODE_WHEEL_RF = 2,
CAR_NODE_WHEEL_RM = 3,
CAR_NODE_WHEEL_RB = 4,
CAR_NODE_WHEEL_LF = 5,
CAR_NODE_WHEEL_LM = 6,
CAR_NODE_WHEEL_LB = 7,
CAR_NODE_DOOR_RF = 8,
CAR_NODE_DOOR_RR = 9,
CAR_NODE_DOOR_LF = 10,
CAR_NODE_DOOR_LR = 11,
CAR_NODE_BUMP_FRONT = 12,
CAR_NODE_BUMP_REAR = 13,
CAR_NODE_WING_RF = 14,
CAR_NODE_WING_LF = 15,
CAR_NODE_BONNET = 16,
CAR_NODE_BOOT = 17,
CAR_NODE_WINDSCREEN = 18,
CAR_NODE_EXHAUST = 19,
CAR_NODE_MISC_A = 20,
CAR_NODE_MISC_B = 21,
CAR_NODE_MISC_C = 22,
CAR_NODE_MISC_D = 23,
CAR_NODE_MISC_E = 24,
CAR_NUM_NODES
};

class CBouncingPanelSAInterface
{
public:
unsigned short m_nFrameId;
unsigned short m_nAxis;
float m_fAngleLimit;
CVector m_vecRotation;
CVector m_vecPos;
};
static_assert(sizeof(CBouncingPanelSAInterface) == 0x20, "Invalid size for CBouncingPanelSAInterface");

class CAutomobileSAInterface : public CVehicleSAInterface
{
public:
CDamageManagerSAInterface damage; // 672 :)
DWORD dwPadding; // assumed?
CDoorSAInterface doors[MAX_DOORS]; // 700 :) // work out where below here its gone wrong
DWORD Unknown184a; // 916
DWORD Frontrightwheelmodel; // 920
DWORD Middlerightdummywheelmodel; // 924
DWORD Backrightwheelmodel; // 928
DWORD Frontleftwheelmodel; // 932
DWORD Middleleftdummywheelmodel; // 936
DWORD Backleftwheelmodel; // 940
DWORD Frontbumpermodel; // 944
DWORD Rearbumpermodel; // 948
DWORD Frontrightwingmodel; // 952
DWORD Unknown185; // 956
DWORD Frontrightdoormodel; // 960
DWORD Rearrightdoormodel; // 964
DWORD Frontleftwingmodel; // 968
DWORD Unknown186; // 972
DWORD Frontleftdoormodel; // 976
DWORD Rearleftdoormodel; // 980
DWORD BonnetModel; // 984
DWORD Bootmodel; // 988
DWORD WindscreenModel; // 992
CAutomobileSAUnknownInterface UnknownData1; // 996
CAutomobileSAUnknownInterface UnknownData2; // 1036
CAutomobileSAUnknownInterface UnknownData3; // 1076
CAutomobileSAUnknownInterface UnknownData4; // 1116
FLOAT WheelPositions[4]; // 1156
FLOAT WheelRelatedUnk[4]; // 1172
FLOAT WheelOnGroundRelated[4]; // 1188
FLOAT Unknown215; // 1204
FLOAT WheelsOnGround[4]; // 1208
FLOAT Unknown216; // 1224
FLOAT Unknown217; // 1228
FLOAT DistanceTraveledByWheel[4]; // 1232
FLOAT Unknown218; // 1248
FLOAT Unknown219; // 1252
FLOAT Unknown220; // 1256
FLOAT Unknown221; // 1260
FLOAT WheelSpeed[4]; // 1264
BYTE Unknown222; // 1280
BYTE TaxiAvaliable; // 1281
BYTE Unknown223; // 1282
BYTE Unknown224; // 1283
WORD Unknown225; // 1284
WORD VoodooSuspension; // 1286
DWORD Unknown; // 1288
FLOAT Unknown226; // 1292
FLOAT WheelOffsetZ[4]; // 1296
FLOAT WheelSuspensionStrength[4]; // 1312
FLOAT Unknown227; // 1328
FLOAT Unknown228; // 1332
FLOAT Unknown229; // 1336
FLOAT Unknown230; // 1340
FLOAT Unknown231; // 1344
FLOAT AutomobileSpeed; // 1348
FLOAT Unknown232; // 1352
FLOAT Unknown233; // 1356
FLOAT Unknown234; // 1360
FLOAT Unknown235; // 1364
FLOAT Unknown236; // 1368
FLOAT Unknown237; // 1372
FLOAT Unknown237a; // 1376
FLOAT UnknownWheelRelated[4]; // 1380
FLOAT Unknown241; // 1396
FLOAT Unknown242; // 1400
FLOAT Unknown243; // 1404
FLOAT Unknown244; // 1408
FLOAT Unknown245; // 1412
FLOAT Unknown246; // 1416
FLOAT Unknown247; // 1420
FLOAT Unknown248; // 1424
FLOAT Unknown249; // 1428
FLOAT Unknown250; // 1432
FLOAT Unknown251; // 1436
FLOAT Unknown252; // 1440
FLOAT Unknown253; // 1444
FLOAT Unknown254; // 1448
FLOAT Unknown255; // 1452
FLOAT WeaponHorizontalRotation; // 1456
FLOAT WeaponVerticalRotation; // 1460
FLOAT Unknown255a; // 1464
FLOAT Unknown255b; // 1468
FLOAT Unknown256; // 1472
BYTE Unknown256a; // 1476
BYTE Unknown257; // 1477
BYTE Unknown258; // 1478
BYTE DriveWheelsOnGroundLastFrame;
; // 1479
FLOAT GasPedalAudioRevs; // 1480
DWORD m_aWheelState[4]; // 1484
CDamageManagerSAInterface m_damageManager;
CDoorSAInterface m_doors[6];
RwFrame* m_aCarNodes[CAR_NUM_NODES];
CBouncingPanelSAInterface m_panels[3];
CDoorSAInterface m_swingingChassis;
CColPointSAInterface m_wheelColPoint[MAX_WHEELS];
float m_wheelsDistancesToGround1[4];
float m_wheelsDistancesToGround2[4];
float m_wheelCollisionState[4];
float field_800;
float field_804;
float field_80C;
int m_wheelSkidmarkType[4];
bool m_wheelSkidmarkBloodState[4];
bool m_wheelSkidmarkSomeBool[4];
float m_wheelRotation[4];
float m_wheelPosition[4];
float m_wheelSpeed[4];
int field_858[4];
char taxiAvaliable;
char field_869;
short field_86A;
unsigned short m_wMiscComponentAngle;
unsigned short m_wVoodooSuspension;
int m_dwBusDoorTimerEnd;
int m_dwBusDoorTimerStart;
float field_878;
float wheelOffsetZ[4];
int field_88C[3];
float m_fFrontHeightAboveRoad;
float m_fRearHeightAboveRoad;
float m_fCarTraction;
float m_fNitroValue;
int field_8A4;
int m_fRotationBalance; // used in CHeli::TestSniperCollision
float m_fMoveDirection;
int field_8B4[6];
int field_8C8[6];
float m_fBurningTime;
CEntitySAInterface* m_pWheelCollisionEntity[4];
CVector m_vWheelCollisionPos[4];
char field_924;
char field_925;
char field_926;
char field_927;
char field_928;
char field_929;
char field_92A;
char field_92B;
char field_92C;
char field_92D;
char field_92E;
char field_92F;
char field_930;
char field_931;
char field_932;
char field_933;
char field_934;
char field_935;
char field_936;
char field_937;
char field_938;
char field_939;
char field_93A;
char field_93B;
char field_93C;
char field_93D;
char field_93E;
char field_93F;
int field_940;
int field_944;
float m_fDoomVerticalRotation;
float m_fDoomHorizontalRotation;
float m_fForcedOrientation;
float m_fUpDownLightAngle[2];
unsigned char m_nNumContactWheels;
unsigned char m_nWheelsOnGround;
char field_962;
char field_963;
float field_964;
int field_968[4];
void* pNitroParticle[2];
char field_980;
char field_981;
short field_982;
float field_984;
};
// static_assert(sizeof(CAutomobileSAInterface) == 0x988, "Invalid size for CAutomobileSAInterface");
static_assert(sizeof(CAutomobileSAInterface) == 0x988, "Invalid size for CAutomobileSAInterface");

class CAutomobileSA : public virtual CAutomobile, public virtual CVehicleSA
{
Expand Down
1 change: 1 addition & 0 deletions Client/game_sa/CDamageManagerSA.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ class CDamageManagerSAInterface // 28 bytes due to the way its packed
DWORD Lights; // 2 bits per light
DWORD Panels; // 4 bits per panel
};
static_assert(sizeof(CDamageManagerSAInterface) == 0x18, "Invalid size for CDamageManagerSAInterface");

class CDamageManagerSA : public CDamageManager
{
Expand Down
1 change: 1 addition & 0 deletions Client/game_sa/CDoorSA.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ class CDoorSAInterface
FLOAT m_fPrevAngle;
FLOAT m_fAngVel;
};
static_assert(sizeof(CDoorSAInterface) == 0x18, "Invalid size for CDoorSAInterface");

/**
* \todo Why are some of these Get and some Ret, is there a difference?
Expand Down
11 changes: 11 additions & 0 deletions Client/game_sa/CTrainSA.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
/*****************************************************************************
*
* PROJECT: Multi Theft Auto
* LICENSE: See LICENSE in the top level directory
* FILE: game_sa/CTrainSA.cpp
*
* Multi Theft Auto is available from http://www.multitheftauto.com/
*
*****************************************************************************/

#include "StdInc.h"
101 changes: 101 additions & 0 deletions Client/game_sa/CTrainSA.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
/*****************************************************************************
*
* PROJECT: Multi Theft Auto
* LICENSE: See LICENSE in the top level directory
* FILE: game_sa/CTrainSA.h
*
* Multi Theft Auto is available from http://www.multitheftauto.com/
*
*****************************************************************************/

#pragma once
#include "CVehicleSA.h"
#include "CDoorSA.h"

enum eTrainNodes
{
TRAIN_NODE_NONE = 0,
TRAIN_NODE_DOOR_LF = 1,
TRAIN_NODE_DOOR_RF = 2,
TRAIN_NODE_WHEEL_RF1 = 3,
TRAIN_NODE_WHEEL_RF2 = 4,
TRAIN_NODE_WHEEL_RF3 = 5,
TRAIN_NODE_WHEEL_RB1 = 6,
TRAIN_NODE_WHEEL_RB2 = 7,
TRAIN_NODE_WHEEL_RB3 = 8,
TRAIN_NODE_WHEEL_LF1 = 9,
TRAIN_NODE_WHEEL_LF2 = 10,
TRAIN_NODE_WHEEL_LF3 = 11,
TRAIN_NODE_WHEEL_LB1 = 12,
TRAIN_NODE_WHEEL_LB2 = 13,
TRAIN_NODE_WHEEL_LB3 = 14,
TRAIN_NODE_BOGIE_FRONT = 15,
TRAIN_NODE_BOGIE_REAR = 16,
TRAIN_NUM_NODES
};

enum class eTrainPassengersGenerationState : unsigned char
{
QUERY_NUM_PASSENGERS_TO_LEAVE = 0,
TELL_PASSENGERS_TO_LEAVE = 1,
QUERY_NUM_PASSENGERS_TO_ENTER = 2,
TELL_PASSENGERS_TO_ENTER = 3,
GENERATION_FINISHED = 4
};

class CTrainSAInterface : public CVehicleSAInterface
{
public:
short m_ucTrackNodeID;

private:
char _pad1[2];

public:
float m_fTrainSpeed; // 1.0 - train derails
float m_fTrainRailDistance; // Distance along rail starting from first rail node (determines train position when on rails)
float m_fDistanceToNextCarriage;
float m_fTrainGas; // gas pedal pressed: 255.0, moving forward: 0.0, moving back: -255.0
float m_fTrainBrake; // 255.0 - braking
union
{
struct
{
unsigned short b01 : 1; // initialised with 1
unsigned short bStoppedAtStation : 1; // Only the first created train on the chain gets this set to true, others get it set to false.
unsigned short bPassengersCanEnterAndLeave : 1;
unsigned short bIsTheChainEngine : 1; // front carriage
unsigned short bIsLastCarriage : 1;
unsigned short bMissionTrain : 1;
unsigned short bClockwiseDirection : 1;
unsigned short bStopsAtStations : 1;

unsigned short bIsDerailed : 1;
unsigned short bForceSlowDown : 1;
unsigned short bIsStreakModel : 1;
} trainFlags;
};

private:
char _pad5BA[2];

public:
int m_uiLastTimeUpdated;
unsigned char m_ucRailTrackID;

private:
char _pad5C1[3];

public:
int m_nTimeWhenCreated;
short field_5C8; // initialized with 0, not referenced
eTrainPassengersGenerationState m_nPassengersGenerationState;
unsigned char m_nNumPassengersToLeave : 4; // 0 to 4
unsigned char m_nNumPassengersToEnter : 4; // 0 to 4
CPedSAInterface* m_pTemporaryPassenger; // we tell peds to enter train and then delete them
CTrainSAInterface* m_prevCarriage;
CTrainSAInterface* m_nextCarriage;
CDoorSAInterface m_aDoors[6];
RwFrame* m_aTrainNodes[TRAIN_NUM_NODES];
};
static_assert(sizeof(CTrainSAInterface) == 0x6AC, "Invalid size for CTrainSAInterface");
Loading

0 comments on commit e8d8954

Please sign in to comment.