mirror of
https://github.com/corvax-team/ss14-wl.git
synced 2026-02-15 03:31:38 +01:00
* refactor: make MoverController use more queries
* perf: don't process paused MoverControllers
* perf: track active input movers via events
* Revert "place stored changeling identities next to each other (#39452)"
This reverts commit 9b5d2ff11b.
* perf: keep around the seen movers hashset
* fix: don't reintroduce wild wild west ordering
* style: use virtual method
Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>
* docs: better ActiveInputMoverComponent motiviation
Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>
* fix: pass through known comp
* fix: properly order relay movers for real
* perf: use proxy Transform() and inline it
Actually this might be a slight performance improvement since it avoids
the dictionary lookup until the case that its body status is on ground.
* style: switch an event handler to Entity<T>
* fix: just-in-case track for relay loops
* merg conflix
* borger
* whitespace moment
* whoops
* empty
---------
Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>
Co-authored-by: Princess Cheeseballs <66055347+Pronana@users.noreply.github.com>
Co-authored-by: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com>
97 lines
3.8 KiB
C#
97 lines
3.8 KiB
C#
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);
|
|
UpdateMoverStatus((relayEntity, null, targetComp));
|
|
}
|
|
|
|
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);
|
|
}
|
|
|
|
protected virtual 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);
|
|
}
|
|
|
|
protected virtual void UpdateMoverStatus(Entity<InputMoverComponent?, MovementRelayTargetComponent?> ent) { }
|
|
}
|