using Content.Server.Worldgen.Components.Debris; using Content.Shared.Maps; using Robust.Shared.Map; using Robust.Shared.Map.Components; using Robust.Shared.Random; namespace Content.Server.Worldgen.Systems.Debris; /// /// This handles populating simple structures, simply using a loot table for each tile. /// public sealed class SimpleFloorPlanPopulatorSystem : BaseWorldSystem { [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly ITileDefinitionManager _tileDefinition = default!; [Dependency] private readonly SharedMapSystem _map = default!; /// public override void Initialize() { SubscribeLocalEvent(OnFloorPlanBuilt); } private void OnFloorPlanBuilt(EntityUid uid, SimpleFloorPlanPopulatorComponent component, LocalStructureLoadedEvent args) { var placeables = new List(4); var grid = Comp(uid); var enumerator = _map.GetAllTilesEnumerator(uid, grid); while (enumerator.MoveNext(out var tile)) { var coords = grid.GridTileToLocal(tile.Value.GridIndices); var selector = tile.Value.Tile.GetContentTileDefinition(_tileDefinition).ID; if (!component.Caches.TryGetValue(selector, out var cache)) continue; placeables.Clear(); cache.GetSpawns(_random, ref placeables); foreach (var proto in placeables) { if (proto is null) continue; Spawn(proto, coords); } } } }