| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- using Content.Shared.Damage;
- using Content.Shared.Examine;
- using Content.Shared.Inventory;
- using Content.Shared.Silicons.Borgs;
- using Content.Shared.Verbs;
- using Robust.Shared.Utility;
- namespace Content.Shared.Armor;
- /// <summary>
- /// This handles logic relating to <see cref="ArmorComponent" />
- /// </summary>
- public abstract class SharedArmorSystem : EntitySystem
- {
- [Dependency] private readonly ExamineSystemShared _examine = default!;
- /// <inheritdoc />
- public override void Initialize()
- {
- base.Initialize();
- SubscribeLocalEvent<ArmorComponent, InventoryRelayedEvent<CoefficientQueryEvent>>(OnCoefficientQuery);
- SubscribeLocalEvent<ArmorComponent, InventoryRelayedEvent<DamageModifyEvent>>(OnDamageModify);
- SubscribeLocalEvent<ArmorComponent, BorgModuleRelayedEvent<DamageModifyEvent>>(OnBorgDamageModify);
- SubscribeLocalEvent<ArmorComponent, GetVerbsEvent<ExamineVerb>>(OnArmorVerbExamine);
- }
- /// <summary>
- /// Get the total Damage reduction value of all equipment caught by the relay.
- /// </summary>
- /// <param name="ent">The item that's being relayed to</param>
- /// <param name="args">The event, contains the running count of armor percentage as a coefficient</param>
- private void OnCoefficientQuery(Entity<ArmorComponent> ent, ref InventoryRelayedEvent<CoefficientQueryEvent> args)
- {
- foreach (var armorCoefficient in ent.Comp.Modifiers.Coefficients)
- {
- args.Args.DamageModifiers.Coefficients[armorCoefficient.Key] = args.Args.DamageModifiers.Coefficients.TryGetValue(armorCoefficient.Key, out var coefficient) ? coefficient * armorCoefficient.Value : armorCoefficient.Value;
- }
- }
- private void OnDamageModify(EntityUid uid, ArmorComponent component, InventoryRelayedEvent<DamageModifyEvent> args)
- {
- args.Args.Damage = DamageSpecifier.ApplyModifierSet(args.Args.Damage, component.Modifiers);
- }
- private void OnBorgDamageModify(EntityUid uid, ArmorComponent component,
- ref BorgModuleRelayedEvent<DamageModifyEvent> args)
- {
- args.Args.Damage = DamageSpecifier.ApplyModifierSet(args.Args.Damage, component.Modifiers);
- }
- private void OnArmorVerbExamine(EntityUid uid, ArmorComponent component, GetVerbsEvent<ExamineVerb> args)
- {
- if (!args.CanInteract || !args.CanAccess || !component.ShowArmorOnExamine)
- return;
- var examineMarkup = GetArmorExamine(component.Modifiers);
- var ev = new ArmorExamineEvent(examineMarkup);
- RaiseLocalEvent(uid, ref ev);
- _examine.AddDetailedExamineVerb(args, component, examineMarkup,
- Loc.GetString("armor-examinable-verb-text"), "/Textures/Interface/VerbIcons/dot.svg.192dpi.png",
- Loc.GetString("armor-examinable-verb-message"));
- }
- private FormattedMessage GetArmorExamine(DamageModifierSet armorModifiers)
- {
- var msg = new FormattedMessage();
- msg.AddMarkupOrThrow(Loc.GetString("armor-examine"));
- foreach (var coefficientArmor in armorModifiers.Coefficients)
- {
- msg.PushNewline();
- var armorType = Loc.GetString("armor-damage-type-" + coefficientArmor.Key.ToLower());
- msg.AddMarkupOrThrow(Loc.GetString("armor-coefficient-value",
- ("type", armorType),
- ("value", MathF.Round((1f - coefficientArmor.Value) * 100, 1))
- ));
- }
- foreach (var flatArmor in armorModifiers.FlatReduction)
- {
- msg.PushNewline();
- var armorType = Loc.GetString("armor-damage-type-" + flatArmor.Key.ToLower());
- msg.AddMarkupOrThrow(Loc.GetString("armor-reduction-value",
- ("type", armorType),
- ("value", flatArmor.Value)
- ));
- }
- return msg;
- }
- }
|