Set mover velocity via system (#6288)
This commit is contained in:
@@ -19,9 +19,9 @@ namespace Content.Client.Physics.Controllers
|
||||
base.UpdateBeforeSolve(prediction, frameTime);
|
||||
|
||||
if (_playerManager.LocalPlayer?.ControlledEntity is not {Valid: true} player ||
|
||||
!EntityManager.TryGetComponent(player, out IMoverComponent? mover) ||
|
||||
!EntityManager.TryGetComponent(player, out PhysicsComponent? body) ||
|
||||
!EntityManager.TryGetComponent(player, out TransformComponent? xform))
|
||||
!TryComp(player, out IMoverComponent? mover) ||
|
||||
!TryComp(player, out PhysicsComponent? body) ||
|
||||
!TryComp(player, out TransformComponent? xform))
|
||||
{
|
||||
return;
|
||||
}
|
||||
@@ -37,7 +37,7 @@ namespace Content.Client.Physics.Controllers
|
||||
// We set joints to predicted given these can affect how our mob moves.
|
||||
// I would only recommend disabling this if you make pulling not use joints anymore (someday maybe?)
|
||||
|
||||
if (EntityManager.TryGetComponent(player, out JointComponent? jointComponent))
|
||||
if (TryComp(player, out JointComponent? jointComponent))
|
||||
{
|
||||
foreach (var joint in jointComponent.GetJoints)
|
||||
{
|
||||
@@ -47,9 +47,9 @@ namespace Content.Client.Physics.Controllers
|
||||
}
|
||||
|
||||
// If we're being pulled then we won't predict anything and will receive server lerps so it looks way smoother.
|
||||
if (EntityManager.TryGetComponent(player, out SharedPullableComponent? pullableComp))
|
||||
if (TryComp(player, out SharedPullableComponent? pullableComp))
|
||||
{
|
||||
if (pullableComp.Puller is {Valid: true} puller && EntityManager.TryGetComponent<PhysicsComponent?>(puller, out var pullerBody))
|
||||
if (pullableComp.Puller is {Valid: true} puller && TryComp<PhysicsComponent?>(puller, out var pullerBody))
|
||||
{
|
||||
pullerBody.Predict = false;
|
||||
body.Predict = false;
|
||||
@@ -57,20 +57,20 @@ namespace Content.Client.Physics.Controllers
|
||||
}
|
||||
|
||||
// If we're pulling a mob then make sure that isn't predicted so it doesn't fuck our velocity up.
|
||||
if (EntityManager.TryGetComponent(player, out SharedPullerComponent? pullerComp))
|
||||
if (TryComp(player, out SharedPullerComponent? pullerComp))
|
||||
{
|
||||
if (pullerComp.Pulling is {Valid: true} pulling &&
|
||||
EntityManager.HasComponent<MobStateComponent>(pulling) &&
|
||||
EntityManager.TryGetComponent(pulling, out PhysicsComponent? pullingBody))
|
||||
HasComp<MobStateComponent>(pulling) &&
|
||||
TryComp(pulling, out PhysicsComponent? pullingBody))
|
||||
{
|
||||
pullingBody.Predict = false;
|
||||
}
|
||||
}
|
||||
|
||||
// Server-side should just be handled on its own so we'll just do this shizznit
|
||||
if (EntityManager.TryGetComponent(player, out IMobMoverComponent? mobMover))
|
||||
if (TryComp(player, out IMobMoverComponent? mobMover))
|
||||
{
|
||||
HandleMobMovement(mover, body, mobMover);
|
||||
HandleMobMovement(mover, body, mobMover, xform);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@ namespace Content.Server.Audio
|
||||
if (!EntityManager.TryGetComponent<AmbientSoundComponent>(uid, out var ambientSound)) return;
|
||||
if (ambientSound.Enabled == args.Supply) return;
|
||||
ambientSound.Enabled = args.Supply;
|
||||
ambientSound.Dirty();
|
||||
Dirty(ambientSound);
|
||||
}
|
||||
|
||||
private void HandlePowerChange(EntityUid uid, AmbientOnPoweredComponent component, PowerChangedEvent args)
|
||||
@@ -27,7 +27,7 @@ namespace Content.Server.Audio
|
||||
if (!EntityManager.TryGetComponent<AmbientSoundComponent>(uid, out var ambientSound)) return;
|
||||
if (ambientSound.Enabled == args.Powered) return;
|
||||
ambientSound.Enabled = args.Powered;
|
||||
ambientSound.Dirty();
|
||||
Dirty(ambientSound);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -94,7 +94,7 @@ namespace Content.Server.Buckle.Systems
|
||||
continue;
|
||||
}
|
||||
buckled.ReAttach(strap);
|
||||
buckled.Dirty();
|
||||
Dirty(buckled);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -223,7 +223,8 @@ namespace Content.Server.Cargo
|
||||
{
|
||||
if (comp.Database == null || comp.Database.Id != id)
|
||||
continue;
|
||||
comp.Dirty();
|
||||
|
||||
Dirty(comp);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,7 +20,7 @@ namespace Content.Server.Chemistry.EntitySystems
|
||||
|
||||
private void OnSolutionChange(EntityUid uid, HyposprayComponent component, SolutionChangedEvent args)
|
||||
{
|
||||
component.Dirty();
|
||||
Dirty(component);
|
||||
}
|
||||
|
||||
public void OnAfterInteract(EntityUid uid, HyposprayComponent comp, AfterInteractEvent args)
|
||||
|
||||
@@ -28,7 +28,7 @@ namespace Content.Server.Chemistry.EntitySystems
|
||||
|
||||
private void OnSolutionChange(EntityUid uid, InjectorComponent component, SolutionChangedEvent args)
|
||||
{
|
||||
component.Dirty();
|
||||
Dirty(component);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -122,7 +122,7 @@ namespace Content.Server.Cuffs
|
||||
{
|
||||
cuffable.CanStillInteract = handCount > cuffable.CuffedHandCount;
|
||||
cuffable.CuffedStateChanged();
|
||||
cuffable.Dirty();
|
||||
Dirty(cuffable);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -417,7 +417,7 @@ namespace Content.Server.Disposal.Unit.EntitySystems
|
||||
}
|
||||
|
||||
if (count != component.RecentlyEjected.Count)
|
||||
component.Dirty();
|
||||
Dirty(component);
|
||||
|
||||
return state == SharedDisposalUnitComponent.PressureState.Ready && component.RecentlyEjected.Count == 0;
|
||||
}
|
||||
@@ -604,7 +604,7 @@ namespace Content.Server.Disposal.Unit.EntitySystems
|
||||
if (!component.RecentlyEjected.Contains(entity))
|
||||
component.RecentlyEjected.Add(entity);
|
||||
|
||||
component.Dirty();
|
||||
Dirty(component);
|
||||
HandleStateChange(component, true);
|
||||
UpdateVisualState(component);
|
||||
}
|
||||
|
||||
@@ -124,7 +124,7 @@ namespace Content.Server.Flash
|
||||
{
|
||||
flashable.LastFlash = _gameTiming.CurTime;
|
||||
flashable.Duration = flashDuration / 1000f; // TODO: Make this sane...
|
||||
flashable.Dirty();
|
||||
Dirty(flashable);
|
||||
|
||||
_stunSystem.TrySlowdown(target, TimeSpan.FromSeconds(flashDuration/1000f), true,
|
||||
slowTo, slowTo);
|
||||
|
||||
@@ -49,10 +49,10 @@ namespace Content.Server.Physics.Controllers
|
||||
base.UpdateBeforeSolve(prediction, frameTime);
|
||||
_excludedMobs.Clear();
|
||||
|
||||
foreach (var (mobMover, mover, physics) in EntityManager.EntityQuery<IMobMoverComponent, IMoverComponent, PhysicsComponent>())
|
||||
foreach (var (mobMover, mover, physics, xform) in EntityManager.EntityQuery<IMobMoverComponent, IMoverComponent, PhysicsComponent, TransformComponent>())
|
||||
{
|
||||
_excludedMobs.Add(mover.Owner);
|
||||
HandleMobMovement(mover, physics, mobMover);
|
||||
HandleMobMovement(mover, physics, mobMover, xform);
|
||||
}
|
||||
|
||||
HandleShuttleMovement(frameTime);
|
||||
|
||||
@@ -17,7 +17,7 @@ namespace Content.Server.Weapon.Ranged
|
||||
// Instead of dirtying on hand-select this component should probably by dirtied whenever it needs to be.
|
||||
// I take no responsibility for this code. It was like this when I got here.
|
||||
|
||||
component.Dirty();
|
||||
Dirty(component);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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