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:
@@ -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()
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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))
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user