PGRData/Script/matrix/xmanager/XDormManager.lua

2739 lines
95 KiB
Lua
Raw Normal View History

---
--- 宿舍业务管理器
---
XDormManagerCreator = function()
2024-09-01 20:49:41 +00:00
---@class XDormManager 宿舍业务管理器
local XDormManager = {}
2024-09-01 20:49:41 +00:00
local CharacterData = {} -- 构造体数据
2024-09-01 20:49:41 +00:00
---@type table<number, XHomeRoomData>
local DormitoryData = {} -- 宿舍数据
-- local VisitorData = {} -- 宿舍访客数据
local WorkListData = {} --打工数据(正在打工或者打完工但是奖励没有领)
local WorkRefreshTime = -1 --打工刷新时间
local RecommVisData = {} --推荐访问数据
local RecommVisIds = {}
local RecommVisFriendData = {}
local LastSyncServerTime = 0 -- 爱抚水枪上一次请求时间
local DormShowEventList = {} -- 构造体客户端展示事件效果列表
local IsPlayingShowEvent = false -- 现在是否在播放展示事件
local IsInTouch = false -- 是否再爱抚中
local SYNC_PUTFURNITURE_SECOND = 5 --摆放家具保护护时间
local LastPutFurnitureTime = 0 --大厅个人玩家列表最后刷新时间
2024-09-01 20:49:41 +00:00
local VisitRequestTimeLimit = 10 --宿舍访问列表请求保护时间
local LastRequestUnknownVisitor = 0 --上次请求未知访客宿舍时间
2024-09-01 20:49:41 +00:00
---@type table<number, XHomeRoomData>
local TargetDormitoryData = {} --别人宿舍数据
local TargetCharacterData = {} -- 构造体数据(访问其他人时)
-- local TargetVisitorData = {} -- 宿舍访问数据(访问其他人时)
2024-09-01 20:49:41 +00:00
---@type table<number, XHomeRoomData>
local TempDormitoryData = {} -- 模板宿舍数据(包括收藏宿舍)
local ProvisionalDormData = {} -- 导入的宿舍数据
local LocalCaptureCache = {} -- 本地截图缓存
local DormRedTimer
local SnapshotTimes = 0 -- 已使用的分享次数
local LastShareTime = 0 -- 上一次分享的时间
local CurrentDormId = -1 -- 最后停留的宿舍Id
local DormitoryRequest = {
DormitoryDataReq = "DormitoryDataRequest", -- 宿舍总数据请求
ActiveDormItemReq = "ActiveDormItemRequest", --激活宿舍
DormRenameReq = "DormRenameRequest", --房间改名
PutFurnitureReq = "PutFurnitureRequest", --摆放家具请求
DormSnapshotLayoutReq = "DormSnapshotLayoutRequest", --请求宿舍分享ID
DormEnterReq = "DormEnterRequest", --进入宿舍通知
DormExitReq = "DormOutRequest", --退出宿舍通知
DormCharacterOperateReq = "DormCharacterOperateRequest", --构造体处理事件反馈
DormRemoveCharacterReq = "DormRemoveCharacterRequest", --拿走构造体
DormPutCharacterReq = "DormPutCharacterRequest", --放置构造体
CheckCreateFurnitureReq = "CheckCreateFurnitureRequest", --请求刷新家具建造列表
DormRecommendReq = "DormRecommendRequest", --推荐访问
DormDetailsReq = "DormDetailsRequest", --宿舍访问时的详细信息
DormVisitReq = "DormVisitRequest", --访问宿舍
DormWorkReq = "DormWorkRequest", --宿舍打工
DormWorkRewardReq = "DormWorkRewardRequest", --宿舍打工领取奖励
FondleDataReq = "GetFondleDataRequest", -- 爱抚信息查询
FondleReq = "DormDoFondleRequest", -- 爱抚请求
DormWordDoneReq = "DormWordDoneRequest", -- 代工请求
DormGetPlayerLayoutReq = "DormGetPlayerLayoutRequest", -- 通过ID导入他人宿舍模板
DormBindLayoutReq = "DormBindLayoutRequest", -- 模板绑定宿舍
DormUnBindLayoutReq = "DormUnBindLayoutRequest", -- 解除模板绑定宿舍
DormCollectLayoutReq = "DormCollectLayoutRequest", -- 收藏宿舍请求
}
function XDormManager.InitOnlyOnce()
if XDormManager.IsFirstInit then
return
end
XDormManager.IsFirstInit = true
DormitoryData = {}
local dormitoryTemplates = XDormConfig.GetTotalDormitoryCfg()
-- 宿舍布局数据
for id, _ in pairs(dormitoryTemplates) do
DormitoryData[id] = XHomeRoomData.New(id)
DormitoryData[id]:SetPlayerId(XPlayer.Id)
end
2024-09-01 20:49:41 +00:00
TempDormitoryData = {}
local templateData = XDormConfig.GetDormTemplateData()
for k, v in pairs(templateData) do
TempDormitoryData[k] = v
end
IsPlayingShowEvent = false
end
-- 初始化宿舍小屋数据
function XDormManager.InitDormitoryData(dormitoryList)
if not dormitoryList or not next(dormitoryList) then
return
end
for _, data in pairs(dormitoryList) do
local roomData = DormitoryData[data.DormitoryId]
if not roomData then
local path = XDormConfig.GetDormitoryTablePath()
XLog.Error("XDormManager.InitDormitoryData 错误:" .. path .. " 表中不存在DormitoryId: " .. data.DormitoryId .."检查配置表或者参数dormitoryList")
else
2024-09-01 20:49:41 +00:00
roomData:Init()
roomData:SetRoomUnlock(true)
roomData:SetRoomName(data.DormitoryName)
end
end
end
-- 初始化宿舍小人数据
function XDormManager.InitCharacterData(characterList)
if not characterList or not next(characterList) then
return
end
for _, data in ipairs(characterList) do
CharacterData[data.CharacterId] = data
if data.DormitoryId and data.DormitoryId > 0 then
local roomData = DormitoryData[data.DormitoryId]
if roomData then
roomData:AddCharacter(data)
end
end
end
end
-- 初始化宿舍内部家具数据
function XDormManager.InitFurnitureData(furnitureList)
if not furnitureList or not next(furnitureList) then
return
end
for _, data in pairs(furnitureList) do
local roomData = DormitoryData[data.DormitoryId]
if roomData then
roomData:SetRoomUnlock(true)
roomData:AddFurniture(data.Id, data.ConfigId, data.X, data.Y, data.Angle)
end
end
end
2024-09-01 20:49:41 +00:00
function XDormManager.InitDormCollectData(dormCollectList)
if dormCollectList and next(dormCollectList) then
for _, v in ipairs(dormCollectList) do
TempDormitoryData[v.LayoutId] = XHomeRoomData.New(v.LayoutId)
TempDormitoryData[v.LayoutId]:SetPlayerId(v.PlayerId)
TempDormitoryData[v.LayoutId]:SetRoomName(v.Name)
TempDormitoryData[v.LayoutId]:SetRoomUnlock(true)
TempDormitoryData[v.LayoutId]:SetRoomDataType(XDormConfig.DormDataType.Collect)
TempDormitoryData[v.LayoutId]:SetRoomCreateTime(v.CreateTime)
for _, furniture in ipairs(v.FurnitureList) do
local id = XGlobalVar.GetIncId()
TempDormitoryData[v.LayoutId]:AddFurniture(id, furniture.ConfigId, furniture.X, furniture.Y, furniture.Angle)
end
end
end
end
2024-09-01 20:49:41 +00:00
function XDormManager.InitBindRelationData(bindRelations)
if bindRelations and next(bindRelations) then
for _, bindRelation in ipairs(bindRelations) do
if TempDormitoryData[bindRelation.LayoutId] then
TempDormitoryData[bindRelation.LayoutId]:SetConnectDormId(bindRelation.DormitoryId)
end
if DormitoryData[bindRelation.DormitoryId] then
DormitoryData[bindRelation.DormitoryId]:SetConnectDormId(bindRelation.LayoutId)
end
end
end
end
-- 设置导入宿舍数据
function XDormManager.SetDormProvisionalData(shareId, furnitureList)
if not shareId or not furnitureList or #furnitureList <= 0 then
return
end
if #ProvisionalDormData == XDormConfig.ProvisionalMaXCount then
table.remove(ProvisionalDormData, 1)
end
local data = XHomeRoomData.New(shareId)
data:SetRoomDataType(XDormConfig.DormDataType.Provisional)
for _, furniture in ipairs(furnitureList) do
local id = XGlobalVar.GetIncId()
data:AddFurniture(id, furniture.ConfigId, furniture.X, furniture.Y, furniture.Angle)
end
table.insert(ProvisionalDormData, data)
end
-- 获取上一个导入宿舍数据
function XDormManager.GetLastDormProvisionalData()
if #ProvisionalDormData > 0 then
table.remove(ProvisionalDormData, #ProvisionalDormData)
if #ProvisionalDormData > 0 then
return ProvisionalDormData[#ProvisionalDormData]
end
end
return nil
end
-- 获取入宿舍数据
function XDormManager.GetDormProvisionalData(roomId)
for _, v in ipairs(ProvisionalDormData) do
if v:GetRoomId() == roomId then
return v
end
end
return nil
end
-- 加载收藏宿舍的入口图片
2024-09-01 20:49:41 +00:00
function XDormManager.LoadCollectTexture()
local datas = XDormManager.GetTemplateDormitoryData(XDormConfig.DormDataType.Collect)
for _, v in ipairs(datas) do
v:GetRoomPicture()
end
end
-- 获取模板宿舍数据
2024-09-01 20:49:41 +00:00
---@return XHomeRoomData[]
function XDormManager.GetTemplateDormitoryData(dormDataType, idList)
if dormDataType == XDormConfig.DormDataType.Collect then
local datas = {}
for _, v in pairs(TempDormitoryData) do
if v:GetRoomDataType() == XDormConfig.DormDataType.Collect then
table.insert(datas, v)
end
end
table.sort(datas, function(a, b)
return a:GetRoomCreateTime() < b:GetRoomCreateTime()
end)
return datas
end
if dormDataType == XDormConfig.DormDataType.Template then
local datas = {}
if idList and #idList > 0 then
for _, id in ipairs(idList) do
local data = TempDormitoryData[id]
local isShow = XDormConfig.GetDormTemplateIsSwhoById(data:GetRoomId())
if isShow then
table.insert(datas, data)
end
end
else
for _, v in pairs(TempDormitoryData) do
if v:GetRoomDataType() == XDormConfig.DormDataType.Template then
local isShow = XDormConfig.GetDormTemplateIsSwhoById(v:GetRoomId())
if isShow then
table.insert(datas, v)
end
end
end
end
table.sort(datas, function(a, b)
return a:GetRoomOrder() < b:GetRoomOrder()
end)
return datas
end
return nil
end
2024-09-01 20:49:41 +00:00
--- 获取模板宿舍数量 不带参数时获取所有模板数量
---@param templateDormType number 宿舍模板类型固定模板/玩家收藏
---@return number
--------------------------
function XDormManager.GetTemplateDormitoryCount(templateDormType)
local count = 0
if not XTool.IsNumberValid(templateDormType) then
for _, template in pairs(TempDormitoryData) do
local roomType = template:GetRoomDataType()
if roomType == XDormConfig.DormDataType.Collect then
count = count + 1
elseif roomType == XDormConfig.DormDataType.Template then
local isShow = XDormConfig.GetDormTemplateIsSwhoById(template:GetRoomId())
if isShow then
count = count + 1
end
end
end
else
for _, template in pairs(TempDormitoryData) do
local roomType = template:GetRoomDataType()
if roomType ~= templateDormType then
goto continue
end
if roomType == XDormConfig.DormDataType.Collect then
count = count + 1
elseif roomType == XDormConfig.DormDataType.Template then
local isShow = XDormConfig.GetDormTemplateIsSwhoById(template:GetRoomId())
if isShow then
count = count + 1
end
end
::continue::
end
end
return count
end
local function SortTemplateTabConfig(a, b)
local templateA = XDormConfig.GetDormTemplateGroupCfg(a.Id)
local templateB = XDormConfig.GetDormTemplateGroupCfg(b.Id)
return templateA.DormType < templateB.DormType
end
local function SortFurnitureTabConfig(a, b)
local templateA = XFurnitureConfigs.GetFurnitureTypeById(a.Id)
local templateB = XFurnitureConfigs.GetFurnitureTypeById(b.Id)
if templateA.Priority ~= templateB.Priority then
return templateA.Priority < templateB.Priority
end
return a.Id < b.Id
end
--- 获取装修界面页签配置
--------------------------
function XDormManager.GetReformTabConfig()
local config = {}
local create = function(tabIndex, name, hasChild, param, children, icon, id)
return {
TabIndex = tabIndex,
HasChild = hasChild,
Name = name,
Param = param,
Icon = icon,
Children = children,
Id = id
}
end
local templateGroupList = XDormConfig.GetDormTemplateGroupList()
for _, data in pairs(templateGroupList) do
table.insert(config, create(XDormConfig.ReformPanelIndex.Template,
data.Name, false, data.Id, nil, data.BtnIcon, data.Id))
end
local furnitureTypeList = XFurnitureConfigs.GetFurnitureTemplateTypeList()
local map = {}
for _, data in pairs(furnitureTypeList) do
local minorType = data.MinorType
map[minorType] = map[minorType] or {}
table.insert(map[minorType], data)
end
for _, data in pairs(map) do
local hasChild = #data > 1
if hasChild then
local template = data and data[1] or {}
local children = {}
local param = {}
for _, childData in ipairs(data) do
table.insert(children, create(XDormConfig.ReformPanelIndex.Furniture,
childData.CategoryName, false, childData.Id, nil, nil, childData.Id))
table.insert(param, childData.Id)
end
table.insert(config, create(XDormConfig.ReformPanelIndex.Furniture,
template.MinorName, true, param, children, template.BtnIcon, template.Id))
else
local template = data and data[1] or {}
table.insert(config, create(XDormConfig.ReformPanelIndex.Furniture,
template.CategoryName, false, template.Id, nil, template.BtnIcon, template.Id))
end
end
table.sort(config, function(a, b)
if a.TabIndex ~= b.TabIndex then
return a.TabIndex < b.TabIndex
end
if a.TabIndex == XDormConfig.ReformPanelIndex.Template then
return SortTemplateTabConfig(a, b)
else
return SortFurnitureTabConfig(a, b)
end
end)
2024-09-01 20:49:41 +00:00
for index, cfg in pairs(config) do
if cfg.HasChild then
local sort = cfg.TabIndex == XDormConfig.ReformPanelIndex.Template and SortTemplateTabConfig or SortFurnitureTabConfig
table.sort(config[index].Children, sort)
end
end
return config
end
--- 获取所有宿舍数据
---@param dormDataType number 宿舍类型
---@param sceneId number 场景Id
---@return table<number,XHomeRoomData>
--------------------------
function XDormManager.GetDormitoryData(dormDataType, sceneId)
if dormDataType == XDormConfig.DormDataType.Target then
return TargetDormitoryData
end
2024-09-01 20:49:41 +00:00
if sceneId then
local data = {}
for id, room in pairs(DormitoryData) do
2024-09-01 20:49:41 +00:00
local cfgId = XDormConfig.GetDormitorySceneById(id)
if cfgId == sceneId then
data[id] = room
end
end
return data
end
return DormitoryData
end
-- 获取指定宿舍数据
2024-09-01 20:49:41 +00:00
---@return XHomeRoomData
function XDormManager.GetRoomDataByRoomId(roomId, dormDataType)
local data, roomData
if dormDataType == XDormConfig.DormDataType.Target then
data = TargetDormitoryData
elseif dormDataType == XDormConfig.DormDataType.Template or dormDataType == XDormConfig.DormDataType.Collect then
data = TempDormitoryData
elseif dormDataType == XDormConfig.DormDataType.Provisional then
roomData = XDormManager.GetDormProvisionalData(roomId)
else
data = DormitoryData
end
if not roomData then
roomData = data[roomId]
end
if not roomData then
local tempStr = "XDormManager.GetRoomDataByRoomId无法根据roomId获得宿舍数据, 检查参数roomId : "
XLog.Error(tempStr .. tostring(roomId) .. " 参数dormDataType" .. dormDataType)
return
end
return roomData
end
-- 入住排序方法
local CharacterCheckInSortFunc = function(a, b)
if a.DormitoryId < 0 or b.DormitoryId < 0 then
return a.DormitoryId < b.DormitoryId
elseif a.DormitoryId > 0 or b.DormitoryId > 0 then
return a.CharacterId < b.CharacterId
end
return false
end
-- 取回入住人数据
function XDormManager.GetCharactersSortedCheckInByDormId(dormId)
if not CharacterData or not next(CharacterData) then
return nil
end
local data = {}
local d = {}
for _, v in pairs(CharacterData) do
if v.DormitoryId == dormId then
table.insert(data, { CharacterId = v.CharacterId, DormitoryId = v.DormitoryId })
else
table.insert(d, { CharacterId = v.CharacterId, DormitoryId = v.DormitoryId })
end
end
table.sort(d, CharacterCheckInSortFunc)
for _, v in pairs(d) do
table.insert(data, v)
end
return data
end
2024-09-01 20:49:41 +00:00
---------------------start data---------------------
--
function XDormManager.GetCharacterDataByCharId(id)
-- 没有数据下 直接返回nil
if not CharacterData or not next(CharacterData) then
return nil
end
local t = CharacterData[id]
if not t then
XLog.Error("XDormManager.GetCharacterDataByCharId 函数错误: 无法从服务端发回的数据characterList根据id找到对应的内容, Id = " .. tostring(id))
return nil
end
return t
end
function XDormManager.CheckHaveDormCharacterByRewardId(id)
local characterId = XDormConfig.GetDormCharacterRewardData(id).CharacterId
return (CharacterData and CharacterData[characterId])
end
function XDormManager.CheckHaveDormCharacter(id)
local result = CharacterData[id]
if result then
return true
end
return false
end
function XDormManager.GetTargetCharacterDataByCharId(id)
-- 没有数据下 直接返回nil
if not TargetCharacterData or not next(TargetCharacterData) then
return nil
end
local t = TargetCharacterData[id]
if not t then
XLog.Error("XDormManager.GetTargetCharacterDataByCharId 函数错误: 无法从服务端发回的数据characterList根据id找到对应的内容, Id = " .. tostring(id))
return nil
end
return t
end
-- 根据宿舍人员id---->CharacterId,获得角色大头像
function XDormManager.GetCharBigHeadIcon(id)
return XDataCenter.CharacterManager.GetCharBigHeadIcon(id)
end
-- 根据宿舍人员id---->CharacterId,获得角色小头像
function XDormManager.GetCharSmallHeadIcon(id)
return XDataCenter.CharacterManager.GetCharSmallHeadIcon(id)
end
-- 根据宿舍人员id---->CharacterId和类型,取回角色喜好Icon
function XDormManager.GetCharacterLikeIconById(id, lt)
if not id or not lt then
return
end
local charStyleConfig = XDormConfig.GetCharacterStyleConfigById(id)
if not charStyleConfig then
return
end
local d = charStyleConfig[lt]
if not d then
return
end
local likeTypeConfig = XFurnitureConfigs.GetDormFurnitureType(d)
return likeTypeConfig.TypeIcon
end
-- 根据宿舍人员id---->CharacterId和类型,取回角色喜好Name
function XDormManager.GetCharacterLikeNameById(id, lt)
if not id or not lt then
return
end
local charStyleConfig = XDormConfig.GetCharacterStyleConfigById(id)
if not charStyleConfig then
return
end
local d = charStyleConfig[lt]
if not d then
return
end
local likeTypeConfig = XFurnitureConfigs.GetDormFurnitureType(d)
return likeTypeConfig.TypeName
end
-- 根据宿舍人员id---->CharacterId,取回角色体力
function XDormManager.GetVitalityById(id)
local d = XDormManager.GetCharacterDataByCharId(id)
if not d then
return 0
end
return d.Vitality
end
-- 根据宿舍人员id---->CharacterId,取回角色心情值
function XDormManager.GetMoodById(id)
local d = XDormManager.GetCharacterDataByCharId(id)
if not d then
return 0
end
return d.Mood
end
-- 根据宿舍id--->DormitoryId,取回宿舍人员角色Icon圆头像
function XDormManager.GetDormCharactersIcons(id, dormDataType)
local icons = {}
local d = XDormManager.GetRoomDataByRoomId(id, dormDataType)
if not d then
return icons
end
local characterList = d:GetCharacter()
for k, v in pairs(characterList) do
--获得角色圆头像
local icon = XDataCenter.CharacterManager.GetCharRoundnessHeadIcon(v.CharacterId)
icons[k] = icon
end
return icons
end
-- 根据宿舍id--->DormitoryId,取回宿舍人员Ids
function XDormManager.GetDormCharactersIds(roomId, dormDataType)
local ids = {}
local d = XDormManager.GetRoomDataByRoomId(roomId, dormDataType)
if not d then
return ids
end
local list = d:GetCharacter()
for _, v in pairs(list) do
ids[v.CharacterId] = v.CharacterId
end
return ids
end
-- 根据宿舍id--->DormitoryId,取回宿舍人员中是否有事件
function XDormManager.IsHaveDormCharactersEvent(roomId)
local d = XDormManager.GetRoomDataByRoomId(roomId)
local list = d:GetCharacter()
for _, v in pairs(list) do
local eventtemp = XHomeCharManager.GetCharacterEvent(v.CharacterId, true)
if eventtemp then
return true
end
end
return false
end
-- 根据宿舍id--->DormitoryId,取回宿舍名字
function XDormManager.GetDormName(id, dormDataType)
local d = XDormManager.GetRoomDataByRoomId(id, dormDataType)
if not d then
return
end
return d:GetRoomName() or ""
end
-- 根据宿舍id--->DormitoryId,取回宿舍总评分
function XDormManager.GetDormTotalScore(id, dormDataType)
local totalScore = 0
local d = XDormManager.GetRoomDataByRoomId(id, dormDataType)
if d then
local furnitureIdList = {}
local dic = d:GetFurnitureDic()
for furnitureId, _ in pairs(dic) do
table.insert(furnitureIdList, furnitureId)
end
if furnitureIdList then
for _, furnitureId in pairs(furnitureIdList) do
totalScore = totalScore + XDataCenter.FurnitureManager.GetFurnitureScore(furnitureId, dormDataType)
end
end
end
return XFurnitureConfigs.GetFurnitureTotalAttrLevelDescription(1, totalScore)
end
-- 获取房间地表实例Id
function XDormManager.GetRoomPlatId(roomId, homePlatType, dormDataType)
if homePlatType == nil then
return nil
end
local dic
if dormDataType == XDormConfig.DormDataType.Target then
dic = TargetDormitoryData
else
dic = DormitoryData
end
local roomData = dic[roomId]
if roomData == nil then
return nil
end
local list = roomData:GetFurnitureDic()
for _, v in pairs(list) do
local cfg = XFurnitureConfigs.GetFurnitureTemplateById(v.ConfigId)
if cfg then
local typeCfg = XFurnitureConfigs.GetFurnitureTypeById(cfg.TypeId)
if typeCfg then
if homePlatType == CS.XHomePlatType.Ground and typeCfg.MajorType == 1 and typeCfg.MinorType == 1 then
return v
end
if homePlatType == CS.XHomePlatType.Wall and typeCfg.MajorType == 1 and typeCfg.MinorType == 2 then
return v
end
end
end
end
return nil
end
function XDormManager.GetAllCharacterIds()
local characterIds = {}
if CharacterData and next(CharacterData) then
for _, v in pairs(CharacterData) do
local t = XDormConfig.GetCharacterStyleConfigById(v.CharacterId)
if t then
table.insert(characterIds, v.CharacterId)
end
end
else
local characters = XDataCenter.CharacterManager.GetOwnCharacterList()
for _, v in pairs(characters) do
table.insert(characterIds, v.Id)
end
end
return characterIds
end
function XDormManager.GetDormCharacterIds(...)
local charactersIds = {}
if CharacterData == nil then
return charactersIds
end
local conditions = {...}
for _, v in pairs(CharacterData) do
local t = XDormConfig.GetCharacterStyleConfigById(v.CharacterId)
if t then
for _, charType in ipairs(conditions) do
if t.Type == charType then
table.insert(charactersIds, v.CharacterId)
goto GET_CHAR_IDS_BREAK
end
end
::GET_CHAR_IDS_BREAK::
end
end
2024-09-01 20:49:41 +00:00
table.sort(charactersIds, function(a, b)
return a < b
end)
return charactersIds
end
-- 构造体所在宿舍号
function XDormManager.GetCharacterRoomNumber(charId)
local t = XDormManager.GetCharacterDataByCharId(charId)
if not t then
return 0
end
if t.DormitoryId > 0 then
return t.DormitoryId
end
return 0
end
-- 构造体是否在宿舍中
function XDormManager.CheckCharInDorm(charId)
local t = XDormManager.GetCharacterDataByCharId(charId)
if not t then
return false
end
return t.DormitoryId > 0
end
-- 获取构造体当前回复等级
function XDormManager.GetCharRecoveryCurLevel(charId)
local curLevelConfig = nil
local curIndex = 0
local charData = XDormManager.GetCharacterDataByCharId(charId)
if not charData then
return curLevelConfig, curIndex
end
local scoreA, scoreB, scoreC = XDormManager.GetDormitoryScore(charData.DormitoryId)
local indexA = XFurnitureConfigs.AttrType.AttrA - 1
local indexB = XFurnitureConfigs.AttrType.AttrB - 1
local indexC = XFurnitureConfigs.AttrType.AttrC - 1
2024-09-01 20:49:41 +00:00
local allFurnitureAttrs = XHomeDormManager.GetFurnitureScoresByUnSaveRoom(charData.DormitoryId)
local allScores = allFurnitureAttrs.TotalScore
local recoveryConfigs = XDormConfig.GetCharRecoveryConfig(charId)
for index, recoveryConfig in pairs(recoveryConfigs) do
if recoveryConfig.CompareType == XDormConfig.CompareType.Less then
if scoreA <= (recoveryConfig.AttrCondition[indexA] or 0) and
scoreB <= (recoveryConfig.AttrCondition[indexB] or 0) and
scoreC <= (recoveryConfig.AttrCondition[indexC] or 0) and
allScores <= recoveryConfig.AttrTotal then
curLevelConfig = recoveryConfig
curIndex = index
end
elseif recoveryConfig.CompareType == XDormConfig.CompareType.Equal then
if scoreA == (recoveryConfig.AttrCondition[indexA] or 0) and
scoreB == (recoveryConfig.AttrCondition[indexB] or 0) and
scoreC == (recoveryConfig.AttrCondition[indexC] or 0) and
allScores == recoveryConfig.AttrTotal then
curLevelConfig = recoveryConfig
curIndex = index
end
elseif recoveryConfig.CompareType == XDormConfig.CompareType.Greater then
if scoreA >= (recoveryConfig.AttrCondition[indexA] or 0) and
scoreB >= (recoveryConfig.AttrCondition[indexB] or 0) and
scoreC >= (recoveryConfig.AttrCondition[indexC] or 0) and
allScores >= recoveryConfig.AttrTotal then
curLevelConfig = recoveryConfig
curIndex = index
end
end
end
return curLevelConfig, curIndex
end
-- 获取构造体当前 下一个回复等级Config
function XDormManager.GetCharRecoveryConfigs(charId)
local curRecoveryConfig, curConfigIndex = XDormManager.GetCharRecoveryCurLevel(charId)
local nextRecoveryConfig
if curRecoveryConfig == nil then
return nil, nil
end
local recoveryConfigs = XDormConfig.GetCharRecoveryConfig(charId)
-- 当前已经是最大值 直接把当前作为Next返回 当前为nil
if curConfigIndex >= #recoveryConfigs then
return nil, curRecoveryConfig
end
nextRecoveryConfig = recoveryConfigs[curConfigIndex + 1]
return curRecoveryConfig, nextRecoveryConfig
end
-- 获取某个宿舍的家具三个总分(attrA, attrB, attrC)
function XDormManager.GetDormitoryScore(dormitoryId, dormDataType)
local dic
if dormDataType == XDormConfig.DormDataType.Target then
dic = TargetDormitoryData
else
dic = DormitoryData
end
local data = dic[dormitoryId]
if not data then
return 0, 0, 0
end
local kv = data:GetFurnitureDic()
local furnitureIds = {}
for id, _ in pairs(kv) do
table.insert(furnitureIds, id)
end
local scoreA, scoreB, scoreC = XDataCenter.FurnitureManager.GetFurniturePartScore(furnitureIds, dormDataType)
return scoreA, scoreB, scoreC
end
local getScoreNamesSort = function(a, b)
return a[2] > b[2]
end
-- 获取某个宿舍的家具三个总分对应名字
function XDormManager.GetDormitoryScoreNames()
local attrType = XFurnitureConfigs.AttrType
local indexA = attrType.AttrA
local indexB = attrType.AttrB
local indexC = attrType.AttrC
local a = XFurnitureConfigs.GetDormFurnitureTypeName(indexA)
local b = XFurnitureConfigs.GetDormFurnitureTypeName(indexB)
local c = XFurnitureConfigs.GetDormFurnitureTypeName(indexC)
return a, b, c
end
-- 获取某个宿舍的家具三个总分(attrA, attrB, attrC)以及对应Icon
function XDormManager.GetDormitoryScoreIcons(dormitoryId, dormDataType)
local scoreA, scoreB, scoreC = XDormManager.GetDormitoryScore(dormitoryId, dormDataType)
local data = {}
local attrType = XFurnitureConfigs.AttrType
local indexA = attrType.AttrA
local indexB = attrType.AttrB
local indexC = attrType.AttrC
data[1] = { XFurnitureConfigs.GetDormFurnitureTypeIcon(indexA), scoreA, indexA }
data[2] = { XFurnitureConfigs.GetDormFurnitureTypeIcon(indexB), scoreB, indexB }
data[3] = { XFurnitureConfigs.GetDormFurnitureTypeIcon(indexC), scoreC, indexC }
table.sort(data, getScoreNamesSort)
return data
end
function XDormManager.GetDormitoryScoreLevelDes(dormitoryId, dormDataType)
local scoreA, scoreB, scoreC = XDormManager.GetDormitoryScore(dormitoryId, dormDataType)
local attrType = XFurnitureConfigs.AttrType
local indexA = attrType.AttrA
local indexB = attrType.AttrB
local indexC = attrType.AttrC
local a = XFurnitureConfigs.GetFurnitureAttrLevelDescription(1, indexA, scoreA)
local b = XFurnitureConfigs.GetFurnitureAttrLevelDescription(1, indexB, scoreB)
local c = XFurnitureConfigs.GetFurnitureAttrLevelDescription(1, indexC, scoreC)
return a, b, c
end
-- 获得玩家访问其他宿舍时的角色id(暂时做成随机,二期做成可设置)
function XDormManager.GetVisitorDormitoryCharacterId()
local d = XDormManager.GetAllCharacterIds()
if _G.next(d) == nil then
return 0
end
local index = math.random(1, #d)
return d[index]
end
-- 改名完成修正数据
function XDormManager.RenameSuccess(dormitoryId, newName)
local roomData = DormitoryData[dormitoryId]
if roomData then
roomData:SetRoomName(newName)
end
end
-- 通知有人进入房间
function XDormManager.NotifyDormVisitEnter()
end
-- 通知打工刷新时间
function XDormManager.NotifyDormWorkRefreshTime(data)
if WorkRefreshTime > 0 then
XDormManager.NotifyDormWorkRefreshFlag = true
end
WorkRefreshTime = data.NextRefreshTime or -1
--XDormManager.NotifyDormWorkRefreshFlag = true
XEventManager.DispatchEvent(XEventId.EVENT_DORM_WORK_RESET)
end
function XDormManager.GetDormWorkRefreshTime()
return WorkRefreshTime
end
-- 批量通知构造体心情值和体力值改变
function XDormManager.NotifyCharacterAttr(data)
for _, v in pairs(data.AttrList) do
XDormManager.NotifyCharacterMood(v)
XDormManager.NotifyCharacterVitality(v)
end
end
-- 通知构造体心情值改变
function XDormManager.NotifyCharacterMood(data)
local t = XDormManager.GetCharacterDataByCharId(data.CharacterId)
if not t then
return
end
local changeValue = data.Mood - t.Mood
t.Mood = data.Mood
XEventManager.DispatchEvent(XEventId.EVENT_CHARACTER_MOOD_CHANGED, data.CharacterId, changeValue)
end
-- 通知构造体体力值改变
function XDormManager.NotifyCharacterVitality(data)
local t = XDormManager.GetCharacterDataByCharId(data.CharacterId)
if not t then
return
end
t.Vitality = data.Vitality
XEventManager.DispatchEvent(XEventId.EVENT_CHARACTER_VITALITY_CHANGED, data.CharacterId)
end
-- 通知构造体体力/心情恢复速度改变
function XDormManager.NotifyCharacterSpeedChange(data)
for _, v in ipairs(data.Recoveries) do
local t = XDormManager.GetCharacterDataByCharId(v.CharacterId)
if not t then
return
end
local moodChangeValue = v.MoodSpeed - t.MoodSpeed
local vitalityChangeValue = v.VitalitySpeed - t.VitalitySpeed
t.MoodSpeed = v.MoodSpeed
t.VitalitySpeed = v.VitalitySpeed
if data.ChangeType == XDormConfig.RecoveryType.PutFurniture then
local moodEventId = moodChangeValue > 0 and XDormConfig.ShowEventId.MoodSpeedAdd or XDormConfig.ShowEventId.MoodSpeedCut
local vitalityEventId = vitalityChangeValue > 0 and XDormConfig.ShowEventId.VitalitySpeedAdd
or XDormConfig.ShowEventId.VitalitySpeedCut
if moodChangeValue ~= 0 then
XDormManager.DormShowEventShowAdd(v.CharacterId, moodChangeValue, moodEventId)
end
if vitalityChangeValue ~= 0 then
XDormManager.DormShowEventShowAdd(v.CharacterId, vitalityChangeValue, vitalityEventId)
end
end
end
end
-- 设置是否再爱抚中
function XDormManager.SetInTouch(isInTouch)
IsInTouch = isInTouch
end
-- 是否再爱抚中
function XDormManager.CheckInTouch()
return IsInTouch
end
function XDormManager.DormShowEventShowAdd(charId, changeValue, eventId)
local dormShowEvent = {}
dormShowEvent.CharacterId = charId
dormShowEvent.ChangeValue = changeValue
dormShowEvent.EventId = eventId
table.insert(DormShowEventList, dormShowEvent)
if not XLuaUiManager.IsUiShow("UiDormSecond") then
return
end
if IsInTouch then
return
end
if IsPlayingShowEvent then
return
end
XDormManager.GetNextShowEvent()
end
function XDormManager.GetNextShowEvent()
if #DormShowEventList <= 0 then
IsPlayingShowEvent = false
return
end
if not XLuaUiManager.IsUiShow("UiDormSecond") then
return
end
if IsInTouch then
return
end
IsPlayingShowEvent = true
local firstData = table.remove(DormShowEventList, 1)
XEventManager.DispatchEvent(XEventId.EVENT_DORM_SHOW_EVENT_CHANGE, firstData)
end
-- 通知构造有事件变更
function XDormManager.NotifyDormCharacterAddEvent(data)
if not data or not data.EventList then
return
end
for _, v in ipairs(data.EventList) do
local t = XDormManager.GetCharacterDataByCharId(v.CharacterId)
if not t then
return
end
t.EventList = t.EventList or {}
for _, v2 in ipairs(v.EventList) do
table.insert(t.EventList, v2)
end
XEventManager.DispatchEvent(XEventId.EVENT_CHARACTER_DORMMAIN_EVENT_NOTIFY, t.DormitoryId)
XEventManager.DispatchEvent(XEventId.EVENT_CHARACTER_ADD_EVENT_NOTIFY, v.CharacterId)
end
end
-- 通知构造有事件变更
function XDormManager.NotifyDormCharacterSubEvent(data)
if not data or not data.EventList then
return
end
for _, v in ipairs(data.EventList) do
local t = XDormManager.GetCharacterDataByCharId(v.CharacterId)
if not t then
return
end
local idx = -1
t.EventList = t.EventList or {}
for index, var in ipairs(t.EventList) do
if var.EventId == v.EventId then
idx = index
end
end
if idx > 0 then
table.remove(t.EventList, idx)
end
XEventManager.DispatchEvent(XEventId.EVENT_CHARACTER_SUB_EVENT_NOTIFY, data.CharacterId)
end
end
-- 取回玩家宿舍打工数据(正在打工或者奖励没有领)
-- 保证工位小的在前面
local DormWorkDataSort = function(a, b)
return a.WorkPos < b.WorkPos
end
function XDormManager.GetDormWorkData()
local listData = {}
local d = WorkListData or {}
for _, v in pairs(d) do
if v then
table.insert(listData, v)
end
end
table.sort(listData, DormWorkDataSort)
return listData
end
-- 取回玩家宿舍打工数据(能打工的)
function XDormManager.GetDormNotWorkData()
local listData = {}
local ids = XDormManager.GetAllCharacterIds()
for _, id in pairs(ids) do
if XDormManager.CheckCharInDorm(id) and not XDormManager.IsWorking(id) then
table.insert(listData, id)
end
end
table.sort(listData, function(a, b)
local vitalityA = XDormManager.GetVitalityById(a)
local vitalityB = XDormManager.GetVitalityById(b)
if vitalityA ~= vitalityB then
return vitalityA > vitalityB
end
return a < b
end)
return listData
end
-- 是否在打工中
function XDormManager.IsWorking(charId)
local d = WorkListData or {}
for _, v in pairs(d) do
if v.CharacterId == charId then
local f = v.WorkEndTime - XTime.GetServerNowTimestamp() > 0
if f then
return true
end
end
end
return false
end
-- 取回玩家宿舍已经占了的工位
function XDormManager.GetDormWorkPosData()
local posList = {}
local d = WorkListData or {}
for _, v in pairs(d) do
posList[v.WorkPos] = v.WorkPos
end
return posList
end
-- 当前拥有的宿舍
function XDormManager.GetDormitoryCount()
local count = 0
for _, room in pairs(DormitoryData) do
if room:WhetherRoomUnlock() then
count = count + 1
end
end
return count
end
-- 检查某个宿舍是否激活
function XDormManager.IsDormitoryActive(dormitoryId)
local room = DormitoryData[dormitoryId]
if not room then return false end
return room:WhetherRoomUnlock()
end
-- 当前已经激活的房间ID
function XDormManager.GetDormitoryActiveIds()
local ids = {}
for dormitoryId, room in pairs(DormitoryData) do
if room:WhetherRoomUnlock() then
table.insert(ids, dormitoryId)
end
end
return ids
end
--
function XDormManager.GetDormitoryCount()
local count = 0
for _, room in pairs(DormitoryData) do
if room:WhetherRoomUnlock() then
count = count + 1
end
end
return count
end
-- 如果拥有的数量超过配置的最大数量,就取最大数量。
function XDormManager.GetWorkCfg(dormCount)
local cfgWork = XDormConfig.GetDormCharacterWorkData() or {}
local count = XDormManager.GetDormitoryCount()
if dormCount then
count = dormCount
end
local index = count
local temple = #cfgWork
if count > temple then
index = temple
end
local data = XDormConfig.GetDormCharacterWorkById(index)
return data
end
2024-09-01 20:49:41 +00:00
--- 获取宿舍与模板宿舍家具数
---@param dormId number @宿舍Id
---@param templateDormId number @模板宿舍Id
---@param templateDormType number @模板宿舍类型
---@return number,number
--------------------------
function XDormManager.GetRoomAndTemplateFurnitureCount(dormId, templateDormId, templateDormType)
templateDormType = templateDormType or XDormConfig.DormDataType.Template
local templateData = XDormManager.GetRoomDataByRoomId(templateDormId, templateDormType)
local dormData = DormitoryData[dormId]
if not templateData or not dormData then
2024-09-01 20:49:41 +00:00
return 0, 0
end
--宿舍
local dormFurniture = dormData:GetFurnitureConfigDic()
--背包
local bagFurniture = XDataCenter.FurnitureManager.GetUnUseFurniture()
--模板宿舍
local tempFurniture = templateData:GetFurnitureDic()
local map = {}
for _, furniture in pairs(tempFurniture) do
local id = furniture.ConfigId
map[id] = map[id] or 0
map[id] = map[id] + 1
end
local tempCount, ownCount = 0, 0
for configId, count in pairs(map) do
local dormList = dormFurniture[configId] or {}
local bagList = bagFurniture[configId] or {}
tempCount = tempCount + count
ownCount = ownCount + math.min(count, #dormList + #bagList)
end
return math.min(ownCount, tempCount), tempCount
end
--- 获取宿舍与模板宿舍之间的达成百分比
---@param dormId number @宿舍Id
---@param templateDormId number @模板宿舍Id
---@param templateDormType number @模板宿舍类型
---@return number
--------------------------
function XDormManager.GetDormTemplatePercent(dormId, templateDormId, templateDormType)
local ownCount, tempCount = XDormManager.GetRoomAndTemplateFurnitureCount(dormId, templateDormId, templateDormType)
if not XTool.IsNumberValid(tempCount) or not XTool.IsNumberValid(ownCount) then
return 0
end
2024-09-01 20:49:41 +00:00
return math.floor(math.min(ownCount / tempCount, 1) * 100)
end
--==============================--
--desc: 获取宿舍某个家具数量
--@roomId: 房间ID
--@dormDataType: 房间类型
--@isIncludeUnUse: 是否加上背包未使用的家具
--@return 数量
--==============================--
2024-09-01 20:49:41 +00:00
function XDormManager.GetFurnitureCountInDorm(roomId, dormDataType, configId, isIncludeUnUse)
local roomData = XDormManager.GetRoomDataByRoomId(roomId, dormDataType)
local furnitureCount = #roomData:GetFurnitureConfigByConfigId(configId)
if isIncludeUnUse then
2024-09-01 20:49:41 +00:00
local unUseCount = #XDataCenter.FurnitureManager.GetUnUseFurnitureById(configId)
furnitureCount = furnitureCount + unUseCount
end
return furnitureCount
end
2024-09-01 20:49:41 +00:00
--- 获取玩家拥有的家具数量
---@param configId number 家具配置Id
---@param isIncludeUnUse boolean 是否包含玩家背包里未使用的
---@return number
--------------------------
function XDormManager.GetOwnFurnitureCount(configId, isIncludeUnUse)
local count = 0
for _, roomData in pairs(DormitoryData) do
if roomData:WhetherRoomUnlock() then
count = count + #roomData:GetFurnitureConfigByConfigId(configId)
end
end
if isIncludeUnUse then
count = count + #XDataCenter.FurnitureManager.GetUnUseFurnitureById(configId)
end
return count
end
function XDormManager.GetLocalCaptureCache(id)
local texture = LocalCaptureCache[id]
2024-09-01 20:49:41 +00:00
return texture
end
function XDormManager.SetLocalCaptureCache(id, texture)
LocalCaptureCache[id] = texture
end
function XDormManager.ClearLocalCaptureCache()
for _, texture in pairs(LocalCaptureCache) do
if not XTool.UObjIsNil(texture) then
CS.UnityEngine.Object.Destroy(texture)
end
end
LocalCaptureCache = {}
end
---------------------end data---------------------
---------------------start net---------------------
function XDormManager.UpdateDormData(roomId, roomData)
local newRoomData = XHomeRoomData.New(roomId)
newRoomData:SetPlayerId(XPlayer.Id)
local furnitureList = roomData:GetFurnitureDic()
for _, furniture in pairs(furnitureList) do
local furnitureData = XDataCenter.FurnitureManager.GetFurnitureById(furniture.Id)
if furnitureData then
newRoomData:AddFurniture(furnitureData.Id, furnitureData.ConfigId, furnitureData.X, furnitureData.Y, furnitureData.Angle)
end
end
DormitoryData[roomId] = newRoomData
end
function XDormManager.SetRoomDataDormitoryId(roomData, roomId)
local furnitureList = roomData:GetFurnitureDic()
for _, furniture in pairs(furnitureList) do
XDataCenter.FurnitureManager.SetFurnitureState(furniture.Id, roomId)
end
end
-- 房间家具摆放
function XDormManager.RequestDecorationRoom(roomId, room, isBehavior, cb)
if isBehavior then
local now = XTime.GetServerNowTimestamp()
if LastPutFurnitureTime + SYNC_PUTFURNITURE_SECOND >= now then
if cb then
cb(true)
end
return
end
LastPutFurnitureTime = now
end
if not room then return end
2024-09-01 20:49:41 +00:00
room:RejectUnOwn()
local roomData = room:GetData()
if not roomData then return end
local furnitureList = {}
local furnitures = roomData:GetFurnitureDic()
local roomDataType = roomData:GetRoomDataType()
local roomUnsaveData = XDormManager.GetRoomDataByRoomId(roomId, roomDataType)
local successCb = function(isSuccess)
room:GenerateRoomMap()
-- 提示成功
if not isBehavior then
XUiManager.TipMsg(CS.XTextManager.GetText("FurnitureSaveSuccess"))
end
if roomDataType == XDormConfig.DormDataType.Self then
-- 修改保存之前的家具为不属于这个房间
XDormManager.SetRoomDataDormitoryId(roomUnsaveData, 0)
-- 修改保存之后的家具为属于这个房间
XDormManager.SetRoomDataDormitoryId(roomData, roomId)
-- 将修改保存起来(直接替换旧数据)
DormitoryData[roomId]:SetFurnitureDic(roomData:GetFurnitureDic())
elseif roomDataType == XDormConfig.DormDataType.Collect then
TempDormitoryData[roomId]:SetFurnitureDic(roomData:GetFurnitureDic())
local imgName = tostring(XPlayer.Id) .. tostring(roomId)
local texture = XHomeSceneManager.CaptureCamera(imgName, false)
XDormManager.SetLocalCaptureCache(imgName, texture)
elseif roomDataType == XDormConfig.DormDataType.Provisional then
local provisionalRoom = XDormManager.GetDormProvisionalData(roomId)
provisionalRoom:SetFurnitureDic(roomData:GetFurnitureDic())
elseif roomDataType == XDormConfig.DormDataType.Template then
TempDormitoryData[roomId]:SetFurnitureDic(roomData:GetFurnitureDic())
end
CsXGameEventManager.Instance:Notify(XEventId.EVENT_FURNITURE_REFRESH)
if cb then
cb(isSuccess)
end
end
for _, v in pairs(furnitures) do
local data = {}
if roomDataType == XDormConfig.DormDataType.Self then
data.Id = v.Id
else
data.ConfigId = v.ConfigId
end
data.X = v.GridX
data.Y = v.GridY
data.Angle = v.RotateAngle
table.insert(furnitureList, data)
end
if roomDataType == XDormConfig.DormDataType.Self then
XDataCenter.FurnitureManager.PutFurniture(roomId, furnitureList, isBehavior, successCb)
elseif roomDataType == XDormConfig.DormDataType.Collect then
local name = roomData:GetRoomName()
XDormManager.CollectPutFunitrue(roomId, name, furnitureList, successCb)
else
successCb(true)
end
end
-- 请求宿舍分享ID
function XDormManager.RequestDormSnapshotLayout(furnitureList, cb)
if SnapshotTimes <= XDormConfig.MAX_SHARE_COUNT then
local now = XTime.GetServerNowTimestamp()
if LastShareTime + XDormConfig.GET_SHARE_ID_INTERVAL > now then
-- 需要等待的时间比现在还晚
local waitTime = (LastShareTime + XDormConfig.GET_SHARE_ID_INTERVAL) - now
local tip = CS.XTextManager.GetText("DormShareWaitTime", waitTime)
XUiManager.TipMsg(tip)
return
end
LastShareTime = now
table.sort(furnitureList, function(item1, item2)
if item1.ConfigId ~= item2.ConfigId then
return item1.ConfigId < item2.ConfigId
end
if item1.X == nil or item2.X == nil then
return false
elseif item1.X ~= item2.X then
return item1.X < item2.X
end
if item1.Y == nil or item2.Y == nil then
return false
elseif item1.Y ~= item2.Y then
return item1.Y < item2.Y
end
if item1.Angle == nil or item2.Angle ==nil then
return false
else
return item1.Angle < item2.Angle
end
end)
local req = { FurnitureList = furnitureList}
XNetwork.Call(DormitoryRequest.DormSnapshotLayoutReq, req, function(res)
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
return
end
-- 更新分享次数
SnapshotTimes = res.SnapshotTimes
if cb then
cb(res.ShareId)
end
end)
else
XUiManager.TipText("DormShareCountNotEnough")
end
end
-- 获取构造体回复速度
function XDormManager.GetDormitoryRecoverSpeed(charId, cb)
local t = XDormManager.GetCharacterDataByCharId(charId)
if not t then
return nil
end
local moodSpeed = string.format("%.1f", t.MoodSpeed / 100)
local vitalitySpeed = string.format("%.1f", t.VitalitySpeed / 100)
if moodSpeed * 10 % 10 == 0 then
moodSpeed = string.format("%d", moodSpeed)
end
if vitalitySpeed * 10 % 10 == 0 then
vitalitySpeed = string.format("%d", vitalitySpeed)
end
if cb then
cb(moodSpeed, vitalitySpeed, t)
end
end
-- 激活宿舍
function XDormManager.RequestDormitoryActive(dormitoryId, cb)
XNetwork.Call(DormitoryRequest.ActiveDormItemReq, { DormitoryId = dormitoryId }, function(res)
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
return
end
XDormManager.ReqDormitoryActiveSuccess(res.DormitoryId, res.DormitoryName, res.FurnitureList)
if cb then
cb()
end
XUiManager.TipText("DormActiveSuccessTips")
XEventManager.DispatchEvent(XEventId.EVENT_DORM_ROOM_ACTIVE_SUCCESS)
end)
end
-- 激活宿舍成功修正数据
function XDormManager.ReqDormitoryActiveSuccess(dormitoryId, dormitoryName, furnitureList)
for _, v in pairs(furnitureList) do
XDataCenter.FurnitureManager.AddFurniture(v)
end
local roomData = DormitoryData[dormitoryId]
if roomData then
roomData:SetRoomName(dormitoryName)
roomData:SetRoomUnlock(true)
for _, data in pairs(furnitureList) do
roomData:AddFurniture(data.Id, data.ConfigId, data.X, data.Y, data.Angle)
end
end
local room = XHomeDormManager.GetSingleDormByRoomId(dormitoryId)
2024-09-01 20:49:41 +00:00
room:SetData(roomData, roomData:GetRoomDataType())
end
--返回自己宿舍-主界面
function XDormManager.BackToDormitoryMain(dormitoryId)
if not XTool.IsNumberValid(dormitoryId) then
dormitoryId = CurrentDormId
end
XHomeDormManager.LoadRooms(XDataCenter.DormManager.GetDormitoryData(), XDormConfig.DormDataType.Self, true)
XHomeDormManager.SetSelectedRoom(dormitoryId, false, false)
end
-- 访问宿舍(包括自己和他人的)
function XDormManager.VisitDormitory(displayState, dormitoryId)
local f = displayState == XDormConfig.VisitDisplaySetType.MySelf
2024-09-01 20:49:41 +00:00
local isVisitor = false
local ids = XDormManager.GetDormitoryActiveIds()
for _, dormId in pairs(ids) do
XHomeDormManager.RevertOnWall(dormId)
end
if f then
local data = XDataCenter.DormManager.GetDormitoryData()
XHomeDormManager.LoadRooms(data, XDormConfig.DormDataType.Self)
else
local data = XDataCenter.DormManager.GetDormitoryData(XDormConfig.DormDataType.Target)
XHomeDormManager.LoadRooms(data, XDormConfig.DormDataType.Target)
2024-09-01 20:49:41 +00:00
isVisitor = true
end
2024-09-01 20:49:41 +00:00
XHomeDormManager.SetSelectedRoom(dormitoryId, true, isVisitor)
end
-- 进入模板宿舍(包括临时模板)
2024-09-01 20:49:41 +00:00
function XDormManager.EnterTemplateDormitory(dormitoryId, roomDataType, fromRoomId)
local roomType = roomDataType
local isCollectNone = roomType == XDormConfig.DormDataType.CollectNone
if isCollectNone then
roomType = XDormConfig.DormDataType.Template
end
local data = XDormManager.GetRoomDataByRoomId(dormitoryId, roomType)
if isCollectNone then
2024-09-01 20:49:41 +00:00
local defaultFurniture = XDataCenter.FurnitureManager.GetCollectNoneFurniture(dormitoryId)
if defaultFurniture then
data:SetFurnitureDic(defaultFurniture)
end
end
2024-09-01 20:49:41 +00:00
XHomeDormManager.LoadRooms({ data }, roomType)
XLuaUiManager.Open("UiDormTemplateScene", dormitoryId, roomDataType, nil, fromRoomId)
XHomeDormManager.SetSelectedRoom(dormitoryId, true)
end
2024-09-01 20:49:41 +00:00
function XDormManager.OpenNotification(title, content, positiveCb, negativeCb, positiveTxt, negativeTxt, ignoreClose)
local uiName = "UiDormNotification"
if XLuaUiManager.IsUiLoad(uiName) or XLuaUiManager.IsUiShow(uiName) then
XLuaUiManager.SafeClose(uiName)
end
XLuaUiManager.Open(uiName, title, content, positiveCb, negativeCb, positiveTxt, negativeTxt, ignoreClose)
end
--- 获取该宿舍以及背包未拥有的家具
---@param roomId number @宿舍Id
---@param templateId number @模板宿舍Id
---@param templateDataType number @模板宿舍Id
---@return table
--------------------------
function XDormManager.GetNotOwnedFurniture(roomId, templateId, templateDataType)
if not XTool.IsNumberValid(roomId) or not XTool.IsNumberValid(templateId) then
return
end
local currentRoom = XDormManager.GetRoomDataByRoomId(roomId, XDormConfig.DormDataType.Self)
local tempRoom = XDormManager.GetRoomDataByRoomId(templateId, templateDataType)
if not currentRoom or not tempRoom then
return
end
--模板宿舍家具
local targetFurnitureMap = tempRoom:GetFurnitureDic()
--宿舍内家具
local currentRoomFurnitureMap = currentRoom:GetFurnitureConfigDic()
--背包内家具
local bagFurnitureMap = XDataCenter.FurnitureManager.GetUnUseFurniture()
--目标家具
local map = {}
for _, furniture in pairs(targetFurnitureMap) do
local configId = furniture.ConfigId
map[configId] = map[configId] or 0
map[configId] = map[configId] + 1
end
local notUnOwn = {}
for configId, count in pairs(map) do
local roomList = currentRoomFurnitureMap[configId] or {}
local bagList = bagFurnitureMap[configId] or {}
local ownCount = #roomList + #bagList
if ownCount < count then
table.insert(notUnOwn, {
ConfigId = configId,
Count = count - ownCount,
})
end
end
table.sort(notUnOwn, function(a, b)
local typeIdA = XFurnitureConfigs.GetFurnitureTemplateById(a.ConfigId).TypeId
local typeIdB = XFurnitureConfigs.GetFurnitureTemplateById(b.ConfigId).TypeId
if typeIdA ~= typeIdB then
local templateA = XFurnitureConfigs.GetFurnitureTypeById(typeIdA)
local templateB = XFurnitureConfigs.GetFurnitureTypeById(typeIdB)
return templateA.Priority < templateB.Priority
end
return a.ConfigId < b.ConfigId
end)
return notUnOwn
end
-- 房间改名
function XDormManager.RequestDormitoryRename(dormitoryId, newName, cb)
XNetwork.Call(DormitoryRequest.DormRenameReq, { DormitoryId = dormitoryId, NewName = newName }, function(res)
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
return
end
if cb then
XDormManager.RenameSuccess(dormitoryId, newName)
cb()
end
end)
end
-- 摆放家具请求
function XDormManager.RequestDormitoryPutFurniture(dormitoryId, furnitureList, cb)
XNetwork.Call(DormitoryRequest.PutFurnitureReq, { DormitoryId = dormitoryId, FurnitureList = furnitureList }, function(res)
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
return
end
if cb then
cb()
end
end)
end
-- 退出宿舍请求
function XDormManager.RequestDormitoryExit()
XNetwork.Send(DormitoryRequest.DormExitReq)
end
-- 进入宿舍通知
function XDormManager.RequestDormitoryDormEnter(cb)
XNetwork.Call(DormitoryRequest.DormEnterReq, nil, function(res)
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
return
end
local data = res.CharacterEvents
if data then
for _, v in pairs(data) do
local t = XDormManager.GetCharacterDataByCharId(v.CharacterId)
if not t then
return
end
t.EventList = v.EventList
end
end
if cb then
cb()
end
end)
end
-- 构造体处理事件反馈
function XDormManager.RequestDormitoryCharacterOperate(charId, dormitoryId, eventId, operateType, cb)
XNetwork.Call(DormitoryRequest.DormCharacterOperateReq, { CharacterId = charId, EventId = eventId, OperateType = operateType }, function(res)
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
return
end
local character = XDormManager.GetCharacterDataByCharId(charId)
if not character.EventList then
return
end
local index = -1
for i, v in ipairs(character.EventList) do
if v.EventId == eventId then
index = i
end
end
if index > 0 then
table.remove(character.EventList, index)
end
XHomeCharManager.SetEventReward(charId, res.RewardGoods)
-- 处理回复弹条
local changeValue = math.floor(res.MoodValue / 100)
if character.Mood + changeValue > XDormConfig.DORM_MOOD_MAX_VALUE then
changeValue = XDormConfig.DORM_MOOD_MAX_VALUE - character.Mood
end
character.Mood = character.Mood + changeValue
local showEventId = changeValue > 0 and XDormConfig.ShowEventId.MoodAdd or XDormConfig.ShowEventId.MoodCut
XDormManager.DormShowEventShowAdd(charId, changeValue, showEventId)
XEventManager.DispatchEvent(XEventId.EVENT_CHARACTER_MOOD_CHANGED, charId, changeValue)
if cb then
cb()
end
end)
end
-- 放置构造体
function XDormManager.RequestDormitoryPutCharacter(dormitoryId, characterIds, cb)
XNetwork.Call(DormitoryRequest.DormPutCharacterReq, { DormitoryId = dormitoryId, CharacterIds = characterIds }, function(res)
XDormManager.PutCharacterSuccess(dormitoryId, res.SuccessIds)
if cb then
cb()
end
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
return
end
XEventManager.DispatchEvent(XEventId.EVENT_CHARACTER_CHANGE_ROOM_CHARACTER, characterIds)
end)
end
-- 放置构造体成功修正数据
function XDormManager.PutCharacterSuccess(dormitoryId, characterIds)
if not dormitoryId or not characterIds then
return
end
for _, id in pairs(characterIds) do
local d = CharacterData[id]
if d then
d.DormitoryId = dormitoryId
end
local roomData = DormitoryData[dormitoryId]
roomData:AddCharacter(d)
local room = XHomeDormManager.GetRoom(dormitoryId)
if room and room.IsSelected then
room.Data.Character = roomData.Character
room:AddCharacter(dormitoryId, id)
end
end
end
-- 重新放置构造体
function XDormManager.ResetPutCharacter(dormitoryId, characterIds)
if not dormitoryId or not characterIds or #characterIds <= 0 then
return
end
for _, id in pairs(characterIds) do
local room = XHomeDormManager.GetRoom(dormitoryId)
if room and room.IsSelected then
room:AddCharacter(dormitoryId, id)
end
end
end
-- 移走构造体
function XDormManager.RequestDormitoryRemoveCharacter(characterIds, cb)
XNetwork.Call(DormitoryRequest.DormRemoveCharacterReq, { CharacterIds = characterIds }, function(res)
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
return
end
XDormManager.RemoveCharacterSuccess(res.SuccessList)
if cb then
cb()
end
XEventManager.DispatchEvent(XEventId.EVENT_CHARACTER_CHANGE_ROOM_CHARACTER, characterIds)
end)
end
-- 移走构造体成功修正数据
function XDormManager.RemoveCharacterSuccess(successList)
if not successList then
return
end
for _, v in pairs(successList) do
local roomData = DormitoryData[v.DormitoryId]
if roomData then
roomData:RemoveCharacter(v.CharacterId)
local room = XHomeDormManager.GetRoom(v.DormitoryId)
if room then
room:RemoveCharacter(v.DormitoryId, v.CharacterId)
end
end
local id = v.CharacterId
local d = CharacterData[id]
if d then
d.DormitoryId = -1
end
end
end
-- 请求刷新家具建造列表
function XDormManager.RequestDormitoryCheckCreateFurniture(cb)
XNetwork.Call(DormitoryRequest.CheckCreateFurnitureReq, nil, function(res)
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
return
end
if cb then
cb(res.FurnitureList)
end
end)
end
-- 访问具体宿舍
function XDormManager.RequestDormitoryVisit(targetId, dormitoryId, characterId, cb)
XNetwork.Call(DormitoryRequest.DormVisitReq, { TargetId = targetId, DormitoryId = dormitoryId, CharacterId = characterId }, function(res)
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
return
end
XDormManager.DormitoryVisitData(res.VisitorList, res.CharacterList, res.DormitoryList, res.FurnitureList, res.PlayerName, targetId)
if cb then
cb()
end
end)
end
-- 访问具体宿舍数据记录
function XDormManager.DormitoryVisitData(visitorList, characterList, dormitoryList, furnitureList, playername, targetId)
local dormitoryCfgs = XDormConfig.GetTotalDormitoryCfg()
-- 宿舍布局数据
for id, _ in pairs(dormitoryCfgs) do
TargetDormitoryData[id] = XHomeRoomData.New(id)
TargetDormitoryData[id]:SetPlayerId(targetId)
TargetDormitoryData[id]:SetRoomDataType(XDormConfig.DormDataType.Target)
TargetDormitoryData[id].PlayerName = playername
end
if dormitoryList then
for _, data in pairs(dormitoryList) do
local roomData = TargetDormitoryData[data.DormitoryId]
if not roomData then
XLog.Error("XDormManager.DormitoryVisitData错误: dormitory id is not exist, id = " .. tostring(data.DormitoryId))
else
roomData:SetRoomUnlock(true)
roomData:SetRoomName(data.DormitoryName)
end
end
end
-- 宿舍家具
XDataCenter.FurnitureManager.RemoveFurnitureOther()
if furnitureList then
for _, data in pairs(furnitureList) do
local roomData = TargetDormitoryData[data.DormitoryId]
if roomData then
roomData:SetRoomUnlock(true)
roomData:AddFurniture(data.Id, data.ConfigId, data.X, data.Y, data.Angle)
XDataCenter.FurnitureManager.AddFurniture(data, XDormConfig.DormDataType.Target)
end
end
end
-- 构造体数据
if characterList then
for _, data in ipairs(characterList) do
TargetCharacterData[data.CharacterId] = data
if data.DormitoryId and data.DormitoryId > 0 then
local roomData = TargetDormitoryData[data.DormitoryId]
if roomData then
roomData:AddCharacter(data)
end
end
end
end
-- 正在访问宿舍数据
-- if visitorList then
-- for _, data in pairs(visitorList) do
-- TargetVisitorData[data.CharacterId] = data
-- end
-- end
end
-- 推荐访问
function XDormManager.RequestDormitoryRecommend(cb)
2024-09-01 20:49:41 +00:00
local timeOfNow = XTime.GetServerNowTimestamp()
if timeOfNow - LastRequestUnknownVisitor < VisitRequestTimeLimit then
if cb then cb(RecommVisData) end
XUiManager.TipText("RecommendFriendError")
return
end
XNetwork.Call(DormitoryRequest.DormRecommendReq, nil, function(res)
2024-09-01 20:49:41 +00:00
LastRequestUnknownVisitor = timeOfNow
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
return
end
2024-09-01 20:49:41 +00:00
RecommVisData = res
if cb then
cb(res)
end
end)
end
2024-09-01 20:49:41 +00:00
function XDormManager.GetDormitoryTargetScore(roomId)
local roomData = XDormManager.GetRoomDataByRoomId(roomId, XDormConfig.DormDataType.Target)
if not roomData then
return
end
return XHomeDormManager.GetFurnitureScoresByRoomData(roomData, XDormConfig.DormDataType.Target)
end
-- 取推荐访问id和是否是最后一个(当前dormId的下一个id,最后一个直接返回dormId和true)
function XDormManager.GetDormitoryRecommendDataForNext(dormId)
local data = XDormManager.GetDormitoryRecommendTotalDormId()
local len = #data
local f = false
for i = 1, len do
if f then
return data[i], len == i
end
if data[i] == dormId then
f = true
end
end
return dormId, true
end
-- 取推荐访问id和是否是前一个(当前dormId的上一个id,第一个直接返回dormId和true)
function XDormManager.GetDormitoryRecommendDataForPre(dormId)
local data = XDormManager.GetDormitoryRecommendTotalDormId()
local f = false
for i, v in pairs(data) do
if f then
return v, i == 1
end
if v == dormId then
f = true
end
end
return dormId, true
end
-- 取所有推荐访问DormId
function XDormManager.GetDormitoryRecommendTotalDormId()
local d = {}
for _, v in pairs(RecommVisIds) do
table.insert(d, v)
end
return d
end
function XDormManager.HandleVisFriendData(data)
if data then
for _, v in pairs(data) do
if v.DormitoryId ~= 0 then
v.DataTime = XTime.GetServerNowTimestamp()
RecommVisFriendData[v.PlayerId] = v
end
end
end
return RecommVisFriendData
end
function XDormManager.GetVisFriendData()
return RecommVisFriendData
end
function XDormManager.GetVisFriendById(playerid)
if not playerid then
return
end
if RecommVisFriendData and RecommVisFriendData[playerid] then
return RecommVisFriendData[playerid]
end
end
-- 访问具体数据
function XDormManager.RequestDormitoryDetails(players, cb)
XNetwork.Call(DormitoryRequest.DormDetailsReq, { Players = players }, function(res)
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
return
end
XDormManager.HandleVisFriendData(res.Details)
if cb then
cb()
end
end)
end
-- 宿舍打工
function XDormManager.RequestDormitoryWork(works, cb)
XNetwork.Call(DormitoryRequest.DormWorkReq, { Works = works }, function(res)
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
return
end
XDormManager.DormWorkRespHandle(res.WorkList)
if cb then
cb(res)
end
end)
end
-- 打工成功修正数据
function XDormManager.DormWorkRespHandle(workList)
if not workList then
return
end
for _, data in pairs(workList) do
WorkListData[data.WorkPos] = data
local dormitoryId = XDormManager.GetCharacterRoomNumber(data.CharacterId)
if dormitoryId then
local room = XHomeDormManager.GetRoom(dormitoryId)
if room then
room:RemoveCharacter(dormitoryId, data.CharacterId)
end
end
end
end
-- 宿舍打工领取奖励
function XDormManager.RequestDormitoryWorkReward(posList, cb)
XNetwork.Call(DormitoryRequest.DormWorkRewardReq, { PosList = posList }, function(res)
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
return
end
XDormManager.DormWorkRewardGet(res.WorkRewards)
if cb then
cb()
end
end)
end
-- 领取奖励成功修正数据
function XDormManager.DormWorkRewardGet(workRewards)
if not workRewards or _G.next(workRewards) == nil then
return
end
local rewards = {}
local workPos = {}
for _, v0 in pairs(workRewards) do
for _, v1 in pairs(WorkListData) do
if v1.WorkPos == v0.WorkPos then
if v0.ResetCount == 0 then
v1.WorkEndTime = 0
else
workPos[v1.WorkPos] = v1.WorkPos
end
end
end
table.insert(rewards, { TemplateId = v0.ItemId, Count = v0.ItemNum, RewardType = v0.RewardType or XRewardManager.XRewardType.Item })
end
for pos, _ in pairs(workPos) do
for index, item in pairs(WorkListData) do
if item and item.WorkPos == pos then
WorkListData[index] = nil
end
end
end
XUiManager.OpenUiObtain(rewards)
end
-- 爱抚信息查询
function XDormManager.GetDormFondleData(characterId, cb)
if not characterId then
return
end
XNetwork.Call(DormitoryRequest.FondleDataReq, { CharacterId = characterId }, function(res)
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
return
end
local fondle = { LastRecoveryTime = res.LastRecoveryTime, LeftCount = res.FondleCount }
if cb then
cb(fondle)
end
end)
end
-- 爱抚请求
function XDormManager.DoFondleReq(characterId, fondleType, cb)
if not characterId or not fondleType then
return
end
local now = XTime.GetServerNowTimestamp()
if fondleType == XDormConfig.TouchState.WaterGun then
if LastSyncServerTime + XDormConfig.WATERGUN_TIME >= now then
return
end
end
LastSyncServerTime = now
local req = { CharacterId = characterId, FondleType = fondleType }
XNetwork.Call(DormitoryRequest.FondleReq, req, function(res)
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
return
end
if cb then
cb()
end
end)
end
-- 代工请求
function XDormManager.DormWordDoneReq(workposList, cb)
if not workposList then
return
end
local req = { WorkPos = workposList }
XNetwork.Call(DormitoryRequest.DormWordDoneReq, req, function(res)
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
return
end
XDormManager.DormCharacterRewardGet(res.WorkRewards, res.ExtraRewards, workposList)
XEventManager.DispatchEvent(XEventId.EVENT_DORM_DAI_GONE_REWARD)
if cb then
cb()
end
end)
end
--记录玩家最后停留的宿舍Id
function XDormManager.SetCurrentDormId(dormId)
CurrentDormId = dormId
end
--一键代工后回调(因为点返回不会重新读取小人状态,临时把角色小人加回宿舍)
function XDormManager.QuickDormDoneCallBack(workposList)
if CurrentDormId == -1 then return end --若记录停留的宿舍为空说明没有进入宿舍页面,不用重新放入小人
local checkDic = {} --检查同一个宿舍不用重复Reset
for _, pos in pairs(workposList) do
local data = WorkListData[pos]
if data then
local dormitoryId = XDormManager.GetCharacterRoomNumber(data.CharacterId)
if dormitoryId and not checkDic[dormitoryId] and dormitoryId == CurrentDormId then
local room = XHomeDormManager.GetRoom(dormitoryId)
if room then
room:ResetCharacterList()
end
checkDic[dormitoryId] = true
end
end
end
end
function XDormManager.DormCharacterRewardGet(workRewards, extraRewards)
if (not workRewards or _G.next(workRewards) == nil) and (not extraRewards or _G.next(extraRewards) == nil) then
return
end
local rewards = {}
local workPos = {}
for _, v0 in pairs(workRewards) do
for _, v1 in pairs(WorkListData) do
if v1.WorkPos == v0.WorkPos then
if v0.ResetCount == 0 then
v1.WorkEndTime = 0
else
workPos[v1.WorkPos] = v1.WorkPos
end
end
end
table.insert(rewards, { TemplateId = v0.ItemId, Count = v0.ItemNum, RewardType = v0.RewardType or XRewardManager.XRewardType.Item })
end
for _, v in pairs(extraRewards) do
table.insert(rewards, { TemplateId = v.TemplateId, Count = v.Count, RewardType = v.RewardType or XRewardManager.XRewardType.Item })
end
for pos, _ in pairs(workPos) do
for index, item in pairs(WorkListData) do
if item and item.WorkPos == pos then
WorkListData[index] = nil
end
end
end
XUiManager.OpenUiObtain(rewards)
end
function XDormManager.NotifyFurnitureUnLock(data)
XDormManager.FurnitureUnlockList = {}
if data and data.FurnitureUnlockList then
for _, v in pairs(data.FurnitureUnlockList) do
XDormManager.FurnitureUnlockList[v] = v
end
end
end
function XDormManager.IdFurnitureUnLock(id)
return XDormManager.FurnitureUnlockList[id] ~= nil or XDataCenter.FurnitureManager.IsFieldGuideHave(id)
end
-- 已使用的分享次数
function XDormManager.NotifySnapshotTimes(data)
SnapshotTimes = data.SnapshotTimes
end
function XDormManager.GetSnapshotTimes()
return SnapshotTimes
end
-- 打工数据
function XDormManager.NotifyDormWork(data)
2024-09-01 20:49:41 +00:00
WorkListData = {}
if data and data.WorkList then
for _, tmpData in pairs(data.WorkList) do
WorkListData[tmpData.WorkPos] = tmpData
end
end
end
function XDormManager.GetDormWorkByPos(pos)
return WorkListData[pos]
end
function XDormManager.GetDormWorkRewCounrByPos(pos)
if WorkListData[pos] and WorkListData[pos].RewardNum then
return WorkListData[pos].RewardNum
end
return 0
end
-- 打工Red
function XDormManager.DormWorkRedFun()
if _G.next(WorkListData) ~= nil then
for _, data in pairs(WorkListData) do
if data.WorkEndTime > 0 and data.WorkEndTime < XTime.GetServerNowTimestamp() then
return true
end
end
end
return false
end
-- 重置打工工位
function XDormManager.ResetDormWorkPos()
local workdata = {}
if _G.next(WorkListData) ~= nil then
for _, data in pairs(WorkListData) do
if data.WorkEndTime ~= 0 then
workdata[data.WorkPos] = data
end
end
end
WorkListData = workdata
end
-- 启动
function XDormManager.StartDormRedTimer()
if DormRedTimer then
return
end
DormRedTimer = XScheduleManager.ScheduleForever(XDormManager.UpdateDormRed, 2000)
end
-- 停止
function XDormManager.StopDormRedTimer()
if not DormRedTimer then
return
end
XScheduleManager.UnSchedule(DormRedTimer)
DormRedTimer = nil
end
function XDormManager.UpdateDormRed()
XEventManager.DispatchEvent(XEventId.EVENT_DORM_WORK_REDARD)
2024-09-01 20:49:41 +00:00
--XEventManager.DispatchEvent(XEventId.EVENT_FURNITURE_CREATE_CHANGED)
end
-- 宿舍性别
--function XDormManager.GetDormSex(characterId)
-- return XDormConfig.GetCharacterStyleConfigSexById(characterId)
--end
function XDormManager.NotifyAddDormCharacter(data)
if data then
for _, v in pairs(data) do
CharacterData[v.CharacterId] = v
if v.DormitoryId and v.DormitoryId > 0 then
local roomData = DormitoryData[v.DormitoryId]
if roomData then
roomData:AddCharacter(v)
end
end
end
end
end
-- 获取他人宿舍模板请求
function XDormManager.DormGetPlayerLayoutReq(shareId, cb)
if not shareId then
return
end
local req = { ShareId = shareId }
XNetwork.Call(DormitoryRequest.DormGetPlayerLayoutReq, req, function(res)
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
return
end
XDormManager.SetDormProvisionalData(shareId, res.FurnitureList)
if cb then
cb()
end
end)
end
-- 绑定模板宿舍
function XDormManager.DormBindLayoutReq(dormId, templateId, cb)
if not dormId or not templateId then
return
end
local req = { DormitoryId = dormId, LayoutId = templateId }
XNetwork.Call(DormitoryRequest.DormBindLayoutReq, req, function(res)
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
return
end
if cb then
cb()
end
end)
end
-- 解除绑定模板宿舍
2024-09-01 20:49:41 +00:00
function XDormManager.DormUnBindLayoutReq(dormId, cb)
if not XTool.IsNumberValid(dormId) then
return
end
2024-09-01 20:49:41 +00:00
local req = { DormitoryId = dormId }
XNetwork.Call(DormitoryRequest.DormUnBindLayoutReq, req, function(res)
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
return
end
if cb then
cb()
end
end)
end
-- 收藏宿舍模板
function XDormManager.DormCollectLayoutReq(id, name, furnitureList, cb)
if not id or not name or not furnitureList then
return
end
local req = { LayoutId = id, LayoutName = name, FurnitureList = furnitureList }
XNetwork.Call(DormitoryRequest.DormCollectLayoutReq, req, function(res)
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
return
end
local collectDorm = TempDormitoryData[id]
if not collectDorm then -- 普通存储
local newId = res.NewLayoutId
TempDormitoryData[newId] = XHomeRoomData.New(newId)
TempDormitoryData[newId]:SetPlayerId(XPlayer.Id)
TempDormitoryData[newId]:SetRoomName(name)
TempDormitoryData[newId]:SetRoomUnlock(true)
TempDormitoryData[newId]:SetRoomDataType(XDormConfig.DormDataType.Collect)
TempDormitoryData[newId]:SetRoomCreateTime(res.CreateTime)
for _, furniture in ipairs(furnitureList) do
local incId = XGlobalVar.GetIncId()
TempDormitoryData[newId]:AddFurniture(incId, furniture.ConfigId, furniture.X, furniture.Y, furniture.Angle)
end
else -- 覆盖存储
collectDorm:SetRoomName(name)
collectDorm:ClearFruniture()
for i, furniture in ipairs(furnitureList) do
collectDorm:AddFurniture(i, furniture.ConfigId, furniture.X, furniture.Y, furniture.Angle)
end
end
local roomId = collectDorm and id or res.NewLayoutId
if cb then
cb(roomId)
end
end)
end
-- 收藏宿舍摆放家具
function XDormManager.CollectPutFunitrue(id, name, furnitureList, cb)
if not id or not name or not furnitureList then
return
end
local req = { LayoutId = id, LayoutName = name, FurnitureList = furnitureList }
XNetwork.Call(DormitoryRequest.DormCollectLayoutReq, req, function(res)
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
return
end
if cb then
cb()
end
end)
end
2024-09-01 20:49:41 +00:00
--- 一键摆放模板宿舍
---@param roomId number 宿舍ID
---@param templateDormId number 模板宿舍Id
---@param roomType number 模板宿舍类型
---@param cb function 设置完成回调
--------------------------
function XDormManager.CopyTemplateDorm(roomId, templateDormId, roomType, cb)
local room = XDataCenter.DormManager.GetRoomDataByRoomId(roomId, XDormConfig.DormDataType.Self)
local templateRoom = XDataCenter.DormManager.GetRoomDataByRoomId(templateDormId, roomType)
if not room or not templateRoom then
return
end
local roomFurnitureConfigs = room:GetFurnitureConfigDic()
local templateFurnitures = templateRoom:GetFurnitureDic()
-- 未使用背包家具
2024-09-01 20:49:41 +00:00
local caheBagConfigs = XTool.Clone(XDataCenter.FurnitureManager.GetUnUseFurniture())
-- 临时缓存宿舍数据
local cacheRoom = XHomeRoomData.New(roomId)
for _, v in pairs(templateFurnitures) do
local notFurniture = true
-- 检查当前宿舍中是否有此家具
local furnitureIds = roomFurnitureConfigs[v.ConfigId]
if furnitureIds and #furnitureIds > 0 then
local id = furnitureIds[1]
notFurniture = false
cacheRoom:AddFurniture(id, v.ConfigId, v.GridX, v.GridY, v.RotateAngle)
table.remove(furnitureIds, 1)
else
-- 检查背包中是否有此家具
local bagFurnitureIds = caheBagConfigs[v.ConfigId]
if bagFurnitureIds and #bagFurnitureIds > 0 then
local id = bagFurnitureIds[1]
notFurniture = false
cacheRoom:AddFurniture(id, v.ConfigId, v.GridX, v.GridY, v.RotateAngle)
table.remove(bagFurnitureIds, 1)
end
end
-- 保留地板,天花板,墙
local baseType = XFurnitureConfigs.HomeSurfaceBaseType
local tempF = nil
if XFurnitureConfigs.IsFurnitureMatchTypeByConfigId(v.ConfigId, baseType.Ground) and notFurniture then
tempF = room:GetGroundFurniture()
elseif XFurnitureConfigs.IsFurnitureMatchTypeByConfigId(v.ConfigId, baseType.Ceiling) and notFurniture then
tempF = room:GetCeillingFurniture()
elseif XFurnitureConfigs.IsFurnitureMatchTypeByConfigId(v.ConfigId, baseType.Wall) and notFurniture then
tempF = room:GetWallFurniture()
end
if notFurniture and tempF then
cacheRoom:AddFurniture(tempF.Id, tempF.ConfigId, tempF.GridX, tempF.GridY, tempF.RotateAngle)
end
end
local furnitures = cacheRoom:GetFurnitureDic()
local furnitureList = {}
for _, v in pairs(furnitures) do
local data = {}
data.Id = v.Id
data.X = v.GridX
data.Y = v.GridY
data.Angle = v.RotateAngle
table.insert(furnitureList, data)
end
if #furnitureList <= 0 then
XUiManager.TipText("DormTemplateOneKeyNone", XUiManager.UiTipType.Tip)
return
end
XDataCenter.FurnitureManager.PutFurniture(roomId, furnitureList, false, function()
XDormManager.SetRoomDataDormitoryId(room, 0)
XDormManager.SetRoomDataDormitoryId(cacheRoom, roomId)
room:SetFurnitureDic(furnitures)
local datas = { room }
local isNotChangeView = true
XHomeDormManager.LoadRooms(datas, XDormConfig.DormDataType.Self, isNotChangeView)
if cb then
cb()
end
end)
end
--================
--推送宿舍名变更
--@param data:{ int DormId, string DormName}
--================
function XDormManager.NotifyDormName(data)
local dorm = DormitoryData[data.DormId]
if dorm then dorm:SetRoomName(data.DormName) end
end
---------------------end net---------------------
---
--- 是否有权限访问其他玩家宿舍
---@param playerId number
---@param appearanceShowType number 类型为XUiAppearanceShowType枚举
---@return boolean
function XDormManager.HasDormPermission(playerId, appearanceShowType)
if playerId == XPlayer.Id then
return true
else
if appearanceShowType then
if appearanceShowType == XUiAppearanceShowType.ToAll then
return true
elseif appearanceShowType == XUiAppearanceShowType.ToSelf then
return false
elseif appearanceShowType == XUiAppearanceShowType.ToFriend then
return XDataCenter.SocialManager.CheckIsFriend(playerId)
else
XLog.Error("XDormManager.HasDormPermission函数错误展示设置不属于XUiAppearanceShowType类型")
return false
end
else
XLog.Error("XDormManager.HasDormPermission函数错误没有玩家宿舍展示设置数据")
return false
end
end
end
2024-09-01 20:49:41 +00:00
-- 退出宿舍回到主界面
function XDormManager.ExitDormitoryBackToMain()
XDormManager.RequestDormitoryExit()
XEventManager.DispatchEvent(XEventId.EVENT_DORM_CLOSE_COMPONET)
XLuaUiManager.RunMain()
end
function XDormManager.GetCharacterData()
return CharacterData
end
return XDormManager
end
XRpc.NotifyDormVisitEnter = function(data)
XDataCenter.DormManager.NotifyDormVisitEnter(data)
end
--================
--通知宿舍名称改变
--@param data:{ int DormId, string DormName}
--================
XRpc.NotifyDormName = function(data)
XDataCenter.DormManager.NotifyDormName(data)
end
XRpc.NotifyWorkNextRefreshTime = function(data)
XDataCenter.DormManager.NotifyDormWorkRefreshTime(data)
end
XRpc.NotifyCharacterAttr = function(data)
XDataCenter.DormManager.NotifyCharacterAttr(data)
end
XRpc.NotifyCharacterMood = function(data)
XDataCenter.DormManager.NotifyCharacterMood(data)
end
XRpc.NotifyCharacterVitality = function(data)
XDataCenter.DormManager.NotifyCharacterVitality(data)
end
XRpc.NotifyDormCharacterRecovery = function(data)
XDataCenter.DormManager.NotifyCharacterSpeedChange(data)
end
XRpc.NotifyDormCharacterAddEvent = function(data)
XDataCenter.DormManager.NotifyDormCharacterAddEvent(data)
end
XRpc.NotifyDormCharacterSubEvent = function(data)
XDataCenter.DormManager.NotifyDormCharacterSubEvent(data)
end
XRpc.NotifyDormitoryData = function(data)
-- 初始化默认一次的数据
XDataCenter.DormManager.InitOnlyOnce()
-- 之前旧协议原有字段
XDataCenter.DormManager.NotifyDormWork(data)
XDataCenter.DormManager.NotifySnapshotTimes(data)
XDataCenter.DormManager.NotifyFurnitureUnLock(data)
XDataCenter.FurnitureManager.InitFurnitureCreateList(data)
-- from DormitoryDataRequest
XDataCenter.DormManager.InitDormitoryData(data.DormitoryList)
XDataCenter.DormManager.InitFurnitureData(data.FurnitureList)
XDataCenter.DormManager.InitCharacterData(data.CharacterList)
2024-09-01 20:49:41 +00:00
XDataCenter.DormManager.InitDormCollectData(data.Layouts)
XDataCenter.DormManager.InitBindRelationData(data.BindRelations)
XDataCenter.FurnitureManager.InitData(data.FurnitureList)
2024-09-01 20:49:41 +00:00
XDataCenter.DormQuestManager.InitQuestData(data.DormQuestData)
end
XRpc.NotifyAddDormCharacter = function(data)
XDataCenter.DormManager.NotifyAddDormCharacter(data)
end
XRpc.NotifyDormExceptionItem = function(data)
XUiManager.TipMsg(CS.XTextManager.GetText("DormExceptionItemConvert"))
end
XRpc.NotifyDormDailyReset = function (data)
XDataCenter.DormManager.NotifySnapshotTimes(data)
end