2019-05-15 16:52:37 +02:00
|
|
|
#include "common.h"
|
2019-08-15 16:51:39 +02:00
|
|
|
#include "patcher.h"
|
2019-05-15 16:52:37 +02:00
|
|
|
#include "Pools.h"
|
2019-10-16 23:53:25 +02:00
|
|
|
#include "World.h"
|
|
|
|
#include "ProjectileInfo.h"
|
2019-05-15 16:52:37 +02:00
|
|
|
|
|
|
|
CCPtrNodePool *&CPools::ms_pPtrNodePool = *(CCPtrNodePool**)0x943044;
|
|
|
|
CEntryInfoNodePool *&CPools::ms_pEntryInfoNodePool = *(CEntryInfoNodePool**)0x941448;
|
2019-06-02 17:13:56 +02:00
|
|
|
CPedPool *&CPools::ms_pPedPool = *(CPedPool**)0x8F2C60;
|
|
|
|
CVehiclePool *&CPools::ms_pVehiclePool = *(CVehiclePool**)0x9430DC;
|
2019-05-15 16:52:37 +02:00
|
|
|
CBuildingPool *&CPools::ms_pBuildingPool = *(CBuildingPool**)0x8F2C04;
|
|
|
|
CTreadablePool *&CPools::ms_pTreadablePool = *(CTreadablePool**)0x8F2568;
|
|
|
|
CObjectPool *&CPools::ms_pObjectPool = *(CObjectPool**)0x880E28;
|
2019-06-02 17:13:56 +02:00
|
|
|
CDummyPool *&CPools::ms_pDummyPool = *(CDummyPool**)0x8F2C18;
|
2019-07-20 17:00:57 +02:00
|
|
|
CAudioScriptObjectPool *&CPools::ms_pAudioScriptObjectPool = *(CAudioScriptObjectPool**)0x8F1B6C;
|
2019-05-15 16:52:37 +02:00
|
|
|
|
|
|
|
void
|
|
|
|
CPools::Initialise(void)
|
|
|
|
{
|
|
|
|
ms_pPtrNodePool = new CCPtrNodePool(NUMPTRNODES);
|
|
|
|
ms_pEntryInfoNodePool = new CEntryInfoNodePool(NUMENTRYINFOS);
|
2019-06-02 17:13:56 +02:00
|
|
|
ms_pPedPool = new CPedPool(NUMPEDS);
|
|
|
|
ms_pVehiclePool = new CVehiclePool(NUMVEHICLES);
|
2019-05-15 16:52:37 +02:00
|
|
|
ms_pBuildingPool = new CBuildingPool(NUMBUILDINGS);
|
|
|
|
ms_pTreadablePool = new CTreadablePool(NUMTREADABLES);
|
|
|
|
ms_pObjectPool = new CObjectPool(NUMOBJECTS);
|
2019-06-02 17:13:56 +02:00
|
|
|
ms_pDummyPool = new CDummyPool(NUMDUMMIES);
|
2019-07-20 17:00:57 +02:00
|
|
|
ms_pAudioScriptObjectPool = new CAudioScriptObjectPool(NUMAUDIOSCRIPTOBJECTS);
|
2019-05-15 16:52:37 +02:00
|
|
|
}
|
2019-10-16 23:53:25 +02:00
|
|
|
|
|
|
|
void
|
|
|
|
CPools::ShutDown(void)
|
|
|
|
{
|
|
|
|
debug("PtrNodes left %d\n", ms_pPtrNodePool->GetNoOfUsedSpaces());
|
|
|
|
debug("EntryInfoNodes left %d\n", ms_pEntryInfoNodePool->GetNoOfUsedSpaces());
|
|
|
|
debug("Peds left %d\n", ms_pPedPool->GetNoOfUsedSpaces());
|
|
|
|
debug("Vehicles left %d\n", ms_pVehiclePool->GetNoOfUsedSpaces());
|
|
|
|
debug("Buildings left %d\n", ms_pBuildingPool->GetNoOfUsedSpaces());
|
|
|
|
debug("Treadables left %d\n", ms_pTreadablePool->GetNoOfUsedSpaces());
|
|
|
|
debug("Objects left %d\n", ms_pObjectPool->GetNoOfUsedSpaces());
|
|
|
|
debug("Dummys left %d\n", ms_pDummyPool->GetNoOfUsedSpaces());
|
|
|
|
debug("AudioScriptObjects left %d\n", ms_pAudioScriptObjectPool->GetNoOfUsedSpaces());
|
|
|
|
printf("Shutdown pool started\n");
|
|
|
|
|
|
|
|
delete ms_pPtrNodePool;
|
|
|
|
delete ms_pEntryInfoNodePool;
|
|
|
|
delete ms_pPedPool;
|
|
|
|
delete ms_pVehiclePool;
|
|
|
|
delete ms_pBuildingPool;
|
|
|
|
delete ms_pTreadablePool;
|
|
|
|
delete ms_pObjectPool;
|
|
|
|
delete ms_pDummyPool;
|
|
|
|
delete ms_pAudioScriptObjectPool;
|
|
|
|
|
|
|
|
printf("Shutdown pool done\n");
|
|
|
|
}
|
2019-07-12 18:01:22 +02:00
|
|
|
|
|
|
|
int32 CPools::GetPedRef(CPed *ped) { return ms_pPedPool->GetIndex(ped); }
|
|
|
|
CPed *CPools::GetPed(int32 handle) { return ms_pPedPool->GetAt(handle); }
|
|
|
|
int32 CPools::GetVehicleRef(CVehicle *vehicle) { return ms_pVehiclePool->GetIndex(vehicle); }
|
|
|
|
CVehicle *CPools::GetVehicle(int32 handle) { return ms_pVehiclePool->GetAt(handle); }
|
|
|
|
int32 CPools::GetObjectRef(CObject *object) { return ms_pObjectPool->GetIndex(object); }
|
|
|
|
CObject *CPools::GetObject(int32 handle) { return ms_pObjectPool->GetAt(handle); }
|
2019-10-16 23:53:25 +02:00
|
|
|
|
|
|
|
void
|
|
|
|
CPools::CheckPoolsEmpty()
|
|
|
|
{
|
|
|
|
assert(ms_pPedPool->GetNoOfUsedSpaces() == 0);
|
|
|
|
assert(ms_pVehiclePool->GetNoOfUsedSpaces() == 0);
|
|
|
|
printf("pools have beem cleared \n");
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
CPools::MakeSureSlotInObjectPoolIsEmpty(int32 slot)
|
|
|
|
{
|
|
|
|
if (ms_pObjectPool->IsFreeSlot(slot)) return;
|
|
|
|
|
|
|
|
CObject *object = ms_pObjectPool->GetSlot(slot);
|
|
|
|
if (object->ObjectCreatedBy == TEMP_OBJECT) {
|
|
|
|
CWorld::Remove(object);
|
|
|
|
delete object;
|
|
|
|
} else if (!CProjectileInfo::RemoveIfThisIsAProjectile(object)) {
|
|
|
|
// relocate to another slot??
|
|
|
|
CObject *newObject = new CObject();
|
|
|
|
CWorld::Remove(object);
|
|
|
|
memcpy(newObject, object, ms_pObjectPool->GetMaxEntrySize());
|
|
|
|
CWorld::Add(newObject);
|
|
|
|
object->m_rwObject = nil;
|
|
|
|
delete object;
|
|
|
|
newObject->m_pFirstReference = nil;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
STARTPATCHES
|
|
|
|
InjectHook(0x4A1770, CPools::Initialise, PATCH_JUMP);
|
|
|
|
InjectHook(0x4A1880, CPools::ShutDown, PATCH_JUMP);
|
|
|
|
InjectHook(0x4A1A50, CPools::CheckPoolsEmpty, PATCH_JUMP);
|
|
|
|
InjectHook(0x4A1A80, CPools::GetPedRef, PATCH_JUMP);
|
|
|
|
InjectHook(0x4A1AA0, CPools::GetPed, PATCH_JUMP);
|
|
|
|
InjectHook(0x4A1AC0, CPools::GetVehicleRef, PATCH_JUMP);
|
|
|
|
InjectHook(0x4A1AE0, CPools::GetVehicle, PATCH_JUMP);
|
|
|
|
InjectHook(0x4A1B00, CPools::GetObjectRef, PATCH_JUMP);
|
|
|
|
InjectHook(0x4A1B20, CPools::GetObject, PATCH_JUMP);
|
|
|
|
InjectHook(0x4A2DB0, CPools::MakeSureSlotInObjectPoolIsEmpty, PATCH_JUMP);
|
|
|
|
ENDPATCHES
|