using Content.Shared.Chasm; using Robust.Client.Animations; using Robust.Client.GameObjects; using Robust.Shared.Animations; namespace Content.Client.Chasm; /// /// Handles the falling animation for entities that fall into a chasm. /// public sealed class ChasmFallingVisualsSystem : EntitySystem { [Dependency] private readonly AnimationPlayerSystem _anim = default!; private readonly string _chasmFallAnimationKey = "chasm_fall"; public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnComponentInit); SubscribeLocalEvent(OnComponentRemove); } private void OnComponentInit(EntityUid uid, ChasmFallingComponent component, ComponentInit args) { if (!TryComp(uid, out var sprite) || TerminatingOrDeleted(uid)) { return; } component.OriginalScale = sprite.Scale; if (!TryComp(uid, out var player)) return; if (_anim.HasRunningAnimation(player, _chasmFallAnimationKey)) return; _anim.Play((uid, player), GetFallingAnimation(component), _chasmFallAnimationKey); } private void OnComponentRemove(EntityUid uid, ChasmFallingComponent component, ComponentRemove args) { if (!TryComp(uid, out var sprite)) return; sprite.Scale = component.OriginalScale; if (!TryComp(uid, out var player)) return; if (_anim.HasRunningAnimation(player, _chasmFallAnimationKey)) _anim.Stop((uid, player), _chasmFallAnimationKey); } private Animation GetFallingAnimation(ChasmFallingComponent component) { var length = component.AnimationTime; return new Animation() { Length = length, AnimationTracks = { new AnimationTrackComponentProperty() { ComponentType = typeof(SpriteComponent), Property = nameof(SpriteComponent.Scale), KeyFrames = { new AnimationTrackProperty.KeyFrame(component.OriginalScale, 0.0f), new AnimationTrackProperty.KeyFrame(component.AnimationScale, length.Seconds), }, InterpolationMode = AnimationInterpolationMode.Cubic } } }; } }