local Object = CS.UnityEngine.Object local Vector3 = CS.UnityEngine.Vector3 local V3O = Vector3.one ---@class XUiDormFieldGuide : XLuaUi ---@field DrdPart UnityEngine.UI.Dropdown ---@field TogCheck UnityEngine.UI.Toggle local XUiDormFieldGuide = XLuaUiManager.Register(XLuaUi, "UiDormFieldGuide") local XUiDormFieldGuideListItem = require("XUi/XUiDormFieldGuide/XUiDormFieldGuideListItem") local XUiDormFieldGuideTab = require("XUi/XUiDormFieldGuide/XUiDormFieldGuideTab") local TextManager = CS.XTextManager local Next = next function XUiDormFieldGuide:OnAwake() XTool.InitUiObject(self) self.TabDicIndex = {} self.TabObs = {} self.TabObs[1] = self.BtnTab1 self.FilterTypeId = 0 self.FilterSuitIdMap = {} self.CheckHasDrawing = false --是否需要检测有图纸 self:InitUI() self:InitCB() end --- ---@param suitId number 套装Id ---@param isRefit boolean 是否是改装 ---@param closeCb function 界面关闭回调 -------------------------- function XUiDormFieldGuide:OnStart(suitId, isRefit, selectId, selectCb) self.HaveFurIds = XDataCenter.DormManager.FurnitureUnlockList or {} self.FileGuideData = XFurnitureConfigs.GetFieldGuideDatas() self.SelectCb = selectCb self.IsRefit = isRefit self.DefaultSelectId = selectId self:InitList() self:InitEnterCfg() local id = suitId if not suitId and self.TabTypeCfg[1] then id = self.TabTypeCfg[1].Id end local index = 1 if id and self.TabDicIndex[id] then index = self.TabDicIndex[id] end self.Tabgroup:SelectIndex(index) self:CenterToGrid(index) self.PanelCheck.gameObject:SetActiveEx(isRefit) self.PanelCount.gameObject:SetActiveEx(not isRefit) end function XUiDormFieldGuide:CenterToGrid(index) local normalizedPosition local count = self.ScrollView.content.transform.childCount if index > count / 2 then normalizedPosition = (index + 1) / count else normalizedPosition = (index - 1) / count end self.ScrollView.verticalNormalizedPosition = math.max(0, math.min(1, (1 - normalizedPosition))) end function XUiDormFieldGuide:InitEnterCfg() self.TabTypeCfg = {} local cfg = XFurnitureConfigs.GetFurnitureSuitTemplates() ---@param template XTable.XTableFurnitureSuit local check = function(template) if self.IsRefit then if template.IsIgnoreWhenCreate == 1 then self.FilterSuitIdMap[template.Id] = true return false elseif template.Id == XFurnitureConfigs.BASE_SUIT_ID then return false else return true end else return self.FileGuideData[template.Id] and true or false end end for _, v in pairs(cfg) do --改装不显示基础套 if check(v) then table.insert(self.TabTypeCfg, v) end end self:CreateTypeItems(self.TabTypeCfg) end function XUiDormFieldGuide:CreateTypeItems(tabTypeCfg) if self.PanelTab then local index = 1 for k, v in pairs(tabTypeCfg) do local obj = self.TabObs[k] if not obj then obj = Object.Instantiate(self.BtnTab1) obj.transform:SetParent(self.PanelTab.transform, false) obj.transform.localScale = V3O table.insert(self.TabObs, obj) end self.TabDicIndex[v.Id] = index index = index + 1 obj.gameObject:SetActive(true) local uiTab = XUiDormFieldGuideTab.New(obj) uiTab:SetName(v.SuitName) local suitBgmInfo = (not self.IsRefit) and XDormConfig.GetDormSuitBgmInfo(v.Id) or nil uiTab:SetSuitBgm(suitBgmInfo) end self.Tabgroup = self.PanelTab:GetComponent("XUiButtonGroup") self.Tabgroup:Init(self.TabObs, function(tab) self:TabSkip(tab) end) end end function XUiDormFieldGuide:TabSkip(tab) if tab == self.PreSeleTab then return end self.PreSeleTab = tab local cfg = self.TabTypeCfg[tab] self:OnClickEnterSetListData(cfg.Id) self:PlayAnimation("QieHuan") local suitBgmInfo = (not self.IsRefit) and XDormConfig.GetDormSuitBgmInfo(cfg.Id) or nil self.MusicText.gameObject:SetActiveEx(suitBgmInfo ~= nil) if suitBgmInfo then self.MusicText.text = string.format(CS.XGame.ClientConfig:GetString("DormSuitBgmDesc"), suitBgmInfo.SuitNum, "", suitBgmInfo.Name) end end function XUiDormFieldGuide:InitList() self.PanelItemCommon.gameObject:SetActiveEx(not self.IsRefit) self.PanelItemRefit.gameObject:SetActiveEx(self.IsRefit) self.PanelBtn.gameObject:SetActiveEx(self.IsRefit) local target = self.IsRefit and self.PanelItemRefit or self.PanelItemCommon self.DynamicTable = XDynamicTableNormal.New(target) self.DynamicTable:SetProxy(XUiDormFieldGuideListItem) self.DynamicTable:SetDelegate(self) --self.GridItem.gameObject:SetActiveEx(false) ---@type XDynamicTableNormal local impl = self.DynamicTable:GetImpl() if not XTool.UObjIsNil(impl.Grid) then impl.Grid.gameObject:SetActiveEx(false) end end -- [监听动态列表事件] function XUiDormFieldGuide:OnDynamicTableEvent(event, index, grid) if event == DYNAMIC_DELEGATE_EVENT.DYNAMIC_GRID_INIT then grid:Init(self) elseif event == DYNAMIC_DELEGATE_EVENT.DYNAMIC_GRID_ATINDEX then local data = self.ListData[index] local selectId = self.SelectFurniture and self.SelectFurniture.Id or self.DefaultSelectId grid:OnRefresh(data, self.HaveFurIds, self.IsRefit, selectId) elseif event == DYNAMIC_DELEGATE_EVENT.DYNAMIC_GRID_TOUCHED then local data = self.ListData[index] if self.IsRefit then if self.LastGrid then self.LastGrid:SetSelect(false) end local lastId = self.LastGrid and self.LastGrid.Id or -1 if grid.Id == lastId then grid:SetSelect(false) self.SelectFurniture = nil else grid:SetSelect(true) self.SelectFurniture = data end self.LastGrid = grid else XLuaUiManager.Open("UiDormFieldGuideDes", data) end elseif event == DYNAMIC_DELEGATE_EVENT.DYNAMIC_GRID_RELOAD_COMPLETED then local selectId = self.SelectFurniture and self.SelectFurniture.Id or self.DefaultSelectId if not XTool.IsNumberValid(selectId) then return end local grids = self.DynamicTable:GetGrids() for _, tempGrid in pairs(grids) do if tempGrid.Id == selectId then self.LastGrid = tempGrid break end end end end function XUiDormFieldGuide:OnClickEnterSetListData(t) if not t then return end self.SelectFurniture = nil self.PreSeleId = t local data = self.FileGuideData[t] or self:GetAllGuideData() data = self:FilterGuideData(data) local isEmpty = XTool.IsTableEmpty(data) if not isEmpty then if self.IsRefit then table.sort(data, self.SortOnRefitCb) else table.sort(data, self.SortFileGuildCb) end end local showEmpty = self.IsRefit and isEmpty self.PanelEmpty.gameObject:SetActiveEx(showEmpty) self.PanelEmptyRefit.gameObject:SetActiveEx(showEmpty) self:SetMaterials(data) self.ListData = data local startIndex = 1 if self.DefaultSelectId then for index, temp in pairs(data) do if temp.Id == self.DefaultSelectId then self.SelectFurniture = temp self.DefaultSelectId = nil startIndex = index break end end end self.DynamicTable:SetDataSource(data) self.DynamicTable:ReloadDataASync(startIndex) end function XUiDormFieldGuide:FilterGuideData(data) --正常图鉴不需要剔除 local list = {} data = data or {} for _, item in ipairs(data) do if self:CheckFurnitureFilter(item) then table.insert(list, item) end end return list end ---@param template XTable.XTableFurniture function XUiDormFieldGuide:CheckFurnitureFilter(template) if not template then return false end --筛选家具类型 && 类型不一致 if self.FilterTypeId ~= 0 and template.TypeId ~= self.FilterTypeId then return false end --仅显示有图纸的家具 && 拥有图纸 if self.CheckHasDrawing and not self:CheckHasDraw(template.Id) then return false end --改装 && 基础套 && 未拥有 if self.IsRefit and (template.SuitId == XFurnitureConfigs.BASE_SUIT_ID or self.FilterSuitIdMap[template.SuitId]) then return false end return true end function XUiDormFieldGuide:GetAllGuideData() if self.AllGuideData then return self.AllGuideData end local list = {} for _, data in pairs(self.FileGuideData) do for _, itemData in ipairs(data) do table.insert(list, itemData) end end self.AllGuideData = list return list end function XUiDormFieldGuide:SetMaterials(data) local total = 0 local count = 0 local f = false for _, v in pairs(data) do total = total + 1 if not f and self.HaveFurIds[v.Id] then count = count + 1 else f = true end end if count ~= self.CurHaveCount or total ~= self.CurTotalCount then self.CurHaveCount = count self.CurTotalCount = total self.TxtMaterials.text = TextManager.GetText("DormFieldGuildeCountText", count, total) end end function XUiDormFieldGuide:Fielguildsortfun(a, b) if self.HaveFurIds[a.Id] and not self.HaveFurIds[b.Id] then return true end if not self.HaveFurIds[a.Id] and self.HaveFurIds[b.Id] then return false end return a.Id > b.Id end function XUiDormFieldGuide:SortOnRefit(a, b) local ownA = self.HaveFurIds[a.Id] and true or false local ownB = self.HaveFurIds[b.Id] and true or false if ownA ~= ownB then return ownA end if a.TypeId ~= b.TypeId then local typeA = XFurnitureConfigs.GetFurnitureTypeById(a.TypeId) local typeB = XFurnitureConfigs.GetFurnitureTypeById(b.TypeId) return typeA.Priority < typeB.Priority end return a.Id < b.Id end function XUiDormFieldGuide:InitUI() self.AssetPanel = XUiPanelAsset.New(self, self.PanelAsset, XDataCenter.ItemManager.ItemId.DormCoin, XDataCenter.ItemManager.ItemId.FurnitureCoin) self.SortOnRefitCb = handler(self, self.SortOnRefit) self.SortFileGuildCb = handler(self, self.Fielguildsortfun) self.TogCheck.isOn = self.CheckHasDrawing self:InitDropDown() self:AddListener() self.PanelEmptyRefit = self.PanelItemRefit.transform:Find("Viewport/PanelEmpty") end function XUiDormFieldGuide:InitCB() self.BtnConfirm.CallBack = function() self:OnBtnConfirmClick() end end function XUiDormFieldGuide:InitDropDown() self.DrdPart:ClearOptions() local op = CS.UnityEngine.UI.Dropdown.OptionData() op.text = XUiHelper.GetText("FurnitureAllTypeText") self.DrdPart.options:Add(op) local index = 0 self.Index2TypeId = { [index] = 0 } local list = XFurnitureConfigs.GetFurnitureTemplateTypeList() for _, template in ipairs(list) do index = index + 1 self.Index2TypeId[index] = template.Id op = CS.UnityEngine.UI.Dropdown.OptionData() op.text = template.CategoryName self.DrdPart.options:Add(op) end self.DrdPart.value = 0 self.DrdPart.onValueChanged:AddListener(function() self:OnChooseFurnType() end) end function XUiDormFieldGuide:AddListener() self.OnBtnMainUIClickCb = function() self:OnBtnMainUIClick() end self.OnBtnReturnClickCb = function() self:OnBtnReturnClick() end self.OnBtnHelpClickCb = function() self:OnBtnHelpClick() end self:RegisterClickEvent(self.BtnMainUi, self.OnBtnMainUIClickCb) self:RegisterClickEvent(self.BtnBack, self.OnBtnReturnClickCb) self.TogCheck.onValueChanged:AddListener(function() self:OnToggleCheckDrawing() end) end function XUiDormFieldGuide:OnBtnMainUIClick() XLuaUiManager.RunMain() end function XUiDormFieldGuide:OnBtnReturnClick() self:Close() end function XUiDormFieldGuide:OnChooseFurnType() self.FilterTypeId = self.Index2TypeId[self.DrdPart.value] local cfg = self.TabTypeCfg[self.PreSeleTab] self:OnClickEnterSetListData(cfg.Id) end function XUiDormFieldGuide:OnToggleCheckDrawing() self.CheckHasDrawing = self.TogCheck.isOn local cfg = self.TabTypeCfg[self.PreSeleTab] self:OnClickEnterSetListData(cfg.Id) end function XUiDormFieldGuide:CheckHasDraw(furnitureId) local template = XFurnitureConfigs.GetFurnitureTemplateById(furnitureId) if not template then return false end local picId = template.PicId --无需图纸 if not XTool.IsNumberValid(picId) then return true end return XDataCenter.ItemManager.GetCount(picId) > 0 end function XUiDormFieldGuide:OnBtnConfirmClick() self:Close() if self.SelectCb then self.SelectCb(self.TabTypeCfg[self.PreSeleTab], self.SelectFurniture) end end