using System.Collections; 
 | 
using System.Collections.Generic; 
 | 
using UnityEngine; 
 | 
using System.Text; 
 | 
using System; 
 | 
using System.Text.RegularExpressions; 
 | 
  
 | 
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; 
 | 
                             GameNetSystem.Instance.SendInfo(chatPack);  
 | 
                         } 
 | 
                         break; 
 | 
                     case ChatInfoType.CrossServer: 
 | 
                         { 
 | 
                             C0208_tagCTalkCountry chatPack = new C0208_tagCTalkCountry(); 
 | 
                             chatPack.Len = (ushort)GetUTF8InfoLen(msg); 
 | 
                             chatPack.Content = msg; 
 | 
                             GameNetSystem.Instance.SendInfo(chatPack); 
 | 
                         } 
 | 
                         break; 
 | 
                     case ChatInfoType.Team: 
 | 
                         { 
 | 
                             C0205_tagCTalkDui chatPack = new C0205_tagCTalkDui(); 
 | 
                             chatPack.Len = (ushort)GetUTF8InfoLen(msg); 
 | 
                             chatPack.Content = msg; 
 | 
                             GameNetSystem.Instance.SendInfo(chatPack); 
 | 
                         } 
 | 
                         break; 
 | 
                     case ChatInfoType.Friend: 
 | 
                         { 
 | 
                             var _toPlayer = PteChatID; 
 | 
                             if (info.HasValue && info.Value.infoint1 == 0) 
 | 
                             { 
 | 
                                 _toPlayer = info.Value.infoint1; 
 | 
                             } 
 | 
                             if (_toPlayer == 0) 
 | 
                             { 
 | 
                                 SysNotifyMgr.Instance.ShowTip("NoChatTarget"); 
 | 
                                 return; 
 | 
                             } 
 | 
                             SendFriendChat(msg, _toPlayer); 
 | 
                         } 
 | 
                         break; 
 | 
                     case ChatInfoType.Fairy: 
 | 
                         { 
 | 
                             C0203_tagCTalkBang chatPack = new C0203_tagCTalkBang(); 
 | 
                             chatPack.Len = (ushort)GetUTF8InfoLen(msg); 
 | 
                             chatPack.Content = msg; 
 | 
                             GameNetSystem.Instance.SendInfo(chatPack); 
 | 
                         } 
 | 
                         break; 
 | 
                     case ChatInfoType.Trumpet: 
 | 
                         { 
 | 
                             if (info.HasValue) 
 | 
                             { 
 | 
                                 CA217_tagCMPYSpeaker _pak = new CA217_tagCMPYSpeaker(); 
 | 
                                 _pak.SpeakerType = 1; 
 | 
                                 _pak.IsUseGold = 0; 
 | 
                                 _pak.ItemIndex = (byte)info.Value.infoint1; 
 | 
                                 _pak.TextLen = (ushort)GetUTF8InfoLen(msg); 
 | 
                                 _pak.Text = msg; 
 | 
                                 GameNetSystem.Instance.SendInfo(_pak); 
 | 
                             } 
 | 
                         } 
 | 
                         break; 
 | 
                     case ChatInfoType.default1: 
 | 
                         { 
 | 
                             if (PlayerDatas.Instance.baseData.faction == 0) 
 | 
                             { 
 | 
                                 SysNotifyMgr.Instance.ShowTip("FactionChatLimit"); 
 | 
                                 return; 
 | 
                             } 
 | 
                             CA216_tagCMPyTalk _pak = new CA216_tagCMPyTalk(); 
 | 
                             _pak.TalkType = 100; 
 | 
                             _pak.Len = (ushort)GetUTF8InfoLen(msg); 
 | 
                             _pak.Content = msg; 
 | 
                             GameNetSystem.Instance.SendInfo(_pak); 
 | 
                         } 
 | 
                         break; 
 | 
                 } 
 | 
             } 
 | 
         }); 
 | 
    } 
 | 
  
 | 
    int GetChatMessageLength(string message) 
 | 
    { 
 | 
        message = WordAnalysis.Color_Start_Regex.Replace(message, string.Empty); 
 | 
        message = WordAnalysis.Color_End_Regex.Replace(message, string.Empty); 
 | 
        return message.Length; 
 | 
    } 
 | 
  
 | 
    bool CheckEmptyChat(string msg) 
 | 
    { 
 | 
        if (string.IsNullOrEmpty(msg.Replace(" ", string.Empty))) 
 | 
        { 
 | 
            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.FightPower); 
 | 
                } 
 | 
            case ChatInfoType.Fairy: 
 | 
                return Language.Get(realmRandomChats[_index]); 
 | 
        } 
 | 
        return string.Empty; 
 | 
    } 
 | 
  
 | 
    public bool openFromFairyTask { get; set; } 
 | 
    Dictionary<int, List<string>> m_TaskRandomChats = new Dictionary<int, List<string>>(); 
 | 
    public string GetTaskRandomChat(ChatInfoType _type) 
 | 
    { 
 | 
        if (m_TaskRandomChats.ContainsKey((int)_type)) 
 | 
        { 
 | 
            var list = m_TaskRandomChats[(int)_type]; 
 | 
            var index = UnityEngine.Random.Range(0, list.Count); 
 | 
            return Language.Get(list[index]); 
 | 
        } 
 | 
        return string.Empty; 
 | 
    } 
 | 
  
 | 
    public bool needCheckAssitChat { get; set; } 
 | 
    public int IsAssitChat(string message, bool force = false) 
 | 
    { 
 | 
        int assitChat = 0; 
 | 
        if (needCheckAssitChat || force) 
 | 
        { 
 | 
            for (int i = 0; i < 2; i++) 
 | 
            { 
 | 
                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, 
 | 
} 
 |