using System;
|
using System.Collections.Generic;
|
using Cysharp.Threading.Tasks;
|
using LitJson;
|
using UnityEngine;
|
using UnityEngine.UI;
|
|
public class TianziBillboradBattleWin : BaseBattleWin
|
{
|
[SerializeField] Transform transButtons;
|
[SerializeField] public TianziDamageBar tianziDamageBar;
|
[SerializeField] public SkillWordCell[] skillWordCells;
|
[SerializeField] public BossHeadCell bossHeadCell;
|
[SerializeField] public Text txtBossName;
|
[SerializeField] HeroCountryComponent myCountry;
|
[SerializeField] HeroCountryComponent enemyCountry;
|
private BattleObject bossBattleObject = null;
|
[SerializeField] public List<BattleBuffCell> buffCells;
|
[SerializeField] RectTransform rectBoxEnd;
|
[SerializeField] UIEffectPlayer uiEffectPlayer;
|
|
public static Action<ulong> TianziDamageBarEndDataAction;
|
|
protected override void OnPreOpen()
|
{
|
base.OnPreOpen();
|
tianziDamageBar.StageUp += OnStageUp;
|
tianziDamageBar.ValueChangeAction += OnValueChangeAction;
|
tianziDamageBar.ChangeEndAction += OnChangeEndAction;
|
//tianziDamageBar.IsLastHitUnLockEvent += OnIsLastHitUnLockEvent;
|
TianziDamageBarEndDataAction += OnTianziDamageBarEndData;
|
MainWin.TabChangeEvent += OnTabChangeEvent;
|
EventBroadcast.Instance.AddListener<string, JsonData>(EventName.BATTLE_END, OnSettlement);
|
EventBroadcast.Instance.AddListener<HB419_tagSCObjHPRefresh>(EventName.BATTLE_TIANZI_REFRESH_HP, OnUpdateHpNum);
|
bool isOpenBattleChangeTab = IsOpenBattleChangeTab();
|
transButtons.localPosition = new Vector3(0, isOpenBattleChangeTab ? 130 : 0, 0);
|
if (isOpenBattleChangeTab)
|
{
|
UIManager.Instance.GetUI<MainWin>()?.CloseSubUI();
|
}
|
else
|
{
|
UIManager.Instance.CloseWindow<MainWin>();
|
}
|
}
|
|
protected override void OnPreClose()
|
{
|
base.OnPreClose();
|
tianziDamageBar.StageUp -= OnStageUp;
|
tianziDamageBar.ValueChangeAction -= OnValueChangeAction;
|
tianziDamageBar.ChangeEndAction += OnChangeEndAction;
|
//tianziDamageBar.IsLastHitUnLockEvent += OnIsLastHitUnLockEvent;
|
TianziDamageBarEndDataAction -= OnTianziDamageBarEndData;
|
MainWin.TabChangeEvent -= OnTabChangeEvent;
|
EventBroadcast.Instance.RemoveListener<string, JsonData>(EventName.BATTLE_END, OnSettlement);
|
EventBroadcast.Instance.RemoveListener<HB419_tagSCObjHPRefresh>(EventName.BATTLE_TIANZI_REFRESH_HP, OnUpdateHpNum);
|
bool isOpenBattleChangeTab = IsOpenBattleChangeTab();
|
if (isOpenBattleChangeTab)
|
{
|
UIManager.Instance.GetUI<MainWin>()?.RestoreSubUI();
|
}
|
else
|
{
|
UIManager.Instance.OpenWindow<MainWin>();
|
}
|
|
if (bossBattleObject != null)
|
{
|
if (bossBattleObject.buffMgr != null)
|
{
|
bossBattleObject.buffMgr.onBuffChanged -= OnBuffChanged;
|
}
|
bossBattleObject = null;
|
}
|
|
}
|
|
|
|
private void OnTianziDamageBarEndData(ulong obj)
|
{
|
tianziDamageBar.Show(obj);
|
}
|
|
private void OnStageUp(int stage)
|
{
|
GameObject hero = bossBattleObject.heroGo;
|
if (hero == null || stage <= 1)
|
return;
|
uiEffectPlayer.Play();
|
|
GameObject prefab = UIUtility.CreateWidget("TianziBillboradBox", "TianziBillboradBox");
|
prefab.transform.SetParentEx(hero.transform, Vector3.zero, Quaternion.identity, Vector3.one);
|
TianziBillboradBox boxAnimator = prefab.GetComponent<TianziBillboradBox>();
|
if (boxAnimator != null)
|
{
|
Vector3 startPos = hero.transform.position;
|
Vector3 endPos = rectBoxEnd.position;
|
boxAnimator.StartAnimation(startPos, endPos);
|
}
|
else
|
{
|
Destroy(prefab);
|
}
|
}
|
|
private void OnTabChangeEvent()
|
{
|
CloseWindow();
|
}
|
|
protected override void OnCreateBattleField(string guid, BattleField field)
|
{
|
if (field is TianziBillboradBattleField)
|
{
|
SetBattleField(field);
|
}
|
}
|
|
protected override void RefreshSpecific()
|
{
|
DestroyExistingTianziBillboradBoxes();
|
TianziBillboradBattleField boneField = battleField as TianziBillboradBattleField;
|
if (boneField == null) return;
|
|
NPCLineupConfig lineupConfig = boneField.GetBossLineupConfig();
|
|
if (bossBattleObject != null)
|
{
|
if (bossBattleObject.buffMgr != null)
|
{
|
bossBattleObject.buffMgr.onBuffChanged -= OnBuffChanged;
|
}
|
bossBattleObject = null;
|
}
|
|
bossBattleObject = boneField.FindBoss();
|
|
DisplaySkillWordsList(lineupConfig);
|
|
hpB419 = 0;
|
maxHpB419 = 0;
|
tianziDamageBar.Init();
|
|
if (null != bossBattleObject)
|
{
|
TeamHero teamHero = bossBattleObject.teamHero;
|
bossHeadCell.SetTeamHero(teamHero);
|
txtBossName.text = teamHero.name;
|
NPCConfig npcConfig = NPCConfig.Get(teamHero.NPCID);
|
bossBattleObject.buffMgr.onBuffChanged -= OnBuffChanged;
|
bossBattleObject.buffMgr.onBuffChanged += OnBuffChanged;
|
}
|
else
|
{
|
bossHeadCell.SetTeamHero(null);
|
txtBossName.text = string.Empty;
|
Debug.LogError("找不到boss");
|
}
|
|
OnRoundChange(battleField.round, battleField.turnMax); // 确保回合显示被调用
|
OnBuffChanged();
|
|
// 获取我方(红方)队伍数据
|
List<BattleObject> myTeam = battleField.battleObjMgr.GetBattleObjList(BattleCamp.Red);
|
// 获取敌方(蓝方)队伍数据
|
List<BattleObject> enemyTeam = battleField.battleObjMgr.GetBattleObjList(BattleCamp.Blue);
|
|
myCountry.RefreshOnTeamCountry(GetTeamHeroList(myTeam), true);
|
enemyCountry.RefreshOnTeamCountry(GetTeamHeroList(enemyTeam), true);
|
}
|
|
private void DestroyExistingTianziBillboradBoxes()
|
{
|
// 查找场景中所有存在的TianziBillboradBox实例
|
TianziBillboradBox[] existingBoxes = FindObjectsOfType<TianziBillboradBox>();
|
foreach (TianziBillboradBox box in existingBoxes)
|
{
|
if (box != null && box.gameObject != null)
|
{
|
Destroy(box.gameObject);
|
}
|
}
|
}
|
|
private void OnBuffChanged()
|
{
|
var buffList = new List<HB428_tagSCBuffRefresh>();
|
if (null != bossBattleObject)
|
{
|
buffList = bossBattleObject.buffMgr.GetBuffList();
|
}
|
RefreshBuff(buffList);
|
}
|
|
private void OnSettlement(string _guid, JsonData data)
|
{
|
if (string.Empty == _guid)
|
return;
|
var battle = BattleManager.Instance.GetBattleField(_guid);
|
if (battle == null)
|
return;
|
var battleName = battle.ToString();
|
if (battleName != "TianziBillboradBattleField")
|
return;
|
|
if (data != null && data.ContainsKey("totalHurt"))
|
{
|
ulong totalHurt = ulong.Parse(data["totalHurt"].ToString());
|
tianziDamageBar.Show(totalHurt);
|
}
|
}
|
|
private void OnIsLastHitUnLockEvent()
|
{
|
if (bossBattleObject == null)
|
return;
|
|
bossBattleObject.teamHero.curHp = (long)hpB419;
|
bossBattleObject.teamHero.maxHp = (long)maxHpB419;
|
Debug.Log($"TianziDamageBar OnIsLastHitUnLockEvent hpB419 {hpB419} maxHpB419 {maxHpB419}");
|
}
|
|
ulong hpB419;
|
ulong maxHpB419;
|
private void OnUpdateHpNum(HB419_tagSCObjHPRefresh info)
|
{
|
if (bossBattleObject == null || info.ObjID != bossBattleObject.ObjID)
|
return;
|
ulong curHp = (ulong)GeneralDefine.GetFactValue(info.HP, info.HPEx);
|
ulong maxHp = (ulong)GeneralDefine.GetFactValue(info.MaxHP, info.MaxHPEx);
|
hpB419 = curHp;
|
maxHpB419 = maxHp;
|
//tianziDamageBar.ShowByB419(curHp, maxHp);
|
}
|
|
protected override void OnDamageTaken(BattleDmgInfo info)
|
{
|
base.OnDamageTaken(info);
|
|
if (battleField == null || info.battleFieldGuid != battleField.guid)
|
return;
|
|
if (bossBattleObject != null && info.hurtObj.ObjID == bossBattleObject.ObjID)
|
{
|
|
TeamHero teamHero = bossBattleObject.teamHero;
|
tianziDamageBar.Show(info);
|
//tianziDamageBar.Show((ulong)teamHero.curHp, (ulong)teamHero.maxHp, info);
|
}
|
|
}
|
|
private void OnValueChangeAction(float nowValue, int CurrentStage)
|
{
|
if (bossBattleObject == null || bossBattleObject.heroInfoBar == null)
|
return;
|
bossBattleObject.heroInfoBar.UpdateHP(nowValue);
|
//Debug.Log($"TianziDamageBar nowValue {nowValue} 时间: {DateTime.Now:HH:mm:ss}");
|
}
|
|
private void OnChangeEndAction(ulong nowHunt, ulong nowHpMax)
|
{
|
if (bossBattleObject == null || bossBattleObject.heroInfoBar == null)
|
return;
|
if (nowHpMax > 0)
|
{
|
float percentage = Mathf.Clamp(nowHunt, 0, nowHpMax) / (float)nowHpMax;
|
bossBattleObject.heroInfoBar.UpdateHP(percentage);
|
//Debug.Log($"TianziDamageBar nowValue {percentage} 时间: {DateTime.Now:HH:mm:ss}");
|
}
|
}
|
|
|
public void DisplaySkillWordsList(NPCLineupConfig lineUPConfig)
|
{
|
if (skillWordCells.IsNullOrEmpty())
|
return;
|
|
if (null == lineUPConfig)
|
return;
|
|
for (int i = 0; i < skillWordCells.Length; i++)
|
{
|
if (i < lineUPConfig.SkillIDExList.Length)
|
{
|
skillWordCells[i].SetActive(true);
|
int skillID = lineUPConfig.SkillIDExList[i];
|
skillWordCells[i].Init(skillID, () =>
|
{
|
SmallTipWin.showText = Language.Get("SmallTipFomat", SkillConfig.Get(skillID)?.SkillName, SkillConfig.Get(skillID)?.Description);
|
SmallTipWin.worldPos = CameraManager.uiCamera.ScreenToWorldPoint(Input.mousePosition);
|
SmallTipWin.isDownShow = true;
|
UIManager.Instance.OpenWindow<SmallTipWin>();
|
});
|
}
|
else
|
{
|
skillWordCells[i].SetActive(false);
|
}
|
}
|
}
|
|
public void RefreshBuff(List<HB428_tagSCBuffRefresh> datas)
|
{
|
if (buffCells.IsNullOrEmpty())
|
return;
|
|
|
for (int i = 0; i < buffCells.Count; i++)
|
{
|
if (i < datas.Count)
|
{
|
buffCells[i].SetActive(true);
|
HB428_tagSCBuffRefresh buffData = datas[i];
|
buffCells[i].Init(buffData, () =>
|
{
|
// 点击buff图标 显示buff描述/当前身上所有buff
|
});
|
}
|
else
|
{
|
buffCells[i].SetActive(false);
|
}
|
}
|
}
|
|
bool IsOpenBattleChangeTab()
|
{
|
return FuncOpen.Instance.IsFuncOpen(ArenaManager.Instance.BattleChangeTabFuncId);
|
}
|
|
List<TeamHero> GetTeamHeroList(List<BattleObject> teams)
|
{
|
List<TeamHero> teamHeroes = new List<TeamHero>();
|
if (teams.IsNullOrEmpty())
|
return teamHeroes;
|
foreach (var item in teams)
|
{
|
teamHeroes.Add(item.teamHero);
|
}
|
return teamHeroes;
|
|
}
|
}
|