TwoStageTriggerSystem.cs 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. using Robust.Shared.Timing;
  2. using Robust.Shared.Serialization.Manager;
  3. using Content.Server.Explosion.Components.OnTrigger;
  4. namespace Content.Server.Explosion.EntitySystems;
  5. public sealed class TwoStageTriggerSystem : EntitySystem
  6. {
  7. [Dependency] private readonly IComponentFactory _factory = default!;
  8. [Dependency] private readonly IGameTiming _timing = default!;
  9. [Dependency] private readonly ISerializationManager _serializationManager = default!;
  10. [Dependency] private readonly TriggerSystem _triggerSystem = default!;
  11. public override void Initialize()
  12. {
  13. base.Initialize();
  14. SubscribeLocalEvent<TwoStageTriggerComponent, TriggerEvent>(OnTrigger);
  15. }
  16. private void OnTrigger(EntityUid uid, TwoStageTriggerComponent component, TriggerEvent args)
  17. {
  18. if (component.Triggered)
  19. return;
  20. component.Triggered = true;
  21. component.NextTriggerTime = _timing.CurTime + component.TriggerDelay;
  22. }
  23. private void LoadComponents(EntityUid uid, TwoStageTriggerComponent component)
  24. {
  25. foreach (var (name, entry) in component.SecondStageComponents)
  26. {
  27. var comp = (Component)_factory.GetComponent(name);
  28. var temp = (object)comp;
  29. if (EntityManager.TryGetComponent(uid, entry.Component.GetType(), out var c))
  30. RemComp(uid, c);
  31. _serializationManager.CopyTo(entry.Component, ref temp);
  32. EntityManager.AddComponent(uid, comp);
  33. }
  34. component.ComponentsIsLoaded = true;
  35. }
  36. public override void Update(float frameTime)
  37. {
  38. base.Update(frameTime);
  39. var enumerator = EntityQueryEnumerator<TwoStageTriggerComponent>();
  40. while (enumerator.MoveNext(out var uid, out var component))
  41. {
  42. if (!component.Triggered)
  43. continue;
  44. if (!component.ComponentsIsLoaded)
  45. LoadComponents(uid, component);
  46. if (_timing.CurTime < component.NextTriggerTime)
  47. continue;
  48. component.NextTriggerTime = null;
  49. _triggerSystem.Trigger(uid);
  50. }
  51. }
  52. }