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