diff --git a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Processing.cs b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Processing.cs index 09affe2e5c..ad0d409a4b 100644 --- a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Processing.cs +++ b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Processing.cs @@ -455,9 +455,7 @@ namespace Content.Server.Atmos.EntitySystems || TerminatingOrDeleted(x.MapUid.Value) || x.MapID == MapId.Nullspace) { - Log.Error($"Attempting to process atmos without a map? Entity: {ToPrettyString(owner)}"); - _simulationPaused = false; - _currentRunAtmosphere.Clear(); + Log.Error($"Attempted to process atmos without a map? Entity: {ToPrettyString(owner)}. Map: {ToPrettyString(x?.MapUid)}. MapId: {x?.MapID}"); continue; } diff --git a/Content.Server/GameTicking/Rules/NukeopsRuleSystem.cs b/Content.Server/GameTicking/Rules/NukeopsRuleSystem.cs index c1773b3140..dd5c61a229 100644 --- a/Content.Server/GameTicking/Rules/NukeopsRuleSystem.cs +++ b/Content.Server/GameTicking/Rules/NukeopsRuleSystem.cs @@ -383,7 +383,7 @@ public sealed class NukeopsRuleSystem : GameRuleSystem continue; // UH OH - if (centcomms.Contains(nukeTransform.MapID)) + if (nukeTransform.MapUid != null && centcomms.Contains(nukeTransform.MapUid.Value)) { component.WinConditions.Add(WinCondition.NukeActiveAtCentCom); SetWinType(uid, WinType.OpsMajor, component); @@ -447,8 +447,7 @@ public sealed class NukeopsRuleSystem : GameRuleSystem while (diskQuery.MoveNext(out _, out var transform)) { - var diskMapId = transform.MapID; - diskAtCentCom = centcomms.Contains(diskMapId); + diskAtCentCom = transform.MapUid != null && centcomms.Contains(transform.MapUid.Value); // TODO: The target station should be stored, and the nuke disk should store its original station. // This is fine for now, because we can assume a single station in base SS14. diff --git a/Content.Server/Shuttles/Components/StationCentcommComponent.cs b/Content.Server/Shuttles/Components/StationCentcommComponent.cs index 43b35ebc50..4ea7d313a1 100644 --- a/Content.Server/Shuttles/Components/StationCentcommComponent.cs +++ b/Content.Server/Shuttles/Components/StationCentcommComponent.cs @@ -12,17 +12,18 @@ public sealed partial class StationCentcommComponent : Component /// /// Crude shuttle offset spawning. /// - [DataField("shuttleIndex")] + [DataField] public float ShuttleIndex; - [DataField("map")] + [DataField] public ResPath Map = new("/Maps/centcomm.yml"); /// /// Centcomm entity that was loaded. /// - [DataField("entity")] - public EntityUid Entity = EntityUid.Invalid; + [DataField] + public EntityUid? Entity; - public MapId MapId = MapId.Nullspace; + [DataField] + public EntityUid? MapEntity; } diff --git a/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.Console.cs b/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.Console.cs index 62478082d8..b1f2758fe4 100644 --- a/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.Console.cs +++ b/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.Console.cs @@ -166,19 +166,20 @@ public sealed partial class EmergencyShuttleSystem continue; } - if (Deleted(centcomm.Entity)) + if (!Deleted(centcomm.Entity)) + { + _shuttle.FTLTravel(comp.EmergencyShuttle.Value, shuttle, + centcomm.Entity.Value, _consoleAccumulator, TransitTime, true); + continue; + } + + if (!Deleted(centcomm.MapEntity)) { // TODO: Need to get non-overlapping positions. _shuttle.FTLTravel(comp.EmergencyShuttle.Value, shuttle, - new EntityCoordinates( - _mapManager.GetMapEntityId(centcomm.MapId), + new EntityCoordinates(centcomm.MapEntity.Value, _random.NextVector2(1000f)), _consoleAccumulator, TransitTime); } - else - { - _shuttle.FTLTravel(comp.EmergencyShuttle.Value, shuttle, - centcomm.Entity, _consoleAccumulator, TransitTime, true); - } } var podQuery = AllEntityQuery(); @@ -205,7 +206,7 @@ public sealed partial class EmergencyShuttleSystem } // Don't dock them. If you do end up doing this then stagger launch. - _shuttle.FTLTravel(uid, shuttle, centcomm.Entity, hyperspaceTime: TransitTime); + _shuttle.FTLTravel(uid, shuttle, centcomm.Entity.Value, hyperspaceTime: TransitTime); RemCompDeferred(uid); } @@ -229,7 +230,7 @@ public sealed partial class EmergencyShuttleSystem if (Deleted(comp.Entity)) continue; - _shuttle.AddFTLDestination(comp.Entity, true); + _shuttle.AddFTLDestination(comp.Entity.Value, true); } } } diff --git a/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.cs b/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.cs index 0f2b8b847c..a0b9c9599c 100644 --- a/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.cs +++ b/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.cs @@ -20,8 +20,6 @@ using Content.Shared.Tag; using Content.Shared.Tiles; using Robust.Server.GameObjects; using Robust.Server.Maps; -using Robust.Server.Player; -using Robust.Shared.Audio; using Robust.Shared.Audio.Systems; using Robust.Shared.Configuration; using Robust.Shared.Map; @@ -88,14 +86,16 @@ public sealed partial class EmergencyShuttleSystem : EntitySystem } private void OnCentcommShutdown(EntityUid uid, StationCentcommComponent component, ComponentShutdown args) + { + ClearCentcomm(component); + } + + private void ClearCentcomm(StationCentcommComponent component) { QueueDel(component.Entity); - component.Entity = EntityUid.Invalid; - - if (_mapManager.MapExists(component.MapId)) - _mapManager.DeleteMap(component.MapId); - - component.MapId = MapId.Nullspace; + QueueDel(component.MapEntity); + component.Entity = null; + component.MapEntity = null; } private void SetEmergencyShuttleEnabled(bool value) @@ -232,7 +232,7 @@ public sealed partial class EmergencyShuttleSystem : EntitySystem // Post mapinit? fancy if (TryComp(component.Entity, out var xform)) { - component.MapId = xform.MapID; + component.MapEntity = xform.MapUid; return; } @@ -293,46 +293,78 @@ public sealed partial class EmergencyShuttleSystem : EntitySystem private void AddCentcomm(StationCentcommComponent component) { + if (component.MapEntity != null || component.Entity != null) + { + _sawmill.Warning("Attempted to re-add an existing centcomm map."); + return; + } + // Check for existing centcomms and just point to that var query = AllEntityQuery(); - while (query.MoveNext(out var otherComp)) { if (otherComp == component) continue; - component.MapId = otherComp.MapId; + if (!Exists(otherComp.MapEntity) || !Exists(otherComp.Entity)) + { + Log.Error($"Disconvered invalid centcomm component?"); + ClearCentcomm(otherComp); + continue; + } + + component.MapEntity = otherComp.MapEntity; component.ShuttleIndex = otherComp.ShuttleIndex; return; } - var mapId = _mapManager.CreateMap(); - component.MapId = mapId; - - if (!string.IsNullOrEmpty(component.Map.ToString())) - { - var ent = _map.LoadGrid(mapId, component.Map.ToString()); - - if (ent != null) - { - component.Entity = ent.Value; - _shuttle.AddFTLDestination(ent.Value, false); - } - } - else + if (string.IsNullOrEmpty(component.Map.ToString())) { _sawmill.Warning("No CentComm map found, skipping setup."); + return; } + + var mapId = _mapManager.CreateMap(); + var grid = _map.LoadGrid(mapId, component.Map.ToString()); + var map = _mapManager.GetMapEntityId(mapId); + + if (!Exists(map)) + { + Log.Error($"Failed to set up centcomm map!"); + QueueDel(grid); + return; + } + + if (!Exists(grid)) + { + Log.Error($"Failed to set up centcomm grid!"); + QueueDel(map); + return; + } + + var xform = Transform(grid.Value); + if (xform.ParentUid != map || xform.MapUid != map) + { + Log.Error($"Centcomm grid is not parented to its own map?"); + QueueDel(map); + QueueDel(grid); + return; + } + + component.MapEntity = map; + component.Entity = grid; + _shuttle.AddFTLDestination(grid.Value, false); } - public HashSet GetCentcommMaps() + public HashSet GetCentcommMaps() { var query = AllEntityQuery(); - var maps = new HashSet(Count()); + var maps = new HashSet(Count()); while (query.MoveNext(out var comp)) { - maps.Add(comp.MapId); + if (comp.MapEntity != null) + maps.Add(comp.MapEntity.Value); } return maps; @@ -342,14 +374,15 @@ public sealed partial class EmergencyShuttleSystem : EntitySystem { if (!_emergencyShuttleEnabled || component.EmergencyShuttle != null || - !TryComp(uid, out var centcomm)) + !TryComp(uid, out var centcomm) + || !TryComp(centcomm.MapEntity, out MapComponent? map)) { return; } // Load escape shuttle var shuttlePath = component.EmergencyShuttlePath; - var shuttle = _map.LoadGrid(centcomm.MapId, shuttlePath.ToString(), new MapLoadOptions() + var shuttle = _map.LoadGrid(map.MapId, shuttlePath.ToString(), new MapLoadOptions() { // Should be far enough... right? I'm too lazy to bounds check CentCom rn. Offset = new Vector2(500f + centcomm.ShuttleIndex, 0f) @@ -368,7 +401,7 @@ public sealed partial class EmergencyShuttleSystem : EntitySystem while (query.MoveNext(out var comp)) { - if (comp == centcomm || comp.MapId != centcomm.MapId) + if (comp == centcomm || comp.MapEntity != centcomm.MapEntity) continue; comp.ShuttleIndex = centcomm.ShuttleIndex;