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)) return; component.OriginalScale = sprite.Scale; var player = EnsureComp(uid); if (_anim.HasRunningAnimation(player, _chasmFallAnimationKey)) return; _anim.Play(player, GetFallingAnimation(component), _chasmFallAnimationKey); } private void OnComponentRemove(EntityUid uid, ChasmFallingComponent component, ComponentRemove args) { if (!TryComp(uid, out var sprite)) return; var player = EnsureComp(uid); if (_anim.HasRunningAnimation(player, _chasmFallAnimationKey)) _anim.Stop(player, _chasmFallAnimationKey); sprite.Scale = component.OriginalScale; } 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 } } }; } }