using Content.Shared.Movement.Components; using Robust.Shared.Physics.Events; using Content.Shared.StepTrigger.Components; // imp edit using Content.Shared.StepTrigger.Systems; // Imp edit 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); SubscribeLocalEvent(OnStepTriggered); // Imp edit SubscribeLocalEvent(OnStepTriggerAttempt); // Imp edit } private void OnStartCollide(Entity entity, ref StartCollideEvent args) { // Imp edit //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)); if (HasComp(entity)) return; var other = args.OtherEntity; Occlude(entity, other); // Imp End } 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) { } /// /// Imp: Occludes an entity. Moved from OnStartCollide() to allow it to be re-used in OnStepTriggered(). /// private void Occlude(Entity ent, EntityUid other) { if (!TryComp(other, out var occlusion) || occlusion.Colliding.Contains(ent.Owner)) { return; } occlusion.Colliding.Add(ent.Owner); Dirty(other, occlusion); SetEnabled((other, occlusion)); } private void OnStepTriggered(Entity entity, ref StepTriggeredOffEvent args) { var other = args.Tripper; Occlude(entity, other); } private static void OnStepTriggerAttempt(Entity entity, ref StepTriggerAttemptEvent args) { args.Continue = true; } // Imp End }