Files
FC1/CryEntitySystem/EntitySystem.h
romkazvo 34d6c5d489 123
2023-08-07 19:29:24 +08:00

255 lines
7.3 KiB
C++

//////////////////////////////////////////////////////////////////////
//
// Crytek CryENGINE Source code
//
// File:EntitySystem.h
//
// History:
// -March 07,2001:Originally created by Marco Corbetta
// -: modified by everyone
//
//
//////////////////////////////////////////////////////////////////////
#ifndef ENTITYSYSTEM_H
#define ENTITYSYSTEM_H
#if _MSC_VER > 1000
# pragma once
#endif
#include <map>
#include <set>
#include <vector>
#include <IEntitySystem.h>
#include "Entity.h"
#include "EntityCamera.h"
#include "IDGenerator.h"
#include <ISystem.h>
//#include "EntityIt.h"
class CEntity;
class CStaticObject;
class CStatObjInfo;
class CEntityClonesMgr;
#ifdef WIN64
// workaround for Amd64 compiler
#include <map>
#define hash_map map
#else
#if defined(LINUX)
#include <ext/hash_map>
#include "ientityrenderstate.h"
#else
#include <hash_map>
#endif
#endif
#if defined(LINUX)
typedef __gnu_cxx::hash_map<EntityId,CEntity*> EntityMap;
typedef __gnu_cxx::hash_map<EntityId,CEntity*>::iterator EntityMapItor;
#else
typedef std::hash_map<EntityId,CEntity*> EntityMap;
typedef EntityMap::iterator EntityMapItor;
#endif
typedef std::vector<CEntity*> EntityVector;
typedef EntityVector::iterator EntityVectorItor;
typedef std::set<int> EntityIdSet;
typedef EntityIdSet::iterator EntityIdSetItor;
typedef std::list<CEntityObject*> EntityObjectList;
typedef std::list<IEntitySystemSink *> SinkList;
//typedef std::set<CEntityClonesMgr *> EntityClonesMgrSet;
//typedef EntityClonesMgrSet::iterator EntityClonesMgrSetItor;
/*
struct near_info_struct
{
near_info_struct() {model=0;}
ICryCharInstance * model;
Vec3d pos, angles;
list2<CStaticObject> * _stat_objects;
list2<CStaticObject> * _stat_shadows;
list2<CStaticObject> * _stat_shadows_plus;
IEntity * o;
float ent_distance;
};*/
//////////////////////////////////////////////////////////////////////////
struct SEntityTimerEvent
{
int entityId;
int timerId;
};
//////////////////////////////////////////////////////////////////////
class CEntitySystem : public IEntitySystem
{
void InsertEntity( EntityId id,CEntity *pEntity );
// void GenerateUniqId( CEntityDesc &ed ) { ed.id = m_LastId++; }
void DeleteEntity( IEntity *entity );
// void GarbageCollectorCycle();
public:
CEntitySystem(ISystem *pSystem);
~CEntitySystem();
bool Init(ISystem *pSystem);
void Release(); // Close entity system, free resources.
void Reset(); // Reset whole entity system, and destroy all entities.
void SetSink( IEntitySystemSink *pSink );
void RemoveSink( IEntitySystemSink *pSink );
void OnBind(EntityId id,EntityId child,unsigned char param);
void OnUnbind(EntityId id,EntityId child,unsigned char param);
//void SetMyPlayer(unsigned short id ){ m_wPlayerID = id;}
//unsigned short GetMyPlayer() const {return m_wPlayerID;}
IScriptSystem *GetScriptSystem() { return m_pScriptSystem; }
IEntity* SpawnEntity( CEntityDesc &ed,bool bAutoInit=true );
bool InitEntity( IEntity* pEntity,CEntityDesc &ed );
// Safely remove entity; Call to this function will not immediatly remove entity;
// Entity will only be removed after update call unless bRemoveNow set.
void RemoveEntity( EntityId entity,bool bRemoveNow );
IEntityCamera * CreateEntityCamera();
// near_info_struct * GetWeaponInfo() { return &m_WeaponInfo; };
IEntity* GetEntity( EntityId id ); // Get entity from id.
IEntity* GetEntity(const char *sEntityName);
EntityId FindEntity( const char *name ) const; // Find first entity with given name.
int GetNumEntities() const;
//void GetEntities( std::vector<IEntity*> &entities ) const;
IEntityIt * GetEntityIterator();
IEntityIt * GetEntityInFrustrumIterator( bool bFromPrevFrame=false );
void GetEntitiesInRadius( const Vec3d &origin,float radius,std::vector<IEntity*> &entities,int physFlags ) const;
void Update();
void UpdateTimers();
// Sets new entity timer event.
void PauseTimers(bool bPause,bool bResume=false);
void RemoveTimerEvent( EntityId id );
void AddTimerEvent( int delayTimeMillis,SEntityTimerEvent &event );
void EnableClient(bool bEnable)
{
m_bClient=bEnable;
}
void EnableServer(bool bEnable)
{
m_bServer=bEnable;
}
inline bool ClientEnabled(){return m_bClient;}
inline bool ServerEnabled(){return m_bServer;}
void GetMemoryStatistics(ICrySizer *pSizer);
virtual bool IsIDUsed(EntityId nID);
void ReleaseMark(unsigned int id);
void ResetEntities(void);
virtual void SetDynamicEntityIdMode( const bool bActivate );
void SetDefaultEntityUpdateLevel( EEntityUpdateVisLevel eDefault) { m_eDefaultUpdateLevel = eDefault;}
// near_info_struct m_WeaponInfo;
void SetPrecacheResourcesMode( bool bPrecaching );
// CIDGenerator* GetIDGenerator() { return &m_EntityIDGenerator; }
bool IsDynamicEntityId( EntityId id ) { return m_EntityIDGenerator.IsDynamicEntityId( id ); }
void MarkId( EntityId id ) { m_EntityIDGenerator.Mark( id ); }
void ClearId( EntityId id ) { m_EntityIDGenerator.Remove( id ); }
private:
// Return true if updated.
void UpdateEntity(CEntity *ce,SEntityUpdateContext &ctx);
//////////////////////////////////////////////////////////////////////////
// Variables.
//////////////////////////////////////////////////////////////////////////
bool m_bDynamicEntityIdMode; //!< default=false (editor), true=game mode
CIDGenerator m_EntityIDGenerator;
ISystem * m_pISystem;
EEntityUpdateVisLevel m_eDefaultUpdateLevel;
SinkList m_lstSinks;
EntityMap m_mapEntities;
EntityVector m_vEntitiesInFrustrum;
//[kirill] - need this one to get visible entities on update of some entity - so we don't depend on update's order
EntityVector m_vEntitiesInFrustrumPrevFrame;
// unsigned short m_wPlayerID;
IScriptSystem * m_pScriptSystem;
//////////////////////////////////////////////////////////////////////////
// Entity timers.
//////////////////////////////////////////////////////////////////////////
typedef std::multimap<int,SEntityTimerEvent> EntityTimersMap;
EntityTimersMap m_timersMap;
std::vector<SEntityTimerEvent> m_currentTriggers;
bool m_bTimersPause;
int m_nStartPause;
//////////////////////////////////////////////////////////////////////////
public:
struct ITimer *m_pTimer;
ICVar *m_pCharacterIK;
ICVar *m_pShowEntityBBox;
ICVar *m_pShowHelpers;
ICVar *m_pProfileEntities;
ICVar *m_pUpdateInvisibleCharacter;
ICVar *m_pUpdateBonePositions;
ICVar *m_pUpdateScript;
ICVar *m_pUpdateTimer;
ICVar *m_pDebugTimer;
ICVar *m_pUpdateCamera;
ICVar *m_pUpdatePhysics;
ICVar *m_pUpdateAI;
ICVar *m_pUpdateEntities;
ICVar *m_pUpdateCollision;
ICVar *m_pUpdateCollisionScript;
ICVar *m_pUpdateContainer;
ICVar *m_pUpdateCoocooEgg;
ICVar *m_pPiercingCamera;
ICVar *m_pVisCheckForUpdate;
ICVar *m_pEntityBBoxes;
ICVar *m_pEntityHelpers;
ICVar *m_pOnDemandPhysics;
ICVar *m_pMinImpulseVel;
ICVar *m_pImpulseScale;
ICVar *m_pMaxImpulseAdjMass;
ICVar *m_pSplashThreshold;
ICVar *m_pSplashTimeout;
ICVar *m_pHitCharacters;
ICVar *m_pHitDeadBodies;
ICVar *m_pEnableCloth;
ICVar *m_pCharZOffsetSpeed;
bool m_bClient;
bool m_bServer;
int m_nGetEntityCounter;
// EntityClonesMgrSet m_setEntityClonesMgrs;
};
//////////////////////////////////////////////////////////////////////////
// Precache resources mode state.
//////////////////////////////////////////////////////////////////////////
extern bool gPrecacheResourcesMode;
#endif //Entitysystem.h