1
0

SpriteFadeSystem.cs 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. using Content.Client.Gameplay;
  2. using Content.Shared.Sprite;
  3. using Robust.Client.GameObjects;
  4. using Robust.Client.Player;
  5. using Robust.Client.State;
  6. using Robust.Shared.Physics;
  7. namespace Content.Client.Sprite;
  8. public sealed class SpriteFadeSystem : EntitySystem
  9. {
  10. /*
  11. * If the player entity is obstructed under the specified components then it will drop the alpha for that entity
  12. * so the player is still visible.
  13. */
  14. [Dependency] private readonly IPlayerManager _playerManager = default!;
  15. [Dependency] private readonly IStateManager _stateManager = default!;
  16. [Dependency] private readonly SharedTransformSystem _transform = default!;
  17. private readonly HashSet<FadingSpriteComponent> _comps = new();
  18. private EntityQuery<SpriteComponent> _spriteQuery;
  19. private EntityQuery<SpriteFadeComponent> _fadeQuery;
  20. private EntityQuery<FadingSpriteComponent> _fadingQuery;
  21. private const float TargetAlpha = 0.4f;
  22. private const float ChangeRate = 1f;
  23. public override void Initialize()
  24. {
  25. base.Initialize();
  26. _spriteQuery = GetEntityQuery<SpriteComponent>();
  27. _fadeQuery = GetEntityQuery<SpriteFadeComponent>();
  28. _fadingQuery = GetEntityQuery<FadingSpriteComponent>();
  29. SubscribeLocalEvent<FadingSpriteComponent, ComponentShutdown>(OnFadingShutdown);
  30. }
  31. private void OnFadingShutdown(EntityUid uid, FadingSpriteComponent component, ComponentShutdown args)
  32. {
  33. if (MetaData(uid).EntityLifeStage >= EntityLifeStage.Terminating || !TryComp<SpriteComponent>(uid, out var sprite))
  34. return;
  35. sprite.Color = sprite.Color.WithAlpha(component.OriginalAlpha);
  36. }
  37. public override void FrameUpdate(float frameTime)
  38. {
  39. base.FrameUpdate(frameTime);
  40. var player = _playerManager.LocalEntity;
  41. var change = ChangeRate * frameTime;
  42. if (TryComp(player, out TransformComponent? playerXform) &&
  43. _stateManager.CurrentState is GameplayState state &&
  44. _spriteQuery.TryGetComponent(player, out var playerSprite))
  45. {
  46. var mapPos = _transform.GetMapCoordinates(_playerManager.LocalEntity!.Value, xform: playerXform);
  47. // Also want to handle large entities even if they may not be clickable.
  48. foreach (var ent in state.GetClickableEntities(mapPos))
  49. {
  50. if (ent == player ||
  51. !_fadeQuery.HasComponent(ent) ||
  52. !_spriteQuery.TryGetComponent(ent, out var sprite) ||
  53. sprite.DrawDepth < playerSprite.DrawDepth)
  54. {
  55. continue;
  56. }
  57. if (!_fadingQuery.TryComp(ent, out var fading))
  58. {
  59. fading = AddComp<FadingSpriteComponent>(ent);
  60. fading.OriginalAlpha = sprite.Color.A;
  61. }
  62. _comps.Add(fading);
  63. var newColor = Math.Max(sprite.Color.A - change, TargetAlpha);
  64. if (!sprite.Color.A.Equals(newColor))
  65. {
  66. sprite.Color = sprite.Color.WithAlpha(newColor);
  67. }
  68. }
  69. }
  70. var query = AllEntityQuery<FadingSpriteComponent>();
  71. while (query.MoveNext(out var uid, out var comp))
  72. {
  73. if (_comps.Contains(comp))
  74. continue;
  75. if (!_spriteQuery.TryGetComponent(uid, out var sprite))
  76. continue;
  77. var newColor = Math.Min(sprite.Color.A + change, comp.OriginalAlpha);
  78. if (!newColor.Equals(sprite.Color.A))
  79. {
  80. sprite.Color = sprite.Color.WithAlpha(newColor);
  81. }
  82. else
  83. {
  84. RemCompDeferred<FadingSpriteComponent>(uid);
  85. }
  86. }
  87. _comps.Clear();
  88. }
  89. }