EssenceSystem.cs 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. using Content.Server.Revenant.Components;
  2. using Content.Shared.Examine;
  3. using Content.Shared.Mind.Components;
  4. using Content.Shared.Mobs;
  5. using Content.Shared.Mobs.Components;
  6. using Content.Shared.Revenant.Components;
  7. using Robust.Shared.Random;
  8. namespace Content.Server.Revenant.EntitySystems;
  9. /// <summary>
  10. /// Attached to entities when a revenant drains them in order to
  11. /// manage their essence.
  12. /// </summary>
  13. public sealed class EssenceSystem : EntitySystem
  14. {
  15. [Dependency] private readonly IRobustRandom _random = default!;
  16. public override void Initialize()
  17. {
  18. base.Initialize();
  19. SubscribeLocalEvent<EssenceComponent, ComponentStartup>(OnEssenceEventReceived);
  20. SubscribeLocalEvent<EssenceComponent, MobStateChangedEvent>(OnMobstateChanged);
  21. SubscribeLocalEvent<EssenceComponent, MindAddedMessage>(OnEssenceEventReceived);
  22. SubscribeLocalEvent<EssenceComponent, MindRemovedMessage>(OnEssenceEventReceived);
  23. SubscribeLocalEvent<EssenceComponent, ExaminedEvent>(OnExamine);
  24. }
  25. private void OnMobstateChanged(EntityUid uid, EssenceComponent component, MobStateChangedEvent args)
  26. {
  27. UpdateEssenceAmount(uid, component);
  28. }
  29. private void OnExamine(EntityUid uid, EssenceComponent component, ExaminedEvent args)
  30. {
  31. if (!component.SearchComplete || !HasComp<RevenantComponent>(args.Examiner))
  32. return;
  33. string message;
  34. switch (component.EssenceAmount)
  35. {
  36. case <= 45:
  37. message = "revenant-soul-yield-low";
  38. break;
  39. case >= 90:
  40. message = "revenant-soul-yield-high";
  41. break;
  42. default:
  43. message = "revenant-soul-yield-average";
  44. break;
  45. }
  46. args.PushMarkup(Loc.GetString(message, ("target", uid)));
  47. }
  48. private void OnEssenceEventReceived(EntityUid uid, EssenceComponent component, EntityEventArgs args)
  49. {
  50. UpdateEssenceAmount(uid, component);
  51. }
  52. private void UpdateEssenceAmount(EntityUid uid, EssenceComponent component)
  53. {
  54. if (!TryComp<MobStateComponent>(uid, out var mob))
  55. return;
  56. switch (mob.CurrentState)
  57. {
  58. case MobState.Alive:
  59. if (TryComp<MindContainerComponent>(uid, out var mind) && mind.Mind != null)
  60. component.EssenceAmount = _random.NextFloat(75f, 100f);
  61. else
  62. component.EssenceAmount = _random.NextFloat(45f, 70f);
  63. break;
  64. case MobState.Critical:
  65. component.EssenceAmount = _random.NextFloat(35f, 50f);
  66. break;
  67. case MobState.Dead:
  68. component.EssenceAmount = _random.NextFloat(15f, 20f);
  69. break;
  70. }
  71. }
  72. }