--- --- 宿舍业务管理器 --- XDormManagerCreator = function() local XDormManager = {} local CharacterData = {} -- 构造体数据 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 --大厅个人玩家列表最后刷新时间 local TargetDormitoryData = {} --别人宿舍数据 local TargetCharacterData = {} -- 构造体数据(访问其他人时) -- local TargetVisitorData = {} -- 宿舍访问数据(访问其他人时) 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 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 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 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 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 -- 加载收藏宿舍的入口图片 function XDormManager.LoacdCollectTxture() local datas = XDormManager.GetTemplateDormitoryData(XDormConfig.DormDataType.Collect) for _, v in ipairs(datas) do v:GetRoomPicture() end end -- 获取模板宿舍数据 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 --获取所有宿舍数据 function XDormManager.GetDormitoryData(dormDataType, senceId) if dormDataType == XDormConfig.DormDataType.Target then return TargetDormitoryData end if senceId then local data = {} for id, room in pairs(DormitoryData) do local cfgId = XDormConfig.GetDormitorySenceById(id) if cfgId == senceId then data[id] = room end end return data end return DormitoryData end -- 获取指定宿舍数据 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 ---------------------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 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 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 -- 获取宿舍与模板宿舍之间的达成百分比 function XDormManager.GetDormTemplatePercent(tmeplateDormId, dormId) local templateData = TempDormitoryData[tmeplateDormId] local dormData = DormitoryData[dormId] if not templateData or not dormData then return 0 end local dormFurnitureCount = 0 local dormFurnitureConfigDic = dormData:GetFurnitureConfigDic() local templateFurnitureCount = 0 local templateFurnitureConfigDic = templateData:GetFurnitureConfigDic() -- 模板宿舍家具数量 for _, v in pairs(templateFurnitureConfigDic) do templateFurnitureCount = templateFurnitureCount + #v end -- 自己宿舍加家具达成数量 for k, v in pairs(dormFurnitureConfigDic) do if templateFurnitureConfigDic[k] then if #v >= #templateFurnitureConfigDic[k] then dormFurnitureCount = dormFurnitureCount + #templateFurnitureConfigDic[k] else dormFurnitureCount = dormFurnitureCount + #v end end end if templateFurnitureCount <= 0 then return 0 end return math.floor((dormFurnitureCount / templateFurnitureCount) * 100) end --==============================-- --desc: 获取宿舍某个家具数量 --@roomId: 房间ID --@dormDataType: 房间类型 --@isIncludeUnUse: 是否加上背包未使用的家具 --@return 数量 --==============================-- function XDormManager.GetFunritureCountInDorm(roomId, dormDataType, configId, isIncludeUnUse) local roomData = XDormManager.GetRoomDataByRoomId(roomId, dormDataType) local furnitureCount = #roomData:GetFurnitureConfigByConfigId(configId) if isIncludeUnUse then local unUseCount = #XDataCenter.FurnitureManager.GetUnuseFurnitueById(configId) furnitureCount = furnitureCount + unUseCount end return furnitureCount end function XDormManager.GetLocalCaptureCache(id) local texture = LocalCaptureCache[id] return texture or nil 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 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) room:SetData(roomData) end -- 访问宿舍(包括自己和他人的) function XDormManager.VisitDormitory(displayState, dormitoryId) local f = displayState == XDormConfig.VisitDisplaySetType.MySelf local isvistor = 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) isvistor = true end XHomeDormManager.SetSelectedRoom(dormitoryId, true, isvistor) end -- 进入模板宿舍(包括临时模板) function XDormManager.EnterTeamplateDormitory(dormitoryId, roomDataType) 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 local defluatFurnitrue = XDataCenter.FurnitureManager.GetCollectNoneFurnitrue(dormitoryId) if defluatFurnitrue then data:SetFurnitureDic(defluatFurnitrue) end end local datas = { data } XHomeDormManager.LoadRooms(datas, roomType) XLuaUiManager.Open("UiDormTemplateScene", dormitoryId, roomDataType) XHomeDormManager.SetSelectedRoom(dormitoryId, true) 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) XNetwork.Call(DormitoryRequest.DormRecommendReq, nil, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end XDormManager.RecordDormitoryRecommend(res) if cb then cb(res) end end) end -- 记录推荐访问数据 function XDormManager.RecordDormitoryRecommend(data) RecommVisData = {} local d = data.Details or {} for _, v in pairs(d) do RecommVisIds[v.DormitoryId] = v.DormitoryId RecommVisData[v.PlayerId] = v end end -- 取总的推荐访问数据 function XDormManager.GetDormitoryRecommendTotalData() return RecommVisData end -- 取总的推荐访问数据 function XDormManager.GetDormitoryRecommendScore(id) if not id then return end return RecommVisData[id] end 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) 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) 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 -- 解除绑定模板宿舍 function XDormManager.DormUnBindLayoutReq(templateId, cb) if not templateId then return end local req = { LayoutId = templateId } 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 -- 一键摆放模板宿舍 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() -- 未使用背包家具 local caheBagConfigs = XTool.Clone(XDataCenter.FurnitureManager.GetUnuseFurnitue()) -- 临时缓存宿舍数据 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 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) XDataCenter.DormManager.InitdormCollectData(data.Layouts) XDataCenter.DormManager.InitbindRelationData(data.BindRelations) XDataCenter.FurnitureManager.InitData(data.FurnitureList) 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