1
0

StaminaSystem.Modifier.cs 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. using Content.Shared.Damage.Components;
  2. namespace Content.Shared.Damage.Systems;
  3. public sealed partial class StaminaSystem
  4. {
  5. private void InitializeModifier()
  6. {
  7. SubscribeLocalEvent<StaminaModifierComponent, ComponentStartup>(OnModifierStartup);
  8. SubscribeLocalEvent<StaminaModifierComponent, ComponentShutdown>(OnModifierShutdown);
  9. }
  10. private void OnModifierStartup(EntityUid uid, StaminaModifierComponent comp, ComponentStartup args)
  11. {
  12. if (!TryComp<StaminaComponent>(uid, out var stamina))
  13. return;
  14. stamina.CritThreshold *= comp.Modifier;
  15. }
  16. private void OnModifierShutdown(EntityUid uid, StaminaModifierComponent comp, ComponentShutdown args)
  17. {
  18. if (!TryComp<StaminaComponent>(uid, out var stamina))
  19. return;
  20. stamina.CritThreshold /= comp.Modifier;
  21. }
  22. /// <summary>
  23. /// Change the stamina modifier for an entity.
  24. /// If it has <see cref="StaminaComponent"/> it will also be updated.
  25. /// </summary>
  26. public void SetModifier(EntityUid uid, float modifier, StaminaComponent? stamina = null, StaminaModifierComponent? comp = null)
  27. {
  28. if (!Resolve(uid, ref comp))
  29. return;
  30. var old = comp.Modifier;
  31. if (old.Equals(modifier))
  32. return;
  33. comp.Modifier = modifier;
  34. Dirty(uid, comp);
  35. if (Resolve(uid, ref stamina, false))
  36. {
  37. // scale to the new threshold, act as if it was removed then added
  38. stamina.CritThreshold *= modifier / old;
  39. }
  40. }
  41. }