FloorOcclusionSystem.cs 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. using Content.Shared.Movement.Components;
  2. using Content.Shared.Movement.Systems;
  3. using Robust.Client.GameObjects;
  4. using Robust.Client.Graphics;
  5. using Robust.Shared.Prototypes;
  6. namespace Content.Client.Movement.Systems;
  7. public sealed class FloorOcclusionSystem : SharedFloorOcclusionSystem
  8. {
  9. [Dependency] private readonly IPrototypeManager _proto = default!;
  10. private EntityQuery<SpriteComponent> _spriteQuery;
  11. public override void Initialize()
  12. {
  13. base.Initialize();
  14. _spriteQuery = GetEntityQuery<SpriteComponent>();
  15. SubscribeLocalEvent<FloorOcclusionComponent, ComponentStartup>(OnOcclusionStartup);
  16. SubscribeLocalEvent<FloorOcclusionComponent, ComponentShutdown>(OnOcclusionShutdown);
  17. SubscribeLocalEvent<FloorOcclusionComponent, AfterAutoHandleStateEvent>(OnOcclusionAuto);
  18. }
  19. private void OnOcclusionAuto(Entity<FloorOcclusionComponent> ent, ref AfterAutoHandleStateEvent args)
  20. {
  21. SetShader(ent.Owner, ent.Comp.Enabled);
  22. }
  23. private void OnOcclusionStartup(Entity<FloorOcclusionComponent> ent, ref ComponentStartup args)
  24. {
  25. SetShader(ent.Owner, ent.Comp.Enabled);
  26. }
  27. private void OnOcclusionShutdown(Entity<FloorOcclusionComponent> ent, ref ComponentShutdown args)
  28. {
  29. SetShader(ent.Owner, false);
  30. }
  31. protected override void SetEnabled(Entity<FloorOcclusionComponent> entity)
  32. {
  33. SetShader(entity.Owner, entity.Comp.Enabled);
  34. }
  35. private void SetShader(Entity<SpriteComponent?> sprite, bool enabled)
  36. {
  37. if (!_spriteQuery.Resolve(sprite.Owner, ref sprite.Comp, false))
  38. return;
  39. var shader = _proto.Index<ShaderPrototype>("HorizontalCut").Instance();
  40. if (sprite.Comp.PostShader is not null && sprite.Comp.PostShader != shader)
  41. return;
  42. if (enabled)
  43. {
  44. sprite.Comp.PostShader = shader;
  45. }
  46. else
  47. {
  48. sprite.Comp.PostShader = null;
  49. }
  50. }
  51. }