using Content.Server.GameTicking.Rules.Components; using Content.Server.StationEvents.Components; using Content.Server.Storage.Components; using Content.Server.Storage.EntitySystems; using Robust.Shared.Random; namespace Content.Server.StationEvents.Events; public sealed class RandomEntityStorageSpawnRule : StationEventSystem { [Dependency] private readonly EntityStorageSystem _entityStorage = default!; protected override void Started(EntityUid uid, RandomEntityStorageSpawnRuleComponent comp, GameRuleComponent gameRule, GameRuleStartedEvent args) { base.Started(uid, comp, gameRule, args); if (!TryGetRandomStation(out var station)) return; var validLockers = new List<(EntityUid, EntityStorageComponent, TransformComponent)>(); var query = EntityQueryEnumerator(); while (query.MoveNext(out var ent, out var storage, out var xform)) { if (StationSystem.GetOwningStation(ent, xform) != station) continue; if (!_entityStorage.CanInsert(ent, storage) || storage.Open) continue; validLockers.Add((ent, storage, xform)); } if (validLockers.Count == 0) return; var (locker, storageComp, xformComp) = RobustRandom.Pick(validLockers); var spawn = Spawn(comp.Prototype, xformComp.Coordinates); if (!_entityStorage.Insert(spawn, locker, storageComp)) { Del(spawn); } } }