using System; using System.Collections; using System.Collections.Generic; using System.Linq; using UnityEngine; using UnityEngine.UI; namespace Snxxz.UI { public class AllianceBossBehaviour : MonoBehaviour { [SerializeField] Text m_BossName; [SerializeField] Text m_BossState; [SerializeField] RawImage m_RawBoss; [SerializeField] ItemCell[] m_Items; [SerializeField] Button m_Goto; [SerializeField] Text m_GotoLabel; int index = 0; int m_State = 0; int state { get { return m_State; } set { if (m_State != value) { m_State = value; DisplayState(); } } } float timer = 0f; AllianceBossModel model { get { return ModelCenter.Instance.GetModel(); } } DailyQuestModel dailyQuestModel { get { return ModelCenter.Instance.GetModel(); } } DungeonModel dungeonModel { get { return ModelCenter.Instance.GetModel(); } } public void Display(int index) { this.index = index; DisplayBase(); DisplayItems(); RefreshState(); DisplayState(); m_Goto.SetListener(Goto); model.allianceBossStateRefresh += AllianceBossStateRefresh; model.allianceBossLineRefresh += AllianceBossLineRefresh; WindowCenter.Instance.windowBeforeCloseEvent += WindowBeforeCloseEvent; } void DisplayBase() { var npcId = model.GetBossNpcId(index); var npcConfig = NPCConfig.Get(npcId); m_BossName.text = npcConfig.charName; DisplayBossModel(); } void DisplayItems() { List items; model.TryGetItems(index, out items); for (int i = 0; i < m_Items.Length; i++) { if (items != null && i < items.Count) { var item = items[i]; m_Items[i].gameObject.SetActive(true); var itemModel = new ItemCellModel(item.id, true, (ulong)item.count); m_Items[i].Init(itemModel); m_Items[i].button.SetListener(() => { var itemData = new ItemAttrData(item.id, true, (ulong)item.count); ModelCenter.Instance.GetModel().SetItemTipsModel(itemData); }); } else { m_Items[i].gameObject.SetActive(false); } } } void RefreshState() { DailyQuestOpenTime dailyQuestOpenTime; if (dailyQuestModel.TryGetOpenTime((int)DailyQuestType.AllianceBoss, out dailyQuestOpenTime)) { if (!dailyQuestOpenTime.InOpenTime()) { state = 0; return; } else { var hourMinutes = dailyQuestOpenTime.NormalOpenTimes.Values.First(); if (index < hourMinutes.Count) { if (!hourMinutes[index].InOpenTime()) { state = 0; return; } if (model.isActivityOver) { state = 2; } else { state = 1; } } } } } void DisplayBossModel() { m_RawBoss.gameObject.SetActive(true); var npcId = model.GetBossNpcId(index); var npcConifg = NPCConfig.Get(npcId); if (index == 0) { UI3DModelExhibition.Instance.ShowNPC(npcId, npcConifg.UIModeLOffset, npcConifg.UIModelRotation, m_RawBoss); } else { UI3DModelExhibition.InstanceClone1.ShowNPC(npcId, npcConifg.UIModeLOffset, npcConifg.UIModelRotation, m_RawBoss); } } void DisplayState() { m_Goto.SetInteractable(m_GotoLabel, state != 0); switch (state) { case 0: DailyQuestOpenTime dailyQuestOpenTime; if (dailyQuestModel.TryGetOpenTime((int)DailyQuestType.AllianceBoss, out dailyQuestOpenTime)) { var hourMinutes = dailyQuestOpenTime.NormalOpenTimes.Values.First(); if (index < hourMinutes.Count) { var timeLabel = UIHelper.AppendColor(TextColType.Red, hourMinutes[index].ToOpenTime()); m_BossState.text = StringUtility.Contact(Language.Get("ActivityTime"), timeLabel); } } m_BossState.color = UIHelper.GetUIColor(TextColType.White); break; case 1: DisplayNpcHp(); m_BossState.color = UIHelper.GetUIColor(TextColType.White); break; case 2: m_BossState.text = Language.Get("AllianceBoss_1"); m_BossState.color = UIHelper.GetUIColor(TextColType.Red); break; } } void DisplayNpcHp() { if (state != 1) { return; } AllianceBossModel.AllianceBossLine bossLine; var hp = 100; if (model.TryGetBossLine(index, out bossLine)) { hp = bossLine.hp; } m_BossState.text = Language.Get("RidingPetBossRemainHP", hp); } private void LateUpdate() { timer += Time.deltaTime; if (timer >= 1f) { timer = 0f; RefreshState(); } } private void Goto() { var error = 0; if (TestEnterAllianceBoss(out error)) { dungeonModel.SingleChallenge(AllianceBossModel.DATAMAPID, index); } else { DisplayErrorTip(error); } } bool TestEnterAllianceBoss(out int error) { error = 0; var dungeonId = dungeonModel.GetDungeonId(AllianceBossModel.DATAMAPID, index); var dungeonConfig = DungeonConfig.Get(dungeonId); if (dungeonConfig != null) { var playerLevel = PlayerDatas.Instance.baseData.LV; if (playerLevel < dungeonConfig.LVLimitMin) { error = 1; return false; } } if (CrossServerUtility.IsCrossServerBoss()) { error = 3; return false; } if (model.isActivityOver) { error = 4; return false; } var dailyQuestState = dailyQuestModel.GetQuestState((int)DailyQuestType.AllianceBoss); if (dailyQuestState != DailyQuestModel.DailyQuestState.Normal) { error = 5; return false; } return true; } void DisplayErrorTip(int error) { switch (error) { case 1: SysNotifyMgr.Instance.ShowTip("DemonJar_Text2"); break; case 2: SysNotifyMgr.Instance.ShowTip("GeRen_chenxin_268121", AllianceBossModel.DATAMAPID); break; case 3: SysNotifyMgr.Instance.ShowTip("CrossMap10"); break; case 4: SysNotifyMgr.Instance.ShowTip("AllianceBossDead"); break; case 5: SysNotifyMgr.Instance.ShowTip("Join_Space_Lost"); break; } } private void AllianceBossStateRefresh() { RefreshState(); } private void AllianceBossLineRefresh() { if (state == 1) { DisplayNpcHp(); } } private void WindowBeforeCloseEvent(Window window) { if (window is PetMatInfoWin) { DisplayBossModel(); } } public void Dispose() { model.allianceBossStateRefresh -= AllianceBossStateRefresh; model.allianceBossLineRefresh -= AllianceBossLineRefresh; WindowCenter.Instance.windowBeforeCloseEvent -= WindowBeforeCloseEvent; UI3DModelExhibition.Instance.StopShow(); UI3DModelExhibition.InstanceClone1.StopShow(); } } }