local XUiPanelSkillDetailsInfo = XClass(nil, "XUiPanelSkillDetailsInfo") -- 触发拖拽前的延时 local LONG_CLICK_OFFSET = 0.2 local LONG_PRESS_PARAMS = 500 local SIGNAL_BAL_MEMBER = 3 --信号球技能(红黄蓝) local DescribeType = { Title = 1, Specific = 2, } function XUiPanelSkillDetailsInfo:Ctor(ui, rootUi) self.GameObject = ui.gameObject self.Transform = ui.transform self.RootUi = rootUi XTool.InitUiObject(self) ---@type XCharacterAgency local ag = XMVCA:GetAgency(ModuleId.XCharacter) self.CharacterAgency = ag self:RegisterUiEvents() self:ResetLongPressData() self.Attribute.gameObject:SetActiveEx(false) self.TxtSkillTitle.gameObject:SetActiveEx(false) self.TxtSkillSpecific.gameObject:SetActiveEx(false) self.SkillTag = {} self.TxtSkillTitleGo = {} self.TxtSkillSpecificGo = {} end function XUiPanelSkillDetailsInfo:Refresh(characterId, subSkill, isDetails) self.CharacterId = characterId self.SubSkill = subSkill self.IsDetails = isDetails self:RefreshSubSkillInfoPanel(subSkill) end function XUiPanelSkillDetailsInfo:RefreshSubSkillInfoPanel(subSkill) -- 切换按钮 local showSwithBtn = subSkill.Level > 0 and XCharacterConfigs.CanSkillSwith(subSkill.SubSkillId) self.BtnSwitch.gameObject:SetActiveEx(showSwithBtn) self:RefreshSkillLevel(subSkill) self:RefreshSkillView() self:RefreshEntryBtn() local min_max = XCharacterConfigs.GetSubSkillMinMaxLevel(self.SubSkillId) if (subSkill.Level >= min_max.Max) then self.PanelCondition.gameObject:SetActiveEx(false) self.PanelConsume.gameObject:SetActiveEx(false) self.BtnUpgrade.gameObject:SetActiveEx(false) self.BtnUnlock.gameObject:SetActiveEx(false) self.PanelMax.gameObject:SetActiveEx(true) return else self.PanelMax.gameObject:SetActiveEx(false) end local passCondition = true local conditionDes = "" local conditions = subSkill.config.ConditionId if conditions then for _, conditionId in pairs(conditions) do if conditionId ~= 0 then passCondition, conditionDes = XConditionManager.CheckCondition(conditionId, self.CharacterId) if not passCondition then break end end end end self.PanelConsume.gameObject:SetActiveEx(passCondition) self.PanelCondition.gameObject:SetActiveEx(not passCondition) self.TxtConditionOk.gameObject:SetActiveEx(passCondition) self.TxtConditionBad.gameObject:SetActiveEx(not passCondition) if passCondition then self.TxtConditionOk.text = conditionDes --消耗技能点 local showSkillPoint = subSkill.config.UseSkillPoint > 0 self.PanelSkillPoint.gameObject:SetActiveEx(showSkillPoint) if showSkillPoint then local isSkillPointMeet = self.CharacterAgency:IsUseItemEnough({ XDataCenter.ItemManager.ItemId.SkillPoint }, { subSkill.config.UseSkillPoint }) if isSkillPointMeet then self.TxtSkillPointOk.text = subSkill.config.UseSkillPoint else self.TxtSkillPointBad.text = subSkill.config.UseSkillPoint end local icon = XDataCenter.ItemManager.GetItemIcon(XDataCenter.ItemManager.ItemId.SkillPoint) self.PanelSkillPointOk:Find("Icon"):GetComponent("RawImage"):SetRawImage(icon) self.PanelSkillPointBad:Find("Icon"):GetComponent("RawImage"):SetRawImage(icon) self.PanelSkillPointBad.gameObject:SetActiveEx(not isSkillPointMeet) self.PanelSkillPointOk.gameObject:SetActiveEx(isSkillPointMeet) end --消耗螺母 local showCoin = subSkill.config.UseCoin > 0 self.PanelCoin.gameObject:SetActiveEx(showCoin) if showCoin then local isUseCoinMeet = self.CharacterAgency:IsUseItemEnough({ XDataCenter.ItemManager.ItemId.Coin }, { subSkill.config.UseCoin }) if isUseCoinMeet then self.TxtCoinOk.text = subSkill.config.UseCoin else self.TxtCoinBad.text = subSkill.config.UseCoin end local icon = XDataCenter.ItemManager.GetItemIcon(XDataCenter.ItemManager.ItemId.Coin) self.PanelCoinOk:Find("Icon"):GetComponent("RawImage"):SetRawImage(icon) self.PanelCoinBad:Find("Icon"):GetComponent("RawImage"):SetRawImage(icon) self.PanelCoinBad.gameObject:SetActiveEx(not isUseCoinMeet) self.PanelCoinOk.gameObject:SetActiveEx(isUseCoinMeet) end if not showCoin and not showSkillPoint then self.PanelConsume.gameObject:SetActiveEx(false) end else self.TxtConditionBad.text = conditionDes end if (subSkill.Level <= 0) then self.BtnUnlock:SetDisable(not passCondition) self.BtnUnlock.gameObject:SetActiveEx(true) self.BtnUpgrade.gameObject:SetActiveEx(false) elseif (subSkill.Level < min_max.Max and subSkill.Level > 0) then local canUpdate = self.CharacterAgency:CheckCanUpdateSkill(self.CharacterId, subSkill.SubSkillId, subSkill.Level) self.BtnUpgrade:SetDisable(not canUpdate) self.BtnUpgrade.gameObject:SetActiveEx(true) self.BtnUnlock.gameObject:SetActiveEx(false) end end function XUiPanelSkillDetailsInfo:RefreshSkillLevel(subSkill) self.SubSkillId = subSkill.SubSkillId local levelStr = subSkill.Level local addLevel = 0 local addLevelStr = "" local resonanceLevel = self.CharacterAgency:GetResonanceSkillLevel(self.CharacterId, self.SubSkillId) local assignLevel = XDataCenter.FubenAssignManager.GetSkillLevel(self.CharacterId, self.SubSkillId) if (resonanceLevel and resonanceLevel > 0) then addLevel = addLevel + resonanceLevel end if (assignLevel and assignLevel > 0) then addLevel = addLevel + assignLevel end if addLevel ~= 0 then addLevelStr = addLevelStr .. CS.XTextManager.GetText("CharacterSkillLevelDetail", addLevel) levelStr = levelStr .. addLevelStr self.BtnDetails.gameObject:SetActiveEx(true) else self.BtnDetails.gameObject:SetActiveEx(false) end self.SubSkillLevel = subSkill.Level + addLevel self.GradeConfig = XCharacterConfigs.GetSkillGradeDesConfig(self.SubSkillId, self.SubSkillLevel) self.TxtSkillLevel.text = levelStr end function XUiPanelSkillDetailsInfo:RefreshSkillView() local configDes = self.GradeConfig -- 技能名称 self.TxtSkillName.text = configDes.Name -- 技能类型 self.TxtSkillType.text = configDes.TypeDes and CSXTextManagerGetText("CharacterSkillTypeText", configDes.TypeDes) or "" -- 技能图标 local skillType = XCharacterConfigs.GetSkillType(self.SubSkillId) local isSignalBal = skillType <= SIGNAL_BAL_MEMBER self.ImgSkillPointIcon:SetRawImage(configDes.Icon) self.ImgBlueBall:SetRawImage(configDes.Icon) self.ImgSkillPointIcon.gameObject:SetActiveEx(not isSignalBal) self.ImgBlueBall.gameObject:SetActiveEx(isSignalBal) -- 技能标签 for index, tag in pairs(configDes.Tag or {}) do local grid = self.SkillTag[index] if not grid then grid = XUiHelper.Instantiate(self.Attribute, self.PanelAttribute) self.SkillTag[index] = grid end local tagUi = {} XTool.InitUiObjectByUi(tagUi, grid) tagUi.Name.text = tag grid.gameObject:SetActiveEx(true) end for i = #configDes.Tag + 1, #self.SkillTag do self.SkillTag[i].gameObject:SetActiveEx(false) end -- 技能描述 self:RefreshSkillDescribe(self.IsDetails) end function XUiPanelSkillDetailsInfo:RefreshSkillDescribe(isDetails) -- 隐藏 for _, go in pairs(self.TxtSkillTitleGo) do go:SetActiveEx(false) end for _, go in pairs(self.TxtSkillSpecificGo) do go:SetActiveEx(false) end -- 显示 local messageDes = {} if isDetails then messageDes = self.GradeConfig.SpecificDes else messageDes = self.GradeConfig.BriefDes end for index, message in pairs(messageDes or {}) do local title = self.GradeConfig.Title[index] if title then self:SetTextInfo(DescribeType.Title, index, title) end self:SetTextInfo(DescribeType.Specific, index, message) end -- 每次刷新技能描述时,都从最开头进行显示 if self.GridSkillInfo then self.GridSkillInfo.verticalNormalizedPosition = 1 end end function XUiPanelSkillDetailsInfo:SetTextInfo(txtType, index, info) local txtSkillGo = {} local target if txtType == DescribeType.Title then txtSkillGo = self.TxtSkillTitleGo target = self.TxtSkillTitle.gameObject else txtSkillGo = self.TxtSkillSpecificGo target = self.TxtSkillSpecific.gameObject end local txtGo = txtSkillGo[index] if not txtGo then txtGo = XUiHelper.Instantiate(target, self.PanelReward) txtSkillGo[index] = txtGo end txtGo:SetActiveEx(true) local goTxt = txtGo:GetComponent("Text") goTxt.text = XUiHelper.ConvertLineBreakSymbol(info) txtGo.transform:SetAsLastSibling() end function XUiPanelSkillDetailsInfo:RefreshEntryBtn() if not XTool.IsNumberValid(self.SubSkillId) then self.BtnNounParsing.gameObject:SetActiveEx(false) return end self.EntryList = XCharacterConfigs.GetSkillGradeDesConfigEntryList(self.SubSkillId, self.SubSkillLevel) if XTool.IsTableEmpty(self.EntryList) then self.BtnNounParsing.gameObject:SetActiveEx(false) return end self.BtnNounParsing.gameObject:SetActiveEx(true) end function XUiPanelSkillDetailsInfo:CheckUpgradeSubSkill() local subSkill = self.SubSkill local conditions = subSkill.config.ConditionId if not conditions then return true end for _, conditionId in pairs(conditions) do local passCondition local conditionDes if conditionId ~= 0 then passCondition, conditionDes = XConditionManager.CheckCondition(conditionId, self.CharacterId) if not passCondition then XUiManager.TipMsg(conditionDes) return false end end end if (not self.CharacterAgency:IsUseItemEnough(XDataCenter.ItemManager.ItemId.SkillPoint, subSkill.config.UseSkillPoint)) then XUiManager.TipText("CharacterUngradeSkillSkillPointNotEnough") return false end return true end --region 按钮相关 function XUiPanelSkillDetailsInfo:RegisterUiEvents() XUiHelper.RegisterClickEvent(self, self.BtnDetails, self.OnBtnDetails) XUiHelper.RegisterClickEvent(self, self.BtnNounParsing, self.OnBtnNounParsing) XUiHelper.RegisterClickEvent(self, self.BtnSwitch, self.OnBtnSwitchClick) XUiHelper.RegisterClickEvent(self, self.BtnUnlock, self.OnBtnUnlockClick) XUiHelper.RegisterClickEvent(self, self.BtnSkillPoint, self.OnBtnSkillPointClick) XUiHelper.RegisterClickEvent(self, self.BtnCoin, self.OnBtnCoinClick) self:RegisterLongPressLevelUp() end function XUiPanelSkillDetailsInfo:OnBtnNounParsing() if XTool.IsTableEmpty(self.EntryList) then return end if not XLuaUiManager.IsUiShow("UiCharSkillOtherParsing") then XLuaUiManager.Open("UiCharSkillOtherParsing", self.EntryList) end end function XUiPanelSkillDetailsInfo:OnBtnDetails() self.RootUi:ShowLevelDetail(self.SubSkillId) end function XUiPanelSkillDetailsInfo:OnBtnSwitchClick() local addLevel = self.CharacterAgency:GetSkillPlusLevel(self.CharacterId, self.SubSkillId) local totalLevel = self.SubSkill.Level + addLevel XLuaUiManager.Open("UiCharacterSkillSwich", self.SubSkillId, totalLevel, function() self.RootUi:RefreshData() end) end function XUiPanelSkillDetailsInfo:OnBtnUnlockClick() if (not self:CheckUpgradeSubSkill()) then return end if XTool.IsTableEmpty(self.SubSkill) or not XDataCenter.ItemManager.DoNotEnoughBuyAsset(XDataCenter.ItemManager.ItemId.Coin, self.SubSkill.config.UseCoin, 1, function() self:OnBtnUnlockClick() end, "CharacterUngradeSkillCoinNotEnough") then return end self.CharacterAgency:UnlockSubSkill(self.SubSkillId, self.CharacterId, function() -- XEventManager.DispatchEvent(XEventId.EVENT_CHARACTER_INCREASE_TIP, CS.XTextManager.GetText("CharacterUnlockSkillComplete")) XUiManager.PopupLeftTip(CS.XTextManager.GetText("CharacterUnlockSkillComplete")) self.RootUi:RefreshData() end) end --endregion --region 技能长按功能 function XUiPanelSkillDetailsInfo:ResetLongPressData() self.ClientShowLevelParam = 0 --要升级到的等级 self.ClientLongPressIncreaseLevel = 0 --等级变量依据长按时间增加 self.LongPressCostCoin = 0 self.LongPressCostSkillPoint = 0 self.NotMaskShow = true self.PanelMask.gameObject:SetActiveEx(false) end --技能长按 function XUiPanelSkillDetailsInfo:RegisterLongPressLevelUp() -- 添加长按事件 local btnClickPointer = self.BtnUpgrade.gameObject:GetComponent("XUiPointer") if not btnClickPointer then btnClickPointer = self.BtnUpgrade.gameObject:AddComponent(typeof(CS.XUiPointer)) end self.Clicker = XUiButtonLongClick.New(btnClickPointer, math.floor(1000/ CS.XGame.ClientConfig:GetInt("LongPressPerLevelUp")), self, self.OnBtnUpgradeClick, self.OnLongPress, function() self:OnLongPressUp() end, false, nil,true,true) self.Clicker:SetTriggerOffset(LONG_CLICK_OFFSET) end function XUiPanelSkillDetailsInfo:OnBtnUpgradeClick(ClientLongPressIncreaseLevel) if not self.NotMaskShow then self.NotMaskShow = true self.PanelMask.gameObject:SetActiveEx(false) end if not ClientLongPressIncreaseLevel then --过滤掉不正确的弹窗 if (not self:CheckUpgradeSubSkill())then return end end if XTool.IsTableEmpty(self.SubSkill) then return end if not XDataCenter.ItemManager.DoNotEnoughBuyAsset(XDataCenter.ItemManager.ItemId.Coin, self.SubSkill.config.UseCoin, 1, function() self:OnBtnUpgradeClick() end, "CharacterUngradeSkillCoinNotEnough") then return end self.CharacterAgency:UpgradeSubSkillLevel(self.CharacterId, self.SubSkillId, function() -- XEventManager.DispatchEvent(XEventId.EVENT_CHARACTER_INCREASE_TIP, CS.XTextManager.GetText("CharacterUngradeSkillComplete")) if not self.RootUi.GameObject or XTool.UObjIsNil(self.RootUi.GameObject) then return end XUiManager.PopupLeftTip(CS.XTextManager.GetText("CharacterUngradeSkillComplete")) self.RootUi:RefreshData() end, ClientLongPressIncreaseLevel) end function XUiPanelSkillDetailsInfo:OnLongPress(pressingTime) if self.NotMaskShow then --增加mask,阻止长按时候玩家的其他操作 self.NotMaskShow = false self.PanelMask.gameObject:SetActiveEx(true) end local clientShowLevelParam = 0 local minMax if pressingTime > LONG_CLICK_OFFSET * LONG_PRESS_PARAMS then --控制延时刷新,避免点击一次就刷新技能升级预览 local originalLevel = self.CharacterAgency:GetSkillLevel(self.SubSkillId) minMax = XCharacterConfigs.GetSubSkillMinMaxLevel(self.SubSkillId) self.ClientLongPressIncreaseLevel = self.ClientLongPressIncreaseLevel + 1 clientShowLevelParam = self.ClientLongPressIncreaseLevel + originalLevel local canUpdate = self.CharacterAgency:CheckCanUpdateSkillMultiLevel(self.CharacterId, self.SubSkillId, originalLevel, clientShowLevelParam - 1)--当前等级的消耗是升级到下一级的,所以判断升级的时候-1 if canUpdate then if (clientShowLevelParam > minMax.Max) then clientShowLevelParam = minMax.Max end self.ClientShowLevelParam = clientShowLevelParam self.RootUi:RefreshData(self.ClientShowLevelParam, self.SubSkill) else return true, true --回调参数即使时间短也要加弹窗提示 end end end function XUiPanelSkillDetailsInfo:OnLongPressUp() self.NotMaskShow = true self.PanelMask.gameObject:SetActiveEx(false) if XTool.IsTableEmpty(self.SubSkill) then return end local originalLevel = self.CharacterAgency:GetSkillLevel(self.SubSkillId) local minMax = XCharacterConfigs.GetSubSkillMinMaxLevel(self.SubSkillId) for i = originalLevel, self.ClientShowLevelParam - 1 do --当前等级的消耗是升级到下一级的需要减一操作 local gradeConfig = XCharacterConfigs.GetSkillGradeConfig(self.SubSkillId, i) if not gradeConfig then break end self.LongPressCostCoin = self.LongPressCostCoin + gradeConfig.UseCoin self.LongPressCostSkillPoint = self.LongPressCostSkillPoint + gradeConfig.UseSkillPoint end if self.LongPressCostCoin <= 0 and self.LongPressCostSkillPoint <= 0 then --无消耗就无升级 return end local textParam = "LongPressLevelUpSkill" if minMax and minMax.Max == self.ClientShowLevelParam then textParam = "LongPressLevelUpSkillMax" end local content = CSXTextManagerGetText(textParam, self.LongPressCostCoin, self.LongPressCostSkillPoint, self.ClientShowLevelParam) local tempClientShowLevelParam = self.ClientShowLevelParam local sureCallBack = function() self:OnBtnUpgradeClick(tempClientShowLevelParam - originalLevel) end local closeCallback = function() self.RootUi:RefreshData() end self:ResetLongPressData() local title = CS.XTextManager.GetText("TipTitle") XUiManager.DialogTip(title, content, XUiManager.DialogType.Normal, closeCallback, sureCallBack) end --endregion function XUiPanelSkillDetailsInfo:OnDisable() self.Clicker:Reset() self:ResetLongPressData() end function XUiPanelSkillDetailsInfo:OnBtnSkillPointClick() XLuaUiManager.Open("UiTip", XDataCenter.ItemManager.ItemId.SkillPoint) end function XUiPanelSkillDetailsInfo:OnBtnCoinClick() local itemId = XDataCenter.ItemManager.ItemId.Coin if itemId == XDataCenter.ItemManager.ItemId.FreeGem then XLuaUiManager.Open("UiPurchase", XPurchaseConfigs.TabsConfig.HK) elseif itemId == XDataCenter.ItemManager.ItemId.HongKa then if XLuaUiManager.IsUiShow("UiMain") then XUiHelper.RecordBuriedSpotTypeLevelOne(XGlobalVar.BtnBuriedSpotTypeLevelOne.BtnUiMainBtnAddFreeGem) end XLuaUiManager.Open("UiPurchase", XPurchaseConfigs.TabsConfig.Pay) elseif itemId == XDataCenter.ItemManager.ItemId.DoubleTower then --展示物品详情 local item = XDataCenter.ItemManager.GetItem(itemId) local data = { Id = itemId, Count = item ~= nil and tostring(item.Count) or "0" } if self.QueryFunc then data = XTool.Clone(XGoodsCommonManager.GetGoodsShowParamsByTemplateId(itemId)) data.IsTempItemData = true data.Count = self.QueryFunc(item) or data.Count data.Description = XGoodsCommonManager.GetGoodsDescription(itemId) data.WorldDesc = XGoodsCommonManager.GetGoodsWorldDesc(itemId) end XLuaUiManager.Open("UiTip", data, self.HideSkipBtn) elseif itemId == XDataCenter.PivotCombatManager.GetActivityCoinId() or itemId == XDataCenter.ItemManager.ItemId.SkillPoint or itemId == XMazeConfig.GetTicketItemId() then local id = itemId XLuaUiManager.Open("UiTip", id) elseif not XDataCenter.ItemManager.GetBuyAssetTemplate(itemId, 1, true) then -- 没有购买数据的话就打开详情 local id = itemId XLuaUiManager.Open("UiTip", id) else XUiManager.OpenBuyAssetPanel(itemId) end end return XUiPanelSkillDetailsInfo