Files
test/Assets/PerfectWorld/Scripts/Chat/ChatEmotionDisplayPipeline.cs
T
2026-04-06 13:47:47 +07:00

50 lines
2.0 KiB
C#

using CSNetwork;
namespace BrewMonster.Scripts.Chat
{
/// <summary>
/// Chat 表情与内联富文本 — Emotion set + TMP conversion for chat (ported from CECGameUIMan::AddChatMessage).
/// Keeps channel emotion filtering and Unmarshal/Convert-to-TMP in one place.
/// </summary>
public sealed class ChatEmotionDisplayPipeline
{
private IEmotionSpriteMap _spriteMap = new StubEmotionSpriteMap();
public ChatEmotionDisplayPipeline(IEmotionSpriteMap spriteMap = null)
{
if (spriteMap != null)
_spriteMap = spriteMap;
}
public void SetSpriteMap(IEmotionSpriteMap spriteMap)
{
_spriteMap = spriteMap ?? new StubEmotionSpriteMap();
}
/// <summary>C++: FilterEmotionSet — map inline emotion codes to the correct set for this channel.</summary>
public string ApplyChannelEmotionFilter(string pszMsg, int cEmotion)
{
return AUICommon.FilterEmotionSet(pszMsg, cEmotion);
}
/// <summary>
/// TMP: Unmarshal edit-box item codes and convert emotion / coord / inventory links to TMP rich text.
/// Call after <see cref="CECUIManager.FilterBadWords"/> when the message is from a player channel.
/// </summary>
public string ConvertInlineItemsToTmp(string pszMsgAfterBadWordFilter)
{
EditBoxItemsSet itemsSet = new EditBoxItemsSet();
string displayText = AUICommon.UnmarshalEditBoxText(pszMsgAfterBadWordFilter, itemsSet);
if (itemsSet.GetItemCount() <= 0)
return pszMsgAfterBadWordFilter;
string tmpText = displayText;
tmpText = AUICommon.ConvertEmotionsToTMP(tmpText, itemsSet, _spriteMap);
tmpText = AUICommon.ConvertCoordsToTMP(tmpText, itemsSet);
tmpText = AUICommon.ConvertIvtrItemsToTMP(tmpText, itemsSet);
tmpText = AUICommon.StripRemainingItemCodes(tmpText);
return tmpText;
}
}
}