DamageExamineSystem.cs 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. using Content.Shared.Damage.Components;
  2. using Content.Shared.Damage.Events;
  3. using Content.Shared.Damage.Prototypes;
  4. using Content.Shared.Examine;
  5. using Content.Shared.FixedPoint;
  6. using Content.Shared.Verbs;
  7. using Robust.Shared.Prototypes;
  8. using Robust.Shared.Utility;
  9. namespace Content.Shared.Damage.Systems;
  10. public sealed class DamageExamineSystem : EntitySystem
  11. {
  12. [Dependency] private readonly ExamineSystemShared _examine = default!;
  13. [Dependency] private readonly IPrototypeManager _prototype = default!;
  14. public override void Initialize()
  15. {
  16. base.Initialize();
  17. SubscribeLocalEvent<DamageExaminableComponent, GetVerbsEvent<ExamineVerb>>(OnGetExamineVerbs);
  18. }
  19. private void OnGetExamineVerbs(EntityUid uid, DamageExaminableComponent component, GetVerbsEvent<ExamineVerb> args)
  20. {
  21. if (!args.CanInteract || !args.CanAccess)
  22. return;
  23. var ev = new DamageExamineEvent(new FormattedMessage(), args.User);
  24. RaiseLocalEvent(uid, ref ev);
  25. if (!ev.Message.IsEmpty)
  26. {
  27. _examine.AddDetailedExamineVerb(args, component, ev.Message,
  28. Loc.GetString("damage-examinable-verb-text"),
  29. "/Textures/Interface/VerbIcons/smite.svg.192dpi.png",
  30. Loc.GetString("damage-examinable-verb-message")
  31. );
  32. }
  33. }
  34. public void AddDamageExamine(FormattedMessage message, DamageSpecifier damageSpecifier, string? type = null)
  35. {
  36. var markup = GetDamageExamine(damageSpecifier, type);
  37. if (!message.IsEmpty)
  38. {
  39. message.PushNewline();
  40. }
  41. message.AddMessage(markup);
  42. }
  43. /// <summary>
  44. /// Retrieves the damage examine values.
  45. /// </summary>
  46. private FormattedMessage GetDamageExamine(DamageSpecifier damageSpecifier, string? type = null)
  47. {
  48. var msg = new FormattedMessage();
  49. if (string.IsNullOrEmpty(type))
  50. {
  51. msg.AddMarkupOrThrow(Loc.GetString("damage-examine"));
  52. }
  53. else
  54. {
  55. if (damageSpecifier.GetTotal() == FixedPoint2.Zero && !damageSpecifier.AnyPositive())
  56. {
  57. msg.AddMarkupOrThrow(Loc.GetString("damage-none"));
  58. return msg;
  59. }
  60. msg.AddMarkupOrThrow(Loc.GetString("damage-examine-type", ("type", type)));
  61. }
  62. foreach (var damage in damageSpecifier.DamageDict)
  63. {
  64. if (damage.Value != FixedPoint2.Zero)
  65. {
  66. msg.PushNewline();
  67. msg.AddMarkupOrThrow(Loc.GetString("damage-value", ("type", _prototype.Index<DamageTypePrototype>(damage.Key).LocalizedName), ("amount", damage.Value)));
  68. }
  69. }
  70. return msg;
  71. }
  72. }