using Content.Shared.CCVar; using Content.Shared.Movement.Components; using Robust.Shared.Physics; using Robust.Shared.Physics.Dynamics; namespace Content.Shared.Movement.Systems; public abstract partial class SharedMoverController { private bool _pushingEnabled; private void InitializePushing() { _configManager.OnValueChanged(CCVars.MobPushing, SetPushing, true); } private void SetPushing(bool value) { if (_pushingEnabled == value) return; _pushingEnabled = value; if (_pushingEnabled) { _physics.KinematicControllerCollision += OnMobCollision; } else { _physics.KinematicControllerCollision -= OnMobCollision; } } private void ShutdownPushing() { if (_pushingEnabled) _physics.KinematicControllerCollision -= OnMobCollision; _configManager.UnsubValueChanged(CCVars.MobPushing, SetPushing); } /// /// Fake pushing for player collisions. /// private void OnMobCollision(Fixture ourFixture, Fixture otherFixture, float frameTime, Vector2 worldNormal) { if (!_pushingEnabled) return; var otherBody = otherFixture.Body; if (otherBody.BodyType != BodyType.Dynamic || !otherFixture.Hard) return; if (!EntityManager.TryGetComponent(ourFixture.Body.Owner, out MobMoverComponent? mobMover) || worldNormal == Vector2.Zero) return; otherBody.ApplyLinearImpulse(-worldNormal * mobMover.PushStrengthVV * frameTime); } }