1
0
Fork 0
mirror of https://git.rip/DMCA_FUCKER/re3.git synced 2024-11-13 06:49:16 +00:00
re3/src/entities/Entity.h

185 lines
5.8 KiB
C
Raw Normal View History

2019-05-15 14:52:37 +00:00
#pragma once
#include "ModelInfo.h"
#include "Placeable.h"
struct CReference;
2020-04-16 18:46:08 +00:00
class CPtrList;
2019-05-15 14:52:37 +00:00
2020-12-07 00:59:17 +00:00
enum eEntityType
2019-05-15 14:52:37 +00:00
{
ENTITY_TYPE_NOTHING = 0,
ENTITY_TYPE_BUILDING,
ENTITY_TYPE_VEHICLE,
ENTITY_TYPE_PED,
ENTITY_TYPE_OBJECT,
ENTITY_TYPE_DUMMY,
};
2020-12-07 00:59:17 +00:00
enum eEntityStatus
2019-05-15 14:52:37 +00:00
{
STATUS_PLAYER,
2019-05-15 14:52:37 +00: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,
2020-06-04 15:38:41 +00:00
STATUS_GHOST
2019-05-15 14:52:37 +00:00
};
class CEntity : public CPlaceable
{
public:
RwObject *m_rwObject;
protected:
2019-05-15 14:52:37 +00:00
uint32 m_type : 3;
private:
2019-05-15 14:52:37 +00:00
uint32 m_status : 5;
public:
2019-05-15 14:52:37 +00:00
// flagsA
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 14:52:37 +00:00
uint32 bPedPhysics : 1;
uint32 bIsStuck : 1; // is entity stuck
uint32 bIsInSafePosition : 1; // is entity in a collision free safe position
2019-05-15 14:52:37 +00:00
uint32 bUseCollisionRecords : 1;
// flagsB
uint32 bWasPostponed : 1; // was entity control processing postponed
2019-07-19 09:57:12 +00:00
uint32 bExplosionProof : 1;
uint32 bIsVisible : 1; //is the entity visible
uint32 bHasCollided : 1;
2019-05-15 14:52:37 +00:00
uint32 bRenderScorched : 1;
2019-06-22 09:42:21 +00:00
uint32 bHasBlip : 1;
uint32 bIsBIGBuilding : 1; // Set if this entity is a big building
uint32 bStreamBIGBuilding : 1; // set when draw dist <= 2000
2019-05-15 14:52:37 +00:00
// flagsC
2020-05-05 16:06:38 +00:00
uint32 bRenderDamaged : 1; // use damaged LOD models for objects with applicable damage
2019-06-27 12:17:42 +00:00
uint32 bBulletProof : 1;
uint32 bFireProof : 1;
uint32 bCollisionProof : 1;
uint32 bMeleeProof : 1;
uint32 bOnlyDamagedByPlayer : 1;
uint32 bStreamingDontDelete : 1; // Dont let the streaming remove this
2020-05-05 16:06:38 +00:00
uint32 bRemoveFromWorld : 1; // remove this entity next time it should be processed
2019-05-15 14:52:37 +00:00
// flagsD
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 11:44:08 +00:00
uint32 bTouchingWater : 1; // used by cBuoyancy::ProcessBuoyancy
2019-06-18 07:50:26 +00:00
uint32 bIsSubway : 1; // set when subway, but maybe different meaning?
uint32 bDrawLast : 1; // draw object last
uint32 bNoBrightHeadLights : 1;
2020-05-19 18:56:42 +00:00
uint32 bDoNotRender : 1; //-- only applies to CObjects apparently
2020-05-05 16:06:38 +00:00
uint32 bDistanceFade : 1; // Fade entity because it is far away
2019-05-15 14:52:37 +00:00
// flagsE
2020-05-11 15:03:32 +00:00
uint32 m_flagE1 : 1;
2019-05-15 14:52:37 +00:00
uint32 m_flagE2 : 1;
2020-05-11 15:03:32 +00:00
uint32 bOffscreen : 1; // offscreen flag. This can only be trusted when it is set to true
2020-05-05 21:21:26 +00:00
uint32 bIsStaticWaitingForCollision : 1; // this is used by script created entities - they are static until the collision is loaded below them
2020-05-27 20:32:33 +00:00
uint32 bDontStream : 1; // tell the streaming not to stream me
2020-05-11 20:21:18 +00:00
uint32 bUnderwater : 1; // this object is underwater change drawing order
2020-05-19 18:56:42 +00:00
uint32 bHasPreRenderEffects : 1; // Object has a prerender effects attached to it
2019-05-15 14:52:37 +00:00
uint16 m_scanCode;
uint16 m_randomSeed;
2019-05-15 14:52:37 +00:00
int16 m_modelIndex;
int8 m_level;
int8 m_area;
2019-05-15 14:52:37 +00:00
CReference *m_pFirstReference;
public:
2020-12-07 00:59:17 +00:00
uint8 GetType() const { return m_type; }
void SetType(uint8 type) { m_type = type; }
uint8 GetStatus() const { return m_status; }
void SetStatus(uint8 status) { m_status = status; }
2019-07-09 07:57:44 +00:00
CColModel *GetColModel(void) { return CModelInfo::GetModelInfo(m_modelIndex)->GetColModel(); }
bool GetIsStatic(void) const { return bIsStatic || bIsStaticWaitingForCollision; }
void SetIsStatic(bool state) { bIsStatic = state; }
2020-05-02 15:02:17 +00:00
#ifdef COMPATIBLE_SAVES
void SaveEntityFlags(uint8*& buf);
void LoadEntityFlags(uint8*& buf);
#else
2020-04-11 18:01:39 +00:00
uint32* GetAddressOfEntityProperties() { /* AWFUL */ return (uint32*)((char*)&m_rwObject + sizeof(m_rwObject)); }
2020-04-26 21:54:43 +00:00
#endif
2019-07-09 07:57:44 +00:00
2019-06-02 15:13:56 +00:00
CEntity(void);
2020-05-19 18:56:42 +00:00
virtual ~CEntity(void);
2019-06-02 15:13:56 +00:00
2019-05-15 14:52:37 +00:00
virtual void Add(void);
virtual void Remove(void);
2020-05-19 18:56:42 +00:00
virtual void SetModelIndex(uint32 id);
virtual void SetModelIndexNoCreate(uint32 id);
2019-05-15 14:52:37 +00: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);
2019-05-15 14:52:37 +00:00
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 14:39:30 +00: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 14:52:37 +00:00
void GetBoundCentre(CVector &out);
CVector GetBoundCentre(void);
float GetBoundRadius(void);
float GetDistanceFromCentreOfMassToBaseOfModel(void);
2019-05-15 14:52:37 +00:00
bool GetIsTouching(CVector const &center, float r);
bool GetIsOnScreen(void);
bool GetIsOnScreenComplex(void);
bool IsVisible(void);
bool IsVisibleComplex(void);
2020-07-05 20:45:09 +00:00
bool IsEntityOccluded(void);
2020-05-05 11:48:35 +00:00
int16 GetModelIndex(void) const { return m_modelIndex; }
2019-05-15 14:52:37 +00:00
void UpdateRwFrame(void);
void SetupBigBuilding(void);
2020-05-19 18:56:42 +00:00
bool HasPreRenderEffects(void);
2019-05-15 14:52:37 +00:00
2019-06-02 15:13:56 +00:00
void AttachToRwObject(RwObject *obj);
void DetachFromRwObject(void);
2019-05-15 14:52:37 +00:00
void RegisterReference(CEntity **pent);
void ResolveReferences(void);
void PruneReferences(void);
void CleanUpOldReference(CEntity **pent);
2019-05-15 14:52:37 +00:00
void UpdateRpHAnim(void);
2019-06-30 19:06:55 +00:00
void PreRenderForGlassWindow(void);
void AddSteamsFromGround(CVector *unused);
void ModifyMatrixForTreeInWind(void);
void ModifyMatrixForBannerInWind(void);
void ProcessLightsForEntity(void);
2020-10-08 01:43:50 +00:00
void SetRwObjectAlpha(int32 alpha);
2019-05-15 14:52:37 +00:00
};
2020-05-18 22:49:09 +00:00
bool IsEntityPointerValid(CEntity*);