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 Thousandto.Code.Global; using Thousandto.Cfg.Data; namespace Thousandto.Code.Logic { public class ChatPrivateSystem { //私聊数据, <角色ID, 聊天数据> public Dictionary> PrivateChatDatas = new Dictionary>(); private List _cacheTranslateInfos = new List(100); //私聊窗口是否打开着 //public bool IsOpen = false; //当前聊天玩家PlayerID public ulong currentChatPlayerId = 0; public int RemovedChatNodeCount = 0; private double _cd = 4f; private double _nextTime = 0; // 当前私聊的玩家 private ChatPrivateInfo _currentChatPlayerInfo = new ChatPrivateInfo(); public ChatPrivateInfo CurrentChatPlayerInfo { get { return _currentChatPlayerInfo; } set { _currentChatPlayerInfo = value; } } public void Initialize() { _cd = float.Parse(DeclareGlobal.Get((int)GlobalName.Private_Chat_Interval).Params)*0.001f + 0.5f; } //发起私聊 public void ChatToPlayer(ulong id, string name, int career, int level, bool online, object parent , bool isNPC = false) { ChatPrivateInfo info = new ChatPrivateInfo() { ID = id, Name = name, Occ = career, Level = level, IsOnline = online, IsNPC = isNPC, }; GameCenter.PushFixEvent((int)UIEventDefine.UICHATPRIVATEFORM_OPEN, info, parent); } //保存翻译数据 public void CacheTranslateInfo(ChatInfo info) { if (info == null) return; bool isFind = false; for (int i = 0; i < _cacheTranslateInfos.Count; i++) { var data = _cacheTranslateInfos[i]; if (data != null) { if (data.ReceiveTime == info.ReceiveTime) { isFind = true; } } } if (!isFind) { if (_cacheTranslateInfos.Count > 99) { _cacheTranslateInfos.RemoveAt(0); } _cacheTranslateInfos.Add(info); } } public ChatInfo GetTranslateInfo(string time) { ChatInfo info = null; for (int i = 0; i < _cacheTranslateInfos.Count; i++) { var data = _cacheTranslateInfos[i]; if (data != null) { if (data.ReceiveTime == time) { info = data; } } } return info; } //将私聊数据放到缓存 public void CachePrivateData(ChatInfo info, ulong id) { info = ChatInfo.Copy(info); if (PrivateChatDatas.ContainsKey(id)) { if (PrivateChatDatas[id].Count >= ChatSystem.MAX_MSG_COUNT) { ChatInfo infos = PrivateChatDatas[id][0]; RemovedChatNodeCount++; PrivateChatDatas[id].RemoveAt(0); } PrivateChatDatas[id].Add(info); } else { List chatDatas = new List(); chatDatas.Add(info); PrivateChatDatas.Add(id, chatDatas); } } // 获取player最后一条聊天信息 public ChatInfo GetLastestChat(ulong player) { if (!PrivateChatDatas.ContainsKey(player)) { return null; } List allDatas = PrivateChatDatas[player]; ChatInfo latestChat = allDatas[allDatas.Count - 1]; return latestChat; } //获取玩家当前聊天数量 public int GetChatCount(ulong player) { if (!PrivateChatDatas.ContainsKey(player)) { return 0; } List allDatas = PrivateChatDatas[player]; return allDatas.Count; } //获取剩余cd时间 public double GetCD() { return _nextTime - GameCenter.HeartSystem.ServerTime; } public bool SendMessage(ChatInfo info) { if(GameCenter.HeartSystem.ServerTime >= _nextTime) { _nextTime = GameCenter.HeartSystem.ServerTime + _cd; GameCenter.ChatSystem.SendMessage(info, true); return true; } else { GameCenter.MsgPromptSystem.ShowPrompt(string.Format(DeclareMessageString.Get(DeclareMessageString.ChatColding), Mathf.Ceil((float)(_nextTime - GameCenter.HeartSystem.ServerTime)))); return false; } } // 是否有未读消息 public bool IsHasUnReadMessage(ulong playerId) { List list = null; if (PrivateChatDatas.TryGetValue(playerId, out list)) { foreach (var item in list) { if (!item.IsRead) { return true; } } } return false; } // 检测红点 public void CheckRedPointShow() { GameCenter.RedPointSystem.CleraFuncCondition(FunctionStartIdCode.Friend); var iter = PrivateChatDatas.GetEnumerator(); try { while(iter.MoveNext()) { for(int i = 0; i < iter.Current.Value.Count; ++i) { if(!iter.Current.Value[i].IsRead) { GameCenter.RedPointSystem.AddFuncCondition(FunctionStartIdCode.Friend, 0, new RedPointCustomCondition(true)); return; } } } } finally { iter.Dispose(); } } } }