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);
}
}