//-------------------------------------------------------- // [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_FairyRank; [SerializeField] Text m_FairyPercent; [SerializeField] Text m_Progress; [SerializeField] Text m_SurplusTime; float m_Timer = 0f; const float Interval = 10f; float m_DieTimer = 0f; const float DieCloseDuration = 15f; int bossId = 0; uint objId = 0; ulong currentHp = 0; ulong totalHp = 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; m_DieTimer = 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; currentHp = bossActor.ActorInfo.RealHp; totalHp = bossActor.ActorInfo.RealMaxHp; break; } } } if (bossId != 0) { model.QueryGrabBossHurt(bossId, 0, objId); GlobalTimeEvent.Instance.secondEvent += SecondEvent; model.bossHurtUpdate += BossHurtUpdate; GA_NpcFightBoss.s_HpRefresh += HpRefresh; DisplayAreaInfo(); DisplayTimer(); DisplayProgress(); DisplayRanks(); } } protected override void OnAfterOpen() { if (bossId == 0) { CloseImmediately(); model.RecheckGrabBoss(); } } protected override void OnPreClose() { GlobalTimeEvent.Instance.secondEvent -= SecondEvent; model.bossHurtUpdate -= BossHurtUpdate; GA_NpcFightBoss.s_HpRefresh -= HpRefresh; } protected override void OnAfterClose() { } protected override void LateUpdate() { base.LateUpdate(); if (CheckBossDie()) { m_DieTimer += Time.deltaTime; if (m_DieTimer >= DieCloseDuration) { CloseImmediately(); model.RecheckGrabBoss(); return; } } m_Timer += Time.deltaTime; if (m_Timer >= Interval && bossId != 0) { m_Timer = 0f; if (CheckBossDie()) { return; } model.QueryGrabBossHurt(bossId, 0, objId); } } #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() { var progress = 1 - (float)currentHp / totalHp; m_Progress.text = StringUtility.Contact((int)(progress * 100), "%"); bool killed = progress >= 1; m_ContainerKilling.gameObject.SetActive(!killed); m_ContainerKilled.gameObject.SetActive(killed); } void DisplayRanks() { FairyGrabBossModel.FairyGrabBossInfo fairyGrabBossInfo; var index = 0; if (model.TryGetBossHurt(bossId, 0, out fairyGrabBossInfo)) { 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 / totalHp) * 100); m_RankBehaviours[i].Display(hurtInfo.HurtName, percent); index++; } } DisplayFairyHurt(fairyGrabBossInfo.hurtInfos); } else { DisplayFairyHurt(null); } if (currentHp <= 0) { return; } for (int i = index; i < m_RankBehaviours.Length; i++) { m_RankBehaviours[i].Display(string.Empty, 0); } } void DisplayFairyHurt(List list) { var rank = 0; var percent = 0; if (list != null) { for (int i = 0; i < list.Count; i++) { if (list[i].FamilyID == PlayerDatas.Instance.baseData.Family) { rank = i + 1; percent = (int)(((float)list[i].totalHurt / totalHp) * 100); break; } } } m_FairyRank.text = rank == 0 ? Language.Get("Market_Text_33") : Language.Get("GuardSkyRank", rank); m_FairyPercent.text = StringUtility.Contact(percent, "%"); } 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 BossHurtUpdate(int id, int type) { if (id == bossId && type == 0) { DisplayRanks(); } } private void HpRefresh(uint arg0, int npcId, ulong hp, ulong _totalHp) { if (npcId == bossId) { currentHp = hp; totalHp = _totalHp; DisplayProgress(); if (currentHp > 0) { m_DieTimer = 0f; } } } bool CheckBossDie() { bool hasBoss = false; var list = GAMgr.Instance.GetTypeList(E_ActorClassType.NpcFightBoss); 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)) { hasBoss = true; break; } } } if (!hasBoss) { currentHp = 0; } if (currentHp == 0 && !m_ContainerKilled.gameObject.activeSelf) { DisplayProgress(); } return bossId == 0 || currentHp <= 0; } private void SecondEvent() { DisplayTimer(); } } }