Some MoverController cleanup (#18484)

Was going to code a feature but forgor it already existed so I just cleaned up some Dirty / EntityQuery<T> stuff.
This commit is contained in:
metalgearsloth
2023-08-01 14:08:52 +10:00
committed by GitHub
parent 823cb0a762
commit 73c323fd62
5 changed files with 93 additions and 117 deletions

View File

@@ -58,7 +58,7 @@ namespace Content.Client.Physics.Controllers
{ {
Physics.UpdateIsPredicted(uid); Physics.UpdateIsPredicted(uid);
Physics.UpdateIsPredicted(component.RelayEntity); Physics.UpdateIsPredicted(component.RelayEntity);
if (TryComp<InputMoverComponent>(component.RelayEntity, out var inputMover)) if (MoverQuery.TryGetComponent(component.RelayEntity, out var inputMover))
SetMoveInput(inputMover, MoveButtons.None); SetMoveInput(inputMover, MoveButtons.None);
} }
@@ -66,7 +66,7 @@ namespace Content.Client.Physics.Controllers
{ {
Physics.UpdateIsPredicted(uid); Physics.UpdateIsPredicted(uid);
Physics.UpdateIsPredicted(component.RelayEntity); Physics.UpdateIsPredicted(component.RelayEntity);
if (TryComp<InputMoverComponent>(component.RelayEntity, out var inputMover)) if (MoverQuery.TryGetComponent(component.RelayEntity, out var inputMover))
SetMoveInput(inputMover, MoveButtons.None); SetMoveInput(inputMover, MoveButtons.None);
} }
@@ -87,7 +87,7 @@ namespace Content.Client.Physics.Controllers
if (_playerManager.LocalPlayer?.ControlledEntity is not {Valid: true} player) if (_playerManager.LocalPlayer?.ControlledEntity is not {Valid: true} player)
return; return;
if (TryComp<RelayInputMoverComponent>(player, out var relayMover)) if (RelayQuery.TryGetComponent(player, out var relayMover))
HandleClientsideMovement(relayMover.RelayEntity, frameTime); HandleClientsideMovement(relayMover.RelayEntity, frameTime);
HandleClientsideMovement(player, frameTime); HandleClientsideMovement(player, frameTime);
@@ -95,15 +95,8 @@ namespace Content.Client.Physics.Controllers
private void HandleClientsideMovement(EntityUid player, float frameTime) private void HandleClientsideMovement(EntityUid player, float frameTime)
{ {
var xformQuery = GetEntityQuery<TransformComponent>(); if (!MoverQuery.TryGetComponent(player, out var mover) ||
var moverQuery = GetEntityQuery<InputMoverComponent>(); !XformQuery.TryGetComponent(player, out var xform))
var relayTargetQuery = GetEntityQuery<MovementRelayTargetComponent>();
var mobMoverQuery = GetEntityQuery<MobMoverComponent>();
var pullableQuery = GetEntityQuery<SharedPullableComponent>();
var modifierQuery = GetEntityQuery<MovementSpeedModifierComponent>();
if (!moverQuery.TryGetComponent(player, out var mover) ||
!xformQuery.TryGetComponent(player, out var xform))
{ {
return; return;
} }
@@ -112,17 +105,17 @@ namespace Content.Client.Physics.Controllers
PhysicsComponent? body; PhysicsComponent? body;
var xformMover = xform; var xformMover = xform;
if (mover.ToParent && HasComp<RelayInputMoverComponent>(xform.ParentUid)) if (mover.ToParent && RelayQuery.HasComponent(xform.ParentUid))
{ {
if (!TryComp(xform.ParentUid, out body) || if (!PhysicsQuery.TryGetComponent(xform.ParentUid, out body) ||
!TryComp(xform.ParentUid, out xformMover)) !XformQuery.TryGetComponent(xform.ParentUid, out xformMover))
{ {
return; return;
} }
physicsUid = xform.ParentUid; physicsUid = xform.ParentUid;
} }
else if (!TryComp(player, out body)) else if (!PhysicsQuery.TryGetComponent(player, out body))
{ {
return; return;
} }
@@ -134,13 +127,7 @@ namespace Content.Client.Physics.Controllers
physicsUid, physicsUid,
body, body,
xformMover, xformMover,
frameTime, frameTime);
xformQuery,
moverQuery,
mobMoverQuery,
relayTargetQuery,
pullableQuery,
modifierQuery);
} }
protected override bool CanSound() protected override bool CanSound()

View File

@@ -50,7 +50,8 @@ public sealed partial class ReplaySpectatorSystem
if (Direction == DirectionFlag.None) if (Direction == DirectionFlag.None)
{ {
if (TryComp(player, out InputMoverComponent? cmp)) if (TryComp(player, out InputMoverComponent? cmp))
_mover.LerpRotation(cmp, frameTime); _mover.LerpRotation(player, cmp, frameTime);
return; return;
} }
@@ -64,7 +65,7 @@ public sealed partial class ReplaySpectatorSystem
if (!TryComp(player, out InputMoverComponent? mover)) if (!TryComp(player, out InputMoverComponent? mover))
return; return;
_mover.LerpRotation(mover, frameTime); _mover.LerpRotation(player, mover, frameTime);
var effectiveDir = Direction; var effectiveDir = Direction;
if ((Direction & DirectionFlag.North) != 0) if ((Direction & DirectionFlag.North) != 0)
@@ -75,7 +76,7 @@ public sealed partial class ReplaySpectatorSystem
var query = GetEntityQuery<TransformComponent>(); var query = GetEntityQuery<TransformComponent>();
var xform = query.GetComponent(player); var xform = query.GetComponent(player);
var pos = _transform.GetWorldPosition(xform, query); var pos = _transform.GetWorldPosition(xform);
if (!xform.ParentUid.IsValid()) if (!xform.ParentUid.IsValid())
{ {
@@ -93,12 +94,12 @@ public sealed partial class ReplaySpectatorSystem
if (xform.ParentUid.IsValid()) if (xform.ParentUid.IsValid())
_transform.SetGridId(player, xform, Transform(xform.ParentUid).GridUid); _transform.SetGridId(player, xform, Transform(xform.ParentUid).GridUid);
var parentRotation = _mover.GetParentGridAngle(mover, query); var parentRotation = _mover.GetParentGridAngle(mover);
var localVec = effectiveDir.AsDir().ToAngle().ToWorldVec(); var localVec = effectiveDir.AsDir().ToAngle().ToWorldVec();
var worldVec = parentRotation.RotateVec(localVec); var worldVec = parentRotation.RotateVec(localVec);
var speed = CompOrNull<MovementSpeedModifierComponent>(player)?.BaseSprintSpeed ?? DefaultSpeed; var speed = CompOrNull<MovementSpeedModifierComponent>(player)?.BaseSprintSpeed ?? DefaultSpeed;
var delta = worldVec * frameTime * speed; var delta = worldVec * frameTime * speed;
_transform.SetWorldPositionRotation(xform, pos + delta, delta.ToWorldAngle(), query); _transform.SetWorldPositionRotation(xform, pos + delta, delta.ToWorldAngle());
} }
private sealed class MoverHandler : InputCmdHandler private sealed class MoverHandler : InputCmdHandler

View File

@@ -33,13 +33,13 @@ namespace Content.Server.Physics.Controllers
private void OnRelayPlayerAttached(EntityUid uid, RelayInputMoverComponent component, PlayerAttachedEvent args) private void OnRelayPlayerAttached(EntityUid uid, RelayInputMoverComponent component, PlayerAttachedEvent args)
{ {
if (TryComp<InputMoverComponent>(component.RelayEntity, out var inputMover)) if (MoverQuery.TryGetComponent(component.RelayEntity, out var inputMover))
SetMoveInput(inputMover, MoveButtons.None); SetMoveInput(inputMover, MoveButtons.None);
} }
private void OnRelayPlayerDetached(EntityUid uid, RelayInputMoverComponent component, PlayerDetachedEvent args) private void OnRelayPlayerDetached(EntityUid uid, RelayInputMoverComponent component, PlayerDetachedEvent args)
{ {
if (TryComp<InputMoverComponent>(component.RelayEntity, out var inputMover)) if (MoverQuery.TryGetComponent(component.RelayEntity, out var inputMover))
SetMoveInput(inputMover, MoveButtons.None); SetMoveInput(inputMover, MoveButtons.None);
} }
@@ -62,24 +62,16 @@ namespace Content.Server.Physics.Controllers
{ {
base.UpdateBeforeSolve(prediction, frameTime); base.UpdateBeforeSolve(prediction, frameTime);
var bodyQuery = GetEntityQuery<PhysicsComponent>();
var relayQuery = GetEntityQuery<RelayInputMoverComponent>();
var relayTargetQuery = GetEntityQuery<MovementRelayTargetComponent>();
var xformQuery = GetEntityQuery<TransformComponent>();
var moverQuery = GetEntityQuery<InputMoverComponent>();
var mobMoverQuery = GetEntityQuery<MobMoverComponent>();
var pullableQuery = GetEntityQuery<SharedPullableComponent>();
var inputQueryEnumerator = AllEntityQuery<InputMoverComponent>(); var inputQueryEnumerator = AllEntityQuery<InputMoverComponent>();
var modifierQuery = GetEntityQuery<MovementSpeedModifierComponent>();
while (inputQueryEnumerator.MoveNext(out var uid, out var mover)) while (inputQueryEnumerator.MoveNext(out var uid, out var mover))
{ {
var physicsUid = uid; var physicsUid = uid;
if (relayQuery.HasComponent(uid)) if (RelayQuery.HasComponent(uid))
continue; continue;
if (!xformQuery.TryGetComponent(uid, out var xform)) if (!XformQuery.TryGetComponent(uid, out var xform))
{ {
continue; continue;
} }
@@ -87,17 +79,17 @@ namespace Content.Server.Physics.Controllers
PhysicsComponent? body; PhysicsComponent? body;
var xformMover = xform; var xformMover = xform;
if (mover.ToParent && relayQuery.HasComponent(xform.ParentUid)) if (mover.ToParent && RelayQuery.HasComponent(xform.ParentUid))
{ {
if (!bodyQuery.TryGetComponent(xform.ParentUid, out body) || if (!PhysicsQuery.TryGetComponent(xform.ParentUid, out body) ||
!TryComp(xform.ParentUid, out xformMover)) !XformQuery.TryGetComponent(xform.ParentUid, out xformMover))
{ {
continue; continue;
} }
physicsUid = xform.ParentUid; physicsUid = xform.ParentUid;
} }
else if (!bodyQuery.TryGetComponent(uid, out body)) else if (!PhysicsQuery.TryGetComponent(uid, out body))
{ {
continue; continue;
} }
@@ -107,13 +99,7 @@ namespace Content.Server.Physics.Controllers
physicsUid, physicsUid,
body, body,
xformMover, xformMover,
frameTime, frameTime);
xformQuery,
moverQuery,
mobMoverQuery,
relayTargetQuery,
pullableQuery,
modifierQuery);
} }
HandleShuttleMovement(frameTime); HandleShuttleMovement(frameTime);

View File

@@ -68,7 +68,9 @@ namespace Content.Shared.Movement.Systems
protected void SetMoveInput(InputMoverComponent component, MoveButtons buttons) protected void SetMoveInput(InputMoverComponent component, MoveButtons buttons)
{ {
if (component.HeldMoveButtons == buttons) return; if (component.HeldMoveButtons == buttons)
return;
component.HeldMoveButtons = buttons; component.HeldMoveButtons = buttons;
Dirty(component); Dirty(component);
} }
@@ -120,33 +122,31 @@ namespace Content.Shared.Movement.Systems
public void RotateCamera(EntityUid uid, Angle angle) public void RotateCamera(EntityUid uid, Angle angle)
{ {
if (CameraRotationLocked || !TryComp<InputMoverComponent>(uid, out var mover)) if (CameraRotationLocked || !MoverQuery.TryGetComponent(uid, out var mover))
return; return;
mover.TargetRelativeRotation += angle; mover.TargetRelativeRotation += angle;
Dirty(mover); Dirty(uid, mover);
} }
public void ResetCamera(EntityUid uid) public void ResetCamera(EntityUid uid)
{ {
if (CameraRotationLocked || if (CameraRotationLocked ||
!TryComp<InputMoverComponent>(uid, out var mover)) !MoverQuery.TryGetComponent(uid, out var mover))
{ {
return; return;
} }
// If we updated parent then cancel the accumulator and force it now. // If we updated parent then cancel the accumulator and force it now.
var xformQuery = GetEntityQuery<TransformComponent>(); if (!TryUpdateRelative(mover, XformQuery.GetComponent(uid)) && mover.TargetRelativeRotation.Equals(Angle.Zero))
if (!TryUpdateRelative(mover, xformQuery.GetComponent(uid), xformQuery) && mover.TargetRelativeRotation.Equals(Angle.Zero))
return; return;
mover.LerpTarget = TimeSpan.Zero; mover.LerpTarget = TimeSpan.Zero;
mover.TargetRelativeRotation = Angle.Zero; mover.TargetRelativeRotation = Angle.Zero;
Dirty(mover); Dirty(uid, mover);
} }
private bool TryUpdateRelative(InputMoverComponent mover, TransformComponent xform, EntityQuery<TransformComponent> xformQuery) private bool TryUpdateRelative(InputMoverComponent mover, TransformComponent xform)
{ {
var relative = xform.GridUid; var relative = xform.GridUid;
relative ??= xform.MapUid; relative ??= xform.MapUid;
@@ -165,15 +165,15 @@ namespace Content.Shared.Movement.Systems
var targetRotation = Angle.Zero; var targetRotation = Angle.Zero;
// Get our current relative rotation // Get our current relative rotation
if (xformQuery.TryGetComponent(mover.RelativeEntity, out var oldRelativeXform)) if (XformQuery.TryGetComponent(mover.RelativeEntity, out var oldRelativeXform))
{ {
currentRotation = _transform.GetWorldRotation(oldRelativeXform, xformQuery) + mover.RelativeRotation; currentRotation = _transform.GetWorldRotation(oldRelativeXform, XformQuery) + mover.RelativeRotation;
} }
if (xformQuery.TryGetComponent(relative, out var relativeXform)) if (XformQuery.TryGetComponent(relative, out var relativeXform))
{ {
// This is our current rotation relative to our new parent. // This is our current rotation relative to our new parent.
mover.RelativeRotation = (currentRotation - _transform.GetWorldRotation(relativeXform, xformQuery)).FlipPositive(); mover.RelativeRotation = (currentRotation - _transform.GetWorldRotation(relativeXform)).FlipPositive();
} }
// If we went from grid -> map we'll preserve our worldrotation // If we went from grid -> map we'll preserve our worldrotation
@@ -196,32 +196,24 @@ namespace Content.Shared.Movement.Systems
return true; return true;
} }
public Angle GetParentGridAngle(InputMoverComponent mover, EntityQuery<TransformComponent> xformQuery) public Angle GetParentGridAngle(InputMoverComponent mover)
{ {
var rotation = mover.RelativeRotation; var rotation = mover.RelativeRotation;
if (xformQuery.TryGetComponent(mover.RelativeEntity, out var relativeXform)) if (XformQuery.TryGetComponent(mover.RelativeEntity, out var relativeXform))
return (_transform.GetWorldRotation(relativeXform, xformQuery) + rotation); return _transform.GetWorldRotation(relativeXform) + rotation;
return rotation; return rotation;
} }
public Angle GetParentGridAngle(InputMoverComponent mover)
{
return GetParentGridAngle(mover, GetEntityQuery<TransformComponent>());
}
private void OnFollowedParentChange(EntityUid uid, FollowedComponent component, ref EntParentChangedMessage args) private void OnFollowedParentChange(EntityUid uid, FollowedComponent component, ref EntParentChangedMessage args)
{ {
var moverQuery = GetEntityQuery<InputMoverComponent>();
var xformQuery = GetEntityQuery<TransformComponent>();
foreach (var foll in component.Following) foreach (var foll in component.Following)
{ {
if (!moverQuery.TryGetComponent(foll, out var mover)) if (!MoverQuery.TryGetComponent(foll, out var mover))
continue; continue;
var ev = new EntParentChangedMessage(foll, null, args.OldMapId, xformQuery.GetComponent(foll)); var ev = new EntParentChangedMessage(foll, null, args.OldMapId, XformQuery.GetComponent(foll));
OnInputParentChange(foll, mover, ref ev); OnInputParentChange(foll, mover, ref ev);
} }
} }
@@ -235,7 +227,7 @@ namespace Content.Shared.Movement.Systems
if (component.LifeStage < ComponentLifeStage.Running) if (component.LifeStage < ComponentLifeStage.Running)
{ {
component.RelativeEntity = relative; component.RelativeEntity = relative;
Dirty(component); Dirty(uid, component);
return; return;
} }
@@ -249,7 +241,7 @@ namespace Content.Shared.Movement.Systems
component.TargetRelativeRotation = Angle.Zero; component.TargetRelativeRotation = Angle.Zero;
component.RelativeRotation = Angle.Zero; component.RelativeRotation = Angle.Zero;
component.LerpTarget = TimeSpan.Zero; component.LerpTarget = TimeSpan.Zero;
Dirty(component); Dirty(uid, component);
return; return;
} }
@@ -259,14 +251,14 @@ namespace Content.Shared.Movement.Systems
if (component.LerpTarget >= Timing.CurTime) if (component.LerpTarget >= Timing.CurTime)
{ {
component.LerpTarget = TimeSpan.Zero; component.LerpTarget = TimeSpan.Zero;
Dirty(component); Dirty(uid, component);
} }
return; return;
} }
component.LerpTarget = TimeSpan.FromSeconds(InputMoverComponent.LerpTime) + Timing.CurTime; component.LerpTarget = TimeSpan.FromSeconds(InputMoverComponent.LerpTime) + Timing.CurTime;
Dirty(component); Dirty(uid, component);
} }
private void HandleDirChange(EntityUid entity, Direction dir, ushort subTick, bool state) private void HandleDirChange(EntityUid entity, Direction dir, ushort subTick, bool state)
@@ -279,7 +271,7 @@ namespace Content.Shared.Movement.Systems
DebugTools.Assert(relayMover.RelayEntity != entity); DebugTools.Assert(relayMover.RelayEntity != entity);
DebugTools.AssertNotNull(relayMover.RelayEntity); DebugTools.AssertNotNull(relayMover.RelayEntity);
if (TryComp<InputMoverComponent>(entity, out var mover)) if (MoverQuery.TryGetComponent(entity, out var mover))
SetMoveInput(mover, MoveButtons.None); SetMoveInput(mover, MoveButtons.None);
if (!_mobState.IsIncapacitated(entity)) if (!_mobState.IsIncapacitated(entity))
@@ -288,7 +280,7 @@ namespace Content.Shared.Movement.Systems
return; return;
} }
if (!TryComp<InputMoverComponent>(entity, out var moverComp)) if (!MoverQuery.TryGetComponent(entity, out var moverComp))
return; return;
// Relay the fact we had any movement event. // Relay the fact we had any movement event.
@@ -323,7 +315,7 @@ namespace Content.Shared.Movement.Systems
private void HandleRunChange(EntityUid uid, ushort subTick, bool walking) private void HandleRunChange(EntityUid uid, ushort subTick, bool walking)
{ {
TryComp<InputMoverComponent>(uid, out var moverComp); MoverQuery.TryGetComponent(uid, out var moverComp);
if (TryComp<RelayInputMoverComponent>(uid, out var relayMover)) if (TryComp<RelayInputMoverComponent>(uid, out var relayMover))
{ {

View File

@@ -31,25 +31,32 @@ namespace Content.Shared.Movement.Systems
{ {
[Dependency] private readonly IConfigurationManager _configManager = default!; [Dependency] private readonly IConfigurationManager _configManager = default!;
[Dependency] protected readonly IGameTiming Timing = default!; [Dependency] protected readonly IGameTiming Timing = default!;
[Dependency] protected readonly SharedPhysicsSystem Physics = default!;
[Dependency] private readonly IMapManager _mapManager = default!; [Dependency] private readonly IMapManager _mapManager = default!;
[Dependency] private readonly ITileDefinitionManager _tileDefinitionManager = default!; [Dependency] private readonly ITileDefinitionManager _tileDefinitionManager = default!;
[Dependency] private readonly InventorySystem _inventory = default!;
[Dependency] private readonly SharedContainerSystem _container = default!;
[Dependency] private readonly EntityLookupSystem _lookup = default!; [Dependency] private readonly EntityLookupSystem _lookup = default!;
[Dependency] private readonly SharedGravitySystem _gravity = default!; [Dependency] private readonly InventorySystem _inventory = default!;
[Dependency] private readonly MobStateSystem _mobState = default!; [Dependency] private readonly MobStateSystem _mobState = default!;
[Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly SharedAudioSystem _audio = default!;
[Dependency] private readonly SharedContainerSystem _container = default!;
[Dependency] private readonly SharedGravitySystem _gravity = default!;
[Dependency] protected readonly SharedPhysicsSystem Physics = default!;
[Dependency] private readonly SharedTransformSystem _transform = default!; [Dependency] private readonly SharedTransformSystem _transform = default!;
[Dependency] private readonly TagSystem _tags = default!; [Dependency] private readonly TagSystem _tags = default!;
protected EntityQuery<InputMoverComponent> MoverQuery;
protected EntityQuery<MobMoverComponent> MobMoverQuery;
protected EntityQuery<MovementRelayTargetComponent> RelayTargetQuery;
protected EntityQuery<MovementSpeedModifierComponent> ModifierQuery;
protected EntityQuery<PhysicsComponent> PhysicsQuery;
protected EntityQuery<RelayInputMoverComponent> RelayQuery;
protected EntityQuery<SharedPullableComponent> PullableQuery;
protected EntityQuery<TransformComponent> XformQuery;
private const float StepSoundMoveDistanceRunning = 2; private const float StepSoundMoveDistanceRunning = 2;
private const float StepSoundMoveDistanceWalking = 1.5f; private const float StepSoundMoveDistanceWalking = 1.5f;
private const float FootstepVariation = 0f; private const float FootstepVariation = 0f;
protected ISawmill Sawmill = default!;
/// <summary> /// <summary>
/// <see cref="CCVars.StopSpeed"/> /// <see cref="CCVars.StopSpeed"/>
/// </summary> /// </summary>
@@ -65,7 +72,16 @@ namespace Content.Shared.Movement.Systems
public override void Initialize() public override void Initialize()
{ {
base.Initialize(); base.Initialize();
Sawmill = Logger.GetSawmill("mover");
MoverQuery = GetEntityQuery<InputMoverComponent>();
MobMoverQuery = GetEntityQuery<MobMoverComponent>();
ModifierQuery = GetEntityQuery<MovementSpeedModifierComponent>();
RelayTargetQuery = GetEntityQuery<MovementRelayTargetComponent>();
PhysicsQuery = GetEntityQuery<PhysicsComponent>();
RelayQuery = GetEntityQuery<RelayInputMoverComponent>();
PullableQuery = GetEntityQuery<SharedPullableComponent>();
XformQuery = GetEntityQuery<TransformComponent>();
InitializeFootsteps(); InitializeFootsteps();
InitializeInput(); InitializeInput();
InitializeMob(); InitializeMob();
@@ -101,19 +117,13 @@ namespace Content.Shared.Movement.Systems
EntityUid physicsUid, EntityUid physicsUid,
PhysicsComponent physicsComponent, PhysicsComponent physicsComponent,
TransformComponent xform, TransformComponent xform,
float frameTime, float frameTime)
EntityQuery<TransformComponent> xformQuery,
EntityQuery<InputMoverComponent> moverQuery,
EntityQuery<MobMoverComponent> mobMoverQuery,
EntityQuery<MovementRelayTargetComponent> relayTargetQuery,
EntityQuery<SharedPullableComponent> pullableQuery,
EntityQuery<MovementSpeedModifierComponent> modifierQuery)
{ {
var canMove = mover.CanMove; var canMove = mover.CanMove;
if (relayTargetQuery.TryGetComponent(uid, out var relayTarget)) if (RelayTargetQuery.TryGetComponent(uid, out var relayTarget))
{ {
if (_mobState.IsIncapacitated(relayTarget.Source) || if (_mobState.IsIncapacitated(relayTarget.Source) ||
!moverQuery.TryGetComponent(relayTarget.Source, out var relayedMover)) !MoverQuery.TryGetComponent(relayTarget.Source, out var relayedMover))
{ {
canMove = false; canMove = false;
} }
@@ -128,17 +138,17 @@ namespace Content.Shared.Movement.Systems
// Update relative movement // Update relative movement
if (mover.LerpTarget < Timing.CurTime) if (mover.LerpTarget < Timing.CurTime)
{ {
if (TryUpdateRelative(mover, xform, xformQuery)) if (TryUpdateRelative(mover, xform))
{ {
Dirty(mover); Dirty(uid, mover);
} }
} }
LerpRotation(mover, frameTime); LerpRotation(uid, mover, frameTime);
if (!canMove if (!canMove
|| physicsComponent.BodyStatus != BodyStatus.OnGround || physicsComponent.BodyStatus != BodyStatus.OnGround
|| pullableQuery.TryGetComponent(uid, out var pullable) && pullable.BeingPulled) || PullableQuery.TryGetComponent(uid, out var pullable) && pullable.BeingPulled)
{ {
UsedMobMovement[uid] = false; UsedMobMovement[uid] = false;
return; return;
@@ -171,14 +181,14 @@ namespace Content.Shared.Movement.Systems
// Regular movement. // Regular movement.
// Target velocity. // Target velocity.
// This is relative to the map / grid we're on. // This is relative to the map / grid we're on.
var moveSpeedComponent = modifierQuery.CompOrNull(uid); var moveSpeedComponent = ModifierQuery.CompOrNull(uid);
var walkSpeed = moveSpeedComponent?.CurrentWalkSpeed ?? MovementSpeedModifierComponent.DefaultBaseWalkSpeed; var walkSpeed = moveSpeedComponent?.CurrentWalkSpeed ?? MovementSpeedModifierComponent.DefaultBaseWalkSpeed;
var sprintSpeed = moveSpeedComponent?.CurrentSprintSpeed ?? MovementSpeedModifierComponent.DefaultBaseSprintSpeed; var sprintSpeed = moveSpeedComponent?.CurrentSprintSpeed ?? MovementSpeedModifierComponent.DefaultBaseSprintSpeed;
var total = walkDir * walkSpeed + sprintDir * sprintSpeed; var total = walkDir * walkSpeed + sprintDir * sprintSpeed;
var parentRotation = GetParentGridAngle(mover, xformQuery); var parentRotation = GetParentGridAngle(mover);
var worldTotal = _relativeMovement ? parentRotation.RotateVec(total) : total; var worldTotal = _relativeMovement ? parentRotation.RotateVec(total) : total;
DebugTools.Assert(MathHelper.CloseToPercent(total.Length(), worldTotal.Length())); DebugTools.Assert(MathHelper.CloseToPercent(total.Length(), worldTotal.Length()));
@@ -223,7 +233,7 @@ namespace Content.Shared.Movement.Systems
// TODO apparently this results in a duplicate move event because "This should have its event run during // TODO apparently this results in a duplicate move event because "This should have its event run during
// island solver"??. So maybe SetRotation needs an argument to avoid raising an event? // island solver"??. So maybe SetRotation needs an argument to avoid raising an event?
if (!weightless && mobMoverQuery.TryGetComponent(uid, out var mobMover) && if (!weightless && MobMoverQuery.TryGetComponent(uid, out var mobMover) &&
TryGetSound(weightless, uid, mover, mobMover, xform, out var sound)) TryGetSound(weightless, uid, mover, mobMover, xform, out var sound))
{ {
var soundModifier = mover.Sprinting ? 3.5f : 1.5f; var soundModifier = mover.Sprinting ? 3.5f : 1.5f;
@@ -255,7 +265,7 @@ namespace Content.Shared.Movement.Systems
PhysicsSystem.SetAngularVelocity(physicsUid, 0, body: physicsComponent); PhysicsSystem.SetAngularVelocity(physicsUid, 0, body: physicsComponent);
} }
public void LerpRotation(InputMoverComponent mover, float frameTime) public void LerpRotation(EntityUid uid, InputMoverComponent mover, float frameTime)
{ {
var angleDiff = Angle.ShortestDistance(mover.RelativeRotation, mover.TargetRelativeRotation); var angleDiff = Angle.ShortestDistance(mover.RelativeRotation, mover.TargetRelativeRotation);
@@ -278,13 +288,13 @@ namespace Content.Shared.Movement.Systems
mover.RelativeRotation += adjustment; mover.RelativeRotation += adjustment;
mover.RelativeRotation.FlipPositive(); mover.RelativeRotation.FlipPositive();
Dirty(mover); Dirty(uid, mover);
} }
else if (!angleDiff.Equals(Angle.Zero)) else if (!angleDiff.Equals(Angle.Zero))
{ {
mover.TargetRelativeRotation.FlipPositive(); mover.TargetRelativeRotation.FlipPositive();
mover.RelativeRotation = mover.TargetRelativeRotation; mover.RelativeRotation = mover.TargetRelativeRotation;
Dirty(mover); Dirty(uid, mover);
} }
} }