Files
crystall-punk-14/Content.Server/_CP14/Procedural/RoomSpawner/CP14RoomSpawnerSystem.cs

86 lines
2.4 KiB
C#
Raw Normal View History

2024-07-17 16:33:28 +03:00
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)
2024-07-17 18:32:43 +03:00
{
SpawnRoom(spawner);
QueueDel(spawner);
}
private void SpawnRoom(Entity<CP14RoomSpawnerComponent> spawner)
2024-07-17 16:33:28 +03:00
{
2024-07-17 21:27:15 +03:00
if (!_random.Prob(spawner.Comp.Prob))
return;
2024-07-17 21:20:52 +03:00
var rooms = new HashSet<DungeonRoomPrototype>();
foreach (var roomProto in _proto.EnumeratePrototypes<DungeonRoomPrototype>())
{
var whitelisted = false;
foreach (var tag in spawner.Comp.RoomsTag)
{
if (roomProto.Tags.Contains(tag))
{
whitelisted = true;
break;
}
}
if (!whitelisted)
continue;
rooms.Add(roomProto);
}
if (rooms.Count == 0)
2024-07-17 16:33:28 +03:00
return;
2024-07-17 21:20:52 +03:00
var selectedRoom = _random.Pick(rooms);
2024-07-17 16:33:28 +03:00
2024-07-17 21:20:52 +03:00
if (!_proto.TryIndex<DungeonRoomPrototype>(selectedRoom, out var room))
2024-07-17 17:38:00 +03:00
{
Log.Error($"Unable to find matching room prototype ({room}) for {ToPrettyString(spawner)}");
2024-07-17 16:33:28 +03:00
return;
2024-07-17 17:38:00 +03:00
}
2024-07-17 16:33:28 +03:00
var gridUid = Transform(spawner).GridUid;
if (!TryComp<MapGridComponent>(gridUid, out var gridComp))
return;
2024-07-17 18:32:43 +03:00
var xform = Transform(spawner).Coordinates.Offset(-room.Size / 2);
2024-07-17 16:33:28 +03:00
var random = new Random();
_dungeon.SpawnRoom(
gridUid.Value,
gridComp,
2024-07-17 17:38:00 +03:00
_maps.LocalToTile(gridUid.Value, gridComp, xform),
2024-07-17 16:33:28 +03:00
room,
random,
null,
spawner.Comp.ClearExisting,
2024-07-17 21:29:24 +03:00
spawner.Comp.Rotation);
2024-07-17 16:33:28 +03:00
}
}