diff --git a/Content.Client/Physics/Controllers/MoverController.cs b/Content.Client/Physics/Controllers/MoverController.cs index 0a0d22e68f..54c5c3de15 100644 --- a/Content.Client/Physics/Controllers/MoverController.cs +++ b/Content.Client/Physics/Controllers/MoverController.cs @@ -58,7 +58,7 @@ namespace Content.Client.Physics.Controllers { Physics.UpdateIsPredicted(uid); Physics.UpdateIsPredicted(component.RelayEntity); - if (TryComp(component.RelayEntity, out var inputMover)) + if (MoverQuery.TryGetComponent(component.RelayEntity, out var inputMover)) SetMoveInput(inputMover, MoveButtons.None); } @@ -66,7 +66,7 @@ namespace Content.Client.Physics.Controllers { Physics.UpdateIsPredicted(uid); Physics.UpdateIsPredicted(component.RelayEntity); - if (TryComp(component.RelayEntity, out var inputMover)) + if (MoverQuery.TryGetComponent(component.RelayEntity, out var inputMover)) SetMoveInput(inputMover, MoveButtons.None); } @@ -87,7 +87,7 @@ namespace Content.Client.Physics.Controllers if (_playerManager.LocalPlayer?.ControlledEntity is not {Valid: true} player) return; - if (TryComp(player, out var relayMover)) + if (RelayQuery.TryGetComponent(player, out var relayMover)) HandleClientsideMovement(relayMover.RelayEntity, frameTime); HandleClientsideMovement(player, frameTime); @@ -95,15 +95,8 @@ namespace Content.Client.Physics.Controllers private void HandleClientsideMovement(EntityUid player, float frameTime) { - var xformQuery = GetEntityQuery(); - var moverQuery = GetEntityQuery(); - var relayTargetQuery = GetEntityQuery(); - var mobMoverQuery = GetEntityQuery(); - var pullableQuery = GetEntityQuery(); - var modifierQuery = GetEntityQuery(); - - if (!moverQuery.TryGetComponent(player, out var mover) || - !xformQuery.TryGetComponent(player, out var xform)) + if (!MoverQuery.TryGetComponent(player, out var mover) || + !XformQuery.TryGetComponent(player, out var xform)) { return; } @@ -112,17 +105,17 @@ namespace Content.Client.Physics.Controllers PhysicsComponent? body; var xformMover = xform; - if (mover.ToParent && HasComp(xform.ParentUid)) + if (mover.ToParent && RelayQuery.HasComponent(xform.ParentUid)) { - if (!TryComp(xform.ParentUid, out body) || - !TryComp(xform.ParentUid, out xformMover)) + if (!PhysicsQuery.TryGetComponent(xform.ParentUid, out body) || + !XformQuery.TryGetComponent(xform.ParentUid, out xformMover)) { return; } physicsUid = xform.ParentUid; } - else if (!TryComp(player, out body)) + else if (!PhysicsQuery.TryGetComponent(player, out body)) { return; } @@ -134,13 +127,7 @@ namespace Content.Client.Physics.Controllers physicsUid, body, xformMover, - frameTime, - xformQuery, - moverQuery, - mobMoverQuery, - relayTargetQuery, - pullableQuery, - modifierQuery); + frameTime); } protected override bool CanSound() diff --git a/Content.Client/Replay/Spectator/ReplaySpectatorSystem.Movement.cs b/Content.Client/Replay/Spectator/ReplaySpectatorSystem.Movement.cs index f15385adca..2b72d2563b 100644 --- a/Content.Client/Replay/Spectator/ReplaySpectatorSystem.Movement.cs +++ b/Content.Client/Replay/Spectator/ReplaySpectatorSystem.Movement.cs @@ -50,7 +50,8 @@ public sealed partial class ReplaySpectatorSystem if (Direction == DirectionFlag.None) { if (TryComp(player, out InputMoverComponent? cmp)) - _mover.LerpRotation(cmp, frameTime); + _mover.LerpRotation(player, cmp, frameTime); + return; } @@ -64,7 +65,7 @@ public sealed partial class ReplaySpectatorSystem if (!TryComp(player, out InputMoverComponent? mover)) return; - _mover.LerpRotation(mover, frameTime); + _mover.LerpRotation(player, mover, frameTime); var effectiveDir = Direction; if ((Direction & DirectionFlag.North) != 0) @@ -75,7 +76,7 @@ public sealed partial class ReplaySpectatorSystem var query = GetEntityQuery(); var xform = query.GetComponent(player); - var pos = _transform.GetWorldPosition(xform, query); + var pos = _transform.GetWorldPosition(xform); if (!xform.ParentUid.IsValid()) { @@ -93,12 +94,12 @@ public sealed partial class ReplaySpectatorSystem if (xform.ParentUid.IsValid()) _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 worldVec = parentRotation.RotateVec(localVec); var speed = CompOrNull(player)?.BaseSprintSpeed ?? DefaultSpeed; 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 diff --git a/Content.Server/Physics/Controllers/MoverController.cs b/Content.Server/Physics/Controllers/MoverController.cs index b9101a89df..c6bb5fa6cc 100644 --- a/Content.Server/Physics/Controllers/MoverController.cs +++ b/Content.Server/Physics/Controllers/MoverController.cs @@ -33,13 +33,13 @@ namespace Content.Server.Physics.Controllers private void OnRelayPlayerAttached(EntityUid uid, RelayInputMoverComponent component, PlayerAttachedEvent args) { - if (TryComp(component.RelayEntity, out var inputMover)) + if (MoverQuery.TryGetComponent(component.RelayEntity, out var inputMover)) SetMoveInput(inputMover, MoveButtons.None); } private void OnRelayPlayerDetached(EntityUid uid, RelayInputMoverComponent component, PlayerDetachedEvent args) { - if (TryComp(component.RelayEntity, out var inputMover)) + if (MoverQuery.TryGetComponent(component.RelayEntity, out var inputMover)) SetMoveInput(inputMover, MoveButtons.None); } @@ -62,24 +62,16 @@ namespace Content.Server.Physics.Controllers { base.UpdateBeforeSolve(prediction, frameTime); - var bodyQuery = GetEntityQuery(); - var relayQuery = GetEntityQuery(); - var relayTargetQuery = GetEntityQuery(); - var xformQuery = GetEntityQuery(); - var moverQuery = GetEntityQuery(); - var mobMoverQuery = GetEntityQuery(); - var pullableQuery = GetEntityQuery(); var inputQueryEnumerator = AllEntityQuery(); - var modifierQuery = GetEntityQuery(); while (inputQueryEnumerator.MoveNext(out var uid, out var mover)) { var physicsUid = uid; - if (relayQuery.HasComponent(uid)) + if (RelayQuery.HasComponent(uid)) continue; - if (!xformQuery.TryGetComponent(uid, out var xform)) + if (!XformQuery.TryGetComponent(uid, out var xform)) { continue; } @@ -87,17 +79,17 @@ namespace Content.Server.Physics.Controllers PhysicsComponent? body; var xformMover = xform; - if (mover.ToParent && relayQuery.HasComponent(xform.ParentUid)) + if (mover.ToParent && RelayQuery.HasComponent(xform.ParentUid)) { - if (!bodyQuery.TryGetComponent(xform.ParentUid, out body) || - !TryComp(xform.ParentUid, out xformMover)) + if (!PhysicsQuery.TryGetComponent(xform.ParentUid, out body) || + !XformQuery.TryGetComponent(xform.ParentUid, out xformMover)) { continue; } physicsUid = xform.ParentUid; } - else if (!bodyQuery.TryGetComponent(uid, out body)) + else if (!PhysicsQuery.TryGetComponent(uid, out body)) { continue; } @@ -107,13 +99,7 @@ namespace Content.Server.Physics.Controllers physicsUid, body, xformMover, - frameTime, - xformQuery, - moverQuery, - mobMoverQuery, - relayTargetQuery, - pullableQuery, - modifierQuery); + frameTime); } HandleShuttleMovement(frameTime); diff --git a/Content.Shared/Movement/Systems/SharedMoverController.Input.cs b/Content.Shared/Movement/Systems/SharedMoverController.Input.cs index e59abc56c9..41314d421a 100644 --- a/Content.Shared/Movement/Systems/SharedMoverController.Input.cs +++ b/Content.Shared/Movement/Systems/SharedMoverController.Input.cs @@ -68,7 +68,9 @@ namespace Content.Shared.Movement.Systems protected void SetMoveInput(InputMoverComponent component, MoveButtons buttons) { - if (component.HeldMoveButtons == buttons) return; + if (component.HeldMoveButtons == buttons) + return; + component.HeldMoveButtons = buttons; Dirty(component); } @@ -120,33 +122,31 @@ namespace Content.Shared.Movement.Systems public void RotateCamera(EntityUid uid, Angle angle) { - if (CameraRotationLocked || !TryComp(uid, out var mover)) + if (CameraRotationLocked || !MoverQuery.TryGetComponent(uid, out var mover)) return; mover.TargetRelativeRotation += angle; - Dirty(mover); + Dirty(uid, mover); } public void ResetCamera(EntityUid uid) { if (CameraRotationLocked || - !TryComp(uid, out var mover)) + !MoverQuery.TryGetComponent(uid, out var mover)) { return; } // If we updated parent then cancel the accumulator and force it now. - var xformQuery = GetEntityQuery(); - - if (!TryUpdateRelative(mover, xformQuery.GetComponent(uid), xformQuery) && mover.TargetRelativeRotation.Equals(Angle.Zero)) + if (!TryUpdateRelative(mover, XformQuery.GetComponent(uid)) && mover.TargetRelativeRotation.Equals(Angle.Zero)) return; mover.LerpTarget = TimeSpan.Zero; mover.TargetRelativeRotation = Angle.Zero; - Dirty(mover); + Dirty(uid, mover); } - private bool TryUpdateRelative(InputMoverComponent mover, TransformComponent xform, EntityQuery xformQuery) + private bool TryUpdateRelative(InputMoverComponent mover, TransformComponent xform) { var relative = xform.GridUid; relative ??= xform.MapUid; @@ -165,15 +165,15 @@ namespace Content.Shared.Movement.Systems var targetRotation = Angle.Zero; // 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. - 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 @@ -196,32 +196,24 @@ namespace Content.Shared.Movement.Systems return true; } - public Angle GetParentGridAngle(InputMoverComponent mover, EntityQuery xformQuery) + public Angle GetParentGridAngle(InputMoverComponent mover) { var rotation = mover.RelativeRotation; - if (xformQuery.TryGetComponent(mover.RelativeEntity, out var relativeXform)) - return (_transform.GetWorldRotation(relativeXform, xformQuery) + rotation); + if (XformQuery.TryGetComponent(mover.RelativeEntity, out var relativeXform)) + return _transform.GetWorldRotation(relativeXform) + rotation; return rotation; } - public Angle GetParentGridAngle(InputMoverComponent mover) - { - return GetParentGridAngle(mover, GetEntityQuery()); - } - private void OnFollowedParentChange(EntityUid uid, FollowedComponent component, ref EntParentChangedMessage args) { - var moverQuery = GetEntityQuery(); - var xformQuery = GetEntityQuery(); - foreach (var foll in component.Following) { - if (!moverQuery.TryGetComponent(foll, out var mover)) + if (!MoverQuery.TryGetComponent(foll, out var mover)) 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); } } @@ -235,7 +227,7 @@ namespace Content.Shared.Movement.Systems if (component.LifeStage < ComponentLifeStage.Running) { component.RelativeEntity = relative; - Dirty(component); + Dirty(uid, component); return; } @@ -249,7 +241,7 @@ namespace Content.Shared.Movement.Systems component.TargetRelativeRotation = Angle.Zero; component.RelativeRotation = Angle.Zero; component.LerpTarget = TimeSpan.Zero; - Dirty(component); + Dirty(uid, component); return; } @@ -259,14 +251,14 @@ namespace Content.Shared.Movement.Systems if (component.LerpTarget >= Timing.CurTime) { component.LerpTarget = TimeSpan.Zero; - Dirty(component); + Dirty(uid, component); } return; } component.LerpTarget = TimeSpan.FromSeconds(InputMoverComponent.LerpTime) + Timing.CurTime; - Dirty(component); + Dirty(uid, component); } 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.AssertNotNull(relayMover.RelayEntity); - if (TryComp(entity, out var mover)) + if (MoverQuery.TryGetComponent(entity, out var mover)) SetMoveInput(mover, MoveButtons.None); if (!_mobState.IsIncapacitated(entity)) @@ -288,7 +280,7 @@ namespace Content.Shared.Movement.Systems return; } - if (!TryComp(entity, out var moverComp)) + if (!MoverQuery.TryGetComponent(entity, out var moverComp)) return; // 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) { - TryComp(uid, out var moverComp); + MoverQuery.TryGetComponent(uid, out var moverComp); if (TryComp(uid, out var relayMover)) { diff --git a/Content.Shared/Movement/Systems/SharedMoverController.cs b/Content.Shared/Movement/Systems/SharedMoverController.cs index b841f882e7..b115e55465 100644 --- a/Content.Shared/Movement/Systems/SharedMoverController.cs +++ b/Content.Shared/Movement/Systems/SharedMoverController.cs @@ -29,27 +29,34 @@ namespace Content.Shared.Movement.Systems /// public abstract partial class SharedMoverController : VirtualController { - [Dependency] private readonly IConfigurationManager _configManager = default!; + [Dependency] private readonly IConfigurationManager _configManager = default!; [Dependency] protected readonly IGameTiming Timing = default!; + [Dependency] private readonly IMapManager _mapManager = default!; + [Dependency] private readonly ITileDefinitionManager _tileDefinitionManager = default!; + [Dependency] private readonly EntityLookupSystem _lookup = default!; + [Dependency] private readonly InventorySystem _inventory = default!; + [Dependency] private readonly MobStateSystem _mobState = 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 IMapManager _mapManager = 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 SharedGravitySystem _gravity = default!; - [Dependency] private readonly MobStateSystem _mobState = default!; - [Dependency] private readonly SharedAudioSystem _audio = default!; - [Dependency] private readonly SharedTransformSystem _transform = default!; - [Dependency] private readonly TagSystem _tags = default!; + [Dependency] private readonly SharedTransformSystem _transform = default!; + [Dependency] private readonly TagSystem _tags = default!; + + protected EntityQuery MoverQuery; + protected EntityQuery MobMoverQuery; + protected EntityQuery RelayTargetQuery; + protected EntityQuery ModifierQuery; + protected EntityQuery PhysicsQuery; + protected EntityQuery RelayQuery; + protected EntityQuery PullableQuery; + protected EntityQuery XformQuery; private const float StepSoundMoveDistanceRunning = 2; private const float StepSoundMoveDistanceWalking = 1.5f; private const float FootstepVariation = 0f; - protected ISawmill Sawmill = default!; - /// /// /// @@ -65,7 +72,16 @@ namespace Content.Shared.Movement.Systems public override void Initialize() { base.Initialize(); - Sawmill = Logger.GetSawmill("mover"); + + MoverQuery = GetEntityQuery(); + MobMoverQuery = GetEntityQuery(); + ModifierQuery = GetEntityQuery(); + RelayTargetQuery = GetEntityQuery(); + PhysicsQuery = GetEntityQuery(); + RelayQuery = GetEntityQuery(); + PullableQuery = GetEntityQuery(); + XformQuery = GetEntityQuery(); + InitializeFootsteps(); InitializeInput(); InitializeMob(); @@ -101,19 +117,13 @@ namespace Content.Shared.Movement.Systems EntityUid physicsUid, PhysicsComponent physicsComponent, TransformComponent xform, - float frameTime, - EntityQuery xformQuery, - EntityQuery moverQuery, - EntityQuery mobMoverQuery, - EntityQuery relayTargetQuery, - EntityQuery pullableQuery, - EntityQuery modifierQuery) + float frameTime) { var canMove = mover.CanMove; - if (relayTargetQuery.TryGetComponent(uid, out var relayTarget)) + if (RelayTargetQuery.TryGetComponent(uid, out var relayTarget)) { if (_mobState.IsIncapacitated(relayTarget.Source) || - !moverQuery.TryGetComponent(relayTarget.Source, out var relayedMover)) + !MoverQuery.TryGetComponent(relayTarget.Source, out var relayedMover)) { canMove = false; } @@ -128,17 +138,17 @@ namespace Content.Shared.Movement.Systems // Update relative movement 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 || physicsComponent.BodyStatus != BodyStatus.OnGround - || pullableQuery.TryGetComponent(uid, out var pullable) && pullable.BeingPulled) + || PullableQuery.TryGetComponent(uid, out var pullable) && pullable.BeingPulled) { UsedMobMovement[uid] = false; return; @@ -171,14 +181,14 @@ namespace Content.Shared.Movement.Systems // Regular movement. // Target velocity. // 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 sprintSpeed = moveSpeedComponent?.CurrentSprintSpeed ?? MovementSpeedModifierComponent.DefaultBaseSprintSpeed; var total = walkDir * walkSpeed + sprintDir * sprintSpeed; - var parentRotation = GetParentGridAngle(mover, xformQuery); + var parentRotation = GetParentGridAngle(mover); var worldTotal = _relativeMovement ? parentRotation.RotateVec(total) : total; 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 // 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)) { var soundModifier = mover.Sprinting ? 3.5f : 1.5f; @@ -255,7 +265,7 @@ namespace Content.Shared.Movement.Systems 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); @@ -278,13 +288,13 @@ namespace Content.Shared.Movement.Systems mover.RelativeRotation += adjustment; mover.RelativeRotation.FlipPositive(); - Dirty(mover); + Dirty(uid, mover); } else if (!angleDiff.Equals(Angle.Zero)) { mover.TargetRelativeRotation.FlipPositive(); mover.RelativeRotation = mover.TargetRelativeRotation; - Dirty(mover); + Dirty(uid, mover); } }