From 2e5808085d3c53dc9f25b287a338b52a2614ce56 Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Wed, 2 Feb 2022 17:34:25 +1100 Subject: [PATCH] Set mover velocity via system (#6288) --- .../Physics/Controllers/MoverController.cs | 22 +++++----- Content.Server/Audio/AmbientSoundSystem.cs | 4 +- Content.Server/Buckle/Systems/BuckleSystem.cs | 2 +- Content.Server/Cargo/CargoConsoleSystem.cs | 3 +- .../EntitySystems/HypospraySystem.cs | 2 +- .../Chemistry/EntitySystems/InjectorSystem.cs | 2 +- Content.Server/Cuffs/CuffableSystem.cs | 2 +- .../Unit/EntitySystems/DisposalUnitSystem.cs | 4 +- Content.Server/Flash/FlashSystem.cs | 2 +- .../Physics/Controllers/MoverController.cs | 4 +- .../Weapon/Ranged/RangedWeaponSystem.cs | 2 +- .../Movement/SharedMoverController.cs | 42 +++++++++---------- 12 files changed, 44 insertions(+), 47 deletions(-) diff --git a/Content.Client/Physics/Controllers/MoverController.cs b/Content.Client/Physics/Controllers/MoverController.cs index 2979af236b..91d1735d39 100644 --- a/Content.Client/Physics/Controllers/MoverController.cs +++ b/Content.Client/Physics/Controllers/MoverController.cs @@ -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(puller, out var pullerBody)) + if (pullableComp.Puller is {Valid: true} puller && TryComp(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(pulling) && - EntityManager.TryGetComponent(pulling, out PhysicsComponent? pullingBody)) + HasComp(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; } diff --git a/Content.Server/Audio/AmbientSoundSystem.cs b/Content.Server/Audio/AmbientSoundSystem.cs index b148053ff4..16c6d29f45 100644 --- a/Content.Server/Audio/AmbientSoundSystem.cs +++ b/Content.Server/Audio/AmbientSoundSystem.cs @@ -19,7 +19,7 @@ namespace Content.Server.Audio if (!EntityManager.TryGetComponent(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(uid, out var ambientSound)) return; if (ambientSound.Enabled == args.Powered) return; ambientSound.Enabled = args.Powered; - ambientSound.Dirty(); + Dirty(ambientSound); } } } diff --git a/Content.Server/Buckle/Systems/BuckleSystem.cs b/Content.Server/Buckle/Systems/BuckleSystem.cs index 7586047fb3..ddc6043374 100644 --- a/Content.Server/Buckle/Systems/BuckleSystem.cs +++ b/Content.Server/Buckle/Systems/BuckleSystem.cs @@ -94,7 +94,7 @@ namespace Content.Server.Buckle.Systems continue; } buckled.ReAttach(strap); - buckled.Dirty(); + Dirty(buckled); } } diff --git a/Content.Server/Cargo/CargoConsoleSystem.cs b/Content.Server/Cargo/CargoConsoleSystem.cs index f6aebf7b16..317fa8b9d0 100644 --- a/Content.Server/Cargo/CargoConsoleSystem.cs +++ b/Content.Server/Cargo/CargoConsoleSystem.cs @@ -223,7 +223,8 @@ namespace Content.Server.Cargo { if (comp.Database == null || comp.Database.Id != id) continue; - comp.Dirty(); + + Dirty(comp); } } } diff --git a/Content.Server/Chemistry/EntitySystems/HypospraySystem.cs b/Content.Server/Chemistry/EntitySystems/HypospraySystem.cs index c335ebfbaa..e19151cb76 100644 --- a/Content.Server/Chemistry/EntitySystems/HypospraySystem.cs +++ b/Content.Server/Chemistry/EntitySystems/HypospraySystem.cs @@ -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) diff --git a/Content.Server/Chemistry/EntitySystems/InjectorSystem.cs b/Content.Server/Chemistry/EntitySystems/InjectorSystem.cs index 19bc66986e..06843489ce 100644 --- a/Content.Server/Chemistry/EntitySystems/InjectorSystem.cs +++ b/Content.Server/Chemistry/EntitySystems/InjectorSystem.cs @@ -28,7 +28,7 @@ namespace Content.Server.Chemistry.EntitySystems private void OnSolutionChange(EntityUid uid, InjectorComponent component, SolutionChangedEvent args) { - component.Dirty(); + Dirty(component); } } } diff --git a/Content.Server/Cuffs/CuffableSystem.cs b/Content.Server/Cuffs/CuffableSystem.cs index 1ca61281d9..0e4145ea13 100644 --- a/Content.Server/Cuffs/CuffableSystem.cs +++ b/Content.Server/Cuffs/CuffableSystem.cs @@ -122,7 +122,7 @@ namespace Content.Server.Cuffs { cuffable.CanStillInteract = handCount > cuffable.CuffedHandCount; cuffable.CuffedStateChanged(); - cuffable.Dirty(); + Dirty(cuffable); } } } diff --git a/Content.Server/Disposal/Unit/EntitySystems/DisposalUnitSystem.cs b/Content.Server/Disposal/Unit/EntitySystems/DisposalUnitSystem.cs index fcc2154a66..df5833d2ca 100644 --- a/Content.Server/Disposal/Unit/EntitySystems/DisposalUnitSystem.cs +++ b/Content.Server/Disposal/Unit/EntitySystems/DisposalUnitSystem.cs @@ -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); } diff --git a/Content.Server/Flash/FlashSystem.cs b/Content.Server/Flash/FlashSystem.cs index 1737003091..63af4e152c 100644 --- a/Content.Server/Flash/FlashSystem.cs +++ b/Content.Server/Flash/FlashSystem.cs @@ -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); diff --git a/Content.Server/Physics/Controllers/MoverController.cs b/Content.Server/Physics/Controllers/MoverController.cs index 252da088a4..2f9ff0f734 100644 --- a/Content.Server/Physics/Controllers/MoverController.cs +++ b/Content.Server/Physics/Controllers/MoverController.cs @@ -49,10 +49,10 @@ namespace Content.Server.Physics.Controllers base.UpdateBeforeSolve(prediction, frameTime); _excludedMobs.Clear(); - foreach (var (mobMover, mover, physics) in EntityManager.EntityQuery()) + foreach (var (mobMover, mover, physics, xform) in EntityManager.EntityQuery()) { _excludedMobs.Add(mover.Owner); - HandleMobMovement(mover, physics, mobMover); + HandleMobMovement(mover, physics, mobMover, xform); } HandleShuttleMovement(frameTime); diff --git a/Content.Server/Weapon/Ranged/RangedWeaponSystem.cs b/Content.Server/Weapon/Ranged/RangedWeaponSystem.cs index af6a92fcaa..d4162fae71 100644 --- a/Content.Server/Weapon/Ranged/RangedWeaponSystem.cs +++ b/Content.Server/Weapon/Ranged/RangedWeaponSystem.cs @@ -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); } } } diff --git a/Content.Shared/Movement/SharedMoverController.cs b/Content.Shared/Movement/SharedMoverController.cs index 930e769d01..1798a7d0a4 100644 --- a/Content.Shared/Movement/SharedMoverController.cs +++ b/Content.Shared/Movement/SharedMoverController.cs @@ -23,11 +23,10 @@ namespace Content.Shared.Movement /// 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(); - _blocker = EntitySystem.Get(); var configManager = IoCManager.Resolve(); 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); } /// /// Movement while considering actionblockers, weightlessness, etc. /// - /// - /// - /// - 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(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)