using Content.Shared._ES.Physics.PreventCollide.Components;
using Robust.Shared.Physics.Events;
namespace Content.Shared._ES.Physics.PreventCollide;
public sealed class ESPreventCollideSystem : EntitySystem
{
///
public override void Initialize()
{
SubscribeLocalEvent(OnShutdown);
SubscribeLocalEvent(OnMarkerShutdown);
SubscribeLocalEvent(OnPreventCollide);
}
private void OnShutdown(Entity ent, ref ComponentShutdown args)
{
foreach (var uid in ent.Comp.Entities)
{
if (!TryComp(uid, out var comp))
continue;
comp.Entities.Remove(ent);
if (comp.Entities.Count == 0)
{
RemComp(uid, comp);
}
else
{
Dirty(uid, comp);
}
}
}
private void OnMarkerShutdown(Entity ent, ref ComponentShutdown args)
{
foreach (var uid in ent.Comp.Entities)
{
if (!TryComp(uid, out var comp))
continue;
comp.Entities.Remove(ent);
if (comp.Entities.Count == 0)
{
RemComp(uid, comp);
}
else
{
Dirty(uid, comp);
}
}
}
private void OnPreventCollide(Entity ent, ref PreventCollideEvent args)
{
if (args.Cancelled)
return;
if (ent.Comp.Entities.Contains(args.OtherEntity))
args.Cancelled = true;
}
///
/// Prevents two entities from colliding with each other
///
///
///
public void PreventCollide(EntityUid primary, EntityUid? collider)
{
if (!collider.HasValue || TerminatingOrDeleted(collider) || EntityManager.IsQueuedForDeletion(collider.Value))
return;
var preventComp = EnsureComp(collider.Value);
preventComp.Entities.Add(primary);
Dirty(collider.Value, preventComp);
var markerComp = EnsureComp(primary);
markerComp.Entities.Add(collider.Value);
Dirty(primary, markerComp);
}
}