mirror of
https://github.com/GTAmodding/re3.git
synced 2021-02-19 17:49:54 +01:00
Merge branch 'master' of git://github.com/GTAmodding/re3 into erorcun
Conflicts: src/entities/Ped.h src/entities/Vehicle.h
This commit is contained in:
commit
769c2812ff
@ -1,21 +1,243 @@
|
|||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include "patcher.h"
|
#include "patcher.h"
|
||||||
|
#include "General.h"
|
||||||
#include "DamageManager.h"
|
#include "DamageManager.h"
|
||||||
|
|
||||||
#if 0
|
|
||||||
WRAPPER void CDamageManager::SetDoorStatus(int door, unsigned int status) { EAXJMP(0x545920); }
|
|
||||||
#else
|
|
||||||
void CDamageManager::SetDoorStatus(int door, unsigned int status)
|
|
||||||
{
|
|
||||||
m_bDoorStatus[door] = status;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if 0
|
float G_aComponentDamage[] = { 2.5f, 1.25f, 3.2f, 1.4f, 2.5f, 2.8f, 0.5f };
|
||||||
WRAPPER unsigned int CDamageManager::GetDoorStatus(int door) { EAXJMP(0x545930); }
|
|
||||||
#else
|
void
|
||||||
unsigned int CDamageManager::GetDoorStatus(int door)
|
CDamageManager::ResetDamageStatus(void)
|
||||||
{
|
{
|
||||||
return m_bDoorStatus[door];
|
memset(this, 0, sizeof(*this));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CDamageManager::FuckCarCompletely(void)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
m_wheelStatus[0] = 2;
|
||||||
|
// wheels 1-3 not reset?
|
||||||
|
|
||||||
|
m_doorStatus[0] = 3;
|
||||||
|
m_doorStatus[1] = 3;
|
||||||
|
m_doorStatus[2] = 3;
|
||||||
|
m_doorStatus[3] = 3;
|
||||||
|
m_doorStatus[4] = 3;
|
||||||
|
m_doorStatus[5] = 3;
|
||||||
|
|
||||||
|
for(i = 0; i < 3; i++){
|
||||||
|
#ifdef FIX_BUGS
|
||||||
|
ProgressPanelDamage(VEHBUMPER_FRONT);
|
||||||
|
ProgressPanelDamage(VEHBUMPER_REAR);
|
||||||
|
#else
|
||||||
|
// this can't be right
|
||||||
|
ProgressPanelDamage(COMPONENT_BUMPER_FRONT);
|
||||||
|
ProgressPanelDamage(COMPONENT_BUMPER_REAR);
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
|
// Why set to no damage?
|
||||||
|
m_lightStatus = 0;
|
||||||
|
m_panelStatus = 0;
|
||||||
|
SetEngineStatus(250);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
CDamageManager::ApplyDamage(tComponent component, float damage, float unused)
|
||||||
|
{
|
||||||
|
tComponentGroup group;
|
||||||
|
uint8 subComp;
|
||||||
|
|
||||||
|
GetComponentGroup(component, &group, &subComp);
|
||||||
|
damage *= G_aComponentDamage[group];
|
||||||
|
if(damage > 150.0f){
|
||||||
|
switch(group){
|
||||||
|
case COMPGROUP_WHEEL:
|
||||||
|
ProgressWheelDamage(subComp);
|
||||||
|
break;
|
||||||
|
case COMPGROUP_DOOR:
|
||||||
|
case COMPGROUP_BOOT:
|
||||||
|
ProgressDoorDamage(subComp);
|
||||||
|
break;
|
||||||
|
case COMPGROUP_BONNET:
|
||||||
|
if(damage > 220.0f)
|
||||||
|
ProgressEngineDamage();
|
||||||
|
ProgressDoorDamage(subComp);
|
||||||
|
break;
|
||||||
|
case COMPGROUP_PANEL:
|
||||||
|
// so windscreen is a light?
|
||||||
|
SetLightStatus((eLights)subComp, 1);
|
||||||
|
// fall through
|
||||||
|
case COMPGROUP_BUMPER:
|
||||||
|
if(damage > 220.0f &&
|
||||||
|
(component == COMPONENT_PANEL_FRONT_LEFT ||
|
||||||
|
component == COMPONENT_PANEL_FRONT_RIGHT ||
|
||||||
|
component == COMPONENT_PANEL_WINDSCREEN))
|
||||||
|
ProgressEngineDamage();
|
||||||
|
ProgressPanelDamage(subComp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
CDamageManager::GetComponentGroup(tComponent component, tComponentGroup *componentGroup, uint8 *subComp)
|
||||||
|
{
|
||||||
|
*subComp = -2; // ??
|
||||||
|
|
||||||
|
// This is done very strangely in the game, maybe an optimized switch?
|
||||||
|
if(component >= COMPONENT_PANEL_FRONT_LEFT){
|
||||||
|
if(component >= COMPONENT_BUMPER_FRONT)
|
||||||
|
*componentGroup = COMPGROUP_BUMPER;
|
||||||
|
else
|
||||||
|
*componentGroup = COMPGROUP_PANEL;
|
||||||
|
*subComp = component - COMPONENT_PANEL_FRONT_LEFT;
|
||||||
|
return true;
|
||||||
|
}else if(component >= COMPONENT_DOOR_BONNET){
|
||||||
|
if(component == COMPONENT_DOOR_BONNET)
|
||||||
|
*componentGroup = COMPGROUP_BONNET;
|
||||||
|
else if(component == COMPONENT_DOOR_BOOT)
|
||||||
|
*componentGroup = COMPGROUP_BOOT;
|
||||||
|
else
|
||||||
|
*componentGroup = COMPGROUP_DOOR;
|
||||||
|
*subComp = component - COMPONENT_DOOR_BONNET;
|
||||||
|
return true;
|
||||||
|
}else if(component >= COMPONENT_WHEEL_FRONT_LEFT){
|
||||||
|
*componentGroup = COMPGROUP_WHEEL;
|
||||||
|
*subComp = component - COMPONENT_WHEEL_FRONT_LEFT;
|
||||||
|
return true;
|
||||||
|
}else if(component >= COMPONENT_DEFAULT){
|
||||||
|
*componentGroup = COMPGROUP_DEFAULT;
|
||||||
|
*subComp = component - COMPONENT_DEFAULT;
|
||||||
|
return true;
|
||||||
|
}else
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CDamageManager::SetDoorStatus(int32 door, uint32 status)
|
||||||
|
{
|
||||||
|
m_doorStatus[door] = status;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32
|
||||||
|
CDamageManager::GetDoorStatus(int32 door)
|
||||||
|
{
|
||||||
|
return m_doorStatus[door];
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
CDamageManager::ProgressDoorDamage(uint8 door)
|
||||||
|
{
|
||||||
|
int status = GetDoorStatus(door);
|
||||||
|
if(status == 3)
|
||||||
|
return false;
|
||||||
|
SetDoorStatus(door, status+1);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CDamageManager::SetPanelStatus(int32 panel, uint32 status)
|
||||||
|
{
|
||||||
|
m_panelStatus = dpb(status, panel*4, 4, m_panelStatus);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32
|
||||||
|
CDamageManager::GetPanelStatus(int32 panel)
|
||||||
|
{
|
||||||
|
return ldb(panel*4, 4, m_panelStatus);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
CDamageManager::ProgressPanelDamage(uint8 panel)
|
||||||
|
{
|
||||||
|
int status = GetPanelStatus(panel);
|
||||||
|
if(status == 3)
|
||||||
|
return false;
|
||||||
|
SetPanelStatus(panel, status+1);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CDamageManager::SetLightStatus(eLights light, uint32 status)
|
||||||
|
{
|
||||||
|
m_lightStatus = dpb(status, light*2, 2, m_lightStatus);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32
|
||||||
|
CDamageManager::GetLightStatus(eLights light)
|
||||||
|
{
|
||||||
|
return ldb(light*2, 2, m_lightStatus);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CDamageManager::SetWheelStatus(int32 wheel, uint32 status)
|
||||||
|
{
|
||||||
|
m_wheelStatus[wheel] = status;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32
|
||||||
|
CDamageManager::GetWheelStatus(int32 wheel)
|
||||||
|
{
|
||||||
|
return m_wheelStatus[wheel];
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
CDamageManager::ProgressWheelDamage(uint8 wheel)
|
||||||
|
{
|
||||||
|
int status = GetWheelStatus(wheel);
|
||||||
|
if(status == 3)
|
||||||
|
return false;
|
||||||
|
SetWheelStatus(wheel, status+1);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CDamageManager::SetEngineStatus(uint32 status)
|
||||||
|
{
|
||||||
|
if(status > 250)
|
||||||
|
m_engineStatus = 250;
|
||||||
|
else
|
||||||
|
m_engineStatus = status;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32
|
||||||
|
CDamageManager::GetEngineStatus(void)
|
||||||
|
{
|
||||||
|
return m_engineStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
CDamageManager::ProgressEngineDamage(void)
|
||||||
|
{
|
||||||
|
int status = GetEngineStatus();
|
||||||
|
int newstatus = status + 32 + (CGeneral::GetRandomNumber() & 0x1F);
|
||||||
|
if(status < 225 && newstatus > 224)
|
||||||
|
newstatus = 224;
|
||||||
|
SetEngineStatus(newstatus);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
STARTPATCHES
|
||||||
|
InjectHook(0x545850, &CDamageManager::ResetDamageStatus, PATCH_JUMP);
|
||||||
|
InjectHook(0x545B70, &CDamageManager::FuckCarCompletely, PATCH_JUMP);
|
||||||
|
InjectHook(0x545790, &CDamageManager::GetComponentGroup, PATCH_JUMP);
|
||||||
|
InjectHook(0x545A80, &CDamageManager::ApplyDamage, PATCH_JUMP);
|
||||||
|
InjectHook(0x545920, &CDamageManager::SetDoorStatus, PATCH_JUMP);
|
||||||
|
InjectHook(0x545930, &CDamageManager::GetDoorStatus, PATCH_JUMP);
|
||||||
|
InjectHook(0x545970, &CDamageManager::ProgressDoorDamage, PATCH_JUMP);
|
||||||
|
InjectHook(0x5458B0, &CDamageManager::SetPanelStatus, PATCH_JUMP);
|
||||||
|
InjectHook(0x5458E0, (int32 (CDamageManager::*)(int32))&CDamageManager::GetPanelStatus, PATCH_JUMP);
|
||||||
|
InjectHook(0x545A00, &CDamageManager::ProgressPanelDamage, PATCH_JUMP);
|
||||||
|
InjectHook(0x545860, &CDamageManager::SetLightStatus, PATCH_JUMP);
|
||||||
|
InjectHook(0x545890, &CDamageManager::GetLightStatus, PATCH_JUMP);
|
||||||
|
InjectHook(0x545900, &CDamageManager::SetWheelStatus, PATCH_JUMP);
|
||||||
|
InjectHook(0x545910, &CDamageManager::GetWheelStatus, PATCH_JUMP);
|
||||||
|
InjectHook(0x545A40, &CDamageManager::ProgressWheelDamage, PATCH_JUMP);
|
||||||
|
InjectHook(0x545940, &CDamageManager::SetEngineStatus, PATCH_JUMP);
|
||||||
|
InjectHook(0x545960, &CDamageManager::GetEngineStatus, PATCH_JUMP);
|
||||||
|
InjectHook(0x5459B0, &CDamageManager::ProgressEngineDamage, PATCH_JUMP);
|
||||||
|
ENDPATCHES
|
||||||
|
@ -2,53 +2,100 @@
|
|||||||
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
|
||||||
|
// TODO: move some of this into Vehicle.h
|
||||||
|
|
||||||
|
enum tComponent
|
||||||
|
{
|
||||||
|
COMPONENT_DEFAULT,
|
||||||
|
COMPONENT_WHEEL_FRONT_LEFT,
|
||||||
|
COMPONENT_WHEEL_FRONT_RIGHT,
|
||||||
|
COMPONENT_WHEEL_REAR_LEFT,
|
||||||
|
COMPONENT_WHEEL_REAR_RIGHT,
|
||||||
|
COMPONENT_DOOR_BONNET,
|
||||||
|
COMPONENT_DOOR_BOOT,
|
||||||
|
COMPONENT_DOOR_FRONT_LEFT,
|
||||||
|
COMPONENT_DOOR_FRONT_RIGHT,
|
||||||
|
COMPONENT_DOOR_REAR_LEFT,
|
||||||
|
COMPONENT_DOOR_REAR_RIGHT,
|
||||||
|
COMPONENT_PANEL_FRONT_LEFT,
|
||||||
|
COMPONENT_PANEL_FRONT_RIGHT,
|
||||||
|
COMPONENT_PANEL_REAR_LEFT,
|
||||||
|
COMPONENT_PANEL_REAR_RIGHT,
|
||||||
|
COMPONENT_PANEL_WINDSCREEN,
|
||||||
|
COMPONENT_BUMPER_FRONT,
|
||||||
|
COMPONENT_BUMPER_REAR,
|
||||||
|
};
|
||||||
|
|
||||||
|
enum tComponentGroup
|
||||||
|
{
|
||||||
|
COMPGROUP_BUMPER,
|
||||||
|
COMPGROUP_WHEEL,
|
||||||
|
COMPGROUP_DOOR,
|
||||||
|
COMPGROUP_BONNET,
|
||||||
|
COMPGROUP_BOOT,
|
||||||
|
COMPGROUP_PANEL,
|
||||||
|
COMPGROUP_DEFAULT,
|
||||||
|
};
|
||||||
|
|
||||||
|
enum eLights
|
||||||
|
{
|
||||||
|
VEHLIGHT_FRONT_LEFT,
|
||||||
|
VEHLIGHT_FRONT_RIGHT,
|
||||||
|
VEHLIGHT_REAR_LEFT,
|
||||||
|
VEHLIGHT_REAR_RIGHT,
|
||||||
|
};
|
||||||
|
|
||||||
|
enum {
|
||||||
|
VEHDOOR_BONNET = 0,
|
||||||
|
VEHDOOR_BOOT,
|
||||||
|
VEHDOOR_FRONT_LEFT,
|
||||||
|
VEHDOOR_FRONT_RIGHT,
|
||||||
|
VEHDOOR_REAR_LEFT,
|
||||||
|
VEHDOOR_REAR_RIGHT
|
||||||
|
};
|
||||||
|
|
||||||
|
enum {
|
||||||
|
VEHPANEL_FRONT_LEFT,
|
||||||
|
VEHPANEL_FRONT_RIGHT,
|
||||||
|
VEHPANEL_REAR_LEFT,
|
||||||
|
VEHPANEL_REAR_RIGHT,
|
||||||
|
VEHPANEL_WINDSCREEN,
|
||||||
|
VEHBUMPER_FRONT,
|
||||||
|
VEHBUMPER_REAR,
|
||||||
|
};
|
||||||
|
|
||||||
class CDamageManager
|
class CDamageManager
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
enum {
|
|
||||||
CAR_DOOR_BONNET = 0,
|
|
||||||
CAR_DOOR_BUMPER,
|
|
||||||
CAR_DOOR_LF,
|
|
||||||
CAR_DOOR_RF,
|
|
||||||
CAR_DOOR_LR,
|
|
||||||
CAR_DOOR_RR
|
|
||||||
};
|
|
||||||
|
|
||||||
enum {
|
|
||||||
PANEL_FL = 0,
|
|
||||||
PANEL_FR,
|
|
||||||
PANEL_RL,
|
|
||||||
PANEL_RR,
|
|
||||||
PANEL_WINDSHIELD,
|
|
||||||
PANEL_FRONT,
|
|
||||||
PANEL_BACK
|
|
||||||
};
|
|
||||||
|
|
||||||
struct PanelStatus {
|
|
||||||
uint32 m_nPanelFrontLeftStatus : 4;
|
|
||||||
uint32 m_nPanelFrontRightStatus : 4;
|
|
||||||
uint32 m_nPanelBackLeftStatus : 4;
|
|
||||||
uint32 m_nPanelBackRightStatus : 4;
|
|
||||||
uint32 m_nWindshieldStatus : 4;
|
|
||||||
uint32 m_nPanelFrontStatus : 4;
|
|
||||||
uint32 m_nPanelBackStatus : 4;
|
|
||||||
};
|
|
||||||
|
|
||||||
float field_0;
|
float field_0;
|
||||||
char m_bEngineStatus;
|
uint8 m_engineStatus;
|
||||||
char m_bWheelStatus[4];
|
uint8 m_wheelStatus[4];
|
||||||
char m_bDoorStatus[7];
|
uint8 m_doorStatus[6];
|
||||||
uint32 m_abLightStatus;
|
uint32 m_lightStatus;
|
||||||
union{
|
uint32 m_panelStatus;
|
||||||
PanelStatus m_sPanelsStatus;
|
uint32 field_24;
|
||||||
uint32 m_abPanelsStatus;
|
|
||||||
};
|
|
||||||
char field_24;
|
|
||||||
char field_25;
|
|
||||||
char field_26;
|
|
||||||
char field_27;
|
|
||||||
|
|
||||||
void SetDoorStatus(int, unsigned int);
|
void ResetDamageStatus(void);
|
||||||
unsigned int GetDoorStatus(int);
|
void FuckCarCompletely(void);
|
||||||
|
bool ApplyDamage(tComponent component, float damage, float unused);
|
||||||
|
bool GetComponentGroup(tComponent component, tComponentGroup *componentGroup, uint8 *foo);
|
||||||
|
|
||||||
|
void SetDoorStatus(int32 door, uint32 status);
|
||||||
|
int32 GetDoorStatus(int32 door);
|
||||||
|
bool ProgressDoorDamage(uint8 door);
|
||||||
|
void SetPanelStatus(int32 panel, uint32 status);
|
||||||
|
int32 GetPanelStatus(int32 panel);
|
||||||
|
bool ProgressPanelDamage(uint8 panel);
|
||||||
|
// needed for CReplay
|
||||||
|
static int32 GetPanelStatus(uint32 panelstatus, int32 panel) { return ldb(panel*4, 4, panelstatus); }
|
||||||
|
void SetLightStatus(eLights light, uint32 status);
|
||||||
|
int32 GetLightStatus(eLights light);
|
||||||
|
void SetWheelStatus(int32 wheel, uint32 status);
|
||||||
|
int32 GetWheelStatus(int32 wheel);
|
||||||
|
bool ProgressWheelDamage(uint8 wheel);
|
||||||
|
void SetEngineStatus(uint32 status);
|
||||||
|
int32 GetEngineStatus(void);
|
||||||
|
bool ProgressEngineDamage(void);
|
||||||
};
|
};
|
||||||
|
VALIDATE_SIZE(CDamageManager, 0x1C);
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -71,12 +71,14 @@ enum eAudioType : int32 {
|
|||||||
TOTAL_AUDIO_TYPES = 14,
|
TOTAL_AUDIO_TYPES = 14,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class CPhysical;
|
||||||
|
|
||||||
class tAudioEntity
|
class tAudioEntity
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
eAudioType m_nType;
|
eAudioType m_nType;
|
||||||
void *m_pEntity;
|
CPhysical *m_pEntity;
|
||||||
char m_bIsUsed;
|
bool m_bIsUsed;
|
||||||
char m_bStatus;
|
char m_bStatus;
|
||||||
int16 m_awAudioEvent[4];
|
int16 m_awAudioEvent[4];
|
||||||
char gap_18[2];
|
char gap_18[2];
|
||||||
@ -159,7 +161,7 @@ public:
|
|||||||
char field_22;
|
char field_22;
|
||||||
char field_23;
|
char field_23;
|
||||||
int field_24;
|
int field_24;
|
||||||
char m_bIsPlayed;
|
bool m_bIsPlayed;
|
||||||
char field_29;
|
char field_29;
|
||||||
char field_30;
|
char field_30;
|
||||||
char field_31;
|
char field_31;
|
||||||
@ -175,7 +177,7 @@ public:
|
|||||||
char field_2;
|
char field_2;
|
||||||
char m_bActiveSamples;
|
char m_bActiveSamples;
|
||||||
char field_4;
|
char field_4;
|
||||||
char m_bDynamicAcousticModelingStatus;
|
bool m_bDynamicAcousticModelingStatus;
|
||||||
char field_6;
|
char field_6;
|
||||||
char field_7;
|
char field_7;
|
||||||
float field_8;
|
float field_8;
|
||||||
@ -185,7 +187,7 @@ public:
|
|||||||
char field_15;
|
char field_15;
|
||||||
int m_nTimer;
|
int m_nTimer;
|
||||||
tActiveSample m_sQueueSample;
|
tActiveSample m_sQueueSample;
|
||||||
char m_bActiveSampleQueue;
|
uint8 m_bActiveSampleQueue;
|
||||||
char gap_109[3];
|
char gap_109[3];
|
||||||
tActiveSample m_asSamples[54];
|
tActiveSample m_asSamples[54];
|
||||||
char m_abSampleQueueIndexTable[54];
|
char m_abSampleQueueIndexTable[54];
|
||||||
@ -216,7 +218,92 @@ public:
|
|||||||
char field_19195;
|
char field_19195;
|
||||||
int m_nTimeOfRecentCrime;
|
int m_nTimeOfRecentCrime;
|
||||||
|
|
||||||
void PlayerJustLeftCar(void);
|
char GetMissionScriptPoliceAudioPlayingStatus();
|
||||||
|
bool GetMissionAudioLoadingStatus();
|
||||||
|
|
||||||
|
uint8 GetNum3DProvidersAvailable();
|
||||||
|
int8 AutoDetect3DProviders();
|
||||||
|
bool IsMP3RadioChannelAvailable();
|
||||||
|
uint8 GetCDAudioDriveLetter();
|
||||||
|
|
||||||
|
void SetEffectsMasterVolume(uint8 volume);
|
||||||
|
void SetMusicMasterVolume(uint8 volume);
|
||||||
|
void SetEffectsFadeVol(uint8 volume);
|
||||||
|
void SetMusicFadeVol(uint8 volume);
|
||||||
|
|
||||||
|
void SetSpeakerConfig(int32 conf);
|
||||||
|
|
||||||
|
void ProcessJumboFlying();
|
||||||
|
bool SetupJumboEngineSound(uint8, int32); // todo
|
||||||
|
void PreInitialiseGameSpecificSetup();
|
||||||
|
void SetMissionScriptPoliceAudio(int32 sfx);
|
||||||
|
|
||||||
|
void CalculateDistance(bool *ptr, float dist);
|
||||||
|
|
||||||
|
bool UsesSiren(int32 model);
|
||||||
|
bool UsesSirenSwitching(int32 model);
|
||||||
|
|
||||||
|
bool MissionScriptAudioUsesPoliceChannel(int32 soundMission);
|
||||||
|
|
||||||
|
uint8 Get3DProviderName(uint8 id);
|
||||||
|
|
||||||
|
void ProcessJumboTaxi();
|
||||||
|
bool SetupJumboFlySound(uint8); // todo
|
||||||
|
bool SetupJumboTaxiSound(uint8); // todo
|
||||||
|
bool SetupJumboWhineSound(uint8, int32); // todo
|
||||||
|
|
||||||
|
void PlayLoadedMissionAudio();
|
||||||
|
|
||||||
|
void SetMissionAudioLocation(float x, float y, float z);
|
||||||
|
|
||||||
|
void ResetPoliceRadio();
|
||||||
|
|
||||||
|
void InterrogateAudioEntities();
|
||||||
|
|
||||||
|
void ClearRequestedQueue();
|
||||||
|
// void AgeCrimes();
|
||||||
|
|
||||||
|
bool UsesReverseWarning(int32 model);
|
||||||
|
bool HasAirBrakes(int32 model);
|
||||||
|
|
||||||
|
int32 GetJumboTaxiFreq();
|
||||||
|
|
||||||
|
void ProcessPhysical(int32 id);
|
||||||
|
void ProcessVehicle(CPhysical *); // todo
|
||||||
|
void ProcessPed(CPhysical *); // todo
|
||||||
|
void ProcessPlane(void *); // todo
|
||||||
|
|
||||||
|
void ClearMissionAudio();
|
||||||
|
// void ProcessReverb();
|
||||||
|
|
||||||
|
bool IsMissionAudioSampleFinished();
|
||||||
|
|
||||||
|
void ProcessEntity(int32);
|
||||||
|
|
||||||
|
void InitialisePoliceRadio();
|
||||||
|
|
||||||
|
// done
|
||||||
|
|
||||||
|
int32 RandomDisplacement(uint32 seed);
|
||||||
|
|
||||||
|
void ReleaseDigitalHandle();
|
||||||
|
void RequireDigitalHandle();
|
||||||
|
void SetDynamicAcousticModelingStatus(bool status);
|
||||||
|
|
||||||
|
bool IsAudioInitialised() const;
|
||||||
|
|
||||||
|
int32 CreateEntity(int32 type, CPhysical *memory);
|
||||||
|
void DestroyEntity(int32 id);
|
||||||
|
void SetEntityStatus(int32 id, bool status);
|
||||||
|
|
||||||
|
void PreTerminateGameSpecificShutdown();
|
||||||
|
void PostTerminateGameSpecificShutdown();
|
||||||
|
|
||||||
|
void GenerateIntegerRandomNumberTable();
|
||||||
|
|
||||||
|
void PlayerJustGotInCar();
|
||||||
|
void PlayerJustLeftCar();
|
||||||
|
|
||||||
void Service();
|
void Service();
|
||||||
void GetPhrase(uint32 *phrase, uint32 *prevPhrase, uint32 sample,
|
void GetPhrase(uint32 *phrase, uint32 *prevPhrase, uint32 sample,
|
||||||
uint32 maxOffset);
|
uint32 maxOffset);
|
||||||
|
@ -1,9 +1,92 @@
|
|||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
#include "patcher.h"
|
||||||
#include "SampleManager.h"
|
#include "SampleManager.h"
|
||||||
|
|
||||||
CSampleManager &cSampleManager = *(CSampleManager *)0x7341E0;
|
CSampleManager &cSampleManager = *(CSampleManager *)0x7341E0;
|
||||||
uint32 &CSampleManager::nNumOfMp3Files = *(uint32*)0x95CC00;
|
|
||||||
|
uint32 &nNumOfMp3Files = *(uint32 *)0x95CC00;
|
||||||
|
uint8 &num3DProvidersAvailable = *(uint8 *)0x734237;
|
||||||
|
uint32 *asName3DProviders = (uint32 *)0x734238;
|
||||||
|
|
||||||
bool CSampleManager::IsMP3RadioChannelAvailable() {
|
bool CSampleManager::IsMP3RadioChannelAvailable() {
|
||||||
return nNumOfMp3Files != 0;
|
return nNumOfMp3Files != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
WRAPPER void
|
||||||
|
CSampleManager::ReleaseDigitalHandle()
|
||||||
|
{
|
||||||
|
EAXJMP(0x5664B0);
|
||||||
|
}
|
||||||
|
|
||||||
|
WRAPPER
|
||||||
|
void
|
||||||
|
CSampleManager::RequireDigitalHandle()
|
||||||
|
{
|
||||||
|
EAXJMP(0x5664F0);
|
||||||
|
}
|
||||||
|
|
||||||
|
WRAPPER
|
||||||
|
char
|
||||||
|
CSampleManager::AutoDetect3DProviders()
|
||||||
|
{
|
||||||
|
EAXJMP(0x565990);
|
||||||
|
}
|
||||||
|
|
||||||
|
WRAPPER
|
||||||
|
uint8
|
||||||
|
CSampleManager::GetCDAudioDriveLetter()
|
||||||
|
{
|
||||||
|
EAXJMP(0x566F20);
|
||||||
|
}
|
||||||
|
|
||||||
|
WRAPPER
|
||||||
|
void
|
||||||
|
CSampleManager::SetEffectsMasterVolume(uint8 volume)
|
||||||
|
{
|
||||||
|
EAXJMP(0x567010);
|
||||||
|
}
|
||||||
|
|
||||||
|
WRAPPER
|
||||||
|
void
|
||||||
|
CSampleManager::SetMusicMasterVolume(uint8 volume)
|
||||||
|
{
|
||||||
|
EAXJMP(0x567020);
|
||||||
|
}
|
||||||
|
|
||||||
|
WRAPPER
|
||||||
|
void
|
||||||
|
CSampleManager::SetEffectsFadeVol(uint8 volume)
|
||||||
|
{
|
||||||
|
EAXJMP(0x567030);
|
||||||
|
}
|
||||||
|
|
||||||
|
WRAPPER
|
||||||
|
void
|
||||||
|
CSampleManager::SetMusicFadeVol(uint8 volume)
|
||||||
|
{
|
||||||
|
EAXJMP(0x567040);
|
||||||
|
}
|
||||||
|
|
||||||
|
WRAPPER
|
||||||
|
void
|
||||||
|
CSampleManager::SetSpeakerConfig(uint32 config)
|
||||||
|
{
|
||||||
|
EAXJMP(0x565900);
|
||||||
|
}
|
||||||
|
|
||||||
|
WRAPPER
|
||||||
|
bool
|
||||||
|
CSampleManager::GetChannelUsedFlag(int32 id)
|
||||||
|
{
|
||||||
|
EAXJMP(0x567B00);
|
||||||
|
}
|
||||||
|
|
||||||
|
WRAPPER
|
||||||
|
void
|
||||||
|
CSampleManager::StopChannel(int32 id)
|
||||||
|
{
|
||||||
|
EAXJMP(0x567BE0);
|
||||||
|
}
|
||||||
|
STARTPATCHES
|
||||||
|
InjectHook(0x566490, CSampleManager::IsMP3RadioChannelAvailable, PATCH_JUMP);
|
||||||
|
ENDPATCHES
|
@ -1,11 +1,37 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
class CSampleManager {
|
struct tSample {
|
||||||
public:
|
int m_nOffset;
|
||||||
static uint32 &nNumOfMp3Files;
|
unsigned int m_nSize;
|
||||||
|
int m_nFrequency;
|
||||||
|
int m_nLoopStart;
|
||||||
|
int m_nLoopEnd;
|
||||||
|
};
|
||||||
|
|
||||||
|
class CSampleManager
|
||||||
|
{
|
||||||
public:
|
public:
|
||||||
|
void ReleaseDigitalHandle();
|
||||||
|
void RequireDigitalHandle();
|
||||||
|
|
||||||
|
char AutoDetect3DProviders();
|
||||||
|
uint8 GetCDAudioDriveLetter();
|
||||||
|
|
||||||
|
void SetEffectsMasterVolume(uint8 volume);
|
||||||
|
void SetMusicMasterVolume(uint8 volume);
|
||||||
|
void SetEffectsFadeVol(uint8 volume);
|
||||||
|
void SetMusicFadeVol(uint8 volume);
|
||||||
|
|
||||||
|
void SetSpeakerConfig(uint32 config);
|
||||||
|
|
||||||
|
bool GetChannelUsedFlag(int32 id);
|
||||||
|
void StopChannel(int32 id);
|
||||||
|
|
||||||
static bool IsMP3RadioChannelAvailable();
|
static bool IsMP3RadioChannelAvailable();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
extern uint32 &nNumOfMp3Files;
|
||||||
|
extern uint8 &num3DProvidersAvailable;
|
||||||
|
extern uint32* asName3DProviders;
|
||||||
|
|
||||||
extern CSampleManager &cSampleManager;
|
extern CSampleManager &cSampleManager;
|
13
src/common.h
13
src/common.h
@ -49,6 +49,19 @@ typedef uint16_t wchar;
|
|||||||
|
|
||||||
#define ALIGNPTR(p) (void*)((((uintptr)(void*)p) + sizeof(void*)-1) & ~(sizeof(void*)-1))
|
#define ALIGNPTR(p) (void*)((((uintptr)(void*)p) + sizeof(void*)-1) & ~(sizeof(void*)-1))
|
||||||
|
|
||||||
|
// PDP-10 like byte functions
|
||||||
|
#define MASK(p, s) (((1<<(s))-1) << (p))
|
||||||
|
inline uint32 dpb(uint32 b, uint32 p, uint32 s, uint32 w)
|
||||||
|
{
|
||||||
|
uint32 m = MASK(p,s);
|
||||||
|
return w & ~m | b<<p & m;
|
||||||
|
}
|
||||||
|
inline uint32 ldb(uint32 p, uint32 s, uint32 w)
|
||||||
|
{
|
||||||
|
return w>>p & (1<<s)-1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// little hack
|
// little hack
|
||||||
extern void **rwengine;
|
extern void **rwengine;
|
||||||
#define RwEngineInstance (*rwengine)
|
#define RwEngineInstance (*rwengine)
|
||||||
|
@ -10,3 +10,4 @@ float &CPopulation::PedDensityMultiplier = *(float*)0x5FA56C;
|
|||||||
|
|
||||||
WRAPPER void CPopulation::UpdatePedCount(uint32, bool) { EAXJMP(0x4F5A60); }
|
WRAPPER void CPopulation::UpdatePedCount(uint32, bool) { EAXJMP(0x4F5A60); }
|
||||||
WRAPPER void CPopulation::DealWithZoneChange(eLevelName oldLevel, eLevelName newLevel, bool) { EAXJMP(0x4F6200); }
|
WRAPPER void CPopulation::DealWithZoneChange(eLevelName oldLevel, eLevelName newLevel, bool) { EAXJMP(0x4F6200); }
|
||||||
|
WRAPPER CPed *CPopulation::AddPedInCar(CVehicle *vehicle) { EAXJMP(0x4F5800); }
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "PedType.h"
|
class CPed;
|
||||||
|
class CVehicle;
|
||||||
|
|
||||||
struct PedGroup
|
struct PedGroup
|
||||||
{
|
{
|
||||||
@ -17,4 +18,5 @@ public:
|
|||||||
|
|
||||||
static void UpdatePedCount(uint32, bool);
|
static void UpdatePedCount(uint32, bool);
|
||||||
static void DealWithZoneChange(eLevelName oldLevel, eLevelName newLevel, bool);
|
static void DealWithZoneChange(eLevelName oldLevel, eLevelName newLevel, bool);
|
||||||
|
static CPed *AddPedInCar(CVehicle *vehicle);
|
||||||
};
|
};
|
||||||
|
@ -135,34 +135,33 @@ WRAPPER static void ApplyPanelDamageToCar(uint32, CAutomobile*, bool) { EAXJMP(0
|
|||||||
#else
|
#else
|
||||||
static void ApplyPanelDamageToCar(uint32 panels, CAutomobile* vehicle, bool flying)
|
static void ApplyPanelDamageToCar(uint32 panels, CAutomobile* vehicle, bool flying)
|
||||||
{
|
{
|
||||||
CDamageManager::PanelStatus rp = *(CDamageManager::PanelStatus*)&panels;
|
if(vehicle->m_DamageManager.GetPanelStatus(VEHPANEL_FRONT_LEFT) != CDamageManager::GetPanelStatus(panels, VEHPANEL_FRONT_LEFT)){
|
||||||
if (vehicle->m_DamageManager.m_sPanelsStatus.m_nPanelFrontLeftStatus != rp.m_nPanelFrontLeftStatus){
|
vehicle->m_DamageManager.SetPanelStatus(VEHPANEL_FRONT_LEFT, CDamageManager::GetPanelStatus(panels, VEHPANEL_FRONT_LEFT));
|
||||||
vehicle->m_DamageManager.m_sPanelsStatus.m_nPanelFrontLeftStatus = rp.m_nPanelFrontLeftStatus;
|
vehicle->SetPanelDamage(13, VEHPANEL_FRONT_LEFT, flying);
|
||||||
vehicle->SetPanelDamage(13, CDamageManager::PANEL_FL, flying);
|
|
||||||
}
|
}
|
||||||
if (vehicle->m_DamageManager.m_sPanelsStatus.m_nPanelFrontRightStatus != rp.m_nPanelFrontRightStatus) {
|
if(vehicle->m_DamageManager.GetPanelStatus(VEHPANEL_FRONT_RIGHT) != CDamageManager::GetPanelStatus(panels, VEHPANEL_FRONT_RIGHT)){
|
||||||
vehicle->m_DamageManager.m_sPanelsStatus.m_nPanelFrontRightStatus = rp.m_nPanelFrontRightStatus;
|
vehicle->m_DamageManager.SetPanelStatus(VEHPANEL_FRONT_RIGHT, CDamageManager::GetPanelStatus(panels, VEHPANEL_FRONT_RIGHT));
|
||||||
vehicle->SetPanelDamage(9, CDamageManager::PANEL_FR, flying);
|
vehicle->SetPanelDamage(9, VEHPANEL_FRONT_RIGHT, flying);
|
||||||
}
|
}
|
||||||
if (vehicle->m_DamageManager.m_sPanelsStatus.m_nPanelBackLeftStatus != rp.m_nPanelBackLeftStatus) {
|
if(vehicle->m_DamageManager.GetPanelStatus(VEHPANEL_REAR_LEFT) != CDamageManager::GetPanelStatus(panels, VEHPANEL_REAR_LEFT)){
|
||||||
vehicle->m_DamageManager.m_sPanelsStatus.m_nPanelBackLeftStatus = rp.m_nPanelBackLeftStatus;
|
vehicle->m_DamageManager.SetPanelStatus(VEHPANEL_REAR_LEFT, CDamageManager::GetPanelStatus(panels, VEHPANEL_REAR_LEFT));
|
||||||
vehicle->SetPanelDamage(14, CDamageManager::PANEL_RL, flying);
|
vehicle->SetPanelDamage(14, VEHPANEL_REAR_LEFT, flying);
|
||||||
}
|
}
|
||||||
if (vehicle->m_DamageManager.m_sPanelsStatus.m_nPanelBackRightStatus != rp.m_nPanelBackRightStatus) {
|
if(vehicle->m_DamageManager.GetPanelStatus(VEHPANEL_REAR_RIGHT) != CDamageManager::GetPanelStatus(panels, VEHPANEL_REAR_RIGHT)){
|
||||||
vehicle->m_DamageManager.m_sPanelsStatus.m_nPanelBackRightStatus = rp.m_nPanelBackRightStatus;
|
vehicle->m_DamageManager.SetPanelStatus(VEHPANEL_REAR_RIGHT, CDamageManager::GetPanelStatus(panels, VEHPANEL_REAR_RIGHT));
|
||||||
vehicle->SetPanelDamage(10, CDamageManager::PANEL_RR, flying);
|
vehicle->SetPanelDamage(10, VEHPANEL_REAR_RIGHT, flying);
|
||||||
}
|
}
|
||||||
if (vehicle->m_DamageManager.m_sPanelsStatus.m_nWindshieldStatus != rp.m_nWindshieldStatus) {
|
if(vehicle->m_DamageManager.GetPanelStatus(VEHPANEL_WINDSCREEN) != CDamageManager::GetPanelStatus(panels, VEHPANEL_WINDSCREEN)){
|
||||||
vehicle->m_DamageManager.m_sPanelsStatus.m_nWindshieldStatus = rp.m_nWindshieldStatus;
|
vehicle->m_DamageManager.SetPanelStatus(VEHPANEL_WINDSCREEN, CDamageManager::GetPanelStatus(panels, VEHPANEL_WINDSCREEN));
|
||||||
vehicle->SetPanelDamage(19, CDamageManager::PANEL_WINDSHIELD, flying);
|
vehicle->SetPanelDamage(19, VEHPANEL_WINDSCREEN, flying);
|
||||||
}
|
}
|
||||||
if (vehicle->m_DamageManager.m_sPanelsStatus.m_nPanelFrontStatus != rp.m_nPanelFrontStatus) {
|
if(vehicle->m_DamageManager.GetPanelStatus(VEHBUMPER_FRONT) != CDamageManager::GetPanelStatus(panels, VEHBUMPER_FRONT)){
|
||||||
vehicle->m_DamageManager.m_sPanelsStatus.m_nPanelFrontStatus = rp.m_nPanelFrontStatus;
|
vehicle->m_DamageManager.SetPanelStatus(VEHBUMPER_FRONT, CDamageManager::GetPanelStatus(panels, VEHBUMPER_FRONT));
|
||||||
vehicle->SetPanelDamage(7, CDamageManager::PANEL_FRONT, flying);
|
vehicle->SetPanelDamage(7, VEHBUMPER_FRONT, flying);
|
||||||
}
|
}
|
||||||
if (vehicle->m_DamageManager.m_sPanelsStatus.m_nPanelBackStatus != rp.m_nPanelBackStatus) {
|
if(vehicle->m_DamageManager.GetPanelStatus(VEHBUMPER_REAR) != CDamageManager::GetPanelStatus(panels, VEHBUMPER_REAR)){
|
||||||
vehicle->m_DamageManager.m_sPanelsStatus.m_nPanelBackStatus = rp.m_nPanelBackStatus;
|
vehicle->m_DamageManager.SetPanelStatus(VEHBUMPER_REAR, CDamageManager::GetPanelStatus(panels, VEHBUMPER_REAR));
|
||||||
vehicle->SetPanelDamage(8, CDamageManager::PANEL_BACK, flying);
|
vehicle->SetPanelDamage(8, VEHBUMPER_REAR, flying);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -625,7 +624,7 @@ void CReplay::StoreCarUpdate(CVehicle *vehicle, int id)
|
|||||||
vp->matrix.CompressFromFullMatrix(vehicle->GetMatrix());
|
vp->matrix.CompressFromFullMatrix(vehicle->GetMatrix());
|
||||||
vp->health = vehicle->m_fHealth / 4.0f; /* Not anticipated that health can be > 1000. */
|
vp->health = vehicle->m_fHealth / 4.0f; /* Not anticipated that health can be > 1000. */
|
||||||
vp->acceleration = vehicle->m_fGasPedal * 100.0f;
|
vp->acceleration = vehicle->m_fGasPedal * 100.0f;
|
||||||
vp->panels = vehicle->IsCar() ? ((CAutomobile*)vehicle)->m_DamageManager.m_abPanelsStatus : 0;
|
vp->panels = vehicle->IsCar() ? ((CAutomobile*)vehicle)->m_DamageManager.m_panelStatus : 0;
|
||||||
vp->velocityX = 8000.0f * max(-4.0f, min(4.0f, vehicle->GetSpeed().x)); /* 8000!? */
|
vp->velocityX = 8000.0f * max(-4.0f, min(4.0f, vehicle->GetSpeed().x)); /* 8000!? */
|
||||||
vp->velocityY = 8000.0f * max(-4.0f, min(4.0f, vehicle->GetSpeed().y));
|
vp->velocityY = 8000.0f * max(-4.0f, min(4.0f, vehicle->GetSpeed().y));
|
||||||
vp->velocityZ = 8000.0f * max(-4.0f, min(4.0f, vehicle->GetSpeed().z));
|
vp->velocityZ = 8000.0f * max(-4.0f, min(4.0f, vehicle->GetSpeed().z));
|
||||||
@ -646,7 +645,7 @@ void CReplay::StoreCarUpdate(CVehicle *vehicle, int id)
|
|||||||
vp->door_angles[1] = 127.0f / M_PI * car->m_aDoors[3].m_fAngle;
|
vp->door_angles[1] = 127.0f / M_PI * car->m_aDoors[3].m_fAngle;
|
||||||
vp->door_status = 0;
|
vp->door_status = 0;
|
||||||
for (int i = 0; i < 6; i++){
|
for (int i = 0; i < 6; i++){
|
||||||
if (car->m_DamageManager.m_bDoorStatus[i] == 3)
|
if (car->m_DamageManager.GetDoorStatus(i) == 3)
|
||||||
vp->door_status |= BIT(i);
|
vp->door_status |= BIT(i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -690,34 +689,34 @@ void CReplay::ProcessCarUpdate(CVehicle *vehicle, float interpolation, CAddressI
|
|||||||
car->m_aDoors[2].m_fAngle = car->m_aDoors[2].m_fPreviousAngle = vp->door_angles[0] * M_PI / 127.0f;
|
car->m_aDoors[2].m_fAngle = car->m_aDoors[2].m_fPreviousAngle = vp->door_angles[0] * M_PI / 127.0f;
|
||||||
car->m_aDoors[3].m_fAngle = car->m_aDoors[3].m_fPreviousAngle = vp->door_angles[1] * M_PI / 127.0f;
|
car->m_aDoors[3].m_fAngle = car->m_aDoors[3].m_fPreviousAngle = vp->door_angles[1] * M_PI / 127.0f;
|
||||||
if (vp->door_angles[0])
|
if (vp->door_angles[0])
|
||||||
car->m_DamageManager.m_bDoorStatus[2] = 2;
|
car->m_DamageManager.SetDoorStatus(2, 2);
|
||||||
if (vp->door_angles[1])
|
if (vp->door_angles[1])
|
||||||
car->m_DamageManager.m_bDoorStatus[3] = 2;
|
car->m_DamageManager.SetDoorStatus(3, 2);
|
||||||
if (vp->door_status & 1 && car->m_DamageManager.GetDoorStatus(CDamageManager::CAR_DOOR_BONNET) != 3){
|
if (vp->door_status & 1 && car->m_DamageManager.GetDoorStatus(VEHDOOR_BONNET) != 3){
|
||||||
car->m_DamageManager.SetDoorStatus(CDamageManager::CAR_DOOR_BONNET, 3);
|
car->m_DamageManager.SetDoorStatus(VEHDOOR_BONNET, 3);
|
||||||
car->SetDoorDamage(17, CDamageManager::CAR_DOOR_BONNET, true);
|
car->SetDoorDamage(17, VEHDOOR_BONNET, true);
|
||||||
}
|
}
|
||||||
if (vp->door_status & 2 && car->m_DamageManager.GetDoorStatus(CDamageManager::CAR_DOOR_BUMPER) != 3) {
|
if (vp->door_status & 2 && car->m_DamageManager.GetDoorStatus(VEHDOOR_BOOT) != 3) {
|
||||||
car->m_DamageManager.SetDoorStatus(CDamageManager::CAR_DOOR_BUMPER, 3);
|
car->m_DamageManager.SetDoorStatus(VEHDOOR_BOOT, 3);
|
||||||
car->SetDoorDamage(18, CDamageManager::CAR_DOOR_BUMPER, true);
|
car->SetDoorDamage(18, VEHDOOR_BOOT, true);
|
||||||
}
|
}
|
||||||
if (vp->door_status & 4 && car->m_DamageManager.GetDoorStatus(CDamageManager::CAR_DOOR_LF) != 3) {
|
if (vp->door_status & 4 && car->m_DamageManager.GetDoorStatus(VEHDOOR_FRONT_LEFT) != 3) {
|
||||||
car->m_DamageManager.SetDoorStatus(CDamageManager::CAR_DOOR_LF, 3);
|
car->m_DamageManager.SetDoorStatus(VEHDOOR_FRONT_LEFT, 3);
|
||||||
car->SetDoorDamage(15, CDamageManager::CAR_DOOR_LF, true);
|
car->SetDoorDamage(15, VEHDOOR_FRONT_LEFT, true);
|
||||||
}
|
}
|
||||||
if (vp->door_status & 8 && car->m_DamageManager.GetDoorStatus(CDamageManager::CAR_DOOR_RF) != 3) {
|
if (vp->door_status & 8 && car->m_DamageManager.GetDoorStatus(VEHDOOR_FRONT_RIGHT) != 3) {
|
||||||
car->m_DamageManager.SetDoorStatus(CDamageManager::CAR_DOOR_RF, 3);
|
car->m_DamageManager.SetDoorStatus(VEHDOOR_FRONT_RIGHT, 3);
|
||||||
car->SetDoorDamage(11, CDamageManager::CAR_DOOR_RF, true);
|
car->SetDoorDamage(11, VEHDOOR_FRONT_RIGHT, true);
|
||||||
}
|
}
|
||||||
if (vp->door_status & 0x10 && car->m_DamageManager.GetDoorStatus(CDamageManager::CAR_DOOR_LR) != 3) {
|
if (vp->door_status & 0x10 && car->m_DamageManager.GetDoorStatus(VEHDOOR_REAR_LEFT) != 3) {
|
||||||
car->m_DamageManager.SetDoorStatus(CDamageManager::CAR_DOOR_LR, 3);
|
car->m_DamageManager.SetDoorStatus(VEHDOOR_REAR_LEFT, 3);
|
||||||
car->SetDoorDamage(16, CDamageManager::CAR_DOOR_LR, true);
|
car->SetDoorDamage(16, VEHDOOR_REAR_LEFT, true);
|
||||||
}
|
}
|
||||||
if (vp->door_status & 0x20 && car->m_DamageManager.GetDoorStatus(CDamageManager::CAR_DOOR_RR) != 3) {
|
if (vp->door_status & 0x20 && car->m_DamageManager.GetDoorStatus(VEHDOOR_REAR_RIGHT) != 3) {
|
||||||
car->m_DamageManager.SetDoorStatus(CDamageManager::CAR_DOOR_RR, 3);
|
car->m_DamageManager.SetDoorStatus(VEHDOOR_REAR_RIGHT, 3);
|
||||||
car->SetDoorDamage(12, CDamageManager::CAR_DOOR_RR, true);
|
car->SetDoorDamage(12, VEHDOOR_REAR_RIGHT, true);
|
||||||
}
|
}
|
||||||
vehicle->m_veh_flagA10 = true;
|
vehicle->bEngineOn = true;
|
||||||
if (vehicle->IsCar())
|
if (vehicle->IsCar())
|
||||||
((CAutomobile*)vehicle)->m_nDriveWheelsOnGround = 4;
|
((CAutomobile*)vehicle)->m_nDriveWheelsOnGround = 4;
|
||||||
CWorld::Remove(vehicle);
|
CWorld::Remove(vehicle);
|
||||||
@ -1195,8 +1194,8 @@ void CReplay::RestoreStuffFromMem(void)
|
|||||||
}
|
}
|
||||||
if (vehicle->IsCar()){
|
if (vehicle->IsCar()){
|
||||||
CAutomobile* car = (CAutomobile*)vehicle;
|
CAutomobile* car = (CAutomobile*)vehicle;
|
||||||
int32 panels = car->m_DamageManager.m_abPanelsStatus;
|
int32 panels = car->m_DamageManager.m_panelStatus;
|
||||||
car->m_DamageManager.m_abPanelsStatus = 0;
|
car->m_DamageManager.m_panelStatus = 0;
|
||||||
ApplyPanelDamageToCar(panels, car, true);
|
ApplyPanelDamageToCar(panels, car, true);
|
||||||
car->SetDoorDamage(17, 0, true); /* BONNET */
|
car->SetDoorDamage(17, 0, true); /* BONNET */
|
||||||
car->SetDoorDamage(18, 1, true); /* BUMPER */
|
car->SetDoorDamage(18, 1, true); /* BUMPER */
|
||||||
|
@ -99,7 +99,7 @@ CPed::FlagToDestroyWhenNextProcessed(void)
|
|||||||
}
|
}
|
||||||
bInVehicle = false;
|
bInVehicle = false;
|
||||||
m_pMyVehicle = nil;
|
m_pMyVehicle = nil;
|
||||||
if (m_nCreatedBy == CREATED_BY_SCRIPT)
|
if (CharCreatedBy == MISSION_CHAR)
|
||||||
m_nPedState = PED_DEAD;
|
m_nPedState = PED_DEAD;
|
||||||
else
|
else
|
||||||
m_nPedState = PED_NONE;
|
m_nPedState = PED_NONE;
|
||||||
@ -278,7 +278,7 @@ CPed::CPed(uint32 pedType) : m_pedIK(this)
|
|||||||
m_talkType = 167;
|
m_talkType = 167;
|
||||||
m_objective = OBJECTIVE_NONE;
|
m_objective = OBJECTIVE_NONE;
|
||||||
m_prevObjective = OBJECTIVE_NONE;
|
m_prevObjective = OBJECTIVE_NONE;
|
||||||
m_nCreatedBy = CREATED_BY_RANDOM;
|
CharCreatedBy = RANDOM_CHAR;
|
||||||
m_leader = nil;
|
m_leader = nil;
|
||||||
m_pedInObjective = nil;
|
m_pedInObjective = nil;
|
||||||
m_carInObjective = nil;
|
m_carInObjective = nil;
|
||||||
@ -1336,13 +1336,13 @@ CPed::BeingDraggedFromCar(void)
|
|||||||
if (m_vehEnterType == VEHICLE_ENTER_FRONT_LEFT || m_vehEnterType == VEHICLE_ENTER_REAR_LEFT) {
|
if (m_vehEnterType == VEHICLE_ENTER_FRONT_LEFT || m_vehEnterType == VEHICLE_ENTER_REAR_LEFT) {
|
||||||
if (m_ped_flagF10) {
|
if (m_ped_flagF10) {
|
||||||
enterAnim = ANIM_CAR_QJACKED;
|
enterAnim = ANIM_CAR_QJACKED;
|
||||||
} else if (m_pMyVehicle->bIsLow) {
|
} else if (m_pMyVehicle->bLowVehicle) {
|
||||||
enterAnim = ANIM_CAR_LJACKED_LHS;
|
enterAnim = ANIM_CAR_LJACKED_LHS;
|
||||||
} else {
|
} else {
|
||||||
enterAnim = ANIM_CAR_JACKED_LHS;
|
enterAnim = ANIM_CAR_JACKED_LHS;
|
||||||
}
|
}
|
||||||
} else if (m_vehEnterType == VEHICLE_ENTER_FRONT_RIGHT || m_vehEnterType == VEHICLE_ENTER_REAR_RIGHT) {
|
} else if (m_vehEnterType == VEHICLE_ENTER_FRONT_RIGHT || m_vehEnterType == VEHICLE_ENTER_REAR_RIGHT) {
|
||||||
if (m_pMyVehicle->bIsLow)
|
if (m_pMyVehicle->bLowVehicle)
|
||||||
enterAnim = ANIM_CAR_LJACKED_RHS;
|
enterAnim = ANIM_CAR_LJACKED_RHS;
|
||||||
else
|
else
|
||||||
enterAnim = ANIM_CAR_JACKED_RHS;
|
enterAnim = ANIM_CAR_JACKED_RHS;
|
||||||
@ -1452,7 +1452,7 @@ CPed::GetLocalPositionToOpenCarDoor(CVector *output, CVehicle *veh, uint32 enter
|
|||||||
vehDoorOffset = offsetToOpenVanDoor;
|
vehDoorOffset = offsetToOpenVanDoor;
|
||||||
} else {
|
} else {
|
||||||
seatOffset = veh->m_handling->fSeatOffsetDistance * seatPosMult;
|
seatOffset = veh->m_handling->fSeatOffsetDistance * seatPosMult;
|
||||||
if (veh->bIsLow) {
|
if (veh->bLowVehicle) {
|
||||||
vehDoorOffset = offsetToOpenLowCarDoor;
|
vehDoorOffset = offsetToOpenLowCarDoor;
|
||||||
} else {
|
} else {
|
||||||
vehDoorOffset = offsetToOpenRegularCarDoor;
|
vehDoorOffset = offsetToOpenRegularCarDoor;
|
||||||
@ -2203,10 +2203,10 @@ CPed::CanBeDeleted(void)
|
|||||||
if (this->bInVehicle)
|
if (this->bInVehicle)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
switch (m_nCreatedBy) {
|
switch (CharCreatedBy) {
|
||||||
case CREATED_BY_RANDOM:
|
case RANDOM_CHAR:
|
||||||
return true;
|
return true;
|
||||||
case CREATED_BY_SCRIPT:
|
case MISSION_CHAR:
|
||||||
return false;
|
return false;
|
||||||
default:
|
default:
|
||||||
return true;
|
return true;
|
||||||
@ -2502,7 +2502,7 @@ CPed::SetObjective(eObjective newObj, void *entity)
|
|||||||
m_vecSeekVehicle = CVector(0.0f, 0.0f, 0.0f);
|
m_vecSeekVehicle = CVector(0.0f, 0.0f, 0.0f);
|
||||||
if (newObj == OBJECTIVE_SOLICIT) {
|
if (newObj == OBJECTIVE_SOLICIT) {
|
||||||
m_objectiveTimer = CTimer::GetTimeInMilliseconds() + 10000;
|
m_objectiveTimer = CTimer::GetTimeInMilliseconds() + 10000;
|
||||||
} else if (m_objective == OBJECTIVE_ENTER_CAR_AS_PASSENGER && m_nCreatedBy == CREATED_BY_SCRIPT &&
|
} else if (m_objective == OBJECTIVE_ENTER_CAR_AS_PASSENGER && CharCreatedBy == MISSION_CHAR &&
|
||||||
(m_carInObjective->m_status == STATUS_PLAYER_DISABLED || CPad::GetPad(CWorld::PlayerInFocus)->DisablePlayerControls)) {
|
(m_carInObjective->m_status == STATUS_PLAYER_DISABLED || CPad::GetPad(CWorld::PlayerInFocus)->DisablePlayerControls)) {
|
||||||
SetObjectiveTimer(14000);
|
SetObjectiveTimer(14000);
|
||||||
} else {
|
} else {
|
||||||
@ -2738,7 +2738,7 @@ CPed::ReactToAttack(CEntity *attacker)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (IsPedInControl() && (m_nCreatedBy != CREATED_BY_SCRIPT || bRespondsToThreats)) {
|
if (IsPedInControl() && (CharCreatedBy != MISSION_CHAR || bRespondsToThreats)) {
|
||||||
CPed *ourLeader = m_leader;
|
CPed *ourLeader = m_leader;
|
||||||
if (ourLeader != attacker && (!ourLeader || FindPlayerPed() != ourLeader)
|
if (ourLeader != attacker && (!ourLeader || FindPlayerPed() != ourLeader)
|
||||||
&& attacker->IsPed()) {
|
&& attacker->IsPed()) {
|
||||||
|
@ -84,8 +84,8 @@ enum eVehEnter : uint16 {
|
|||||||
};
|
};
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
CREATED_BY_RANDOM = 1,
|
RANDOM_CHAR = 1,
|
||||||
CREATED_BY_SCRIPT
|
MISSION_CHAR,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum PedLineUpPhase {
|
enum PedLineUpPhase {
|
||||||
@ -154,15 +154,15 @@ enum PedState
|
|||||||
PED_PASSENGER,
|
PED_PASSENGER,
|
||||||
PED_TAXI_PASSENGER,
|
PED_TAXI_PASSENGER,
|
||||||
PED_OPEN_DOOR,
|
PED_OPEN_DOOR,
|
||||||
PED_DIE = 48,
|
PED_DIE,
|
||||||
PED_DEAD = 49,
|
PED_DEAD,
|
||||||
PED_CARJACK,
|
PED_CARJACK,
|
||||||
PED_DRAG_FROM_CAR,
|
PED_DRAG_FROM_CAR,
|
||||||
PED_ENTER_CAR,
|
PED_ENTER_CAR,
|
||||||
PED_STEAL_CAR,
|
PED_STEAL_CAR,
|
||||||
PED_EXIT_CAR,
|
PED_EXIT_CAR,
|
||||||
PED_HANDS_UP,
|
PED_HANDS_UP,
|
||||||
PED_ARRESTED = 56,
|
PED_ARRESTED,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum eMoveState {
|
enum eMoveState {
|
||||||
@ -181,6 +181,8 @@ public:
|
|||||||
// 0x128
|
// 0x128
|
||||||
CStoredCollPoly m_collPoly;
|
CStoredCollPoly m_collPoly;
|
||||||
float m_fCollisionSpeed;
|
float m_fCollisionSpeed;
|
||||||
|
|
||||||
|
// cf. https://github.com/DK22Pac/plugin-sdk/blob/master/plugin_sa/game_sa/CPed.h from R*
|
||||||
uint8 bIsStanding : 1;
|
uint8 bIsStanding : 1;
|
||||||
uint8 m_ped_flagA2 : 1;
|
uint8 m_ped_flagA2 : 1;
|
||||||
uint8 m_ped_flagA4 : 1; // stores (CTimer::GetTimeInMilliseconds() < m_lastHitTime)
|
uint8 m_ped_flagA4 : 1; // stores (CTimer::GetTimeInMilliseconds() < m_lastHitTime)
|
||||||
@ -201,7 +203,7 @@ public:
|
|||||||
|
|
||||||
uint8 m_ped_flagC1 : 1;
|
uint8 m_ped_flagC1 : 1;
|
||||||
uint8 bRespondsToThreats : 1;
|
uint8 bRespondsToThreats : 1;
|
||||||
uint8 m_ped_flagC4 : 1;
|
uint8 m_ped_flagC4 : 1; // false when in bus, bRenderPedInCar?
|
||||||
uint8 m_ped_flagC8 : 1;
|
uint8 m_ped_flagC8 : 1;
|
||||||
uint8 m_ped_flagC10 : 1;
|
uint8 m_ped_flagC10 : 1;
|
||||||
uint8 m_ped_flagC20 : 1; // just left some body part?
|
uint8 m_ped_flagC20 : 1; // just left some body part?
|
||||||
@ -261,8 +263,9 @@ public:
|
|||||||
uint8 m_ped_flagI20 : 1;
|
uint8 m_ped_flagI20 : 1;
|
||||||
uint8 m_ped_flagI40 : 1;
|
uint8 m_ped_flagI40 : 1;
|
||||||
uint8 m_ped_flagI80 : 1;
|
uint8 m_ped_flagI80 : 1;
|
||||||
|
|
||||||
uint8 stuff10[3];
|
uint8 stuff10[3];
|
||||||
uint8 m_nCreatedBy;
|
uint8 CharCreatedBy;
|
||||||
uint8 field_161;
|
uint8 field_161;
|
||||||
uint8 pad_162[2];
|
uint8 pad_162[2];
|
||||||
eObjective m_objective;
|
eObjective m_objective;
|
||||||
@ -537,6 +540,8 @@ public:
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
PedState GetPedState(void) { return m_nPedState; }
|
||||||
|
void SetPedState(PedState state) { m_nPedState = state; }
|
||||||
|
|
||||||
// to make patching virtual functions possible
|
// to make patching virtual functions possible
|
||||||
void SetModelIndex_(uint32 mi) { CPed::SetModelIndex(mi); }
|
void SetModelIndex_(uint32 mi) { CPed::SetModelIndex(mi); }
|
||||||
|
@ -109,9 +109,9 @@ public:
|
|||||||
// Force actually means Impulse here
|
// Force actually means Impulse here
|
||||||
void ApplyMoveForce(float jx, float jy, float jz);
|
void ApplyMoveForce(float jx, float jy, float jz);
|
||||||
void ApplyMoveForce(const CVector &j) { ApplyMoveForce(j.x, j.y, j.z); }
|
void ApplyMoveForce(const CVector &j) { ApplyMoveForce(j.x, j.y, j.z); }
|
||||||
// v(x,y,z) is direction of force, p(x,y,z) is point relative to model center where force is applied
|
// j(x,y,z) is direction of force, p(x,y,z) is point relative to model center where force is applied
|
||||||
void ApplyTurnForce(float jx, float jy, float jz, float rx, float ry, float rz);
|
void ApplyTurnForce(float jx, float jy, float jz, float px, float py, float pz);
|
||||||
// v is direction of force, p is point relative to model center where force is applied
|
// j is direction of force, p is point relative to model center where force is applied
|
||||||
void ApplyTurnForce(const CVector &j, const CVector &p) { ApplyTurnForce(j.x, j.y, j.z, p.x, p.y, p.z); }
|
void ApplyTurnForce(const CVector &j, const CVector &p) { ApplyTurnForce(j.x, j.y, j.z, p.x, p.y, p.z); }
|
||||||
void ApplyFrictionMoveForce(float jx, float jy, float jz);
|
void ApplyFrictionMoveForce(float jx, float jy, float jz);
|
||||||
void ApplyFrictionMoveForce(const CVector &j) { ApplyFrictionMoveForce(j.x, j.y, j.z); }
|
void ApplyFrictionMoveForce(const CVector &j) { ApplyFrictionMoveForce(j.x, j.y, j.z); }
|
||||||
|
@ -1,9 +1,17 @@
|
|||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
#include "main.h"
|
||||||
#include "patcher.h"
|
#include "patcher.h"
|
||||||
|
#include "Timer.h"
|
||||||
#include "Vehicle.h"
|
#include "Vehicle.h"
|
||||||
#include "Pools.h"
|
#include "Pools.h"
|
||||||
|
#include "HandlingMgr.h"
|
||||||
#include "CarCtrl.h"
|
#include "CarCtrl.h"
|
||||||
|
#include "Population.h"
|
||||||
#include "ModelIndices.h"
|
#include "ModelIndices.h"
|
||||||
|
#include "World.h"
|
||||||
|
#include "Lights.h"
|
||||||
|
#include "PointLights.h"
|
||||||
|
#include "Renderer.h"
|
||||||
#include "DMAudio.h"
|
#include "DMAudio.h"
|
||||||
#include "Radar.h"
|
#include "Radar.h"
|
||||||
|
|
||||||
@ -40,30 +48,238 @@ CVehicle::~CVehicle()
|
|||||||
CCarCtrl::NumAmbulancesOnDuty--;
|
CCarCtrl::NumAmbulancesOnDuty--;
|
||||||
bIsAmbulanceOnDuty = false;
|
bIsAmbulanceOnDuty = false;
|
||||||
}
|
}
|
||||||
if (bIsFiretruckOnDuty){
|
if (bIsFireTruckOnDuty){
|
||||||
CCarCtrl::NumFiretrucksOnDuty--;
|
CCarCtrl::NumFiretrucksOnDuty--;
|
||||||
bIsFiretruckOnDuty = false;
|
bIsFireTruckOnDuty = false;
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
|
||||||
CVehicle::IsLawEnforcementVehicle(void)
|
|
||||||
{
|
|
||||||
switch (m_modelIndex) {
|
|
||||||
case MI_FBICAR:
|
|
||||||
case MI_POLICE:
|
|
||||||
case MI_ENFORCER:
|
|
||||||
case MI_PREDATOR:
|
|
||||||
case MI_RHINO:
|
|
||||||
case MI_BARRACKS:
|
|
||||||
return true;
|
|
||||||
default:
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
CVehicle::ChangeLawEnforcerState(bool enable)
|
CVehicle::SetModelIndex(uint32 id)
|
||||||
|
{
|
||||||
|
CEntity::SetModelIndex(id);
|
||||||
|
m_aExtras[0] = CVehicleModelInfo::ms_compsUsed[0];
|
||||||
|
m_aExtras[1] = CVehicleModelInfo::ms_compsUsed[1];
|
||||||
|
m_nNumMaxPassengers = CVehicleModelInfo::GetMaximumNumberOfPassengersFromNumberOfDoors(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
CVehicle::SetupLighting(void)
|
||||||
|
{
|
||||||
|
ActivateDirectional();
|
||||||
|
SetAmbientColoursForPedsCarsAndObjects();
|
||||||
|
|
||||||
|
if(bRenderScorched){
|
||||||
|
WorldReplaceNormalLightsWithScorched(Scene.world, 0.1f);
|
||||||
|
}else{
|
||||||
|
CVector coors = GetPosition();
|
||||||
|
float lighting = CPointLights::GenerateLightsAffectingObject(&coors);
|
||||||
|
if(!bHasBlip && lighting != 1.0f){
|
||||||
|
SetAmbientAndDirectionalColours(lighting);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CVehicle::RemoveLighting(bool reset)
|
||||||
|
{
|
||||||
|
CRenderer::RemoveVehiclePedLights(this, reset);
|
||||||
|
}
|
||||||
|
|
||||||
|
float
|
||||||
|
CVehicle::GetHeightAboveRoad(void)
|
||||||
|
{
|
||||||
|
return -1.0f * CModelInfo::GetModelInfo(GetModelIndex())->GetColModel()->boundingBox.min.z;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
CVehicle::IsLawEnforcementVehicle(void)
|
||||||
|
{
|
||||||
|
switch(GetModelIndex()){
|
||||||
|
case MI_FBICAR:
|
||||||
|
case MI_POLICE:
|
||||||
|
case MI_ENFORCER:
|
||||||
|
case MI_PREDATOR:
|
||||||
|
case MI_RHINO:
|
||||||
|
case MI_BARRACKS:
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
CVehicle::UsesSiren(uint32 id)
|
||||||
|
{
|
||||||
|
switch(id){
|
||||||
|
case MI_FIRETRUCK:
|
||||||
|
case MI_AMBULAN:
|
||||||
|
case MI_FBICAR:
|
||||||
|
case MI_MRWHOOP:
|
||||||
|
case MI_POLICE:
|
||||||
|
case MI_ENFORCER:
|
||||||
|
case MI_PREDATOR:
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
CVehicle::IsVehicleNormal(void)
|
||||||
|
{
|
||||||
|
if(pDriver && m_nNumPassengers == 0 && m_status != STATUS_WRECKED){
|
||||||
|
switch(GetModelIndex())
|
||||||
|
case MI_FIRETRUCK:
|
||||||
|
case MI_AMBULAN:
|
||||||
|
case MI_TAXI:
|
||||||
|
case MI_POLICE:
|
||||||
|
case MI_ENFORCER:
|
||||||
|
case MI_BUS:
|
||||||
|
case MI_RHINO:
|
||||||
|
case MI_BARRACKS:
|
||||||
|
case MI_DODO:
|
||||||
|
case MI_COACH:
|
||||||
|
case MI_CABBIE:
|
||||||
|
case MI_RCBANDIT:
|
||||||
|
case MI_BORGNINE:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
CVehicle::CarHasRoof(void)
|
||||||
|
{
|
||||||
|
if((m_handling->Flags & HANDLING_HAS_NO_ROOF) == 0)
|
||||||
|
return true;
|
||||||
|
if(m_aExtras[0] && m_aExtras[1])
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
CVehicle::IsUpsideDown(void)
|
||||||
|
{
|
||||||
|
if(GetUp().z > -0.9f)
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
CVehicle::IsOnItsSide(void)
|
||||||
|
{
|
||||||
|
if(GetRight().z < 0.8f && GetRight().z > -0.8f)
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
CVehicle::CanBeDeleted(void)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if(m_nNumGettingIn || m_nGettingOutFlags)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if(pDriver){
|
||||||
|
// This looks like it was inlined
|
||||||
|
if(pDriver->CharCreatedBy == MISSION_CHAR)
|
||||||
|
return false;
|
||||||
|
if(pDriver->GetPedState() != PED_DRIVING &&
|
||||||
|
pDriver->GetPedState() != PED_DEAD)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(i = 0; i < 8; i++){
|
||||||
|
// Same check as above
|
||||||
|
if(pPassengers[i]){
|
||||||
|
if(pPassengers[i]->CharCreatedBy == MISSION_CHAR)
|
||||||
|
return false;
|
||||||
|
if(pPassengers[i]->GetPedState() != PED_DRIVING &&
|
||||||
|
pPassengers[i]->GetPedState() != PED_DEAD)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
// and then again... probably because something was inlined
|
||||||
|
if(pPassengers[i]){
|
||||||
|
if(pPassengers[i]->GetPedState() != PED_DRIVING &&
|
||||||
|
pPassengers[i]->GetPedState() != PED_DEAD)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
switch(VehicleCreatedBy){
|
||||||
|
case RANDOM_VEHICLE: return true;
|
||||||
|
case MISSION_VEHICLE: return false;
|
||||||
|
case PARKED_VEHICLE: return true;
|
||||||
|
case PERMANENT_VEHICLE: return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
CVehicle::CanPedOpenLocks(CPed *ped)
|
||||||
|
{
|
||||||
|
if(m_nDoorLock == CARLOCK_LOCKED ||
|
||||||
|
m_nDoorLock == CARLOCK_COP_CAR ||
|
||||||
|
m_nDoorLock == CARLOCK_LOCKED_PLAYER_INSIDE)
|
||||||
|
return false;
|
||||||
|
if(ped->IsPlayer() && m_nDoorLock == CARLOCK_LOCKOUT_PLAYER_ONLY)
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
CVehicle::CanPedEnterCar(void)
|
||||||
|
{
|
||||||
|
CVector up = GetUp();
|
||||||
|
// can't enter when car is on side
|
||||||
|
if(up.z > 0.1f || up.z < -0.1f){
|
||||||
|
// also when car is moving too fast
|
||||||
|
if(m_vecMoveSpeed.MagnitudeSqr() > sq(0.2f))
|
||||||
|
return false;
|
||||||
|
if(m_vecTurnSpeed.MagnitudeSqr() > sq(0.2f))
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
CVehicle::CanPedExitCar(void)
|
||||||
|
{
|
||||||
|
CVector up = GetUp();
|
||||||
|
if(up.z > 0.1f || up.z < -0.1f){
|
||||||
|
// can't exit when car is moving too fast
|
||||||
|
if(m_vecMoveSpeed.MagnitudeSqr() > 0.005f)
|
||||||
|
return false;
|
||||||
|
// if car is slow enough, check turn speed
|
||||||
|
if(fabs(m_vecTurnSpeed.x) > 0.01f ||
|
||||||
|
fabs(m_vecTurnSpeed.y) > 0.01f ||
|
||||||
|
fabs(m_vecTurnSpeed.z) > 0.01f)
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}else{
|
||||||
|
// What is this? just > replaced by >= ??
|
||||||
|
|
||||||
|
// can't exit when car is moving too fast
|
||||||
|
if(m_vecMoveSpeed.MagnitudeSqr() >= 0.005f)
|
||||||
|
return false;
|
||||||
|
// if car is slow enough, check turn speed
|
||||||
|
if(fabs(m_vecTurnSpeed.x) >= 0.01f ||
|
||||||
|
fabs(m_vecTurnSpeed.y) >= 0.01f ||
|
||||||
|
fabs(m_vecTurnSpeed.z) >= 0.01f)
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CVehicle::ChangeLawEnforcerState(uint8 enable)
|
||||||
{
|
{
|
||||||
if (enable) {
|
if (enable) {
|
||||||
if (!bIsLawEnforcer) {
|
if (!bIsLawEnforcer) {
|
||||||
@ -78,6 +294,111 @@ CVehicle::ChangeLawEnforcerState(bool enable)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CPed*
|
||||||
|
CVehicle::SetUpDriver(void)
|
||||||
|
{
|
||||||
|
if(pDriver)
|
||||||
|
return pDriver;
|
||||||
|
if(VehicleCreatedBy != RANDOM_VEHICLE)
|
||||||
|
return nil;
|
||||||
|
|
||||||
|
pDriver = CPopulation::AddPedInCar(this);
|
||||||
|
pDriver->m_pMyVehicle = this;
|
||||||
|
pDriver->m_pMyVehicle->RegisterReference((CEntity**)&pDriver->m_pMyVehicle);
|
||||||
|
pDriver->bInVehicle = true;
|
||||||
|
pDriver->SetPedState(PED_DRIVING);
|
||||||
|
if(bIsBus)
|
||||||
|
pDriver->m_ped_flagC4 = false;
|
||||||
|
return pDriver;
|
||||||
|
}
|
||||||
|
|
||||||
|
CPed*
|
||||||
|
CVehicle::SetupPassenger(int n)
|
||||||
|
{
|
||||||
|
if(pPassengers[n])
|
||||||
|
return pPassengers[n];
|
||||||
|
|
||||||
|
pPassengers[n] = CPopulation::AddPedInCar(this);
|
||||||
|
pPassengers[n]->m_pMyVehicle = this;
|
||||||
|
pPassengers[n]->m_pMyVehicle->RegisterReference((CEntity**)&pPassengers[n]->m_pMyVehicle);
|
||||||
|
pPassengers[n]->bInVehicle = true;
|
||||||
|
pPassengers[n]->SetPedState(PED_DRIVING);
|
||||||
|
if(bIsBus)
|
||||||
|
pPassengers[n]->m_ped_flagC4 = false;
|
||||||
|
return pPassengers[n];
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CVehicle::SetDriver(CPed *driver)
|
||||||
|
{
|
||||||
|
pDriver = driver;
|
||||||
|
pDriver->RegisterReference((CEntity**)&pDriver);
|
||||||
|
|
||||||
|
if(bFreebies && driver == FindPlayerPed()){
|
||||||
|
if(GetModelIndex() == MI_AMBULAN)
|
||||||
|
FindPlayerPed()->m_fHealth = min(FindPlayerPed()->m_fHealth + 20.0f, 100.0f);
|
||||||
|
else if(GetModelIndex() == MI_TAXI)
|
||||||
|
CWorld::Players[CWorld::PlayerInFocus].m_nMoney += 25;
|
||||||
|
else if(GetModelIndex() == MI_POLICE)
|
||||||
|
driver->GiveWeapon(WEAPONTYPE_SHOTGUN, 5);
|
||||||
|
else if(GetModelIndex() == MI_ENFORCER)
|
||||||
|
driver->m_fArmour = max(driver->m_fArmour, 100.0f);
|
||||||
|
else if(GetModelIndex() == MI_CABBIE || GetModelIndex() == MI_BORGNINE)
|
||||||
|
CWorld::Players[CWorld::PlayerInFocus].m_nMoney += 25;
|
||||||
|
bFreebies = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
ApplyTurnForce(0.0f, 0.0f, -0.2f*driver->m_fMass,
|
||||||
|
driver->GetPosition().x - GetPosition().x,
|
||||||
|
driver->GetPosition().y - GetPosition().y,
|
||||||
|
0.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
CVehicle::AddPassenger(CPed *passenger)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
ApplyTurnForce(0.0f, 0.0f, -0.2f*passenger->m_fMass,
|
||||||
|
passenger->GetPosition().x - GetPosition().x,
|
||||||
|
passenger->GetPosition().y - GetPosition().y,
|
||||||
|
0.0f);
|
||||||
|
|
||||||
|
for(i = 0; i < m_nNumMaxPassengers; i++)
|
||||||
|
if(pPassengers[i] == nil){
|
||||||
|
pPassengers[i] = passenger;
|
||||||
|
m_nNumPassengers++;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
CVehicle::AddPassenger(CPed *passenger, uint8 n)
|
||||||
|
{
|
||||||
|
if(bIsBus)
|
||||||
|
return AddPassenger(passenger);
|
||||||
|
|
||||||
|
ApplyTurnForce(0.0f, 0.0f, -0.2f*passenger->m_fMass,
|
||||||
|
passenger->GetPosition().x - GetPosition().x,
|
||||||
|
passenger->GetPosition().y - GetPosition().y,
|
||||||
|
0.0f);
|
||||||
|
|
||||||
|
if(n < m_nNumMaxPassengers && pPassengers[n] == nil){
|
||||||
|
pPassengers[n] = passenger;
|
||||||
|
m_nNumPassengers++;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CVehicle::RemoveDriver(void)
|
||||||
|
{
|
||||||
|
m_status = STATUS_ABANDONED;
|
||||||
|
pDriver = nil;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
CVehicle::RemovePassenger(CPed *p)
|
CVehicle::RemovePassenger(CPed *p)
|
||||||
{
|
{
|
||||||
@ -101,19 +422,68 @@ CVehicle::RemovePassenger(CPed *p)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
CVehicle::RemoveDriver(void)
|
CVehicle::ProcessCarAlarm(void)
|
||||||
{
|
{
|
||||||
m_status = STATUS_ABANDONED;
|
uint32 step;
|
||||||
pDriver = nil;
|
|
||||||
|
if(m_nAlarmState == 0 || m_nAlarmState == -1)
|
||||||
|
return;
|
||||||
|
|
||||||
|
step = CTimer::GetTimeStep()/50.0f * 1000.0f;
|
||||||
|
if((uint16)m_nAlarmState < step)
|
||||||
|
m_nAlarmState = 0;
|
||||||
|
else
|
||||||
|
m_nAlarmState -= step;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
CVehicle::IsUpsideDown(void)
|
CVehicle::IsSphereTouchingVehicle(float sx, float sy, float sz, float radius)
|
||||||
{
|
{
|
||||||
return GetUp().z <= -0.9f;
|
float x, y, z;
|
||||||
|
// sphere relative to vehicle
|
||||||
|
CVector sph = CVector(sx, sy, sz) - GetPosition();
|
||||||
|
CColModel *colmodel = CModelInfo::GetModelInfo(GetModelIndex())->GetColModel();
|
||||||
|
|
||||||
|
x = DotProduct(sph, GetRight());
|
||||||
|
if(colmodel->boundingBox.min.x - radius > x ||
|
||||||
|
colmodel->boundingBox.max.x + radius < x)
|
||||||
|
return false;
|
||||||
|
y = DotProduct(sph, GetForward());
|
||||||
|
if(colmodel->boundingBox.min.y - radius > y ||
|
||||||
|
colmodel->boundingBox.max.y + radius < y)
|
||||||
|
return false;
|
||||||
|
z = DotProduct(sph, GetUp());
|
||||||
|
if(colmodel->boundingBox.min.z - radius > z ||
|
||||||
|
colmodel->boundingBox.max.z + radius < z)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
STARTPATCHES
|
STARTPATCHES
|
||||||
|
InjectHook(0x551170, &CVehicle::SetModelIndex_, PATCH_JUMP);
|
||||||
|
InjectHook(0x4A7DD0, &CVehicle::SetupLighting_, PATCH_JUMP);
|
||||||
|
InjectHook(0x4A7E60, &CVehicle::RemoveLighting_, PATCH_JUMP);
|
||||||
|
InjectHook(0x417E60, &CVehicle::GetHeightAboveRoad_, PATCH_JUMP);
|
||||||
|
|
||||||
|
InjectHook(0x552880, &CVehicle::IsLawEnforcementVehicle, PATCH_JUMP);
|
||||||
InjectHook(0x552820, &CVehicle::ChangeLawEnforcerState, PATCH_JUMP);
|
InjectHook(0x552820, &CVehicle::ChangeLawEnforcerState, PATCH_JUMP);
|
||||||
|
InjectHook(0x552200, &CVehicle::UsesSiren, PATCH_JUMP);
|
||||||
|
InjectHook(0x5527E0, &CVehicle::IsVehicleNormal, PATCH_JUMP);
|
||||||
|
InjectHook(0x552B70, &CVehicle::CarHasRoof, PATCH_JUMP);
|
||||||
|
InjectHook(0x552230, &CVehicle::IsUpsideDown, PATCH_JUMP);
|
||||||
|
InjectHook(0x552260, &CVehicle::IsOnItsSide, PATCH_JUMP);
|
||||||
|
InjectHook(0x5511B0, &CVehicle::CanBeDeleted, PATCH_JUMP);
|
||||||
|
InjectHook(0x5522A0, &CVehicle::CanPedOpenLocks, PATCH_JUMP);
|
||||||
|
InjectHook(0x5522F0, &CVehicle::CanPedEnterCar, PATCH_JUMP);
|
||||||
|
InjectHook(0x5523C0, &CVehicle::CanPedExitCar, PATCH_JUMP);
|
||||||
|
InjectHook(0x5520C0, &CVehicle::SetUpDriver, PATCH_JUMP);
|
||||||
|
InjectHook(0x552160, &CVehicle::SetupPassenger, PATCH_JUMP);
|
||||||
|
InjectHook(0x551F20, &CVehicle::SetDriver, PATCH_JUMP);
|
||||||
|
InjectHook(0x551D90, (bool (CVehicle::*)(CPed*))&CVehicle::AddPassenger, PATCH_JUMP);
|
||||||
|
InjectHook(0x551E10, (bool (CVehicle::*)(CPed*,uint8))&CVehicle::AddPassenger, PATCH_JUMP);
|
||||||
InjectHook(0x5520A0, &CVehicle::RemoveDriver, PATCH_JUMP);
|
InjectHook(0x5520A0, &CVehicle::RemoveDriver, PATCH_JUMP);
|
||||||
|
InjectHook(0x551EB0, &CVehicle::RemovePassenger, PATCH_JUMP);
|
||||||
|
InjectHook(0x5525A0, &CVehicle::ProcessCarAlarm, PATCH_JUMP);
|
||||||
|
InjectHook(0x552620, &CVehicle::IsSphereTouchingVehicle, PATCH_JUMP);
|
||||||
ENDPATCHES
|
ENDPATCHES
|
@ -7,7 +7,22 @@ class CPed;
|
|||||||
class CFire;
|
class CFire;
|
||||||
struct tHandlingData;
|
struct tHandlingData;
|
||||||
|
|
||||||
enum eCarLock : uint8 {
|
enum {
|
||||||
|
RANDOM_VEHICLE = 1,
|
||||||
|
MISSION_VEHICLE = 2,
|
||||||
|
PARKED_VEHICLE = 3,
|
||||||
|
PERMANENT_VEHICLE = 4,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
enum {
|
||||||
|
GETTING_IN_OUT_FL = 1,
|
||||||
|
GETTING_IN_OUT_RL = 2,
|
||||||
|
GETTING_IN_OUT_FR = 4,
|
||||||
|
GETTING_IN_OUT_RR = 8
|
||||||
|
};
|
||||||
|
|
||||||
|
enum eCarLock {
|
||||||
CARLOCK_NOT_USED,
|
CARLOCK_NOT_USED,
|
||||||
CARLOCK_UNLOCKED,
|
CARLOCK_UNLOCKED,
|
||||||
CARLOCK_LOCKED,
|
CARLOCK_LOCKED,
|
||||||
@ -18,6 +33,84 @@ enum eCarLock : uint8 {
|
|||||||
CARLOCK_SKIP_SHUT_DOORS
|
CARLOCK_SKIP_SHUT_DOORS
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// TODO: where is this used? Is Vehicle.h the right file?
|
||||||
|
enum eVehicleModel
|
||||||
|
{
|
||||||
|
LANDSTAL,
|
||||||
|
IDAHO,
|
||||||
|
STINGER,
|
||||||
|
LINERUN,
|
||||||
|
PEREN,
|
||||||
|
SENTINEL,
|
||||||
|
PATRIOT,
|
||||||
|
FIRETRUK,
|
||||||
|
TRASH,
|
||||||
|
STRETCH,
|
||||||
|
MANANA,
|
||||||
|
INFERNUS,
|
||||||
|
BLISTA,
|
||||||
|
PONY,
|
||||||
|
MULE,
|
||||||
|
CHEETAH,
|
||||||
|
AMBULAN,
|
||||||
|
FBICAR,
|
||||||
|
MOONBEAM,
|
||||||
|
ESPERANT,
|
||||||
|
TAXI,
|
||||||
|
KURUMA,
|
||||||
|
BOBCAT,
|
||||||
|
MRWHOOP,
|
||||||
|
BFINJECT,
|
||||||
|
CORPSE,
|
||||||
|
POLICE,
|
||||||
|
ENFORCER,
|
||||||
|
SECURICA,
|
||||||
|
BANSHEE,
|
||||||
|
PREDATOR,
|
||||||
|
BUS,
|
||||||
|
RHINO,
|
||||||
|
BARRACKS,
|
||||||
|
TRAIN,
|
||||||
|
CHOPPER,
|
||||||
|
DODO,
|
||||||
|
COACH,
|
||||||
|
CABBIE,
|
||||||
|
STALLION,
|
||||||
|
RUMPO,
|
||||||
|
RCBANDIT,
|
||||||
|
BELLYUP,
|
||||||
|
MRWONGS,
|
||||||
|
MAFIA,
|
||||||
|
YARDIE,
|
||||||
|
YAKUZA,
|
||||||
|
DIABLOS,
|
||||||
|
COLUMB,
|
||||||
|
HOODS,
|
||||||
|
AIRTRAIN,
|
||||||
|
DEADDODO,
|
||||||
|
SPEEDER,
|
||||||
|
REEFER,
|
||||||
|
PANLANT,
|
||||||
|
FLATBED,
|
||||||
|
YANKEE,
|
||||||
|
ESCAPE,
|
||||||
|
BORGNINE,
|
||||||
|
TOYZ,
|
||||||
|
GHOST,
|
||||||
|
CAR151,
|
||||||
|
CAR152,
|
||||||
|
CAR153,
|
||||||
|
CAR154,
|
||||||
|
CAR155,
|
||||||
|
CAR156,
|
||||||
|
CAR157,
|
||||||
|
CAR158,
|
||||||
|
CAR159,
|
||||||
|
};
|
||||||
|
|
||||||
|
enum eDoors {
|
||||||
|
};
|
||||||
|
|
||||||
class CVehicle : public CPhysical
|
class CVehicle : public CPhysical
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -26,7 +119,7 @@ public:
|
|||||||
CAutoPilot m_autoPilot;
|
CAutoPilot m_autoPilot;
|
||||||
uint8 m_currentColour1;
|
uint8 m_currentColour1;
|
||||||
uint8 m_currentColour2;
|
uint8 m_currentColour2;
|
||||||
uint8 m_anExtras[2];
|
uint8 m_aExtras[2];
|
||||||
int16 m_nAlarmState; // m_nWantedStarsOnEnter on DK22
|
int16 m_nAlarmState; // m_nWantedStarsOnEnter on DK22
|
||||||
int16 m_nMissionValue;
|
int16 m_nMissionValue;
|
||||||
CPed *pDriver;
|
CPed *pDriver;
|
||||||
@ -42,23 +135,27 @@ public:
|
|||||||
float m_fSteerAngle;
|
float m_fSteerAngle;
|
||||||
float m_fGasPedal;
|
float m_fGasPedal;
|
||||||
float m_fBreakPedal;
|
float m_fBreakPedal;
|
||||||
uint8 m_nCreatedBy; // eVehicleCreatedBy
|
uint8 VehicleCreatedBy;
|
||||||
uint8 bIsLawEnforcer : 1;
|
|
||||||
uint8 bIsAmbulanceOnDuty : 1;
|
// cf. https://github.com/DK22Pac/plugin-sdk/blob/master/plugin_sa/game_sa/CVehicle.h from R*
|
||||||
uint8 bIsFiretruckOnDuty : 1;
|
uint8 bIsLawEnforcer: 1; // Is this guy chasing the player at the moment
|
||||||
uint8 m_veh_flagA8 : 1;
|
uint8 bIsAmbulanceOnDuty: 1; // Ambulance trying to get to an accident
|
||||||
uint8 m_veh_flagA10 : 1;
|
uint8 bIsFireTruckOnDuty: 1; // Firetruck trying to get to a fire
|
||||||
uint8 m_veh_flagA20 : 1;
|
uint8 bIsLocked: 1; // Is this guy locked by the script (cannot be removed)
|
||||||
uint8 m_veh_flagA40 : 1;
|
uint8 bEngineOn: 1; // For sound purposes. Parked cars have their engines switched off (so do destroyed cars)
|
||||||
uint8 m_veh_flagA80 : 1;
|
uint8 bIsHandbrakeOn: 1; // How's the handbrake doing ?
|
||||||
uint8 bIsVan : 1;
|
uint8 bLightsOn: 1; // Are the lights switched on ?
|
||||||
uint8 bIsBus : 1;
|
uint8 bFreebies: 1; // Any freebies left in this vehicle ?
|
||||||
uint8 bIsBig : 1;
|
|
||||||
uint8 bIsLow : 1;
|
uint8 bIsVan: 1; // Is this vehicle a van (doors at back of vehicle)
|
||||||
|
uint8 bIsBus: 1; // Is this vehicle a bus
|
||||||
|
uint8 bIsBig: 1; // Is this vehicle a bus
|
||||||
|
uint8 bLowVehicle: 1; // Need this for sporty type cars to use low getting-in/out anims
|
||||||
uint8 m_veh_flagB10 : 1;
|
uint8 m_veh_flagB10 : 1;
|
||||||
uint8 m_veh_flagB20 : 1;
|
uint8 m_veh_flagB20 : 1;
|
||||||
uint8 m_veh_flagB40 : 1;
|
uint8 m_veh_flagB40 : 1;
|
||||||
uint8 m_veh_flagB80 : 1;
|
uint8 m_veh_flagB80 : 1;
|
||||||
|
|
||||||
uint8 m_veh_flagC1 : 1;
|
uint8 m_veh_flagC1 : 1;
|
||||||
uint8 m_veh_flagC2 : 1;
|
uint8 m_veh_flagC2 : 1;
|
||||||
uint8 m_veh_flagC4 : 1;
|
uint8 m_veh_flagC4 : 1;
|
||||||
@ -67,6 +164,7 @@ public:
|
|||||||
uint8 m_veh_flagC20 : 1;
|
uint8 m_veh_flagC20 : 1;
|
||||||
uint8 m_veh_flagC40 : 1;
|
uint8 m_veh_flagC40 : 1;
|
||||||
uint8 m_veh_flagC80 : 1;
|
uint8 m_veh_flagC80 : 1;
|
||||||
|
|
||||||
uint8 m_veh_flagD1 : 1;
|
uint8 m_veh_flagD1 : 1;
|
||||||
uint8 m_veh_flagD2 : 1;
|
uint8 m_veh_flagD2 : 1;
|
||||||
uint8 m_veh_flagD4 : 1;
|
uint8 m_veh_flagD4 : 1;
|
||||||
@ -75,8 +173,9 @@ public:
|
|||||||
uint8 m_veh_flagD20 : 1;
|
uint8 m_veh_flagD20 : 1;
|
||||||
uint8 m_veh_flagD40 : 1;
|
uint8 m_veh_flagD40 : 1;
|
||||||
uint8 m_veh_flagD80 : 1;
|
uint8 m_veh_flagD80 : 1;
|
||||||
|
|
||||||
int8 field_1F9;
|
int8 field_1F9;
|
||||||
uint8 m_nAmmoInClip[1]; // Used to make the guns on boat do a reload (20 by default)
|
uint8 m_nAmmoInClip; // Used to make the guns on boat do a reload (20 by default)
|
||||||
int8 field_1FB;
|
int8 field_1FB;
|
||||||
int8 field_1FC[4];
|
int8 field_1FC[4];
|
||||||
float m_fHealth; // 1000.0f = full health. 0 -> explode
|
float m_fHealth; // 1000.0f = full health. 0 -> explode
|
||||||
@ -99,6 +198,7 @@ public:
|
|||||||
int8 field_22D;
|
int8 field_22D;
|
||||||
uint8 m_nSirenOrAlarm;
|
uint8 m_nSirenOrAlarm;
|
||||||
int8 field_22F;
|
int8 field_22F;
|
||||||
|
// TODO: this is an array
|
||||||
CStoredCollPoly m_frontCollPoly; // poly which is under front part of car
|
CStoredCollPoly m_frontCollPoly; // poly which is under front part of car
|
||||||
CStoredCollPoly m_rearCollPoly; // poly which is under rear part of car
|
CStoredCollPoly m_rearCollPoly; // poly which is under rear part of car
|
||||||
float m_fSteerRatio;
|
float m_fSteerRatio;
|
||||||
@ -110,8 +210,29 @@ public:
|
|||||||
static void operator delete(void*, int);
|
static void operator delete(void*, int);
|
||||||
|
|
||||||
~CVehicle(void);
|
~CVehicle(void);
|
||||||
|
// from CEntity
|
||||||
|
void SetModelIndex(uint32 i);
|
||||||
|
bool SetupLighting(void);
|
||||||
|
void RemoveLighting(bool);
|
||||||
|
void FlagToDestroyWhenNextProcessed(void) {}
|
||||||
|
|
||||||
void dtor(void) { this->CVehicle::~CVehicle(); }
|
virtual void ProcessControlInputs(uint8) {}
|
||||||
|
virtual void GetComponentWorldPosition(int32 component, CVector &pos) {}
|
||||||
|
virtual bool IsComponentPresent(int32 component) { return false; }
|
||||||
|
virtual void SetComponentRotation(int32 component, CVector rotation) {}
|
||||||
|
virtual void OpenDoor(int32, eDoors door, float) {}
|
||||||
|
virtual void ProcessOpenDoor(uint32, uint32, float) {}
|
||||||
|
virtual bool IsDoorReady(eDoors door) { return false; }
|
||||||
|
virtual bool IsDoorFullyOpen(eDoors door) { return false; }
|
||||||
|
virtual bool IsDoorClosed(eDoors door) { return false; }
|
||||||
|
virtual bool IsDoorMissing(eDoors door) { return false; }
|
||||||
|
virtual void RemoveRefsToVehicle(CEntity *ent) {}
|
||||||
|
virtual void BlowUpCar(CEntity *ent) {}
|
||||||
|
virtual bool SetUpWheelColModel(CColModel *colModel) { return false; }
|
||||||
|
virtual void BurstTyre(uint8 tyre) {}
|
||||||
|
virtual bool IsRoomForPedToLeaveCar(uint32, CVector *) { return false;}
|
||||||
|
virtual float GetHeightAboveRoad(void);
|
||||||
|
virtual void PlayCarHorn(void) {}
|
||||||
|
|
||||||
bool IsCar(void) { return m_vehType == VEHICLE_TYPE_CAR; }
|
bool IsCar(void) { return m_vehType == VEHICLE_TYPE_CAR; }
|
||||||
bool IsBoat(void) { return m_vehType == VEHICLE_TYPE_BOAT; }
|
bool IsBoat(void) { return m_vehType == VEHICLE_TYPE_BOAT; }
|
||||||
@ -119,10 +240,26 @@ public:
|
|||||||
bool IsHeli(void) { return m_vehType == VEHICLE_TYPE_HELI; }
|
bool IsHeli(void) { return m_vehType == VEHICLE_TYPE_HELI; }
|
||||||
bool IsPlane(void) { return m_vehType == VEHICLE_TYPE_PLANE; }
|
bool IsPlane(void) { return m_vehType == VEHICLE_TYPE_PLANE; }
|
||||||
bool IsLawEnforcementVehicle(void);
|
bool IsLawEnforcementVehicle(void);
|
||||||
void ChangeLawEnforcerState(bool enable);
|
void ChangeLawEnforcerState(uint8 enable);
|
||||||
void RemovePassenger(CPed *);
|
bool UsesSiren(uint32 id);
|
||||||
void RemoveDriver(void);
|
bool IsVehicleNormal(void);
|
||||||
|
bool CarHasRoof(void);
|
||||||
bool IsUpsideDown(void);
|
bool IsUpsideDown(void);
|
||||||
|
bool IsOnItsSide(void);
|
||||||
|
bool CanBeDeleted(void);
|
||||||
|
bool CanPedOpenLocks(CPed *ped);
|
||||||
|
bool CanPedEnterCar(void);
|
||||||
|
bool CanPedExitCar(void);
|
||||||
|
// do these two actually return something?
|
||||||
|
CPed *SetUpDriver(void);
|
||||||
|
CPed *SetupPassenger(int n);
|
||||||
|
void SetDriver(CPed *driver);
|
||||||
|
bool AddPassenger(CPed *passenger);
|
||||||
|
bool AddPassenger(CPed *passenger, uint8 n);
|
||||||
|
void RemovePassenger(CPed *passenger);
|
||||||
|
void RemoveDriver(void);
|
||||||
|
void ProcessCarAlarm(void);
|
||||||
|
bool IsSphereTouchingVehicle(float sx, float sy, float sz, float radius);
|
||||||
|
|
||||||
static bool &bWheelsOnlyCheat;
|
static bool &bWheelsOnlyCheat;
|
||||||
static bool &bAllDodosCheat;
|
static bool &bAllDodosCheat;
|
||||||
@ -130,8 +267,16 @@ public:
|
|||||||
static bool &bCheat4;
|
static bool &bCheat4;
|
||||||
static bool &bCheat5;
|
static bool &bCheat5;
|
||||||
static bool &m_bDisableMouseSteering;
|
static bool &m_bDisableMouseSteering;
|
||||||
|
|
||||||
|
|
||||||
|
void dtor(void) { CVehicle::~CVehicle(); }
|
||||||
|
void SetModelIndex_(uint32 id) { CVehicle::SetModelIndex(id); }
|
||||||
|
bool SetupLighting_(void) { return CVehicle::SetupLighting(); }
|
||||||
|
void RemoveLighting_(bool reset) { CVehicle::RemoveLighting(reset); }
|
||||||
|
float GetHeightAboveRoad_(void) { return CVehicle::GetHeightAboveRoad(); }
|
||||||
};
|
};
|
||||||
|
|
||||||
static_assert(sizeof(CVehicle) == 0x288, "CVehicle: error");
|
static_assert(sizeof(CVehicle) == 0x288, "CVehicle: error");
|
||||||
static_assert(offsetof(CVehicle, m_pCurSurface) == 0x1E0, "CVehicle: error");
|
static_assert(offsetof(CVehicle, m_pCurSurface) == 0x1E0, "CVehicle: error");
|
||||||
static_assert(offsetof(CVehicle, m_nAlarmState) == 0x1A0, "CVehicle: error");
|
static_assert(offsetof(CVehicle, m_nAlarmState) == 0x1A0, "CVehicle: error");
|
||||||
|
static_assert(offsetof(CVehicle, m_nLastWeaponDamage) == 0x228, "CVehicle: error");
|
||||||
|
@ -250,10 +250,9 @@ enum
|
|||||||
MI_BUSKER2,
|
MI_BUSKER2,
|
||||||
MI_BUSKER3,
|
MI_BUSKER3,
|
||||||
MI_BUSKER4,
|
MI_BUSKER4,
|
||||||
MI_PED87,
|
// three more peds possible
|
||||||
MI_PED88,
|
|
||||||
MI_PED89,
|
MI_LANDSTAL = 90,
|
||||||
MI_LANDSTAL,
|
|
||||||
MI_IDAHO,
|
MI_IDAHO,
|
||||||
MI_STINGER,
|
MI_STINGER,
|
||||||
MI_LINERUN,
|
MI_LINERUN,
|
||||||
|
Loading…
Reference in New Issue
Block a user