diff --git a/Content.Server/Nutrition/EntitySystems/ThirstSystem.cs b/Content.Server/Nutrition/EntitySystems/ThirstSystem.cs
index 2bafa46510..256087c961 100644
--- a/Content.Server/Nutrition/EntitySystems/ThirstSystem.cs
+++ b/Content.Server/Nutrition/EntitySystems/ThirstSystem.cs
@@ -19,6 +19,7 @@ namespace Content.Server.Nutrition.EntitySystems
[Dependency] private readonly IAdminLogManager _adminLogger = default!;
[Dependency] private readonly DamageableSystem _damage = default!;
[Dependency] private readonly MovementSpeedModifierSystem _movement = default!;
+ [Dependency] private readonly SharedJetpackSystem _jetpack = default!;
private ISawmill _sawmill = default!;
private float _accumulatedFrameTime;
@@ -44,6 +45,9 @@ namespace Content.Server.Nutrition.EntitySystems
private void OnRefreshMovespeed(EntityUid uid, ThirstComponent component, RefreshMovementSpeedModifiersEvent args)
{
+ if (_jetpack.IsUserFlying(component.Owner))
+ return;
+
var mod = component.CurrentThirstThreshold <= ThirstThreshold.Parched ? 0.75f : 1.0f;
args.ModifySpeed(mod, mod);
}
diff --git a/Content.Shared/Movement/Components/IMoverComponent.cs b/Content.Shared/Movement/Components/IMoverComponent.cs
index b70767d3cb..745507cb89 100644
--- a/Content.Shared/Movement/Components/IMoverComponent.cs
+++ b/Content.Shared/Movement/Components/IMoverComponent.cs
@@ -4,16 +4,6 @@ namespace Content.Shared.Movement.Components
// There can only be one.
public interface IMoverComponent : IComponent
{
- ///
- /// Movement speed (m/s) that the entity walks.
- ///
- float CurrentWalkSpeed { get; }
-
- ///
- /// Movement speed (m/s) that the entity sprints.
- ///
- float CurrentSprintSpeed { get; }
-
///
/// Is the entity Sprinting (running)?
///
diff --git a/Content.Shared/Movement/Components/SharedDummyInputMoverComponent.cs b/Content.Shared/Movement/Components/SharedDummyInputMoverComponent.cs
index 1736dfd7a4..d5ffa35899 100644
--- a/Content.Shared/Movement/Components/SharedDummyInputMoverComponent.cs
+++ b/Content.Shared/Movement/Components/SharedDummyInputMoverComponent.cs
@@ -5,8 +5,7 @@ namespace Content.Shared.Movement.Components
public sealed class SharedDummyInputMoverComponent : Component, IMoverComponent
{
public bool IgnorePaused => false;
- public float CurrentWalkSpeed => 0f;
- public float CurrentSprintSpeed => 0f;
+
public bool CanMove { get; set; } = true;
public Angle LastGridAngle { get => Angle.Zero; set {} }
diff --git a/Content.Shared/Movement/Components/SharedPlayerInputMoverComponent.cs b/Content.Shared/Movement/Components/SharedPlayerInputMoverComponent.cs
index eb6f781568..41e5fea07b 100644
--- a/Content.Shared/Movement/Components/SharedPlayerInputMoverComponent.cs
+++ b/Content.Shared/Movement/Components/SharedPlayerInputMoverComponent.cs
@@ -43,18 +43,6 @@ namespace Content.Shared.Movement.Components
[ViewVariables]
public Angle LastGridAngle { get; set; } = new(0);
- public float CurrentWalkSpeed =>
- _entityManager.TryGetComponent(Owner,
- out var movementSpeedModifierComponent)
- ? movementSpeedModifierComponent.CurrentWalkSpeed
- : MovementSpeedModifierComponent.DefaultBaseWalkSpeed;
-
- public float CurrentSprintSpeed =>
- _entityManager.TryGetComponent(Owner,
- out var movementSpeedModifierComponent)
- ? movementSpeedModifierComponent.CurrentSprintSpeed
- : MovementSpeedModifierComponent.DefaultBaseSprintSpeed;
-
public bool Sprinting => !HasFlag(_heldMoveButtons, MoveButtons.Walk);
[ViewVariables(VVAccess.ReadWrite)]
diff --git a/Content.Shared/Movement/Systems/MovementSpeedModifierSystem.cs b/Content.Shared/Movement/Systems/MovementSpeedModifierSystem.cs
index 820a259ef8..1c03a9719f 100644
--- a/Content.Shared/Movement/Systems/MovementSpeedModifierSystem.cs
+++ b/Content.Shared/Movement/Systems/MovementSpeedModifierSystem.cs
@@ -21,7 +21,7 @@ namespace Content.Shared.Movement.Systems
BaseWalkSpeed = component.BaseWalkSpeed,
BaseSprintSpeed = component.BaseSprintSpeed,
WalkSpeedModifier = component.WalkSpeedModifier,
- SprintSpeedModifier = component.SprintSpeedModifier
+ SprintSpeedModifier = component.SprintSpeedModifier,
};
}
diff --git a/Content.Shared/Movement/Systems/SharedJetpackSystem.cs b/Content.Shared/Movement/Systems/SharedJetpackSystem.cs
index 3a871c88c0..199ff1ab8c 100644
--- a/Content.Shared/Movement/Systems/SharedJetpackSystem.cs
+++ b/Content.Shared/Movement/Systems/SharedJetpackSystem.cs
@@ -1,9 +1,11 @@
using Content.Shared.Actions;
+using Content.Shared.Gravity;
using Content.Shared.Interaction.Events;
using Content.Shared.Inventory;
using Content.Shared.Movement.Components;
using Content.Shared.Movement.Events;
using Robust.Shared.Containers;
+using Robust.Shared.Map;
using Robust.Shared.Serialization;
namespace Content.Shared.Movement.Systems;
@@ -11,6 +13,8 @@ namespace Content.Shared.Movement.Systems;
public abstract class SharedJetpackSystem : EntitySystem
{
[Dependency] protected readonly SharedContainerSystem Container = default!;
+ [Dependency] protected readonly IMapManager MapManager = default!;
+ [Dependency] protected readonly MovementSpeedModifierSystem MovementSpeedModifier = default!;
public override void Initialize()
{
@@ -20,6 +24,8 @@ public abstract class SharedJetpackSystem : EntitySystem
SubscribeLocalEvent(OnJetpackToggle);
SubscribeLocalEvent(OnJetpackUserCanWeightless);
SubscribeLocalEvent(OnJetpackUserMovement);
+ SubscribeLocalEvent(OnJetpackUserEntParentChanged);
+ SubscribeLocalEvent(OnJetpackUserGravityChanged);
}
private void OnJetpackDropped(EntityUid uid, JetpackComponent component, DroppedEvent args)
@@ -43,6 +49,21 @@ public abstract class SharedJetpackSystem : EntitySystem
args.CanMove = true;
}
+ private void OnJetpackUserEntParentChanged(EntityUid uid, JetpackUserComponent component, ref EntParentChangedMessage args)
+ {
+ MovementSpeedModifier.RefreshMovementSpeedModifiers(component.Owner);
+ }
+
+ private void OnJetpackUserGravityChanged(GravityChangedMessage ev)
+ {
+ var gridUid = ev.ChangedGridIndex;
+ foreach (var (_, transform) in EntityQuery(true))
+ {
+ if(transform.GridUid == gridUid)
+ MovementSpeedModifier.RefreshMovementSpeedModifiers(transform.Owner);
+ }
+ }
+
private void SetupUser(EntityUid uid, JetpackComponent component)
{
var user = EnsureComp(uid);
@@ -101,6 +122,8 @@ public abstract class SharedJetpackSystem : EntitySystem
{
RemComp(user.Value);
}
+
+ MovementSpeedModifier.RefreshMovementSpeedModifiers(user.Value);
}
TryComp(component.Owner, out var appearance);
@@ -108,6 +131,13 @@ public abstract class SharedJetpackSystem : EntitySystem
Dirty(component);
}
+ public bool IsUserFlying(EntityUid uid)
+ {
+ return HasComp(uid) &&
+ TryComp(uid, out var physicsComponent) &&
+ uid.IsWeightless(physicsComponent, mapManager: MapManager, entityManager: EntityManager);
+ }
+
protected abstract bool CanEnable(JetpackComponent component);
[Serializable, NetSerializable]
diff --git a/Content.Shared/Movement/Systems/SharedMoverController.cs b/Content.Shared/Movement/Systems/SharedMoverController.cs
index 16e94b6684..1d06e50e7e 100644
--- a/Content.Shared/Movement/Systems/SharedMoverController.cs
+++ b/Content.Shared/Movement/Systems/SharedMoverController.cs
@@ -156,7 +156,10 @@ namespace Content.Shared.Movement.Systems
// Regular movement.
// Target velocity.
- var total = walkDir * mover.CurrentWalkSpeed + sprintDir * mover.CurrentSprintSpeed;
+ var moveSpeedComponent = CompOrNull(mover.Owner);
+ var walkSpeed = moveSpeedComponent?.CurrentWalkSpeed ?? MovementSpeedModifierComponent.DefaultBaseWalkSpeed;
+ var sprintSpeed = moveSpeedComponent?.CurrentSprintSpeed ?? MovementSpeedModifierComponent.DefaultBaseSprintSpeed;
+ var total = walkDir * walkSpeed + sprintDir * sprintSpeed;
var worldTotal = _relativeMovement ? parentRotation.RotateVec(total) : total;
@@ -218,7 +221,11 @@ namespace Content.Shared.Movement.Systems
// Regular movement.
// Target velocity.
// This is relative to the map / grid we're on.
- var total = walkDir * mover.CurrentWalkSpeed + sprintDir * mover.CurrentSprintSpeed;
+ var moveSpeedComponent = CompOrNull(mover.Owner);
+ var walkSpeed = moveSpeedComponent?.CurrentWalkSpeed ?? MovementSpeedModifierComponent.DefaultBaseWalkSpeed;
+ var sprintSpeed = moveSpeedComponent?.CurrentSprintSpeed ?? MovementSpeedModifierComponent.DefaultBaseSprintSpeed;
+ var total = walkDir * walkSpeed + sprintDir * sprintSpeed;
+
var parentRotation = GetParentGridAngle(xform, mover);
var worldTotal = _relativeMovement ? parentRotation.RotateVec(total) : total;
diff --git a/Content.Shared/Nutrition/EntitySystems/SharedHungerSystem.cs b/Content.Shared/Nutrition/EntitySystems/SharedHungerSystem.cs
index 0e15a6a095..36fefe8259 100644
--- a/Content.Shared/Nutrition/EntitySystems/SharedHungerSystem.cs
+++ b/Content.Shared/Nutrition/EntitySystems/SharedHungerSystem.cs
@@ -1,10 +1,12 @@
-using Content.Shared.Movement.Systems;
+using Content.Shared.Movement.Systems;
using Content.Shared.Nutrition.Components;
namespace Content.Shared.Nutrition.EntitySystems
{
public sealed class SharedHungerSystem : EntitySystem
{
+ [Dependency] private readonly SharedJetpackSystem _jetpack = default!;
+
public override void Initialize()
{
base.Initialize();
@@ -14,6 +16,9 @@ namespace Content.Shared.Nutrition.EntitySystems
private void OnRefreshMovespeed(EntityUid uid, SharedHungerComponent component, RefreshMovementSpeedModifiersEvent args)
{
+ if (_jetpack.IsUserFlying(component.Owner))
+ return;
+
float mod = component.CurrentHungerThreshold <= HungerThreshold.Starving ? 0.75f : 1.0f;
args.ModifySpeed(mod, mod);
}