2019-05-15 14:52:37 +00:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include "Game.h"
|
|
|
|
#include "Lists.h"
|
2019-06-14 23:34:19 +00:00
|
|
|
#include "PlayerInfo.h"
|
2019-05-15 14:52:37 +00:00
|
|
|
|
|
|
|
/* Sectors span from -2000 to 2000 in x and y.
|
|
|
|
* With 100x100 sectors, each is 40x40 units. */
|
|
|
|
|
2019-06-21 09:09:09 +00:00
|
|
|
#define SECTOR_SIZE_X (40.0f)
|
|
|
|
#define SECTOR_SIZE_Y (40.0f)
|
|
|
|
|
|
|
|
#define NUMSECTORS_X (100)
|
|
|
|
#define NUMSECTORS_Y (100)
|
|
|
|
|
|
|
|
#define WORLD_SIZE_X (NUMSECTORS_X * SECTOR_SIZE_X)
|
|
|
|
#define WORLD_SIZE_Y (NUMSECTORS_Y * SECTOR_SIZE_Y)
|
|
|
|
|
|
|
|
#define WORLD_MIN_X (-2000.0f)
|
|
|
|
#define WORLD_MIN_Y (-2000.0f)
|
|
|
|
|
|
|
|
#define WORLD_MAX_X (WORLD_MIN_X + WORLD_SIZE_X)
|
|
|
|
#define WORLD_MAX_Y (WORLD_MIN_Y + WORLD_SIZE_Y)
|
2019-05-15 14:52:37 +00:00
|
|
|
|
2020-01-03 16:48:13 +00:00
|
|
|
#define MAP_Z_LOW_LIMIT -100.0f
|
|
|
|
|
2019-05-15 14:52:37 +00:00
|
|
|
enum
|
|
|
|
{
|
|
|
|
ENTITYLIST_BUILDINGS,
|
|
|
|
ENTITYLIST_BUILDINGS_OVERLAP,
|
|
|
|
ENTITYLIST_OBJECTS,
|
|
|
|
ENTITYLIST_OBJECTS_OVERLAP,
|
|
|
|
ENTITYLIST_VEHICLES,
|
|
|
|
ENTITYLIST_VEHICLES_OVERLAP,
|
|
|
|
ENTITYLIST_PEDS,
|
|
|
|
ENTITYLIST_PEDS_OVERLAP,
|
|
|
|
ENTITYLIST_DUMMIES,
|
|
|
|
ENTITYLIST_DUMMIES_OVERLAP,
|
|
|
|
|
|
|
|
NUMSECTORENTITYLISTS
|
|
|
|
};
|
|
|
|
|
|
|
|
class CSector
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
CPtrList m_lists[NUMSECTORENTITYLISTS];
|
|
|
|
};
|
|
|
|
static_assert(sizeof(CSector) == 0x28, "CSector: error");
|
|
|
|
|
2019-05-17 12:08:18 +00:00
|
|
|
class CEntity;
|
2019-05-28 06:39:36 +00:00
|
|
|
struct CColPoint;
|
|
|
|
struct CColLine;
|
|
|
|
struct CStoredCollPoly;
|
2019-05-17 12:08:18 +00:00
|
|
|
|
2019-05-15 14:52:37 +00:00
|
|
|
class CWorld
|
|
|
|
{
|
|
|
|
static CPtrList *ms_bigBuildingsList; // [4];
|
|
|
|
static CPtrList &ms_listMovingEntityPtrs;
|
|
|
|
static CSector (*ms_aSectors)[NUMSECTORS_X]; // [NUMSECTORS_Y][NUMSECTORS_X];
|
|
|
|
static uint16 &ms_nCurrentScanCode;
|
|
|
|
|
|
|
|
public:
|
2019-09-16 17:32:58 +00:00
|
|
|
static CColPoint& ms_testSpherePoint;
|
|
|
|
|
2019-06-14 23:34:19 +00:00
|
|
|
static uint8 &PlayerInFocus;
|
2020-03-22 14:23:40 +00:00
|
|
|
static CPlayerInfo (&Players)[NUMPLAYERS];
|
2019-05-17 12:08:18 +00:00
|
|
|
static CEntity *&pIgnoreEntity;
|
2019-05-28 06:39:36 +00:00
|
|
|
static bool &bIncludeDeadPeds;
|
2019-05-15 14:52:37 +00:00
|
|
|
static bool &bNoMoreCollisionTorque;
|
2019-05-17 12:08:18 +00:00
|
|
|
static bool &bSecondShift;
|
|
|
|
static bool &bForceProcessControl;
|
|
|
|
static bool &bProcessCutsceneOnly;
|
2019-08-15 14:51:39 +00:00
|
|
|
static bool &bDoingCarCollisions;
|
|
|
|
static bool &bIncludeCarTyres;
|
2019-05-17 12:08:18 +00:00
|
|
|
|
2019-06-29 11:38:37 +00:00
|
|
|
static void Remove(CEntity *entity);
|
2019-06-18 07:50:26 +00:00
|
|
|
static void Add(CEntity *entity);
|
2019-05-15 14:52:37 +00:00
|
|
|
|
|
|
|
static CSector *GetSector(int x, int y) { return &ms_aSectors[y][x]; }
|
|
|
|
static CPtrList &GetBigBuildingList(eLevelName i) { return ms_bigBuildingsList[i]; }
|
|
|
|
static CPtrList &GetMovingEntityList(void) { return ms_listMovingEntityPtrs; }
|
|
|
|
static uint16 GetCurrentScanCode(void) { return ms_nCurrentScanCode; }
|
|
|
|
static void AdvanceCurrentScanCode(void){
|
|
|
|
if(++CWorld::ms_nCurrentScanCode == 0){
|
|
|
|
CWorld::ClearScanCodes();
|
|
|
|
CWorld::ms_nCurrentScanCode = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
static void ClearScanCodes(void);
|
2019-10-07 21:29:30 +00:00
|
|
|
static void ClearExcitingStuffFromArea(const CVector &pos, float radius, uint8);
|
2019-05-15 14:52:37 +00:00
|
|
|
|
2019-05-28 06:39:36 +00:00
|
|
|
static bool CameraToIgnoreThisObject(CEntity *ent);
|
|
|
|
|
|
|
|
static bool 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 = false);
|
|
|
|
static bool ProcessLineOfSightSector(CSector §or, const CColLine &line, CColPoint &point, float &dist, CEntity *&entity, bool checkBuildings, bool checkVehicles, bool checkPeds, bool checkObjects, bool checkDummies, bool ignoreSeeThrough, bool ignoreSomeObjects = false);
|
|
|
|
static bool ProcessLineOfSightSectorList(CPtrList &list, const CColLine &line, CColPoint &point, float &dist, CEntity *&entity, bool ignoreSeeThrough, bool ignoreSomeObjects = false);
|
|
|
|
static bool ProcessVerticalLine(const CVector &point1, float z2, CColPoint &point, CEntity *&entity, bool checkBuildings, bool checkVehicles, bool checkPeds, bool checkObjects, bool checkDummies, bool ignoreSeeThrough, CStoredCollPoly *poly);
|
|
|
|
static bool ProcessVerticalLineSector(CSector §or, const CColLine &line, CColPoint &point, CEntity *&entity, bool checkBuildings, bool checkVehicles, bool checkPeds, bool checkObjects, bool checkDummies, bool ignoreSeeThrough, CStoredCollPoly *poly);
|
|
|
|
static bool ProcessVerticalLineSectorList(CPtrList &list, const CColLine &line, CColPoint &point, float &dist, CEntity *&entity, bool ignoreSeeThrough, CStoredCollPoly *poly);
|
|
|
|
static bool GetIsLineOfSightClear(const CVector &point1, const CVector &point2, bool checkBuildings, bool checkVehicles, bool checkPeds, bool checkObjects, bool checkDummies, bool ignoreSeeThrough, bool ignoreSomeObjects = false);
|
|
|
|
static bool GetIsLineOfSightSectorClear(CSector §or, const CColLine &line, bool checkBuildings, bool checkVehicles, bool checkPeds, bool checkObjects, bool checkDummies, bool ignoreSeeThrough, bool ignoreSomeObjects = false);
|
|
|
|
static bool GetIsLineOfSightSectorListClear(CPtrList &list, const CColLine &line, bool ignoreSeeThrough, bool ignoreSomeObjects = false);
|
2019-07-10 06:06:43 +00:00
|
|
|
|
2019-08-03 22:31:00 +00:00
|
|
|
static CEntity *TestSphereAgainstWorld(CVector centre, float distance, CEntity *entityToIgnore, bool checkBuildings, bool checkVehicles, bool checkPeds, bool checkObjects, bool checkDummies, bool ignoreSomeObjects);
|
|
|
|
static CEntity *TestSphereAgainstSectorList(CPtrList&, CVector, float, CEntity*, bool);
|
2019-07-10 06:06:43 +00:00
|
|
|
static void FindObjectsInRangeSectorList(CPtrList&, CVector&, float, bool, short*, short, CEntity**);
|
|
|
|
static void FindObjectsInRange(CVector&, float, bool, short*, short, CEntity**, bool, bool, bool, bool, bool);
|
2020-01-03 16:48:13 +00:00
|
|
|
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);
|
2019-05-28 06:39:36 +00:00
|
|
|
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);
|
2019-07-14 09:49:03 +00:00
|
|
|
static void RemoveReferencesToDeletedObject(CEntity*);
|
2019-07-27 18:28:18 +00:00
|
|
|
static void FindObjectsKindaColliding(const CVector &, float, bool, int16*, int16, CEntity **, bool, bool, bool, bool, bool);
|
2020-01-03 16:48:13 +00:00
|
|
|
static void FindObjectsIntersectingCube(const CVector &, const CVector &, int16*, int16, CEntity **, bool, bool, bool, bool, bool);
|
|
|
|
static void FindObjectsIntersectingAngledCollisionBox(const CColBox &, const CMatrix &, const CVector &, float, float, float, float, int16*, int16, CEntity **, bool, bool, bool, bool, bool);
|
2020-02-02 11:47:03 +00:00
|
|
|
static void FindMissionEntitiesIntersectingCube(const CVector&, const CVector&, int16*, int16, CEntity**, bool, bool, bool);
|
2020-02-15 11:53:42 +00:00
|
|
|
static void ClearCarsFromArea(float, float, float, float, float, float);
|
2020-02-16 20:08:54 +00:00
|
|
|
static void ClearPedsFromArea(float, float, float, float, float, float);
|
2019-05-28 06:39:36 +00:00
|
|
|
|
2019-06-21 09:09:09 +00:00
|
|
|
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); }
|
2019-05-15 14:52:37 +00:00
|
|
|
static int GetSectorIndexX(float f) { return (int)GetSectorX(f); }
|
|
|
|
static int GetSectorIndexY(float f) { return (int)GetSectorY(f); }
|
2019-06-21 09:09:09 +00:00
|
|
|
static float GetWorldX(int x) { return x*SECTOR_SIZE_X + WORLD_MIN_X; }
|
|
|
|
static float GetWorldY(int y) { return y*SECTOR_SIZE_Y + WORLD_MIN_Y; }
|
2019-08-15 14:51:39 +00:00
|
|
|
|
2019-09-12 00:43:18 +00:00
|
|
|
static void RemoveEntityInsteadOfProcessingIt(CEntity* ent);
|
|
|
|
static void RemoveFallenPeds();
|
|
|
|
static void RemoveFallenCars();
|
|
|
|
|
2019-10-21 21:39:59 +00:00
|
|
|
static void StopAllLawEnforcersInTheirTracks();
|
2019-12-02 20:02:32 +00:00
|
|
|
static void SetAllCarsCanBeDamaged(bool);
|
|
|
|
static void ExtinguishAllCarFiresInArea(CVector, float);
|
2019-10-21 21:39:59 +00:00
|
|
|
|
2019-08-15 14:51:39 +00:00
|
|
|
static void Initialise();
|
2020-03-22 14:23:40 +00:00
|
|
|
static void AddParticles();
|
2019-08-15 14:51:39 +00:00
|
|
|
static void ShutDown();
|
2019-10-18 22:23:40 +00:00
|
|
|
static void RepositionCertainDynamicObjects();
|
|
|
|
static void RemoveStaticObjects();
|
2019-08-15 14:51:39 +00:00
|
|
|
static void Process();
|
2019-05-15 14:52:37 +00:00
|
|
|
};
|
|
|
|
|
2019-06-24 22:42:23 +00:00
|
|
|
class CPlayerPed;
|
2019-05-15 14:52:37 +00:00
|
|
|
class CVehicle;
|
2019-06-24 22:42:23 +00:00
|
|
|
CPlayerPed *FindPlayerPed(void);
|
2019-05-15 14:52:37 +00:00
|
|
|
CVehicle *FindPlayerVehicle(void);
|
|
|
|
CVehicle *FindPlayerTrain(void);
|
2019-06-29 09:09:33 +00:00
|
|
|
CEntity *FindPlayerEntity(void);
|
|
|
|
CVector FindPlayerCoors(void);
|
2019-06-23 11:11:41 +00:00
|
|
|
CVector &FindPlayerSpeed(void);
|
2019-06-29 09:09:33 +00:00
|
|
|
CVector &FindPlayerCentreOfWorld(int32 player);
|
|
|
|
CVector &FindPlayerCentreOfWorld_NoSniperShift(void);
|
2019-06-20 00:31:03 +00:00
|
|
|
float FindPlayerHeading(void);
|