From 0fd3d662ec09f023cb016e367aeae9d3d2267cf0 Mon Sep 17 00:00:00 2001
From: lcy <1459594991@qq.com>
Date: 星期四, 12 二月 2026 14:18:39 +0800
Subject: [PATCH] 76 聊天系统-客户端 跨服频道
---
Main/System/Chat/ChatManager.cs | 41 +++++++++----
Main/System/Chat/ChatPlayerMineCell.cs | 7 ++
Main/System/Main/HomeWin.cs | 4 +
Main/System/Chat/ChatBulletView.cs | 2
Main/System/Chat/ChatWin.cs | 63 +++++++++++++++++++-
Main/System/Chat/ChatPlayerOtherCell.cs | 9 ++
6 files changed, 106 insertions(+), 20 deletions(-)
diff --git a/Main/System/Chat/ChatBulletView.cs b/Main/System/Chat/ChatBulletView.cs
index e38c955..e15e123 100644
--- a/Main/System/Chat/ChatBulletView.cs
+++ b/Main/System/Chat/ChatBulletView.cs
@@ -61,6 +61,8 @@
fmlv = fairyMember.FmLV;
}
return Language.Get("Chat16", RichTextMsgReplaceConfig.GetRichReplace("FAMILY", fmlv), data.Name, data.Content);
+ case ChatChannel.CrossServer:
+ return Language.Get("Chat17", data.Name, data.Content);
default:
return data.Content;
}
diff --git a/Main/System/Chat/ChatManager.cs b/Main/System/Chat/ChatManager.cs
index b5bf315..ed795fd 100644
--- a/Main/System/Chat/ChatManager.cs
+++ b/Main/System/Chat/ChatManager.cs
@@ -115,7 +115,7 @@
{
talkDict.Clear();
lastTalkDataDict.Clear();
- currentDay = -1;
+ currentDayDict.Clear();
nowChatChannel = ChatChannel.World;
nowChatTab = ChatTab.World;
}
@@ -331,12 +331,12 @@
ChatReport(channelType, content);
}
- void ChatReport(int chatType, string content, string toPlayer="")
+ void ChatReport(int chatType, string content, string toPlayer = "")
{
try
{
var channelName = Language.Get($"ChatTab{chatType}");
-
+
OperationLogCollect.Instance.ChatReport(content, channelName, toPlayer, chatType);
}
catch (Exception e)
@@ -413,13 +413,19 @@
}
}
- public int currentDay = -1;
+ public Dictionary<ChatChannel, int> currentDayDict = new Dictionary<ChatChannel, int>();
public bool TryAddDate(int allSeconds, ChatChannel type, bool isSendBullet)
{
DateTime talkTime = TimeUtility.GetTime((uint)allSeconds);
- if (talkTime.Day != currentDay)
+ // 纭繚瀛楀吀涓寘鍚棰戦亾鐨勬潯鐩�
+ if (!currentDayDict.ContainsKey(type))
{
- currentDay = talkTime.Day;
+ currentDayDict[type] = -1;
+ }
+ // 姣忎釜棰戦亾鐙珛妫�鏌ユ棩鏈�
+ if (talkTime.Day != currentDayDict[type])
+ {
+ currentDayDict[type] = talkTime.Day;
AddTalkData(type, new TalkData()
{
ChannelType = (byte)type,
@@ -434,7 +440,7 @@
public void AddSysData(string msg, ArrayList infoList, ChatChannel type, bool isSendBullet)
{
- int allSeconds = TimeUtility.AllSeconds;
+ int allSeconds = type == ChatChannel.CrossServer ? TimeUtility.GetCommServerTick(GuildManager.Instance.zoneID) : TimeUtility.AllSeconds;
// 濡傛灉闅斿ぉ,澧炲姞鏃ユ湡琛�
TryAddDate(allSeconds, type, isSendBullet);
@@ -464,7 +470,7 @@
talkDict[type] = new List<TalkData>();
}
- int allSeconds = TimeUtility.AllSeconds;
+ int allSeconds = type == ChatChannel.CrossServer ? TimeUtility.GetCommServerTick(GuildManager.Instance.zoneID) : TimeUtility.AllSeconds;
// 濡傛灉闅斿ぉ,澧炲姞鏃ユ湡琛�
TryAddDate(allSeconds, type, true);
@@ -572,6 +578,7 @@
{
ChatTab.World,
ChatTab.Guild,
+ ChatTab.CrossServer,
// ChatTab.Person,
// ChatTab.BlackList,
};
@@ -583,8 +590,6 @@
switch (chatTab)
{
- case ChatTab.World:
- return true;
case ChatTab.Guild:
//娌℃湁鍏細
if (!PlayerDatas.Instance.fairyData.HasFairy)
@@ -594,8 +599,17 @@
return false;
}
return true;
+ case ChatTab.CrossServer:
+ //娌℃湁鍚堟湇
+ if (GuildManager.Instance.zoneID <= 0)
+ {
+ if (isTip)
+ SysNotifyMgr.Instance.ShowTip("CrossServerNoOpen");
+ return false;
+ }
+ return true;
default:
- return false;
+ return true;
}
}
@@ -697,8 +711,9 @@
{
World = 0, //涓栫晫
Guild = 1, //鍏細
- Person = 2, //绉佽亰
- BlackList = 3, //榛戝悕鍗�
+ CrossServer = 2, //璺ㄦ湇
+ Person = 3, //绉佽亰
+ BlackList = 4, //榛戝悕鍗�
}
public enum ChatChannel
{
diff --git a/Main/System/Chat/ChatPlayerMineCell.cs b/Main/System/Chat/ChatPlayerMineCell.cs
index 1830577..1613725 100644
--- a/Main/System/Chat/ChatPlayerMineCell.cs
+++ b/Main/System/Chat/ChatPlayerMineCell.cs
@@ -30,11 +30,16 @@
string serverName = ServerListCenter.Instance.GetServerName(UIHelper.GetServerIDByAccount(PlayerDatas.Instance.baseData.AccID));
m_PlayerName.text = Language.Get("Chat08", serverName, PlayerDatas.Instance.baseData.PlayerName);
}
- else
+ else if (manager.nowChatTab == ChatTab.Guild)
{
int fmlv = PlayerDatas.Instance.fairyData.mine.FmLV;
m_PlayerName.text = Language.Get("Chat08", RichTextMsgReplaceConfig.GetRichReplace("FAMILY", fmlv), PlayerDatas.Instance.baseData.PlayerName);
}
+ else if (manager.nowChatTab == ChatTab.CrossServer)
+ {
+ string serverName = ServerListCenter.Instance.GetServerName(UIHelper.GetServerIDByAccount(PlayerDatas.Instance.baseData.AccID));
+ m_PlayerName.text = Language.Get("Chat08", serverName, PlayerDatas.Instance.baseData.PlayerName);
+ }
}
public float GetHeight(string content, ArrayList list)
diff --git a/Main/System/Chat/ChatPlayerOtherCell.cs b/Main/System/Chat/ChatPlayerOtherCell.cs
index af20b9c..5aa1011 100644
--- a/Main/System/Chat/ChatPlayerOtherCell.cs
+++ b/Main/System/Chat/ChatPlayerOtherCell.cs
@@ -32,7 +32,7 @@
string serverName = ServerListCenter.Instance.GetServerName((int)data.ServerID);
m_PlayerName.text = Language.Get("Chat08", serverName, data.Name);
}
- else
+ else if (manager.nowChatTab == ChatTab.Guild)
{
FairyMember fairyMember = PlayerDatas.Instance.fairyData.GetMember((int)data.PlayerID);
int fmlv = 0;
@@ -42,7 +42,12 @@
}
m_PlayerName.text = Language.Get("Chat08", RichTextMsgReplaceConfig.GetRichReplace("FAMILY", fmlv), data.Name);
}
-
+ else if (manager.nowChatTab == ChatTab.CrossServer)
+ {
+ string serverName = ServerListCenter.Instance.GetServerName((int)data.ServerID);
+ m_PlayerName.text = Language.Get("Chat08", serverName, data.Name);
+ }
+
avatarCell.SetListener(() =>
{
AvatarHelper.TryViewOtherPlayerInfo((int)data.PlayerID, serverID: (int)data.ServerID, viewPlayerLineupType: (int)BattlePreSetType.Arena);
diff --git a/Main/System/Chat/ChatWin.cs b/Main/System/Chat/ChatWin.cs
index 5e026dc..6b58dbc 100644
--- a/Main/System/Chat/ChatWin.cs
+++ b/Main/System/Chat/ChatWin.cs
@@ -22,7 +22,9 @@
[SerializeField] TextEx txtSendChat;
[SerializeField] ScrollerController scrWorld;
[SerializeField] ScrollerController scrGuild;
+ [SerializeField] ScrollerController scrCrossServer;
+ [SerializeField] ButtonEx serversBtn;
private int unreadMsgCount = 0;
[SerializeField] ButtonEx btnNewMsgTip;
[SerializeField] TextEx txtNewMsgTip;
@@ -32,6 +34,7 @@
bool isSettingOpen = false;
[SerializeField] ChatSettingButton btnWorldSetting;
[SerializeField] ChatSettingButton btnGuildSetting;
+ [SerializeField] ChatSettingButton btnCrossServerSetting;
ChatManager manager { get { return ChatManager.Instance; } }
protected override void InitComponent()
@@ -69,6 +72,11 @@
RefreshChat(manager.nowChatChannel, scrGuild);
ScrollerJump(scrGuild, ChatChannel.Guild);
}
+ else if (manager.nowChatChannel == ChatChannel.CrossServer)
+ {
+ RefreshChat(manager.nowChatChannel, scrCrossServer);
+ ScrollerJump(scrCrossServer, ChatChannel.CrossServer);
+ }
ClearUnreadMsg();
});
btnSetting.SetListener(() =>
@@ -76,7 +84,10 @@
isSettingOpen = !isSettingOpen;
transSettings.SetActive(isSettingOpen);
});
-
+ serversBtn.SetListener(() =>
+ {
+ UIHelper.ShowServersPanel(GuildManager.Instance.crossServerIDList);
+ });
}
// 娓呯悊鏈娑堟伅鐘舵��
@@ -104,12 +115,18 @@
manager.OnUpdatePlayerInfoEvent += OnUpdatePlayerInfoEvent;
scrChatTab.OnRefreshCell += OnRefreshChatTabCell;
+
scrWorld.OnGetDynamicSize += OnGetWorldChatDynamicSize;
scrWorld.OnRefreshCell += OnRefreshWorldCell;
scrWorld.mScrollRect.onValueChanged.AddListener(OnWorldScrollValChange);
+
scrGuild.OnGetDynamicSize += OnGetGuildChatDynamicSize;
scrGuild.OnRefreshCell += OnRefreshGuildCell;
scrGuild.mScrollRect.onValueChanged.AddListener(OnGuildScrollValChange);
+
+ scrCrossServer.OnGetDynamicSize += OnGetChatDynamicSize;
+ scrCrossServer.OnRefreshCell += OnRefreshCell;
+ scrCrossServer.mScrollRect.onValueChanged.AddListener(OnCrossServerScrollValChange);
clickScreenOtherSpace.AddListener(OnClickScreenOtherSpace);
GlobalTimeEvent.Instance.secondEvent += OnSecondEvent;
@@ -119,6 +136,7 @@
transSettings.SetActive(isSettingOpen);
btnWorldSetting.SetChannelType(ChatChannel.World);
btnGuildSetting.SetChannelType(ChatChannel.Guild);
+ btnCrossServerSetting.SetChannelType(ChatChannel.CrossServer);
inputChat.characterLimit = ChatManager.Instance.characterLimit;
CreaterAll(manager.nowChatTab);
}
@@ -139,9 +157,15 @@
scrWorld.OnGetDynamicSize -= OnGetWorldChatDynamicSize;
scrWorld.OnRefreshCell -= OnRefreshWorldCell;
scrWorld.mScrollRect.onValueChanged.RemoveListener(OnWorldScrollValChange);
+
scrGuild.OnGetDynamicSize -= OnGetGuildChatDynamicSize;
scrGuild.OnRefreshCell -= OnRefreshGuildCell;
scrGuild.mScrollRect.onValueChanged.RemoveListener(OnGuildScrollValChange);
+
+ scrCrossServer.OnGetDynamicSize -= OnGetChatDynamicSize;
+ scrCrossServer.OnRefreshCell -= OnRefreshCell;
+ scrCrossServer.mScrollRect.onValueChanged.RemoveListener(OnCrossServerScrollValChange);
+
GlobalTimeEvent.Instance.secondEvent -= OnSecondEvent;
clickScreenOtherSpace.RemoveAllListeners();
}
@@ -165,6 +189,10 @@
else if (channel == ChatChannel.Guild)
{
CreateScroller(scrGuild, channel);
+ }
+ else if (channel == ChatChannel.CrossServer)
+ {
+ CreateScroller(scrCrossServer, channel);
}
}
@@ -227,7 +255,10 @@
{
if (scrWorld.lockType != EnhanceLockType.LockVerticalBottom)
scrWorld.lockType = EnhanceLockType.LockVerticalBottom;
-
+ if (scrGuild.lockType != EnhanceLockType.LockVerticalBottom)
+ scrGuild.lockType = EnhanceLockType.LockVerticalBottom;
+ if (scrCrossServer.lockType != EnhanceLockType.LockVerticalBottom)
+ scrCrossServer.lockType = EnhanceLockType.LockVerticalBottom;
// 濡傛灉鍥炲埌搴曢儴锛岀洿鎺ユ竻闆舵秷鎭�
ClearUnreadMsg();
}
@@ -236,6 +267,10 @@
{
if (scrWorld.lockType != EnhanceLockType.KeepVertical)
scrWorld.lockType = EnhanceLockType.KeepVertical;
+ if (scrGuild.lockType != EnhanceLockType.KeepVertical)
+ scrGuild.lockType = EnhanceLockType.KeepVertical;
+ if (scrCrossServer.lockType != EnhanceLockType.KeepVertical)
+ scrCrossServer.lockType = EnhanceLockType.KeepVertical;
}
}
}
@@ -248,6 +283,10 @@
private void OnGuildScrollValChange(Vector2 _pos)
{
OnScrollValChange(scrGuild, _pos);
+ }
+ private void OnCrossServerScrollValChange(Vector2 _pos)
+ {
+ OnScrollValChange(scrCrossServer, _pos);
}
private void OnScrollValChange(ScrollerController scorller, Vector2 _pos)
@@ -308,7 +347,11 @@
scrGuild.lockType = EnhanceLockType.LockVerticalBottom; // 鍒濆閿佸畾搴曢儴
scrGuild.SetActive(chatTab == ChatTab.Guild);
- transInput.SetActive(chatTab == ChatTab.World || chatTab == ChatTab.Guild);
+ scrCrossServer.lockType = EnhanceLockType.LockVerticalBottom; // 鍒濆閿佸畾搴曢儴
+ scrCrossServer.SetActive(chatTab == ChatTab.CrossServer);
+
+ transInput.SetActive(true);
+ serversBtn.SetActive(chatTab == ChatTab.CrossServer);
CreateChatTabScroller();
@@ -324,6 +367,12 @@
manager.nowChatChannel = ChatChannel.Guild;
CreateScroller(scrGuild, ChatChannel.Guild);
ScrollerJump(scrGuild, ChatChannel.Guild);
+ ClearUnreadMsg();
+ break;
+ case ChatTab.CrossServer:
+ manager.nowChatChannel = ChatChannel.CrossServer;
+ CreateScroller(scrCrossServer, ChatChannel.CrossServer);
+ ScrollerJump(scrCrossServer, ChatChannel.CrossServer);
ClearUnreadMsg();
break;
}
@@ -354,6 +403,10 @@
else if (type == ChatChannel.Guild)
{
RefreshChat(type, scrGuild, playerId, isUpdatePlayerInfo);
+ }
+ else if (type == ChatChannel.CrossServer)
+ {
+ RefreshChat(type, scrCrossServer, playerId, isUpdatePlayerInfo);
}
}
@@ -391,6 +444,8 @@
return;
if (type == ChatChannel.Guild && manager.nowChatTab != ChatTab.Guild)
return;
+ if (type == ChatChannel.CrossServer && manager.nowChatTab != ChatTab.CrossServer)
+ return;
// 1. 鑷繁鍙戦�佺殑娑堟伅 -> 寮哄埗璺宠浆鍒板簳閮� + 娓呴浂
if (playerId == PlayerDatas.Instance.PlayerId)
{
@@ -423,7 +478,7 @@
}
// 鐗规畩鎯呭喌锛氬鏋滄湭璇绘暟閲忓法澶э紙瓒呰繃浜嗘�绘樉绀烘暟閲忥級,璇存槑鏁翠釜鍒楄〃閮借鍒锋柊浜�,鐩存帴娑堥浂
- if (unreadMsgCount >= scrWorld.GetNumberOfCells(scrWorld.m_Scorller))
+ if (unreadMsgCount >= scroller.GetNumberOfCells(scroller.m_Scorller))
{
ClearUnreadMsg();
}
diff --git a/Main/System/Main/HomeWin.cs b/Main/System/Main/HomeWin.cs
index b4927d7..46a4cca 100644
--- a/Main/System/Main/HomeWin.cs
+++ b/Main/System/Main/HomeWin.cs
@@ -375,6 +375,10 @@
ChatManager.Instance.nowChatTab = ChatTab.Guild;
ChatManager.Instance.nowChatChannel = ChatChannel.Guild;
break;
+ case ChatChannel.CrossServer:
+ ChatManager.Instance.nowChatTab = ChatTab.CrossServer;
+ ChatManager.Instance.nowChatChannel = ChatChannel.CrossServer;
+ break;
}
}
UIManager.Instance.OpenWindow<ChatWin>();
--
Gitblit v1.8.0