fish-station/Content.Shared/Movement/Systems/SharedMoverController.Relay.cs
ReWAFFlution 72b8bcc136
Upstream
* 1

* фикс шаттла утилей

* фиксы

* FTL иплакт. Задержка на отсегивание других

* Mechlocker construction fix (#2703)

* Фикс корпАрации на корпОрацию (#2701)

* ебучие артефакты (#2698)

* улучшения эффектов волос (#2699)

* Крафт петарды (#2696)

* фикс крафта петард (#2704)

* 2

* упс

* Игроки теперь ничего не видят, будучи в трубе (#2712)

* Energy shield sprite fix (#2711)

* Новые декали и диван (#2707)

* Сортировка иконок состояний по алфавиту (#2706)

* Automatic changelog update

* Снова абдукторы (#2705)

* Automatic changelog update

* да блядь

* увы

---------

Co-authored-by: Vigers Ray <vigersray@gmail.com>
Co-authored-by: Hero010h <163765999+Hero010h@users.noreply.github.com>
Co-authored-by: Ligyb <65973111+Lgibb18@users.noreply.github.com>
Co-authored-by: temm1ie <63717386+temm1ie@users.noreply.github.com>
Co-authored-by: ThereDrD <88589686+ThereDrD0@users.noreply.github.com>
Co-authored-by: DeasTrouGht <154323704+DeasTrouGht@users.noreply.github.com>
Co-authored-by: Inowe <107273594+InoweD@users.noreply.github.com>
Co-authored-by: Sunrise-Bot <sunrise.project.top@gmail.com>
Co-authored-by: iertis <kanopus952@gmail.com>
2025-08-05 04:05:06 +03:00

116 lines
4.3 KiB
C#

using Content.Shared.ActionBlocker;
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);
SubscribeLocalEvent<MovementRelayTargetComponent, AfterAutoHandleStateEvent>(OnAfterRelayTargetState);
SubscribeLocalEvent<RelayInputMoverComponent, AfterAutoHandleStateEvent>(OnAfterRelayState);
}
private void OnAfterRelayTargetState(Entity<MovementRelayTargetComponent> entity, ref AfterAutoHandleStateEvent args)
{
PhysicsSystem.UpdateIsPredicted(entity.Owner);
}
private void OnAfterRelayState(Entity<RelayInputMoverComponent> entity, ref AfterAutoHandleStateEvent args)
{
PhysicsSystem.UpdateIsPredicted(entity.Owner);
}
/// <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>
public void SetRelay(EntityUid uid, EntityUid relayEntity)
{
if (uid == relayEntity)
{
Log.Error($"An entity attempted to relay movement to itself. Entity:{ToPrettyString(uid)}");
return;
}
var component = EnsureComp<RelayInputMoverComponent>(uid);
if (component.RelayEntity == relayEntity)
return;
if (TryComp(component.RelayEntity, out MovementRelayTargetComponent? oldTarget))
{
oldTarget.Source = EntityUid.Invalid;
RemComp(component.RelayEntity, oldTarget);
PhysicsSystem.UpdateIsPredicted(component.RelayEntity);
}
var targetComp = EnsureComp<MovementRelayTargetComponent>(relayEntity);
if (TryComp(targetComp.Source, out RelayInputMoverComponent? oldRelay))
{
oldRelay.RelayEntity = EntityUid.Invalid;
RemComp(targetComp.Source, oldRelay);
PhysicsSystem.UpdateIsPredicted(targetComp.Source);
}
PhysicsSystem.UpdateIsPredicted(uid);
PhysicsSystem.UpdateIsPredicted(relayEntity);
component.RelayEntity = relayEntity;
targetComp.Source = uid;
Dirty(uid, component);
Dirty(relayEntity, targetComp);
_blocker.UpdateCanMove(uid);
}
// Sunrise-start
public void RemoveRelay(EntityUid uid)
{
if (!TryComp<RelayInputMoverComponent>(uid, out var moverComp))
return;
var relay = moverComp.RelayEntity;
if (TryComp(relay, out MovementRelayTargetComponent? targetComp))
{
targetComp.Source = EntityUid.Invalid;
Dirty(relay, targetComp);
RemCompDeferred<MovementRelayTargetComponent>(relay);
PhysicsSystem.UpdateIsPredicted(relay);
}
Dirty(uid, moverComp);
RemCompDeferred<RelayInputMoverComponent>(uid);
PhysicsSystem.UpdateIsPredicted(uid);
_blocker.UpdateCanMove(uid);
}
// Sunrise-end
private void OnRelayShutdown(Entity<RelayInputMoverComponent> entity, ref ComponentShutdown args)
{
PhysicsSystem.UpdateIsPredicted(entity.Owner);
PhysicsSystem.UpdateIsPredicted(entity.Comp.RelayEntity);
if (TryComp<InputMoverComponent>(entity.Comp.RelayEntity, out var inputMover))
SetMoveInput((entity.Comp.RelayEntity, inputMover), MoveButtons.None);
if (Timing.ApplyingState)
return;
if (TryComp(entity.Comp.RelayEntity, out MovementRelayTargetComponent? target) && target.LifeStage <= ComponentLifeStage.Running)
RemComp(entity.Comp.RelayEntity, target);
_blocker.UpdateCanMove(entity.Owner);
}
private void OnTargetRelayShutdown(Entity<MovementRelayTargetComponent> entity, ref ComponentShutdown args)
{
PhysicsSystem.UpdateIsPredicted(entity.Owner);
PhysicsSystem.UpdateIsPredicted(entity.Comp.Source);
if (Timing.ApplyingState)
return;
if (TryComp(entity.Comp.Source, out RelayInputMoverComponent? relay) && relay.LifeStage <= ComponentLifeStage.Running)
RemComp(entity.Comp.Source, relay);
}
}