//-------------------------------------------------------- // [Author]: 第二世界 // [ Date ]: Tuesday, August 28, 2018 //-------------------------------------------------------- using System; using System.Collections; using System.Collections.Generic; using TableConfig; using UnityEngine; using UnityEngine.UI; namespace Snxxz.UI { public class FairyGrabBossHintWin : Window { [SerializeField] Text m_MapName; [SerializeField] Text m_BossName; [SerializeField] RectTransform m_ContainerKilling; [SerializeField] RectTransform m_ContainerKilled; [SerializeField] FairyGrabBossRankBehaviour[] m_RankBehaviours; [SerializeField] Text m_Progress; [SerializeField] Text m_SurplusTime; float m_Timer = 0f; const float Interval = 10f; int bossId = 0; uint objId = 0; FairyGrabBossModel model { get { return ModelCenter.Instance.GetModel(); } } #region Built-in protected override void BindController() { } protected override void AddListeners() { } protected override void OnPreOpen() { m_Timer = 0f; var list = GAMgr.Instance.GetTypeList(E_ActorClassType.NpcFightBoss); bossId = 0; if (list != null) { for (int i = 0; i < list.Count; i++) { GA_NpcFightBoss bossActor = list[i] as GA_NpcFightBoss; if (bossActor != null && model.bosses.Contains(bossActor.NpcConfig.NPCID)) { bossId = bossActor.NpcConfig.NPCID; objId = bossActor.ServerInstID; break; } } } if (bossId != 0) { model.QueryGrabBossHurt(bossId, 0, objId); model.QueryGrabBossProgress(true); GlobalTimeEvent.Instance.secondEvent += SecondEvent; model.bossProgressUpdate += BossProgressUpdate; model.bossHurtUpdate += BossHurtUpdate; DisplayAreaInfo(); DisplayTimer(); DisplayProgress(); DisplayRanks(); } } protected override void OnAfterOpen() { if (bossId == 0) { CloseImmediately(); model.RecheckGrabBoss(); } } protected override void OnPreClose() { GlobalTimeEvent.Instance.secondEvent -= SecondEvent; model.bossProgressUpdate -= BossProgressUpdate; model.bossHurtUpdate -= BossHurtUpdate; } protected override void OnAfterClose() { } protected override void LateUpdate() { base.LateUpdate(); m_Timer += Time.deltaTime; if (m_Timer >= Interval && bossId != 0) { m_Timer = 0f; model.QueryGrabBossHurt(bossId, 0, objId); model.QueryGrabBossProgress(); } } #endregion private void DisplayAreaInfo() { var mapId = PlayerDatas.Instance.baseData.MapID; var mapConfig = Config.Instance.Get(mapId); m_MapName.text = mapConfig.Name; var npcConfig = Config.Instance.Get(bossId); if (npcConfig != null) { m_BossName.text = npcConfig.charName; } } void DisplayProgress() { FairyGrabBossModel.BossProgressInfo bossProgress; bool killed = false; if (model.TryGetBossProgress(bossId, out bossProgress)) { var progress = 1 - (float)bossProgress.currentHp / bossProgress.totalHp; m_Progress.text = StringUtility.Contact((int)(progress * 100), "%"); killed = progress >= 1; } m_ContainerKilling.gameObject.SetActive(!killed); m_ContainerKilled.gameObject.SetActive(killed); } void DisplayRanks() { FairyGrabBossModel.FairyGrabBossInfo fairyGrabBossInfo; FairyGrabBossModel.BossProgressInfo bossProgress; var index = 0; if (model.TryGetBossHurt(bossId, 0, out fairyGrabBossInfo) && model.TryGetBossProgress(bossId, out bossProgress)) { for (int i = 0; i < m_RankBehaviours.Length; i++) { if (i < fairyGrabBossInfo.hurtInfos.Count) { var hurtInfo = fairyGrabBossInfo.hurtInfos[i]; var percent = (int)(((float)hurtInfo.totalHurt / bossProgress.totalHp) * 100); m_RankBehaviours[i].Display(hurtInfo.HurtName, percent); index++; } } } for (int i = index; i < m_RankBehaviours.Length; i++) { m_RankBehaviours[i].Display(string.Empty, 0); } } private void DisplayTimer() { var seconds = model.surplusSeconds; if (seconds > 0) { m_SurplusTime.text = TimeUtility.SecondsToDHMSCHS(seconds); } else { m_SurplusTime.text = Language.Get("ActivityEnd"); } } private void BossProgressUpdate(int _id) { if (_id == bossId) { DisplayProgress(); DisplayRanks(); } } private void BossHurtUpdate(int id, int type) { if (id == bossId && type == 0) { DisplayRanks(); } } private void SecondEvent() { DisplayTimer(); } } }