using System; using System.Globalization; using System.Linq; using Robust.Shared.GameObjects; using Robust.Shared.Log; namespace Robust.Shared.Map { internal partial class MapManager { /// public void SetMapPaused(MapId mapId, bool paused) { if(mapId == MapId.Nullspace) return; if(!MapExists(mapId)) throw new ArgumentException("That map does not exist."); if (paused) { SetMapPause(mapId); } else { ClearMapPause(mapId); } var mapEnt = GetMapEntityId(mapId); var xformQuery = EntityManager.GetEntityQuery(); var metaQuery = EntityManager.GetEntityQuery(); RecursiveSetPaused(mapEnt, paused, in xformQuery, in metaQuery); } private static void RecursiveSetPaused(EntityUid entity, bool paused, in EntityQuery xformQuery, in EntityQuery metaQuery) { metaQuery.GetComponent(entity).EntityPaused = paused; foreach (var child in xformQuery.GetComponent(entity)._children) { RecursiveSetPaused(child, paused, in xformQuery, in metaQuery); } } /// public void DoMapInitialize(MapId mapId) { if(!MapExists(mapId)) throw new ArgumentException("That map does not exist."); if (IsMapInitialized(mapId)) throw new ArgumentException("That map is already initialized."); ClearMapPreInit(mapId); var mapEnt = GetMapEntityId(mapId); var xformQuery = EntityManager.GetEntityQuery(); var metaQuery = EntityManager.GetEntityQuery(); RecursiveDoMapInit(mapEnt, in xformQuery, in metaQuery); } private static void RecursiveDoMapInit(EntityUid entity, in EntityQuery xformQuery, in EntityQuery metaQuery) { // RunMapInit can modify the TransformTree // ToArray caches deleted euids, we check here if they still exist. if(!metaQuery.TryGetComponent(entity, out var meta)) return; entity.RunMapInit(); meta.EntityPaused = false; foreach (var child in xformQuery.GetComponent(entity)._children.ToArray()) { RecursiveDoMapInit(child, in xformQuery, in metaQuery); } } /// public void DoGridMapInitialize(IMapGrid grid) { // NOP } /// public void DoGridMapInitialize(GridId gridId) { // NOP } /// public void AddUninitializedMap(MapId mapId) { SetMapPreInit(mapId); } private void SetMapPause(MapId mapId) { if(mapId == MapId.Nullspace) return; var mapEuid = GetMapEntityId(mapId); var mapComp = EntityManager.GetComponent(mapEuid); mapComp.MapPaused = true; } private bool CheckMapPause(MapId mapId) { if(mapId == MapId.Nullspace) return false; var mapEuid = GetMapEntityId(mapId); if (mapEuid == EntityUid.Invalid) return false; var mapComp = EntityManager.GetComponent(mapEuid); return mapComp.MapPaused; } private void ClearMapPause(MapId mapId) { if(mapId == MapId.Nullspace) return; var mapEuid = GetMapEntityId(mapId); var mapComp = EntityManager.GetComponent(mapEuid); mapComp.MapPaused = false; } private void SetMapPreInit(MapId mapId) { if(mapId == MapId.Nullspace) return; var mapEuid = GetMapEntityId(mapId); var mapComp = EntityManager.GetComponent(mapEuid); mapComp.MapPreInit = true; } private bool CheckMapPreInit(MapId mapId) { if(mapId == MapId.Nullspace) return false; var mapEuid = GetMapEntityId(mapId); if (mapEuid == EntityUid.Invalid) return false; var mapComp = EntityManager.GetComponent(mapEuid); return mapComp.MapPreInit; } private void ClearMapPreInit(MapId mapId) { if(mapId == MapId.Nullspace) return; var mapEuid = GetMapEntityId(mapId); var mapComp = EntityManager.GetComponent(mapEuid); mapComp.MapPreInit = false; } /// public bool IsMapPaused(MapId mapId) { return CheckMapPause(mapId) || CheckMapPreInit(mapId); } /// public bool IsGridPaused(IMapGrid grid) { return IsMapPaused(grid.ParentMapId); } /// public bool IsGridPaused(GridId gridId) { if (TryGetGrid(gridId, out var grid)) { return IsGridPaused(grid); } Logger.ErrorS("map", $"Tried to check if unknown grid {gridId} was paused."); return true; } /// public bool IsMapInitialized(MapId mapId) { return !CheckMapPreInit(mapId); } /// /// Initializes the map pausing system. /// private void InitializeMapPausing() { _conhost.RegisterCommand("pausemap", "Pauses a map, pausing all simulation processing on it.", "pausemap ", (shell, _, args) => { if (args.Length != 1) { shell.WriteError("Need to supply a valid MapId"); return; } var mapId = new MapId(int.Parse(args[0], CultureInfo.InvariantCulture)); if (!MapExists(mapId)) { shell.WriteError("That map does not exist."); return; } SetMapPaused(mapId, true); }); _conhost.RegisterCommand("querymappaused", "Check whether a map is paused or not.", "querymappaused ", (shell, _, args) => { var mapId = new MapId(int.Parse(args[0], CultureInfo.InvariantCulture)); if (!MapExists(mapId)) { shell.WriteError("That map does not exist."); return; } shell.WriteLine(IsMapPaused(mapId).ToString()); }); _conhost.RegisterCommand("unpausemap", "unpauses a map, resuming all simulation processing on it.", "Usage: unpausemap ", (shell, _, args) => { if (args.Length != 1) { shell.WriteLine("Need to supply a valid MapId"); return; } var mapId = new MapId(int.Parse(args[0], CultureInfo.InvariantCulture)); if (!MapExists(mapId)) { shell.WriteLine("That map does not exist."); return; } SetMapPaused(mapId, false); }); } } }