Create a Armor CoeffientQuery (#35024)
* Create a Armor CoeffientQuery - add Armor Coefficent Query Event for InventoryRelay system * CR - cleanup, comments and fix typos * CR - Remove Whitespace * typos * on't --------- Co-authored-by: ScarKy0 <106310278+ScarKy0@users.noreply.github.com>
This commit is contained in:
@@ -1,4 +1,5 @@
|
|||||||
using Content.Shared.Damage;
|
using Content.Shared.Damage;
|
||||||
|
using Content.Shared.Inventory;
|
||||||
using Robust.Shared.GameStates;
|
using Robust.Shared.GameStates;
|
||||||
using Robust.Shared.Utility;
|
using Robust.Shared.Utility;
|
||||||
|
|
||||||
@@ -30,3 +31,24 @@ public sealed partial class ArmorComponent : Component
|
|||||||
/// <param name="Msg"></param>
|
/// <param name="Msg"></param>
|
||||||
[ByRefEvent]
|
[ByRefEvent]
|
||||||
public record struct ArmorExamineEvent(FormattedMessage Msg);
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -19,11 +19,25 @@ public abstract class SharedArmorSystem : EntitySystem
|
|||||||
{
|
{
|
||||||
base.Initialize();
|
base.Initialize();
|
||||||
|
|
||||||
|
SubscribeLocalEvent<ArmorComponent, InventoryRelayedEvent<CoefficientQueryEvent>>(OnCoefficientQuery);
|
||||||
SubscribeLocalEvent<ArmorComponent, InventoryRelayedEvent<DamageModifyEvent>>(OnDamageModify);
|
SubscribeLocalEvent<ArmorComponent, InventoryRelayedEvent<DamageModifyEvent>>(OnDamageModify);
|
||||||
SubscribeLocalEvent<ArmorComponent, BorgModuleRelayedEvent<DamageModifyEvent>>(OnBorgDamageModify);
|
SubscribeLocalEvent<ArmorComponent, BorgModuleRelayedEvent<DamageModifyEvent>>(OnBorgDamageModify);
|
||||||
SubscribeLocalEvent<ArmorComponent, GetVerbsEvent<ExamineVerb>>(OnArmorVerbExamine);
|
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)
|
private void OnDamageModify(EntityUid uid, ArmorComponent component, InventoryRelayedEvent<DamageModifyEvent> args)
|
||||||
{
|
{
|
||||||
args.Args.Damage = DamageSpecifier.ApplyModifierSet(args.Args.Damage, component.Modifiers);
|
args.Args.Damage = DamageSpecifier.ApplyModifierSet(args.Args.Damage, component.Modifiers);
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
using Content.Shared.Armor;
|
||||||
using Content.Shared.Chat;
|
using Content.Shared.Chat;
|
||||||
using Content.Shared.Chemistry;
|
using Content.Shared.Chemistry;
|
||||||
using Content.Shared.Chemistry.Hypospray.Events;
|
using Content.Shared.Chemistry.Hypospray.Events;
|
||||||
@@ -40,6 +41,7 @@ public partial class InventorySystem
|
|||||||
SubscribeLocalEvent<InventoryComponent, TargetBeforeHyposprayInjectsEvent>(RelayInventoryEvent);
|
SubscribeLocalEvent<InventoryComponent, TargetBeforeHyposprayInjectsEvent>(RelayInventoryEvent);
|
||||||
SubscribeLocalEvent<InventoryComponent, SelfBeforeGunShotEvent>(RelayInventoryEvent);
|
SubscribeLocalEvent<InventoryComponent, SelfBeforeGunShotEvent>(RelayInventoryEvent);
|
||||||
SubscribeLocalEvent<InventoryComponent, SelfBeforeClimbEvent>(RelayInventoryEvent);
|
SubscribeLocalEvent<InventoryComponent, SelfBeforeClimbEvent>(RelayInventoryEvent);
|
||||||
|
SubscribeLocalEvent<InventoryComponent, CoefficientQueryEvent>(RelayInventoryEvent);
|
||||||
|
|
||||||
// by-ref events
|
// by-ref events
|
||||||
SubscribeLocalEvent<InventoryComponent, GetExplosionResistanceEvent>(RefRelayInventoryEvent);
|
SubscribeLocalEvent<InventoryComponent, GetExplosionResistanceEvent>(RefRelayInventoryEvent);
|
||||||
|
|||||||
Reference in New Issue
Block a user