TypingIndicatorVisualizerSystem.cs 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. using Content.Shared.Chat.TypingIndicator;
  2. using Robust.Client.GameObjects;
  3. using Robust.Client.Graphics;
  4. using Robust.Shared.Prototypes;
  5. using Content.Shared.Inventory;
  6. namespace Content.Client.Chat.TypingIndicator;
  7. public sealed class TypingIndicatorVisualizerSystem : VisualizerSystem<TypingIndicatorComponent>
  8. {
  9. [Dependency] private readonly IPrototypeManager _prototypeManager = default!;
  10. [Dependency] private readonly InventorySystem _inventory = default!;
  11. protected override void OnAppearanceChange(EntityUid uid, TypingIndicatorComponent component, ref AppearanceChangeEvent args)
  12. {
  13. if (args.Sprite == null)
  14. return;
  15. var currentTypingIndicator = component.TypingIndicatorPrototype;
  16. var evt = new BeforeShowTypingIndicatorEvent();
  17. if (TryComp<InventoryComponent>(uid, out var inventoryComp))
  18. _inventory.RelayEvent((uid, inventoryComp), ref evt);
  19. var overrideIndicator = evt.GetMostRecentIndicator();
  20. if (overrideIndicator != null)
  21. currentTypingIndicator = overrideIndicator.Value;
  22. if (!_prototypeManager.TryIndex(currentTypingIndicator, out var proto))
  23. {
  24. Log.Error($"Unknown typing indicator id: {component.TypingIndicatorPrototype}");
  25. return;
  26. }
  27. AppearanceSystem.TryGetData<bool>(uid, TypingIndicatorVisuals.IsTyping, out var isTyping, args.Component);
  28. var layerExists = args.Sprite.LayerMapTryGet(TypingIndicatorLayers.Base, out var layer);
  29. if (!layerExists)
  30. layer = args.Sprite.LayerMapReserveBlank(TypingIndicatorLayers.Base);
  31. args.Sprite.LayerSetRSI(layer, proto.SpritePath);
  32. args.Sprite.LayerSetState(layer, proto.TypingState);
  33. args.Sprite.LayerSetShader(layer, proto.Shader);
  34. args.Sprite.LayerSetOffset(layer, proto.Offset);
  35. args.Sprite.LayerSetVisible(layer, isTyping);
  36. }
  37. }