diff --git a/Content.Server/GameObjects/Components/Items/ThrowHelper.cs b/Content.Server/GameObjects/Components/Items/ThrowHelper.cs
index 6f476c0b96..b1b641f34d 100644
--- a/Content.Server/GameObjects/Components/Items/ThrowHelper.cs
+++ b/Content.Server/GameObjects/Components/Items/ThrowHelper.cs
@@ -17,7 +17,9 @@ namespace Content.Server.GameObjects.Components.Items
///
///
/// Will use the vector's magnitude as the strength of the impulse
- internal static void TryThrow(this IEntity entity, Vector2 direction, IEntity? user = null)
+ ///
+ /// The ratio of impulse applied to the thrower
+ internal static void TryThrow(this IEntity entity, Vector2 direction, IEntity? user = null, float pushbackRatio = 1.0f)
{
if (direction == Vector2.Zero || !entity.TryGetComponent(out PhysicsComponent? physicsComponent))
{
@@ -45,6 +47,11 @@ namespace Content.Server.GameObjects.Components.Items
}
physicsComponent.ApplyLinearImpulse(direction);
+ // Give thrower an impulse in the other direction
+ if (user != null && pushbackRatio > 0.0f && user.TryGetComponent(out IPhysBody? body))
+ {
+ body.ApplyLinearImpulse(-direction * pushbackRatio);
+ }
}
}
}
diff --git a/Content.Server/GameObjects/Components/Movement/AiControllerComponent.cs b/Content.Server/GameObjects/Components/Movement/AiControllerComponent.cs
index e36ad5aa7d..dab617671d 100644
--- a/Content.Server/GameObjects/Components/Movement/AiControllerComponent.cs
+++ b/Content.Server/GameObjects/Components/Movement/AiControllerComponent.cs
@@ -90,7 +90,7 @@ namespace Content.Server.GameObjects.Components.Movement
///
[ViewVariables(VVAccess.ReadWrite)]
- public float PushStrength { get; set; }
+ public float PushStrength { get; set; } = 0.4f;
///
[ViewVariables(VVAccess.ReadWrite)]
diff --git a/Content.Server/GameObjects/EntitySystems/HandsSystem.cs b/Content.Server/GameObjects/EntitySystems/HandsSystem.cs
index 0c2ac9802e..4461a2e73a 100644
--- a/Content.Server/GameObjects/EntitySystems/HandsSystem.cs
+++ b/Content.Server/GameObjects/EntitySystems/HandsSystem.cs
@@ -6,6 +6,7 @@ using Content.Server.GameObjects.Components.Items.Storage;
using Content.Server.GameObjects.Components.Stack;
using Content.Server.GameObjects.EntitySystems.Click;
using Content.Server.Interfaces.GameObjects.Components.Items;
+using Content.Shared.GameObjects.Components.Movement;
using Content.Shared.GameObjects.EntitySystems;
using Content.Shared.Input;
using Content.Shared.Interfaces;
@@ -180,8 +181,17 @@ namespace Content.Server.GameObjects.EntitySystems
if (direction == Vector2.Zero) return true;
direction = direction.Normalized * MathF.Min(direction.Length, 8.0f);
+ var yeet = direction * ThrowForce * 15;
- throwEnt.TryThrow(direction * ThrowForce * 15, playerEnt);
+ // Softer yeet in weightlessness
+ if (playerEnt.IsWeightless())
+ {
+ throwEnt.TryThrow(yeet / 4, playerEnt, 10.0f);
+ }
+ else
+ {
+ throwEnt.TryThrow(yeet, playerEnt);
+ }
return true;
}
diff --git a/Content.Shared/GameObjects/Components/Movement/SharedPlayerMobMoverComponent.cs b/Content.Shared/GameObjects/Components/Movement/SharedPlayerMobMoverComponent.cs
index b982433d94..410504d9bf 100644
--- a/Content.Shared/GameObjects/Components/Movement/SharedPlayerMobMoverComponent.cs
+++ b/Content.Shared/GameObjects/Components/Movement/SharedPlayerMobMoverComponent.cs
@@ -27,7 +27,7 @@ namespace Content.Shared.GameObjects.Components.Movement
[DataField("grabRange")]
private float _grabRange = 0.2f;
[DataField("pushStrength")]
- private float _pushStrength = 600.0f;
+ private float _pushStrength = 0.4f;
[ViewVariables(VVAccess.ReadWrite)]
public EntityCoordinates LastPosition { get; set; }
diff --git a/Content.Shared/Physics/Controllers/SharedMoverController.cs b/Content.Shared/Physics/Controllers/SharedMoverController.cs
index 52ffecfe67..c1a12bb975 100644
--- a/Content.Shared/Physics/Controllers/SharedMoverController.cs
+++ b/Content.Shared/Physics/Controllers/SharedMoverController.cs
@@ -83,6 +83,11 @@ namespace Content.Shared.Physics.Controllers
// Target velocity.
var total = (walkDir * mover.CurrentWalkSpeed + sprintDir * mover.CurrentSprintSpeed);
+ if (weightless)
+ {
+ total *= mobMover.PushStrength;
+ }
+
if (total != Vector2.Zero)
{
// This should have its event run during island solver soooo