Fix grid chunk double subscription (#3526)

This commit is contained in:
Leon Friedrich
2022-11-24 15:38:09 +13:00
committed by GitHub
parent 03363296db
commit 78bea7312e
6 changed files with 18 additions and 11 deletions

View File

@@ -625,7 +625,7 @@ namespace Robust.Client.Console.Commands
}
var chunkIndex = grid.LocalToChunkIndices(grid.MapToGrid(mousePos));
var chunk = grid.GetChunk(chunkIndex);
var chunk = grid.GetOrAddChunk(chunkIndex);
shell.WriteLine($"worldBounds: {grid.CalcWorldAABB(chunk)} localBounds: {chunk.CachedBounds}");
}

View File

@@ -622,7 +622,7 @@ public sealed class MapLoaderSystem : EntitySystem
foreach (var chunkNode in yamlGridChunks.Cast<MappingDataNode>())
{
var (chunkOffsetX, chunkOffsetY) = _serManager.Read<Vector2i>(chunkNode["ind"]);
var chunk = grid.GetChunk(chunkOffsetX, chunkOffsetY);
var chunk = grid.GetOrAddChunk(chunkOffsetX, chunkOffsetY);
_serManager.Read(chunkNode, _context, value: chunk);
}
}

View File

@@ -40,7 +40,7 @@ namespace Robust.Shared.GameObjects
EntityUid Owner { get; }
/// <summary>
/// Component has been properly initialized.
/// Component has been (or is currently being) initialized.
/// </summary>
bool Initialized { get; }

View File

@@ -93,7 +93,7 @@ namespace Robust.Shared.Map.Components
if (chunkData.IsDeleted())
continue;
var chunk = gridComp.GetChunk(chunkData.Index);
var chunk = gridComp.GetOrAddChunk(chunkData.Index);
chunk.SuppressCollisionRegeneration = true;
DebugTools.Assert(chunkData.TileData.Length == gridComp.ChunkSize * gridComp.ChunkSize);
@@ -123,7 +123,7 @@ namespace Robust.Shared.Map.Components
continue;
}
var chunk = gridComp.GetChunk(chunkData.Index);
var chunk = gridComp.GetOrAddChunk(chunkData.Index);
chunk.SuppressCollisionRegeneration = false;
gridComp.RegenerateCollision(chunk);
}
@@ -428,9 +428,9 @@ namespace Robust.Shared.Map.Components
public int ChunkCount => Chunks.Count;
/// <inheritdoc />
internal MapChunk GetChunk(int xIndex, int yIndex)
internal MapChunk GetOrAddChunk(int xIndex, int yIndex)
{
return GetChunk(new Vector2i(xIndex, yIndex));
return GetOrAddChunk(new Vector2i(xIndex, yIndex));
}
internal bool TryGetChunk(Vector2i chunkIndices, [NotNullWhen(true)] out MapChunk? chunk)
@@ -439,14 +439,17 @@ namespace Robust.Shared.Map.Components
}
/// <inheritdoc />
internal MapChunk GetChunk(Vector2i chunkIndices)
internal MapChunk GetOrAddChunk(Vector2i chunkIndices)
{
if (Chunks.TryGetValue(chunkIndices, out var output))
return output;
var newChunk = new MapChunk(chunkIndices.X, chunkIndices.Y, ChunkSize);
newChunk.LastTileModifiedTick = _mapManager.GameTiming.CurTick;
newChunk.TileModified += OnTileModified;
if (Initialized)
newChunk.TileModified += OnTileModified;
return Chunks[chunkIndices] = newChunk;
}
@@ -644,7 +647,7 @@ namespace Robust.Shared.Map.Components
private (MapChunk, Vector2i) ChunkAndOffsetForTile(Vector2i pos)
{
var gridChunkIndices = GridTileToChunkIndices(pos);
var chunk = GetChunk(gridChunkIndices);
var chunk = GetOrAddChunk(gridChunkIndices);
var chunkTile = chunk.GridTileToChunkTile(pos);
return (chunk, chunkTile);
}

View File

@@ -155,6 +155,10 @@ namespace Robust.Shared.Map
_tiles[xIndex, yIndex] = tile;
var tileIndices = new Vector2i(xIndex, yIndex);
// God I hate C# events sometimes.
DebugTools.Assert(TileModified == null || TileModified.GetInvocationList().Length <= 1);
TileModified?.Invoke(this, tileIndices, tile, oldTile, shapeChanged);
}

View File

@@ -185,7 +185,7 @@ internal partial class MapManager
if (!iGrid.HasChunk(chunkIndices)) return true;
var chunk = iGrid.GetChunk(chunkIndices);
var chunk = iGrid.GetOrAddChunk(chunkIndices);
Vector2i indices = chunk.GridTileToChunkTile(tile);
var chunkTile = chunk.GetTile((ushort)indices.X, (ushort)indices.Y);