2019-05-15 10:52:37 -04:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include "ModelInfo.h"
|
|
|
|
#include "Placeable.h"
|
|
|
|
|
|
|
|
struct CReference;
|
2020-04-16 14:46:08 -04:00
|
|
|
class CPtrList;
|
2019-05-15 10:52:37 -04:00
|
|
|
|
2020-04-30 09:45:45 -04:00
|
|
|
enum eEntityType : uint8
|
2019-05-15 10:52:37 -04:00
|
|
|
{
|
|
|
|
ENTITY_TYPE_NOTHING = 0,
|
|
|
|
ENTITY_TYPE_BUILDING,
|
|
|
|
ENTITY_TYPE_VEHICLE,
|
|
|
|
ENTITY_TYPE_PED,
|
|
|
|
ENTITY_TYPE_OBJECT,
|
|
|
|
ENTITY_TYPE_DUMMY,
|
|
|
|
};
|
|
|
|
|
2020-04-30 09:45:45 -04:00
|
|
|
enum eEntityStatus : uint8
|
2019-05-15 10:52:37 -04:00
|
|
|
{
|
2019-07-16 13:48:50 -04:00
|
|
|
STATUS_PLAYER,
|
2019-05-15 10:52:37 -04:00
|
|
|
STATUS_PLAYER_PLAYBACKFROMBUFFER,
|
|
|
|
STATUS_SIMPLE,
|
|
|
|
STATUS_PHYSICS,
|
|
|
|
STATUS_ABANDONED,
|
|
|
|
STATUS_WRECKED,
|
|
|
|
STATUS_TRAIN_MOVING,
|
|
|
|
STATUS_TRAIN_NOT_MOVING,
|
|
|
|
STATUS_HELI,
|
|
|
|
STATUS_PLANE,
|
|
|
|
STATUS_PLAYER_REMOTE,
|
|
|
|
STATUS_PLAYER_DISABLED,
|
|
|
|
};
|
|
|
|
|
|
|
|
class CEntity : public CPlaceable
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
RwObject *m_rwObject;
|
2020-04-30 09:45:45 -04:00
|
|
|
protected:
|
2019-05-15 10:52:37 -04:00
|
|
|
uint32 m_type : 3;
|
2020-04-30 09:45:45 -04:00
|
|
|
private:
|
2019-05-15 10:52:37 -04:00
|
|
|
uint32 m_status : 5;
|
2020-04-30 09:45:45 -04:00
|
|
|
public:
|
2019-05-15 10:52:37 -04:00
|
|
|
// flagsA
|
2020-04-19 00:14:13 -04:00
|
|
|
uint32 bUsesCollision : 1; // does entity use collision
|
|
|
|
uint32 bCollisionProcessed : 1; // has object been processed by a ProcessEntityCollision function
|
|
|
|
uint32 bIsStatic : 1; // is entity static
|
|
|
|
uint32 bHasContacted : 1; // has entity processed some contact forces
|
2019-05-15 10:52:37 -04:00
|
|
|
uint32 bPedPhysics : 1;
|
2020-04-19 00:14:13 -04:00
|
|
|
uint32 bIsStuck : 1; // is entity stuck
|
|
|
|
uint32 bIsInSafePosition : 1; // is entity in a collision free safe position
|
2019-05-15 10:52:37 -04:00
|
|
|
uint32 bUseCollisionRecords : 1;
|
|
|
|
|
|
|
|
// flagsB
|
2020-04-19 00:14:13 -04:00
|
|
|
uint32 bWasPostponed : 1; // was entity control processing postponed
|
2019-07-19 05:57:12 -04:00
|
|
|
uint32 bExplosionProof : 1;
|
2020-04-19 00:14:13 -04:00
|
|
|
uint32 bIsVisible : 1; //is the entity visible
|
|
|
|
uint32 bHasCollided : 1;
|
2019-05-15 10:52:37 -04:00
|
|
|
uint32 bRenderScorched : 1;
|
2019-06-22 05:42:21 -04:00
|
|
|
uint32 bHasBlip : 1;
|
2020-04-19 00:14:13 -04:00
|
|
|
uint32 bIsBIGBuilding : 1; // Set if this entity is a big building
|
|
|
|
uint32 bRenderDamaged : 1; // use damaged LOD models for objects with applicable damage
|
2019-05-15 10:52:37 -04:00
|
|
|
|
|
|
|
// flagsC
|
2019-06-27 08:17:42 -04:00
|
|
|
uint32 bBulletProof : 1;
|
|
|
|
uint32 bFireProof : 1;
|
|
|
|
uint32 bCollisionProof : 1;
|
|
|
|
uint32 bMeleeProof : 1;
|
|
|
|
uint32 bOnlyDamagedByPlayer : 1;
|
2020-04-19 00:14:13 -04:00
|
|
|
uint32 bStreamingDontDelete : 1; // Dont let the streaming remove this
|
2019-06-27 08:17:42 -04:00
|
|
|
uint32 bZoneCulled : 1;
|
2020-04-19 00:14:13 -04:00
|
|
|
uint32 bZoneCulled2 : 1; // only treadables+10m
|
2019-05-15 10:52:37 -04:00
|
|
|
|
|
|
|
// flagsD
|
2020-04-19 00:14:13 -04:00
|
|
|
uint32 bRemoveFromWorld : 1; // remove this entity next time it should be processed
|
|
|
|
uint32 bHasHitWall : 1; // has collided with a building (changes subsequent collisions)
|
|
|
|
uint32 bImBeingRendered : 1; // don't delete me because I'm being rendered
|
2020-04-10 07:44:08 -04:00
|
|
|
uint32 bTouchingWater : 1; // used by cBuoyancy::ProcessBuoyancy
|
2019-06-18 03:50:26 -04:00
|
|
|
uint32 bIsSubway : 1; // set when subway, but maybe different meaning?
|
2020-04-19 00:14:13 -04:00
|
|
|
uint32 bDrawLast : 1; // draw object last
|
2019-07-28 07:14:08 -04:00
|
|
|
uint32 bNoBrightHeadLights : 1;
|
2020-04-10 07:44:08 -04:00
|
|
|
uint32 bDoNotRender : 1;
|
2019-05-15 10:52:37 -04:00
|
|
|
|
|
|
|
// flagsE
|
2020-04-19 00:14:13 -04:00
|
|
|
uint32 bDistanceFade : 1; // Fade entity because it is far away
|
2019-05-15 10:52:37 -04:00
|
|
|
uint32 m_flagE2 : 1;
|
|
|
|
|
|
|
|
uint16 m_scanCode;
|
2019-11-09 10:17:54 -05:00
|
|
|
uint16 m_randomSeed;
|
2019-05-15 10:52:37 -04:00
|
|
|
int16 m_modelIndex;
|
|
|
|
uint16 m_level; // int16
|
|
|
|
CReference *m_pFirstReference;
|
|
|
|
|
2020-04-30 09:45:45 -04:00
|
|
|
public:
|
|
|
|
eEntityType GetType() const { return (eEntityType)m_type; }
|
|
|
|
void SetType(eEntityType type) { m_type = type; }
|
|
|
|
eEntityStatus GetStatus() const { return (eEntityStatus)m_status; }
|
|
|
|
void SetStatus(eEntityStatus status) { m_status = status; }
|
2019-07-09 03:57:44 -04:00
|
|
|
CColModel *GetColModel(void) { return CModelInfo::GetModelInfo(m_modelIndex)->GetColModel(); }
|
2020-10-18 09:40:06 -04:00
|
|
|
bool GetIsStatic(void) const { return bIsStatic; }
|
|
|
|
void SetIsStatic(bool state) { bIsStatic = state; }
|
2020-05-02 11:02:17 -04:00
|
|
|
#ifdef COMPATIBLE_SAVES
|
|
|
|
void SaveEntityFlags(uint8*& buf);
|
|
|
|
void LoadEntityFlags(uint8*& buf);
|
|
|
|
#else
|
2020-04-11 14:01:39 -04:00
|
|
|
uint32* GetAddressOfEntityProperties() { /* AWFUL */ return (uint32*)((char*)&m_rwObject + sizeof(m_rwObject)); }
|
2020-04-26 17:54:43 -04:00
|
|
|
#endif
|
2019-07-09 03:57:44 -04:00
|
|
|
|
2019-06-02 11:13:56 -04:00
|
|
|
CEntity(void);
|
2019-07-08 02:46:42 -04:00
|
|
|
~CEntity(void);
|
2019-06-02 11:13:56 -04:00
|
|
|
|
2019-05-15 10:52:37 -04:00
|
|
|
virtual void Add(void);
|
|
|
|
virtual void Remove(void);
|
2019-07-08 02:46:42 -04:00
|
|
|
virtual void SetModelIndex(uint32 id) { m_modelIndex = id; CreateRwObject(); }
|
|
|
|
virtual void SetModelIndexNoCreate(uint32 id) { m_modelIndex = id; }
|
2019-05-15 10:52:37 -04:00
|
|
|
virtual void CreateRwObject(void);
|
|
|
|
virtual void DeleteRwObject(void);
|
|
|
|
virtual CRect GetBoundRect(void);
|
|
|
|
virtual void ProcessControl(void) {}
|
|
|
|
virtual void ProcessCollision(void) {}
|
|
|
|
virtual void ProcessShift(void) {}
|
|
|
|
virtual void Teleport(CVector v) {}
|
|
|
|
virtual void PreRender(void);
|
|
|
|
virtual void Render(void);
|
|
|
|
virtual bool SetupLighting(void);
|
|
|
|
virtual void RemoveLighting(bool) {}
|
|
|
|
virtual void FlagToDestroyWhenNextProcessed(void) {}
|
|
|
|
|
|
|
|
bool IsBuilding(void) { return m_type == ENTITY_TYPE_BUILDING; }
|
|
|
|
bool IsVehicle(void) { return m_type == ENTITY_TYPE_VEHICLE; }
|
|
|
|
bool IsPed(void) { return m_type == ENTITY_TYPE_PED; }
|
|
|
|
bool IsObject(void) { return m_type == ENTITY_TYPE_OBJECT; }
|
|
|
|
bool IsDummy(void) { return m_type == ENTITY_TYPE_DUMMY; }
|
|
|
|
|
2019-07-23 10:39:30 -04:00
|
|
|
RpAtomic *GetAtomic(void) {
|
|
|
|
assert(RwObjectGetType(m_rwObject) == rpATOMIC);
|
|
|
|
return (RpAtomic*)m_rwObject;
|
|
|
|
}
|
|
|
|
RpClump *GetClump(void) {
|
|
|
|
assert(RwObjectGetType(m_rwObject) == rpCLUMP);
|
|
|
|
return (RpClump*)m_rwObject;
|
|
|
|
}
|
|
|
|
|
2019-05-15 10:52:37 -04:00
|
|
|
void GetBoundCentre(CVector &out);
|
|
|
|
CVector GetBoundCentre(void) { CVector v; GetBoundCentre(v); return v; }
|
|
|
|
float GetBoundRadius(void) { return CModelInfo::GetModelInfo(m_modelIndex)->GetColModel()->boundingSphere.radius; }
|
2019-06-02 11:13:56 -04:00
|
|
|
float GetDistanceFromCentreOfMassToBaseOfModel(void) { return -CModelInfo::GetModelInfo(m_modelIndex)->GetColModel()->boundingBox.min.z; }
|
2019-05-15 10:52:37 -04:00
|
|
|
bool GetIsTouching(CVector const ¢er, float r);
|
|
|
|
bool GetIsOnScreen(void);
|
|
|
|
bool GetIsOnScreenComplex(void);
|
|
|
|
bool IsVisible(void) { return m_rwObject && bIsVisible && GetIsOnScreen(); }
|
|
|
|
bool IsVisibleComplex(void) { return m_rwObject && bIsVisible && GetIsOnScreenComplex(); }
|
2020-05-05 07:48:35 -04:00
|
|
|
int16 GetModelIndex(void) const { return m_modelIndex; }
|
2019-05-15 10:52:37 -04:00
|
|
|
void UpdateRwFrame(void);
|
|
|
|
void SetupBigBuilding(void);
|
|
|
|
|
2019-06-02 11:13:56 -04:00
|
|
|
void AttachToRwObject(RwObject *obj);
|
|
|
|
void DetachFromRwObject(void);
|
|
|
|
|
2019-05-15 10:52:37 -04:00
|
|
|
void RegisterReference(CEntity **pent);
|
|
|
|
void ResolveReferences(void);
|
|
|
|
void PruneReferences(void);
|
|
|
|
|
2020-04-23 16:25:18 -04:00
|
|
|
#ifdef PED_SKIN
|
|
|
|
void UpdateRpHAnim(void);
|
|
|
|
#endif
|
|
|
|
|
2019-06-30 15:06:55 -04:00
|
|
|
void PreRenderForGlassWindow(void);
|
|
|
|
void AddSteamsFromGround(CVector *unused);
|
|
|
|
void ModifyMatrixForTreeInWind(void);
|
|
|
|
void ModifyMatrixForBannerInWind(void);
|
|
|
|
void ProcessLightsForEntity(void);
|
2020-04-16 14:46:08 -04:00
|
|
|
|
2020-04-16 20:38:05 -04:00
|
|
|
static void AddSteamsFromGround(CPtrList& list);
|
2019-05-15 10:52:37 -04:00
|
|
|
};
|
2020-05-10 09:54:37 -04:00
|
|
|
|
2020-05-10 11:49:33 -04:00
|
|
|
VALIDATE_SIZE(CEntity, 0x64);
|