using System.Numerics; using Robust.Shared.Map; namespace Content.Shared.Gravity; /// /// Handles offsetting a sprite when there is no gravity /// public abstract class SharedFloatingVisualizerSystem : EntitySystem { [Dependency] private readonly SharedGravitySystem _gravity = default!; public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnComponentStartup); SubscribeLocalEvent(OnWeightlessnessChanged); } /// /// Offsets a sprite with a linear interpolation animation /// public virtual void FloatAnimation(EntityUid uid, Vector2 offset, string animationKey, float animationTime, bool stop = false) { } protected bool CanFloat(Entity entity) { entity.Comp.CanFloat = _gravity.IsWeightless(entity.Owner); Dirty(entity); return entity.Comp.CanFloat; } private void OnComponentStartup(Entity entity, ref ComponentStartup args) { if (CanFloat(entity)) FloatAnimation(entity, entity.Comp.Offset, entity.Comp.AnimationKey, entity.Comp.AnimationTime); } private void OnWeightlessnessChanged(Entity entity, ref WeightlessnessChangedEvent args) { if (entity.Comp.CanFloat == args.Weightless) return; entity.Comp.CanFloat = CanFloat(entity); Dirty(entity); if (args.Weightless) FloatAnimation(entity, entity.Comp.Offset, entity.Comp.AnimationKey, entity.Comp.AnimationTime); } }