From c22bdd2562585c87d3fcfadcf94a4277b119a85c Mon Sep 17 00:00:00 2001
From: lcy <1459594991@qq.com>
Date: 星期日, 14 十二月 2025 19:52:44 +0800
Subject: [PATCH] 76 【常规】聊天系统-客户端
---
Main/System/Chat/ChatManager.cs | 68 +++++++++++++++++-----
Main/System/Message/SysNotifyMgr.cs | 12 ++--
Main/System/Chat/ChatWin.cs | 27 +++++++-
Main/System/Chat/ChatPlayerOtherCell.cs | 15 ++--
4 files changed, 90 insertions(+), 32 deletions(-)
diff --git a/Main/System/Chat/ChatManager.cs b/Main/System/Chat/ChatManager.cs
index e9f22b0..701fede 100644
--- a/Main/System/Chat/ChatManager.cs
+++ b/Main/System/Chat/ChatManager.cs
@@ -11,6 +11,9 @@
//<ChannelType,TalkData>
public Dictionary<ChatChannel, List<TalkData>> talkDict = new Dictionary<ChatChannel, List<TalkData>>();
+ //鐢ㄤ簬缂撳瓨鐜╁鐨勫瑙備俊鎭�
+ public Dictionary<uint, TalkData> playerInfoDict = new Dictionary<uint, TalkData>();
+
public Dictionary<int, ChatBubbleData> chatBubbles = new Dictionary<int, ChatBubbleData>();
//<ChannelType,鏃堕棿鎴�>
public Dictionary<int, int> chatChannelSendTime = new Dictionary<int, int>();
@@ -119,6 +122,8 @@
private void OnBeforePlayerDataInitializeEvent()
{
talkDict.Clear();
+ playerInfoDict.Clear();
+ currentDay = -1;
ParseChatBubbleConfig();
nowChatChannel = ChatChannel.World;
nowChatTab = ChatTab.World;
@@ -185,6 +190,11 @@
public static int GetUTF8InfoLen(string msg)
{
return Encoding.UTF8.GetBytes(msg).Length;
+ }
+
+ public bool TryGetNewPlayerInfoByPlayerID(uint playerID, out TalkData talkData)
+ {
+ return playerInfoDict.TryGetValue(playerID, out talkData);
}
public bool TryGetBubble(int id, out ChatBubbleData bubble)
@@ -351,7 +361,7 @@
}
public int currentDay = -1;
- public void AddTalkData(ChatChannel type, TalkData data)
+ public void AddTalkData(ChatChannel type, TalkData data, bool isSend)
{
//濡傛灉瓒呰繃闄愬埗鍏堝垹闄ゆ棫鏁版嵁
TryDeleteTalkData(type);
@@ -360,10 +370,13 @@
talkDict[type] = new List<TalkData>();
}
talkDict[type].Add(data);
- OnUpdateTalkEvent?.Invoke(type, data);
+ if (isSend)
+ {
+ OnUpdateTalkEvent?.Invoke(type, data);
+ }
}
- public bool TryAddDate(int allSeconds, ChatChannel type)
+ public bool TryAddDate(int allSeconds, ChatChannel type, bool isSend)
{
DateTime talkTime = TimeUtility.GetTime((uint)allSeconds);
if (talkTime.Day != currentDay)
@@ -375,17 +388,17 @@
isDate = true,
Content = Language.Get("Chat09", talkTime.Month, talkTime.Day),
TalkTime = (uint)allSeconds,
- });
+ }, isSend);
return true;
}
return false;
}
- public void AddSysData(string msg, ArrayList infoList, ChatChannel type)
+ public void AddSysData(string msg, ArrayList infoList, ChatChannel type, bool isSend)
{
int allSeconds = TimeUtility.AllSeconds;
// 濡傛灉闅斿ぉ,澧炲姞鏃ユ湡琛�
- TryAddDate(allSeconds, type);
+ TryAddDate(allSeconds, type, isSend);
if (!talkDict.ContainsKey(type))
{
@@ -399,7 +412,7 @@
BubbleBox = 1,
TalkTime = (uint)allSeconds,
InfoList = new ArrayList(infoList),
- });
+ }, isSend);
}
public void UpdateTalk(HB310_tagMCTalk vNetData)
@@ -415,7 +428,7 @@
int allSeconds = TimeUtility.AllSeconds;
// 濡傛灉闅斿ぉ,澧炲姞鏃ユ湡琛�
- TryAddDate(allSeconds, type);
+ TryAddDate(allSeconds, type, true);
TalkData talkData = new TalkData()
{
@@ -433,7 +446,9 @@
ServerID = vNetData.ServerID,
TalkTime = (uint)allSeconds,
};
- AddTalkData(type, talkData);
+ AddPlayerInfo(talkData);
+ AddTalkData(type, talkData, true);
+
}
public void UpdateTalkCacheList(HB311_tagMCTalkCacheList vNetData)
@@ -453,13 +468,13 @@
foreach (var info in vNetData.InfoList)
{
// 濡傛灉闅斿ぉ,澧炲姞鏃ユ湡琛�
- TryAddDate((int)info.TalkTime, type);
- AddTalkData(type, new TalkData()
+ TryAddDate((int)info.TalkTime, type, false);
+ TalkData talkData = new TalkData()
{
ChannelType = vNetData.ChannelType,
- Name = info.Name,
+ Name = UIHelper.ServerStringTrim(info.Name),
PlayerID = info.PlayerID,
- Content = info.Content,
+ Content = UIHelper.ServerStringTrim(info.Content),
BubbleBox = info.BubbleBox,
LV = info.LV,
Job = info.Job,
@@ -469,9 +484,33 @@
FacePic = info.FacePic,
ServerID = info.ServerID,
TalkTime = info.TalkTime,
- });
+ };
+ AddPlayerInfo(talkData);
+ AddTalkData(type, talkData, false);
}
OnUpdateTalkCacheListEvent?.Invoke();
+ }
+
+ public event Action OnUpdatePlayerInfoEvent;
+ public void AddPlayerInfo(TalkData data)
+ {
+ bool isChange = false;
+ if (playerInfoDict.ContainsKey(data.PlayerID))
+ {
+ if (data.Name != playerInfoDict[data.PlayerID].Name||
+ data.BubbleBox != playerInfoDict[data.PlayerID].BubbleBox||
+ data.LV != playerInfoDict[data.PlayerID].LV||
+ data.Job != playerInfoDict[data.PlayerID].Job||
+ data.RealmLV != playerInfoDict[data.PlayerID].RealmLV||
+ data.TitleID != playerInfoDict[data.PlayerID].TitleID||
+ data.Face != playerInfoDict[data.PlayerID].Face||
+ data.FacePic != playerInfoDict[data.PlayerID].FacePic)
+ isChange = true;
+
+ }
+ playerInfoDict[data.PlayerID] = data;
+ if (isChange)
+ OnUpdatePlayerInfoEvent?.Invoke();
}
#region 鏍囩椤�
// 褰撳墠灞曠ず鐨勯閬撳叆鍙�
@@ -647,7 +686,6 @@
public byte ChannelType; // 0-涓栫晫锛�1-璺ㄦ湇锛�3- 浠欑洘
public bool isSystem = false; //绯荤粺娑堟伅
public bool isDate = false; //鍒嗗壊鏃ユ湡
- public byte NameLen;
public string Name;
public uint PlayerID;
public string Content;
diff --git a/Main/System/Chat/ChatPlayerOtherCell.cs b/Main/System/Chat/ChatPlayerOtherCell.cs
index 318c586..a472369 100644
--- a/Main/System/Chat/ChatPlayerOtherCell.cs
+++ b/Main/System/Chat/ChatPlayerOtherCell.cs
@@ -13,19 +13,20 @@
ChatManager manager { get { return ChatManager.Instance; } }
public void Refresh(CellView cell)
{
- if (!manager.TryGetChatData(ChatManager.Instance.nowChatChannel, cell.index, out TalkData data))
+ if (!manager.TryGetChatData(ChatManager.Instance.nowChatChannel, cell.index, out TalkData nowData) || nowData == null)
return;
- avatarCell.InitUI(AvatarHelper.GetAvatarModel((int)data.PlayerID, (int)data.Face, (int)data.PlayerID, data.Job));
+
+ m_ChatBubble.DisplayContent(nowData.Content, true);
+
+ bool hasNewPlayerInfo = manager.TryGetNewPlayerInfoByPlayerID(nowData.PlayerID, out TalkData newPlayerInfo);
+ TalkData data = hasNewPlayerInfo ? newPlayerInfo : nowData;
+
+ avatarCell.InitUI(AvatarHelper.GetAvatarModel((int)data.PlayerID, (int)data.Face, (int)data.FacePic, data.Job));
avatarCell.button.SetListener(() =>
{
});
title.InitUI(data.RealmLV, (int)data.TitleID);
-
-
-
- m_ChatBubble.DisplayContent(data.Content, true);
-
int bubbleID = ChatBubbleHelper.GetOtherChatBubbleID(data.Job, (int)data.BubbleBox);
m_ChatBubble.DisplayBubble(bubbleID, (int)data.PlayerID);
diff --git a/Main/System/Chat/ChatWin.cs b/Main/System/Chat/ChatWin.cs
index 1793fce..427087b 100644
--- a/Main/System/Chat/ChatWin.cs
+++ b/Main/System/Chat/ChatWin.cs
@@ -96,10 +96,12 @@
protected override void OnPreOpen()
{
base.OnPreOpen();
+ DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent += OnBeforePlayerDataInitializeEvent;
manager.OnChatTabChangeEvent += OnChatTabChange;
manager.OnUpdateTalkEvent += OnUpdateTalkEvent;
manager.OnUpdateTalkCacheListEvent += OnUpdateTalkCacheList;
manager.OnDeleteTalkEvent += OnDeleteTalkEvent;
+ manager.OnUpdatePlayerInfoEvent += OnUpdatePlayerInfoEvent;
scrChatTab.OnRefreshCell += OnRefreshChatTabCell;
scrWorld.OnGetDynamicSize += OnGetWorldChatDynamicSize;
@@ -126,10 +128,12 @@
protected override void OnPreClose()
{
base.OnPreClose();
+ DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent -= OnBeforePlayerDataInitializeEvent;
manager.OnChatTabChangeEvent -= OnChatTabChange;
manager.OnUpdateTalkEvent -= OnUpdateTalkEvent;
manager.OnUpdateTalkCacheListEvent -= OnUpdateTalkCacheList;
manager.OnDeleteTalkEvent -= OnDeleteTalkEvent;
+ manager.OnUpdatePlayerInfoEvent -= OnUpdatePlayerInfoEvent;
scrChatTab.OnRefreshCell -= OnRefreshChatTabCell;
scrWorld.OnGetDynamicSize -= OnGetWorldChatDynamicSize;
@@ -140,6 +144,16 @@
scrGuild.mScrollRect.onValueChanged.RemoveListener(OnGuildScrollValChange);
GlobalTimeEvent.Instance.secondEvent -= OnSecondEvent;
clickScreenOtherSpace.RemoveAllListeners();
+ }
+
+ private void OnBeforePlayerDataInitializeEvent()
+ {
+ CreaterAll(manager.nowChatTab);
+ }
+
+ private void OnUpdatePlayerInfoEvent()
+ {
+ RefreshAll(manager.nowChatChannel, isUpdatePlayerInfo: true);
}
private void OnDeleteTalkEvent(ChatChannel channel)
@@ -330,21 +344,21 @@
return 0;
}
- private void RefreshAll(ChatChannel type, uint playerId = 0)
+ private void RefreshAll(ChatChannel type, uint playerId = 0, bool isUpdatePlayerInfo = false)
{
scrChatTab.m_Scorller.RefreshActiveCellViews();
if (type == ChatChannel.World)
{
- RefreshChat(type, scrWorld, playerId);
+ RefreshChat(type, scrWorld, playerId, isUpdatePlayerInfo);
}
else if (type == ChatChannel.Guild)
{
- RefreshChat(type, scrGuild, playerId);
+ RefreshChat(type, scrGuild, playerId, isUpdatePlayerInfo);
}
}
- private void RefreshChat(ChatChannel type, ScrollerController scroller, uint playerId = 0)
+ private void RefreshChat(ChatChannel type, ScrollerController scroller, uint playerId = 0, bool isUpdatePlayerInfo = false)
{
if (!manager.TryGetTalkData(type, out List<TalkData> datas) || datas == null)
return;
@@ -361,6 +375,11 @@
float height = GetHeight(talkDataType, data.Content, data.InfoList);
scroller.m_Scorller.AddHeight(true, height);
//Debug.Log($"ChatWin AddCell i {i} AddHeight {height}");
+
+ }
+ if (isUpdatePlayerInfo)
+ {
+ scroller.m_Scorller.RefreshActiveCellViews();
}
}
else
diff --git a/Main/System/Message/SysNotifyMgr.cs b/Main/System/Message/SysNotifyMgr.cs
index 60ff176..40f281b 100644
--- a/Main/System/Message/SysNotifyMgr.cs
+++ b/Main/System/Message/SysNotifyMgr.cs
@@ -240,10 +240,10 @@
ServerTipDetails.ShowMarquee(msg, tipInfoList, order);
break;
case SysNotifyType.ChatChannelWorld:
- ChatManager.Instance.AddSysData(msg, tipInfoList, ChatChannel.World);
+ ChatManager.Instance.AddSysData(msg, tipInfoList, ChatChannel.World, true);
break;
case SysNotifyType.ChatChannelGuild:
- ChatManager.Instance.AddSysData(msg, tipInfoList, ChatChannel.Guild);
+ ChatManager.Instance.AddSysData(msg, tipInfoList, ChatChannel.Guild, true);
break;
case SysNotifyType.SysRealmTip:
if (OnSysTipEvent != null)
@@ -252,10 +252,10 @@
}
break;
- // TODO YYL
- // case SysNotifyType.SysEvenKill:
- // BattleHint.Instance.ReceiveEvenKill(msg, tipInfoList);
- // break;
+ // TODO YYL
+ // case SysNotifyType.SysEvenKill:
+ // BattleHint.Instance.ReceiveEvenKill(msg, tipInfoList);
+ // break;
}
--
Gitblit v1.8.0