mirror of
https://github.com/space-wizards/RobustToolbox.git
synced 2026-02-14 19:29:36 +01:00
Fix grid chunk double subscription (#3526)
This commit is contained in:
@@ -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}");
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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; }
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user