]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Make GetExplosionResistance event a struct (#20274)
authormetalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
Sun, 17 Sep 2023 09:04:04 +0000 (19:04 +1000)
committerGitHub <noreply@github.com>
Sun, 17 Sep 2023 09:04:04 +0000 (04:04 -0500)
Also fixed a typo.

Content.Server/Explosion/EntitySystems/ExplosionSystem.Airtight.cs
Content.Server/Explosion/EntitySystems/ExplosionSystem.Processing.cs
Content.Server/Explosion/EntitySystems/ExplosionSystem.cs
Content.Shared/Explosion/ExplosionEvents.cs
Content.Shared/Inventory/InventorySystem.Relay.cs
Content.Shared/SubFloor/SharedSubFloorHideSystem.cs

index 1a9f957218e8176fbcf2aaf35e2129f9267a2059..af150c93250393a2f2d8be4fe8ece0340384e359 100644 (file)
@@ -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);
             }
index e9efe639f226edca6e889241c692a32726c21af6..1938831f7e1ac69fe50ef65e7bfd995c7280ee08 100644 (file)
@@ -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);
 
index d042b6544961f6b6badd8123b993c4e670350848..06c95383fcb1218cfffac2148e91e654210887e2 100644 (file)
@@ -76,7 +76,7 @@ public sealed partial class ExplosionSystem : EntitySystem
         SubscribeLocalEvent<ExplosionResistanceComponent, GetExplosionResistanceEvent>(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<ExplosionResistanceComponent, InventoryRelayedEvent<GetExplosionResistanceEvent>>((e, c, ev) => OnGetResistance(e, c, ev.Args));
+        SubscribeLocalEvent<ExplosionResistanceComponent, InventoryRelayedEvent<GetExplosionResistanceEvent>>(RelayedResistance);
 
         SubscribeLocalEvent<TileChangedEvent>(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<GetExplosionResistanceEvent> 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;
     }
 
index 5cd9d2e20135e28a4adcdc807c588de4271ae6b7..37c956e165d5f9d85eaec9a70d2431755b679639 100644 (file)
@@ -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.
 /// </summary>
-public sealed class GetExplosionResistanceEvent : EntityEventArgs, IInventoryRelayEvent
+[ByRefEvent]
+public record struct GetExplosionResistanceEvent(string ExplosionPrototype) : IInventoryRelayEvent
 {
     /// <summary>
     ///     A coefficient applied to overall explosive damage.
     /// </summary>
     public float DamageCoefficient = 1;
 
-    public readonly string ExplotionPrototype;
+    public readonly string ExplosionPrototype = ExplosionPrototype;
 
     SlotFlags IInventoryRelayEvent.TargetSlots =>  ~SlotFlags.POCKET;
-
-    public GetExplosionResistanceEvent(string id)
-    {
-        ExplotionPrototype = id;
-    }
 }
index bada7935ba52e6a93cd9cce4a3eaeacaa7bcb1ee..1731d5c64e947180f25f245b563c3c8ea41e2b06 100644 (file)
@@ -24,7 +24,7 @@ public partial class InventorySystem
         SubscribeLocalEvent<InventoryComponent, ElectrocutionAttemptEvent>(RelayInventoryEvent);
         SubscribeLocalEvent<InventoryComponent, SlipAttemptEvent>(RelayInventoryEvent);
         SubscribeLocalEvent<InventoryComponent, RefreshMovementSpeedModifiersEvent>(RelayInventoryEvent);
-        SubscribeLocalEvent<InventoryComponent, GetExplosionResistanceEvent>(RelayInventoryEvent);
+        SubscribeLocalEvent<InventoryComponent, GetExplosionResistanceEvent>(RefRelayInventoryEvent);
         SubscribeLocalEvent<InventoryComponent, BeforeStripEvent>(RelayInventoryEvent);
         SubscribeLocalEvent<InventoryComponent, SeeIdentityAttemptEvent>(RelayInventoryEvent);
         SubscribeLocalEvent<InventoryComponent, ModifyChangedTemperatureEvent>(RelayInventoryEvent);
@@ -42,7 +42,22 @@ public partial class InventorySystem
         SubscribeLocalEvent<InventoryComponent, GetVerbsEvent<EquipmentVerb>>(OnGetStrippingVerbs);
     }
 
-    protected void RelayInventoryEvent<T>(EntityUid uid, InventoryComponent component, T args) where T : EntityEventArgs, IInventoryRelayEvent
+    protected void RefRelayInventoryEvent<T>(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<T>(args);
+        while (containerEnumerator.MoveNext(out var container))
+        {
+            if (!container.ContainedEntity.HasValue) continue;
+            RaiseLocalEvent(container.ContainedEntity.Value, ev, broadcast: false);
+        }
+    }
+
+    protected void RelayInventoryEvent<T>(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&lt;RefreshMovementSpeedModifiersEvent&gt;
 /// </remarks>
-public sealed class InventoryRelayedEvent<TEvent> : EntityEventArgs where TEvent : EntityEventArgs
+public sealed class InventoryRelayedEvent<TEvent> : EntityEventArgs
 {
     public readonly TEvent Args;
 
index ac7a6084102b992976a0b6c17c63d0e79a59feb2..0fd7a2e93280477978d1cf9ef1055227dbcd85a5 100644 (file)
@@ -35,7 +35,7 @@ namespace Content.Shared.SubFloor
             SubscribeLocalEvent<SubFloorHideComponent, GetExplosionResistanceEvent>(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;