clear chat when login out and optimal list chat

This commit is contained in:
CuongNV
2026-03-30 15:14:50 +07:00
parent 1957f29ec2
commit 358f78877f
2 changed files with 49 additions and 34 deletions
@@ -32,6 +32,7 @@ namespace BrewMonster.Scripts.ChatUI
private List<ChatMessageData> _messages = new();
private List<ChatMessageView> _visibleViews = new();
private List<ChatMessageData> _filteredMessagesCache = new();
private ObjectPool<ChatMessageView> _pool;
@@ -40,6 +41,7 @@ namespace BrewMonster.Scripts.ChatUI
void Awake()
{
ClearChat();
_iconCache = new Dictionary<byte, Sprite>();
if (chatSystemSO != null && chatSystemSO.channelIcons != null)
{
@@ -49,6 +51,7 @@ namespace BrewMonster.Scripts.ChatUI
}
}
EventBus.Subscribe<OnEventClearChat>(OnChatMessageClear);
EventBus.Subscribe<GameSession.ChatMessageEvent>(OnChatMessageReceived);
EventBus.Subscribe<ChatChannelFilterChangedEvent>(OnChannelFilterChanged);
_pool = new ObjectPool<ChatMessageView>(
@@ -94,6 +97,15 @@ namespace BrewMonster.Scripts.ChatUI
});
}
private void OnChatMessageClear(OnEventClearChat obj)
{
ChatThreadDispatcher.Instance.Post(() =>
{
ClearChat();
});
}
ChatMessageView CreateItem()
{
var item = Instantiate(messagePrefab);
@@ -179,24 +191,24 @@ namespace BrewMonster.Scripts.ChatUI
_visibleViews.Clear();
var filteredMessages = new List<ChatMessageData>();
_filteredMessagesCache.Clear();
foreach (var msg in _messages)
{
if (ShouldShowMessage(msg))
{
filteredMessages.Add(msg);
_filteredMessagesCache.Add(msg);
}
}
int start = Mathf.Max(0, filteredMessages.Count - maxVisibleMessages);
int start = Mathf.Max(0, _filteredMessagesCache.Count - maxVisibleMessages);
for (int i = start; i < filteredMessages.Count; i++)
for (int i = start; i < _filteredMessagesCache.Count; i++)
{
var view = _pool.Get();
view.transform.SetParent(content, false);
view.transform.SetAsLastSibling();
var data = filteredMessages[i];
var data = _filteredMessagesCache[i];
Sprite icon = _iconCache.ContainsKey(data.channel) ? _iconCache[data.channel] : null;
view.Bind(icon, data.message);
@@ -232,4 +244,6 @@ namespace BrewMonster.Scripts.ChatUI
RefreshVisible();
}
}
public struct OnEventClearChat{}
}
+30 -29
View File
@@ -1,6 +1,7 @@
using BrewMonster;
using BrewMonster.Network;
using BrewMonster.Scripts.ChatUI;
using UnityEngine;
public partial class CECGameRun
@@ -8,7 +9,7 @@
int m_iGameState; // Game state
// Logout flag (C++: m_iLogoutFlag)
private int m_iLogoutFlag = -1;
// Logout
public void Logout()
{
@@ -18,13 +19,13 @@
BMLogger.LogError($"Logout called but game state is not GS_GAME, current state: {m_iGameState}");
return;
}
// TODO: Check if we need to call OnLogout for UI and cross server here
// overlay::GTOverlay::Instance().Logout();
// CECCrossServer::Instance().OnLogout();
bool bExitApp = false;
EventBus.Publish(new OnEventClearChat());
// if (CECUIConfig::Instance().GetLoginUI().bAvoidLoginUI && m_iLogoutFlag != 1){
if( 1 == 2 && m_iLogoutFlag != 1){ // TODO: check if we need to avoid login UI based on config and logout flag here
bExitApp = true;
@@ -35,12 +36,12 @@
else if (m_iLogoutFlag == 1) // Logout game and re-select role
{
UnityGameSession.ReturnToSelectRole();
// TODO: Check if we need to send switch game for mini client here
// Origin C++
// Origin C++
// StartLogin();
StartLogin();
//
// // ÏÂÔØÆ÷ÏìÓ¦Í˳öÓÎϷ״̬
// if( g_pGame->GetConfigs()->IsMiniClient() )
@@ -70,7 +71,7 @@
else if (m_iLogoutFlag == 2) // Logout game and goto login state
{
UnityGameSession.LogoutAccount();
// TODO: Check if we need to send switch game for mini client here
// Origin C++
// StartLogin();
@@ -92,8 +93,8 @@
// ASSERT(NULL);
bExitApp = true;
}
// if (m_pRandomMapProc)
// A3DRELEASE(m_pRandomMapProc);
@@ -104,7 +105,7 @@
// ::PostMessage(g_pGame->GetGameInit().hWnd, WM_QUIT, 0, 0);
// }
}
// End current game state
void EndGameState(bool bReset = true/* true */)
{
@@ -130,10 +131,10 @@
// if (bReset)
// g_pGame.Reset();
}
// Start login interface
bool StartLogin()
{
@@ -164,7 +165,7 @@
// }else{
// m_pLogo->SetLinearFilter(true);
// }
// }
// }
// if (af_IsFileExist("surfaces\\kr.dds"))
// {
// if (!m_pClassification){
@@ -175,7 +176,7 @@
// m_pClassification->SetLinearFilter(true);
// }
// }
// }
// }
// // Change cursor to default icon
// g_pGame->ChangeCursor(RES_CUR_NORMAL);
// // Discard current frame
@@ -183,7 +184,7 @@
return true;
}
// End login state
void OnEndLoginState()
{
@@ -201,13 +202,13 @@
void OnEndGameState()
{
ReleasePendingActions();
// Release UI module
// m_pUIManager.ChangeCurUIManager(-1);
// Release shortcuts
ReleaseShortcuts();
// Release team manager
// A3DRELEASE(m_pTeamMan);
if (m_pTeamMan != null)
@@ -215,23 +216,23 @@
m_pTeamMan.Release();
m_pTeamMan = null;
}
// Release host player before world released
// ReleaseHostPlayer();
// Release world
// ReleaseWorld();
// Release message manager
// A3DRELEASE(m_pMessageMan);
// g_pGame.ReleaseInGameRes();
// Return the default memory state
// m_pMemSimplify.OnEndGameState();
// CECOptimize::Instance().OnEndGameState();
}
// Release shortcuts
void ReleaseShortcuts()
{
@@ -240,14 +241,14 @@
// A3DRELEASE(m_pTradeSCS);
// A3DRELEASE(m_pPoseSCS);
// A3DRELEASE(m_pFactionSCS);
m_pNormalSCS = null;
m_pTeamSCS = null;
m_pTradeSCS = null;
m_pPoseSCS = null;
m_pFactionSCS = null;
}
// Release host player
void ReleaseHostPlayer()
{
@@ -259,7 +260,7 @@
// delete m_pHostPlayer;
// m_pHostPlayer = NULL;
// }
// Release host player
if (m_pHostPlayer)
{
@@ -268,7 +269,7 @@
m_pHostPlayer = null;
}
}
// Release world
void ReleaseWorld()
{
@@ -276,7 +277,7 @@
// m_pInputCtrl->ClearMouFilterStack();
//
// g_pGame->GetViewport()->SwitchCamera(false);
if (m_pWorld != null)
{
// if (m_pHostPlayer)