From 17b30ff68dced8c56f51fc111b66d781f2cd4b0c Mon Sep 17 00:00:00 2001 From: CuongNV <> Date: Tue, 24 Mar 2026 15:02:26 +0700 Subject: [PATCH] add filter show UI --- .../Scripts/Chat/UI/ChatPanelUI.cs | 43 ++++++++++++++++--- Assets/Scripts/ChatInputHandler.cs | 40 ++++++++++++++--- 2 files changed, 70 insertions(+), 13 deletions(-) diff --git a/Assets/PerfectWorld/Scripts/Chat/UI/ChatPanelUI.cs b/Assets/PerfectWorld/Scripts/Chat/UI/ChatPanelUI.cs index 4d85c8bbaf..4ac404396b 100644 --- a/Assets/PerfectWorld/Scripts/Chat/UI/ChatPanelUI.cs +++ b/Assets/PerfectWorld/Scripts/Chat/UI/ChatPanelUI.cs @@ -36,6 +36,7 @@ namespace BrewMonster.Scripts.ChatUI private ObjectPool _pool; private bool _userAtBottom = true; + private ChatChannel _currentFilterChannel = ChatChannel.GP_CHAT_LOCAL; void Awake() { @@ -49,6 +50,7 @@ namespace BrewMonster.Scripts.ChatUI } EventBus.Subscribe(OnChatMessageReceived); + EventBus.Subscribe(OnChannelFilterChanged); _pool = new ObjectPool( CreateItem, OnGetItem, @@ -65,6 +67,23 @@ namespace BrewMonster.Scripts.ChatUI private void OnDestroy() { EventBus.Unsubscribe(OnChatMessageReceived); + EventBus.Unsubscribe(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(); + 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); diff --git a/Assets/Scripts/ChatInputHandler.cs b/Assets/Scripts/ChatInputHandler.cs index 9c9de1ac44..af16faee9d 100644 --- a/Assets/Scripts/ChatInputHandler.cs +++ b/Assets/Scripts/ChatInputHandler.cs @@ -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);