using Content.Shared.Movement.Components; using Robust.Shared.GameObjects; using Robust.Shared.Maths; using Robust.Shared.Physics; using Robust.Shared.Physics.Collision; using Robust.Shared.Physics.Dynamics; namespace Content.Shared.Movement.EntitySystems { public sealed class SharedMobMoverSystem : EntitySystem { public override void Initialize() { base.Initialize(); Get().KinematicControllerCollision += HandleCollisionMessage; } public override void Shutdown() { base.Shutdown(); Get().KinematicControllerCollision -= HandleCollisionMessage; } /// /// Fake pushing for player collisions. /// private void HandleCollisionMessage(Fixture ourFixture, Fixture otherFixture, float frameTime, Vector2 worldNormal) { var otherBody = otherFixture.Body; if (otherBody.BodyType != BodyType.Dynamic || !otherFixture.Hard) return; if (!ourFixture.Body.Owner.TryGetComponent(out IMobMoverComponent? mobMover) || worldNormal == Vector2.Zero) return; otherBody.ApplyLinearImpulse(-worldNormal * mobMover.PushStrength * frameTime); } } }