---@class XUiPanelRefitNew ---@field TogCheck UnityEngine.UI.Toggle ---@field InputFunitueCount UnityEngine.UI.InputField local XUiPanelRefitNew = XClass(nil, "XUiPanelRefitNew") local EnoughColor = CS.UnityEngine.Color(0.0, 0.0, 0.0) local NotEnoughColor = CS.UnityEngine.Color(1.0, 0.0, 0.0) local InputEnoughColor = XUiHelper.Hexcolor2Color("0E70BDFF") local InputNotEnoughColor = XUiHelper.Hexcolor2Color("FF0000FF") local BlackColorStr = "000000CC" local RedColorStr = "FF0000FF" function XUiPanelRefitNew:Ctor(ui) XTool.InitUiObjectByUi(self, ui) self:InitUi() self:InitCb() end function XUiPanelRefitNew:InitUi() --允许自动使用非基础家具用于改装 self.AllowNonBasic = false self.TogCheck.isOn = self.AllowNonBasic --改装数量 self.RefitCount = 0 self.InputFunitueCount.text = tostring(self.RefitCount) --预览家具 self.PreviewFurnitureId = 0 --选中套装 self.SelectSuitId = nil --选中基础套装 self.FurnitureIds = {} self.FurnitureIdsCache = {} --玩家手动选择 self.ManualFurnitureIds = {} --图标固定 self.ImgDrawingIcon:SetRawImage(XDataCenter.ItemManager.GetItemIcon(XDataCenter.ItemManager.ItemId.FurnitureCoin)) self.OnSelectPreviewCb = handler(self, self.OnSelectPreview) self.OnSelectFurnitureCb = handler(self, self.OnSelectFurnitureIds) self.OnSortFurnitureBaseCb = handler(self, self.OnSortFurnitureBase) self.OnSortFurnitureCb = handler(self, self.OnSortFurniture) self.OnRequestCb = handler(self, self.OnRequest) self.JiantouEnable = self.Transform:Find("Panel/JiantouEnable") self.JiantouDisable = self.Transform:Find("Panel/JiantouDisable") end function XUiPanelRefitNew:InitCb() self.TogCheck.onValueChanged:AddListener(function() self:OnTogCheckClick() end) self.InputFunitueCount.onValueChanged:AddListener(function(text) self:OnInputChanged(text) end) self.BtnAdd.CallBack = function() self:OnBtnAddClick() end self.BtnReduce.CallBack = function() self:OnBtnReduceClick() end self.BtnMax.CallBack = function() self:OnBtnMaxClick() end self.BtnMin.CallBack = function() self:OnBtnMinClick() end self.BtnConfirm.CallBack = function() self:OnBtnConfirmClick() end self.BtnPreviewFurniture.CallBack = function() self:OnBtnPreviewFurnitureClick() end self.BtnDrawing.CallBack = function() self:OnBtnDrawingClick() end self.BtnSelectFurnitureNo.CallBack = function() self:OnSelectFurnitureClick() end self.BtnChoice.CallBack = function() self:OnSelectFurnitureClick() end self.BtnSelectFurniture.CallBack = function() self:OnSelectFurnitureClick() end self.BtnChange.CallBack = function() self:OnBtnPreviewFurnitureClick() end end function XUiPanelRefitNew:Init() end function XUiPanelRefitNew:SetPanelActive(value) self.GameObject:SetActiveEx(value) if not value then return end self:RefreshView() end function XUiPanelRefitNew:RefreshView() --家具制作改版前放在制作队列没有收集的家具列表 local checkList = XDataCenter.FurnitureManager.GetFurnitureCreateList() if not XTool.IsTableEmpty(checkList) then XDataCenter.FurnitureManager.OnResponseCreateFurniture(checkList) end self:RefreshPreviewFurniture() end --- 刷新家具 -------------------------- function XUiPanelRefitNew:RefreshPreviewFurniture() local isSelect = self:IsSelectPreview() self.BtnPreviewFurniture.gameObject:SetActiveEx(not isSelect) self.PanelPreviewIcon.gameObject:SetActiveEx(isSelect) if isSelect then local template = XFurnitureConfigs.GetFurnitureTemplateById(self.PreviewFurnitureId) self.ImgPreviewItemIcon:SetRawImage(template.Icon) self.TxtPreviewScore.text = template.Name end self.PanelTxtresult.gameObject:SetActiveEx(isSelect) self:RefreshEdit() end --- 刷新材料 -------------------------- function XUiPanelRefitNew:RefreshMaterial() self:RefreshFurniture() self:RefreshDrawing() end --消耗家具 function XUiPanelRefitNew:RefreshFurniture() local isSelect = self:IsSelectPreview() --self:AutoSelectFurnitureIds() local selectCount = #self.FurnitureIds local isEmpty = not isSelect or selectCount <= 0 self.BtnSelectFurnitureNo.gameObject:SetActiveEx(isEmpty) self.BtnSelectFurnitureNo:SetDisable(not isSelect, isSelect) self.BtnChoice.gameObject:SetActiveEx(not isEmpty) self.BtnSelectFurniture.gameObject:SetActiveEx(not isEmpty) if not isEmpty then local selectNonBasic = self:IsSelectNonBasicSuit() self.BtnSelectFurniture:ShowTag(selectNonBasic) if selectNonBasic then XUiManager.TipText("FurnitureContainNonBasic") end local colorStr = self.RefitCount > selectCount and RedColorStr or BlackColorStr local btnTxt = XUiHelper.GetText("DormSelectHint", colorStr, self.RefitCount) self.BtnSelectFurniture:SetNameByGroup(1, btnTxt) local scoreTxt = "" local icon if selectCount == 1 then local furniture = XDataCenter.FurnitureManager.GetFurnitureById(self.FurnitureIds[1]) local template = XFurnitureConfigs.GetFurnitureTemplateById(furniture:GetConfigId()) icon = template.Icon scoreTxt = XUiHelper.GetText("FurnitureRefitScore", furniture:GetScore()) else icon = XFurnitureConfigs.DefaultIcon end self.BtnSelectFurniture:SetNameByGroup(0, scoreTxt) self.BtnSelectFurniture:SetRawImage(icon) end end --图纸 function XUiPanelRefitNew:RefreshDrawing() local isSelect = self:IsSelectPreview() self.BtnSelectDrawing:SetDisable(not isSelect, isSelect) self.BtnDrawing.gameObject:SetActiveEx(isSelect) if isSelect then local template = XFurnitureConfigs.GetFurnitureTemplateById(self.PreviewFurnitureId) local picId = template.PicId local validPicId = XTool.IsNumberValid(picId) local needCount, ownCount = 0, 0 self.BtnSelectDrawing.gameObject:SetActiveEx(validPicId) self.BtnDrawing.gameObject:SetActiveEx(validPicId) if validPicId then needCount = template.PicNum * self.RefitCount ownCount = XDataCenter.ItemManager.GetCount(picId) self.BtnSelectDrawing:SetRawImage(XDataCenter.ItemManager.GetItemIcon(picId)) end self.BtnSelectDrawing:SetNameAndColorByGroup(0, "X"..needCount, ownCount >= needCount and EnoughColor or NotEnoughColor) end end --编辑栏 function XUiPanelRefitNew:RefreshEdit() self:RefreshMaterial() self:RefreshCount() end --数量 function XUiPanelRefitNew:RefreshCount() local isSelect = self:IsSelectPreview() local cost = self:GetCostMoney() local own = XDataCenter.ItemManager.GetCount(XDataCenter.ItemManager.ItemId.FurnitureCoin) local enough = own >= cost self.TxtConsumeCount.text = cost self.TxtConsumeCount.color = enough and EnoughColor or NotEnoughColor self.MaxRefit = self:GetMaxRefit() local materialEnough = self.RefitCount <= self.MaxRefit self.InputFunitueCount.interactable = isSelect self.InputFunitueCount.text = tostring(self.RefitCount) self.InputFunitueCount.textComponent.color = (enough and materialEnough) and InputEnoughColor or InputNotEnoughColor self.CostEnough = enough self.MaterialEnough = materialEnough local add = not (isSelect and enough) local reduce = not (isSelect and self.RefitCount > 1) self.BtnAdd:SetDisable(add) self.BtnReduce:SetDisable(reduce) self.BtnMax:SetDisable(add) self.BtnMin:SetDisable(reduce) local disable = add or self.RefitCount < 1 self.BtnConfirm:SetDisable(disable, not disable) local enable = isSelect and enough and materialEnough self.JiantouEnable.gameObject:SetActiveEx(enable) self.JiantouDisable.gameObject:SetActiveEx(not enable) end ---改装效果 function XUiPanelRefitNew:RefreshRandomEffect() local valid = XTool.IsNumberValid(self.PreviewFurnitureId) self.PanelTxtresult.gameObject:SetActiveEx(valid) if not valid then return end local template = XFurnitureConfigs.GetFurnitureTemplateById(self.PreviewFurnitureId) local hasRandom = template.RandomGroupId > 0 self.PanelTxtresult.gameObject:SetActiveEx(hasRandom) if hasRandom then local groupIntroduce = XFurnitureConfigs.GetGroupRandomIntroduce(template.RandomGroupId) local minLevel = self:GetMinFurnitureLevel() self.TxtResult.text = XFurnitureConfigs.FurnitureAttrLevel[minLevel] local buffer = "" local introduce = {} local desc, level = nil, nil for _, v in pairs(groupIntroduce) do for _, v1 in pairs(v) do if minLevel > v1.QualityType then break end if not desc then desc = XFurnitureConfigs.GetAdditionalRandomEntry(v1.Id, true) .. "\n" end desc = desc .. string.format("%s\n", v1.Introduce) level = v1.QualityType end if level then table.insert(introduce, { Level = level, Desc = desc }) end desc, level = nil, nil end table.sort(introduce, function(a, b) return a.Level < b.Level end) for _, v in ipairs(introduce) do buffer = string.format("%s%s\n",buffer, v.Desc) end self.TxtPreviewSpecial.text = buffer end end function XUiPanelRefitNew:OnTogCheckClick() self.AllowNonBasic = self.TogCheck.isOn self:RefreshEdit() end function XUiPanelRefitNew:OnInputChanged(text) if not self:IsSelectPreview() then return end if string.IsNilOrEmpty(self.InputFunitueCount.text) then self.InputFunitueCount.text = tostring(self.RefitCount) return end self.RefitCount = tonumber(self.InputFunitueCount.text) self:AutoSelectFurnitureIds() self:RefreshEdit() end function XUiPanelRefitNew:OnBtnAddClick() if not self:IsSelectPreview() then return end self.RefitCount = self.RefitCount + 1 self:AutoSelectFurnitureIds() self:RefreshEdit() end function XUiPanelRefitNew:OnBtnReduceClick() if not self:IsSelectPreview() then return end if self.RefitCount < 1 then return end self.RefitCount = self.RefitCount - 1 self:AutoSelectFurnitureIds() self:RefreshEdit() end function XUiPanelRefitNew:OnBtnMaxClick() if not self:IsSelectPreview() then return end self.RefitCount = self.MaxRefit < 0 and 1 or self.MaxRefit self:AutoSelectFurnitureIds() self:RefreshEdit() end function XUiPanelRefitNew:OnBtnMinClick() if not self:IsSelectPreview() then return end if self.RefitCount == 1 then return end self.RefitCount = 1 self:AutoSelectFurnitureIds() self:RefreshEdit() end function XUiPanelRefitNew:OnBtnConfirmClick() if not self:IsSelectPreview() then XUiManager.TipText("FurnitureChooseFurniture") return end if not self.CostEnough then XUiManager.TipText("FurnitureZeroCoin") return end if not self.MaterialEnough then XUiManager.TipText("FurnitureOrDrawingNotEnough") return end local request = function() local template = XFurnitureConfigs.GetFurnitureTemplateById(self.PreviewFurnitureId) local map = { [template.PicId] = self.FurnitureIds } local tempPreviewId = self.PreviewFurnitureId XDataCenter.FurnitureManager.RemouldFurniture(map, self.OnRequestCb, function(ids) self.PreviewFurnitureId = tempPreviewId self.FurnitureIds = ids self:RefreshPreviewFurniture() self:OnBtnConfirmClick() end) end if self:IsSelectNonBasicSuit() then local title = XUiHelper.GetText("TipTitle") local content = XUiHelper.GetText("FurnitureContainNonBasicTip") XUiManager.DialogTip(title, content, nil, nil, request) else request() end end function XUiPanelRefitNew:OnBtnPreviewFurnitureClick() XLuaUiManager.Open("UiDormFieldGuide", self.SelectSuitId, true, self.PreviewFurnitureId, self.OnSelectPreviewCb) end function XUiPanelRefitNew:OnBtnDrawingClick() if not self:IsSelectPreview() then XUiManager.TipText("FurnitureChooseFurniture") return end local template = XFurnitureConfigs.GetFurnitureTemplateById(self.PreviewFurnitureId) local itemId = template.PicId local own = XDataCenter.ItemManager.GetCount(itemId) local buyCount = own >= self.RefitCount and 1 or self.RefitCount - own XDataCenter.FurnitureManager.JumpToBuyDrawing(self.PreviewFurnitureId, buyCount, function() self:RefreshEdit() end) end function XUiPanelRefitNew:OnSelectFurnitureClick() if not XTool.IsNumberValid(self.PreviewFurnitureId) then return end local typeId = XFurnitureConfigs.GetFurnitureTemplateById(self.PreviewFurnitureId).TypeId -- 策划需要玩家手动选择时也能选中目标类型的家具 --XLuaUiManager.Open("UiDormBagChoice", self.FurnitureIds, typeId, 0, self.OnSelectFurnitureCb, { [self.PreviewFurnitureId] = true }) XLuaUiManager.Open("UiDormBagChoice", self.FurnitureIds, typeId, 0, self.OnSelectFurnitureCb) end --- 选中预览家具回调 ---@param suitCfg XTable.XTableFurnitureSuit ---@param furnitureCfg XTable.XTableFurniture -------------------------- function XUiPanelRefitNew:OnSelectPreview(suitCfg, furnitureCfg) self.SelectSuitId = suitCfg and suitCfg.Id or XFurnitureConfigs.FURNITURE_SUIT_CATEGORY_ALL_ID local previewId = furnitureCfg and furnitureCfg.Id or 0 if self.PreviewFurnitureId ~= previewId then self.ManualFurnitureIds = {} end self.PreviewFurnitureId = previewId self.RefitCount = XTool.IsNumberValid(self.PreviewFurnitureId) and 1 or 0 self:AutoSelectFurnitureIds() self:RefreshPreviewFurniture() self:RefreshRandomEffect() end --- 选中材料家具回调 ---@param furnitureIds number[] 家具Id列表 -------------------------- function XUiPanelRefitNew:OnSelectFurnitureIds(furnitureIds) self.FurnitureIds = furnitureIds self.FurnitureIdsCache = furnitureIds self.ManualFurnitureIds = furnitureIds self.RefitCount = #furnitureIds self.TogCheck.isOn = self:IsSelectNonBasicSuit() self:RefreshEdit() self:RefreshRandomEffect() end --自动填充 function XUiPanelRefitNew:AutoSelectFurnitureIds() if not XTool.IsNumberValid(self.PreviewFurnitureId) then return end --置空选中 self.FurnitureIds = XTool.Clone(self.ManualFurnitureIds) self.FurnitureIdsCache = XTool.Clone(self.ManualFurnitureIds) -- 玩家选中大于需要制作数量 local count = #self.FurnitureIds if count >= self.RefitCount then for i = count, self.RefitCount + 1, -1 do table.remove(self.FurnitureIds, i) end return end local template = XFurnitureConfigs.GetFurnitureTemplateById(self.PreviewFurnitureId) local typeIds = { template.TypeId } --自动填充时过滤目标家具 local furnitureIds = XDataCenter.FurnitureManager.GetFurnitureCategoryIdsNoSort(typeIds, nil, nil, true, false, true, (not self.AllowNonBasic), { [self.PreviewFurnitureId] = true }) if not XTool.IsTableEmpty(furnitureIds) then local sortFunc = self.AllowNonBasic and self.OnSortFurnitureCb or self.OnSortFurnitureBaseCb table.sort(furnitureIds, sortFunc) end self.FurnitureIdsCache = appendArray(self.FurnitureIdsCache, furnitureIds) for i = count + 1, self.RefitCount do table.insert(self.FurnitureIds, furnitureIds[i]) end end --材料家具排序-任意套装 function XUiPanelRefitNew:OnSortFurniture(furnitureIdA, furnitureIdB) local furnitureA = XDataCenter.FurnitureManager.GetFurnitureById(furnitureIdA) local furnitureB = XDataCenter.FurnitureManager.GetFurnitureById(furnitureIdB) local isBaseA = furnitureA and furnitureA:CheckIsBaseFurniture() or false local isBaseB = furnitureB and furnitureB:CheckIsBaseFurniture() or false --基础套优先 if isBaseA ~= isBaseB then return isBaseA end local scoreA = furnitureA and furnitureA:GetScore() or 0 local scoreB = furnitureB and furnitureB:GetScore() or 0 if scoreA ~= scoreB then if isBaseA then --都是基础套时,分数大的优先 return scoreA > scoreB else --否则分数小的优先 return scoreA < scoreB end end return furnitureIdA < furnitureIdB end --材料家具排序-基础套装 function XUiPanelRefitNew:OnSortFurnitureBase(furnitureIdA, furnitureIdB) local furnitureA = XDataCenter.FurnitureManager.GetFurnitureById(furnitureIdA) local furnitureB = XDataCenter.FurnitureManager.GetFurnitureById(furnitureIdB) local scoreA = furnitureA and furnitureA:GetScore() or 0 local scoreB = furnitureB and furnitureB:GetScore() or 0 if scoreA ~= scoreB then return scoreA > scoreB end return furnitureIdA < furnitureIdB end function XUiPanelRefitNew:OnRequest(furnitureIds) self.PreviewFurnitureId = 0 self.RefitCount = 0 self.ManualFurnitureIds = {} self:RefreshPreviewFurniture() end function XUiPanelRefitNew:IsSelectPreview() return XTool.IsNumberValid(self.PreviewFurnitureId) end function XUiPanelRefitNew:IsSelectFurniture() return not XTool.IsTableEmpty(self.FurnitureIds) end function XUiPanelRefitNew:IsSelectNonBasicSuit() for _, furnitureId in pairs(self.FurnitureIds) do if XTool.IsNumberValid(furnitureId) then local furniture = XDataCenter.FurnitureManager.GetFurnitureById(furnitureId) if furniture and furniture:GetSuitId() ~= XFurnitureConfigs.BASE_SUIT_ID then return true end end end return false end function XUiPanelRefitNew:GetCostMoney() local cost = 0 for _, furnitureId in pairs(self.FurnitureIds) do local furniture = XDataCenter.FurnitureManager.GetFurnitureById(furnitureId) local price = 0 if furniture then local template = XFurnitureConfigs.GetFurnitureTemplateById(furniture:GetConfigId()) price = template.MoneyNum end cost = cost + price end return cost end function XUiPanelRefitNew:GetMinFurnitureLevel() local min = XFurnitureConfigs.FurnitureAttrLevelId.LevelS for _, furnitureId in pairs(self.FurnitureIds) do local furniture = XDataCenter.FurnitureManager.GetFurnitureById(furnitureId) if furniture then min = math.min(furniture:GetFurnitureTotalAttrLevel(), min) end end return min end --最大改造个数 function XUiPanelRefitNew:GetMaxRefit() if not self:IsSelectPreview() then return 0 end local template = XFurnitureConfigs.GetFurnitureTemplateById(self.PreviewFurnitureId) local picId = template.PicId local ownCount = XDataCenter.ItemManager.GetCount(picId) --现在拥有的图纸能制作的个数 local createCount = math.floor(ownCount / template.PicNum) local freeCount = 0 for _, furnitureId in ipairs(self.FurnitureIdsCache) do local furniture = XDataCenter.FurnitureManager.GetFurnitureById(furnitureId) if not furniture then goto continue end --允许使用非基础家具 if self.AllowNonBasic then freeCount = freeCount + 1 else if furniture:CheckIsBaseFurniture() then freeCount = freeCount + 1 end end if freeCount >= createCount then break end :: continue :: end return math.min(freeCount, createCount) end return XUiPanelRefitNew