using Content.Shared.Movement.Components; using Robust.Shared.Physics.Events; namespace Content.Shared.Movement.Systems; /// /// Applies an occlusion shader for any relevant entities. /// public abstract class SharedFloorOcclusionSystem : EntitySystem { public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnStartCollide); SubscribeLocalEvent(OnEndCollide); } private void OnStartCollide(Entity entity, ref StartCollideEvent args) { var other = args.OtherEntity; if (!TryComp(other, out var occlusion) || occlusion.Colliding.Contains(entity.Owner)) { return; } occlusion.Colliding.Add(entity.Owner); Dirty(other, occlusion); SetEnabled((other, occlusion)); } private void OnEndCollide(Entity entity, ref EndCollideEvent args) { var other = args.OtherEntity; if (!TryComp(other, out var occlusion)) return; if (!occlusion.Colliding.Remove(entity.Owner)) return; Dirty(other, occlusion); SetEnabled((other, occlusion)); } protected virtual void SetEnabled(Entity entity) { } }