Files
tbd-station-14/Content.Shared/Trigger/Systems/TriggerSystem.Collide.cs
2025-08-03 21:20:37 +02:00

74 lines
2.9 KiB
C#

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<TriggerOnCollideComponent, StartCollideEvent>(OnCollide);
SubscribeLocalEvent<TriggerOnStepTriggerComponent, StepTriggeredOffEvent>(OnStepTriggered);
SubscribeLocalEvent<TriggerOnTimedCollideComponent, StartCollideEvent>(OnTimedCollide);
SubscribeLocalEvent<TriggerOnTimedCollideComponent, EndCollideEvent>(OnTimedEndCollide);
SubscribeLocalEvent<TriggerOnTimedCollideComponent, ComponentShutdown>(OnTimedShutdown);
}
private void OnCollide(Entity<TriggerOnCollideComponent> 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<TriggerOnStepTriggerComponent> ent, ref StepTriggeredOffEvent args)
{
Trigger(ent, args.Tripper, ent.Comp.KeyOut);
}
private void OnTimedCollide(Entity<TriggerOnTimedCollideComponent> ent, ref StartCollideEvent args)
{
//Ensures the trigger entity will have an active component
EnsureComp<ActiveTriggerOnTimedCollideComponent>(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<TriggerOnTimedCollideComponent> ent, ref EndCollideEvent args)
{
var otherUID = args.OtherEntity;
ent.Comp.Colliding.Remove(otherUID);
Dirty(ent);
if (ent.Comp.Colliding.Count == 0)
RemComp<ActiveTriggerOnTimedCollideComponent>(ent);
}
private void OnTimedShutdown(Entity<TriggerOnTimedCollideComponent> ent, ref ComponentShutdown args)
{
RemComp<ActiveTriggerOnTimedCollideComponent>(ent);
}
private void UpdateTimedCollide()
{
var curTime = _timing.CurTime;
var query = EntityQueryEnumerator<ActiveTriggerOnTimedCollideComponent, TriggerOnTimedCollideComponent>();
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);
}
}
}
}
}