summaryrefslogtreecommitdiffstats
path: root/src/core
diff options
context:
space:
mode:
Diffstat (limited to 'src/core')
-rw-r--r--src/core/Accident.cpp2
-rw-r--r--src/core/Accident.h2
-rw-r--r--src/core/Cam.cpp2
-rw-r--r--src/core/Camera.cpp6
-rw-r--r--src/core/Camera.h6
-rw-r--r--src/core/Clock.cpp20
-rw-r--r--src/core/Clock.h18
-rw-r--r--src/core/ControllerConfig.cpp2
-rw-r--r--src/core/ControllerConfig.h2
-rw-r--r--src/core/EventList.cpp1
-rw-r--r--src/core/FileMgr.cpp4
-rw-r--r--src/core/FileMgr.h4
-rw-r--r--src/core/Fire.cpp2
-rw-r--r--src/core/Fire.h2
-rw-r--r--src/core/Frontend.cpp2
-rw-r--r--src/core/Game.cpp22
-rw-r--r--src/core/Game.h16
-rw-r--r--src/core/IniFile.cpp4
-rw-r--r--src/core/Pad.cpp24
-rw-r--r--src/core/Pad.h22
-rw-r--r--src/core/Pools.cpp18
-rw-r--r--src/core/Pools.h18
-rw-r--r--src/core/Radar.cpp44
-rw-r--r--src/core/References.cpp4
-rw-r--r--src/core/References.h4
-rw-r--r--src/core/Stats.cpp106
-rw-r--r--src/core/Stats.h106
-rw-r--r--src/core/Streaming.cpp84
-rw-r--r--src/core/Streaming.h56
-rw-r--r--src/core/SurfaceTable.cpp2
-rw-r--r--src/core/SurfaceTable.h3
-rw-r--r--src/core/TempColModels.cpp26
-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.cpp50
-rw-r--r--src/core/Timer.h20
-rw-r--r--src/core/User.cpp8
-rw-r--r--src/core/User.h8
-rw-r--r--src/core/Wanted.cpp4
-rw-r--r--src/core/Wanted.h4
-rw-r--r--src/core/World.cpp1980
-rw-r--r--src/core/World.h36
-rw-r--r--src/core/ZoneCull.cpp30
-rw-r--r--src/core/ZoneCull.h28
-rw-r--r--src/core/Zones.cpp24
-rw-r--r--src/core/Zones.h22
-rw-r--r--src/core/config.h1
-rw-r--r--src/core/main.cpp17
-rw-r--r--src/core/main.h16
50 files changed, 1941 insertions, 979 deletions
diff --git a/src/core/Accident.cpp b/src/core/Accident.cpp
index d8313ddc..3c39b11d 100644
--- a/src/core/Accident.cpp
+++ b/src/core/Accident.cpp
@@ -6,7 +6,7 @@
#include "Pools.h"
#include "World.h"
-CAccidentManager& gAccidentManager = *(CAccidentManager*)0x87FD10;
+CAccidentManager gAccidentManager;
CAccident*
CAccidentManager::GetNextFreeAccident()
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/Cam.cpp b/src/core/Cam.cpp
index cfdea46a..4d954ccd 100644
--- a/src/core/Cam.cpp
+++ b/src/core/Cam.cpp
@@ -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;
diff --git a/src/core/Camera.cpp b/src/core/Camera.cpp
index c2392d3b..a1f36d93 100644
--- a/src/core/Camera.cpp
+++ b/src/core/Camera.cpp
@@ -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)
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/Clock.cpp b/src/core/Clock.cpp
index a97dcb5f..69fdd682 100644
--- a/src/core/Clock.cpp
+++ b/src/core/Clock.cpp
@@ -6,17 +6,17 @@
#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)
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/ControllerConfig.cpp b/src/core/ControllerConfig.cpp
index 541257c6..ce8674d7 100644
--- a/src/core/ControllerConfig.cpp
+++ b/src/core/ControllerConfig.cpp
@@ -18,7 +18,7 @@
#include "win.h"
#include "GenericGameStorage.h"
-CControllerConfigManager &ControlsManager = *(CControllerConfigManager*)0x8F43A4;
+CControllerConfigManager ControlsManager;
CControllerConfigManager::CControllerConfigManager()
{
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/EventList.cpp b/src/core/EventList.cpp
index d1c76f33..5ca4cdb0 100644
--- a/src/core/EventList.cpp
+++ b/src/core/EventList.cpp
@@ -11,7 +11,6 @@
int32 CEventList::ms_nFirstFreeSlotIndex;
CEvent gaEvent[NUMEVENTS];
-//CEvent *gaEvent = (CEvent*)0x6EF830;
enum
{
diff --git a/src/core/FileMgr.cpp b/src/core/FileMgr.cpp
index 2a8628b0..382316bb 100644
--- a/src/core/FileMgr.cpp
+++ b/src/core/FileMgr.cpp
@@ -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)
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..f900091e 100644
--- a/src/core/Fire.cpp
+++ b/src/core/Fire.cpp
@@ -16,7 +16,7 @@
#include "Ped.h"
#include "Fire.h"
-CFireManager &gFireManager = *(CFireManager*)0x8F31D0;
+CFireManager gFireManager;
CFire::CFire()
{
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..b2ecdac5 100644
--- a/src/core/Frontend.cpp
+++ b/src/core/Frontend.cpp
@@ -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;
diff --git a/src/core/Game.cpp b/src/core/Game.cpp
index 8699ffeb..f115d52f 100644
--- a/src/core/Game.cpp
+++ b/src/core/Game.cpp
@@ -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)
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..d8e91c98 100644
--- a/src/core/IniFile.cpp
+++ b/src/core/IniFile.cpp
@@ -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..2db375b2 100644
--- a/src/core/Pad.cpp
+++ b/src/core/Pad.cpp
@@ -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()
{
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/Pools.cpp b/src/core/Pools.cpp
index 6add9e0c..65294368 100644
--- a/src/core/Pools.cpp
+++ b/src/core/Pools.cpp
@@ -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)
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..48b97832 100644
--- a/src/core/Radar.cpp
+++ b/src/core/Radar.cpp
@@ -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,
diff --git a/src/core/References.cpp b/src/core/References.cpp
index e87f0fd5..668ea9f1 100644
--- a/src/core/References.cpp
+++ b/src/core/References.cpp
@@ -6,8 +6,8 @@
#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)
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..8d7a3048 100644
--- a/src/core/Stats.cpp
+++ b/src/core/Stats.cpp
@@ -4,59 +4,59 @@
#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()
{
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..56f4a862 100644
--- a/src/core/Streaming.cpp
+++ b/src/core/Streaming.cpp
@@ -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;
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..85572fbd 100644
--- a/src/core/SurfaceTable.cpp
+++ b/src/core/SurfaceTable.cpp
@@ -6,7 +6,7 @@
#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)
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..05b272ab 100644
--- a/src/core/TempColModels.cpp
+++ b/src/core/TempColModels.cpp
@@ -3,19 +3,19 @@
#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];
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..68b31e6f 100644
--- a/src/core/Timer.cpp
+++ b/src/core/Timer.cpp
@@ -5,34 +5,28 @@
#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 oldPcTimer;
-uint32 &oldPcTimer = *(uint32*)0x9434F4;
-
-//UInt32 suspendPcTimer;
-uint32 &suspendPcTimer = *(uint32*)0x62A308;
-
-//UInt32 _nCyclesPerMS = 1;
-uint32 &_nCyclesPerMS = *(uint32*)0x5F7610;
-
-//LARGE_INTEGER _oldPerfCounter;
-LARGE_INTEGER &_oldPerfCounter = *(LARGE_INTEGER*)0x62A310;
-
-//LARGE_INTEGER perfSuspendCounter;
-LARGE_INTEGER &perfSuspendCounter = *(LARGE_INTEGER*)0x62A318;
-
-//UInt32 suspendDepth;
-uint32 &suspendDepth = *(uint32*)0x62A320;
+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 suspendPcTimer;
+
+uint32 _nCyclesPerMS = 1;
+
+LARGE_INTEGER _oldPerfCounter;
+
+LARGE_INTEGER perfSuspendCounter;
+
+uint32 suspendDepth;
#ifdef FIX_BUGS
double frameTime;
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..a1a69b2d 100644
--- a/src/core/User.cpp
+++ b/src/core/User.cpp
@@ -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()
{
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..1911ae59 100644
--- a/src/core/Wanted.cpp
+++ b/src/core/Wanted.cpp
@@ -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()
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..358e1823 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"
+#include "patcher.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 = (CPtrList *)0x6FAB60;
+CPtrList &CWorld::ms_listMovingEntityPtrs = *(CPtrList *)0x8F433C;
+CSector (*CWorld::ms_aSectors)[NUMSECTORS_X] = (CSector(*)[NUMSECTORS_Y])0x665608;
+uint16 &CWorld::ms_nCurrentScanCode = *(uint16 *)0x95CC64;
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,237 @@ 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);
}
- 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);
+ }
+ }
+}
+
+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();
+ 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 (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(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 (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(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 (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(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(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 +934,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 +970,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 +982,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 +996,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 +1371,7 @@ FindPlayerTrain(void)
return nil;
}
-CEntity*
+CEntity *
FindPlayerEntity(void)
{
CPlayerPed *ped = FindPlayerPed();
@@ -917,7 +1391,7 @@ FindPlayerCoors(void)
return ped->GetPosition();
}
-CVector&
+CVector &
FindPlayerSpeed(void)
{
CPlayerPed *ped = FindPlayerPed();
@@ -927,27 +1401,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 +1425,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 +1589,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 +1612,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 +1638,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 +1650,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 +1660,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 +1843,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 +1919,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 +2019,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,14 +2055,165 @@ 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();
}
}
}
+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);
+ }
+ }
+}
+
STARTPATCHES
InjectHook(0x4AE930, CWorld::Add, PATCH_JUMP);
InjectHook(0x4AE9D0, CWorld::Remove, PATCH_JUMP);
diff --git a/src/core/World.h b/src/core/World.h
index d3f1e2d5..a1e2acfd 100644
--- a/src/core/World.h
+++ b/src/core/World.h
@@ -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..4cdd283e 100644
--- a/src/core/ZoneCull.cpp
+++ b/src/core/ZoneCull.cpp
@@ -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::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::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 CCullZones::CurrentFlags_Camera;
+int32 CCullZones::CurrentFlags_Player;
+int32 CCullZones::OldCullZone;
+int32 CCullZones::EntityIndicesUsed;
+bool CCullZones::bCurrentSubwayIsInvisible;
+bool CCullZones::bCullZonesDisabled;
void
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..39d4c3b5 100644
--- a/src/core/Zones.cpp
+++ b/src/core/Zones.cpp
@@ -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;
-
-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;
+eLevelName CTheZones::m_CurrLevel;
+CZone *CTheZones::m_pPlayersZone;
+int16 CTheZones::FindIndex;
+
+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; }
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..1b46d453 100644
--- a/src/core/main.cpp
+++ b/src/core/main.cpp
@@ -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;
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;