using Content.Shared.Damage;
+using Content.Shared.Inventory;
using Robust.Shared.GameStates;
using Robust.Shared.Utility;
/// <param name="Msg"></param>
[ByRefEvent]
public record struct ArmorExamineEvent(FormattedMessage Msg);
+
+/// <summary>
+/// A Relayed inventory event, gets the total Armor for all Inventory slots defined by the Slotflags in TargetSlots
+/// </summary>
+public sealed class CoefficientQueryEvent : EntityEventArgs, IInventoryRelayEvent
+{
+ /// <summary>
+ /// All slots to relay to
+ /// </summary>
+ public SlotFlags TargetSlots { get; set; }
+
+ /// <summary>
+ /// The Total of all Coefficients.
+ /// </summary>
+ public DamageModifierSet DamageModifiers { get; set; } = new DamageModifierSet();
+
+ public CoefficientQueryEvent(SlotFlags slots)
+ {
+ TargetSlots = slots;
+ }
+}
{
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);
+using Content.Shared.Armor;
using Content.Shared.Chat;
using Content.Shared.Chemistry;
using Content.Shared.Chemistry.Hypospray.Events;
SubscribeLocalEvent<InventoryComponent, TargetBeforeHyposprayInjectsEvent>(RelayInventoryEvent);
SubscribeLocalEvent<InventoryComponent, SelfBeforeGunShotEvent>(RelayInventoryEvent);
SubscribeLocalEvent<InventoryComponent, SelfBeforeClimbEvent>(RelayInventoryEvent);
+ SubscribeLocalEvent<InventoryComponent, CoefficientQueryEvent>(RelayInventoryEvent);
// by-ref events
SubscribeLocalEvent<InventoryComponent, GetExplosionResistanceEvent>(RefRelayInventoryEvent);