Merge pull request #2 from GTAmodding/master

upd
This commit is contained in:
Fire_Head 2019-06-03 00:56:56 +03:00 committed by GitHub
commit aa1163ccb2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
24 changed files with 250 additions and 18 deletions

View file

@ -3,9 +3,12 @@
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;
void
CPools::Initialise(void)
@ -13,7 +16,10 @@ CPools::Initialise(void)
// TODO: unused right now
ms_pPtrNodePool = new CCPtrNodePool(NUMPTRNODES);
ms_pEntryInfoNodePool = new CEntryInfoNodePool(NUMENTRYINFOS);
ms_pPedPool = new CPedPool(NUMPEDS);
ms_pVehiclePool = new CVehiclePool(NUMVEHICLES);
ms_pBuildingPool = new CBuildingPool(NUMBUILDINGS);
ms_pTreadablePool = new CTreadablePool(NUMTREADABLES);
ms_pObjectPool = new CObjectPool(NUMOBJECTS);
ms_pDummyPool = new CDummyPool(NUMDUMMIES);
}

View file

@ -5,30 +5,39 @@
#include "Treadable.h"
#include "Object.h"
#include "CutsceneHead.h"
#include "PlayerPed.h"
#include "Automobile.h"
#include "DummyPed.h"
typedef CPool<CPtrNode> CCPtrNodePool;
typedef CPool<CEntryInfoNode> CEntryInfoNodePool;
typedef CPool<CPed,CPlayerPed> CPedPool;
typedef CPool<CVehicle,CAutomobile> CVehiclePool;
typedef CPool<CBuilding> CBuildingPool;
typedef CPool<CTreadable> CTreadablePool;
typedef CPool<CObject, CCutsceneHead> CObjectPool;
typedef CPool<CDummy, CDummyPed> CDummyPool;
class CPools
{
static CCPtrNodePool *&ms_pPtrNodePool;
static CEntryInfoNodePool *&ms_pEntryInfoNodePool;
// ms_pPedPool
// ms_pVehiclePool
static CPedPool *&ms_pPedPool;
static CVehiclePool *&ms_pVehiclePool;
static CBuildingPool *&ms_pBuildingPool;
static CTreadablePool *&ms_pTreadablePool;
static CObjectPool *&ms_pObjectPool;
// ms_pDummyPool
static CDummyPool *&ms_pDummyPool;
// ms_pAudioScriptObjectPool
public:
static CCPtrNodePool *GetPtrNodePool(void) { return ms_pPtrNodePool; }
static CEntryInfoNodePool *GetEntryInfoNodePool(void) { return ms_pEntryInfoNodePool; }
static CPedPool *GetPedPool(void) { return ms_pPedPool; }
static CVehiclePool *GetVehiclePool(void) { return ms_pVehiclePool; }
static CBuildingPool *GetBuildingPool(void) { return ms_pBuildingPool; }
static CTreadablePool *GetTreadablePool(void) { return ms_pTreadablePool; }
static CObjectPool *GetObjectPool(void) { return ms_pObjectPool; }
static CDummyPool *GetDummyPool(void) { return ms_pDummyPool; }
static void Initialise(void);
};

View file

@ -629,6 +629,8 @@ STARTPATCHES
InjectHook(0x4B6790, CTheZones::FindSmallestZonePositionType, PATCH_JUMP);
InjectHook(0x4B6890, CTheZones::FindSmallestZonePositionILN, PATCH_JUMP);
InjectHook(0x4B6800, CTheZones::FindZoneByLabelAndReturnIndex, PATCH_JUMP);
InjectHook(0x4B6FA0, CTheZones::GetZone, PATCH_JUMP);
InjectHook(0x4B84F0, CTheZones::GetPointerForZoneIndex, PATCH_JUMP);
InjectHook(0x4B6A10, CTheZones::GetZoneInfo, PATCH_JUMP);
InjectHook(0x4B6FB0, CTheZones::GetZoneInfoForTimeOfDay, PATCH_JUMP);
InjectHook(0x4B6A50, CTheZones::SetZoneCarInfo, PATCH_JUMP);

View file

@ -5,7 +5,7 @@
class CAutomobile : public CVehicle
{
public:
// 0x228
// 0x288
uint8 stuff1[484];
float m_afWheelSuspDist[4];
uint8 stuff2[300];

11
src/entities/Boat.h Normal file
View file

@ -0,0 +1,11 @@
#pragma once
#include "Vehicle.h"
class CBoat : public CVehicle
{
public:
// 0x288
uint8 stuff[508];
};
static_assert(sizeof(CBoat) == 0x484, "CBoat: error");

View file

@ -0,0 +1,9 @@
#pragma once
#include "Ped.h"
class CCivilianPed : public CPed
{
public:
};
static_assert(sizeof(CCivilianPed) == 0x53C, "CCivilianPed: error");

11
src/entities/CopPed.h Normal file
View file

@ -0,0 +1,11 @@
#pragma once
#include "Ped.h"
class CCopPed : public CPed
{
public:
// 0x53C
uint8 stuff[28];
};
static_assert(sizeof(CCopPed) == 0x558, "CCopPed: error");

7
src/entities/Dummy.cpp Normal file
View file

@ -0,0 +1,7 @@
#include "common.h"
#include "patcher.h"
#include "Dummy.h"
#include "Pools.h"
void *CDummy::operator new(size_t sz) { return CPools::GetDummyPool()->New(); }
void CDummy::operator delete(void *p, size_t sz) { CPools::GetDummyPool()->Delete((CDummy*)p); }

14
src/entities/Dummy.h Normal file
View file

@ -0,0 +1,14 @@
#pragma once
#include "Lists.h"
#include "Entity.h"
class CDummy : public CEntity
{
public:
CEntryInfoList m_entryInfoList;
static void *operator new(size_t);
static void operator delete(void*, size_t);
};
static_assert(sizeof(CDummy) == 0x68, "CDummy: error");

View file

@ -0,0 +1,8 @@
#pragma once
#include "Dummy.h"
class CDummyObject : CDummy
{
};
static_assert(sizeof(CDummyObject) == 0x68, "CDummyObject: error");

11
src/entities/DummyPed.h Normal file
View file

@ -0,0 +1,11 @@
#pragma once
#include "Dummy.h"
// actually unused
class CDummyPed : CDummy
{
int32 pedType;
int32 unknown;
};
static_assert(sizeof(CDummyPed) == 0x70, "CDummyPed: error");

View file

@ -0,0 +1,11 @@
#pragma once
#include "Ped.h"
class CEmergencyPed : public CPed
{
public:
// 0x53C
uint8 stuff[24];
};
static_assert(sizeof(CEmergencyPed) == 0x554, "CEmergencyPed: error");

View file

@ -12,6 +12,63 @@
int gBuildings;
CEntity::CEntity(void)
{
m_type = ENTITY_TYPE_NOTHING;
m_status = STATUS_ABANDONED;
bUsesCollision = false;
bCollisionProcessed = false;
bIsStatic = false;
bHasContacted = false;
bPedPhysics = false;
bIsStuck = false;
bIsInSafePosition = false;
bUseCollisionRecords = false;
bWasPostponed = false;
m_flagB2 = false;
bIsVisible = true;
bHasCollided = false;
bRenderScorched = false;
m_flagB20 = false;
bIsBIGBuilding = false;
bRenderDamaged = false;
m_flagC1 = false;
m_flagC2 = false;
m_flagC4 = false;
m_flagC8 = false;
m_flagC10 = false;
m_flagC20 = false;
m_bZoneCulled = false;
m_bZoneCulled2 = false;
bRemoveFromWorld = false;
bHasHitWall = false;
bImBeingRendered = false;
m_flagD8 = false;
m_flagD10 = false;
bDrawLast = false;
m_flagD40 = false;
m_flagD80 = false;
bDistanceFade = false;
m_flagE2 = false;
m_scanCode = 0;
m_modelIndex = -1;
m_rwObject = nil;
m_randomSeed = rand();
m_pFirstReference = nil;
}
CEntity::~CEntity(void)
{
DeleteRwObject();
ResolveReferences();
}
void
CEntity::GetBoundCentre(CVector &out)
{
@ -308,6 +365,28 @@ CEntity::SetupLighting(void)
return false;
}
void
CEntity::AttachToRwObject(RwObject *obj)
{
m_rwObject = obj;
if(m_rwObject){
if(RwObjectGetType(m_rwObject) == rpATOMIC)
m_matrix.Attach(RwFrameGetMatrix(RpAtomicGetFrame(m_rwObject)), false);
else if(RwObjectGetType(m_rwObject) == rpCLUMP)
m_matrix.Attach(RwFrameGetMatrix(RpClumpGetFrame(m_rwObject)), false);
CModelInfo::GetModelInfo(m_modelIndex)->AddRef();
}
}
void
CEntity::DetachFromRwObject(void)
{
if(m_rwObject)
CModelInfo::GetModelInfo(m_modelIndex)->RemoveRef();
m_rwObject = nil;
m_matrix.Detach();
}
void
CEntity::RegisterReference(CEntity **pent)
{
@ -381,6 +460,9 @@ STARTPATCHES
InjectHook(0x4A74E0, &CEntity::ResolveReferences, PATCH_JUMP);
InjectHook(0x4A7530, &CEntity::PruneReferences, PATCH_JUMP);
InjectHook(0x473F10, &CEntity::AttachToRwObject, PATCH_JUMP);
InjectHook(0x473F60, &CEntity::DetachFromRwObject, PATCH_JUMP);
InjectHook(0x475080, &CEntity::Add_, PATCH_JUMP);
InjectHook(0x475310, &CEntity::Remove_, PATCH_JUMP);
InjectHook(0x473EA0, &CEntity::CreateRwObject_, PATCH_JUMP);

View file

@ -94,6 +94,9 @@ public:
uint16 m_level; // int16
CReference *m_pFirstReference;
CEntity(void);
~CEntity(void);
virtual void Add(void);
virtual void Remove(void);
virtual void SetModelIndex(uint32 i) { m_modelIndex = i; CreateRwObject(); }
@ -120,6 +123,7 @@ public:
void GetBoundCentre(CVector &out);
CVector GetBoundCentre(void) { CVector v; GetBoundCentre(v); return v; }
float GetBoundRadius(void) { return CModelInfo::GetModelInfo(m_modelIndex)->GetColModel()->boundingSphere.radius; }
float GetDistanceFromCentreOfMassToBaseOfModel(void) { return -CModelInfo::GetModelInfo(m_modelIndex)->GetColModel()->boundingBox.min.z; }
bool GetIsTouching(CVector const &center, float r);
bool GetIsOnScreen(void);
bool GetIsOnScreenComplex(void);
@ -129,6 +133,9 @@ public:
void UpdateRwFrame(void);
void SetupBigBuilding(void);
void AttachToRwObject(RwObject *obj);
void DetachFromRwObject(void);
void RegisterReference(CEntity **pent);
void ResolveReferences(void);
void PruneReferences(void);

View file

@ -3,8 +3,8 @@
#include "Ped.h"
#include "Pools.h"
//void *CPed::operator new(size_t sz) { return CPools::GetPedPool()->New(); }
//void CPed::operator delete(void *p, size_t sz) { CPools::GetPedPool()->Delete((CPed*)p); }
void *CPed::operator new(size_t sz) { return CPools::GetPedPool()->New(); }
void CPed::operator delete(void *p, size_t sz) { CPools::GetPedPool()->Delete((CPed*)p); }
WRAPPER void CPed::KillPedWithCar(CVehicle *veh, float impulse) { EAXJMP(0x4EC430); }

View file

@ -179,10 +179,10 @@ public:
CWeapon m_weapons[PED_MAX_WEAPONS];
int32 stuff7;
uint8 m_currentWeapon;
uint8 stuff[167];
uint8 stuff[163];
// static void *operator new(size_t);
// static void operator delete(void*, size_t);
static void *operator new(size_t);
static void operator delete(void*, size_t);
bool IsPlayer(void) { return m_nPedType == 0 || m_nPedType== 1 || m_nPedType == 2 || m_nPedType == 3; }
bool UseGroundColModel(void);
@ -196,4 +196,4 @@ static_assert(offsetof(CPed, m_nPedType) == 0x32C, "CPed: error");
static_assert(offsetof(CPed, m_pCollidingEntity) == 0x34C, "CPed: error");
static_assert(offsetof(CPed, m_weapons) == 0x35C, "CPed: error");
static_assert(offsetof(CPed, m_currentWeapon) == 0x498, "CPed: error");
static_assert(sizeof(CPed) == 0x540, "CPed: error");
static_assert(sizeof(CPed) == 0x53C, "CPed: error");

View file

@ -272,7 +272,7 @@ void
CPhysical::ProcessControl(void)
{
if(!IsPed())
m_phy_flagA8 = false;
bIsInWater = false;
bHasContacted = false;
bIsInSafePosition = false;
bWasPostponed = false;
@ -438,7 +438,7 @@ CPhysical::ApplyCollision(CPhysical *B, CColPoint &colpoint, float &impulseA, fl
if(B->IsPed() && ((CPed*)B)->m_pCurrentPhysSurface == A)
ispedcontactA = true;
}else
timestepA = A->m_phy_flagA1 ? 2.0f : 1.0f;
timestepA = A->bIsHeavy ? 2.0f : 1.0f;
float timestepB;
if(A->bPedPhysics){
@ -451,7 +451,7 @@ CPhysical::ApplyCollision(CPhysical *B, CColPoint &colpoint, float &impulseA, fl
if(A->IsPed() && ((CPed*)A)->m_pCurrentPhysSurface == B)
ispedcontactB = true;
}else
timestepB = B->m_phy_flagA1 ? 2.0f : 1.0f;
timestepB = B->bIsHeavy ? 2.0f : 1.0f;
float speedA, speedB;
if(B->bIsStatic){
@ -1821,7 +1821,7 @@ CPhysical::ProcessCollision(void)
m_phy_flagA80 = false;
if(!m_vecMoveSpeed.IsZero() ||
!m_vecTurnSpeed.IsZero() ||
m_phy_flagA40 ||
bHitByTrain ||
m_status == STATUS_PLAYER || IsPed() && ped->IsPlayer()){
if(IsVehicle())
((CVehicle*)this)->m_veh_flagD4 = true;
@ -1830,7 +1830,7 @@ CPhysical::ProcessCollision(void)
return;
}
}
m_phy_flagA40 = false;
bHitByTrain = false;
m_fDistanceTravelled = (GetPosition() - *savedMatrix.GetPosition()).Magnitude();
m_phy_flagA80 = false;

View file

@ -49,13 +49,13 @@ public:
CVector m_vecDamageNormal;
int16 m_nDamagePieceType;
uint8 m_phy_flagA1 : 1;
uint8 bIsHeavy : 1;
uint8 bAffectedByGravity : 1;
uint8 bInfiniteMass : 1;
uint8 m_phy_flagA8 : 1;
uint8 bIsInWater : 1;
uint8 m_phy_flagA10 : 1;
uint8 m_phy_flagA20 : 1;
uint8 m_phy_flagA40 : 1;
uint8 bHitByTrain : 1; // from nick
uint8 m_phy_flagA80 : 1;
uint8 m_nLastCollType;

11
src/entities/Plane.h Normal file
View file

@ -0,0 +1,11 @@
#pragma once
#include "Vehicle.h"
class CPlane : public CVehicle
{
public:
// 0x288
uint8 stuff[20];
};
static_assert(sizeof(CPlane) == 0x29C, "CPlane: error");

11
src/entities/PlayerPed.h Normal file
View file

@ -0,0 +1,11 @@
#pragma once
#include "Ped.h"
class CPlayerPed : public CPed
{
public:
// 0x53C
uint8 stuff[180];
};
static_assert(sizeof(CPlayerPed) == 0x5F0, "CPlayerPed: error");

11
src/entities/Train.h Normal file
View file

@ -0,0 +1,11 @@
#pragma once
#include "Vehicle.h"
class CTrain : public CVehicle
{
public:
// 0x288
uint8 stuff[92];
};
static_assert(sizeof(CTrain) == 0x2E4, "CTrain: error");

7
src/entities/Vehicle.cpp Normal file
View file

@ -0,0 +1,7 @@
#include "common.h"
#include "patcher.h"
#include "Vehicle.h"
#include "Pools.h"
void *CVehicle::operator new(size_t sz) { return CPools::GetVehiclePool()->New(); }
void CVehicle::operator delete(void *p, size_t sz) { CPools::GetVehiclePool()->Delete((CVehicle*)p); }

View file

@ -54,6 +54,9 @@ uint8 m_extra2;
uint8 stuff4[139];
int32 m_vehType;
static void *operator new(size_t);
static void operator delete(void*, size_t);
bool IsCar(void) { return m_vehType == VEHICLE_TYPE_CAR; }
bool IsBoat(void) { return m_vehType == VEHICLE_TYPE_BOAT; }
bool IsTrain(void) { return m_vehType == VEHICLE_TYPE_TRAIN; }

View file

@ -1169,6 +1169,7 @@ STARTPATCHES
InjectHook(0x4A9920, CRenderer::SetupBigBuildingVisibility, PATCH_JUMP);
InjectHook(0x4A76B0, CRenderer::ConstructRenderList, PATCH_JUMP);
InjectHook(0x4A7840, CRenderer::PreRender, PATCH_JUMP);
InjectHook(0x4A8970, CRenderer::ScanWorld, PATCH_JUMP);
InjectHook(0x4AA240, CRenderer::RequestObjectsInFrustum, PATCH_JUMP);
InjectHook(0x4A7F30, CRenderer::ScanSectorPoly, PATCH_JUMP);