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:
@@ -29,27 +29,34 @@ namespace Content.Shared.Movement.Systems
|
||||
/// </summary>
|
||||
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<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 StepSoundMoveDistanceWalking = 1.5f;
|
||||
|
||||
private const float FootstepVariation = 0f;
|
||||
|
||||
protected ISawmill Sawmill = default!;
|
||||
|
||||
/// <summary>
|
||||
/// <see cref="CCVars.StopSpeed"/>
|
||||
/// </summary>
|
||||
@@ -65,7 +72,16 @@ namespace Content.Shared.Movement.Systems
|
||||
public override void 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();
|
||||
InitializeInput();
|
||||
InitializeMob();
|
||||
@@ -101,19 +117,13 @@ namespace Content.Shared.Movement.Systems
|
||||
EntityUid physicsUid,
|
||||
PhysicsComponent physicsComponent,
|
||||
TransformComponent xform,
|
||||
float frameTime,
|
||||
EntityQuery<TransformComponent> xformQuery,
|
||||
EntityQuery<InputMoverComponent> moverQuery,
|
||||
EntityQuery<MobMoverComponent> mobMoverQuery,
|
||||
EntityQuery<MovementRelayTargetComponent> relayTargetQuery,
|
||||
EntityQuery<SharedPullableComponent> pullableQuery,
|
||||
EntityQuery<MovementSpeedModifierComponent> 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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user