//-------------------------------------------------------- // [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()); } } RankModel m_RankModel; RankModel rankModel { get { return m_RankModel ?? (m_RankModel = ModelCenter.Instance.GetModel()); } } private int m_LastSecond = -1; private List m_ActivityCloseList = new List(); private Dictionary m_ActivityCloseTimeDict = new Dictionary(); #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(); } 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(); } private void OnRuleBtn() { ModelCenter.Instance.GetModel().ruleId = GetRuleId(); WindowCenter.Instance.Open(); } 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; } } }