Files
crystall-punk-14/Content.Shared/Movement/Systems/SharedMoverController.Relay.cs

91 lines
3.5 KiB
C#
Raw Permalink Normal View History

using Content.Shared.Movement.Components;
namespace Content.Shared.Movement.Systems;
public abstract partial class SharedMoverController
{
private void InitializeRelay()
{
SubscribeLocalEvent<RelayInputMoverComponent, ComponentShutdown>(OnRelayShutdown);
SubscribeLocalEvent<MovementRelayTargetComponent, ComponentShutdown>(OnTargetRelayShutdown);
2023-05-13 02:02:50 +12:00
SubscribeLocalEvent<MovementRelayTargetComponent, AfterAutoHandleStateEvent>(OnAfterRelayTargetState);
SubscribeLocalEvent<RelayInputMoverComponent, AfterAutoHandleStateEvent>(OnAfterRelayState);
}
private void OnAfterRelayTargetState(Entity<MovementRelayTargetComponent> entity, ref AfterAutoHandleStateEvent args)
2023-05-13 02:02:50 +12:00
{
Physics.UpdateIsPredicted(entity.Owner);
2023-05-13 02:02:50 +12:00
}
private void OnAfterRelayState(Entity<RelayInputMoverComponent> entity, ref AfterAutoHandleStateEvent args)
2023-05-13 02:02:50 +12:00
{
Physics.UpdateIsPredicted(entity.Owner);
}
2022-10-04 15:49:46 +13:00
/// <summary>
/// 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.
/// </summary>
2023-05-13 02:02:50 +12:00
public void SetRelay(EntityUid uid, EntityUid relayEntity)
2022-10-04 15:49:46 +13:00
{
if (uid == relayEntity)
{
Log.Error($"An entity attempted to relay movement to itself. Entity:{ToPrettyString(uid)}");
return;
}
2023-05-13 02:02:50 +12:00
var component = EnsureComp<RelayInputMoverComponent>(uid);
if (component.RelayEntity == relayEntity)
return;
if (TryComp(component.RelayEntity, out MovementRelayTargetComponent? oldTarget))
{
2023-05-13 02:02:50 +12:00
oldTarget.Source = EntityUid.Invalid;
RemComp(component.RelayEntity, oldTarget);
Physics.UpdateIsPredicted(component.RelayEntity);
}
2023-05-13 02:02:50 +12:00
var targetComp = EnsureComp<MovementRelayTargetComponent>(relayEntity);
if (TryComp(targetComp.Source, out RelayInputMoverComponent? oldRelay))
{
oldRelay.RelayEntity = EntityUid.Invalid;
RemComp(targetComp.Source, oldRelay);
Physics.UpdateIsPredicted(targetComp.Source);
}
2023-05-13 02:02:50 +12:00
Physics.UpdateIsPredicted(uid);
Physics.UpdateIsPredicted(relayEntity);
2022-10-04 15:49:46 +13:00
component.RelayEntity = relayEntity;
2023-05-13 02:02:50 +12:00
targetComp.Source = uid;
Dirty(uid, component);
Dirty(relayEntity, targetComp);
2022-10-04 15:49:46 +13:00
}
private void OnRelayShutdown(Entity<RelayInputMoverComponent> entity, ref ComponentShutdown args)
{
Physics.UpdateIsPredicted(entity.Owner);
Physics.UpdateIsPredicted(entity.Comp.RelayEntity);
if (TryComp<InputMoverComponent>(entity.Comp.RelayEntity, out var inputMover))
SetMoveInput((entity.Comp.RelayEntity, inputMover), MoveButtons.None);
2023-05-13 02:02:50 +12:00
if (Timing.ApplyingState)
return;
if (TryComp(entity.Comp.RelayEntity, out MovementRelayTargetComponent? target) && target.LifeStage <= ComponentLifeStage.Running)
RemComp(entity.Comp.RelayEntity, target);
}
private void OnTargetRelayShutdown(Entity<MovementRelayTargetComponent> entity, ref ComponentShutdown args)
{
Physics.UpdateIsPredicted(entity.Owner);
Physics.UpdateIsPredicted(entity.Comp.Source);
2023-05-13 02:02:50 +12:00
if (Timing.ApplyingState)
return;
if (TryComp(entity.Comp.Source, out RelayInputMoverComponent? relay) && relay.LifeStage <= ComponentLifeStage.Running)
RemComp(entity.Comp.Source, relay);
}
}