using Thousandto.Code.Center; using Thousandto.Plugins.Common; using System.Collections; using System.Collections.Generic; using UnityEngine; using Thousandto.Core.RootSystem; using Thousandto.Core.Base; using System; using Thousandto.Cfg.Data; using Thousandto.Core.Asset; using Thousandto.Core.Framework; using Thousandto.Code.Global; using System.Text.RegularExpressions; using UnityEngine.Gonbest.MagicCube; namespace Thousandto.Code.Logic { /// /// UIEntergameForm的逻辑处理类 /// public partial class ChatSystem { #region //私有数据 及 get set //聊天翻译开关 private bool _translateSwitch = false; //大聊天框宽度,会根据面板去计算 public const int MAX_MAIN_CHAT_LINE_WIDTH = 250; public const int MAX_MAIN_SYS_CHAT_LINE_WIDTH = 340; //主界面小聊天框宽度 #if USE_PC_MODEL public const int MAX_MINI_CHAT_LINE_WIDTH = 294; #else public const int MAX_MINI_CHAT_LINE_WIDTH = 294; #endif //私聊界面,每条聊天信息最大宽度 public const int MAX_PRIVATE_CHAT_LINE_WIDTH = 290; //私聊窗体, 聊天面板宽度 public const int PRIVATE_CHAT_PANEL_WIDTH = 420; //移除的chatnode个数,用于scrollview上删除对应个数的child public Dictionary RemovedChatNodeCountByChannel = new Dictionary(); private ChatInfo _cacheInfo = null; private ChatNode _senderNode = null; private List _cacheSendNodes; //用于存储消息节点 //private List _cacheRecvNodes; //用于存储接收消息节点 //logic代码和UI代码中间转换的工具类,消除logic代码对NGUI的直接使用 private Dictionary _cacheImageTypeDic = new Dictionary(); private IChatSystemTool _chatTool; public const int CHATER_SHIELD_ID = 50000; public bool TranslateSwitch { get { return _translateSwitch; } } public IChatSystemTool ChatTool { get {return _chatTool; } set { _chatTool = value; } } public ChatInfo CacheInfo { get { return _cacheInfo; } set { _cacheInfo = value; } } public int CurrentChannel { get; set; } public List CacheSendNodes { get { if (_cacheSendNodes == null) { _cacheSendNodes = new List(); } return _cacheSendNodes; } set { _cacheSendNodes = value; } } public Dictionary CacheImageTypeDic { get { return _cacheImageTypeDic; } } public static int ImgWidth = 30; public static int ImgHeight = 30; public static int RealImgWidth = 30; public static int RealImgHeight = 30; public const int BigImgWidth = 30; public const int BigImgHeight = 30; public const int LineHeight = 30; private int _imgPhotoWidth = 24; private int _imgPhotoHeight = 24; private int _fontSize = 21; private object[] _labelSkin = null; private int _loadFontCounter = 0; //表情 private string _expression1 = "#{0:D2}"; //静态表情 private string _expression2 = "@{0:D2}_{1}"; //动态表情,一直loop private string _expression3 = "^{0:D2}_{1}"; //动态表情,只播放一遍 private string _expression1Big = "##{0:D2}"; //静态表情 private string _expression2Big = "@@{0:D2}_{1}"; //动态表情,一直loop private string _expression3Big = "^^{0:D2}_{1}"; //动态表情,只播放一遍 public static int ExpressionCount1 = 0; //静态表情个数 public static int ExpressionCount2 = 0; //动态表情1 个数 public static int ExpressionCount3 = 0; //动态表情2 个数 public static int ExpressionCount1Big = 0; //静态表情个数 public static int ExpressionCount2Big = 0; //动态表情1 个数 public static int ExpressionCount3Big = 0; //动态表情2 个数 public Transform ExpressionGO; //动态load的表情,实例化表情图片就靠它 public Transform ExpressionBigGO; //大表情动态load的表情,实例化表情图片就靠它 //public Transform ItemGO; public Transform HistoryGO; public Transform VipGO; //vip等级 public Transform VoiceGO; //vip等级 public Dictionary LabelSkinDic = new Dictionary() { {(int)TLabelType.World, "FontWorld_yellow"}, {(int)TLabelType.Team, "FontTeam_blue"}, {(int)TLabelType.Guild, "FontGuild_green"}, {(int)TLabelType.System, "FontSystem_red"}, {(int)TLabelType.Private, "FontPrivate_orange"}, {(int)TLabelType.Position, "FontGuild_green"}, {(int)TLabelType.Player, "FontContent_white"}, {(int)TLabelType.Content, "FontContent_white"}, {(int)TLabelType.Extra_1, "Font_purple"}, {(int)TLabelType.Extra_2, "Font_golden"}, }; //频道背景sprite名字 public Dictionary ChanelBgDict = new Dictionary() { //talk_talkback {(int)ChatChanelType.WORLD, new Color(208/255f,197/255f,129/255f)}, {(int)ChatChanelType.GUILD, new Color(45/255f,202/255f,171/255f)}, {(int)ChatChanelType.TEAM, new Color(166/255f,200/255f,134/255f)}, {(int)ChatChanelType.PERSONAL, new Color(255/255f,0/255f,255/255f)}, {(int)ChatChanelType.SYSTEM, new Color(249/255f,118/255f,2/255f)}, {(int)ChatChanelType.ALL, new Color()}, {(int)ChatChanelType.PALACE, new Color()}, {(int)ChatChanelType.CURRENT, new Color(117/255f,194/255f,201/255f)}, {(int)ChatChanelType.JOINTEAM, new Color(134/255f,136/255f,234/255f)}, {(int)ChatChanelType.Live, new Color()}, {(int)ChatChanelType.Friend, new Color(227/255f,165/255f,219/255f)}, {(int)ChatChanelType.Experience, new Color(227/255f,165/255f,219/255f)}, }; private Dictionary _channelToString; public Dictionary ChannelToString { get { if (_channelToString == null) { _channelToString = new Dictionary() { {(int)ChatChanelType.WORLD, Thousandto.Cfg.Data.DeclareMessageString.Get(Thousandto.Cfg.Data.DeclareMessageString.C_CHAT_GROUP_WORLD)}, {(int)ChatChanelType.ChuanWen, Thousandto.Cfg.Data.DeclareMessageString.Get(Thousandto.Cfg.Data.DeclareMessageString.C_CHAT_GROUP_ChuanWen)}, {(int)ChatChanelType.GUILD, Thousandto.Cfg.Data.DeclareMessageString.Get(Thousandto.Cfg.Data.DeclareMessageString.C_CHAT_GROUP_GUILD)}, {(int)ChatChanelType.TEAM, Thousandto.Cfg.Data.DeclareMessageString.Get(Thousandto.Cfg.Data.DeclareMessageString.C_CHAT_GROUP_TEAM)}, {(int)ChatChanelType.PERSONAL, Thousandto.Cfg.Data.DeclareMessageString.Get(Thousandto.Cfg.Data.DeclareMessageString.C_CHAT_GROUP_PERSONAL)}, {(int)ChatChanelType.SYSTEM, Thousandto.Cfg.Data.DeclareMessageString.Get(Thousandto.Cfg.Data.DeclareMessageString.C_CHAT_GROUP_SYSTEM)}, {(int)ChatChanelType.ALL, Thousandto.Cfg.Data.DeclareMessageString.Get(Thousandto.Cfg.Data.DeclareMessageString.C_CHAT_GROUP_ALL)}, {(int)ChatChanelType.PALACE, Thousandto.Cfg.Data.DeclareMessageString.Get(Thousandto.Cfg.Data.DeclareMessageString.C_CHAT_GROUP_PALACE)}, {(int)ChatChanelType.CURRENT, Thousandto.Cfg.Data.DeclareMessageString.Get(Thousandto.Cfg.Data.DeclareMessageString.C_CHATSYSTEM_CHANNEL_CURRENT)}, {(int)ChatChanelType.JOINTEAM, Thousandto.Cfg.Data.DeclareMessageString.Get(Thousandto.Cfg.Data.DeclareMessageString.C_CHATSYSTEM_CHANNEL_TEAMINVITE)}, {(int)ChatChanelType.Live, Thousandto.Cfg.Data.DeclareMessageString.Get(Thousandto.Cfg.Data.DeclareMessageString.C_CHATSYSTEM_CHANNEL_LIVE)}, {(int)ChatChanelType.Friend, Thousandto.Cfg.Data.DeclareMessageString.Get(Thousandto.Cfg.Data.DeclareMessageString.C_CHAT_CHANNEL_BIRTH)}, {(int)ChatChanelType.Experience, Thousandto.Cfg.Data.DeclareMessageString.Get(Thousandto.Cfg.Data.DeclareMessageString.C_CHAT_CHANNEL_EXPRESION)}, {(int)ChatChanelType.Cross, Thousandto.Cfg.Data.DeclareMessageString.Get(Thousandto.Cfg.Data.DeclareMessageString.C_CHAT_CHANNEL_CROSS)}, {(int)ChatChanelType.CH, Thousandto.Cfg.Data.DeclareMessageString.Get(Thousandto.Cfg.Data.DeclareMessageString.C_LANG_CN)}, {(int)ChatChanelType.EN, Thousandto.Cfg.Data.DeclareMessageString.Get(Thousandto.Cfg.Data.DeclareMessageString.C_LANG_EN)}, {(int)ChatChanelType.TH, Thousandto.Cfg.Data.DeclareMessageString.Get(Thousandto.Cfg.Data.DeclareMessageString.C_LANG_TH)}, }; } return _channelToString; } } //物品颜色对应的label public Dictionary ItemColorToLabelID = new Dictionary() { {(int)TLabelColor.White, (int)TLabelType.Content}, {(int)TLabelColor.Green, (int)TLabelType.Guild}, {(int)TLabelColor.Blue, (int)TLabelType.Team}, {(int)TLabelColor.Purple, (int)TLabelType.Extra_1}, {(int)TLabelColor.Orange, (int)TLabelType.Private}, {(int)TLabelColor.Golden, (int)TLabelType.Extra_2}, {(int)TLabelColor.Red, (int)TLabelType.System}, }; //颜色id对应颜色值 public Dictionary ItemColorIDToColorStr = new Dictionary() { {(int)TLabelColor.White, "FFFFFF"}, {(int)TLabelColor.Green, "00FF00"}, {(int)TLabelColor.Blue, "006BFF"}, {(int)TLabelColor.Purple, "FF00FF"}, {(int)TLabelColor.Orange, "FF8000"}, {(int)TLabelColor.Golden, "FFFF00"}, {(int)TLabelColor.Red, "FF0000"}, }; //文本类型对应颜色值 public Dictionary LabelColorDic = new Dictionary() { {(int)TLabelType.World, "d0c581"}, {(int)TLabelType.Team, "a6c886"}, {(int)TLabelType.Guild, "2dcaab"}, {(int)TLabelType.System, "f97602"}, {(int)TLabelType.Private, "ff00ff"}, {(int)TLabelType.Position, "03ba03"}, {(int)TLabelType.Player, "03ba03"}, {(int)TLabelType.Content, "5e5754"}, {(int)TLabelType.Extra_1, "FF00FF"}, {(int)TLabelType.Extra_2, "FFFF00"}, {(int)TLabelType.JoinTeam, "3ae95f"}, {(int)TLabelType.Live, "FFFF00"}, {(int)TLabelType.Friend, "e3a5db"}, {(int)TLabelType.Current, "75c2c9"}, {(int)TLabelType.ChuanWen , "f97602"}, }; //每个频道聊天记录最大数 public const int MAX_MSG_COUNT = 40; public const int MAX_MSG_COUNT_MINI = 6; public Dictionary> ChannelData = new Dictionary>(); //保存各频道聊天数据 public List HistoryData = new List(); //存放历史聊天信息 public List DynamicExpresion = new List();//保存动态表情信息,管理播放动态表情的协程 public List DynamicBigExpresion = new List();//保存动态表情信息,管理播放动态表情的协程 public Dictionary> NewChannelData = new Dictionary>(); //保存各频道聊天数据 //缓存被释放的label控件 public static Queue CacheLabels = new Queue(); public static Queue CacheSprite = new Queue(); //聊天内容管理, 用于缓存及销毁 //<频道, 聊天内容> public Dictionary> TalkManagerDic = new Dictionary>(); public Queue CacheLabelGO = new Queue(); public List UseFullLabelGo = new List(); //小聊天框中的图片缓存 public Queue CacheMiniChatSpriteGO = new Queue(); public Queue CacheMiniChatSpriteGOBig = new Queue(); //大聊天框中的图片缓存 public Queue CacheMainChatSpriteGO = new Queue(); public Queue CacheMainChatSpriteGOBig = new Queue(); public Queue CacheVoiceGO = new Queue(); public bool IsInitLocalLeaveMsg = false; public bool IsCheckLeaveMsg = false; public float CacheMsgTick = 0; public float CacheMsgTime = 60; #endregion public void Initialize() { IsInitLocalLeaveMsg = false; _translateSwitch = false; var lanDic = FLanguage.EnabledSelectLans(); if (lanDic != null) _translateSwitch = lanDic.Count > 1; } public void Destroy() { DestroyCachedUI(); RemovedChatNodeCountByChannel.Clear(); ChannelData.Clear(); } //界面销毁的时候调用 public void DestroyCachedUI() { destroyCacheData(CacheLabels); destroyCacheData(CacheSprite); destroyCacheData(CacheMiniChatSpriteGO); destroyCacheData(CacheMainChatSpriteGO); destroyCacheData(CacheMainChatSpriteGOBig); destroyCacheData(CacheVoiceGO); } private void destroyCacheData(Queue cache) { for (int i = 0; i < cache.Count; ++i) { if (cache.Peek() != null) { GameObject.Destroy(cache.Peek()); } } cache.Clear(); } /* * Text: m_param1 = content; m_param2 = nil; * Player: m_param1 = player name; m_param2 = player id; * Item: m_param1 = item name; m_param2 = item id; * Equipment: m_param1 = equip name; m_param2 = equip uuid; m_param3 = quality * Image: m_param1 = image ; m_param2 = fps; m_param3 = loop * Position: m_param1 = content; m_param2 = map id; * Private: m_param1 = name; m_param2 = target player id; m_param3 = target player code * Audio: m_param1 = key; m_param2 = length m_param3 = "" * Team: m_param1 = mapid; m_param2 = roleid m_param3 = "code_rolename" * PlayerEx: m_param1 = player name; m_param2 = player code; m_param3 = "playerid" * TextEx: m_param1 = content; m_param2 = nil; * ImageEx: m_param1 = image ; m_param2 = fps; m_param3 = loop */ public void AddNode(int type, string params1, string params2 = "", string params3 = "") { ChatNode node = new ChatNode(); node.Type = type; node.Param1 = params1; node.Param2 = params2; node.Param3 = params3; CacheSendNodes.Add(node); } /// /// 添加一条聊天内容 /// /// /// public void AddTalk(int channel, OneTalkManager oneTalk) { if (TalkManagerDic.ContainsKey(channel)) { TalkManagerDic[channel].Enqueue(oneTalk); } else { Queue otmList = new Queue(); otmList.Enqueue(oneTalk); TalkManagerDic.Add(channel, otmList); } } //获取频道名字 public string GetChannelName(ChatChanelType channelID) { string name = ""; if (ChannelToString.ContainsKey((int)channelID)) { name = ChannelToString[(int)channelID]; } name = name.Trim('[', ']'); return name; } public string GetLabelColor(int labelType, int useDefaultColor = 0) { //大聊天窗固定text文字颜色 if (useDefaultColor == 2) return "354b7f"; //小聊天窗固定text文字颜色 if (useDefaultColor == 1) return "d0c581"; if (LabelColorDic.ContainsKey(labelType)) { return LabelColorDic[labelType]; } return LabelColorDic[(int)TLabelType.World]; } /// /// 当关闭界面或者切换频道会清除界面数据,则保存的聊天内容信息也要相应的清除掉 /// /// public void RemoveAllTalk(int channel) { if (TalkManagerDic.ContainsKey(channel)) { TalkManagerDic.Remove(channel); } } /// /// 判断输入的是否是GM命令还是普通消息 /// 以&开头为GM命令 /// /// public void IsGM(string input, bool isPrivateChat = false) { if (input.StartsWith("&")) { CacheSendNodes.Clear(); ChatNode node = new ChatNode(); node.isPrivateChatNode = isPrivateChat; node.Type = (int)TNodeType.CMD; node.Param1 = input; CacheSendNodes.Clear(); CacheSendNodes.Add(node); GameCenter.ClientGMSystem.IsLevelChangedGM(input); return; } int privateNodeCount = 0; if (isPrivateChat) { for (int i = 0; i < GameCenter.ChatSystem.CacheSendNodes.Count; ++i) { var node = CacheSendNodes[i]; if (!node.isPrivateChatNode) continue; privateNodeCount += 1; } } else { privateNodeCount = CacheSendNodes.Count; } if (privateNodeCount == 0) { ChatNode node = new ChatNode(); node.isPrivateChatNode = isPrivateChat; node.Type = (int)TNodeType.Text; node.Param1 = input; CacheSendNodes.Add(node); } } //设置中间工具 public void SetTool(IChatSystemTool tool) { ChatTool = tool; } /// /// 清除发送缓存 /// public void ClearCache() { CacheSendNodes.Clear(); } /// /// 将msg显示在聊天面板,这里不支持私聊面板,要使用私聊,请用ChatPrivateSystem /// /// /// public void AddChat(ChatChanelType channel, string msg) { MSG_Chat.ChatResInfo myChat = new MSG_Chat.ChatResInfo(); myChat.chatchannel = (int)channel; myChat.condition = msg; if (channel == ChatChanelType.ChuanWen) { var gCfg = DeclareGlobal.Get(2032); if (gCfg != null) { myChat.chater = ChatSystem.CHATER_SHIELD_ID - 1; string[] strs = gCfg.Params.Split('_'); long uId = long.TryParse(strs[0], out uId) ? uId : 0; int headId = int.TryParse(strs[1], out headId) ? headId : 0; int frameId = int.TryParse(strs[2], out frameId) ? frameId : 0; int paopaoId = int.TryParse(strs[3], out paopaoId) ? paopaoId : 0; myChat.chatBgId = paopaoId; myChat.head = new MSG_Common.HeadAttribute(); myChat.head.fashionHead = headId; myChat.head.fashionFrame = frameId; myChat.head.customHeadPath = ""; myChat.head.useCustomHead = false; } } GS2U_ChatResSC(myChat); string s1 = DeclareMessageString.Get(DeclareMessageString.C_ENTERMAPTIPS_SAFE); string s2 = DeclareMessageString.Get(DeclareMessageString.C_ENTERMAPTIPS_WEIXIAN); if(!string.Equals(msg,s1) && !string.Equals(msg, s2)) GameCenter.ChatSystem.CacheLocalLeavelMsg(myChat, null); } public void AddWorldPersonChat(ChatChanelType channel, string msg) { if (channel == ChatChanelType.WORLD) { MSG_Chat.ChatResInfo myChat = new MSG_Chat.ChatResInfo(); myChat.chatchannel = (int)channel; myChat.condition = msg; myChat.chater = ChatSystem.CHATER_SHIELD_ID - 1; var gCfg = DeclareGlobal.Get(2032); if (gCfg != null) { string[] strs = gCfg.Params.Split('_'); long uId = long.TryParse(strs[0], out uId) ? uId : 0; int headId = int.TryParse(strs[1], out headId) ? headId : 0; int frameId = int.TryParse(strs[2], out frameId) ? frameId : 0; int paopaoId = int.TryParse(strs[3], out paopaoId) ? paopaoId : 0; myChat.chatBgId = paopaoId; myChat.head = new MSG_Common.HeadAttribute(); myChat.head.fashionHead = headId; myChat.head.fashionFrame = frameId; myChat.head.customHeadPath = ""; myChat.head.useCustomHead = false; GS2U_ChatResSC(myChat); string s1 = DeclareMessageString.Get(DeclareMessageString.C_ENTERMAPTIPS_SAFE); string s2 = DeclareMessageString.Get(DeclareMessageString.C_ENTERMAPTIPS_WEIXIAN); if (!string.Equals(msg, s1) && !string.Equals(msg, s2)) GameCenter.ChatSystem.CacheLocalLeavelMsg(myChat, null); } } } /// /// 将msg添加到系统频道 /// /// public void AddSystemChat(string msg) { AddChat(ChatChanelType.SYSTEM, msg); } /// /// 获取聊天数据 /// /// /// public Queue GetChatDataByChannel(int channel) { Queue ret = null; if(!NewChannelData.ContainsKey(channel)) { NewChannelData.Add(channel, new Queue()); } ret = NewChannelData[channel]; return ret; } Camera _uiCamera; /// /// 获取UI相机 /// public Camera UICamera { get { if (_uiCamera == null) { GameObject cameraGO = GameObject.Find("UIRoot(Clone)/Cameras/Camera_UI"); if (cameraGO == null) { cameraGO = GameObject.Find("UIRoot/Cameras/Camera_UI"); } if (cameraGO == null) { return null; } _uiCamera = cameraGO.GetComponent(); } return _uiCamera; } set { _uiCamera = value; } } #region//UI界面按钮的回调函数 bool _opening = false; public void Open(int channel = (int)ChatChanelType.WORLD) { if(_opening) { _opening = false; Close(); return; } if (channel == (int)ChatChanelType.PERSONAL) { if (GameCenter.ChatPrivateSystem.PrivateChatDatas != null && GameCenter.ChatPrivateSystem.PrivateChatDatas.Count > 0) { //GameCenter.ChatPrivateSystem.Open(); return; } else channel = (int)ChatChanelType.ALL; } else if (channel == (int)ChatChanelType.TEAM) { if (!GameCenter.LuaSystem.Adaptor.IsTeamExist()) { //没有队伍,不能切换频道 channel = (int)ChatChanelType.ALL; } } else if(channel == (int)ChatChanelType.GUILD) { if(!GameCenter.LuaSystem.Adaptor.HasJoinedGuild()) { //没有公会 channel = (int)ChatChanelType.ALL; } } _opening = true; GameCenter.PushFixEvent((int)UIEventDefine.UIChatMainForm_OPEN, new int[] { channel, -1}); } public void Close() { _opening = false; GameCenter.PushFixEvent((int)UIEventDefine.UIChatMainForm_CLOSE); } public bool IsOpened() { return _opening; } /// /// 添加字体皮肤,在聊天界面初始化的时候调用 /// /// /// public void AddUILabelSkin(object label, int type) { if (_labelSkin == null) { _labelSkin = new object[(int)TLabelType.EndID]; } _labelSkin[type] = label; } /// /// 获取对应类型的字体,用于计算字符宽度 /// /// /// public object GetLabelSkin(int type) { if (_labelSkin != null && type < _labelSkin.Length) { return _labelSkin[type]; } return null; } /// /// 通过频道id获取对应的字体风格 /// /// /// public int GetLabelTypeByChannel(int channel) { int type = -1; switch ((ChatChanelType)channel) { case ChatChanelType.WORLD: type = (int)TLabelType.World; break; case ChatChanelType.GUILD: type = (int)TLabelType.Guild; break; case ChatChanelType.SYSTEM: type = (int)TLabelType.System; break; case ChatChanelType.TEAM: type = (int)TLabelType.Team; break; case ChatChanelType.PERSONAL: type = (int)TLabelType.Private; break; case ChatChanelType.PALACE: type = (int)TLabelType.Extra_1; break; case ChatChanelType.CURRENT: type = (int)TLabelType.Current; break; case ChatChanelType.JOINTEAM: type = (int)TLabelType.JoinTeam; break; case ChatChanelType.Friend: type = (int)TLabelType.Friend; break; case ChatChanelType.Live: type = (int)TLabelType.Live; break; case ChatChanelType.Experience: type = (int)TLabelType.System; break; } return type; } /// /// 静态表情 /// /// /// public string GetExpressionName1(int id, bool big = false) { if (big) return string.Format(_expression1Big, id); return string.Format(_expression1, id); } /// /// 一直循环播放的动态表情 /// /// /// public string GetExpressionName2(int id, bool big = false) { if (big) return string.Format(_expression2Big, id, 1); return string.Format(_expression2, id, 1); } /// /// 播放一遍的动态表情 /// /// /// public string GetExpressionName3(int id, bool big = false) { if (big) return string.Format(_expression3Big, id, 1); return string.Format(_expression3, id, 1); } //月卡、终生卡等类似vip等级提示的global表配置id //月卡1,终身卡2,月卡和终身卡都有为3 public int GetGlobalIdByVipLevel(int level) { string configIdStr = null; if (level == 1) configIdStr = Cfg.Data.DeclareGlobal.Get(1194).Params; else if (level == 2) configIdStr = Cfg.Data.DeclareGlobal.Get(1195).Params; else if (level == 3) configIdStr = Cfg.Data.DeclareGlobal.Get(1197).Params; int id = 0; int.TryParse(configIdStr, out id); return id; } #endregion #region //功能函数 /// /// 添加聊天数据到各个频道,保存起来 /// /// /// private void InsertData(int channel, ChatInfo info, int maxMsgCount = MAX_MSG_COUNT) { if (info.IsTranslate) return; if (NewChannelData.ContainsKey(channel)) { if (NewChannelData[channel].Count >= maxMsgCount) { //ChatInfo popInfo = NewChannelData[channel].Dequeue(); //popInfo.Destroy(); NewChannelData[channel].Dequeue(); } NewChannelData[channel].Enqueue(info); } else { Queue newNodes = new Queue(); newNodes.Enqueue(info); NewChannelData.Add(channel, newNodes); } } /// /// 添加聊天数据到各个频道,保存起来 /// /// /// private void insertData(int channel, ChatNode[] nodes, int maxMsgCount = MAX_MSG_COUNT) { if (ChannelData.ContainsKey(channel)) { if (ChannelData[channel].Count >= maxMsgCount) { //移除逻辑端最早的ChatNode ChannelData[channel].Dequeue(); if (GameCenter.ChatSystem.TalkManagerDic.ContainsKey(channel)) { CacheMiniChatNode(false); } } ChannelData[channel].Enqueue(nodes); //var enumer = ChannelData[channel].GetEnumerator(); //UnityEngine.Debug.LogError(string.Format("111111111111111111--{0}", ChannelData[channel].)) } else { Queue newNodes = new Queue(); newNodes.Enqueue(nodes); ChannelData.Add(channel, newNodes); } } //缓存小聊天所有节点 public void CacheMiniChatNode(bool all) { if (TalkManagerDic == null || TalkManagerDic.Count == 0 || !TalkManagerDic.ContainsKey((int)ChatChanelType.MINI)) return; //移除UI端最早的ChatNode Queue talkList = GameCenter.ChatSystem.TalkManagerDic[(int)ChatChanelType.MINI]; while(true) { if (talkList.Count == 0) break; OneTalkManager earlistTalk = talkList.Dequeue(); if (earlistTalk != null && earlistTalk.Label != null) { //earlistTalk.Label.SetActive(false); GameCenter.ChatSystem.CacheLabelGO.Enqueue(earlistTalk.Label); for (int i = 0; i < GameCenter.ChatSystem.UseFullLabelGo.Count; i++) { if (GameCenter.ChatSystem.UseFullLabelGo[i] == earlistTalk.Label.gameObject) { GameCenter.ChatSystem.UseFullLabelGo.RemoveAt(i); } } List imgNodes = earlistTalk.GetImageChatNode((int)ChatChanelType.MINI); for (int i = 0; i < imgNodes.Count; ++i) { if (imgNodes[i] != null && imgNodes[i].GO != null) { if (imgNodes[i].Type == (int)TNodeType.Image) { imgNodes[i].StopPlayAnim(); imgNodes[i].GO.SetActive(false); GameCenter.ChatSystem.CacheMiniChatSpriteGO.Enqueue(imgNodes[i].GO); } else if (imgNodes[i].Type == (int)TNodeType.Vip || imgNodes[i].Type == (int)TNodeType.Audio) { imgNodes[i].Destory(); } else if (imgNodes[i].Type == (int)TNodeType.BigImage) { imgNodes[i].StopPlayAnim(); imgNodes[i].GO.SetActive(false); CacheMiniChatSpriteGOBig.Enqueue(imgNodes[i].GO); } } } } if (!all) break; } } /// /// 清除动态表情缓存,实际上是关闭协程 /// public void ClearDynamicExpresion() { destoryChatNode(ref DynamicExpresion, true); destoryChatNode(ref DynamicBigExpresion, true); } /// /// 销毁聊天节点 /// /// private void destoryChatNode(ref List nodes, bool clearList = false) { for (int i = 0; i < nodes.Count; i++) { GameObject.Destroy(nodes[i].GO); nodes[i].GO = null; } if (clearList) { nodes.Clear(); } } /// /// 清除频道GO数据,避免添加到scrollview后GO被替换或者数据被重置 /// /// public void ResetGameObjectDataByChannel(int channel) { if (!ChannelData.ContainsKey(channel)) { return; } //先清除之前频道的gameobject数据 Queue.Enumerator iterclear = ChannelData[channel].GetEnumerator(); while (iterclear.MoveNext()) { ChatNode[] nodes = iterclear.Current; for (int i = 0; i < nodes.Length; i++) { nodes[i].Destory(); } } } /// /// 太多引用传值了,这里就做拷贝 /// /// /// public ChatNode[] copyList(List nodes) { ChatNode[] newNodes = new ChatNode[nodes.Count]; for (int i = 0; i < nodes.Count; i++) { newNodes[i] = new ChatNode(nodes[i]); } return newNodes; } /// /// 通过color id获取对应的label /// /// /// public object GetLabelByColorID(int id) { if (!ItemColorToLabelID.ContainsKey(id)) { return null; } int labelId = ItemColorToLabelID[id]; if (!LabelSkinDic.ContainsKey(labelId) || labelId > _labelSkin.Length) { return null; } return _labelSkin[labelId]; } /// /// 通过color id获取对应的label /// /// /// public string GetColorByColorID(int id) { if (!ItemColorIDToColorStr.ContainsKey(id)) { return null; } string labelId = ItemColorIDToColorStr[id]; return labelId; } //附近玩家 public List GetNearPlayers() { List chatInfos = new List(); List players = GameCenter.GameSceneSystem.ActivedScene.FindAll(); if (players != null) { for (int i = 0; i < players.Count; i++) { ChatPrivateInfo info = new ChatPrivateInfo(); info.ID = players[i].ID; info.Name = players[i].Name; info.Occ = (int)players[i].Occ; info.Level = players[i].Level; chatInfos.Add(info); } } return chatInfos; } //好友数据 public List GetFriends() { //List friends = GameCenter.FriendSystem.FriendList; List chatInfos = new List(); //if (friends != null) //{ // for (int i = 0; i < friends.Count; i++) // { // ChatPrivateInfo info = new ChatPrivateInfo(); // info.ID = friends[i].PlayerID; // info.Name = friends[i].Name; // chatInfos.Add(info); // } //} return chatInfos; } //移动到目标点 public void MoveTo(ChatNode node) { if (node.Type != (int)TNodeType.Position) { return; } string[] position = node.Position.Split(','); int mapId = 0; int.TryParse(node.Param2, out mapId); float pX = 0; float pY = 0; float.TryParse(position[0], out pX); float.TryParse(position[1], out pY); //GameCenter.GameSceneSystem.GetLocalPlayer().blackboard.MapMove.Write2D(mapId, new Vector2(pX, pY), 0.0f, true); GameCenter.PathSearchSystem.SearchPathToPos(mapId, new Vector3(pX, 0, pY)); } public void TransTo(ChatNode node) { int mapid = -1; int type = 0; if (node.Param2.IndexOf("_") > 0) { string[] args = node.Param2.Split('_'); mapid = int.Parse(args[0]); type = int.Parse(args[1]); } string[] position = node.Position.Split(','); float pX = 0; float pY = 0; float.TryParse(position[0], out pX); float.TryParse(position[1], out pY); //先传送到对应地图在寻路过去 GameCenter.PathSearchSystem.SearchPathToPos(mapid, new Vector3(pX, 0, pY)); } public void CloneMapTransTo(ChatNode node) { int mapid = -1; long cloneMapId = 0; try { if (node.Param2.IndexOf("_") > 0) { string[] args = node.Param2.Split('_'); mapid = int.Parse(args[0]); cloneMapId = long.Parse(args[1]); } } catch(Exception ex) { //UnityEngine.Debug.LogError("Chat trans fail: format error: " + node.Param2); UnityEngine.Debug.LogError(ex.Message); return; } string[] position = node.Position.Split(','); float pX = 0; float pY = 0; float.TryParse(position[0], out pX); float.TryParse(position[1], out pY); //先传送到对应地图在寻路过去 GameCenter.PathSearchSystem.SearchPathToPos(mapid, new Vector3(pX, 0, pY), cloneMapId); } public string RemoveColorTag(string text, List colorflags) { int start = 0; int end = 0; if (colorflags != null) { colorflags.Clear(); } System.Text.StringBuilder sb = new System.Text.StringBuilder(); end = text.IndexOf("[", start); while (end >= 0) { var nextTag = text.IndexOf("[", end + 1); if (nextTag - end == 1) { end = nextTag; continue; } int offset = text.IndexOf("]", end) - end; if (offset < 0) { break; } sb.Append(text.Substring(start, end - start)); string colorTag = text.Substring(end, offset + 1); if (offset == 7) { //不在颜色区间中 if (colorTag.CompareTo("[000000]") < 0 || colorTag.CompareTo("[ffffff]") > 0) { sb.Append(colorTag); } else { ChatColorFlag flag = new ChatColorFlag(); flag.ColorText = colorTag; flag.Left = end; colorflags.Add(flag); } } else if (offset == 2) { if (colorTag != "[-]") { sb.Append(colorTag); } else { ChatColorFlag flag = new ChatColorFlag(); flag.ColorText = colorTag; flag.Left = end; colorflags.Add(flag); } } else sb.Append(colorTag); start = end + offset + 1; end = text.IndexOf("[", start); } sb.Append(text.Substring(start)); return sb.ToString(); } public string GetTranlateLan() { string ret = "zh-CN"; if (LanguageSystem.Lang == LanguageConstDefine.CH) ret = "zh-CN"; else if (LanguageSystem.Lang == LanguageConstDefine.TW) ret = "zh-TW"; else if (LanguageSystem.Lang == LanguageConstDefine.EN) ret = "en"; else if (LanguageSystem.Lang == LanguageConstDefine.KR) ret = "ko"; else if (LanguageSystem.Lang == LanguageConstDefine.VIE) ret = "vi"; else if (LanguageSystem.Lang == LanguageConstDefine.JP) ret = "ja"; else if (LanguageSystem.Lang == LanguageConstDefine.TH) ret = "th"; return ret; } public string CheckLan(string str) { bool checkJp = false; string ret = string.Empty; Regex regChina = new Regex("^[^\x00-\xFF]"); Regex regEnglish = new Regex("^[a-zA-Z]"); if (regEnglish.IsMatch(str)) { ret = "en"; } else { //检查语言 for (int i = 0; i < str.Length; ++i) { var ch = str[i]; if (ch >= '\x0102' && ch <= '\x1EF1') { //越南文 ret = "vi"; break; } if (ch >= '\x0E00' && ch <= '\x0E7F') { //泰文 ret = "th"; break; } if (!checkJp) { if (ch >= '\x4E00' && ch <= '\x9FD5') { //中文 ret = "zh-CN"; checkJp = true; } } else { if (ch >= '\x3040' && ch <= '\x309F') { //针对性的检查一下是否是日文 ret = "ja"; break; } if (ch >= '\x30A0' && ch <= '\x30FF') { //针对性的检查一下是否是日文 ret = "ja"; break; } if (ch >= '\x31F0' && ch <= '\x31FF') { //针对性的检查一下是否是日文 ret = "ja"; break; } } if (ch >= '\xAC00' && ch <= '\xD7AF') { //韩文 ret = "ko"; break; } } } return ret; } public void Update(float dt) { if (CacheMsgTick > 0) { CacheMsgTick -= dt; } else { CacheMsgTick = 0; } } #endregion } }