From 23ae73d4291d95a6c7c4e37bc203dbe927cc5762 Mon Sep 17 00:00:00 2001 From: ShadowCommander <10494922+ShadowCommander@users.noreply.github.com> Date: Thu, 29 Oct 2020 17:06:51 -0700 Subject: [PATCH] Fix throwing knockback when weightless (#2369) * Fix throwing an item not moving the player when weightless * Remove unnecessary code from ThrownItemComponent * Fix velocity not stopping when hitting a wall after slipping when weightless * Fix CanMove check being reversed --- .../Projectiles/ThrownItemComponent.cs | 7 --- Content.Server/Throw/ThrowHelper.cs | 8 +-- Content.Shared/Physics/SlipController.cs | 8 ++- .../Physics/ThrowKnockbackController.cs | 52 +++++++++++++++++++ 4 files changed, 63 insertions(+), 12 deletions(-) create mode 100644 Content.Shared/Physics/ThrowKnockbackController.cs diff --git a/Content.Server/GameObjects/Components/Projectiles/ThrownItemComponent.cs b/Content.Server/GameObjects/Components/Projectiles/ThrownItemComponent.cs index 1fffccb797..8dfe1f94c8 100644 --- a/Content.Server/GameObjects/Components/Projectiles/ThrownItemComponent.cs +++ b/Content.Server/GameObjects/Components/Projectiles/ThrownItemComponent.cs @@ -120,12 +120,5 @@ namespace Content.Server.GameObjects.Components.Projectiles StopThrow(); } - - public override void Initialize() - { - base.Initialize(); - - Owner.EnsureComponent().EnsureController(); - } } } diff --git a/Content.Server/Throw/ThrowHelper.cs b/Content.Server/Throw/ThrowHelper.cs index dfc3bac5d7..300460f578 100644 --- a/Content.Server/Throw/ThrowHelper.cs +++ b/Content.Server/Throw/ThrowHelper.cs @@ -85,8 +85,7 @@ namespace Content.Server.Throw projComp.StartThrow(angle.ToVec(), spd); if (throwSourceEnt != null && - throwSourceEnt.TryGetComponent(out var physics) && - physics.TryGetController(out ThrownController mover)) + throwSourceEnt.TryGetComponent(out var physics)) { if (throwSourceEnt.IsWeightless()) { @@ -95,8 +94,9 @@ namespace Content.Server.Throw // I got kinda lazy is the reason why. Also it makes a bit of sense. // If somebody wants they can come along and make it so magboots completely hold you still. // Would be a cool incentive to use them. - const float ThrowFactor = 5.0f; // Break Newton's Third Law for better gameplay - mover.Push(-angle.ToVec(), spd * ThrowFactor * physics.InvMass); + const float throwFactor = 0.2f; // Break Newton's Third Law for better gameplay + var mover = physics.EnsureController(); + mover.Push(-angle.ToVec(), spd * throwFactor); } } } diff --git a/Content.Shared/Physics/SlipController.cs b/Content.Shared/Physics/SlipController.cs index 7a83b1ea40..8a2091019b 100644 --- a/Content.Shared/Physics/SlipController.cs +++ b/Content.Shared/Physics/SlipController.cs @@ -1,5 +1,6 @@ -using Robust.Shared.Interfaces.Physics; +using Robust.Shared.Interfaces.Physics; using Robust.Shared.IoC; +using Robust.Shared.Maths; using Robust.Shared.Physics; namespace Content.Shared.Physics @@ -24,6 +25,11 @@ namespace Content.Shared.Physics if (_physicsManager.IsWeightless(ControlledComponent.Owner.Transform.Coordinates)) { + if (ControlledComponent.IsColliding(Vector2.Zero, false)) + { + Stop(); + } + return; } diff --git a/Content.Shared/Physics/ThrowKnockbackController.cs b/Content.Shared/Physics/ThrowKnockbackController.cs new file mode 100644 index 0000000000..e1cae0ee3b --- /dev/null +++ b/Content.Shared/Physics/ThrowKnockbackController.cs @@ -0,0 +1,52 @@ +using Content.Shared.GameObjects.Components.Movement; +using Content.Shared.GameObjects.EntitySystems; +using Robust.Shared.Interfaces.Physics; +using Robust.Shared.IoC; +using Robust.Shared.Maths; +using Robust.Shared.Physics; + +namespace Content.Shared.Physics +{ + public class ThrowKnockbackController : VirtualController + { + [Dependency] private readonly IPhysicsManager _physicsManager = default!; + + public ThrowKnockbackController() + { + IoCManager.InjectDependencies(this); + } + + public void Push(Vector2 velocityDirection, float speed) + { + LinearVelocity = velocityDirection * speed; + } + + private float Decay { get; set; } = 0.95f; + + public override void UpdateAfterProcessing() + { + if (ControlledComponent == null) + { + return; + } + + if (ControlledComponent.Owner.IsWeightless()) + { + if (ActionBlockerSystem.CanMove(ControlledComponent.Owner) + && ControlledComponent.IsColliding(Vector2.Zero, false)) + { + Stop(); + } + + return; + } + + LinearVelocity *= Decay; + + if (LinearVelocity.Length < 0.001) + { + Stop(); + } + } + } +}