//-------------------------------------------------------- // [Author]: 第二世界 // [ Date ]: Thursday, January 17, 2019 //-------------------------------------------------------- using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; namespace Snxxz.UI { [XLua.Hotfix] public class JadeDynastyBossWin : Window { [SerializeField] CyclicScroll m_Bosses; [SerializeField] ItemCell[] m_Items; [SerializeField] Text m_ChallengeTimes; [SerializeField] Text m_AssistTimes; [SerializeField] Text m_JadeDynastyScore; [SerializeField] Button m_BuyTimes; [SerializeField] Transform m_SurpassLevel; [SerializeField] ToggleButton m_Subscribe; [SerializeField] Button m_Goto; [SerializeField] Button m_KillRecord; [SerializeField] Transform m_ContainerKillRecord; [SerializeField] Transform m_ContainerNoneRecord; [SerializeField] Transform m_ContainerExistRecord; [SerializeField] JadeDynastyBossKillRecord[] m_KillRecords; [SerializeField] Transform m_ContainerBelongTo; [SerializeField] Text m_BelongToPlayerName; [SerializeField] Text m_BelongToNonePlayer; JadeDynastyBossModel model { get { return ModelCenter.Instance.GetModel(); } } DungeonModel dungeonModel { get { return ModelCenter.Instance.GetModel(); } } FindPreciousModel findPreciousModel { get { return ModelCenter.Instance.GetModel(); } } MapModel mapModel { get { return ModelCenter.Instance.GetModel(); } } float refreshBossStateTime = 0f; DateTime lastRequestMapStateTime = DateTime.Now; #region Built-in protected override void BindController() { } protected override void AddListeners() { m_BuyTimes.AddListener(BuyTimes); m_Subscribe.AddListener(SwitchSubscribeBoss); m_Goto.AddListener(GotoKillBoss); m_KillRecord.AddListener(ShowSkillRecord); } protected override void OnPreOpen() { SetDefaultSelectBoss(); refreshBossStateTime = -1f; FindPreciousModel.BossInfo bossInfo; if (findPreciousModel.TryGetBossInfo(model.selectBossId, out bossInfo) && !bossInfo.IsBossAlive()) { if (TimeUtility.ServerNow <= bossInfo.refreshTime) { var seconds = (int)(bossInfo.refreshTime - TimeUtility.ServerNow).TotalSeconds + 1; refreshBossStateTime = Time.realtimeSinceStartup + seconds; } } lastRequestMapStateTime = DateTime.Now; mapModel.RequestQueryMapLineState(JadeDynastyBossModel.JADEDYNASTY_MAP); model.assginSelectBossId = 0; } protected override void OnActived() { base.OnActived(); Display(); } protected override void OnAfterOpen() { model.selectBossRefresh += SelectBossRefresh; dungeonModel.updateDungeonBuyCnt += ChallengeTimesRefresh; dungeonModel.dungeonRecordChangeEvent += ChallengeTimesRefresh; findPreciousModel.bossSubscribeChangeEvent += DisplaySubscribe; findPreciousModel.bossInfoUpdateEvent += BossInfoUpdateEvent; model.bossLineRefresh += BossLineRefresh; model.assistTimeRefresh += AssistTimeRefresh; model.jadeDynastyScoreRefresh += JadeDynastyScoreRefresh; } protected override void OnPreClose() { model.selectBossRefresh -= SelectBossRefresh; dungeonModel.updateDungeonBuyCnt -= ChallengeTimesRefresh; dungeonModel.dungeonRecordChangeEvent -= ChallengeTimesRefresh; findPreciousModel.bossSubscribeChangeEvent -= DisplaySubscribe; findPreciousModel.bossInfoUpdateEvent -= BossInfoUpdateEvent; model.bossLineRefresh -= BossLineRefresh; model.assistTimeRefresh -= AssistTimeRefresh; model.jadeDynastyScoreRefresh -= JadeDynastyScoreRefresh; refreshBossStateTime = -1f; } protected override void OnAfterClose() { } protected override void LateUpdate() { base.LateUpdate(); if (refreshBossStateTime > 0) { if (Time.realtimeSinceStartup > refreshBossStateTime) { DisplayKillRecord(); DisplayBelongTo(); refreshBossStateTime = -1f; } } if ((DateTime.Now - lastRequestMapStateTime).TotalSeconds >= 5f) { lastRequestMapStateTime = DateTime.Now; mapModel.RequestQueryMapLineState(JadeDynastyBossModel.JADEDYNASTY_MAP); } } #endregion public void SetDefaultSelectBoss() { if (model.assginSelectBossId != 0 && model.IsJadeDynastyBoss(model.assginSelectBossId)) { model.selectBossId = model.assginSelectBossId; } else { model.selectBossId = model.GetLatestUnLockBoss(); } } public void Display() { DisplayBosses(); DisplayChallengeTimes(); DisplayDropItems(); DisplaySubscribe(model.selectBossId); DisplayKillRecord(); DisplayBelongTo(); DisplayAssistTimes(); DisplayJadeDynastyScore(); } public void DisplayBosses() { var bosses = model.GetJadeDynastyBosses(); m_Bosses.Init(bosses); m_Bosses.MoveToCenter(bosses.IndexOf(model.selectBossId)); } public void DisplayChallengeTimes() { var totalTimes = dungeonModel.GetTotalTimes(JadeDynastyBossModel.JADEDYNASTY_MAP); var enterTimes = dungeonModel.GetEnterTimes(JadeDynastyBossModel.JADEDYNASTY_MAP); m_ChallengeTimes.text = StringUtility.Contact(totalTimes - enterTimes, "/", model.challengeLimitCount); } public void DisplayAssistTimes() { m_AssistTimes.text = model.assistTimes.ToString(); } void DisplayDropItems() { List dropItems = null; model.TryGetDropItems(model.selectBossId, out dropItems); for (int i = 0; i < m_Items.Length; i++) { m_Items[i].button.RemoveAllListeners(); if (dropItems != null && i < dropItems.Count) { m_Items[i].gameObject.SetActive(true); var item = dropItems[i]; ItemCellModel itemCellModel = new ItemCellModel(item.id, true, (ulong)item.count); m_Items[i].Init(itemCellModel); m_Items[i].button.AddListener(() => { ItemAttrData itemAttrData = new ItemAttrData(item.id, true, (ulong)item.count); ModelCenter.Instance.GetModel().SetItemTipsModel(itemAttrData); }); } else { m_Items[i].gameObject.SetActive(false); } } var npcDropConfig = NPCDropItemConfig.Get(model.selectBossId); var dropMaxLevel = 0; if (npcDropConfig != null) { dropMaxLevel = npcDropConfig.MaxLV; } m_SurpassLevel.gameObject.SetActive(dropMaxLevel != 0 && PlayerDatas.Instance.baseData.LV > dropMaxLevel); } private void DisplaySubscribe(int _bossId) { m_Subscribe.isOn = findPreciousModel.IsBossSubscribed(model.selectBossId); } private void DisplayKillRecord() { var alive = findPreciousModel.IsBossAlive(model.selectBossId); m_ContainerKillRecord.gameObject.SetActive(!alive); if (!alive) { var killRecords = findPreciousModel.GetBossKillRecords(model.selectBossId); if (killRecords != null) { killRecords.Sort(KillRecordSort); } m_ContainerExistRecord.gameObject.SetActive(killRecords != null && killRecords.Count > 0); m_ContainerNoneRecord.gameObject.SetActive(killRecords == null || killRecords.Count == 0); if (killRecords != null && killRecords.Count > 0) { for (int i = 0; i < m_KillRecords.Length; i++) { if (killRecords != null && i < killRecords.Count) { m_KillRecords[i].gameObject.SetActive(true); m_KillRecords[i].Display(killRecords[i].killTime, killRecords[i].playerName); } else { m_KillRecords[i].gameObject.SetActive(false); } } } } } private void DisplayBelongTo() { var alive = findPreciousModel.IsBossAlive(model.selectBossId); m_ContainerBelongTo.gameObject.SetActive(alive); if (alive) { var belongToPlayer = false; JadeDynastyBossLine jadeDynastyBossLine; if (model.TryGetBossLine(model.selectBossId, out jadeDynastyBossLine)) { if (!string.IsNullOrEmpty(jadeDynastyBossLine.belongToPlayerName)) { belongToPlayer = true; } } m_BelongToNonePlayer.gameObject.SetActive(!belongToPlayer); m_BelongToPlayerName.gameObject.SetActive(belongToPlayer); if (belongToPlayer) { m_BelongToPlayerName.text = jadeDynastyBossLine.belongToPlayerName; } } } private void DisplayJadeDynastyScore() { m_JadeDynastyScore.text = Language.Get("JadeDynastyBossWin_Score", UIHelper.ReplaceLargeNum(model.jadeDynastyScore)); } private void SelectBossRefresh(int bossId) { DisplayDropItems(); DisplaySubscribe(model.selectBossId); DisplayKillRecord(); DisplayBelongTo(); FindPreciousModel.BossInfo bossInfo; if (findPreciousModel.TryGetBossInfo(model.selectBossId, out bossInfo) && !bossInfo.IsBossAlive()) { if (TimeUtility.ServerNow <= bossInfo.refreshTime) { var seconds = (int)(bossInfo.refreshTime - TimeUtility.ServerNow).TotalSeconds + 1; refreshBossStateTime = Time.realtimeSinceStartup + seconds; } } } private void BossLineRefresh() { DisplayBelongTo(); } private void AssistTimeRefresh() { DisplayAssistTimes(); } private void ChallengeTimesRefresh() { DisplayChallengeTimes(); } private void ChallengeTimesRefresh(int mapId) { if (JadeDynastyBossModel.JADEDYNASTY_MAP != mapId) { return; } DisplayChallengeTimes(); } private void JadeDynastyScoreRefresh() { DisplayJadeDynastyScore(); } private void BuyTimes() { var totalTimes = dungeonModel.GetTotalTimes(JadeDynastyBossModel.JADEDYNASTY_MAP); var enterTimes = dungeonModel.GetEnterTimes(JadeDynastyBossModel.JADEDYNASTY_MAP); if ((totalTimes - enterTimes) >= model.challengeLimitCount) { ServerTipDetails.DisplayNormalTip(Language.Get("DemonJar18")); return; } var mapId = PlayerDatas.Instance.baseData.MapID; var dataMapId = dungeonModel.GetDataMapIdByMapId(mapId); if (dataMapId == JadeDynastyBossModel.JADEDYNASTY_MAP) { SysNotifyMgr.Instance.ShowTip("JadeDynastyBossBuyTimesError"); return; } else { dungeonModel.currentDungeon = new Dungeon(JadeDynastyBossModel.JADEDYNASTY_MAP, 0); WindowCenter.Instance.Open(); } } private void ShowSkillRecord() { findPreciousModel.ViewKillRecordsBoss = model.selectBossId; WindowCenter.Instance.Open(); } private void SwitchSubscribeBoss() { if (findPreciousModel.IsBossSubscribed(model.selectBossId)) { findPreciousModel.RequestDeSubscribeBoss(model.selectBossId); } else { findPreciousModel.RequestSubscribeBoss(model.selectBossId, false); } } private void BossInfoUpdateEvent(int bossId) { if (bossId == model.selectBossId) { DisplayKillRecord(); DisplayBelongTo(); } } private void GotoKillBoss() { var error = 0; if (model.TryEnterDungeon(model.selectBossId, out error)) { var config = JadeDynastyBossConfig.Get(model.selectBossId); dungeonModel.SingleChallenge(JadeDynastyBossModel.JADEDYNASTY_MAP, config.LineID); } else { model.DisplayErrorTip(error); } } private int KillRecordSort(FindPreciousModel.BossKillRecord lhs, FindPreciousModel.BossKillRecord rhs) { return -lhs.killTime.CompareTo(rhs.killTime); } } }