CShotInfo, CWanted done, Frontend fix
This commit is contained in:
@@ -7,19 +7,16 @@
|
||||
#include "ZoneCull.h"
|
||||
#include "Darkel.h"
|
||||
#include "DMAudio.h"
|
||||
#include "CopPed.h"
|
||||
#include "Wanted.h"
|
||||
#include "General.h"
|
||||
|
||||
int32 &CWanted::MaximumWantedLevel = *(int32*)0x5F7714; // 6
|
||||
int32 &CWanted::nMaximumWantedLevel = *(int32*)0x5F7718; // 6400
|
||||
|
||||
WRAPPER void CWanted::Reset() { EAXJMP(0x4AD790) };
|
||||
WRAPPER void CWanted::Update() { EAXJMP(0x4AD7B0) };
|
||||
|
||||
void
|
||||
CWanted::Initialise()
|
||||
{
|
||||
int i;
|
||||
|
||||
m_nChaos = 0;
|
||||
m_nLastUpdateTime = 0;
|
||||
m_nLastWantedLevelChange = 0;
|
||||
@@ -34,10 +31,12 @@ CWanted::Initialise()
|
||||
m_bArmyRequired = false;
|
||||
m_fCrimeSensitivity = 1.0f;
|
||||
m_nWantedLevel = 0;
|
||||
m_CopsBeatingSuspect = 0;
|
||||
for(i = 0; i < 10; i++)
|
||||
m_CopsBeatingSuspect = 0;
|
||||
|
||||
for (int i = 0; i < ARRAY_SIZE(m_pCops); i++)
|
||||
m_pCops[i] = nil;
|
||||
ClearQdCrimes();
|
||||
|
||||
ClearQdCrimes();
|
||||
}
|
||||
|
||||
bool
|
||||
@@ -61,7 +60,7 @@ CWanted::AreArmyRequired()
|
||||
int32
|
||||
CWanted::NumOfHelisRequired()
|
||||
{
|
||||
if (m_bIgnoredByCops)
|
||||
if (m_bIgnoredByCops || m_bIgnoredByEveryone)
|
||||
return 0;
|
||||
|
||||
switch (m_nWantedLevel) {
|
||||
@@ -79,9 +78,10 @@ CWanted::NumOfHelisRequired()
|
||||
void
|
||||
CWanted::SetWantedLevel(int32 level)
|
||||
{
|
||||
ClearQdCrimes();
|
||||
if (level > MaximumWantedLevel)
|
||||
level = MaximumWantedLevel;
|
||||
|
||||
ClearQdCrimes();
|
||||
switch (level) {
|
||||
case 0:
|
||||
m_nChaos = 0;
|
||||
@@ -360,10 +360,107 @@ CWanted::WorkOutPolicePresence(CVector posn, float radius)
|
||||
return numPolice;
|
||||
}
|
||||
|
||||
void
|
||||
CWanted::Update(void)
|
||||
{
|
||||
if (CTimer::GetTimeInMilliseconds() - m_nLastUpdateTime > 1000) {
|
||||
if (m_nWantedLevel > 1) {
|
||||
m_nLastUpdateTime = CTimer::GetTimeInMilliseconds();
|
||||
} else {
|
||||
float radius = 18.0f;
|
||||
CVector playerPos = FindPlayerCoors();
|
||||
if (WorkOutPolicePresence(playerPos, radius) == 0) {
|
||||
m_nLastUpdateTime = CTimer::GetTimeInMilliseconds();
|
||||
m_nChaos = max(0, m_nChaos - 1);
|
||||
UpdateWantedLevel();
|
||||
}
|
||||
}
|
||||
UpdateCrimesQ();
|
||||
bool orderMessedUp = false;
|
||||
int currCopNum = 0;
|
||||
bool foundEmptySlot = false;
|
||||
for (int i = 0; i < ARRAY_SIZE(m_pCops); i++) {
|
||||
if (m_pCops[i]) {
|
||||
++currCopNum;
|
||||
if (foundEmptySlot)
|
||||
orderMessedUp = true;
|
||||
} else {
|
||||
foundEmptySlot = true;
|
||||
}
|
||||
}
|
||||
if (currCopNum != m_CurrentCops) {
|
||||
printf("CopPursuit total messed up: re-setting\n");
|
||||
m_CurrentCops = currCopNum;
|
||||
}
|
||||
if (orderMessedUp) {
|
||||
printf("CopPursuit pointer list messed up: re-sorting\n");
|
||||
bool fixed = true;
|
||||
for (int i = 0; i < ARRAY_SIZE(m_pCops); i++) {
|
||||
if (!m_pCops[i]) {
|
||||
for (int j = i; j < ARRAY_SIZE(m_pCops); j++) {
|
||||
if (m_pCops[j]) {
|
||||
m_pCops[i] = m_pCops[j];
|
||||
m_pCops[j] = nil;
|
||||
fixed = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (fixed)
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
CWanted::ResetPolicePursuit(void)
|
||||
{
|
||||
for(int i = 0; i < ARRAY_SIZE(m_pCops); i++) {
|
||||
CCopPed *cop = m_pCops[i];
|
||||
if (!cop)
|
||||
continue;
|
||||
|
||||
cop->m_bIsInPursuit = false;
|
||||
cop->m_objective = OBJECTIVE_NONE;
|
||||
cop->m_prevObjective = OBJECTIVE_NONE;
|
||||
cop->m_nLastPedState = PED_NONE;
|
||||
if (!cop->DyingOrDead()) {
|
||||
cop->SetWanderPath(CGeneral::GetRandomNumberInRange(0.0f, 8.0f));
|
||||
}
|
||||
m_pCops[i] = nil;
|
||||
}
|
||||
m_CurrentCops = 0;
|
||||
}
|
||||
|
||||
void
|
||||
CWanted::Reset(void)
|
||||
{
|
||||
ResetPolicePursuit();
|
||||
Initialise();
|
||||
}
|
||||
|
||||
void
|
||||
CWanted::UpdateCrimesQ(void)
|
||||
{
|
||||
for(int i = 0; i < ARRAY_SIZE(m_aCrimes); i++) {
|
||||
|
||||
CCrimeBeingQd &crime = m_aCrimes[i];
|
||||
if (crime.m_nType != CRIME_NONE) {
|
||||
if (CTimer::GetTimeInMilliseconds() > crime.m_nTime + 500 && !crime.m_bReported) {
|
||||
ReportCrimeNow(crime.m_nType, crime.m_vecPosn, crime.m_bPoliceDoesntCare);
|
||||
crime.m_bReported = true;
|
||||
}
|
||||
if (CTimer::GetTimeInMilliseconds() > crime.m_nTime + 10000)
|
||||
crime.m_nType = CRIME_NONE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
STARTPATCHES
|
||||
InjectHook(0x4AD6E0, &CWanted::Initialise, PATCH_JUMP);
|
||||
// InjectHook(0x4AD790, &CWanted::Reset, PATCH_JUMP);
|
||||
// InjectHook(0x4AD7B0, &CWanted::Update, PATCH_JUMP);
|
||||
InjectHook(0x4AD790, &CWanted::Reset, PATCH_JUMP);
|
||||
InjectHook(0x4AD7B0, &CWanted::Update, PATCH_JUMP);
|
||||
InjectHook(0x4AD900, &CWanted::UpdateWantedLevel, PATCH_JUMP);
|
||||
InjectHook(0x4AD9F0, &CWanted::RegisterCrime, PATCH_JUMP);
|
||||
InjectHook(0x4ADA10, &CWanted::RegisterCrime_Immediately, PATCH_JUMP);
|
||||
@@ -374,10 +471,10 @@ STARTPATCHES
|
||||
InjectHook(0x4ADBC0, &CWanted::AreFbiRequired, PATCH_JUMP);
|
||||
InjectHook(0x4ADBE0, &CWanted::AreArmyRequired, PATCH_JUMP);
|
||||
InjectHook(0x4ADC00, &CWanted::NumOfHelisRequired, PATCH_JUMP);
|
||||
// InjectHook(0x4ADC40, &CWanted::ResetPolicePursuit, PATCH_JUMP);
|
||||
InjectHook(0x4ADC40, &CWanted::ResetPolicePursuit, PATCH_JUMP);
|
||||
InjectHook(0x4ADD00, &CWanted::WorkOutPolicePresence, PATCH_JUMP);
|
||||
InjectHook(0x4ADF20, &CWanted::ClearQdCrimes, PATCH_JUMP);
|
||||
InjectHook(0x4ADFD0, &CWanted::AddCrimeToQ, PATCH_JUMP);
|
||||
// InjectHook(0x4AE090, &CWanted::UpdateCrimesQ, PATCH_JUMP);
|
||||
InjectHook(0x4AE090, &CWanted::UpdateCrimesQ, PATCH_JUMP);
|
||||
InjectHook(0x4AE110, &CWanted::ReportCrimeNow, PATCH_JUMP);
|
||||
ENDPATCHES
|
||||
|
||||
Reference in New Issue
Block a user