1
0

FoamVisualizerSystem.cs 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. using Content.Shared.Chemistry.Components;
  2. using Robust.Client.Animations;
  3. using Robust.Client.GameObjects;
  4. using Robust.Shared.Timing;
  5. namespace Content.Client.Chemistry.Visualizers;
  6. /// <summary>
  7. /// The system responsible for ensuring <see cref="FoamVisualsComponent"/> plays the animation it's meant to when the foam dissolves.
  8. /// </summary>
  9. public sealed class FoamVisualizerSystem : VisualizerSystem<FoamVisualsComponent>
  10. {
  11. [Dependency] private readonly IGameTiming _timing = default!;
  12. public override void Initialize()
  13. {
  14. base.Initialize();
  15. SubscribeLocalEvent<FoamVisualsComponent, ComponentInit>(OnComponentInit);
  16. SubscribeLocalEvent<FoamVisualsComponent, AnimationCompletedEvent>(OnAnimationComplete);
  17. }
  18. public override void Update(float frameTime)
  19. {
  20. base.Update(frameTime);
  21. if (!_timing.IsFirstTimePredicted)
  22. return;
  23. var query = EntityQueryEnumerator<FoamVisualsComponent, SmokeComponent>();
  24. while (query.MoveNext(out var uid, out var comp, out var smoke))
  25. {
  26. if (_timing.CurTime < comp.StartTime + TimeSpan.FromSeconds(smoke.Duration) - TimeSpan.FromSeconds(comp.AnimationTime))
  27. continue;
  28. // Despawn animation.
  29. if (TryComp(uid, out AnimationPlayerComponent? animPlayer)
  30. && !AnimationSystem.HasRunningAnimation(uid, animPlayer, FoamVisualsComponent.AnimationKey))
  31. {
  32. AnimationSystem.Play(uid, animPlayer, comp.Animation, FoamVisualsComponent.AnimationKey);
  33. }
  34. }
  35. }
  36. /// <summary>
  37. /// Generates the animation used by foam visuals when the foam dissolves.
  38. /// </summary>
  39. private void OnComponentInit(EntityUid uid, FoamVisualsComponent comp, ComponentInit args)
  40. {
  41. comp.StartTime = _timing.CurTime;
  42. comp.Animation = new Animation
  43. {
  44. Length = TimeSpan.FromSeconds(comp.AnimationTime),
  45. AnimationTracks =
  46. {
  47. new AnimationTrackSpriteFlick
  48. {
  49. LayerKey = FoamVisualLayers.Base,
  50. KeyFrames =
  51. {
  52. new AnimationTrackSpriteFlick.KeyFrame(comp.AnimationState, 0f)
  53. }
  54. }
  55. }
  56. };
  57. }
  58. private void OnAnimationComplete(EntityUid uid, FoamVisualsComponent component, AnimationCompletedEvent args)
  59. {
  60. if (args.Key != FoamVisualsComponent.AnimationKey)
  61. return;
  62. if (TryComp<SpriteComponent>(uid, out var sprite))
  63. sprite.Visible = false;
  64. }
  65. }
  66. public enum FoamVisualLayers : byte
  67. {
  68. Base
  69. }