]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
prevent repeat TriggerOnCollide triggers (#40428)
authorCharlie Morley <cmorley191@gmail.com>
Sun, 21 Sep 2025 15:23:37 +0000 (09:23 -0600)
committerGitHub <noreply@github.com>
Sun, 21 Sep 2025 15:23:37 +0000 (17:23 +0200)
* prevent repeat TriggerOnCollide triggers

* review comment: remove TriggerOnCollide when out of triggers

Content.Shared/Trigger/Components/Triggers/TriggerOnCollideComponent.cs
Content.Shared/Trigger/Systems/TriggerSystem.Collide.cs
Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/magic.yml
Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml
Resources/Prototypes/Magic/Fixtures/runes.yml
Resources/Prototypes/floor_trap.yml

index a1e234bd7a60f4b036b72ab66ede7f34e8ffb755..1cd8fb714b4e54040f7070608daea73e1a35b539 100644 (file)
@@ -20,4 +20,10 @@ public sealed partial class TriggerOnCollideComponent : BaseTriggerOnXComponent
     /// </summary>
     [DataField, AutoNetworkedField]
     public bool IgnoreOtherNonHard = true;
+
+    /// <summary>
+    /// If not null, limits the amount of times this component can trigger.
+    /// </summary>
+    [DataField, AutoNetworkedField]
+    public int? MaxTriggers = null;
 }
index 5243b13742a1c65895c8118601558206366d8e26..dc71ca482f4f869f0bb64b9bb06956012498bc20 100644 (file)
@@ -18,8 +18,21 @@ public sealed partial class TriggerSystem
 
     private void OnCollide(Entity<TriggerOnCollideComponent> ent, ref StartCollideEvent args)
     {
-        if (args.OurFixtureId == ent.Comp.FixtureID && (!ent.Comp.IgnoreOtherNonHard || args.OtherFixture.Hard))
+        if (
+            args.OurFixtureId == ent.Comp.FixtureID
+            && (!ent.Comp.IgnoreOtherNonHard || args.OtherFixture.Hard)
+            && (ent.Comp.MaxTriggers == null || ent.Comp.MaxTriggers > 0)
+        )
+        {
+            if (ent.Comp.MaxTriggers != null)
+            {
+                ent.Comp.MaxTriggers--;
+                Dirty(ent);
+                if (ent.Comp.MaxTriggers <= 0)
+                    RemCompDeferred<TriggerOnCollideComponent>(ent);
+            }
             Trigger(ent.Owner, args.OtherEntity, ent.Comp.KeyOut);
+        }
     }
 
     private void OnStepTriggered(Entity<TriggerOnStepTriggerComponent> ent, ref StepTriggeredOffEvent args)
index d1b50429f95e96ecc2795df98da288e81cb7fb6b..30822a024a0ad1c7610bd5352dd73805338226be 100644 (file)
         Poison: 5
   - type: TriggerOnCollide
     fixtureID: projectile
+    # Projectile.DeleteOnCollide is true, but allow this to hit multiple entities if they're
+    # stacked up (they will all trigger a collide), so this isn't frustrating to use
+    maxTriggers: null
   - type: PolymorphOnTrigger
     targetUser: true
 
index 8414a1d16101900839e4d7417b0778416638586c..d847e9d8d80308e0832817624527da8a990e6f83 100644 (file)
   components:
   - type: TriggerOnCollide
     fixtureID: projectile
+    maxTriggers: 1
   - type: Projectile
     damage:
       types:
index 4c843e6dd84905d49a20353f8b27dd5f419b5b6f..88d76e4d7c9126ee71f8803bf3e746f752730658 100644 (file)
@@ -55,6 +55,7 @@
   components:
     - type: TriggerOnCollide
       fixtureID: rune
+      maxTriggers: 1
     - type: ExplodeOnTrigger
     - type: Explosive
       explosionType: Cryo
@@ -74,6 +75,7 @@
   components:
     - type: TriggerOnCollide
       fixtureID: rune
+      maxTriggers: 1
     - type: DeleteOnTrigger
     - type: StunOnCollide
       stunAmount: 5
@@ -92,6 +94,7 @@
   components:
     - type: TriggerOnCollide
       fixtureID: ignition
+      maxTriggers: 1
     - type: Fixtures
       fixtures:
         ignition:
index 217dd9fca2dc7d1bc36232082ac170ec51a7556c..f88f94c5878e80d1722bea9af87156583405bcaa 100644 (file)
@@ -40,6 +40,7 @@
   components:
     - type: TriggerOnCollide
       fixtureID: floortrap
+      maxTriggers: 1
     - type: ExplodeOnTrigger
     - type: Explosive
       explosionType: Default
@@ -55,6 +56,7 @@
   components:
     - type: TriggerOnCollide
       fixtureID: floortrap
+      maxTriggers: 1
     - type: EmpOnTrigger
       range: 2
       energyConsumption: 5000
@@ -67,6 +69,7 @@
   components:
     - type: TriggerOnCollide
       fixtureID: floortrap
+      maxTriggers: 1
     - type: SpawnOnTrigger
       proto: MobCarp
     - type: DeleteOnTrigger
@@ -78,6 +81,7 @@
   components:
     - type: TriggerOnCollide
       fixtureID: floortrap
+      maxTriggers: 1
     - type: SpawnOnTrigger
       proto: MobBearSpace
     - type: DeleteOnTrigger
@@ -89,6 +93,7 @@
   components:
     - type: TriggerOnCollide
       fixtureID: floortrap
+      maxTriggers: 1
     - type: SpawnOnTrigger
       proto: MobKangarooSpace
     - type: DeleteOnTrigger
   components:
     - type: TriggerOnCollide
       fixtureID: floortrap
+      maxTriggers: 1
     - type: SpawnOnTrigger
       proto: MobXenoDrone
     - type: DeleteOnTrigger
   components:
     - type: TriggerOnCollide
       fixtureID: floortrap
+      maxTriggers: 1
     - type: SpawnOnTrigger
       proto: MobXeno
     - type: DeleteOnTrigger