using System.Numerics; using Content.Shared.Spawners.Components; using Robust.Client.Animations; using Robust.Client.GameObjects; using Robust.Shared.Animations; using Robust.Shared.Map; namespace Content.Client.Animations { public static class ReusableAnimations { public static void AnimateEntityPickup(EntityUid entity, EntityCoordinates initialPosition, Vector2 finalPosition, Angle initialAngle, IEntityManager? entMan = null) { IoCManager.Resolve(ref entMan); if (entMan.Deleted(entity) || !initialPosition.IsValid(entMan)) return; var metadata = entMan.GetComponent(entity); if (entMan.IsPaused(entity, metadata)) return; var animatableClone = entMan.SpawnEntity("clientsideclone", initialPosition); string val = entMan.GetComponent(entity).EntityName; entMan.System().SetEntityName(animatableClone, val); if (!entMan.TryGetComponent(entity, out SpriteComponent? sprite0)) { Logger.Error("Entity ({0}) couldn't be animated for pickup since it doesn't have a {1}!", entMan.GetComponent(entity).EntityName, nameof(SpriteComponent)); return; } var sprite = entMan.GetComponent(animatableClone); sprite.CopyFrom(sprite0); sprite.Visible = true; var animations = entMan.GetComponent(animatableClone); animations.AnimationCompleted += (_) => { entMan.DeleteEntity(animatableClone); }; var despawn = entMan.EnsureComponent(animatableClone); despawn.Lifetime = 0.25f; entMan.System().SetLocalRotationNoLerp(animatableClone, initialAngle); animations.Play(new Animation { Length = TimeSpan.FromMilliseconds(125), AnimationTracks = { new AnimationTrackComponentProperty { ComponentType = typeof(TransformComponent), Property = nameof(TransformComponent.LocalPosition), InterpolationMode = AnimationInterpolationMode.Linear, KeyFrames = { new AnimationTrackProperty.KeyFrame(initialPosition.Position, 0), new AnimationTrackProperty.KeyFrame(finalPosition, 0.125f) } }, } }, "fancy_pickup_anim"); } } }