diff --git a/Content.Shared/Trigger/Components/Triggers/TriggerOnCollideComponent.cs b/Content.Shared/Trigger/Components/Triggers/TriggerOnCollideComponent.cs
index a1e234bd7a..1cd8fb714b 100644
--- a/Content.Shared/Trigger/Components/Triggers/TriggerOnCollideComponent.cs
+++ b/Content.Shared/Trigger/Components/Triggers/TriggerOnCollideComponent.cs
@@ -20,4 +20,10 @@ public sealed partial class TriggerOnCollideComponent : BaseTriggerOnXComponent
///
[DataField, AutoNetworkedField]
public bool IgnoreOtherNonHard = true;
+
+ ///
+ /// If not null, limits the amount of times this component can trigger.
+ ///
+ [DataField, AutoNetworkedField]
+ public int? MaxTriggers = null;
}
diff --git a/Content.Shared/Trigger/Systems/TriggerSystem.Collide.cs b/Content.Shared/Trigger/Systems/TriggerSystem.Collide.cs
index 5243b13742..dc71ca482f 100644
--- a/Content.Shared/Trigger/Systems/TriggerSystem.Collide.cs
+++ b/Content.Shared/Trigger/Systems/TriggerSystem.Collide.cs
@@ -18,8 +18,21 @@ public sealed partial class TriggerSystem
private void OnCollide(Entity 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(ent);
+ }
Trigger(ent.Owner, args.OtherEntity, ent.Comp.KeyOut);
+ }
}
private void OnStepTriggered(Entity ent, ref StepTriggeredOffEvent args)
diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/magic.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/magic.yml
index d1b50429f9..30822a024a 100644
--- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/magic.yml
+++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/magic.yml
@@ -176,6 +176,9 @@
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
diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml
index 8414a1d161..d847e9d8d8 100644
--- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml
+++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml
@@ -101,6 +101,7 @@
components:
- type: TriggerOnCollide
fixtureID: projectile
+ maxTriggers: 1
- type: Projectile
damage:
types:
diff --git a/Resources/Prototypes/Magic/Fixtures/runes.yml b/Resources/Prototypes/Magic/Fixtures/runes.yml
index 4c843e6dd8..88d76e4d7c 100644
--- a/Resources/Prototypes/Magic/Fixtures/runes.yml
+++ b/Resources/Prototypes/Magic/Fixtures/runes.yml
@@ -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:
diff --git a/Resources/Prototypes/floor_trap.yml b/Resources/Prototypes/floor_trap.yml
index 217dd9fca2..f88f94c587 100644
--- a/Resources/Prototypes/floor_trap.yml
+++ b/Resources/Prototypes/floor_trap.yml
@@ -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
@@ -100,6 +105,7 @@
components:
- type: TriggerOnCollide
fixtureID: floortrap
+ maxTriggers: 1
- type: SpawnOnTrigger
proto: MobXenoDrone
- type: DeleteOnTrigger
@@ -111,6 +117,7 @@
components:
- type: TriggerOnCollide
fixtureID: floortrap
+ maxTriggers: 1
- type: SpawnOnTrigger
proto: MobXeno
- type: DeleteOnTrigger