Set mover velocity via system (#6288)

This commit is contained in:
metalgearsloth
2022-02-02 17:34:25 +11:00
committed by GitHub
parent 0349a854ac
commit 2e5808085d
12 changed files with 44 additions and 47 deletions

View File

@@ -23,11 +23,10 @@ namespace Content.Shared.Movement
/// </summary>
public abstract class SharedMoverController : VirtualController
{
[Dependency] private readonly IEntityManager _entityManager = default!;
[Dependency] private readonly IMapManager _mapManager = default!;
private ActionBlockerSystem _blocker = default!;
private SharedPhysicsSystem _broadPhaseSystem = default!;
[Dependency] private ActionBlockerSystem _blocker = default!;
[Dependency] private readonly SharedPhysicsSystem _physics = default!;
private bool _relativeMovement;
@@ -39,8 +38,6 @@ namespace Content.Shared.Movement
public override void Initialize()
{
base.Initialize();
_broadPhaseSystem = EntitySystem.Get<SharedPhysicsSystem>();
_blocker = EntitySystem.Get<ActionBlockerSystem>();
var configManager = IoCManager.Resolve<IConfigurationManager>();
configManager.OnValueChanged(CCVars.RelativeMovement, SetRelativeMovement, true);
UpdatesBefore.Add(typeof(SharedTileFrictionController));
@@ -91,17 +88,17 @@ namespace Content.Shared.Movement
if (worldTotal != Vector2.Zero)
transform.WorldRotation = worldTotal.GetDir().ToAngle();
physicsComponent.LinearVelocity = worldTotal;
_physics.SetLinearVelocity(physicsComponent, worldTotal);
}
/// <summary>
/// Movement while considering actionblockers, weightlessness, etc.
/// </summary>
/// <param name="mover"></param>
/// <param name="physicsComponent"></param>
/// <param name="mobMover"></param>
protected void HandleMobMovement(IMoverComponent mover, PhysicsComponent physicsComponent,
IMobMoverComponent mobMover)
protected void HandleMobMovement(
IMoverComponent mover,
PhysicsComponent physicsComponent,
IMobMoverComponent mobMover,
TransformComponent xform)
{
DebugTools.Assert(!UsedMobMovement.ContainsKey(mover.Owner));
@@ -112,22 +109,21 @@ namespace Content.Shared.Movement
}
UsedMobMovement[mover.Owner] = true;
var transform = EntityManager.GetComponent<TransformComponent>(mover.Owner);
var weightless = mover.Owner.IsWeightless(physicsComponent, mapManager: _mapManager, entityManager: _entityManager);
var weightless = mover.Owner.IsWeightless(physicsComponent, mapManager: _mapManager, entityManager: EntityManager);
var (walkDir, sprintDir) = mover.VelocityDir;
// Handle wall-pushes.
if (weightless)
{
// No gravity: is our entity touching anything?
var touching = IsAroundCollider(_broadPhaseSystem, transform, mobMover, physicsComponent);
var touching = IsAroundCollider(_physics, xform, mobMover, physicsComponent);
if (!touching)
{
if (transform.GridID != GridId.Invalid)
mover.LastGridAngle = GetParentGridAngle(transform, mover);
if (xform.GridID != GridId.Invalid)
mover.LastGridAngle = GetParentGridAngle(xform, mover);
transform.WorldRotation = physicsComponent.LinearVelocity.GetDir().ToAngle();
xform.WorldRotation = physicsComponent.LinearVelocity.GetDir().ToAngle();
return;
}
}
@@ -137,7 +133,7 @@ namespace Content.Shared.Movement
// This is relative to the map / grid we're on.
var total = walkDir * mover.CurrentWalkSpeed + sprintDir * mover.CurrentSprintSpeed;
var parentRotation = GetParentGridAngle(transform, mover);
var parentRotation = GetParentGridAngle(xform, mover);
var worldTotal = _relativeMovement ? parentRotation.RotateVec(total) : total;
@@ -146,19 +142,19 @@ namespace Content.Shared.Movement
if (weightless)
worldTotal *= mobMover.WeightlessStrength;
if (transform.GridID != GridId.Invalid)
if (xform.GridID != GridId.Invalid)
mover.LastGridAngle = parentRotation;
if (worldTotal != Vector2.Zero)
{
// This should have its event run during island solver soooo
transform.DeferUpdates = true;
transform.WorldRotation = worldTotal.GetDir().ToAngle();
transform.DeferUpdates = false;
xform.DeferUpdates = true;
xform.WorldRotation = worldTotal.GetDir().ToAngle();
xform.DeferUpdates = false;
HandleFootsteps(mover, mobMover);
}
physicsComponent.LinearVelocity = worldTotal;
_physics.SetLinearVelocity(physicsComponent, worldTotal);
}
public bool UseMobMovement(EntityUid uid)