//--------------------------------------------------------
|
// [Author]: 第二世界
|
// [ Date ]: Tuesday, August 28, 2018
|
//--------------------------------------------------------
|
|
using System;
|
using System.Collections;
|
using System.Collections.Generic;
|
|
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<FairyGrabBossModel>(); } }
|
#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 = MapConfig.Get(mapId);
|
m_MapName.text = mapConfig.Name;
|
var npcConfig = NPCConfig.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<FairyGrabBossModel.BossHurtInfo> 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.FamilyId)
|
{
|
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();
|
}
|
|
}
|
|
}
|
|
|
|
|