2739 lines
No EOL
95 KiB
Lua
2739 lines
No EOL
95 KiB
Lua
---
|
||
--- 宿舍业务管理器
|
||
---
|
||
XDormManagerCreator = function()
|
||
---@class XDormManager 宿舍业务管理器
|
||
local XDormManager = {}
|
||
|
||
local CharacterData = {} -- 构造体数据
|
||
---@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 --大厅个人玩家列表最后刷新时间
|
||
local VisitRequestTimeLimit = 10 --宿舍访问列表请求保护时间
|
||
local LastRequestUnknownVisitor = 0 --上次请求未知访客宿舍时间
|
||
|
||
---@type table<number, XHomeRoomData>
|
||
local TargetDormitoryData = {} --别人宿舍数据
|
||
local TargetCharacterData = {} -- 构造体数据(访问其他人时)
|
||
-- local TargetVisitorData = {} -- 宿舍访问数据(访问其他人时)
|
||
|
||
---@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
|
||
|
||
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
|
||
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
|
||
|
||
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.LoadCollectTexture()
|
||
local datas = XDormManager.GetTemplateDormitoryData(XDormConfig.DormDataType.Collect)
|
||
for _, v in ipairs(datas) do
|
||
v:GetRoomPicture()
|
||
end
|
||
end
|
||
|
||
-- 获取模板宿舍数据
|
||
---@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
|
||
|
||
--- 获取模板宿舍数量 不带参数时获取所有模板数量
|
||
---@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)
|
||
|
||
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
|
||
|
||
if sceneId then
|
||
local data = {}
|
||
for id, room in pairs(DormitoryData) do
|
||
local cfgId = XDormConfig.GetDormitorySceneById(id)
|
||
if cfgId == sceneId then
|
||
data[id] = room
|
||
end
|
||
end
|
||
return data
|
||
end
|
||
|
||
return DormitoryData
|
||
end
|
||
|
||
-- 获取指定宿舍数据
|
||
---@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
|
||
|
||
---------------------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
|
||
|
||
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
|
||
|
||
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
|
||
|
||
--- 获取宿舍与模板宿舍家具数
|
||
---@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
|
||
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
|
||
return math.floor(math.min(ownCount / tempCount, 1) * 100)
|
||
end
|
||
|
||
--==============================--
|
||
--desc: 获取宿舍某个家具数量
|
||
--@roomId: 房间ID
|
||
--@dormDataType: 房间类型
|
||
--@isIncludeUnUse: 是否加上背包未使用的家具
|
||
--@return 数量
|
||
--==============================--
|
||
function XDormManager.GetFurnitureCountInDorm(roomId, dormDataType, configId, isIncludeUnUse)
|
||
local roomData = XDormManager.GetRoomDataByRoomId(roomId, dormDataType)
|
||
local furnitureCount = #roomData:GetFurnitureConfigByConfigId(configId)
|
||
if isIncludeUnUse then
|
||
local unUseCount = #XDataCenter.FurnitureManager.GetUnUseFurnitureById(configId)
|
||
furnitureCount = furnitureCount + unUseCount
|
||
end
|
||
|
||
return furnitureCount
|
||
end
|
||
|
||
--- 获取玩家拥有的家具数量
|
||
---@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]
|
||
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
|
||
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)
|
||
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
|
||
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)
|
||
isVisitor = true
|
||
end
|
||
|
||
XHomeDormManager.SetSelectedRoom(dormitoryId, true, isVisitor)
|
||
end
|
||
|
||
-- 进入模板宿舍(包括临时模板)
|
||
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
|
||
local defaultFurniture = XDataCenter.FurnitureManager.GetCollectNoneFurniture(dormitoryId)
|
||
if defaultFurniture then
|
||
data:SetFurnitureDic(defaultFurniture)
|
||
end
|
||
end
|
||
|
||
XHomeDormManager.LoadRooms({ data }, roomType)
|
||
XLuaUiManager.Open("UiDormTemplateScene", dormitoryId, roomDataType, nil, fromRoomId)
|
||
XHomeDormManager.SetSelectedRoom(dormitoryId, true)
|
||
end
|
||
|
||
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)
|
||
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)
|
||
LastRequestUnknownVisitor = timeOfNow
|
||
if res.Code ~= XCode.Success then
|
||
XUiManager.TipCode(res.Code)
|
||
return
|
||
end
|
||
|
||
RecommVisData = res
|
||
if cb then
|
||
cb(res)
|
||
end
|
||
end)
|
||
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)
|
||
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)
|
||
--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(dormId, cb)
|
||
if not XTool.IsNumberValid(dormId) then
|
||
return
|
||
end
|
||
|
||
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
|
||
|
||
--- 一键摆放模板宿舍
|
||
---@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()
|
||
|
||
-- 未使用背包家具
|
||
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
|
||
|
||
-- 退出宿舍回到主界面
|
||
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)
|
||
XDataCenter.DormManager.InitDormCollectData(data.Layouts)
|
||
XDataCenter.DormManager.InitBindRelationData(data.BindRelations)
|
||
XDataCenter.FurnitureManager.InitData(data.FurnitureList)
|
||
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 |