SharedJitteringSystem.cs 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. using Content.Shared.Rejuvenate;
  2. using Content.Shared.StatusEffect;
  3. using Robust.Shared.Timing;
  4. namespace Content.Shared.Jittering
  5. {
  6. /// <summary>
  7. /// A system for applying a jitter animation to any entity.
  8. /// </summary>
  9. public abstract class SharedJitteringSystem : EntitySystem
  10. {
  11. [Dependency] protected readonly IGameTiming GameTiming = default!;
  12. [Dependency] protected readonly StatusEffectsSystem StatusEffects = default!;
  13. public float MaxAmplitude = 300f;
  14. public float MinAmplitude = 1f;
  15. public float MaxFrequency = 10f;
  16. public float MinFrequency = 1f;
  17. public override void Initialize()
  18. {
  19. SubscribeLocalEvent<JitteringComponent, RejuvenateEvent>(OnRejuvenate);
  20. }
  21. private void OnRejuvenate(EntityUid uid, JitteringComponent component, RejuvenateEvent args)
  22. {
  23. EntityManager.RemoveComponentDeferred<JitteringComponent>(uid);
  24. }
  25. /// <summary>
  26. /// Applies a jitter effect to the specified entity.
  27. /// You can apply this to any entity whatsoever, so be careful what you use it on!
  28. /// </summary>
  29. /// <remarks>
  30. /// If the entity is already jittering, the jitter values will be updated but only if they're greater
  31. /// than the current ones and <see cref="forceValueChange"/> is false.
  32. /// </remarks>
  33. /// <param name="uid">Entity in question.</param>
  34. /// <param name="time">For how much time to apply the effect.</param>
  35. /// <param name="refresh">The status effect cooldown should be refreshed (true) or accumulated (false).</param>
  36. /// <param name="amplitude">Jitteriness of the animation. See <see cref="MaxAmplitude"/> and <see cref="MinAmplitude"/>.</param>
  37. /// <param name="frequency">Frequency for jittering. See <see cref="MaxFrequency"/> and <see cref="MinFrequency"/>.</param>
  38. /// <param name="forceValueChange">Whether to change any existing jitter value even if they're greater than the ones we're setting.</param>
  39. /// <param name="status">The status effects component to modify.</param>
  40. public void DoJitter(EntityUid uid, TimeSpan time, bool refresh, float amplitude = 10f, float frequency = 4f, bool forceValueChange = false,
  41. StatusEffectsComponent? status = null)
  42. {
  43. if (!Resolve(uid, ref status, false))
  44. return;
  45. amplitude = Math.Clamp(amplitude, MinAmplitude, MaxAmplitude);
  46. frequency = Math.Clamp(frequency, MinFrequency, MaxFrequency);
  47. if (StatusEffects.TryAddStatusEffect<JitteringComponent>(uid, "Jitter", time, refresh, status))
  48. {
  49. var jittering = EntityManager.GetComponent<JitteringComponent>(uid);
  50. if(forceValueChange || jittering.Amplitude < amplitude)
  51. jittering.Amplitude = amplitude;
  52. if (forceValueChange || jittering.Frequency < frequency)
  53. jittering.Frequency = frequency;
  54. }
  55. }
  56. /// <summary>
  57. /// For non mobs.
  58. /// </summary>
  59. public void AddJitter(EntityUid uid, float amplitude = 10f, float frequency = 4f)
  60. {
  61. var jitter = EnsureComp<JitteringComponent>(uid);
  62. jitter.Amplitude = amplitude;
  63. jitter.Frequency = frequency;
  64. Dirty(uid, jitter);
  65. }
  66. }
  67. }