local UIBattlePlayerHeadBase = require("View/Battle/UIBattlePlayerHeadBase") local UIBattlePlayerHeadPin = UIViewClass(UIBattlePlayerHeadBase) local MAX_REBORN_TIME = 1000 local EmptyHeroIconPath = ConstAssetPathConfig.EmptyHeroIconPath -- 2个参数 -- context.isReverse 默认false -- context.playerID function UIBattlePlayerHeadPin:OnOpened(context) --大乱斗备战区选择首发之后刷新显示 self:RegistSystemEvent(EventID.FightThrone_SelectHero, self.OnFightThroneSelect) self:RegistSystemEvent(EventID.UI_DragonArtery_ForceRefreshPlayerHead, self.OnForceRefreshPlayerHead) self:Init(context) self:InitHeadInfo() self:RegistEvent() end function UIBattlePlayerHeadPin:Init(context) -- 数组[heroID_MID, heroID_LEFT, heroID_RIGHT] self.headOrder = {} self.headInfoDic = {} self.isReverse = context.isReverse or false -- 计时更新,目前(势力战、演武对决)不需要开启计时更新,准确控制复活特效的播放 self.enableReviveTimerUpdate = true end function UIBattlePlayerHeadPin:UpdateHeadInfoDic(list) if list then for i, info in ipairs(list) do self.headInfoDic[info.heroID] = info end end end function UIBattlePlayerHeadPin:OnFightThroneSelect(selectHero) local lastMainHero = self.headOrder[1] if lastMainHero ~= selectHero then local lastIndex for i, heroID in ipairs(self.headOrder) do if heroID == selectHero then lastIndex = i break end end --调换下位置,选中的武将排在首位 self.headOrder[1] = selectHero self.headOrder[lastIndex] = lastMainHero end self:SetHead() end function UIBattlePlayerHeadPin:InitHeadInfo() local headInfo = BattleDataGetter.GetHeadInfoByPlayerID_SelectOneRevive(self.context.playerID) self:UpdateHeadInfoDic(BattleDataGetter.GetHeadInfoByPlayerID_SelectOneRevive(self.context.playerID)) for i, v in ipairs(headInfo) do table.insert(self.headOrder, v.heroID) end self:SetHead() end function UIBattlePlayerHeadPin:LeftToMid() if self.leftAni then self:PlayUIAnimation(self.leftAni) else self.leftAni = self:PlayUIAnimation("Left", true) end end function UIBattlePlayerHeadPin:RightToMid() if self.rightAni then self:PlayUIAnimation(self.rightAni) else self.rightAni = self:PlayUIAnimation("Right", true) end end function UIBattlePlayerHeadPin:OnUIAnimationStoped(id) if id ~= self.resetAni then if id == self.rightAni then if self.isReverse then self:UpdateLeftAniOrder() else self:UpdateRightAniOrder() end self:SetHead() else if self.isReverse then self:UpdateRightAniOrder() else self:UpdateLeftAniOrder() end self:SetHead() end if self.resetAni then self:PlayUIAnimation(self.resetAni) else self.resetAni = self:PlayUIAnimation("Reset", true) end else -- 所有动画结束,获取最新数据,重新更新计时回调 if self.enableReviveTimerUpdate == true then self:UpdateHeadInfoDic(BattleDataGetter.GetHeadInfoByPlayerID_SelectOneRevive(self.context.playerID)) self:UpdateReviveTimer() self:SetHead() end end end function UIBattlePlayerHeadPin:UpdateRightAniOrder() local removedHeroID = table.remove(self.headOrder, self.switchedIndex) table.insert(self.headOrder, 1, removedHeroID) end function UIBattlePlayerHeadPin:UpdateLeftAniOrder() local cachedHeroID = table.remove(self.headOrder, 1) table.insert(self.headOrder, cachedHeroID) end function UIBattlePlayerHeadPin:SetHead() self:InitLeftHead() self:InitMainHead() self:InitRightHead() end function UIBattlePlayerHeadPin:InitMainHead() self:UpdateHeroInfo(1) end function UIBattlePlayerHeadPin:InitLeftHead() if self.headOrder[2] then self:UpdateHeroInfo(2) else self:UpdateEmptyHead(2) end end function UIBattlePlayerHeadPin:InitRightHead() if self.headOrder[3] then self:UpdateHeroInfo(3) else self:UpdateEmptyHead(3) end end function UIBattlePlayerHeadPin:OnSwitchHero(switchType, entity) if entity:GetPlayerID() == self.context.playerID then self:UpdateHeadInfoDic(BattleDataGetter.GetHeadInfoByPlayerID_SelectOneRevive(self.context.playerID)) -- 等待当前英雄复活 不上新英雄 self.onStageHeroID = entity._logicInitData.CharacterID if self.headOrder[1] == self.onStageHeroID then self:SetHead() return end -- 判断播放动画位 for i, heroID in ipairs(self.headOrder) do if heroID == self.onStageHeroID then self.switchedIndex = i if self.isReverse then -- 镜像敌对头像 if i == 2 then self:RightToMid() elseif i == 3 then self:LeftToMid() end else if i == 2 then self:LeftToMid() elseif i == 3 then self:RightToMid() end end end end end end function UIBattlePlayerHeadPin:OnHeroDead(playerID) if playerID == self.context.playerID then self:RefreshAll() end end function UIBattlePlayerHeadPin:OnForceRefreshPlayerHead(playerID) self:RefreshAll(playerID) end function UIBattlePlayerHeadPin:RefreshAll(playerID) if playerID then local headInfo = BattleDataGetter.GetHeadInfoByPlayerID_SelectOneRevive(playerID) self.headOrder = {} for i, v in ipairs(headInfo) do table.insert(self.headOrder, v.heroID) end else playerID = self.context.playerID end local list = BattleDataGetter.GetHeadInfoByPlayerID_SelectOneRevive(playerID) self:UpdateHeadInfoDic(list) self:UpdateReviveTimer() self:SetHead() end -- 武将复活回调 function UIBattlePlayerHeadPin:ReviveTimeOut() self.isTimerRunning = false for idx, heroID in ipairs(self.headOrder) do if heroID == self.nextEffectReviveHeroID then -- 触发武将武将复活回调, 同步时间, 因为战斗接口返回时间和实际计时时间有1秒差别,更新新的计时, 手动清除1秒差距 self:UpdateHeadInfoDic(BattleDataGetter.GetHeadInfoByPlayerID_SelectOneRevive(self.context.playerID)) self.headInfoDic[heroID].reviveTime = 0 self:SetHeroRevive(idx) end end self:UpdateReviveTimer() end function UIBattlePlayerHeadPin:SetHeroRevive(index) self.group_Info[index].effect_Reborn:PlayUIEffect() UTL.Item.SetHeroIconByHeroId(self.headImg_Group[index].texture_Head, self.nextEffectReviveHeroID, BattleDataGetter.GetHeroIsAwaken(self.context.playerID, self.nextEffectReviveHeroID)) UIUtils.SetGray(self.headImg_Group[index].texture_Head, false) UIUtils.SetActive(self.headImg_Group[index].black_Bg, true) self.group_Info[index].txt_Number:EndTimer() end function UIBattlePlayerHeadPin:UpdateReviveTimer() local callBackTime, heroID = self:GetMinReviveTimeAndHeroID() self.nextEffectReviveHeroID = heroID if callBackTime >= MAX_REBORN_TIME then return end if callBackTime <= MAX_REBORN_TIME then if not self.isTimerRunning then self.isTimerRunning = true self:StartRepeatFunc(self.ReviveTimeOut, callBackTime, 1) else self:StopRepeatFunc(self.ReviveTimeOut) self:StartRepeatFunc(self.ReviveTimeOut, callBackTime, 1) end end end function UIBattlePlayerHeadPin:GetMinReviveTimeAndHeroID() local time = MAX_REBORN_TIME local heroID = -1 for k, v in pairs(self.headInfoDic) do if v.reviveTime and v.reviveTime > 0 and v.reviveTime < time then time = v.reviveTime heroID = v.heroID end end return time, heroID end function UIBattlePlayerHeadPin:UpdateEmptyHead(index) UIUtils.SetImageByAssetBundle(self.headImg_Group[index].texture_Head, EmptyHeroIconPath) end -- 更新头像状态信息, 包含 武将复活倒计时和武将死亡遮罩 function UIBattlePlayerHeadPin:UpdateHeroInfo(index) self.curInfo = self.headInfoDic[self.headOrder[index]] self:SetHeroInfo(index) end function UIBattlePlayerHeadPin:OnPlayerRevive(entity) if entity:GetPlayerID() == self.context.playerID then self:UpdateHeadInfoDic(BattleDataGetter.GetHeadInfoByPlayerID_SelectOneRevive(self.context.playerID)) end end function UIBattlePlayerHeadPin:SetHeroImage(index) if LevelManager.IsBattleWaitLevel() and self.context.playerID == LuaConst.BATTLE_WAIT_PLAYER_PlayID then --不在战斗场景,当前显示自己的头像,此时entity并没有觉醒信息,从系统内取数据 UTL.Item.SetHeroIconByHeroId(self.headImg_Group[index].texture_Head, self.curInfo.heroID, MDL.HeroAwaken.GetIsHeroAwaken(self.curInfo.heroID)) else UTL.Item.SetHeroIconByHeroId(self.headImg_Group[index].texture_Head, self.curInfo.heroID, BattleDataGetter.GetHeroIsAwaken(self.context.playerID, self.curInfo.heroID)) end if BattleDataGetter.IsSelectOneReviveLevel() then -- 复活选将的模式下,不置灰有倒计时显示 UIUtils.SetGray(self.headImg_Group[index].texture_Head, self:IsHeroInCD(self.curInfo)) UIUtils.SetActive(self.headImg_Group[index].black_Bg, index ~= 1 and not self:IsHeroInCD(self.curInfo)) else -- 其他模式阵亡武将置灰显示 UIUtils.SetGray(self.headImg_Group[index].texture_Head, self.curInfo.hpPercent == 0) UIUtils.SetActive(self.headImg_Group[index].black_Bg, index ~= 1 and self.curInfo.hpPercent ~= 0) end end function UIBattlePlayerHeadPin:SetHeroInfo(index) self:SetPlayerHp(self.group_Info[index].img_CountDown_Green, self.curInfo.hpPercent) self:SetHeroImage(index) self:SetReviveTime(index) end function UIBattlePlayerHeadPin:SetReviveTime(index) local countDownObj = self.group_Info[index] if self.curInfo.reviveTime and self.curInfo.reviveTime > 0 then countDownObj.txt_Number:ResetAndBeginTimer(false,math.ceil(self.curInfo.reviveTime),math.ceil(self.curInfo.reviveTotalTime)) else countDownObj.txt_Number:EndTimer() end end function UIBattlePlayerHeadPin:IsHeroInCD(info) if info.reviveTime and info.reviveTime > 0 then return true end return false end function UIBattlePlayerHeadPin:SetPlayerHp(obj, hpPercent) if obj then obj.fillAmount = hpPercent or 1 end end -- 更新将为血条变化 function UIBattlePlayerHeadPin:OnHPMessageChanged(entity) if entity:GetPlayerID() == self.context.playerID then local comp_Attr = entity.components.attr local hplmt = comp_Attr:GetAttrValueNum(LuaConst.AttrType.hplmt) if hplmt <= 0 then return end local hp = FP.tonumberV1(comp_Attr.hp) local pc = FP.tonumberV1(comp_Attr.pc) local totalValue = pc + hp >= hplmt and pc + hp or hplmt self:SetPlayerHp(self.group_Info[1].img_CountDown_Green,hp/totalValue) end end return UIBattlePlayerHeadPin