using System.Linq;
using Robust.Shared.Map.Components;
using Robust.Shared.Map.Enumerators;
namespace Content.Shared.Tiles;
public sealed class ProtectedGridSystem : EntitySystem
{
[Dependency] private readonly SharedMapSystem _map = default!;
///
public override void Initialize()
{
SubscribeLocalEvent(OnMapInit);
SubscribeLocalEvent(OnFloorTileAttempt);
}
private void OnMapInit(Entity ent, ref MapInitEvent args)
{
if (!TryComp(ent, out var grid))
return;
// Engine default is currently 16x size chunks which means we can't just easily have 64bit flags.
var chunkEnumerator = new ChunkIndicesEnumerator(grid.LocalAABB, 8);
while (chunkEnumerator.MoveNext(out var chunk))
{
ulong flag = 0;
for (var x = 0; x < 8; x++)
{
for (var y = 0; y < 8; y++)
{
var index = new Vector2i(x + chunk.Value.X * 8, y + chunk.Value.Y * 8);
var tile = _map.GetTileRef(ent.Owner, grid, index);
if (tile.Tile.IsEmpty)
continue;
var data = SharedMapSystem.ToBitmask(new Vector2i(x, y));
flag |= data;
}
}
if (flag == 0)
continue;
ent.Comp.BaseIndices[chunk.Value] = flag;
}
Dirty(ent);
}
private void OnFloorTileAttempt(Entity ent, ref FloorTileAttemptEvent args)
{
var chunkOrigin = SharedMapSystem.GetChunkIndices(args.GridIndices, 8);
if (!ent.Comp.BaseIndices.TryGetValue(chunkOrigin, out var data))
{
args.Cancelled = true;
return;
}
if (SharedMapSystem.FromBitmask(args.GridIndices, data))
{
args.Cancelled = true;
}
}
}