1
0

SharedArmorSystem.cs 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. using Content.Shared.Damage;
  2. using Content.Shared.Examine;
  3. using Content.Shared.Inventory;
  4. using Content.Shared.Silicons.Borgs;
  5. using Content.Shared.Verbs;
  6. using Robust.Shared.Utility;
  7. namespace Content.Shared.Armor;
  8. /// <summary>
  9. /// This handles logic relating to <see cref="ArmorComponent" />
  10. /// </summary>
  11. public abstract class SharedArmorSystem : EntitySystem
  12. {
  13. [Dependency] private readonly ExamineSystemShared _examine = default!;
  14. /// <inheritdoc />
  15. public override void Initialize()
  16. {
  17. base.Initialize();
  18. SubscribeLocalEvent<ArmorComponent, InventoryRelayedEvent<CoefficientQueryEvent>>(OnCoefficientQuery);
  19. SubscribeLocalEvent<ArmorComponent, InventoryRelayedEvent<DamageModifyEvent>>(OnDamageModify);
  20. SubscribeLocalEvent<ArmorComponent, BorgModuleRelayedEvent<DamageModifyEvent>>(OnBorgDamageModify);
  21. SubscribeLocalEvent<ArmorComponent, GetVerbsEvent<ExamineVerb>>(OnArmorVerbExamine);
  22. }
  23. /// <summary>
  24. /// Get the total Damage reduction value of all equipment caught by the relay.
  25. /// </summary>
  26. /// <param name="ent">The item that's being relayed to</param>
  27. /// <param name="args">The event, contains the running count of armor percentage as a coefficient</param>
  28. private void OnCoefficientQuery(Entity<ArmorComponent> ent, ref InventoryRelayedEvent<CoefficientQueryEvent> args)
  29. {
  30. foreach (var armorCoefficient in ent.Comp.Modifiers.Coefficients)
  31. {
  32. args.Args.DamageModifiers.Coefficients[armorCoefficient.Key] = args.Args.DamageModifiers.Coefficients.TryGetValue(armorCoefficient.Key, out var coefficient) ? coefficient * armorCoefficient.Value : armorCoefficient.Value;
  33. }
  34. }
  35. private void OnDamageModify(EntityUid uid, ArmorComponent component, InventoryRelayedEvent<DamageModifyEvent> args)
  36. {
  37. args.Args.Damage = DamageSpecifier.ApplyModifierSet(args.Args.Damage, component.Modifiers);
  38. }
  39. private void OnBorgDamageModify(EntityUid uid, ArmorComponent component,
  40. ref BorgModuleRelayedEvent<DamageModifyEvent> args)
  41. {
  42. args.Args.Damage = DamageSpecifier.ApplyModifierSet(args.Args.Damage, component.Modifiers);
  43. }
  44. private void OnArmorVerbExamine(EntityUid uid, ArmorComponent component, GetVerbsEvent<ExamineVerb> args)
  45. {
  46. if (!args.CanInteract || !args.CanAccess || !component.ShowArmorOnExamine)
  47. return;
  48. var examineMarkup = GetArmorExamine(component.Modifiers);
  49. var ev = new ArmorExamineEvent(examineMarkup);
  50. RaiseLocalEvent(uid, ref ev);
  51. _examine.AddDetailedExamineVerb(args, component, examineMarkup,
  52. Loc.GetString("armor-examinable-verb-text"), "/Textures/Interface/VerbIcons/dot.svg.192dpi.png",
  53. Loc.GetString("armor-examinable-verb-message"));
  54. }
  55. private FormattedMessage GetArmorExamine(DamageModifierSet armorModifiers)
  56. {
  57. var msg = new FormattedMessage();
  58. msg.AddMarkupOrThrow(Loc.GetString("armor-examine"));
  59. foreach (var coefficientArmor in armorModifiers.Coefficients)
  60. {
  61. msg.PushNewline();
  62. var armorType = Loc.GetString("armor-damage-type-" + coefficientArmor.Key.ToLower());
  63. msg.AddMarkupOrThrow(Loc.GetString("armor-coefficient-value",
  64. ("type", armorType),
  65. ("value", MathF.Round((1f - coefficientArmor.Value) * 100, 1))
  66. ));
  67. }
  68. foreach (var flatArmor in armorModifiers.FlatReduction)
  69. {
  70. msg.PushNewline();
  71. var armorType = Loc.GetString("armor-damage-type-" + flatArmor.Key.ToLower());
  72. msg.AddMarkupOrThrow(Loc.GetString("armor-reduction-value",
  73. ("type", armorType),
  74. ("value", flatArmor.Value)
  75. ));
  76. }
  77. return msg;
  78. }
  79. }