summaryrefslogtreecommitdiffstats
path: root/src/core
diff options
context:
space:
mode:
Diffstat (limited to 'src/core')
-rw-r--r--src/core/Accident.cpp14
-rw-r--r--src/core/Accident.h2
-rw-r--r--src/core/AnimViewer.cpp2
-rw-r--r--src/core/Cam.cpp56
-rw-r--r--src/core/Camera.cpp63
-rw-r--r--src/core/Camera.h6
-rw-r--r--src/core/CdStream.cpp23
-rw-r--r--src/core/Clock.cpp33
-rw-r--r--src/core/Clock.h18
-rw-r--r--src/core/Collision.cpp69
-rw-r--r--src/core/ControllerConfig.cpp58
-rw-r--r--src/core/ControllerConfig.h2
-rw-r--r--src/core/Directory.cpp9
-rw-r--r--src/core/EventList.cpp14
-rw-r--r--src/core/FileLoader.cpp42
-rw-r--r--src/core/FileMgr.cpp22
-rw-r--r--src/core/FileMgr.h4
-rw-r--r--src/core/Fire.cpp22
-rw-r--r--src/core/Fire.h2
-rw-r--r--src/core/Frontend.cpp22
-rw-r--r--src/core/Game.cpp41
-rw-r--r--src/core/Game.h16
-rw-r--r--src/core/IniFile.cpp6
-rw-r--r--src/core/Pad.cpp144
-rw-r--r--src/core/Pad.h22
-rw-r--r--src/core/Placeable.cpp20
-rw-r--r--src/core/PlayerInfo.cpp19
-rw-r--r--src/core/Pools.cpp36
-rw-r--r--src/core/Pools.h18
-rw-r--r--src/core/Radar.cpp94
-rw-r--r--src/core/References.cpp12
-rw-r--r--src/core/References.h4
-rw-r--r--src/core/Stats.cpp116
-rw-r--r--src/core/Stats.h106
-rw-r--r--src/core/Streaming.cpp165
-rw-r--r--src/core/Streaming.h56
-rw-r--r--src/core/SurfaceTable.cpp11
-rw-r--r--src/core/SurfaceTable.h3
-rw-r--r--src/core/TempColModels.cpp32
-rw-r--r--src/core/TempColModels.h26
-rw-r--r--src/core/TimeStep.cpp6
-rw-r--r--src/core/TimeStep.h6
-rw-r--r--src/core/Timer.cpp55
-rw-r--r--src/core/Timer.h20
-rw-r--r--src/core/User.cpp23
-rw-r--r--src/core/User.h8
-rw-r--r--src/core/Wanted.cpp28
-rw-r--r--src/core/Wanted.h4
-rw-r--r--src/core/World.cpp2011
-rw-r--r--src/core/World.h62
-rw-r--r--src/core/ZoneCull.cpp44
-rw-r--r--src/core/ZoneCull.h28
-rw-r--r--src/core/Zones.cpp57
-rw-r--r--src/core/Zones.h22
-rw-r--r--src/core/config.h1
-rw-r--r--src/core/main.cpp44
-rw-r--r--src/core/main.h16
-rw-r--r--src/core/re3.cpp44
58 files changed, 1987 insertions, 1922 deletions
diff --git a/src/core/Accident.cpp b/src/core/Accident.cpp
index d8313ddc..1fd6c123 100644
--- a/src/core/Accident.cpp
+++ b/src/core/Accident.cpp
@@ -1,12 +1,12 @@
#include "common.h"
-#include "patcher.h"
+
#include "Accident.h"
#include "Ped.h"
#include "Pools.h"
#include "World.h"
-CAccidentManager& gAccidentManager = *(CAccidentManager*)0x87FD10;
+CAccidentManager gAccidentManager;
CAccident*
CAccidentManager::GetNextFreeAccident()
@@ -122,13 +122,3 @@ CAccidentManager::UnattendedAccidents()
}
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
diff --git a/src/core/Accident.h b/src/core/Accident.h
index 69889645..949d5fb9 100644
--- a/src/core/Accident.h
+++ b/src/core/Accident.h
@@ -29,4 +29,4 @@ public:
bool WorkToDoForMedics();
};
-extern CAccidentManager& gAccidentManager; \ No newline at end of file
+extern CAccidentManager gAccidentManager; \ No newline at end of file
diff --git a/src/core/AnimViewer.cpp b/src/core/AnimViewer.cpp
index 1086db20..20e94bf4 100644
--- a/src/core/AnimViewer.cpp
+++ b/src/core/AnimViewer.cpp
@@ -1,5 +1,5 @@
#include "common.h"
-#include "patcher.h"
+
#include "Font.h"
#include "Pad.h"
#include "Text.h"
diff --git a/src/core/Cam.cpp b/src/core/Cam.cpp
index cfdea46a..07dc2051 100644
--- a/src/core/Cam.cpp
+++ b/src/core/Cam.cpp
@@ -1,5 +1,5 @@
#include "common.h"
-#include "patcher.h"
+
#include "main.h"
#include "Draw.h"
#include "World.h"
@@ -28,7 +28,7 @@
const float DefaultFOV = 70.0f; // beta: 80.0f
bool PrintDebugCode = false;
-int16 &DebugCamMode = *(int16*)0x95CCF2;
+int16 DebugCamMode;
#ifdef FREE_CAM
bool CCamera::bFreeCam = false;
@@ -5236,55 +5236,3 @@ CCam::Process_FollowCar_SA(const CVector& CameraTarget, float TargetOrientation,
}
}
#endif
-
-STARTPATCHES
- InjectHook(0x456F40, WellBufferMe, PATCH_JUMP);
- InjectHook(0x458410, &CCam::Init, PATCH_JUMP);
- InjectHook(0x4582F0, &CCam::GetVectorsReadyForRW, PATCH_JUMP);
- InjectHook(0x457710, &CCam::DoAverageOnVector, PATCH_JUMP);
- InjectHook(0x458060, &CCam::GetPedBetaAngleForClearView, PATCH_JUMP);
- InjectHook(0x457210, &CCam::Cam_On_A_String_Unobscured, PATCH_JUMP);
- InjectHook(0x457A80, &CCam::FixCamWhenObscuredByVehicle, PATCH_JUMP);
- InjectHook(0x457B90, &CCam::FixCamIfObscured, PATCH_JUMP);
- InjectHook(0x465DA0, &CCam::RotCamIfInFrontCar, PATCH_JUMP);
- InjectHook(0x4662D0, &CCam::WorkOutCamHeightWeeCar, PATCH_JUMP);
- InjectHook(0x466650, &CCam::WorkOutCamHeight, PATCH_JUMP);
- InjectHook(0x458600, &CCam::LookBehind, PATCH_JUMP);
- InjectHook(0x458C40, &CCam::LookLeft, PATCH_JUMP);
- InjectHook(0x458FB0, &CCam::LookRight, PATCH_JUMP);
- InjectHook(0x4574C0, &CCam::ClipIfPedInFrontOfPlayer, PATCH_JUMP);
- InjectHook(0x459300, &CCam::KeepTrackOfTheSpeed, PATCH_JUMP);
- InjectHook(0x458580, &CCam::IsTargetInWater, PATCH_JUMP);
- InjectHook(0x4570C0, &CCam::AvoidWallsTopDownPed, PATCH_JUMP);
- InjectHook(0x4595B0, &CCam::PrintMode, PATCH_JUMP);
-
- InjectHook(0x467400, &CCam::ProcessSpecialHeightRoutines, PATCH_JUMP);
- InjectHook(0x4596A0, &CCam::Process, PATCH_JUMP);
- InjectHook(0x45E3A0, &CCam::Process_FollowPed, PATCH_JUMP);
- InjectHook(0x45FF70, &CCam::Process_FollowPedWithMouse, PATCH_JUMP);
- InjectHook(0x45BE60, &CCam::Process_BehindCar, PATCH_JUMP);
- InjectHook(0x45C090, &CCam::Process_Cam_On_A_String, PATCH_JUMP);
- InjectHook(0x463EB0, &CCam::Process_TopDown, PATCH_JUMP);
- InjectHook(0x464390, &CCam::Process_TopDownPed, PATCH_JUMP);
- InjectHook(0x461AF0, &CCam::Process_Rocket, PATCH_JUMP);
- InjectHook(0x460E00, &CCam::Process_M16_1stPerson, PATCH_JUMP);
- InjectHook(0x459FA0, &CCam::Process_1stPerson, PATCH_JUMP);
- InjectHook(0x462420, &CCam::Process_Sniper, PATCH_JUMP);
- InjectHook(0x463130, &CCam::Process_Syphon, PATCH_JUMP);
- InjectHook(0x463A70, &CCam::Process_Syphon_Crim_In_Front, PATCH_JUMP);
- InjectHook(0x45B470, &CCam::Process_BehindBoat, PATCH_JUMP);
- InjectHook(0x45D2F0, &CCam::Process_Fight_Cam, PATCH_JUMP);
- InjectHook(0x45DC20, &CCam::Process_FlyBy, PATCH_JUMP);
- InjectHook(0x464D10, &CCam::Process_WheelCam, PATCH_JUMP);
- InjectHook(0x45DA20, &CCam::Process_Fixed, PATCH_JUMP);
- InjectHook(0x461940, &CCam::Process_Player_Fallen_Water, PATCH_JUMP);
- InjectHook(0x45C400, &CCam::Process_Circle, PATCH_JUMP);
- InjectHook(0x462FC0, &CCam::Process_SpecialFixedForSyphon, PATCH_JUMP);
- InjectHook(0x45CCC0, &CCam::Process_Debug, PATCH_JUMP);
- InjectHook(0x4656C0, &CCam::ProcessPedsDeadBaby, PATCH_JUMP);
- InjectHook(0x465000, &CCam::ProcessArrestCamOne, PATCH_JUMP);
- InjectHook(0x4653C0, &CCam::ProcessArrestCamTwo, PATCH_JUMP);
-
- InjectHook(0x456CE0, &FindSplinePathPositionFloat, PATCH_JUMP);
- InjectHook(0x4569A0, &FindSplinePathPositionVector, PATCH_JUMP);
-ENDPATCHES
diff --git a/src/core/Camera.cpp b/src/core/Camera.cpp
index c2392d3b..f1445d2e 100644
--- a/src/core/Camera.cpp
+++ b/src/core/Camera.cpp
@@ -1,5 +1,5 @@
#include "common.h"
-#include "patcher.h"
+
#include "main.h"
#include "Draw.h"
#include "World.h"
@@ -58,9 +58,9 @@ enum
#define PLAYER (CWorld::Players[CWorld::PlayerInFocus].m_pPed)
// NB: removed explicit TheCamera from all functions
-CCamera &TheCamera = *(CCamera*)0x6FACF8;
-bool &CCamera::m_bUseMouse3rdPerson = *(bool *)0x5F03D8;
-bool &bDidWeProcessAnyCinemaCam = *(bool*)0x95CD46;
+CCamera TheCamera;
+bool CCamera::m_bUseMouse3rdPerson = true;
+bool bDidWeProcessAnyCinemaCam;
#ifdef IMPROVED_CAMERA
#define KEYJUSTDOWN(k) ControlsManager.GetIsKeyboardKeyJustDown((RsKeyCodes)k)
@@ -3386,58 +3386,3 @@ CCamPathSplines::CCamPathSplines(void)
for(i = 0; i < MAXPATHLENGTH; i++)
m_arr_PathData[i] = 0.0f;
}
-
-
-STARTPATCHES
- InjectHook(0x42C760, (bool (CCamera::*)(const CVector &center, float radius, const CMatrix *mat))&CCamera::IsSphereVisible, PATCH_JUMP);
- InjectHook(0x46FD00, &CCamera::SetFadeColour, PATCH_JUMP);
-
- InjectHook(0x46FD40, &CCamera::SetMotionBlur, PATCH_JUMP);
- InjectHook(0x46FD80, &CCamera::SetMotionBlurAlpha, PATCH_JUMP);
- InjectHook(0x46F940, &CCamera::RenderMotionBlur, PATCH_JUMP);
-
- InjectHook(0x46FC90, &CCamera::SetCameraDirectlyInFrontForFollowPed_CamOnAString, PATCH_JUMP);
-
- InjectHook(0x46FF00, &CCamera::SetWideScreenOn, PATCH_JUMP);
- InjectHook(0x46FF10, &CCamera::SetWideScreenOff, PATCH_JUMP);
-
- InjectHook(0x46FCC0, &CCamera::SetCamPositionForFixedMode, PATCH_JUMP);
- InjectHook(0x46FEC0, &CCamera::SetRwCamera, PATCH_JUMP);
- InjectHook(0x46B920, &CCamera::GetCutSceneFinishTime, PATCH_JUMP);
- InjectHook(0x46B560, &CCamera::FinishCutscene, PATCH_JUMP);
- InjectHook(0x46FF30, &CCamera::SetZoomValueFollowPedScript, PATCH_JUMP);
- InjectHook(0x46FF90, &CCamera::SetZoomValueCamStringScript, PATCH_JUMP);
-
-
- InjectHook(0x46F8E0, &CCamera::ProcessWideScreenOn, PATCH_JUMP);
- InjectHook(0x46FDE0, &CCamera::SetParametersForScriptInterpolation, PATCH_JUMP);
- InjectHook(0x46BA20, &CCamera::GetLookingLRBFirstPerson, PATCH_JUMP);
- InjectHook(0x470D80, &CCamera::StartTransitionWhenNotFinishedInter, PATCH_JUMP);
- InjectHook(0x46FFF0, &CCamera::StartTransition, PATCH_JUMP);
- InjectHook(0x46BEB0, &CCamera::InitialiseCameraForDebugMode, PATCH_JUMP);
- InjectHook(0x471500, &CCamera::TakeControl, PATCH_JUMP);
- InjectHook(0x4715B0, &CCamera::TakeControlNoEntity, PATCH_JUMP);
- InjectHook(0x46B3A0, &CCamera::Fade, PATCH_JUMP);
- InjectHook(0x46FE20, &CCamera::SetPercentAlongCutScene, PATCH_JUMP);
- InjectHook(0x46B100, &CamShakeNoPos, PATCH_JUMP);
- InjectHook(0x46B200, &CCamera::CamShake, PATCH_JUMP);
- InjectHook(0x46F520, &CCamera::ProcessObbeCinemaCameraPed, PATCH_JUMP);
- InjectHook(0x46F3E0, &CCamera::ProcessObbeCinemaCameraCar, PATCH_JUMP);
- InjectHook(0x470DA0, &CCamera::StoreValuesDuringInterPol, PATCH_JUMP);
- InjectHook(0x46B430, &CCamera::DrawBordersForWideScreen, PATCH_JUMP);
- InjectHook(0x46F990, &CCamera::Restore, PATCH_JUMP);
- InjectHook(0x46FAE0, &CCamera::RestoreWithJumpCut, PATCH_JUMP);
- InjectHook(0x46F080, &CCamera::ProcessFade, PATCH_JUMP);
- InjectHook(0x46EEA0, &CCamera::CalculateDerivedValues, PATCH_JUMP);
- InjectHook(0x46F1E0, &CCamera::ProcessMusicFade, PATCH_JUMP);
- InjectHook(0x46D1D0, &CCamera::LoadPathSplines, PATCH_JUMP);
- InjectHook(0x4712A0, &CCamera::UpdateTargetEntity, PATCH_JUMP);
- InjectHook(0x46B580, &CCamera::Find3rdPersonCamTargetVector, PATCH_JUMP);
- InjectHook(0x46BAD0, &CCamera::Init, PATCH_JUMP);
- InjectHook(0x46C9E0, &CCamera::LoadTrainCamNodes, PATCH_JUMP);
- InjectHook(0x46F600, &CCamera::Process_Train_Camera_Control, PATCH_JUMP);
- InjectHook(0x470EA0, &CCamera::UpdateSoundDistances, PATCH_JUMP);
- InjectHook(0x46BF10, &CCamera::IsItTimeForNewcam, PATCH_JUMP);
- InjectHook(0x471650, &CCamera::TryToStartNewCamMode, PATCH_JUMP);
-// InjectHook(0x46D3F0, &CCamera::Process, PATCH_JUMP);
-ENDPATCHES
diff --git a/src/core/Camera.h b/src/core/Camera.h
index 09a8d603..d1c8ec03 100644
--- a/src/core/Camera.h
+++ b/src/core/Camera.h
@@ -6,7 +6,7 @@ class CPed;
class CAutomobile;
class CGarage;
-extern int16 &DebugCamMode;
+extern int16 DebugCamMode;
enum
{
@@ -540,7 +540,7 @@ uint32 unknown; // some counter having to do with music
uint32 m_uiFadeTimeStarted;
uint32 m_uiFadeTimeStartedMusic;
- static bool &m_bUseMouse3rdPerson;
+ static bool m_bUseMouse3rdPerson;
#ifdef FREE_CAM
static bool bFreeCam;
#endif
@@ -647,7 +647,7 @@ static_assert(offsetof(CCamera, m_vecCutSceneOffset) == 0x6F8, "CCamera: error")
static_assert(offsetof(CCamera, m_arrPathArray) == 0x7a8, "CCamera: error");
static_assert(sizeof(CCamera) == 0xE9D8, "CCamera: wrong size");
-extern CCamera &TheCamera;
+extern CCamera TheCamera;
void CamShakeNoPos(CCamera*, float);
void MakeAngleLessThan180(float &Angle);
diff --git a/src/core/CdStream.cpp b/src/core/CdStream.cpp
index a400c039..1ab1c8b0 100644
--- a/src/core/CdStream.cpp
+++ b/src/core/CdStream.cpp
@@ -1,6 +1,6 @@
#include <windows.h>
#include "common.h"
-#include "patcher.h"
+
#include "CdStream.h"
#include "rwcore.h"
#include "RwHelper.h"
@@ -507,24 +507,3 @@ CdStreamGetNumImages(void)
{
return gNumImages;
}
-
-
-STARTPATCHES
- InjectHook(0x405B50, CdStreamInitThread, PATCH_JUMP);
- InjectHook(0x405C80, CdStreamInit, PATCH_JUMP);
- //InjectHook(0x405DB0, debug, PATCH_JUMP);
- InjectHook(0x405DC0, GetGTA3ImgSize, PATCH_JUMP);
- InjectHook(0x405DD0, CdStreamShutdown, PATCH_JUMP);
- InjectHook(0x405E40, CdStreamRead, PATCH_JUMP);
- InjectHook(0x405F90, CdStreamGetStatus, PATCH_JUMP);
- InjectHook(0x406000, CdStreamGetLastPosn, PATCH_JUMP);
- InjectHook(0x406010, CdStreamSync, PATCH_JUMP);
- InjectHook(0x4060B0, AddToQueue, PATCH_JUMP);
- InjectHook(0x4060F0, GetFirstInQueue, PATCH_JUMP);
- InjectHook(0x406110, RemoveFirstInQueue, PATCH_JUMP);
- InjectHook(0x406140, CdStreamThread, PATCH_JUMP);
- InjectHook(0x406270, CdStreamAddImage, PATCH_JUMP);
- InjectHook(0x4062E0, CdStreamGetImageName, PATCH_JUMP);
- InjectHook(0x406300, CdStreamRemoveImages, PATCH_JUMP);
- InjectHook(0x406370, CdStreamGetNumImages, PATCH_JUMP);
-ENDPATCHES \ No newline at end of file
diff --git a/src/core/Clock.cpp b/src/core/Clock.cpp
index a97dcb5f..e4b908e0 100644
--- a/src/core/Clock.cpp
+++ b/src/core/Clock.cpp
@@ -1,22 +1,22 @@
#include "common.h"
-#include "patcher.h"
+
#include "Timer.h"
#include "Pad.h"
#include "Clock.h"
#include "Stats.h"
_TODO("gbFastTime");
-bool &gbFastTime = *(bool*)0x95CDBB;
+bool gbFastTime;
-uint8 &CClock::ms_nGameClockHours = *(uint8*)0x95CDA6;
-uint8 &CClock::ms_nGameClockMinutes = *(uint8*)0x95CDC8;
-uint16 &CClock::ms_nGameClockSeconds = *(uint16*)0x95CC7C;
-uint8 &CClock::ms_Stored_nGameClockHours = *(uint8*)0x95CD7B;
-uint8 &CClock::ms_Stored_nGameClockMinutes = *(uint8*)0x95CD9B;
-uint16 &CClock::ms_Stored_nGameClockSeconds = *(uint16*)0x95CC9C;
-uint32 &CClock::ms_nMillisecondsPerGameMinute = *(uint32*)0x8F2C64;
-uint32 &CClock::ms_nLastClockTick = *(uint32*)0x9430E4;
-bool &CClock::ms_bClockHasBeenStored = *(bool*)0x95CD82;
+uint8 CClock::ms_nGameClockHours;
+uint8 CClock::ms_nGameClockMinutes;
+uint16 CClock::ms_nGameClockSeconds;
+uint8 CClock::ms_Stored_nGameClockHours;
+uint8 CClock::ms_Stored_nGameClockMinutes;
+uint16 CClock::ms_Stored_nGameClockSeconds;
+uint32 CClock::ms_nMillisecondsPerGameMinute;
+uint32 CClock::ms_nLastClockTick;
+bool CClock::ms_bClockHasBeenStored;
void
CClock::Initialise(uint32 scale)
@@ -115,14 +115,3 @@ CClock::RestoreClock(void)
ms_nGameClockMinutes = ms_Stored_nGameClockMinutes;
ms_nGameClockSeconds = ms_Stored_nGameClockSeconds;
}
-
-
-STARTPATCHES
- InjectHook(0x473370, CClock::Initialise, PATCH_JUMP);
- InjectHook(0x473460, CClock::Update, PATCH_JUMP);
- InjectHook(0x4733C0, CClock::SetGameClock, PATCH_JUMP);
- InjectHook(0x4733F0, CClock::GetGameClockMinutesUntil, PATCH_JUMP);
- InjectHook(0x473420, CClock::GetIsTimeInRange, PATCH_JUMP);
- InjectHook(0x473540, CClock::StoreClock, PATCH_JUMP);
- InjectHook(0x473570, CClock::RestoreClock, PATCH_JUMP);
-ENDPATCHES
diff --git a/src/core/Clock.h b/src/core/Clock.h
index 6b9908ba..a611cd50 100644
--- a/src/core/Clock.h
+++ b/src/core/Clock.h
@@ -3,15 +3,15 @@
class CClock
{
public:
- static uint8 &ms_nGameClockHours;
- static uint8 &ms_nGameClockMinutes;
- static uint16 &ms_nGameClockSeconds;
- static uint8 &ms_Stored_nGameClockHours;
- static uint8 &ms_Stored_nGameClockMinutes;
- static uint16 &ms_Stored_nGameClockSeconds;
- static uint32 &ms_nMillisecondsPerGameMinute;
- static uint32 &ms_nLastClockTick;
- static bool &ms_bClockHasBeenStored;
+ static uint8 ms_nGameClockHours;
+ static uint8 ms_nGameClockMinutes;
+ static uint16 ms_nGameClockSeconds;
+ static uint8 ms_Stored_nGameClockHours;
+ static uint8 ms_Stored_nGameClockMinutes;
+ static uint16 ms_Stored_nGameClockSeconds;
+ static uint32 ms_nMillisecondsPerGameMinute;
+ static uint32 ms_nLastClockTick;
+ static bool ms_bClockHasBeenStored;
static void Initialise(uint32 scale);
static void Update(void);
diff --git a/src/core/Collision.cpp b/src/core/Collision.cpp
index 85145e86..5bdb32dc 100644
--- a/src/core/Collision.cpp
+++ b/src/core/Collision.cpp
@@ -1,5 +1,5 @@
#include "common.h"
-#include "patcher.h"
+
#include "main.h"
#include "Lists.h"
#include "Game.h"
@@ -2140,70 +2140,3 @@ CColModel::operator=(const CColModel &other)
}
return *this;
}
-
-#include <new>
-struct CColLine_ : public CColLine
-{
- CColLine *ctor(CVector *p0, CVector *p1) { return ::new (this) CColLine(*p0, *p1); }
-};
-
-struct CColModel_ : public CColModel
-{
- CColModel *ctor(void) { return ::new (this) CColModel(); }
- void dtor(void) { this->CColModel::~CColModel(); }
-};
-
-
-STARTPATCHES
- InjectHook(0x4B9C30, (CMatrix& (*)(const CMatrix &src, CMatrix &dst))Invert, PATCH_JUMP);
-
- InjectHook(0x40B380, CCollision::Init, PATCH_JUMP);
- InjectHook(0x40B3A0, CCollision::Shutdown, PATCH_JUMP);
- InjectHook(0x40B3B0, CCollision::Update, PATCH_JUMP);
- InjectHook(0x40B5B0, CCollision::LoadCollisionWhenINeedIt, PATCH_JUMP);
- InjectHook(0x40B900, CCollision::SortOutCollisionAfterLoad, PATCH_JUMP);
-
- InjectHook(0x40BB70, CCollision::TestSphereBox, PATCH_JUMP);
- InjectHook(0x40E130, CCollision::TestLineBox, PATCH_JUMP);
- InjectHook(0x40E5C0, CCollision::TestVerticalLineBox, PATCH_JUMP);
- InjectHook(0x40EC10, CCollision::TestLineTriangle, PATCH_JUMP);
- InjectHook(0x40DAA0, CCollision::TestLineSphere, PATCH_JUMP);
- InjectHook(0x40C580, CCollision::TestSphereTriangle, PATCH_JUMP);
- InjectHook(0x40F720, CCollision::TestLineOfSight, PATCH_JUMP);
-
- InjectHook(0x40B9F0, CCollision::ProcessSphereSphere, PATCH_JUMP);
- InjectHook(0x40BC00, CCollision::ProcessSphereBox, PATCH_JUMP);
- InjectHook(0x40E670, CCollision::ProcessLineBox, PATCH_JUMP);
- InjectHook(0x40DE80, CCollision::ProcessLineSphere, PATCH_JUMP);
- InjectHook(0x40FB50, CCollision::ProcessVerticalLineTriangle, PATCH_JUMP);
- InjectHook(0x40F140, CCollision::ProcessLineTriangle, PATCH_JUMP);
- InjectHook(0x40CE30, CCollision::ProcessSphereTriangle, PATCH_JUMP);
-
- InjectHook(0x40F910, CCollision::ProcessLineOfSight, PATCH_JUMP);
- InjectHook(0x410120, CCollision::ProcessVerticalLine, PATCH_JUMP);
- InjectHook(0x410BE0, CCollision::ProcessColModels, PATCH_JUMP);
-
- InjectHook(0x40B960, CCollision::CalculateTrianglePlanes, PATCH_JUMP);
- InjectHook(0x411640, &CLink<CColModel*>::Remove, PATCH_JUMP);
- InjectHook(0x411620, &CLink<CColModel*>::Insert, PATCH_JUMP);
- InjectHook(0x4115C0, &CLinkList<CColModel*>::Insert, PATCH_JUMP);
- InjectHook(0x411600, &CLinkList<CColModel*>::Remove, PATCH_JUMP);
-// InjectHook(0x411530, &CLinkList<CColModel*>::Init, PATCH_JUMP);
-
- InjectHook(0x411E40, (void (CColSphere::*)(float, const CVector&, uint8, uint8))&CColSphere::Set, PATCH_JUMP);
- InjectHook(0x40B2A0, &CColBox::Set, PATCH_JUMP);
- InjectHook(0x40B320, &CColLine_::ctor, PATCH_JUMP);
- InjectHook(0x40B350, &CColLine::Set, PATCH_JUMP);
- InjectHook(0x411E70, &CColTriangle::Set, PATCH_JUMP);
-
- InjectHook(0x411EA0, &CColTrianglePlane::Set, PATCH_JUMP);
- InjectHook(0x412140, &CColTrianglePlane::GetNormal, PATCH_JUMP);
-
- InjectHook(0x411680, &CColModel_::ctor, PATCH_JUMP);
- InjectHook(0x4116E0, &CColModel_::dtor, PATCH_JUMP);
- InjectHook(0x411D80, &CColModel::RemoveCollisionVolumes, PATCH_JUMP);
- InjectHook(0x411CB0, &CColModel::CalculateTrianglePlanes, PATCH_JUMP);
- InjectHook(0x411D10, &CColModel::RemoveTrianglePlanes, PATCH_JUMP);
- InjectHook(0x411D40, &CColModel::SetLinkPtr, PATCH_JUMP);
- InjectHook(0x411D60, &CColModel::GetLinkPtr, PATCH_JUMP);
-ENDPATCHES
diff --git a/src/core/ControllerConfig.cpp b/src/core/ControllerConfig.cpp
index 541257c6..a2382c12 100644
--- a/src/core/ControllerConfig.cpp
+++ b/src/core/ControllerConfig.cpp
@@ -1,7 +1,7 @@
#define DIRECTINPUT_VERSION 0x0800
#include <dinput.h>
#include "common.h"
-#include "patcher.h"
+
#include "ControllerConfig.h"
#include "Pad.h"
#include "FileMgr.h"
@@ -18,7 +18,7 @@
#include "win.h"
#include "GenericGameStorage.h"
-CControllerConfigManager &ControlsManager = *(CControllerConfigManager*)0x8F43A4;
+CControllerConfigManager ControlsManager;
CControllerConfigManager::CControllerConfigManager()
{
@@ -2362,57 +2362,3 @@ void CControllerConfigManager::ResetSettingOrder(e_ControllerAction action)
}
}
}
-
-
-STARTPATCHES
- InjectHook(0x58B7A0, &CControllerConfigManager::MakeControllerActionsBlank, PATCH_JUMP);
- InjectHook(0x58B7D0, &CControllerConfigManager::GetJoyButtonJustDown, PATCH_JUMP);
- InjectHook(0x58B800, &CControllerConfigManager::SaveSettings, PATCH_JUMP);
- InjectHook(0x58B870, &CControllerConfigManager::LoadSettings, PATCH_JUMP);
- InjectHook(0x58B930, &CControllerConfigManager::InitDefaultControlConfiguration, PATCH_JUMP);
- InjectHook(0x58BD00, &CControllerConfigManager::InitDefaultControlConfigMouse, PATCH_JUMP);
- InjectHook(0x58BD90, &CControllerConfigManager::InitDefaultControlConfigJoyPad, PATCH_JUMP);
- InjectHook(0x58C060, &CControllerConfigManager::InitialiseControllerActionNameArray, PATCH_JUMP);
- InjectHook(0x58C5E0, &CControllerConfigManager::UpdateJoyInConfigMenus_ButtonDown, PATCH_JUMP);
- InjectHook(0x58C730, &CControllerConfigManager::AffectControllerStateOn_ButtonDown, PATCH_JUMP);
- InjectHook(0x58C880, &CControllerConfigManager::AffectControllerStateOn_ButtonDown_Driving, PATCH_JUMP);
- InjectHook(0x58CAD0, &CControllerConfigManager::AffectControllerStateOn_ButtonDown_FirstPersonOnly, PATCH_JUMP);
- InjectHook(0x58CB10, &CControllerConfigManager::AffectControllerStateOn_ButtonDown_ThirdPersonOnly, PATCH_JUMP);
- InjectHook(0x58CBD0, &CControllerConfigManager::AffectControllerStateOn_ButtonDown_FirstAndThirdPersonOnly, PATCH_JUMP);
- InjectHook(0x58CD70, &CControllerConfigManager::AffectControllerStateOn_ButtonDown_AllStates, PATCH_JUMP);
- InjectHook(0x58CE50, &CControllerConfigManager::AffectControllerStateOn_ButtonDown_VehicleAndThirdPersonOnly, PATCH_JUMP);
- InjectHook(0x58CE80, &CControllerConfigManager::UpdateJoyInConfigMenus_ButtonUp, PATCH_JUMP);
- InjectHook(0x58CFD0, &CControllerConfigManager::AffectControllerStateOn_ButtonUp, PATCH_JUMP);
- InjectHook(0x58D090, &CControllerConfigManager::AffectControllerStateOn_ButtonUp_All_Player_States, PATCH_JUMP);
- InjectHook(0x58D0C0, &CControllerConfigManager::AffectPadFromKeyBoard, PATCH_JUMP);
- InjectHook(0x58D1A0, &CControllerConfigManager::AffectPadFromMouse, PATCH_JUMP);
- InjectHook(0x58D220, &CControllerConfigManager::ClearSimButtonPressCheckers, PATCH_JUMP);
- InjectHook(0x58D2A0, &CControllerConfigManager::GetIsKeyboardKeyDown, PATCH_JUMP);
- InjectHook(0x58D8A0, &CControllerConfigManager::GetIsKeyboardKeyJustDown, PATCH_JUMP);
- InjectHook(0x58E280, &CControllerConfigManager::GetIsMouseButtonDown, PATCH_JUMP);
- InjectHook(0x58E360, &CControllerConfigManager::GetIsMouseButtonUp, PATCH_JUMP);
- InjectHook(0x58E440, &CControllerConfigManager::DeleteMatchingCommonControls, PATCH_JUMP);
- InjectHook(0x58E540, &CControllerConfigManager::DeleteMatching3rdPersonControls, PATCH_JUMP);
- InjectHook(0x58E630, &CControllerConfigManager::DeleteMatching1rst3rdPersonControls, PATCH_JUMP);
- InjectHook(0x58E710, &CControllerConfigManager::DeleteMatchingVehicleControls, PATCH_JUMP);
- InjectHook(0x58E890, &CControllerConfigManager::DeleteMatchingVehicle_3rdPersonControls, PATCH_JUMP);
- InjectHook(0x58E8D0, &CControllerConfigManager::DeleteMatching1rstPersonControls, PATCH_JUMP);
- InjectHook(0x58E920, &CControllerConfigManager::DeleteMatchingActionInitiators, PATCH_JUMP);
- InjectHook(0x58EA70, &CControllerConfigManager::GetIsKeyBlank, PATCH_JUMP);
- InjectHook(0x58EAD0, &CControllerConfigManager::GetActionType, PATCH_JUMP);
- InjectHook(0x58EB40, &CControllerConfigManager::ClearSettingsAssociatedWithAction, PATCH_JUMP);
- InjectHook(0x58EBF0, &CControllerConfigManager::GetControllerSettingTextWithOrderNumber, PATCH_JUMP);
- InjectHook(0x58EC50, &CControllerConfigManager::GetControllerSettingTextKeyBoard, PATCH_JUMP);
- InjectHook(0x58F320, &CControllerConfigManager::GetControllerSettingTextMouse, PATCH_JUMP);
- InjectHook(0x58F3D0, &CControllerConfigManager::GetControllerSettingTextJoystick, PATCH_JUMP);
- InjectHook(0x58F420, &CControllerConfigManager::GetNumOfSettingsForAction, PATCH_JUMP);
- InjectHook(0x58F460, &CControllerConfigManager::GetWideStringOfCommandKeys, PATCH_JUMP);
- InjectHook(0x58F590, &CControllerConfigManager::GetControllerKeyAssociatedWithAction, PATCH_JUMP);
- InjectHook(0x58F5B0, &CControllerConfigManager::UpdateJoyButtonState, PATCH_JUMP);
- InjectHook(0x58F660, &CControllerConfigManager::GetIsActionAButtonCombo, PATCH_JUMP);
- InjectHook(0x58F690, &CControllerConfigManager::GetButtonComboText, PATCH_JUMP);
- InjectHook(0x58F700, &CControllerConfigManager::SetControllerKeyAssociatedWithAction, PATCH_JUMP);
- InjectHook(0x58F740, &CControllerConfigManager::GetMouseButtonAssociatedWithAction, PATCH_JUMP);
- InjectHook(0x58F760, &CControllerConfigManager::SetMouseButtonAssociatedWithAction, PATCH_JUMP);
- InjectHook(0x58F790, &CControllerConfigManager::ResetSettingOrder, PATCH_JUMP);
-ENDPATCHES
diff --git a/src/core/ControllerConfig.h b/src/core/ControllerConfig.h
index 458e457c..c328594e 100644
--- a/src/core/ControllerConfig.h
+++ b/src/core/ControllerConfig.h
@@ -198,4 +198,4 @@ public:
VALIDATE_SIZE(CControllerConfigManager, 0x143C);
-extern CControllerConfigManager &ControlsManager; \ No newline at end of file
+extern CControllerConfigManager ControlsManager; \ No newline at end of file
diff --git a/src/core/Directory.cpp b/src/core/Directory.cpp
index d4b4279d..27539824 100644
--- a/src/core/Directory.cpp
+++ b/src/core/Directory.cpp
@@ -1,5 +1,5 @@
#include "common.h"
-#include "patcher.h"
+
#include "General.h"
#include "FileMgr.h"
#include "Directory.h"
@@ -57,10 +57,3 @@ CDirectory::FindItem(const char *name, uint32 &offset, uint32 &size)
}
return false;
}
-
-STARTPATCHES
- InjectHook(0x473630, &CDirectory::ReadDirFile, PATCH_JUMP);
- InjectHook(0x473690, &CDirectory::WriteDirFile, PATCH_JUMP);
- InjectHook(0x473600, &CDirectory::AddItem, PATCH_JUMP);
- InjectHook(0x4736E0, &CDirectory::FindItem, PATCH_JUMP);
-ENDPATCHES
diff --git a/src/core/EventList.cpp b/src/core/EventList.cpp
index d1c76f33..675040ea 100644
--- a/src/core/EventList.cpp
+++ b/src/core/EventList.cpp
@@ -1,5 +1,5 @@
#include "common.h"
-#include "patcher.h"
+
#include "Pools.h"
#include "ModelIndices.h"
#include "World.h"
@@ -11,7 +11,6 @@
int32 CEventList::ms_nFirstFreeSlotIndex;
CEvent gaEvent[NUMEVENTS];
-//CEvent *gaEvent = (CEvent*)0x6EF830;
enum
{
@@ -228,14 +227,3 @@ CEventList::ReportCrimeForEvent(eEventType type, int32 crimeId, bool copsDontCar
FindPlayerPed()->SetWantedLevelNoDrop(2);
}
-
-STARTPATCHES
- InjectHook(0x475B60, CEventList::Initialise, PATCH_JUMP);
- InjectHook(0x475BE0, CEventList::Update, PATCH_JUMP);
- InjectHook(0x475C50, (void (*)(eEventType,eEventEntity,CEntity *,CPed *,int32))CEventList::RegisterEvent, PATCH_JUMP);
- InjectHook(0x475E10, (void (*)(eEventType,CVector,int32))CEventList::RegisterEvent, PATCH_JUMP);
- InjectHook(0x475F40, CEventList::GetEvent, PATCH_JUMP);
- InjectHook(0x475F70, CEventList::ClearEvent, PATCH_JUMP);
- InjectHook(0x475F90, CEventList::FindClosestEvent, PATCH_JUMP);
- InjectHook(0x476070, CEventList::ReportCrimeForEvent, PATCH_JUMP);
-ENDPATCHES
diff --git a/src/core/FileLoader.cpp b/src/core/FileLoader.cpp
index e0a0fafc..b7d82089 100644
--- a/src/core/FileLoader.cpp
+++ b/src/core/FileLoader.cpp
@@ -1,6 +1,6 @@
#include "common.h"
#include "main.h"
-#include "patcher.h"
+
#include "Quaternion.h"
#include "ModelInfo.h"
#include "ModelIndices.h"
@@ -1355,43 +1355,3 @@ CFileLoader::ReLoadScene(const char *filename)
}
CFileMgr::CloseFile(fd);
}
-
-STARTPATCHES
- InjectHook(0x476290, CFileLoader::LoadLevel, PATCH_JUMP);
-
- InjectHook(0x476520, CFileLoader::LoadCollisionFromDatFile, PATCH_JUMP);
- InjectHook(0x4761D0, CFileLoader::LoadLine, PATCH_JUMP);
- InjectHook(0x4765B0, CFileLoader::LoadTexDictionary, PATCH_JUMP);
- InjectHook(0x478B20, CFileLoader::LoadCollisionFile, PATCH_JUMP);
- InjectHook(0x478C20, CFileLoader::LoadCollisionModel, PATCH_JUMP);
- InjectHook(0x476750, CFileLoader::LoadModelFile, PATCH_JUMP);
- InjectHook(0x476810, (void (*)(const char*))CFileLoader::LoadClumpFile, PATCH_JUMP);
- InjectHook(0x476990, (bool (*)(RwStream*,uint32))CFileLoader::LoadClumpFile, PATCH_JUMP);
- InjectHook(0x476A20, CFileLoader::StartLoadClumpFile, PATCH_JUMP);
- InjectHook(0x476A70, CFileLoader::FinishLoadClumpFile, PATCH_JUMP);
- InjectHook(0x476930, CFileLoader::LoadAtomicFile, PATCH_JUMP);
- InjectHook(0x4767C0, CFileLoader::LoadAtomicFile2Return, PATCH_JUMP);
- InjectHook(0x476630, CFileLoader::AddTexDictionaries, PATCH_JUMP);
-
- InjectHook(0x476AC0, CFileLoader::LoadObjectTypes, PATCH_JUMP);
- InjectHook(0x477040, CFileLoader::LoadObject, PATCH_JUMP);
- InjectHook(0x4774B0, CFileLoader::LoadTimeObject, PATCH_JUMP);
- InjectHook(0x477920, CFileLoader::LoadClumpObject, PATCH_JUMP);
- InjectHook(0x477990, CFileLoader::LoadVehicleObject, PATCH_JUMP);
- InjectHook(0x477DE0, CFileLoader::LoadPedObject, PATCH_JUMP);
- InjectHook(0x477ED0, CFileLoader::LoadPathHeader, PATCH_JUMP);
- InjectHook(0x477FF0, CFileLoader::LoadCarPathNode, PATCH_JUMP);
- InjectHook(0x477F00, CFileLoader::LoadPedPathNode, PATCH_JUMP);
- InjectHook(0x4780E0, CFileLoader::Load2dEffect, PATCH_JUMP);
-
- InjectHook(0x478370, CFileLoader::LoadScene, PATCH_JUMP);
- InjectHook(0x4786B0, CFileLoader::LoadObjectInstance, PATCH_JUMP);
- InjectHook(0x478A00, CFileLoader::LoadZone, PATCH_JUMP);
- InjectHook(0x478A90, CFileLoader::LoadCullZone, PATCH_JUMP);
-
- InjectHook(0x478550, CFileLoader::LoadMapZones, PATCH_JUMP);
-
- InjectHook(0x476DB0, CFileLoader::ReloadPaths, PATCH_JUMP);
- InjectHook(0x476F30, CFileLoader::ReloadObjectTypes, PATCH_JUMP);
- InjectHook(0x4772B0, CFileLoader::ReloadObject, PATCH_JUMP);
-ENDPATCHES
diff --git a/src/core/FileMgr.cpp b/src/core/FileMgr.cpp
index 2a8628b0..46d725cd 100644
--- a/src/core/FileMgr.cpp
+++ b/src/core/FileMgr.cpp
@@ -2,7 +2,7 @@
#include <fcntl.h>
#include <direct.h>
#include "common.h"
-#include "patcher.h"
+
#include "FileMgr.h"
const char *_psGetUserFilesFolder();
@@ -168,8 +168,8 @@ myfeof(int fd)
}
-char *CFileMgr::ms_rootDirName = (char*)0x5F18F8;
-char *CFileMgr::ms_dirName = (char*)0x713CA8;
+char CFileMgr::ms_rootDirName[128] = {'\0'};
+char CFileMgr::ms_dirName[128];
void
CFileMgr::Initialise(void)
@@ -282,19 +282,3 @@ CFileMgr::GetErrorReadWrite(int fd)
{
return myfeof(fd);
}
-
-STARTPATCHES
- InjectHook(0x478F80, CFileMgr::Initialise, PATCH_JUMP);
- InjectHook(0x478FB0, CFileMgr::ChangeDir, PATCH_JUMP);
- InjectHook(0x479020, CFileMgr::SetDir, PATCH_JUMP);
- InjectHook(0x479080, CFileMgr::SetDirMyDocuments, PATCH_JUMP);
- InjectHook(0x479090, CFileMgr::LoadFile, PATCH_JUMP);
- InjectHook(0x479100, CFileMgr::OpenFile, PATCH_JUMP);
- InjectHook(0x479120, CFileMgr::OpenFileForWriting, PATCH_JUMP);
- InjectHook(0x479140, CFileMgr::Read, PATCH_JUMP);
- InjectHook(0x479160, CFileMgr::Write, PATCH_JUMP);
- InjectHook(0x479180, CFileMgr::Seek, PATCH_JUMP);
- InjectHook(0x4791D0, CFileMgr::ReadLine, PATCH_JUMP);
- InjectHook(0x479200, CFileMgr::CloseFile, PATCH_JUMP);
- InjectHook(0x479210, CFileMgr::GetErrorReadWrite, PATCH_JUMP);
-ENDPATCHES
diff --git a/src/core/FileMgr.h b/src/core/FileMgr.h
index 3df0c7d8..a6e4b6e5 100644
--- a/src/core/FileMgr.h
+++ b/src/core/FileMgr.h
@@ -2,8 +2,8 @@
class CFileMgr
{
- static char *ms_rootDirName; //[128];
- static char *ms_dirName; //[128];
+ static char ms_rootDirName[128];
+ static char ms_dirName[128];
public:
static void Initialise(void);
static void ChangeDir(const char *dir);
diff --git a/src/core/Fire.cpp b/src/core/Fire.cpp
index cfa849e9..65b6deb2 100644
--- a/src/core/Fire.cpp
+++ b/src/core/Fire.cpp
@@ -1,5 +1,5 @@
#include "common.h"
-#include "patcher.h"
+
#include "Vector.h"
#include "PlayerPed.h"
#include "Entity.h"
@@ -16,7 +16,7 @@
#include "Ped.h"
#include "Fire.h"
-CFireManager &gFireManager = *(CFireManager*)0x8F31D0;
+CFireManager gFireManager;
CFire::CFire()
{
@@ -438,21 +438,3 @@ CFireManager::SetScriptFireAudio(int16 index, bool state)
{
m_aFires[index].m_bAudioSet = state;
}
-
-STARTPATCHES
- InjectHook(0x4798D0, &CFire::ProcessFire, PATCH_JUMP);
- InjectHook(0x4798B0, &CFire::ReportThisFire, PATCH_JUMP);
- InjectHook(0x479D40, &CFire::Extinguish, PATCH_JUMP);
- InjectHook(0x479500, (void(CFireManager::*)(CVector pos, float size, bool propagation))&CFireManager::StartFire, PATCH_JUMP);
- InjectHook(0x479590, (CFire *(CFireManager::*)(CEntity *, CEntity *, float, bool))&CFireManager::StartFire, PATCH_JUMP);
- InjectHook(0x479310, &CFireManager::Update, PATCH_JUMP);
- InjectHook(0x479430, &CFireManager::FindFurthestFire_NeverMindFireMen, PATCH_JUMP);
- InjectHook(0x479340, &CFireManager::FindNearestFire, PATCH_JUMP);
- InjectHook(0x4792E0, &CFireManager::GetNextFreeFire, PATCH_JUMP);
- InjectHook(0x479DB0, &CFireManager::ExtinguishPoint, PATCH_JUMP);
- InjectHook(0x479E60, &CFireManager::StartScriptFire, PATCH_JUMP);
- InjectHook(0x479FC0, &CFireManager::IsScriptFireExtinguish, PATCH_JUMP);
- InjectHook(0x47A000, &CFireManager::RemoveAllScriptFires, PATCH_JUMP);
- InjectHook(0x479FE0, &CFireManager::RemoveScriptFire, PATCH_JUMP);
- InjectHook(0x47A040, &CFireManager::SetScriptFireAudio, PATCH_JUMP);
-ENDPATCHES
diff --git a/src/core/Fire.h b/src/core/Fire.h
index a4599d11..85e53f61 100644
--- a/src/core/Fire.h
+++ b/src/core/Fire.h
@@ -48,4 +48,4 @@ public:
void RemoveScriptFire(int16 index);
void SetScriptFireAudio(int16 index, bool state);
};
-extern CFireManager &gFireManager;
+extern CFireManager gFireManager;
diff --git a/src/core/Frontend.cpp b/src/core/Frontend.cpp
index a01689e4..790de046 100644
--- a/src/core/Frontend.cpp
+++ b/src/core/Frontend.cpp
@@ -1,7 +1,7 @@
#define DIRECTINPUT_VERSION 0x0800
#include <dinput.h>
#include "common.h"
-#include "patcher.h"
+
#include "win.h"
#include "Frontend.h"
#include "Font.h"
@@ -93,7 +93,7 @@ int8 CMenuManager::m_PrefsSpeakers;
int32 CMenuManager::m_ControlMethod;
int8 CMenuManager::m_PrefsDMA = 1;
int32 CMenuManager::m_PrefsLanguage;
-uint8 CMenuManager::m_PrefsStereoMono; // *(bool*)0x95CDB5; // unused except restore settings
+uint8 CMenuManager::m_PrefsStereoMono; // unused except restore settings
bool CMenuManager::m_PrefsAllowNastyGame = true;
bool CMenuManager::m_bStartUpFrontEndRequested;
@@ -5624,21 +5624,3 @@ uint8 CMenuManager::GetNumberOfMenuOptions()
#undef GetBackJustUp
#undef GetBackJustDown
-
-STARTPATCHES
- for (int i = 1; i < ARRAY_SIZE(aScreens); i++)
- Patch(0x611930 + sizeof(CMenuScreen) * i, aScreens[i]);
- InjectHook(0x4856F0, &CMenuManager::ProcessButtonPresses, PATCH_JUMP);
- InjectHook(0x485100, &CMenuManager::Process, PATCH_JUMP);
- InjectHook(0x47A230, &CMenuManager::LoadAllTextures, PATCH_JUMP);
- InjectHook(0x47A540, &CMenuManager::DrawFrontEnd, PATCH_JUMP);
-
- InjectHook(0x48ABE0, &CMenuManager::StretchX, PATCH_JUMP);
- InjectHook(0x48AC20, &CMenuManager::StretchY, PATCH_JUMP);
- InjectHook(0x488EE0, &CMenuManager::LoadSettings, PATCH_JUMP);
- InjectHook(0x488CC0, &CMenuManager::SaveSettings, PATCH_JUMP);
- InjectHook(0x47A440, &CMenuManager::UnloadTextures, PATCH_JUMP);
- InjectHook(0x48AB40, &CMenuManager::DoSettingsBeforeStartingAGame, PATCH_JUMP);
- InjectHook(0x48AE60, &CMenuManager::ProcessOnOffMenuOptions, PATCH_JUMP);
- InjectHook(0x489710, &CMenuManager::DrawControllerBound, PATCH_JUMP);
-ENDPATCHES \ No newline at end of file
diff --git a/src/core/Game.cpp b/src/core/Game.cpp
index 8699ffeb..7ccf78d0 100644
--- a/src/core/Game.cpp
+++ b/src/core/Game.cpp
@@ -5,7 +5,7 @@
#pragma warning( pop )
#include "common.h"
#include "win.h"
-#include "patcher.h"
+
#include "Game.h"
#include "main.h"
#include "RwHelper.h"
@@ -89,19 +89,19 @@
-eLevelName &CGame::currLevel = *(eLevelName*)0x941514;
-bool &CGame::bDemoMode = *(bool*)0x5F4DD0;
-bool &CGame::nastyGame = *(bool*)0x5F4DD4;
-bool &CGame::frenchGame = *(bool*)0x95CDCB;
-bool &CGame::germanGame = *(bool*)0x95CD1E;
-bool &CGame::noProstitutes = *(bool*)0x95CDCF;
-bool &CGame::playingIntro = *(bool*)0x95CDC2;
-char *CGame::aDatFile = (char*)0x773A48;
+eLevelName CGame::currLevel;
+bool CGame::bDemoMode = true;
+bool CGame::nastyGame = true;
+bool CGame::frenchGame;
+bool CGame::germanGame;
+bool CGame::noProstitutes;
+bool CGame::playingIntro;
+char CGame::aDatFile[32];
#ifdef MORE_LANGUAGES
bool CGame::russianGame = false;
#endif
-int &gameTxdSlot = *(int*)0x628D88;
+int gameTxdSlot;
bool
CGame::InitialiseOnceBeforeRW(void)
@@ -115,7 +115,9 @@ CGame::InitialiseOnceBeforeRW(void)
bool
CGame::InitialiseRenderWare(void)
{
+#ifdef USE_TEXTURE_POOL
_TexturePoolsInitialise();
+#endif
CTxdStore::Initialise();
CVisibilityPlugins::Initialise();
@@ -188,7 +190,9 @@ void CGame::ShutdownRenderWare(void)
CVisibilityPlugins::Shutdown();
+#ifdef USE_TEXTURE_POOL
_TexturePoolsShutdown();
+#endif
}
bool CGame::InitialiseOnceAfterRW(void)
@@ -706,20 +710,3 @@ void CGame::ProcessTidyUpMemory(void)
// meow
#endif
}
-
-STARTPATCHES
- InjectHook(0x48BB80, CGame::InitialiseOnceBeforeRW, PATCH_JUMP);
- InjectHook(0x48BBA0, CGame::InitialiseRenderWare, PATCH_JUMP);
- InjectHook(0x48BCB0, CGame::ShutdownRenderWare, PATCH_JUMP);
- InjectHook(0x48BD50, CGame::InitialiseOnceAfterRW, PATCH_JUMP);
- InjectHook(0x48BEC0, CGame::FinalShutdown, PATCH_JUMP);
- InjectHook(0x48BED0, CGame::Initialise, PATCH_JUMP);
- InjectHook(0x48C3A0, CGame::ShutDown, PATCH_JUMP);
- InjectHook(0x48C4B0, CGame::ReInitGameObjectVariables, PATCH_JUMP);
- InjectHook(0x48C620, CGame::ReloadIPLs, PATCH_JUMP);
- InjectHook(0x48C6B0, CGame::ShutDownForRestart, PATCH_JUMP);
- InjectHook(0x48C740, CGame::InitialiseWhenRestarting, PATCH_JUMP);
- InjectHook(0x48C850, CGame::Process, PATCH_JUMP);
- InjectHook(0x48CA10, CGame::DrasticTidyUpMemory, PATCH_JUMP);
- InjectHook(0x48CA20, CGame::TidyUpMemory, PATCH_JUMP);
-ENDPATCHES
diff --git a/src/core/Game.h b/src/core/Game.h
index 30581893..8dc73e8a 100644
--- a/src/core/Game.h
+++ b/src/core/Game.h
@@ -11,17 +11,17 @@ enum eLevelName
class CGame
{
public:
- static eLevelName &currLevel;
- static bool &bDemoMode;
- static bool &nastyGame;
- static bool &frenchGame;
- static bool &germanGame;
+ static eLevelName currLevel;
+ static bool bDemoMode;
+ static bool nastyGame;
+ static bool frenchGame;
+ static bool germanGame;
#ifdef MORE_LANGUAGES
static bool russianGame;
#endif
- static bool &noProstitutes;
- static bool &playingIntro;
- static char *aDatFile; //[32];
+ static bool noProstitutes;
+ static bool playingIntro;
+ static char aDatFile[32];
static bool InitialiseOnceBeforeRW(void);
static bool InitialiseRenderWare(void);
diff --git a/src/core/IniFile.cpp b/src/core/IniFile.cpp
index 744f4bd0..16e35633 100644
--- a/src/core/IniFile.cpp
+++ b/src/core/IniFile.cpp
@@ -1,5 +1,5 @@
#include "common.h"
-#include "patcher.h"
+
#include "IniFile.h"
#include "CarCtrl.h"
@@ -7,8 +7,8 @@
#include "main.h"
#include "Population.h"
-float CIniFile::PedNumberMultiplier = 1.0f;// = *(float*)0x6182F4;
-float CIniFile::CarNumberMultiplier = 1.0f;// = *(float*)0x6182F8;
+float CIniFile::PedNumberMultiplier = 1.0f;
+float CIniFile::CarNumberMultiplier = 1.0f;
void CIniFile::LoadIniFile()
{
diff --git a/src/core/Pad.cpp b/src/core/Pad.cpp
index 201dc5b6..86aff05e 100644
--- a/src/core/Pad.cpp
+++ b/src/core/Pad.cpp
@@ -9,7 +9,7 @@
#include <Xinput.h>
#pragma comment( lib, "Xinput9_1_0.lib" )
#endif
-#include "patcher.h"
+
#include "Pad.h"
#include "ControllerConfig.h"
#include "Timer.h"
@@ -35,26 +35,26 @@
#include "Wanted.h"
#include "General.h"
-CPad *Pads = (CPad*)0x6F0360; // [2]
-CMousePointerStateHelper &MousePointerStateHelper = *(CMousePointerStateHelper*)0x95CC8C;
+CPad Pads[MAX_PADS];
+CMousePointerStateHelper MousePointerStateHelper;
-bool &CPad::bDisplayNoControllerMessage = *(bool *)0x95CD52;
-bool &CPad::bObsoleteControllerMessage = *(bool *)0x95CDB8;
+bool CPad::bDisplayNoControllerMessage;
+bool CPad::bObsoleteControllerMessage;
bool CPad::bOldDisplayNoControllerMessage;
-bool &CPad::m_bMapPadOneToPadTwo = *(bool *)0x95CD48;
+bool CPad::m_bMapPadOneToPadTwo;
-CKeyboardState &CPad::OldKeyState = *(CKeyboardState*)0x6F1E70;
-CKeyboardState &CPad::NewKeyState = *(CKeyboardState*)0x6E60D0;
-CKeyboardState &CPad::TempKeyState = *(CKeyboardState*)0x774DE8;
+CKeyboardState CPad::OldKeyState;
+CKeyboardState CPad::NewKeyState;
+CKeyboardState CPad::TempKeyState;
char CPad::KeyBoardCheatString[20];
-CMouseControllerState &CPad::OldMouseControllerState = *(CMouseControllerState*)0x8472A0;
-CMouseControllerState &CPad::NewMouseControllerState = *(CMouseControllerState*)0x8809F0;
-CMouseControllerState &CPad::PCTempMouseControllerState = *(CMouseControllerState*)0x6F1E60;
+CMouseControllerState CPad::OldMouseControllerState;
+CMouseControllerState CPad::NewMouseControllerState;
+CMouseControllerState CPad::PCTempMouseControllerState;
_TODO("gbFastTime");
-extern bool &gbFastTime;
+extern bool gbFastTime;
void WeaponCheat()
{
@@ -1285,7 +1285,7 @@ bool CPad::GetLookRight(void)
{
if ( ArePlayerControlsDisabled() )
return false;
-
+
return !!(NewState.RightShoulder2 && !NewState.LeftShoulder2);
}
@@ -1294,7 +1294,7 @@ bool CPad::GetLookBehindForCar(void)
{
if ( ArePlayerControlsDisabled() )
return false;
-
+
return !!(NewState.RightShoulder2 && NewState.LeftShoulder2);
}
@@ -1768,7 +1768,7 @@ bool CPad::CycleWeaponRightJustDown(void)
{
if ( ArePlayerControlsDisabled() )
return false;
-
+
return !!(NewState.RightShoulder2 && !OldState.RightShoulder2);
}
@@ -1865,7 +1865,7 @@ bool CPad::ShiftTargetLeftJustDown(void)
{
if ( ArePlayerControlsDisabled() )
return false;
-
+
return !!(NewState.LeftShoulder2 && !OldState.LeftShoulder2);
}
@@ -1873,7 +1873,7 @@ bool CPad::ShiftTargetRightJustDown(void)
{
if ( ArePlayerControlsDisabled() )
return false;
-
+
return !!(NewState.RightShoulder2 && !OldState.RightShoulder2);
}
@@ -2404,111 +2404,3 @@ int32 *CPad::EditCodesForControls(int32 *pRsKeys, int32 nSize)
return pRsKeys;
}
-
-STARTPATCHES
- InjectHook(0x490D90, &WeaponCheat, PATCH_JUMP);
- InjectHook(0x490E70, &HealthCheat, PATCH_JUMP);
- InjectHook(0x490EE0, &TankCheat, PATCH_JUMP);
- InjectHook(0x491040, &BlowUpCarsCheat, PATCH_JUMP);
- InjectHook(0x4910B0, &ChangePlayerCheat, PATCH_JUMP);
- InjectHook(0x4911C0, &MayhemCheat, PATCH_JUMP);
- InjectHook(0x491270, &EverybodyAttacksPlayerCheat, PATCH_JUMP);
- InjectHook(0x491370, &WeaponsForAllCheat, PATCH_JUMP);
- InjectHook(0x4913A0, &FastTimeCheat, PATCH_JUMP);
- InjectHook(0x4913F0, &SlowTimeCheat, PATCH_JUMP);
- InjectHook(0x491430, &MoneyCheat, PATCH_JUMP);
- InjectHook(0x491460, &ArmourCheat, PATCH_JUMP);
- InjectHook(0x491490, &WantedLevelUpCheat, PATCH_JUMP);
- InjectHook(0x4914F0, &WantedLevelDownCheat, PATCH_JUMP);
- InjectHook(0x491520, &SunnyWeatherCheat, PATCH_JUMP);
- InjectHook(0x491550, &CloudyWeatherCheat, PATCH_JUMP);
- InjectHook(0x491580, &RainyWeatherCheat, PATCH_JUMP);
- InjectHook(0x4915B0, &FoggyWeatherCheat, PATCH_JUMP);
- InjectHook(0x4915E0, &FastWeatherCheat, PATCH_JUMP);
- InjectHook(0x491610, &OnlyRenderWheelsCheat, PATCH_JUMP);
- InjectHook(0x491640, &ChittyChittyBangBangCheat, PATCH_JUMP);
- InjectHook(0x491670, &StrongGripCheat, PATCH_JUMP);
- InjectHook(0x4916A0, &NastyLimbsCheat, PATCH_JUMP);
-
- InjectHook(0x4916C0, &CControllerState::Clear, PATCH_JUMP);
- InjectHook(0x491760, &CKeyboardState::Clear, PATCH_JUMP);
- InjectHook(0x491A10, &CPad::Clear, PATCH_JUMP);
- InjectHook(0x491B50, &CPad::ClearMouseHistory, PATCH_JUMP);
- //InjectHook(0x491B80, &CMouseControllerState::CMouseControllerState, PATCH_JUMP);
- InjectHook(0x491BB0, &CMouseControllerState::Clear, PATCH_JUMP);
- InjectHook(0x491BD0, &CMousePointerStateHelper::GetMouseSetUp, PATCH_JUMP);
- InjectHook(0x491CA0, &CPad::UpdateMouse, PATCH_JUMP);
- InjectHook(0x491E60, &CPad::ReconcileTwoControllersInput, PATCH_JUMP);
- InjectHook(0x492230, &CPad::StartShake, PATCH_JUMP);
- InjectHook(0x492290, &CPad::StartShake_Distance, PATCH_JUMP);
- InjectHook(0x492360, &CPad::StartShake_Train, PATCH_JUMP);
- InjectHook(0x492450, &CPad::AddToPCCheatString, PATCH_JUMP);
- InjectHook(0x492720, CPad::UpdatePads, PATCH_JUMP);
- InjectHook(0x492C60, &CPad::ProcessPCSpecificStuff, PATCH_JUMP);
- InjectHook(0x492C70, &CPad::Update, PATCH_JUMP);
-#pragma warning( push )
-#pragma warning( disable : 4573)
- InjectHook(0x492F00, (void (*)())CPad::DoCheats, PATCH_JUMP);
-#pragma warning( pop )
- InjectHook(0x492F20, (void (CPad::*)(int16))&CPad::DoCheats, PATCH_JUMP);
- InjectHook(0x492F30, CPad::StopPadsShaking, PATCH_JUMP);
- InjectHook(0x492F50, &CPad::StopShaking, PATCH_JUMP);
- InjectHook(0x492F60, CPad::GetPad, PATCH_JUMP);
- InjectHook(0x492F70, &CPad::GetSteeringLeftRight, PATCH_JUMP);
- InjectHook(0x492FF0, &CPad::GetSteeringUpDown, PATCH_JUMP);
- InjectHook(0x493070, &CPad::GetCarGunUpDown, PATCH_JUMP);
- InjectHook(0x4930C0, &CPad::GetCarGunLeftRight, PATCH_JUMP);
- InjectHook(0x493110, &CPad::GetPedWalkLeftRight, PATCH_JUMP);
- InjectHook(0x493190, &CPad::GetPedWalkUpDown, PATCH_JUMP);
- InjectHook(0x493210, &CPad::GetAnalogueUpDown, PATCH_JUMP);
- InjectHook(0x493290, &CPad::GetLookLeft, PATCH_JUMP);
- InjectHook(0x4932C0, &CPad::GetLookRight, PATCH_JUMP);
- InjectHook(0x4932F0, &CPad::GetLookBehindForCar, PATCH_JUMP);
- InjectHook(0x493320, &CPad::GetLookBehindForPed, PATCH_JUMP);
- InjectHook(0x493350, &CPad::GetHorn, PATCH_JUMP);
- InjectHook(0x4933F0, &CPad::HornJustDown, PATCH_JUMP);
- InjectHook(0x493490, &CPad::GetCarGunFired, PATCH_JUMP);
- InjectHook(0x4934F0, &CPad::CarGunJustDown, PATCH_JUMP);
- InjectHook(0x493560, &CPad::GetHandBrake, PATCH_JUMP);
- InjectHook(0x4935A0, &CPad::GetBrake, PATCH_JUMP);
- InjectHook(0x4935F0, &CPad::GetExitVehicle, PATCH_JUMP);
- InjectHook(0x493650, &CPad::ExitVehicleJustDown, PATCH_JUMP);
- InjectHook(0x4936C0, &CPad::GetWeapon, PATCH_JUMP);
- InjectHook(0x493700, &CPad::WeaponJustDown, PATCH_JUMP);
- InjectHook(0x493780, &CPad::GetAccelerate, PATCH_JUMP);
- InjectHook(0x4937D0, &CPad::CycleCameraModeUpJustDown, PATCH_JUMP);
- InjectHook(0x493830, &CPad::CycleCameraModeDownJustDown, PATCH_JUMP);
- InjectHook(0x493870, &CPad::ChangeStationJustDown, PATCH_JUMP);
- InjectHook(0x493910, &CPad::CycleWeaponLeftJustDown, PATCH_JUMP);
- InjectHook(0x493940, &CPad::CycleWeaponRightJustDown, PATCH_JUMP);
- InjectHook(0x493970, &CPad::GetTarget, PATCH_JUMP);
- InjectHook(0x4939D0, &CPad::TargetJustDown, PATCH_JUMP);
- InjectHook(0x493A40, &CPad::JumpJustDown, PATCH_JUMP);
- InjectHook(0x493A70, &CPad::GetSprint, PATCH_JUMP);
- InjectHook(0x493AE0, &CPad::ShiftTargetLeftJustDown, PATCH_JUMP);
- InjectHook(0x493B10, &CPad::ShiftTargetRightJustDown, PATCH_JUMP);
- InjectHook(0x493B40, &CPad::GetAnaloguePadUp, PATCH_JUMP);
- InjectHook(0x493BA0, &CPad::GetAnaloguePadDown, PATCH_JUMP);
- InjectHook(0x493C00, &CPad::GetAnaloguePadLeft, PATCH_JUMP);
- InjectHook(0x493C60, &CPad::GetAnaloguePadRight, PATCH_JUMP);
- InjectHook(0x493CC0, &CPad::GetAnaloguePadLeftJustUp, PATCH_JUMP);
- InjectHook(0x493D20, &CPad::GetAnaloguePadRightJustUp, PATCH_JUMP);
- InjectHook(0x493D80, &CPad::ForceCameraBehindPlayer, PATCH_JUMP);
- InjectHook(0x493E00, &CPad::SniperZoomIn, PATCH_JUMP);
- InjectHook(0x493E70, &CPad::SniperZoomOut, PATCH_JUMP);
- InjectHook(0x493EE0, &CPad::SniperModeLookLeftRight, PATCH_JUMP);
- InjectHook(0x493F30, &CPad::SniperModeLookUpDown, PATCH_JUMP);
- InjectHook(0x493F80, &CPad::LookAroundLeftRight, PATCH_JUMP);
- InjectHook(0x494130, &CPad::LookAroundUpDown, PATCH_JUMP);
- InjectHook(0x494290, &CPad::ResetAverageWeapon, PATCH_JUMP);
- InjectHook(0x4942B0, CPad::PrintErrorMessage, PATCH_JUMP);
- InjectHook(0x494420, LittleTest, PATCH_JUMP);
- InjectHook(0x494450, CPad::ResetCheats, PATCH_JUMP);
- InjectHook(0x4944B0, CPad::EditString, PATCH_JUMP);
- InjectHook(0x494690, CPad::EditCodesForControls, PATCH_JUMP);
-
- //InjectHook(0x494E50, `global constructor keyed to'Pad.cpp, PATCH_JUMP);
- //InjectHook(0x494EB0, sub_494EB0, PATCH_JUMP);
- //InjectHook(0x494ED0, &CPad::~CPad, PATCH_JUMP);
- //InjectHook(0x494EE0, &CPad::CPad, PATCH_JUMP);
-ENDPATCHES
diff --git a/src/core/Pad.h b/src/core/Pad.h
index cb705c6b..9ebd6396 100644
--- a/src/core/Pad.h
+++ b/src/core/Pad.h
@@ -66,7 +66,7 @@ public:
VALIDATE_SIZE(CMousePointerStateHelper, 0x2);
-extern CMousePointerStateHelper &MousePointerStateHelper;
+extern CMousePointerStateHelper MousePointerStateHelper;
class CKeyboardState
@@ -163,18 +163,18 @@ public:
CPad() { }
~CPad() { }
- static bool &bDisplayNoControllerMessage;
- static bool &bObsoleteControllerMessage;
+ static bool bDisplayNoControllerMessage;
+ static bool bObsoleteControllerMessage;
static bool bOldDisplayNoControllerMessage;
- static bool &m_bMapPadOneToPadTwo;
+ static bool m_bMapPadOneToPadTwo;
- static CKeyboardState &OldKeyState;
- static CKeyboardState &NewKeyState;
- static CKeyboardState &TempKeyState;
+ static CKeyboardState OldKeyState;
+ static CKeyboardState NewKeyState;
+ static CKeyboardState TempKeyState;
static char KeyBoardCheatString[20];
- static CMouseControllerState &OldMouseControllerState;
- static CMouseControllerState &NewMouseControllerState;
- static CMouseControllerState &PCTempMouseControllerState;
+ static CMouseControllerState OldMouseControllerState;
+ static CMouseControllerState NewMouseControllerState;
+ static CMouseControllerState PCTempMouseControllerState;
#ifdef GTA_PS2_STUFF
@@ -450,4 +450,4 @@ public:
};
VALIDATE_SIZE(CPad, 0xFC);
-extern CPad *Pads; //[2]
+extern CPad Pads[MAX_PADS];
diff --git a/src/core/Placeable.cpp b/src/core/Placeable.cpp
index c882fc27..99ca5659 100644
--- a/src/core/Placeable.cpp
+++ b/src/core/Placeable.cpp
@@ -1,6 +1,6 @@
#include "common.h"
#include "Placeable.h"
-#include "patcher.h"
+
CPlaceable::CPlaceable(void)
{
@@ -62,21 +62,3 @@ CPlaceable::IsWithinArea(float x1, float y1, float z1, float x2, float y2, float
y1 <= GetPosition().y && GetPosition().y <= y2 &&
z1 <= GetPosition().z && GetPosition().z <= z2;
}
-
-#include <new>
-
-class CPlaceable_ : public CPlaceable
-{
-public:
- CPlaceable *ctor(void) { return ::new (this) CPlaceable(); }
- void dtor(void) { CPlaceable::~CPlaceable(); }
-};
-
-STARTPATCHES
- InjectHook(0x49F9A0, &CPlaceable_::ctor, PATCH_JUMP);
- InjectHook(0x49F9E0, &CPlaceable_::dtor, PATCH_JUMP);
-
- InjectHook(0x49FA00, &CPlaceable::SetHeading, PATCH_JUMP);
- InjectHook(0x49FA50, (bool (CPlaceable::*)(float, float, float, float))&CPlaceable::IsWithinArea, PATCH_JUMP);
- InjectHook(0x49FAF0, (bool (CPlaceable::*)(float, float, float, float, float, float))&CPlaceable::IsWithinArea, PATCH_JUMP);
-ENDPATCHES
diff --git a/src/core/PlayerInfo.cpp b/src/core/PlayerInfo.cpp
index 0043c2f4..cfa0cea4 100644
--- a/src/core/PlayerInfo.cpp
+++ b/src/core/PlayerInfo.cpp
@@ -1,5 +1,5 @@
#include "common.h"
-#include "patcher.h"
+
#include "main.h"
#include "PlayerPed.h"
#include "Wanted.h"
@@ -558,20 +558,3 @@ CPlayerInfo::Process(void)
CStats::DistanceTravelledOnFoot += FindPlayerPed()->m_fDistanceTravelled;
}
}
-
-STARTPATCHES
- InjectHook(0x4B5DC0, &CPlayerInfo::dtor, PATCH_JUMP);
- InjectHook(0x4A1700, &CPlayerInfo::LoadPlayerSkin, PATCH_JUMP);
- InjectHook(0x4A1750, &CPlayerInfo::DeletePlayerSkin, PATCH_JUMP);
- InjectHook(0x4A12E0, &CPlayerInfo::KillPlayer, PATCH_JUMP);
- InjectHook(0x4A1330, &CPlayerInfo::ArrestPlayer, PATCH_JUMP);
- InjectHook(0x49FC10, &CPlayerInfo::Clear, PATCH_JUMP);
- InjectHook(0x4A15C0, &CPlayerInfo::BlowUpRCBuggy, PATCH_JUMP);
- InjectHook(0x4A13B0, &CPlayerInfo::CancelPlayerEnteringCars, PATCH_JUMP);
- InjectHook(0x4A1400, &CPlayerInfo::MakePlayerSafe, PATCH_JUMP);
- InjectHook(0x4A0EC0, &CPlayerInfo::EvaluateCarPosition, PATCH_JUMP);
- InjectHook(0x4A15F0, &CPlayerInfo::AwardMoneyForExplosion, PATCH_JUMP);
- InjectHook(0x4A0B20, &CPlayerInfo::LoadPlayerInfo, PATCH_JUMP);
- InjectHook(0x4A0960, &CPlayerInfo::SavePlayerInfo, PATCH_JUMP);
- InjectHook(0x49FD30, &CPlayerInfo::Process, PATCH_JUMP);
-ENDPATCHES
diff --git a/src/core/Pools.cpp b/src/core/Pools.cpp
index 6add9e0c..dfc6974a 100644
--- a/src/core/Pools.cpp
+++ b/src/core/Pools.cpp
@@ -1,5 +1,5 @@
#include "common.h"
-#include "patcher.h"
+
#include "Pools.h"
#include "Boat.h"
@@ -10,15 +10,15 @@
#include "Wanted.h"
#include "World.h"
-CCPtrNodePool *&CPools::ms_pPtrNodePool = *(CCPtrNodePool**)0x943044;
-CEntryInfoNodePool *&CPools::ms_pEntryInfoNodePool = *(CEntryInfoNodePool**)0x941448;
-CPedPool *&CPools::ms_pPedPool = *(CPedPool**)0x8F2C60;
-CVehiclePool *&CPools::ms_pVehiclePool = *(CVehiclePool**)0x9430DC;
-CBuildingPool *&CPools::ms_pBuildingPool = *(CBuildingPool**)0x8F2C04;
-CTreadablePool *&CPools::ms_pTreadablePool = *(CTreadablePool**)0x8F2568;
-CObjectPool *&CPools::ms_pObjectPool = *(CObjectPool**)0x880E28;
-CDummyPool *&CPools::ms_pDummyPool = *(CDummyPool**)0x8F2C18;
-CAudioScriptObjectPool *&CPools::ms_pAudioScriptObjectPool = *(CAudioScriptObjectPool**)0x8F1B6C;
+CCPtrNodePool *CPools::ms_pPtrNodePool;
+CEntryInfoNodePool *CPools::ms_pEntryInfoNodePool;
+CPedPool *CPools::ms_pPedPool;
+CVehiclePool *CPools::ms_pVehiclePool;
+CBuildingPool *CPools::ms_pBuildingPool;
+CTreadablePool *CPools::ms_pTreadablePool;
+CObjectPool *CPools::ms_pObjectPool;
+CDummyPool *CPools::ms_pDummyPool;
+CAudioScriptObjectPool *CPools::ms_pAudioScriptObjectPool;
void
CPools::Initialise(void)
@@ -425,19 +425,3 @@ INITSAVEBUF
}
VALIDATESAVEBUF(size)
}
-
-STARTPATCHES
- InjectHook(0x4A1770, CPools::Initialise, PATCH_JUMP);
- InjectHook(0x4A1880, CPools::ShutDown, PATCH_JUMP);
- InjectHook(0x4A1A50, CPools::CheckPoolsEmpty, PATCH_JUMP);
- InjectHook(0x4A1A80, CPools::GetPedRef, PATCH_JUMP);
- InjectHook(0x4A1AA0, CPools::GetPed, PATCH_JUMP);
- InjectHook(0x4A1AC0, CPools::GetVehicleRef, PATCH_JUMP);
- InjectHook(0x4A1AE0, CPools::GetVehicle, PATCH_JUMP);
- InjectHook(0x4A1B00, CPools::GetObjectRef, PATCH_JUMP);
- InjectHook(0x4A1B20, CPools::GetObject, PATCH_JUMP);
- InjectHook(0x4A2DB0, CPools::MakeSureSlotInObjectPoolIsEmpty, PATCH_JUMP);
- InjectHook(0x4A1B40, CPools::LoadVehiclePool, PATCH_JUMP);
- InjectHook(0x4A2550, CPools::LoadObjectPool, PATCH_JUMP);
- InjectHook(0x4A2B50, CPools::LoadPedPool, PATCH_JUMP);
-ENDPATCHES
diff --git a/src/core/Pools.h b/src/core/Pools.h
index 74b87585..b0ba6598 100644
--- a/src/core/Pools.h
+++ b/src/core/Pools.h
@@ -22,15 +22,15 @@ typedef CPool<cAudioScriptObject> CAudioScriptObjectPool;
class CPools
{
- static CCPtrNodePool *&ms_pPtrNodePool;
- static CEntryInfoNodePool *&ms_pEntryInfoNodePool;
- static CPedPool *&ms_pPedPool;
- static CVehiclePool *&ms_pVehiclePool;
- static CBuildingPool *&ms_pBuildingPool;
- static CTreadablePool *&ms_pTreadablePool;
- static CObjectPool *&ms_pObjectPool;
- static CDummyPool *&ms_pDummyPool;
- static CAudioScriptObjectPool *&ms_pAudioScriptObjectPool;
+ static CCPtrNodePool *ms_pPtrNodePool;
+ static CEntryInfoNodePool *ms_pEntryInfoNodePool;
+ static CPedPool *ms_pPedPool;
+ static CVehiclePool *ms_pVehiclePool;
+ static CBuildingPool *ms_pBuildingPool;
+ static CTreadablePool *ms_pTreadablePool;
+ static CObjectPool *ms_pObjectPool;
+ static CDummyPool *ms_pDummyPool;
+ static CAudioScriptObjectPool *ms_pAudioScriptObjectPool;
public:
static CCPtrNodePool *GetPtrNodePool(void) { return ms_pPtrNodePool; }
static CEntryInfoNodePool *GetEntryInfoNodePool(void) { return ms_pEntryInfoNodePool; }
diff --git a/src/core/Radar.cpp b/src/core/Radar.cpp
index ed24814d..2b3e6f1e 100644
--- a/src/core/Radar.cpp
+++ b/src/core/Radar.cpp
@@ -1,6 +1,6 @@
#include "config.h"
#include "common.h"
-#include "patcher.h"
+
#include "RwHelper.h"
#include "Radar.h"
#include "Camera.h"
@@ -19,28 +19,28 @@
float CRadar::m_radarRange;
sRadarTrace CRadar::ms_RadarTrace[NUMRADARBLIPS];
CVector2D vec2DRadarOrigin;
-int32 gRadarTxdIds[64];// = (int*)0x6299C0;
-
-CSprite2d CRadar::AsukaSprite;// = *(CSprite2d*)0x8F1A40;
-CSprite2d CRadar::BombSprite;// = (CSprite2d*)0x8F5FB4;
-CSprite2d CRadar::CatSprite;// = (CSprite2d*)0x885B24;
-CSprite2d CRadar::CentreSprite;// = (CSprite2d*)0x8F6268;
-CSprite2d CRadar::CopcarSprite;// = (CSprite2d*)0x8F1A2C;
-CSprite2d CRadar::DonSprite;// = (CSprite2d*)0x8F2BE0;
-CSprite2d CRadar::EightSprite;// = (CSprite2d*)0x8F2BCC;
-CSprite2d CRadar::ElSprite;// = (CSprite2d*)0x8F1B80;
-CSprite2d CRadar::IceSprite;// = (CSprite2d*)0x9415FC;
-CSprite2d CRadar::JoeySprite;// = (CSprite2d*)0x8F2C00;
-CSprite2d CRadar::KenjiSprite;// = (CSprite2d*)0x8F2C68;
-CSprite2d CRadar::LizSprite;// = (CSprite2d*)0x8F5830;
-CSprite2d CRadar::LuigiSprite;// = (CSprite2d*)0x8F1A3C;
-CSprite2d CRadar::NorthSprite;// = (CSprite2d*)0x8F6274;
-CSprite2d CRadar::RaySprite;// = (CSprite2d*)0x8E2A7C;
-CSprite2d CRadar::SalSprite;// = (CSprite2d*)0x8F29EC;
-CSprite2d CRadar::SaveSprite;// = (CSprite2d*)0x8F5F74;
-CSprite2d CRadar::SpraySprite;// = (CSprite2d*)0x94307C;
-CSprite2d CRadar::TonySprite;// = (CSprite2d*)0x885B58;
-CSprite2d CRadar::WeaponSprite;// = (CSprite2d*)0x941534;
+int32 gRadarTxdIds[64];
+
+CSprite2d CRadar::AsukaSprite;
+CSprite2d CRadar::BombSprite;
+CSprite2d CRadar::CatSprite;
+CSprite2d CRadar::CentreSprite;
+CSprite2d CRadar::CopcarSprite;
+CSprite2d CRadar::DonSprite;
+CSprite2d CRadar::EightSprite;
+CSprite2d CRadar::ElSprite;
+CSprite2d CRadar::IceSprite;
+CSprite2d CRadar::JoeySprite;
+CSprite2d CRadar::KenjiSprite;
+CSprite2d CRadar::LizSprite;
+CSprite2d CRadar::LuigiSprite;
+CSprite2d CRadar::NorthSprite;
+CSprite2d CRadar::RaySprite;
+CSprite2d CRadar::SalSprite;
+CSprite2d CRadar::SaveSprite;
+CSprite2d CRadar::SpraySprite;
+CSprite2d CRadar::TonySprite;
+CSprite2d CRadar::WeaponSprite;
CSprite2d *CRadar::RadarSprites[RADAR_SPRITE_COUNT] = {
nil,
@@ -1458,51 +1458,3 @@ CRadar::ToggleTargetMarker(float x, float y)
}
#endif
-STARTPATCHES
- InjectHook(0x4A3EF0, CRadar::Initialise, PATCH_JUMP);
- InjectHook(0x4A3F60, CRadar::Shutdown, PATCH_JUMP);
- InjectHook(0x4A4030, CRadar::LoadTextures, PATCH_JUMP);
- InjectHook(0x4A4180, CRadar::GetNewUniqueBlipIndex, PATCH_JUMP);
- InjectHook(0x4A41C0, CRadar::GetActualBlipArrayIndex, PATCH_JUMP);
- InjectHook(0x4A4200, CRadar::DrawMap, PATCH_JUMP);
- InjectHook(0x4A42F0, CRadar::DrawBlips, PATCH_JUMP);
- InjectHook(0x4A4C70, CRadar::Draw3dMarkers, PATCH_JUMP);
- InjectHook(0x4A4F30, CRadar::LimitRadarPoint, PATCH_JUMP);
- InjectHook(0x4A4F90, CRadar::CalculateBlipAlpha, PATCH_JUMP);
- InjectHook(0x4A5040, CRadar::TransformRadarPointToScreenSpace, PATCH_JUMP);
- InjectHook(0x4A50D0, CRadar::TransformRealWorldPointToRadarSpace, PATCH_JUMP);
- InjectHook(0x4A5300, CRadar::TransformRadarPointToRealWorldSpace, PATCH_JUMP);
- InjectHook(0x4A5530, CRadar::TransformRealWorldToTexCoordSpace, PATCH_JUMP);
- InjectHook(0x4A5590, CRadar::SetCoordBlip, PATCH_JUMP);
- InjectHook(0x4A5640, CRadar::SetEntityBlip, PATCH_JUMP);
- InjectHook(0x4A56C0, CRadar::ClearBlipForEntity, PATCH_JUMP);
- InjectHook(0x4A5720, CRadar::ClearBlip, PATCH_JUMP);
- InjectHook(0x4A5770, CRadar::ChangeBlipColour, PATCH_JUMP);
- InjectHook(0x4A57A0, CRadar::ChangeBlipBrightness, PATCH_JUMP);
- InjectHook(0x4A57E0, CRadar::ChangeBlipScale, PATCH_JUMP);
- InjectHook(0x4A5810, CRadar::ChangeBlipDisplay, PATCH_JUMP);
- InjectHook(0x4A5840, CRadar::SetBlipSprite, PATCH_JUMP);
- InjectHook(0x4A5870, CRadar::ShowRadarTrace, PATCH_JUMP);
- InjectHook(0x4A59C0, CRadar::ShowRadarMarker, PATCH_JUMP);
- InjectHook(0x4A5BB0, CRadar::GetRadarTraceColour, PATCH_JUMP);
- InjectHook(0x4A5C60, CRadar::SetRadarMarkerState, PATCH_JUMP);
- InjectHook(0x4A5D10, CRadar::DrawRotatingRadarSprite, PATCH_JUMP);
- InjectHook(0x4A5EF0, CRadar::DrawRadarSprite, PATCH_JUMP);
- InjectHook(0x4A6020, ClipRadarTileCoords, PATCH_JUMP);
- InjectHook(0x4A6060, RequestMapSection, PATCH_JUMP);
- InjectHook(0x4A60A0, RemoveMapSection, PATCH_JUMP);
- InjectHook(0x4A60E0, CRadar::RemoveRadarSections, PATCH_JUMP);
- InjectHook(0x4A6100, (void (*)(int32, int32))&CRadar::StreamRadarSections, PATCH_JUMP);
- InjectHook(0x4A6160, IsPointInsideRadar, PATCH_JUMP);
- InjectHook(0x4A61C0, GetTextureCorners, PATCH_JUMP);
- InjectHook(0x4A6250, LineRadarBoxCollision, PATCH_JUMP);
- InjectHook(0x4A64A0, CRadar::ClipRadarPoly, PATCH_JUMP);
- InjectHook(0x4A67E0, CRadar::DrawRadarSection, PATCH_JUMP);
- InjectHook(0x4A69C0, CRadar::DrawRadarMask, PATCH_JUMP);
- InjectHook(0x4A6B60, (void (*)(const CVector&))&CRadar::StreamRadarSections, PATCH_JUMP);
- InjectHook(0x4A6C20, CRadar::DrawRadarMap, PATCH_JUMP);
- InjectHook(0x4A6E30, CRadar::SaveAllRadarBlips, PATCH_JUMP);
- InjectHook(0x4A6F30, CRadar::LoadAllRadarBlips, PATCH_JUMP);
- //InjectHook(0x4A7000, `global constructor keyed to'Radar.cpp, PATCH_JUMP);
- //InjectHook(0x4A7260, sRadarTrace::sRadarTrace, PATCH_JUMP);
-ENDPATCHES \ No newline at end of file
diff --git a/src/core/References.cpp b/src/core/References.cpp
index e87f0fd5..3eb2eaf3 100644
--- a/src/core/References.cpp
+++ b/src/core/References.cpp
@@ -1,13 +1,13 @@
#include "common.h"
-#include "patcher.h"
+
#include "World.h"
#include "Vehicle.h"
#include "PlayerPed.h"
#include "Pools.h"
#include "References.h"
-CReference *CReferences::aRefs = (CReference*)0x70BBE0; //[NUMREFERENCES];
-CReference *&CReferences::pEmptyList = *(CReference**)0x8F1AF8;
+CReference CReferences::aRefs[NUMREFERENCES];
+CReference *CReferences::pEmptyList;
void
CReferences::Init(void)
@@ -57,9 +57,3 @@ CReferences::PruneAllReferencesInWorld(void)
e->PruneReferences();
}
}
-
-STARTPATCHES
- InjectHook(0x4A7350, CReferences::Init, PATCH_JUMP);
- InjectHook(0x4A7570, CReferences::RemoveReferencesToPlayer, PATCH_JUMP);
- InjectHook(0x4A75A0, CReferences::PruneAllReferencesInWorld, PATCH_JUMP);
-ENDPATCHES
diff --git a/src/core/References.h b/src/core/References.h
index 6476e243..e7a64de7 100644
--- a/src/core/References.h
+++ b/src/core/References.h
@@ -11,8 +11,8 @@ struct CReference
class CReferences
{
public:
- static CReference *aRefs; //[NUMREFERENCES];
- static CReference *&pEmptyList;
+ static CReference aRefs[NUMREFERENCES];
+ static CReference *pEmptyList;
static void Init(void);
static void RemoveReferencesToPlayer(void);
diff --git a/src/core/Stats.cpp b/src/core/Stats.cpp
index 02092a30..ef3c0ab6 100644
--- a/src/core/Stats.cpp
+++ b/src/core/Stats.cpp
@@ -1,62 +1,62 @@
#include "common.h"
-#include "patcher.h"
+
#include "Stats.h"
#include "Text.h"
#include "World.h"
-int32 &CStats::DaysPassed = *(int32*)0x8F2BB8;
-int32 &CStats::HeadsPopped = *(int32*)0x8F647C;
-int32& CStats::CommercialPassed = *(int32*)0x8F4334;
-int32& CStats::IndustrialPassed = *(int32*)0x8E2A68;
-int32& CStats::SuburbanPassed = *(int32*)0x8F2740;
-int32 &CStats::NumberKillFrenziesPassed = *(int32*)0x8E287C;
-int32 &CStats::PeopleKilledByOthers = *(int32*)0x8E2C50;
-int32 &CStats::HelisDestroyed = *(int32*)0x8E2A64;
-int32(&CStats::PedsKilledOfThisType)[NUM_PEDTYPES] = *(int32(*)[NUM_PEDTYPES]) * (uintptr*)0x880DBC;
-int32 &CStats::TimesDied = *(int32*)0x8E2BDC;
-int32 &CStats::TimesArrested = *(int32*)0x8E2BEC;
-int32 &CStats::KillsSinceLastCheckpoint = *(int32*)0x8F2C8C;
-int32& CStats::DistanceTravelledInVehicle = *(int32*)0x940574;
-int32& CStats::DistanceTravelledOnFoot = *(int32*)0x941518;
-int32 &CStats::ProgressMade = *(int32*)0x8F6224;
-int32 &CStats::TotalProgressInGame = *(int32*)0x885B2C;
-int32& CStats::CarsExploded = *(int32*)0x941288;
-int32& CStats::PeopleKilledByPlayer = *(int32*)0x8F1B7C;
-float &CStats::MaximumJumpDistance = *(float*)0x8F2BDC;
-float &CStats::MaximumJumpHeight = *(float*)0x940564;
-int32 &CStats::MaximumJumpFlips = *(int32*)0x8F2524;
-int32 &CStats::MaximumJumpSpins = *(int32*)0x8F29B0;
-int32 &CStats::BestStuntJump = *(int32*)0x885B50;
-int32 &CStats::NumberOfUniqueJumpsFound = *(int32*)0x885B74;
-int32 &CStats::TotalNumberOfUniqueJumps = *(int32*)0x8E2DC0;
-int32 &CStats::PassengersDroppedOffWithTaxi = *(int32*)0x940724;
-int32 &CStats::MoneyMadeWithTaxi = *(int32*)0x941544;
-int32 &CStats::MissionsGiven = *(int32*)0x9430E8;
-int32 &CStats::MissionsPassed = *(int32*)0x940768;
-char(&CStats::LastMissionPassedName)[8] = *(char(*)[8])*(uintptr*)0x70D828;
-int32 &CStats::TotalLegitimateKills = *(int32*)0x8F6004;
-int32 &CStats::ElBurroTime = *(int32*)0x8E2A6C;
-int32& CStats::Record4x4One = *(int32*)0x940570;
-int32& CStats::Record4x4Two = *(int32*)0x94058C;
-int32& CStats::Record4x4Three = *(int32*)0x880FA8;
-int32& CStats::Record4x4Mayhem = *(int32*)0x885B70;
-int32& CStats::LivesSavedWithAmbulance = *(int32*)0x8F57E0;
-int32& CStats::CriminalsCaught = *(int32*)0x8F2518;
-int32& CStats::HighestLevelAmbulanceMission = *(int32*)0x8F2A04;
-int32& CStats::FiresExtinguished = *(int32*)0x8F5FEC;
-int32& CStats::LongestFlightInDodo = *(int32*)0x8F5FE4;
-int32& CStats::TimeTakenDefuseMission = *(int32*)0x880E24;
-int32& CStats::TotalNumberKillFrenzies = *(int32*)0x8E2884;
-int32& CStats::TotalNumberMissions = *(int32*)0x8E2820;
-int32& CStats::RoundsFiredByPlayer = *(int32*)0x8E2BE8;
-int32& CStats::KgsOfExplosivesUsed = *(int32*)0x8F2510;
-int32& CStats::InstantHitsFiredByPlayer = *(int32*)0x943070;
-int32& CStats::InstantHitsHitByPlayer = *(int32*)0x95CB8C;
-int32& CStats::BestTimeBombDefusal = *(int32*)0x880E24;
-int32& CStats::mmRain = *(int32*)0x8F2C98;
-int32& CStats::CarsCrushed = *(int32*)0x943050;
-int32(&CStats::FastestTimes)[CStats::TOTAL_FASTEST_TIMES] = *(int32(*)[CStats::TOTAL_FASTEST_TIMES])*(uintptr*)0x6E9128;
-int32(&CStats::HighestScores)[CStats::TOTAL_HIGHEST_SCORES] = *(int32(*)[CStats::TOTAL_HIGHEST_SCORES]) * (uintptr*)0x8622B0;
+int32 CStats::DaysPassed;
+int32 CStats::HeadsPopped;
+int32 CStats::CommercialPassed;
+int32 CStats::IndustrialPassed;
+int32 CStats::SuburbanPassed;
+int32 CStats::NumberKillFrenziesPassed;
+int32 CStats::PeopleKilledByOthers;
+int32 CStats::HelisDestroyed;
+int32 CStats::PedsKilledOfThisType[NUM_PEDTYPES];
+int32 CStats::TimesDied;
+int32 CStats::TimesArrested;
+int32 CStats::KillsSinceLastCheckpoint;
+int32 CStats::DistanceTravelledInVehicle;
+int32 CStats::DistanceTravelledOnFoot;
+int32 CStats::ProgressMade;
+int32 CStats::TotalProgressInGame;
+int32 CStats::CarsExploded;
+int32 CStats::PeopleKilledByPlayer;
+float CStats::MaximumJumpDistance;
+float CStats::MaximumJumpHeight;
+int32 CStats::MaximumJumpFlips;
+int32 CStats::MaximumJumpSpins;
+int32 CStats::BestStuntJump;
+int32 CStats::NumberOfUniqueJumpsFound;
+int32 CStats::TotalNumberOfUniqueJumps;
+int32 CStats::PassengersDroppedOffWithTaxi;
+int32 CStats::MoneyMadeWithTaxi;
+int32 CStats::MissionsGiven;
+int32 CStats::MissionsPassed;
+char CStats::LastMissionPassedName[8];
+int32 CStats::TotalLegitimateKills;
+int32 CStats::ElBurroTime;
+int32 CStats::Record4x4One;
+int32 CStats::Record4x4Two;
+int32 CStats::Record4x4Three;
+int32 CStats::Record4x4Mayhem;
+int32 CStats::LivesSavedWithAmbulance;
+int32 CStats::CriminalsCaught;
+int32 CStats::HighestLevelAmbulanceMission;
+int32 CStats::FiresExtinguished;
+int32 CStats::LongestFlightInDodo;
+int32 CStats::TimeTakenDefuseMission;
+int32 CStats::TotalNumberKillFrenzies;
+int32 CStats::TotalNumberMissions;
+int32 CStats::RoundsFiredByPlayer;
+int32 CStats::KgsOfExplosivesUsed;
+int32 CStats::InstantHitsFiredByPlayer;
+int32 CStats::InstantHitsHitByPlayer;
+int32 CStats::BestTimeBombDefusal;
+int32 CStats::mmRain;
+int32 CStats::CarsCrushed;
+int32 CStats::FastestTimes[CStats::TOTAL_FASTEST_TIMES];
+int32 CStats::HighestScores[CStats::TOTAL_HIGHEST_SCORES];
void CStats::Init()
{
@@ -418,11 +418,3 @@ void CStats::LoadStats(uint8 *buf, uint32 size)
assert(buf - buf_start == size);
#undef CopyFromBuf
}
-
-STARTPATCHES
- InjectHook(0x48C5A3, CStats::Init, PATCH_JUMP); // CGame::ReInitGameObjectVariables
- InjectHook(0x4AB3E0, CStats::SaveStats, PATCH_JUMP);
- InjectHook(0x4AB670, CStats::LoadStats, PATCH_JUMP);
- InjectHook(0x4AB090, CStats::FindCriminalRatingString, PATCH_JUMP);
- InjectHook(0x4AB2A0, CStats::FindCriminalRatingNumber, PATCH_JUMP);
-ENDPATCHES \ No newline at end of file
diff --git a/src/core/Stats.h b/src/core/Stats.h
index ac3259f9..4445ecf4 100644
--- a/src/core/Stats.h
+++ b/src/core/Stats.h
@@ -9,59 +9,59 @@ public:
TOTAL_FASTEST_TIMES = 16,
TOTAL_HIGHEST_SCORES = 16
};
- static int32 &DaysPassed;
- static int32 &HeadsPopped;
- static int32& CommercialPassed;
- static int32& IndustrialPassed;
- static int32& SuburbanPassed;
- static int32 &NumberKillFrenziesPassed;
- static int32 &PeopleKilledByOthers;
- static int32 &HelisDestroyed;
- static int32(&PedsKilledOfThisType)[ePedType::NUM_PEDTYPES];
- static int32 &TimesDied;
- static int32 &TimesArrested;
- static int32 &KillsSinceLastCheckpoint;
- static int32 &DistanceTravelledInVehicle;
- static int32 &DistanceTravelledOnFoot;
- static int32 &CarsExploded;
- static int32 &PeopleKilledByPlayer;
- static int32 &ProgressMade;
- static int32 &TotalProgressInGame;
- static float &MaximumJumpDistance;
- static float &MaximumJumpHeight;
- static int32 &MaximumJumpFlips;
- static int32 &MaximumJumpSpins;
- static int32 &BestStuntJump;
- static int32 &NumberOfUniqueJumpsFound;
- static int32 &TotalNumberOfUniqueJumps;
- static int32 &PassengersDroppedOffWithTaxi;
- static int32 &MoneyMadeWithTaxi;
- static int32 &MissionsGiven;
- static int32 &MissionsPassed;
- static char (&LastMissionPassedName)[8];
- static int32 &TotalLegitimateKills;
- static int32 &ElBurroTime;
- static int32 &Record4x4One;
- static int32 &Record4x4Two;
- static int32 &Record4x4Three;
- static int32 &Record4x4Mayhem;
- static int32 &LivesSavedWithAmbulance;
- static int32 &CriminalsCaught;
- static int32 &HighestLevelAmbulanceMission;
- static int32 &FiresExtinguished;
- static int32 &LongestFlightInDodo;
- static int32 &TimeTakenDefuseMission;
- static int32 &TotalNumberKillFrenzies;
- static int32 &TotalNumberMissions;
- static int32 &RoundsFiredByPlayer;
- static int32 &KgsOfExplosivesUsed;
- static int32 &InstantHitsFiredByPlayer;
- static int32 &InstantHitsHitByPlayer;
- static int32 &BestTimeBombDefusal;
- static int32 &mmRain;
- static int32 &CarsCrushed;
- static int32(&FastestTimes)[TOTAL_FASTEST_TIMES];
- static int32(&HighestScores)[TOTAL_HIGHEST_SCORES];
+ static int32 DaysPassed;
+ static int32 HeadsPopped;
+ static int32 CommercialPassed;
+ static int32 IndustrialPassed;
+ static int32 SuburbanPassed;
+ static int32 NumberKillFrenziesPassed;
+ static int32 PeopleKilledByOthers;
+ static int32 HelisDestroyed;
+ static int32 PedsKilledOfThisType[ePedType::NUM_PEDTYPES];
+ static int32 TimesDied;
+ static int32 TimesArrested;
+ static int32 KillsSinceLastCheckpoint;
+ static int32 DistanceTravelledInVehicle;
+ static int32 DistanceTravelledOnFoot;
+ static int32 CarsExploded;
+ static int32 PeopleKilledByPlayer;
+ static int32 ProgressMade;
+ static int32 TotalProgressInGame;
+ static float MaximumJumpDistance;
+ static float MaximumJumpHeight;
+ static int32 MaximumJumpFlips;
+ static int32 MaximumJumpSpins;
+ static int32 BestStuntJump;
+ static int32 NumberOfUniqueJumpsFound;
+ static int32 TotalNumberOfUniqueJumps;
+ static int32 PassengersDroppedOffWithTaxi;
+ static int32 MoneyMadeWithTaxi;
+ static int32 MissionsGiven;
+ static int32 MissionsPassed;
+ static char LastMissionPassedName[8];
+ static int32 TotalLegitimateKills;
+ static int32 ElBurroTime;
+ static int32 Record4x4One;
+ static int32 Record4x4Two;
+ static int32 Record4x4Three;
+ static int32 Record4x4Mayhem;
+ static int32 LivesSavedWithAmbulance;
+ static int32 CriminalsCaught;
+ static int32 HighestLevelAmbulanceMission;
+ static int32 FiresExtinguished;
+ static int32 LongestFlightInDodo;
+ static int32 TimeTakenDefuseMission;
+ static int32 TotalNumberKillFrenzies;
+ static int32 TotalNumberMissions;
+ static int32 RoundsFiredByPlayer;
+ static int32 KgsOfExplosivesUsed;
+ static int32 InstantHitsFiredByPlayer;
+ static int32 InstantHitsHitByPlayer;
+ static int32 BestTimeBombDefusal;
+ static int32 mmRain;
+ static int32 CarsCrushed;
+ static int32 FastestTimes[TOTAL_FASTEST_TIMES];
+ static int32 HighestScores[TOTAL_HIGHEST_SCORES];
public:
static void Init(void);
diff --git a/src/core/Streaming.cpp b/src/core/Streaming.cpp
index d00edf51..039377f4 100644
--- a/src/core/Streaming.cpp
+++ b/src/core/Streaming.cpp
@@ -1,5 +1,5 @@
#include "common.h"
-#include "patcher.h"
+
#include "General.h"
#include "Pad.h"
#include "Hud.h"
@@ -30,49 +30,49 @@
#include "Streaming.h"
#include "main.h"
-bool &CStreaming::ms_disableStreaming = *(bool*)0x95CD6E;
-bool &CStreaming::ms_bLoadingBigModel = *(bool*)0x95CDB0;
-int32 &CStreaming::ms_numModelsRequested = *(int32*)0x8E2C10;
-CStreamingInfo *CStreaming::ms_aInfoForModel = (CStreamingInfo*)0x6C7088;
-CStreamingInfo &CStreaming::ms_startLoadedList = *(CStreamingInfo*)0x942F60;
-CStreamingInfo &CStreaming::ms_endLoadedList = *(CStreamingInfo*)0x8F1AC0;
-CStreamingInfo &CStreaming::ms_startRequestedList = *(CStreamingInfo*)0x8F1B3C;
-CStreamingInfo &CStreaming::ms_endRequestedList = *(CStreamingInfo*)0x940738;
-int32 &CStreaming::ms_oldSectorX = *(int32*)0x8F2C84;
-int32 &CStreaming::ms_oldSectorY = *(int32*)0x8F2C88;
-int32 &CStreaming::ms_streamingBufferSize = *(int32*)0x942FB0;
-int8 **CStreaming::ms_pStreamingBuffer = (int8**)0x87F818;
-int32 &CStreaming::ms_memoryUsed = *(int32*)0x940568;
-CStreamingChannel *CStreaming::ms_channel = (CStreamingChannel*)0x727EE0;
-int32 &CStreaming::ms_channelError = *(int32*)0x880DB8;
-int32 &CStreaming::ms_numVehiclesLoaded = *(int32*)0x8F2C80;
-int32 *CStreaming::ms_vehiclesLoaded = (int32*)0x773560;
-int32 &CStreaming::ms_lastVehicleDeleted = *(int32*)0x95CBF8;
-CDirectory *&CStreaming::ms_pExtraObjectsDir = *(CDirectory**)0x95CB90;
-int32 &CStreaming::ms_numPriorityRequests = *(int32*)0x8F31C4;
-bool &CStreaming::ms_hasLoadedLODs = *(bool*)0x95CD47;
-int32 &CStreaming::ms_currentPedGrp = *(int32*)0x8F2BBC;
+bool CStreaming::ms_disableStreaming;
+bool CStreaming::ms_bLoadingBigModel;
+int32 CStreaming::ms_numModelsRequested;
+CStreamingInfo CStreaming::ms_aInfoForModel[NUMSTREAMINFO];
+CStreamingInfo CStreaming::ms_startLoadedList;
+CStreamingInfo CStreaming::ms_endLoadedList;
+CStreamingInfo CStreaming::ms_startRequestedList;
+CStreamingInfo CStreaming::ms_endRequestedList;
+int32 CStreaming::ms_oldSectorX;
+int32 CStreaming::ms_oldSectorY;
+int32 CStreaming::ms_streamingBufferSize;
+int8 *CStreaming::ms_pStreamingBuffer[2];
+int32 CStreaming::ms_memoryUsed;
+CStreamingChannel CStreaming::ms_channel[2];
+int32 CStreaming::ms_channelError;
+int32 CStreaming::ms_numVehiclesLoaded;
+int32 CStreaming::ms_vehiclesLoaded[MAXVEHICLESLOADED];
+int32 CStreaming::ms_lastVehicleDeleted;
+CDirectory *CStreaming::ms_pExtraObjectsDir;
+int32 CStreaming::ms_numPriorityRequests;
+bool CStreaming::ms_hasLoadedLODs;
+int32 CStreaming::ms_currentPedGrp;
int32 CStreaming::ms_currentPedLoading;
int32 CStreaming::ms_lastCullZone;
-uint16 &CStreaming::ms_loadedGangs = *(uint16*)0x95CC60;
-uint16 &CStreaming::ms_loadedGangCars = *(uint16*)0x95CC2E;
-int32 *CStreaming::ms_imageOffsets = (int32*)0x6E60A0;
-int32 &CStreaming::ms_lastImageRead = *(int32*)0x880E2C;
-int32 &CStreaming::ms_imageSize = *(int32*)0x8F1A34;
-uint32 &CStreaming::ms_memoryAvailable = *(uint32*)0x880F8C;
-
-int32 &desiredNumVehiclesLoaded = *(int32*)0x5EC194;
-
-CEntity *&pIslandLODindustEntity = *(CEntity**)0x6212DC;
-CEntity *&pIslandLODcomIndEntity = *(CEntity**)0x6212E0;
-CEntity *&pIslandLODcomSubEntity = *(CEntity**)0x6212E4;
-CEntity *&pIslandLODsubIndEntity = *(CEntity**)0x6212E8;
-CEntity *&pIslandLODsubComEntity = *(CEntity**)0x6212EC;
-int32 &islandLODindust = *(int32*)0x6212C8;
-int32 &islandLODcomInd = *(int32*)0x6212CC;
-int32 &islandLODcomSub = *(int32*)0x6212D0;
-int32 &islandLODsubInd = *(int32*)0x6212D4;
-int32 &islandLODsubCom = *(int32*)0x6212D8;
+uint16 CStreaming::ms_loadedGangs;
+uint16 CStreaming::ms_loadedGangCars;
+int32 CStreaming::ms_imageOffsets[NUMCDIMAGES];
+int32 CStreaming::ms_lastImageRead;
+int32 CStreaming::ms_imageSize;
+uint32 CStreaming::ms_memoryAvailable;
+
+int32 desiredNumVehiclesLoaded = 12;
+
+CEntity *pIslandLODindustEntity;
+CEntity *pIslandLODcomIndEntity;
+CEntity *pIslandLODcomSubEntity;
+CEntity *pIslandLODsubIndEntity;
+CEntity *pIslandLODsubComEntity;
+int32 islandLODindust;
+int32 islandLODcomInd;
+int32 islandLODcomSub;
+int32 islandLODsubInd;
+int32 islandLODsubCom;
bool
CStreamingInfo::GetCdPosnAndSize(uint32 &posn, uint32 &size)
@@ -199,7 +199,7 @@ CStreaming::Init(void)
// PC only, figure out how much memory we got
#ifdef GTA_PC
#define MB (1024*1024)
- extern unsigned long &_dwMemAvailPhys;
+ extern unsigned long _dwMemAvailPhys;
ms_memoryAvailable = (_dwMemAvailPhys - 10*MB)/2;
if(ms_memoryAvailable < 50*MB)
ms_memoryAvailable = 50*MB;
@@ -2439,82 +2439,3 @@ CStreaming::UpdateForAnimViewer(void)
CStreaming::RetryLoadFile(CStreaming::ms_channelError);
}
}
-
-STARTPATCHES
- InjectHook(0x406430, CStreaming::Init, PATCH_JUMP);
- InjectHook(0x406C80, CStreaming::Shutdown, PATCH_JUMP);
- InjectHook(0x4076C0, CStreaming::Update, PATCH_JUMP);
- InjectHook(0x406CC0, (void (*)(void))CStreaming::LoadCdDirectory, PATCH_JUMP);
- InjectHook(0x406DA0, (void (*)(const char*, int))CStreaming::LoadCdDirectory, PATCH_JUMP);
- InjectHook(0x409740, CStreaming::ConvertBufferToObject, PATCH_JUMP);
- InjectHook(0x409580, CStreaming::FinishLoadingLargeFile, PATCH_JUMP);
- InjectHook(0x407EA0, CStreaming::RequestModel, PATCH_JUMP);
- InjectHook(0x407FD0, CStreaming::RequestSubway, PATCH_JUMP);
- InjectHook(0x408190, CStreaming::RequestBigBuildings, PATCH_JUMP);
- InjectHook(0x408210, CStreaming::RequestIslands, PATCH_JUMP);
- InjectHook(0x40A890, CStreaming::RequestSpecialModel, PATCH_JUMP);
- InjectHook(0x40ADA0, CStreaming::RequestSpecialChar, PATCH_JUMP);
- InjectHook(0x54A5F0, CStreaming::HasModelLoaded, PATCH_JUMP);
- InjectHook(0x40ADC0, CStreaming::HasSpecialCharLoaded, PATCH_JUMP);
- InjectHook(0x40ADE0, CStreaming::SetMissionDoesntRequireSpecialChar, PATCH_JUMP);
-
- InjectHook(0x408830, CStreaming::RemoveModel, PATCH_JUMP);
- InjectHook(0x4083A0, CStreaming::RemoveUnusedBuildings, PATCH_JUMP);
- InjectHook(0x4083D0, CStreaming::RemoveBuildings, PATCH_JUMP);
- InjectHook(0x408640, CStreaming::RemoveUnusedBigBuildings, PATCH_JUMP);
- InjectHook(0x408680, CStreaming::RemoveBigBuildings, PATCH_JUMP);
- InjectHook(0x408780, CStreaming::RemoveIslandsNotUsed, PATCH_JUMP);
- InjectHook(0x40B180, CStreaming::RemoveLoadedVehicle, PATCH_JUMP);
- InjectHook(0x4089B0, CStreaming::RemoveLeastUsedModel, PATCH_JUMP);
- InjectHook(0x408940, CStreaming::RemoveAllUnusedModels, PATCH_JUMP);
- InjectHook(0x409450, CStreaming::RemoveReferencedTxds, PATCH_JUMP);
-
- InjectHook(0x40B160, CStreaming::GetAvailableVehicleSlot, PATCH_JUMP);
- InjectHook(0x40B060, CStreaming::AddToLoadedVehiclesList, PATCH_JUMP);
- InjectHook(0x4094C0, CStreaming::IsTxdUsedByRequestedModels, PATCH_JUMP);
- InjectHook(0x407E70, CStreaming::IsObjectInCdImage, PATCH_JUMP);
- InjectHook(0x408280, CStreaming::HaveAllBigBuildingsLoaded, PATCH_JUMP);
- InjectHook(0x40A790, CStreaming::SetModelIsDeletable, PATCH_JUMP);
- InjectHook(0x40A800, CStreaming::SetModelTxdIsDeletable, PATCH_JUMP);
- InjectHook(0x40A820, CStreaming::SetMissionDoesntRequireModel, PATCH_JUMP);
-
- InjectHook(0x40AA00, CStreaming::LoadInitialPeds, PATCH_JUMP);
- InjectHook(0x40ADF0, CStreaming::LoadInitialVehicles, PATCH_JUMP);
- InjectHook(0x40AE60, CStreaming::StreamVehiclesAndPeds, PATCH_JUMP);
- InjectHook(0x40AA30, CStreaming::StreamZoneModels, PATCH_JUMP);
- InjectHook(0x40AD00, CStreaming::RemoveCurrentZonesModels, PATCH_JUMP);
-
- InjectHook(0x409BE0, CStreaming::ProcessLoadingChannel, PATCH_JUMP);
- InjectHook(0x40A610, CStreaming::FlushChannels, PATCH_JUMP);
- InjectHook(0x40A680, CStreaming::FlushRequestList, PATCH_JUMP);
- InjectHook(0x409FF0, CStreaming::GetCdImageOffset, PATCH_JUMP);
- InjectHook(0x409E50, CStreaming::GetNextFileOnCd, PATCH_JUMP);
- InjectHook(0x40A060, CStreaming::RequestModelStream, PATCH_JUMP);
- InjectHook(0x4077F0, CStreaming::RetryLoadFile, PATCH_JUMP);
- InjectHook(0x40A390, CStreaming::LoadRequestedModels, PATCH_JUMP);
- InjectHook(0x40A440, CStreaming::LoadAllRequestedModels, PATCH_JUMP);
-
- InjectHook(0x4078F0, CStreaming::AddModelsToRequestList, PATCH_JUMP);
- InjectHook(0x407C50, (void (*)(CPtrList&,float,float,float,float,float,float))CStreaming::ProcessEntitiesInSectorList, PATCH_JUMP);
- InjectHook(0x407DD0, (void (*)(CPtrList&))CStreaming::ProcessEntitiesInSectorList, PATCH_JUMP);
-
- InjectHook(0x407070, CStreaming::DeleteFarAwayRwObjects, PATCH_JUMP);
- InjectHook(0x407390, CStreaming::DeleteAllRwObjects, PATCH_JUMP);
- InjectHook(0x407400, CStreaming::DeleteRwObjectsAfterDeath, PATCH_JUMP);
- InjectHook(0x408A60, CStreaming::DeleteRwObjectsBehindCamera, PATCH_JUMP);
- InjectHook(0x407560, CStreaming::DeleteRwObjectsInSectorList, PATCH_JUMP);
- InjectHook(0x4075A0, CStreaming::DeleteRwObjectsInOverlapSectorList, PATCH_JUMP);
- InjectHook(0x409340, CStreaming::DeleteRwObjectsBehindCameraInSectorList, PATCH_JUMP);
- InjectHook(0x4093C0, CStreaming::DeleteRwObjectsNotInFrustumInSectorList, PATCH_JUMP);
- InjectHook(0x409B70, CStreaming::MakeSpaceFor, PATCH_JUMP);
- InjectHook(0x40A6D0, CStreaming::LoadScene, PATCH_JUMP);
-
- InjectHook(0x40B210, CStreaming::MemoryCardSave, PATCH_JUMP);
- InjectHook(0x40B250, CStreaming::MemoryCardLoad, PATCH_JUMP);
-
- InjectHook(0x4063E0, &CStreamingInfo::GetCdPosnAndSize, PATCH_JUMP);
- InjectHook(0x406410, &CStreamingInfo::SetCdPosnAndSize, PATCH_JUMP);
- InjectHook(0x4063D0, &CStreamingInfo::GetCdSize, PATCH_JUMP);
- InjectHook(0x406380, &CStreamingInfo::AddToList, PATCH_JUMP);
- InjectHook(0x4063A0, &CStreamingInfo::RemoveFromList, PATCH_JUMP);
-ENDPATCHES
diff --git a/src/core/Streaming.h b/src/core/Streaming.h
index 1100fd1b..c910c068 100644
--- a/src/core/Streaming.h
+++ b/src/core/Streaming.h
@@ -77,36 +77,36 @@ class CPtrList;
class CStreaming
{
public:
- static bool &ms_disableStreaming;
- static bool &ms_bLoadingBigModel;
- static int32 &ms_numModelsRequested;
- static CStreamingInfo *ms_aInfoForModel; //[NUMSTREAMINFO]
- static CStreamingInfo &ms_startLoadedList;
- static CStreamingInfo &ms_endLoadedList;
- static CStreamingInfo &ms_startRequestedList;
- static CStreamingInfo &ms_endRequestedList;
- static int32 &ms_oldSectorX;
- static int32 &ms_oldSectorY;
- static int32 &ms_streamingBufferSize;
- static int8 **ms_pStreamingBuffer; //[2]
- static int32 &ms_memoryUsed;
- static CStreamingChannel *ms_channel; //[2]
- static int32 &ms_channelError;
- static int32 &ms_numVehiclesLoaded;
- static int32 *ms_vehiclesLoaded; //[MAXVEHICLESLOADED]
- static int32 &ms_lastVehicleDeleted;
- static CDirectory *&ms_pExtraObjectsDir;
- static int32 &ms_numPriorityRequests;
- static bool &ms_hasLoadedLODs;
- static int32 &ms_currentPedGrp;
+ static bool ms_disableStreaming;
+ static bool ms_bLoadingBigModel;
+ static int32 ms_numModelsRequested;
+ static CStreamingInfo ms_aInfoForModel[NUMSTREAMINFO];
+ static CStreamingInfo ms_startLoadedList;
+ static CStreamingInfo ms_endLoadedList;
+ static CStreamingInfo ms_startRequestedList;
+ static CStreamingInfo ms_endRequestedList;
+ static int32 ms_oldSectorX;
+ static int32 ms_oldSectorY;
+ static int32 ms_streamingBufferSize;
+ static int8 *ms_pStreamingBuffer[2];
+ static int32 ms_memoryUsed;
+ static CStreamingChannel ms_channel[2];
+ static int32 ms_channelError;
+ static int32 ms_numVehiclesLoaded;
+ static int32 ms_vehiclesLoaded[MAXVEHICLESLOADED];
+ static int32 ms_lastVehicleDeleted;
+ static CDirectory *ms_pExtraObjectsDir;
+ static int32 ms_numPriorityRequests;
+ static bool ms_hasLoadedLODs;
+ static int32 ms_currentPedGrp;
static int32 ms_lastCullZone;
- static uint16 &ms_loadedGangs;
- static uint16 &ms_loadedGangCars;
+ static uint16 ms_loadedGangs;
+ static uint16 ms_loadedGangCars;
static int32 ms_currentPedLoading;
- static int32 *ms_imageOffsets; //[NUMCDIMAGES]
- static int32 &ms_lastImageRead;
- static int32 &ms_imageSize;
- static uint32 &ms_memoryAvailable;
+ static int32 ms_imageOffsets[NUMCDIMAGES];
+ static int32 ms_lastImageRead;
+ static int32 ms_imageSize;
+ static uint32 ms_memoryAvailable;
static void Init(void);
static void Shutdown(void);
diff --git a/src/core/SurfaceTable.cpp b/src/core/SurfaceTable.cpp
index 2ba884b1..7212fc65 100644
--- a/src/core/SurfaceTable.cpp
+++ b/src/core/SurfaceTable.cpp
@@ -1,12 +1,12 @@
#include "common.h"
-#include "patcher.h"
+
#include "main.h"
#include "FileMgr.h"
#include "Weather.h"
#include "Collision.h"
#include "SurfaceTable.h"
-float (*CSurfaceTable::ms_aAdhesiveLimitTable)[NUMADHESIVEGROUPS] = (float (*)[NUMADHESIVEGROUPS])0x8E29D4;
+float CSurfaceTable::ms_aAdhesiveLimitTable[NUMADHESIVEGROUPS][NUMADHESIVEGROUPS];
void
CSurfaceTable::Initialise(char *filename)
@@ -141,10 +141,3 @@ CSurfaceTable::GetAdhesiveLimit(CColPoint &colpoint)
{
return ms_aAdhesiveLimitTable[GetAdhesionGroup(colpoint.surfaceB)][GetAdhesionGroup(colpoint.surfaceA)];
}
-
-STARTPATCHES
- InjectHook(0x4AB8F0, CSurfaceTable::Initialise, PATCH_JUMP);
- InjectHook(0x4ABA60, CSurfaceTable::GetAdhesionGroup, PATCH_JUMP);
- InjectHook(0x4ABAA0, CSurfaceTable::GetWetMultiplier, PATCH_JUMP);
- InjectHook(0x4ABA30, CSurfaceTable::GetAdhesiveLimit, PATCH_JUMP);
-ENDPATCHES
diff --git a/src/core/SurfaceTable.h b/src/core/SurfaceTable.h
index 27f4ecca..4af6a265 100644
--- a/src/core/SurfaceTable.h
+++ b/src/core/SurfaceTable.h
@@ -98,8 +98,7 @@ struct CColPoint;
class CSurfaceTable
{
-// static float ms_aAdhesiveLimitTable[NUMADHESIVEGROUPS][NUMADHESIVEGROUPS];
- static float (*ms_aAdhesiveLimitTable)[NUMADHESIVEGROUPS];
+ static float ms_aAdhesiveLimitTable[NUMADHESIVEGROUPS][NUMADHESIVEGROUPS];
public:
static void Initialise(char *filename);
static int GetAdhesionGroup(uint8 surfaceType);
diff --git a/src/core/TempColModels.cpp b/src/core/TempColModels.cpp
index 22ef31bd..79d6252b 100644
--- a/src/core/TempColModels.cpp
+++ b/src/core/TempColModels.cpp
@@ -1,21 +1,21 @@
#include "common.h"
-#include "patcher.h"
+
#include "TempColModels.h"
#include "SurfaceTable.h"
-CColModel &CTempColModels::ms_colModelPed1 = *(CColModel*)0x726CB0;
-CColModel &CTempColModels::ms_colModelPed2 = *(CColModel*)0x726D08;
-CColModel &CTempColModels::ms_colModelBBox = *(CColModel*)0x727FE0;
-CColModel &CTempColModels::ms_colModelBumper1 = *(CColModel*)0x86BE88;
-CColModel &CTempColModels::ms_colModelWheel1 = *(CColModel*)0x878C40;
-CColModel &CTempColModels::ms_colModelPanel1 = *(CColModel*)0x87BDD8;
-CColModel &CTempColModels::ms_colModelBodyPart2 = *(CColModel*)0x87BE30;
-CColModel &CTempColModels::ms_colModelBodyPart1 = *(CColModel*)0x87BE88;
-CColModel (&CTempColModels::ms_colModelCutObj)[5] = *(CColModel(*)[5]) *(uintptr*)0x87C960;
-CColModel &CTempColModels::ms_colModelPedGroundHit = *(CColModel*)0x880480;
-CColModel &CTempColModels::ms_colModelBoot1 = *(CColModel*)0x880670;
-CColModel &CTempColModels::ms_colModelDoor1 = *(CColModel*)0x880850;
-CColModel &CTempColModels::ms_colModelBonnet1 = *(CColModel*)0x8808A8;
+CColModel CTempColModels::ms_colModelPed1;
+CColModel CTempColModels::ms_colModelPed2;
+CColModel CTempColModels::ms_colModelBBox;
+CColModel CTempColModels::ms_colModelBumper1;
+CColModel CTempColModels::ms_colModelWheel1;
+CColModel CTempColModels::ms_colModelPanel1;
+CColModel CTempColModels::ms_colModelBodyPart2;
+CColModel CTempColModels::ms_colModelBodyPart1;
+CColModel CTempColModels::ms_colModelCutObj[5];
+CColModel CTempColModels::ms_colModelPedGroundHit;
+CColModel CTempColModels::ms_colModelBoot1;
+CColModel CTempColModels::ms_colModelDoor1;
+CColModel CTempColModels::ms_colModelBonnet1;
CColSphere s_aPedSpheres[3];
@@ -287,7 +287,3 @@ CTempColModels::Initialise(void)
#undef SET_COLMODEL_SPHERES
}
-
-STARTPATCHES
- InjectHook(0x412160, CTempColModels::Initialise, PATCH_JUMP);
-ENDPATCHES
diff --git a/src/core/TempColModels.h b/src/core/TempColModels.h
index 263904d3..3e1dd5e1 100644
--- a/src/core/TempColModels.h
+++ b/src/core/TempColModels.h
@@ -5,19 +5,19 @@
class CTempColModels
{
public:
- static CColModel &ms_colModelPed1;
- static CColModel &ms_colModelPed2;
- static CColModel &ms_colModelBBox;
- static CColModel &ms_colModelBumper1;
- static CColModel &ms_colModelWheel1;
- static CColModel &ms_colModelPanel1;
- static CColModel &ms_colModelBodyPart2;
- static CColModel &ms_colModelBodyPart1;
- static CColModel (&ms_colModelCutObj)[5];
- static CColModel &ms_colModelPedGroundHit;
- static CColModel &ms_colModelBoot1;
- static CColModel &ms_colModelDoor1;
- static CColModel &ms_colModelBonnet1;
+ static CColModel ms_colModelPed1;
+ static CColModel ms_colModelPed2;
+ static CColModel ms_colModelBBox;
+ static CColModel ms_colModelBumper1;
+ static CColModel ms_colModelWheel1;
+ static CColModel ms_colModelPanel1;
+ static CColModel ms_colModelBodyPart2;
+ static CColModel ms_colModelBodyPart1;
+ static CColModel ms_colModelCutObj[5];
+ static CColModel ms_colModelPedGroundHit;
+ static CColModel ms_colModelBoot1;
+ static CColModel ms_colModelDoor1;
+ static CColModel ms_colModelBonnet1;
static void Initialise(void);
};
diff --git a/src/core/TimeStep.cpp b/src/core/TimeStep.cpp
index 9ccf7200..09dae911 100644
--- a/src/core/TimeStep.cpp
+++ b/src/core/TimeStep.cpp
@@ -1,5 +1,5 @@
#include "TimeStep.h"
-float &CTimeStep::ms_fTimeScale = *(float*)0x5F76C8;
-float &CTimeStep::ms_fFramesPerUpdate = *(float*)0x5F76CC;
-float &CTimeStep::ms_fTimeStep = *(float*)0x5F76D0;
+float CTimeStep::ms_fTimeScale = 1.0f;
+float CTimeStep::ms_fFramesPerUpdate = 1.0f;
+float CTimeStep::ms_fTimeStep = 1.0f;
diff --git a/src/core/TimeStep.h b/src/core/TimeStep.h
index c74df02a..6101b4c2 100644
--- a/src/core/TimeStep.h
+++ b/src/core/TimeStep.h
@@ -4,7 +4,7 @@
class CTimeStep
{
public:
- static float &ms_fTimeScale;
- static float &ms_fFramesPerUpdate;
- static float &ms_fTimeStep;
+ static float ms_fTimeScale;
+ static float ms_fFramesPerUpdate;
+ static float ms_fTimeStep;
};
diff --git a/src/core/Timer.cpp b/src/core/Timer.cpp
index fda862f1..ebd79695 100644
--- a/src/core/Timer.cpp
+++ b/src/core/Timer.cpp
@@ -1,38 +1,32 @@
#include <windows.h>
#include "common.h"
-#include "patcher.h"
+
#include "DMAudio.h"
#include "Record.h"
#include "Timer.h"
-uint32 &CTimer::m_snTimeInMilliseconds = *(uint32*)0x885B48;
-uint32 &CTimer::m_snTimeInMillisecondsPauseMode = *(uint32*)0x5F7614;
-uint32 &CTimer::m_snTimeInMillisecondsNonClipped = *(uint32*)0x9412E8;
-uint32 &CTimer::m_snPreviousTimeInMilliseconds = *(uint32*)0x8F29E4;
-uint32 &CTimer::m_FrameCounter = *(uint32*)0x9412EC;
-float &CTimer::ms_fTimeScale = *(float*)0x8F2C20;
-float &CTimer::ms_fTimeStep = *(float*)0x8E2CB4;
-float &CTimer::ms_fTimeStepNonClipped = *(float*)0x8E2C4C;
-bool &CTimer::m_UserPause = *(bool*)0x95CD7C;
-bool &CTimer::m_CodePause = *(bool*)0x95CDB1;
+uint32 CTimer::m_snTimeInMilliseconds;
+uint32 CTimer::m_snTimeInMillisecondsPauseMode = 1;
+uint32 CTimer::m_snTimeInMillisecondsNonClipped;
+uint32 CTimer::m_snPreviousTimeInMilliseconds;
+uint32 CTimer::m_FrameCounter;
+float CTimer::ms_fTimeScale;
+float CTimer::ms_fTimeStep;
+float CTimer::ms_fTimeStepNonClipped;
+bool CTimer::m_UserPause;
+bool CTimer::m_CodePause;
-//UInt32 oldPcTimer;
-uint32 &oldPcTimer = *(uint32*)0x9434F4;
+uint32 oldPcTimer;
-//UInt32 suspendPcTimer;
-uint32 &suspendPcTimer = *(uint32*)0x62A308;
+uint32 suspendPcTimer;
-//UInt32 _nCyclesPerMS = 1;
-uint32 &_nCyclesPerMS = *(uint32*)0x5F7610;
+uint32 _nCyclesPerMS = 1;
-//LARGE_INTEGER _oldPerfCounter;
-LARGE_INTEGER &_oldPerfCounter = *(LARGE_INTEGER*)0x62A310;
+LARGE_INTEGER _oldPerfCounter;
-//LARGE_INTEGER perfSuspendCounter;
-LARGE_INTEGER &perfSuspendCounter = *(LARGE_INTEGER*)0x62A318;
+LARGE_INTEGER perfSuspendCounter;
-//UInt32 suspendDepth;
-uint32 &suspendDepth = *(uint32*)0x62A320;
+uint32 suspendDepth;
#ifdef FIX_BUGS
double frameTime;
@@ -231,18 +225,3 @@ uint32 CTimer::GetCyclesPerFrame()
return 20;
}
-#if 1
-STARTPATCHES
- InjectHook(0x4ACE60, CTimer::Initialise, PATCH_JUMP);
- InjectHook(0x4ACF60, CTimer::Shutdown, PATCH_JUMP);
- InjectHook(0x4ACF70, CTimer::Update, PATCH_JUMP);
- InjectHook(0x4AD310, CTimer::Suspend, PATCH_JUMP);
- InjectHook(0x4AD370, CTimer::Resume, PATCH_JUMP);
- InjectHook(0x4AD3F0, CTimer::GetCyclesPerMillisecond, PATCH_JUMP);
- InjectHook(0x4AD410, CTimer::GetCurrentTimeInCycles, PATCH_JUMP);
- InjectHook(0x4AD450, CTimer::GetIsSlowMotionActive, PATCH_JUMP);
- InjectHook(0x4AD480, CTimer::Stop, PATCH_JUMP);
- InjectHook(0x4AD490, CTimer::StartUserPause, PATCH_JUMP);
- InjectHook(0x4AD4A0, CTimer::EndUserPause, PATCH_JUMP);
-ENDPATCHES
-#endif
diff --git a/src/core/Timer.h b/src/core/Timer.h
index a4d674da..00a11409 100644
--- a/src/core/Timer.h
+++ b/src/core/Timer.h
@@ -3,17 +3,17 @@
class CTimer
{
- static uint32 &m_snTimeInMilliseconds;
- static uint32 &m_snTimeInMillisecondsPauseMode;
- static uint32 &m_snTimeInMillisecondsNonClipped;
- static uint32 &m_snPreviousTimeInMilliseconds;
- static uint32 &m_FrameCounter;
- static float &ms_fTimeScale;
- static float &ms_fTimeStep;
- static float &ms_fTimeStepNonClipped;
+ static uint32 m_snTimeInMilliseconds;
+ static uint32 m_snTimeInMillisecondsPauseMode;
+ static uint32 m_snTimeInMillisecondsNonClipped;
+ static uint32 m_snPreviousTimeInMilliseconds;
+ static uint32 m_FrameCounter;
+ static float ms_fTimeScale;
+ static float ms_fTimeStep;
+ static float ms_fTimeStepNonClipped;
public:
- static bool &m_UserPause;
- static bool &m_CodePause;
+ static bool m_UserPause;
+ static bool m_CodePause;
static const float &GetTimeStep(void) { return ms_fTimeStep; }
static void SetTimeStep(float ts) { ms_fTimeStep = ts; }
diff --git a/src/core/User.cpp b/src/core/User.cpp
index d89d1cec..36f07cbd 100644
--- a/src/core/User.cpp
+++ b/src/core/User.cpp
@@ -1,5 +1,5 @@
#include "common.h"
-#include "patcher.h"
+
#include "Hud.h"
#include "PlayerPed.h"
@@ -9,10 +9,10 @@
#include "World.h"
#include "Zones.h"
-CPlaceName& CUserDisplay::PlaceName = *(CPlaceName*)0x8F29BC;
-COnscreenTimer& CUserDisplay::OnscnTimer = *(COnscreenTimer*)0x862238;
-CPager& CUserDisplay::Pager = *(CPager*)0x8F2744;
-CCurrentVehicle& CUserDisplay::CurrentVehicle = *(CCurrentVehicle*)0x8F5FE8;
+CPlaceName CUserDisplay::PlaceName;
+COnscreenTimer CUserDisplay::OnscnTimer;
+CPager CUserDisplay::Pager;
+CCurrentVehicle CUserDisplay::CurrentVehicle;
CPlaceName::CPlaceName()
{
@@ -120,16 +120,3 @@ CUserDisplay::Process()
Pager.Process();
CurrentVehicle.Process();
}
-
-STARTPATCHES
- InjectHook(0x4AD4C0, &CPlaceName::Init, PATCH_JUMP);
- InjectHook(0x4AD4E0, &CPlaceName::Process, PATCH_JUMP);
- InjectHook(0x4AD5B0, &CPlaceName::Display, PATCH_JUMP);
-
- InjectHook(0x4AD5F0, &CCurrentVehicle::Init, PATCH_JUMP);
- InjectHook(0x4AD600, &CCurrentVehicle::Process, PATCH_JUMP);
- InjectHook(0x4AD630, &CCurrentVehicle::Display, PATCH_JUMP);
-
- InjectHook(0x4AD660, &CUserDisplay::Init, PATCH_JUMP);
- InjectHook(0x4AD690, &CUserDisplay::Process, PATCH_JUMP);
-ENDPATCHES \ No newline at end of file
diff --git a/src/core/User.h b/src/core/User.h
index 02d5f613..153ef57b 100644
--- a/src/core/User.h
+++ b/src/core/User.h
@@ -31,10 +31,10 @@ public:
class CUserDisplay
{
public:
- static CPlaceName &PlaceName;
- static COnscreenTimer &OnscnTimer;
- static CPager &Pager;
- static CCurrentVehicle &CurrentVehicle;
+ static CPlaceName PlaceName;
+ static COnscreenTimer OnscnTimer;
+ static CPager Pager;
+ static CCurrentVehicle CurrentVehicle;
static void Init();
static void Process();
diff --git a/src/core/Wanted.cpp b/src/core/Wanted.cpp
index 29294a2b..ce7d217e 100644
--- a/src/core/Wanted.cpp
+++ b/src/core/Wanted.cpp
@@ -1,5 +1,5 @@
#include "common.h"
-#include "patcher.h"
+
#include "Pools.h"
#include "ModelIndices.h"
#include "Timer.h"
@@ -11,8 +11,8 @@
#include "Wanted.h"
#include "General.h"
-int32 &CWanted::MaximumWantedLevel = *(int32*)0x5F7714; // 6
-int32 &CWanted::nMaximumWantedLevel = *(int32*)0x5F7718; // 6400
+int32 CWanted::MaximumWantedLevel = 6;
+int32 CWanted::nMaximumWantedLevel = 6400;
void
CWanted::Initialise()
@@ -456,25 +456,3 @@ CWanted::UpdateCrimesQ(void)
}
}
}
-
-STARTPATCHES
- InjectHook(0x4AD6E0, &CWanted::Initialise, 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);
- InjectHook(0x4ADA50, &CWanted::SetWantedLevel, PATCH_JUMP);
- InjectHook(0x4ADAC0, &CWanted::SetWantedLevelNoDrop, PATCH_JUMP);
- InjectHook(0x4ADAE0, &CWanted::SetMaximumWantedLevel, PATCH_JUMP);
- InjectHook(0x4ADBA0, &CWanted::AreSwatRequired, PATCH_JUMP);
- 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(0x4ADD00, &CWanted::WorkOutPolicePresence, PATCH_JUMP);
- InjectHook(0x4ADF20, &CWanted::ClearQdCrimes, PATCH_JUMP);
- InjectHook(0x4ADFD0, &CWanted::AddCrimeToQ, PATCH_JUMP);
- InjectHook(0x4AE090, &CWanted::UpdateCrimesQ, PATCH_JUMP);
- InjectHook(0x4AE110, &CWanted::ReportCrimeNow, PATCH_JUMP);
-ENDPATCHES
diff --git a/src/core/Wanted.h b/src/core/Wanted.h
index 9823529c..afeec8b0 100644
--- a/src/core/Wanted.h
+++ b/src/core/Wanted.h
@@ -60,8 +60,8 @@ public:
CCrimeBeingQd m_aCrimes[16];
CCopPed *m_pCops[10];
- static int32 &MaximumWantedLevel;
- static int32 &nMaximumWantedLevel;
+ static int32 MaximumWantedLevel;
+ static int32 nMaximumWantedLevel;
public:
void Initialise();
diff --git a/src/core/World.cpp b/src/core/World.cpp
index 313b958a..eacb3404 100644
--- a/src/core/World.cpp
+++ b/src/core/World.cpp
@@ -1,64 +1,54 @@
-#include "common.h"
-#include "patcher.h"
-#include "Entity.h"
-#include "Ped.h"
-#include "PlayerPed.h"
-#include "Vehicle.h"
-#include "Object.h"
+#include "World.h"
#include "Camera.h"
-#include "DMAudio.h"
#include "CarCtrl.h"
+#include "CopPed.h"
+#include "CutsceneMgr.h"
+#include "DMAudio.h"
+#include "Entity.h"
+#include "EventList.h"
+#include "Explosion.h"
+#include "Fire.h"
#include "Garages.h"
-#include "TempColModels.h"
-#include "World.h"
+#include "Glass.h"
+#include "Messages.h"
#include "ModelIndices.h"
-#include "References.h"
-#include "CutsceneMgr.h"
+#include "Object.h"
+#include "ParticleObject.h"
+#include "Ped.h"
+#include "PlayerPed.h"
+#include "Population.h"
+#include "ProjectileInfo.h"
#include "Record.h"
-#include "RpAnimBlend.h"
-#include "Messages.h"
+#include "References.h"
#include "Replay.h"
-#include "Population.h"
-#include "Fire.h"
+#include "RpAnimBlend.h"
+#include "Shadows.h"
+#include "TempColModels.h"
+#include "Vehicle.h"
+#include "WaterLevel.h"
+#include "common.h"
+
+
+#define OBJECT_REPOSITION_OFFSET_Z 2.0f
CColPoint gaTempSphereColPoints[MAX_COLLISION_POINTS];
-CPtrList *CWorld::ms_bigBuildingsList = (CPtrList*)0x6FAB60;
-CPtrList &CWorld::ms_listMovingEntityPtrs = *(CPtrList*)0x8F433C;
-CSector (*CWorld::ms_aSectors)[NUMSECTORS_X] = (CSector (*)[NUMSECTORS_Y])0x665608;
-uint16 &CWorld::ms_nCurrentScanCode = *(uint16*)0x95CC64;
+CPtrList CWorld::ms_bigBuildingsList[4];// = (CPtrList*)0x6FAB60;
+CPtrList CWorld::ms_listMovingEntityPtrs;// = *(CPtrList*)0x8F433C;
+CSector CWorld::ms_aSectors[NUMSECTORS_Y][NUMSECTORS_X];// = (CSector (*)[NUMSECTORS_Y])0x665608;
+uint16 CWorld::ms_nCurrentScanCode;// = *(uint16*)0x95CC64;
-uint8 &CWorld::PlayerInFocus = *(uint8 *)0x95CD61;
+uint8 CWorld::PlayerInFocus;// = *(uint8 *)0x95CD61;
CPlayerInfo CWorld::Players[NUMPLAYERS];
-bool &CWorld::bNoMoreCollisionTorque = *(bool*)0x95CDCC;
-CEntity *&CWorld::pIgnoreEntity = *(CEntity**)0x8F6494;
-bool &CWorld::bIncludeDeadPeds = *(bool*)0x95CD8F;
-bool &CWorld::bSecondShift = *(bool*)0x95CD54;
-bool &CWorld::bForceProcessControl = *(bool*)0x95CD6C;
-bool &CWorld::bProcessCutsceneOnly = *(bool*)0x95CD8B;
-
-bool &CWorld::bDoingCarCollisions = *(bool*)0x95CD8C;
-bool &CWorld::bIncludeCarTyres = *(bool*)0x95CDAA;
-
-WRAPPER void CWorld::ClearForRestart(void) { EAXJMP(0x4AE850); }
-WRAPPER void CWorld::AddParticles(void) { EAXJMP(0x4B4010); }
-WRAPPER void CWorld::ShutDown(void) { EAXJMP(0x4AE450); }
-WRAPPER void CWorld::RepositionCertainDynamicObjects() { EAXJMP(0x4B42B0); }
-WRAPPER void CWorld::RemoveStaticObjects() { EAXJMP(0x4B4D50); }
-WRAPPER void CWorld::RemoveReferencesToDeletedObject(CEntity*) { EAXJMP(0x4B3BF0); }
-WRAPPER void CWorld::FindObjectsKindaColliding(const CVector &, float, bool, int16*, int16, CEntity **, bool, bool, bool, bool, bool){ EAXJMP(0x4B2A30); }
-WRAPPER void CWorld::ClearExcitingStuffFromArea(const CVector &pos, float radius, uint8) { EAXJMP(0x4B4E70) };
-WRAPPER void CWorld::FindObjectsIntersectingCube(const CVector &, const CVector &, int16*, int16, CEntity **, bool, bool, bool, bool, bool) { EAXJMP(0x4B2E70); }
-WRAPPER void CWorld::FindObjectsIntersectingAngledCollisionBox(const CColBox &, const CMatrix &, const CVector &, float, float, float, float, int16*, int16, CEntity **, bool, bool, bool, bool, bool) { EAXJMP(0x4B3280); }
-WRAPPER void CWorld::FindObjectsOfTypeInRange(uint32, CVector&, float, bool, short*, short, CEntity**, bool, bool, bool, bool, bool) { EAXJMP(0x4B2600); }
-WRAPPER void CWorld::FindObjectsOfTypeInRangeSectorList(uint32, CPtrList&, CVector&, float, bool, short*, short, CEntity**) { EAXJMP(0x4B2960); }
-WRAPPER void CWorld::FindMissionEntitiesIntersectingCube(const CVector&, const CVector&, int16*, int16, CEntity**, bool, bool, bool) { EAXJMP(0x4B3680); }
-WRAPPER void CWorld::ClearCarsFromArea(float, float, float, float, float, float) { EAXJMP(0x4B50E0); }
-WRAPPER void CWorld::ClearPedsFromArea(float, float, float, float, float, float) { EAXJMP(0x4B52B0); }
-WRAPPER void CWorld::CallOffChaseForArea(float, float, float, float) { EAXJMP(0x4B5530); }
-WRAPPER void CWorld::TriggerExplosion(const CVector& a1, float a2, float a3, CEntity *a4, bool a5) { EAXJMP(0x4B1140); }
-WRAPPER void CWorld::SetPedsOnFire(float, float, float, float, CEntity*) { EAXJMP(0x4B3D30); }
-WRAPPER void CWorld::UseDetonator(CEntity *) { EAXJMP(0x4B4650); }
+bool CWorld::bNoMoreCollisionTorque;// = *(bool*)0x95CDCC;
+CEntity *CWorld::pIgnoreEntity;// = *(CEntity**)0x8F6494;
+bool CWorld::bIncludeDeadPeds;// = *(bool*)0x95CD8F;
+bool CWorld::bSecondShift;// = *(bool*)0x95CD54;
+bool CWorld::bForceProcessControl;// = *(bool*)0x95CD6C;
+bool CWorld::bProcessCutsceneOnly;// = *(bool*)0x95CD8B;
+
+bool CWorld::bDoingCarCollisions;// = *(bool*)0x95CD8C;
+bool CWorld::bIncludeCarTyres;// = *(bool*)0x95CDAA;
void
CWorld::Initialise()
@@ -76,37 +66,31 @@ CWorld::Initialise()
void
CWorld::Add(CEntity *ent)
{
- if(ent->IsVehicle() || ent->IsPed())
- DMAudio.SetEntityStatus(((CPhysical*)ent)->m_audioEntityId, true);
+ if(ent->IsVehicle() || ent->IsPed()) DMAudio.SetEntityStatus(((CPhysical *)ent)->m_audioEntityId, true);
if(ent->bIsBIGBuilding)
ms_bigBuildingsList[ent->m_level].InsertItem(ent);
else
ent->Add();
- if(ent->IsBuilding() || ent->IsDummy())
- return;
+ if(ent->IsBuilding() || ent->IsDummy()) return;
- if(!ent->bIsStatic)
- ((CPhysical*)ent)->AddToMovingList();
+ if(!ent->bIsStatic) ((CPhysical *)ent)->AddToMovingList();
}
void
CWorld::Remove(CEntity *ent)
{
- if(ent->IsVehicle() || ent->IsPed())
- DMAudio.SetEntityStatus(((CPhysical*)ent)->m_audioEntityId, false);
+ if(ent->IsVehicle() || ent->IsPed()) DMAudio.SetEntityStatus(((CPhysical *)ent)->m_audioEntityId, false);
if(ent->bIsBIGBuilding)
ms_bigBuildingsList[ent->m_level].RemoveItem(ent);
else
ent->Remove();
- if(ent->IsBuilding() || ent->IsDummy())
- return;
+ if(ent->IsBuilding() || ent->IsDummy()) return;
- if(!ent->bIsStatic)
- ((CPhysical*)ent)->RemoveFromMovingList();
+ if(!ent->bIsStatic) ((CPhysical *)ent)->RemoveFromMovingList();
}
void
@@ -114,31 +98,74 @@ CWorld::ClearScanCodes(void)
{
CPtrNode *node;
for(int i = 0; i < NUMSECTORS_Y; i++)
- for(int j = 0; j < NUMSECTORS_X; j++){
- CSector *s = &ms_aSectors[i][j];
- for(node = s->m_lists[ENTITYLIST_BUILDINGS].first; node; node = node->next)
- ((CEntity*)node->item)->m_scanCode = 0;
- for(node = s->m_lists[ENTITYLIST_VEHICLES].first; node; node = node->next)
- ((CEntity*)node->item)->m_scanCode = 0;
- for(node = s->m_lists[ENTITYLIST_PEDS].first; node; node = node->next)
- ((CEntity*)node->item)->m_scanCode = 0;
- for(node = s->m_lists[ENTITYLIST_OBJECTS].first; node; node = node->next)
- ((CEntity*)node->item)->m_scanCode = 0;
- for(node = s->m_lists[ENTITYLIST_DUMMIES].first; node; node = node->next)
- ((CEntity*)node->item)->m_scanCode = 0;
+ for(int j = 0; j < NUMSECTORS_X; j++) {
+ CSector *s = &ms_aSectors[i][j];
+ for(node = s->m_lists[ENTITYLIST_BUILDINGS].first; node; node = node->next)
+ ((CEntity *)node->item)->m_scanCode = 0;
+ for(node = s->m_lists[ENTITYLIST_VEHICLES].first; node; node = node->next)
+ ((CEntity *)node->item)->m_scanCode = 0;
+ for(node = s->m_lists[ENTITYLIST_PEDS].first; node; node = node->next)
+ ((CEntity *)node->item)->m_scanCode = 0;
+ for(node = s->m_lists[ENTITYLIST_OBJECTS].first; node; node = node->next)
+ ((CEntity *)node->item)->m_scanCode = 0;
+ for(node = s->m_lists[ENTITYLIST_DUMMIES].first; node; node = node->next)
+ ((CEntity *)node->item)->m_scanCode = 0;
+ }
+}
+
+void
+CWorld::ClearExcitingStuffFromArea(const CVector &pos, float radius, bool bRemoveProjectilesAndTidyUpShadows)
+{
+ CPedPool *pedPool = CPools::GetPedPool();
+ for(int32 i = 0; i < pedPool->GetSize(); i++) {
+ CPed *pPed = pedPool->GetSlot(i);
+ if(pPed && !pPed->IsPlayer() && pPed->CanBeDeleted() &&
+ CVector2D(pPed->GetPosition() - pos).MagnitudeSqr() < radius) {
+ CPopulation::RemovePed(pPed);
+ }
+ }
+ CVehiclePool *VehiclePool = CPools::GetVehiclePool();
+ for(int32 i = 0; i < VehiclePool->GetSize(); i++) {
+ CVehicle *pVehicle = VehiclePool->GetSlot(i);
+ if(pVehicle && CVector2D(pVehicle->GetPosition() - pos).MagnitudeSqr() < radius &&
+ !pVehicle->bIsLocked && pVehicle->CanBeDeleted()) {
+ if(pVehicle->pDriver) {
+ CPopulation::RemovePed(pVehicle->pDriver);
+ pVehicle->pDriver = nil;
+ }
+ for(int32 j = 0; j < pVehicle->m_nNumMaxPassengers; ++j) {
+ if(pVehicle->pPassengers[j]) {
+ CPopulation::RemovePed(pVehicle->pPassengers[j]);
+ pVehicle->pPassengers[j] = nil;
+ --pVehicle->m_nNumPassengers;
+ }
+ }
+ CCarCtrl::RemoveFromInterestingVehicleList(pVehicle);
+ CWorld::Remove(pVehicle);
+ delete pVehicle;
+ }
+ }
+ CObject::DeleteAllTempObjectsInArea(pos, radius);
+ gFireManager.ExtinguishPoint(pos, radius);
+ CWorld::ExtinguishAllCarFiresInArea(pos, radius);
+ CExplosion::RemoveAllExplosionsInArea(pos, radius);
+ if(bRemoveProjectilesAndTidyUpShadows) {
+ CProjectileInfo::RemoveAllProjectiles();
+ CShadows::TidyUpShadows();
}
}
bool
CWorld::CameraToIgnoreThisObject(CEntity *ent)
{
- if(CGarages::IsModelIndexADoor(ent->GetModelIndex()))
- return false;
- return ((CObject*)ent)->m_bCameraToAvoidThisObject != 1;
+ if(CGarages::IsModelIndexADoor(ent->GetModelIndex())) return false;
+ return ((CObject *)ent)->m_bCameraToAvoidThisObject != 1;
}
bool
-CWorld::ProcessLineOfSight(const CVector &point1, const CVector &point2, CColPoint &point, CEntity *&entity, bool checkBuildings, bool checkVehicles, bool checkPeds, bool checkObjects, bool checkDummies, bool ignoreSeeThrough, bool ignoreSomeObjects)
+CWorld::ProcessLineOfSight(const CVector &point1, const CVector &point2, CColPoint &point, CEntity *&entity,
+ bool checkBuildings, bool checkVehicles, bool checkPeds, bool checkObjects,
+ bool checkDummies, bool ignoreSeeThrough, bool ignoreSomeObjects)
{
int x, xstart, xend;
int y, ystart, yend;
@@ -155,94 +182,80 @@ CWorld::ProcessLineOfSight(const CVector &point1, const CVector &point2, CColPoi
xend = GetSectorIndexX(point2.x);
yend = GetSectorIndexY(point2.y);
-#define LOSARGS CColLine(point1, point2), point, dist, entity, checkBuildings, checkVehicles, checkPeds, checkObjects, checkDummies, ignoreSeeThrough, ignoreSomeObjects
+#define LOSARGS \
+ CColLine(point1, point2), point, dist, entity, checkBuildings, checkVehicles, checkPeds, checkObjects, \
+ checkDummies, ignoreSeeThrough, ignoreSomeObjects
- if(xstart == xend && ystart == yend){
+ if(xstart == xend && ystart == yend) {
// Only one sector
return ProcessLineOfSightSector(*GetSector(xstart, ystart), LOSARGS);
- }else if(xstart == xend){
+ } else if(xstart == xend) {
// Only step in y
if(ystart < yend)
- for(y = ystart; y <= yend; y++)
- ProcessLineOfSightSector(*GetSector(xstart, y), LOSARGS);
+ for(y = ystart; y <= yend; y++) ProcessLineOfSightSector(*GetSector(xstart, y), LOSARGS);
else
- for(y = ystart; y >= yend; y--)
- ProcessLineOfSightSector(*GetSector(xstart, y), LOSARGS);
+ for(y = ystart; y >= yend; y--) ProcessLineOfSightSector(*GetSector(xstart, y), LOSARGS);
return dist < 1.0f;
- }else if(ystart == yend){
+ } else if(ystart == yend) {
// Only step in x
if(xstart < xend)
- for(x = xstart; x <= xend; x++)
- ProcessLineOfSightSector(*GetSector(x, ystart), LOSARGS);
+ for(x = xstart; x <= xend; x++) ProcessLineOfSightSector(*GetSector(x, ystart), LOSARGS);
else
- for(x = xstart; x >= xend; x--)
- ProcessLineOfSightSector(*GetSector(x, ystart), LOSARGS);
+ for(x = xstart; x >= xend; x--) ProcessLineOfSightSector(*GetSector(x, ystart), LOSARGS);
return dist < 1.0f;
- }else{
- if(point1.x < point2.x){
+ } else {
+ if(point1.x < point2.x) {
// Step from left to right
float m = (point2.y - point1.y) / (point2.x - point1.x);
y1 = ystart;
- y2 = GetSectorIndexY((GetWorldX(xstart+1) - point1.x)*m + point1.y);
+ y2 = GetSectorIndexY((GetWorldX(xstart + 1) - point1.x) * m + point1.y);
if(y1 < y2)
- for(y = y1; y <= y2; y++)
- ProcessLineOfSightSector(*GetSector(xstart, y), LOSARGS);
+ for(y = y1; y <= y2; y++) ProcessLineOfSightSector(*GetSector(xstart, y), LOSARGS);
else
- for(y = y1; y >= y2; y--)
- ProcessLineOfSightSector(*GetSector(xstart, y), LOSARGS);
+ for(y = y1; y >= y2; y--) ProcessLineOfSightSector(*GetSector(xstart, y), LOSARGS);
- for(x = xstart+1; x < xend; x++){
+ for(x = xstart + 1; x < xend; x++) {
y1 = y2;
- y2 = GetSectorIndexY((GetWorldX(x+1) - point1.x)*m + point1.y);
+ y2 = GetSectorIndexY((GetWorldX(x + 1) - point1.x) * m + point1.y);
if(y1 < y2)
- for(y = y1; y <= y2; y++)
- ProcessLineOfSightSector(*GetSector(x, y), LOSARGS);
+ for(y = y1; y <= y2; y++) ProcessLineOfSightSector(*GetSector(x, y), LOSARGS);
else
- for(y = y1; y >= y2; y--)
- ProcessLineOfSightSector(*GetSector(x, y), LOSARGS);
+ for(y = y1; y >= y2; y--) ProcessLineOfSightSector(*GetSector(x, y), LOSARGS);
}
y1 = y2;
y2 = yend;
if(y1 < y2)
- for(y = y1; y <= y2; y++)
- ProcessLineOfSightSector(*GetSector(xend, y), LOSARGS);
+ for(y = y1; y <= y2; y++) ProcessLineOfSightSector(*GetSector(xend, y), LOSARGS);
else
- for(y = y1; y >= y2; y--)
- ProcessLineOfSightSector(*GetSector(xend, y), LOSARGS);
- }else{
+ for(y = y1; y >= y2; y--) ProcessLineOfSightSector(*GetSector(xend, y), LOSARGS);
+ } else {
// Step from right to left
float m = (point2.y - point1.y) / (point2.x - point1.x);
y1 = ystart;
- y2 = GetSectorIndexY((GetWorldX(xstart) - point1.x)*m + point1.y);
+ y2 = GetSectorIndexY((GetWorldX(xstart) - point1.x) * m + point1.y);
if(y1 < y2)
- for(y = y1; y <= y2; y++)
- ProcessLineOfSightSector(*GetSector(xstart, y), LOSARGS);
+ for(y = y1; y <= y2; y++) ProcessLineOfSightSector(*GetSector(xstart, y), LOSARGS);
else
- for(y = y1; y >= y2; y--)
- ProcessLineOfSightSector(*GetSector(xstart, y), LOSARGS);
+ for(y = y1; y >= y2; y--) ProcessLineOfSightSector(*GetSector(xstart, y), LOSARGS);
- for(x = xstart-1; x > xend; x--){
+ for(x = xstart - 1; x > xend; x--) {
y1 = y2;
- y2 = GetSectorIndexY((GetWorldX(x) - point1.x)*m + point1.y);
+ y2 = GetSectorIndexY((GetWorldX(x) - point1.x) * m + point1.y);
if(y1 < y2)
- for(y = y1; y <= y2; y++)
- ProcessLineOfSightSector(*GetSector(x, y), LOSARGS);
+ for(y = y1; y <= y2; y++) ProcessLineOfSightSector(*GetSector(x, y), LOSARGS);
else
- for(y = y1; y >= y2; y--)
- ProcessLineOfSightSector(*GetSector(x, y), LOSARGS);
+ for(y = y1; y >= y2; y--) ProcessLineOfSightSector(*GetSector(x, y), LOSARGS);
}
y1 = y2;
y2 = yend;
if(y1 < y2)
- for(y = y1; y <= y2; y++)
- ProcessLineOfSightSector(*GetSector(xend, y), LOSARGS);
+ for(y = y1; y <= y2; y++) ProcessLineOfSightSector(*GetSector(xend, y), LOSARGS);
else
- for(y = y1; y >= y2; y--)
- ProcessLineOfSightSector(*GetSector(xend, y), LOSARGS);
+ for(y = y1; y >= y2; y--) ProcessLineOfSightSector(*GetSector(xend, y), LOSARGS);
}
return dist < 1.0f;
}
@@ -251,51 +264,63 @@ CWorld::ProcessLineOfSight(const CVector &point1, const CVector &point2, CColPoi
}
bool
-CWorld::ProcessLineOfSightSector(CSector &sector, const CColLine &line, CColPoint &point, float &dist, CEntity *&entity, bool checkBuildings, bool checkVehicles, bool checkPeds, bool checkObjects, bool checkDummies, bool ignoreSeeThrough, bool ignoreSomeObjects)
+CWorld::ProcessLineOfSightSector(CSector &sector, const CColLine &line, CColPoint &point, float &dist, CEntity *&entity,
+ bool checkBuildings, bool checkVehicles, bool checkPeds, bool checkObjects,
+ bool checkDummies, bool ignoreSeeThrough, bool ignoreSomeObjects)
{
float mindist = dist;
bool deadPeds = !!bIncludeDeadPeds;
bIncludeDeadPeds = false;
- if(checkBuildings){
- ProcessLineOfSightSectorList(sector.m_lists[ENTITYLIST_BUILDINGS], line, point, mindist, entity, ignoreSeeThrough);
- ProcessLineOfSightSectorList(sector.m_lists[ENTITYLIST_BUILDINGS_OVERLAP], line, point, mindist, entity, ignoreSeeThrough);
+ if(checkBuildings) {
+ ProcessLineOfSightSectorList(sector.m_lists[ENTITYLIST_BUILDINGS], line, point, mindist, entity,
+ ignoreSeeThrough);
+ ProcessLineOfSightSectorList(sector.m_lists[ENTITYLIST_BUILDINGS_OVERLAP], line, point, mindist, entity,
+ ignoreSeeThrough);
}
- if(checkVehicles){
- ProcessLineOfSightSectorList(sector.m_lists[ENTITYLIST_VEHICLES], line, point, mindist, entity, ignoreSeeThrough);
- ProcessLineOfSightSectorList(sector.m_lists[ENTITYLIST_VEHICLES_OVERLAP], line, point, mindist, entity, ignoreSeeThrough);
+ if(checkVehicles) {
+ ProcessLineOfSightSectorList(sector.m_lists[ENTITYLIST_VEHICLES], line, point, mindist, entity,
+ ignoreSeeThrough);
+ ProcessLineOfSightSectorList(sector.m_lists[ENTITYLIST_VEHICLES_OVERLAP], line, point, mindist, entity,
+ ignoreSeeThrough);
}
- if(checkPeds){
- if(deadPeds)
- bIncludeDeadPeds = true;
- ProcessLineOfSightSectorList(sector.m_lists[ENTITYLIST_PEDS], line, point, mindist, entity, ignoreSeeThrough);
- ProcessLineOfSightSectorList(sector.m_lists[ENTITYLIST_PEDS_OVERLAP], line, point, mindist, entity, ignoreSeeThrough);
+ if(checkPeds) {
+ if(deadPeds) bIncludeDeadPeds = true;
+ ProcessLineOfSightSectorList(sector.m_lists[ENTITYLIST_PEDS], line, point, mindist, entity,
+ ignoreSeeThrough);
+ ProcessLineOfSightSectorList(sector.m_lists[ENTITYLIST_PEDS_OVERLAP], line, point, mindist, entity,
+ ignoreSeeThrough);
bIncludeDeadPeds = false;
}
- if(checkObjects){
- ProcessLineOfSightSectorList(sector.m_lists[ENTITYLIST_OBJECTS], line, point, mindist, entity, ignoreSeeThrough, ignoreSomeObjects);
- ProcessLineOfSightSectorList(sector.m_lists[ENTITYLIST_OBJECTS_OVERLAP], line, point, mindist, entity, ignoreSeeThrough, ignoreSomeObjects);
+ if(checkObjects) {
+ ProcessLineOfSightSectorList(sector.m_lists[ENTITYLIST_OBJECTS], line, point, mindist, entity,
+ ignoreSeeThrough, ignoreSomeObjects);
+ ProcessLineOfSightSectorList(sector.m_lists[ENTITYLIST_OBJECTS_OVERLAP], line, point, mindist, entity,
+ ignoreSeeThrough, ignoreSomeObjects);
}
- if(checkDummies){
- ProcessLineOfSightSectorList(sector.m_lists[ENTITYLIST_DUMMIES], line, point, mindist, entity, ignoreSeeThrough);
- ProcessLineOfSightSectorList(sector.m_lists[ENTITYLIST_DUMMIES_OVERLAP], line, point, mindist, entity, ignoreSeeThrough);
+ if(checkDummies) {
+ ProcessLineOfSightSectorList(sector.m_lists[ENTITYLIST_DUMMIES], line, point, mindist, entity,
+ ignoreSeeThrough);
+ ProcessLineOfSightSectorList(sector.m_lists[ENTITYLIST_DUMMIES_OVERLAP], line, point, mindist, entity,
+ ignoreSeeThrough);
}
bIncludeDeadPeds = deadPeds;
- if(mindist < dist){
+ if(mindist < dist) {
dist = mindist;
return true;
- }else
+ } else
return false;
}
bool
-CWorld::ProcessLineOfSightSectorList(CPtrList &list, const CColLine &line, CColPoint &point, float &dist, CEntity *&entity, bool ignoreSeeThrough, bool ignoreSomeObjects)
+CWorld::ProcessLineOfSightSectorList(CPtrList &list, const CColLine &line, CColPoint &point, float &dist,
+ CEntity *&entity, bool ignoreSeeThrough, bool ignoreSomeObjects)
{
bool deadPeds = false;
float mindist = dist;
@@ -303,119 +328,137 @@ CWorld::ProcessLineOfSightSectorList(CPtrList &list, const CColLine &line, CColP
CEntity *e;
CColModel *colmodel;
- if(list.first && bIncludeDeadPeds && ((CEntity*)list.first->item)->IsPed())
- deadPeds = true;
+ if(list.first && bIncludeDeadPeds && ((CEntity *)list.first->item)->IsPed()) deadPeds = true;
- for(node = list.first; node; node = node->next){
- e = (CEntity*)node->item;
- if(e->m_scanCode != GetCurrentScanCode() &&
- e != pIgnoreEntity &&
- (e->bUsesCollision || deadPeds) &&
- !(ignoreSomeObjects && CameraToIgnoreThisObject(e))){
+ for(node = list.first; node; node = node->next) {
+ e = (CEntity *)node->item;
+ if(e->m_scanCode != GetCurrentScanCode() && e != pIgnoreEntity && (e->bUsesCollision || deadPeds) &&
+ !(ignoreSomeObjects && CameraToIgnoreThisObject(e))) {
colmodel = nil;
e->m_scanCode = GetCurrentScanCode();
- if(e->IsPed()){
- if(e->bUsesCollision ||
- deadPeds && ((CPed*)e)->m_nPedState == PED_DEAD){
- if (((CPed*)e)->UseGroundColModel())
+ if(e->IsPed()) {
+ if(e->bUsesCollision || deadPeds && ((CPed *)e)->m_nPedState == PED_DEAD) {
+ if(((CPed *)e)->UseGroundColModel())
colmodel = &CTempColModels::ms_colModelPedGroundHit;
else
#ifdef ANIMATE_PED_COL_MODEL
- colmodel = CPedModelInfo::AnimatePedColModel(((CPedModelInfo*)CModelInfo::GetModelInfo(e->GetModelIndex()))->GetHitColModel(), RpClumpGetFrame(e->GetClump()));
+ colmodel = CPedModelInfo::AnimatePedColModel(
+ ((CPedModelInfo *)CModelInfo::GetModelInfo(e->GetModelIndex()))
+ ->GetHitColModel(),
+ RpClumpGetFrame(e->GetClump()));
#else
- colmodel = ((CPedModelInfo*)CModelInfo::GetModelInfo(e->GetModelIndex()))->GetHitColModel();
+ colmodel =
+ ((CPedModelInfo *)CModelInfo::GetModelInfo(e->GetModelIndex()))
+ ->GetHitColModel();
#endif
- }else
+ } else
colmodel = nil;
- }else if(e->bUsesCollision)
+ } else if(e->bUsesCollision)
colmodel = CModelInfo::GetModelInfo(e->GetModelIndex())->GetColModel();
- if(colmodel &&
- CCollision::ProcessLineOfSight(line, e->GetMatrix(), *colmodel, point, dist, ignoreSeeThrough))
+ if(colmodel && CCollision::ProcessLineOfSight(line, e->GetMatrix(), *colmodel, point, dist,
+ ignoreSeeThrough))
entity = e;
}
}
- if(mindist < dist){
+ if(mindist < dist) {
dist = mindist;
return true;
- }else
+ } else
return false;
}
-bool
-CWorld::ProcessVerticalLine(const CVector &point1, float z2, CColPoint &point, CEntity *&entity, bool checkBuildings, bool checkVehicles, bool checkPeds, bool checkObjects, bool checkDummies, bool ignoreSeeThrough, CStoredCollPoly *poly)
+bool
+CWorld::ProcessVerticalLine(const CVector &point1, float z2, CColPoint &point, CEntity *&entity, bool checkBuildings,
+ bool checkVehicles, bool checkPeds, bool checkObjects, bool checkDummies,
+ bool ignoreSeeThrough, CStoredCollPoly *poly)
{
AdvanceCurrentScanCode();
CVector point2(point1.x, point1.y, z2);
return ProcessVerticalLineSector(*GetSector(GetSectorIndexX(point1.x), GetSectorIndexX(point1.y)),
- CColLine(point1, point2), point, entity,
- checkBuildings, checkVehicles, checkPeds, checkObjects, checkDummies, ignoreSeeThrough, poly);
+ CColLine(point1, point2), point, entity, checkBuildings, checkVehicles,
+ checkPeds, checkObjects, checkDummies, ignoreSeeThrough, poly);
}
bool
-CWorld::ProcessVerticalLineSector(CSector &sector, const CColLine &line, CColPoint &point, CEntity *&entity, bool checkBuildings, bool checkVehicles, bool checkPeds, bool checkObjects, bool checkDummies, bool ignoreSeeThrough, CStoredCollPoly *poly)
+CWorld::ProcessVerticalLineSector(CSector &sector, const CColLine &line, CColPoint &point, CEntity *&entity,
+ bool checkBuildings, bool checkVehicles, bool checkPeds, bool checkObjects,
+ bool checkDummies, bool ignoreSeeThrough, CStoredCollPoly *poly)
{
float mindist = 1.0f;
- if(checkBuildings){
- ProcessVerticalLineSectorList(sector.m_lists[ENTITYLIST_BUILDINGS], line, point, mindist, entity, ignoreSeeThrough, poly);
- ProcessVerticalLineSectorList(sector.m_lists[ENTITYLIST_BUILDINGS_OVERLAP], line, point, mindist, entity, ignoreSeeThrough, poly);
+ if(checkBuildings) {
+ ProcessVerticalLineSectorList(sector.m_lists[ENTITYLIST_BUILDINGS], line, point, mindist, entity,
+ ignoreSeeThrough, poly);
+ ProcessVerticalLineSectorList(sector.m_lists[ENTITYLIST_BUILDINGS_OVERLAP], line, point, mindist,
+ entity, ignoreSeeThrough, poly);
}
- if(checkVehicles){
- ProcessVerticalLineSectorList(sector.m_lists[ENTITYLIST_VEHICLES], line, point, mindist, entity, ignoreSeeThrough, poly);
- ProcessVerticalLineSectorList(sector.m_lists[ENTITYLIST_VEHICLES_OVERLAP], line, point, mindist, entity, ignoreSeeThrough, poly);
+ if(checkVehicles) {
+ ProcessVerticalLineSectorList(sector.m_lists[ENTITYLIST_VEHICLES], line, point, mindist, entity,
+ ignoreSeeThrough, poly);
+ ProcessVerticalLineSectorList(sector.m_lists[ENTITYLIST_VEHICLES_OVERLAP], line, point, mindist, entity,
+ ignoreSeeThrough, poly);
}
- if(checkPeds){
- ProcessVerticalLineSectorList(sector.m_lists[ENTITYLIST_PEDS], line, point, mindist, entity, ignoreSeeThrough, poly);
- ProcessVerticalLineSectorList(sector.m_lists[ENTITYLIST_PEDS_OVERLAP], line, point, mindist, entity, ignoreSeeThrough, poly);
+ if(checkPeds) {
+ ProcessVerticalLineSectorList(sector.m_lists[ENTITYLIST_PEDS], line, point, mindist, entity,
+ ignoreSeeThrough, poly);
+ ProcessVerticalLineSectorList(sector.m_lists[ENTITYLIST_PEDS_OVERLAP], line, point, mindist, entity,
+ ignoreSeeThrough, poly);
}
- if(checkObjects){
- ProcessVerticalLineSectorList(sector.m_lists[ENTITYLIST_OBJECTS], line, point, mindist, entity, ignoreSeeThrough, poly);
- ProcessVerticalLineSectorList(sector.m_lists[ENTITYLIST_OBJECTS_OVERLAP], line, point, mindist, entity, ignoreSeeThrough, poly);
+ if(checkObjects) {
+ ProcessVerticalLineSectorList(sector.m_lists[ENTITYLIST_OBJECTS], line, point, mindist, entity,
+ ignoreSeeThrough, poly);
+ ProcessVerticalLineSectorList(sector.m_lists[ENTITYLIST_OBJECTS_OVERLAP], line, point, mindist, entity,
+ ignoreSeeThrough, poly);
}
- if(checkDummies){
- ProcessVerticalLineSectorList(sector.m_lists[ENTITYLIST_DUMMIES], line, point, mindist, entity, ignoreSeeThrough, poly);
- ProcessVerticalLineSectorList(sector.m_lists[ENTITYLIST_DUMMIES_OVERLAP], line, point, mindist, entity, ignoreSeeThrough, poly);
+ if(checkDummies) {
+ ProcessVerticalLineSectorList(sector.m_lists[ENTITYLIST_DUMMIES], line, point, mindist, entity,
+ ignoreSeeThrough, poly);
+ ProcessVerticalLineSectorList(sector.m_lists[ENTITYLIST_DUMMIES_OVERLAP], line, point, mindist, entity,
+ ignoreSeeThrough, poly);
}
return mindist < 1.0f;
}
bool
-CWorld::ProcessVerticalLineSectorList(CPtrList &list, const CColLine &line, CColPoint &point, float &dist, CEntity *&entity, bool ignoreSeeThrough, CStoredCollPoly *poly)
+CWorld::ProcessVerticalLineSectorList(CPtrList &list, const CColLine &line, CColPoint &point, float &dist,
+ CEntity *&entity, bool ignoreSeeThrough, CStoredCollPoly *poly)
{
float mindist = dist;
CPtrNode *node;
CEntity *e;
CColModel *colmodel;
- for(node = list.first; node; node = node->next){
- e = (CEntity*)node->item;
- if(e->m_scanCode != GetCurrentScanCode() &&
- e->bUsesCollision){
+ for(node = list.first; node; node = node->next) {
+ e = (CEntity *)node->item;
+ if(e->m_scanCode != GetCurrentScanCode() && e->bUsesCollision) {
e->m_scanCode = GetCurrentScanCode();
colmodel = CModelInfo::GetModelInfo(e->GetModelIndex())->GetColModel();
- if(CCollision::ProcessVerticalLine(line, e->GetMatrix(), *colmodel, point, dist, ignoreSeeThrough, poly))
+ if(CCollision::ProcessVerticalLine(line, e->GetMatrix(), *colmodel, point, dist,
+ ignoreSeeThrough, poly))
entity = e;
}
}
- if(mindist < dist){
+ if(mindist < dist) {
dist = mindist;
return true;
- }else
+ } else
return false;
}
bool
-CWorld::GetIsLineOfSightClear(const CVector &point1, const CVector &point2, bool checkBuildings, bool checkVehicles, bool checkPeds, bool checkObjects, bool checkDummies, bool ignoreSeeThrough, bool ignoreSomeObjects)
+CWorld::GetIsLineOfSightClear(const CVector &point1, const CVector &point2, bool checkBuildings, bool checkVehicles,
+ bool checkPeds, bool checkObjects, bool checkDummies, bool ignoreSeeThrough,
+ bool ignoreSomeObjects)
{
int x, xstart, xend;
int y, ystart, yend;
@@ -428,58 +471,54 @@ CWorld::GetIsLineOfSightClear(const CVector &point1, const CVector &point2, bool
xend = GetSectorIndexX(point2.x);
yend = GetSectorIndexY(point2.y);
-#define LOSARGS CColLine(point1, point2), checkBuildings, checkVehicles, checkPeds, checkObjects, checkDummies, ignoreSeeThrough, ignoreSomeObjects
+#define LOSARGS \
+ CColLine(point1, point2), checkBuildings, checkVehicles, checkPeds, checkObjects, checkDummies, \
+ ignoreSeeThrough, ignoreSomeObjects
- if(xstart == xend && ystart == yend){
+ if(xstart == xend && ystart == yend) {
// Only one sector
return GetIsLineOfSightSectorClear(*GetSector(xstart, ystart), LOSARGS);
- }else if(xstart == xend){
+ } else if(xstart == xend) {
// Only step in y
- if(ystart < yend){
+ if(ystart < yend) {
for(y = ystart; y <= yend; y++)
- if(!GetIsLineOfSightSectorClear(*GetSector(xstart, y), LOSARGS))
- return false;
- }else{
+ if(!GetIsLineOfSightSectorClear(*GetSector(xstart, y), LOSARGS)) return false;
+ } else {
for(y = ystart; y >= yend; y--)
- if(!GetIsLineOfSightSectorClear(*GetSector(xstart, y), LOSARGS))
- return false;
+ if(!GetIsLineOfSightSectorClear(*GetSector(xstart, y), LOSARGS)) return false;
}
- }else if(ystart == yend){
+ } else if(ystart == yend) {
// Only step in x
- if(xstart < xend){
+ if(xstart < xend) {
for(x = xstart; x <= xend; x++)
- if(!GetIsLineOfSightSectorClear(*GetSector(x, ystart), LOSARGS))
- return false;
- }else{
+ if(!GetIsLineOfSightSectorClear(*GetSector(x, ystart), LOSARGS)) return false;
+ } else {
for(x = xstart; x >= xend; x--)
- if(!GetIsLineOfSightSectorClear(*GetSector(x, ystart), LOSARGS))
- return false;
+ if(!GetIsLineOfSightSectorClear(*GetSector(x, ystart), LOSARGS)) return false;
}
- }else{
- if(point1.x < point2.x){
+ } else {
+ if(point1.x < point2.x) {
// Step from left to right
float m = (point2.y - point1.y) / (point2.x - point1.x);
y1 = ystart;
- y2 = GetSectorIndexY((GetWorldX(xstart+1) - point1.x)*m + point1.y);
- if(y1 < y2){
+ y2 = GetSectorIndexY((GetWorldX(xstart + 1) - point1.x) * m + point1.y);
+ if(y1 < y2) {
for(y = y1; y <= y2; y++)
- if(!GetIsLineOfSightSectorClear(*GetSector(xstart, y), LOSARGS))
- return false;
- }else{
+ if(!GetIsLineOfSightSectorClear(*GetSector(xstart, y), LOSARGS)) return false;
+ } else {
for(y = y1; y >= y2; y--)
- if(!GetIsLineOfSightSectorClear(*GetSector(xstart, y), LOSARGS))
- return false;
+ if(!GetIsLineOfSightSectorClear(*GetSector(xstart, y), LOSARGS)) return false;
}
- for(x = xstart+1; x < xend; x++){
+ for(x = xstart + 1; x < xend; x++) {
y1 = y2;
- y2 = GetSectorIndexY((GetWorldX(x+1) - point1.x)*m + point1.y);
- if(y1 < y2){
+ y2 = GetSectorIndexY((GetWorldX(x + 1) - point1.x) * m + point1.y);
+ if(y1 < y2) {
for(y = y1; y <= y2; y++)
if(!GetIsLineOfSightSectorClear(*GetSector(x, y), LOSARGS))
return false;
- }else{
+ } else {
for(y = y1; y >= y2; y--)
if(!GetIsLineOfSightSectorClear(*GetSector(x, y), LOSARGS))
return false;
@@ -488,39 +527,35 @@ CWorld::GetIsLineOfSightClear(const CVector &point1, const CVector &point2, bool
y1 = y2;
y2 = yend;
- if(y1 < y2){
+ if(y1 < y2) {
for(y = y1; y <= y2; y++)
- if(!GetIsLineOfSightSectorClear(*GetSector(xend, y), LOSARGS))
- return false;
- }else{
+ if(!GetIsLineOfSightSectorClear(*GetSector(xend, y), LOSARGS)) return false;
+ } else {
for(y = y1; y >= y2; y--)
- if(!GetIsLineOfSightSectorClear(*GetSector(xend, y), LOSARGS))
- return false;
+ if(!GetIsLineOfSightSectorClear(*GetSector(xend, y), LOSARGS)) return false;
}
- }else{
+ } else {
// Step from right to left
float m = (point2.y - point1.y) / (point2.x - point1.x);
y1 = ystart;
- y2 = GetSectorIndexY((GetWorldX(xstart) - point1.x)*m + point1.y);
- if(y1 < y2){
+ y2 = GetSectorIndexY((GetWorldX(xstart) - point1.x) * m + point1.y);
+ if(y1 < y2) {
for(y = y1; y <= y2; y++)
- if(!GetIsLineOfSightSectorClear(*GetSector(xstart, y), LOSARGS))
- return false;
- }else{
+ if(!GetIsLineOfSightSectorClear(*GetSector(xstart, y), LOSARGS)) return false;
+ } else {
for(y = y1; y >= y2; y--)
- if(!GetIsLineOfSightSectorClear(*GetSector(xstart, y), LOSARGS))
- return false;
+ if(!GetIsLineOfSightSectorClear(*GetSector(xstart, y), LOSARGS)) return false;
}
- for(x = xstart-1; x > xend; x--){
+ for(x = xstart - 1; x > xend; x--) {
y1 = y2;
- y2 = GetSectorIndexY((GetWorldX(x) - point1.x)*m + point1.y);
- if(y1 < y2){
+ y2 = GetSectorIndexY((GetWorldX(x) - point1.x) * m + point1.y);
+ if(y1 < y2) {
for(y = y1; y <= y2; y++)
if(!GetIsLineOfSightSectorClear(*GetSector(x, y), LOSARGS))
return false;
- }else{
+ } else {
for(y = y1; y >= y2; y--)
if(!GetIsLineOfSightSectorClear(*GetSector(x, y), LOSARGS))
return false;
@@ -529,14 +564,12 @@ CWorld::GetIsLineOfSightClear(const CVector &point1, const CVector &point2, bool
y1 = y2;
y2 = yend;
- if(y1 < y2){
+ if(y1 < y2) {
for(y = y1; y <= y2; y++)
- if(!GetIsLineOfSightSectorClear(*GetSector(xend, y), LOSARGS))
- return false;
- }else{
+ if(!GetIsLineOfSightSectorClear(*GetSector(xend, y), LOSARGS)) return false;
+ } else {
for(y = y1; y >= y2; y--)
- if(!GetIsLineOfSightSectorClear(*GetSector(xend, y), LOSARGS))
- return false;
+ if(!GetIsLineOfSightSectorClear(*GetSector(xend, y), LOSARGS)) return false;
}
}
}
@@ -547,37 +580,43 @@ CWorld::GetIsLineOfSightClear(const CVector &point1, const CVector &point2, bool
}
bool
-CWorld::GetIsLineOfSightSectorClear(CSector &sector, const CColLine &line, bool checkBuildings, bool checkVehicles, bool checkPeds, bool checkObjects, bool checkDummies, bool ignoreSeeThrough, bool ignoreSomeObjects)
+CWorld::GetIsLineOfSightSectorClear(CSector &sector, const CColLine &line, bool checkBuildings, bool checkVehicles,
+ bool checkPeds, bool checkObjects, bool checkDummies, bool ignoreSeeThrough,
+ bool ignoreSomeObjects)
{
- if(checkBuildings){
+ if(checkBuildings) {
if(!GetIsLineOfSightSectorListClear(sector.m_lists[ENTITYLIST_BUILDINGS], line, ignoreSeeThrough))
return false;
- if(!GetIsLineOfSightSectorListClear(sector.m_lists[ENTITYLIST_BUILDINGS_OVERLAP], line, ignoreSeeThrough))
+ if(!GetIsLineOfSightSectorListClear(sector.m_lists[ENTITYLIST_BUILDINGS_OVERLAP], line,
+ ignoreSeeThrough))
return false;
}
- if(checkVehicles){
+ if(checkVehicles) {
if(!GetIsLineOfSightSectorListClear(sector.m_lists[ENTITYLIST_VEHICLES], line, ignoreSeeThrough))
return false;
- if(!GetIsLineOfSightSectorListClear(sector.m_lists[ENTITYLIST_VEHICLES_OVERLAP], line, ignoreSeeThrough))
+ if(!GetIsLineOfSightSectorListClear(sector.m_lists[ENTITYLIST_VEHICLES_OVERLAP], line,
+ ignoreSeeThrough))
return false;
}
- if(checkPeds){
+ if(checkPeds) {
if(!GetIsLineOfSightSectorListClear(sector.m_lists[ENTITYLIST_PEDS], line, ignoreSeeThrough))
return false;
if(!GetIsLineOfSightSectorListClear(sector.m_lists[ENTITYLIST_PEDS_OVERLAP], line, ignoreSeeThrough))
return false;
}
- if(checkObjects){
- if(!GetIsLineOfSightSectorListClear(sector.m_lists[ENTITYLIST_OBJECTS], line, ignoreSeeThrough, ignoreSomeObjects))
+ if(checkObjects) {
+ if(!GetIsLineOfSightSectorListClear(sector.m_lists[ENTITYLIST_OBJECTS], line, ignoreSeeThrough,
+ ignoreSomeObjects))
return false;
- if(!GetIsLineOfSightSectorListClear(sector.m_lists[ENTITYLIST_OBJECTS_OVERLAP], line, ignoreSeeThrough, ignoreSomeObjects))
+ if(!GetIsLineOfSightSectorListClear(sector.m_lists[ENTITYLIST_OBJECTS_OVERLAP], line, ignoreSeeThrough,
+ ignoreSomeObjects))
return false;
}
- if(checkDummies){
+ if(checkDummies) {
if(!GetIsLineOfSightSectorListClear(sector.m_lists[ENTITYLIST_DUMMIES], line, ignoreSeeThrough))
return false;
if(!GetIsLineOfSightSectorListClear(sector.m_lists[ENTITYLIST_DUMMIES_OVERLAP], line, ignoreSeeThrough))
@@ -588,21 +627,20 @@ CWorld::GetIsLineOfSightSectorClear(CSector &sector, const CColLine &line, bool
}
bool
-CWorld::GetIsLineOfSightSectorListClear(CPtrList &list, const CColLine &line, bool ignoreSeeThrough, bool ignoreSomeObjects)
+CWorld::GetIsLineOfSightSectorListClear(CPtrList &list, const CColLine &line, bool ignoreSeeThrough,
+ bool ignoreSomeObjects)
{
CPtrNode *node;
CEntity *e;
CColModel *colmodel;
- for(node = list.first; node; node = node->next){
- e = (CEntity*)node->item;
- if(e->m_scanCode != GetCurrentScanCode() &&
- e->bUsesCollision){
+ for(node = list.first; node; node = node->next) {
+ e = (CEntity *)node->item;
+ if(e->m_scanCode != GetCurrentScanCode() && e->bUsesCollision) {
e->m_scanCode = GetCurrentScanCode();
- if(e != pIgnoreEntity &&
- !(ignoreSomeObjects && CameraToIgnoreThisObject(e))){
+ if(e != pIgnoreEntity && !(ignoreSomeObjects && CameraToIgnoreThisObject(e))) {
colmodel = CModelInfo::GetModelInfo(e->GetModelIndex())->GetColModel();
@@ -616,26 +654,25 @@ CWorld::GetIsLineOfSightSectorListClear(CPtrList &list, const CColLine &line, bo
}
void
-CWorld::FindObjectsInRangeSectorList(CPtrList &list, CVector &centre, float radius, bool ignoreZ, short *nextObject, short lastObject, CEntity **objects)
+CWorld::FindObjectsInRangeSectorList(CPtrList &list, CVector &centre, float radius, bool ignoreZ, short *nextObject,
+ short lastObject, CEntity **objects)
{
float radiusSqr = radius * radius;
float objDistSqr;
- for (CPtrNode *node = list.first; node; node = node->next) {
- CEntity *object = (CEntity*)node->item;
- if (object->m_scanCode != GetCurrentScanCode()) {
+ for(CPtrNode *node = list.first; node; node = node->next) {
+ CEntity *object = (CEntity *)node->item;
+ if(object->m_scanCode != GetCurrentScanCode()) {
object->m_scanCode = GetCurrentScanCode();
CVector diff = centre - object->GetPosition();
- if (ignoreZ)
+ if(ignoreZ)
objDistSqr = diff.MagnitudeSqr2D();
else
objDistSqr = diff.MagnitudeSqr();
- if (objDistSqr < radiusSqr && *nextObject < lastObject) {
- if (objects) {
- objects[*nextObject] = object;
- }
+ if(objDistSqr < radiusSqr && *nextObject < lastObject) {
+ if(objects) { objects[*nextObject] = object; }
(*nextObject)++;
}
}
@@ -643,140 +680,239 @@ CWorld::FindObjectsInRangeSectorList(CPtrList &list, CVector &centre, float radi
}
void
-CWorld::FindObjectsInRange(CVector &centre, float radius, bool ignoreZ, short *nextObject, short lastObject, CEntity **objects, bool checkBuildings, bool checkVehicles, bool checkPeds, bool checkObjects, bool checkDummies)
+CWorld::FindObjectsInRange(CVector &centre, float radius, bool ignoreZ, short *nextObject, short lastObject,
+ CEntity **objects, bool checkBuildings, bool checkVehicles, bool checkPeds,
+ bool checkObjects, bool checkDummies)
{
int minX = GetSectorIndexX(centre.x - radius);
- if (minX <= 0) minX = 0;
+ if(minX <= 0) minX = 0;
int minY = GetSectorIndexY(centre.y - radius);
- if (minY <= 0) minY = 0;
+ if(minY <= 0) minY = 0;
int maxX = GetSectorIndexX(centre.x + radius);
#ifdef FIX_BUGS
- if (maxX >= NUMSECTORS_X) maxX = NUMSECTORS_X - 1;
+ if(maxX >= NUMSECTORS_X) maxX = NUMSECTORS_X - 1;
#else
- if (maxX >= NUMSECTORS_X) maxX = NUMSECTORS_X;
+ if(maxX >= NUMSECTORS_X) maxX = NUMSECTORS_X;
#endif
int maxY = GetSectorIndexY(centre.y + radius);
#ifdef FIX_BUGS
- if (maxY >= NUMSECTORS_Y) maxY = NUMSECTORS_Y - 1;
+ if(maxY >= NUMSECTORS_Y) maxY = NUMSECTORS_Y - 1;
#else
- if (maxY >= NUMSECTORS_Y) maxY = NUMSECTORS_Y;
+ if(maxY >= NUMSECTORS_Y) maxY = NUMSECTORS_Y;
#endif
-
+
AdvanceCurrentScanCode();
*nextObject = 0;
for(int curY = minY; curY <= maxY; curY++) {
for(int curX = minX; curX <= maxX; curX++) {
CSector *sector = GetSector(curX, curY);
- if (checkBuildings) {
- FindObjectsInRangeSectorList(sector->m_lists[ENTITYLIST_BUILDINGS], centre, radius, ignoreZ, nextObject, lastObject, objects);
- FindObjectsInRangeSectorList(sector->m_lists[ENTITYLIST_BUILDINGS_OVERLAP], centre, radius, ignoreZ, nextObject, lastObject, objects);
+ if(checkBuildings) {
+ FindObjectsInRangeSectorList(sector->m_lists[ENTITYLIST_BUILDINGS], centre, radius,
+ ignoreZ, nextObject, lastObject, objects);
+ FindObjectsInRangeSectorList(sector->m_lists[ENTITYLIST_BUILDINGS_OVERLAP], centre,
+ radius, ignoreZ, nextObject, lastObject, objects);
+ }
+ if(checkVehicles) {
+ FindObjectsInRangeSectorList(sector->m_lists[ENTITYLIST_VEHICLES], centre, radius,
+ ignoreZ, nextObject, lastObject, objects);
+ FindObjectsInRangeSectorList(sector->m_lists[ENTITYLIST_VEHICLES_OVERLAP], centre,
+ radius, ignoreZ, nextObject, lastObject, objects);
+ }
+ if(checkPeds) {
+ FindObjectsInRangeSectorList(sector->m_lists[ENTITYLIST_PEDS], centre, radius, ignoreZ,
+ nextObject, lastObject, objects);
+ FindObjectsInRangeSectorList(sector->m_lists[ENTITYLIST_PEDS_OVERLAP], centre, radius,
+ ignoreZ, nextObject, lastObject, objects);
+ }
+ if(checkObjects) {
+ FindObjectsInRangeSectorList(sector->m_lists[ENTITYLIST_OBJECTS], centre, radius,
+ ignoreZ, nextObject, lastObject, objects);
+ FindObjectsInRangeSectorList(sector->m_lists[ENTITYLIST_OBJECTS_OVERLAP], centre,
+ radius, ignoreZ, nextObject, lastObject, objects);
+ }
+ if(checkDummies) {
+ FindObjectsInRangeSectorList(sector->m_lists[ENTITYLIST_DUMMIES], centre, radius,
+ ignoreZ, nextObject, lastObject, objects);
+ FindObjectsInRangeSectorList(sector->m_lists[ENTITYLIST_DUMMIES_OVERLAP], centre,
+ radius, ignoreZ, nextObject, lastObject, objects);
+ }
+ }
+ }
+}
+
+void
+CWorld::FindObjectsOfTypeInRangeSectorList(uint32 modelId, CPtrList &list, const CVector &position, float radius,
+ bool bCheck2DOnly, int16 *nEntitiesFound, int16 maxEntitiesToFind,
+ CEntity **aEntities)
+{
+ for(CPtrNode *pNode = list.first; pNode; pNode = pNode->next) {
+ CEntity *pEntity = (CEntity *)pNode->item;
+ if(pEntity->m_scanCode != GetCurrentScanCode()) {
+ pEntity->m_scanCode = GetCurrentScanCode();
+ if(modelId == pEntity->m_modelIndex) {
+ float fMagnitude = 0.0f;
+ if(bCheck2DOnly)
+ fMagnitude = (position - pEntity->GetPosition()).MagnitudeSqr2D();
+ else
+ fMagnitude = (position - pEntity->GetPosition()).MagnitudeSqr();
+ if(fMagnitude < radius * radius && *nEntitiesFound < maxEntitiesToFind) {
+ if(aEntities) aEntities[*nEntitiesFound] = pEntity;
+ ++*nEntitiesFound;
+ }
+ }
+ }
+ }
+}
+
+void
+CWorld::FindObjectsOfTypeInRange(uint32 modelId, const CVector &position, float radius, bool bCheck2DOnly,
+ int16 *nEntitiesFound, int16 maxEntitiesToFind, CEntity **aEntities, bool bBuildings,
+ bool bVehicles, bool bPeds, bool bObjects, bool bDummies)
+{
+ CWorld::AdvanceCurrentScanCode();
+ *nEntitiesFound = 0;
+ const CVector2D vecSectorStartPos(position.x - radius, position.y - radius);
+ const CVector2D vecSectorEndPos(position.x + radius, position.y + radius);
+ const int32 nStartX = max(CWorld::GetSectorIndexX(vecSectorStartPos.x), 0);
+ const int32 nStartY = max(CWorld::GetSectorIndexY(vecSectorStartPos.y), 0);
+ const int32 nEndX = min(CWorld::GetSectorIndexX(vecSectorEndPos.x), NUMSECTORS_X - 1);
+ const int32 nEndY = min(CWorld::GetSectorIndexY(vecSectorEndPos.y), NUMSECTORS_Y - 1);
+ for(int32 y = nStartY; y <= nEndY; y++) {
+ for(int32 x = nStartX; x <= nEndX; x++) {
+ CSector *pSector = CWorld::GetSector(x, y);
+ if(bBuildings) {
+ CWorld::FindObjectsOfTypeInRangeSectorList(
+ modelId, pSector->m_lists[ENTITYLIST_BUILDINGS], position, radius, bCheck2DOnly,
+ nEntitiesFound, maxEntitiesToFind, aEntities);
+ CWorld::FindObjectsOfTypeInRangeSectorList(
+ modelId, pSector->m_lists[ENTITYLIST_BUILDINGS_OVERLAP], position, radius,
+ bCheck2DOnly, nEntitiesFound, maxEntitiesToFind, aEntities);
}
- if (checkVehicles) {
- FindObjectsInRangeSectorList(sector->m_lists[ENTITYLIST_VEHICLES], centre, radius, ignoreZ, nextObject, lastObject, objects);
- FindObjectsInRangeSectorList(sector->m_lists[ENTITYLIST_VEHICLES_OVERLAP], centre, radius, ignoreZ, nextObject, lastObject, objects);
+ if(bVehicles) {
+ CWorld::FindObjectsOfTypeInRangeSectorList(
+ modelId, pSector->m_lists[ENTITYLIST_VEHICLES], position, radius, bCheck2DOnly,
+ nEntitiesFound, maxEntitiesToFind, aEntities);
+ CWorld::FindObjectsOfTypeInRangeSectorList(
+ modelId, pSector->m_lists[ENTITYLIST_VEHICLES_OVERLAP], position, radius,
+ bCheck2DOnly, nEntitiesFound, maxEntitiesToFind, aEntities);
}
- if (checkPeds) {
- FindObjectsInRangeSectorList(sector->m_lists[ENTITYLIST_PEDS], centre, radius, ignoreZ, nextObject, lastObject, objects);
- FindObjectsInRangeSectorList(sector->m_lists[ENTITYLIST_PEDS_OVERLAP], centre, radius, ignoreZ, nextObject, lastObject, objects);
+ if(bPeds) {
+ CWorld::FindObjectsOfTypeInRangeSectorList(
+ modelId, pSector->m_lists[ENTITYLIST_PEDS], position, radius, bCheck2DOnly,
+ nEntitiesFound, maxEntitiesToFind, aEntities);
+ CWorld::FindObjectsOfTypeInRangeSectorList(
+ modelId, pSector->m_lists[ENTITYLIST_PEDS_OVERLAP], position, radius, bCheck2DOnly,
+ nEntitiesFound, maxEntitiesToFind, aEntities);
}
- if (checkObjects) {
- FindObjectsInRangeSectorList(sector->m_lists[ENTITYLIST_OBJECTS], centre, radius, ignoreZ, nextObject, lastObject, objects);
- FindObjectsInRangeSectorList(sector->m_lists[ENTITYLIST_OBJECTS_OVERLAP], centre, radius, ignoreZ, nextObject, lastObject, objects);
+ if(bObjects) {
+ CWorld::FindObjectsOfTypeInRangeSectorList(
+ modelId, pSector->m_lists[ENTITYLIST_OBJECTS], position, radius, bCheck2DOnly,
+ nEntitiesFound, maxEntitiesToFind, aEntities);
+ CWorld::FindObjectsOfTypeInRangeSectorList(
+ modelId, pSector->m_lists[ENTITYLIST_OBJECTS_OVERLAP], position, radius,
+ bCheck2DOnly, nEntitiesFound, maxEntitiesToFind, aEntities);
}
- if (checkDummies) {
- FindObjectsInRangeSectorList(sector->m_lists[ENTITYLIST_DUMMIES], centre, radius, ignoreZ, nextObject, lastObject, objects);
- FindObjectsInRangeSectorList(sector->m_lists[ENTITYLIST_DUMMIES_OVERLAP], centre, radius, ignoreZ, nextObject, lastObject, objects);
+ if(bDummies) {
+ CWorld::FindObjectsOfTypeInRangeSectorList(
+ modelId, pSector->m_lists[ENTITYLIST_DUMMIES], position, radius, bCheck2DOnly,
+ nEntitiesFound, maxEntitiesToFind, aEntities);
+ CWorld::FindObjectsOfTypeInRangeSectorList(
+ modelId, pSector->m_lists[ENTITYLIST_DUMMIES_OVERLAP], position, radius,
+ bCheck2DOnly, nEntitiesFound, maxEntitiesToFind, aEntities);
}
}
}
}
-CEntity*
-CWorld::TestSphereAgainstWorld(CVector centre, float radius, CEntity *entityToIgnore, bool checkBuildings, bool checkVehicles, bool checkPeds, bool checkObjects, bool checkDummies, bool ignoreSomeObjects)
+CEntity *
+CWorld::TestSphereAgainstWorld(CVector centre, float radius, CEntity *entityToIgnore, bool checkBuildings,
+ bool checkVehicles, bool checkPeds, bool checkObjects, bool checkDummies,
+ bool ignoreSomeObjects)
{
- CEntity* foundE = nil;
+ CEntity *foundE = nil;
int minX = GetSectorIndexX(centre.x - radius);
- if (minX <= 0) minX = 0;
+ if(minX <= 0) minX = 0;
int minY = GetSectorIndexY(centre.y - radius);
- if (minY <= 0) minY = 0;
+ if(minY <= 0) minY = 0;
int maxX = GetSectorIndexX(centre.x + radius);
#ifdef FIX_BUGS
- if (maxX >= NUMSECTORS_X) maxX = NUMSECTORS_X - 1;
+ if(maxX >= NUMSECTORS_X) maxX = NUMSECTORS_X - 1;
#else
- if (maxX >= NUMSECTORS_X) maxX = NUMSECTORS_X;
+ if(maxX >= NUMSECTORS_X) maxX = NUMSECTORS_X;
#endif
int maxY = GetSectorIndexY(centre.y + radius);
#ifdef FIX_BUGS
- if (maxY >= NUMSECTORS_Y) maxY = NUMSECTORS_Y - 1;
+ if(maxY >= NUMSECTORS_Y) maxY = NUMSECTORS_Y - 1;
#else
- if (maxY >= NUMSECTORS_Y) maxY = NUMSECTORS_Y;
+ if(maxY >= NUMSECTORS_Y) maxY = NUMSECTORS_Y;
#endif
AdvanceCurrentScanCode();
- for (int curY = minY; curY <= maxY; curY++) {
- for (int curX = minX; curX <= maxX; curX++) {
- CSector* sector = GetSector(curX, curY);
- if (checkBuildings) {
- foundE = TestSphereAgainstSectorList(sector->m_lists[ENTITYLIST_BUILDINGS], centre, radius, entityToIgnore, false);
- if (foundE)
- return foundE;
-
- foundE = TestSphereAgainstSectorList(sector->m_lists[ENTITYLIST_BUILDINGS_OVERLAP], centre, radius, entityToIgnore, false);
- if (foundE)
- return foundE;
+ for(int curY = minY; curY <= maxY; curY++) {
+ for(int curX = minX; curX <= maxX; curX++) {
+ CSector *sector = GetSector(curX, curY);
+ if(checkBuildings) {
+ foundE = TestSphereAgainstSectorList(sector->m_lists[ENTITYLIST_BUILDINGS], centre,
+ radius, entityToIgnore, false);
+ if(foundE) return foundE;
+
+ foundE = TestSphereAgainstSectorList(sector->m_lists[ENTITYLIST_BUILDINGS_OVERLAP],
+ centre, radius, entityToIgnore, false);
+ if(foundE) return foundE;
}
- if (checkVehicles) {
- foundE = TestSphereAgainstSectorList(sector->m_lists[ENTITYLIST_VEHICLES], centre, radius, entityToIgnore, false);
- if (foundE)
- return foundE;
-
- foundE = TestSphereAgainstSectorList(sector->m_lists[ENTITYLIST_VEHICLES_OVERLAP], centre, radius, entityToIgnore, false);
- if (foundE)
- return foundE;
+ if(checkVehicles) {
+ foundE = TestSphereAgainstSectorList(sector->m_lists[ENTITYLIST_VEHICLES], centre,
+ radius, entityToIgnore, false);
+ if(foundE) return foundE;
+
+ foundE = TestSphereAgainstSectorList(sector->m_lists[ENTITYLIST_VEHICLES_OVERLAP],
+ centre, radius, entityToIgnore, false);
+ if(foundE) return foundE;
}
- if (checkPeds) {
- foundE = TestSphereAgainstSectorList(sector->m_lists[ENTITYLIST_PEDS], centre, radius, entityToIgnore, false);
- if (foundE)
- return foundE;
-
- foundE = TestSphereAgainstSectorList(sector->m_lists[ENTITYLIST_PEDS_OVERLAP], centre, radius, entityToIgnore, false);
- if (foundE)
- return foundE;
+ if(checkPeds) {
+ foundE = TestSphereAgainstSectorList(sector->m_lists[ENTITYLIST_PEDS], centre, radius,
+ entityToIgnore, false);
+ if(foundE) return foundE;
+
+ foundE = TestSphereAgainstSectorList(sector->m_lists[ENTITYLIST_PEDS_OVERLAP], centre,
+ radius, entityToIgnore, false);
+ if(foundE) return foundE;
}
- if (checkObjects) {
- foundE = TestSphereAgainstSectorList(sector->m_lists[ENTITYLIST_OBJECTS], centre, radius, entityToIgnore, ignoreSomeObjects);
- if (foundE)
- return foundE;
-
- foundE = TestSphereAgainstSectorList(sector->m_lists[ENTITYLIST_OBJECTS_OVERLAP], centre, radius, entityToIgnore, ignoreSomeObjects);
- if (foundE)
- return foundE;
+ if(checkObjects) {
+ foundE = TestSphereAgainstSectorList(sector->m_lists[ENTITYLIST_OBJECTS], centre,
+ radius, entityToIgnore, ignoreSomeObjects);
+ if(foundE) return foundE;
+
+ foundE = TestSphereAgainstSectorList(sector->m_lists[ENTITYLIST_OBJECTS_OVERLAP],
+ centre, radius, entityToIgnore, ignoreSomeObjects);
+ if(foundE) return foundE;
}
- if (checkDummies) {
- foundE = TestSphereAgainstSectorList(sector->m_lists[ENTITYLIST_DUMMIES], centre, radius, entityToIgnore, false);
- if (foundE)
- return foundE;
-
- foundE = TestSphereAgainstSectorList(sector->m_lists[ENTITYLIST_DUMMIES_OVERLAP], centre, radius, entityToIgnore, false);
- if (foundE)
- return foundE;
+ if(checkDummies) {
+ foundE = TestSphereAgainstSectorList(sector->m_lists[ENTITYLIST_DUMMIES], centre,
+ radius, entityToIgnore, false);
+ if(foundE) return foundE;
+
+ foundE = TestSphereAgainstSectorList(sector->m_lists[ENTITYLIST_DUMMIES_OVERLAP],
+ centre, radius, entityToIgnore, false);
+ if(foundE) return foundE;
}
}
}
return foundE;
}
-CEntity*
-CWorld::TestSphereAgainstSectorList(CPtrList &list, CVector spherePos, float radius, CEntity *entityToIgnore, bool ignoreSomeObjects)
+CEntity *
+CWorld::TestSphereAgainstSectorList(CPtrList &list, CVector spherePos, float radius, CEntity *entityToIgnore,
+ bool ignoreSomeObjects)
{
static CColModel sphereCol;
@@ -800,24 +936,27 @@ CWorld::TestSphereAgainstSectorList(CPtrList &list, CVector spherePos, float rad
CMatrix sphereMat;
sphereMat.SetTranslate(spherePos);
- for(CPtrNode *node=list.first; node; node = node->next) {
- CEntity *e = (CEntity*)node->item;
+ for(CPtrNode *node = list.first; node; node = node->next) {
+ CEntity *e = (CEntity *)node->item;
- if (e->m_scanCode != GetCurrentScanCode()) {
+ if(e->m_scanCode != GetCurrentScanCode()) {
e->m_scanCode = GetCurrentScanCode();
- if (e != entityToIgnore && e->bUsesCollision && !(ignoreSomeObjects && CameraToIgnoreThisObject(e))) {
+ if(e != entityToIgnore && e->bUsesCollision &&
+ !(ignoreSomeObjects && CameraToIgnoreThisObject(e))) {
CVector diff = spherePos - e->GetPosition();
float distance = diff.Magnitude();
- if (e->GetBoundRadius() + radius > distance) {
+ if(e->GetBoundRadius() + radius > distance) {
CColModel *eCol = CModelInfo::GetModelInfo(e->m_modelIndex)->GetColModel();
- int collidedSpheres = CCollision::ProcessColModels(sphereMat, sphereCol, e->GetMatrix(),
- *eCol, gaTempSphereColPoints, nil, nil);
-
- if (collidedSpheres != 0 ||
- (e->IsVehicle() && ((CVehicle*)e)->m_vehType == VEHICLE_TYPE_CAR &&
- e->m_modelIndex != MI_DODO && radius + eCol->boundingBox.max.x > distance)) {
+ int collidedSpheres =
+ CCollision::ProcessColModels(sphereMat, sphereCol, e->GetMatrix(), *eCol,
+ gaTempSphereColPoints, nil, nil);
+
+ if(collidedSpheres != 0 ||
+ (e->IsVehicle() && ((CVehicle *)e)->m_vehType == VEHICLE_TYPE_CAR &&
+ e->m_modelIndex != MI_DODO &&
+ radius + eCol->boundingBox.max.x > distance)) {
return e;
}
}
@@ -833,7 +972,8 @@ CWorld::FindGroundZForCoord(float x, float y)
{
CColPoint point;
CEntity *ent;
- if(ProcessVerticalLine(CVector(x, y, 1000.0f), -1000.0f, point, ent, true, false, false, false, true, false, nil))
+ if(ProcessVerticalLine(CVector(x, y, 1000.0f), -1000.0f, point, ent, true, false, false, false, true, false,
+ nil))
return point.point.z;
else
return 20.0f;
@@ -844,13 +984,11 @@ CWorld::FindGroundZFor3DCoord(float x, float y, float z, bool *found)
{
CColPoint point;
CEntity *ent;
- if(ProcessVerticalLine(CVector(x, y, z), -1000.0f, point, ent, true, false, false, false, false, false, nil)){
- if(found)
- *found = true;
+ if(ProcessVerticalLine(CVector(x, y, z), -1000.0f, point, ent, true, false, false, false, false, false, nil)) {
+ if(found) *found = true;
return point.point.z;
- }else{
- if(found)
- *found = false;
+ } else {
+ if(found) *found = false;
return 0.0f;
}
}
@@ -860,35 +998,373 @@ CWorld::FindRoofZFor3DCoord(float x, float y, float z, bool *found)
{
CColPoint point;
CEntity *ent;
- if(ProcessVerticalLine(CVector(x, y, z), 1000.0f, point, ent, true, false, false, false, true, false, nil)){
- if(found)
- *found = true;
+ if(ProcessVerticalLine(CVector(x, y, z), 1000.0f, point, ent, true, false, false, false, true, false, nil)) {
+ if(found) *found = true;
return point.point.z;
- }else{
+ } else {
if(found == nil)
- printf("THERE IS NO MAP BELOW THE FOLLOWING COORS:%f %f %f. (FindGroundZFor3DCoord)\n", x, y, z);
- if(found)
- *found = false;
+ printf("THERE IS NO MAP BELOW THE FOLLOWING COORS:%f %f %f. (FindGroundZFor3DCoord)\n", x, y,
+ z);
+ if(found) *found = false;
return 20.0f;
}
}
-CPlayerPed*
+void
+CWorld::RemoveReferencesToDeletedObject(CEntity *pDeletedObject)
+{
+ int32 i = CPools::GetPedPool()->GetSize();
+ while(--i >= 0) {
+ CPed *pPed = CPools::GetPedPool()->GetSlot(i);
+ if(pPed && pPed != pDeletedObject) {
+ pPed->RemoveRefsToEntity(pDeletedObject);
+ if(pPed->m_pCurrentPhysSurface == pDeletedObject) pPed->m_pCurrentPhysSurface = nil;
+ }
+ }
+ i = CPools::GetVehiclePool()->GetSize();
+ while(--i >= 0) {
+ CVehicle *pVehicle = CPools::GetVehiclePool()->GetSlot(i);
+ if(pVehicle && pVehicle != pDeletedObject) {
+ pVehicle->RemoveRefsToEntity(pDeletedObject);
+ pVehicle->RemoveRefsToVehicle(pDeletedObject);
+ }
+ }
+ i = CPools::GetObjectPool()->GetSize();
+ while(--i >= 0) {
+ CObject *pObject = CPools::GetObjectPool()->GetSlot(i);
+ if(pObject && pObject != pDeletedObject) { pObject->RemoveRefsToEntity(pDeletedObject); }
+ }
+}
+
+void
+CWorld::FindObjectsKindaColliding(const CVector &position, float radius, bool bCheck2DOnly, int16 *nCollidingEntities,
+ int16 maxEntitiesToFind, CEntity **aEntities, bool bBuildings, bool bVehicles,
+ bool bPeds, bool bObjects, bool bDummies)
+{
+ CWorld::AdvanceCurrentScanCode();
+ *nCollidingEntities = 0;
+ const CVector2D vecSectorStartPos(position.x - radius, position.y - radius);
+ const CVector2D vecSectorEndPos(position.x + radius, position.y + radius);
+ const int32 nStartX = max(CWorld::GetSectorIndexX(vecSectorStartPos.x), 0);
+ const int32 nStartY = max(CWorld::GetSectorIndexY(vecSectorStartPos.y), 0);
+ const int32 nEndX = min(CWorld::GetSectorIndexX(vecSectorEndPos.x), NUMSECTORS_X - 1);
+ const int32 nEndY = min(CWorld::GetSectorIndexY(vecSectorEndPos.y), NUMSECTORS_Y - 1);
+ for(int32 y = nStartY; y <= nEndY; y++) {
+ for(int32 x = nStartX; x <= nEndX; x++) {
+ CSector *pSector = CWorld::GetSector(x, y);
+ if(bBuildings) {
+ CWorld::FindObjectsKindaCollidingSectorList(
+ pSector->m_lists[ENTITYLIST_BUILDINGS], position, radius, bCheck2DOnly,
+ nCollidingEntities, maxEntitiesToFind, aEntities);
+ CWorld::FindObjectsKindaCollidingSectorList(
+ pSector->m_lists[ENTITYLIST_BUILDINGS_OVERLAP], position, radius, bCheck2DOnly,
+ nCollidingEntities, maxEntitiesToFind, aEntities);
+ }
+ if(bVehicles) {
+ CWorld::FindObjectsKindaCollidingSectorList(
+ pSector->m_lists[ENTITYLIST_VEHICLES], position, radius, bCheck2DOnly,
+ nCollidingEntities, maxEntitiesToFind, aEntities);
+ CWorld::FindObjectsKindaCollidingSectorList(
+ pSector->m_lists[ENTITYLIST_VEHICLES_OVERLAP], position, radius, bCheck2DOnly,
+ nCollidingEntities, maxEntitiesToFind, aEntities);
+ }
+ if(bPeds) {
+ CWorld::FindObjectsKindaCollidingSectorList(pSector->m_lists[ENTITYLIST_PEDS], position,
+ radius, bCheck2DOnly, nCollidingEntities,
+ maxEntitiesToFind, aEntities);
+ CWorld::FindObjectsKindaCollidingSectorList(
+ pSector->m_lists[ENTITYLIST_PEDS_OVERLAP], position, radius, bCheck2DOnly,
+ nCollidingEntities, maxEntitiesToFind, aEntities);
+ }
+ if(bObjects) {
+ CWorld::FindObjectsKindaCollidingSectorList(
+ pSector->m_lists[ENTITYLIST_OBJECTS], position, radius, bCheck2DOnly,
+ nCollidingEntities, maxEntitiesToFind, aEntities);
+ CWorld::FindObjectsKindaCollidingSectorList(
+ pSector->m_lists[ENTITYLIST_OBJECTS_OVERLAP], position, radius, bCheck2DOnly,
+ nCollidingEntities, maxEntitiesToFind, aEntities);
+ }
+ if(bDummies) {
+ CWorld::FindObjectsKindaCollidingSectorList(
+ pSector->m_lists[ENTITYLIST_DUMMIES], position, radius, bCheck2DOnly,
+ nCollidingEntities, maxEntitiesToFind, aEntities);
+ CWorld::FindObjectsKindaCollidingSectorList(
+ pSector->m_lists[ENTITYLIST_DUMMIES_OVERLAP], position, radius, bCheck2DOnly,
+ nCollidingEntities, maxEntitiesToFind, aEntities);
+ }
+ }
+ }
+}
+
+void
+CWorld::FindObjectsKindaCollidingSectorList(CPtrList &list, const CVector &position, float radius, bool bCheck2DOnly,
+ int16 *nCollidingEntities, int16 maxEntitiesToFind, CEntity **aEntities)
+{
+ for(CPtrNode *pNode = list.first; pNode; pNode = pNode->next) {
+ CEntity *pEntity = (CEntity *)pNode->item;
+ if(pEntity->m_scanCode != GetCurrentScanCode()) {
+ pEntity->m_scanCode = GetCurrentScanCode();
+ float fMagnitude = 0.0f;
+ if(bCheck2DOnly)
+ fMagnitude = (position - pEntity->GetPosition()).Magnitude2D();
+ else
+ fMagnitude = (position - pEntity->GetPosition()).Magnitude();
+ if(pEntity->GetBoundRadius() + radius > fMagnitude && *nCollidingEntities < maxEntitiesToFind) {
+ if(aEntities) aEntities[*nCollidingEntities] = pEntity;
+ ++*nCollidingEntities;
+ }
+ }
+ }
+}
+
+void
+CWorld::FindObjectsIntersectingCube(const CVector &vecStartPos, const CVector &vecEndPos, int16 *nIntersecting,
+ int16 maxEntitiesToFind, CEntity **aEntities, bool bBuildings, bool bVehicles,
+ bool bPeds, bool bObjects, bool bDummies)
+{
+ CWorld::AdvanceCurrentScanCode();
+ *nIntersecting = 0;
+ const int32 nStartX = max(CWorld::GetSectorIndexX(vecStartPos.x), 0);
+ const int32 nStartY = max(CWorld::GetSectorIndexY(vecStartPos.y), 0);
+ const int32 nEndX = min(CWorld::GetSectorIndexX(vecEndPos.x), NUMSECTORS_X - 1);
+ const int32 nEndY = min(CWorld::GetSectorIndexY(vecEndPos.y), NUMSECTORS_Y - 1);
+ for(int32 y = nStartY; y <= nEndY; y++) {
+ for(int32 x = nStartX; x <= nEndX; x++) {
+ CSector *pSector = CWorld::GetSector(x, y);
+ if(bBuildings) {
+ CWorld::FindObjectsIntersectingCubeSectorList(pSector->m_lists[ENTITYLIST_BUILDINGS],
+ vecStartPos, vecEndPos, nIntersecting,
+ maxEntitiesToFind, aEntities);
+ CWorld::FindObjectsIntersectingCubeSectorList(
+ pSector->m_lists[ENTITYLIST_BUILDINGS_OVERLAP], vecStartPos, vecEndPos,
+ nIntersecting, maxEntitiesToFind, aEntities);
+ }
+ if(bVehicles) {
+ CWorld::FindObjectsIntersectingCubeSectorList(pSector->m_lists[ENTITYLIST_VEHICLES],
+ vecStartPos, vecEndPos, nIntersecting,
+ maxEntitiesToFind, aEntities);
+ CWorld::FindObjectsIntersectingCubeSectorList(
+ pSector->m_lists[ENTITYLIST_VEHICLES_OVERLAP], vecStartPos, vecEndPos,
+ nIntersecting, maxEntitiesToFind, aEntities);
+ }
+ if(bPeds) {
+ CWorld::FindObjectsIntersectingCubeSectorList(pSector->m_lists[ENTITYLIST_PEDS],
+ vecStartPos, vecEndPos, nIntersecting,
+ maxEntitiesToFind, aEntities);
+ CWorld::FindObjectsIntersectingCubeSectorList(pSector->m_lists[ENTITYLIST_PEDS_OVERLAP],
+ vecStartPos, vecEndPos, nIntersecting,
+ maxEntitiesToFind, aEntities);
+ }
+ if(bObjects) {
+ CWorld::FindObjectsIntersectingCubeSectorList(pSector->m_lists[ENTITYLIST_OBJECTS],
+ vecStartPos, vecEndPos, nIntersecting,
+ maxEntitiesToFind, aEntities);
+ CWorld::FindObjectsIntersectingCubeSectorList(
+ pSector->m_lists[ENTITYLIST_OBJECTS_OVERLAP], vecStartPos, vecEndPos, nIntersecting,
+ maxEntitiesToFind, aEntities);
+ }
+ if(bDummies) {
+ CWorld::FindObjectsIntersectingCubeSectorList(pSector->m_lists[ENTITYLIST_DUMMIES],
+ vecStartPos, vecEndPos, nIntersecting,
+ maxEntitiesToFind, aEntities);
+ CWorld::FindObjectsIntersectingCubeSectorList(
+ pSector->m_lists[ENTITYLIST_DUMMIES_OVERLAP], vecStartPos, vecEndPos, nIntersecting,
+ maxEntitiesToFind, aEntities);
+ }
+ }
+ }
+}
+
+void
+CWorld::FindObjectsIntersectingCubeSectorList(CPtrList &list, const CVector &vecStartPos, const CVector &vecEndPos,
+ int16 *nIntersecting, int16 maxEntitiesToFind, CEntity **aEntities)
+{
+ for(CPtrNode *pNode = list.first; pNode; pNode = pNode->next) {
+ CEntity *pEntity = (CEntity *)pNode->item;
+ if(pEntity->m_scanCode != GetCurrentScanCode()) {
+ pEntity->m_scanCode = GetCurrentScanCode();
+ float fRadius = pEntity->GetBoundRadius();
+ const CVector &entityPos = pEntity->GetPosition();
+ if(fRadius + entityPos.x >= vecStartPos.x && entityPos.x - fRadius <= vecEndPos.x &&
+ fRadius + entityPos.y >= vecStartPos.y && entityPos.y - fRadius <= vecEndPos.y &&
+ fRadius + entityPos.z >= vecStartPos.z && entityPos.z - fRadius <= vecEndPos.z &&
+ *nIntersecting < maxEntitiesToFind) {
+ if(aEntities) aEntities[*nIntersecting] = pEntity;
+ ++*nIntersecting;
+ }
+ }
+ }
+}
+
+void
+CWorld::FindObjectsIntersectingAngledCollisionBox(const CColBox &boundingBox, const CMatrix &matrix,
+ const CVector &position, float fStartX, float fStartY, float fEndX,
+ float fEndY, int16 *nEntitiesFound, int16 maxEntitiesToFind,
+ CEntity **aEntities, bool bBuildings, bool bVehicles, bool bPeds,
+ bool bObjects, bool bDummies)
+{
+ CWorld::AdvanceCurrentScanCode();
+ *nEntitiesFound = 0;
+ const int32 nStartX = max(CWorld::GetSectorIndexX(fStartX), 0);
+ const int32 nStartY = max(CWorld::GetSectorIndexY(fStartY), 0);
+ const int32 nEndX = min(CWorld::GetSectorIndexX(fEndX), NUMSECTORS_X - 1);
+ const int32 nEndY = min(CWorld::GetSectorIndexY(fEndY), NUMSECTORS_Y - 1);
+ for(int32 y = nStartY; y <= nEndY; y++) {
+ for(int32 x = nStartX; x <= nEndX; x++) {
+ CSector *pSector = CWorld::GetSector(x, y);
+ if(bBuildings) {
+ CWorld::FindObjectsIntersectingAngledCollisionBoxSectorList(
+ pSector->m_lists[ENTITYLIST_BUILDINGS], boundingBox, matrix, position,
+ nEntitiesFound, maxEntitiesToFind, aEntities);
+ CWorld::FindObjectsIntersectingAngledCollisionBoxSectorList(
+ pSector->m_lists[ENTITYLIST_BUILDINGS_OVERLAP], boundingBox, matrix, position,
+ nEntitiesFound, maxEntitiesToFind, aEntities);
+ }
+ if(bVehicles) {
+ CWorld::FindObjectsIntersectingAngledCollisionBoxSectorList(
+ pSector->m_lists[ENTITYLIST_VEHICLES], boundingBox, matrix, position,
+ nEntitiesFound, maxEntitiesToFind, aEntities);
+ CWorld::FindObjectsIntersectingAngledCollisionBoxSectorList(
+ pSector->m_lists[ENTITYLIST_VEHICLES_OVERLAP], boundingBox, matrix, position,
+ nEntitiesFound, maxEntitiesToFind, aEntities);
+ }
+ if(bPeds) {
+ CWorld::FindObjectsIntersectingAngledCollisionBoxSectorList(
+ pSector->m_lists[ENTITYLIST_PEDS], boundingBox, matrix, position, nEntitiesFound,
+ maxEntitiesToFind, aEntities);
+ CWorld::FindObjectsIntersectingAngledCollisionBoxSectorList(
+ pSector->m_lists[ENTITYLIST_PEDS_OVERLAP], boundingBox, matrix, position,
+ nEntitiesFound, maxEntitiesToFind, aEntities);
+ }
+ if(bObjects) {
+ CWorld::FindObjectsIntersectingAngledCollisionBoxSectorList(
+ pSector->m_lists[ENTITYLIST_OBJECTS], boundingBox, matrix, position, nEntitiesFound,
+ maxEntitiesToFind, aEntities);
+ CWorld::FindObjectsIntersectingAngledCollisionBoxSectorList(
+ pSector->m_lists[ENTITYLIST_OBJECTS_OVERLAP], boundingBox, matrix, position,
+ nEntitiesFound, maxEntitiesToFind, aEntities);
+ }
+ if(bDummies) {
+ CWorld::FindObjectsIntersectingAngledCollisionBoxSectorList(
+ pSector->m_lists[ENTITYLIST_DUMMIES], boundingBox, matrix, position, nEntitiesFound,
+ maxEntitiesToFind, aEntities);
+ CWorld::FindObjectsIntersectingAngledCollisionBoxSectorList(
+ pSector->m_lists[ENTITYLIST_DUMMIES_OVERLAP], boundingBox, matrix, position,
+ nEntitiesFound, maxEntitiesToFind, aEntities);
+ }
+ }
+ }
+}
+
+void
+CWorld::FindObjectsIntersectingAngledCollisionBoxSectorList(CPtrList &list, const CColBox &boundingBox,
+ const CMatrix &matrix, const CVector &position,
+ int16 *nEntitiesFound, int16 maxEntitiesToFind,
+ CEntity **aEntities)
+{
+ for(CPtrNode *pNode = list.first; pNode; pNode = pNode->next) {
+ CEntity *pEntity = (CEntity *)pNode->item;
+ if(pEntity->m_scanCode != GetCurrentScanCode()) {
+ pEntity->m_scanCode = GetCurrentScanCode();
+ CColSphere sphere;
+ CVector vecDistance = pEntity->GetPosition() - position;
+ sphere.radius = pEntity->GetBoundRadius();
+ sphere.center = Multiply3x3(vecDistance, matrix);
+ if(CCollision::TestSphereBox(sphere, boundingBox) && *nEntitiesFound < maxEntitiesToFind) {
+ if(aEntities) aEntities[*nEntitiesFound] = pEntity;
+ ++*nEntitiesFound;
+ }
+ }
+ }
+}
+
+void
+CWorld::FindMissionEntitiesIntersectingCube(const CVector &vecStartPos, const CVector &vecEndPos, int16 *nIntersecting,
+ int16 maxEntitiesToFind, CEntity **aEntities, bool bVehicles, bool bPeds,
+ bool bObjects)
+{
+ CWorld::AdvanceCurrentScanCode();
+ *nIntersecting = 0;
+ const int32 nStartX = max(CWorld::GetSectorIndexX(vecStartPos.x), 0);
+ const int32 nStartY = max(CWorld::GetSectorIndexY(vecStartPos.y), 0);
+ const int32 nEndX = min(CWorld::GetSectorIndexX(vecEndPos.x), NUMSECTORS_X - 1);
+ const int32 nEndY = min(CWorld::GetSectorIndexY(vecEndPos.y), NUMSECTORS_Y - 1);
+ for(int32 y = nStartY; y <= nEndY; y++) {
+ for(int32 x = nStartX; x <= nEndX; x++) {
+ CSector *pSector = CWorld::GetSector(x, y);
+ if(bVehicles) {
+ CWorld::FindMissionEntitiesIntersectingCubeSectorList(
+ pSector->m_lists[ENTITYLIST_VEHICLES], vecStartPos, vecEndPos, nIntersecting,
+ maxEntitiesToFind, aEntities, true, false);
+ CWorld::FindMissionEntitiesIntersectingCubeSectorList(
+ pSector->m_lists[ENTITYLIST_VEHICLES_OVERLAP], vecStartPos, vecEndPos,
+ nIntersecting, maxEntitiesToFind, aEntities, true, false);
+ }
+ if(bPeds) {
+ CWorld::FindMissionEntitiesIntersectingCubeSectorList(
+ pSector->m_lists[ENTITYLIST_PEDS], vecStartPos, vecEndPos, nIntersecting,
+ maxEntitiesToFind, aEntities, false, true);
+ CWorld::FindMissionEntitiesIntersectingCubeSectorList(
+ pSector->m_lists[ENTITYLIST_PEDS_OVERLAP], vecStartPos, vecEndPos, nIntersecting,
+ maxEntitiesToFind, aEntities, false, true);
+ }
+ if(bObjects) {
+ CWorld::FindMissionEntitiesIntersectingCubeSectorList(
+ pSector->m_lists[ENTITYLIST_OBJECTS], vecStartPos, vecEndPos, nIntersecting,
+ maxEntitiesToFind, aEntities, false, false);
+ CWorld::FindMissionEntitiesIntersectingCubeSectorList(
+ pSector->m_lists[ENTITYLIST_OBJECTS_OVERLAP], vecStartPos, vecEndPos, nIntersecting,
+ maxEntitiesToFind, aEntities, false, false);
+ }
+ }
+ }
+}
+
+void
+CWorld::FindMissionEntitiesIntersectingCubeSectorList(CPtrList &list, const CVector &vecStartPos,
+ const CVector &vecEndPos, int16 *nIntersecting,
+ int16 maxEntitiesToFind, CEntity **aEntities, bool bIsVehicleList,
+ bool bIsPedList)
+{
+ for(CPtrNode *pNode = list.first; pNode; pNode = pNode->next) {
+ CEntity *pEntity = (CEntity *)pNode->item;
+ if(pEntity->m_scanCode != GetCurrentScanCode()) {
+ pEntity->m_scanCode = GetCurrentScanCode();
+ bool bIsMissionEntity = false;
+ if(bIsVehicleList)
+ bIsMissionEntity = ((CVehicle *)pEntity)->VehicleCreatedBy == MISSION_VEHICLE;
+ else if(bIsPedList)
+ bIsMissionEntity = ((CPed *)pEntity)->CharCreatedBy == MISSION_CHAR;
+ else
+ bIsMissionEntity = ((CObject *)pEntity)->ObjectCreatedBy == MISSION_OBJECT;
+ float fRadius = pEntity->GetBoundRadius();
+ const CVector &entityPos = pEntity->GetPosition();
+ if(bIsMissionEntity && fRadius + entityPos.x >= vecStartPos.x &&
+ entityPos.x - fRadius <= vecEndPos.x && fRadius + entityPos.y >= vecStartPos.y &&
+ entityPos.y - fRadius <= vecEndPos.y && fRadius + entityPos.z >= vecStartPos.z &&
+ entityPos.z - fRadius <= vecEndPos.z && *nIntersecting < maxEntitiesToFind) {
+ if(aEntities) aEntities[*nIntersecting] = pEntity;
+ ++*nIntersecting;
+ }
+ }
+ }
+}
+
+CPlayerPed *
FindPlayerPed(void)
{
return CWorld::Players[CWorld::PlayerInFocus].m_pPed;
}
-CVehicle*
+CVehicle *
FindPlayerVehicle(void)
{
CPlayerPed *ped = FindPlayerPed();
- if(ped && ped->InVehicle())
- return ped->m_pMyVehicle;
+ if(ped && ped->InVehicle()) return ped->m_pMyVehicle;
return nil;
}
-CVehicle*
+CVehicle *
FindPlayerTrain(void)
{
if(FindPlayerVehicle() && FindPlayerVehicle()->IsTrain())
@@ -897,7 +1373,7 @@ FindPlayerTrain(void)
return nil;
}
-CEntity*
+CEntity *
FindPlayerEntity(void)
{
CPlayerPed *ped = FindPlayerPed();
@@ -917,7 +1393,7 @@ FindPlayerCoors(void)
return ped->GetPosition();
}
-CVector&
+CVector &
FindPlayerSpeed(void)
{
CPlayerPed *ped = FindPlayerPed();
@@ -927,27 +1403,22 @@ FindPlayerSpeed(void)
return ped->m_vecMoveSpeed;
}
-CVector&
+CVector &
FindPlayerCentreOfWorld(int32 player)
{
- if(CCarCtrl::bCarsGeneratedAroundCamera)
- return TheCamera.GetPosition();
- if(CWorld::Players[player].m_pRemoteVehicle)
- return CWorld::Players[player].m_pRemoteVehicle->GetPosition();
- if(FindPlayerVehicle())
- return FindPlayerVehicle()->GetPosition();
+ if(CCarCtrl::bCarsGeneratedAroundCamera) return TheCamera.GetPosition();
+ if(CWorld::Players[player].m_pRemoteVehicle) return CWorld::Players[player].m_pRemoteVehicle->GetPosition();
+ if(FindPlayerVehicle()) return FindPlayerVehicle()->GetPosition();
return CWorld::Players[player].m_pPed->GetPosition();
}
-CVector&
+CVector &
FindPlayerCentreOfWorld_NoSniperShift(void)
{
- if(CCarCtrl::bCarsGeneratedAroundCamera)
- return TheCamera.GetPosition();
+ if(CCarCtrl::bCarsGeneratedAroundCamera) return TheCamera.GetPosition();
if(CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle)
return CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle->GetPosition();
- if(FindPlayerVehicle())
- return FindPlayerVehicle()->GetPosition();
+ if(FindPlayerVehicle()) return FindPlayerVehicle()->GetPosition();
return FindPlayerPed()->GetPosition();
}
@@ -956,19 +1427,160 @@ FindPlayerHeading(void)
{
if(CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle)
return CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle->GetForward().Heading();
- if(FindPlayerVehicle())
- return FindPlayerVehicle()->GetForward().Heading();
+ if(FindPlayerVehicle()) return FindPlayerVehicle()->GetForward().Heading();
return FindPlayerPed()->GetForward().Heading();
}
void
-CWorld::RemoveEntityInsteadOfProcessingIt(CEntity* ent)
+CWorld::ClearCarsFromArea(float x1, float y1, float z1, float x2, float y2, float z2)
+{
+ CVehiclePool *pVehiclePool = CPools::GetVehiclePool();
+ for(int32 i = 0; i < pVehiclePool->GetSize(); i++) {
+ CVehicle *pVehicle = CPools::GetVehiclePool()->GetSlot(i);
+ if(pVehicle) {
+ const CVector &position = pVehicle->GetPosition();
+ if(position.x >= x1 && position.x <= x2 && position.y >= y1 && position.y <= y2 &&
+ position.z >= z1 && position.z <= z2 && !pVehicle->bIsLocked && pVehicle->CanBeDeleted()) {
+ if(pVehicle->pDriver) {
+ CPopulation::RemovePed(pVehicle->pDriver);
+ pVehicle->pDriver = nil;
+ }
+ for(int32 j = 0; j < pVehicle->m_nNumMaxPassengers; ++j) {
+ if(pVehicle->pPassengers[j]) {
+ CPopulation::RemovePed(pVehicle->pPassengers[j]);
+ pVehicle->pPassengers[j] = nil;
+ --pVehicle->m_nNumPassengers;
+ }
+ }
+ CCarCtrl::RemoveFromInterestingVehicleList(pVehicle);
+ CWorld::Remove(pVehicle);
+ delete pVehicle;
+ }
+ }
+ }
+}
+
+void
+CWorld::ClearPedsFromArea(float x1, float y1, float z1, float x2, float y2, float z2)
+{
+ CPedPool *pPedPool = CPools::GetPedPool();
+ for(int32 i = 0; i < pPedPool->GetSize(); i++) {
+ CPed *pPed = CPools::GetPedPool()->GetSlot(i);
+ if(pPed) {
+ const CVector &position = pPed->GetPosition();
+ if(!pPed->IsPlayer() && pPed->CanBeDeleted() && position.x >= x1 && position.x <= x2 &&
+ position.y >= y1 && position.y <= y2 && position.z >= z1 && position.z <= z2) {
+ CPopulation::RemovePed(pPed);
+ }
+ }
+ }
+}
+
+void
+CWorld::CallOffChaseForArea(float x1, float y1, float x2, float y2)
+{
+ CWorld::AdvanceCurrentScanCode();
+ float fStartX = x1 - 10.0f;
+ float fStartY = y1 - 10.0f;
+ float fEndX = x2 + 10.0f;
+ float fEndY = y2 + 10.0f;
+ const int32 nStartX = max(CWorld::GetSectorIndexX(fStartX), 0);
+ const int32 nStartY = max(CWorld::GetSectorIndexY(fStartY), 0);
+ const int32 nEndX = min(CWorld::GetSectorIndexX(fEndX), NUMSECTORS_X - 1);
+ const int32 nEndY = min(CWorld::GetSectorIndexY(fEndY), NUMSECTORS_Y - 1);
+ for(int32 y = nStartY; y <= nEndY; y++) {
+ for(int32 x = nStartX; x <= nEndX; x++) {
+ CSector *pSector = CWorld::GetSector(x, y);
+ CWorld::CallOffChaseForAreaSectorListVehicles(pSector->m_lists[ENTITYLIST_VEHICLES], x1, y1, x2,
+ y2, fStartX, fStartY, fEndX, fEndY);
+ CWorld::CallOffChaseForAreaSectorListVehicles(pSector->m_lists[ENTITYLIST_VEHICLES_OVERLAP], x1,
+ y1, x2, y2, fStartX, fStartY, fEndX, fEndY);
+ CWorld::CallOffChaseForAreaSectorListPeds(pSector->m_lists[ENTITYLIST_PEDS], x1, y1, x2, y2);
+ CWorld::CallOffChaseForAreaSectorListPeds(pSector->m_lists[ENTITYLIST_PEDS_OVERLAP], x1, y1, x2,
+ y2);
+ }
+ }
+}
+
+void
+CWorld::CallOffChaseForAreaSectorListVehicles(CPtrList &list, float x1, float y1, float x2, float y2, float fStartX,
+ float fStartY, float fEndX, float fEndY)
+{
+ for(CPtrNode *pNode = list.first; pNode; pNode = pNode->next) {
+ CVehicle *pVehicle = (CVehicle *)pNode->item;
+ if(pVehicle->m_scanCode != GetCurrentScanCode()) {
+ pVehicle->m_scanCode = GetCurrentScanCode();
+ const CVector &vehiclePos = pVehicle->GetPosition();
+ eCarMission carMission = pVehicle->AutoPilot.m_nCarMission;
+ if(pVehicle != FindPlayerVehicle() && vehiclePos.x > fStartX && vehiclePos.x < fEndX &&
+ vehiclePos.y > fStartY && vehiclePos.y < fEndY && pVehicle->bIsLawEnforcer &&
+ (carMission == MISSION_RAMPLAYER_FARAWAY || carMission == MISSION_RAMPLAYER_CLOSE ||
+ carMission == MISSION_BLOCKPLAYER_FARAWAY || carMission == MISSION_BLOCKPLAYER_CLOSE)) {
+ pVehicle->AutoPilot.m_nTimeTempAction = CTimer::GetTimeInMilliseconds() + 2000;
+ CColModel *pColModel = pVehicle->GetColModel();
+ bool bInsideSphere = false;
+ for(int32 i = 0; i < pColModel->numSpheres; i++) {
+ CVector pos = pVehicle->m_matrix * pColModel->spheres[i].center;
+ float fRadius = pColModel->spheres[i].radius;
+ if(pos.x + fRadius > x1 && pos.x - fRadius < x2 && pos.y + fRadius > y1 &&
+ pos.y - fRadius < y2)
+ bInsideSphere = true;
+ // Maybe break the loop when bInsideSphere is set to true?
+ }
+ if(bInsideSphere) {
+ if(pVehicle->GetPosition().x <= (x1 + x2) * 0.5f)
+ pVehicle->m_vecMoveSpeed.x = min(pVehicle->m_vecMoveSpeed.x, 0.0f);
+ else
+ pVehicle->m_vecMoveSpeed.x = max(pVehicle->m_vecMoveSpeed.x, 0.0f);
+ if(pVehicle->GetPosition().y <= (y1 + y2) * 0.5f)
+ pVehicle->m_vecMoveSpeed.y = min(pVehicle->m_vecMoveSpeed.y, 0.0f);
+ else
+ pVehicle->m_vecMoveSpeed.y = max(pVehicle->m_vecMoveSpeed.y, 0.0f);
+ }
+ }
+ }
+ }
+}
+
+void
+CWorld::CallOffChaseForAreaSectorListPeds(CPtrList &list, float x1, float y1, float x2, float y2)
{
- if (ent->IsPed()) {
- if (FindPlayerPed() == ent)
+ for(CPtrNode *pNode = list.first; pNode; pNode = pNode->next) {
+ CPed *pPed = (CPed *)pNode->item;
+ const CVector &pedPos = pPed->GetPosition();
+ if(pPed->m_scanCode != GetCurrentScanCode()) {
+ pPed->m_scanCode = GetCurrentScanCode();
+ if(pPed != FindPlayerPed() && pPed->m_leader != FindPlayerPed() && pedPos.x > x1 &&
+ pedPos.x < x2 && pedPos.y > y1 && pedPos.y < y2 &&
+ (pPed->m_pedInObjective == FindPlayerPed() ||
+ pPed->m_carInObjective && pPed->m_carInObjective == FindPlayerVehicle()) &&
+ pPed->m_nPedState != PED_DEAD && pPed->m_nPedState != PED_DIE &&
+ (pPed->m_objective == OBJECTIVE_KILL_CHAR_ON_FOOT ||
+ pPed->m_objective == OBJECTIVE_ENTER_CAR_AS_DRIVER ||
+ pPed->m_objective == OBJECTIVE_KILL_CHAR_ANY_MEANS)) {
+ if(pPed->IsPedInControl()) {
+ if(pPed->m_nPedType == PEDTYPE_COP)
+ ((CCopPed *)pPed)->ClearPursuit();
+ else
+ pPed->SetIdle();
+ pPed->SetObjective(OBJECTIVE_NONE);
+ } else {
+ pPed->m_prevObjective = OBJECTIVE_NONE;
+ pPed->m_nLastPedState = PED_IDLE;
+ }
+ }
+ }
+ }
+}
+
+void
+CWorld::RemoveEntityInsteadOfProcessingIt(CEntity *ent)
+{
+ if(ent->IsPed()) {
+ if(FindPlayerPed() == ent)
Remove(ent);
else
- CPopulation::RemovePed((CPed*)ent);
+ CPopulation::RemovePed((CPed *)ent);
} else {
Remove(ent);
delete ent;
@@ -979,12 +1591,13 @@ void
CWorld::RemoveFallenPeds(void)
{
int poolSize = CPools::GetPedPool()->GetSize();
- for(int poolIndex = poolSize-1; poolIndex >= 0; poolIndex--) {
+ for(int poolIndex = poolSize - 1; poolIndex >= 0; poolIndex--) {
CPed *ped = CPools::GetPedPool()->GetSlot(poolIndex);
- if (ped) {
- if (ped->GetPosition().z < MAP_Z_LOW_LIMIT) {
- if (ped->CharCreatedBy != RANDOM_CHAR || ped->IsPlayer()) {
- int closestNode = ThePaths.FindNodeClosestToCoors(ped->GetPosition(), PATH_PED, 999999.9f, false, false);
+ if(ped) {
+ if(ped->GetPosition().z < MAP_Z_LOW_LIMIT) {
+ if(ped->CharCreatedBy != RANDOM_CHAR || ped->IsPlayer()) {
+ int closestNode = ThePaths.FindNodeClosestToCoors(ped->GetPosition(), PATH_PED,
+ 999999.9f, false, false);
CVector newPos = ThePaths.m_pathNodes[closestNode].pos;
newPos.z += 2.0f;
ped->Teleport(newPos);
@@ -1001,17 +1614,20 @@ void
CWorld::RemoveFallenCars(void)
{
int poolSize = CPools::GetVehiclePool()->GetSize();
- for (int poolIndex = poolSize - 1; poolIndex >= 0; poolIndex--) {
- CVehicle* veh = CPools::GetVehiclePool()->GetSlot(poolIndex);
- if (veh) {
- if (veh->GetPosition().z < MAP_Z_LOW_LIMIT) {
- if (veh->VehicleCreatedBy == MISSION_VEHICLE || veh == FindPlayerVehicle() || (veh->pDriver && veh->pDriver->IsPlayer())) {
- int closestNode = ThePaths.FindNodeClosestToCoors(veh->GetPosition(), PATH_CAR, 999999.9f, false, false);
+ for(int poolIndex = poolSize - 1; poolIndex >= 0; poolIndex--) {
+ CVehicle *veh = CPools::GetVehiclePool()->GetSlot(poolIndex);
+ if(veh) {
+ if(veh->GetPosition().z < MAP_Z_LOW_LIMIT) {
+ if(veh->VehicleCreatedBy == MISSION_VEHICLE || veh == FindPlayerVehicle() ||
+ (veh->pDriver && veh->pDriver->IsPlayer())) {
+ int closestNode = ThePaths.FindNodeClosestToCoors(veh->GetPosition(), PATH_CAR,
+ 999999.9f, false, false);
CVector newPos = ThePaths.m_pathNodes[closestNode].pos;
newPos.z += 3.0f;
veh->Teleport(newPos);
veh->m_vecMoveSpeed = CVector(0.0f, 0.0f, 0.0f);
- } else if (veh->VehicleCreatedBy == RANDOM_VEHICLE || veh->VehicleCreatedBy == PARKED_VEHICLE) {
+ } else if(veh->VehicleCreatedBy == RANDOM_VEHICLE ||
+ veh->VehicleCreatedBy == PARKED_VEHICLE) {
Remove(veh);
delete veh;
}
@@ -1024,11 +1640,10 @@ void
CWorld::StopAllLawEnforcersInTheirTracks(void)
{
int poolSize = CPools::GetVehiclePool()->GetSize();
- for (int poolIndex = poolSize - 1; poolIndex >= 0; poolIndex--) {
- CVehicle* veh = CPools::GetVehiclePool()->GetSlot(poolIndex);
- if (veh) {
- if (veh->bIsLawEnforcer)
- veh->SetMoveSpeed(0.0f, 0.0f, 0.0f);
+ for(int poolIndex = poolSize - 1; poolIndex >= 0; poolIndex--) {
+ CVehicle *veh = CPools::GetVehiclePool()->GetSlot(poolIndex);
+ if(veh) {
+ if(veh->bIsLawEnforcer) veh->SetMoveSpeed(0.0f, 0.0f, 0.0f);
}
}
}
@@ -1037,10 +1652,9 @@ void
CWorld::SetAllCarsCanBeDamaged(bool toggle)
{
int poolSize = CPools::GetVehiclePool()->GetSize();
- for (int poolIndex = 0; poolIndex < poolSize; poolIndex++) {
+ for(int poolIndex = 0; poolIndex < poolSize; poolIndex++) {
CVehicle *veh = CPools::GetVehiclePool()->GetSlot(poolIndex);
- if (veh)
- veh->bCanBeDamaged = toggle;
+ if(veh) veh->bCanBeDamaged = toggle;
}
}
@@ -1048,11 +1662,181 @@ void
CWorld::ExtinguishAllCarFiresInArea(CVector point, float range)
{
int poolSize = CPools::GetVehiclePool()->GetSize();
- for (int poolIndex = 0; poolIndex < poolSize; poolIndex++) {
- CVehicle* veh = CPools::GetVehiclePool()->GetSlot(poolIndex);
- if (veh) {
- if ((point - veh->GetPosition()).MagnitudeSqr() < sq(range))
- veh->ExtinguishCarFire();
+ for(int poolIndex = 0; poolIndex < poolSize; poolIndex++) {
+ CVehicle *veh = CPools::GetVehiclePool()->GetSlot(poolIndex);
+ if(veh) {
+ if((point - veh->GetPosition()).MagnitudeSqr() < sq(range)) veh->ExtinguishCarFire();
+ }
+ }
+}
+
+void
+CWorld::AddParticles(void)
+{
+ for(int32 y = 0; y < NUMSECTORS_Y; y++) {
+ for(int32 x = 0; x < NUMSECTORS_X; x++) {
+ CSector *pSector = GetSector(x, y);
+ CEntity::AddSteamsFromGround(pSector->m_lists[ENTITYLIST_BUILDINGS]);
+ CEntity::AddSteamsFromGround(pSector->m_lists[ENTITYLIST_DUMMIES]);
+ }
+ }
+}
+
+void
+CWorld::ShutDown(void)
+{
+ for(int i = 0; i < NUMSECTORS_X * NUMSECTORS_Y; i++) {
+ CSector *pSector = GetSector(i % NUMSECTORS_X, i / NUMSECTORS_Y);
+ for(CPtrNode *pNode = pSector->m_lists[ENTITYLIST_BUILDINGS].first; pNode; pNode = pNode->next) {
+ CEntity *pEntity = (CEntity *)pNode->item;
+ CWorld::Remove(pEntity);
+ delete pEntity;
+ }
+ for(CPtrNode *pNode = pSector->m_lists[ENTITYLIST_VEHICLES].first; pNode; pNode = pNode->next) {
+ CEntity *pEntity = (CEntity *)pNode->item;
+ CWorld::Remove(pEntity);
+ delete pEntity;
+ }
+ for(CPtrNode *pNode = pSector->m_lists[ENTITYLIST_PEDS].first; pNode; pNode = pNode->next) {
+ CEntity *pEntity = (CEntity *)pNode->item;
+ CWorld::Remove(pEntity);
+ delete pEntity;
+ }
+ for(CPtrNode *pNode = pSector->m_lists[ENTITYLIST_OBJECTS].first; pNode; pNode = pNode->next) {
+ CEntity *pEntity = (CEntity *)pNode->item;
+ CWorld::Remove(pEntity);
+ delete pEntity;
+ }
+ for(CPtrNode *pNode = pSector->m_lists[ENTITYLIST_DUMMIES].first; pNode; pNode = pNode->next) {
+ CEntity *pEntity = (CEntity *)pNode->item;
+ CWorld::Remove(pEntity);
+ delete pEntity;
+ }
+ pSector->m_lists[ENTITYLIST_BUILDINGS].Flush();
+ pSector->m_lists[ENTITYLIST_BUILDINGS_OVERLAP].Flush();
+ pSector->m_lists[ENTITYLIST_DUMMIES].Flush();
+ pSector->m_lists[ENTITYLIST_DUMMIES_OVERLAP].Flush();
+ }
+ for(int32 i = 0; i < 4; i++) {
+ for(CPtrNode *pNode = GetBigBuildingList((eLevelName)i).first; pNode; pNode = pNode->next) {
+ CEntity *pEntity = (CEntity *)pNode->item;
+ // Maybe remove from world here?
+ delete pEntity;
+ }
+ GetBigBuildingList((eLevelName)i).Flush();
+ }
+ for(int i = 0; i < NUMSECTORS_X * NUMSECTORS_Y; i++) {
+ CSector *pSector = GetSector(i % NUMSECTORS_X, i / NUMSECTORS_Y);
+ if(pSector->m_lists[ENTITYLIST_BUILDINGS].first) {
+ sprintf(gString, "Building list %d,%d not empty\n", i % NUMSECTORS_X, i / NUMSECTORS_Y);
+ pSector->m_lists[ENTITYLIST_BUILDINGS].Flush();
+ }
+ if(pSector->m_lists[ENTITYLIST_DUMMIES].first) {
+ sprintf(gString, "Dummy list %d,%d not empty\n", i % NUMSECTORS_X, i / NUMSECTORS_Y);
+ pSector->m_lists[ENTITYLIST_DUMMIES].Flush();
+ }
+ if(pSector->m_lists[ENTITYLIST_BUILDINGS_OVERLAP].first) {
+ sprintf(gString, "Building overlap list %d,%d not empty\n", i % NUMSECTORS_X, i / NUMSECTORS_Y);
+ pSector->m_lists[ENTITYLIST_BUILDINGS_OVERLAP].Flush();
+ }
+ if(pSector->m_lists[ENTITYLIST_VEHICLES_OVERLAP].first) {
+ sprintf(gString, "Vehicle overlap list %d,%d not empty\n", i % NUMSECTORS_X, i / NUMSECTORS_Y);
+ pSector->m_lists[ENTITYLIST_VEHICLES_OVERLAP].Flush();
+ }
+ if(pSector->m_lists[ENTITYLIST_PEDS_OVERLAP].first) {
+ sprintf(gString, "Ped overlap list %d,%d not empty\n", i % NUMSECTORS_X, i / NUMSECTORS_Y);
+ pSector->m_lists[ENTITYLIST_PEDS_OVERLAP].Flush();
+ }
+ if(pSector->m_lists[ENTITYLIST_OBJECTS_OVERLAP].first) {
+ sprintf(gString, "Object overlap list %d,%d not empty\n", i % NUMSECTORS_X, i / NUMSECTORS_Y);
+ pSector->m_lists[ENTITYLIST_OBJECTS_OVERLAP].Flush();
+ }
+ if(pSector->m_lists[ENTITYLIST_DUMMIES_OVERLAP].first) {
+ sprintf(gString, "Dummy overlap list %d,%d not empty\n", i % NUMSECTORS_X, i / NUMSECTORS_Y);
+ pSector->m_lists[ENTITYLIST_DUMMIES_OVERLAP].Flush();
+ }
+ }
+ ms_listMovingEntityPtrs.Flush();
+}
+
+void
+CWorld::ClearForRestart(void)
+{
+ if(CCutsceneMgr::HasLoaded()) CCutsceneMgr::DeleteCutsceneData();
+ CProjectileInfo::RemoveAllProjectiles();
+ CObject::DeleteAllTempObjects();
+ CObject::DeleteAllMissionObjects();
+ CPopulation::ConvertAllObjectsToDummyObjects();
+ for(int i = 0; i < NUMSECTORS_X * NUMSECTORS_Y; i++) {
+ CSector *pSector = GetSector(i % NUMSECTORS_X, i / NUMSECTORS_Y);
+ for(CPtrNode *pNode = pSector->m_lists[ENTITYLIST_PEDS].first; pNode; pNode = pNode->next) {
+ CEntity *pEntity = (CEntity *)pNode->item;
+ CWorld::Remove(pEntity);
+ delete pEntity;
+ }
+ for(CPtrNode *pNode = GetBigBuildingList(LEVEL_NONE).first; pNode; pNode = pNode->next) {
+ CVehicle *pVehicle = (CVehicle *)pNode->item;
+ if(pVehicle && pVehicle->IsVehicle() && pVehicle->IsPlane()) {
+ CWorld::Remove(pVehicle);
+ delete pVehicle;
+ }
+ }
+ for(CPtrNode *pNode = pSector->m_lists[ENTITYLIST_VEHICLES].first; pNode; pNode = pNode->next) {
+ CEntity *pEntity = (CEntity *)pNode->item;
+ CWorld::Remove(pEntity);
+ delete pEntity;
+ }
+ }
+ CPools::CheckPoolsEmpty();
+}
+
+void
+CWorld::RepositionCertainDynamicObjects()
+{
+ int32 i = CPools::GetDummyPool()->GetSize();
+ while(--i >= 0) {
+ CDummy *dummy = CPools::GetDummyPool()->GetSlot(i);
+ if(dummy) { RepositionOneObject(dummy); }
+ }
+}
+
+void
+CWorld::RepositionOneObject(CEntity *pEntity)
+{
+ int16 modelId = pEntity->m_modelIndex;
+ if(modelId == MI_SINGLESTREETLIGHTS1 || modelId == MI_SINGLESTREETLIGHTS2 ||
+ modelId == MI_SINGLESTREETLIGHTS3 || modelId == MI_DOUBLESTREETLIGHTS || modelId == MI_TREE1 ||
+ modelId == MI_TREE2 || modelId == MI_TREE3 || modelId == MI_TREE4 || modelId == MI_TREE5 ||
+ modelId == MI_TREE6 || modelId == MI_TREE7 || modelId == MI_TREE8 || modelId == MI_TREE9 ||
+ modelId == MI_TREE10 || modelId == MI_TREE11 || modelId == MI_TREE12 || modelId == MI_TREE13 ||
+ modelId == MI_TREE14 || modelId == MI_TRAFFICLIGHTS || modelId == MI_PARKINGMETER ||
+ modelId == MI_PHONEBOOTH1 || modelId == MI_WASTEBIN || modelId == MI_BIN || modelId == MI_POSTBOX1 ||
+ modelId == MI_NEWSSTAND || modelId == MI_TRAFFICCONE || modelId == MI_DUMP1 ||
+ modelId == MI_ROADWORKBARRIER1 || modelId == MI_BUSSIGN1 || modelId == MI_NOPARKINGSIGN1 ||
+ modelId == MI_PHONESIGN || modelId == MI_TAXISIGN || modelId == MI_FISHSTALL01 ||
+ modelId == MI_FISHSTALL02 || modelId == MI_FISHSTALL03 || modelId == MI_FISHSTALL04 ||
+ modelId == MI_BAGELSTAND2 || modelId == MI_FIRE_HYDRANT || modelId == MI_BOLLARDLIGHT ||
+ modelId == MI_PARKTABLE) {
+ CVector &position = pEntity->GetPosition();
+ float fBoundingBoxMinZ = pEntity->GetColModel()->boundingBox.min.z;
+ position.z = CWorld::FindGroundZFor3DCoord(position.x, position.y,
+ position.z + OBJECT_REPOSITION_OFFSET_Z, nil) -
+ fBoundingBoxMinZ;
+ pEntity->m_matrix.UpdateRW();
+ pEntity->UpdateRwFrame();
+ } else if(modelId == MI_BUOY) {
+ float fWaterLevel = 0.0f;
+ bool bFound = true;
+ const CVector &position = pEntity->GetPosition();
+ float fGroundZ = CWorld::FindGroundZFor3DCoord(position.x, position.y,
+ position.z + OBJECT_REPOSITION_OFFSET_Z, &bFound);
+ if(CWaterLevel::GetWaterLevelNoWaves(position.x, position.y, position.z + OBJECT_REPOSITION_OFFSET_Z,
+ &fWaterLevel)) {
+ if(!bFound || fWaterLevel > fGroundZ) {
+ CColModel *pColModel = pEntity->GetColModel();
+ float fHeight = pColModel->boundingBox.max.z - pColModel->boundingBox.min.z;
+ pEntity->GetPosition().z = 0.2f * fHeight + fWaterLevel - 0.5f * fHeight;
+ }
}
}
}
@@ -1061,28 +1845,72 @@ void
CWorld::SetCarsOnFire(float x, float y, float z, float radius, CEntity *reason)
{
int poolSize = CPools::GetVehiclePool()->GetSize();
- for (int poolIndex = poolSize - 1; poolIndex >= 0; poolIndex--) {
+ for(int poolIndex = poolSize - 1; poolIndex >= 0; poolIndex--) {
CVehicle *veh = CPools::GetVehiclePool()->GetSlot(poolIndex);
- if (veh && veh->m_status != STATUS_WRECKED && !veh->m_pCarFire && !veh->bFireProof) {
- if (Abs(veh->GetPosition().z - z) < 5.0f && Abs(veh->GetPosition().x - x) < radius && Abs(veh->GetPosition().y - y) < radius)
- gFireManager.StartFire(veh, reason, 0.8f, true);
+ if(veh && veh->m_status != STATUS_WRECKED && !veh->m_pCarFire && !veh->bFireProof) {
+ if(Abs(veh->GetPosition().z - z) < 5.0f && Abs(veh->GetPosition().x - x) < radius &&
+ Abs(veh->GetPosition().y - y) < radius)
+ gFireManager.StartFire(veh, reason, 0.8f, true);
}
}
}
void
+CWorld::SetPedsOnFire(float x, float y, float z, float radius, CEntity *reason)
+{
+ int32 poolSize = CPools::GetPedPool()->GetSize();
+ for(int32 i = poolSize - 1; i >= 0; i--) {
+ CPed *pPed = CPools::GetPedPool()->GetSlot(i);
+ if(pPed && pPed->m_nPedState != PED_DEAD && !pPed->bInVehicle && !pPed->m_pFire && !pPed->bFireProof) {
+ if(Abs(pPed->GetPosition().z - z) < 5.0f && Abs(pPed->GetPosition().x - x) < radius &&
+ Abs(pPed->GetPosition().y - y) < radius)
+ gFireManager.StartFire(pPed, reason, 0.8f, true);
+ }
+ }
+}
+
+void
+CWorld::RemoveStaticObjects()
+{
+ for(int i = 0; i < NUMSECTORS_X * NUMSECTORS_Y; i++) {
+ CSector *pSector = GetSector(i % NUMSECTORS_X, i / NUMSECTORS_Y);
+ for(CPtrNode *pNode = pSector->m_lists[ENTITYLIST_BUILDINGS].first; pNode; pNode = pNode->next) {
+ CEntity *pEntity = (CEntity *)pNode->item;
+ CWorld::Remove(pEntity);
+ delete pEntity;
+ }
+ for(CPtrNode *pNode = pSector->m_lists[ENTITYLIST_OBJECTS].first; pNode; pNode = pNode->next) {
+ CEntity *pEntity = (CEntity *)pNode->item;
+ CWorld::Remove(pEntity);
+ delete pEntity;
+ }
+ for(CPtrNode *pNode = pSector->m_lists[ENTITYLIST_DUMMIES].first; pNode; pNode = pNode->next) {
+ CEntity *pEntity = (CEntity *)pNode->item;
+ CWorld::Remove(pEntity);
+ delete pEntity;
+ }
+ pSector->m_lists[ENTITYLIST_BUILDINGS].Flush();
+ pSector->m_lists[ENTITYLIST_BUILDINGS_OVERLAP].Flush();
+ pSector->m_lists[ENTITYLIST_DUMMIES].Flush();
+ pSector->m_lists[ENTITYLIST_DUMMIES_OVERLAP].Flush();
+ }
+}
+
+void
CWorld::Process(void)
{
- if (!(CTimer::GetFrameCounter() & 63))
- CReferences::PruneAllReferencesInWorld();
+ if(!(CTimer::GetFrameCounter() & 63)) CReferences::PruneAllReferencesInWorld();
- if (bProcessCutsceneOnly) {
- for (int i = 0; i < NUMCUTSCENEOBJECTS; i++) {
+ if(bProcessCutsceneOnly) {
+ for(int i = 0; i < NUMCUTSCENEOBJECTS; i++) {
CCutsceneObject *csObj = CCutsceneMgr::GetCutsceneObject(i);
- if (csObj && csObj->m_entryInfoList.first) {
- if (csObj->m_rwObject && RwObjectGetType(csObj->m_rwObject) == rpCLUMP
- && RpAnimBlendClumpGetFirstAssociation(csObj->GetClump())) {
- RpAnimBlendClumpUpdateAnimations(csObj->GetClump(), 0.02f * (csObj->m_type == ENTITY_TYPE_OBJECT ? CTimer::GetTimeStepNonClipped() : CTimer::GetTimeStep()));
+ if(csObj && csObj->m_entryInfoList.first) {
+ if(csObj->m_rwObject && RwObjectGetType(csObj->m_rwObject) == rpCLUMP &&
+ RpAnimBlendClumpGetFirstAssociation(csObj->GetClump())) {
+ RpAnimBlendClumpUpdateAnimations(csObj->GetClump(),
+ 0.02f * (csObj->m_type == ENTITY_TYPE_OBJECT
+ ? CTimer::GetTimeStepNonClipped()
+ : CTimer::GetTimeStep()));
}
csObj->ProcessControl();
csObj->ProcessCollision();
@@ -1093,102 +1921,98 @@ CWorld::Process(void)
CRecordDataForChase::ProcessControlCars();
CRecordDataForChase::SaveOrRetrieveCarPositions();
} else {
- for (CPtrNode *node = ms_listMovingEntityPtrs.first; node; node = node->next) {
- CEntity *movingEnt = (CEntity*)node->item;
- if (movingEnt->m_rwObject && RwObjectGetType(movingEnt->m_rwObject) == rpCLUMP
- && RpAnimBlendClumpGetFirstAssociation(movingEnt->GetClump())) {
- RpAnimBlendClumpUpdateAnimations(movingEnt->GetClump(), 0.02f * (movingEnt->m_type == ENTITY_TYPE_OBJECT ? CTimer::GetTimeStepNonClipped() : CTimer::GetTimeStep()));
+ for(CPtrNode *node = ms_listMovingEntityPtrs.first; node; node = node->next) {
+ CEntity *movingEnt = (CEntity *)node->item;
+ if(movingEnt->m_rwObject && RwObjectGetType(movingEnt->m_rwObject) == rpCLUMP &&
+ RpAnimBlendClumpGetFirstAssociation(movingEnt->GetClump())) {
+ RpAnimBlendClumpUpdateAnimations(movingEnt->GetClump(),
+ 0.02f * (movingEnt->m_type == ENTITY_TYPE_OBJECT
+ ? CTimer::GetTimeStepNonClipped()
+ : CTimer::GetTimeStep()));
}
}
- for (CPtrNode* node = ms_listMovingEntityPtrs.first; node; node = node->next) {
- CPhysical* movingEnt = (CPhysical*)node->item;
- if (movingEnt->bRemoveFromWorld) {
+ for(CPtrNode *node = ms_listMovingEntityPtrs.first; node; node = node->next) {
+ CPhysical *movingEnt = (CPhysical *)node->item;
+ if(movingEnt->bRemoveFromWorld) {
RemoveEntityInsteadOfProcessingIt(movingEnt);
} else {
movingEnt->ProcessControl();
- if (movingEnt->bIsStatic) {
- movingEnt->RemoveFromMovingList();
- }
+ if(movingEnt->bIsStatic) { movingEnt->RemoveFromMovingList(); }
}
}
bForceProcessControl = true;
- for (CPtrNode* node = ms_listMovingEntityPtrs.first; node; node = node->next) {
- CPhysical* movingEnt = (CPhysical*)node->item;
- if (movingEnt->bWasPostponed) {
- if (movingEnt->bRemoveFromWorld) {
+ for(CPtrNode *node = ms_listMovingEntityPtrs.first; node; node = node->next) {
+ CPhysical *movingEnt = (CPhysical *)node->item;
+ if(movingEnt->bWasPostponed) {
+ if(movingEnt->bRemoveFromWorld) {
RemoveEntityInsteadOfProcessingIt(movingEnt);
} else {
movingEnt->ProcessControl();
- if (movingEnt->bIsStatic) {
- movingEnt->RemoveFromMovingList();
- }
+ if(movingEnt->bIsStatic) { movingEnt->RemoveFromMovingList(); }
}
}
}
bForceProcessControl = false;
- if (CReplay::IsPlayingBack()) {
- for (CPtrNode* node = ms_listMovingEntityPtrs.first; node; node = node->next) {
- CEntity* movingEnt = (CEntity*)node->item;
+ if(CReplay::IsPlayingBack()) {
+ for(CPtrNode *node = ms_listMovingEntityPtrs.first; node; node = node->next) {
+ CEntity *movingEnt = (CEntity *)node->item;
movingEnt->bIsInSafePosition = true;
movingEnt->GetMatrix().UpdateRW();
movingEnt->UpdateRwFrame();
}
} else {
bNoMoreCollisionTorque = false;
- for (CPtrNode* node = ms_listMovingEntityPtrs.first; node; node = node->next) {
- CEntity* movingEnt = (CEntity*)node->item;
- if (!movingEnt->bIsInSafePosition) {
+ for(CPtrNode *node = ms_listMovingEntityPtrs.first; node; node = node->next) {
+ CEntity *movingEnt = (CEntity *)node->item;
+ if(!movingEnt->bIsInSafePosition) {
movingEnt->ProcessCollision();
movingEnt->GetMatrix().UpdateRW();
movingEnt->UpdateRwFrame();
}
}
bNoMoreCollisionTorque = true;
- for (int i = 0; i < 4; i++) {
- for (CPtrNode* node = ms_listMovingEntityPtrs.first; node; node = node->next) {
- CEntity* movingEnt = (CEntity*)node->item;
- if (!movingEnt->bIsInSafePosition) {
+ for(int i = 0; i < 4; i++) {
+ for(CPtrNode *node = ms_listMovingEntityPtrs.first; node; node = node->next) {
+ CEntity *movingEnt = (CEntity *)node->item;
+ if(!movingEnt->bIsInSafePosition) {
movingEnt->ProcessCollision();
movingEnt->GetMatrix().UpdateRW();
movingEnt->UpdateRwFrame();
}
}
}
- for (CPtrNode* node = ms_listMovingEntityPtrs.first; node; node = node->next) {
- CEntity* movingEnt = (CEntity*)node->item;
- if (!movingEnt->bIsInSafePosition) {
+ for(CPtrNode *node = ms_listMovingEntityPtrs.first; node; node = node->next) {
+ CEntity *movingEnt = (CEntity *)node->item;
+ if(!movingEnt->bIsInSafePosition) {
movingEnt->bIsStuck = true;
movingEnt->ProcessCollision();
movingEnt->GetMatrix().UpdateRW();
movingEnt->UpdateRwFrame();
- if (!movingEnt->bIsInSafePosition) {
- movingEnt->bIsStuck = true;
- }
+ if(!movingEnt->bIsInSafePosition) { movingEnt->bIsStuck = true; }
}
}
bSecondShift = false;
- for (CPtrNode* node = ms_listMovingEntityPtrs.first; node; node = node->next) {
- CEntity* movingEnt = (CEntity*)node->item;
- if (!movingEnt->bIsInSafePosition) {
+ for(CPtrNode *node = ms_listMovingEntityPtrs.first; node; node = node->next) {
+ CEntity *movingEnt = (CEntity *)node->item;
+ if(!movingEnt->bIsInSafePosition) {
movingEnt->ProcessShift();
movingEnt->GetMatrix().UpdateRW();
movingEnt->UpdateRwFrame();
- if (!movingEnt->bIsInSafePosition) {
- movingEnt->bIsStuck = true;
- }
+ if(!movingEnt->bIsInSafePosition) { movingEnt->bIsStuck = true; }
}
}
bSecondShift = true;
- for (CPtrNode* node = ms_listMovingEntityPtrs.first; node; node = node->next) {
- CPhysical* movingEnt = (CPhysical*)node->item;
- if (!movingEnt->bIsInSafePosition) {
+ for(CPtrNode *node = ms_listMovingEntityPtrs.first; node; node = node->next) {
+ CPhysical *movingEnt = (CPhysical *)node->item;
+ if(!movingEnt->bIsInSafePosition) {
movingEnt->ProcessShift();
movingEnt->GetMatrix().UpdateRW();
movingEnt->UpdateRwFrame();
- if (!movingEnt->bIsInSafePosition) {
+ if(!movingEnt->bIsInSafePosition) {
movingEnt->bIsStuck = true;
- if (movingEnt->m_status == STATUS_PLAYER) {
- printf("STUCK: Final Step: Player Entity %d Is Stuck\n", movingEnt->m_modelIndex);
+ if(movingEnt->m_status == STATUS_PLAYER) {
+ printf("STUCK: Final Step: Player Entity %d Is Stuck\n",
+ movingEnt->m_modelIndex);
movingEnt->m_vecMoveSpeed *= 0.3f;
movingEnt->ApplyMoveSpeed();
movingEnt->ApplyTurnSpeed();
@@ -1197,35 +2021,28 @@ CWorld::Process(void)
}
}
}
- for (CPtrNode* node = ms_listMovingEntityPtrs.first; node; node = node->next) {
- CPed* movingPed = (CPed*)node->item;
- if (movingPed->IsPed()) {
- if (movingPed->bInVehicle && movingPed->m_nPedState != PED_EXIT_TRAIN || movingPed->EnteringCar()) {
+ for(CPtrNode *node = ms_listMovingEntityPtrs.first; node; node = node->next) {
+ CPed *movingPed = (CPed *)node->item;
+ if(movingPed->IsPed()) {
+ if(movingPed->bInVehicle && movingPed->m_nPedState != PED_EXIT_TRAIN ||
+ movingPed->EnteringCar()) {
CVehicle *movingCar = movingPed->m_pMyVehicle;
- if (movingCar) {
- if (movingCar->IsTrain()) {
+ if(movingCar) {
+ if(movingCar->IsTrain()) {
movingPed->SetPedPositionInTrain();
} else {
- switch (movingPed->m_nPedState) {
- case PED_ENTER_CAR:
- case PED_CARJACK:
- movingPed->EnterCar();
- break;
- case PED_DRAG_FROM_CAR:
+ switch(movingPed->m_nPedState) {
+ case PED_ENTER_CAR:
+ case PED_CARJACK: movingPed->EnterCar(); break;
+ case PED_DRAG_FROM_CAR: movingPed->BeingDraggedFromCar(); break;
+ case PED_EXIT_CAR: movingPed->ExitCar(); break;
+ case PED_ARRESTED:
+ if(movingPed->m_nLastPedState == PED_DRAG_FROM_CAR) {
movingPed->BeingDraggedFromCar();
break;
- case PED_EXIT_CAR:
- movingPed->ExitCar();
- break;
- case PED_ARRESTED:
- if (movingPed->m_nLastPedState == PED_DRAG_FROM_CAR) {
- movingPed->BeingDraggedFromCar();
- break;
- }
- // fall through
- default:
- movingPed->SetPedPositionInCar();
- break;
+ }
+ // fall through
+ default: movingPed->SetPedPositionInCar(); break;
}
}
movingPed->GetMatrix().UpdateRW();
@@ -1240,39 +2057,161 @@ CWorld::Process(void)
CMessages::Process();
Players[PlayerInFocus].Process();
CRecordDataForChase::SaveOrRetrieveCarPositions();
- if ((CTimer::GetFrameCounter() & 7) == 1) {
+ if((CTimer::GetFrameCounter() & 7) == 1) {
RemoveFallenPeds();
- } else if ((CTimer::GetFrameCounter() & 7) == 5) {
+ } else if((CTimer::GetFrameCounter() & 7) == 5) {
RemoveFallenCars();
}
}
}
-STARTPATCHES
- InjectHook(0x4AE930, CWorld::Add, PATCH_JUMP);
- InjectHook(0x4AE9D0, CWorld::Remove, PATCH_JUMP);
- InjectHook(0x4B1F60, CWorld::ClearScanCodes, PATCH_JUMP);
- InjectHook(0x4AF970, CWorld::ProcessLineOfSight, PATCH_JUMP);
- InjectHook(0x4B0A80, CWorld::ProcessLineOfSightSector, PATCH_JUMP);
- InjectHook(0x4B0C70, CWorld::ProcessLineOfSightSectorList, PATCH_JUMP);
- InjectHook(0x4B0DE0, CWorld::ProcessVerticalLine, PATCH_JUMP);
- InjectHook(0x4B0EF0, CWorld::ProcessVerticalLineSector, PATCH_JUMP);
- InjectHook(0x4B1090, CWorld::ProcessVerticalLineSectorList, PATCH_JUMP);
- InjectHook(0x4AEAA0, CWorld::GetIsLineOfSightClear, PATCH_JUMP);
- InjectHook(0x4B2000, CWorld::GetIsLineOfSightSectorClear, PATCH_JUMP);
- InjectHook(0x4B2160, CWorld::GetIsLineOfSightSectorListClear, PATCH_JUMP);
-
- InjectHook(0x4B2200, CWorld::FindObjectsInRange, PATCH_JUMP);
- InjectHook(0x4B2540, CWorld::FindObjectsInRangeSectorList, PATCH_JUMP);
- InjectHook(0x4B4AC0, CWorld::TestSphereAgainstSectorList, PATCH_JUMP);
- InjectHook(0x4B4710, CWorld::TestSphereAgainstWorld, PATCH_JUMP);
- InjectHook(0x4B3A80, CWorld::FindGroundZForCoord, PATCH_JUMP);
- InjectHook(0x4B3AE0, CWorld::FindGroundZFor3DCoord, PATCH_JUMP);
- InjectHook(0x4B3B50, CWorld::FindRoofZFor3DCoord, PATCH_JUMP);
-
- InjectHook(0x4B5BC0, CWorld::StopAllLawEnforcersInTheirTracks, PATCH_JUMP);
- InjectHook(0x4B53F0, CWorld::SetAllCarsCanBeDamaged, PATCH_JUMP);
- InjectHook(0x4B5460, CWorld::ExtinguishAllCarFiresInArea, PATCH_JUMP);
-
- InjectHook(0x4B1A60, CWorld::Process, PATCH_JUMP);
-ENDPATCHES
+void
+CWorld::TriggerExplosion(const CVector &position, float fRadius, float fPower, CEntity *pCreator,
+ bool bProcessVehicleBombTimer)
+{
+ CVector2D vecStartPos(position.x - fRadius, position.y - fRadius);
+ CVector2D vecEndPos(position.x + fRadius, position.y + fRadius);
+ const int32 nStartX = max(CWorld::GetSectorIndexX(vecStartPos.x), 0);
+ const int32 nStartY = max(CWorld::GetSectorIndexY(vecStartPos.y), 0);
+ const int32 nEndX = min(CWorld::GetSectorIndexX(vecEndPos.x), NUMSECTORS_X - 1);
+ const int32 nEndY = min(CWorld::GetSectorIndexY(vecEndPos.y), NUMSECTORS_Y - 1);
+ for(int32 y = nStartY; y <= nEndY; y++) {
+ for(int32 x = nStartX; x <= nEndX; x++) {
+ CSector *pSector = CWorld::GetSector(x, y);
+ CWorld::TriggerExplosionSectorList(pSector->m_lists[ENTITYLIST_VEHICLES], position, fRadius,
+ fPower, pCreator, bProcessVehicleBombTimer);
+ CWorld::TriggerExplosionSectorList(pSector->m_lists[ENTITYLIST_PEDS], position, fRadius, fPower,
+ pCreator, bProcessVehicleBombTimer);
+ CWorld::TriggerExplosionSectorList(pSector->m_lists[ENTITYLIST_OBJECTS], position, fRadius,
+ fPower, pCreator, bProcessVehicleBombTimer);
+ }
+ }
+}
+
+void
+CWorld::TriggerExplosionSectorList(CPtrList &list, const CVector &position, float fRadius, float fPower,
+ CEntity *pCreator, bool bProcessVehicleBombTimer)
+{
+ for(CPtrNode *pNode = list.first; pNode; pNode = pNode->next) {
+ CPhysical *pEntity = (CPhysical *)pNode->item;
+ CVector vecDistance = pEntity->GetPosition() - position;
+ float fMagnitude = vecDistance.Magnitude();
+ if(fRadius > fMagnitude) {
+ CWeapon::BlowUpExplosiveThings(pEntity);
+ CPed *pPed = (CPed *)pEntity;
+ CObject *pObject = (CObject *)pEntity;
+ CVehicle *pVehicle = (CVehicle *)pEntity;
+ if(!pEntity->bExplosionProof && (!pEntity->IsPed() || !pPed->bInVehicle)) {
+ if(pEntity->bIsStatic) {
+ if(pEntity->IsObject()) {
+ if(fPower > pObject->m_fUprootLimit || IsFence(pObject->m_modelIndex)) {
+ if(IsGlass(pObject->m_modelIndex)) {
+ CGlass::WindowRespondsToExplosion(pObject, position);
+ } else {
+ pObject->bIsStatic = false;
+ pObject->AddToMovingList();
+ int16 modelId = pEntity->m_modelIndex;
+ if(modelId != MI_FIRE_HYDRANT ||
+ pObject->bHasBeenDamaged) {
+ if(pEntity->IsObject() &&
+ modelId != MI_EXPLODINGBARREL &&
+ modelId != MI_PETROLPUMP)
+ pObject->bHasBeenDamaged = true;
+ } else {
+ CVector pos = pEntity->GetPosition();
+ pos.z -= 0.5f;
+ CParticleObject::AddObject(POBJECT_FIRE_HYDRANT,
+ pos, true);
+ pObject->bHasBeenDamaged = true;
+ }
+ }
+ }
+ if(pEntity->bIsStatic) {
+ float fDamageMultiplier =
+ (fRadius - fMagnitude) * 2.0f / fRadius;
+ float fDamage = 300.0f * min(fDamageMultiplier, 1.0f);
+ pObject->ObjectDamage(fDamage);
+ }
+ } else {
+ pEntity->bIsStatic = false;
+ pEntity->AddToMovingList();
+ }
+ }
+ if(!pEntity->bIsStatic) {
+ float fDamageMultiplier = min((fRadius - fMagnitude) * 2.0f / fRadius, 1.0f);
+ CVector vecForceDir =
+ vecDistance * (fPower * pEntity->m_fMass * 0.00071429f * fDamageMultiplier /
+ max(fMagnitude, 0.01f));
+ vecForceDir.z = max(vecForceDir.z, 0.0f);
+ if(pEntity == FindPlayerPed()) vecForceDir.z = min(vecForceDir.z, 1.0f);
+ pEntity->ApplyMoveForce(vecForceDir);
+ if(!pEntity->bPedPhysics) {
+ float fBoundRadius = pEntity->GetBoundRadius();
+ float fDistanceZ = position.z - pEntity->GetPosition().z;
+ float fPointZ = fBoundRadius;
+ if(max(fDistanceZ, -fBoundRadius) < fBoundRadius) {
+ if(fDistanceZ <= -fBoundRadius)
+ fPointZ = -fBoundRadius;
+ else
+ fPointZ = fDistanceZ;
+ }
+ pEntity->ApplyTurnForce(vecForceDir.x, vecForceDir.y, vecForceDir.z,
+ 0.0f, 0.0f, fPointZ);
+ }
+ switch(pEntity->m_type) {
+ case ENTITY_TYPE_VEHICLE:
+ if(pEntity->m_status == STATUS_SIMPLE) {
+ pEntity->m_status = STATUS_PHYSICS;
+ CCarCtrl::SwitchVehicleToRealPhysics(pVehicle);
+ }
+ pVehicle->InflictDamage(pCreator, WEAPONTYPE_EXPLOSION,
+ 1100.0f * fDamageMultiplier);
+ if(bProcessVehicleBombTimer) {
+ if(pVehicle->m_nBombTimer) pVehicle->m_nBombTimer /= 10;
+ }
+ break;
+ case ENTITY_TYPE_PED: {
+ int8 direction = pPed->GetLocalDirection(-vecForceDir);
+ pPed->bIsStanding = false;
+ pPed->ApplyMoveForce(0.0, 0.0, 2.0f);
+ float fDamage = 250.0f * fDamageMultiplier;
+ pPed->InflictDamage(pCreator, WEAPONTYPE_EXPLOSION, fDamage,
+ PEDPIECE_TORSO, direction);
+ if(pPed->m_nPedState != PED_DIE)
+ pPed->SetFall(2000,
+ (AnimationId)(direction + ANIM_KO_SKID_FRONT), 0);
+ if(pCreator && pCreator->IsPed()) {
+ eEventType eventType = EVENT_SHOOT_PED;
+ if(pPed->m_nPedType == PEDTYPE_COP) eventType = EVENT_SHOOT_COP;
+ CEventList::RegisterEvent(eventType, EVENT_ENTITY_PED, pEntity,
+ (CPed *)pCreator, 10000);
+ pPed->RegisterThreatWithGangPeds(pCreator);
+ }
+ break;
+ }
+ case ENTITY_TYPE_OBJECT:
+ pObject->ObjectDamage(300.0f * fDamageMultiplier);
+ break;
+ }
+ }
+ }
+ }
+ }
+}
+
+void
+CWorld::UseDetonator(CEntity *pEntity)
+{
+ int32 i = CPools::GetVehiclePool()->GetSize();
+ while(--i >= 0) {
+ CAutomobile *pVehicle = (CAutomobile *)CPools::GetVehiclePool()->GetSlot(i);
+ if(pVehicle && !pVehicle->m_vehType && pVehicle->m_bombType == CARBOMB_REMOTE &&
+ pVehicle->m_pBombRigger == pEntity) {
+ pVehicle->m_bombType = CARBOMB_NONE;
+ pVehicle->m_nBombTimer = 500;
+ pVehicle->m_pBlowUpEntity = pVehicle->m_pBombRigger;
+ if(pVehicle->m_pBlowUpEntity)
+ pVehicle->m_pBlowUpEntity->RegisterReference(&pVehicle->m_pBlowUpEntity);
+ }
+ }
+}
diff --git a/src/core/World.h b/src/core/World.h
index d3f1e2d5..25c76531 100644
--- a/src/core/World.h
+++ b/src/core/World.h
@@ -54,22 +54,22 @@ struct CStoredCollPoly;
class CWorld
{
- static CPtrList *ms_bigBuildingsList; // [4];
- static CPtrList &ms_listMovingEntityPtrs;
- static CSector (*ms_aSectors)[NUMSECTORS_X]; // [NUMSECTORS_Y][NUMSECTORS_X];
- static uint16 &ms_nCurrentScanCode;
+ static CPtrList ms_bigBuildingsList[4];
+ static CPtrList ms_listMovingEntityPtrs;
+ static CSector ms_aSectors[NUMSECTORS_Y][NUMSECTORS_X];
+ static uint16 ms_nCurrentScanCode;
public:
- static uint8 &PlayerInFocus;
+ static uint8 PlayerInFocus;
static CPlayerInfo Players[NUMPLAYERS];
- static CEntity *&pIgnoreEntity;
- static bool &bIncludeDeadPeds;
- static bool &bNoMoreCollisionTorque;
- static bool &bSecondShift;
- static bool &bForceProcessControl;
- static bool &bProcessCutsceneOnly;
- static bool &bDoingCarCollisions;
- static bool &bIncludeCarTyres;
+ static CEntity *pIgnoreEntity;
+ static bool bIncludeDeadPeds;
+ static bool bNoMoreCollisionTorque;
+ static bool bSecondShift;
+ static bool bForceProcessControl;
+ static bool bProcessCutsceneOnly;
+ static bool bDoingCarCollisions;
+ static bool bIncludeCarTyres;
static void Remove(CEntity *entity);
static void Add(CEntity *entity);
@@ -85,7 +85,7 @@ public:
}
}
static void ClearScanCodes(void);
- static void ClearExcitingStuffFromArea(const CVector &pos, float radius, uint8);
+ static void ClearExcitingStuffFromArea(const CVector &pos, float radius, bool bRemoveProjectilesAndTidyUpShadows);
static bool CameraToIgnoreThisObject(CEntity *ent);
@@ -103,19 +103,26 @@ public:
static CEntity *TestSphereAgainstSectorList(CPtrList&, CVector, float, CEntity*, bool);
static void FindObjectsInRangeSectorList(CPtrList&, CVector&, float, bool, short*, short, CEntity**);
static void FindObjectsInRange(CVector&, float, bool, short*, short, CEntity**, bool, bool, bool, bool, bool);
- static void FindObjectsOfTypeInRangeSectorList(uint32, CPtrList&, CVector&, float, bool, short*, short, CEntity**);
- static void FindObjectsOfTypeInRange(uint32, CVector&, float, bool, short*, short, CEntity**, bool, bool, bool, bool, bool);
+ static void FindObjectsOfTypeInRangeSectorList(uint32 modelId, CPtrList& list, const CVector& position, float radius, bool bCheck2DOnly, int16* nEntitiesFound, int16 maxEntitiesToFind, CEntity** aEntities);
+ static void FindObjectsOfTypeInRange(uint32 modelId, const CVector& position, float radius, bool bCheck2DOnly, int16* nEntitiesFound, int16 maxEntitiesToFind, CEntity** aEntities, bool bBuildings, bool bVehicles, bool bPeds, bool bObjects, bool bDummies);
static float FindGroundZForCoord(float x, float y);
static float FindGroundZFor3DCoord(float x, float y, float z, bool *found);
static float FindRoofZFor3DCoord(float x, float y, float z, bool *found);
static void RemoveReferencesToDeletedObject(CEntity*);
- static void FindObjectsKindaColliding(const CVector &, float, bool, int16*, int16, CEntity **, bool, bool, bool, bool, bool);
- static void FindObjectsIntersectingCube(const CVector &, const CVector &, int16*, int16, CEntity **, bool, bool, bool, bool, bool);
+ static void FindObjectsKindaColliding(const CVector& position, float radius, bool bCheck2DOnly, int16* nCollidingEntities, int16 maxEntitiesToFind, CEntity** aEntities, bool bBuildings, bool bVehicles, bool bPeds, bool bObjects, bool bDummies);
+ static void FindObjectsKindaCollidingSectorList(CPtrList& list, const CVector& position, float radius, bool bCheck2DOnly, int16* nCollidingEntities, int16 maxEntitiesToFind, CEntity** aEntities);
+ static void FindObjectsIntersectingCube(const CVector& vecStartPos, const CVector& vecEndPos, int16* nIntersecting, int16 maxEntitiesToFind, CEntity** aEntities, bool bBuildings, bool bVehicles, bool bPeds, bool bObjects, bool bDummies);
+ static void FindObjectsIntersectingCubeSectorList(CPtrList& list, const CVector& vecStartPos, const CVector& vecEndPos, int16* nIntersecting, int16 maxEntitiesToFind, CEntity** aEntities);
static void FindObjectsIntersectingAngledCollisionBox(const CColBox &, const CMatrix &, const CVector &, float, float, float, float, int16*, int16, CEntity **, bool, bool, bool, bool, bool);
- static void FindMissionEntitiesIntersectingCube(const CVector&, const CVector&, int16*, int16, CEntity**, bool, bool, bool);
- static void ClearCarsFromArea(float, float, float, float, float, float);
- static void ClearPedsFromArea(float, float, float, float, float, float);
- static void CallOffChaseForArea(float, float, float, float);
+ static void FindObjectsIntersectingAngledCollisionBoxSectorList(CPtrList& list, const CColBox& boundingBox, const CMatrix& matrix, const CVector& position, int16* nEntitiesFound, int16 maxEntitiesToFind, CEntity** aEntities);
+ static void FindMissionEntitiesIntersectingCube(const CVector& vecStartPos, const CVector& vecEndPos, int16* nIntersecting, int16 maxEntitiesToFind, CEntity** aEntities, bool bVehicles, bool bPeds, bool bObjects);
+ static void FindMissionEntitiesIntersectingCubeSectorList(CPtrList& list, const CVector& vecStartPos, const CVector& vecEndPos, int16* nIntersecting, int16 maxEntitiesToFind, CEntity** aEntities, bool bIsVehicleList, bool bIsPedList);
+
+ static void ClearCarsFromArea(float x1, float y1, float z1, float x2, float y2, float z2);
+ static void ClearPedsFromArea(float x1, float y1, float z1, float x2, float y2, float z2);
+ static void CallOffChaseForArea(float x1, float y1, float x2, float y2);
+ static void CallOffChaseForAreaSectorListVehicles(CPtrList& list, float x1, float y1, float x2, float y2, float fStartX, float fStartY, float fEndX, float fEndY);
+ static void CallOffChaseForAreaSectorListPeds(CPtrList& list, float x1, float y1, float x2, float y2);
static float GetSectorX(float f) { return ((f - WORLD_MIN_X)/SECTOR_SIZE_X); }
static float GetSectorY(float f) { return ((f - WORLD_MIN_Y)/SECTOR_SIZE_Y); }
@@ -131,19 +138,20 @@ public:
static void StopAllLawEnforcersInTheirTracks();
static void SetAllCarsCanBeDamaged(bool);
static void ExtinguishAllCarFiresInArea(CVector, float);
- static void SetCarsOnFire(float, float, float, float, CEntity*);
- static void SetPedsOnFire(float, float, float, float, CEntity*);
+ static void SetCarsOnFire(float x, float y, float z, float radius, CEntity* reason);
+ static void SetPedsOnFire(float x, float y, float z, float radius, CEntity* reason);
static void Initialise();
static void AddParticles();
static void ShutDown();
static void ClearForRestart(void);
static void RepositionCertainDynamicObjects();
+ static void RepositionOneObject(CEntity* pEntity);
static void RemoveStaticObjects();
static void Process();
- static void TriggerExplosion(const CVector &, float, float, CEntity*, bool);
-
- static void UseDetonator(CEntity *);
+ static void TriggerExplosion(const CVector& position, float fRadius, float fPower, CEntity* pCreator, bool bProcessVehicleBombTimer);
+ static void TriggerExplosionSectorList(CPtrList& list, const CVector& position, float fRadius, float fPower, CEntity* pCreator, bool bProcessVehicleBombTimer);
+ static void UseDetonator(CEntity *pEntity);
};
extern CColPoint gaTempSphereColPoints[MAX_COLLISION_POINTS];
diff --git a/src/core/ZoneCull.cpp b/src/core/ZoneCull.cpp
index 4a2bea4f..d17a33d4 100644
--- a/src/core/ZoneCull.cpp
+++ b/src/core/ZoneCull.cpp
@@ -1,5 +1,5 @@
#include "common.h"
-#include "patcher.h"
+
#include "Building.h"
#include "Treadable.h"
#include "Train.h"
@@ -11,21 +11,21 @@
#include "ZoneCull.h"
#include "Zones.h"
-int32 &CCullZones::NumCullZones = *(int*)0x8F2564;
-CCullZone(&CCullZones::aZones)[NUMCULLZONES] = *(CCullZone(*)[NUMCULLZONES])*(uintptr*)0x864750;
-int32 &CCullZones::NumAttributeZones = *(int*)0x8E29D0;
-CAttributeZone (&CCullZones::aAttributeZones)[NUMATTRIBZONES] = *(CAttributeZone(*)[NUMATTRIBZONES])*(uintptr*)0x709C60;
-uint16 (&CCullZones::aIndices)[NUMZONEINDICES] = *(uint16(*)[NUMZONEINDICES])*(uintptr*)0x847330;
-int16 (&CCullZones::aPointersToBigBuildingsForBuildings)[NUMBUILDINGS] = *(int16(*)[NUMBUILDINGS])*(uintptr*)0x86C9D0;
-int16 (&CCullZones::aPointersToBigBuildingsForTreadables)[NUMTREADABLES] = *(int16(*)[NUMTREADABLES])*(uintptr*)0x8F1B8C;
+int32 CCullZones::NumCullZones;
+CCullZone CCullZones::aZones[NUMCULLZONES];
+int32 CCullZones::NumAttributeZones;
+CAttributeZone CCullZones::aAttributeZones[NUMATTRIBZONES];
+uint16 CCullZones::aIndices[NUMZONEINDICES];
+int16 CCullZones::aPointersToBigBuildingsForBuildings[NUMBUILDINGS];
+int16 CCullZones::aPointersToBigBuildingsForTreadables[NUMTREADABLES];
-int32 &CCullZones::CurrentWantedLevelDrop_Player = *(int32*)0x880DA8;
-int32 &CCullZones::CurrentFlags_Camera = *(int32*)0x940718;
-int32 &CCullZones::CurrentFlags_Player = *(int32*)0x9415F0;
-int32 &CCullZones::OldCullZone = *(int32*)0x8E2C90;
-int32 &CCullZones::EntityIndicesUsed = *(int32*)0x8F2508;
-bool &CCullZones::bCurrentSubwayIsInvisible = *(bool*)0x95CDA5;
-bool &CCullZones::bCullZonesDisabled = *(bool*)0x95CD4A;
+int32 CCullZones::CurrentWantedLevelDrop_Player;
+int32 CCullZones::CurrentFlags_Camera;
+int32 CCullZones::CurrentFlags_Player;
+int32 CCullZones::OldCullZone;
+int32 CCullZones::EntityIndicesUsed;
+bool CCullZones::bCurrentSubwayIsInvisible;
+bool CCullZones::bCullZonesDisabled;
void
@@ -562,17 +562,3 @@ CCullZones::DoWeHaveMoreThanXOccurencesOfSet(int32 count, uint16 *set)
}
return false;
}
-
-STARTPATCHES
- InjectHook(0x524BC0, &CCullZones::Init, PATCH_JUMP);
- InjectHook(0x524EC0, &CCullZones::ResolveVisibilities, PATCH_JUMP);
- InjectHook(0x524F80, &CCullZones::Update, PATCH_JUMP);
- InjectHook(0x525370, &CCullZones::AddCullZone, PATCH_JUMP);
- InjectHook(0x5250D0, &CCullZones::ForceCullZoneCoors, PATCH_JUMP);
- InjectHook(0x525130, &CCullZones::FindCullZoneForCoors, PATCH_JUMP);
- InjectHook(0x5251C0, &CCullZones::FindAttributesForCoors, PATCH_JUMP);
- InjectHook(0x525290, &CCullZones::FindZoneWithStairsAttributeForPlayer, PATCH_JUMP);
-
- InjectHook(0x525610, &CCullZone::DoStuffLeavingZone, PATCH_JUMP);
- InjectHook(0x525810, &CCullZone::DoStuffEnteringZone, PATCH_JUMP);
-ENDPATCHES
diff --git a/src/core/ZoneCull.h b/src/core/ZoneCull.h
index edaa7c4b..9bc07b8c 100644
--- a/src/core/ZoneCull.h
+++ b/src/core/ZoneCull.h
@@ -79,21 +79,21 @@ struct CAttributeZone
class CCullZones
{
public:
- static int32 &NumCullZones;
- static CCullZone (&aZones)[NUMCULLZONES];
- static int32 &NumAttributeZones;
- static CAttributeZone(&aAttributeZones)[NUMATTRIBZONES];
- static uint16 (&aIndices)[NUMZONEINDICES];
- static int16 (&aPointersToBigBuildingsForBuildings)[NUMBUILDINGS];
- static int16 (&aPointersToBigBuildingsForTreadables)[NUMTREADABLES];
+ static int32 NumCullZones;
+ static CCullZone aZones[NUMCULLZONES];
+ static int32 NumAttributeZones;
+ static CAttributeZone aAttributeZones[NUMATTRIBZONES];
+ static uint16 aIndices[NUMZONEINDICES];
+ static int16 aPointersToBigBuildingsForBuildings[NUMBUILDINGS];
+ static int16 aPointersToBigBuildingsForTreadables[NUMTREADABLES];
- static int32 &CurrentWantedLevelDrop_Player;
- static int32 &CurrentFlags_Camera;
- static int32 &CurrentFlags_Player;
- static int32 &OldCullZone;
- static int32 &EntityIndicesUsed;
- static bool &bCurrentSubwayIsInvisible;
- static bool &bCullZonesDisabled;
+ static int32 CurrentWantedLevelDrop_Player;
+ static int32 CurrentFlags_Camera;
+ static int32 CurrentFlags_Player;
+ static int32 OldCullZone;
+ static int32 EntityIndicesUsed;
+ static bool bCurrentSubwayIsInvisible;
+ static bool bCullZonesDisabled;
static void Init(void);
static void ResolveVisibilities(void);
diff --git a/src/core/Zones.cpp b/src/core/Zones.cpp
index 4bce3e79..6375de1c 100644
--- a/src/core/Zones.cpp
+++ b/src/core/Zones.cpp
@@ -1,5 +1,5 @@
#include "common.h"
-#include "patcher.h"
+
#include <ctype.h>
#include "Zones.h"
@@ -8,18 +8,18 @@
#include "Text.h"
#include "World.h"
-eLevelName &CTheZones::m_CurrLevel = *(eLevelName*)0x8F2BC8;
-CZone *&CTheZones::m_pPlayersZone = *(CZone**)0x8F254C;
-int16 &CTheZones::FindIndex = *(int16*)0x95CC40;
+eLevelName CTheZones::m_CurrLevel;
+CZone *CTheZones::m_pPlayersZone;
+int16 CTheZones::FindIndex;
-uint16 &CTheZones::NumberOfAudioZones = *(uint16*)0x95CC84;
-int16 *CTheZones::AudioZoneArray = (int16*)0x713BC0;
-uint16 &CTheZones::TotalNumberOfMapZones = *(uint16*)0x95CC74;
-uint16 &CTheZones::TotalNumberOfZones = *(uint16*)0x95CC36;
-CZone *CTheZones::ZoneArray = (CZone*)0x86BEE0;
-CZone *CTheZones::MapZoneArray = (CZone*)0x663EC0;
-uint16 &CTheZones::TotalNumberOfZoneInfos = *(uint16*)0x95CC3C;
-CZoneInfo *CTheZones::ZoneInfoArray = (CZoneInfo*)0x714400;
+uint16 CTheZones::NumberOfAudioZones;
+int16 CTheZones::AudioZoneArray[NUMAUDIOZONES];
+uint16 CTheZones::TotalNumberOfMapZones;
+uint16 CTheZones::TotalNumberOfZones;
+CZone CTheZones::ZoneArray[NUMZONES];
+CZone CTheZones::MapZoneArray[NUMMAPZONES];
+uint16 CTheZones::TotalNumberOfZoneInfos;
+CZoneInfo CTheZones::ZoneInfoArray[2*NUMZONES];
#define SWAPF(a, b) { float t; t = a; a = b; b = t; }
@@ -840,36 +840,3 @@ CTheZones::LoadAllZones(uint8 *buffer, uint32 length)
TotalNumberOfMapZones = *(uint16*)(buffer);
NumberOfAudioZones = *(uint16*)(buffer+2);
}
-
-
-STARTPATCHES
- InjectHook(0x4B5DD0, &CZone::GetTranslatedName, PATCH_JUMP);
- InjectHook(0x4B5DE0, CTheZones::Init, PATCH_JUMP);
- InjectHook(0x4B61D0, CTheZones::Update, PATCH_JUMP);
- InjectHook(0x4B6210, CTheZones::CreateZone, PATCH_JUMP);
- InjectHook(0x4B6380, CTheZones::CreateMapZone, PATCH_JUMP);
- InjectHook(0x4B64C0, CTheZones::PostZoneCreation, PATCH_JUMP);
- InjectHook(0x4B6500, CTheZones::InsertZoneIntoZoneHierarchy, PATCH_JUMP);
- InjectHook(0x4B6530, CTheZones::InsertZoneIntoZoneHierRecursive, PATCH_JUMP);
- InjectHook(0x4B65F0, CTheZones::ZoneIsEntirelyContainedWithinOtherZone, PATCH_JUMP);
- InjectHook(0x4B6710, CTheZones::PointLiesWithinZone, PATCH_JUMP);
- InjectHook(0x4B6910, CTheZones::GetLevelFromPosition, PATCH_JUMP);
- InjectHook(0x4B69B0, CTheZones::FindSmallestZonePosition, PATCH_JUMP);
- InjectHook(0x4B6790, CTheZones::FindSmallestZonePositionType, PATCH_JUMP);
- InjectHook(0x4B6890, CTheZones::FindSmallestZonePositionILN, PATCH_JUMP);
- InjectHook(0x4B6800, CTheZones::FindZoneByLabelAndReturnIndex, PATCH_JUMP);
- InjectHook(0x4B6FA0, CTheZones::GetZone, PATCH_JUMP);
- InjectHook(0x4B84F0, CTheZones::GetPointerForZoneIndex, PATCH_JUMP);
- InjectHook(0x4B6A10, CTheZones::GetZoneInfo, PATCH_JUMP);
- InjectHook(0x4B6FB0, CTheZones::GetZoneInfoForTimeOfDay, PATCH_JUMP);
- InjectHook(0x4B6A50, CTheZones::SetZoneCarInfo, PATCH_JUMP);
- InjectHook(0x4B6DC0, CTheZones::SetZonePedInfo, PATCH_JUMP);
- InjectHook(0x4B6EB0, CTheZones::SetCarDensity, PATCH_JUMP);
- InjectHook(0x4B6F00, CTheZones::SetPedDensity, PATCH_JUMP);
- InjectHook(0x4B6F50, CTheZones::SetPedGroup, PATCH_JUMP);
- InjectHook(0x4B83E0, CTheZones::FindAudioZone, PATCH_JUMP);
- InjectHook(0x4B8430, CTheZones::FindZoneForPoint, PATCH_JUMP);
- InjectHook(0x4B8340, CTheZones::AddZoneToAudioZoneArray, PATCH_JUMP);
- InjectHook(0x4B8510, CTheZones::SaveAllZones, PATCH_JUMP);
- InjectHook(0x4B8950, CTheZones::LoadAllZones, PATCH_JUMP);
-ENDPATCHES
diff --git a/src/core/Zones.h b/src/core/Zones.h
index 76855e8b..bb1585dc 100644
--- a/src/core/Zones.h
+++ b/src/core/Zones.h
@@ -52,18 +52,18 @@ public:
class CTheZones
{
public:
- static eLevelName &m_CurrLevel;
- static CZone *&m_pPlayersZone;
- static int16 &FindIndex;
+ static eLevelName m_CurrLevel;
+ static CZone *m_pPlayersZone;
+ static int16 FindIndex;
- static uint16 &NumberOfAudioZones;
- static int16 *AudioZoneArray; //[NUMAUDIOZONES];
- static uint16 &TotalNumberOfMapZones;
- static uint16 &TotalNumberOfZones;
- static CZone *ZoneArray; //[NUMZONES];
- static CZone *MapZoneArray; //[NUMMAPZONES];
- static uint16 &TotalNumberOfZoneInfos;
- static CZoneInfo *ZoneInfoArray; //[2*NUMZONES];
+ static uint16 NumberOfAudioZones;
+ static int16 AudioZoneArray[NUMAUDIOZONES];
+ static uint16 TotalNumberOfMapZones;
+ static uint16 TotalNumberOfZones;
+ static CZone ZoneArray[NUMZONES];
+ static CZone MapZoneArray[NUMMAPZONES];
+ static uint16 TotalNumberOfZoneInfos;
+ static CZoneInfo ZoneInfoArray[2*NUMZONES];
static void Init(void);
static void Update(void);
diff --git a/src/core/config.h b/src/core/config.h
index f9edb74a..ba684092 100644
--- a/src/core/config.h
+++ b/src/core/config.h
@@ -192,6 +192,7 @@ enum Config {
#define MORE_LANGUAGES // Add more translations to the game
#define DEFAULT_NATIVE_RESOLUTION // Set default video mode to your native resolution (fixes Windows 10 launch)
//#define USE_TXD_CDIMAGE // generate and load textures from txd.img
+//#define USE_TEXTURE_POOL
// Pad
#define XINPUT
diff --git a/src/core/main.cpp b/src/core/main.cpp
index 08463df9..d5d4065d 100644
--- a/src/core/main.cpp
+++ b/src/core/main.cpp
@@ -2,7 +2,7 @@
#include "rpmatfx.h"
#include "rphanim.h"
#include "rpskin.h"
-#include "patcher.h"
+
#include "main.h"
#include "CdStream.h"
#include "General.h"
@@ -60,23 +60,18 @@
#include "GenericGameStorage.h"
#include "SceneEdit.h"
-GlobalScene &Scene = *(GlobalScene*)0x726768;
+GlobalScene Scene;
uint8 work_buff[55000];
-//char gString[256];
-//char gString2[512];
-//wchar gUString[256];
-//wchar gUString2[256];
-char *gString = (char*)0x711B40;
-char *gString2 = (char*)0x878A40;
-wchar *gUString = (wchar*)0x74B018;
-wchar *gUString2 = (wchar*)0x6EDD70;
-
+char gString[256];
+char gString2[512];
+wchar gUString[256];
+wchar gUString2[256];
float FramesPerSecond = 30.0f;
bool gbPrintShite = false;
-bool &gbModelViewer = *(bool*)0x95CD93;
+bool gbModelViewer;
int32 frameCount;
@@ -1843,28 +1838,3 @@ main(int argc, char *argv[])
return 0;
}
-
-STARTPATCHES
- InjectHook(0x48E480, Idle, PATCH_JUMP);
- InjectHook(0x48E700, FrontendIdle, PATCH_JUMP);
-
- InjectHook(0x48CF10, DoRWStuffStartOfFrame, PATCH_JUMP);
- InjectHook(0x48D040, DoRWStuffStartOfFrame_Horizon, PATCH_JUMP);
- InjectHook(0x48E030, RenderScene, PATCH_JUMP);
- InjectHook(0x48E080, RenderDebugShit, PATCH_JUMP);
- InjectHook(0x48E090, RenderEffects, PATCH_JUMP);
- InjectHook(0x48E0E0, Render2dStuff, PATCH_JUMP);
- InjectHook(0x48E450, RenderMenus, PATCH_JUMP);
- InjectHook(0x48D120, DoFade, PATCH_JUMP);
- InjectHook(0x48E470, Render2dStuffAfterFade, PATCH_JUMP);
-
- InjectHook(0x48D550, LoadSplash, PATCH_JUMP);
- InjectHook(0x48D670, DestroySplashScreen, PATCH_JUMP);
- InjectHook(0x48D770, LoadingScreen, PATCH_JUMP);
- InjectHook(0x48D760, ResetLoadingScreenBar, PATCH_JUMP);
-
- InjectHook(0x48D470, PluginAttach, PATCH_JUMP);
- InjectHook(0x48D520, Initialise3D, PATCH_JUMP);
- InjectHook(0x48D540, Terminate3D, PATCH_JUMP);
- InjectHook(0x48E800, AppEventHandler, PATCH_JUMP);
-ENDPATCHES
diff --git a/src/core/main.h b/src/core/main.h
index 5ee758a4..90b13fbb 100644
--- a/src/core/main.h
+++ b/src/core/main.h
@@ -5,19 +5,15 @@ struct GlobalScene
RpWorld *world;
RwCamera *camera;
};
-extern GlobalScene &Scene;
+extern GlobalScene Scene;
extern uint8 work_buff[55000];
-//extern char gString[256];
-//extern char gString2[512];
-//extern wchar gUString[256];
-//extern wchar gUString2[256];
-extern char *gString;
-extern char *gString2;
-extern wchar *gUString;
-extern wchar *gUString2;
+extern char gString[256];
+extern char gString2[512];
+extern wchar gUString[256];
+extern wchar gUString2[256];
extern bool gbPrintShite;
-extern bool &gbModelViewer;
+extern bool gbModelViewer;
class CSprite2d;
diff --git a/src/core/re3.cpp b/src/core/re3.cpp
index 2046a7f9..e5f42696 100644
--- a/src/core/re3.cpp
+++ b/src/core/re3.cpp
@@ -29,18 +29,12 @@
#include <list>
-#ifndef RWLIBS
-void **rwengine = *(void***)0x5A10E1;
-#else
+#ifdef RWLIBS
extern "C" int vsprintf(char* const _Buffer, char const* const _Format, va_list _ArgList);
#endif
DebugMenuAPI gDebugMenuAPI;
-STARTPATCHES
- InjectHook(0x5A07E0, (void (*)(void*)) &operator delete, PATCH_JUMP);
- InjectHook(0x5A0690, (void* (*)(size_t)) &operator new, PATCH_JUMP);
-ENDPATCHES
#ifdef USE_PS2_RAND
unsigned __int64 myrand_seed = 1;
@@ -387,7 +381,7 @@ DebugMenuPopulate(void)
DebugMenuAddCmd("Debug", "Stop Credits", CCredits::Stop);
extern bool PrintDebugCode;
- extern int16 &DebugCamMode;
+ extern int16 DebugCamMode;
DebugMenuAddVarBool8("Cam", "Use mouse Cam", (int8*)&CCamera::m_bUseMouse3rdPerson, nil);
#ifdef FREE_CAM
DebugMenuAddVarBool8("Cam", "Free Cam", (int8*)&CCamera::bFreeCam, nil);
@@ -494,37 +488,3 @@ void re3_trace(const char *filename, unsigned int lineno, const char *func, cons
#ifdef VALIDATE_SAVE_SIZE
int32 _saveBufCount;
#endif
-
-void
-patch()
-{
- StaticPatcher::Apply();
-
-// Patch<float>(0x46BC61+6, 1.0f); // car distance
- InjectHook(0x59E460, printf, PATCH_JUMP);
- InjectHook(0x475E00, printf, PATCH_JUMP); // _Error
-
-
-// InterceptCall(&open_script_orig, open_script, 0x438869);
-
-// InterceptCall(&RsEventHandler_orig, delayedPatches10, 0x58275E);
-}
-
-BOOL WINAPI
-DllMain(HINSTANCE hInst, DWORD reason, LPVOID)
-{
- if(reason == DLL_PROCESS_ATTACH){
-
- AllocConsole();
- freopen("CONIN$", "r", stdin);
- freopen("CONOUT$", "w", stdout);
- freopen("CONOUT$", "w", stderr);
-
- if (*(DWORD*)0x5C1E75 == 0xB85548EC) // 1.0
- patch();
- else
- return FALSE;
- }
-
- return TRUE;
-}