| | |
| | | |
| | | //<ChannelType,TalkData> |
| | | public Dictionary<ChatChannel, List<TalkData>> talkDict = new Dictionary<ChatChannel, List<TalkData>>(); |
| | | //用于缓存玩家的外观信息 |
| | | public Dictionary<uint, TalkData> playerInfoDict = new Dictionary<uint, TalkData>(); |
| | | |
| | | public Dictionary<int, ChatBubbleData> chatBubbles = new Dictionary<int, ChatBubbleData>(); |
| | | //<ChannelType,时间戳> |
| | | public Dictionary<int, int> chatChannelSendTime = new Dictionary<int, int>(); |
| | |
| | | private void OnBeforePlayerDataInitializeEvent() |
| | | { |
| | | talkDict.Clear(); |
| | | playerInfoDict.Clear(); |
| | | currentDay = -1; |
| | | ParseChatBubbleConfig(); |
| | | nowChatChannel = ChatChannel.World; |
| | | nowChatTab = ChatTab.World; |
| | |
| | | public static int GetUTF8InfoLen(string msg) |
| | | { |
| | | return Encoding.UTF8.GetBytes(msg).Length; |
| | | } |
| | | |
| | | public bool TryGetNewPlayerInfoByPlayerID(uint playerID, out TalkData talkData) |
| | | { |
| | | return playerInfoDict.TryGetValue(playerID, out talkData); |
| | | } |
| | | |
| | | public bool TryGetBubble(int id, out ChatBubbleData bubble) |
| | |
| | | } |
| | | |
| | | public int currentDay = -1; |
| | | public void AddTalkData(ChatChannel type, TalkData data) |
| | | public void AddTalkData(ChatChannel type, TalkData data, bool isSend) |
| | | { |
| | | //如果超过限制先删除旧数据 |
| | | TryDeleteTalkData(type); |
| | |
| | | talkDict[type] = new List<TalkData>(); |
| | | } |
| | | talkDict[type].Add(data); |
| | | OnUpdateTalkEvent?.Invoke(type, data); |
| | | if (isSend) |
| | | { |
| | | OnUpdateTalkEvent?.Invoke(type, data); |
| | | } |
| | | } |
| | | |
| | | public bool TryAddDate(int allSeconds, ChatChannel type) |
| | | public bool TryAddDate(int allSeconds, ChatChannel type, bool isSend) |
| | | { |
| | | DateTime talkTime = TimeUtility.GetTime((uint)allSeconds); |
| | | if (talkTime.Day != currentDay) |
| | |
| | | isDate = true, |
| | | Content = Language.Get("Chat09", talkTime.Month, talkTime.Day), |
| | | TalkTime = (uint)allSeconds, |
| | | }); |
| | | }, isSend); |
| | | return true; |
| | | } |
| | | return false; |
| | | } |
| | | |
| | | public void AddSysData(string msg, ArrayList infoList, ChatChannel type) |
| | | public void AddSysData(string msg, ArrayList infoList, ChatChannel type, bool isSend) |
| | | { |
| | | int allSeconds = TimeUtility.AllSeconds; |
| | | // 如果隔天,增加日期行 |
| | | TryAddDate(allSeconds, type); |
| | | TryAddDate(allSeconds, type, isSend); |
| | | |
| | | if (!talkDict.ContainsKey(type)) |
| | | { |
| | |
| | | BubbleBox = 1, |
| | | TalkTime = (uint)allSeconds, |
| | | InfoList = new ArrayList(infoList), |
| | | }); |
| | | }, isSend); |
| | | } |
| | | |
| | | public void UpdateTalk(HB310_tagMCTalk vNetData) |
| | |
| | | |
| | | int allSeconds = TimeUtility.AllSeconds; |
| | | // 如果隔天,增加日期行 |
| | | TryAddDate(allSeconds, type); |
| | | TryAddDate(allSeconds, type, true); |
| | | |
| | | TalkData talkData = new TalkData() |
| | | { |
| | |
| | | ServerID = vNetData.ServerID, |
| | | TalkTime = (uint)allSeconds, |
| | | }; |
| | | AddTalkData(type, talkData); |
| | | AddPlayerInfo(talkData); |
| | | AddTalkData(type, talkData, true); |
| | | |
| | | } |
| | | |
| | | public void UpdateTalkCacheList(HB311_tagMCTalkCacheList vNetData) |
| | |
| | | foreach (var info in vNetData.InfoList) |
| | | { |
| | | // 如果隔天,增加日期行 |
| | | TryAddDate((int)info.TalkTime, type); |
| | | AddTalkData(type, new TalkData() |
| | | TryAddDate((int)info.TalkTime, type, false); |
| | | TalkData talkData = new TalkData() |
| | | { |
| | | ChannelType = vNetData.ChannelType, |
| | | Name = info.Name, |
| | | Name = UIHelper.ServerStringTrim(info.Name), |
| | | PlayerID = info.PlayerID, |
| | | Content = info.Content, |
| | | Content = UIHelper.ServerStringTrim(info.Content), |
| | | BubbleBox = info.BubbleBox, |
| | | LV = info.LV, |
| | | Job = info.Job, |
| | |
| | | FacePic = info.FacePic, |
| | | ServerID = info.ServerID, |
| | | TalkTime = info.TalkTime, |
| | | }); |
| | | }; |
| | | AddPlayerInfo(talkData); |
| | | AddTalkData(type, talkData, false); |
| | | } |
| | | OnUpdateTalkCacheListEvent?.Invoke(); |
| | | } |
| | | |
| | | public event Action OnUpdatePlayerInfoEvent; |
| | | public void AddPlayerInfo(TalkData data) |
| | | { |
| | | bool isChange = false; |
| | | if (playerInfoDict.ContainsKey(data.PlayerID)) |
| | | { |
| | | if (data.Name != playerInfoDict[data.PlayerID].Name|| |
| | | data.BubbleBox != playerInfoDict[data.PlayerID].BubbleBox|| |
| | | data.LV != playerInfoDict[data.PlayerID].LV|| |
| | | data.Job != playerInfoDict[data.PlayerID].Job|| |
| | | data.RealmLV != playerInfoDict[data.PlayerID].RealmLV|| |
| | | data.TitleID != playerInfoDict[data.PlayerID].TitleID|| |
| | | data.Face != playerInfoDict[data.PlayerID].Face|| |
| | | data.FacePic != playerInfoDict[data.PlayerID].FacePic) |
| | | isChange = true; |
| | | |
| | | } |
| | | playerInfoDict[data.PlayerID] = data; |
| | | if (isChange) |
| | | OnUpdatePlayerInfoEvent?.Invoke(); |
| | | } |
| | | #region 标签页 |
| | | // 当前展示的频道入口 |
| | |
| | | public byte ChannelType; // 0-世界;1-跨服;3- 仙盟 |
| | | public bool isSystem = false; //系统消息 |
| | | public bool isDate = false; //分割日期 |
| | | public byte NameLen; |
| | | public string Name; |
| | | public uint PlayerID; |
| | | public string Content; |