SharedGodmodeSystem.cs 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. using Content.Shared.Damage.Components;
  2. using Content.Shared.Rejuvenate;
  3. using Content.Shared.Slippery;
  4. using Content.Shared.StatusEffect;
  5. namespace Content.Shared.Damage.Systems;
  6. public abstract class SharedGodmodeSystem : EntitySystem
  7. {
  8. [Dependency] private readonly DamageableSystem _damageable = default!;
  9. public override void Initialize()
  10. {
  11. base.Initialize();
  12. SubscribeLocalEvent<GodmodeComponent, BeforeDamageChangedEvent>(OnBeforeDamageChanged);
  13. SubscribeLocalEvent<GodmodeComponent, BeforeStatusEffectAddedEvent>(OnBeforeStatusEffect);
  14. SubscribeLocalEvent<GodmodeComponent, BeforeStaminaDamageEvent>(OnBeforeStaminaDamage);
  15. SubscribeLocalEvent<GodmodeComponent, SlipAttemptEvent>(OnSlipAttempt);
  16. }
  17. private void OnSlipAttempt(EntityUid uid, GodmodeComponent component, SlipAttemptEvent args)
  18. {
  19. args.NoSlip = true;
  20. }
  21. private void OnBeforeDamageChanged(EntityUid uid, GodmodeComponent component, ref BeforeDamageChangedEvent args)
  22. {
  23. args.Cancelled = true;
  24. }
  25. private void OnBeforeStatusEffect(EntityUid uid, GodmodeComponent component, ref BeforeStatusEffectAddedEvent args)
  26. {
  27. args.Cancelled = true;
  28. }
  29. private void OnBeforeStaminaDamage(EntityUid uid, GodmodeComponent component, ref BeforeStaminaDamageEvent args)
  30. {
  31. args.Cancelled = true;
  32. }
  33. public virtual void EnableGodmode(EntityUid uid, GodmodeComponent? godmode = null)
  34. {
  35. godmode ??= EnsureComp<GodmodeComponent>(uid);
  36. if (TryComp<DamageableComponent>(uid, out var damageable))
  37. {
  38. godmode.OldDamage = new DamageSpecifier(damageable.Damage);
  39. }
  40. // Rejuv to cover other stuff
  41. RaiseLocalEvent(uid, new RejuvenateEvent());
  42. }
  43. public virtual void DisableGodmode(EntityUid uid, GodmodeComponent? godmode = null)
  44. {
  45. if (!Resolve(uid, ref godmode, false))
  46. return;
  47. if (TryComp<DamageableComponent>(uid, out var damageable) && godmode.OldDamage != null)
  48. {
  49. _damageable.SetDamage(uid, damageable, godmode.OldDamage);
  50. }
  51. RemComp<GodmodeComponent>(uid);
  52. }
  53. /// <summary>
  54. /// Toggles godmode for a given entity.
  55. /// </summary>
  56. /// <param name="uid">The entity to toggle godmode for.</param>
  57. /// <returns>true if enabled, false if disabled.</returns>
  58. public bool ToggleGodmode(EntityUid uid)
  59. {
  60. if (TryComp<GodmodeComponent>(uid, out var godmode))
  61. {
  62. DisableGodmode(uid, godmode);
  63. return false;
  64. }
  65. EnableGodmode(uid, godmode);
  66. return true;
  67. }
  68. }