using UnityEngine; using UnityEngine.UI; using System; using System.Collections; using System.Collections.Generic; using Games.GlobeDefine; using Games.ChatHistory; using Games.Item; using GCGame.Table; using GCGame; using Module.Log; using Google.ProtocolBuffers; public class ChatHistoryLogic : MonoBehaviour { public void ShowHistory(int channel) { _SelectedCannel = channel; _FriendGuid = 0; UpdateChannelHistory(); } public virtual void ShowHistory(UInt64 friendGuid) { _FriendGuid = friendGuid; _SelectedCannel = (int)GC_CHAT.CHATTYPE.CHAT_TYPE_FRIEND; UpdateChannelHistory(); } #region chat history public RectTransform _ChatSliderRect; public RectTransform _ChatLogContent; public GameObject _NewLogGO; public Text _NewLogTip; public GameObject _ChatLogPrefab; //普通 public GameObject _ChatSysLogPrefab;//系统 public GameObject _ChatMyLogPrefab; //我的 public GameObject _ChatBattlePrefab; //战斗 public GameObject _ChatRedPacketPrefab; //红包 public GameObject _ChatMyRedPacketPrefab; //红包我的 public GameObject _ChatVoicePrefab; //语音 public GameObject _ChatMyVoicePrefab; //语音我的 public List _ShowingChatLog = new List(); private bool _IsUpdateNew = true; private int _UnReadCount = 0; protected int _ShowingHistoryIdxMin = 0; protected int _ShowingHistoryIdxMax = 0; private float _LastSliderUpdateTime = 0; protected int _SelectedCannel = 0; protected UInt64 _FriendGuid = GlobeVar.INVALID_GUID; public const int _MAX_SHOW_COUNT = 200; public const int _SHOW_COUNT_IN_SINGLE_WIN = 20; public const float _SLIDER_UPDATE_DELAY = 0.5f; public virtual void OnReceiveChat() { int HistoryCount = GameManager.gameManager.PlayerDataPool.ChatHistory.ChatHistoryList.Count; ChatHistoryItem LastHistory = GameManager.gameManager.PlayerDataPool.ChatHistory.ChatHistoryList[HistoryCount - 1]; if ((int)GC_CHAT.CHATTYPE.CHAT_TYPE_FRIEND == _SelectedCannel && (LastHistory.EChannel == GC_CHAT.CHATTYPE.CHAT_TYPE_FRIEND || LastHistory.EChannel == GC_CHAT.CHATTYPE.CHAT_TYPE_TELL)) { if (_FriendGuid == LastHistory.SenderGuid || GameManager.gameManager.PlayerDataPool.MainPlayerBaseAttr.Guid == LastHistory.SenderGuid) { if (!_IsUpdateNew) { AddUnReadNew(); return; } if (_ShowingChatLog.Count > _SHOW_COUNT_IN_SINGLE_WIN) { RecicleLastOne(); } _ShowingHistoryIdxMax = HistoryCount - 1; _LastSliderUpdateTime = Time.time; HandleChatHistory(LastHistory); } } else if ((int)LastHistory.EChannel == _SelectedCannel || ((LastHistory.EChannel == GC_CHAT.CHATTYPE.CHAT_TYPE_LOUDSPEAKER || LastHistory.EChannel == GC_CHAT.CHATTYPE.CHAT_TYPE_ALLSERSPEAKER || LastHistory.EChannel == GC_CHAT.CHATTYPE.CHAT_TYPE_CROSSSERSPEAKER) && (int)GC_CHAT.CHATTYPE.CHAT_TYPE_WORLD == _SelectedCannel && !LastHistory.IsSystem)) { if (!_IsUpdateNew) { AddUnReadNew(); return; } if (_ShowingChatLog.Count > _SHOW_COUNT_IN_SINGLE_WIN) { RecicleLastOne(); } _ShowingHistoryIdxMax = HistoryCount - 1; _LastSliderUpdateTime = Time.time; HandleChatHistory(LastHistory); } } public void OnBtnReadNewClick() { UpdateChannelHistory(); _ChatLogContent.anchoredPosition = new Vector2(_ChatLogContent.anchoredPosition.x, 0); } public void OnHistoryContentSlider() { if (Time.time - _LastSliderUpdateTime < _SLIDER_UPDATE_DELAY) return; _LastSliderUpdateTime = Time.time; LogModule.DebugLog("OnHistoryContentSlider:" + _ChatLogContent.anchoredPosition.y); if (_ChatLogContent.anchoredPosition.y >= -20) { int maxCount = GameManager.gameManager.PlayerDataPool.ChatHistory.ChatHistoryList.Count - 1; if (_ShowingHistoryIdxMax <= maxCount) { if (!_IsUpdateNew) { _IsUpdateNew = true; UpdateChannelHistory(); } //_ChatLogContent.anchoredPosition = new Vector2(_ChatLogContent.anchoredPosition.x, 0); } } else if(_ChatSliderRect.sizeDelta.y - _ChatLogContent.anchoredPosition.y > _ChatLogContent.sizeDelta.y) { if (_ShowingHistoryIdxMin > 1) { UpdateChannelHistoryRange(_ShowingHistoryIdxMin - 1, true); } if (_IsUpdateNew) { _IsUpdateNew = false; } } else { if (_IsUpdateNew) { _IsUpdateNew = false; } } } public virtual void UpdateChannelHistory() { ClearHistory(); ClearUnReanNew(); int maxCount = GameManager.gameManager.PlayerDataPool.ChatHistory.ChatHistoryList.Count; int showedCnt = 0; for (int j = maxCount - 1; j >= 0; --j) { var chatItem = GameManager.gameManager.PlayerDataPool.ChatHistory.ChatHistoryList[j]; if ((int)chatItem.EChannel == _SelectedCannel) { try { HandleChatHistory(chatItem, false); } catch (Exception e) { LogModule.ErrorLog("chat history error:" + e.ToString()); } if (chatItem.SenderGuid != GlobeVar.INVALID_GUID) { showedCnt += 2; } else { ++showedCnt; } } else if (((int)chatItem.EChannel == (int)GC_CHAT.CHATTYPE.CHAT_TYPE_LOUDSPEAKER || (int)chatItem.EChannel == (int)GC_CHAT.CHATTYPE.CHAT_TYPE_ALLSERSPEAKER || (int)chatItem.EChannel == (int)GC_CHAT.CHATTYPE.CHAT_TYPE_CROSSSERSPEAKER) && _SelectedCannel == 5) //喇叭在世界频道显示 { try { HandleChatHistory(chatItem, false); } catch (Exception e) { LogModule.ErrorLog("chat history error:" + e.ToString()); } if (chatItem.SenderGuid != GlobeVar.INVALID_GUID) { showedCnt += 2; } else { ++showedCnt; } } if (showedCnt == _SHOW_COUNT_IN_SINGLE_WIN) { break; } } if (_ShowingChatLog.Count > 0) { _ShowingHistoryIdxMin = GameManager.gameManager.PlayerDataPool.ChatHistory.ChatHistoryList.IndexOf(_ShowingChatLog[0].ChatHistory); _ShowingHistoryIdxMax = GameManager.gameManager.PlayerDataPool.ChatHistory.ChatHistoryList.IndexOf(_ShowingChatLog[_ShowingChatLog.Count - 1].ChatHistory); } } public virtual void UpdateChannelHistoryRange(int idxStart, bool isUp) { int showedCnt = 0; if (isUp) { for (int j = idxStart; j >= 0; --j) { var chatItem = GameManager.gameManager.PlayerDataPool.ChatHistory.ChatHistoryList[j]; if ((int)chatItem.EChannel == _SelectedCannel || ((int)chatItem.EChannel == 7 && _SelectedCannel == 5)) { HandleChatHistory(chatItem, false); _ShowingHistoryIdxMin = j; if (chatItem.SenderGuid != GlobeVar.INVALID_GUID) { showedCnt += 2; } else { ++showedCnt; } } if (showedCnt == _SHOW_COUNT_IN_SINGLE_WIN * 0.5f) { break; } } } } public void TestChat() { int times = 100; for (int i = 0; i < times; ++i) { ChatHistoryItem item = new ChatHistoryItem(); item.CleanUp(); item.EChannel = (GC_CHAT.CHATTYPE.CHAT_TYPE_GUILD); item.ReceiverGuid = GlobeVar.INVALID_GUID; item.ReceiverName = ""; string modifyText = i.ToString(); modifyText = Utils.StrFilter_Chat(modifyText); item.ChatInfo = modifyText; Utils.SendCGChatPak(item.ChatInfo, item); } } protected virtual void HandleChatHistory(ChatHistoryItem history, bool showLast = true) { ChatInfoLogItem chatLogInfo = null; if (history._RedPacketID >= 0 && history.SenderGuid == GameManager.gameManager.PlayerDataPool.MainPlayerBaseAttr.Guid) { chatLogInfo = GetIdleChatLogItem(_ChatMyRedPacketPrefab); } else if (history._RedPacketID >= 0 && history.SenderGuid != GameManager.gameManager.PlayerDataPool.MainPlayerBaseAttr.Guid) { chatLogInfo = GetIdleChatLogItem(_ChatRedPacketPrefab); } else if (history.EChannel == GC_CHAT.CHATTYPE.CHAT_TYPE_SYSTEM) { chatLogInfo = GetIdleChatLogItem(_ChatSysLogPrefab); } else if (history.EChannel == GC_CHAT.CHATTYPE.CHAT_TYPE_BATTLE) { chatLogInfo = GetIdleChatLogItem(_ChatBattlePrefab); } else if (history.EChannel == GC_CHAT.CHATTYPE.CHAT_TYPE_GUILD && (history.IsSystem || history.SenderGuid == GlobeVar.INVALID_GUID)) { chatLogInfo = GetIdleChatLogItem(_ChatSysLogPrefab); } else if ((history.EChannel == GC_CHAT.CHATTYPE.CHAT_TYPE_TEAM || history.EChannel == GC_CHAT.CHATTYPE.CHAT_TYPE_LOUDSPEAKER || history.EChannel == GC_CHAT.CHATTYPE.CHAT_TYPE_ALLSERSPEAKER || history.EChannel == GC_CHAT.CHATTYPE.CHAT_TYPE_CROSSSERSPEAKER) && history.IsSystem) { chatLogInfo = GetIdleChatLogItem(_ChatSysLogPrefab); } else if (history.ChatInfo.StartsWith(ChatVoiceInputLogic._VoiceChatStart) && history.SenderGuid == GameManager.gameManager.PlayerDataPool.MainPlayerBaseAttr.Guid) { chatLogInfo = GetIdleChatLogItem(_ChatMyVoicePrefab); } else if (history.ChatInfo.StartsWith(ChatVoiceInputLogic._VoiceChatStart) && history.SenderGuid != GameManager.gameManager.PlayerDataPool.MainPlayerBaseAttr.Guid) { chatLogInfo = GetIdleChatLogItem(_ChatVoicePrefab); } else { if (history.SenderGuid == GameManager.gameManager.PlayerDataPool.MainPlayerBaseAttr.Guid) { chatLogInfo = GetIdleChatLogItem(_ChatMyLogPrefab); } else { chatLogInfo = GetIdleChatLogItem(_ChatLogPrefab); } } chatLogInfo.SetChatLog(history); if (showLast) { chatLogInfo.RectTransform.SetAsLastSibling(); _ShowingChatLog.Add(chatLogInfo); } else { chatLogInfo.RectTransform.SetAsFirstSibling(); _ShowingChatLog.Insert(0, chatLogInfo); } } protected ChatInfoLogItem GetIdleChatLogItem(GameObject prefab) { GameObject chatLogItemGO = null; var chatLogInfo = ResourcePool.Instance.GetIdleUIItem(prefab); if (chatLogInfo == null) { chatLogItemGO = GameObject.Instantiate(prefab) as GameObject; chatLogItemGO.name = prefab.name; chatLogInfo = chatLogItemGO.GetComponent(); } else { chatLogItemGO = chatLogInfo.gameObject; } chatLogItemGO.transform.SetParent(_ChatLogContent); chatLogItemGO.transform.localScale = Vector3.one; chatLogInfo.RectTransform.sizeDelta = new Vector2(Math.Abs(_ChatLogContent.rect.width), chatLogInfo.RectTransform.rect.height); chatLogItemGO.SetActive(true); return chatLogInfo; } protected void RecicleChatLogItem(ChatInfoLogItem chatItem) { chatItem.gameObject.SetActive(false); ResourcePool.Instance.RecvIldeUIItemImmediately(chatItem.gameObject); //chatItem.transform.SetParent(null); //chatItem.gameObject.SetActive(false); //if (!_IdleChatItems.ContainsKey(chatItem.name)) //{ // _IdleChatItems.Add(chatItem.name, new Stack()); //} //_IdleChatItems[chatItem.name].Push(chatItem); } void RecicleLastOne() { RecicleChatLogItem(_ShowingChatLog[0]); _ShowingChatLog.RemoveAt(0); _ShowingHistoryIdxMin = GameManager.gameManager.PlayerDataPool.ChatHistory.ChatHistoryList.IndexOf(_ShowingChatLog[0].ChatHistory); } void RecicleRange(int idxMin, int idxMax) { List recicleRange = new List(); float deltaHeight = 0; for (int i = idxMin; i < idxMax; ++i) { if (i >= 0 && i < _ShowingChatLog.Count) { RecicleChatLogItem(_ShowingChatLog[i]); deltaHeight += _ShowingChatLog[i].GetItemHeight(); } } _ShowingChatLog.RemoveRange(idxMin, idxMax - idxMin); _ShowingHistoryIdxMin = GameManager.gameManager.PlayerDataPool.ChatHistory.ChatHistoryList.IndexOf(_ShowingChatLog[0].ChatHistory); _ShowingHistoryIdxMax = GameManager.gameManager.PlayerDataPool.ChatHistory.ChatHistoryList.IndexOf(_ShowingChatLog[_ShowingChatLog.Count - 1].ChatHistory); } void AddUnReadNew() { ++_UnReadCount; _NewLogGO.SetActive(true); _NewLogTip.text = StrDictionary.GetClientDictionaryString("#{4901}", _UnReadCount); } protected void ClearUnReanNew() { _UnReadCount = 0; _NewLogGO.SetActive(false); } public virtual void ClearHistory() { _ChatLogContent.sizeDelta = new Vector2(_ChatLogContent.sizeDelta.x, 0); _UnReadCount = 0; _IsUpdateNew = true; var historyClear = _ChatLogContent.GetComponentsInChildren(); foreach (var chatItem in historyClear) { RecicleChatLogItem(chatItem); } _ShowingChatLog.Clear(); } #endregion #region voice public void UpdateVoiceAnim() { Debug.Log("_ShowingChatLog:" + _ShowingChatLog.Count); foreach (var chatItem in _ShowingChatLog) { if (chatItem is ChatInfoLogItemVoice) { ChatInfoLogItemVoice chatVoiceItem = chatItem as ChatInfoLogItemVoice; if (chatVoiceItem == null) continue; if (chatItem.ChatHistory == ChatVoice.Instance().GetPlayingChat()) { chatVoiceItem.PlayVoiceAnim(); } else { chatVoiceItem.StopVoiceAnim(); } } } } #endregion }