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