1
0

SharedMoverController.Relay.cs 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. using Content.Shared.Movement.Components;
  2. namespace Content.Shared.Movement.Systems;
  3. public abstract partial class SharedMoverController
  4. {
  5. private void InitializeRelay()
  6. {
  7. SubscribeLocalEvent<RelayInputMoverComponent, ComponentShutdown>(OnRelayShutdown);
  8. SubscribeLocalEvent<MovementRelayTargetComponent, ComponentShutdown>(OnTargetRelayShutdown);
  9. SubscribeLocalEvent<MovementRelayTargetComponent, AfterAutoHandleStateEvent>(OnAfterRelayTargetState);
  10. SubscribeLocalEvent<RelayInputMoverComponent, AfterAutoHandleStateEvent>(OnAfterRelayState);
  11. }
  12. private void OnAfterRelayTargetState(Entity<MovementRelayTargetComponent> entity, ref AfterAutoHandleStateEvent args)
  13. {
  14. Physics.UpdateIsPredicted(entity.Owner);
  15. }
  16. private void OnAfterRelayState(Entity<RelayInputMoverComponent> entity, ref AfterAutoHandleStateEvent args)
  17. {
  18. Physics.UpdateIsPredicted(entity.Owner);
  19. }
  20. /// <summary>
  21. /// Sets the relay entity and marks the component as dirty. This only exists because people have previously
  22. /// forgotten to Dirty(), so fuck you, you have to use this method now.
  23. /// </summary>
  24. public void SetRelay(EntityUid uid, EntityUid relayEntity)
  25. {
  26. if (uid == relayEntity)
  27. {
  28. Log.Error($"An entity attempted to relay movement to itself. Entity:{ToPrettyString(uid)}");
  29. return;
  30. }
  31. var component = EnsureComp<RelayInputMoverComponent>(uid);
  32. if (component.RelayEntity == relayEntity)
  33. return;
  34. if (TryComp(component.RelayEntity, out MovementRelayTargetComponent? oldTarget))
  35. {
  36. oldTarget.Source = EntityUid.Invalid;
  37. RemComp(component.RelayEntity, oldTarget);
  38. Physics.UpdateIsPredicted(component.RelayEntity);
  39. }
  40. var targetComp = EnsureComp<MovementRelayTargetComponent>(relayEntity);
  41. if (TryComp(targetComp.Source, out RelayInputMoverComponent? oldRelay))
  42. {
  43. oldRelay.RelayEntity = EntityUid.Invalid;
  44. RemComp(targetComp.Source, oldRelay);
  45. Physics.UpdateIsPredicted(targetComp.Source);
  46. }
  47. Physics.UpdateIsPredicted(uid);
  48. Physics.UpdateIsPredicted(relayEntity);
  49. component.RelayEntity = relayEntity;
  50. targetComp.Source = uid;
  51. Dirty(uid, component);
  52. Dirty(relayEntity, targetComp);
  53. }
  54. private void OnRelayShutdown(Entity<RelayInputMoverComponent> entity, ref ComponentShutdown args)
  55. {
  56. Physics.UpdateIsPredicted(entity.Owner);
  57. Physics.UpdateIsPredicted(entity.Comp.RelayEntity);
  58. if (TryComp<InputMoverComponent>(entity.Comp.RelayEntity, out var inputMover))
  59. SetMoveInput((entity.Comp.RelayEntity, inputMover), MoveButtons.None);
  60. if (Timing.ApplyingState)
  61. return;
  62. if (TryComp(entity.Comp.RelayEntity, out MovementRelayTargetComponent? target) && target.LifeStage <= ComponentLifeStage.Running)
  63. RemComp(entity.Comp.RelayEntity, target);
  64. }
  65. private void OnTargetRelayShutdown(Entity<MovementRelayTargetComponent> entity, ref ComponentShutdown args)
  66. {
  67. Physics.UpdateIsPredicted(entity.Owner);
  68. Physics.UpdateIsPredicted(entity.Comp.Source);
  69. if (Timing.ApplyingState)
  70. return;
  71. if (TryComp(entity.Comp.Source, out RelayInputMoverComponent? relay) && relay.LifeStage <= ComponentLifeStage.Running)
  72. RemComp(entity.Comp.Source, relay);
  73. }
  74. }