1
0

TriggerSystem.Proximity.cs 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. using Content.Shared.Trigger;
  2. using Robust.Client.Animations;
  3. using Robust.Client.GameObjects;
  4. using Robust.Shared.Animations;
  5. namespace Content.Client.Explosion;
  6. public sealed partial class TriggerSystem
  7. {
  8. [Dependency] private readonly AnimationPlayerSystem _player = default!;
  9. [Dependency] private readonly SharedAppearanceSystem _appearance = default!;
  10. /*
  11. * Currently all of the appearance stuff is hardcoded for portable flashers
  12. * If you ever add mines it shouldn't be hard to tweak it slightly
  13. */
  14. private const string AnimKey = "proximity";
  15. private static readonly Animation _flasherAnimation = new Animation
  16. {
  17. Length = TimeSpan.FromSeconds(0.6f),
  18. AnimationTracks = {
  19. new AnimationTrackSpriteFlick
  20. {
  21. LayerKey = ProximityTriggerVisualLayers.Base,
  22. KeyFrames = { new AnimationTrackSpriteFlick.KeyFrame("flashing", 0f)}
  23. },
  24. new AnimationTrackComponentProperty()
  25. {
  26. ComponentType = typeof(PointLightComponent),
  27. InterpolationMode = AnimationInterpolationMode.Nearest,
  28. Property = nameof(PointLightComponent.AnimatedRadius),
  29. KeyFrames =
  30. {
  31. new AnimationTrackProperty.KeyFrame(0.1f, 0),
  32. new AnimationTrackProperty.KeyFrame(3f, 0.1f),
  33. new AnimationTrackProperty.KeyFrame(0.1f, 0.5f)
  34. }
  35. }
  36. }
  37. };
  38. private void InitializeProximity()
  39. {
  40. SubscribeLocalEvent<TriggerOnProximityComponent, ComponentInit>(OnProximityInit);
  41. SubscribeLocalEvent<TriggerOnProximityComponent, AppearanceChangeEvent>(OnProxAppChange);
  42. SubscribeLocalEvent<TriggerOnProximityComponent, AnimationCompletedEvent>(OnProxAnimation);
  43. }
  44. private void OnProxAnimation(EntityUid uid, TriggerOnProximityComponent component, AnimationCompletedEvent args)
  45. {
  46. if (!TryComp<AppearanceComponent>(uid, out var appearance))
  47. return;
  48. // So animation doesn't get spammed if no server state comes in.
  49. _appearance.SetData(uid, ProximityTriggerVisualState.State, ProximityTriggerVisuals.Inactive, appearance);
  50. OnChangeData(uid, component, appearance);
  51. }
  52. private void OnProximityInit(EntityUid uid, TriggerOnProximityComponent component, ComponentInit args)
  53. {
  54. EntityManager.EnsureComponent<AnimationPlayerComponent>(uid);
  55. }
  56. private void OnProxAppChange(EntityUid uid, TriggerOnProximityComponent component, ref AppearanceChangeEvent args)
  57. {
  58. OnChangeData(uid, component, args.Component, args.Sprite);
  59. }
  60. private void OnChangeData(EntityUid uid, TriggerOnProximityComponent component, AppearanceComponent appearance, SpriteComponent? spriteComponent = null)
  61. {
  62. if (!Resolve(uid, ref spriteComponent))
  63. return;
  64. if (!TryComp<AnimationPlayerComponent>(uid, out var player))
  65. return;
  66. if (!_appearance.TryGetData<ProximityTriggerVisuals>(uid, ProximityTriggerVisualState.State, out var state, appearance))
  67. return;
  68. if (!spriteComponent.LayerMapTryGet(ProximityTriggerVisualLayers.Base, out var layer))
  69. // Don't do anything if the sprite doesn't have the layer.
  70. return;
  71. switch (state)
  72. {
  73. case ProximityTriggerVisuals.Inactive:
  74. // Don't interrupt the flash animation
  75. if (_player.HasRunningAnimation(uid, player, AnimKey)) return;
  76. _player.Stop(uid, player, AnimKey);
  77. spriteComponent.LayerSetState(layer, "on");
  78. break;
  79. case ProximityTriggerVisuals.Active:
  80. if (_player.HasRunningAnimation(uid, player, AnimKey)) return;
  81. _player.Play(uid, player, _flasherAnimation, AnimKey);
  82. break;
  83. case ProximityTriggerVisuals.Off:
  84. default:
  85. _player.Stop(uid, player, AnimKey);
  86. spriteComponent.LayerSetState(layer, "off");
  87. break;
  88. }
  89. }
  90. public enum ProximityTriggerVisualLayers : byte
  91. {
  92. Base,
  93. }
  94. }