diff --git a/Content.Client/Movement/Systems/FloorOcclusionSystem.cs b/Content.Client/Movement/Systems/FloorOcclusionSystem.cs index 5c75f25ca2..44573f8e08 100644 --- a/Content.Client/Movement/Systems/FloorOcclusionSystem.cs +++ b/Content.Client/Movement/Systems/FloorOcclusionSystem.cs @@ -10,51 +10,56 @@ public sealed class FloorOcclusionSystem : SharedFloorOcclusionSystem { [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(EntityUid uid, FloorOcclusionComponent component, ref AfterAutoHandleStateEvent args) + private void OnOcclusionAuto(Entity ent, ref AfterAutoHandleStateEvent args) { - SetEnabled(uid, component, component.Enabled); + SetShader(ent.Owner, ent.Comp.Enabled); } - private void OnOcclusionStartup(EntityUid uid, FloorOcclusionComponent component, ComponentStartup args) + private void OnOcclusionStartup(Entity ent, ref ComponentStartup args) { - if (component.Enabled && TryComp(uid, out var sprite)) - SetShader(sprite, true); + SetShader(ent.Owner, ent.Comp.Enabled); } - protected override void SetEnabled(EntityUid uid, FloorOcclusionComponent component, bool enabled) + private void OnOcclusionShutdown(Entity ent, ref ComponentShutdown args) { - if (component.Enabled == enabled) + 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; - base.SetEnabled(uid, component, enabled); - - if (!TryComp(uid, out var sprite)) - return; - - SetShader(sprite, enabled); - } - - private void SetShader(SpriteComponent sprite, bool enabled) - { var shader = _proto.Index("HorizontalCut").Instance(); - if (sprite.PostShader is not null && sprite.PostShader != shader) + if (sprite.Comp.PostShader is not null && sprite.Comp.PostShader != shader) return; if (enabled) { - sprite.PostShader = shader; + sprite.Comp.PostShader = shader; } else { - sprite.PostShader = null; + sprite.Comp.PostShader = null; } } } diff --git a/Content.Shared/Movement/Components/FloorOcclusionComponent.cs b/Content.Shared/Movement/Components/FloorOcclusionComponent.cs index aa9a1ced55..5d412f694a 100644 --- a/Content.Shared/Movement/Components/FloorOcclusionComponent.cs +++ b/Content.Shared/Movement/Components/FloorOcclusionComponent.cs @@ -8,12 +8,9 @@ namespace Content.Shared.Movement.Components; [RegisterComponent, NetworkedComponent, AutoGenerateComponentState(true)] public sealed partial class FloorOcclusionComponent : Component { - /// - /// Is the shader currently enabled. - /// - [ViewVariables(VVAccess.ReadWrite), DataField("enabled"), AutoNetworkedField] - public bool Enabled; + [ViewVariables] + public bool Enabled => Colliding.Count > 0; - [DataField("colliding")] + [DataField, AutoNetworkedField] public List Colliding = new(); } diff --git a/Content.Shared/Movement/Systems/SharedFloorOcclusionSystem.cs b/Content.Shared/Movement/Systems/SharedFloorOcclusionSystem.cs index 9d27ea42c6..6b7023a1c6 100644 --- a/Content.Shared/Movement/Systems/SharedFloorOcclusionSystem.cs +++ b/Content.Shared/Movement/Systems/SharedFloorOcclusionSystem.cs @@ -15,39 +15,37 @@ public abstract class SharedFloorOcclusionSystem : EntitySystem SubscribeLocalEvent(OnEndCollide); } - private void OnStartCollide(EntityUid uid, FloorOccluderComponent component, ref StartCollideEvent args) + private void OnStartCollide(Entity entity, ref StartCollideEvent args) { var other = args.OtherEntity; if (!TryComp(other, out var occlusion) || - occlusion.Colliding.Contains(uid)) + occlusion.Colliding.Contains(entity.Owner)) { return; } - SetEnabled(other, occlusion, true); - occlusion.Colliding.Add(uid); + occlusion.Colliding.Add(entity.Owner); + Dirty(other, occlusion); + SetEnabled((other, occlusion)); } - private void OnEndCollide(EntityUid uid, FloorOccluderComponent component, ref EndCollideEvent args) + private void OnEndCollide(Entity entity, ref EndCollideEvent args) { var other = args.OtherEntity; if (!TryComp(other, out var occlusion)) return; - occlusion.Colliding.Remove(uid); - - if (occlusion.Colliding.Count == 0) - SetEnabled(other, occlusion, false); - } - - protected virtual void SetEnabled(EntityUid uid, FloorOcclusionComponent component, bool enabled) - { - if (component.Enabled == enabled) + if (!occlusion.Colliding.Remove(entity.Owner)) return; - component.Enabled = enabled; - Dirty(uid, component); + Dirty(other, occlusion); + SetEnabled((other, occlusion)); + } + + protected virtual void SetEnabled(Entity entity) + { + } }