using System;
using System.Collections;
using System.Collections.Generic;
using Cysharp.Threading.Tasks;
using DG.Tweening;
using UnityEngine;
using UnityEngine.UI;
///
/// 公会基础界面
///
public class GuildBossWin : UIBase
{
[SerializeField] Text endTimeText;
[SerializeField] Text fightPowerText;
[SerializeField] Transform rankRect;
[SerializeField] Text rankText;
[SerializeField] Text noRankText;
[SerializeField] AvatarCell headCell;
[SerializeField] Text nameText;
[SerializeField] Text todayHurtText;
[SerializeField] Image newHighestHurtImg;
//布阵
[SerializeField] Text bzAttrText;
[SerializeField] UIEffectPlayer bzEffect1;
[SerializeField] Text bzLayerText; //公会布阵层级
[SerializeField] UIEffectPlayer bzEffect2;
[SerializeField] Button bzBtn;
[SerializeField] Text bzTimesText; //个人布阵次数
[SerializeField] Button bzRecordBtn;
//怒气条
[SerializeField] Image processLeft; //颜色从00FF0B 到 FFE400 到 E30400
[SerializeField] Image processRight;
[SerializeField] Button atkBtn;
[SerializeField] Image angerAtk; //怒气攻击
[SerializeField] Transform normalAtk; //普通攻击
[SerializeField] UIEffectPlayer atkEffect; //普通攻击特效 0次不显示 按钮用
[SerializeField] Text normalAtkCntText; //普通攻击次数
[SerializeField] Text atkCDText; //攻击cd
[SerializeField] Transform addTimesRect;
[SerializeField] Image addTimesItemImg;
[SerializeField] ButtonEx closeBtn;
[SerializeField] ButtonEx scoreBtn;
[SerializeField] ButtonEx awardBtn;
[SerializeField] Transform awardCntRect;
[SerializeField] Text awardCntText;
//攻击区
[SerializeField] UIHeroController bossModel;
[SerializeField] HorseController heroModel;
[SerializeField] Transform attackArea1;
[SerializeField] Transform attackArea2;
[SerializeField] Transform attackArea3;
[SerializeField] GuildBossOtherPlayer otherPlayer; //创建多个用
[SerializeField] GuildBossOtherPlayerAttack otherPlayerAttack; //创建多个用
//自己的攻击
[SerializeField] UIEffectPlayer hurtEffect;
[SerializeField] UIEffectPlayer hurtAngerEffect;
[SerializeField] Text[] hurtValues;
[SerializeField] Text[] awardValues;
[SerializeField] Image[] awardIcons;
[SerializeField] Transform pos1;
[SerializeField] Transform pos2;
[SerializeField] Transform fakeRedBZ;
[SerializeField] Transform fakeRedAward;
bool isCD = false;
int beforeLayerNum; //布阵层级 对比变化展示特效
protected override void InitComponent()
{
closeBtn.AddListener(CloseWindow);
bzBtn.AddListener(OnBzBtnClick);
bzRecordBtn.AddListener(() =>
{
UIManager.Instance.OpenWindow();
});
atkBtn.AddListener(OnAtkBtnClick);
scoreBtn.AddListener(() =>
{
UIManager.Instance.OpenWindow();
});
awardBtn.AddListener(() =>
{
UIManager.Instance.OpenWindow();
});
bossModel.Create(GuildBossManager.Instance.bossSkinID, 1, motionName: "chuxian");
}
protected override void OnPreOpen()
{
GlobalTimeEvent.Instance.secondEvent += OnSecondEvent;
PlayerDatas.Instance.playerDataRefreshEvent += OnPlayerDataRefresh;
GuildBossManager.Instance.BossHurtEvent += BossHurtEvent;
GuildBossManager.Instance.AtkResultEvent += AtkResultEvent;
Display();
InitAttack();
}
protected override void OnPreClose()
{
GlobalTimeEvent.Instance.secondEvent -= OnSecondEvent;
PlayerDatas.Instance.playerDataRefreshEvent -= OnPlayerDataRefresh;
GuildBossManager.Instance.BossHurtEvent -= BossHurtEvent;
GuildBossManager.Instance.AtkResultEvent -= AtkResultEvent;
}
protected override void NextFrameAfterOpen()
{
SoundPlayer.Instance.PlayUIAudio(28);
}
void Display()
{
endTimeText.text = Language.Get("Arena14", TimeUtility.SecondsToHMS((int)(TimeUtility.GetTodayEndTime() - TimeUtility.ServerNow).TotalSeconds));
fightPowerText.text = PlayerDatas.Instance.baseData.FightPower.ToString();
headCell.InitUI(AvatarHelper.GetAvatarModel((int)PlayerDatas.Instance.baseData.PlayerID,
PlayerDatas.Instance.baseData.face,
PlayerDatas.Instance.baseData.facePic));
nameText.text = PlayerDatas.Instance.baseData.PlayerName;
BossHurtEvent();
}
//战力变化
void OnPlayerDataRefresh(PlayerDataType type)
{
if (type == PlayerDataType.FightPower)
fightPowerText.text = PlayerDatas.Instance.baseData.FightPower.ToString();
}
//显示动态UI
void ShowDynamicUI()
{
var bossAction = GuildBossManager.Instance.GetGuildBossAction();
ShowRank();
ShowBzInfo(bossAction);
todayHurtText.text = Language.Get("GuildBoss17") + UIHelper.ReplaceLargeNum(GuildBossManager.Instance.m_BoxHurt);
if (GuildBossManager.Instance.m_BoxHurt >= GuildBossManager.Instance.m_BoxHurtHis)
{
newHighestHurtImg.SetActive(true);
}
else
{
newHighestHurtImg.SetActive(false);
}
bzTimesText.text = Language.Get("Guild_65") + (GuildBossManager.Instance.m_BuZhenState == 1 ? "0/1" : UIHelper.AppendColor(TextColType.Green, "1/1", false));
ShowProcess(GuildBossManager.Instance.m_Anger * 1.0f / GuildBossManager.Instance.maxAngerValue);
if (isCD)
{
angerAtk.SetActive(false);
normalAtk.SetActive(false);
}
else
{
atkCDText.text = "";
if (GuildBossManager.Instance.m_Anger >= GuildBossManager.Instance.maxAngerValue)
{
angerAtk.SetActive(true);
normalAtk.SetActive(false);
}
else
{
angerAtk.SetActive(false);
normalAtk.SetActive(true);
int cnt = GuildBossManager.Instance.GetHasAtkCnt();
if (cnt > 0)
{
atkEffect.Play();
}
else
{
atkEffect.Stop();
}
normalAtkCntText.text = Language.Get("TianziBillborad07", cnt);
}
}
var hasCnt = GuildBossManager.Instance.GetHasAtkCnt();
if (hasCnt > 0 || GuildBossManager.Instance.m_Anger >= GuildBossManager.Instance.maxAngerValue)
{
addTimesRect.SetActive(false);
}
else
{
addTimesRect.SetActive(true);
addTimesItemImg.SetItemSprite(GuildBossManager.Instance.addAtkCntItemID);
}
if (GuildBossManager.Instance.m_BoxUnGetCount > 0)
{
awardCntRect.SetActive(true);
awardCntText.text = Language.Get("TianziBillborad07", GuildBossManager.Instance.m_BoxUnGetCount);
}
else
{
awardCntRect.SetActive(false);
}
fakeRedBZ.SetActive(GuildBossManager.Instance.m_BuZhenState != 1);
fakeRedAward.SetActive(GuildBossManager.Instance.m_BoxUnGetCount > 0);
}
void BossHurtEvent()
{
var bossAction = GuildBossManager.Instance.GetGuildBossAction();
var layer = bossAction == null ? 0 : bossAction.Value3;
if (beforeLayerNum != layer)
{
bzEffect1.Play();
bzEffect2.Play();
beforeLayerNum = (int)layer;
}
ShowDynamicUI();
}
void ShowRank()
{
int myRank = GuildBossManager.Instance.GetMyRank();
if (myRank > 0)
{
rankRect.SetActive(true);
noRankText.SetActive(false);
rankText.text = myRank.ToString();
}
else
{
rankRect.SetActive(false);
noRankText.SetActive(true);
}
}
//布阵
void ShowBzInfo(HA513_tagMCFamilyActionInfo.tagMCFamilyAction bossAction)
{
bzAttrText.text = GetAddAttrs(bossAction);
var layer = bossAction == null ? 0 : bossAction.Value3;
var bzTime = bossAction == null ? 0 : bossAction.Value2;
if (bzTime == 0)
{
bzLayerText.text = $"{layer}/{GuildBossManager.Instance.bzMaxLevel}";
}
else
{
int remainTime = (int)Math.Max(0, bzTime - TimeUtility.AllSeconds);
if (remainTime > 0)
{
bzLayerText.text = $"{layer}/{GuildBossManager.Instance.bzMaxLevel}" + Language.Get("GuildBoss28", TimeUtility.SecondsToHMS(remainTime));
}
}
}
//获取布阵属性
string GetAddAttrs(HA513_tagMCFamilyActionInfo.tagMCFamilyAction action)
{
var layerNum = action == null ? 0 : action.Value3;
var superHitRate = GuildBossManager.Instance.initSuperHitRate + (int)layerNum * GuildBossManager.Instance.bzAddAttrs[0];
var addHurtPer = (int)layerNum * GuildBossManager.Instance.bzAddAttrs[1];
if (addHurtPer == 0)
{
return Language.Get("GuildBoss18_0", superHitRate / 100);
}
return Language.Get("GuildBoss18_0", superHitRate / 100) + Language.Get("L1112") + Language.Get("GuildBoss18_1", addHurtPer / 100);
}
void OnSecondEvent()
{
endTimeText.text = Language.Get("Arena14", TimeUtility.SecondsToHMS((int)(TimeUtility.GetTodayEndTime() - TimeUtility.ServerNow).TotalSeconds));
var bossAction = GuildBossManager.Instance.GetGuildBossAction();
ShowBzInfo(bossAction);
}
void ShowProcess(float value)
{
//颜色从00FF0B 到 FFE400 到 E30400
processLeft.fillAmount = value;
processRight.fillAmount = value;
Color processColor = GetProcessColor(value);
processLeft.color = processColor;
processRight.color = processColor;
}
Color GetProcessColor(float value)
{
// 限制值在0-1范围内
value = Mathf.Clamp01(value);
if (value <= 0.5f)
{
float t = value / 0.5f;
return Color.Lerp(new Color(0f, 1f, 0.043f), new Color(1f, 0.894f, 0f), t);
}
else
{
float t = (value - 0.5f) / 0.5f;
return Color.Lerp(new Color(1f, 0.894f, 0f), new Color(0.89f, 0.016f, 0f), t);
}
}
void OnBzBtnClick()
{
int curLayer = 0;
var bossAction = GuildBossManager.Instance.GetGuildBossAction();
if (bossAction != null)
{
curLayer = (int)bossAction.Value3;
}
// if (curLayer >= GuildBossManager.Instance.bzMaxLevel)
// {
// SysNotifyMgr.Instance.ShowTip("GuildBoss2");
// return;
// }
if (GuildBossManager.Instance.m_BuZhenState == 1)
{
SysNotifyMgr.Instance.ShowTip("GuildBoss1");
return;
}
GuildBossManager.Instance.TaofaBoss(1);
}
void OnAtkBtnClick()
{
if (isCD) return;
//怒气伤害不消耗次数
//次数不足 提示使用道具,若用完提示本日次数已用完
if (GuildBossManager.Instance.m_Anger < GuildBossManager.Instance.maxAngerValue)
{
if (GuildBossManager.Instance.GetHasAtkCnt() <= 0)
{
var itemCfg = ItemConfig.Get(GuildBossManager.Instance.addAtkCntItemID);
var singleCnt = itemCfg.EffectValueA1;
var todayUseMaxCnt = itemCfg.MaxSkillCnt;
if (GuildBossManager.Instance.m_ItemAddCount / singleCnt >= todayUseMaxCnt)
{
SysNotifyMgr.Instance.ShowTip("HeroWishFinish");
return;
}
ConfirmCancel.ShowUseItemPopConfirm(Language.Get("GuildBoss24"), Language.Get("GuildBoss23",
itemCfg.IconKey, singleCnt, todayUseMaxCnt - GuildBossManager.Instance.m_ItemAddCount / singleCnt),
GuildBossManager.Instance.addAtkCntItemID, 1, (bool isOK) =>
{
if (isOK)
{
if (ItemLogicUtility.CheckItemCount(PackType.Item, GuildBossManager.Instance.addAtkCntItemID, 1, 2))
{
ItemLogicUtility.Instance.UseItem(PackManager.Instance.GetItemGUIDByID(GuildBossManager.Instance.addAtkCntItemID));
}
}
});
return;
}
}
GuildBossManager.Instance.TaofaBoss(0);
ShowAttackCD().Forget();
}
async UniTask ShowAttackCD()
{
angerAtk.SetActive(false);
normalAtk.SetActive(false);
isCD = true;
atkBtn.SetColorful(null, false);
atkCDText.text = "3";
await UniTask.Delay(1000);
atkCDText.text = "2";
await UniTask.Delay(1000);
atkCDText.text = "1";
await UniTask.Delay(1000);
atkBtn.SetColorful(null, true);
isCD = false;
ShowDynamicUI();
}
void AtkResultEvent()
{
//1. 玩家从pos1 移动到pos2
//2. 播放攻击动作 - 显示对应类型特效
//3. 延迟100毫秒飘血物品
heroModel.GetHero().onComplete = null;
heroModel.PlayAnimation("run", true);
heroModel.transform.localPosition = pos1.localPosition;
heroModel.transform.DOLocalMove(pos2.localPosition, 0.3f).OnComplete(() =>
{
ShowDmg().Forget();
});
}
async UniTask ShowDmg()
{
heroModel.GetHero().onComplete = () =>
{
heroModel.transform.localPosition = pos1.localPosition;
};
heroModel.HeroPlay("attack");
if (GuildBossManager.Instance.atkResult.AtkType == 0)
{
hurtEffect.Play();
}
else
{
hurtAngerEffect.Play();
}
bossModel.PlayAnimation("hit");
bossModel.onComplete = () =>
{
bossModel.PlayAnimation("idle", true);
bossModel.onComplete = null;
};
for (int i = 0; i < hurtValues.Length; i++)
{
if (i < GuildBossManager.Instance.atkResult.HurtCount)
{
int index = i;
hurtValues[i].transform.localScale = Vector3.one;
var tween = hurtValues[i].GetComponent();
if (tween.isActiveAndEnabled)
{
tween.SetStartState();
tween.Play(() =>
{
hurtValues[index].transform.localScale = Vector3.zero;
});
}
var hurtData = GuildBossManager.Instance.atkResult.HurtList[i];
BattleDmg dmg = new BattleDmg()
{
damage = hurtData.HurtValue + hurtData.HurtValueEx * Constants.ExpPointValue,
attackType = hurtData.IsSuper == 1 ? (int)DamageType.CritDamage : 2
};
hurtValues[i].text = BattleUtility.DisplayDamageNum(dmg);
await UniTask.Delay(200);
}
else
{
hurtValues[i].transform.localScale = Vector3.zero;
}
}
for (int i = 0; i < awardValues.Length; i++)
{
if (i < GuildBossManager.Instance.atkResult.ItemCount)
{
var itemData = GuildBossManager.Instance.atkResult.ItemList[i];
awardValues[i].transform.localScale = Vector3.one;
int index = i;
var tween = awardValues[i].GetComponent();
if (tween.isActiveAndEnabled)
{
tween.SetStartState();
tween.Play(() =>
{
awardValues[index].transform.localScale = Vector3.zero;
});
}
awardValues[i].text = itemData.Count.ToString();
awardIcons[i].SetItemSprite((int)itemData.ItemID);
await UniTask.Delay(200);
}
else
{
awardValues[i].transform.localScale = Vector3.zero;
}
}
}
void InitAttack()
{
var skinConfig = HorseSkinConfig.Get(HorseManager.Instance.GetUsingHorseSkinID(false));
heroModel.Create(skinConfig.SkinID, PhantasmPavilionManager.Instance.GetMyModelSkinID(), 1.2f);
for (int i = 0; i < hurtValues.Length; i++)
{
hurtValues[i].transform.localScale = Vector3.zero;
}
for (int i = 0; i < awardValues.Length; i++)
{
awardValues[i].transform.localScale = Vector3.zero;
}
heroModel.transform.localPosition = pos1.localPosition;
bossModel.onComplete = () =>
{
bossModel.PlayAnimation("idle", true);
bossModel.onComplete = null;
};
bossModel.PlayAnimation("chuxian");
}
}