using Content.Shared.Movement.Components; using Robust.Shared.GameStates; using Robust.Shared.Serialization; namespace Content.Shared.Movement.Systems; public abstract partial class SharedMoverController { private void InitializeRelay() { SubscribeLocalEvent(OnRelayGetState); SubscribeLocalEvent(OnRelayHandleState); SubscribeLocalEvent(OnRelayShutdown); } /// /// Sets the relay entity and marks the component as dirty. This only exists because people have previously /// forgotten to Dirty(), so fuck you, you have to use this method now. /// public void SetRelay(EntityUid uid, EntityUid relayEntity, RelayInputMoverComponent? component = null) { if (!Resolve(uid, ref component)) return; component.RelayEntity = relayEntity; Dirty(component); } private void OnRelayShutdown(EntityUid uid, RelayInputMoverComponent component, ComponentShutdown args) { // If relay is removed then cancel all inputs. if (!TryComp(component.RelayEntity, out var inputMover)) return; SetMoveInput(inputMover, MoveButtons.None); } private void OnRelayHandleState(EntityUid uid, RelayInputMoverComponent component, ref ComponentHandleState args) { if (args.Current is not RelayInputMoverComponentState state) return; component.RelayEntity = state.Entity; } private void OnRelayGetState(EntityUid uid, RelayInputMoverComponent component, ref ComponentGetState args) { args.State = new RelayInputMoverComponentState() { Entity = component.RelayEntity, }; } [Serializable, NetSerializable] private sealed class RelayInputMoverComponentState : ComponentState { public EntityUid? Entity; } }