* Use new Subs.CVar helper Removes manual config OnValueChanged calls, removes need to remember to manually unsubscribe. This both reduces boilerplate and fixes many issues where subscriptions weren't removed on entity system shutdown. * Fix a bunch of warnings * More warning fixes * Use new DateTime serializer to get rid of ISerializationHooks in changelog code. * Get rid of some more ISerializationHooks for enums * And a little more * Apply suggestions from code review Co-authored-by: 0x6273 <0x40@keemail.me> --------- Co-authored-by: 0x6273 <0x40@keemail.me>
88 lines
3.1 KiB
C#
88 lines
3.1 KiB
C#
using System.Numerics;
|
|
using Robust.Client.Animations;
|
|
using Robust.Client.GameObjects;
|
|
using Robust.Shared.Animations;
|
|
using Robust.Shared.Map;
|
|
using Robust.Shared.Spawners;
|
|
using static Robust.Client.Animations.AnimationTrackProperty;
|
|
|
|
namespace Content.Client.Animations;
|
|
|
|
/// <summary>
|
|
/// System that handles animating an entity that a player has picked up.
|
|
/// </summary>
|
|
public sealed class EntityPickupAnimationSystem : EntitySystem
|
|
{
|
|
[Dependency] private readonly AnimationPlayerSystem _animations = default!;
|
|
[Dependency] private readonly MetaDataSystem _metaData = default!;
|
|
[Dependency] private readonly TransformSystem _transform = default!;
|
|
|
|
public override void Initialize()
|
|
{
|
|
base.Initialize();
|
|
|
|
SubscribeLocalEvent<EntityPickupAnimationComponent, AnimationCompletedEvent>(OnEntityPickupAnimationCompleted);
|
|
}
|
|
|
|
private void OnEntityPickupAnimationCompleted(EntityUid uid, EntityPickupAnimationComponent component, AnimationCompletedEvent args)
|
|
{
|
|
Del(uid);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Animates a clone of an entity moving from one point to another before
|
|
/// being deleted.
|
|
/// Used when the player picks up an entity.
|
|
/// </summary>
|
|
public void AnimateEntityPickup(EntityUid uid, EntityCoordinates initial, Vector2 final, Angle initialAngle)
|
|
{
|
|
if (Deleted(uid) || !initial.IsValid(EntityManager))
|
|
return;
|
|
|
|
var metadata = MetaData(uid);
|
|
|
|
if (IsPaused(uid, metadata))
|
|
return;
|
|
|
|
var animatableClone = Spawn("clientsideclone", initial);
|
|
EnsureComp<EntityPickupAnimationComponent>(animatableClone);
|
|
var val = metadata.EntityName;
|
|
_metaData.SetEntityName(animatableClone, val);
|
|
|
|
if (!TryComp(uid, out SpriteComponent? sprite0))
|
|
{
|
|
Log.Error("Entity ({0}) couldn't be animated for pickup since it doesn't have a {1}!", metadata.EntityName, nameof(SpriteComponent));
|
|
return;
|
|
}
|
|
|
|
var sprite = Comp<SpriteComponent>(animatableClone);
|
|
sprite.CopyFrom(sprite0);
|
|
sprite.Visible = true;
|
|
|
|
var animations = Comp<AnimationPlayerComponent>(animatableClone);
|
|
|
|
var despawn = EnsureComp<TimedDespawnComponent>(animatableClone);
|
|
despawn.Lifetime = 0.25f;
|
|
_transform.SetLocalRotationNoLerp(animatableClone, initialAngle);
|
|
|
|
_animations.Play(new Entity<AnimationPlayerComponent>(animatableClone, animations), new Animation
|
|
{
|
|
Length = TimeSpan.FromMilliseconds(125),
|
|
AnimationTracks =
|
|
{
|
|
new AnimationTrackComponentProperty
|
|
{
|
|
ComponentType = typeof(TransformComponent),
|
|
Property = nameof(TransformComponent.LocalPosition),
|
|
InterpolationMode = AnimationInterpolationMode.Linear,
|
|
KeyFrames =
|
|
{
|
|
new KeyFrame(initial.Position, 0),
|
|
new KeyFrame(final, 0.125f)
|
|
}
|
|
},
|
|
}
|
|
}, "fancy_pickup_anim");
|
|
}
|
|
}
|