diff --git a/Content.Shared/Hands/EntitySystems/SharedHandsSystem.EventListeners.cs b/Content.Shared/Hands/EntitySystems/SharedHandsSystem.EventListeners.cs index af0ed1c1aa..ea2502331e 100644 --- a/Content.Shared/Hands/EntitySystems/SharedHandsSystem.EventListeners.cs +++ b/Content.Shared/Hands/EntitySystems/SharedHandsSystem.EventListeners.cs @@ -11,6 +11,7 @@ public abstract partial class SharedHandsSystem private void InitializeEventListeners() { SubscribeLocalEvent(OnStandupArgs); + SubscribeLocalEvent(OnKnockedDownRefresh); } /// @@ -28,4 +29,17 @@ public abstract partial class SharedHandsSystem time.DoAfterTime *= (float)ent.Comp.Count / (hands + ent.Comp.Count); } + + private void OnKnockedDownRefresh(Entity ent, ref KnockedDownRefreshEvent args) + { + var freeHands = CountFreeHands(ent.AsNullable()); + var totalHands = GetHandCount(ent.AsNullable()); + + // Can't crawl around without any hands. + // Entities without the HandsComponent will always have full crawling speed. + if (totalHands == 0) + args.SpeedModifier = 0f; + else + args.SpeedModifier *= (float)freeHands / totalHands; + } } diff --git a/Content.Shared/Stunnable/SharedStunSystem.Knockdown.cs b/Content.Shared/Stunnable/SharedStunSystem.Knockdown.cs index fc2b01c649..58f38c9db8 100644 --- a/Content.Shared/Stunnable/SharedStunSystem.Knockdown.cs +++ b/Content.Shared/Stunnable/SharedStunSystem.Knockdown.cs @@ -1,12 +1,12 @@ using Content.Shared.Alert; using Content.Shared.Buckle.Components; using Content.Shared.CCVar; -using Content.Shared.Damage; using Content.Shared.Damage.Components; using Content.Shared.Damage.Systems; using Content.Shared.Database; using Content.Shared.DoAfter; using Content.Shared.Gravity; +using Content.Shared.Hands; using Content.Shared.Hands.EntitySystems; using Content.Shared.Input; using Content.Shared.Movement.Events; @@ -54,7 +54,7 @@ public abstract partial class SharedStunSystem SubscribeLocalEvent(OnBuckleAttempt); SubscribeLocalEvent(OnStandAttempt); - // Updating movement a friction + // Updating movement and friction SubscribeLocalEvent(OnRefreshKnockedSpeed); SubscribeLocalEvent(OnRefreshFriction); SubscribeLocalEvent(OnKnockedTileFriction); @@ -66,6 +66,9 @@ public abstract partial class SharedStunSystem SubscribeLocalEvent(OnKnockdownRefresh); SubscribeLocalEvent(OnDamaged); SubscribeLocalEvent(OnWeightlessnessChanged); + SubscribeLocalEvent(OnHandEquipped); + SubscribeLocalEvent(OnHandUnequipped); + SubscribeLocalEvent(OnHandCountChanged); SubscribeLocalEvent(OnKnockdownAttempt); SubscribeLocalEvent(OnGetStandUpTime); @@ -380,7 +383,7 @@ public abstract partial class SharedStunSystem private void OnForceStandup(ForceStandUpEvent msg, EntitySessionEventArgs args) { - if (args.SenderSession.AttachedEntity is not {} user) + if (args.SenderSession.AttachedEntity is not { } user) return; ForceStandUp(user); @@ -522,6 +525,30 @@ public abstract partial class SharedStunSystem RemCompDeferred(entity); } + private void OnHandEquipped(Entity entity, ref DidEquipHandEvent args) + { + if (GameTiming.ApplyingState) + return; // The result of the change is already networked separately in the same game state + + RefreshKnockedMovement(entity); + } + + private void OnHandUnequipped(Entity entity, ref DidUnequipHandEvent args) + { + if (GameTiming.ApplyingState) + return; // The result of the change is already networked separately in the same game state + + RefreshKnockedMovement(entity); + } + + private void OnHandCountChanged(Entity entity, ref HandCountChangedEvent args) + { + if (GameTiming.ApplyingState) + return; // The result of the change is already networked separately in the same game state + + RefreshKnockedMovement(entity); + } + private void OnKnockdownAttempt(Entity entity, ref KnockDownAttemptEvent args) { // Directed, targeted moth attack. @@ -582,6 +609,7 @@ public abstract partial class SharedStunSystem ent.Comp.SpeedModifier = ev.SpeedModifier; ent.Comp.FrictionModifier = ev.FrictionModifier; + Dirty(ent); _movementSpeedModifier.RefreshMovementSpeedModifiers(ent); _movementSpeedModifier.RefreshFrictionModifiers(ent);