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 { 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(); /// /// 聊天信息 /// private bool _lockUpdate = true; public bool lockUpdate { get { return _lockUpdate; } set { _lockUpdate = value; if (ChatFriend != null && ChatFriend.IsOpen) { ChatFriend.OnSetLock(); } } } private Dictionary> chatDics = new Dictionary>(); private Dictionary chatOpenDics = new Dictionary(); public List chatDisplayList = new List(); #region 私聊 private Dictionary> pteChatDics = new Dictionary>(); public event Action OnPteChatChangeEvent; public event Action 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 chatlist = new List(); private List chatUpList = new List(); 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 OnChatExtentOpenEvent; public event Action chatFloatUpdate; // TeamModel teamModel { // get { // return ModelCenter.Instance.GetModel(); // } // } // FriendsModel friendModel { // get { return ModelCenter.Instance.GetModel(); } // } // EquipGemModel equipGemModel { get { return ModelCenter.Instance.GetModel(); } } // EquipStrengthModel equipStrengthModel { get { return ModelCenter.Instance.GetModel(); } } // EquipStarModel equipStarModel { get { return ModelCenter.Instance.GetModel(); } } // EquipTrainModel equipTrainModel { get { return ModelCenter.Instance.GetModel(); } } // EquipModel equipModel { get { return ModelCenter.Instance.GetModel(); } } PackManager packManager => PackManager.Instance; // DungeonAssistModel dungeonAssistModel { get { return ModelCenter.Instance.GetModel(); } } public Dictionary> achievementRandoms = new Dictionary>(); List assistThankLanguages = new List(); 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(ConfigParse.GetMultipleStr(_cfg.Numerical1))); achievementRandoms.Add(ChatInfoType.Fairy, new List(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(LitJson.JsonMapper.ToObject(json[key].ToJson()))); } assistThankLanguages.AddRange(ConfigParse.GetMultipleStr(_cfg.Numerical4)); if (!string.IsNullOrEmpty(_cfg.Numerical5)) { var levelArray = ConfigParse.GetMultipleStr(_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; } /// /// 世界频道 /// /// 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("", vNetData.Name, "", ":", content); // } // else { content = StringUtility.Contact("", vNetData.Name, "", ":", content, string.Format("{0}|invite={1}", 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); } /// /// 区域频道 /// /// 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); } /// /// 跨服聊天 /// /// 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); } /// /// 喇叭喊话 /// /// 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); } /// /// 家族频道 /// /// 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); } /// /// 后端缓存 /// /// 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, }); } } } /// /// 好友私聊 /// /// 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 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(); list.Add(chatData); pteChatDics.Add(chatData.player + chatData.toPlayer, list); } if (OnRefreshPteChat != null && !isLocal) { OnRefreshPteChat(chatData); } } /// /// 队伍频道 /// /// public void RevChatInfo(H0205_tagTalkDui vNetData) { ChatData chatData = new ChatTeamData(vNetData.Content, (int)vNetData.PlayerID, vNetData.Name, vNetData.Extras); KeepChatInfo(chatData); ReceiveNewChat(ChatInfoType.Team); } /// /// GM /// /// public void RevChatInfo(H3202_tagServerResponse vNetData) { ChatData chatData = new ChatSystemData(vNetData.Message); KeepChatInfo(chatData); } /// /// 系统提示 /// /// 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); } } /// /// 获取频道聊天数据 /// /// /// public List GetChatInfo(ChatInfoType type) { List list = null; chatDics.TryGetValue(type, out list); return list; } /// /// 获取好友聊天数据 /// /// /// public List GetChatInfo(int player) { List list = null; pteChatDics.TryGetValue(player + (int)PlayerDatas.Instance.baseData.PlayerID, out list); return list; } /// /// 获取主界面的聊天数据 /// /// public List GetChatInfo() { return chatlist; } public List GetChatUpInfo() { return chatUpList; } public ChatData GetChatInfo(ChatInfoType type, int index) { List 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 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(); 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 suitPlaces = null; if (itemplusArray.Length > 15) { suitPlaces = new List(); 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("|showitem={0} itemplus={1}", 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 GetChatOpen() { return chatOpenDics; } #region 组队邀请 private const string INVITE_IDENTIFY = ""; 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 itemPlaceList = new List(); 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 = ""; 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 /// /// 清屏 /// public void ClearAllChatInfo() { chatDics.Clear(); chatlist.Clear(); chatUpList.Clear(); pteChatDics.Clear(); if (OnRefreshChat != null) { OnRefreshChat(presentChatType); } } public void ClearChatInfo(ChatInfoType type) { List 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> m_TaskRandomChats = new Dictionary>(); 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 chatSocialRedpoints = new Dictionary(); Dictionary unReadChatCounts = new Dictionary(); 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() // && (!UIManager.Instance.IsOpened() || presentChatType != ChatInfoType.Team)) // { // unReadChatCounts[ChatInfoType.Team] = Mathf.Min(unReadChatCounts[ChatInfoType.Team] + 1, 99); // } // break; // case ChatInfoType.Fairy: // if (!UIManager.Instance.IsOpened() // && (!UIManager.Instance.IsOpened() || 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, }