diff --git a/Content.Server/Explosion/EntitySystems/ExplosionSystem.Airtight.cs b/Content.Server/Explosion/EntitySystems/ExplosionSystem.Airtight.cs index 1a9f957218..af150c9325 100644 --- a/Content.Server/Explosion/EntitySystems/ExplosionSystem.Airtight.cs +++ b/Content.Server/Explosion/EntitySystems/ExplosionSystem.Airtight.cs @@ -152,7 +152,7 @@ public sealed partial class ExplosionSystem : EntitySystem continue; var ev = new GetExplosionResistanceEvent(explosionType.ID); - RaiseLocalEvent(uid, ev, false); + RaiseLocalEvent(uid, ref ev); damagePerIntensity += value * Math.Max(0, ev.DamageCoefficient); } diff --git a/Content.Server/Explosion/EntitySystems/ExplosionSystem.Processing.cs b/Content.Server/Explosion/EntitySystems/ExplosionSystem.Processing.cs index e9efe639f2..1938831f7e 100644 --- a/Content.Server/Explosion/EntitySystems/ExplosionSystem.Processing.cs +++ b/Content.Server/Explosion/EntitySystems/ExplosionSystem.Processing.cs @@ -390,7 +390,7 @@ public sealed partial class ExplosionSystem : EntitySystem if (damage != null && damageQuery.TryGetComponent(uid, out var damageable)) { var ev = new GetExplosionResistanceEvent(id); - RaiseLocalEvent(uid, ev, false); + RaiseLocalEvent(uid, ref ev, false); ev.DamageCoefficient = Math.Max(0, ev.DamageCoefficient); diff --git a/Content.Server/Explosion/EntitySystems/ExplosionSystem.cs b/Content.Server/Explosion/EntitySystems/ExplosionSystem.cs index d042b65449..06c95383fc 100644 --- a/Content.Server/Explosion/EntitySystems/ExplosionSystem.cs +++ b/Content.Server/Explosion/EntitySystems/ExplosionSystem.cs @@ -76,7 +76,7 @@ public sealed partial class ExplosionSystem : EntitySystem SubscribeLocalEvent(OnGetResistance); // as long as explosion-resistance mice are never added, this should be fine (otherwise a mouse-hat will transfer it's power to the wearer). - SubscribeLocalEvent>((e, c, ev) => OnGetResistance(e, c, ev.Args)); + SubscribeLocalEvent>(RelayedResistance); SubscribeLocalEvent(OnTileChanged); @@ -112,10 +112,17 @@ public sealed partial class ExplosionSystem : EntitySystem _pathfindingSystem.PauseUpdating = false; } - private void OnGetResistance(EntityUid uid, ExplosionResistanceComponent component, GetExplosionResistanceEvent args) + private void RelayedResistance(EntityUid uid, ExplosionResistanceComponent component, + InventoryRelayedEvent args) + { + var a = args.Args; + OnGetResistance(uid, component, ref a); + } + + private void OnGetResistance(EntityUid uid, ExplosionResistanceComponent component, ref GetExplosionResistanceEvent args) { args.DamageCoefficient *= component.DamageCoefficient; - if (component.Modifiers.TryGetValue(args.ExplotionPrototype, out var modifier)) + if (component.Modifiers.TryGetValue(args.ExplosionPrototype, out var modifier)) args.DamageCoefficient *= modifier; } diff --git a/Content.Shared/Explosion/ExplosionEvents.cs b/Content.Shared/Explosion/ExplosionEvents.cs index 5cd9d2e201..37c956e165 100644 --- a/Content.Shared/Explosion/ExplosionEvents.cs +++ b/Content.Shared/Explosion/ExplosionEvents.cs @@ -8,19 +8,15 @@ namespace Content.Shared.Explosion; /// Raised directed at an entity to determine its explosion resistance, probably right before it is about to be /// damaged by one. /// -public sealed class GetExplosionResistanceEvent : EntityEventArgs, IInventoryRelayEvent +[ByRefEvent] +public record struct GetExplosionResistanceEvent(string ExplosionPrototype) : IInventoryRelayEvent { /// /// A coefficient applied to overall explosive damage. /// public float DamageCoefficient = 1; - public readonly string ExplotionPrototype; + public readonly string ExplosionPrototype = ExplosionPrototype; SlotFlags IInventoryRelayEvent.TargetSlots => ~SlotFlags.POCKET; - - public GetExplosionResistanceEvent(string id) - { - ExplotionPrototype = id; - } } diff --git a/Content.Shared/Inventory/InventorySystem.Relay.cs b/Content.Shared/Inventory/InventorySystem.Relay.cs index bada7935ba..1731d5c64e 100644 --- a/Content.Shared/Inventory/InventorySystem.Relay.cs +++ b/Content.Shared/Inventory/InventorySystem.Relay.cs @@ -24,7 +24,7 @@ public partial class InventorySystem SubscribeLocalEvent(RelayInventoryEvent); SubscribeLocalEvent(RelayInventoryEvent); SubscribeLocalEvent(RelayInventoryEvent); - SubscribeLocalEvent(RelayInventoryEvent); + SubscribeLocalEvent(RefRelayInventoryEvent); SubscribeLocalEvent(RelayInventoryEvent); SubscribeLocalEvent(RelayInventoryEvent); SubscribeLocalEvent(RelayInventoryEvent); @@ -42,7 +42,22 @@ public partial class InventorySystem SubscribeLocalEvent>(OnGetStrippingVerbs); } - protected void RelayInventoryEvent(EntityUid uid, InventoryComponent component, T args) where T : EntityEventArgs, IInventoryRelayEvent + protected void RefRelayInventoryEvent(EntityUid uid, InventoryComponent component, ref T args) where T : IInventoryRelayEvent + { + // Just so I don't have to update 20 morbillion events at once. + if (args.TargetSlots == SlotFlags.NONE) + return; + + var containerEnumerator = new ContainerSlotEnumerator(uid, component.TemplateId, _prototypeManager, this, args.TargetSlots); + var ev = new InventoryRelayedEvent(args); + while (containerEnumerator.MoveNext(out var container)) + { + if (!container.ContainedEntity.HasValue) continue; + RaiseLocalEvent(container.ContainedEntity.Value, ev, broadcast: false); + } + } + + protected void RelayInventoryEvent(EntityUid uid, InventoryComponent component, T args) where T : IInventoryRelayEvent { if (args.TargetSlots == SlotFlags.NONE) return; @@ -93,7 +108,7 @@ public partial class InventorySystem /// happens to be a dead mouse. Clothing that wishes to modify movement speed must subscribe to /// InventoryRelayedEvent<RefreshMovementSpeedModifiersEvent> /// -public sealed class InventoryRelayedEvent : EntityEventArgs where TEvent : EntityEventArgs +public sealed class InventoryRelayedEvent : EntityEventArgs { public readonly TEvent Args; diff --git a/Content.Shared/SubFloor/SharedSubFloorHideSystem.cs b/Content.Shared/SubFloor/SharedSubFloorHideSystem.cs index ac7a608410..0fd7a2e932 100644 --- a/Content.Shared/SubFloor/SharedSubFloorHideSystem.cs +++ b/Content.Shared/SubFloor/SharedSubFloorHideSystem.cs @@ -35,7 +35,7 @@ namespace Content.Shared.SubFloor SubscribeLocalEvent(OnGetExplosionResistance); } - private void OnGetExplosionResistance(EntityUid uid, SubFloorHideComponent component, GetExplosionResistanceEvent args) + private void OnGetExplosionResistance(EntityUid uid, SubFloorHideComponent component, ref GetExplosionResistanceEvent args) { if (component.BlockInteractions && component.IsUnderCover) args.DamageCoefficient = 0;