| //--------------------------------------------------------  | 
| //    [Author]:           第二世界  | 
| //    [  Date ]:           Monday, March 05, 2018  | 
| //--------------------------------------------------------  | 
|   | 
| using System;  | 
| using System.Collections;  | 
| using System.Collections.Generic;  | 
| using UnityEngine;  | 
| using UnityEngine.UI;  | 
|   | 
| namespace vnxbqy.UI  | 
| {  | 
|   | 
|     public class ImpactRankWin : Window  | 
|     {  | 
|         [SerializeField] ScrollerController m_RankAwardCtrl;  | 
|         [SerializeField] Text m_RankTxt;  | 
|         [SerializeField] Text m_TotalTarget;  | 
|         [SerializeField] Text m_TotalTargetValue;  | 
|         [SerializeField] Image m_TargetImg;  | 
|         [SerializeField] Text m_ActivityCoolDown;  | 
|         [SerializeField] Button m_ViewRankBtn;  | 
|         [SerializeField] Button m_RulesBtn;  | 
|         [SerializeField] ScrollerController m_PromotePathCtrl;  | 
|   | 
|         ImpactRankModel m_Model;  | 
|         ImpactRankModel model {  | 
|             get {  | 
|                 return m_Model ?? (m_Model = ModelCenter.Instance.GetModel<ImpactRankModel>());  | 
|             }  | 
|         }  | 
|   | 
|         RankModel m_RankModel;  | 
|         RankModel rankModel {  | 
|             get {  | 
|                 return m_RankModel ?? (m_RankModel = ModelCenter.Instance.GetModel<RankModel>());  | 
|             }  | 
|         }  | 
|   | 
|         private int m_LastSecond = -1;  | 
|         private List<int> m_ActivityCloseList = new List<int>();  | 
|         private Dictionary<int, DateTime> m_ActivityCloseTimeDict = new Dictionary<int, DateTime>();  | 
|         #region Built-in  | 
|         protected override void BindController()  | 
|         {  | 
|         }  | 
|   | 
|         protected override void AddListeners()  | 
|         {  | 
|             m_RankAwardCtrl.OnRefreshCell += OnRefreshCell;  | 
|             m_RankAwardCtrl.lockType = EnhanceLockType.KeepVertical;  | 
|             m_ViewRankBtn.onClick.AddListener(OnViewRank);  | 
|             m_RulesBtn.onClick.AddListener(OnRuleBtn);  | 
|         }  | 
|   | 
|         protected override void OnPreOpen()  | 
|         {  | 
|             TimeUtility.OnServerOpenDayRefresh += OnServerOpenDayRefresh;  | 
|             model.OnSelectRankTypeEvent += OnSelectRankTypeEvent;  | 
|             rankModel.onRankRefresh += OnRefreshRankList;  | 
|             model.OnAwardGetEvent += OnAwardGetEvent;  | 
|             m_ActivityCloseList.Clear();  | 
|             m_ActivityCloseTimeDict.Clear();  | 
|         }  | 
|   | 
|         protected override void OnActived()  | 
|         {  | 
|             base.OnActived();  | 
|             OnSelectRankTypeEvent();  | 
|         }  | 
|   | 
|         protected override void OnAfterOpen()  | 
|         {  | 
|   | 
|         }  | 
|   | 
|         protected override void OnPreClose()  | 
|         {  | 
|             TimeUtility.OnServerOpenDayRefresh -= OnServerOpenDayRefresh;  | 
|             model.OnSelectRankTypeEvent -= OnSelectRankTypeEvent;  | 
|             rankModel.onRankRefresh -= OnRefreshRankList;  | 
|             model.OnAwardGetEvent -= OnAwardGetEvent;  | 
|         }  | 
|   | 
|         protected override void OnAfterClose()  | 
|         {  | 
|   | 
|         }  | 
|   | 
|         protected override void LateUpdate()  | 
|         {  | 
|             base.LateUpdate();  | 
|             if (model.IsLock(model.presentSelectType))  | 
|             {  | 
|                 return;  | 
|             }  | 
|             if (TimeUtility.Second != m_LastSecond)  | 
|             {  | 
|                 m_LastSecond = TimeUtility.Minute;  | 
|                 if (m_ActivityCloseList.Contains(model.presentSelectType))  | 
|                 {  | 
|                     return;  | 
|                 }  | 
|                 UpdateTime();  | 
|             }  | 
|         }  | 
|         #endregion  | 
|   | 
|         private void OnServerOpenDayRefresh()  | 
|         {  | 
|             UpdateRanks();  | 
|             m_RankAwardCtrl.m_Scorller.RefreshActiveCellViews();  | 
|         }  | 
|   | 
|         private void OnRefreshRankList(int type)  | 
|         {  | 
|             if (type == (int)model.presentBillRankType)  | 
|             {  | 
|                 UpdateRanks();  | 
|                 m_RankAwardCtrl.m_Scorller.RefreshActiveCellViews();  | 
|             }  | 
|         }  | 
|   | 
|         private void OnAwardGetEvent()  | 
|         {  | 
|             UpdateRanks();  | 
|             m_RankAwardCtrl.m_Scorller.RefreshActiveCellViews();  | 
|         }  | 
|   | 
|         private void OnSelectRankTypeEvent()  | 
|         {  | 
|             UpdateAwards();  | 
|             UpdateRanks();  | 
|             UpdateGetPaths();  | 
|             UpdateTime();  | 
|         }  | 
|   | 
|         private void UpdateAwards()  | 
|         {  | 
|             m_RankAwardCtrl.Refresh();  | 
|             if (model.billRankAwardDict.ContainsKey(model.presentSelectType))  | 
|             {  | 
|                 for (int i = 0; i < model.GetAllBillCfgCount(model.presentSelectType); i++)  | 
|                 {  | 
|                     m_RankAwardCtrl.AddCell(ScrollerDataType.Header, i);  | 
|                 }  | 
|             }  | 
|             m_RankAwardCtrl.Restart();  | 
|             var _index = 0;  | 
|             if (model.CanGetAward(model.presentSelectType, out _index))  | 
|             {  | 
|                 m_RankAwardCtrl.JumpIndex(_index);  | 
|             }  | 
|             else  | 
|             {  | 
|                 m_RankAwardCtrl.JumpIndex(0);  | 
|             }  | 
|         }  | 
|   | 
|         private void UpdateTime()  | 
|         {  | 
|             if (model.IsLock(model.presentSelectType))  | 
|             {  | 
|                 var _day = model.GetOpenDay(model.presentSelectType);  | 
|                 m_ActivityCoolDown.color = UIHelper.GetUIColor(TextColType.NavyYellow);  | 
|                 if (_day == 1)  | 
|                 {  | 
|                     m_ActivityCoolDown.text = Language.Get("OpenTomorrow");  | 
|                 }  | 
|                 else  | 
|                 {  | 
|                     m_ActivityCoolDown.text = Language.Get("OpenAfterDays", _day);  | 
|                 }  | 
|                 return;  | 
|             }  | 
|             if (m_ActivityCloseList.Contains(model.presentSelectType))  | 
|             {  | 
|                 m_ActivityCoolDown.color = UIHelper.GetUIColor(TextColType.NavyYellow);  | 
|                 m_ActivityCoolDown.text = Language.Get("ActivityEnd");  | 
|                 return;  | 
|             }  | 
|             var _surplusDay = model.GetSurplusDay(model.presentSelectType);  | 
|             if (_surplusDay <= 0)  | 
|             {  | 
|                 m_ActivityCloseList.Add(model.presentSelectType);  | 
|                 if (m_ActivityCloseTimeDict.ContainsKey(model.presentSelectType))  | 
|                 {  | 
|                     m_ActivityCloseTimeDict.Remove(model.presentSelectType);  | 
|                 }  | 
|                 m_ActivityCoolDown.color = UIHelper.GetUIColor(TextColType.NavyYellow);  | 
|                 m_ActivityCoolDown.text = Language.Get("ActivityEnd");  | 
|                 m_RankAwardCtrl.m_Scorller.RefreshActiveCellViews();  | 
|             }  | 
|             else  | 
|             {  | 
|                 m_ActivityCoolDown.color = UIHelper.GetUIColor(TextColType.LightGreen);  | 
|                 if (!m_ActivityCloseTimeDict.ContainsKey(model.presentSelectType))  | 
|                 {  | 
|                     DateTime _result = TimeUtility.ServerNow;  | 
|                     DateTime.TryParse(TimeUtility.ServerNow.AddDays(_surplusDay).ToString("yyyy-MM-dd"), out _result);  | 
|                     m_ActivityCloseTimeDict.Add(model.presentSelectType, _result);  | 
|                 }  | 
|                 m_ActivityCoolDown.text = StringUtility.Contact(Language.Get("OSActivityCoolDown"),  | 
|                     TimeUtility.SecondsToDHMSCHS((int)(m_ActivityCloseTimeDict[model.presentSelectType] - TimeUtility.ServerNow).TotalSeconds));  | 
|             }  | 
|         }  | 
|   | 
|         private void UpdateRanks()  | 
|         {  | 
|             DisplayTargetDesc();  | 
|             m_RankTxt.color = UIHelper.GetUIColor(TextColType.NavyYellow);  | 
|             m_TotalTargetValue.color = UIHelper.GetUIColor(TextColType.NavyYellow);  | 
|             if (model.IsMissImpactRank((int)model.presentSelectType))  | 
|             {  | 
|                 m_TargetImg.SetActive(false);  | 
|                 m_TotalTargetValue.SetActive(true);  | 
|                 m_RankTxt.text = Language.Get("OSCMissActivity");  | 
|                 m_TotalTargetValue.text = Language.Get("OSCMissActivity");  | 
|                 return;  | 
|             }  | 
|             if (model.IsLock(model.presentSelectType))  | 
|             {  | 
|                 m_RankTxt.text = Language.Get("OSCActivityNotOpen");  | 
|             }  | 
|             else  | 
|             {  | 
|                 //var _rank = 0;  | 
|                 //if (!rankModel.TryGetMyRank((int)model.GetRankType(model.presentSelectType), out _rank))  | 
|                 //{  | 
|                 //    _rank = -1;  | 
|                 //}  | 
|                 RankData rankObj = rankModel.GetMyRank((int)model.GetRankType(model.presentSelectType));  | 
|                 var _rank = rankObj == null ? -1 : rankObj.index + 1;  | 
|                 if (_rank == -1)  | 
|                 {  | 
|                     m_RankTxt.text = Language.Get("FamilyMatchUnBeOnList");  | 
|                 }  | 
|                 else  | 
|                 {  | 
|                     m_RankTxt.text = _rank.ToString();  | 
|                     m_RankTxt.color = UIHelper.GetUIColor(TextColType.LightGreen);  | 
|                 }  | 
|             }  | 
|             ImpactRankModel.OpenServerPlayerData _playerData;  | 
|             var _hasData = model.TryGetOpenServerPlayerData(model.presentSelectType, out _playerData);  | 
|             switch (model.GetRankType(model.presentSelectType))  | 
|             {  | 
|                 case RankType.OpenServerRealm:  | 
|                     m_TargetImg.SetActive(_hasData && _playerData.value >= 0);  | 
|                     m_TotalTargetValue.SetActive(!_hasData);  | 
|                     if (_hasData && _playerData.value > 0)  | 
|                     {  | 
|                         var _realmConfig = RealmConfig.Get(_playerData.value);  | 
|                         m_TargetImg.SetSprite(_realmConfig == null ? string.Empty : _realmConfig.Img);  | 
|                         m_TargetImg.SetNativeSize();  | 
|                     }  | 
|                     else  | 
|                     {  | 
|                         m_TotalTargetValue.text = Language.Get("OSCActivityNotOpen");  | 
|                     }  | 
|                     break;  | 
|                 default:  | 
|                     m_TargetImg.SetActive(false);  | 
|                     m_TotalTargetValue.SetActive(true);  | 
|                     m_TotalTargetValue.color = UIHelper.GetUIColor(TextColType.LightGreen);  | 
|                     m_TotalTargetValue.text = !_hasData ? "0" : _playerData.value.ToString();  | 
|                     break;  | 
|             }  | 
|         }  | 
|   | 
|         private void DisplayTargetDesc()  | 
|         {  | 
|             m_TotalTarget.text = Language.Get(StringUtility.Contact("OSTargetType_", model.GetRankType(model.presentSelectType)));  | 
|         }  | 
|   | 
|         private void UpdateGetPaths()  | 
|         {  | 
|             m_PromotePathCtrl.Refresh();  | 
|             if (model.billRankPromotePathDict.ContainsKey(model.presentSelectType))  | 
|             {  | 
|                 var _array = model.GetBillRankPromotePaths(model.presentSelectType);  | 
|                 var _line = Mathf.CeilToInt((float)_array.Count / 2);  | 
|                 for (int i = 0; i < _line; i++)  | 
|                 {  | 
|                     m_PromotePathCtrl.AddCell(ScrollerDataType.Header, i);  | 
|                 }  | 
|             }  | 
|             m_PromotePathCtrl.Restart();  | 
|         }  | 
|   | 
|         private void OnRefreshCell(ScrollerDataType type, CellView cell)  | 
|         {  | 
|             ImpactRankAwardCell _cell = cell as ImpactRankAwardCell;  | 
|             ImpactRankModel.RankAwardItem _award = model.GetBillAward(model.presentSelectType, _cell.index);  | 
|             var _itemList = _award.GetAwardItem(PlayerDatas.Instance.baseData.Job);  | 
|             var awardType = model.GetAwardType(model.presentSelectType, _cell.index);  | 
|             var _billRankCfg = awardType == ImpactRankModel.ImpactRankAwardType.Rank ? model.GetRankAwardConfig(model.presentSelectType, _cell.index) : null;  | 
|             var _billTagCfg = awardType == ImpactRankModel.ImpactRankAwardType.Target ? model.GetTagAwardConfig(model.presentSelectType, _cell.index) : null;  | 
|             for (int i = 0; i < _cell.items.Length; i++)  | 
|             {  | 
|                 _cell.items[i].SetActive(_itemList != null && i < _itemList.Count);  | 
|                 if (_itemList != null && i < _itemList.Count)  | 
|                 {  | 
|                     var _item = _itemList[i];  | 
|                     ItemCellModel _ItemData = new ItemCellModel(_item.id, true, (ulong)_item.count);  | 
|                     _cell.items[i].SetItemRare(_ItemData, 5);  | 
|                     _cell.items[i].button.RemoveAllListeners();  | 
|                     _cell.items[i].button.AddListener(() =>  | 
|                     {  | 
|                         ItemTipUtility.Show(_item.id);  | 
|                     });  | 
|                 }  | 
|             }  | 
|   | 
|             var _tip = string.Empty;  | 
|             _cell.objTop3.SetActive(false);  | 
|             _cell.objRankIndex.SetActive(false);  | 
|             _cell.objTarget.SetActive(false);  | 
|   | 
|             _cell.getBtn.SetActive(false);  | 
|             _cell.unCompleteImg.SetActive(false);  | 
|             _cell.hasGetImg.SetActive(false);  | 
|             _cell.effect.SetActive(false);  | 
|             //_cell.rankImg.SetActive(false);  | 
|             //_cell.countText.SetActive(false);  | 
|             //_cell.nameText.SetActive(false);  | 
|             _cell.nowText.SetActive(false);  | 
|             _cell.nameText.text = "-";  | 
|             _cell.countText.text = "-";  | 
|   | 
|             ImpactRankModel.OpenServerPlayerData _playerData;  | 
|             var _hasData = model.TryGetOpenServerPlayerData(model.presentSelectType, out _playerData);  | 
|   | 
|             if (awardType == ImpactRankModel.ImpactRankAwardType.Target)  | 
|             {  | 
|                 _cell.objTarget.SetActive(true);  | 
|                 _tip = Language.Get(StringUtility.Contact("ImpactRankCellType_Target_", model.presentSelectType),  | 
|                                     _billTagCfg.Condition);  | 
|                 _cell.rankTip.text = _tip;  | 
|                 if (!_hasData)  | 
|                 {  | 
|                     _cell.unCompleteImg.SetActive(true);  | 
|                 }  | 
|                 else  | 
|                 {  | 
|                     var _index = model.GetBillIndex(model.presentSelectType, _cell.index);  | 
|                     if (_playerData.IsTagGet(model.GetTagIndex(model.presentSelectType, _index)))  | 
|                     {  | 
|                         _cell.hasGetImg.SetActive(true);  | 
|                     }  | 
|                     else  | 
|                     {  | 
|                         var _complete = _playerData.value >= _billTagCfg.Condition;  | 
|                         _cell.unCompleteImg.SetActive(!_complete);  | 
|                         _cell.getBtn.SetActive(_complete);  | 
|                         _cell.effect.SetActive(_complete);  | 
|                     }  | 
|                 }  | 
|             }  | 
|             else if (awardType == ImpactRankModel.ImpactRankAwardType.Rank)  | 
|             {  | 
|   | 
|                 if (!model.IsActivityClose(model.presentSelectType))  | 
|                     _cell.nowText.SetActive(true);  | 
|   | 
|                 var _condition = model.impactRankTypeOpenDict[model.presentSelectType];  | 
|                 if (_billRankCfg.RankA == _billRankCfg.RankB)  | 
|                 {  | 
|                     _cell.objTop3.SetActive(true);  | 
|                     _cell.rankImg.SetSprite(_billRankCfg.RankA == 1 ? "Rank_First" : _billRankCfg.RankA == 2 ? "Rank_Second" : "Rank_Third");  | 
|   | 
|   | 
|                     var rankInfo = rankModel.GetRankPageDatas((int)model.presentBillRankType);  | 
|   | 
|                     //top3 名字和 数值  | 
|                     RankData data = null;  | 
|                     if (rankInfo != null)  | 
|                     {  | 
|                         if (rankInfo.ContainsKey(_billRankCfg.RankA - 1))  | 
|                         {  | 
|                             data = rankInfo[_billRankCfg.RankA - 1];  | 
|                         }  | 
|                         if (data != null)  | 
|                         {  | 
|                             _cell.nameText.text = data.name1;  | 
|                             var billName = Language.Get(StringUtility.Contact("ImpactRankType_", model.presentSelectType));  | 
|                             _cell.countText.text = billName.Substring(0, billName.Length / 2) + ":" + data.cmpValue.ToString();  | 
|                         }  | 
|   | 
|                     }  | 
|                 }  | 
|                 else  | 
|                 {  | 
|                     _cell.objRankIndex.SetActive(true);  | 
|                     _cell.rankIndexsText.text = _billRankCfg.RankA.ToString() + "-" + _billRankCfg.RankB.ToString();  | 
|   | 
|                     _cell.btnBill.onClick.RemoveAllListeners();  | 
|                     _cell.btnBill.onClick.AddListener(() =>  | 
|                     {  | 
|                         OnViewRank(_billRankCfg.RankA-1);  | 
|                     });  | 
|                 }  | 
|   | 
|             }  | 
|   | 
|   | 
|             _cell.getBtn.onClick.RemoveAllListeners();  | 
|             _cell.getBtn.onClick.AddListener(() =>  | 
|             {  | 
|                 if (awardType == ImpactRankModel.ImpactRankAwardType.Target)  | 
|                 {  | 
|                     OnGetClick(_billTagCfg, _cell.index);  | 
|                 }  | 
|                 else  | 
|                 {  | 
|                     OnGetClick(_billRankCfg, _cell.index);  | 
|                 }  | 
|             });  | 
|   | 
|         }  | 
|           | 
|         private void OnGetClick(OSCBillRankAwardConfig _cfg, int index)  | 
|         {  | 
|             var _index = model.GetBillIndex(model.presentSelectType, index);  | 
|             model.SendGetAward(model.presentSelectType, 1, _index);  | 
|         }  | 
|   | 
|         private void OnGetClick(OSCBillTagAwardConfig _cfg, int index)  | 
|         {  | 
|             var _index = model.GetBillIndex(model.presentSelectType, index);  | 
|             model.SendGetAward(model.presentSelectType, 2, model.GetTagIndex(model.presentSelectType, _index));  | 
|         }  | 
|   | 
|         private void OnViewRank()  | 
|         {  | 
|             if (model.IsLock(model.presentSelectType))  | 
|             {  | 
|                 SysNotifyMgr.Instance.ShowTip("FunctionNotOpen", Language.Get(StringUtility.Contact("ImpactRankType_", model.presentSelectType)));  | 
|                 return;  | 
|             }  | 
|             model.viewRankStartIndex = 0;  | 
|             WindowCenter.Instance.Open<ImpactBillRankWin>();  | 
|         }  | 
|         private void OnViewRank(int rank)  | 
|         {  | 
|             if (model.IsLock(model.presentSelectType))  | 
|             {  | 
|                 SysNotifyMgr.Instance.ShowTip("FunctionNotOpen", Language.Get(StringUtility.Contact("ImpactRankType_", model.presentSelectType)));  | 
|                 return;  | 
|             }  | 
|             model.viewRankStartIndex = rank;  | 
|             rankModel.QueryRankByPage((int)model.presentBillRankType, rank);  | 
|             WindowCenter.Instance.Open<ImpactBillRankWin>();  | 
|         }  | 
|         private void OnRuleBtn()  | 
|         {  | 
|             ModelCenter.Instance.GetModel<HowToPlayModel>().ruleId = GetRuleId();  | 
|             WindowCenter.Instance.Open<HowToPlayWin>();  | 
|         }  | 
|   | 
|         private int GetRuleId()  | 
|         {  | 
|             switch (model.presentSelectType)  | 
|             {  | 
|                 case 1:  | 
|                     return 13;  | 
|                 case 2:  | 
|                     return 14;  | 
|                 case 3:  | 
|                     return 15;  | 
|                 case 4:  | 
|                     return 16;  | 
|                 case 5:  | 
|                     return 17;  | 
|                 case 6:  | 
|                     return 18;  | 
|                 case 7:  | 
|                     return 31;  | 
|                 case 8:  | 
|                     return 38;  | 
|                 case 9:  | 
|                     return 39;  | 
|                 case 10:  | 
|                     return 40;  | 
|                 case 11:  | 
|                     return 57;  | 
|                 case 12:  | 
|                     return 49;  | 
|                 case 13:  | 
|                     return 58;  | 
|             }  | 
|             return 13;  | 
|         }  | 
|     }  | 
|   | 
| }  | 
|   | 
|   | 
|   | 
|   |