14 private ref array<ref SCR_EditorModePrefab> m_ModePrefabs;
16 [
Attribute(
"300",
desc:
"When player disconnects, editor modes will be restored if the player reconnects with this timeout (in seconds).")]
23 private ref SCR_SortedArray<SCR_EditorModePrefab> m_ModePrefabsSorted =
new SCR_SortedArray<SCR_EditorModePrefab>;
24 private ref array<ref SCR_EditorManagerDisconnectData> m_DisconnectedModes;
49 if (
RplSession.Mode() ==
RplMode.Client || (m_SettingsEntity && m_SettingsEntity.IsEditorDisabled()))
52 if (m_aEditorEntities && m_aEditorEntities.Contains(playerID))
54 Debug.Error2(
"SCR_EditorManagerCore.CreateEditorManager()",
string.Format(
"Attempt for duplicate registration of editor manager for playerID = %1!", playerID));
58 PlayerController playerController =
GetGame().GetPlayerManager().GetPlayerController(playerID);
59 if (!playerController)
61 Debug.Error2(
"SCR_EditorManagerCore.CreateEditorManager()",
string.Format(
"Cannot create editor manager entity, PlayerController for playerID = %1 does not exist yet!", playerID));
66 RplIdentity playerRplID = playerController.GetRplIdentity();
69 for (
int i = 0; i < m_aEditorEntities.Count(); i++)
71 PlayerController compareController =
GetGame().GetPlayerManager().GetPlayerController(m_aEditorEntities.GetKey(i));
72 if (compareController && compareController.GetRplIdentity() == playerRplID)
74 Debug.Error2(
"SCR_EditorManagerCore.CreateEditorManager()",
string.Format(
"Cannot register editor manager for playerID = %1 because manager for playerID = %2 is already registered on the same machine!", playerID, m_aEditorEntities.GetKey(i)));
82 prefab = m_SettingsEntity.GetPrefab(m_EditorManagerPrefab);
87 Debug.Error2(
"SCR_EditorManagerCore.CreateEditorManager()",
string.Format(
"Prefab %1 is not SCR_EditorManagerEntity!", prefab.GetPath()));
95 RplComponent rpl = RplComponent.Cast(editorManager.FindComponent(RplComponent));
98 Debug.Error2(
"SCR_EditorManagerCore.CreateEditorManager()",
string.Format(
"Prefab %1 is missing RplComponent component!", prefab.GetPath()));
102 rpl.Give(playerRplID);
104 m_aEditorEntities.Insert(playerID, editorManager);
107 editorManager.InitServer(playerID);
108 Event_OnEditorManagerCreatedServer.Invoke(editorManager);
112 array<EPlayerRole> allRoles = {};
115 if (
GetGame().GetPlayerManager().HasPlayerRole(playerID, allRoles[i]))
116 playerRoles |= allRoles[i];
124 if (m_DisconnectedModes)
128 for (
int i = m_DisconnectedModes.Count() - 1; i >= 0; i--)
133 m_DisconnectedModes.Remove(i);
135 else if (m_DisconnectedModes[i].
m_iPlayerID == playerID)
138 modes = m_DisconnectedModes[i].m_Modes;
139 m_DisconnectedModes.Remove(i);
142 if (m_DisconnectedModes.IsEmpty())
143 m_DisconnectedModes = null;
149 editorManager.PostInitServer();
151 return editorManager;
160 if (m_aEditorEntities.Contains(playerID))
165 if (!m_DisconnectedModes)
166 m_DisconnectedModes = {};
175 SCR_Enum.HasFlag(modes, prefab.GetMode())
180 persistentModes |= prefab.GetMode();
184 if (persistentModes != 0)
187 m_aEditorEntities.Remove(playerID);
188 Event_OnEditorManagerDeletedServer.Invoke(editorManager);
189 editorManager.DeleteAllEditors();
190 delete editorManager;
199 outEditorEntities.Clear();
200 if (m_aEditorEntities)
202 for (
int i = 0; i < m_aEditorEntities.Count(); i++)
206 outEditorEntities.Insert(editorManager);
209 return outEditorEntities.Count();
219 Print(
"Attempting to define multiple instances of SCR_EditorManagerEntity!",
LogLevel.ERROR);
222 m_EditorManager = entity;
231 return m_EditorManager;
240 if (m_aEditorEntities && m_aEditorEntities.Contains(playerID))
241 return m_aEditorEntities.Get(playerID);
253 Debug.Error2(
"SCR_EditorManagerCore.GetEditorServer()",
"Editor server entity is available only on server!");
256 return m_ServerEntity;
265 if (m_SettingsEntity)
268 m_SettingsEntity = entity;
276 return m_SettingsEntity;
285 array<SCR_EditorModePrefab> prefabs = {};
289 if (modePrefab.GetMode() == modeType)
303 array<SCR_EditorModePrefab> prefabs = {};
306 modes |= prefabs[i].GetMode();
319 bool isOverride = !coreOnly && m_SettingsEntity && m_SettingsEntity.GetBaseModes(defaultModes);
321 int count = m_ModePrefabs.Count();
327 if (
SCR_Enum.HasFlag(defaultModes, prefab.GetMode()))
328 outPrefabs.Insert(prefab);
334 outPrefabs.Insert(prefab);
337 return outPrefabs.Count();
348 bool isOverride = !coreOnly && m_SettingsEntity && m_SettingsEntity.GetBaseModes(defaultModes);
351 int count = m_ModePrefabsSorted.Count();
352 for (
int i; i < count; i++)
354 prefab = m_ModePrefabsSorted[i];
360 outPrefabs.Insert(m_ModePrefabsSorted.GetOrder(i), prefab);
363 return outPrefabs.Count();
374 if (modeEntity.GetMode() == modeType)
375 return modeEntity.GetInfo();
391 IEntity controlledEntity =
GetGame().GetPlayerManager().GetPlayerControlledEntity(playerID);
392 if (controlledEntity)
411 editorManager.AutoInit();
454 void OnPlayFromCameraPos()
460 PlayerController playerController =
GetGame().GetPlayerController();
461 if (playerController)
463 int playerID = playerController.GetPlayerId();
470 GetGame().GetCallqueue().CallLater(OnPlayFromCameraPos, 1);
490 if (!m_SettingsEntity)
498 if (m_aEditorEntities)
518 PlayerController controller =
GetGame().GetPlayerController();
519 if (controller && controller.GetPlayerId() > 0)
535 m_EditorManager = null;
536 m_aEditorEntities = null;
549 m_ModePrefabsSorted.Insert(prefabData.GetInfo().GetOrder(), prefabData);
559 Event_OnEditorManagerCreatedServer = null;
560 Event_OnEditorManagerDeletedServer = null;
561 Event_OnEditorManagerInitOwner = null;
578 m_Time = world.GetServerTimestamp();
SCR_EAIThreatSectorFlags flags
ArmaReforgerScripted GetGame()
RplMode
Mode of replication.
SCR_AIAnimation_Loitering BaseContainerProps
Commanding menu commanding element class.
SCR_BaseGameMode GetGameMode()
IEntity SpawnEntity(ResourceName entityResourceName, notnull IEntity slotOwner)
void SCR_EditorManagerDisconnectData(int playerID, EEditorMode modes)
void SCR_EditorManagerEntity(IEntitySource src, IEntity parent)
UI Textures DeployMenu Briefing conflict_HintBanner_1_UI desc
Object holding reference to resource. In destructor release the resource.
Replication connection identity.
ScriptInvokerBase< SCR_BaseGameMode_OnPlayerDisconnected > GetOnPostCompPlayerDisconnected()
ScriptInvokerBase< SCR_BaseGameMode_PlayerIdAndEntity > GetOnPlayerSpawned()
ScriptInvokerBase< SCR_BaseGameMode_PlayerIdAndEntity > GetOnPlayerDeleted()
ScriptInvokerBase< SCR_BaseGameMode_OnControllableDestroyed > GetOnPlayerKilled()
ScriptInvokerBase< SCR_BaseGameMode_PlayerId > GetOnPlayerRegistered()
ScriptInvokerBase< SCR_BaseGameMode_OnPlayerRoleChanged > GetOnPlayerRoleChange()
SCR_EditorSettingsEntity GetSettingsEntity()
int GetEditorEntities(out notnull array< SCR_EditorManagerEntity > outEditorEntities)
void SetSettingsEntity(SCR_EditorSettingsEntity entity)
EEditorMode GetBaseModes(EEditorModeFlag flags=-1, bool coreOnly=false)
void OnPlayerSpawn(int playerID, IEntity controlledEntity)
bool SetEditorManager(SCR_EditorManagerEntity entity)
SCR_EditorManagerEntity CreateEditorManager(int playerID)
SCR_EditorModePrefab GetBaseModePrefab(EEditorMode modeType)
SCR_EditorManagerEntity GetEditorManager(int playerID)
SCR_EditorModeUIInfo GetDefaultModeInfo(EEditorMode modeType)
int GetBaseModePrefabs(out notnull SCR_SortedArray< SCR_EditorModePrefab > outPrefabs, EEditorModeFlag flags=-1, bool coreOnly=false)
SCR_EditorManagerEntity GetEditorManager()
void OnPlayerDeleted(int playerID, IEntity player)
void OnPlayerDisconnected(int playerID)
void ~SCR_EditorManagerCore()
void DeleteEditorManager(int playerID)
void OnPlayerRegistered(int playerID)
int GetBaseModePrefabs(out notnull array< SCR_EditorModePrefab > outPrefabs, EEditorModeFlag flags=-1, bool coreOnly=false)
void OnPlayerRoleChange(int playerId, EPlayerRole roleFlags)
override void OnGameEnd()
override void OnGameStart()
int m_iRestoreOnReconnectTimeout
SCR_EditorServerEntity GetEditorServer()
void SCR_EditorManagerCore()
void OnPlayerKilled(notnull SCR_InstigatorContextData instigatorContextData)
EEditorModeFlag GetFlags()
void SetBaseModes(EEditorMode modes, bool validate=true)
static bool IsAdmin(int playerID)
static bool IsAdminRole(EPlayerRole role)
static int GetLocalPlayerId()
Returns either a valid ID of local player or 0.
proto void Print(void var, LogLevel level=LogLevel.NORMAL)
Prints content of variable to console/log.
LogLevel
Enum with severity of the logging message.
SCR_FieldOfViewSettings Attribute
EEditorMode
Editor mode that defines overall functionality.
EEditorCanOpen
Layers allowing editor to be opened. All of them have to be activated (certain exceptions may apply w...
SCR_EditorManagerCore m_iPlayerID