1
0

RadiationCollectorSystem.cs 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. using System;
  2. using Content.Shared.Singularity.Components;
  3. using Robust.Client.Animations;
  4. using Robust.Client.GameObjects;
  5. namespace Content.Client.Singularity.Visualizers;
  6. public sealed class RadiationCollectorSystem : VisualizerSystem<RadiationCollectorComponent>
  7. {
  8. public override void Initialize()
  9. {
  10. base.Initialize();
  11. SubscribeLocalEvent<RadiationCollectorComponent, ComponentInit>(OnComponentInit);
  12. SubscribeLocalEvent<RadiationCollectorComponent, AnimationCompletedEvent>(OnAnimationCompleted);
  13. }
  14. private void OnComponentInit(EntityUid uid, RadiationCollectorComponent comp, ComponentInit args)
  15. {
  16. comp.ActivateAnimation = new Animation {
  17. Length = TimeSpan.FromSeconds(0.8f),
  18. AnimationTracks = {
  19. new AnimationTrackSpriteFlick() {
  20. LayerKey = RadiationCollectorVisualLayers.Main,
  21. KeyFrames = {new AnimationTrackSpriteFlick.KeyFrame(comp.ActivatingState, 0f)}
  22. }, // TODO: Make this play a sound when activating a radiation collector.
  23. }
  24. };
  25. comp.DeactiveAnimation = new Animation {
  26. Length = TimeSpan.FromSeconds(0.8f),
  27. AnimationTracks = {
  28. new AnimationTrackSpriteFlick() {
  29. LayerKey = RadiationCollectorVisualLayers.Main,
  30. KeyFrames = {new AnimationTrackSpriteFlick.KeyFrame(comp.DeactivatingState, 0f)}
  31. }, // TODO: Make this play a sound when deactivating a radiation collector.
  32. }
  33. };
  34. }
  35. private void UpdateVisuals(EntityUid uid, RadiationCollectorVisualState state, RadiationCollectorComponent comp, SpriteComponent sprite, AnimationPlayerComponent? animPlayer = null)
  36. {
  37. if (state == comp.CurrentState)
  38. return;
  39. if (!Resolve(uid, ref animPlayer))
  40. return;
  41. if (AnimationSystem.HasRunningAnimation(uid, animPlayer, RadiationCollectorComponent.AnimationKey))
  42. return;
  43. var targetState = (RadiationCollectorVisualState) (state & RadiationCollectorVisualState.Active);
  44. var destinationState = (RadiationCollectorVisualState) (comp.CurrentState & RadiationCollectorVisualState.Active);
  45. if (targetState != destinationState) // If where we're going is not where we want to be then we must go there next.
  46. targetState = (RadiationCollectorVisualState) (targetState | RadiationCollectorVisualState.Deactivating); // Convert to transition state.
  47. comp.CurrentState = state;
  48. switch (targetState)
  49. {
  50. case RadiationCollectorVisualState.Activating:
  51. AnimationSystem.Play(uid, animPlayer, comp.ActivateAnimation, RadiationCollectorComponent.AnimationKey);
  52. break;
  53. case RadiationCollectorVisualState.Deactivating:
  54. AnimationSystem.Play(uid, animPlayer, comp.DeactiveAnimation, RadiationCollectorComponent.AnimationKey);
  55. break;
  56. case RadiationCollectorVisualState.Active:
  57. sprite.LayerSetState(RadiationCollectorVisualLayers.Main, comp.ActiveState);
  58. break;
  59. case RadiationCollectorVisualState.Deactive:
  60. sprite.LayerSetState(RadiationCollectorVisualLayers.Main, comp.InactiveState);
  61. break;
  62. }
  63. }
  64. private void OnAnimationCompleted(EntityUid uid, RadiationCollectorComponent comp, AnimationCompletedEvent args)
  65. {
  66. if (args.Key != RadiationCollectorComponent.AnimationKey)
  67. return;
  68. if (!TryComp<SpriteComponent>(uid, out var sprite))
  69. return;
  70. if (!TryComp<AnimationPlayerComponent>(uid, out var animPlayer))
  71. return; // Why doesn't AnimationCompletedEvent propagate the AnimationPlayerComponent? No idea, but it's in engine so I'm not touching it.
  72. if (!AppearanceSystem.TryGetData<RadiationCollectorVisualState>(uid, RadiationCollectorVisuals.VisualState, out var state))
  73. state = comp.CurrentState;
  74. // Convert to terminal state.
  75. var targetState = (RadiationCollectorVisualState) (state & RadiationCollectorVisualState.Active);
  76. UpdateVisuals(uid, targetState, comp, sprite, animPlayer);
  77. }
  78. protected override void OnAppearanceChange(EntityUid uid, RadiationCollectorComponent comp, ref AppearanceChangeEvent args)
  79. {
  80. if (args.Sprite == null)
  81. return;
  82. if (!TryComp<AnimationPlayerComponent>(uid, out var animPlayer))
  83. return;
  84. if (!AppearanceSystem.TryGetData<RadiationCollectorVisualState>(uid, RadiationCollectorVisuals.VisualState, out var state, args.Component))
  85. state = RadiationCollectorVisualState.Deactive;
  86. UpdateVisuals(uid, state, comp, args.Sprite, animPlayer);
  87. }
  88. }
  89. public enum RadiationCollectorVisualLayers : byte
  90. {
  91. Main
  92. }