//-------------------------------------------------------- // [Author]: 第二世界 // [ Date ]: Tuesday, October 31, 2017 //-------------------------------------------------------- using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; namespace vnxbqy.UI { public class BossHomeWin : Window { [SerializeField] CyclicScroll m_Bosses; [SerializeField] Transform m_ContainerMonster; [SerializeField] Text m_MonsterLevel; [SerializeField] RawImage m_MonsterPortrait; [SerializeField] BossIntroduceBehaviour m_BossIntroduce; [SerializeField] BossHomeFloorGroup m_FloorGroup; [SerializeField] Text m_Vip; [SerializeField] Text m_VipLackTip; [SerializeField] Button m_Goto; [SerializeField] Button m_KillRecord; [SerializeField] Transform m_SurpassLevel; [SerializeField] RectTransform m_NoDamageTip; [SerializeField] ToggleButton m_Subscribe; [SerializeField] RectTransform m_WearyContainer; [SerializeField] TextEx m_WearyValue; BossHomeModel model { get { return ModelCenter.Instance.GetModel(); } } FindPreciousModel findPreciousModel { get { return ModelCenter.Instance.GetModel(); } } DungeonModel dungeonModel { get { return ModelCenter.Instance.GetModel(); } } VipModel vipModel { get { return ModelCenter.Instance.GetModel(); } } #region Built-in protected override void BindController() { } protected override void AddListeners() { m_Goto.AddListener(GotoKillBoss); m_KillRecord.AddListener(ShowKillRecords); m_Subscribe.AddListener(SwitchSubscribeBoss); } protected override void OnPreOpen() { model.selectedFloor = model.GetRecommendFloor(); m_FloorGroup.Init(); m_Vip.text = StringUtility.Contact("V", model.GetFloorVipRequirement(model.selectedFloor)); DisplayRemindTimes(); } protected override void OnAfterOpen() { model.bossSelectedEvent += OnBossSelected; model.bossHomeFloorSelectedEvent += OnFloorSelected; model.boughtTimeChangeEvent += DisplayRemindTimes; findPreciousModel.bossSubscribeChangeEvent += OnSubscribeBoss; } protected override void OnPreClose() { StopAllCoroutines(); m_FloorGroup.UnInit(); model.bossSelectedEvent -= OnBossSelected; model.bossHomeFloorSelectedEvent -= OnFloorSelected; model.boughtTimeChangeEvent -= DisplayRemindTimes; findPreciousModel.bossSubscribeChangeEvent -= OnSubscribeBoss; } protected override void OnAfterClose() { } protected override void OnActived() { base.OnActived(); OnFloorSelected(model.selectedFloor); } #endregion private void ShowBosses() { BossHomeData bossHomeData; if (model.TryGetBossHomeData(model.selectedFloor, out bossHomeData)) { var bosses = new List(); bosses.AddRange(bossHomeData.GetShowBosses()); model.selectedBoss = bossHomeData.GetRecommendNpc(); m_Bosses.Init(bosses); m_Bosses.MoveToCenter(bosses.IndexOf(model.selectedBoss)); var config = BossHomeConfig.Get(model.selectedBoss); var npcConfig = NPCConfig.Get(model.selectedBoss); switch (config.MonsterType) { case 1: m_KillRecord.SetActive(false); m_BossIntroduce.SetActive(false); m_ContainerMonster.SetActive(true); m_BossIntroduce.Dispose(); UI3DModelExhibition.Instance.ShowNPC(model.selectedBoss, npcConfig.UIModeLOffset, npcConfig.UIModelRotation, m_MonsterPortrait); m_MonsterLevel.text = Language.Get("Z1024", npcConfig.NPCLV); break; case 2: m_KillRecord.SetActive(true); m_BossIntroduce.SetActive(true); m_BossIntroduce.Display(model.selectedBoss, true); m_ContainerMonster.SetActive(false); m_Subscribe.isOn = findPreciousModel.IsBossSubscribed(model.selectedBoss); break; } DisplayTip(model.selectedBoss); DisplayGotoKillButton(model.selectedBoss); DisplaySubscribe(model.selectedBoss); } } private void ShowKillRecords() { findPreciousModel.ViewKillRecordsBoss = model.selectedBoss; WindowCenter.Instance.Open(); } private void SwitchSubscribeBoss() { if (findPreciousModel.IsBossSubscribed(model.selectedBoss)) { findPreciousModel.RequestDeSubscribeBoss(model.selectedBoss); } else { findPreciousModel.RequestSubscribeBoss(model.selectedBoss, false); } } //进入boss之家之前需要VIP,现通过VIP全配权限控制实现不提示需要vip进入地图的逻辑 //boss之家也从副本改成普通地图,部分逻辑依然保留,代码会比较混乱,需小心修改 private void GotoKillBoss() { var config = BossHomeConfig.Get(model.selectedBoss); if (config.MonsterType == 2 && !findPreciousModel.IsBossUnlock(model.selectedBoss)) { SysNotifyMgr.Instance.ShowTip("BossRealmHint2", RealmConfig.Get(NPCConfig.Get(model.selectedBoss).Realm).LvLarge); return; } var dataMapId = dungeonModel.GetDataMapIdByMapId(PlayerDatas.Instance.baseData.MapID); if (dataMapId != BossHomeModel.BOSSHOME_MAPID) { EnterBossHome(); return; } if (PlayerDatas.Instance.baseData.dungeonLineId + 1 == config.FloorNum) { WindowCenter.Instance.Close(); MapTransferUtility.Instance.MoveToNPC(model.selectedBoss); return; } var vipLevel = PlayerDatas.Instance.baseData.VIPLv; var vipNeed = model.GetFloorVipRequirement(PlayerDatas.Instance.baseData.dungeonLineId + 1); if (vipLevel >= vipNeed) { EnterBossHome(); return; } var moneyNeed = model.GetVipLackCost(PlayerDatas.Instance.baseData.dungeonLineId + 1); var dungeonId = dungeonModel.GetDungeonId(BossHomeModel.BOSSHOME_MAPID, PlayerDatas.Instance.baseData.dungeonLineId); var dungeonConfig = DungeonConfig.Get(dungeonId); ConfirmCancel.ShowPopConfirm( Language.Get("Mail101"), Language.Get("QuitRemindBossHome", dungeonConfig.FBName, vipNeed, moneyNeed), (bool _ok) => { if (_ok) { EnterBossHome(); } } ); } private void OnSubscribeBoss(int _bossId) { m_Subscribe.isOn = findPreciousModel.IsBossSubscribed(model.selectedBoss); } private void OnBossSelected(int bossId) { StopCoroutine("Co_DelayDisplayNpcBaseInfo"); StartCoroutine("Co_DelayDisplayNpcBaseInfo"); } IEnumerator Co_DelayDisplayNpcBaseInfo() { yield return WaitingForSecondConst.WaitMS300; var bossId = model.selectedBoss; var config = BossHomeConfig.Get(bossId); DisplayTip(model.selectedBoss); DisplayGotoKillButton(model.selectedBoss); DisplaySubscribe(model.selectedBoss); switch (config.MonsterType) { case 1: m_KillRecord.SetActive(false); m_BossIntroduce.SetActive(false); m_ContainerMonster.SetActive(true); m_BossIntroduce.Dispose(); var npcConfig = NPCConfig.Get(bossId); UI3DModelExhibition.Instance.ShowNPC(bossId, npcConfig.UIModeLOffset, npcConfig.UIModelRotation, m_MonsterPortrait); m_MonsterLevel.text = Language.Get("Z1024", npcConfig.NPCLV); break; case 2: if (!m_BossIntroduce.gameObject.activeInHierarchy) { m_BossIntroduce.SetActive(true); } m_BossIntroduce.Display(bossId, true); m_KillRecord.SetActive(true); m_ContainerMonster.SetActive(false); m_Subscribe.isOn = findPreciousModel.IsBossSubscribed(bossId); break; } } private void OnFloorSelected(int _floor) { ShowBosses(); var vipNeedFloor1 = model.GetFloorVipRequirement(1); var vipNeed = model.GetFloorVipRequirement(model.selectedFloor); m_Vip.text = StringUtility.Contact("V", vipNeed); if (PlayerDatas.Instance.baseData.VIPLv < vipNeedFloor1) { m_VipLackTip.SetActive(true); m_VipLackTip.text = Language.Get("BossHome_VipNoMeet"); } else { if (_floor != 1) { if (vipNeed > PlayerDatas.Instance.baseData.VIPLv) { m_VipLackTip.SetActive(true); var moneyNeed = model.GetVipLackCost(model.selectedFloor); m_VipLackTip.text = Language.Get("FightTreasure_BossHome", moneyNeed); } else { m_VipLackTip.SetActive(false); } } else { m_VipLackTip.SetActive(false); } } } private void EnterBossHome() { var error = 0; if (TestEnterDungeon(out error)) { //dungeonModel.SingleChallenge(BossHomeModel.BOSSHOME_MAPID, model.selectedFloor - 1); WindowCenter.Instance.Close(); MapTransferUtility.Instance.MoveToNPC(model.selectedBoss); } else { ProcessEnterDungeonError(error); } } private bool TestEnterDungeon(out int _error) { var vipLevel = PlayerDatas.Instance.baseData.VIPLv; if (vipLevel < model.GetFloorVipRequirement(1)) { _error = 1; return false; } var vipNeed = model.GetFloorVipRequirement(model.selectedFloor); if (vipLevel < vipNeed) { _error = 2; return false; } var mapConfig = MapConfig.Get(PlayerDatas.Instance.baseData.MapID); if (mapConfig.MapFBType != (int)MapType.OpenCountry) { _error = 4; return false; } _error = 0; return true; } private void ProcessEnterDungeonError(int _error) { switch (_error) { case 1: WindowCenter.Instance.Open(); break; case 2: var moneyNeed = model.GetVipLackCost(model.selectedFloor); var title = Language.Get("Mail101"); var tip = Language.Get("FightTreasure_BossHome", moneyNeed); ConfirmCancel.ShowPopConfirm( title, tip, (bool _ok) => { if (_ok) { var moneyOwn = PlayerDatas.Instance.baseData.diamond; if (moneyOwn < moneyNeed) { if (VersionConfig.Get().isBanShu) { SysNotifyMgr.Instance.ShowTip("GoldErr"); return; } WindowCenter.Instance.Open(); } else { var dungeonModel = ModelCenter.Instance.GetModel(); dungeonModel.SingleChallenge(BossHomeModel.BOSSHOME_MAPID, model.selectedFloor - 1); } } } ); break; case 3: WindowCenter.Instance.Close(); MapTransferUtility.Instance.MoveToNPC(model.selectedBoss); break; case 4: SysNotifyMgr.Instance.ShowTip("DungeonNoGO"); break; } } private void DisplayTip(int bossId) { if (!findPreciousModel.IsBossUnlock(bossId)) { m_NoDamageTip.SetActive(true); m_SurpassLevel.SetActive(false); } else { m_NoDamageTip.SetActive(false); var dropConfig = NPCDropItemConfig.Get(bossId); var noDrop = dropConfig == null || (dropConfig.MaxLV != 0 && PlayerDatas.Instance.baseData.LV > dropConfig.MaxLV); m_SurpassLevel.SetActive(noDrop); } } private void DisplayRemindTimes() { var wearyValueLimit = vipModel.GetVipPrivilegeCnt(VipPrivilegeType.BossHomeAwardLimit); m_WearyContainer.SetActive(wearyValueLimit > 0); if (wearyValueLimit > 0) { var countInfo = string.Format("{0}/{1}", model.remindTimes, wearyValueLimit); m_WearyValue.text = countInfo; m_WearyValue.colorType = model.remindTimes <= 0 ? TextColType.Red : TextColType.DarkGreen; } } private void DisplayGotoKillButton(int bossId) { } private void DisplaySubscribe(int bossId) { var isUnLocked = findPreciousModel.IsBossUnlock(bossId); m_Subscribe.SetActive(isUnLocked); if (isUnLocked) { m_Subscribe.isOn = findPreciousModel.IsBossSubscribed(bossId); } } } }