Set mover velocity via system (#6288)
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user