AccidentManager

This commit is contained in:
Sergeanur 2020-01-11 14:50:11 +02:00
parent 8fab684283
commit bbc68ffb1c
7 changed files with 98 additions and 21 deletions

View File

@ -39,7 +39,6 @@ to reverse at the time, calling the original functions is acceptable.
### Unreversed / incomplete classes (at least the ones we know)
```
CAudioManager, cDMAudio, cSampleManager and all audio - being worked on
CAccidentManager
CBoat
CBrightLights
CBulletInfo

View File

@ -2,7 +2,7 @@
#include "patcher.h"
#include "CarAI.h"
#include "AccidentManager.h"
#include "Accident.h"
#include "AutoPilot.h"
#include "CarCtrl.h"
#include "General.h"

View File

@ -2,7 +2,7 @@
#include "patcher.h"
#include "CarCtrl.h"
#include "AccidentManager.h"
#include "Accident.h"
#include "Automobile.h"
#include "Camera.h"
#include "CarAI.h"

View File

@ -1,26 +1,70 @@
#include "common.h"
#include "patcher.h"
#include "AccidentManager.h"
#include "Accident.h"
#include "Ped.h"
#include "Pools.h"
#include "World.h"
CAccidentManager& gAccidentManager = *(CAccidentManager*)0x87FD10;
WRAPPER void CAccidentManager::Update(void) { EAXJMP(0x456710); }
uint16
CAccidentManager::CountActiveAccidents()
CAccident*
CAccidentManager::GetNextFreeAccident()
{
uint16 accidents = 0;
for (int i = 0; i < NUM_ACCIDENTS; i++){
if (m_aAccidents[i].m_pVictim)
accidents++;
for (int i = 0; i < NUM_ACCIDENTS; i++) {
if (m_aAccidents[i].m_pVictim == nil)
return &m_aAccidents[i];
}
return nil;
}
void
CAccidentManager::ReportAccident(CPed *ped)
{
if (!ped->IsPlayer() && ped->CharCreatedBy != MISSION_CHAR && !ped->bRenderScorched && !ped->bBodyPartJustCameOff && ped->bAllowMedicsToReviveMe && !ped->bIsInWater) {
for (int i = 0; i < NUM_ACCIDENTS; i++) {
if (m_aAccidents[i].m_pVictim != nil && m_aAccidents[i].m_pVictim == ped)
return;
}
if (ped->m_pCurrentPhysSurface == nil) {
CVector point = ped->GetPosition();
point.z -= 2.0f;
CColPoint colPoint;
CEntity *pEntity;
if (!CWorld::ProcessVerticalLine(point, -100.0f, colPoint, pEntity, true, false, false, false, false, false, nil)) {
CAccident *accident = GetNextFreeAccident();
if (accident != nil) {
accident->m_pVictim = ped;
ped->RegisterReference((CEntity**)&accident->m_pVictim);
accident->m_nMedicsPerformingCPR = 0;
accident->m_nMedicsAttending = 0;
ped->m_lastAccident = accident;
WorkToDoForMedics();
}
}
}
}
}
void
CAccidentManager::Update()
{
int32 e;
if (CEventList::GetEvent(EVENT_INJURED_PED, &e)) {
CPed *ped = CPools::GetPed(gaEvent[e].entityRef);
if (ped) {
ReportAccident(ped);
CEventList::ClearEvent(e);
}
}
return accidents;
}
CAccident*
CAccidentManager::FindNearestAccident(CVector vecPos, float* pDistance)
CAccidentManager::FindNearestAccident(CVector vecPos, float *pDistance)
{
for (int i = 0; i < MAX_MEDICS_TO_ATTEND_ACCIDENT; i++){
int accidentId = -1;
@ -48,12 +92,43 @@ CAccidentManager::FindNearestAccident(CVector vecPos, float* pDistance)
return nil;
}
uint16
CAccidentManager::CountActiveAccidents()
{
uint16 accidents = 0;
for (int i = 0; i < NUM_ACCIDENTS; i++) {
if (m_aAccidents[i].m_pVictim)
accidents++;
}
return accidents;
}
bool
CAccidentManager::UnattendedAccidents(void)
CAccidentManager::WorkToDoForMedics()
{
for (int i = 0; i < NUM_ACCIDENTS; i++) {
if (m_aAccidents[i].m_pVictim && m_aAccidents[i].m_nMedicsAttending == 0)
if (m_aAccidents[i].m_pVictim != nil && m_aAccidents[i].m_nMedicsAttending < MAX_MEDICS_TO_ATTEND_ACCIDENT)
return true;
}
return false;
}
}
bool
CAccidentManager::UnattendedAccidents()
{
for (int i = 0; i < NUM_ACCIDENTS; i++) {
if (m_aAccidents[i].m_pVictim != nil && m_aAccidents[i].m_nMedicsAttending == 0)
return true;
}
return false;
}
STARTPATCHES
InjectHook(0x4565A0, &CAccidentManager::GetNextFreeAccident, PATCH_JUMP);
InjectHook(0x4565D0, &CAccidentManager::ReportAccident, PATCH_JUMP);
InjectHook(0x456710, &CAccidentManager::Update, PATCH_JUMP);
InjectHook(0x456760, &CAccidentManager::FindNearestAccident, PATCH_JUMP);
InjectHook(0x456880, &CAccidentManager::CountActiveAccidents, PATCH_JUMP);
InjectHook(0x4568A0, &CAccidentManager::WorkToDoForMedics, PATCH_JUMP);
InjectHook(0x4568D0, &CAccidentManager::UnattendedAccidents, PATCH_JUMP);
ENDPATCHES

View File

@ -20,10 +20,13 @@ class CAccidentManager
MAX_MEDICS_TO_ATTEND_ACCIDENT = 2
};
public:
CAccident *GetNextFreeAccident();
void ReportAccident(CPed *ped);
void Update();
CAccident *FindNearestAccident(CVector vecPos, float *pDistance);
uint16 CountActiveAccidents();
bool UnattendedAccidents();
CAccident* FindNearestAccident(CVector, float*);
void Update(void);
bool WorkToDoForMedics();
};
extern CAccidentManager& gAccidentManager;

View File

@ -2,7 +2,7 @@
#include "patcher.h"
#include "Game.h"
#include "main.h"
#include "AccidentManager.h"
#include "Accident.h"
#include "Antennas.h"
#include "Bridge.h"
#include "Camera.h"

View File

@ -6,7 +6,7 @@
#include "Fire.h"
#include "General.h"
#include "CarCtrl.h"
#include "AccidentManager.h"
#include "Accident.h"
CEmergencyPed::CEmergencyPed(uint32 type) : CPed(type)
{