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;
[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()
{
SubscribeLocalEvent<WaddleAnimationComponent, StartedWaddlingEvent>(OnStartedWalking);
SubscribeLocalEvent<WaddleAnimationComponent, StoppedWaddlingEvent>(OnStoppedWalking);
SubscribeLocalEvent<WaddleAnimationComponent, AnimationCompletedEvent>(OnAnimationCompleted);
+ SubscribeLocalEvent<WaddleAnimationComponent, StunnedEvent>(OnStunned);
+ SubscribeLocalEvent<WaddleAnimationComponent, KnockedDownEvent>(OnKnockedDown);
+ SubscribeLocalEvent<WaddleAnimationComponent, BuckleChangeEvent>(OnBuckleChange);
}
private void OnMovementInput(EntityUid entity, WaddleAnimationComponent component, MoveInputEvent args)
if (!args.HasDirectionalMovement && component.IsCurrentlyWaddling)
{
- component.IsCurrentlyWaddling = false;
-
var stopped = new StoppedWaddlingEvent(entity);
RaiseLocalEvent(entity, ref stopped);
if (component.IsCurrentlyWaddling || !args.HasDirectionalMovement)
return;
- component.IsCurrentlyWaddling = true;
-
var started = new StartedWaddlingEvent(entity);
RaiseLocalEvent(entity, ref started);
private void OnStartedWalking(EntityUid uid, WaddleAnimationComponent component, StartedWaddlingEvent args)
{
if (_animation.HasRunningAnimation(uid, component.KeyName))
- {
return;
- }
if (!TryComp<InputMoverComponent>(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;
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<SpriteComponent>(uid, out var sprite))
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);
+ component.IsCurrentlyWaddling = false;
}
}