/// </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;
}
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)
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