1
0

SharedFloatingVisualizerSystem.cs 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. using System.Numerics;
  2. using Robust.Shared.Map;
  3. namespace Content.Shared.Gravity;
  4. /// <summary>
  5. /// Handles offsetting a sprite when there is no gravity
  6. /// </summary>
  7. public abstract class SharedFloatingVisualizerSystem : EntitySystem
  8. {
  9. [Dependency] private readonly SharedGravitySystem GravitySystem = default!;
  10. public override void Initialize()
  11. {
  12. base.Initialize();
  13. SubscribeLocalEvent<FloatingVisualsComponent, ComponentStartup>(OnComponentStartup);
  14. SubscribeLocalEvent<GravityChangedEvent>(OnGravityChanged);
  15. SubscribeLocalEvent<FloatingVisualsComponent, EntParentChangedMessage>(OnEntParentChanged);
  16. }
  17. /// <summary>
  18. /// Offsets a sprite with a linear interpolation animation
  19. /// </summary>
  20. public virtual void FloatAnimation(EntityUid uid, Vector2 offset, string animationKey, float animationTime, bool stop = false) { }
  21. protected bool CanFloat(EntityUid uid, FloatingVisualsComponent component, TransformComponent? transform = null)
  22. {
  23. if (!Resolve(uid, ref transform))
  24. return false;
  25. if (transform.MapID == MapId.Nullspace)
  26. return false;
  27. component.CanFloat = GravitySystem.IsWeightless(uid, xform: transform);
  28. Dirty(uid, component);
  29. return component.CanFloat;
  30. }
  31. private void OnComponentStartup(EntityUid uid, FloatingVisualsComponent component, ComponentStartup args)
  32. {
  33. if (CanFloat(uid, component))
  34. FloatAnimation(uid, component.Offset, component.AnimationKey, component.AnimationTime);
  35. }
  36. private void OnGravityChanged(ref GravityChangedEvent args)
  37. {
  38. var query = EntityQueryEnumerator<FloatingVisualsComponent, TransformComponent>();
  39. while (query.MoveNext(out var uid, out var floating, out var transform))
  40. {
  41. if (transform.MapID == MapId.Nullspace)
  42. continue;
  43. if (transform.GridUid != args.ChangedGridIndex)
  44. continue;
  45. floating.CanFloat = !args.HasGravity;
  46. Dirty(uid, floating);
  47. if (!args.HasGravity)
  48. FloatAnimation(uid, floating.Offset, floating.AnimationKey, floating.AnimationTime);
  49. }
  50. }
  51. private void OnEntParentChanged(EntityUid uid, FloatingVisualsComponent component, ref EntParentChangedMessage args)
  52. {
  53. var transform = args.Transform;
  54. if (CanFloat(uid, component, transform))
  55. FloatAnimation(uid, component.Offset, component.AnimationKey, component.AnimationTime);
  56. }
  57. }