Fix disappearing decals bug (#9608)

This commit is contained in:
Leon Friedrich
2022-07-15 14:33:11 +12:00
committed by GitHub
parent 21fca0f6e3
commit 72599e5282
6 changed files with 204 additions and 90 deletions

View File

@@ -15,6 +15,8 @@ namespace Content.Shared.Decals
protected readonly Dictionary<EntityUid, Dictionary<uint, Vector2i>> ChunkIndex = new();
// Note that this constant is effectively baked into all map files, because of how they save the grid decal component.
// So if this ever needs changing, the maps need converting.
public const int ChunkSize = 32;
public static Vector2i GetChunkIndices(Vector2 coordinates) => new ((int) Math.Floor(coordinates.X / ChunkSize), (int) Math.Floor(coordinates.Y / ChunkSize));
@@ -52,9 +54,19 @@ namespace Content.Shared.Decals
}
}
protected DecalGridComponent.DecalGridChunkCollection DecalGridChunkCollection(EntityUid gridEuid) =>
Comp<DecalGridComponent>(gridEuid).ChunkCollection;
protected Dictionary<Vector2i, Dictionary<uint, Decal>> ChunkCollection(EntityUid gridEuid) => DecalGridChunkCollection(gridEuid).ChunkCollection;
protected DecalGridComponent.DecalGridChunkCollection? DecalGridChunkCollection(EntityUid gridEuid, DecalGridComponent? comp = null)
{
if (!Resolve(gridEuid, ref comp))
return null;
return comp.ChunkCollection;
}
protected Dictionary<Vector2i, Dictionary<uint, Decal>>? ChunkCollection(EntityUid gridEuid, DecalGridComponent? comp = null)
{
var collection = DecalGridChunkCollection(gridEuid, comp);
return collection?.ChunkCollection;
}
protected virtual void DirtyChunk(EntityUid id, Vector2i chunkIndices) {}
@@ -68,12 +80,12 @@ namespace Content.Shared.Decals
}
var chunkCollection = ChunkCollection(gridId);
if (!chunkCollection.TryGetValue(indices, out var chunk) || !chunk.Remove(uid))
if (chunkCollection == null || !chunkCollection.TryGetValue(indices, out var chunk) || !chunk.Remove(uid))
{
return false;
}
if (chunkCollection[indices].Count == 0)
if (chunk.Count == 0)
chunkCollection.Remove(indices);
ChunkIndex[gridId].Remove(uid);