Files
crystall-punk-14/Content.Server/_CP14/Procedural/RoomSpawner/CP14RoomSpawnerSystem.cs
2024-07-17 18:30:28 +03:00

57 lines
1.8 KiB
C#

using Content.Server.Procedural;
using Content.Shared.Procedural;
using Content.Shared.Random.Helpers;
using Robust.Shared.Map.Components;
using Robust.Shared.Prototypes;
using Robust.Shared.Random;
namespace Content.Server._CP14.Procedural.RoomSpawner;
public sealed class CP14RoomSpawnerSystem : EntitySystem
{
[Dependency] private readonly IPrototypeManager _proto = default!;
[Dependency] private readonly DungeonSystem _dungeon = default!;
[Dependency] private readonly IRobustRandom _random = default!;
[Dependency] private readonly SharedMapSystem _maps = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<CP14RoomSpawnerComponent, MapInitEvent>(OnMapInit);
}
private void OnMapInit(Entity<CP14RoomSpawnerComponent> spawner, ref MapInitEvent args)
{
if (!_proto.TryIndex(spawner.Comp.RoomsRandom, out var rooms))
return;
var roomProto = rooms.Pick(_random);
if (!_proto.TryIndex<DungeonRoomPrototype>(roomProto, out var room))
{
Log.Error($"Unable to find matching room prototype ({room}) for {ToPrettyString(spawner)}");
return;
}
var gridUid = Transform(spawner).GridUid;
if (!TryComp<MapGridComponent>(gridUid, out var gridComp))
return;
var xform = Transform(spawner).Coordinates.Offset(- room.Size / 2);
var random = new Random();
_dungeon.SpawnRoom(
gridUid.Value,
gridComp,
_maps.LocalToTile(gridUid.Value, gridComp, xform),
room,
random,
null,
spawner.Comp.ClearExisting,
spawner.Comp.Rotation,
ignoreTiles: spawner.Comp.IgnoreTiles);
}
}