#pragma once
#include "ModelInfo.h"
#include "Placeable.h"
struct CReference;
enum eEntityFlags
{
IS_UNK = 0,
CONTROL_POSTPONED,
IS_EXPLOSIONPROOF,
IS_VISIBLE,
IS_ON_GROUND,
REQUIRES_SCORCHED_LIGHTS,
HAS_BLIP,
IS_BIG_BUILDING,
HAS_BEEN_DAMAGED,
};
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 bHasBlip : 1;
uint32 bIsBIGBuilding : 1;
// VC inserts one more flag here: if drawdist <= 2000
uint32 bRenderDamaged : 1;
// flagsC
uint32 bBulletProof : 1;
uint32 bFireProof : 1;
uint32 bCollisionProof : 1;
uint32 bMeleeProof : 1;
uint32 bOnlyDamagedByPlayer : 1;
uint32 bStreamingDontDelete : 1;
uint32 bZoneCulled : 1;
uint32 bZoneCulled2 : 1; // only treadables+10m
// flagsD
uint32 bRemoveFromWorld : 1;
uint32 bHasHitWall : 1;
uint32 bImBeingRendered : 1;
uint32 m_flagD8 : 1;
uint32 bIsSubway : 1; // set when subway, but maybe different meaning?
uint32 bDrawLast : 1;
uint32 m_flagD40 : 1;
uint32 m_flagD80 : 1; // CObject visibility?
// flagsE
uint32 bDistanceFade : 1;
uint32 m_flagE2 : 1;
uint16 m_scanCode;
int16 m_randomSeed;
int16 m_modelIndex;
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(); }
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; }
float GetDistanceFromCentreOfMassToBaseOfModel(void) { return -CModelInfo::GetModelInfo(m_modelIndex)->GetColModel()->boundingBox.min.z; }
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 AttachToRwObject(RwObject *obj);
void DetachFromRwObject(void);
void RegisterReference(CEntity **pent);
void ResolveReferences(void);
void PruneReferences(void);
// to make patching virtual functions possible
CEntity *ctor(void) { return ::new (this) CEntity(); }
void dtor(void) { this->CEntity::~CEntity(); }
void Add_(void) { CEntity::Add(); }
void Remove_(void) { CEntity::Remove(); }
void SetModelIndex_(uint32 i) { CEntity::SetModelIndex(i); }
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");