using System.Linq; using Content.Server.Explosion.Components; using Content.Server.Explosion.EntitySystems; using Robust.Shared.Physics.Dynamics; using Robust.Shared.Physics.Events; namespace Content.Server.Explosion.EntitySystems; public sealed partial class TriggerSystem { private void InitializeTimedCollide() { SubscribeLocalEvent(OnTimerCollide); SubscribeLocalEvent(OnTimerEndCollide); SubscribeLocalEvent(OnComponentRemove); } private void OnTimerCollide(EntityUid uid, TriggerOnTimedCollideComponent component, ref StartCollideEvent args) { //Ensures the entity trigger will have an active component EnsureComp(uid); var otherUID = args.OtherFixture.Body.Owner; if (component.Colliding.ContainsKey(otherUID)) return; component.Colliding.Add(otherUID, 0); } private void OnTimerEndCollide(EntityUid uid, TriggerOnTimedCollideComponent component, ref EndCollideEvent args) { var otherUID = args.OtherFixture.Body.Owner; component.Colliding.Remove(otherUID); if (component.Colliding.Count == 0 && HasComp(uid)) RemComp(uid); } private void OnComponentRemove(EntityUid uid, TriggerOnTimedCollideComponent component, ComponentRemove args) { if (HasComp(uid)) RemComp(uid); } private void UpdateTimedCollide(float frameTime) { foreach (var (activeTrigger, triggerOnTimedCollide) in EntityQuery()) { foreach (var (collidingEntity, collidingTimer) in triggerOnTimedCollide.Colliding) { triggerOnTimedCollide.Colliding[collidingEntity] += frameTime; if (collidingTimer > triggerOnTimedCollide.Threshold) { RaiseLocalEvent(activeTrigger.Owner, new TriggerEvent(activeTrigger.Owner, collidingEntity), true); triggerOnTimedCollide.Colliding[collidingEntity] -= triggerOnTimedCollide.Threshold; } } } } }