diff options
Diffstat (limited to 'src/entities/Entity.h')
-rw-r--r-- | src/entities/Entity.h | 146 |
1 files changed, 146 insertions, 0 deletions
diff --git a/src/entities/Entity.h b/src/entities/Entity.h new file mode 100644 index 00000000..8bcd7348 --- /dev/null +++ b/src/entities/Entity.h @@ -0,0 +1,146 @@ +#pragma once + +#include "ModelInfo.h" +#include "Placeable.h" + +struct CReference; + +enum eEntityType +{ + ENTITY_TYPE_NOTHING = 0, + ENTITY_TYPE_BUILDING, + ENTITY_TYPE_VEHICLE, + ENTITY_TYPE_PED, + ENTITY_TYPE_OBJECT, + ENTITY_TYPE_DUMMY, + ENTITY_TYPE_6, + ENTITY_TYPE_7, +}; + +enum eEntityStatus +{ + // from SA MTA! let's hope they didn't change from III + STATUS_PLAYER = 0, + 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, + //STATUS_TRAILER, + //STATUS_SIMPLE_TRAILER +}; + +class CEntity : public CPlaceable +{ +public: + RwObject *m_rwObject; + uint32 m_type : 3; + uint32 m_status : 5; + + // flagsA + uint32 bUsesCollision : 1; + uint32 bCollisionProcessed : 1; + uint32 bIsStatic : 1; + uint32 bHasContacted : 1; + uint32 bPedPhysics : 1; + uint32 bIsStuck : 1; + uint32 bIsInSafePosition : 1; + uint32 bUseCollisionRecords : 1; + + // flagsB + uint32 bWasPostponed : 1; + uint32 m_flagB2 : 1; // explosion proof? + uint32 bIsVisible : 1; + uint32 bHasCollided : 1; // + uint32 bRenderScorched : 1; + uint32 m_flagB20 : 1; // bFlashing? + uint32 bIsBIGBuilding : 1; + // VC inserts one more flag here: if drawdist <= 2000 + uint32 bRenderDamaged : 1; + + // flagsC + uint32 m_flagC1 : 1; // bullet proof? + uint32 m_flagC2 : 1; // fire proof? + uint32 m_flagC4 : 1; // collision proof? + uint32 m_flagC8 : 1; // melee proof? + uint32 m_flagC10 : 1; // bOnlyDamagedByPlayer? + uint32 m_flagC20 : 1; + uint32 m_bZoneCulled : 1; + uint32 m_bZoneCulled2 : 1; // only treadables+10m + + // flagsD + uint32 bRemoveFromWorld : 1; + uint32 bHasHitWall : 1; + uint32 bImBeingRendered : 1; + uint32 m_flagD8 : 1; + uint32 m_flagD10 : 1; + uint32 bDrawLast : 1; + uint32 m_flagD40 : 1; + uint32 m_flagD80 : 1; + + // flagsE + uint32 bDistanceFade : 1; + uint32 m_flagE2 : 1; + + uint16 m_scanCode; + int16 m_randomSeed; + int16 m_modelIndex; + uint16 m_level; // int16 + CReference *m_pFirstReference; + + virtual void Add(void); + virtual void Remove(void); + virtual void SetModelIndex(uint32 i) { m_modelIndex = i; CreateRwObject(); } + virtual void SetModelIndexNoCreate(uint32 i) { m_modelIndex = i; } + 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; } + + void GetBoundCentre(CVector &out); + CVector GetBoundCentre(void) { CVector v; GetBoundCentre(v); return v; } + float GetBoundRadius(void) { return CModelInfo::GetModelInfo(m_modelIndex)->GetColModel()->boundingSphere.radius; } + 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(); } + int GetModelIndex(void) { return m_modelIndex; } + void UpdateRwFrame(void); + void SetupBigBuilding(void); + + void RegisterReference(CEntity **pent); + void ResolveReferences(void); + void PruneReferences(void); + + + // to make patching virtual functions possible + void Add_(void) { CEntity::Add(); } + void Remove_(void) { CEntity::Remove(); } + void CreateRwObject_(void) { CEntity::CreateRwObject(); } + void DeleteRwObject_(void) { CEntity::DeleteRwObject(); } + CRect GetBoundRect_(void) { return CEntity::GetBoundRect(); } + void Render_(void) { CEntity::Render(); } + bool SetupLighting_(void) { return CEntity::SetupLighting(); } +}; +static_assert(sizeof(CEntity) == 0x64, "CEntity: error"); |