Fix fixgridatmos command (#27113)
This commit is contained in:
@@ -3,6 +3,7 @@ using Content.Server.Administration;
|
||||
using Content.Server.Atmos.Components;
|
||||
using Content.Shared.Administration;
|
||||
using Content.Shared.Atmos;
|
||||
using Content.Shared.Atmos.Components;
|
||||
using Robust.Shared.Console;
|
||||
using Robust.Shared.Map;
|
||||
using Robust.Shared.Map.Components;
|
||||
@@ -84,44 +85,72 @@ public sealed partial class AtmosphereSystem
|
||||
continue;
|
||||
}
|
||||
|
||||
var transform = Transform(euid.Value);
|
||||
// Force Invalidate & update air on all tiles
|
||||
Entity<GridAtmosphereComponent, GasTileOverlayComponent, MapGridComponent, TransformComponent> grid =
|
||||
new(euid.Value, gridAtmosphere, Comp<GasTileOverlayComponent>(euid.Value), gridComp, Transform(euid.Value));
|
||||
|
||||
foreach (var (indices, tileMain) in gridAtmosphere.Tiles)
|
||||
RebuildGridTiles(grid);
|
||||
|
||||
var query = GetEntityQuery<AtmosFixMarkerComponent>();
|
||||
foreach (var (indices, tile) in gridAtmosphere.Tiles.ToArray())
|
||||
{
|
||||
var tile = tileMain.Air;
|
||||
if (tile == null)
|
||||
if (tile.Air is not {Immutable: false} air)
|
||||
continue;
|
||||
|
||||
if (!_mapSystem.TryGetTile(gridComp, indices, out var gTile) || gTile.IsEmpty)
|
||||
{
|
||||
gridAtmosphere.Tiles.Remove(indices);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (tile.Immutable && !IsTileSpace(euid, transform.MapUid, indices))
|
||||
{
|
||||
tile = new GasMixture(tile.Volume) { Temperature = tile.Temperature };
|
||||
tileMain.Air = tile;
|
||||
}
|
||||
|
||||
tile.Clear();
|
||||
air.Clear();
|
||||
var mixtureId = 0;
|
||||
foreach (var entUid in gridComp.GetAnchoredEntities(indices))
|
||||
var enumerator = _mapSystem.GetAnchoredEntitiesEnumerator(grid, grid, indices);
|
||||
while (enumerator.MoveNext(out var entUid))
|
||||
{
|
||||
if (!TryComp(entUid, out AtmosFixMarkerComponent? afm))
|
||||
continue;
|
||||
mixtureId = afm.Mode;
|
||||
break;
|
||||
if (query.TryComp(entUid, out var marker))
|
||||
mixtureId = marker.Mode;
|
||||
}
|
||||
var mixture = mixtures[mixtureId];
|
||||
Merge(tile, mixture);
|
||||
tile.Temperature = mixture.Temperature;
|
||||
|
||||
gridAtmosphere.InvalidatedCoords.Add(indices);
|
||||
var mixture = mixtures[mixtureId];
|
||||
Merge(air, mixture);
|
||||
air.Temperature = mixture.Temperature;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Clears & re-creates all references to <see cref="TileAtmosphere"/>s stored on a grid.
|
||||
/// </summary>
|
||||
private void RebuildGridTiles(
|
||||
Entity<GridAtmosphereComponent, GasTileOverlayComponent, MapGridComponent, TransformComponent> ent)
|
||||
{
|
||||
foreach (var indices in ent.Comp1.Tiles.Keys)
|
||||
{
|
||||
InvalidateVisuals((ent, ent), indices);
|
||||
}
|
||||
|
||||
var atmos = ent.Comp1;
|
||||
atmos.MapTiles.Clear();
|
||||
atmos.ActiveTiles.Clear();
|
||||
atmos.ExcitedGroups.Clear();
|
||||
atmos.HotspotTiles.Clear();
|
||||
atmos.SuperconductivityTiles.Clear();
|
||||
atmos.HighPressureDelta.Clear();
|
||||
atmos.CurrentRunTiles.Clear();
|
||||
atmos.CurrentRunExcitedGroups.Clear();
|
||||
atmos.InvalidatedCoords.Clear();
|
||||
atmos.CurrentRunInvalidatedTiles.Clear();
|
||||
atmos.PossiblyDisconnectedTiles.Clear();
|
||||
atmos.Tiles.Clear();
|
||||
|
||||
var volume = GetVolumeForTiles(ent);
|
||||
TryComp(ent.Comp4.MapUid, out MapAtmosphereComponent? mapAtmos);
|
||||
|
||||
var enumerator = _map.GetAllTilesEnumerator(ent, ent);
|
||||
while (enumerator.MoveNext(out var tileRef))
|
||||
{
|
||||
var tile = GetOrNewTile(ent, ent, tileRef.Value.GridIndices);
|
||||
UpdateTileData(ent, mapAtmos, tile);
|
||||
UpdateAdjacentTiles(ent, tile, activate: true);
|
||||
UpdateTileAir(ent, tile, volume);
|
||||
}
|
||||
}
|
||||
|
||||
private CompletionResult FixGridAtmosCommandCompletions(IConsoleShell shell, string[] args)
|
||||
{
|
||||
MapId? playerMap = null;
|
||||
|
||||
Reference in New Issue
Block a user