using System; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using System.Linq; using Snxxz.UI; using System.Text.RegularExpressions; public enum MailState { Read, NoRead, Delete, Receive, } public class MailPanel : MonoBehaviour { #region 成员变量 [SerializeField] private Text _senderMessagerText; [SerializeField] private Text _titleMessageText; [SerializeField] private Text _theTotalTitleText; [SerializeField] private GameObject _buddyBlueAG; [SerializeField] private GameObject _buddyBlueBG; [SerializeField] private GameObject _buddyBlueCG; [SerializeField] private GameObject _buddyBlueDG; [SerializeField] private GameObject _buddyBlueEG; [SerializeField] private GameObject _goldBox; [SerializeField] private Text _goldText; [SerializeField] private GameObject _drillBox; [SerializeField] private Text _drillBoxeText; [SerializeField] private GameObject _fairyJadeBox; [SerializeField] private Text _fairyJadeBoxText; [SerializeField] private Toggle _allSelectToggle; [SerializeField] private Button _receiveBtn; [SerializeField] private Button _deleteBtn; [SerializeField] private ScrollerController _mailCellCtrl; #endregion private MailState _mailState = MailState.NoRead; private bool _isDeletePromp = true; private List _chooseMailList; public Dictionary _isChooseMailDict = new Dictionary(); private List _reciveItemParent = new List(); private List mailModellist; private MailInfo _currentMailInfo; private int curMail = 0; RuneModel _runeModel; RuneModel runeModel { get { return _runeModel ?? (_runeModel = ModelCenter.Instance.GetModel()); } } ItemTipsModel _itemTipsModel; ItemTipsModel itemTipsModel { get { return _itemTipsModel ?? (_itemTipsModel = ModelCenter.Instance.GetModel()); } } PackModel _playerPack; PackModel playerPack { get { return _playerPack ?? (_playerPack = ModelCenter.Instance.GetModel()); } } DogzModel dogzModel { get { return ModelCenter.Instance.GetModel(); } } VirtualPackModel virtualPackModel { get { return ModelCenter.Instance.GetModel(); } } private void Awake() { Init(); } public void Init() { _senderMessagerText.text = ""; _titleMessageText.text = ""; _theTotalTitleText.text = ""; _reciveItemParent.Add(_buddyBlueAG); _reciveItemParent.Add(_buddyBlueBG); _reciveItemParent.Add(_buddyBlueCG); _reciveItemParent.Add(_buddyBlueDG); _reciveItemParent.Add(_buddyBlueEG); _mailCellCtrl.OnRefreshCell += RefreshMailCell; _allSelectToggle.isOn = false; _allSelectToggle.onValueChanged.AddListener( delegate (bool isOn) { OnAllSelectToggle(isOn); } ); } private void OnEnable() { curMail = 0; CreateMailCell(); MailAllModel.Instance.GetNewMailEvent += GetNewMail; MailAllModel.Instance.CallBackReceiveEvent += OnGetReceiveResult; MailAllModel.Instance.DeleteMailEvent += OnGetDeleteResult; } private void OnDisable() { MailAllModel.Instance.GetNewMailEvent -= GetNewMail; MailAllModel.Instance.CallBackReceiveEvent -= OnGetReceiveResult; MailAllModel.Instance.DeleteMailEvent -= OnGetDeleteResult; } private void CreateMailCell() { mailModellist = MailAllModel.Instance.GetTimeOrderMaillist(); if (mailModellist == null) return; _mailCellCtrl.Refresh(); int mailCount = 0; for (mailCount = 0; mailCount < mailModellist.Count; mailCount++) { _mailCellCtrl.AddCell(ScrollerDataType.Header, mailCount); } _mailCellCtrl.Restart(); if (mailModellist.Count < 1) { ResetUI(); } } private void GetNewMail() { mailModellist = MailAllModel.Instance.GetTimeOrderMaillist(); curMail += MailAllModel.Instance.addMailCnt; _mailCellCtrl.Refresh(); int mailCount = 0; for (mailCount = 0; mailCount < mailModellist.Count; mailCount++) { _mailCellCtrl.AddCell(ScrollerDataType.Header, mailCount); } _mailCellCtrl.Restart(); if (curMail >= mailModellist.Count) { ResetUI(); } } private void ResetUI() { _theTotalTitleText.text = ""; _titleMessageText.text = ""; _senderMessagerText.text = ""; _goldBox.SetActive(false); _drillBox.SetActive(false); _fairyJadeBox.SetActive(false); int giftCount = 0; for (giftCount = 0; giftCount < _reciveItemParent.Count; giftCount++) { _reciveItemParent[giftCount].SetActive(false); } _deleteBtn.interactable = false; _receiveBtn.interactable = false; } private void RefreshMailCell(ScrollerDataType type, CellView cell) { MailCell mailCell = cell.GetComponent(); MailInfo info = mailModellist[cell.index]; MailAllModel.Instance.GetReciveMailContent(info); mailCell.cellToggel.group = _mailCellCtrl.GetComponent(); mailCell.chooseToggle.onValueChanged.RemoveAllListeners(); mailCell.cellToggel.onValueChanged.RemoveAllListeners(); mailCell.cellToggel.isOn = false; mailCell.noticeText.text = MailAllModel.Instance.mailTitleStr; mailCell.dateText.text = info.CreateTime; if (info.IsRead == 0) { mailCell.noReadIcon.gameObject.SetActive(true); mailCell.readIcon.gameObject.SetActive(false); } else { mailCell.noReadIcon.gameObject.SetActive(false); mailCell.readIcon.gameObject.SetActive(true); } if (info.Count > 0 || info.Gold > 0 || info.GoldPaper > 0 || info.Silver > 0) mailCell.giftIcon.gameObject.SetActive(true); else mailCell.giftIcon.gameObject.SetActive(false); mailCell.chooseToggle.isOn = info.isChoose; if (curMail == cell.index) { mailCell.cellToggel.isOn = true; OnClickMailCell(true, info, cell); } mailCell.chooseToggle.onValueChanged.AddListener((bool isOn) => { OnClickChooseToggle(isOn, info); }); mailCell.cellToggel.onValueChanged.AddListener((bool isOn) => { OnClickMailCell(isOn, info, cell); }); } public void OnAllSelectToggle(bool isOn) { if (isOn) { int mailCount = 0; for (mailCount = 0; mailCount < mailModellist.Count; mailCount++) { mailModellist[mailCount].isChoose = true; if (mailModellist[mailCount].Count > 0 || mailModellist[mailCount].Gold > 0 || mailModellist[mailCount].GoldPaper > 0 || mailModellist[mailCount].Silver > 0) { ChangeRightBtnUI(mailModellist[mailCount]); } } } else { int mailCount = 0; for (mailCount = 0; mailCount < mailModellist.Count; mailCount++) { mailModellist[mailCount].isChoose = false; } } CreateMailCell(); } private Dictionary chooseMailDict = new Dictionary(); private void OnClickChooseToggle(bool isOn, MailInfo info) { info.isChoose = isOn; if (isOn) { if (!chooseMailDict.ContainsKey(info.GUID)) { chooseMailDict.Add(info.GUID, info); } else { chooseMailDict[info.GUID] = info; } } else { if (chooseMailDict.ContainsKey(info.GUID)) { chooseMailDict.Remove(info.GUID); } } foreach (var value in chooseMailDict.Values) { if (value.Count > 0 || value.Gold > 0 || value.GoldPaper > 0 || value.Silver > 0) { ChangeRightBtnUI(value); return; } } ChangeRightBtnUI(_currentMailInfo); } private void OnClickMailCell(bool isOn, MailInfo info, CellView cell) { if (isOn) { _deleteBtn.interactable = true; _deleteBtn.RemoveAllListeners(); _deleteBtn.onClick.AddListener(OnClickDeleteBtn); curMail = cell.index; _currentMailInfo = info; MailAllModel.Instance.GetReciveMailContent(info); _senderMessagerText.text = MailAllModel.Instance.mailSendPersonStr; _titleMessageText.text = MailAllModel.Instance.mailTitleStr; _theTotalTitleText.text = MailAllModel.Instance.mailContentstr; Image noReadIcon = cell.transform.Find("NoReadIcon").GetComponent(); Image readIcon = cell.transform.Find("ReadIcon").GetComponent(); #region 刷新右边Ui信息 int giftCount = 0; for (giftCount = 0; giftCount < _reciveItemParent.Count; giftCount++) { ItemCell itemCell = _reciveItemParent[giftCount].transform.Find("ItemCell").GetComponent(); if (info.Count > 0 || info.Gold > 0 || info.GoldPaper > 0 || info.Silver > 0) { _deleteBtn.interactable = false; _reciveItemParent[giftCount].SetActive(true); _goldBox.SetActive(true); _drillBox.SetActive(true); _fairyJadeBox.SetActive(true); if (giftCount < info.Count) { itemCell.gameObject.SetActive(true); MailItemModel itemModel = info.Items[giftCount]; ItemCellModel cellModel = new ItemCellModel((int)itemModel.ItemID, false, (ulong)itemModel.Count, itemModel.IsBind, "", PackType.Deleted, false, ConfigParse.Analysis(itemModel.UserData)); itemCell.Init(cellModel); itemCell.cellBtn.onClick.RemoveAllListeners(); itemCell.cellBtn.onClick.AddListener(() => { ItemAttrData attrData = new ItemAttrData((int)itemModel.ItemID, false, (ulong)itemModel.Count, -1, itemModel.IsBind, true, PackType.Deleted, "", ConfigParse.Analysis(itemModel.UserData)); itemTipsModel.SetItemTipsModel(attrData); } ); } else { itemCell.gameObject.SetActive(false); } _goldText.text = ItemLogicUtility.Instance.OnChangeCoinsUnit(info.Silver).ToString(); _drillBoxeText.text = ItemLogicUtility.Instance.OnChangeCoinsUnit(info.GoldPaper).ToString(); _fairyJadeBoxText.text = ItemLogicUtility.Instance.OnChangeCoinsUnit(info.Gold).ToString(); } else { _reciveItemParent[giftCount].SetActive(false); _goldBox.SetActive(false); _drillBox.SetActive(false); _fairyJadeBox.SetActive(false); } } #endregion if (info.IsRead == 0) { noReadIcon.gameObject.SetActive(false); readIcon.gameObject.SetActive(true); info.IsRead = 1; MailAllModel.Instance.SendReadMailQuest(info.GUID); } int mailCount = 0; for (mailCount = 0; mailCount < mailModellist.Count; mailCount++) { if (mailModellist[mailCount].isChoose) { if (mailModellist[mailCount].Count > 0 || mailModellist[mailCount].Gold > 0 || mailModellist[mailCount].GoldPaper > 0 || mailModellist[mailCount].Silver > 0) { ChangeRightBtnUI(mailModellist[mailCount]); return; } } } ChangeRightBtnUI(info); } } public void ChangeRightBtnUI(MailInfo info) { if (info.Count > 0 || info.Gold > 0 || info.GoldPaper > 0 || info.Silver > 0) { _receiveBtn.interactable = true; _receiveBtn.onClick.RemoveAllListeners(); _receiveBtn.onClick.AddListener( delegate { OnClickReceiveBtn(); } ); } else { _receiveBtn.onClick.RemoveAllListeners(); _receiveBtn.interactable = false; } } public void OnClickReceiveBtn() { #region 得到领取的邮件 _isChooseMailDict.Clear(); int mailCount = 0; for (mailCount = 0; mailCount < mailModellist.Count; mailCount++) { if (mailModellist[mailCount].isChoose) { if (!_isChooseMailDict.ContainsKey(mailModellist[mailCount].GUID)) { _isChooseMailDict.Add(mailModellist[mailCount].GUID, mailModellist[mailCount]); } } } if (_currentMailInfo != null) { if (!_isChooseMailDict.ContainsKey(_currentMailInfo.GUID)) { _isChooseMailDict.Add(_currentMailInfo.GUID, _currentMailInfo); } } #endregion _chooseMailList = _isChooseMailDict.Values.ToList(); DebugEx.Log("OnClickReceiveBtn" + _chooseMailList.Count); if (_chooseMailList.Count > 0) { ReceiveAllChooseMail(0, _chooseMailList[0]); } } public void OnClickDeleteBtn() { #region 得到删除的邮件 _isChooseMailDict.Clear(); int mailCount = 0; for (mailCount = 0; mailCount < mailModellist.Count; mailCount++) { if (mailModellist[mailCount].isChoose) { if (!_isChooseMailDict.ContainsKey(mailModellist[mailCount].GUID)) { _isChooseMailDict.Add(mailModellist[mailCount].GUID, mailModellist[mailCount]); } } } if (_currentMailInfo != null) { if (!_isChooseMailDict.ContainsKey(_currentMailInfo.GUID)) { _isChooseMailDict.Add(_currentMailInfo.GUID, _currentMailInfo); } } #endregion _chooseMailList = _isChooseMailDict.Values.ToList(); if (_chooseMailList.Count > 0) { _isDeletePromp = true; DeleteAllChooseMail(0, _chooseMailList[0]); } } //使用递归发送请求 public void DeleteAllChooseMail(int index, MailInfo deleteCell) { DebugEx.Log(index + "比较" + _chooseMailList.Count); _mailState = MailState.Delete; if (index >= _chooseMailList.Count) { _allSelectToggle.isOn = false; OnAllSelectToggle(false); return; } if (_isDeletePromp) { if (deleteCell.Count > 0 || (int)deleteCell.Gold > 0 || (int)deleteCell.GoldPaper > 0 || (int)deleteCell.Silver > 0) { ConfirmCancel.ShowPopConfirm(Language.Get("Mail101"), Language.Get("Mail102"), (bool isOk) => { if (isOk) { SendAskDelete(deleteCell.GUID); _isDeletePromp = false; index += 1; if (index < _chooseMailList.Count) { DeleteAllChooseMail(index, _chooseMailList[index]); } else { DeleteAllChooseMail(index, null); } } else { _allSelectToggle.isOn = false; OnAllSelectToggle(false); } }); } else { SendAskDelete(deleteCell.GUID); index += 1; if (index < _chooseMailList.Count) { DebugEx.Log("递归" + index); DeleteAllChooseMail(index, _chooseMailList[index]); } else { DeleteAllChooseMail(index, null); } } } else { SendAskDelete(deleteCell.GUID); index += 1; if (index < _chooseMailList.Count) { DebugEx.Log("递归" + index); DeleteAllChooseMail(index, _chooseMailList[index]); } else { DeleteAllChooseMail(index, null); } } } private int _nextReceiveIndex = 0; private int preReceiveIndex = 0; public void ReceiveAllChooseMail(int index, MailInfo receiveCell) { _mailState = MailState.Receive; preReceiveIndex = index; if (receiveCell.Count > 0 || receiveCell.Gold > 0 || receiveCell.GoldPaper > 0 || receiveCell.Silver > 0) { DebugEx.Log("领取邮件:" + index); SendAskReceive(receiveCell.GUID); } index += 1; if (index >= _chooseMailList.Count) { _allSelectToggle.isOn = false; OnAllSelectToggle(false); return; } _nextReceiveIndex = index; if (receiveCell.Count <= 0 && receiveCell.Gold <= 0 && receiveCell.GoldPaper <= 0 && receiveCell.Silver <= 0) { ReceiveAllChooseMail(_nextReceiveIndex, _chooseMailList[_nextReceiveIndex]); } } //由于服务端删除邮件可能有冷却时间所以造成返回的次数不准确 public void OnGetReceiveResult(string guId, int result) { DebugEx.Log("OnGetReceiveResult" + result); if (result == 1) { if (_mailState == MailState.Receive) { if (preReceiveIndex != _nextReceiveIndex) { if (_chooseMailList != null && _chooseMailList.Count > _nextReceiveIndex) { ReceiveAllChooseMail(_nextReceiveIndex, _chooseMailList[_nextReceiveIndex]); } } } } else { ServerTipDetails.DisplayNormalTip(Language.Get("Mail103")); } } public void OnGetDeleteResult() { curMail = 0; CreateMailCell(); } private Dictionary GetPackItemDcit = new Dictionary(); public void SendAskReceive(string id) { MailInfo mailInfo = MailAllModel.Instance.GetMailInfo(id); if (mailInfo == null) return; GetPackItemDcit.Clear(); int i = 0; //int getBagItemCount = 0; //int getRuneCount = 0; //int getDogzCount = 0; //int getSoulCount = 0; ItemConfig tagChinItem = null; //for (i = 0; i < mailInfo.Count; i++) //{ // tagChinItem = ItemConfig.Get((int)mailInfo.Items[i].ItemID); // if (tagChinItem != null) // { // var packType = GeneralDefine.GetPackTypeByItemType(tagChinItem.Type); // if(!GetPackItemDcit.ContainsKey(packType)) // { // GetPackItemDcit.Add(packType,1); // } // else // { // GetPackItemDcit[packType] // } // switch(tagChinItem.Type) // { // case RuneModel.RUNE_TYPE: // case RuneModel.RUNE_CREAMTYPE: // getRuneCount += 1; // break; // case (int)ItemType.DogzStrengthMat: // case (int)ItemType.DogzEquipType1: // case (int)ItemType.DogzEquipType2: // case (int)ItemType.DogzEquipType3: // case (int)ItemType.DogzEquipType4: // case (int)ItemType.DogzEquipType5: // getDogzCount += 1; // break; // case GatheringSoulModel.GATHERSOUL_CORE_TYPE: // case GatheringSoulModel.GATHERSOUL_ESSENCE_TYPE: // case GatheringSoulModel.GATHERSOUL_SOUL_TYPE: // getSoulCount += 1; // break; // default: // getBagItemCount += 1; // break; // } // } //} for (i = 0; i < mailInfo.Count; i++) { tagChinItem = ItemConfig.Get((int)mailInfo.Items[i].ItemID); if (tagChinItem != null) { var packType = GeneralDefine.GetPackTypeByItemType(tagChinItem.Type); if (!GetPackItemDcit.ContainsKey(packType)) { GetPackItemDcit.Add(packType, 1); } else { GetPackItemDcit[packType] += 1; } } } foreach (var key in GetPackItemDcit.Keys) { int remainCount = 0; switch (key) { case PackType.GatherSoul: remainCount = virtualPackModel.GetPackRemainCount(key); break; case PackType.RunePack: remainCount = runeModel.SurplusRunePackCnt; break; default: remainCount = playerPack.GetEmptyGridCount(key); break; } int getCount = GetPackItemDcit[key]; if (remainCount < getCount) { SysNotifyMgr.Instance.ShowTip("GeRen_chenxin_676165", key); return; } } //if (getBagItemCount > playerPack.GetReaminGridCount(PackType.rptItem)) //{ // SysNotifyMgr.Instance.ShowTip("BagFull"); // return; //} //else if (getRuneCount > runeModel.SurplusRunePackCnt) //{ // SysNotifyMgr.Instance.ShowTip("RuneBagFull"); // return; //} //else if(getDogzCount > playerPack.GetReaminGridCount(PackType.rptDogzItem)) //{ // SysNotifyMgr.Instance.ShowTip("DogzBagFull"); // return; //} //else if(getSoulCount > virtualPackModel.GetPackRemainCount(PackType.rptGatherSoul)) //{ // SysNotifyMgr.Instance.ShowTip("GeRen_chenxin_676165",PackType.rptGatherSoul); // return; //} CA53B_tagCMRequestCompensation askRecive = new CA53B_tagCMRequestCompensation(); askRecive.GUID = id; GameNetSystem.Instance.SendInfo(askRecive); } public void SendAskDelete(string id) { CA9A7_tagCGDelCompensation askDelete = new CA9A7_tagCGDelCompensation(); askDelete.GUID = id; GameNetSystem.Instance.SendInfo(askDelete); } }