RandomStatusActivationSystem.cs 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. // SPDX-FileCopyrightText: 2025 Aiden <28298836+Aidenkrz@users.noreply.github.com>
  2. // SPDX-FileCopyrightText: 2025 Piras314 <p1r4s@proton.me>
  3. // SPDX-FileCopyrightText: 2025 gluesniffler <159397573+gluesniffler@users.noreply.github.com>
  4. //
  5. // SPDX-License-Identifier: AGPL-3.0-or-later
  6. using Content.Shared._Shitmed.BodyEffects.Subsystems;
  7. using Content.Shared.Body.Organ;
  8. using Content.Shared.StatusEffect;
  9. using Robust.Shared.Timing;
  10. using Robust.Shared.Random;
  11. namespace Content.Server._Shitmed.BodyEffects.Subsystems;
  12. public sealed class RandomStatusActivationSystem : EntitySystem
  13. {
  14. [Dependency] private readonly IGameTiming _timing = default!;
  15. [Dependency] private readonly StatusEffectsSystem _effects = default!;
  16. [Dependency] private readonly IRobustRandom _random = default!;
  17. public override void Initialize()
  18. {
  19. base.Initialize();
  20. SubscribeLocalEvent<RandomStatusActivationComponent, ComponentInit>(OnInit);
  21. }
  22. private void OnInit(EntityUid uid, RandomStatusActivationComponent component, ComponentInit args) => GetRandomTime(component);
  23. private void GetRandomTime(RandomStatusActivationComponent component)
  24. {
  25. var minTime = component.MinActivationTime;
  26. var maxTime = component.MaxActivationTime;
  27. var randomSeconds = _random.NextDouble() * (maxTime - minTime).TotalSeconds;
  28. var randomSpan = TimeSpan.FromSeconds(randomSeconds);
  29. component.NextUpdate = _timing.CurTime + minTime + randomSpan;
  30. }
  31. public override void Update(float frameTime)
  32. {
  33. base.Update(frameTime);
  34. var query = EntityQueryEnumerator<RandomStatusActivationComponent>();
  35. var now = _timing.CurTime;
  36. while (query.MoveNext(out var uid, out var comp))
  37. {
  38. if (now < comp.NextUpdate)
  39. continue;
  40. if (!TryComp<StatusEffectsComponent>(uid, out var effects))
  41. continue;
  42. foreach (var (key, component) in comp.StatusEffects)
  43. _effects.TryAddStatusEffect(uid, key, comp.Duration ?? TimeSpan.FromSeconds(1), refresh: true, component, effects);
  44. GetRandomTime(comp);
  45. }
  46. }
  47. }