SharedFloorOcclusionSystem.cs 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. using Content.Shared.Movement.Components;
  2. using Robust.Shared.Physics.Events;
  3. namespace Content.Shared.Movement.Systems;
  4. /// <summary>
  5. /// Applies an occlusion shader for any relevant entities.
  6. /// </summary>
  7. public abstract class SharedFloorOcclusionSystem : EntitySystem
  8. {
  9. public override void Initialize()
  10. {
  11. base.Initialize();
  12. SubscribeLocalEvent<FloorOccluderComponent, StartCollideEvent>(OnStartCollide);
  13. SubscribeLocalEvent<FloorOccluderComponent, EndCollideEvent>(OnEndCollide);
  14. }
  15. private void OnStartCollide(Entity<FloorOccluderComponent> entity, ref StartCollideEvent args)
  16. {
  17. var other = args.OtherEntity;
  18. if (!TryComp<FloorOcclusionComponent>(other, out var occlusion) ||
  19. occlusion.Colliding.Contains(entity.Owner))
  20. {
  21. return;
  22. }
  23. occlusion.Colliding.Add(entity.Owner);
  24. Dirty(other, occlusion);
  25. SetEnabled((other, occlusion));
  26. }
  27. private void OnEndCollide(Entity<FloorOccluderComponent> entity, ref EndCollideEvent args)
  28. {
  29. var other = args.OtherEntity;
  30. if (!TryComp<FloorOcclusionComponent>(other, out var occlusion))
  31. return;
  32. if (!occlusion.Colliding.Remove(entity.Owner))
  33. return;
  34. Dirty(other, occlusion);
  35. SetEnabled((other, occlusion));
  36. }
  37. protected virtual void SetEnabled(Entity<FloorOcclusionComponent> entity)
  38. {
  39. }
  40. }