script 600-699

This commit is contained in:
Nikolay Korolev 2019-10-27 12:51:09 +03:00
parent dcd2a94367
commit 5e77e9d0ea
7 changed files with 383 additions and 7 deletions

View File

@ -78,6 +78,15 @@ WRAPPER void CGarages::PlayerArrestedOrDied() { EAXJMP(0x427F60); }
WRAPPER int16 CGarages::AddOne(float, float, float, float, float, float, uint8, uint32) { EAXJMP(0x421FA0); }
WRAPPER void CGarages::SetTargetCarForMissonGarage(int16, CVehicle*) { EAXJMP(0x426BD0); }
WRAPPER bool CGarages::HasCarBeenDroppedOffYet(int16) { EAXJMP(0x426C20); }
WRAPPER void CGarages::DeActivateGarage(int16) { EAXJMP(0x426C40); }
WRAPPER void CGarages::ActivateGarage(int16) { EAXJMP(0x426C60); }
int32 CGarages::QueryCarsCollected(int16 garage)
{
return 0;
}
WRAPPER bool CGarages::HasThisCarBeenCollected(int16 garage, uint8 id) { EAXJMP(0x426D50); }
#if 0
WRAPPER void CGarages::PrintMessages(void) { EAXJMP(0x426310); }

View File

@ -35,4 +35,8 @@ public:
static int16 AddOne(float, float, float, float, float, float, uint8, uint32);
static void SetTargetCarForMissonGarage(int16, CVehicle*);
static bool HasCarBeenDroppedOffYet(int16);
static void ActivateGarage(int16);
static void DeActivateGarage(int16);
static int32 QueryCarsCollected(int16);
static bool HasThisCarBeenCollected(int16, uint8);
};

View File

@ -28,6 +28,7 @@
#include "Messages.h"
#include "ModelIndices.h"
#include "Pad.h"
#include "ParticleObject.h"
#include "PedRoutes.h"
#include "Phones.h"
#include "Pickups.h"
@ -5141,6 +5142,364 @@ int8 CRunningScript::ProcessCommandsFrom500To599(int32 command)
}
#endif
#if 0
WRAPPER int8 CRunningScript::ProcessCommandsFrom600To699(int32 command) { EAXJMP(0x444B20); }
#else
int8 CRunningScript::ProcessCommandsFrom600To699(int32 command)
{
switch (command){
/* Collective commands are not implemented until LCS.
case COMMAND_SET_COLL_OBJ_WAIT_ON_FOOT:
case COMMAND_SET_COLL_OBJ_FLEE_ON_FOOT_TILL_SAFE:
case COMMAND_SET_COLL_OBJ_GUARD_SPOT:
case COMMAND_SET_COLL_OBJ_GUARD_AREA:
case COMMAND_SET_COLL_OBJ_WAIT_IN_CAR:
case COMMAND_SET_COLL_OBJ_KILL_CHAR_ON_FOOT:
case COMMAND_SET_COLL_OBJ_KILL_PLAYER_ON_FOOT:
case COMMAND_SET_COLL_OBJ_KILL_CHAR_ANY_MEANS:
case COMMAND_SET_COLL_OBJ_KILL_PLAYER_ANY_MEANS:
case COMMAND_SET_COLL_OBJ_FLEE_CHAR_ON_FOOT_TILL_SAFE:
case COMMAND_SET_COLL_OBJ_FLEE_PLAYER_ON_FOOT_TILL_SAFE:
case COMMAND_SET_COLL_OBJ_FLEE_CHAR_ON_FOOT_ALWAYS:
case COMMAND_SET_COLL_OBJ_FLEE_PLAYER_ON_FOOT_ALWAYS:
case COMMAND_SET_COLL_OBJ_GOTO_CHAR_ON_FOOT:
case COMMAND_SET_COLL_OBJ_GOTO_PLAYER_ON_FOOT:
case COMMAND_SET_COLL_OBJ_LEAVE_CAR:
case COMMAND_SET_COLL_OBJ_ENTER_CAR_AS_PASSENGER:
case COMMAND_SET_COLL_OBJ_ENTER_CAR_AS_DRIVER:
case COMMAND_SET_COLL_OBJ_FOLLOW_CAR_IN_CAR:
case COMMAND_SET_COLL_OBJ_FIRE_AT_OBJECT_FROM_VEHICLE:
case COMMAND_SET_COLL_OBJ_DESTROY_OBJECT:
case COMMAND_SET_COLL_OBJ_DESTROY_CAR:
case COMMAND_SET_COLL_OBJ_GOTO_AREA_ON_FOOT:
case COMMAND_SET_COLL_OBJ_GOTO_AREA_IN_CAR:
case COMMAND_SET_COLL_OBJ_FOLLOW_CAR_ON_FOOT_WITH_OFFSET:
case COMMAND_SET_COLL_OBJ_GUARD_ATTACK:
case COMMAND_SET_COLL_OBJ_FOLLOW_ROUTE:
case COMMAND_SET_COLL_OBJ_GOTO_COORD_ON_FOOT:
case COMMAND_SET_COLL_OBJ_GOTO_COORD_IN_CAR:
case COMMAND_SET_COLL_OBJ_RUN_TO_AREA:
case COMMAND_SET_COLL_OBJ_RUN_TO_COORD:
case COMMAND_ADD_PEDS_IN_AREA_TO_COLL:
case COMMAND_ADD_PEDS_IN_VEHICLE_TO_COLL:
case COMMAND_CLEAR_COLL:
case COMMAND_IS_COLL_IN_CARS:
case COMMAND_LOCATE_COLL_ANY_MEANS_2D:
case COMMAND_LOCATE_COLL_ON_FOOT_2D:
case COMMAND_LOCATE_COLL_IN_CAR_2D:
case COMMAND_LOCATE_STOPPED_COLL_ANY_MEANS_2D:
case COMMAND_LOCATE_STOPPED_COLL_ON_FOOT_2D:
case COMMAND_LOCATE_STOPPED_COLL_IN_CAR_2D:
case COMMAND_LOCATE_COLL_ANY_MEANS_CHAR_2D:
case COMMAND_LOCATE_COLL_ON_FOOT_CHAR_2D:
case COMMAND_LOCATE_COLL_IN_CAR_CHAR_2D:
case COMMAND_LOCATE_COLL_ANY_MEANS_CAR_2D:
case COMMAND_LOCATE_COLL_ON_FOOT_CAR_2D:
case COMMAND_LOCATE_COLL_IN_CAR_CAR_2D:
case COMMAND_LOCATE_COLL_ANY_MEANS_PLAYER_2D:
case COMMAND_LOCATE_COLL_ON_FOOT_PLAYER_2D:
case COMMAND_LOCATE_COLL_IN_CAR_PLAYER_2D:
case COMMAND_IS_COLL_IN_AREA_2D:
case COMMAND_IS_COLL_IN_AREA_ON_FOOT_2D:
case COMMAND_IS_COLL_IN_AREA_IN_CAR_2D:
case COMMAND_IS_COLL_STOPPED_IN_AREA_2D:
case COMMAND_IS_COLL_STOPPED_IN_AREA_ON_FOOT_2D:
case COMMAND_IS_COLL_STOPPED_IN_AREA_IN_CAR_2D:
case COMMAND_GET_NUMBER_OF_PEDS_IN_COLL:
*/
case COMMAND_SET_CHAR_HEED_THREATS:
{
CollectParameters(&m_nIp, 2);
CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]);
assert(pPed);
pPed->bRespondsToThreats = (ScriptParams[1] != 0);
return 0;
}
case COMMAND_SET_PLAYER_HEED_THREATS:
{
CollectParameters(&m_nIp, 2);
CPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed;
assert(pPed);
pPed->bRespondsToThreats = (ScriptParams[1] != 0);
return 0;
}
case COMMAND_GET_CONTROLLER_MODE:
ScriptParams[0] = 0;
StoreParameters(&m_nIp, 1);
return 0;
case COMMAND_SET_CAN_RESPRAY_CAR:
{
CollectParameters(&m_nIp, 2);
CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]);
assert(pVehicle);
assert(pVehicle->m_vehType == VEHICLE_TYPE_CAR);
((CAutomobile*)pVehicle)->bFixedColour = (ScriptParams[1] == 0);
return 0;
}
case COMMAND_IS_TAXI:
{
CollectParameters(&m_nIp, 1);
CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]);
assert(pVehicle);
int mi = pVehicle->GetModelIndex();
UpdateCompareFlag(mi == MI_TAXI || mi == MI_CABBIE || mi == MI_BORGNINE);
return 0;
}
case COMMAND_UNLOAD_SPECIAL_CHARACTER:
CollectParameters(&m_nIp, 1);
CStreaming::SetMissionDoesntRequireSpecialChar(ScriptParams[0] - 1);
return 0;
case COMMAND_RESET_NUM_OF_MODELS_KILLED_BY_PLAYER:
CDarkel::ResetModelsKilledByPlayer();
return 0;
case COMMAND_GET_NUM_OF_MODELS_KILLED_BY_PLAYER:
CollectParameters(&m_nIp, 1);
ScriptParams[0] = CDarkel::QueryModelsKilledByPlayer(ScriptParams[0]);
StoreParameters(&m_nIp, 1);
return 0;
case COMMAND_ACTIVATE_GARAGE:
CollectParameters(&m_nIp, 1);
CGarages::ActivateGarage(ScriptParams[0]);
return 0;
case COMMAND_SWITCH_TAXI_TIMER:
{
CollectParameters(&m_nIp, 1);
if (ScriptParams[0] != 0){
CWorld::Players[CWorld::PlayerInFocus].m_nSwitchTaxiTime = CTimer::GetTimeInMilliseconds();
CWorld::Players[CWorld::PlayerInFocus].m_bSwitchTaxi = true;
}else{
CWorld::Players[CWorld::PlayerInFocus].m_bSwitchTaxi = false;
}
return 0;
}
case COMMAND_CREATE_OBJECT_NO_OFFSET:
{
CollectParameters(&m_nIp, 4);
int mi = ScriptParams[0] >= 0 ? ScriptParams[0] : CTheScripts::UsedObjectArray[-ScriptParams[0]].index;
CObject* pObj = new CObject(mi, 0);
pObj->ObjectCreatedBy = MISSION_OBJECT;
CVector pos = *(CVector*)&ScriptParams[1];
if (pos.z <= -100.0f)
pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y);
pObj->GetPosition() = pos;
pObj->SetOrientation(0.0f, 0.0f, 0.0f);
pObj->GetMatrix().UpdateRW();
pObj->UpdateRwFrame();
CTheScripts::ClearSpaceForMissionEntity(pos, pObj);
CWorld::Add(pObj);
ScriptParams[0] = CPools::GetObjectPool()->GetIndex(pObj);
StoreParameters(&m_nIp, 1);
if (m_bIsMissionScript)
CTheScripts::MissionCleanup.AddEntityToList(ScriptParams[0], CLEANUP_OBJECT);
return 0;
}
case COMMAND_IS_BOAT:
{
CollectParameters(&m_nIp, 1);
CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]);
assert(pVehicle);
UpdateCompareFlag(pVehicle->m_vehType == VEHICLE_TYPE_BOAT);
return 0;
}
case COMMAND_SET_CHAR_OBJ_GOTO_AREA_ANY_MEANS:
{
CollectParameters(&m_nIp, 5);
CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]);
assert(pPed);
float infX = *(float*)&ScriptParams[1];
float infY = *(float*)&ScriptParams[2];
float supX = *(float*)&ScriptParams[3];
float supY = *(float*)&ScriptParams[4];
if (infX > supX) {
infX = *(float*)&ScriptParams[3];
supX = *(float*)&ScriptParams[1];
}
if (infY > supY) {
infY = *(float*)&ScriptParams[4];
supY = *(float*)&ScriptParams[2];
}
CVector pos;
pos.x = (infX + supX) / 2;
pos.y = (infY + supY) / 2;
pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y);
float radius = max(pos.x - infX, pos.y - infY);
pPed->bScriptObjectiveCompleted = false;
pPed->SetObjective(OBJECTIVE_GOTO_AREA_ANY_MEANS, pos, radius);
return 0;
}
//case COMMAND_SET_COLL_OBJ_GOTO_AREA_ANY_MEANS:
case COMMAND_IS_PLAYER_STOPPED:
{
CollectParameters(&m_nIp, 1);
CPlayerInfo* pPlayer = &CWorld::Players[ScriptParams[0]];
UpdateCompareFlag(CTheScripts::IsPlayerStopped(pPlayer));
return 0;
}
case COMMAND_IS_CHAR_STOPPED:
{
CollectParameters(&m_nIp, 1);
CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]);
UpdateCompareFlag(CTheScripts::IsPedStopped(pPed));
return 0;
}
case COMMAND_MESSAGE_WAIT:
CollectParameters(&m_nIp, 2);
m_nWakeTime = CTimer::GetTimeInMilliseconds() + ScriptParams[0];
if (ScriptParams[1] != 0)
m_bSkipWakeTime = true;
return 1;
case COMMAND_ADD_PARTICLE_EFFECT:
{
CollectParameters(&m_nIp, 5);
CVector pos = *(CVector*)&ScriptParams[0];
if (pos.z <= 100.0f)
pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y);
CParticleObject::AddObject(ScriptParams[0], pos, ScriptParams[4] != 0);
return 0;
}
case COMMAND_SWITCH_WIDESCREEN:
CollectParameters(&m_nIp, 1);
if (ScriptParams[0] != 0)
TheCamera.SetWideScreenOn();
else
TheCamera.SetWideScreenOff();
return 0;
case COMMAND_ADD_SPRITE_BLIP_FOR_CAR:
{
CollectParameters(&m_nIp, 2);
CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]);
assert(pVehicle);
CRadar::GetActualBlipArrayIndex(CollectNextParameterWithoutIncreasingPC(m_nIp));
int id = CRadar::SetEntityBlip(BLIP_CAR, ScriptParams[0], 0, BLIP_DISPLAY_BOTH);
CRadar::SetBlipSprite(id, ScriptParams[1]);
ScriptParams[0] = id;
StoreParameters(&m_nIp, 1);
return 0;
}
case COMMAND_ADD_SPRITE_BLIP_FOR_CHAR:
{
CollectParameters(&m_nIp, 2);
CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]);
assert(pPed);
CRadar::GetActualBlipArrayIndex(CollectNextParameterWithoutIncreasingPC(m_nIp));
int id = CRadar::SetEntityBlip(BLIP_CHAR, ScriptParams[0], 1, BLIP_DISPLAY_BOTH);
CRadar::SetBlipSprite(id, ScriptParams[1]);
ScriptParams[0] = id;
StoreParameters(&m_nIp, 1);
return 0;
}
case COMMAND_ADD_SPRITE_BLIP_FOR_OBJECT:
{
CollectParameters(&m_nIp, 2);
CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]);
assert(pObject);
CRadar::GetActualBlipArrayIndex(CollectNextParameterWithoutIncreasingPC(m_nIp));
int id = CRadar::SetEntityBlip(BLIP_OBJECT, ScriptParams[0], 6, BLIP_DISPLAY_BOTH);
CRadar::SetBlipSprite(id, ScriptParams[1]);
ScriptParams[0] = id;
StoreParameters(&m_nIp, 1);
return 0;
}
case COMMAND_ADD_SPRITE_BLIP_FOR_CONTACT_POINT:
{
CollectParameters(&m_nIp, 4);
CVector pos = *(CVector*)&ScriptParams[0];
if (pos.z <= -100.0f)
pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y);
CRadar::GetActualBlipArrayIndex(CollectNextParameterWithoutIncreasingPC(m_nIp));
int id = CRadar::SetCoordBlip(BLIP_CONTACT_POINT, pos, 2, BLIP_DISPLAY_BOTH);
CRadar::SetBlipSprite(id, ScriptParams[3]);
ScriptParams[0] = id;
StoreParameters(&m_nIp, 1);
return 0;
}
case COMMAND_ADD_SPRITE_BLIP_FOR_COORD:
{
CollectParameters(&m_nIp, 4);
CVector pos = *(CVector*)&ScriptParams[0];
if (pos.z <= -100.0f)
pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y);
CRadar::GetActualBlipArrayIndex(CollectNextParameterWithoutIncreasingPC(m_nIp));
int id = CRadar::SetCoordBlip(BLIP_COORD, pos, 5, BLIP_DISPLAY_BOTH);
CRadar::SetBlipSprite(id, ScriptParams[3]);
ScriptParams[0] = id;
StoreParameters(&m_nIp, 1);
return 0;
}
case COMMAND_SET_CHAR_ONLY_DAMAGED_BY_PLAYER:
{
CollectParameters(&m_nIp, 2);
CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]);
assert(pPed);
pPed->bOnlyDamagedByPlayer = (ScriptParams[1] != 0);
return 0;
}
case COMMAND_SET_CAR_ONLY_DAMAGED_BY_PLAYER:
{
CollectParameters(&m_nIp, 2);
CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]);
assert(pVehicle);
pVehicle->bOnlyDamagedByPlayer = (ScriptParams[1] != 0);
return 0;
}
case COMMAND_SET_CHAR_PROOFS:
{
CollectParameters(&m_nIp, 6);
CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]);
assert(pPed);
pPed->bBulletProof = (ScriptParams[1] != 0);
pPed->bFireProof = (ScriptParams[2] != 0);
pPed->bExplosionProof = (ScriptParams[3] != 0);
pPed->bCollisionProof = (ScriptParams[4] != 0);
pPed->bMeleeProof = (ScriptParams[5] != 0);
return 0;
}
case COMMAND_SET_CAR_PROOFS:
{
CollectParameters(&m_nIp, 6);
CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]);
assert(pVehicle);
pVehicle->bBulletProof = (ScriptParams[1] != 0);
pVehicle->bFireProof = (ScriptParams[2] != 0);
pVehicle->bExplosionProof = (ScriptParams[3] != 0);
pVehicle->bCollisionProof = (ScriptParams[4] != 0);
pVehicle->bMeleeProof = (ScriptParams[5] != 0);
return 0;
}
case COMMAND_IS_PLAYER_IN_ANGLED_AREA_2D:
case COMMAND_IS_PLAYER_IN_ANGLED_AREA_ON_FOOT_2D:
case COMMAND_IS_PLAYER_IN_ANGLED_AREA_IN_CAR_2D:
case COMMAND_IS_PLAYER_STOPPED_IN_ANGLED_AREA_2D:
case COMMAND_IS_PLAYER_STOPPED_IN_ANGLED_AREA_ON_FOOT_2D:
case COMMAND_IS_PLAYER_STOPPED_IN_ANGLED_AREA_IN_CAR_2D:
case COMMAND_IS_PLAYER_IN_ANGLED_AREA_3D:
case COMMAND_IS_PLAYER_IN_ANGLED_AREA_ON_FOOT_3D:
case COMMAND_IS_PLAYER_IN_ANGLED_AREA_IN_CAR_3D:
case COMMAND_IS_PLAYER_STOPPED_IN_ANGLED_AREA_3D:
case COMMAND_IS_PLAYER_STOPPED_IN_ANGLED_AREA_ON_FOOT_3D:
case COMMAND_IS_PLAYER_STOPPED_IN_ANGLED_AREA_IN_CAR_3D:
PlayerInAngledAreaCheckCommand(command, &m_nIp);
return 0;
case COMMAND_DEACTIVATE_GARAGE:
CollectParameters(&m_nIp, 1);
CGarages::DeActivateGarage(ScriptParams[0]);
return 0;
case COMMAND_GET_NUMBER_OF_CARS_COLLECTED_BY_GARAGE:
CollectParameters(&m_nIp, 1);
ScriptParams[0] = CGarages::QueryCarsCollected(ScriptParams[0]);
StoreParameters(&m_nIp, 1);
return 0;
case COMMAND_HAS_CAR_BEEN_TAKEN_TO_GARAGE:
CollectParameters(&m_nIp, 2);
UpdateCompareFlag(CGarages::HasThisCarBeenCollected(ScriptParams[0], ScriptParams[1] - 1));
return 0;
default:
assert(0);
}
return -1;
}
#endif
int16 CRunningScript::GetPadState(uint16 pad, uint16 button)
{
CPad* pPad = CPad::GetPad(pad);
@ -5175,7 +5534,6 @@ bool CTheScripts::IsVehicleStopped(CVehicle* pVehicle)
return 0.01f * CTimer::GetTimeStep() >= pVehicle->m_fDistanceTravelled;
}
WRAPPER int8 CRunningScript::ProcessCommandsFrom600To699(int32 command) { EAXJMP(0x444B20); }
WRAPPER int8 CRunningScript::ProcessCommandsFrom700To799(int32 command) { EAXJMP(0x4458A0); }
WRAPPER int8 CRunningScript::ProcessCommandsFrom800To899(int32 command) { EAXJMP(0x448240); }
WRAPPER int8 CRunningScript::ProcessCommandsFrom900To999(int32 command) { EAXJMP(0x44CB80); }
@ -5209,6 +5567,8 @@ WRAPPER void CTheScripts::CleanUpThisObject(CObject*) { EAXJMP(0x454910); }
WRAPPER void CTheScripts::ReadObjectNamesFromScript() { EAXJMP(0x454960); }
WRAPPER void CTheScripts::UpdateObjectIndices() { EAXJMP(0x454AD0); }
WRAPPER void CTheScripts::ReadMultiScriptFileOffsetsFromScript() { EAXJMP(0x454BC0); }
WRAPPER bool CTheScripts::IsPedStopped(CPed*) { EAXJMP(0x454670); }
WRAPPER bool CTheScripts::IsPlayerStopped(CPlayerInfo*) { EAXJMP(0x4546C0); }
STARTPATCHES
InjectHook(0x437AE0, &CMissionCleanup::Init, PATCH_JUMP);

View File

@ -8,6 +8,7 @@ class CBuilding;
class CVehicle;
class CPed;
class CObject;
class CPlayerInfo;
struct CScriptRectangle
{
@ -339,6 +340,9 @@ public:
static void Process();
static CRunningScript* StartTestScript();
static bool IsPlayerOnAMission();
static bool IsPedStopped(CPed*);
static bool IsPlayerStopped(CPlayerInfo*);
static bool IsVehicleStopped(CVehicle*);
static void ReadObjectNamesFromScript();
static void UpdateObjectIndices();
@ -348,7 +352,6 @@ public:
static void HighlightImportantArea(uint32, float, float, float, float, float);
static void DrawDebugSquare(float, float, float, float);
static void DrawDebugCube(float, float, float, float, float, float);
static bool IsVehicleStopped(CVehicle*);
static int32 Read4BytesFromScript(uint32* pIp){
int32 retval = 0;

View File

@ -162,6 +162,6 @@ enum Config {
// Peds
#define ANIMATE_PED_COL_MODEL
#define VC_PED_PORTS
//#define VC_PED_PORTS
#define NEW_WALK_AROUND_ALGORITHM
#define CANCELLABLE_CAR_ENTER

View File

@ -61,8 +61,8 @@ CAutomobile::CAutomobile(int32 id, uint8 CreatedBy)
m_fFireBlowUpTimer = 0.0f;
field_4E0 = 0;
bTaxiLight = m_sAllTaxiLights;
m_auto_flagA20 = false;
m_auto_flagA40 = false;
bFixedColour = false;
bBigWheels = false;
bWaterTight = false;
SetModelIndex(id);

View File

@ -87,8 +87,8 @@ public:
uint8 m_bombType : 3;
uint8 bTaxiLight : 1;
uint8 bHadDriver : 1; // for bombs
uint8 m_auto_flagA20 : 1;
uint8 m_auto_flagA40 : 1;
uint8 bFixedColour : 1;
uint8 bBigWheels : 1;
uint8 bWaterTight : 1; // no damage for non-player peds
uint8 bNotDamagedUpsideDown : 1;
uint8 bMoreResistantToDamage : 1;