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); }