From bbc68ffb1c9cc55844f4130e15af75042a0384eb Mon Sep 17 00:00:00 2001 From: Sergeanur Date: Sat, 11 Jan 2020 14:50:11 +0200 Subject: AccidentManager --- src/core/Accident.cpp | 101 +++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 88 insertions(+), 13 deletions(-) (limited to 'src/core/Accident.cpp') diff --git a/src/core/Accident.cpp b/src/core/Accident.cpp index a42280b7..d8313ddc 100644 --- a/src/core/Accident.cpp +++ b/src/core/Accident.cpp @@ -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); } +CAccident* +CAccidentManager::GetNextFreeAccident() +{ + for (int i = 0; i < NUM_ACCIDENTS; i++) { + if (m_aAccidents[i].m_pVictim == nil) + return &m_aAccidents[i]; + } -uint16 -CAccidentManager::CountActiveAccidents() + return nil; +} + +void +CAccidentManager::ReportAccident(CPed *ped) { - uint16 accidents = 0; - for (int i = 0; i < NUM_ACCIDENTS; i++){ - if (m_aAccidents[i].m_pVictim) - accidents++; + 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; -} \ No newline at end of file +} + +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 -- cgit v1.2.3