From 8331b2adfe9c841a345b6ab0b2ec0ebf31a66f0d Mon Sep 17 00:00:00 2001
From: yyl <yyl>
Date: 星期二, 27 五月 2025 16:35:11 +0800
Subject: [PATCH] 18 子 2D卡牌客户端搭建 / 2D卡牌客户端搭建

---
 Main/NetworkPackage/ClientPack/ClientToGameServer/C02_PlayerTalk.meta                                           |    8 
 Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA230_tagCMSetChatBubbleBox.cs                |   18 
 Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA204_tagCMOpenLongWarehouse.cs               |   16 
 Main/Config/PartialConfigs/DirtyWordConfig.cs                                                                   |  273 +++
 Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA223_tagCMNPCShowEnd.cs.meta                 |   12 
 Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA224_tagCMTouchNPC.cs                        |   21 
 Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA210_tagCMClearFBCD.cs.meta                  |   12 
 Main/NetworkPackage/ServerPack/HA9_Function/HA9A3_tagGCPYSpeakerContent.cs.meta                                 |   11 
 Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA223_tagCMNPCShowEnd.cs                      |   20 
 Main/NetworkPackage/ServerPack/H02_PlayerTalk/H0207_tagTalkArea.cs.meta                                         |   11 
 Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA226_tagCMVoiceChat.cs                       |   28 
 Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA230_tagCMSetChatBubbleBox.cs.meta           |   12 
 Main/NetworkPackage/ClientPack/ClientToGameServer/C02_PlayerTalk/C0208_tagCTalkCountry.cs.meta                  |   12 
 Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA235_tagCMSelectRealmDifficulty.cs.meta      |   11 
 Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA232_tagCMRefreshMysticalShop.cs             |   19 
 Main/NetworkPackage/ServerPack/HA9_Function.meta                                                                |    8 
 Main/NetworkPackage/ServerPack/H02_PlayerTalk/H0206_tagTalkMi.cs.meta                                           |   11 
 Main/NetworkPackage/ServerPack/HA7_Interaction/HA707_tagMCPyTalk.cs                                             |   31 
 Main/System/Chat/ChatFriendCell.cs.meta                                                                         |   11 
 Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA217_tagCMPYSpeaker.cs                       |   26 
 Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA212_tagCMViewPlayerInfo.cs                  |   23 
 Main/Manager/GameSystemManager/ChatManager.cs                                                                   | 1464 +++++++++++++++++
 Main/System/Chat/ChatFriendCell.cs                                                                              |   48 
 Main/Utility/LanguageVerify.cs.meta                                                                             |   11 
 Main/NetworkPackage/ServerPack/HB3_PlayerSocial.meta                                                            |    8 
 Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA236_tagCMChatBubbleBoxStarUP.cs.meta        |   11 
 Main/NetworkPackage/ClientPack/ClientToGameServer/C02_PlayerTalk/C0201_tagCTalkGong.cs                          |   35 
 Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA224_tagCMTouchNPC.cs.meta                   |   12 
 Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA227_tagCMQueryNPCCntInfo.cs.meta            |   12 
 Main/Manager/GameSystemManager/ChatCenter.cs                                                                    |  551 ++++++
 Main/NetworkPackage/ClientPack/ClientToGameServer/C02_PlayerTalk/C0207_tagCTalkArea.cs.meta                     |   12 
 Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA221_tagCMGetRunTaskEndAward.cs              |   18 
 Main/NetworkPackage/ServerPack/H32_GM/H3202_tagServerResponse.cs                                                |   35 
 Main/NetworkPackage/ClientPack/ClientToGameServer/C02_PlayerTalk/C0203_tagCTalkBang.cs                          |   35 
 Main/NetworkPackage/ClientPack/ClientToGameServer/C02_PlayerTalk/C0208_tagCTalkCountry.cs                       |   19 
 Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA225_tagCMClientTaskCount.cs                 |   20 
 Main/NetworkPackage/ServerPack/H02_PlayerTalk/H0208_tagTalkCountry.cs.meta                                      |   11 
 Main/NetworkPackage/ClientPack/ClientToGameServer/C02_PlayerTalk/C0207_tagCTalkArea.cs                          |   19 
 Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction.meta                                          |    8 
 Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA202_tagCMSelectObj.cs.meta                  |   12 
 Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA217_tagCMPYSpeaker.cs.meta                  |   12 
 Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA236_tagCMChatBubbleBoxStarUP.cs             |   18 
 Main/Config/PartialConfigs.meta                                                                                 |    8 
 Main/NetworkPackage/ClientPack/ClientToGameServer/C02_PlayerTalk/C0209_tagCTalkMiFix.cs.meta                    |   12 
 Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA235_tagCMSelectRealmDifficulty.cs           |   18 
 Main/NetworkPackage/ServerPack/HA7_Interaction/HA707_tagMCPyTalk.cs.meta                                        |   11 
 Main/NetworkPackage/ServerPack/HA9_Function/HA9A3_tagGCPYSpeakerContent.cs                                      |   35 
 Main/NetworkPackage/ServerPack/H02_PlayerTalk/H0208_tagTalkCountry.cs                                           |   29 
 Main/NetworkPackage/ClientPack/ClientToGameServer/C02_PlayerTalk/C0206_tagCTalkMi.cs.meta                       |   12 
 Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA222_tagCMSetGuideOK.cs                      |   23 
 Main/System/SystemSetting/ChatSetting.cs                                                                        |  184 ++
 Main/NetworkPackage/ServerPack/H02_PlayerTalk/H0206_tagTalkMi.cs                                                |   37 
 Main/NetworkPackage/ServerPack/H02_PlayerTalk/H0207_tagTalkArea.cs                                              |   29 
 Main/NetworkPackage/ServerPack/HA7_Interaction.meta                                                             |    8 
 Main/NetworkPackage/ClientPack/ClientToGameServer/C02_PlayerTalk/C0206_tagCTalkMi.cs                            |   47 
 Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA201_tagCMQueryNPCShopItem.cs                |   18 
 Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA221_tagCMGetRunTaskEndAward.cs.meta         |   12 
 Main/System/Message/SysNotifyMgr.cs                                                                             |    8 
 Main/Config/PartialConfigs/DirtyWordConfig.cs.meta                                                              |   11 
 Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA231_tagCMClientStartCustomScene.cs          |   25 
 Main/System/Chat/LocalChatHistory.cs                                                                            |  324 +++
 Main/System/Chat/ChatFriend.cs                                                                                  |  147 +
 Main/NetworkPackage/ClientPack/ClientToGameServer/C02_PlayerTalk/C0209_tagCTalkMiFix.cs                         |   23 
 Main/NetworkPackage/ClientPack/ClientToGameServer/C02_PlayerTalk/C0201_tagCTalkGong.cs.meta                     |   12 
 Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA233_tagCMClientExitCustomScene.cs.meta      |   12 
 Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA201_tagCMQueryNPCShopItem.cs.meta           |   12 
 Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA234_tagCMGetCustomSceneCollectAward.cs      |   18 
 Main/NetworkPackage/ServerPack/H02_PlayerTalk/H0203_tagTalkBang.cs                                              |   29 
 Main/System/Chat/ChatFriendTipCell.cs.meta                                                                      |   11 
 Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA216_tagCMPyTalk.cs.meta                     |   11 
 Main/System/Chat/ChatItemCell.cs.meta                                                                           |   11 
 Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA222_tagCMSetGuideOK.cs.meta                 |   12 
 Main/NetworkPackage/ServerPack/H02_PlayerTalk/H0205_tagTalkDui.cs                                               |   29 
 Main/NetworkPackage/ServerPack/H32_GM/H3202_tagServerResponse.cs.meta                                           |    8 
 Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA226_tagCMVoiceChat.cs.meta                  |   12 
 Main/NetworkPackage/ServerPack/H02_PlayerTalk/H0201_tagTalkGong.cs                                              |   55 
 Main/Manager/GameSystemManager/ChatCenter.cs.meta                                                               |   11 
 Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA232_tagCMRefreshMysticalShop.cs.meta        |   12 
 Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA233_tagCMClientExitCustomScene.cs           |   16 
 Main/NetworkPackage/ServerPack/HB3_PlayerSocial/HB311_tagGCTalkCache.cs                                         |   41 
 Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA225_tagCMClientTaskCount.cs.meta            |   12 
 Main/System/SystemSetting/ChatSetting.cs.meta                                                                   |   11 
 Main/NetworkPackage/ServerPack/HB3_PlayerSocial/HB311_tagGCTalkCache.cs.meta                                    |   12 
 Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA206_tagCMQuickFinishMission.cs              |   20 
 Main/NetworkPackage/ServerPack/H02_PlayerTalk/H0203_tagTalkBang.cs.meta                                         |   11 
 Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA202_tagCMSelectObj.cs                       |   25 
 Main/System/Chat/ChatData.cs                                                                                    |  142 
 Main/System/Chat/ChatItemCell.cs                                                                                |   16 
 Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA231_tagCMClientStartCustomScene.cs.meta     |   12 
 Main/NetworkPackage/ClientPack/ClientToGameServer/C02_PlayerTalk/C0205_tagCTalkDui.cs.meta                      |   12 
 Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA210_tagCMClearFBCD.cs                       |   18 
 Main/NetworkPackage/ServerPack/H02_PlayerTalk/H0205_tagTalkDui.cs.meta                                          |   11 
 Main/System/Debug/DebugController.cs                                                                            |    2 
 Main/Utility/LanguageVerify.cs                                                                                  |  236 ++
 Main/NetworkPackage/ClientPack/ClientToGameServer/C02_PlayerTalk/C0203_tagCTalkBang.cs.meta                     |   12 
 Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA234_tagCMGetCustomSceneCollectAward.cs.meta |   12 
 Main/NetworkPackage/ServerPack/H32_GM.meta                                                                      |    8 
 Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA206_tagCMQuickFinishMission.cs.meta         |   12 
 Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA216_tagCMPyTalk.cs                          |   22 
 Main/Manager/GameSystemManager/ChatManager.cs.meta                                                              |   11 
 Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA228_tagCMQueryFamilyBossHurt.cs             |   22 
 Main/NetworkPackage/ClientPack/ClientToGameServer/C02_PlayerTalk/C0205_tagCTalkDui.cs                           |   19 
 Main/System/Chat/LocalChatHistory.cs.meta                                                                       |   11 
 Main/System/Chat/ChatFriendTipCell.cs                                                                           |   22 
 Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA227_tagCMQueryNPCCntInfo.cs                 |   29 
 Main/System/Chat/ChatFriend.cs.meta                                                                             |   11 
 Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA204_tagCMOpenLongWarehouse.cs.meta          |   12 
 Main/NetworkPackage/ServerPack/H02_PlayerTalk/H0201_tagTalkGong.cs.meta                                         |   11 
 Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA228_tagCMQueryFamilyBossHurt.cs.meta        |   12 
 Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA212_tagCMViewPlayerInfo.cs.meta             |   12 
 110 files changed, 4,996 insertions(+), 80 deletions(-)

diff --git a/Main/Config/PartialConfigs.meta b/Main/Config/PartialConfigs.meta
new file mode 100644
index 0000000..37d937a
--- /dev/null
+++ b/Main/Config/PartialConfigs.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 2741384f32fca3a4b9de828eceda495f
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Config/PartialConfigs/DirtyWordConfig.cs b/Main/Config/PartialConfigs/DirtyWordConfig.cs
new file mode 100644
index 0000000..7a9ffed
--- /dev/null
+++ b/Main/Config/PartialConfigs/DirtyWordConfig.cs
@@ -0,0 +1,273 @@
+    using System;
+    using System.Collections.Generic;
+    using System.Text.RegularExpressions;
+    using UnityEngine;
+    using System.Threading;
+
+    public partial class DirtyWordConfig : ConfigBase<int, DirtyWordConfig>
+    {
+
+        private static WordGroup[] DIRTYWORLD = new WordGroup[(int)char.MaxValue];
+
+        private static List<string> memoryList = new List<string>();
+
+        private static bool dirtyWordInited = false;
+
+        static int cursor = 0;
+
+        static int wordlenght = 0;
+
+        static int nextCursor = 0;
+
+        public void OnConfigParseCompleted()
+        {
+            if (string.IsNullOrEmpty(word))
+            {
+                Debug.LogErrorFormat("灞忚斀瀛� id = {0} 鐨勫唴瀹逛负绌� 闇�瑕佷慨鏀�", id);
+                return;
+            }
+            var tmpword = word.Replace(" ", "");
+            string key = ToDBC(tmpword);
+            memoryList.Add(key);
+        }
+
+        private static string ToDBC(string input)
+        {
+            char[] c = input.ToCharArray();
+            for (int i = 0; i < c.Length; i++)
+            {
+                if (c[i] == 12288)
+                {
+                    c[i] = (char)32;
+                    continue;
+                }
+                if (c[i] > 65280 && c[i] < 65375)
+                    c[i] = (char)(c[i] - 65248);
+            }
+            return new string(c).ToLower();
+        }
+
+        public static string IsDirtWord(string source, char filter)
+        {
+            if (source != string.Empty)
+            {
+                cursor = 0;
+                nextCursor = 0;
+                char[] temp = source.ToCharArray();
+                source = FitterSpecial(source);
+                for (int i = 0; i < source.Length; i++)
+                {
+                    //鏌ヨ浠ヨ瀛椾负棣栧瓧绗︾殑璇嶇粍
+                    WordGroup group = DIRTYWORLD[(int)ToDBC(source)[i]];
+                    if (group != null)
+                    {
+                        for (int z = 0; z < group.Count(); z++)
+                        {
+                            string word = group.GetWord(z);
+                            if (word.Length == 0 || Check(word, source))
+                            {
+                                string blackword = string.Empty;
+                                for (int pos = 0; pos < wordlenght + 1; pos++)
+                                {
+                                    try
+                                    {
+                                        blackword += temp[pos + cursor].ToString();
+                                        temp[pos + cursor] = filter;
+                                    }
+                                    catch (Exception e)
+                                    {
+                                        Debug.Log(e.Message);
+                                    }
+                                }
+                                cursor = cursor + wordlenght;
+                                i = i + wordlenght;
+
+                            }
+                        }
+                    }
+                    cursor++;
+                }
+                return new string(temp);
+            }
+            return string.Empty;
+        }
+
+        public static bool IsDirtWord(string source)
+        {
+            if (System.Text.Encoding.UTF8.GetByteCount(source) == 1)
+                return false;
+
+            if (source != string.Empty)
+            {
+                cursor = 0;
+                nextCursor = 0;
+                for (int i = 0; i < source.Length; i++)
+                {
+                    //鏌ヨ浠ヨ瀛椾负棣栧瓧绗︾殑璇嶇粍
+                    WordGroup group = DIRTYWORLD[(int)ToDBC(source)[i]];
+                    if (group != null)
+                    {
+                        for (int z = 0; z < group.Count(); z++)
+                        {
+                            string word = group.GetWord(z);
+                            if (word.Length == 0 || Check(word, source))
+                            {
+                                return true;
+                            }
+                        }
+                    }
+                    cursor++;
+                }
+            }
+            return false;
+        }
+
+        private static bool Check(string blackWord, string source)
+        {
+            wordlenght = 0;
+            int wordCnt = 0;
+            //妫�娴嬫簮涓嬩竴浣嶆父鏍�
+            nextCursor = cursor + 1;
+            bool found = false;
+            //閬嶅巻璇嶇殑姣忎竴浣嶅仛鍖归厤
+            for (int i = 0; i < blackWord.Length; i++)
+            {
+                //鐗规畩瀛楃鍋忕Щ娓告爣
+                int offset = 0;
+                if (nextCursor >= source.Length)
+                {
+                    break;
+                }
+                else
+                {
+                    //妫�娴嬩笅浣嶅瓧绗﹀鏋滀笉鏄眽瀛� 鏁板瓧 瀛楃 鍋忕Щ閲忓姞1,,杩囨护鐗规畩瀛楃
+                    for (int y = nextCursor; y < source.Length; y++)
+                    {
+                        //if (!IsCHS(source[y]) && !IsNum(source[y]) && !IsAlphabet(source[y])) {
+                        if (IsSpecial(source[y]))
+                        {
+                            offset++;
+                            //閬胯鐗规畩瀛楃锛屼笅浣嶆父鏍囧鏋�>=瀛楃涓查暱搴� 璺冲嚭
+                            if (nextCursor + offset >= source.Length) break;
+                            wordlenght++;
+
+                        }
+                        else break;
+                    }
+                    if (nextCursor + offset >= source.Length)
+                    {
+                        break;
+                    }
+                    if (blackWord[i] == char.ToLower(source[nextCursor + offset]))
+                    {
+                        wordCnt++;
+                        found = true;
+                    }
+                    else
+                    {
+                        found = false;
+                        break;
+                    }
+                }
+                nextCursor = nextCursor + 1 + offset;
+                wordlenght++;
+            }
+            if (blackWord.Length != wordCnt) return false;
+            return found;
+        }
+
+        private static bool IsSpecial(char character)
+        {
+            if (character == ' ')
+            {
+                return true;
+            }
+            return false;
+        }
+
+        static public void DirtyWordInit()
+        {
+            if (dirtyWordInited)
+            {
+                return;
+            }
+
+            dirtyWordInited = true;
+
+            ThreadPool.QueueUserWorkItem((object aaa) =>
+            {
+                memoryList.Sort((string x, string y) =>
+                {
+                    return x.CompareTo(y);
+                });
+                for (int i = memoryList.Count - 1; i > 0; i--)
+                {
+                    if (memoryList[i].ToString() == memoryList[i - 1].ToString())
+                    {
+                        memoryList.RemoveAt(i);
+                    }
+                }
+                foreach (string word in memoryList)
+                {
+                    WordGroup group = DIRTYWORLD[(int)word[0]];
+                    if (group == null)
+                    {
+                        group = new WordGroup();
+                        DIRTYWORLD[(int)word[0]] = group;
+                    }
+                    group.Add(word.Substring(1));
+                }
+            });
+        }
+
+        public static bool IsCHS(char character)
+        {
+            //  涓枃琛ㄦ剰瀛楃鐨勮寖鍥� 4E00-9FA5
+            int charVal = (int)character;
+            return (charVal >= 0x4e00 && charVal <= 0x9fa5);
+        }
+
+        private static bool IsNum(char character)
+        {
+            int charVal = (int)character;
+            return (charVal >= 48 && charVal <= 57);
+        }
+
+        private static bool IsAlphabet(char character)
+        {
+            int charVal = (int)character;
+            return ((charVal >= 97 && charVal <= 122) || (charVal >= 65 && charVal <= 90));
+        }
+
+        private const string FACE_REPLACE = @"#~[0-9a-zA-Z]{1,3}";
+        private static Regex FaceRegex = new Regex(FACE_REPLACE, RegexOptions.Singleline);
+        public static string FitterSpecial(string source)
+        {
+            return FaceRegex.Replace(source, "     ");
+        }
+    }
+
+    class WordGroup
+    {
+        private List<string> groupList;
+
+        public WordGroup()
+        {
+            groupList = new List<string>();
+        }
+
+        public void Add(string word)
+        {
+            groupList.Add(word);
+        }
+
+        public int Count()
+        {
+            return groupList.Count;
+        }
+
+        public string GetWord(int index)
+        {
+            return groupList[index];
+        }
+    }
diff --git a/Main/Config/PartialConfigs/DirtyWordConfig.cs.meta b/Main/Config/PartialConfigs/DirtyWordConfig.cs.meta
new file mode 100644
index 0000000..bb3ab74
--- /dev/null
+++ b/Main/Config/PartialConfigs/DirtyWordConfig.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: eaa6a42d2cc924045b9f3e241e5f3285
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Manager/GameSystemManager/ChatCenter.cs b/Main/Manager/GameSystemManager/ChatCenter.cs
new file mode 100644
index 0000000..2c04f18
--- /dev/null
+++ b/Main/Manager/GameSystemManager/ChatCenter.cs
@@ -0,0 +1,551 @@
+锘縰sing System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Text;
+using System.Text.RegularExpressions;
+using UnityEngine;
+using Cysharp.Threading.Tasks;
+
+    
+    public class ChatCenter : Singleton<ChatCenter>
+    {
+        public int talkRechargeLimmit;
+        public int talkLevelLimmit;
+
+        public void Init()
+        {
+            ParseConfig();
+            //var _uiframe = UIFrameMgr.Inst;
+            // ChatSetting.Instance.RefreshChatSetAct += RefreshChatSetAct;
+            // TimeMgr.Instance.OnSyntonyEvent += OnSyntonyEvent;
+            // VoiceHttpRequest.Instance.samplesDecodecComplete += SamplesDecodecComplete;
+            UIManager.Instance.OnOpenWindow += WindowAfterOpenEvent;
+            // StageLoad.Instance.onStageLoadFinish += OnStageLoadFinish;
+            // PrepareHandler.Instance.OnPrepareEnd += OnPrepareEnd;
+
+            var time = bandTime;
+            banTimeArray[0] = time.Year;
+            banTimeArray[1] = time.Month;
+            banTimeArray[2] = time.Day;
+            banTimeArray[3] = time.Hour;
+            banTimeArray[4] = time.Minute;
+            banTimeArray[5] = time.Second;
+        }
+
+        public void UnInit()
+        {
+
+        }
+
+        bool serverInited = false;
+
+        public int chatCharacterLimit { get; private set; }
+        public int bugleItem { get; private set; }
+        public bool beforeDungeon { get; private set; }
+        public List<ChatInfoType> chatChannels { get; private set; }
+
+        public int chatInputLength { get; set; }
+        public StringBuilder m_EncodeBuilder = new StringBuilder();
+        void ParseConfig()
+        {
+            chatCharacterLimit = int.Parse(FuncConfigConfig.Get("MessageLength").Numerical1);
+            var _funcCfg = FuncConfigConfig.Get("BugleItem");
+            bugleItem = int.Parse(_funcCfg.Numerical1);
+            chatChannels = new List<ChatInfoType>();
+            chatChannels.Add(ChatInfoType.System);
+            chatChannels.Add(ChatInfoType.World);
+            chatChannels.Add(ChatInfoType.CrossServer);
+            chatChannels.Add(ChatInfoType.Area);
+            chatChannels.Add(ChatInfoType.Team);
+            chatChannels.Add(ChatInfoType.Invite);
+            chatChannels.Add(ChatInfoType.Trumpet);
+            chatChannels.Add(ChatInfoType.Fairy);
+            chatChannels.Add(ChatInfoType.Friend);
+            chatChannels.Add(ChatInfoType.default1);
+
+            var config = FuncConfigConfig.Get("ClientChatBan");
+            banCheckSecond = int.Parse(config.Numerical1);
+            repeatCountLimit = int.Parse(config.Numerical2);
+            maliceCheckCount = int.Parse(config.Numerical3);
+            maliceLimitCount = int.Parse(config.Numerical4);
+            var array = ConfigParse.GetMultipleStr<int>(config.Numerical5);
+            singleBanSecond = array[0];
+            maxBanSecond = array[1];
+
+            config = FuncConfigConfig.Get("LocalChatHistoryCount");
+            if (config != null)
+            {
+                LocalChatHistory.localSaveCount = int.Parse(config.Numerical1);
+                if (!string.IsNullOrEmpty(config.Numerical2))
+                {
+                    LocalChatHistory.localChatKeepHour = int.Parse(config.Numerical2);
+                }
+            }
+
+            config = FuncConfigConfig.Get("TalkLimit");
+            talkRechargeLimmit = int.Parse(config.Numerical1);
+            talkLevelLimmit = int.Parse(config.Numerical2);
+        }
+
+        public event Action<string, bool, bool> UpdateChatValueEvent;
+        public void ChangeChatValue(string _msg, bool _add, bool _force)
+        {
+            if (UpdateChatValueEvent != null)
+            {
+                UpdateChatValueEvent(_msg, _add, _force);
+            }
+        }
+
+        public event Action UpdateChatType;
+        public void ChangeChatType()
+        {
+            if (UpdateChatType != null)
+            {
+                UpdateChatType();
+            }
+        }
+
+        public event Action UpdateChatContent;
+        public void UpdateChatContentPos()
+        {
+            if (UpdateChatContent != null)
+            {
+                UpdateChatContent();
+            }
+        }
+
+        public ChatData GetChatData(ChatInfoType _type, int _index, int _pteChatId = 0)
+        {
+            ChatData chat = null;
+            if (_type == ChatInfoType.Friend)
+            {
+                var _list = ChatManager.Instance.GetChatInfo(_pteChatId == 0 ? ChatManager.Instance.PteChatID : _pteChatId);
+                if (_list == null || _index >= _list.Count)
+                {
+                    return null;
+                }
+                chat = _list[_index];
+            }
+            else
+            {
+                List<ChatData> _list = ChatManager.Instance.GetChatInfo(_type);
+                if (_list == null || _index >= _list.Count)
+                {
+                    return null;
+                }
+                chat = _list[_index];
+            }
+            return chat;
+        }
+
+        public const int RecentlyChatNum = 8;
+        public List<RecentlyChat> recentlyChats = new List<RecentlyChat>(RecentlyChatNum);
+        public event Action RecentlyChatChangeEvent;
+        public RecentlyChat recentlyChat = null;
+
+        public RecentlyChat SaveRecentlyChat(string _chat)
+        {
+            if (ChatManager.Instance.IsInviteChat(_chat)
+                || Regex.IsMatch(_chat, ChatManager.KILL_IDENTIFY))
+            {
+                return null;
+            }
+            if (s_VoiceRegex.IsMatch(_chat))
+            {
+                _chat = s_VoiceRegex.Replace(_chat, string.Empty);
+            }
+            if (recentlyChats.FindIndex((x) =>
+             {
+                 return x.display.Equals(_chat);
+             }) != -1)
+            {
+                return null;
+            }
+            if (recentlyChats.Count >= RecentlyChatNum)
+            {
+                var _old = recentlyChats[0];
+                recentlyChats.RemoveAt(0);
+                _old = null;
+            }
+            var _recentlyChat = new RecentlyChat(_chat);
+            recentlyChats.Add(_recentlyChat);
+            if (RecentlyChatChangeEvent != null)
+            {
+                RecentlyChatChangeEvent();
+            }
+            return _recentlyChat;
+        }
+
+        public void OnBeforePlayerDataInitialize()
+        {
+            recentlyChat = null;
+            serverInited = false;
+            m_VoiceChatDict.Clear();
+        }
+
+        public void OnSwitchAccount()
+        {
+
+        }
+
+
+        public class RecentlyChat
+        {
+            public string display = string.Empty;
+            public List<string> itemInfos = new List<string>();
+            public List<int> itemIndexs = new List<int>();
+            public List<string> itemNames = new List<string>();
+
+            public RecentlyChat()
+            {
+
+            }
+
+            public RecentlyChat(string _chat)
+            {
+                display = _chat;
+            }
+
+            public void Add(string _name, string _itemInfo)
+            {
+                itemNames.Add(_name);
+                itemInfos.Add(_itemInfo);
+            }
+
+            public void Reset()
+            {
+                itemIndexs.Clear();
+                for (int i = 0; i < itemInfos.Count; i++)
+                {
+                    itemIndexs.Add(i);
+                }
+            }
+
+            public override string ToString()
+            {
+                return LitJson.JsonMapper.ToJson(this);
+            }
+
+            public static bool TryParse(string json, out RecentlyChat chat)
+            {
+                chat = null;
+                try
+                {
+                    chat = LitJson.JsonMapper.ToObject<RecentlyChat>(json);
+                }
+                catch (Exception e)
+                {
+                    Debug.LogError(e.StackTrace + e.Message);
+                    return false;
+                }
+                return chat != null;
+            }
+        }
+
+        public static readonly Regex s_VoiceRegex = new Regex("<v=([0-9]+)_([0-9]+)>");
+        private Dictionary<int, VoiceChat> m_VoiceChatDict = new Dictionary<int, VoiceChat>();
+
+        public class VoiceChat
+        {
+            public ChatInfoType chatType;
+            public int index;
+            public int toPlayer;
+            public long tick;
+            public byte length;
+            public bool translate = false;
+            public byte[] encode;
+            public string result = string.Empty;
+        }
+
+        public void SetVoice(int _instance, ChatInfoType _type, float _length, int _toPlayer = 0)
+        {
+            if (!m_VoiceChatDict.ContainsKey(_instance))
+            {
+                VoiceChat _chat = new VoiceChat()
+                {
+                    chatType = _type,
+                    index = _instance,
+                    toPlayer = _toPlayer,
+                    tick = TimeUtility.ServerNow.Ticks,
+                    translate = false,
+                    encode = null,
+                    length = (byte)Mathf.Min((int)(_length * 10), 100),
+                };
+                m_VoiceChatDict.Add(_instance, _chat);
+            }
+        }
+
+        public void OnPlayerLoginOk()
+        {
+            serverInited = true;
+        }
+
+        private void WindowAfterOpenEvent(UIBase win)
+        {
+            CheckChatFloatOpen();
+            if (win is MainWin)
+            {
+                Co_CheckAfterCollect().Forget();
+            }
+        }
+
+        public bool IsShowChatFloat()
+        {
+            return !UIManager.Instance.IsOpened<LoadingWin>();
+            // if (!UIManager.Instance.IsOpened<LoadingWin>())
+            //     return true;
+            // return false;
+        }
+
+        private void CheckChatFloatOpen()
+        {
+            if (IsShowChatFloat())
+            {
+                //  TODO YYL
+                // if (!UIManager.Instance.IsOpened<ChatFloatWin>())
+                // {
+                //     UIManager.Instance.OpenWindow<ChatFloatWin>();
+                // }
+            }
+            //else
+            //{
+            //    if (UIManager.Instance.IsOpened<ChatFloatWin>())
+            //    {
+            //        UIManager.Instance.Close<ChatFloatWin>();
+            //    }
+            //}
+        }
+
+        bool openChatAfterCollect = false;
+        // private void OnPrepareEnd(int playerId, int type)
+        // {
+        //     if (playerId == PlayerDatas.Instance.baseData.PlayerID
+        //         && type == 0 && PlayerDatas.Instance.baseData.MapID == 31230)
+        //     {
+        //         openChatAfterCollect = true;
+        //     }
+        //     CheckOpenChatAfterCollect();
+        // }
+
+        async UniTask Co_CheckAfterCollect()
+        {
+            await UniTask.Yield();
+            CheckOpenChatAfterCollect();
+        }
+
+        void CheckOpenChatAfterCollect()
+        {
+            if (!openChatAfterCollect)
+            {
+                return;
+            }
+            if (PlayerDatas.Instance.baseData.MapID != 31230)
+            {
+                return;
+            }
+            if (!UIManager.Instance.IsOpened<MainWin>()
+                /*TODO YYL|| NewBieCenter.Instance.inGuiding*/)
+            {
+                return;
+            }
+            openChatAfterCollect = false;
+
+            //TODO YYL
+            // if (!UIManager.Instance.IsOpened<ChatWin>())
+            // {
+            //     ChatManager.Instance.presentChatType = ChatInfoType.Fairy;
+            //     UIManager.Instance.Open<ChatWin>();
+            // }
+        }
+
+
+        public string SetChatExtra()
+        {
+            var vipLevel = PlayerDatas.Instance.baseData.VIPLv;
+            var job = PlayerDatas.Instance.baseData.Job;
+            var bubbleId = PlayerDatas.Instance.baseData.bubbleId;
+            var serverGroupId = PlayerDatas.Instance.baseData.ServerGroupId;
+            return StringUtility.Contact(vipLevel.ToString().PadLeft(2, '0'), 0, job,
+                bubbleId.ToString().PadLeft(2, '0'), serverGroupId.ToString().PadLeft(7, '0'));
+        }
+
+        public void HandleChatBanned(ChatInfoType channel, string message, int toPlayer)
+        {
+            if (IsChatBanned || clientBanned)
+            {
+                var playerId = PlayerDatas.Instance.baseData.PlayerID;
+                var playerName = UIHelper.ServerStringTrim(PlayerDatas.Instance.baseData.PlayerName);
+                switch (channel)
+                {
+                    case ChatInfoType.World:
+                        ChatManager.Instance.RevChatInfo(new H0201_tagTalkGong()
+                        {
+                            Content = message,
+                            Extras = SetChatExtra(),
+                            PlayerID = playerId,
+                            Name = playerName,
+                        });
+                        break;
+                    case ChatInfoType.Area:
+                        ChatManager.Instance.RevChatInfo(new H0207_tagTalkArea()
+                        {
+                            Content = message,
+                            Extras = SetChatExtra(),
+                            PlayerID = playerId,
+                            SrcName = playerName,
+                        });
+                        break;
+                    case ChatInfoType.CrossServer:
+                        ChatManager.Instance.RevChatInfo(new H0208_tagTalkCountry()
+                        {
+                            Content = message,
+                            Extras = SetChatExtra(),
+                            PlayerID = playerId,
+                            Name = playerName,
+                        });
+                        break;
+                    case ChatInfoType.Team:
+                        ChatManager.Instance.RevChatInfo(new H0205_tagTalkDui()
+                        {
+                            PlayerID = playerId,
+                            Name = playerName,
+                            Content = message,
+                            Extras = SetChatExtra(),
+                        });
+                        break;
+                    case ChatInfoType.Fairy:
+                        ChatManager.Instance.RevChatInfo(new H0203_tagTalkBang()
+                        {
+                            PlayerID = playerId,
+                            Content = message,
+                            Extras = SetChatExtra(),
+                            Name = playerName,
+                        });
+                        break;
+                    case ChatInfoType.Friend:
+                        ChatManager.Instance.RevChatInfo(new H0206_tagTalkMi()
+                        {
+                            PlayerID = playerId,
+                            SrcName = playerName,
+                            Content = message,
+                            Extras = SetChatExtra(),
+                            ToPlayerID = (uint)toPlayer,
+                            ToName = string.Empty,
+                            TalkType = 1,
+                        });
+                        break;
+                    case ChatInfoType.default1:
+                        ChatManager.Instance.RevChatInfo(new HA707_tagMCPyTalk()
+                        {
+                            Content = message,
+                            Extras = SetChatExtra(),
+                            PlayerID = playerId,
+                            Name = playerName,
+                        });
+                        break;
+                }
+            }
+        }
+
+        public void ServerForbidenChat(bool value)
+        {
+            if (value)
+            {
+                serverForbidenChat = true;
+            }
+        }
+        private bool m_serverForbidenChat;
+        bool serverForbidenChat {
+            //get { return LocalSave.GetBool("ServerForbidenChat"); }
+            //set { LocalSave.SetBool("ServerForbidenChat", value); }
+            get { return m_serverForbidenChat; }
+            set { m_serverForbidenChat = value; }
+        }
+
+        public bool IsChatBanned {
+            get {
+                var value = PlayerDatas.Instance.extersion.forbidenTalk;
+                //澧炲姞鍒ゆ柇鏄惁璁惧绂佽█
+                if (LocalSave.GetBool("ServerForbidenChatDevice1", false) || value > 0)
+                    return true;
+                return false;
+            }
+        }
+
+        public bool clientBanned {
+            get {
+                return false;
+                //var time = new DateTime(banTimeArray[0], banTimeArray[1], banTimeArray[2],
+                //    banTimeArray[3], banTimeArray[4], banTimeArray[5]);
+                //return TimeUtility.ServerNow < time;
+            }
+        }
+
+        public int banCheckSecond = 60;
+        public int repeatCountLimit = 5;
+        public int maliceCheckCount = 10;
+        public int maliceLimitCount = 5;
+        public int singleBanSecond = 1;
+        public int maxBanSecond = 1;
+
+        public int banSecond {
+            get { return LocalSave.GetInt("ClientChatBanSecond", 0); }
+            set {
+                LocalSave.SetInt("ClientChatBanSecond", value);
+            }
+        }
+
+        private int[] banTimeArray = new int[6];
+        private DateTime bandTime {
+            get {
+                var timeArray = LocalSave.GetIntArray("ClientChatBanTime");
+                if (null == timeArray)
+                {
+                    return TimeUtility.OriginalTime;
+                }
+                else
+                {
+                    return new DateTime(timeArray[0], timeArray[1], timeArray[2], timeArray[3], timeArray[4], timeArray[5]);
+                }
+            }
+            set {
+                banTimeArray[0] = value.Year;
+                banTimeArray[1] = value.Month;
+                banTimeArray[2] = value.Day;
+                banTimeArray[3] = value.Hour;
+                banTimeArray[4] = value.Minute;
+                banTimeArray[5] = value.Second;
+                LocalSave.SetIntArray("ClientChatBanTime", banTimeArray);
+            }
+        }
+
+        public void ChatClientBan()
+        {
+//            if (!clientBanned)
+//            {
+//                var time = TimeUtility.ServerNow;
+//                var second = Mathf.Min(maxBanSecond, banSecond + singleBanSecond);
+//                banSecond = second;
+//                bandTime = time.AddTicks(second * TimeSpan.TicksPerSecond);
+//#if !UNITY_EDITOR
+//                OperationLogCollect.Instance.BugReport(Language.Get("ClientBanTitle"),
+//                    Language.Get("ClientBanContent", banSecond));
+//#endif
+//            }
+        }
+
+        public bool IsClientBan(ChatInfoType chatType)
+        {
+            return false;
+            //if (!clientBanned)
+            //{
+            //    return false;
+            //}
+            //if (chatType == ChatInfoType.Fairy)
+            //{
+            //    var model = ModelCenter.Instance.GetModel<DailyQuestModel>();
+            //    return model.GetQuestState((int)DailyQuestType.FairyFeast) != DailyQuestModel.DailyQuestState.Normal;
+            //}
+            //return clientBanned;
+        }
+    }
diff --git a/Main/Manager/GameSystemManager/ChatCenter.cs.meta b/Main/Manager/GameSystemManager/ChatCenter.cs.meta
new file mode 100644
index 0000000..efc2554
--- /dev/null
+++ b/Main/Manager/GameSystemManager/ChatCenter.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: dda4314f0337ba442ac1a05b0cdd2350
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Manager/GameSystemManager/ChatManager.cs b/Main/Manager/GameSystemManager/ChatManager.cs
new file mode 100644
index 0000000..4dee680
--- /dev/null
+++ b/Main/Manager/GameSystemManager/ChatManager.cs
@@ -0,0 +1,1464 @@
+锘縰sing System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using System.Text;
+using System;
+using System.Text.RegularExpressions;
+using vnxbqy.UI;
+
+using System.Linq;
+
+public class ChatManager : GameSystemManager<ChatManager>
+{
+    public int CHAT_INFO_CNT = 50;
+
+    public const int CHAT_TIP_CNT = 4;
+    public const int CHAT_CELL_CNT = 6;
+    public const int CHAT_INFO_LIMIT = 50;
+
+    public readonly int BugleItem = 0;//鍠囧彮鐗╁搧id
+
+    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();
+            }
+        }
+    }
+
+    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)
+    {
+        var id = (int)PlayerDatas.Instance.PlayerId + playerId;
+        if (pteChatDics.ContainsKey(id))
+        {
+            pteChatDics.Remove(id);
+            if (OnRefreshPteChat != null)
+            {
+                OnRefreshPteChat(null);
+            }
+        }
+    }
+
+    public void SelectRecentlyChat(int playerId)
+    {
+        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;
+    }
+
+    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()
+    {
+        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);
+        }
+    }
+
+    private void PlayerLoginOkEvent()
+    {
+        UpdateRedpoint(ChatInfoType.Team);
+        UpdateRedpoint(ChatInfoType.Fairy);
+    }
+
+    private void SwitchAccountEvent()
+    {
+        ClearAllChatInfo();
+    }
+
+    void ChatReport(ChatInfoType chatType, string content, string toPlayer)
+    {
+        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);
+        }
+    }
+
+    public void SendChatInfo(ChatInfoType type, string msg, ChatExtraData? info = null , bool isDirtyWord = true,  bool isChatInfoCount = true)
+    {
+        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;
+                             if (CrossServerUtility.IsCrossServer())
+                             {
+                                 GameNetSystem.Instance.SendToCrossServer(chatPack);
+                             }
+                             else
+                             {
+                                 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;
+                             if (CrossServerUtility.IsCrossServer())
+                             {
+                                 GameNetSystem.Instance.SendToCrossServer(_pak);
+                             }
+                             else
+                             { 
+                                 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)))
+        {
+            return true;
+        }
+        return false;
+    }
+    /// <summary>
+    /// 涓栫晫棰戦亾
+    /// </summary>
+    /// <param name="vNetData"></param>
+    public void RevChatInfo(H0201_tagTalkGong vNetData, uint time = 0)
+    {
+        //  TODO YYL
+        // if (friendModel.GetFirendInfo(vNetData.PlayerID, (byte)GroupType.Balcklist) != null)//榛戝悕鍗曟嫤鎴�
+        // {
+        //     return;
+        // }
+        ChatData chatData = null;
+        var content = vNetData.Content;
+        if (IsInviteChat(vNetData.Content))
+        {
+            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;
+        }
+        if (IsAssitChat(content, true) == 2 && vNetData.PlayerID != PlayerDatas.Instance.baseData.PlayerID)
+        {
+            content = StringUtility.Contact(content, Language.Get("InviteTeam", vNetData.PlayerID));
+        }
+        chatData = new ChatWorldData(content, (int)vNetData.PlayerID, vNetData.Name, vNetData.Extras);
+        if (time != 0)
+        {
+            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);
+        }
+        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);
+        }
+    }
+
+    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()
+    {
+        if (OnClickCloseChatEvent != null)
+        {
+            OnClickCloseChatEvent();
+        }
+    }
+
+    public bool IsExtentOpen { get; set; }
+    public void OpenChatExtent(bool open)
+    {
+        if (OnChatExtentOpenEvent != null)
+        {
+            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.FightPoint);
+                }
+            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++)
+            {
+                if (message.Equals(Language.Get(realmRandomChats[i])))
+                {
+                    assitChat = 1;
+                    break;
+                }
+                if (message.Equals(Language.Get(dungeonRandomChats[i])))
+                {
+                    assitChat = 2;
+                    break;
+                }
+            }
+        }
+        return assitChat;
+    }
+    #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 int infoint1;
+    public ChatExtraData(int info1)
+    {
+        this.infoint1 = info1;
+    }
+
+    public static ChatExtraData Default {
+        get {
+            return new ChatExtraData(0);
+        }
+    }
+}
+
+public enum ChatInfoType
+{
+    System,//绯荤粺娑堟伅
+    World, //涓栫晫棰戦亾
+    Area,  //鍖哄煙棰戦亾
+    Team,  //闃熶紞
+    Invite,//缁勯槦
+    Trumpet,//鍠囧彮
+    Fairy,//浠欑洘
+    Friend,//绉佽亰
+    CrossServer,//璺ㄦ湇
+    FairyQuestion,
+    FairyTip,
+    TeamTip,
+
+    //鍚庣画IL寮�鍙戞坊鍔犻璁�
+    default1,   //闃佃惀锛堝湪璺ㄦ湇鍦板浘寰�璺ㄦ湇鍙戯級
+    default2,   //闃佃惀淇℃伅鎻愮ず
+    default3,
+    default4,
+    default5,
+    default6,
+    default7,
+    default8,
+    default9,
+    default10,
+}
diff --git a/Main/Manager/GameSystemManager/ChatManager.cs.meta b/Main/Manager/GameSystemManager/ChatManager.cs.meta
new file mode 100644
index 0000000..12da112
--- /dev/null
+++ b/Main/Manager/GameSystemManager/ChatManager.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: d56edf10ef498d940b587b6f64c4d907
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/NetworkPackage/ClientPack/ClientToGameServer/C02_PlayerTalk.meta b/Main/NetworkPackage/ClientPack/ClientToGameServer/C02_PlayerTalk.meta
new file mode 100644
index 0000000..4616a56
--- /dev/null
+++ b/Main/NetworkPackage/ClientPack/ClientToGameServer/C02_PlayerTalk.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 27d5c84a0701e5d40953997b3f050861
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/NetworkPackage/ClientPack/ClientToGameServer/C02_PlayerTalk/C0201_tagCTalkGong.cs b/Main/NetworkPackage/ClientPack/ClientToGameServer/C02_PlayerTalk/C0201_tagCTalkGong.cs
new file mode 100644
index 0000000..08541be
--- /dev/null
+++ b/Main/NetworkPackage/ClientPack/ClientToGameServer/C02_PlayerTalk/C0201_tagCTalkGong.cs
@@ -0,0 +1,35 @@
+using UnityEngine;
+using System.Collections;
+
+//02 01公屏#tagCTalkGong
+
+
+
+public class C0201_tagCTalkGong : GameNetPackBasic {
+
+    public ushort Len;
+
+    public string Content;    //size = Len
+
+
+
+    public C0201_tagCTalkGong () {
+
+        _cmd = (ushort)0x0201;
+
+    }
+
+
+
+    public override void WriteToBytes () {
+
+        WriteBytes (Len, NetDataType.WORD);
+
+        WriteBytes (Content, NetDataType.Chars, Len);
+
+    }
+
+
+
+}
+
diff --git a/Main/NetworkPackage/ClientPack/ClientToGameServer/C02_PlayerTalk/C0201_tagCTalkGong.cs.meta b/Main/NetworkPackage/ClientPack/ClientToGameServer/C02_PlayerTalk/C0201_tagCTalkGong.cs.meta
new file mode 100644
index 0000000..664d631
--- /dev/null
+++ b/Main/NetworkPackage/ClientPack/ClientToGameServer/C02_PlayerTalk/C0201_tagCTalkGong.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 64b71bc2465aabe4ca03ea6f6951e019
+timeCreated: 1502702981
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/NetworkPackage/ClientPack/ClientToGameServer/C02_PlayerTalk/C0203_tagCTalkBang.cs b/Main/NetworkPackage/ClientPack/ClientToGameServer/C02_PlayerTalk/C0203_tagCTalkBang.cs
new file mode 100644
index 0000000..fee6cba
--- /dev/null
+++ b/Main/NetworkPackage/ClientPack/ClientToGameServer/C02_PlayerTalk/C0203_tagCTalkBang.cs
@@ -0,0 +1,35 @@
+using UnityEngine;
+using System.Collections;
+
+//02 03 家族频#tagCTalkBang
+
+
+
+public class C0203_tagCTalkBang : GameNetPackBasic {
+
+    public ushort Len;
+
+    public string Content;    //size = Len
+
+
+
+    public C0203_tagCTalkBang () {
+
+        _cmd = (ushort)0x0203;
+
+    }
+
+
+
+    public override void WriteToBytes () {
+
+        WriteBytes (Len, NetDataType.WORD);
+
+        WriteBytes (Content, NetDataType.Chars, Len);
+
+    }
+
+
+
+}
+
diff --git a/Main/NetworkPackage/ClientPack/ClientToGameServer/C02_PlayerTalk/C0203_tagCTalkBang.cs.meta b/Main/NetworkPackage/ClientPack/ClientToGameServer/C02_PlayerTalk/C0203_tagCTalkBang.cs.meta
new file mode 100644
index 0000000..2631bca
--- /dev/null
+++ b/Main/NetworkPackage/ClientPack/ClientToGameServer/C02_PlayerTalk/C0203_tagCTalkBang.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: a310943592d08a84f88452e158e4dd01
+timeCreated: 1502941087
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/NetworkPackage/ClientPack/ClientToGameServer/C02_PlayerTalk/C0205_tagCTalkDui.cs b/Main/NetworkPackage/ClientPack/ClientToGameServer/C02_PlayerTalk/C0205_tagCTalkDui.cs
new file mode 100644
index 0000000..fccf7f8
--- /dev/null
+++ b/Main/NetworkPackage/ClientPack/ClientToGameServer/C02_PlayerTalk/C0205_tagCTalkDui.cs
@@ -0,0 +1,19 @@
+using UnityEngine;
+using System.Collections;
+
+//02 05对频#tagCTalkDui

+

+public class C0205_tagCTalkDui : GameNetPackBasic {

+    public ushort Len;

+    public string Content;    //size = Len

+

+    public C0205_tagCTalkDui () {

+        _cmd = (ushort)0x0205;

+    }

+

+    public override void WriteToBytes () {

+        WriteBytes (Len, NetDataType.WORD);

+        WriteBytes (Content, NetDataType.Chars, Len);

+    }

+

+}

diff --git a/Main/NetworkPackage/ClientPack/ClientToGameServer/C02_PlayerTalk/C0205_tagCTalkDui.cs.meta b/Main/NetworkPackage/ClientPack/ClientToGameServer/C02_PlayerTalk/C0205_tagCTalkDui.cs.meta
new file mode 100644
index 0000000..d39914c
--- /dev/null
+++ b/Main/NetworkPackage/ClientPack/ClientToGameServer/C02_PlayerTalk/C0205_tagCTalkDui.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 27f4337063b470e4fb47e50b752741d7
+timeCreated: 1502971998
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/NetworkPackage/ClientPack/ClientToGameServer/C02_PlayerTalk/C0206_tagCTalkMi.cs b/Main/NetworkPackage/ClientPack/ClientToGameServer/C02_PlayerTalk/C0206_tagCTalkMi.cs
new file mode 100644
index 0000000..285bccf
--- /dev/null
+++ b/Main/NetworkPackage/ClientPack/ClientToGameServer/C02_PlayerTalk/C0206_tagCTalkMi.cs
@@ -0,0 +1,47 @@
+using UnityEngine;
+using System.Collections;
+
+//02 06密频#tagCTalkMi
+
+
+
+public class C0206_tagCTalkMi : GameNetPackBasic {
+
+    public byte TalkType;    //0为默认 1为1对1聊天
+
+    public byte TargetNameLen;
+
+    public string TargetName;    //size = TargetNameLen
+
+    public ushort Len;
+
+    public string Content;    //size = Len
+
+
+
+    public C0206_tagCTalkMi () {
+
+        _cmd = (ushort)0x0206;
+
+    }
+
+
+
+    public override void WriteToBytes () {
+
+        WriteBytes (TalkType, NetDataType.BYTE);
+
+        WriteBytes (TargetNameLen, NetDataType.BYTE);
+
+        WriteBytes (TargetName, NetDataType.Chars, TargetNameLen);
+
+        WriteBytes (Len, NetDataType.WORD);
+
+        WriteBytes (Content, NetDataType.Chars, Len);
+
+    }
+
+
+
+}
+
diff --git a/Main/NetworkPackage/ClientPack/ClientToGameServer/C02_PlayerTalk/C0206_tagCTalkMi.cs.meta b/Main/NetworkPackage/ClientPack/ClientToGameServer/C02_PlayerTalk/C0206_tagCTalkMi.cs.meta
new file mode 100644
index 0000000..cb7cd93
--- /dev/null
+++ b/Main/NetworkPackage/ClientPack/ClientToGameServer/C02_PlayerTalk/C0206_tagCTalkMi.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: e522bac48da949c439cfa1ce72f2015d
+timeCreated: 1502970390
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/NetworkPackage/ClientPack/ClientToGameServer/C02_PlayerTalk/C0207_tagCTalkArea.cs b/Main/NetworkPackage/ClientPack/ClientToGameServer/C02_PlayerTalk/C0207_tagCTalkArea.cs
new file mode 100644
index 0000000..e6dcb2f
--- /dev/null
+++ b/Main/NetworkPackage/ClientPack/ClientToGameServer/C02_PlayerTalk/C0207_tagCTalkArea.cs
@@ -0,0 +1,19 @@
+using UnityEngine;
+using System.Collections;
+
+//02 07 区域频道#tagCTalkArea

+

+public class C0207_tagCTalkArea : GameNetPackBasic {

+    public ushort Len;

+    public string Content;    //size = Len

+

+    public C0207_tagCTalkArea () {

+        _cmd = (ushort)0x0207;

+    }

+

+    public override void WriteToBytes () {

+        WriteBytes (Len, NetDataType.WORD);

+        WriteBytes (Content, NetDataType.Chars, Len);

+    }

+

+}

diff --git a/Main/NetworkPackage/ClientPack/ClientToGameServer/C02_PlayerTalk/C0207_tagCTalkArea.cs.meta b/Main/NetworkPackage/ClientPack/ClientToGameServer/C02_PlayerTalk/C0207_tagCTalkArea.cs.meta
new file mode 100644
index 0000000..32f6db8
--- /dev/null
+++ b/Main/NetworkPackage/ClientPack/ClientToGameServer/C02_PlayerTalk/C0207_tagCTalkArea.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: eff22d8cbf0977743bf7148bbfd98ffe
+timeCreated: 1502768710
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/NetworkPackage/ClientPack/ClientToGameServer/C02_PlayerTalk/C0208_tagCTalkCountry.cs b/Main/NetworkPackage/ClientPack/ClientToGameServer/C02_PlayerTalk/C0208_tagCTalkCountry.cs
new file mode 100644
index 0000000..ddebcfa
--- /dev/null
+++ b/Main/NetworkPackage/ClientPack/ClientToGameServer/C02_PlayerTalk/C0208_tagCTalkCountry.cs
@@ -0,0 +1,19 @@
+using UnityEngine;
+using System.Collections;
+
+//02 08 国家频道#tagCTalkCountry

+

+public class C0208_tagCTalkCountry : GameNetPackBasic {

+    public ushort Len;

+    public string Content;    //size = Len

+

+    public C0208_tagCTalkCountry () {

+        _cmd = (ushort)0x0208;

+    }

+

+    public override void WriteToBytes () {

+        WriteBytes (Len, NetDataType.WORD);

+        WriteBytes (Content, NetDataType.Chars, Len);

+    }

+

+}

diff --git a/Main/NetworkPackage/ClientPack/ClientToGameServer/C02_PlayerTalk/C0208_tagCTalkCountry.cs.meta b/Main/NetworkPackage/ClientPack/ClientToGameServer/C02_PlayerTalk/C0208_tagCTalkCountry.cs.meta
new file mode 100644
index 0000000..7058c49
--- /dev/null
+++ b/Main/NetworkPackage/ClientPack/ClientToGameServer/C02_PlayerTalk/C0208_tagCTalkCountry.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 03f61f4e99938614b95491aa293c0004
+timeCreated: 1547533853
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/NetworkPackage/ClientPack/ClientToGameServer/C02_PlayerTalk/C0209_tagCTalkMiFix.cs b/Main/NetworkPackage/ClientPack/ClientToGameServer/C02_PlayerTalk/C0209_tagCTalkMiFix.cs
new file mode 100644
index 0000000..23c1974
--- /dev/null
+++ b/Main/NetworkPackage/ClientPack/ClientToGameServer/C02_PlayerTalk/C0209_tagCTalkMiFix.cs
@@ -0,0 +1,23 @@
+using UnityEngine;
+using System.Collections;
+
+//02 09 密频优化#tagCTalkMiFix

+

+public class C0209_tagCTalkMiFix : GameNetPackBasic {

+    public byte TalkType;    //0为默认 1为1对1聊天

+    public uint PlayerID;

+    public ushort Len;

+    public string Content;    //size = Len

+

+    public C0209_tagCTalkMiFix () {

+        _cmd = (ushort)0x0209;

+    }

+

+    public override void WriteToBytes () {

+        WriteBytes (TalkType, NetDataType.BYTE);

+        WriteBytes (PlayerID, NetDataType.DWORD);

+        WriteBytes (Len, NetDataType.WORD);

+        WriteBytes (Content, NetDataType.Chars, Len);

+    }

+

+}

diff --git a/Main/NetworkPackage/ClientPack/ClientToGameServer/C02_PlayerTalk/C0209_tagCTalkMiFix.cs.meta b/Main/NetworkPackage/ClientPack/ClientToGameServer/C02_PlayerTalk/C0209_tagCTalkMiFix.cs.meta
new file mode 100644
index 0000000..d21b90c
--- /dev/null
+++ b/Main/NetworkPackage/ClientPack/ClientToGameServer/C02_PlayerTalk/C0209_tagCTalkMiFix.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 645580c505641e24684252b75ef368d6
+timeCreated: 1502970390
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction.meta b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction.meta
new file mode 100644
index 0000000..07dfd35
--- /dev/null
+++ b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: ed9b5fa1622097949b83432deb77a9e4
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA201_tagCMQueryNPCShopItem.cs b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA201_tagCMQueryNPCShopItem.cs
new file mode 100644
index 0000000..378ee4d
--- /dev/null
+++ b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA201_tagCMQueryNPCShopItem.cs
@@ -0,0 +1,18 @@
+using UnityEngine;
+using System.Collections;
+
+//A2 01 请求npc商店物品信息 #tagCMQueryNPCShopItem

+

+public class CA201_tagCMQueryNPCShopItem : GameNetPackBasic {

+    public uint NPCShopID;    //商店npcid

+

+    public CA201_tagCMQueryNPCShopItem () {

+        combineCmd = (ushort)0x03FE;

+        _cmd = (ushort)0xA201;

+    }

+

+    public override void WriteToBytes () {

+        WriteBytes (NPCShopID, NetDataType.DWORD);

+    }

+

+}

diff --git a/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA201_tagCMQueryNPCShopItem.cs.meta b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA201_tagCMQueryNPCShopItem.cs.meta
new file mode 100644
index 0000000..68e4135
--- /dev/null
+++ b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA201_tagCMQueryNPCShopItem.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 32d724a12783cc8418b8c55ac5e2b1ac
+timeCreated: 1505463111
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA202_tagCMSelectObj.cs b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA202_tagCMSelectObj.cs
new file mode 100644
index 0000000..f16eedd
--- /dev/null
+++ b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA202_tagCMSelectObj.cs
@@ -0,0 +1,25 @@
+锘縰sing UnityEngine;
+using System.Collections;
+
+//A2 02閫氱煡閫変腑瀵硅薄 # tagCMSelectObj
+
+public class CA202_tagCMSelectObj : GameNetPackBasic
+{
+    public byte isSelect;    //0 涓嶉�変腑
+    public byte Type;    //鐩爣绫诲瀷
+    public uint ID;    //ID
+
+    public CA202_tagCMSelectObj()
+    {
+        combineCmd = (ushort)0x03FE;
+        _cmd = (ushort)0xA202;
+    }
+
+    public override void WriteToBytes()
+    {
+        WriteBytes(isSelect, NetDataType.BYTE);
+        WriteBytes(Type, NetDataType.BYTE);
+        WriteBytes(ID, NetDataType.DWORD);
+    }
+
+}
\ No newline at end of file
diff --git a/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA202_tagCMSelectObj.cs.meta b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA202_tagCMSelectObj.cs.meta
new file mode 100644
index 0000000..42e5d44
--- /dev/null
+++ b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA202_tagCMSelectObj.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: fbbd0a74db4e14a428e1a0fc7c69386b
+timeCreated: 1555406256
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA204_tagCMOpenLongWarehouse.cs b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA204_tagCMOpenLongWarehouse.cs
new file mode 100644
index 0000000..cc07e76
--- /dev/null
+++ b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA204_tagCMOpenLongWarehouse.cs
@@ -0,0 +1,16 @@
+using UnityEngine;
+using System.Collections;
+
+//A2 04 请求打开远程仓库 #tagCMOpenLongWarehouse

+

+public class CA204_tagCMOpenLongWarehouse : GameNetPackBasic {

+

+    public CA204_tagCMOpenLongWarehouse () {

+        combineCmd = (ushort)0x03FE;

+        _cmd = (ushort)0xA204;

+    }

+

+    public override void WriteToBytes () {

+    }

+

+}

diff --git a/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA204_tagCMOpenLongWarehouse.cs.meta b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA204_tagCMOpenLongWarehouse.cs.meta
new file mode 100644
index 0000000..b4572e1
--- /dev/null
+++ b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA204_tagCMOpenLongWarehouse.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 9cd236a940519044a83ce42a76ebe229
+timeCreated: 1503995835
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA206_tagCMQuickFinishMission.cs b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA206_tagCMQuickFinishMission.cs
new file mode 100644
index 0000000..fbcf73a
--- /dev/null
+++ b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA206_tagCMQuickFinishMission.cs
@@ -0,0 +1,20 @@
+using UnityEngine;
+using System.Collections;
+
+// A2 06 快速完成任务#tagCMQuickFinishMission

+

+public class CA206_tagCMQuickFinishMission : GameNetPackBasic {

+    public uint MissionID;

+    public byte DoType;    // 0-只完成本次;1-完成所有环任务

+

+    public CA206_tagCMQuickFinishMission () {

+        combineCmd = (ushort)0x03FE;

+        _cmd = (ushort)0xA206;

+    }

+

+    public override void WriteToBytes () {

+        WriteBytes (MissionID, NetDataType.DWORD);

+        WriteBytes (DoType, NetDataType.BYTE);

+    }

+

+}

diff --git a/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA206_tagCMQuickFinishMission.cs.meta b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA206_tagCMQuickFinishMission.cs.meta
new file mode 100644
index 0000000..a251e3f
--- /dev/null
+++ b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA206_tagCMQuickFinishMission.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 837e8dc8090b7c741b4e8ce47109a6a4
+timeCreated: 1509439103
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA210_tagCMClearFBCD.cs b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA210_tagCMClearFBCD.cs
new file mode 100644
index 0000000..0541c3c
--- /dev/null
+++ b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA210_tagCMClearFBCD.cs
@@ -0,0 +1,18 @@
+using UnityEngine;
+using System.Collections;
+
+// A2 10 清除副本CD#tagCMClearFBCD

+

+public class CA210_tagCMClearFBCD : GameNetPackBasic {

+    public uint MapID;

+

+    public CA210_tagCMClearFBCD () {

+        combineCmd = (ushort)0x03FE;

+        _cmd = (ushort)0xA210;

+    }

+

+    public override void WriteToBytes () {

+        WriteBytes (MapID, NetDataType.DWORD);

+    }

+

+}

diff --git a/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA210_tagCMClearFBCD.cs.meta b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA210_tagCMClearFBCD.cs.meta
new file mode 100644
index 0000000..e5fe027
--- /dev/null
+++ b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA210_tagCMClearFBCD.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: b0bbd701b679ffb49ba0ddaee04a0b62
+timeCreated: 1509460537
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA212_tagCMViewPlayerInfo.cs b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA212_tagCMViewPlayerInfo.cs
new file mode 100644
index 0000000..b86ad91
--- /dev/null
+++ b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA212_tagCMViewPlayerInfo.cs
@@ -0,0 +1,23 @@
+using UnityEngine;
+using System.Collections;
+
+//A2 12 查看玩家详细信息#tagCMViewPlayerInfo
+
+public class CA212_tagCMViewPlayerInfo : GameNetPackBasic
+{
+    public uint PlayerID;
+    public byte EquipClassLV;    //大于0为查看指定境界阶装备信息,  0为查看默认信息
+
+    public CA212_tagCMViewPlayerInfo()
+    {
+        combineCmd = (ushort)0x03FE;
+        _cmd = (ushort)0xA212;
+    }
+
+    public override void WriteToBytes()
+    {
+        WriteBytes(PlayerID, NetDataType.DWORD);
+        WriteBytes(EquipClassLV, NetDataType.BYTE);
+    }
+
+}
\ No newline at end of file
diff --git a/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA212_tagCMViewPlayerInfo.cs.meta b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA212_tagCMViewPlayerInfo.cs.meta
new file mode 100644
index 0000000..12167af
--- /dev/null
+++ b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA212_tagCMViewPlayerInfo.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: f227c3364eeb54c459f57b97bb14978f
+timeCreated: 1511770536
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA216_tagCMPyTalk.cs b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA216_tagCMPyTalk.cs
new file mode 100644
index 0000000..a3883a7
--- /dev/null
+++ b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA216_tagCMPyTalk.cs
@@ -0,0 +1,22 @@
+using UnityEngine;
+using System.Collections;
+
+// A2 16 鑷畾涔夌帺瀹惰亰澶� #tagCMPyTalk
+
+public class CA216_tagCMPyTalk : GameNetPackBasic {
+    public byte TalkType;    // 鑷畾涔夎亰澶╃被鍨�
+    public ushort Len;
+    public string Content;    //size = Len
+
+    public CA216_tagCMPyTalk () {
+        combineCmd = (ushort)0x03FE;
+        _cmd = (ushort)0xA216;
+    }
+
+    public override void WriteToBytes () {
+        WriteBytes (TalkType, NetDataType.BYTE);
+        WriteBytes (Len, NetDataType.WORD);
+        WriteBytes (Content, NetDataType.Chars, Len);
+    }
+
+}
diff --git a/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA216_tagCMPyTalk.cs.meta b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA216_tagCMPyTalk.cs.meta
new file mode 100644
index 0000000..8ba5770
--- /dev/null
+++ b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA216_tagCMPyTalk.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 9c3fe5983a8ce40499605c559abcad1d
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA217_tagCMPYSpeaker.cs b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA217_tagCMPYSpeaker.cs
new file mode 100644
index 0000000..a9a4601
--- /dev/null
+++ b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA217_tagCMPYSpeaker.cs
@@ -0,0 +1,26 @@
+using UnityEngine;
+using System.Collections;
+
+// A2 17 喇叭聊天 #tagCMPYSpeaker

+

+public class CA217_tagCMPYSpeaker : GameNetPackBasic {

+    public byte SpeakerType;    //1-本服;2-跨服

+    public byte IsUseGold;    //是否使用钻石

+    public byte ItemIndex;    //使用物品说话时, 物品Index

+    public ushort TextLen;    //字符长度

+    public string Text;    //size = TextLen

+

+    public CA217_tagCMPYSpeaker () {

+        combineCmd = (ushort)0x03FE;

+        _cmd = (ushort)0xA217;

+    }

+

+    public override void WriteToBytes () {

+        WriteBytes (SpeakerType, NetDataType.BYTE);

+        WriteBytes (IsUseGold, NetDataType.BYTE);

+        WriteBytes (ItemIndex, NetDataType.BYTE);

+        WriteBytes (TextLen, NetDataType.WORD);

+        WriteBytes (Text, NetDataType.Chars, TextLen);

+    }

+

+}

diff --git a/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA217_tagCMPYSpeaker.cs.meta b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA217_tagCMPYSpeaker.cs.meta
new file mode 100644
index 0000000..aa5cf17
--- /dev/null
+++ b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA217_tagCMPYSpeaker.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 81c34b5222041684887385bfa43257b7
+timeCreated: 1502874278
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA221_tagCMGetRunTaskEndAward.cs b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA221_tagCMGetRunTaskEndAward.cs
new file mode 100644
index 0000000..e065afc
--- /dev/null
+++ b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA221_tagCMGetRunTaskEndAward.cs
@@ -0,0 +1,18 @@
+using UnityEngine;
+using System.Collections;
+
+// A2 21 领取跑环每轮结束奖励 #tagCMGetRunTaskEndAward

+

+public class CA221_tagCMGetRunTaskEndAward : GameNetPackBasic {

+    public byte Type;    //任务类型

+

+    public CA221_tagCMGetRunTaskEndAward () {

+        combineCmd = (ushort)0x03FE;

+        _cmd = (ushort)0xA221;

+    }

+

+    public override void WriteToBytes () {

+        WriteBytes (Type, NetDataType.BYTE);

+    }

+

+}

diff --git a/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA221_tagCMGetRunTaskEndAward.cs.meta b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA221_tagCMGetRunTaskEndAward.cs.meta
new file mode 100644
index 0000000..509c231
--- /dev/null
+++ b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA221_tagCMGetRunTaskEndAward.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 605194c4c6dc4eb48a128bcc23c03b01
+timeCreated: 1509523798
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA222_tagCMSetGuideOK.cs b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA222_tagCMSetGuideOK.cs
new file mode 100644
index 0000000..e0728a3
--- /dev/null
+++ b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA222_tagCMSetGuideOK.cs
@@ -0,0 +1,23 @@
+锘縰sing UnityEngine;
+using System.Collections;
+
+// A2 22 璁剧疆寮曞鎴愬姛 #tagCMSetGuideOK
+
+public class CA222_tagCMSetGuideOK : GameNetPackBasic
+{
+    public byte GuideIndex;    // 璁板綍浣嶇储寮�, 鍙戦��255鏃�,浠h〃璁剧疆鍏ㄩ儴
+    public byte IsOK;
+
+    public CA222_tagCMSetGuideOK()
+    {
+        combineCmd = (ushort)0x03FE;
+        _cmd = (ushort)0xA222;
+    }
+
+    public override void WriteToBytes()
+    {
+        WriteBytes(GuideIndex, NetDataType.BYTE);
+        WriteBytes(IsOK, NetDataType.BYTE);
+    }
+
+}
\ No newline at end of file
diff --git a/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA222_tagCMSetGuideOK.cs.meta b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA222_tagCMSetGuideOK.cs.meta
new file mode 100644
index 0000000..6b567d2
--- /dev/null
+++ b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA222_tagCMSetGuideOK.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 4a1938f4429f50349974571a9040f5a4
+timeCreated: 1517622122
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA223_tagCMNPCShowEnd.cs b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA223_tagCMNPCShowEnd.cs
new file mode 100644
index 0000000..a05102d
--- /dev/null
+++ b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA223_tagCMNPCShowEnd.cs
@@ -0,0 +1,20 @@
+using UnityEngine;
+using System.Collections;
+
+// A2 23 NPC秀结束 #tagCMNPCShowEnd

+

+public class CA223_tagCMNPCShowEnd : GameNetPackBasic {

+    public uint NPCID;

+    public byte EndType;    // 0-默认;1-跳过

+

+    public CA223_tagCMNPCShowEnd () {

+        combineCmd = (ushort)0x03FE;

+        _cmd = (ushort)0xA223;

+    }

+

+    public override void WriteToBytes () {

+        WriteBytes (NPCID, NetDataType.DWORD);

+        WriteBytes (EndType, NetDataType.BYTE);

+    }

+

+}

diff --git a/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA223_tagCMNPCShowEnd.cs.meta b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA223_tagCMNPCShowEnd.cs.meta
new file mode 100644
index 0000000..3bad968
--- /dev/null
+++ b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA223_tagCMNPCShowEnd.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: bf5a7e187044a7f4f8e7db48eeb8f6d0
+timeCreated: 1512473176
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA224_tagCMTouchNPC.cs b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA224_tagCMTouchNPC.cs
new file mode 100644
index 0000000..e1e4da5
--- /dev/null
+++ b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA224_tagCMTouchNPC.cs
@@ -0,0 +1,21 @@
+锘縰sing UnityEngine;
+using System.Collections;
+
+// A2 24 瑙︾NPC #tagCMTouchNPC
+
+public class CA224_tagCMTouchNPC : GameNetPackBasic
+{
+    public uint ObjID;
+
+    public CA224_tagCMTouchNPC()
+    {
+        combineCmd = (ushort)0x03FE;
+        _cmd = (ushort)0xA224;
+    }
+
+    public override void WriteToBytes()
+    {
+        WriteBytes(ObjID, NetDataType.DWORD);
+    }
+
+}
\ No newline at end of file
diff --git a/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA224_tagCMTouchNPC.cs.meta b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA224_tagCMTouchNPC.cs.meta
new file mode 100644
index 0000000..48ce9aa
--- /dev/null
+++ b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA224_tagCMTouchNPC.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 4cbcd46603dd47441a850c1982f68f07
+timeCreated: 1513752991
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA225_tagCMClientTaskCount.cs b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA225_tagCMClientTaskCount.cs
new file mode 100644
index 0000000..f3f2ce4
--- /dev/null
+++ b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA225_tagCMClientTaskCount.cs
@@ -0,0 +1,20 @@
+using UnityEngine;
+using System.Collections;
+
+//A2 25 瀹㈡埛绔换鍔¤鏁� # tagCMClientTaskCount
+
+public class CA225_tagCMClientTaskCount : GameNetPackBasic {
+    public uint CountID;    // 璁℃暟ID锛屽鎴风涓庣瓥鍒掔害瀹氾紝鍙互鏄疦PCID鎴栧叾浠�
+    public byte Type;    // 1-鏉�鎬�
+
+    public CA225_tagCMClientTaskCount () {
+        combineCmd = (ushort)0x03FE;
+        _cmd = (ushort)0xA225;
+    }
+
+    public override void WriteToBytes () {
+        WriteBytes (CountID, NetDataType.DWORD);
+        WriteBytes (Type, NetDataType.BYTE);
+    }
+
+}
diff --git a/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA225_tagCMClientTaskCount.cs.meta b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA225_tagCMClientTaskCount.cs.meta
new file mode 100644
index 0000000..0eba069
--- /dev/null
+++ b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA225_tagCMClientTaskCount.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 7172610959203e54e808aeaca380eaa1
+timeCreated: 1514292391
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA226_tagCMVoiceChat.cs b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA226_tagCMVoiceChat.cs
new file mode 100644
index 0000000..b8cc0c4
--- /dev/null
+++ b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA226_tagCMVoiceChat.cs
@@ -0,0 +1,28 @@
+using UnityEngine;
+using System.Collections;
+
+//A2 26 语音聊天 #tagCMVoiceChat

+

+public class CA226_tagCMVoiceChat : GameNetPackBasic {

+    public byte ChannelType;    //  5 区域 --- 查看封包tagCGVoiceChat 1 世界 2 仙盟 3 私聊(好友) 4 队伍

+    public byte TargetNameLen;

+    public string TargetName;    //size = TargetNameLen

+    public uint TargetID;    // 私聊默认发玩家ID,没有ID才发名称

+    public ushort Len;

+    public  byte[] Content;    //size = Len

+

+    public CA226_tagCMVoiceChat () {

+        combineCmd = (ushort)0x03FE;

+        _cmd = (ushort)0xA226;

+    }

+

+    public override void WriteToBytes () {

+        WriteBytes (ChannelType, NetDataType.BYTE);

+        WriteBytes (TargetNameLen, NetDataType.BYTE);

+        WriteBytes (TargetName, NetDataType.Chars, TargetNameLen);

+        WriteBytes (TargetID, NetDataType.DWORD);

+        WriteBytes (Len, NetDataType.WORD);

+        WriteBytes (Content, NetDataType.BYTE, Len);

+    }

+

+}

diff --git a/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA226_tagCMVoiceChat.cs.meta b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA226_tagCMVoiceChat.cs.meta
new file mode 100644
index 0000000..98877ac
--- /dev/null
+++ b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA226_tagCMVoiceChat.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: e6a01da96cdf6cf439a0782502efc0ce
+timeCreated: 1524707101
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA227_tagCMQueryNPCCntInfo.cs b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA227_tagCMQueryNPCCntInfo.cs
new file mode 100644
index 0000000..3a0bd62
--- /dev/null
+++ b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA227_tagCMQueryNPCCntInfo.cs
@@ -0,0 +1,29 @@
+锘縰sing UnityEngine;
+using System.Collections;
+
+// A2 27 鏌ヨ鍦板浘NPC鏁伴噺淇℃伅 #tagCMQueryNPCCntInfo
+
+public class CA227_tagCMQueryNPCCntInfo : GameNetPackBasic
+{
+    public uint MapID;    // 鐩爣鍦板浘ID
+    public ushort LineID;    // 绾胯矾ID
+    public byte IsNoTimeLimit;    //鏄惁娌℃湁鏌ヨ鏃堕棿闄愬埗,榛樿鏈夐檺鍒�
+    public byte NPCIDListLen;
+    public string NPCIDList;    // 闇�瑕佹煡璇㈢殑NPCID鍒楄〃
+
+    public CA227_tagCMQueryNPCCntInfo()
+    {
+        combineCmd = (ushort)0x03FE;
+        _cmd = (ushort)0xA227;
+    }
+
+    public override void WriteToBytes()
+    {
+        WriteBytes(MapID, NetDataType.DWORD);
+        WriteBytes(LineID, NetDataType.WORD);
+        WriteBytes(IsNoTimeLimit, NetDataType.BYTE);
+        WriteBytes(NPCIDListLen, NetDataType.BYTE);
+        WriteBytes(NPCIDList, NetDataType.Chars, NPCIDListLen);
+    }
+
+}
\ No newline at end of file
diff --git a/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA227_tagCMQueryNPCCntInfo.cs.meta b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA227_tagCMQueryNPCCntInfo.cs.meta
new file mode 100644
index 0000000..45c2534
--- /dev/null
+++ b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA227_tagCMQueryNPCCntInfo.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: cd1ae837bd2fb0740a2eebd1bd12e4bf
+timeCreated: 1534765562
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA228_tagCMQueryFamilyBossHurt.cs b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA228_tagCMQueryFamilyBossHurt.cs
new file mode 100644
index 0000000..87fe802
--- /dev/null
+++ b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA228_tagCMQueryFamilyBossHurt.cs
@@ -0,0 +1,22 @@
+using UnityEngine;
+using System.Collections;
+
+// A2 28 查询仙盟抢Boss伤血列表 #tagCMQueryFamilyBossHurt

+

+public class CA228_tagCMQueryFamilyBossHurt : GameNetPackBasic {

+    public uint ObjID;

+    public uint NPCID;

+    public byte QueryType;    // 0-实时仙盟伤血,1-历史仙盟伤血,2-实时玩家伤血,3-历史玩家伤血

+

+    public CA228_tagCMQueryFamilyBossHurt () {

+        combineCmd = (ushort)0x03FE;

+        _cmd = (ushort)0xA228;

+    }

+

+    public override void WriteToBytes () {

+        WriteBytes (ObjID, NetDataType.DWORD);

+        WriteBytes (NPCID, NetDataType.DWORD);

+        WriteBytes (QueryType, NetDataType.BYTE);

+    }

+

+}

diff --git a/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA228_tagCMQueryFamilyBossHurt.cs.meta b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA228_tagCMQueryFamilyBossHurt.cs.meta
new file mode 100644
index 0000000..285e087
--- /dev/null
+++ b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA228_tagCMQueryFamilyBossHurt.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 983c43e61a332a34298145db9e1355d6
+timeCreated: 1535424857
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA230_tagCMSetChatBubbleBox.cs b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA230_tagCMSetChatBubbleBox.cs
new file mode 100644
index 0000000..1f13e87
--- /dev/null
+++ b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA230_tagCMSetChatBubbleBox.cs
@@ -0,0 +1,18 @@
+using UnityEngine;
+using System.Collections;
+
+// A2 30 设置聊天气泡框 #tagCMSetChatBubbleBox

+

+public class CA230_tagCMSetChatBubbleBox : GameNetPackBasic {

+    public byte BubbleBoxType;    //气泡框类型

+

+    public CA230_tagCMSetChatBubbleBox () {

+        combineCmd = (ushort)0x03FE;

+        _cmd = (ushort)0xA230;

+    }

+

+    public override void WriteToBytes () {

+        WriteBytes (BubbleBoxType, NetDataType.BYTE);

+    }

+

+}

diff --git a/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA230_tagCMSetChatBubbleBox.cs.meta b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA230_tagCMSetChatBubbleBox.cs.meta
new file mode 100644
index 0000000..975baf7
--- /dev/null
+++ b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA230_tagCMSetChatBubbleBox.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 2bd82e50dd886f640bb5c2c2a95029ae
+timeCreated: 1541388926
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA231_tagCMClientStartCustomScene.cs b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA231_tagCMClientStartCustomScene.cs
new file mode 100644
index 0000000..3eab4a0
--- /dev/null
+++ b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA231_tagCMClientStartCustomScene.cs
@@ -0,0 +1,25 @@
+锘縰sing UnityEngine;
+using System.Collections;
+
+// A2 31 鍓嶇寮�濮嬭嚜瀹氫箟鍦烘櫙 #tagCMClientStartCustomScene
+
+public class CA231_tagCMClientStartCustomScene : GameNetPackBasic
+{
+    public uint MapID;

+    public ushort FuncLineID;
+
+
+
+    public CA231_tagCMClientStartCustomScene()
+    {
+        combineCmd = (ushort)0x03FE;
+        _cmd = (ushort)0xA231;
+    }
+
+    public override void WriteToBytes()
+    {
+        WriteBytes(MapID, NetDataType.DWORD);

+        WriteBytes(FuncLineID, NetDataType.WORD);
+    }
+
+}
\ No newline at end of file
diff --git a/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA231_tagCMClientStartCustomScene.cs.meta b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA231_tagCMClientStartCustomScene.cs.meta
new file mode 100644
index 0000000..3522bbe
--- /dev/null
+++ b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA231_tagCMClientStartCustomScene.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: dac5e3d3907d6e94a86612907372331c
+timeCreated: 1550133153
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA232_tagCMRefreshMysticalShop.cs b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA232_tagCMRefreshMysticalShop.cs
new file mode 100644
index 0000000..f199dfc
--- /dev/null
+++ b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA232_tagCMRefreshMysticalShop.cs
@@ -0,0 +1,19 @@
+锘縰sing UnityEngine;
+using System.Collections;
+
+// A2 32 绁炵鍟嗗簵鍒锋柊 #tagCMRefreshMysticalShop
+
+public class CA232_tagCMRefreshMysticalShop : GameNetPackBasic
+{
+
+    public CA232_tagCMRefreshMysticalShop()
+    {
+        combineCmd = (ushort)0x03FE;
+        _cmd = (ushort)0xA232;
+    }
+
+    public override void WriteToBytes()
+    {
+    }
+
+}
\ No newline at end of file
diff --git a/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA232_tagCMRefreshMysticalShop.cs.meta b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA232_tagCMRefreshMysticalShop.cs.meta
new file mode 100644
index 0000000..0f3a1b3
--- /dev/null
+++ b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA232_tagCMRefreshMysticalShop.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 18beaa3b153bbc145a3d8de5fff41866
+timeCreated: 1551083019
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA233_tagCMClientExitCustomScene.cs b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA233_tagCMClientExitCustomScene.cs
new file mode 100644
index 0000000..d45474b
--- /dev/null
+++ b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA233_tagCMClientExitCustomScene.cs
@@ -0,0 +1,16 @@
+using UnityEngine;
+using System.Collections;
+
+// A2 33 前端退出自定义场景 #tagCMClientExitCustomScene

+

+public class CA233_tagCMClientExitCustomScene : GameNetPackBasic {

+

+    public CA233_tagCMClientExitCustomScene () {

+        combineCmd = (ushort)0x03FE;

+        _cmd = (ushort)0xA233;

+    }

+

+    public override void WriteToBytes () {

+    }

+

+}

diff --git a/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA233_tagCMClientExitCustomScene.cs.meta b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA233_tagCMClientExitCustomScene.cs.meta
new file mode 100644
index 0000000..020b8f2
--- /dev/null
+++ b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA233_tagCMClientExitCustomScene.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: f040e374599a6384bacdea70b3860c14
+timeCreated: 1555060344
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA234_tagCMGetCustomSceneCollectAward.cs b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA234_tagCMGetCustomSceneCollectAward.cs
new file mode 100644
index 0000000..422d3bf
--- /dev/null
+++ b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA234_tagCMGetCustomSceneCollectAward.cs
@@ -0,0 +1,18 @@
+using UnityEngine;
+using System.Collections;
+
+// A2 34 自定义场景中获取采集奖励 #tagCMGetCustomSceneCollectAward

+

+public class CA234_tagCMGetCustomSceneCollectAward : GameNetPackBasic {

+    public uint NPCID;    //采集的NPCID

+

+    public CA234_tagCMGetCustomSceneCollectAward () {

+        combineCmd = (ushort)0x03FE;

+        _cmd = (ushort)0xA234;

+    }

+

+    public override void WriteToBytes () {

+        WriteBytes (NPCID, NetDataType.DWORD);

+    }

+

+}

diff --git a/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA234_tagCMGetCustomSceneCollectAward.cs.meta b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA234_tagCMGetCustomSceneCollectAward.cs.meta
new file mode 100644
index 0000000..b1ee448
--- /dev/null
+++ b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA234_tagCMGetCustomSceneCollectAward.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: f0d0635cf0a0bd64f8f4742fb964f93f
+timeCreated: 1555412785
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA235_tagCMSelectRealmDifficulty.cs b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA235_tagCMSelectRealmDifficulty.cs
new file mode 100644
index 0000000..a138209
--- /dev/null
+++ b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA235_tagCMSelectRealmDifficulty.cs
@@ -0,0 +1,18 @@
+using UnityEngine;
+using System.Collections;
+
+// A2 35 閫夋嫨澧冪晫闅惧害灞傜骇 #tagCMSelectRealmDifficulty
+
+public class CA235_tagCMSelectRealmDifficulty : GameNetPackBasic {
+    public ushort RealmDifficulty;    //澧冪晫闅惧害 = 1000 + 鎵�閫夊鐣岀瓑绾э紝濡傚鐣�13锛屽垯鍙�1013
+
+    public CA235_tagCMSelectRealmDifficulty () {
+        combineCmd = (ushort)0x03FE;
+        _cmd = (ushort)0xA235;
+    }
+
+    public override void WriteToBytes () {
+        WriteBytes (RealmDifficulty, NetDataType.WORD);
+    }
+
+}
diff --git a/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA235_tagCMSelectRealmDifficulty.cs.meta b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA235_tagCMSelectRealmDifficulty.cs.meta
new file mode 100644
index 0000000..055ccfa
--- /dev/null
+++ b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA235_tagCMSelectRealmDifficulty.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: e433770f5f2e9b146909ab44ba8c5530
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA236_tagCMChatBubbleBoxStarUP.cs b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA236_tagCMChatBubbleBoxStarUP.cs
new file mode 100644
index 0000000..b586767
--- /dev/null
+++ b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA236_tagCMChatBubbleBoxStarUP.cs
@@ -0,0 +1,18 @@
+using UnityEngine;
+using System.Collections;
+
+// A2 36 鑱婂ぉ姘旀场妗嗗崌鏄� #tagCMChatBubbleBoxStarUP
+
+public class CA236_tagCMChatBubbleBoxStarUP : GameNetPackBasic {
+    public byte BoxID;    //姘旀场ID
+
+    public CA236_tagCMChatBubbleBoxStarUP () {
+        combineCmd = (ushort)0x03FE;
+        _cmd = (ushort)0xA236;
+    }
+
+    public override void WriteToBytes () {
+        WriteBytes (BoxID, NetDataType.BYTE);
+    }
+
+}
diff --git a/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA236_tagCMChatBubbleBoxStarUP.cs.meta b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA236_tagCMChatBubbleBoxStarUP.cs.meta
new file mode 100644
index 0000000..beac235
--- /dev/null
+++ b/Main/NetworkPackage/ClientPack/ClientToGameServer/CA2_Interaction/CA236_tagCMChatBubbleBoxStarUP.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: cfc606a6bfea0af4bbd3563512f33410
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/NetworkPackage/ServerPack/H02_PlayerTalk/H0201_tagTalkGong.cs b/Main/NetworkPackage/ServerPack/H02_PlayerTalk/H0201_tagTalkGong.cs
new file mode 100644
index 0000000..e202acb
--- /dev/null
+++ b/Main/NetworkPackage/ServerPack/H02_PlayerTalk/H0201_tagTalkGong.cs
@@ -0,0 +1,55 @@
+using UnityEngine;
+using System.Collections;
+
+//02 01 公屏#tagTalkGong
+
+
+
+public class H0201_tagTalkGong : GameNetPackBasic {
+
+    public byte NameLen;
+
+    public string Name;    //size = NameLen
+
+    public uint PlayerID;
+
+    public ushort Len;
+
+    public string Content;    //size = Len
+
+    public uint ExtraValue;    //附加值
+
+    public string Extras;    //附加值列表
+
+
+
+    public H0201_tagTalkGong () {
+
+        _cmd = (ushort)0x0201;
+
+    }
+
+
+
+    public override void ReadFromBytes (byte[] vBytes) {
+
+        TransBytes (out NameLen, vBytes, NetDataType.BYTE);
+
+        TransBytes (out Name, vBytes, NetDataType.Chars, NameLen);
+
+        TransBytes (out PlayerID, vBytes, NetDataType.DWORD);
+
+        TransBytes (out Len, vBytes, NetDataType.WORD);
+
+        TransBytes (out Content, vBytes, NetDataType.Chars, Len);
+
+        TransBytes (out ExtraValue, vBytes, NetDataType.DWORD);
+
+        TransBytes (out Extras, vBytes, NetDataType.Chars, 256);
+
+    }
+
+
+
+}
+
diff --git a/Main/NetworkPackage/ServerPack/H02_PlayerTalk/H0201_tagTalkGong.cs.meta b/Main/NetworkPackage/ServerPack/H02_PlayerTalk/H0201_tagTalkGong.cs.meta
new file mode 100644
index 0000000..fe7c5c4
--- /dev/null
+++ b/Main/NetworkPackage/ServerPack/H02_PlayerTalk/H0201_tagTalkGong.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 59bcc1189c8216d4f873182f0f465e1e
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/NetworkPackage/ServerPack/H02_PlayerTalk/H0203_tagTalkBang.cs b/Main/NetworkPackage/ServerPack/H02_PlayerTalk/H0203_tagTalkBang.cs
new file mode 100644
index 0000000..cc4dde2
--- /dev/null
+++ b/Main/NetworkPackage/ServerPack/H02_PlayerTalk/H0203_tagTalkBang.cs
@@ -0,0 +1,29 @@
+using UnityEngine;
+using System.Collections;
+
+//02 03 家族频 #tagTalkBang

+

+public class H0203_tagTalkBang : GameNetPackBasic {

+    public byte NameLen;

+    public string Name;    //size = NameLen

+    public uint PlayerID;

+    public ushort Len;

+    public string Content;    //size = Len

+    public uint ExtraValue;    //附加值

+    public string Extras;    //附加值列表

+

+    public H0203_tagTalkBang () {

+        _cmd = (ushort)0x0203;

+    }

+

+    public override void ReadFromBytes (byte[] vBytes) {

+        TransBytes (out NameLen, vBytes, NetDataType.BYTE);

+        TransBytes (out Name, vBytes, NetDataType.Chars, NameLen);

+        TransBytes (out PlayerID, vBytes, NetDataType.DWORD);

+        TransBytes (out Len, vBytes, NetDataType.WORD);

+        TransBytes (out Content, vBytes, NetDataType.Chars, Len);

+        TransBytes (out ExtraValue, vBytes, NetDataType.DWORD);

+        TransBytes (out Extras, vBytes, NetDataType.Chars, 256);

+    }

+

+}

diff --git a/Main/NetworkPackage/ServerPack/H02_PlayerTalk/H0203_tagTalkBang.cs.meta b/Main/NetworkPackage/ServerPack/H02_PlayerTalk/H0203_tagTalkBang.cs.meta
new file mode 100644
index 0000000..ba53dcc
--- /dev/null
+++ b/Main/NetworkPackage/ServerPack/H02_PlayerTalk/H0203_tagTalkBang.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 48c7cc1b683baa446a59013bc6ae3add
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/NetworkPackage/ServerPack/H02_PlayerTalk/H0205_tagTalkDui.cs b/Main/NetworkPackage/ServerPack/H02_PlayerTalk/H0205_tagTalkDui.cs
new file mode 100644
index 0000000..1700637
--- /dev/null
+++ b/Main/NetworkPackage/ServerPack/H02_PlayerTalk/H0205_tagTalkDui.cs
@@ -0,0 +1,29 @@
+using UnityEngine;
+using System.Collections;
+
+//02 05 对频#tagTalkDui

+

+public class H0205_tagTalkDui : GameNetPackBasic {

+    public byte NameLen;

+    public string Name;    //size = NameLen

+    public uint PlayerID;

+    public ushort Len;

+    public string Content;    //size = Len

+    public uint ExtraValue;    //附加值

+    public string Extras;    //附加值列表

+

+    public H0205_tagTalkDui () {

+        _cmd = (ushort)0x0205;

+    }

+

+    public override void ReadFromBytes (byte[] vBytes) {

+        TransBytes (out NameLen, vBytes, NetDataType.BYTE);

+        TransBytes (out Name, vBytes, NetDataType.Chars, NameLen);

+        TransBytes (out PlayerID, vBytes, NetDataType.DWORD);

+        TransBytes (out Len, vBytes, NetDataType.WORD);

+        TransBytes (out Content, vBytes, NetDataType.Chars, Len);

+        TransBytes (out ExtraValue, vBytes, NetDataType.DWORD);

+        TransBytes (out Extras, vBytes, NetDataType.Chars, 256);

+    }

+

+}

diff --git a/Main/NetworkPackage/ServerPack/H02_PlayerTalk/H0205_tagTalkDui.cs.meta b/Main/NetworkPackage/ServerPack/H02_PlayerTalk/H0205_tagTalkDui.cs.meta
new file mode 100644
index 0000000..e16f375
--- /dev/null
+++ b/Main/NetworkPackage/ServerPack/H02_PlayerTalk/H0205_tagTalkDui.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 3f850a2ad6e22814eaf88e3c521a03e2
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/NetworkPackage/ServerPack/H02_PlayerTalk/H0206_tagTalkMi.cs b/Main/NetworkPackage/ServerPack/H02_PlayerTalk/H0206_tagTalkMi.cs
new file mode 100644
index 0000000..5f16bd9
--- /dev/null
+++ b/Main/NetworkPackage/ServerPack/H02_PlayerTalk/H0206_tagTalkMi.cs
@@ -0,0 +1,37 @@
+using UnityEngine;
+using System.Collections;
+
+//02 06 密频 #tagTalkMi

+

+public class H0206_tagTalkMi : GameNetPackBasic {

+    public byte TalkType;    //0为默认, 1为1对1聊天用

+    public byte SrcNameLen;

+    public string SrcName;    //size = SrcNameLen

+    public uint PlayerID;

+    public byte ToNameLen;

+    public string ToName;    //size = ToNameLen

+    public uint ToPlayerID;

+    public ushort Len;

+    public string Content;    //size = Len

+    public uint ExtraValue;    //附加值

+    public string Extras;    //附加值列表

+

+    public H0206_tagTalkMi () {

+        _cmd = (ushort)0x0206;

+    }

+

+    public override void ReadFromBytes (byte[] vBytes) {

+        TransBytes (out TalkType, vBytes, NetDataType.BYTE);

+        TransBytes (out SrcNameLen, vBytes, NetDataType.BYTE);

+        TransBytes (out SrcName, vBytes, NetDataType.Chars, SrcNameLen);

+        TransBytes (out PlayerID, vBytes, NetDataType.DWORD);

+        TransBytes (out ToNameLen, vBytes, NetDataType.BYTE);

+        TransBytes (out ToName, vBytes, NetDataType.Chars, ToNameLen);

+        TransBytes (out ToPlayerID, vBytes, NetDataType.DWORD);

+        TransBytes (out Len, vBytes, NetDataType.WORD);

+        TransBytes (out Content, vBytes, NetDataType.Chars, Len);

+        TransBytes (out ExtraValue, vBytes, NetDataType.DWORD);

+        TransBytes (out Extras, vBytes, NetDataType.Chars, 256);

+    }

+

+}

diff --git a/Main/NetworkPackage/ServerPack/H02_PlayerTalk/H0206_tagTalkMi.cs.meta b/Main/NetworkPackage/ServerPack/H02_PlayerTalk/H0206_tagTalkMi.cs.meta
new file mode 100644
index 0000000..ea097cf
--- /dev/null
+++ b/Main/NetworkPackage/ServerPack/H02_PlayerTalk/H0206_tagTalkMi.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 580543451e143be49b0a211ef8358d69
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/NetworkPackage/ServerPack/H02_PlayerTalk/H0207_tagTalkArea.cs b/Main/NetworkPackage/ServerPack/H02_PlayerTalk/H0207_tagTalkArea.cs
new file mode 100644
index 0000000..62c9601
--- /dev/null
+++ b/Main/NetworkPackage/ServerPack/H02_PlayerTalk/H0207_tagTalkArea.cs
@@ -0,0 +1,29 @@
+using UnityEngine;
+using System.Collections;
+
+//02 07 区域频道#tagTalkArea

+

+public class H0207_tagTalkArea : GameNetPackBasic {

+    public byte SrcNameLen;

+    public string SrcName;    //size = SrcNameLen

+    public uint PlayerID;

+    public ushort Len;

+    public string Content;    //size = Len

+    public uint ExtraValue;    //附加值

+    public string Extras;    //附加值列表

+

+    public H0207_tagTalkArea () {

+        _cmd = (ushort)0x0207;

+    }

+

+    public override void ReadFromBytes (byte[] vBytes) {

+        TransBytes (out SrcNameLen, vBytes, NetDataType.BYTE);

+        TransBytes (out SrcName, vBytes, NetDataType.Chars, SrcNameLen);

+        TransBytes (out PlayerID, vBytes, NetDataType.DWORD);

+        TransBytes (out Len, vBytes, NetDataType.WORD);

+        TransBytes (out Content, vBytes, NetDataType.Chars, Len);

+        TransBytes (out ExtraValue, vBytes, NetDataType.DWORD);

+        TransBytes (out Extras, vBytes, NetDataType.Chars, 256);

+    }

+

+}

diff --git a/Main/NetworkPackage/ServerPack/H02_PlayerTalk/H0207_tagTalkArea.cs.meta b/Main/NetworkPackage/ServerPack/H02_PlayerTalk/H0207_tagTalkArea.cs.meta
new file mode 100644
index 0000000..f052bc1
--- /dev/null
+++ b/Main/NetworkPackage/ServerPack/H02_PlayerTalk/H0207_tagTalkArea.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 6305204e0859d9d4b975cd3417521ffa
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/NetworkPackage/ServerPack/H02_PlayerTalk/H0208_tagTalkCountry.cs b/Main/NetworkPackage/ServerPack/H02_PlayerTalk/H0208_tagTalkCountry.cs
new file mode 100644
index 0000000..720f918
--- /dev/null
+++ b/Main/NetworkPackage/ServerPack/H02_PlayerTalk/H0208_tagTalkCountry.cs
@@ -0,0 +1,29 @@
+using UnityEngine;
+using System.Collections;
+
+//02 08 国家频道#tagTalkCountry

+

+public class H0208_tagTalkCountry : GameNetPackBasic {

+    public byte NameLen;

+    public string Name;    //size = NameLen

+    public uint PlayerID;

+    public ushort Len;

+    public string Content;    //size = Len

+    public uint ExtraValue;    //附加值

+    public string Extras;    //附加值列表

+

+    public H0208_tagTalkCountry () {

+        _cmd = (ushort)0x0208;

+    }

+

+    public override void ReadFromBytes (byte[] vBytes) {

+        TransBytes (out NameLen, vBytes, NetDataType.BYTE);

+        TransBytes (out Name, vBytes, NetDataType.Chars, NameLen);

+        TransBytes (out PlayerID, vBytes, NetDataType.DWORD);

+        TransBytes (out Len, vBytes, NetDataType.WORD);

+        TransBytes (out Content, vBytes, NetDataType.Chars, Len);

+        TransBytes (out ExtraValue, vBytes, NetDataType.DWORD);

+        TransBytes (out Extras, vBytes, NetDataType.Chars, 256);

+    }

+

+}

diff --git a/Main/NetworkPackage/ServerPack/H02_PlayerTalk/H0208_tagTalkCountry.cs.meta b/Main/NetworkPackage/ServerPack/H02_PlayerTalk/H0208_tagTalkCountry.cs.meta
new file mode 100644
index 0000000..335cdd8
--- /dev/null
+++ b/Main/NetworkPackage/ServerPack/H02_PlayerTalk/H0208_tagTalkCountry.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 2a22596d78c8a1b428f562758794a03f
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/NetworkPackage/ServerPack/H32_GM.meta b/Main/NetworkPackage/ServerPack/H32_GM.meta
new file mode 100644
index 0000000..54cf4fe
--- /dev/null
+++ b/Main/NetworkPackage/ServerPack/H32_GM.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: eb197269b77e5d143b80dd9eca6aa305
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/NetworkPackage/ServerPack/H32_GM/H3202_tagServerResponse.cs b/Main/NetworkPackage/ServerPack/H32_GM/H3202_tagServerResponse.cs
new file mode 100644
index 0000000..be3bded
--- /dev/null
+++ b/Main/NetworkPackage/ServerPack/H32_GM/H3202_tagServerResponse.cs
@@ -0,0 +1,35 @@
+using UnityEngine;
+using System.Collections;
+
+//32 02 服务器回应客户端消息#tagServerResponse
+
+
+
+public class H3202_tagServerResponse : GameNetPackBasic {
+
+    public ushort Len;
+
+    public string Message;    //size = Len
+
+
+
+    public H3202_tagServerResponse () {
+
+        _cmd = (ushort)0x3202;
+
+    }
+
+
+
+    public override void ReadFromBytes (byte[] vBytes) {
+
+        TransBytes (out Len, vBytes, NetDataType.WORD);
+
+        TransBytes (out Message, vBytes, NetDataType.Chars, Len);
+
+    }
+
+
+
+}
+
diff --git a/Main/NetworkPackage/ServerPack/H32_GM/H3202_tagServerResponse.cs.meta b/Main/NetworkPackage/ServerPack/H32_GM/H3202_tagServerResponse.cs.meta
new file mode 100644
index 0000000..85fa9cd
--- /dev/null
+++ b/Main/NetworkPackage/ServerPack/H32_GM/H3202_tagServerResponse.cs.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 92b8e0cb83d24f343ad262a74d4bd4bf
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
diff --git a/Main/NetworkPackage/ServerPack/HA7_Interaction.meta b/Main/NetworkPackage/ServerPack/HA7_Interaction.meta
new file mode 100644
index 0000000..16d2ab5
--- /dev/null
+++ b/Main/NetworkPackage/ServerPack/HA7_Interaction.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: c0bb9295f75577e46b35d06e99629649
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/NetworkPackage/ServerPack/HA7_Interaction/HA707_tagMCPyTalk.cs b/Main/NetworkPackage/ServerPack/HA7_Interaction/HA707_tagMCPyTalk.cs
new file mode 100644
index 0000000..fac2e2c
--- /dev/null
+++ b/Main/NetworkPackage/ServerPack/HA7_Interaction/HA707_tagMCPyTalk.cs
@@ -0,0 +1,31 @@
+using UnityEngine;
+using System.Collections;
+
+// A7 07 閫氱煡鐜╁鑷畾涔夎亰澶� #tagMCPyTalk
+
+public class HA707_tagMCPyTalk : GameNetPackBasic {
+    public byte TalkType;    // 鑷畾涔夎亰澶╃被鍨�
+    public byte NameLen;
+    public string Name;    //size = NameLen
+    public uint PlayerID;
+    public ushort Len;
+    public string Content;    //size = Len
+    public uint ExtraValue;    //闄勫姞鍊�
+    public string Extras;    //闄勫姞鍊煎垪琛�
+
+    public HA707_tagMCPyTalk () {
+        _cmd = (ushort)0xA707;
+    }
+
+    public override void ReadFromBytes (byte[] vBytes) {
+        TransBytes (out TalkType, vBytes, NetDataType.BYTE);
+        TransBytes (out NameLen, vBytes, NetDataType.BYTE);
+        TransBytes (out Name, vBytes, NetDataType.Chars, NameLen);
+        TransBytes (out PlayerID, vBytes, NetDataType.DWORD);
+        TransBytes (out Len, vBytes, NetDataType.WORD);
+        TransBytes (out Content, vBytes, NetDataType.Chars, Len);
+        TransBytes (out ExtraValue, vBytes, NetDataType.DWORD);
+        TransBytes (out Extras, vBytes, NetDataType.Chars, 256);
+    }
+
+}
diff --git a/Main/NetworkPackage/ServerPack/HA7_Interaction/HA707_tagMCPyTalk.cs.meta b/Main/NetworkPackage/ServerPack/HA7_Interaction/HA707_tagMCPyTalk.cs.meta
new file mode 100644
index 0000000..cbd714d
--- /dev/null
+++ b/Main/NetworkPackage/ServerPack/HA7_Interaction/HA707_tagMCPyTalk.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: e54b51ae2e7743d47b45deda5bae0ce6
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/NetworkPackage/ServerPack/HA9_Function.meta b/Main/NetworkPackage/ServerPack/HA9_Function.meta
new file mode 100644
index 0000000..186ddcf
--- /dev/null
+++ b/Main/NetworkPackage/ServerPack/HA9_Function.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: f1e49f633fb6f704ab59547a9b1b4753
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/NetworkPackage/ServerPack/HA9_Function/HA9A3_tagGCPYSpeakerContent.cs b/Main/NetworkPackage/ServerPack/HA9_Function/HA9A3_tagGCPYSpeakerContent.cs
new file mode 100644
index 0000000..30a2c30
--- /dev/null
+++ b/Main/NetworkPackage/ServerPack/HA9_Function/HA9A3_tagGCPYSpeakerContent.cs
@@ -0,0 +1,35 @@
+using UnityEngine;
+using System.Collections;
+
+// A9 A3 喇叭聊天内容 #tagGCPYSpeakerContent

+

+public class HA9A3_tagGCPYSpeakerContent : GameNetPackBasic {

+    public byte AccIDLen;

+    public string AccID;    //size = AccIDLen

+    public uint PlayerID;    // 子服的玩家ID,该ID有值时为本服玩家

+    public byte NameLen;

+    public string Name;    //size = NameLen

+    public byte SpeakerType;

+    public ushort TextLen;

+    public string Text;    //size = TextLen

+    public uint ExtraValue;    //附加值

+    public string Extras;    //附加值列表

+

+    public HA9A3_tagGCPYSpeakerContent () {

+        _cmd = (ushort)0xA9A3;

+    }

+

+    public override void ReadFromBytes (byte[] vBytes) {

+        TransBytes (out AccIDLen, vBytes, NetDataType.BYTE);

+        TransBytes (out AccID, vBytes, NetDataType.Chars, AccIDLen);

+        TransBytes (out PlayerID, vBytes, NetDataType.DWORD);

+        TransBytes (out NameLen, vBytes, NetDataType.BYTE);

+        TransBytes (out Name, vBytes, NetDataType.Chars, NameLen);

+        TransBytes (out SpeakerType, vBytes, NetDataType.BYTE);

+        TransBytes (out TextLen, vBytes, NetDataType.WORD);

+        TransBytes (out Text, vBytes, NetDataType.Chars, TextLen);

+        TransBytes (out ExtraValue, vBytes, NetDataType.DWORD);

+        TransBytes (out Extras, vBytes, NetDataType.Chars, 256);

+    }

+

+}

diff --git a/Main/NetworkPackage/ServerPack/HA9_Function/HA9A3_tagGCPYSpeakerContent.cs.meta b/Main/NetworkPackage/ServerPack/HA9_Function/HA9A3_tagGCPYSpeakerContent.cs.meta
new file mode 100644
index 0000000..8bc19c5
--- /dev/null
+++ b/Main/NetworkPackage/ServerPack/HA9_Function/HA9A3_tagGCPYSpeakerContent.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: a8be9ab1f11a39f4cad05114e4a9cb2a
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/NetworkPackage/ServerPack/HB3_PlayerSocial.meta b/Main/NetworkPackage/ServerPack/HB3_PlayerSocial.meta
new file mode 100644
index 0000000..516f250
--- /dev/null
+++ b/Main/NetworkPackage/ServerPack/HB3_PlayerSocial.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 98a56b1c5823f1c47b96b73378759345
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/NetworkPackage/ServerPack/HB3_PlayerSocial/HB311_tagGCTalkCache.cs b/Main/NetworkPackage/ServerPack/HB3_PlayerSocial/HB311_tagGCTalkCache.cs
new file mode 100644
index 0000000..7011061
--- /dev/null
+++ b/Main/NetworkPackage/ServerPack/HB3_PlayerSocial/HB311_tagGCTalkCache.cs
@@ -0,0 +1,41 @@
+using UnityEngine;
+using System.Collections;
+
+// B3 11 聊天缓存通知 #tagGCTalkCache

+

+public class HB311_tagGCTalkCache : GameNetPackBasic {

+    public ushort Count;

+    public  tagGCTalkCacheInfo[] InfoList;    //size = Count

+

+    public HB311_tagGCTalkCache () {

+        _cmd = (ushort)0xB311;

+    }

+

+    public override void ReadFromBytes (byte[] vBytes) {

+        TransBytes (out Count, vBytes, NetDataType.WORD);

+        InfoList = new tagGCTalkCacheInfo[Count];

+        for (int i = 0; i < Count; i ++) {

+            InfoList[i] = new tagGCTalkCacheInfo();

+            TransBytes (out InfoList[i].ChannelType, vBytes, NetDataType.BYTE);

+            TransBytes (out InfoList[i].NameLen, vBytes, NetDataType.BYTE);

+            TransBytes (out InfoList[i].Name, vBytes, NetDataType.Chars, InfoList[i].NameLen);

+            TransBytes (out InfoList[i].PlayerID, vBytes, NetDataType.DWORD);

+            TransBytes (out InfoList[i].Time, vBytes, NetDataType.DWORD);

+            TransBytes (out InfoList[i].Len, vBytes, NetDataType.WORD);

+            TransBytes (out InfoList[i].Content, vBytes, NetDataType.Chars, InfoList[i].Len);

+            TransBytes (out InfoList[i].Extras, vBytes, NetDataType.Chars, 256);

+        }

+    }

+

+    public struct tagGCTalkCacheInfo {

+        public byte ChannelType;        // 1 世界 2 仙盟

+        public byte NameLen;

+        public string Name;        //size = SrcNameLen

+        public uint PlayerID;

+        public uint Time;

+        public ushort Len;

+        public string Content;        //size = Len

+        public string Extras;        //附加值列表

+    }

+

+}

diff --git a/Main/NetworkPackage/ServerPack/HB3_PlayerSocial/HB311_tagGCTalkCache.cs.meta b/Main/NetworkPackage/ServerPack/HB3_PlayerSocial/HB311_tagGCTalkCache.cs.meta
new file mode 100644
index 0000000..716981f
--- /dev/null
+++ b/Main/NetworkPackage/ServerPack/HB3_PlayerSocial/HB311_tagGCTalkCache.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 96f83e8de58e613499a6713611e5997d
+timeCreated: 1563267391
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/Chat/ChatData.cs b/Main/System/Chat/ChatData.cs
index ffe5a31..97018fe 100644
--- a/Main/System/Chat/ChatData.cs
+++ b/Main/System/Chat/ChatData.cs
@@ -1,21 +1,20 @@
 锘縰sing System.Text;
 using System.Collections;
-using vnxbqy.UI;
 using System;
 
 public class ChatData
 {
-    // public ChatData(string content)
-    // {
-    //     _content = content;
-    //     if (ChatCenter.s_VoiceRegex.IsMatch(_content))
-    //     {
-    //         _content = ChatCenter.s_VoiceRegex.Replace(_content, string.Empty);
-    //     }
-    //     richText = new StringBuilder();
-    //     richText.Length = 0;
-    //     createTime = DateTime.Now;
-    // }
+    public ChatData(string content)
+    {
+        _content = content;
+        if (ChatCenter.s_VoiceRegex.IsMatch(_content))
+        {
+            _content = ChatCenter.s_VoiceRegex.Replace(_content, string.Empty);
+        }
+        richText = new StringBuilder();
+        richText.Length = 0;
+        createTime = DateTime.Now;
+    }
 
     private string _content = string.Empty;
 
@@ -35,22 +34,22 @@
         }
     }
 
-    // public ChatInfoType type { get; protected set; }
+    public ChatInfoType type { get; protected set; }
 
-    // public DateTime createTime { get; set; }
+    public DateTime createTime { get; set; }
 
-    // private ChatInfoType m_DetailType = ChatInfoType.World;
-    // public ChatInfoType detailType
-    // {
-    //     get
-    //     {
-    //         return m_DetailType;
-    //     }
-    //     set
-    //     {
-    //         m_DetailType = value;
-    //     }
-    // }
+    private ChatInfoType m_DetailType = ChatInfoType.World;
+    public ChatInfoType detailType
+    {
+        get
+        {
+            return m_DetailType;
+        }
+        set
+        {
+            m_DetailType = value;
+        }
+    }
 
     public StringBuilder richText;
 
@@ -59,12 +58,7 @@
 
 public class ChatUeseData : ChatData
 {
-    public ChatUeseData()
-    {
-
-    }
-
-    public ChatUeseData(string _content, int player, string name, string extra)// : base(_content)
+    public ChatUeseData(string _content, int player, string name, string extra) : base(_content)
     {
         this.player = player;
         this.name = name;
@@ -127,10 +121,10 @@
 
 public class ChatSystemData : ChatData
 {
-    // public ChatSystemData(string content) : base(content)
-    // {
-    //     type = ChatInfoType.System;
-    // }
+    public ChatSystemData(string content) : base(content)
+    {
+        type = ChatInfoType.System;
+    }
 }
 
 
@@ -151,72 +145,72 @@
 
 public class ChatWorldData : ChatUeseData
 {
-    // public ChatWorldData(string content, int player, string name, string extra) : base(content, player, name, extra)
-    // {
-    //     type = ChatInfoType.World;
-    // }
+    public ChatWorldData(string content, int player, string name, string extra) : base(content, player, name, extra)
+    {
+        type = ChatInfoType.World;
+    }
 }
 
 public class ChatAreaData : ChatUeseData
 {
-    // public ChatAreaData(string content, int player, string name, string extra) : base(content, player, name, extra)
-    // {
-    //     type = ChatInfoType.Area;
-    // }
+    public ChatAreaData(string content, int player, string name, string extra) : base(content, player, name, extra)
+    {
+        type = ChatInfoType.Area;
+    }
 }
 
 public class ChatCrossServerData : ChatUeseData
 {
-    // public ChatCrossServerData(string content, int player, string name, string extra) : base(content, player, name, extra)
-    // {
-    //     type = ChatInfoType.CrossServer;
-    // }
+    public ChatCrossServerData(string content, int player, string name, string extra) : base(content, player, name, extra)
+    {
+        type = ChatInfoType.CrossServer;
+    }
 }
 
 public class ChatFactionData : ChatUeseData
 {
-    // public ChatFactionData(string content, int player, string name, string extra, ChatInfoType detailType = ChatInfoType.default1) : base(content, player, name, extra)
-    // {
-    //     type = ChatInfoType.default1;
-    //     this.detailType = detailType;
-    // }
+    public ChatFactionData(string content, int player, string name, string extra, ChatInfoType detailType = ChatInfoType.default1) : base(content, player, name, extra)
+    {
+        type = ChatInfoType.default1;
+        this.detailType = detailType;
+    }
 }
 
 public class ChatTeamData : ChatUeseData
 {
-    // public ChatTeamData(string content, int player, string name, string extra, ChatInfoType detailType = ChatInfoType.Team) : base(content, player, name, extra)
-    // {
-    //     type = ChatInfoType.Team;
-    //     this.detailType = detailType;
-    // }
+    public ChatTeamData(string content, int player, string name, string extra, ChatInfoType detailType = ChatInfoType.Team) : base(content, player, name, extra)
+    {
+        type = ChatInfoType.Team;
+        this.detailType = detailType;
+    }
 }
 
 public class ChatFamilyData : ChatUeseData
 {
-    // public ChatFamilyData(string content, int player, string name, string extra, ChatInfoType detailType = ChatInfoType.Fairy) : base(content, player, name, extra)
-    // {
-    //     type = ChatInfoType.Fairy;
-    //     this.detailType = detailType;
-    // }
+    public ChatFamilyData(string content, int player, string name, string extra, ChatInfoType detailType = ChatInfoType.Fairy) : base(content, player, name, extra)
+    {
+        type = ChatInfoType.Fairy;
+        this.detailType = detailType;
+    }
 }
 
 public class ChatInviteData : ChatUeseData
 {
-    // public ChatInviteData(string content, int player, string name, string extra) : base(content, player, name, extra)
-    // {
-    //     type = ChatInfoType.Invite;
-    // }
+    public ChatInviteData(string content, int player, string name, string extra) : base(content, player, name, extra)
+    {
+        type = ChatInfoType.Invite;
+    }
 }
 
 public class ChatFriendData : ChatUeseData
 {
-    // public ChatFriendData(string content, int player, string name, string extra, string toName, byte talkType, uint toPlayer) : base(content, player, name, extra)
-    // {
-    //     type = ChatInfoType.Friend;
-    //     this.toName = toName;
-    //     this.talkType = talkType;
-    //     this.toPlayer = (int)toPlayer;
-    // }
+    public ChatFriendData(string content, int player, string name, string extra, string toName, byte talkType, uint toPlayer) : base(content, player, name, extra)
+    {
+        type = ChatInfoType.Friend;
+        this.toName = toName;
+        this.talkType = talkType;
+        this.toPlayer = (int)toPlayer;
+    }
 
     public string toName { get; protected set; }
 
diff --git a/Main/System/Chat/ChatFriend.cs b/Main/System/Chat/ChatFriend.cs
new file mode 100644
index 0000000..d54afec
--- /dev/null
+++ b/Main/System/Chat/ChatFriend.cs
@@ -0,0 +1,147 @@
+锘�//--------------------------------------------------------
+//    [Author]:           绗簩涓栫晫
+//    [  Date ]:           Wednesday, September 13, 2017
+//--------------------------------------------------------
+using UnityEngine;
+using System.Collections;
+using UnityEngine.UI;
+using System.Collections.Generic;
+using System;
+using System.Text.RegularExpressions;
+
+    public class ChatFriend : MonoBehaviour
+    {
+        [SerializeField] ScrollerController m_Controller;
+
+        private List<ChatFriendData> chatList = null;
+
+        [SerializeField] RichText destText;
+        [SerializeField] RichText destSysText;
+        private bool open = false;
+        public bool IsOpen
+        {
+            get { return open; }
+        }
+
+        private void Awake()
+        {
+            m_Controller.OnGetDynamicSize += OnGetChatDynamicSize;
+            ChatManager.Instance.SetChatFreind(this);
+        }
+
+        #region 璁$畻鍔ㄦ�佸搴﹂暱搴�
+        private bool OnGetChatDynamicSize(ScrollerDataType type, int index, out float height)
+        {
+            height = 90;
+            if (chatList == null || index >= chatList.Count)
+            {
+                return false;
+            }
+            ChatData chat = chatList[index];
+            if (type == ScrollerDataType.Extra2)
+            {
+                height = chat.content.Equals(string.Empty) ? 90 : 120;
+            }
+            else if (type == ScrollerDataType.Tail)
+            {
+                height = 30;
+            }
+            float width = 0;
+            OnGetChatDynamicHeight(chat.content, ref height, ref width, type, chat.infoList);
+            return true;
+        }
+        private void OnGetChatDynamicHeight(string content, ref float height, ref float width, ScrollerDataType type, ArrayList infoList = null)
+        {
+            if (type == ScrollerDataType.Tail)
+            {
+                destSysText.SetExtenalData(infoList);
+                destSysText.text = content;
+                width = destSysText.preferredWidth;
+                height += Mathf.Max(0, destSysText.preferredHeight - 23);
+            }
+            else
+            {
+                destText.SetExtenalData(infoList);
+                destText.text = content;
+                width = destText.preferredWidth;
+                height += Mathf.Max(0, destText.preferredHeight - 30);
+            }
+        }
+        #endregion
+
+        private void OnEnable()
+        {
+            ChatManager.OnRefreshPteChat += OnRefreshPteChat;
+            RefreshChatInfo();
+            open = true;
+            ChatManager.Instance.lockUpdate = true;
+            OnSetLock();
+        }
+
+        public void OnSetLock()
+        {
+            m_Controller.lockType = ChatManager.Instance.lockUpdate ? EnhanceLockType.LockVerticalBottom : EnhanceLockType.KeepVertical;
+            if (ChatManager.Instance.lockUpdate)
+            {
+                m_Controller.ResetScrollPos();
+            }
+        }
+
+        private void OnDisable()
+        {
+            ChatManager.OnRefreshPteChat -= OnRefreshPteChat;
+            open = false;
+        }
+
+        public void RefreshChatInfo()
+        {
+            int id = ChatManager.Instance.PteChatID;
+            chatList = ChatManager.Instance.GetChatInfo(id);
+            m_Controller.Refresh();
+            if (chatList != null)
+            {
+                for (int i = 0; i < chatList.Count; i++)
+                {
+                    if (chatList[i].soundTick != 0)
+                    {
+                        m_Controller.AddCell(ScrollerDataType.Extra2, i);
+                        continue;
+                    }
+                    if (Regex.IsMatch(chatList[i].content, ChatManager.KILL_IDENTIFY))
+                    {
+                        m_Controller.AddCell(ScrollerDataType.Tail, i);
+                        continue;
+                    }
+                    if (chatList[i].player == PlayerDatas.Instance.baseData.PlayerID)
+                    {
+                        m_Controller.AddCell(ScrollerDataType.Header, i);
+                    }
+                    else
+                    {
+                        m_Controller.AddCell(ScrollerDataType.Normal, i);
+                    }
+                }
+            }
+            m_Controller.Restart();
+        }
+
+        private void OnRefreshPteChat(ChatFriendData data)
+        {
+            if (data == null)
+            {
+                return;
+            }
+            if (data.toPlayer != ChatManager.Instance.PteChatID && data.player != ChatManager.Instance.PteChatID)
+            {
+                return;
+            }
+            if (data.player == PlayerDatas.Instance.baseData.PlayerID)
+            {
+
+            }
+            RefreshChatInfo();
+        }
+    }
+
+
+
diff --git a/Main/System/Chat/ChatFriend.cs.meta b/Main/System/Chat/ChatFriend.cs.meta
new file mode 100644
index 0000000..a95b1ec
--- /dev/null
+++ b/Main/System/Chat/ChatFriend.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 3056ddc13bd52ed4483c16475a2fcc08
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/Chat/ChatFriendCell.cs b/Main/System/Chat/ChatFriendCell.cs
new file mode 100644
index 0000000..8817c3c
--- /dev/null
+++ b/Main/System/Chat/ChatFriendCell.cs
@@ -0,0 +1,48 @@
+锘縰sing System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.UI;
+using vnxbqy.UI;
+
+namespace EnhancedUI.EnhancedScroller
+{
+    // public class ChatFriendCell : ScrollerUI
+    // {
+    //     [SerializeField] RichText m_ChatText;
+    //     [SerializeField] Text m_VipText;
+    //     [SerializeField] Text m_NameText;
+    //     [SerializeField] AvatarCell m_ChatIcon;
+    //     [SerializeField] ImageFitterText m_ImageFitter;
+
+    //     public override void Refresh(CellView cell)
+    //     {
+    //         var _index = cell.index;
+    //         int _playerId = ChatCtrl.Inst.PteChatID;
+    //         var _list = ChatCtrl.Inst.GetChatInfo(_playerId);
+    //         if (_list != null && _index < _list.Count)
+    //         {
+    //             ChatFriendData chat = _list[_index];
+    //             m_ChatText.text = chat.content;
+    //             if (type == ScrollerDataType.Header)
+    //             {
+    //                 m_ChatText.AutoNewLine = false;
+    //                 if (m_ChatText.preferredWidth > m_ChatText.rectTransform.rect.width)
+    //                 {
+    //                     m_ChatText.alignment = TextAnchor.UpperLeft;
+    //                 }
+    //                 else
+    //                 {
+    //                     m_ChatText.alignment = TextAnchor.UpperRight;
+    //                 }
+    //                 m_ChatText.AutoNewLine = true;
+    //             }
+    //             m_ImageFitter.FiterRealTxtWidth = m_ChatText.alignment == TextAnchor.UpperRight;
+    //             m_VipText.text = chat.vipLv > 0 ? StringUtility.Contact("V", chat.vipLv) : string.Empty;
+    //             m_NameText.text = chat.name;
+    //             m_ChatIcon.InitUI(AvatarHelper.GetAvatarModel(chat.player, chat.face, chat.facePic, chat.job));
+    //             m_ChatText.text = chat.content;
+    //         }
+    //     }
+    // }
+}
+
diff --git a/Main/System/Chat/ChatFriendCell.cs.meta b/Main/System/Chat/ChatFriendCell.cs.meta
new file mode 100644
index 0000000..cf8cd67
--- /dev/null
+++ b/Main/System/Chat/ChatFriendCell.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 3c7103d0f86bb6c4fb02025e35939eb3
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/Chat/ChatFriendTipCell.cs b/Main/System/Chat/ChatFriendTipCell.cs
new file mode 100644
index 0000000..95ca949
--- /dev/null
+++ b/Main/System/Chat/ChatFriendTipCell.cs
@@ -0,0 +1,22 @@
+锘縰sing System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+namespace EnhancedUI.EnhancedScroller
+{
+    // public class ChatFriendTipCell : ScrollerUI
+    // {
+    //     [SerializeField] RichText m_TipText;
+    //     public override void Refresh(CellView cell)
+    //     {
+    //         var _index = cell.index;
+    //         int _playerId = ChatCtrl.Inst.PteChatID;
+    //         var _list = ChatCtrl.Inst.GetChatInfo(_playerId);
+    //         if (_list != null && _index < _list.Count)
+    //         {
+    //             ChatFriendData chat = _list[_index];
+    //             m_TipText.text = chat.content.Replace(ChatCtrl.KILL_IDENTIFY, string.Empty);
+    //         }
+    //     }
+    // }
+}
+
diff --git a/Main/System/Chat/ChatFriendTipCell.cs.meta b/Main/System/Chat/ChatFriendTipCell.cs.meta
new file mode 100644
index 0000000..2e709c7
--- /dev/null
+++ b/Main/System/Chat/ChatFriendTipCell.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 68376cb82e4739943aecb4dbbd81a757
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/Chat/ChatItemCell.cs b/Main/System/Chat/ChatItemCell.cs
new file mode 100644
index 0000000..2425910
--- /dev/null
+++ b/Main/System/Chat/ChatItemCell.cs
@@ -0,0 +1,16 @@
+锘縰sing System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.UI;
+
+namespace vnxbqy.UI
+{
+    public class ChatItemCell : CellView
+    {
+        [SerializeField] List<ItemCell> m_Items;
+        public List<ItemCell> items { get { return m_Items; } }
+        [SerializeField] List<Image> m_ItemEquips;
+        public List<Image> itemEquips { get { return m_ItemEquips; } }
+    }
+}
+
diff --git a/Main/System/Chat/ChatItemCell.cs.meta b/Main/System/Chat/ChatItemCell.cs.meta
new file mode 100644
index 0000000..880a2ad
--- /dev/null
+++ b/Main/System/Chat/ChatItemCell.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 54be5c5a694cce842a5ad0dc6e7bbe76
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/Chat/LocalChatHistory.cs b/Main/System/Chat/LocalChatHistory.cs
new file mode 100644
index 0000000..6d87173
--- /dev/null
+++ b/Main/System/Chat/LocalChatHistory.cs
@@ -0,0 +1,324 @@
+锘縰sing System.Collections;
+using System.Collections.Generic;
+using System.Text;
+using UnityEngine;
+using System;
+using System.IO;
+
+    
+    public class LocalChatHistory
+    {
+        public static Dictionary<ChatInfoType, List<string>> chatHistory = new Dictionary<ChatInfoType, List<string>>();
+
+        const string fileName = "ChatHistory";
+
+        public static int localSaveCount = 50;
+        public static int localChatKeepHour = 12;
+
+        static StringBuilder sb = new StringBuilder();
+
+        public static void Save()
+        {
+            if (!ExistAnyLocalChatHistory())
+            {
+                return;
+            }
+            var playerId = PlayerDatas.Instance.baseData.PlayerID;
+            var path = StringUtility.Contact(ResourcesPath.Instance.ExternalStorePath, fileName, "_", playerId, ".log");
+            using (FileStream fs = new FileStream(path, FileMode.Create, FileAccess.Write))
+            {
+                using (StreamWriter sw = new StreamWriter(fs, Encoding.UTF8))
+                {
+                    foreach (var type in chatHistory.Keys)
+                    {
+                        var list = chatHistory[type];
+                        if (list.Count > 0)
+                        {
+                            sw.WriteLine(StringUtility.Contact("channel:", (int)type));
+                            for (int i = 0; i < list.Count; i++)
+                            {
+                                sw.WriteLine(list[i]);
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
+        static bool ExistAnyLocalChatHistory()
+        {
+            foreach (var list in chatHistory.Values)
+            {
+                if (list.Count > 0)
+                {
+                    return true;
+                }
+            }
+            return false;
+        }
+
+        public static void Save<T>(T chat) where T : ChatUeseData
+        {
+            if (null == chat)
+            {
+                return;
+            }
+            switch (chat.type)
+            {
+                //case ChatInfoType.World:
+                case ChatInfoType.CrossServer:
+                case ChatInfoType.Area:
+                case ChatInfoType.Trumpet:
+                //case ChatInfoType.Fairy:
+                case ChatInfoType.Friend:
+                    if (chat.IsSound && string.IsNullOrEmpty(chat.content))
+                    {
+                        return;
+                    }
+                    var jsonString = ChatToString(chat);
+                    if (!string.IsNullOrEmpty(jsonString))
+                    {
+                        List<string> list;
+                        if (!chatHistory.TryGetValue(chat.type, out list))
+                        {
+                            list = new List<string>();
+                            chatHistory.Add(chat.type, list);
+                        }
+                        if (list.Count >= localSaveCount)
+                        {
+                            list.RemoveAt(0);
+                        }
+                        list.Add(jsonString);
+                    }
+                    break;
+            }
+            Save();
+        }
+
+        static void Save(ChatInfoType type, string line)
+        {
+            if (!string.IsNullOrEmpty(line))
+            {
+                List<string> list;
+                if (!chatHistory.TryGetValue(type, out list))
+                {
+                    list = new List<string>();
+                    chatHistory.Add(type, list);
+                }
+                if (list.Count >= localSaveCount)
+                {
+                    list.RemoveAt(0);
+                }
+                list.Add(line);
+            }
+        }
+
+        public static string ChatToString(ChatUeseData chat)
+        {
+            switch (chat.type)
+            {
+                //case ChatInfoType.World:
+                case ChatInfoType.Area:
+                case ChatInfoType.CrossServer:
+                case ChatInfoType.Team:
+                //case ChatInfoType.Fairy:
+                    {
+                        LocalChat localChat = new LocalChat();
+                        localChat.type = chat.type;
+                        localChat.player = chat.player;
+                        localChat.name = chat.name;
+                        localChat.extra = chat.extra;
+                        localChat.content = chat.content;
+                        localChat.time = chat.createTime;
+                        return LitJson.JsonMapper.ToJson(localChat);
+                    }
+                // case ChatInfoType.Trumpet:
+                //     {
+                //         var chatTrumpet = chat as ChatTrumpetData;
+                //         LocalTrumpetChat localChat = new LocalTrumpetChat();
+                //         localChat.player = chat.player;
+                //         localChat.name = chat.name;
+                //         localChat.extra = chat.extra;
+                //         localChat.content = chat.content;
+                //         localChat.speakType = chatTrumpet.speakType;
+                //         localChat.accId = chatTrumpet.accId;
+                //         localChat.time = chat.createTime;
+                //         return LitJson.JsonMapper.ToJson(localChat);
+                //     }
+                case ChatInfoType.Friend:
+                    {
+                        var chatFriend = chat as ChatFriendData;
+                        LocalFriendChat localChat = new LocalFriendChat();
+                        localChat.player = chat.player;
+                        localChat.name = chat.name;
+                        localChat.extra = chat.extra;
+                        localChat.toName = chatFriend.toName;
+                        localChat.toPlayer = chatFriend.toPlayer;
+                        localChat.talkType = chatFriend.talkType;
+                        localChat.content = chat.content;
+                        localChat.time = chat.createTime;
+                        return LitJson.JsonMapper.ToJson(localChat);
+                    }
+            }
+            return string.Empty;
+        }
+
+        public static void Read()
+        {
+            Clear();
+            var playerId = PlayerDatas.Instance.baseData.PlayerID;
+            var path = StringUtility.Contact(ResourcesPath.Instance.ExternalStorePath, fileName, "_", playerId, ".log");
+            if (!File.Exists(path))
+            {
+                return;
+            }
+            using (var fs = new FileStream(path, FileMode.Open, FileAccess.Read))
+            {
+                using (StreamReader sr = new StreamReader(fs, Encoding.UTF8))
+                {
+                    ChatInfoType type = ChatInfoType.World;
+                    while (!sr.EndOfStream)
+                    {
+                        try
+                        {
+                            var line = sr.ReadLine();
+                            if (line.StartsWith("channel"))
+                            {
+                                type = (ChatInfoType)int.Parse(line.Split(':')[1]);
+                                continue;
+                            }
+                            if (type == ChatInfoType.Fairy)
+                            {
+                                if (PlayerDatas.Instance.baseData.FamilyId == 0)
+                                {
+                                    continue;
+                                }
+                            }
+                            ChatData chat = null;
+                            switch (type)
+                            {
+                                //case ChatInfoType.World:
+                                case ChatInfoType.Area:
+                                case ChatInfoType.CrossServer:
+                                case ChatInfoType.Team:
+                                    //case ChatInfoType.Fairy:
+                                    {
+                                        LocalChat localChat = LitJson.JsonMapper.ToObject<LocalChat>(line);
+                                        var ts = DateTime.Now - localChat.time;
+                                        if (ts.TotalHours >= localChatKeepHour)
+                                        {
+                                            continue;
+                                        }
+                                        if (type == ChatInfoType.World)
+                                        {
+                                            chat = new ChatWorldData(localChat.content, localChat.player, localChat.name, localChat.extra);
+                                        }
+                                        else if (type == ChatInfoType.Area)
+                                        {
+                                            chat = new ChatAreaData(localChat.content, localChat.player, localChat.name, localChat.extra);
+                                        }
+                                        else if (type == ChatInfoType.Team)
+                                        {
+                                            chat = new ChatTeamData(localChat.content, localChat.player, localChat.name, localChat.extra);
+                                        }
+                                        else if (type == ChatInfoType.Fairy)
+                                        {
+                                            chat = new ChatFamilyData(localChat.content, localChat.player, localChat.name, localChat.extra);
+                                        }
+                                        else if (type == ChatInfoType.CrossServer)
+                                        {
+                                            chat = new ChatCrossServerData(localChat.content, localChat.player, localChat.name, localChat.extra);
+                                        }
+                                        chat.createTime = localChat.time;
+                                    }
+                                    break;
+                                // case ChatInfoType.Trumpet:
+                                //     {
+                                //         LocalTrumpetChat localChat = LitJson.JsonMapper.ToObject<LocalTrumpetChat>(line);
+                                //         var ts = DateTime.Now - localChat.time;
+                                //         if (ts.TotalHours >= localChatKeepHour)
+                                //         {
+                                //             continue;
+                                //         }
+                                //         chat = new ChatTrumpetData(localChat.content, localChat.player, localChat.name,
+                                //             localChat.extra, localChat.speakType, localChat.accId);
+                                //         chat.createTime = localChat.time;
+                                //     }
+                                //     break;
+                                case ChatInfoType.Friend:
+                                    {
+                                        LocalFriendChat localChat = LitJson.JsonMapper.ToObject<LocalFriendChat>(line);
+                                        var ts = DateTime.Now - localChat.time;
+                                        if (ts.TotalHours >= localChatKeepHour)
+                                        {
+                                            continue;
+                                        }
+                                        chat = new ChatFriendData(localChat.content, localChat.player, localChat.name,
+                                            localChat.extra, localChat.toName, localChat.talkType, (uint)localChat.toPlayer);
+                                        chat.createTime = localChat.time;
+                                    }
+                                    break;
+                            }
+                            if (chat != null)
+                            {
+                                ChatManager.Instance.KeepLocalChat(chat);
+                            }
+                            Save(type, line);
+                        }
+                        catch (Exception e)
+                        {
+                            Debug.Log(e.Message);
+                            continue;
+                        }
+                    }
+                }
+            }
+        }
+
+        public static void Clear(ChatInfoType type)
+        {
+            if (chatHistory.ContainsKey(type))
+            {
+                chatHistory.Remove(type);
+                Save();
+            }
+        }
+
+        public static void Clear()
+        {
+            chatHistory.Clear();
+        }
+
+        public struct LocalChat
+        {
+            public ChatInfoType type;
+            public DateTime time;
+            public int player;
+            public string name;
+            public string extra;
+            public string content;
+        }
+
+        public struct LocalFriendChat
+        {
+            public DateTime time;
+            public int player;
+            public string name;
+            public string extra;
+            public string content;
+            public string toName;
+            public byte talkType;
+            public int toPlayer;
+        }
+
+        public struct LocalTrumpetChat
+        {
+            public DateTime time;
+            public int player;
+            public string name;
+            public string extra;
+            public string content;
+            public byte speakType;
+            public string accId;
+        }
+    }
\ No newline at end of file
diff --git a/Main/System/Chat/LocalChatHistory.cs.meta b/Main/System/Chat/LocalChatHistory.cs.meta
new file mode 100644
index 0000000..5e0fdcd
--- /dev/null
+++ b/Main/System/Chat/LocalChatHistory.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 2be021001cf2964428f72448aa2c536d
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/Debug/DebugController.cs b/Main/System/Debug/DebugController.cs
index 85e706c..fb8ae73 100644
--- a/Main/System/Debug/DebugController.cs
+++ b/Main/System/Debug/DebugController.cs
@@ -82,7 +82,7 @@
     public void CleanNewBranchSet()
     {
         LocalSave.DeleteKey("#@#BrancH");
-        // ScrollTip.ShowTip("娓呯悊鍒嗘敮璁剧疆");
+        ScrollTip.ShowTip("娓呯悊鍒嗘敮璁剧疆");
     }
 
     public void PrintLastCrashLog()
diff --git a/Main/System/Message/SysNotifyMgr.cs b/Main/System/Message/SysNotifyMgr.cs
index 6efe145..130ef02 100644
--- a/Main/System/Message/SysNotifyMgr.cs
+++ b/Main/System/Message/SysNotifyMgr.cs
@@ -72,8 +72,7 @@
 
     private void BeforePlayerDataInitializeEvent()
     {
-        // TODO YYL
-        // ScrollTip.m_Hints.Clear();
+        ScrollTip.m_Hints.Clear();
         ServerTipDetails.ClearHint();
     }
 
@@ -117,7 +116,7 @@
 #if UNITY_EDITOR
             string hint = Language.Get("L1093", key);
             // TODO YYL
-            // ScrollTip.ShowTip(hint);
+            ScrollTip.ShowTip(hint);
             // ChatCtrl.Inst.RevChatInfo(hint);
 #endif
         }
@@ -217,8 +216,7 @@
                     break;
                 case SysNotifyType.SysFixedTip1:
                 case SysNotifyType.SysScrollTip:
-                    // TODO YYL
-                    // ScrollTip.ShowTip(msg, tipInfoList, order);
+                    ScrollTip.ShowTip(msg, tipInfoList, order);
                     break;
                 case SysNotifyType.SysIntervalFixedTip:
                     ServerTipDetails.ShowServerTip(msg, tipInfoList, order);
diff --git a/Main/System/SystemSetting/ChatSetting.cs b/Main/System/SystemSetting/ChatSetting.cs
new file mode 100644
index 0000000..faee470
--- /dev/null
+++ b/Main/System/SystemSetting/ChatSetting.cs
@@ -0,0 +1,184 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+public enum ChatBoolType
+{
+    ChannelSystem = 0 , //绯荤粺棰戦亾
+    ChannelWorld,//涓栫晫棰戦亾
+    ChannelATeam,//缁勯槦棰戦亾
+    ChannelTeam,//闃熶紞棰戦亾
+    ChannelBugle,//鍠囧彮棰戦亾
+    ChannelGrad,//浠欑洘棰戦亾
+    ChannelArea,//鍖哄煙棰戦亾
+    //ChannelAlliance,//鍚岀洘棰戦亾
+
+    Voice1,
+    Voice2,
+    Voice3,
+
+    GradVoiceWifi,  //浠欑洘璇煶Wifi
+    PrivateChatVoiceWifi,//绉佽亰璇煶Wifi
+    TeamVoiceWifi,//闃熶紞璇煶Wifi
+    WorldVoiceWifi,//涓栫晫璇煶Wifi
+    AreaVoiceWifi,//鍖哄煙璇煶Wifi
+   // AllianceVoiceWifi, //鍚岀洘璇煶Wifi
+
+    GradVoice4G,//浠欑洘璇煶4G
+    PrivatChatVoice4G,//绉佽亰璇煶4G
+    TeamVoice4G,//闃熶紞璇煶4G
+    WorldVoice4G,//涓栫晫璇煶4G
+    AreaVoice4G,//鍖哄煙璇煶4G
+                //AllianceVoice4G, //鍚岀洘璇煶4G
+                //鍚庣画IL寮�鍙戞坊鍔犻璁�
+    default1,
+    default2,
+    default3,
+    default4,
+    default5,
+    default6,
+    default7,
+    default8,
+    default9,
+    default10,
+}
+
+ 
+public class ChatSetting : Singleton<ChatSetting>
+
+{
+    const string ChatBoolSet_Key = "ChatBoolSet";
+
+    public event Action<ChatBoolType, bool> RefreshChatSetAct;
+
+    #region 缂撳瓨鏁版嵁
+    public Dictionary<ChatBoolType, bool> boolSetDict { get; private set; }
+    public void GetLoginBoolSet()
+    {
+        boolSetDict = new Dictionary<ChatBoolType, bool>();
+        for (int i = 0; i < 20; i++)
+        {
+            if (!boolSetDict.ContainsKey((ChatBoolType)i))
+            {
+                boolSetDict.Add((ChatBoolType)i, SettingMgr.Instance.GetAccountSetBoolInfo(((ChatBoolType)i).ToString()));
+            }
+
+        }
+    }
+    #endregion
+
+    public void SetBoolSetStr(ChatBoolType type, bool isOpen)
+    {
+        SettingMgr.Instance.SetAccountSetStr(type.ToString(),isOpen.ToString());
+        switch (type) {
+            case ChatBoolType.ChannelSystem:
+                ChatManager.Instance.SetChatChannelShow(ChatInfoType.System, isOpen);
+                break;
+            case ChatBoolType.ChannelWorld:
+                ChatManager.Instance.SetChatChannelShow(ChatInfoType.World, isOpen);
+                break;
+            case ChatBoolType.ChannelATeam:
+                ChatManager.Instance.SetChatChannelShow(ChatInfoType.Invite, isOpen);
+                break;
+            case ChatBoolType.ChannelTeam:
+                ChatManager.Instance.SetChatChannelShow(ChatInfoType.Team, isOpen);
+                break;
+            case ChatBoolType.ChannelBugle:
+                ChatManager.Instance.SetChatChannelShow(ChatInfoType.Trumpet, isOpen);
+                break;
+            case ChatBoolType.ChannelGrad:
+                ChatManager.Instance.SetChatChannelShow(ChatInfoType.Fairy, isOpen);
+                break;
+            case ChatBoolType.ChannelArea:
+                ChatManager.Instance.SetChatChannelShow(ChatInfoType.Area, isOpen);
+                break;
+        }
+
+        if (boolSetDict != null)
+        {
+            if (boolSetDict.ContainsKey(type))
+            {
+                boolSetDict[type] = isOpen;
+            }
+        }
+
+        if(RefreshChatSetAct != null)
+        {
+            RefreshChatSetAct(type,isOpen);
+        }
+    }
+
+    public bool GetBool(ChatBoolType type)
+    {
+        if (boolSetDict != null)
+        {
+            bool isOpen = false;
+            boolSetDict.TryGetValue(type, out isOpen);
+            return isOpen;
+        }
+        else
+        {
+            return SettingMgr.Instance.GetAccountSetBoolInfo(type.ToString());
+        }
+    }
+
+    public bool GetAutoPlayVoice(ChatInfoType type, int netState)
+    {
+        if (netState == 0)
+        {
+            return false;
+        }
+        switch (type)
+        {
+            case ChatInfoType.World:
+                if (netState == 2)
+                {
+                    return GetBool(ChatBoolType.WorldVoiceWifi);
+                }
+                else
+                {
+                    return GetBool(ChatBoolType.WorldVoice4G);
+                }
+            case ChatInfoType.Area:
+                if (netState == 2)
+                {
+                    return GetBool(ChatBoolType.AreaVoiceWifi);
+                }
+                else
+                {
+                    return GetBool(ChatBoolType.AreaVoice4G);
+                }
+            case ChatInfoType.Team:
+                if (netState == 2)
+                {
+                    return GetBool(ChatBoolType.TeamVoiceWifi);
+                }
+                else
+                {
+                    return GetBool(ChatBoolType.TeamVoice4G);
+                }
+            case ChatInfoType.Fairy:
+                if (netState == 2)
+                {
+                    return GetBool(ChatBoolType.GradVoiceWifi);
+                }
+                else
+                {
+                    return GetBool(ChatBoolType.GradVoice4G);
+                }
+            case ChatInfoType.Friend:
+                if (netState == 2)
+                {
+                    return GetBool(ChatBoolType.PrivateChatVoiceWifi);
+                }
+                else
+                {
+                    return GetBool(ChatBoolType.PrivatChatVoice4G);
+                }
+            case ChatInfoType.CrossServer:
+                return false;
+        }
+        return false;
+    }
+}
\ No newline at end of file
diff --git a/Main/System/SystemSetting/ChatSetting.cs.meta b/Main/System/SystemSetting/ChatSetting.cs.meta
new file mode 100644
index 0000000..96164ee
--- /dev/null
+++ b/Main/System/SystemSetting/ChatSetting.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: f233865cd812ec342a52b00b4af26d27
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Utility/LanguageVerify.cs b/Main/Utility/LanguageVerify.cs
new file mode 100644
index 0000000..853b568
--- /dev/null
+++ b/Main/Utility/LanguageVerify.cs
@@ -0,0 +1,236 @@
+锘縰sing vnxbqy.UI;
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Text;
+using System.Text.RegularExpressions;
+using UnityEngine;
+
+
+public class LanguageVerify : Singleton<LanguageVerify>
+
+{
+    const string Sercret = "c345a165b566d1c421afd8a748373d7f";
+
+    static StringBuilder sb = new StringBuilder();
+
+    /// <summary>
+    /// 鏍¢獙鐜╁鍚�
+    /// </summary>
+    /// <param name="verifyName">闇�瑕佹楠岀殑鍚嶅瓧</param>
+    /// <param name="playerId">鐜╁id</param>
+    /// <param name="playerName">鍘熸潵鐨勮鑹插悕锛屽垱瑙掍紶绌�</param>
+    /// <param name="level">鐜╁绛夌骇</param>
+    /// <param name="vipLv">鐜╁VIP绛夌骇</param>
+    /// <param name="callback"></param>
+    public void VerifyPlayerName(string verifyName, int playerId, string playerName, int level, int vipLv, Action<bool, string> callback)
+    {
+        if (callback != null)
+        {
+            callback(true, verifyName);
+            callback = null;
+        }
+        return;
+    }
+
+    public void VerifyFairy(string verifyContent, int op_type, string fairyName, int title, Action<bool, string> callback)
+    {
+        if (callback != null)
+        {
+            callback(true, verifyContent);
+            callback = null;
+        }
+        return;
+    }
+
+    public static uint toPlayer = 0;
+    public static string toPlayerName = string.Empty;
+    public static int toPlayerLevel = 0;
+    public void VerifyChat(string content, ChatInfoType channelType, Action<bool, string> callback)
+    {
+        int channel = 0;
+        var chatCenter = ChatCenter.Instance;
+        if (chatCenter.IsChatBanned || chatCenter.IsClientBan(channelType))
+        {
+            if (!(IsFairyFeast(channelType) || IsSystemChat(content)))
+            {
+                return;
+            }
+        }
+
+        if (!GetChannel(channelType, out channel))
+        {
+            return;
+        }
+        if (callback != null)
+        {
+            callback(true, content);
+            callback = null;
+        }
+
+    }
+
+    Dictionary<long, List<string>> transferContents = new Dictionary<long, List<string>>();
+    Dictionary<long, List<int>> splitContents = new Dictionary<long, List<int>>();
+
+    List<MatchString> matchs = new List<MatchString>();
+
+    struct MatchString
+    {
+        public int index;
+        public string value;
+    }
+
+    void AddMathcs(MatchCollection _matchs)
+    {
+        if (_matchs.Count == 0)
+        {
+            return;
+        }
+        foreach (Match match in _matchs)
+        {
+            matchs.Add(new MatchString()
+            {
+                index = match.Index,
+                value = match.Value,
+            });
+        }
+    }
+
+    string TransferContent(long tick, string content)
+    {
+        List<string> list;
+        List<int> splits;
+        if (!transferContents.TryGetValue(tick, out list))
+        {
+            list = new List<string>();
+            transferContents.Add(tick, list);
+        }
+        if (!splitContents.TryGetValue(tick, out splits))
+        {
+            splits = new List<int>();
+            splitContents.Add(tick, splits);
+        }
+        list.Clear();
+        splits.Clear();
+        matchs.Clear();
+        AddMathcs(WordAnalysis.Color_Start_Regex.Matches(content));
+        AddMathcs(WordAnalysis.Color_End_Regex.Matches(content));
+        AddMathcs(ImgAnalysis.FaceRegex.Matches(content));
+        AddMathcs(ChatManager.InviteRegex.Matches(content));
+        AddMathcs(WordAnalysis.Size_Start_Regex.Matches(content));
+        AddMathcs(WordAnalysis.Size_End_Regex.Matches(content));
+        AddMathcs(WordAnalysis.Space_Regex.Matches(content));
+        AddMathcs(ChatManager.KillRegex.Matches(content));
+        AddMathcs(ChatCenter.s_VoiceRegex.Matches(content));
+        matchs.Sort((x, y) =>
+        {
+            return x.index.CompareTo(y.index);
+        });
+        var index = 0;
+        for (int i = 0; i < matchs.Count; i++)
+        {
+            list.Add(matchs[i].value);
+            var length = matchs[i].index - index;
+            splits.Add(length);
+            index += length + matchs[i].value.Length;
+        }
+        content = WordAnalysis.Color_Start_Regex.Replace(content, string.Empty);
+        content = WordAnalysis.Color_End_Regex.Replace(content, string.Empty);
+        content = ImgAnalysis.FaceRegex.Replace(content, string.Empty);
+        content = ChatManager.InviteRegex.Replace(content, string.Empty);
+        content = WordAnalysis.Size_Start_Regex.Replace(content, string.Empty);
+        content = WordAnalysis.Size_End_Regex.Replace(content, string.Empty);
+        content = WordAnalysis.Space_Regex.Replace(content, string.Empty);
+        content = ChatManager.KillRegex.Replace(content, string.Empty);
+        content = ChatCenter.s_VoiceRegex.Replace(content, string.Empty);
+        return content;
+    }
+
+    string DisTransfer(long tick, string content)
+    {
+        List<string> list;
+        if (!transferContents.TryGetValue(tick, out list))
+        {
+            return content;
+        }
+        List<int> splits;
+        if (!splitContents.TryGetValue(tick, out splits))
+        {
+            return content;
+        }
+        var index = 0;
+        sb.Length = 0;
+        for (int i = 0; i < splits.Count; i++)
+        {
+            sb.Append(content.Substring(index, splits[i]));
+            if (i < list.Count)
+            {
+                sb.Append(list[i]);
+            }
+            index += splits[i];
+        }
+        sb.Append(content.Substring(index));
+        transferContents.Remove(tick);
+        splitContents.Remove(tick);
+        return sb.ToString();
+    }
+
+    bool IsSystemChat(string content)
+    {
+        if (ChatManager.InviteRegex.IsMatch(content)
+            || ChatManager.KillRegex.IsMatch(content))
+        {
+            return true;
+        }
+        return false;
+    }
+
+    bool GetChannel(ChatInfoType type, out int channel)
+    {
+        channel = 0;
+        switch (type)
+        {
+            case ChatInfoType.World:
+            case ChatInfoType.CrossServer:
+                channel = 0;
+                break;
+            case ChatInfoType.Team:
+                channel = 4;
+                break;
+            case ChatInfoType.Area:
+            case ChatInfoType.Trumpet:
+            case ChatInfoType.default1:
+                channel = 5;
+                break;
+            case ChatInfoType.Fairy:
+                channel = 2;
+                break;
+            case ChatInfoType.Friend:
+                channel = 3;
+                break;
+            default:
+                return false;
+        }
+        return true;
+    }
+
+    bool IsFairyFeast(ChatInfoType type)
+    {
+        // TODO YYL
+        // var dailyQuestModel = ModelCenter.Instance.GetModel<DailyQuestModel>();
+        // DailyQuestOpenTime dailyQuestOpenTime;
+        // if (dailyQuestModel.TryGetOpenTime((int)DailyQuestType.FairyFeast, out dailyQuestOpenTime))
+        // {
+        //     return type == ChatInfoType.Fairy && dailyQuestOpenTime.InOpenTime();
+        // }
+        return false;
+    }
+
+    public class VerifyResponse
+    {
+        public string result;
+        public int code;
+        public string content;
+    }
+}
diff --git a/Main/Utility/LanguageVerify.cs.meta b/Main/Utility/LanguageVerify.cs.meta
new file mode 100644
index 0000000..7a74a39
--- /dev/null
+++ b/Main/Utility/LanguageVerify.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 1fd3fdd6f2f5d0d45813610dc7cbc714
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

--
Gitblit v1.8.0