add filter show UI

This commit is contained in:
CuongNV
2026-03-24 15:02:26 +07:00
parent 5d677cad1a
commit 17b30ff68d
2 changed files with 70 additions and 13 deletions
@@ -36,6 +36,7 @@ namespace BrewMonster.Scripts.ChatUI
private ObjectPool<ChatMessageView> _pool;
private bool _userAtBottom = true;
private ChatChannel _currentFilterChannel = ChatChannel.GP_CHAT_LOCAL;
void Awake()
{
@@ -49,6 +50,7 @@ namespace BrewMonster.Scripts.ChatUI
}
EventBus.Subscribe<GameSession.ChatMessageEvent>(OnChatMessageReceived);
EventBus.Subscribe<ChatChannelFilterChangedEvent>(OnChannelFilterChanged);
_pool = new ObjectPool<ChatMessageView>(
CreateItem,
OnGetItem,
@@ -65,6 +67,23 @@ namespace BrewMonster.Scripts.ChatUI
private void OnDestroy()
{
EventBus.Unsubscribe<GameSession.ChatMessageEvent>(OnChatMessageReceived);
EventBus.Unsubscribe<ChatChannelFilterChangedEvent>(OnChannelFilterChanged);
}
private void OnChannelFilterChanged(ChatChannelFilterChangedEvent e)
{
_currentFilterChannel = e.channel;
if (chatPanelUIGO.activeSelf)
{
RefreshVisible();
}
}
private bool ShouldShowMessage(ChatMessageData data)
{
if (_currentFilterChannel == ChatChannel.GP_CHAT_LOCAL) return true;
if (data.channel == (byte)ChatChannel.GP_CHAT_MISC) return true;
return data.channel == (byte)_currentFilterChannel;
}
private void OnChatMessageReceived(GameSession.ChatMessageEvent x)
@@ -123,10 +142,13 @@ namespace BrewMonster.Scripts.ChatUI
if (!chatPanelUIGO.activeSelf)
return;
AddMessageView(data);
if (ShouldShowMessage(data))
{
AddMessageView(data);
if (_userAtBottom)
ScrollToBottom();
if (_userAtBottom)
ScrollToBottom();
}
}
void AddMessageView(ChatMessageData data)
@@ -157,15 +179,24 @@ namespace BrewMonster.Scripts.ChatUI
_visibleViews.Clear();
int start = Mathf.Max(0, _messages.Count - maxVisibleMessages);
var filteredMessages = new List<ChatMessageData>();
foreach (var msg in _messages)
{
if (ShouldShowMessage(msg))
{
filteredMessages.Add(msg);
}
}
for (int i = start; i < _messages.Count; i++)
int start = Mathf.Max(0, filteredMessages.Count - maxVisibleMessages);
for (int i = start; i < filteredMessages.Count; i++)
{
var view = _pool.Get();
view.transform.SetParent(content, false);
view.transform.SetAsLastSibling();
var data = _messages[i];
var data = filteredMessages[i];
Sprite icon = _iconCache.ContainsKey(data.channel) ? _iconCache[data.channel] : null;
view.Bind(icon, data.message);
+33 -7
View File
@@ -8,6 +8,12 @@ using CSNetwork;
namespace BrewMonster.Scripts.ChatUI
{
public struct ChatChannelFilterChangedEvent
{
public ChatChannel channel;
public ChatChannelFilterChangedEvent(ChatChannel c) { channel = c; }
}
public class ChatInputHandler : MonoBehaviour
{
public TMP_InputField inputField;
@@ -88,16 +94,30 @@ namespace BrewMonster.Scripts.ChatUI
}
m_currentChannel = channel;
var config = chatSystem.channelIcons.Find(c => c.channel == channel);
if (config.prefix != null)
// Handle System channel input restriction
if (m_currentChannel == ChatChannel.GP_CHAT_SYSTEM)
{
string currentText = inputField.text;
currentText = RemoveKnownPrefix(currentText);
inputField.text = config.prefix + currentText;
inputField.interactable = false;
inputField.text = "";
}
else
{
inputField.interactable = true;
var config = chatSystem.channelIcons.Find(c => c.channel == channel);
if (config.prefix != null)
{
string currentText = inputField.text;
currentText = RemoveKnownPrefix(currentText);
inputField.text = config.prefix + currentText;
}
inputField.ActivateInputField();
inputField.MoveTextEnd(false);
}
inputField.ActivateInputField();
inputField.MoveTextEnd(false);
EventBus.Publish(new ChatChannelFilterChangedEvent(m_currentChannel));
}
private string RemoveKnownPrefix(string text)
@@ -304,6 +324,12 @@ namespace BrewMonster.Scripts.ChatUI
HandleWhisper(text, nPack, nSlot);
return ChatChannel.GP_CHAT_WHISPER;
}
else if (channel == ChatChannel.GP_CHAT_WHISPER)
{
// Cho phép chat kênh Whisper mượt mà mà không bắt buộc gõ ký tự "/" ở đầu
HandleWhisper("/" + text, nPack, nSlot);
return ChatChannel.GP_CHAT_WHISPER;
}
// Không gõ prefix thủ công thì sẽ dùng m_currentChannel đã được gán ở đầu hàm
SendChat(channel, pszMsg, nPack, nSlot);