From b9a6e7e896b451e9c915e782a1789b2afe079cc9 Mon Sep 17 00:00:00 2001
From: lcy <1459594991@qq.com>
Date: 星期三, 03 十二月 2025 19:16:01 +0800
Subject: [PATCH] 76 聊天系统-客户端

---
 Main/System/Chat/ChatManager.cs | 1965 +++++++++++++++++-----------------------------------------
 1 files changed, 589 insertions(+), 1,376 deletions(-)

diff --git a/Main/System/Chat/ChatManager.cs b/Main/System/Chat/ChatManager.cs
index e557ce9..0691b0c 100644
--- a/Main/System/Chat/ChatManager.cs
+++ b/Main/System/Chat/ChatManager.cs
@@ -3,1447 +3,660 @@
 using UnityEngine;
 using System.Text;
 using System;
-using System.Text.RegularExpressions;
+using LitJson;
 
-using System.Linq;
-
-public class ChatManager : GameSystemManager<ChatManager>
+public partial class ChatManager : GameSystemManager<ChatManager>
 {
-    public int CHAT_INFO_CNT = 50;
+    public ChatChannel nowChatChannel;
 
-    public const int CHAT_TIP_CNT = 4;
-    public const int CHAT_CELL_CNT = 6;
-    public const int CHAT_INFO_LIMIT = 50;
+    //<ChannelType,TalkData>
+    public Dictionary<ChatChannel, List<TalkData>> talkDict = new Dictionary<ChatChannel, List<TalkData>>();
+    public Dictionary<int, ChatBubbleData> chatBubbles = new Dictionary<int, ChatBubbleData>();
+    //<ChannelType,鏃堕棿鎴�>
+    public Dictionary<int, int> chatChannelSendTime = new Dictionary<int, int>();
+    public event Action<ChatChannel, TalkData> OnUpdateTalkEvent;
+    public event Action OnUpdateTalkCacheListEvent;
 
-    public readonly int BugleItem = 0;//鍠囧彮鐗╁搧id
+    public Dictionary<int, int> chatChannelCD = new Dictionary<int, int>();
+    public int[] areaMyColorArr;
+    public Color32 areaMyColor;
+    public int[] areaOtherColorArr;
+    public Color32 areaOtherColor;
+    public Dictionary<int, int[]> chatChannelBulletColorArrDict = new Dictionary<int, int[]>();
+    public Dictionary<ChatChannel, Color32> chatChannelBulletColorDict = new Dictionary<ChatChannel, Color32>();
 
-    static StringBuilder sb = new StringBuilder();
-    /// <summary>
-    /// 鑱婂ぉ淇℃伅
-    /// </summary>
-    private bool _lockUpdate = true;
-    public bool lockUpdate {
-        get {
-            return _lockUpdate;
-        }
-        set {
-            _lockUpdate = value;
-            if (ChatFriend != null && ChatFriend.IsOpen)
-            {
-                ChatFriend.OnSetLock();
-            }
-        }
-    }
+    public int[] defaultChannelBulletColorArr;
+    public Color32 defaultChannelBulletColor;
+    public int characterLimit;
+    public int sysBubbleID;
+    public int[] sysBubbleColorArr;
+    public Color32 sysBubbleColor;
 
-    private Dictionary<ChatInfoType, List<ChatData>> chatDics = new Dictionary<ChatInfoType, List<ChatData>>();
 
-    private Dictionary<ChatInfoType, bool> chatOpenDics = new Dictionary<ChatInfoType, bool>();
-
-    public List<ChatData> chatDisplayList = new List<ChatData>();
-
-    #region 绉佽亰
-    private Dictionary<int, List<ChatFriendData>> pteChatDics = new Dictionary<int, List<ChatFriendData>>();
-    public event Action OnPteChatChangeEvent;
-    public event Action<int> SelectRecentlyEvent;
-    public static event OnChatPteRefresh OnRefreshPteChat;
-    private int pteChatId = 0;
-    public int PteChatID {
-        get { return pteChatId; }
-        set {
-            if (pteChatId == value)
-            {
-                return;
-            }
-            pteChatId = value;
-            if (OnPteChatChangeEvent != null)
-            {
-                OnPteChatChangeEvent();
-            }
-            if (ChatFriend != null && ChatFriend.IsOpen)
-            {
-                ChatFriend.RefreshChatInfo();
-            }
-        }
-    }
-    private string pteChatName = string.Empty;
-    public string PteChatName {
-        get { return pteChatName; }
-        set { pteChatName = value; }
-    }
-
-    private ChatFriend m_ChatFriend;
-    public ChatFriend ChatFriend {
-        get { return m_ChatFriend; }
-    }
-
-    public void ClearPteChat(int playerId)
+    public override void Init()
     {
-        var id = (int)PlayerDatas.Instance.PlayerId + playerId;
-        if (pteChatDics.ContainsKey(id))
+        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent += OnBeforePlayerDataInitializeEvent;
+        DTC0403_tagPlayerLoginLoadOK.playerLoginOkEvent += OnPlayerLoginOk;
+        GuildManager.Instance.EnterOrQuitGuildEvent += EnterOrQuitGuildEvent;
+
+        var config = FuncConfigConfig.Get("TalkCD");
+        chatChannelCD = ConfigParse.ParseIntDict(config.Numerical1);
+
+        config = FuncConfigConfig.Get("TalkColor");
+        areaMyColorArr = ConfigParse.GetMultipleStr<int>(config.Numerical1);
+        areaMyColor = new Color32()
         {
-            pteChatDics.Remove(id);
-            if (OnRefreshPteChat != null)
+            r = (byte)(areaMyColorArr.Length > 0 ? areaMyColorArr[0] : 0),
+            g = (byte)(areaMyColorArr.Length > 1 ? areaMyColorArr[1] : 0),
+            b = (byte)(areaMyColorArr.Length > 2 ? areaMyColorArr[2] : 0),
+            a = (byte)(areaMyColorArr.Length > 3 ? areaMyColorArr[3] : 255),
+        };
+
+        areaOtherColorArr = ConfigParse.GetMultipleStr<int>(config.Numerical2);
+        areaOtherColor = new Color32()
+        {
+            r = (byte)(areaOtherColorArr.Length > 0 ? areaOtherColorArr[0] : 0),
+            g = (byte)(areaOtherColorArr.Length > 1 ? areaOtherColorArr[1] : 0),
+            b = (byte)(areaOtherColorArr.Length > 2 ? areaOtherColorArr[2] : 0),
+            a = (byte)(areaOtherColorArr.Length > 3 ? areaOtherColorArr[3] : 255),
+        };
+
+        chatChannelBulletColorArrDict = ConfigParse.ParseIntArrayDict(config.Numerical3);
+        foreach (var kv in chatChannelBulletColorArrDict)
+        {
+            if (!IsValidChatChannel(kv.Key))
+                continue;
+            chatChannelBulletColorDict[(ChatChannel)kv.Key] = new Color32()
             {
-                OnRefreshPteChat(null);
-            }
+                r = (byte)(kv.Value.Length > 0 ? kv.Value[0] : 0),
+                g = (byte)(kv.Value.Length > 1 ? kv.Value[1] : 0),
+                b = (byte)(kv.Value.Length > 2 ? kv.Value[2] : 0),
+                a = (byte)(kv.Value.Length > 3 ? kv.Value[3] : 0),
+            };
+        }
+
+        defaultChannelBulletColorArr = ConfigParse.GetMultipleStr<int>(config.Numerical4);
+        defaultChannelBulletColor = new Color32()
+        {
+            r = (byte)(defaultChannelBulletColorArr.Length > 0 ? defaultChannelBulletColorArr[0] : 0),
+            g = (byte)(defaultChannelBulletColorArr.Length > 1 ? defaultChannelBulletColorArr[1] : 0),
+            b = (byte)(defaultChannelBulletColorArr.Length > 2 ? defaultChannelBulletColorArr[2] : 0),
+            a = (byte)(defaultChannelBulletColorArr.Length > 3 ? defaultChannelBulletColorArr[3] : 255),
+        };
+
+        config = FuncConfigConfig.Get("TalkLimit");
+        characterLimit = int.Parse(config.Numerical1);
+
+        config = FuncConfigConfig.Get("TalkBubble");
+        sysBubbleID = int.Parse(config.Numerical1);
+        sysBubbleColorArr = ConfigParse.GetMultipleStr<int>(config.Numerical2);
+        sysBubbleColor = new Color32()
+        {
+            r = (byte)(sysBubbleColorArr.Length > 0 ? sysBubbleColorArr[0] : 0),
+            g = (byte)(sysBubbleColorArr.Length > 1 ? sysBubbleColorArr[1] : 0),
+            b = (byte)(sysBubbleColorArr.Length > 2 ? sysBubbleColorArr[2] : 0),
+            a = (byte)(sysBubbleColorArr.Length > 3 ? sysBubbleColorArr[3] : 255),
+        };
+    }
+
+    public override void Release()
+    {
+        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent -= OnBeforePlayerDataInitializeEvent;
+        DTC0403_tagPlayerLoginLoadOK.playerLoginOkEvent -= OnPlayerLoginOk;
+        GuildManager.Instance.EnterOrQuitGuildEvent -= EnterOrQuitGuildEvent;
+    }
+
+    //琚涪鍑�/閫�鍑哄伐浼氭椂锛屽垏鎹㈣亰澶╅閬�
+    private void EnterOrQuitGuildEvent(bool obj)
+    {
+        if (!obj)
+        {
+            nowChatChannel = ChatChannel.World;
+            nowChatTab = ChatTab.World;
         }
     }
 
-    public void SelectRecentlyChat(int playerId)
+    private void OnBeforePlayerDataInitializeEvent()
     {
-        if (SelectRecentlyEvent != null)
-        {
-            SelectRecentlyEvent(playerId);
-        }
-    }
-    #endregion
-
-    private List<ChatData> chatlist = new List<ChatData>();
-    private List<ChatData> chatUpList = new List<ChatData>();
-
-    public delegate void OnChatRefresh(ChatInfoType type);
-    public static event OnChatRefresh OnRefreshChat;
-
-    public delegate void OnChatSelfRefresh(ChatData data);
-    public static event OnChatSelfRefresh OnRefreshSelf;
-
-    public delegate void OnChatPteRefresh(ChatFriendData data);
-
-    public ChatInfoType presentChatType {
-        get; set;
+        talkDict.Clear();
+        ParseChatBubbleConfig();
+        nowChatChannel = ChatChannel.World;
+        nowChatTab = ChatTab.World;
     }
 
-    public event Action OnClickCloseChatEvent;
-    public event Action<bool> OnChatExtentOpenEvent;
-
-    public event Action<ChatData> chatFloatUpdate;
-
-    // TeamModel teamModel {
-    //     get {
-    //         return ModelCenter.Instance.GetModel<TeamModel>();
-    //     }
-    // }
-
-    // FriendsModel friendModel {
-    //     get { return ModelCenter.Instance.GetModel<FriendsModel>(); }
-    // }
-
-    // EquipGemModel equipGemModel { get { return ModelCenter.Instance.GetModel<EquipGemModel>(); } }
-    // EquipStrengthModel equipStrengthModel { get { return ModelCenter.Instance.GetModel<EquipStrengthModel>(); } }
-    // EquipStarModel equipStarModel { get { return ModelCenter.Instance.GetModel<EquipStarModel>(); } }
-    // EquipTrainModel equipTrainModel { get { return ModelCenter.Instance.GetModel<EquipTrainModel>(); } }
-    // EquipModel equipModel { get { return ModelCenter.Instance.GetModel<EquipModel>(); } }
-    PackManager packManager => PackManager.Instance;
-    // DungeonAssistModel dungeonAssistModel { get { return ModelCenter.Instance.GetModel<DungeonAssistModel>(); } }
-
-    public Dictionary<ChatInfoType, List<string>> achievementRandoms = new Dictionary<ChatInfoType, List<string>>();
-    List<string> assistThankLanguages = new List<string>();
-    Int2 assistThankLevelLimit = new Int2(150, 200);
-
-    public ChatManager()
+    private void OnPlayerLoginOk()
     {
-        chatOpenDics.Add(ChatInfoType.System, true);
-        chatOpenDics.Add(ChatInfoType.World, true);
-        chatOpenDics.Add(ChatInfoType.CrossServer, true);
-        chatOpenDics.Add(ChatInfoType.Area, true);
-        chatOpenDics.Add(ChatInfoType.Team, true);
-        chatOpenDics.Add(ChatInfoType.Invite, true);
-        chatOpenDics.Add(ChatInfoType.Trumpet, true);
-        chatOpenDics.Add(ChatInfoType.Fairy, true);
-        chatOpenDics.Add(ChatInfoType.default1, true);
-        lockUpdate = true;
-        presentChatType = ChatInfoType.World;
-        IsExtentOpen = false;
-
-        // var _funcCfg = FuncConfigConfig.Get("BugleItem");
-        // BugleItem = int.Parse(_funcCfg.Numerical1);
-
-        DTC0102_tagCDBPlayer.switchAccountEvent += SwitchAccountEvent;
-        // TODO YYL
-        // StageLoad.Instance.onStageLoadFinish += OnStageLoadFinish;
-        DTC0403_tagPlayerLoginLoadOK.playerLoginOkEvent += PlayerLoginOkEvent;
-
-        InitChatRedpoints();
-
-        // FuncConfigConfig _cfg = FuncConfigConfig.Get("RandomWord");
-        // try
-        // {
-        //     achievementRandoms.Add(ChatInfoType.World, new List<string>(ConfigParse.GetMultipleStr(_cfg.Numerical1)));
-        //     achievementRandoms.Add(ChatInfoType.Fairy, new List<string>(ConfigParse.GetMultipleStr(_cfg.Numerical2)));
-        //     var json = LitJson.JsonMapper.ToObject(_cfg.Numerical3);
-        //     foreach (var key in json.Keys)
-        //     {
-        //         var type = int.Parse(key);
-        //         m_TaskRandomChats.Add(type, new List<string>(LitJson.JsonMapper.ToObject<string[]>(json[key].ToJson())));
-        //     }
-        //     assistThankLanguages.AddRange(ConfigParse.GetMultipleStr(_cfg.Numerical4));
-        //     if (!string.IsNullOrEmpty(_cfg.Numerical5))
-        //     {
-        //         var levelArray = ConfigParse.GetMultipleStr<int>(_cfg.Numerical5);
-        //         assistThankLevelLimit = new Int2(levelArray[0], levelArray[1]);
-        //     }
-        // }
-        // catch (Exception e)
-        // {
-        //     Debug.LogError(e.Message);
-        // }
+        LoadBulletSettings();
     }
 
-    private void PlayerLoginOkEvent()
+    public void AddChatChannelSendTime(ChatChannel chatChannel, int time)
     {
-        UpdateRedpoint(ChatInfoType.Team);
-        UpdateRedpoint(ChatInfoType.Fairy);
+        chatChannelSendTime[(int)chatChannel] = time;
     }
 
-    private void SwitchAccountEvent()
+    public bool TryGetChatChannelSendTime(ChatChannel chatChannel, out int time)
     {
-        ClearAllChatInfo();
+        return chatChannelSendTime.TryGetValue((int)chatChannel, out time);
     }
 
-    void ChatReport(ChatInfoType chatType, string content, string toPlayer)
+    public bool TryGetChatChannelSendCD(ChatChannel chatChannel, out int cd)
     {
-        try
-        {
-            if (ChatCenter.Instance.IsChatBanned || ChatCenter.Instance.IsClientBan(chatType) ||
-                IsInviteChat(content) || KillRegex.IsMatch(content))
-            {
-                return;
-            }
-            var channelName = string.Empty;
-            switch (chatType)
-            {
-                case ChatInfoType.World:
-                    channelName = Language.Get("ChatType_World");
-                    break;
-                case ChatInfoType.Area:
-                    channelName = Language.Get("ChatType_Area");
-                    break;
-                case ChatInfoType.CrossServer:
-                    channelName = Language.Get("ChatType_CrossServer");
-                    break;
-                case ChatInfoType.Team:
-                    channelName = Language.Get("ChatType_Team");
-                    break;
-                case ChatInfoType.Invite:
-                    channelName = Language.Get("ChatType_Invite");
-                    break;
-                case ChatInfoType.Trumpet:
-                    channelName = Language.Get("ChatType_Trumpet");
-                    break;
-                case ChatInfoType.Fairy:
-                    channelName = Language.Get("ChatType_Fairy");
-                    break;
-                case ChatInfoType.Friend:
-                    channelName = Language.Get("PlayerDetail_PrivateChat");
-                    break;
-                case ChatInfoType.default1:
-                    channelName = Language.Get("ChatType_default1");
-                    break;
-                default:
-                    return;
-            }
-            // TODO YYL
-            // OperationLogCollect.Instance.ChatReport(content, channelName, chatType == ChatInfoType.Friend ? toPlayer : string.Empty, chatType);
-        }
-        catch (Exception e)
-        {
-            Debug.Log(e.StackTrace + e.Message);
-        }
+        return chatChannelCD.TryGetValue((int)chatChannel, out cd);
     }
 
-    public void SendChatInfo(ChatInfoType type, string msg, ChatExtraData? info = null , bool isDirtyWord = true,  bool isChatInfoCount = true)
+    public bool IsCanSend(ChatChannel chatChannel, out int remainingSeconds)
     {
-        bool isDirty = false;
-        bool isVoice = ChatCenter.s_VoiceRegex.IsMatch(msg);
-
-        if (CheckEmptyChat(msg))
-        {
-            SysNotifyMgr.Instance.ShowTip("CanootTalk14");
-            return;
-        }
-
-        ChatReport(type, msg, PteChatName);
-
-        if (!isVoice && !InviteRegex.IsMatch(msg))
-        {
-            if (isDirtyWord)
-            {
-                isDirty = DirtyWordConfig.IsDirtWord(msg);
-                if (isDirty)
-                    msg = DirtyWordConfig.IsDirtWord(msg, '*');
-            }
-
-            var length = GetChatMessageLength(msg);
-            if (isChatInfoCount)
-            {
-                if (length > CHAT_INFO_CNT)
-                {
-                    ServerTipDetails.DisplayNormalTip(Language.Get("L1014"));
-                    return;
-                }
-            }
-
-            if (itemPlaceList.Count > 5)
-            {
-                SysNotifyMgr.Instance.ShowTip("ChatSendItemLimit");
-                return;
-            }
-        }
-        LanguageVerify.toPlayer = (uint)PteChatID;
-        LanguageVerify.toPlayerName = PteChatName;
-        LanguageVerify.Instance.VerifyChat(msg, type, (bool ok, string result) =>
-         {
-             if (ok)
-             {
-                 ChatCenter.RecentlyChat _recentlyChat = null;
-                 if (!isDirty && !isVoice)
-                 {
-                     _recentlyChat = ChatCenter.Instance.SaveRecentlyChat(result);
-                 }
-                 msg = CheckHasItem(result, _recentlyChat);
-                 ChatCenter.Instance.recentlyChat = null;
-
-                 if (ChatCenter.Instance.IsChatBanned || ChatCenter.Instance.IsClientBan(type))
-                 {
-                     var toPlayer = PteChatID;
-                     if (info.HasValue && info.Value.infoint1 == 0)
-                     {
-                         toPlayer = info.Value.infoint1;
-                     }
-                     ChatCenter.Instance.HandleChatBanned(type, msg, toPlayer);
-                     return;
-                 }
-
-                 switch (type)
-                 {
-                     case ChatInfoType.World:
-                     case ChatInfoType.Fairy:
-                         if (IsAssitChat(msg) != 0)
-                         {
-                            //  TODO YYL
-                            // teamModel.RequestAssistAutoMatch();
-                         }
-                         break;
-                 }
-
-                 switch (type)
-                 {
-                     case ChatInfoType.World:
-                         {
-                             C0201_tagCTalkGong chatPack = new C0201_tagCTalkGong();
-                             chatPack.Len = (ushort)GetUTF8InfoLen(msg);
-                             chatPack.Content = msg;
-                             GameNetSystem.Instance.SendInfo(chatPack);
-                         }
-                         break;
-                     case ChatInfoType.Area:
-                         {
-                             C0207_tagCTalkArea chatPack = new C0207_tagCTalkArea();
-                             chatPack.Len = (ushort)GetUTF8InfoLen(msg);
-                             chatPack.Content = msg;
-                             GameNetSystem.Instance.SendInfo(chatPack); 
-                         }
-                         break;
-                     case ChatInfoType.CrossServer:
-                         {
-                             C0208_tagCTalkCountry chatPack = new C0208_tagCTalkCountry();
-                             chatPack.Len = (ushort)GetUTF8InfoLen(msg);
-                             chatPack.Content = msg;
-                             GameNetSystem.Instance.SendInfo(chatPack);
-                         }
-                         break;
-                     case ChatInfoType.Team:
-                         {
-                             C0205_tagCTalkDui chatPack = new C0205_tagCTalkDui();
-                             chatPack.Len = (ushort)GetUTF8InfoLen(msg);
-                             chatPack.Content = msg;
-                             GameNetSystem.Instance.SendInfo(chatPack);
-                         }
-                         break;
-                     case ChatInfoType.Friend:
-                         {
-                             var _toPlayer = PteChatID;
-                             if (info.HasValue && info.Value.infoint1 == 0)
-                             {
-                                 _toPlayer = info.Value.infoint1;
-                             }
-                             if (_toPlayer == 0)
-                             {
-                                 SysNotifyMgr.Instance.ShowTip("NoChatTarget");
-                                 return;
-                             }
-                             SendFriendChat(msg, _toPlayer);
-                         }
-                         break;
-                     case ChatInfoType.Fairy:
-                         {
-                             C0203_tagCTalkBang chatPack = new C0203_tagCTalkBang();
-                             chatPack.Len = (ushort)GetUTF8InfoLen(msg);
-                             chatPack.Content = msg;
-                             GameNetSystem.Instance.SendInfo(chatPack);
-                         }
-                         break;
-                     case ChatInfoType.Trumpet:
-                         {
-                             if (info.HasValue)
-                             {
-                                 CA217_tagCMPYSpeaker _pak = new CA217_tagCMPYSpeaker();
-                                 _pak.SpeakerType = 1;
-                                 _pak.IsUseGold = 0;
-                                 _pak.ItemIndex = (byte)info.Value.infoint1;
-                                 _pak.TextLen = (ushort)GetUTF8InfoLen(msg);
-                                 _pak.Text = msg;
-                                 GameNetSystem.Instance.SendInfo(_pak);
-                             }
-                         }
-                         break;
-                     case ChatInfoType.default1:
-                         {
-                             if (PlayerDatas.Instance.baseData.faction == 0)
-                             {
-                                 SysNotifyMgr.Instance.ShowTip("FactionChatLimit");
-                                 return;
-                             }
-                             CA216_tagCMPyTalk _pak = new CA216_tagCMPyTalk();
-                             _pak.TalkType = 100;
-                             _pak.Len = (ushort)GetUTF8InfoLen(msg);
-                             _pak.Content = msg;
-                             GameNetSystem.Instance.SendInfo(_pak);
-                         }
-                         break;
-                 }
-             }
-         });
-    }
-
-    int GetChatMessageLength(string message)
-    {
-        message = WordAnalysis.Color_Start_Regex.Replace(message, string.Empty);
-        message = WordAnalysis.Color_End_Regex.Replace(message, string.Empty);
-        return message.Length;
-    }
-
-    bool CheckEmptyChat(string msg)
-    {
-        if (string.IsNullOrEmpty(msg.Replace(" ", string.Empty)))
-        {
+        remainingSeconds = 0;
+        // 娌℃湁閰嶇疆鐨勪笉闄愬埗
+        if (!TryGetChatChannelSendCD(chatChannel, out int cd))
             return true;
-        }
+        // 娌℃湁鍙戦�佽繃 
+        if (!TryGetChatChannelSendTime(chatChannel, out int time) || time <= 0)
+            return true;
+        DateTime endDateTime = TimeUtility.GetTime((uint)(cd + time + 1));
+        TimeSpan remainingTime = endDateTime - TimeUtility.ServerNow;
+        remainingSeconds = (int)remainingTime.TotalSeconds;
+        if (remainingSeconds <= 0)
+            return true;
         return false;
     }
-    /// <summary>
-    /// 涓栫晫棰戦亾
-    /// </summary>
-    /// <param name="vNetData"></param>
-    public void RevChatInfo(H0201_tagTalkGong vNetData, uint time = 0)
+    // 0-绯荤粺 1-鏃ユ湡 2-鑷繁 3-鍏朵粬鐜╁
+    public int GetTalkDataType(TalkData talkData)
     {
-        //  TODO YYL
-        // if (friendModel.GetFirendInfo(vNetData.PlayerID, (byte)GroupType.Balcklist) != null)//榛戝悕鍗曟嫤鎴�
-        // {
-        //     return;
-        // }
-        ChatData chatData = null;
-        var content = vNetData.Content;
-        if (IsInviteChat(vNetData.Content))
+        if (talkData.isSystem)
         {
-            content = InviteRegex.Replace(vNetData.Content, "");
-
-            // if (teamModel.myTeam.GetIndexOfMember((int)vNetData.PlayerID) != -1)
-            // {
-            //     content = StringUtility.Contact("<color=#f8983b>", vNetData.Name, "</color>", "锛�", content);
-            // }
-            // else
-            {
-                content = StringUtility.Contact("<color=#f8983b>", vNetData.Name, "</color>", "锛�", content, string.Format("<color=#00ff00><a>{0}|invite={1}</a></color>", Language.Get("L1013"), vNetData.PlayerID));
-            }
-            chatData = new ChatInviteData(content, (int)vNetData.PlayerID, vNetData.Name, vNetData.Extras);
-            KeepChatInfo(chatData);
-            return;
+            return 0;
         }
-        if (IsAssitChat(content, true) == 2 && vNetData.PlayerID != PlayerDatas.Instance.baseData.PlayerID)
+        else if (talkData.isDate)
         {
-            content = StringUtility.Contact(content, Language.Get("InviteTeam", vNetData.PlayerID));
+            return 1;
         }
-        chatData = new ChatWorldData(content, (int)vNetData.PlayerID, vNetData.Name, vNetData.Extras);
-        if (time != 0)
+        else if (talkData.PlayerID == PlayerDatas.Instance.PlayerId)
         {
-            chatData.createTime = TimeUtility.GetTime(time);
-        }
-        LocalChatHistory.Save(chatData as ChatUeseData);
-        KeepChatInfo(chatData);
-    }
-    /// <summary>
-    /// 鍖哄煙棰戦亾
-    /// </summary>
-    /// <param name="vNetData"></param>
-    public void RevChatInfo(H0207_tagTalkArea vNetData)
-    {
-        //  TODO YYL
-        // if (friendModel.GetFirendInfo(vNetData.PlayerID, (byte)GroupType.Balcklist) != null)//榛戝悕鍗曟嫤鎴�
-        // {
-        //     return;
-        // }
-        ChatData chatData = new ChatAreaData(vNetData.Content, (int)vNetData.PlayerID, vNetData.SrcName, vNetData.Extras);
-        LocalChatHistory.Save(chatData as ChatUeseData);
-        KeepChatInfo(chatData);
-    }
-
-    // 闃佃惀棰戦亾
-    public void RevChatInfo(HA707_tagMCPyTalk vNetData)
-    {
-        //  TODO YYL
-        // if (friendModel.GetFirendInfo(vNetData.PlayerID, (byte)GroupType.Balcklist) != null)//榛戝悕鍗曟嫤鎴�
-        // {
-        //     return;
-        // }
-        ChatData chatData = new ChatFactionData(vNetData.Content, (int)vNetData.PlayerID, vNetData.Name, vNetData.Extras);
-        LocalChatHistory.Save(chatData as ChatUeseData);
-        KeepChatInfo(chatData);
-    }
-
-    /// <summary>
-    /// 璺ㄦ湇鑱婂ぉ
-    /// </summary>
-    /// <param name="package"></param>
-    public void RevChatInfo(H0208_tagTalkCountry package)
-    {
-        //  TODO YYL
-        // if (friendModel.GetFirendInfo(package.PlayerID, (byte)GroupType.Balcklist) != null)//榛戝悕鍗曟嫤鎴�
-        // {
-        //     return;
-        // }
-        if (!FuncOpen.Instance.IsFuncOpen(162))
-        {
-            return;
-        }
-        ChatData chatData = new ChatCrossServerData(package.Content, (int)package.PlayerID, package.Name, package.Extras);
-        LocalChatHistory.Save(chatData as ChatUeseData);
-        KeepChatInfo(chatData);
-    }
-
-    /// <summary>
-    /// 鍠囧彮鍠婅瘽
-    /// </summary>
-    /// <param name="vNetData"></param>
-    public void RevChatInfo(HA9A3_tagGCPYSpeakerContent vNetData)
-    {
-        // ChatData chatData = new ChatTrumpetData(vNetData.Text, (int)vNetData.PlayerID, vNetData.Name, vNetData.Extras, vNetData.SpeakerType, vNetData.AccID);
-        // LocalChatHistory.Save(chatData as ChatUeseData);
-        // KeepChatInfo(chatData);
-        // ServerTipDetails.ShowTrumpetTip(chatData as ChatTrumpetData);
-    }
-    /// <summary>
-    /// 瀹舵棌棰戦亾
-    /// </summary>
-    /// <param name="vNetData"></param>
-    public void RevChatInfo(H0203_tagTalkBang vNetData, uint time = 0)
-    {
-        var content = vNetData.Content;
-        if (IsAssitChat(content, true) == 1 && vNetData.PlayerID != PlayerDatas.Instance.baseData.PlayerID)
-        {
-            content = StringUtility.Contact(content, Language.Get("InviteTeam", vNetData.PlayerID));
-        }
-        ChatData chatData = new ChatFamilyData(content, (int)vNetData.PlayerID, vNetData.Name, vNetData.Extras);
-        if (time != 0)
-        {
-            chatData.createTime = TimeUtility.GetTime(time);
-        }
-        LocalChatHistory.Save(chatData as ChatUeseData);
-        KeepChatInfo(chatData);
-        ReceiveNewChat(ChatInfoType.Fairy);
-    }
-
-    /// <summary>
-    /// 鍚庣缂撳瓨
-    /// </summary>
-    /// <param name="vNetData"></param>
-    public void RevChatInfo(HB311_tagGCTalkCache package)
-    {
-        for (int i = 0; i < package.Count; i++)
-        {
-            var data = package.InfoList[i];
-            if (data.ChannelType == 1)
-            {
-                RevChatInfo(new H0201_tagTalkGong()
-                {
-                    socketType = package.socketType,
-                    Content = data.Content,
-                    Extras = data.Extras,
-                    ExtraValue = 0,
-                    Name = data.Name,
-                    NameLen = data.NameLen,
-                    Len = data.Len,
-                    PlayerID = data.PlayerID,
-                }, data.Time);
-            }
-            else if (data.ChannelType == 2)
-            {
-                RevChatInfo(new H0203_tagTalkBang()
-                {
-                    socketType = package.socketType,
-                    Content = data.Content,
-                    Extras = data.Extras,
-                    ExtraValue = 0,
-                    Len = data.Len,
-                    Name = data.Name,
-                    NameLen = data.NameLen,
-                    PlayerID = data.PlayerID,
-                });
-            }
-        }
-    }
-
-    /// <summary>
-    /// 濂藉弸绉佽亰
-    /// </summary>
-    /// <param name="vNetData"></param>
-    public void SetChatFreind(ChatFriend inst)
-    {
-        m_ChatFriend = inst;
-    }
-    public void RevChatInfo(H0206_tagTalkMi vNetData)
-    {
-        if (Regex.IsMatch(vNetData.Content, KILL_IDENTIFY))
-        {
-            if (vNetData.PlayerID == PlayerDatas.Instance.baseData.PlayerID)
-            {
-                return;
-            }
-        }
-        ChatFriendData chatData = new ChatFriendData(vNetData.Content, (int)vNetData.PlayerID, vNetData.SrcName, vNetData.Extras, vNetData.ToName, vNetData.TalkType, vNetData.ToPlayerID);
-        FitterChat(chatData);
-        AddPteChat(chatData, false);
-        LocalChatHistory.Save(chatData as ChatUeseData);
-        if (chatData.player == PlayerDatas.Instance.baseData.PlayerID)
-        {
-            if (OnRefreshSelf != null)
-            {
-                OnRefreshSelf(chatData);
-            }
-        }
-        if (chatData.IsSound)
-        {
-            // ChatCenter.Instance.CheckAutoPlayVoice(chatData);
-        }
-    }
-    private void AddPteChat(ChatFriendData chatData, bool isLocal)
-    {
-        List<ChatFriendData> list = null;
-        pteChatDics.TryGetValue(chatData.player + chatData.toPlayer, out list);
-        if (list != null)
-        {
-            if (list.Count > CHAT_INFO_CNT)
-            {
-                ChatUeseData outData = list[0];
-                list.RemoveAt(0);
-                outData = null;
-            }
-            list.Add(chatData);
+            return 2;
         }
         else
         {
-            list = new List<ChatFriendData>();
-            list.Add(chatData);
-            pteChatDics.Add(chatData.player + chatData.toPlayer, list);
-        }
-        if (OnRefreshPteChat != null && !isLocal)
-        {
-            OnRefreshPteChat(chatData);
-        }
-    }
-    /// <summary>
-    /// 闃熶紞棰戦亾
-    /// </summary>
-    /// <param name="vNetData"></param>
-    public void RevChatInfo(H0205_tagTalkDui vNetData)
-    {
-        ChatData chatData = new ChatTeamData(vNetData.Content, (int)vNetData.PlayerID, vNetData.Name, vNetData.Extras);
-        KeepChatInfo(chatData);
-        ReceiveNewChat(ChatInfoType.Team);
-    }
-    /// <summary>
-    /// GM
-    /// </summary>
-    /// <param name="vNetData"></param>
-    public void RevChatInfo(H3202_tagServerResponse vNetData)
-    {
-        ChatData chatData = new ChatSystemData(vNetData.Message);
-        KeepChatInfo(chatData);
-    }
-    /// <summary>
-    /// 绯荤粺鎻愮ず
-    /// </summary>
-    /// <param name="msg"></param>
-    public void RevChatInfo(string msg)
-    {
-        ChatData chatData = new ChatSystemData(msg);
-        KeepChatInfo(chatData);
-    }
-    public void RevChatInfo(string msg, ArrayList infoList, ChatInfoType type = ChatInfoType.System)
-    {
-        ChatData chatData = null;
-        switch (type)
-        {
-            case ChatInfoType.System:
-                {
-                    chatData = new ChatSystemData(msg);
-                    chatData.infoList.AddRange(infoList);
-                }
-                break;
-            case ChatInfoType.FairyTip:
-            case ChatInfoType.FairyQuestion:
-                {
-                    chatData = new ChatFamilyData(msg, 0, string.Empty, string.Empty, type);
-                    chatData.infoList.AddRange(infoList);
-                }
-                break;
-            case ChatInfoType.TeamTip:
-                {
-                    chatData = new ChatTeamData(msg, 0, string.Empty, string.Empty, type);
-                    chatData.infoList.AddRange(infoList);
-                }
-                break;
-            case ChatInfoType.default1:
-            case ChatInfoType.default2:
-                {
-                    chatData = new ChatFactionData(msg, 0, string.Empty, string.Empty, type);
-                    chatData.infoList.AddRange(infoList);
-                }
-                break;
-        }
-        if (chatData != null)
-        {
-            KeepChatInfo(chatData);
-        }
-    }
-    /// <summary>
-    /// 鑾峰彇棰戦亾鑱婂ぉ鏁版嵁
-    /// </summary>
-    /// <param name="type"></param>
-    /// <returns></returns>
-    public List<ChatData> GetChatInfo(ChatInfoType type)
-    {
-        List<ChatData> list = null;
-        chatDics.TryGetValue(type, out list);
-        return list;
-    }
-    /// <summary>
-    /// 鑾峰彇濂藉弸鑱婂ぉ鏁版嵁
-    /// </summary>
-    /// <param name="type"></param>
-    /// <returns></returns>
-    public List<ChatFriendData> GetChatInfo(int player)
-    {
-        List<ChatFriendData> list = null;
-        pteChatDics.TryGetValue(player + (int)PlayerDatas.Instance.baseData.PlayerID, out list);
-        return list;
-    }
-    /// <summary>
-    /// 鑾峰彇涓荤晫闈㈢殑鑱婂ぉ鏁版嵁
-    /// </summary>
-    /// <returns></returns>
-    public List<ChatData> GetChatInfo()
-    {
-        return chatlist;
-    }
-    public List<ChatData> GetChatUpInfo()
-    {
-        return chatUpList;
-    }
-    public ChatData GetChatInfo(ChatInfoType type, int index)
-    {
-        List<ChatData> list = null;
-        chatDics.TryGetValue(type, out list);
-        if (list != null)
-        {
-            return list[index];
-        }
-        return null;
-    }
-
-    public void KeepLocalChat(ChatData chat)
-    {
-        if (chat.type == ChatInfoType.Friend)
-        {
-            FitterChat(chat);
-            AddPteChat(chat as ChatFriendData, true);
-        }
-        else
-        {
-            KeepChatInfo(chat);
+            return 3;
         }
     }
 
-    private void KeepChatInfo(ChatData data)
-    {
-        KeepAllTypeChat(data);
-        List<ChatData> list = null;
-        chatDics.TryGetValue(data.type, out list);
-        if (list != null)
-        {
-            if (list.Count >= CHAT_INFO_CNT)
-            {
-                ChatData outData = list[0];
-                list.RemoveAt(0);
-                outData = null;
-            }
-            list.Add(data);
-        }
-        else
-        {
-            list = new List<ChatData>();
-            list.Add(data);
-            chatDics.Add(data.type, list);
-        }
-        if (chatFloatUpdate != null)
-        {
-            chatFloatUpdate(data);
-        }
-        if (OnRefreshChat != null)
-            OnRefreshChat(data.type);
-        if (data.type != ChatInfoType.System && (data as ChatUeseData).player == PlayerDatas.Instance.baseData.PlayerID)
-        {
-            if (OnRefreshSelf != null)
-                OnRefreshSelf(data);
-        }
-        // if ((data is ChatUeseData)
-        //     && (data as ChatUeseData).IsSound)
-        // {
-        //     ChatCenter.Instance.CheckAutoPlayVoice(data);
-        // }
-    }
-    private void KeepAllTypeChat(ChatData data)
-    {
-        if (!FitterChat(data))
-        {
-            if (chatlist.Count >= CHAT_TIP_CNT)
-            {
-                ChatData outData = chatlist[0];
-                chatlist.RemoveAt(0);
-            }
-            if (chatUpList.Count >= CHAT_INFO_CNT)
-            {
-                ChatData outData = chatUpList[0];
-                chatUpList.RemoveAt(0);
-            }
-            chatlist.Add(data);
-            chatUpList.Add(data);
-        }
-    }
-    private bool FitterChat(ChatData data)
-    {
-        if (data.type == ChatInfoType.System)
-        {
-            return true;
-        }
-
-        if (IsItemChat(data.content))
-        {
-            string content = data.content;
-            MatchCollection matchArray = HrefAnalysis.EquipDetailRegex.Matches(content);
-            int index = 0;
-            for (int i = 0; i < matchArray.Count; i++)
-            {
-                data.richText.Append(content.Substring(index, matchArray[i].Index - index));
-                index = matchArray[i].Index + matchArray[i].Length;
-                string detail = matchArray[i].Groups[1].Value;
-                var itemplusArray = detail.Split('|');
-                if (itemplusArray.Length > 1)
-                {
-                    var itemId = int.Parse(itemplusArray[0]);
-                    ItemConfig itemConfig = ItemConfig.Get(itemId);
-                    if (itemConfig != null)
-                    {
-                        try
-                        {
-                            int[] equipGems = null;
-                            if (itemplusArray.Length >= 8)
-                            {
-                                equipGems = new int[4];
-                                for (int j = 0; j < equipGems.Length; j++)
-                                {
-                                    equipGems[j] = int.Parse(itemplusArray[4 + j]);
-                                }
-                            }
-
-                            ItemTipUtility.CustomEquipWash equipWash = new ItemTipUtility.CustomEquipWash();
-                            if (itemplusArray.Length >= 15)
-                            {
-                                equipWash.LV = int.Parse(itemplusArray[11]);
-                                equipWash.Value = new int[3];
-                                equipWash.Value[0] = int.Parse(itemplusArray[12]);
-                                equipWash.Value[1] = int.Parse(itemplusArray[13]);
-                                equipWash.Value[2] = int.Parse(itemplusArray[14]);
-                            }
-
-                            List<int> suitPlaces = null;
-                            if (itemplusArray.Length > 15)
-                            {
-                                suitPlaces = new List<int>();
-                                for (int j = 0; j < 8; j++)
-                                {
-                                    var place = int.Parse(itemplusArray[15 + j]);
-                                    if (place != 0)
-                                    {
-                                        suitPlaces.Add(place);
-                                    }
-                                }
-                            }
-
-                            int[] suitLevels = null;
-                            if (itemplusArray.Length > 15)
-                            {
-                                suitLevels = new int[3];
-                                for (int j = 0; j < 3; j++)
-                                {
-                                    suitLevels[j] = int.Parse(itemplusArray[23 + j]);
-                                }
-                            }
-
-                            int[] placeStars = null;
-                            if (itemplusArray.Length > 15)
-                            {
-                                placeStars = new int[8];
-                                for (int j = 0; j < 8; j++)
-                                {
-                                    placeStars[j] = int.Parse(itemplusArray[26 + j]);
-                                }
-                            }
-
-
-                            ItemTipUtility.CustomItemPlus itemplus = new ItemTipUtility.CustomItemPlus()
-                            {
-                                ItemID = itemId,
-                                count = int.Parse(itemplusArray[1]),
-                                Equipped = int.Parse(itemplusArray[2]),
-                                UserData = itemplusArray[3],
-                                Stone = equipGems,
-                                PlusLV = itemplusArray.Length >= 9 ? int.Parse(itemplusArray[8]) : 0,
-                                Star = itemplusArray.Length >= 10 ? int.Parse(itemplusArray[9]) : 0,
-                                EvolveLV = itemplusArray.Length >= 11 ? int.Parse(itemplusArray[10]) : 0,
-                                Wash = equipWash,
-                                Equips = null,
-                                suitPlaces = suitPlaces == null ? null : suitPlaces.ToArray(),
-                                suitLevels = suitLevels,
-                                placeStars = placeStars,
-                            };
-
-                            string append = string.Format("<a><Word info=item id={0} itemplus={1} chatsend=1/>|showitem={0} itemplus={1}</a>",
-                                      itemId, LitJson.JsonMapper.ToJson(itemplus));
-                            append = UIHelper.AppendColor(itemConfig.ItemColor, append);
-                            data.richText.Append(append);
-                        }
-                        catch (Exception e)
-                        {
-                            data.richText.Append(itemConfig.ItemName);
-                            Debug.Log(e.Message);
-                        }
-                    }
-                }
-                else
-                {
-                    data.richText.Append(matchArray[i].Value);
-                }
-            }
-            data.richText.Append(content.Substring(index, content.Length - index));
-        }
-        if (data.type == ChatInfoType.Friend)
-        {
-            return true;
-        }
-        if (data.content.Equals(string.Empty))
-        {
-            return true;
-        }
-        return !chatOpenDics[data.type];
-    }
-    public Dictionary<ChatInfoType, bool> GetChatOpen()
-    {
-        return chatOpenDics;
-    }
-
-    #region 缁勯槦閭�璇�
-    private const string INVITE_IDENTIFY = "<i>";
-    public static Regex InviteRegex = new Regex(@INVITE_IDENTIFY, RegexOptions.Singleline);
-    public void SendInvite(string msg)
-    {
-        SendChatInfo(ChatInfoType.World, StringUtility.Contact(msg, INVITE_IDENTIFY));
-    }
-    public bool IsInviteChat(string msg)
-    {
-        return InviteRegex.IsMatch(msg);
-    }
-    #endregion
-
-    #region 鍙戦�佺墿鍝�
-    public List<ItemModel> itemPlaceList = new List<ItemModel>();
-    public bool IsItemChat(string msg)
-    {
-        return HrefAnalysis.EquipDetailRegex.IsMatch(msg);
-    }
-    public string CheckHasItem(string msg, ChatCenter.RecentlyChat _recently)
-    {
-        return string.Empty;
-        // if (!HrefAnalysis.EquipRegex.IsMatch(msg))
-        // {
-        //     return msg;
-        // }
-        // sb.Length = 0;
-        // MatchCollection matchArray = HrefAnalysis.EquipRegex.Matches(msg);
-        // int index = 0;
-        // for (int i = 0; i < matchArray.Count; i++)
-        // {
-        //     sb.Append(msg.Substring(index, matchArray[i].Index - index));
-        //     if (ChatCenter.Instance.recentlyChat != null)
-        //     {
-        //         if (i < ChatCenter.Instance.recentlyChat.itemIndexs.Count)
-        //         {
-        //             var _index = ChatCenter.Instance.recentlyChat.itemIndexs[i];
-        //             sb.Append(" ");
-        //             sb.Append(ChatCenter.Instance.recentlyChat.itemInfos[_index]);
-        //             sb.Append(" ");
-        //         }
-        //         index = matchArray[i].Index + matchArray[i].Length;
-        //         continue;
-        //     }
-        //     var _length = sb.Length;
-        //     if (i < itemPlaceList.Count)
-        //     {
-        //         var itemConfig = ItemConfig.Get((int)itemPlaceList[i].itemId);
-        //         if (itemConfig.ItemName == matchArray[i].Groups[1].Value)
-        //         {
-        //             bool equip = itemPlaceList[i].packType == PackType.Equip;
-
-        //             sb.Append("#item#");
-        //             AppendValue(sb, itemPlaceList[i].itemId);
-        //             AppendValue(sb, itemPlaceList[i].count);
-        //             AppendValue(sb, equip ? 1 : 0);
-        //             AppendValue(sb, itemPlaceList[i].itemInfo.userData);
-
-        //             if (equip)
-        //             {
-        //                 var position = new Int2(itemConfig.LV, itemConfig.EquipPlace);
-
-        //                 int[] equipGems;
-        //                 equipGemModel.TryGetEquipGems(itemPlaceList[i].gridIndex, out equipGems);
-        //                 for (int j = 0; j < EquipGemModel.EQUIPGEM_HOLE_COUNT; j++)
-        //                 {
-        //                     AppendValue(sb, equipGems != null && j < equipGems.Length ? equipGems[j] : 0);
-        //                 }
-
-        //                 var strengthLevel = equipStrengthModel.GetStrengthLevel(itemConfig.LV, itemConfig.EquipPlace);
-        //                 AppendValue(sb, strengthLevel);
-
-        //                 var starLevel = equipStarModel.GetEquipStarLevel(new Int2(itemConfig.LV, itemConfig.EquipPlace));
-        //                 AppendValue(sb, starLevel);
-
-        //                 var evolveLevel = equipStrengthModel.GetStrengthEvolveLevel(position.x, position.y);
-        //                 AppendValue(sb, evolveLevel);
-
-        //                 AppendValue(sb, equipTrainModel.GetTrainLevel(position));
-
-        //                 var property = equipTrainModel.GetTrainedProperties(position);
-        //                 AppendValue(sb, property.x);
-        //                 AppendValue(sb, property.y);
-        //                 AppendValue(sb, property.z);
-
-        //                 for (int place = 1; place <= 12; place++)
-        //                 {
-        //                     if (place > 8)
-        //                     {
-        //                         continue;
-        //                     }
-        //                     var equipGuid = equipModel.GetEquip(new Int2(position.x, place));
-        //                     if (!string.IsNullOrEmpty(equipGuid))
-        //                     {
-        //                         var equipItem = packManager.GetItemByGuid(equipGuid);
-        //                         if (equipItem.config.SuiteiD > 0)
-        //                         {
-        //                             AppendValue(sb, place);
-        //                             continue;
-        //                         }
-        //                     }
-        //                     AppendValue(sb, 0);
-        //                 }
-
-        //                 AppendValue(sb, equipModel.GetSuitLevel(itemConfig.LV, EquipSuitType.TwoSuit));
-        //                 AppendValue(sb, equipModel.GetSuitLevel(itemConfig.LV, EquipSuitType.FiveSuit));
-        //                 AppendValue(sb, equipModel.GetSuitLevel(itemConfig.LV, EquipSuitType.EightSuit));
-
-        //                 for (int place = 1; place <= 8; place++)
-        //                 {
-        //                     var equipGuid = equipModel.GetEquip(new Int2(position.x, place));
-        //                     if (!string.IsNullOrEmpty(equipGuid))
-        //                     {
-        //                         var equipItem = packManager.GetItemByGuid(equipGuid);
-        //                         if (ItemLogicUtility.Instance.IsSuitEquip(equipItem.itemId))
-        //                         {
-        //                             AppendValue(sb, equipStarModel.GetStarLevel(new Int2(position.x, place)));
-        //                         }
-        //                         else
-        //                         {
-        //                             AppendValue(sb, -1);
-        //                         }
-        //                     }
-        //                     else
-        //                     {
-        //                         AppendValue(sb, -1);
-        //                     }
-        //                 }
-        //             }
-
-        //             sb.Remove(sb.Length - 1, 1);
-        //             sb.Append("#item#");
-
-        //             if (_recently != null)
-        //             {
-        //                 _recently.Add(itemConfig.ItemName, sb.ToString().Substring(_length));
-        //             }
-        //         }
-        //         else
-        //         {
-        //             sb.Append(matchArray[i].Value);
-        //         }
-        //     }
-        //     else
-        //     {
-        //         sb.Append(matchArray[i].Value);
-        //     }
-        //     index = matchArray[i].Index + matchArray[i].Length;
-        // }
-        // sb.Append(msg.Substring(index, msg.Length - index));
-        // return sb.ToString();
-    }
-
-    void AppendValue(StringBuilder sb, object _object)
-    {
-        sb.Append(_object);
-        sb.Append('|');
-    }
-    #endregion
-
-    #region 濂藉弸绉佽亰
-    public static Regex KillRegex = new Regex(@KILL_IDENTIFY, RegexOptions.Singleline);
-    public const string KILL_IDENTIFY = "<k>";
-    public void SendFriendChat(string msg, int player)
-    {
-        C0209_tagCTalkMiFix chatPack = new C0209_tagCTalkMiFix();
-        chatPack.TalkType = 1;
-        chatPack.PlayerID = (uint)player;
-        chatPack.Len = (ushort)GetUTF8InfoLen(msg);
-        chatPack.Content = msg;
-        GameNetSystem.Instance.SendInfo(chatPack);
-    }
-    #endregion
-    /// <summary>
-    /// 娓呭睆
-    /// </summary>
-    public void ClearAllChatInfo()
-    {
-        chatDics.Clear();
-        chatlist.Clear();
-        chatUpList.Clear();
-        pteChatDics.Clear();
-        if (OnRefreshChat != null)
-        {
-            OnRefreshChat(presentChatType);
-        }
-    }
-
-    public void ClearChatInfo(ChatInfoType type)
-    {
-        List<ChatData> list = null;
-        if (chatDics.TryGetValue(type, out list))
-        {
-            list.Clear();
-            if (OnRefreshChat != null)
-            {
-                OnRefreshChat(type);
-            }
-        }
-    }
 
     public static int GetUTF8InfoLen(string msg)
     {
         return Encoding.UTF8.GetBytes(msg).Length;
     }
 
-    public void CloseChatBtnClick()
+    public bool TryGetBubble(int id, out ChatBubbleData bubble)
     {
-        if (OnClickCloseChatEvent != null)
-        {
-            OnClickCloseChatEvent();
-        }
+        return chatBubbles.TryGetValue(id, out bubble);
     }
 
-    public bool IsExtentOpen { get; set; }
-    public void OpenChatExtent(bool open)
+    void ParseChatBubbleConfig()
     {
-        if (OnChatExtentOpenEvent != null)
+        var configs = ChatBubbleBoxConfig.GetValues();
+        for (int i = 0; i < configs.Count; i++)
         {
-            OnChatExtentOpenEvent(open);
-        }
-    }
-
-    #region 闄岀敓浜鸿亰澶�
-    public event Action OpenPteChatEvent;
-    public void OpenFriendWin()
-    {
-        if (OpenPteChatEvent != null)
-        {
-            OpenPteChatEvent();
-        }
-    }
-    #endregion
-
-    #region 涓荤晫闈㈣亰澶╅閬撴樉绀鸿缃�
-    public void SetChatChannelShow(ChatInfoType type, bool open)
-    {
-        if (chatOpenDics.ContainsKey(type))
-        {
-            chatOpenDics[type] = open;
-        }
-    }
-
-    public void GetChatChannelShow()
-    {
-        chatOpenDics[ChatInfoType.World] = ChatSetting.Instance.GetBool(ChatBoolType.ChannelWorld);
-        chatOpenDics[ChatInfoType.Area] = ChatSetting.Instance.GetBool(ChatBoolType.ChannelArea);
-        chatOpenDics[ChatInfoType.Fairy] = ChatSetting.Instance.GetBool(ChatBoolType.ChannelGrad);
-        chatOpenDics[ChatInfoType.Invite] = ChatSetting.Instance.GetBool(ChatBoolType.ChannelATeam);
-        chatOpenDics[ChatInfoType.System] = ChatSetting.Instance.GetBool(ChatBoolType.ChannelSystem);
-        chatOpenDics[ChatInfoType.Team] = ChatSetting.Instance.GetBool(ChatBoolType.ChannelTeam);
-        chatOpenDics[ChatInfoType.Trumpet] = ChatSetting.Instance.GetBool(ChatBoolType.ChannelBugle);
-        chatOpenDics[ChatInfoType.CrossServer] = true;
-        chatOpenDics[ChatInfoType.default1] = true;
-    }
-    #endregion
-
-    #region 鏃ュ父璺宠浆
-    private string[] realmRandomChats = new string[2] { "DailyQuestRealmTalk1", "DailyQuestRealmTalk2" };
-    private string[] dungeonRandomChats = new string[2] { "DailyQuestAssitmTalk1", "DailyQuestAssitmTalk2" };
-    public bool openFromDaily { get; set; }
-    public string GetAssitRandomChat(ChatInfoType _type)
-    {
-        int _index = UnityEngine.Random.Range(0, 2);
-        switch (_type)
-        {
-            case ChatInfoType.World:
-                if (_index == 0)
-                {
-                    return Language.Get(dungeonRandomChats[0]);
-                }
-                else
-                {
-                    return Language.Get(dungeonRandomChats[1], PlayerDatas.Instance.baseData.FightPower);
-                }
-            case ChatInfoType.Fairy:
-                return Language.Get(realmRandomChats[_index]);
-        }
-        return string.Empty;
-    }
-
-    public bool openFromFairyTask { get; set; }
-    Dictionary<int, List<string>> m_TaskRandomChats = new Dictionary<int, List<string>>();
-    public string GetTaskRandomChat(ChatInfoType _type)
-    {
-        if (m_TaskRandomChats.ContainsKey((int)_type))
-        {
-            var list = m_TaskRandomChats[(int)_type];
-            var index = UnityEngine.Random.Range(0, list.Count);
-            return Language.Get(list[index]);
-        }
-        return string.Empty;
-    }
-
-    public bool needCheckAssitChat { get; set; }
-    public int IsAssitChat(string message, bool force = false)
-    {
-        int assitChat = 0;
-        if (needCheckAssitChat || force)
-        {
-            for (int i = 0; i < 2; i++)
+            var config = configs[i];
+            if (chatBubbles.ContainsKey(config.ID))
             {
-                if (message.Equals(Language.Get(realmRandomChats[i])))
+                continue;
+            }
+            var bubble = new ChatBubbleData();
+            bubble.id = config.ID;
+            bubble.leftPadding = new RectOffset()
+            {
+                left = config.LeftOffset.Length > 0 ? config.LeftOffset[0] : 0,
+                right = config.LeftOffset.Length > 1 ? config.LeftOffset[1] : 0,
+                top = config.LeftOffset.Length > 2 ? config.LeftOffset[2] : 0,
+                bottom = config.LeftOffset.Length > 3 ? config.LeftOffset[3] : 0,
+            };
+            bubble.rifhtPadding = new RectOffset()
+            {
+                left = config.RightOffset.Length > 0 ? config.RightOffset[0] : 0,
+                right = config.RightOffset.Length > 1 ? config.RightOffset[1] : 0,
+                top = config.RightOffset.Length > 2 ? config.RightOffset[2] : 0,
+                bottom = config.RightOffset.Length > 3 ? config.RightOffset[3] : 0,
+            };
+            bubble.myColor = new Color32()
+            {
+                r = (byte)(config.MyColor.Length > 0 ? config.MyColor[0] : 0),
+                g = (byte)(config.MyColor.Length > 1 ? config.MyColor[1] : 0),
+                b = (byte)(config.MyColor.Length > 2 ? config.MyColor[2] : 0),
+                a = (byte)(config.MyColor.Length > 3 ? config.MyColor[3] : 255),
+            };
+            bubble.otherColor = new Color32()
+            {
+                r = (byte)(config.OtherColor.Length > 0 ? config.OtherColor[0] : 0),
+                g = (byte)(config.OtherColor.Length > 1 ? config.OtherColor[1] : 0),
+                b = (byte)(config.OtherColor.Length > 2 ? config.OtherColor[2] : 0),
+                a = (byte)(config.OtherColor.Length > 3 ? config.OtherColor[3] : 255),
+            };
+            bubble.top = config.Top;
+            chatBubbles.Add(config.ID, bubble);
+        }
+    }
+    public bool SatisfyNameLength(string name, out int error)
+    {
+        error = 0;
+        int length = Encoding.Default.GetBytes(name).Length;
+        int maxlength = characterLimit;  //绾腑鏂囧瓧鏁�
+        //var minlength = 3;
+        if (length > maxlength)
+        {
+            error = 1;
+        }
+        // else if (length < minlength)
+        // {
+        //     error = 2;
+        // }
+        return error == 0;
+    }
+    public bool CheckChatLimit(string info, out int errorCode)
+    {
+        errorCode = 0;
+        if (string.IsNullOrEmpty(info))
+        {
+            errorCode = 0;
+            return false;
+        }
+
+        if (!SatisfyNameLength(info, out errorCode))
+        {
+            return false;
+        }
+
+        if (DirtyWordConfig.IsDirtWord(info) || UIHelper.HasSpecialCharac(info)
+            || DirtyNameConfig.IsDirtName(info))
+        {
+            errorCode = 3;
+            return false;
+        }
+        return true;
+    }
+
+    public void ShowChatErrorTip(int _errorCode)
+    {
+        switch (_errorCode)
+        {
+            case 0:
+                //绌�
+                SysNotifyMgr.Instance.ShowTip("ChatInfoNoNull");
+                break;
+            case 1:
+                // 闀垮害杩囬暱
+                SysNotifyMgr.Instance.ShowTip("NameError2", 7);
+                break;
+            case 3:
+                // 鑴忓瓧
+                SysNotifyMgr.Instance.ShowTip("NameSensitive");
+                break;
+        }
+    }
+
+
+    public int GetJumpIndex(ChatChannel type)
+    {
+        if (!TryGetTalkData(type, out List<TalkData> datas))
+            return 0;
+        return Mathf.Max(datas.Count - 1, 0);
+    }
+
+    public bool IsValidChatChannel(int channelType)
+    {
+        return Enum.IsDefined(typeof(ChatChannel), channelType);
+    }
+
+    public bool TryGetChatData(ChatChannel type, int index, out TalkData data)
+    {
+        data = null;
+        if (!TryGetTalkData(type, out List<TalkData> datas) || datas == null)
+            return false;
+        if (index < 0 || index >= datas.Count)
+            return false;
+        data = datas[index];
+        return true;
+    }
+
+    public bool TryGetTalkData(ChatChannel type, out List<TalkData> datas)
+    {
+        return talkDict.TryGetValue(type, out datas);
+    }
+
+    public void SendChatInfo(ChatChannel type, string content)
+    {
+        SendChatPack((int)type, content);
+    }
+    public void SendChatPack(int channelType, string content)
+    {
+        CB320_tagCSTalk pack = new CB320_tagCSTalk();
+        pack.ChannelType = (byte)channelType;
+        pack.Content = content;
+        pack.Len = (ushort)GetUTF8InfoLen(content);
+        GameNetSystem.Instance.SendInfo(pack);
+    }
+
+    public readonly int maxTalkCount = 1000;  //鑱婂ぉ鏁伴噺涓婇檺
+    public readonly int deleteTalkCount = 300;  //鑱婂ぉ鏁伴噺涓婇檺鏃跺垹闄ゅ墠澶氬皯鏉�
+
+    void TryDeleteTalkData(ChatChannel type)
+    {
+        if (!TryGetTalkData(type, out List<TalkData> datas))
+            return;
+        if (datas.Count < maxTalkCount)
+            return;
+        datas.RemoveRange(0, deleteTalkCount);
+    }
+
+    public int currentDay = -1;
+    public void AddTalkData(ChatChannel type, TalkData data)
+    {
+        //濡傛灉瓒呰繃闄愬埗鍏堝垹闄ゆ棫鏁版嵁
+        TryDeleteTalkData(type);
+        if (!TryGetTalkData(type, out List<TalkData> datas))
+        {
+            talkDict[type] = new List<TalkData>();
+        }
+        talkDict[type].Add(data);
+        OnUpdateTalkEvent?.Invoke(type, data);
+    }
+
+    public bool TryAddDate(int allSeconds, ChatChannel type)
+    {
+        DateTime talkTime = TimeUtility.GetTime((uint)allSeconds);
+        if (talkTime.Day != currentDay)
+        {
+            currentDay = talkTime.Day;
+            AddTalkData(type, new TalkData()
+            {
+                ChannelType = (byte)type,
+                isDate = true,
+                Content = Language.Get("Chat09", talkTime.Month, talkTime.Day),
+                TalkTime = (uint)allSeconds,
+            });
+            return true;
+        }
+        return false;
+    }
+
+    public void AddSysData(string msg, ArrayList infoList, ChatChannel type)
+    {
+        int allSeconds = TimeUtility.AllSeconds;
+        // 濡傛灉闅斿ぉ,澧炲姞鏃ユ湡琛�
+        TryAddDate(allSeconds, type);
+
+        if (!talkDict.ContainsKey(type))
+        {
+            talkDict[type] = new List<TalkData>();
+        }
+        AddTalkData(type, new TalkData()
+        {
+            ChannelType = (byte)type,
+            isSystem = true,
+            Content = msg,
+            BubbleBox = 1,
+            TalkTime = (uint)allSeconds,
+            InfoList = new ArrayList(infoList),
+        });
+    }
+
+    public void UpdateTalk(HB310_tagMCTalk vNetData)
+    {
+        if (!IsValidChatChannel(vNetData.ChannelType))
+            return;
+
+        ChatChannel type = (ChatChannel)vNetData.ChannelType;
+        if (!talkDict.ContainsKey(type))
+        {
+            talkDict[type] = new List<TalkData>();
+        }
+
+        int allSeconds = TimeUtility.AllSeconds;
+        // 濡傛灉闅斿ぉ,澧炲姞鏃ユ湡琛�
+        TryAddDate(allSeconds, type);
+
+        TalkData talkData = new TalkData()
+        {
+            ChannelType = vNetData.ChannelType,
+            Name = UIHelper.ServerStringTrim(vNetData.Name),
+            PlayerID = vNetData.PlayerID,
+            Content = UIHelper.ServerStringTrim(vNetData.Content),
+            BubbleBox = vNetData.BubbleBox,
+            LV = vNetData.LV,
+            RealmLV = vNetData.RealmLV,
+            TitleID = vNetData.TitleID,
+            Job = vNetData.Job,
+            Face = vNetData.Face,
+            FacePic = vNetData.FacePic,
+            ServerID = vNetData.ServerID,
+            TalkTime = (uint)allSeconds,
+        };
+        AddTalkData(type, talkData);
+    }
+
+    public void UpdateTalkCacheList(HB311_tagMCTalkCacheList vNetData)
+    {
+        if (!IsValidChatChannel(vNetData.ChannelType))
+            return;
+
+        ChatChannel type = (ChatChannel)vNetData.ChannelType;
+        if (!talkDict.ContainsKey(type))
+        {
+            talkDict[type] = new List<TalkData>();
+        }
+
+        if (vNetData.InfoList.IsNullOrEmpty())
+            return;
+
+        foreach (var info in vNetData.InfoList)
+        {
+            // 濡傛灉闅斿ぉ,澧炲姞鏃ユ湡琛�
+            TryAddDate((int)info.TalkTime, type);
+            AddTalkData(type, new TalkData()
+            {
+                ChannelType = vNetData.ChannelType,
+                Name = info.Name,
+                PlayerID = info.PlayerID,
+                Content = info.Content,
+                BubbleBox = info.BubbleBox,
+                LV = info.LV,
+                Job = info.Job,
+                RealmLV = info.RealmLV,
+                TitleID = info.TitleID,
+                Face = info.Face,
+                FacePic = info.FacePic,
+                ServerID = info.ServerID,
+                TalkTime = info.TalkTime,
+            });
+        }
+        OnUpdateTalkCacheListEvent?.Invoke();
+    }
+    #region 鏍囩椤�
+    // 褰撳墠灞曠ず鐨勯閬撳叆鍙�
+    private ChatTab m_NowChatTab;
+    public ChatTab nowChatTab
+    {
+        get { return m_NowChatTab; }
+        set
+        {
+            if (m_NowChatTab == value)
+                return;
+            m_NowChatTab = value;
+            OnChatTabChangeEvent?.Invoke(value);
+        }
+    }
+
+    public event Action<ChatTab> OnChatTabChangeEvent;
+
+    // 棰戦亾鍏ュ彛鐨勫睍绀洪『搴�
+    public readonly List<ChatTab> tabShowList = new List<ChatTab>()
+    {
+        ChatTab.World,
+        ChatTab.Guild,
+        // ChatTab.Person,
+        // ChatTab.BlackList,
+    };
+
+    public bool IsTabOpen(ChatTab chatTab, bool isTip = false)
+    {
+        if (!tabShowList.Contains(chatTab))
+            return false;
+
+        switch (chatTab)
+        {
+            case ChatTab.World:
+                return true;
+            case ChatTab.Guild:
+                //娌℃湁鍏細
+                if (!PlayerDatas.Instance.fairyData.HasFairy)
                 {
-                    assitChat = 1;
-                    break;
+                    if (isTip)
+                        SysNotifyMgr.Instance.ShowTip("NoGuild");
+                    return false;
                 }
-                if (message.Equals(Language.Get(dungeonRandomChats[i])))
-                {
-                    assitChat = 2;
-                    break;
-                }
+                return true;
+            default:
+                return false;
+        }
+    }
+
+    public bool IsSelectChatTab(ChatTab chatTab)
+    {
+        return nowChatTab == chatTab;
+    }
+
+    public bool IsValidChatTab(int chatTab)
+    {
+        return Enum.IsDefined(typeof(ChatTab), chatTab);
+    }
+
+    public string GetChatTabName(ChatTab chatTab)
+    {
+        return Language.Get(StringUtility.Contact("ChatTab", (int)chatTab));
+    }
+
+    public string GetChatTabSelectIcon(ChatTab chatTab, bool isSelect)
+    {
+        return StringUtility.Contact(isSelect ? "ChatTabSelect" : "ChatTabUnSelect", (int)chatTab);
+    }
+    #endregion
+    #region 寮瑰箷璁剧疆
+
+    private Dictionary<ChatChannel, bool> bulletSettingDict = new Dictionary<ChatChannel, bool>();
+
+    private string settingsKey { get { return StringUtility.Contact("BulletChatSettings_", PlayerDatas.Instance.PlayerId); } }
+
+    // 璁剧疆鐗瑰畾棰戦亾鐨勫脊骞曞紑鍏崇姸鎬�
+    public void SetBulletSetting(ChatChannel channelType, bool isEnabled)
+    {
+        bulletSettingDict[channelType] = isEnabled;
+        SaveBulletSettings();
+    }
+
+    // 鑾峰彇鐗瑰畾棰戦亾鐨勫脊骞曞紑鍏崇姸鎬�
+    public bool GetBulletSetting(ChatChannel channelType)
+    {
+        if (bulletSettingDict.TryGetValue(channelType, out bool value))
+        {
+            return value;
+        }
+        return true;
+    }
+
+    // 淇濆瓨寮瑰箷璁剧疆鍒版湰鍦�
+    private void SaveBulletSettings()
+    {
+        Dictionary<int, int> saveDict = new Dictionary<int, int>();
+        foreach (var kvp in bulletSettingDict)
+        {
+            saveDict[(int)kvp.Key] = kvp.Value ? 1 : 0;
+        }
+        string jsonStr = JsonMapper.ToJson(saveDict);
+        LocalSave.SetString(settingsKey, jsonStr);
+    }
+
+    // 浠庢湰鍦拌鍙栧脊骞曡缃�
+    private void LoadBulletSettings()
+    {
+        bulletSettingDict.Clear();
+
+        // 浣跨敤 LocalSave 璇诲彇 JSON 瀛楃涓�
+        string jsonStr = LocalSave.GetString(settingsKey);
+
+        if (string.IsNullOrEmpty(jsonStr) || jsonStr == "{}")
+        {
+            // 濡傛灉娌℃湁淇濆瓨鐨勬暟鎹紝璁剧疆榛樿鍊�
+            InitializeDefaultBulletSettings();
+            return;
+        }
+
+        Dictionary<int, int> loadDict = ConfigParse.ParseIntDict(jsonStr);
+        foreach (var kvp in loadDict)
+        {
+            if (Enum.IsDefined(typeof(ChatChannel), kvp.Key))
+            {
+                bulletSettingDict[(ChatChannel)kvp.Key] = kvp.Value == 1;
             }
         }
-        return assitChat;
+    }
+
+    // 鍒濆鍖栭粯璁ゅ脊骞曡缃� 榛樿鎵�鏈夐閬撳紑鍚�
+    private void InitializeDefaultBulletSettings()
+    {
+        foreach (ChatChannel channelType in Enum.GetValues(typeof(ChatChannel)))
+        {
+            bulletSettingDict[channelType] = true;
+        }
+        SaveBulletSettings();
     }
     #endregion
 
-    #region 瀹濈煶鐐��璺宠浆
-    public bool openFromGem { get; set; }
-    public int flauntGemId { get; set; }
-    public bool flauntGemBind { get; set; }
-    public string GetGemFlauntChat()
-    {
-        var config = ItemConfig.Get(flauntGemId);
-        if (config != null)
-        {
-            var itemInfo = new ItemInfo();
-            itemInfo.itemId = flauntGemId;
-            var item = new ItemModel(PackType.Item, itemInfo);
-            var tip = string.Format("[{0}]", config.ItemName);
-            itemPlaceList.Add(item);
-            return Language.Get("GemLookTalk", tip);
-        }
-        return string.Empty;
-    }
-    #endregion
-
-    #region 浠欑紭绾㈢偣
-    Dictionary<ChatInfoType, Redpoint> chatSocialRedpoints = new Dictionary<ChatInfoType, Redpoint>();
-    Dictionary<ChatInfoType, int> unReadChatCounts = new Dictionary<ChatInfoType, int>();
-    public void InitChatRedpoints()
-    {
-        chatSocialRedpoints.Add(ChatInfoType.Fairy, new Redpoint(MainRedDot.RedPoint_FriendChatKey, 2502));
-        chatSocialRedpoints.Add(ChatInfoType.Team, new Redpoint(MainRedDot.RedPoint_FriendChatKey, 2503));
-        unReadChatCounts.Add(ChatInfoType.Fairy, 0);
-        unReadChatCounts.Add(ChatInfoType.Team, 0);
-    }
-
-    public void ViewChat(ChatInfoType type)
-    {
-        if (unReadChatCounts.ContainsKey(type))
-        {
-            unReadChatCounts[type] = 0;
-            UpdateRedpoint(type);
-        }
-    }
-
-    void ReceiveNewChat(ChatInfoType type)
-    {
-        // TODO YYL
-        // switch (type)
-        // {
-        //     case ChatInfoType.Team:
-        //         if (!UIManager.Instance.IsOpened<TeamChatWin>()
-        //             && (!UIManager.Instance.IsOpened<ChatWin>() || presentChatType != ChatInfoType.Team))
-        //         {
-        //             unReadChatCounts[ChatInfoType.Team] = Mathf.Min(unReadChatCounts[ChatInfoType.Team] + 1, 99);
-        //         }
-        //         break;
-        //     case ChatInfoType.Fairy:
-        //         if (!UIManager.Instance.IsOpened<FairyChatWin>()
-        //             && (!UIManager.Instance.IsOpened<ChatWin>() || presentChatType != ChatInfoType.Fairy))
-        //         {
-        //             unReadChatCounts[ChatInfoType.Fairy] = Mathf.Min(unReadChatCounts[ChatInfoType.Fairy] + 1, 99);
-        //         }
-        //         break;
-        // }
-        UpdateRedpoint(type);
-    }
-
-    public void UpdateRedpoint(ChatInfoType type)
-    {
-        if (chatSocialRedpoints.ContainsKey(type))
-        {
-            var redpoint = chatSocialRedpoints[type];
-            if (unReadChatCounts[type] > 0)
-            {
-                redpoint.state = RedPointState.Quantity;
-                redpoint.count = unReadChatCounts[type];
-            }
-            else
-            {
-                redpoint.state = RedPointState.None;
-            }
-        }
-        var socialRed = MainRedDot.Instance.redPointFriendChat;
-        if (chatSocialRedpoints[ChatInfoType.Fairy].state == RedPointState.Quantity
-            || chatSocialRedpoints[ChatInfoType.Team].state == RedPointState.Quantity)
-        {
-            socialRed.count = unReadChatCounts[ChatInfoType.Fairy] > 0 ?
-                unReadChatCounts[ChatInfoType.Fairy] : unReadChatCounts[ChatInfoType.Team];
-        }
-        else
-        {
-            socialRed.count = 0;
-        }
-    }
-
-    public RedPointState GetSocialChatRedpoint(ChatInfoType type)
-    {
-        if (chatSocialRedpoints.ContainsKey(type))
-        {
-            return chatSocialRedpoints[type].state;
-        }
-        return RedPointState.None;
-    }
-    #endregion
-
-    #region 鍗忓姪鎰熻阿
-    public void SendThank2AssistPlayer(int playerId)
-    {
-        // TODO YYL
-        // if (PlayerDatas.Instance.baseData.LV >= assistThankLevelLimit.x)
-        // {
-        //     return;
-        // }
-        // var assistPlayerInfo = dungeonAssistModel.GetAssistPlayerInfo(playerId);
-        // if (assistPlayerInfo != null)
-        // {
-        //     if (assistPlayerInfo.LV >= assistThankLevelLimit.y)
-        //     {
-        //         return;
-        //     }
-        // }
-        // var languageKeyIndex = UnityEngine.Random.Range(0, assistThankLanguages.Count);
-        // if (assistThankLanguages.Count > 0)
-        // {
-        //     SendFriendChat(Language.Get(assistThankLanguages[languageKeyIndex]), playerId);
-        // }
-    }
-    #endregion
 }
-public struct ChatExtraData
+
+public enum ChatTab
 {
-    public int infoint1;
-    public ChatExtraData(int info1)
-    {
-        this.infoint1 = info1;
-    }
-
-    public static ChatExtraData Default {
-        get {
-            return new ChatExtraData(0);
-        }
-    }
+    World = 0,      //涓栫晫
+    Guild = 1,      //鍏細      
+    Person = 2,     //绉佽亰
+    BlackList = 3,  //榛戝悕鍗�
 }
-
-public enum ChatInfoType
+public enum ChatChannel
 {
-    System,//绯荤粺娑堟伅
-    World, //涓栫晫棰戦亾
-    Area,  //鍖哄煙棰戦亾
-    Team,  //闃熶紞
-    Invite,//缁勯槦
-    Trumpet,//鍠囧彮
-    Fairy,//浠欑洘
-    Friend,//绉佽亰
-    CrossServer,//璺ㄦ湇
-    FairyQuestion,
-    FairyTip,
-    TeamTip,
-
-    //鍚庣画IL寮�鍙戞坊鍔犻璁�
-    default1,   //闃佃惀锛堝湪璺ㄦ湇鍦板浘寰�璺ㄦ湇鍙戯級
-    default2,   //闃佃惀淇℃伅鎻愮ず
-    default3,
-    default4,
-    default5,
-    default6,
-    default7,
-    default8,
-    default9,
-    default10,
+    World = 0,          //涓栫晫
+    CrossServer = 1,    //璺ㄦ湇
+    Area = 2,           // 鍖哄煙
+    Guild = 3,          // 鍏細
+    Friend = 4,             // 濂藉弸
+    Team = 5,               //闃熶紞
+    Person = 6,             //绉佽亰
 }
+public class ChatBubbleData
+{
+    public int id;
+    public RectOffset leftPadding;
+    public RectOffset rifhtPadding;
+    public Color32 myColor;
+    public Color32 otherColor;
+    public int top;
+}
+
+public class TalkData
+{
+    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;
+    public uint BubbleBox;    //鑱婂ぉ姘旀场妗�
+    public ushort LV;    //绛夌骇
+    public byte Job;    //鑱屼笟
+    public byte RealmLV;    //澧冪晫
+    public uint TitleID;    //绉板彿
+    public uint Face;    //鍩烘湰鑴稿瀷
+    public uint FacePic;    //澶村儚妗�
+    public uint ServerID;    //鎵�灞炲尯鏈岻D
+    public uint TalkTime;        //璇ヨ亰澶╁彂閫佹椂闂存埑
+    public ArrayList InfoList;     //闄勫姞淇℃伅
+}
\ No newline at end of file

--
Gitblit v1.8.0