2022-05-17 12:55:19 +03:00
|
|
|
|
using Content.Shared.Chat.TypingIndicator;
|
|
|
|
|
|
using Robust.Client.GameObjects;
|
|
|
|
|
|
using Robust.Shared.Prototypes;
|
2024-07-09 22:51:47 -07:00
|
|
|
|
using Content.Shared.Inventory;
|
2022-05-17 12:55:19 +03:00
|
|
|
|
|
|
|
|
|
|
namespace Content.Client.Chat.TypingIndicator;
|
|
|
|
|
|
|
|
|
|
|
|
public sealed class TypingIndicatorVisualizerSystem : VisualizerSystem<TypingIndicatorComponent>
|
|
|
|
|
|
{
|
|
|
|
|
|
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
|
2024-07-09 22:51:47 -07:00
|
|
|
|
[Dependency] private readonly InventorySystem _inventory = default!;
|
2022-05-17 12:55:19 +03:00
|
|
|
|
|
2023-01-12 15:33:57 +03:00
|
|
|
|
protected override void OnAppearanceChange(EntityUid uid, TypingIndicatorComponent component, ref AppearanceChangeEvent args)
|
2022-05-17 12:55:19 +03:00
|
|
|
|
{
|
2023-01-12 15:33:57 +03:00
|
|
|
|
if (args.Sprite == null)
|
2022-05-17 12:55:19 +03:00
|
|
|
|
return;
|
2023-02-02 17:34:53 +01:00
|
|
|
|
|
2024-07-09 22:51:47 -07:00
|
|
|
|
var currentTypingIndicator = component.TypingIndicatorPrototype;
|
|
|
|
|
|
|
|
|
|
|
|
var evt = new BeforeShowTypingIndicatorEvent();
|
|
|
|
|
|
|
|
|
|
|
|
if (TryComp<InventoryComponent>(uid, out var inventoryComp))
|
|
|
|
|
|
_inventory.RelayEvent((uid, inventoryComp), ref evt);
|
|
|
|
|
|
|
|
|
|
|
|
var overrideIndicator = evt.GetMostRecentIndicator();
|
|
|
|
|
|
|
|
|
|
|
|
if (overrideIndicator != null)
|
|
|
|
|
|
currentTypingIndicator = overrideIndicator.Value;
|
|
|
|
|
|
|
2025-09-09 18:17:56 +02:00
|
|
|
|
if (!_prototypeManager.Resolve(currentTypingIndicator, out var proto))
|
2022-05-17 12:55:19 +03:00
|
|
|
|
{
|
2024-07-09 22:51:47 -07:00
|
|
|
|
Log.Error($"Unknown typing indicator id: {component.TypingIndicatorPrototype}");
|
2022-05-17 12:55:19 +03:00
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-05-23 14:12:20 -04:00
|
|
|
|
var layerExists = SpriteSystem.LayerMapTryGet((uid, args.Sprite), TypingIndicatorLayers.Base, out var layer, false);
|
2023-01-12 15:33:57 +03:00
|
|
|
|
if (!layerExists)
|
2025-05-23 14:12:20 -04:00
|
|
|
|
layer = SpriteSystem.LayerMapReserve((uid, args.Sprite), TypingIndicatorLayers.Base);
|
2023-02-02 17:34:53 +01:00
|
|
|
|
|
2025-05-23 14:12:20 -04:00
|
|
|
|
SpriteSystem.LayerSetRsi((uid, args.Sprite), layer, proto.SpritePath);
|
|
|
|
|
|
SpriteSystem.LayerSetRsiState((uid, args.Sprite), layer, proto.TypingState);
|
2023-01-12 15:33:57 +03:00
|
|
|
|
args.Sprite.LayerSetShader(layer, proto.Shader);
|
2025-05-23 14:12:20 -04:00
|
|
|
|
SpriteSystem.LayerSetOffset((uid, args.Sprite), layer, proto.Offset);
|
2025-05-06 19:49:42 +02:00
|
|
|
|
|
|
|
|
|
|
AppearanceSystem.TryGetData<TypingIndicatorState>(uid, TypingIndicatorVisuals.State, out var state);
|
2025-05-23 14:12:20 -04:00
|
|
|
|
SpriteSystem.LayerSetVisible((uid, args.Sprite), layer, state != TypingIndicatorState.None);
|
2025-05-06 19:49:42 +02:00
|
|
|
|
switch (state)
|
|
|
|
|
|
{
|
|
|
|
|
|
case TypingIndicatorState.Idle:
|
2025-05-23 14:12:20 -04:00
|
|
|
|
SpriteSystem.LayerSetRsiState((uid, args.Sprite), layer, proto.IdleState);
|
2025-05-06 19:49:42 +02:00
|
|
|
|
break;
|
|
|
|
|
|
case TypingIndicatorState.Typing:
|
2025-05-23 14:12:20 -04:00
|
|
|
|
SpriteSystem.LayerSetRsiState((uid, args.Sprite), layer, proto.TypingState);
|
2025-05-06 19:49:42 +02:00
|
|
|
|
break;
|
|
|
|
|
|
}
|
2022-05-17 12:55:19 +03:00
|
|
|
|
}
|
|
|
|
|
|
}
|