using Content.Shared.Movement.Components; using Content.Shared.Movement.Systems; using Robust.Client.GameObjects; using Robust.Client.Graphics; using Robust.Shared.Prototypes; namespace Content.Client.Movement.Systems; public sealed class FloorOcclusionSystem : SharedFloorOcclusionSystem { private static readonly ProtoId HorizontalCut = "HorizontalCut"; [Dependency] private readonly IPrototypeManager _proto = default!; private EntityQuery _spriteQuery; public override void Initialize() { base.Initialize(); _spriteQuery = GetEntityQuery(); SubscribeLocalEvent(OnOcclusionStartup); SubscribeLocalEvent(OnOcclusionShutdown); SubscribeLocalEvent(OnOcclusionAuto); } private void OnOcclusionAuto(Entity ent, ref AfterAutoHandleStateEvent args) { SetShader(ent.Owner, ent.Comp.Enabled); } private void OnOcclusionStartup(Entity ent, ref ComponentStartup args) { SetShader(ent.Owner, ent.Comp.Enabled); } private void OnOcclusionShutdown(Entity ent, ref ComponentShutdown args) { SetShader(ent.Owner, false); } protected override void SetEnabled(Entity entity) { SetShader(entity.Owner, entity.Comp.Enabled); } private void SetShader(Entity sprite, bool enabled) { if (!_spriteQuery.Resolve(sprite.Owner, ref sprite.Comp, false)) return; var shader = _proto.Index(HorizontalCut).Instance(); if (sprite.Comp.PostShader is not null && sprite.Comp.PostShader != shader) return; if (enabled) { sprite.Comp.PostShader = shader; } else { sprite.Comp.PostShader = null; } } }