CutWireVariationPassSystem.cs 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. using Content.Server.GameTicking.Rules.VariationPass.Components;
  2. using Content.Server.Wires;
  3. using Content.Shared.Whitelist;
  4. using Robust.Shared.Random;
  5. namespace Content.Server.GameTicking.Rules.VariationPass;
  6. /// <summary>
  7. /// Handles cutting a random wire on random devices around the station.
  8. /// This system identifies target devices and adds <see cref="CutWireOnMapInitComponent"/> to them.
  9. /// The actual wire cutting is handled by <see cref="CutWireOnMapInitSystem"/>.
  10. /// </summary>
  11. public sealed class CutWireVariationPassSystem : VariationPassSystem<CutWireVariationPassComponent>
  12. {
  13. [Dependency] private readonly EntityWhitelistSystem _whitelistSystem = default!;
  14. protected override void ApplyVariation(Entity<CutWireVariationPassComponent> ent, ref StationVariationPassEvent args)
  15. {
  16. var wiresCut = 0;
  17. var query = AllEntityQuery<WiresComponent, TransformComponent>();
  18. while (query.MoveNext(out var uid, out _, out var transform))
  19. {
  20. // Ignore if not part of the station
  21. if (!IsMemberOfStation((uid, transform), ref args))
  22. continue;
  23. // Check against blacklist
  24. if (_whitelistSystem.IsBlacklistPass(ent.Comp.Blacklist, uid))
  25. continue;
  26. if (Random.Prob(ent.Comp.WireCutChance))
  27. {
  28. EnsureComp<CutWireOnMapInitComponent>(uid);
  29. wiresCut++;
  30. // Limit max wires cut
  31. if (wiresCut >= ent.Comp.MaxWiresCut)
  32. break;
  33. }
  34. }
  35. }
  36. }