-- 家具摆放界面 local XUiFurnitureReform = XLuaUiManager.Register(XLuaUi, "UiFurnitureReform") local XUiPanelMenu = require("XUi/XUiDorm/XUiFurnitureReform/XUiPanelMenu") local XUiFurnitureAttrGrid = require("XUi/XUiDorm/XUiFurnitureReform/XUiFurnitureAttrGrid") local FurnitureCache = {} local delayRefreshTimer = nil local delayUpdateScoresTimer = nil function XUiFurnitureReform:OnAwake() self.SuitCFG = XFurnitureConfigs.GetFurnitureSuitTemplates() self.RefreshFurnitureList = function() self:RefreshFurntiureReform() end XEventManager.AddEventListener(XEventId.EVENT_FURNITURE_ON_MODIFY, self.RefreshFurnitureList, self) self.BtnFilter.CallBack = function() self:OnBtnFilterClick() end self.BtnBack.CallBack = function() self:OnBtnBackClick() end self.BtnRecover.CallBack = function() self:OnBtnRecoverClick() end self.BtnUndo.CallBack = function() self:OnBtnUndoClick() end self.BtnSaveAndQuit.CallBack = function() self:OnBtnSaveClick() end self.BtnExplain.CallBack = function() self:OnBtnExplainClick() end self.BtnFilterBack.CallBack = function() self:OnBtnFilterBackClick() end self:RegisterClickEvent(self.BtnDrdSort, self.OnBtnShowDormAttr) end function XUiFurnitureReform:OnStart(roomId, roomType) self.PanelMenu.gameObject:SetActive(false) self.MenuPanel = XUiPanelMenu.New(self, self.PanelMenu) self.MainPanelGo = self.Transform:Find("SafeAreaContentPane").gameObject XHomeDormManager.SetClickFurnitureCallback(function(furniture) self:ShowFurnitureMenu(furniture, false, false) end) XHomeDormManager.ReformRoom(roomId, true) XHomeCharManager.HideAllCharacter() self.CameraController = XHomeSceneManager.GetSceneCameraController() if not XTool.UObjIsNil(self.CameraController) then self.OldCameraDistance = self.CameraController.Distance self.OldCameraTarget = self.CameraController.TargetObj self.TargetAngleX = self.CameraController.TargetAngleX self.TargetAngleY = self.CameraController.TargetAngleY XCameraHelper.SetCameraTarget(self.CameraController, self.OldCameraTarget, 13) end self.RoomId = roomId self.RoomType = roomType self.IsMyRoom = roomType == XDormConfig.DormDataType.Self self.GridSuitPool = {} self.GridBaseTypePool = {} self.GridSubTypePool = {} self.BtnTabGoList = {} self.PanelFilterGameObject = self.PanelFilter.gameObject self.CurrentBaseTypeId = nil self.CurrentSubTypeId = nil self.CurrentSuitId = 1--by default self.DefaultBaseType = CS.XGame.ClientConfig:GetInt("UiFurnitureReformDefaultBaseType") self:Init() end function XUiFurnitureReform:OnEnable() XDataCenter.FurnitureManager.SetInRefeform(true) end function XUiFurnitureReform:OnDisable() XHomeDormManager.SetClickFurnitureCallback(nil) XHomeDormManager.AttachSurfaceToRoom() XHomeDormManager.ReformRoom(self.RoomId, false) XDataCenter.FurnitureManager.SetInRefeform(false) end function XUiFurnitureReform:OnHideBlockGrids() if self.CurFurniture then XHomeDormManager.OnHideBlockGrids(self.CurFurniture.HomePlatType, self.CurFurniture.RotateAngle) end end function XUiFurnitureReform:OnBtnCancelClick() if self.RoomId then XHomeDormManager.RevertRoom(self.RoomId) self:CloseFurnitureReform() end end function XUiFurnitureReform:OnBtnBackClick() if self.RoomId and XHomeDormManager.IsNeedSave(self.RoomId, self.RoomType) then XUiManager.DialogTip(CS.XTextManager.GetText("FurnitureTips"), CS.XTextManager.GetText("FurnitureIsSave"), XUiManager.DialogType.Normal, function() XHomeDormManager.RevertRoom(self.RoomId) self:CloseFurnitureReform() end, function() XHomeDormManager.SaveRoomModification(self.RoomId, false, function() self:CloseFurnitureReform() end) end) else self:CloseFurnitureReform() end end function XUiFurnitureReform:CloseFurnitureReform() self:RestoreViewAngles() self:Close() end function XUiFurnitureReform:OnBtnShowDormAttr() if self.FurnitureTagTypeShow then self.Template.gameObject:SetActiveEx(false) self.FurnitureTagTypeShow = false return end self.FurnitureTagTypeShow = true self.Template.gameObject:SetActiveEx(true) self.DynamicTable:SetTotalCount(#self.FurnitureTagType) self.DynamicTable:ReloadDataSync() end function XUiFurnitureReform:OnBtnFilterClick() self:ShowPanelFilter() end function XUiFurnitureReform:OnBtnFilterBackClick() self:HidePanelFilter() end -- 全部收起 function XUiFurnitureReform:OnBtnRecoverClick() XUiManager.DialogTip(CS.XTextManager.GetText("FurnitureTips"), CS.XTextManager.GetText("FurnitureCleanRoom"), XUiManager.DialogType.Normal, nil, function() XHomeDormManager.CleanRoom(self.RoomId) end) end -- 重置房间 function XUiFurnitureReform:OnBtnUndoClick() XUiManager.DialogTip(CS.XTextManager.GetText("FurnitureTips"), CS.XTextManager.GetText("FurnitureRevertRoom"), XUiManager.DialogType.Normal, nil, function() XHomeDormManager.RevertRoom(self.RoomId) CsXGameEventManager.Instance:Notify(XEventId.EVENT_DORM_FURNITURE_ATTR_TAG, self.FurnitureTagType[self.SelectIndex].AttrIndex) end) end -- 保存房间 function XUiFurnitureReform:OnBtnSaveClick() XHomeDormManager.SaveRoomModification(self.RoomId) end function XUiFurnitureReform:OnBtnExplainClick() XUiManager.UiFubenDialogTip(CS.XTextManager.GetText("DormDes"), CS.XTextManager.GetText("FurnitureDescription") or "") end -- 显示家具菜单 function XUiFurnitureReform:ShowFurnitureMenu(furniture, isFollowMouse, isNew) self.MainPanelGo:SetActive(not furniture) local isOutOfLimit = false if furniture and (not XDataCenter.FurnitureManager.CheckFurnitureUsing(furniture.Data.Id)) then local minorType = XFurnitureConfigs.GetFurnitureTypeCfgByConfigId(furniture.Data.CfgId).MinorType local curLength = XHomeDormManager.GetFurnitureNumsByRoomAndMinor(self.RoomId, minorType) local curCapacity = XHomeDormManager.GetFurnitureCapacityByRoomANdMinor(self.RoomId, minorType, self.RoomType) isOutOfLimit = (curCapacity > 0) and (curLength >= curCapacity) or false end self.MenuPanel:SetFurniture(furniture, isFollowMouse, isNew, isOutOfLimit) self.CurFurniture = furniture self:OnShowBlockGrids() end function XUiFurnitureReform:OnShowBlockGrids() if self.CurFurniture then XHomeDormManager.OnShowBlockGrids(self.CurFurniture.HomePlatType, self.CurFurniture.GridOffset, self.CurFurniture.RotateAngle) end end --初始化begin function XUiFurnitureReform:Init() self:InitType() self:RestoreCache() local roomFurnitureCount = XDataCenter.DormManager.GetRoomDataByRoomId(self.RoomId, self.RoomType).FurnitureCount self.SViewFurniture = XUiPanelSViewFurniture.New(self.PanelSViewFurniture, self, roomFurnitureCount, self.RoomType) --初始化家具类型 self.TypeList = XFurnitureConfigs.GetFurnitureTypeGroupList() self.FurnitureGroupList = self:GenerateFurnitureGroupList(self.TypeList) self:InitFurnitureTabGroup() self.GridOption.gameObject:SetActive(false) if not self.SuitCFG then XLog.Warning("XUiFurnitureReform:Init error: self.SuitCFG is nil") end self:InitFurnitureAttrTag() if not self.DynamicTableSuit then self.DynamicTableSuit = XDynamicTableNormal.New(self.SViewFilter.gameObject) self.DynamicTableSuit:SetProxy(XUiGridOption) self.DynamicTableSuit:SetDelegate(self) end self:UpdateScores() self:SwitchSuitFilter(self.CurrentSuitId or 1) end function XUiFurnitureReform:InitType() self.BtnDrdSort.gameObject:SetActiveEx(self.IsMyRoom) self.PanelTool.gameObject:SetActiveEx(self.IsMyRoom) end function XUiFurnitureReform:InitFurnitureAttrTag() self.FurnitureTagType = XFurnitureConfigs.GetFurnitureTagTypeTemplates() self.FurnitureTagTypeShow = false --local key = tostring(XPlayer.Id) .. "FurnitureAttr" self.SelectIndex = 1 XHomeDormManager.FurnitureShowAttrType = -1 self.BtnDrdSortLabel.text = self.FurnitureTagType[self.SelectIndex].TagName --家具属性tips self.DynamicTable = XDynamicTableNormal.New(self.Template) self.DynamicTable:SetProxy(XUiFurnitureAttrGrid) self.DynamicTable:SetDelegate(self) self.DynamicTable:SetDynamicEventDelegate(function(...) self:OnFurnitureAttrDynamicTableEvent(...) end) self.SelectGrid = nil CsXGameEventManager.Instance:Notify(XEventId.EVENT_DORM_FURNITURE_ATTR_TAG, self.FurnitureTagType[self.SelectIndex].AttrIndex) end function XUiFurnitureReform:GenerateFurnitureGroupList() local groupList = {} for i = 1, #self.TypeList do local typeList = self.TypeList[i] table.insert(groupList, { MinorType = typeList.MinorType, MinorName = typeList.MinorName, isBaseType = true }) local subIndex = #groupList for index = 1, #typeList.CategoryList do local categoryData = typeList.CategoryList[index] table.insert(groupList, { MinorType = typeList.MinorType, MinorName = typeList.MinorName, SubIndex = subIndex, CategoryType = categoryData.Category, CategoryName = categoryData.CategoryName, }) end end return groupList end function XUiFurnitureReform:InitFurnitureTabGroup() for i = 1, #self.FurnitureGroupList do local tempGroup = self.FurnitureGroupList[i] if not self.BtnTabGoList[i] then local tempBtnTab if tempGroup.SubIndex and tempGroup.SubIndex > 0 then tempBtnTab = CS.UnityEngine.Object.Instantiate(self.Obj:GetPrefab("BtnTabFurnitureSubType")) else tempBtnTab = CS.UnityEngine.Object.Instantiate(self.Obj:GetPrefab("BtnTabFurnitureBaseType")) end tempBtnTab.transform:SetParent(self.TabGroupContent.transform, false) local uiButton = tempBtnTab:GetComponent("XUiButton") uiButton.SubGroupIndex = tempGroup.SubIndex table.insert(self.BtnTabGoList, uiButton) end self.BtnTabGoList[i].gameObject:SetActive(true) end for i = #self.FurnitureGroupList + 1, #self.BtnTabGoList do self.BtnTabGoList[i].gameObject:SetActive(false) end self.TabFurnitureGroup:Init(self.BtnTabGoList, function(index) self:OnSelectFurnitureType(index) end) for i = 0, #self.FurnitureGroupList - 1 do local furnitureGroup = self.FurnitureGroupList[i + 1] if furnitureGroup then if furnitureGroup.SubIndex and furnitureGroup.SubIndex > 0 then self.TabFurnitureGroup.TabBtnList[i]:SetNameByGroup(0, furnitureGroup.CategoryName) local count local categoryList = self:GetCategoryListByMinorType(furnitureGroup.MinorType) if #categoryList <= 0 then count = self:GetBaseTypeCount(furnitureGroup.MinorType) else if furnitureGroup.CategoryType == 0 then count = self:GetBaseTypeCount(furnitureGroup.MinorType) else count = self:GetSubTypeCount(furnitureGroup.MinorType, furnitureGroup.CategoryType) end end self.TabFurnitureGroup.TabBtnList[i]:SetNameByGroup(1, count) else self.TabFurnitureGroup.TabBtnList[i]:SetNameByGroup(0, furnitureGroup.MinorName) end end end self.TabFurnitureGroup:SelectIndex(1) end function XUiFurnitureReform:OnSelectFurnitureType(index) local furnitureGroup = self.FurnitureGroupList[index] self.LastSelectGroupIndex = index if furnitureGroup then self.LastBaseTypeId = self.CurrentBaseTypeId self.CurrentBaseTypeId = furnitureGroup.MinorType --选中二级菜单 local categoryList = self:GetCategoryListByMinorType(self.CurrentBaseTypeId) if #categoryList <= 0 then self:SwitchSubType(0) else self:SwitchSubType(furnitureGroup.CategoryType) end end end function XUiFurnitureReform:SelectTypeByFurniture(furnitureId) if not furnitureId or furnitureId <= 0 then return end local furntiureDatas = XDataCenter.FurnitureManager.GetFurnitureById(furnitureId) if not furntiureDatas then return end local furnitureTemplates = XFurnitureConfigs.GetFurnitureTemplateById(furntiureDatas.ConfigId) if not furnitureTemplates then return end local furnitureTypeTemplates = XFurnitureConfigs.GetFurnitureTypeById(furnitureTemplates.TypeId) if not furnitureTypeTemplates then return end local index = 0 local subIndex = 0 for tabKey, tabValue in ipairs(self.FurnitureGroupList) do if furnitureTypeTemplates.MinorType == tabValue.MinorType and tabValue.CategoryType and tabValue.CategoryType == furnitureTypeTemplates.Category then index = tabKey end if furnitureTypeTemplates.MinorType == tabValue.MinorType and tabValue.CategoryType == nil then subIndex = tabKey end end if index == 0 or (self.LastSelectGroupIndex and self.LastSelectGroupIndex == index) then return end local furnitureGroup = self.FurnitureGroupList[self.LastSelectGroupIndex] if subIndex > 0 and furnitureGroup and furnitureGroup.MinorType ~= furnitureTypeTemplates.MinorType then self.TabFurnitureGroup:SelectIndex(subIndex) end self.TabFurnitureGroup:SelectIndex(index) end function XUiFurnitureReform:GetCategoryListByMinorType(minor) local typeList = XFurnitureConfigs.GetFurnitureTypeList() for _, v in pairs(typeList) do if v.MinorType == minor then return v.CategoryList end end return {} end function XUiFurnitureReform:OnDynamicTableEvent(event, index, grid) if event == DYNAMIC_DELEGATE_EVENT.DYNAMIC_GRID_INIT then self:OnRefreshSuit(index, grid) elseif event == DYNAMIC_DELEGATE_EVENT.DYNAMIC_GRID_ATINDEX then self:OnRefreshSuit(index, grid) end end function XUiFurnitureReform:OnRefreshSuit(index, grid) local data = self.SuitCFG[index] if not data then return end grid:Init(data, self) end --切换选择家具基础类型 function XUiFurnitureReform:SwitchBaseType(baseTypeId) if not baseTypeId then return end self.CurrentBaseTypeId = baseTypeId self.CurrentSubTypeId = nil self:UpdateItemsByFilter() self:UpdatePanelLimit() self:SwitchViewAngle(baseTypeId) end function XUiFurnitureReform:SwitchViewAngle(minor) local viewAngles = XFurnitureConfigs.GetFurnitureViewAngleByMinor(minor) if not viewAngles then return end if self.LastBaseTypeId then local lastViewAngles = XFurnitureConfigs.GetFurnitureViewAngleByMinor(self.LastBaseTypeId) if lastViewAngles and lastViewAngles.GroupId == viewAngles.GroupId then return end end XHomeSceneManager.ChangeAngleYAndYAxis(viewAngles.TargetAngleY, viewAngles.AllowYAxis == 1) end function XUiFurnitureReform:RestoreViewAngles() local defaultTargetAngle = CS.XGame.ClientConfig:GetInt("DefaultDormTargetAngle") local defaultAllowYAxis = CS.XGame.ClientConfig:GetInt("DefaultAllowYAxis") XHomeSceneManager.ChangeAngleYAndYAxis(defaultTargetAngle, defaultAllowYAxis == 1) end --切换选择家具二级类型 function XUiFurnitureReform:SwitchSubType(subTypeId) if not subTypeId then return end if subTypeId == 0 then self:SwitchBaseType(self.CurrentBaseTypeId) return end self.CurrentSubTypeId = subTypeId self:UpdateItemsByFilter() self:UpdatePanelLimit() end --隐藏二级类型 function XUiFurnitureReform:HideSubTypePanel() if self.PanelSubType.gameObject.activeSelf then self.PanelSubType.gameObject:SetActive(false) end end --显示套装过滤面板 function XUiFurnitureReform:ShowPanelFilter() self.PanelFilterGameObject:SetActive(true) if not self.DynamicTableSuit then return end self.DynamicTableSuit:SetDataSource(self.SuitCFG) self.DynamicTableSuit:ReloadDataASync(1) self.FilterEnable:PlayTimelineAnimation() end --隐藏套装过滤面板 function XUiFurnitureReform:HidePanelFilter() self.FilterDisable:PlayTimelineAnimation(function() self.PanelFilterGameObject:SetActive(false) end) end --选择套装过滤 function XUiFurnitureReform:SwitchSuitFilter(suitId) self:HidePanelFilter() self.CurrentSuitId = suitId self.BtnFilter:SetNameByGroup(0, self.SuitCFG[suitId].SuitName) self:UpdateItemsByFilter() self:UpdateCountOnChanged() self:UpdatePanelLimit() end function XUiFurnitureReform:UpdateCountOnChanged() -- 切换了套装,数量要重新结算 self:UpdateSubTypeCount() -- 获得套装数量 if self.CurrentSuitId then self.BtnFilter:SetNameByGroup(1, self:CalcFurnitureNumsBySuitId(self.CurrentSuitId)) end end function XUiFurnitureReform:CalcFurnitureNumsBySuitId(suitId) if not self.RoomId then return 0 end if self.IsMyRoom then return XDataCenter.FurnitureManager.GetFurnitureCountBySuitId(self.RoomId, FurnitureCache, suitId) end return XFurnitureConfigs.GetSuitCount(suitId) end --根据条件过滤家具 function XUiFurnitureReform:UpdateItemsByFilter() if delayRefreshTimer then XScheduleManager.UnSchedule(delayRefreshTimer) delayRefreshTimer = nil end delayRefreshTimer = XScheduleManager.ScheduleOnce(function() local cacheKey = self:GetCacheKey(self.CurrentBaseTypeId, self.CurrentSubTypeId) self:SortFurnitureCache(FurnitureCache[cacheKey]) local filterSuitCache if self.IsMyRoom then filterSuitCache = self:FilterCacheBySuitId(FurnitureCache[cacheKey] or {}) else filterSuitCache = XFurnitureConfigs.GetFurnitureCfgList(self.CurrentBaseTypeId, self.CurrentSubTypeId, self.CurrentSuitId) end if self.SViewFurniture then self.SViewFurniture:UpdateItems(filterSuitCache) self.AnimFurnitureList:PlayTimelineAnimation() end end, 100) end function XUiFurnitureReform:FilterCacheBySuitId(cache) local suitCache = {} if (not self.CurrentSuitId) or (not cache) or self.CurrentSuitId == 1 then return cache end for _, v in ipairs(cache) do local furntiureTemplate = XFurnitureConfigs.GetFurnitureTemplateById(v.ConfigId) if furntiureTemplate.SuitId == self.CurrentSuitId then table.insert(suitCache, v) end end return suitCache end function XUiFurnitureReform:SortFurnitureCache(cache) if not cache then return end local j for i = 2, #cache do local temp = cache[i] j = i - 1 while (j > 0) do local totalJScores = XDataCenter.FurnitureManager.GetFurnitureScore(cache[j].Id) local totalIScores = XDataCenter.FurnitureManager.GetFurnitureScore(temp.Id) if totalIScores <= totalJScores then break end cache[j + 1] = cache[j] j = j - 1 end cache[j + 1] = temp end end -- 更新家具的数量 function XUiFurnitureReform:UpdateSubTypeCount() if not self.FurnitureGroupList then return end for i = 0, #self.FurnitureGroupList - 1 do local furnitureGroup = self.FurnitureGroupList[i + 1] if furnitureGroup then local categoryList = self:GetCategoryListByMinorType(furnitureGroup.MinorType) local count if #categoryList <= 0 then count = self:GetBaseTypeCount(furnitureGroup.MinorType) else if furnitureGroup.CategoryType == nil or furnitureGroup.CategoryType == 0 then count = self:GetBaseTypeCount(furnitureGroup.MinorType) else count = self:GetSubTypeCount(furnitureGroup.MinorType, furnitureGroup.CategoryType) end end self.TabFurnitureGroup.TabBtnList[i]:SetNameByGroup(1, count) end end end function XUiFurnitureReform:GetBaseTypeCount(minor) if self.IsMyRoom then local cacheKey = self:GetCacheKey(minor, nil) return XDataCenter.FurnitureManager.GetFurnitureCountByMinorTypeAndSuitId(self.RoomId, FurnitureCache[cacheKey], self.CurrentSuitId, minor) end return XFurnitureConfigs.GetCountByMinor(minor, self.CurrentSuitId) end function XUiFurnitureReform:GetSubTypeCount(minor, category) if self.IsMyRoom then local cacheKey = self:GetCacheKey(minor, category) return XDataCenter.FurnitureManager.GetFurnitureCountByMinorAndCategoryAndSuitId(self.RoomId, FurnitureCache[cacheKey], self.CurrentSuitId, minor, category) end return XFurnitureConfigs.GetCountByCategory(minor, category, self.CurrentSuitId) end function XUiFurnitureReform:GetCurrentSuitId() return self.CurrentSuitId or 1 end --更新放置限制面板 function XUiFurnitureReform:UpdatePanelLimit() if not self.CurrentBaseTypeId then return end local typeList = XFurnitureConfigs.GetFurnitureTypeList() for _, v in pairs(typeList) do if self.CurrentBaseTypeId == v.MinorType then self.TxtLimit.text = v.MinorName if self.CurrentSubTypeId ~= nil and #v.CategoryList > 0 then for _, category in pairs(v.CategoryList) do if self.CurrentSubTypeId == category.Category then self.TxtLimit.text = string.format("%s-%s", v.MinorName, category.CategoryName) break end end end break end end end function XUiFurnitureReform:UpdateScores() if self.RoomType ~= XDormConfig.DormDataType.Self then return end if delayUpdateScoresTimer then XScheduleManager.UnSchedule(delayUpdateScoresTimer) delayUpdateScoresTimer = nil end delayUpdateScoresTimer = XScheduleManager.ScheduleOnce(function() if self.RoomId then local newFurnitureAttrs = XHomeDormManager.GetFurnitureScoresByRoomId(self.RoomId) local oldFurnitureAttrs = XHomeDormManager.GetFurnitureScoresByUnsaveRoom(self.RoomId) -- 总评分 local oldScores = oldFurnitureAttrs.TotalScore local newScores = newFurnitureAttrs.TotalScore self.TxtTotalScore.text = XFurnitureConfigs.GetFurnitureTotalAttrLevelNewColorDescription(1, newScores) self.ImgTotalScoreDown.gameObject:SetActive(newScores < oldScores) self.ImgTotalScoreUp.gameObject:SetActive(newScores > oldScores) -- 三个属性分 for i = 1, #newFurnitureAttrs.AttrList do local attrOldVal = oldFurnitureAttrs.AttrList[i] local attrNewVal = newFurnitureAttrs.AttrList[i] local typeDatas = XFurnitureConfigs.GetDormFurnitureType(i) self:SetUiSprite(self[string.format("ImgTool%d", i)], typeDatas.TypeIcon) self[string.format("TxtAttrTool%d", i)].text = XFurnitureConfigs.GetFurnitureAttrLevelNewDescription(1, i, attrNewVal) self[string.format("ImgScoreUp%d", i)].gameObject:SetActive(attrOldVal < attrNewVal) self[string.format("ImgScoreDown%d", i)].gameObject:SetActive(attrOldVal > attrNewVal) end end end, 50) end function XUiFurnitureReform:GetCacheKey(baseType, subType) return XDataCenter.FurnitureManager.GenerateCacheKey(baseType, subType) end function XUiFurnitureReform:ResetCache() FurnitureCache = {} end function XUiFurnitureReform:RestoreCache() local typeList = XFurnitureConfigs.GetFurnitureTypeList() for _, typeDatas in pairs(typeList) do local baseType = typeDatas.MinorType local cacheBaseKey = self:GetCacheKey(baseType, nil) FurnitureCache[cacheBaseKey] = XDataCenter.FurnitureManager.FilterDisplayFurnitures(self.RoomId, 1, baseType, nil) for _, categoryList in pairs(typeDatas.CategoryList) do local subType = categoryList.Category if subType ~= 0 then local cacheSubKey = self:GetCacheKey(baseType, subType) FurnitureCache[cacheSubKey] = XDataCenter.FurnitureManager.FilterDisplayFurnitures(self.RoomId, 1, baseType, subType) end end end end function XUiFurnitureReform:UpdateCacheFurniture(isRemove, furntiureId) local furnitureDatas = XDataCenter.FurnitureManager.GetFurnitureById(furntiureId) if not furnitureDatas then return end local furnitureTemplates = XFurnitureConfigs.GetFurnitureTemplateById(furnitureDatas.ConfigId) local furntiureTypeTemplates = XFurnitureConfigs.GetFurnitureTypeById(furnitureTemplates.TypeId) local baseCacheKey = self:GetCacheKey(furntiureTypeTemplates.MinorType, nil) local baseSubCacheKey = self:GetCacheKey(furntiureTypeTemplates.MinorType, furntiureTypeTemplates.Category) if isRemove then--收纳家具 self:AddCacheToList(FurnitureCache[baseCacheKey], furnitureDatas) if FurnitureCache[baseSubCacheKey] then self:AddCacheToList(FurnitureCache[baseSubCacheKey], furnitureDatas) end else--摆放家具 self:RemoveCacheFromList(FurnitureCache[baseCacheKey], furntiureId) if FurnitureCache[baseSubCacheKey] then self:RemoveCacheFromList(FurnitureCache[baseSubCacheKey], furntiureId) end end self:UpdateItemsByFilter() end function XUiFurnitureReform:AddCacheToList(cache, furnitureDatas) for _, v in pairs(cache) do if v.Id == furnitureDatas.Id then return end end table.insert(cache, furnitureDatas) end function XUiFurnitureReform:RemoveCacheFromList(cache, furnitureId) local index = 0 local length = #cache for k, v in pairs(cache) do if v.Id == furnitureId then index = k break end end if index == 0 then return end cache[index] = nil for i = index, length - 1 do cache[i] = cache[i + 1] end cache[length] = nil end function XUiFurnitureReform:OnGetEvents() return { XEventId.EVENT_FURNITURE_ONDRAGITEM_CHANGED, XEventId.EVENT_FURNITURE_REFRESH, XEventId.EVENT_FURNITURE_CLEANROOM, XEventId.EVENT_CLICKFURNITURE_ONROOM } end function XUiFurnitureReform:OnNotify(evt, ...) if evt == XEventId.EVENT_FURNITURE_ONDRAGITEM_CHANGED then local args = { ... } if not args then return end self:UpdateCacheFurniture(args[1], args[2]) self:UpdateCountOnChanged() self:UpdatePanelLimit() self:UpdateScores() elseif evt == XEventId.EVENT_FURNITURE_REFRESH then self:RefreshFurntiureReform() elseif evt == XEventId.EVENT_FURNITURE_CLEANROOM then self:UpdatePanelLimit() self:UpdateScores() elseif evt == XEventId.EVENT_CLICKFURNITURE_ONROOM then local args = { ... } if not args then return end self:SelectTypeByFurniture(args[1]) end end function XUiFurnitureReform:RefreshFurntiureReform() self:RestoreCache() self:UpdateItemsByFilter() self:UpdateCountOnChanged() self:UpdatePanelLimit() self:UpdateScores() end function XUiFurnitureReform:OnDestroy() if delayRefreshTimer then XScheduleManager.UnSchedule(delayRefreshTimer) delayRefreshTimer = nil end if delayUpdateScoresTimer then XScheduleManager.UnSchedule(delayUpdateScoresTimer) delayUpdateScoresTimer = nil end XEventManager.RemoveEventListener(XEventId.EVENT_FURNITURE_ON_MODIFY, self.RefreshFurnitureList, self) local isResetPosition = true XHomeCharManager.ShowAllCharacter(isResetPosition) if not XTool.UObjIsNil(self.CameraController) then self.CameraController:SetTartAngle(CS.UnityEngine.Vector2(self.TargetAngleX, self.TargetAngleY)) XCameraHelper.SetCameraTarget(self.CameraController, self.OldCameraTarget, self.OldCameraDistance) end self.CameraController = nil self.OldCameraTarget = nil self.OldCameraDistance = nil self.TargetAngleX = nil self.TargetAngleY = nil XDataCenter.FurnitureManager.SetInRefeform(false) CsXGameEventManager.Instance:Notify(XEventId.EVENT_DORM_FURNITURE_HIDE_ALL_ATTR_TAG_DETAIL) end function XUiFurnitureReform:OnFurnitureAttrDynamicTableEvent(event, index, grid) if event == DYNAMIC_DELEGATE_EVENT.DYNAMIC_GRID_ATINDEX then local isSelect = false if self.SelectIndex == index then self.SelectGrid = grid isSelect = true end grid:SetSelect(isSelect) grid:SetContent(self.FurnitureTagType[index]) elseif event == DYNAMIC_DELEGATE_EVENT.DYNAMIC_GRID_TOUCHED then if self.SelectIndex == index then return end if self.SelectGrid then self.SelectGrid:SetSelect(false) end self.SelectGrid = grid self.SelectIndex = index grid:SetSelect(true) local cfg = self.FurnitureTagType[index] self.BtnDrdSortLabel.text = cfg.TagName XHomeDormManager.FurnitureShowAttrType = cfg.AttrIndex --CS.UnityEngine.PlayerPrefs.SetInt(tostring(XPlayer.Id) .. "FurnitureAttr", cfg.AttrIndex) --CS.UnityEngine.PlayerPrefs.Save() CsXGameEventManager.Instance:Notify(XEventId.EVENT_DORM_FURNITURE_ATTR_TAG, cfg.AttrIndex) end end