From 3d0fc1067303635a743af04ef4c463abd0dba343 Mon Sep 17 00:00:00 2001 From: Hannah Giovanna Dawson Date: Mon, 15 Apr 2024 02:53:22 +0100 Subject: [PATCH] SS14-26950 Fix Waddling During Improper States (#26965) * SS14-26950 Fix Waddling During Improper States Fix some states when a clown can waddle when no clown should be able to waddle, no-matter their clowning powers. 1. You cannot waddle whilst weightless 2. You cannot waddle whilst stunned 3. You cannot waddle whilst slowed down due to stam damage 4. You cannot waddle whilst you're knocked down 5. You cannot waddle whilst you're buckled 6. You cannot waddle whilst crit 7. You cannot waddle whilst dead There's some argument for being able to waddle whilst on the floor and doing some bizarre floor-humping exercise but I'm not coding an animation layer system just to handle clowns doing the worm. * Use a nicer "can move" check --- .../Movement/Systems/WaddleAnimationSystem.cs | 72 ++++++++++++++----- 1 file changed, 55 insertions(+), 17 deletions(-) diff --git a/Content.Client/Movement/Systems/WaddleAnimationSystem.cs b/Content.Client/Movement/Systems/WaddleAnimationSystem.cs index 83bb697b26..9555c1f6b9 100644 --- a/Content.Client/Movement/Systems/WaddleAnimationSystem.cs +++ b/Content.Client/Movement/Systems/WaddleAnimationSystem.cs @@ -1,7 +1,13 @@ using System.Numerics; +using Content.Client.Buckle; using Content.Client.Gravity; +using Content.Shared.ActionBlocker; +using Content.Shared.Buckle.Components; +using Content.Shared.Mobs.Systems; using Content.Shared.Movement.Components; using Content.Shared.Movement.Events; +using Content.Shared.StatusEffect; +using Content.Shared.Stunnable; using Robust.Client.Animations; using Robust.Client.GameObjects; using Robust.Shared.Animations; @@ -14,6 +20,9 @@ public sealed class WaddleAnimationSystem : EntitySystem [Dependency] private readonly AnimationPlayerSystem _animation = default!; [Dependency] private readonly GravitySystem _gravity = default!; [Dependency] private readonly IGameTiming _timing = default!; + [Dependency] private readonly ActionBlockerSystem _actionBlocker = default!; + [Dependency] private readonly BuckleSystem _buckle = default!; + [Dependency] private readonly MobStateSystem _mobState = default!; public override void Initialize() { @@ -21,6 +30,9 @@ public sealed class WaddleAnimationSystem : EntitySystem SubscribeLocalEvent(OnStartedWalking); SubscribeLocalEvent(OnStoppedWalking); SubscribeLocalEvent(OnAnimationCompleted); + SubscribeLocalEvent(OnStunned); + SubscribeLocalEvent(OnKnockedDown); + SubscribeLocalEvent(OnBuckleChange); } private void OnMovementInput(EntityUid entity, WaddleAnimationComponent component, MoveInputEvent args) @@ -34,8 +46,6 @@ public sealed class WaddleAnimationSystem : EntitySystem if (!args.HasDirectionalMovement && component.IsCurrentlyWaddling) { - component.IsCurrentlyWaddling = false; - var stopped = new StoppedWaddlingEvent(entity); RaiseLocalEvent(entity, ref stopped); @@ -47,8 +57,6 @@ public sealed class WaddleAnimationSystem : EntitySystem if (component.IsCurrentlyWaddling || !args.HasDirectionalMovement) return; - component.IsCurrentlyWaddling = true; - var started = new StartedWaddlingEvent(entity); RaiseLocalEvent(entity, ref started); @@ -57,19 +65,25 @@ public sealed class WaddleAnimationSystem : EntitySystem private void OnStartedWalking(EntityUid uid, WaddleAnimationComponent component, StartedWaddlingEvent args) { if (_animation.HasRunningAnimation(uid, component.KeyName)) - { return; - } if (!TryComp(uid, out var mover)) - { return; - } if (_gravity.IsWeightless(uid)) - { return; - } + + + if (!_actionBlocker.CanMove(uid, mover)) + return; + + // Do nothing if buckled in + if (_buckle.IsBuckled(uid)) + return; + + // Do nothing if crit or dead (for obvious reasons) + if (_mobState.IsIncapacitated(uid)) + return; var tumbleIntensity = component.LastStep ? 360 - component.TumbleIntensity : component.TumbleIntensity; var len = mover.Sprinting ? component.AnimationLength * component.RunAnimationLengthMultiplier : component.AnimationLength; @@ -114,6 +128,36 @@ public sealed class WaddleAnimationSystem : EntitySystem private void OnStoppedWalking(EntityUid uid, WaddleAnimationComponent component, StoppedWaddlingEvent args) { + StopWaddling(uid, component); + } + + private void OnAnimationCompleted(EntityUid uid, WaddleAnimationComponent component, AnimationCompletedEvent args) + { + var started = new StartedWaddlingEvent(uid); + + RaiseLocalEvent(uid, ref started); + } + + private void OnStunned(EntityUid uid, WaddleAnimationComponent component, StunnedEvent args) + { + StopWaddling(uid, component); + } + + private void OnKnockedDown(EntityUid uid, WaddleAnimationComponent component, KnockedDownEvent args) + { + StopWaddling(uid, component); + } + + private void OnBuckleChange(EntityUid uid, WaddleAnimationComponent component, BuckleChangeEvent args) + { + StopWaddling(uid, component); + } + + private void StopWaddling(EntityUid uid, WaddleAnimationComponent component) + { + if (!component.IsCurrentlyWaddling) + return; + _animation.Stop(uid, component.KeyName); if (!TryComp(uid, out var sprite)) @@ -123,13 +167,7 @@ public sealed class WaddleAnimationSystem : EntitySystem sprite.Offset = new Vector2(); sprite.Rotation = Angle.FromDegrees(0); + component.IsCurrentlyWaddling = false; } - - private void OnAnimationCompleted(EntityUid uid, WaddleAnimationComponent component, AnimationCompletedEvent args) - { - var started = new StartedWaddlingEvent(uid); - - RaiseLocalEvent(uid, ref started); - } }