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