MappingOverlay.cs 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. using Robust.Client.GameObjects;
  2. using Robust.Client.Graphics;
  3. using Robust.Client.Input;
  4. using Robust.Client.Player;
  5. using Robust.Client.UserInterface;
  6. using Robust.Shared.Enums;
  7. using Robust.Shared.Prototypes;
  8. using static Content.Client.Mapping.MappingState;
  9. namespace Content.Client.Mapping;
  10. public sealed class MappingOverlay : Overlay
  11. {
  12. [Dependency] private readonly IEntityManager _entities = default!;
  13. [Dependency] private readonly IPlayerManager _player = default!;
  14. [Dependency] private readonly IPrototypeManager _prototypes = default!;
  15. // 1 off in case something else uses these colors since we use them to compare
  16. private static readonly Color PickColor = new(1, 255, 0);
  17. private static readonly Color DeleteColor = new(255, 1, 0);
  18. private readonly Dictionary<EntityUid, Color> _oldColors = new();
  19. private readonly MappingState _state;
  20. private readonly ShaderInstance _shader;
  21. public override OverlaySpace Space => OverlaySpace.WorldSpace;
  22. public MappingOverlay(MappingState state)
  23. {
  24. IoCManager.InjectDependencies(this);
  25. _state = state;
  26. _shader = _prototypes.Index<ShaderPrototype>("unshaded").Instance();
  27. }
  28. protected override void Draw(in OverlayDrawArgs args)
  29. {
  30. foreach (var (id, color) in _oldColors)
  31. {
  32. if (!_entities.TryGetComponent(id, out SpriteComponent? sprite))
  33. continue;
  34. if (sprite.Color == DeleteColor || sprite.Color == PickColor)
  35. sprite.Color = color;
  36. }
  37. _oldColors.Clear();
  38. if (_player.LocalEntity == null)
  39. return;
  40. var handle = args.WorldHandle;
  41. handle.UseShader(_shader);
  42. switch (_state.State)
  43. {
  44. case CursorState.Pick:
  45. {
  46. if (_state.GetHoveredEntity() is { } entity &&
  47. _entities.TryGetComponent(entity, out SpriteComponent? sprite))
  48. {
  49. _oldColors[entity] = sprite.Color;
  50. sprite.Color = PickColor;
  51. }
  52. break;
  53. }
  54. case CursorState.Delete:
  55. {
  56. if (_state.GetHoveredEntity() is { } entity &&
  57. _entities.TryGetComponent(entity, out SpriteComponent? sprite))
  58. {
  59. _oldColors[entity] = sprite.Color;
  60. sprite.Color = DeleteColor;
  61. }
  62. break;
  63. }
  64. }
  65. handle.UseShader(null);
  66. }
  67. }