1 // Copyright 2001-2018 Crytek GmbH / Crytek Group. All rights reserved.
3 /*************************************************************************
4 -------------------------------------------------------------------------
7 Description: Manages and controls player spawns.
9 -------------------------------------------------------------------------
11 - 23:8:2004 15:52 : Created by Márcio Martins
13 *************************************************************************/
14 #ifndef __ACTORSYSTEM_H__
15 #define __ACTORSYSTEM_H__
21 #include "IActorSystem.h"
22 #include <CryGame/IGameFramework.h>
23 #include "ItemParams.h"
25 typedef std::map
<EntityId
, IActor
*> TActorMap
;
28 class CPlayerEntityProxy
;
32 public IEntitySystemSink
34 struct DemoSpectatorSystem
36 EntityId m_originalActor
;
37 EntityId m_currentActor
;
39 void SwitchSpectator(TActorMap
* pActors
, EntityId id
= 0);
41 } m_demoSpectatorSystem
;
43 EntityId m_demoPlaybackMappedOriginalServerPlayer
;
46 CActorSystem(ISystem
* pSystem
, IEntitySystem
* pEntitySystem
);
47 virtual ~CActorSystem();
49 void Release() { delete this; };
52 virtual void Reload();
55 virtual IActor
* GetActor(EntityId entityId
);
56 virtual IActor
* GetActorByChannelId(uint16 channelId
);
57 virtual IActor
* CreateActor(uint16 channelId
, const char* name
, const char* actorClass
, const Vec3
& pos
, const Quat
& rot
, const Vec3
& scale
, EntityId id
);
59 virtual int GetActorCount() const { return (int)m_actors
.size(); };
60 virtual IActorIteratorPtr
CreateActorIterator();
62 virtual void SetDemoPlaybackMappedOriginalServerPlayer(EntityId id
);
63 virtual EntityId
GetDemoPlaybackMappedOriginalServerPlayer() const;
64 virtual void SwitchDemoSpectator(EntityId id
= 0);
65 virtual IActor
* GetCurrentDemoSpectator();
66 virtual IActor
* GetOriginalDemoSpectator();
68 virtual void Scan(const char* folderName
);
69 virtual const IItemParamsNode
* GetActorParams(const char* actorClass
) const;
71 virtual bool IsActorClass(IEntityClass
* pClass
) const;
76 virtual bool OnBeforeSpawn(SEntitySpawnParams
& params
);
77 virtual void OnSpawn(IEntity
* pEntity
, SEntitySpawnParams
& params
);
78 virtual bool OnRemove(IEntity
* pEntity
);
79 virtual void OnReused(IEntity
* pEntity
, SEntitySpawnParams
& params
);
80 virtual void GetMemoryUsage(class ICrySizer
* pSizer
) const;
83 void RegisterActorClass(const char* name
, IGameFramework::IActorCreator
*, bool isAI
);
84 void AddActor(EntityId entityId
, IActor
* pProxy
);
85 void RemoveActor(EntityId entityId
);
87 void GetMemoryStatistics(ICrySizer
* s
);
89 virtual bool ScanXML(const XmlNodeRef
& root
, const char* xmlFile
);
93 // static IEntityComponent *CreateActor(IEntity *pEntity, SEntitySpawnParams ¶ms, void *pUserData);
94 static bool HookCreateActor(IEntity
*, IGameObject
*, void*);
96 static void ActorSystemErrorMessage(const char* fileName
, const char* errorInfo
, bool displayErrorDialog
);
100 SSpawnUserData(const char* cls
, uint16 channel
) : className(cls
), channelId(channel
) {}
101 const char* className
;
105 struct SActorUserData
107 SActorUserData(const char* cls
, CActorSystem
* pNewActorSystem
) : className(cls
), pActorSystem(pNewActorSystem
) {};
108 CActorSystem
* pActorSystem
;
112 struct SActorClassDesc
114 IEntityClass
* pEntityClass
;
115 IGameFramework::IActorCreator
* pCreator
;
117 SActorClassDesc() : pEntityClass(), pCreator() {}
120 class CActorIterator
: public IActorIterator
123 CActorIterator(CActorSystem
* pAS
)
126 m_cur
= m_pAS
->m_actors
.begin();
137 assert(std::find(m_pAS
->m_iteratorPool
.begin(),
138 m_pAS
->m_iteratorPool
.end(), this) == m_pAS
->m_iteratorPool
.end());
139 // Call my own destructor before I push to the pool - avoids tripping up the STLP debugging {2008/12/09})
140 this->~CActorIterator();
141 m_pAS
->m_iteratorPool
.push_back(this);
146 if (m_cur
== m_pAS
->m_actors
.end())
148 IActor
* pActor
= m_cur
->second
;
154 return m_pAS
->m_actors
.size();
157 TActorMap::iterator m_cur
;
161 typedef struct SActorParamsDesc
163 SActorParamsDesc() : params(0) {};
170 CItemParamsNode
* params
;
174 typedef std::map
<string
, SActorClassDesc
> TActorClassMap
;
175 typedef std::map
<string
, SItemParamsDesc
> TActorParamsMap
;
178 IEntitySystem
* m_pEntitySystem
;
181 TActorClassMap m_classes
;
183 std::vector
<CActorIterator
*> m_iteratorPool
;
185 TActorParamsMap m_actorParams
;
186 string m_actorParamsFolder
;
189 #endif //__ACTORSYSTEM_H__