using Content.Shared.Trigger.Components.Triggers; using Content.Shared.StepTrigger.Systems; using Robust.Shared.Physics.Events; namespace Content.Shared.Trigger.Systems; public sealed partial class TriggerSystem { private void InitializeCollide() { SubscribeLocalEvent(OnCollide); SubscribeLocalEvent(OnStepTriggered); SubscribeLocalEvent(OnTimedCollide); SubscribeLocalEvent(OnTimedEndCollide); SubscribeLocalEvent(OnTimedShutdown); } private void OnCollide(Entity ent, ref StartCollideEvent args) { if (args.OurFixtureId == ent.Comp.FixtureID && (!ent.Comp.IgnoreOtherNonHard || args.OtherFixture.Hard)) Trigger(ent.Owner, args.OtherEntity, ent.Comp.KeyOut); } private void OnStepTriggered(Entity ent, ref StepTriggeredOffEvent args) { Trigger(ent, args.Tripper, ent.Comp.KeyOut); } private void OnTimedCollide(Entity ent, ref StartCollideEvent args) { //Ensures the trigger entity will have an active component EnsureComp(ent); var otherUID = args.OtherEntity; if (ent.Comp.Colliding.ContainsKey(otherUID)) return; ent.Comp.Colliding.Add(otherUID, _timing.CurTime + ent.Comp.Threshold); Dirty(ent); } private void OnTimedEndCollide(Entity ent, ref EndCollideEvent args) { var otherUID = args.OtherEntity; ent.Comp.Colliding.Remove(otherUID); Dirty(ent); if (ent.Comp.Colliding.Count == 0) RemComp(ent); } private void OnTimedShutdown(Entity ent, ref ComponentShutdown args) { RemComp(ent); } private void UpdateTimedCollide() { var curTime = _timing.CurTime; var query = EntityQueryEnumerator(); while (query.MoveNext(out var uid, out _, out var triggerOnTimedCollide)) { foreach (var (collidingEntity, collidingTime) in triggerOnTimedCollide.Colliding) { if (curTime > collidingTime) { triggerOnTimedCollide.Colliding[collidingEntity] += triggerOnTimedCollide.Threshold; Dirty(uid, triggerOnTimedCollide); Trigger(uid, collidingEntity, triggerOnTimedCollide.KeyOut); } } } } }