XDrawManagerCreator = function() local XDrawManager = {} local tableInsert = table.insert local tableSort = table.sort local GET_DRAW_DATA_INTERVAL = 15 local DrawGroupInfos = {} local DrawInfos = {} local LastGetGroupInfoTime = 0 local LastGetDropInfoTimes = {} local DrawPreviews = {} local DrawCombinations = {} local DrawProbs = {} local DrawGroupRule = {} local DrawShow = {} local DrawNewYearShow = {} local DrawShowCharacter = {} local DrawCamera = {} local DrawTabs = {} local ActivityDrawList = {} local ActivityDrawListByTag = {} local DrawActivityCount = 0 local IsHasNewActivityDraw = false local CurSelectTabInfo = nil local LostSelectDrawGroupId = 0 local LostSelectDrawType = 0 XDrawManager.DrawEventType = { Normal = 0, NewHand = 1, Activity = 2, OldActivity = 3 } function XDrawManager.Init() DrawCombinations = XDrawConfigs.GetDrawCombinations() DrawGroupRule = XDrawConfigs.GetDrawGroupRule() DrawShow = XDrawConfigs.GetDrawShow() DrawNewYearShow = XDrawConfigs.GetDrawNewYearShow() DrawShowCharacter = XDrawConfigs.GetDrawShowCharacter() DrawCamera = XDrawConfigs.GetDrawCamera() DrawTabs = XDrawConfigs.GetDrawTabs() DrawPreviews = XDrawConfigs.GetDrawPreviews() DrawProbs = XDrawConfigs.GetDrawProbs() end function XDrawManager.GetDrawPreview(drawId) return DrawPreviews[drawId] end function XDrawManager.GetDrawCombination(drawId) return DrawCombinations[drawId] end function XDrawManager.GetDrawProb(drawId) local cfgs = DrawProbs[drawId] or {} table.sort(cfgs, function(a, b) return a.Sort < b.Sort end) return cfgs end function XDrawManager.GetDrawGroupRule(groupId) return DrawGroupRule[groupId] end function XDrawManager.GetDrawShow(type) return DrawShow[type - 1] end function XDrawManager.GetDrawNewYearShow(type) return DrawNewYearShow[type - 1] end function XDrawManager.GetDrawCamera(id) return DrawCamera[id] end function XDrawManager.GetDrawInfo(drawId) return DrawInfos[drawId] end function XDrawManager.GetDrawShowCharacter(id) return DrawShowCharacter[id] end function XDrawManager.GetLostSelectDrawGroupId() return LostSelectDrawGroupId end function XDrawManager.SetLostSelectDrawGroupId(groupId) LostSelectDrawGroupId = groupId end function XDrawManager.GetLostSelectDrawType() return LostSelectDrawType end function XDrawManager.SetLostSelectDrawType(type) LostSelectDrawType = type end function XDrawManager.GetDrawInfoListByGroupId(groupId) local list = {} local drawAimProbability = XDrawConfigs.GetDrawAimProbability() for _, info in pairs(DrawInfos) do if info.GroupId == groupId then tableInsert(list, info) end end tableSort(list, function(a, b) local PriorityA = drawAimProbability[a.Id] and drawAimProbability[a.Id].Priority or 0 local PriorityB = drawAimProbability[b.Id] and drawAimProbability[b.Id].Priority or 0 if PriorityA == PriorityB then return a.Id < b.Id else return PriorityA > PriorityB end end) return list end function XDrawManager.GetUseDrawInfoByGroupId(groupId) local groupInfo = DrawGroupInfos[groupId] local UseDrawInfo = groupInfo.UseDrawId > 0 and XDrawManager.GetDrawInfo(groupInfo.UseDrawId) or nil if UseDrawInfo then return UseDrawInfo else local list = XDrawManager.GetDrawInfoListByGroupId(groupId) return list[1] end end function XDrawManager.GetDrawGroupInfoByGroupId(groupId) return DrawGroupInfos[groupId] end function XDrawManager.CheckDrawIsTimeOver(drawId) if not DrawInfos[drawId] then return true end if DrawInfos[drawId].EndTime == 0 then return false end local nowTime = XTime.GetServerNowTimestamp() return DrawInfos[drawId].EndTime - nowTime <= 0 end -- 查询相关begin -- function XDrawManager.GetDrawGroupInfos() local list = {} for _, v in pairs(DrawGroupInfos) do tableInsert(list, v) end tableSort(list, function(a, b) return a.Priority > b.Priority end) --检测如果有过期的,下次请求跳过时间间隔检测 for _, v in pairs(list) do if v.EndTime > 0 and v.EndTime - XTime.GetServerNowTimestamp() <= 0 then LastGetGroupInfoTime = 0 CurSelectTabInfo = nil end end return list end function XDrawManager.GetGroupIdWithMaxOrder() local orderId = -1 local groupId = -1 for _,v in pairs(DrawGroupInfos) do if orderId < v.Order then orderId = v.Order groupId = v.Id end end return groupId end function XDrawManager.UpdateDrawGroupInfos(groupInfoList) DrawGroupInfos = {} local isExpired = true for _, info in pairs(groupInfoList) do DrawGroupInfos[info.Id] = info DrawGroupInfos[info.Id].BottomTimes = DrawGroupInfos[info.Id].MaxBottomTimes - DrawGroupInfos[info.Id].BottomTimes if CurSelectTabInfo then if info.Id == CurSelectTabInfo.Id then isExpired = false end end end if isExpired then CurSelectTabInfo = nil end end function XDrawManager.UpdateDrawInfos(drawInfoList) --每次更新一组info之前清空之前相同GroupId的信息 local deleteKey = {} for k, v in pairs(DrawInfos) do if v.GroupId == drawInfoList[1].GroupId then deleteKey[k] = true end end for k, _ in pairs(deleteKey) do DrawInfos[k] = nil end for _, info in pairs(drawInfoList) do XDrawManager.UpdateDrawInfo(info) end end function XDrawManager.UpdateDrawInfo(drawInfo) DrawInfos[drawInfo.Id] = XTool.Clone(drawInfo) DrawInfos[drawInfo.Id].BottomTimes = DrawInfos[drawInfo.Id].MaxBottomTimes - DrawInfos[drawInfo.Id].BottomTimes end -- 查询相关end -- -- 消息相关begin -- function XDrawManager.GetDrawInfoList(groupId, cb, IsNotDoCoolDown) local now = XTime.GetServerNowTimestamp() if LastGetDropInfoTimes[groupId] and now - LastGetDropInfoTimes[groupId] <= GET_DRAW_DATA_INTERVAL and not IsNotDoCoolDown then if cb then cb() end return end XNetwork.Call("DrawGetDrawInfoListRequest", { GroupId = groupId }, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end XDrawManager.UpdateDrawInfos(res.DrawInfoList) LastGetDropInfoTimes[groupId] = now if cb then cb() end end) end function XDrawManager.GetDrawGroupList(cb) local now = XTime.GetServerNowTimestamp() if now - LastGetGroupInfoTime <= GET_DRAW_DATA_INTERVAL then if cb then cb() end return end XNetwork.Call("DrawGetDrawGroupListRequest", nil, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end XDrawManager.UpdateDrawGroupInfos(res.DrawGroupInfoList) LastGetGroupInfoTime = now if cb then cb() end end) end --==============================-- --desc: 打乱奖励顺序,防止因规则造成顺序可循 --@rewardGoodsList: 奖励列表 --@return 处理后奖励列表 --==============================-- -- local function UpsetRewardGoodsList(rewardGoodsList) -- local list = {} -- local len = #rewardGoodsList -- if len <= 1 then -- return rewardGoodsList -- end -- for i = 1, len do -- local index = math.random(1, len) -- if index ~= i then -- local tmp = rewardGoodsList[i] -- rewardGoodsList[i] = rewardGoodsList[index] -- rewardGoodsList[index] = tmp -- end -- end -- return rewardGoodsList -- end function XDrawManager.DrawCard(drawId, count, cb, failCb) XNetwork.Call("DrawDrawCardRequest", { DrawId = drawId, Count = count }, function(res) if res.Code ~= XCode.Success then if failCb then failCb() end XUiManager.TipCode(res.Code) return end XDrawManager.UpdateDrawInfo(res.ClientDrawInfo) XDrawManager.UpdateDrawGroupByInfo(res.ClientDrawInfo) local drawInfo = XDrawManager.GetDrawInfo(res.ClientDrawInfo.Id) if cb then cb(drawInfo, res.RewardGoodsList, res.ExtraRewardList) end end) end function XDrawManager.SaveDrawAimId(drawId, groupId, cb)--保存狙击目标 XNetwork.Call("DrawSetUseDrawIdRequest", { DrawId = drawId }, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end XDrawManager.GetDrawGroupInfoByGroupId(groupId).UseDrawId = drawId XDrawManager.GetDrawGroupInfoByGroupId(groupId).SwitchDrawIdCount = res.SwitchDrawIdCount if cb then cb() end end) end -- 消息相关end -- -- Wind -- function XDrawManager.GetDrawTab(tabID) for _, tab in pairs(DrawTabs) do if tab.Id == tabID then return tab end end XLog.Error("XDrawManager.GetDrawTab : Client/Draw/DrawTabs.tab 表中不存在 tabID:" .. tabID .. "检查参数或者配置表项") return nil end function XDrawManager.GetCurSelectTabInfo() return CurSelectTabInfo end function XDrawManager.SetCurSelectTabInfo(info) CurSelectTabInfo = info end function XDrawManager.UpdateDrawGroupByInfo(clientDrawInfo) for _, v in pairs(DrawGroupInfos) do if v.UseDrawId == clientDrawInfo.Id then v.BottomTimes = clientDrawInfo.MaxBottomTimes - clientDrawInfo.BottomTimes end end end function XDrawManager.GetActivityDrawMarkId(Id)--获取当前卡池ID的卡池在记录队列中的位置ID local countMax = XSaveTool.GetData(string.format("%d%s", XPlayer.Id, "ActivityDrawCountMax")) if countMax then for i = 1, countMax do local drawId = XSaveTool.GetData(string.format("%d%s%d", XPlayer.Id, "NewActivityDraw", i)) if drawId then if drawId == Id then return i end end end end return nil end function XDrawManager.MarkActivityDraw()--记录当前开放的活动卡池 for _, Id in pairs(ActivityDrawList or {}) do if not XDrawManager.GetActivityDrawMarkId(Id) then local count = 1 while true do if not XSaveTool.GetData(string.format("%d%s%d", XPlayer.Id, "NewActivityDraw", count)) then XSaveTool.SaveData(string.format("%d%s%d", XPlayer.Id, "NewActivityDraw", count), Id) local countMax = XSaveTool.GetData(string.format("%d%s", XPlayer.Id, "ActivityDrawCountMax")) if (not countMax) or (countMax and countMax < count) then XSaveTool.SaveData(string.format("%d%s", XPlayer.Id, "ActivityDrawCountMax"), count) end break end count = count + 1 end end end IsHasNewActivityDraw = false end function XDrawManager.UnMarkOldActivityDraw(list)--消除已关闭卡池的记录 local countMax = XSaveTool.GetData(string.format("%d%s", XPlayer.Id, "ActivityDrawCountMax")) if countMax then for i = 1, countMax do local drawId = XSaveTool.GetData(string.format("%d%s%d", XPlayer.Id, "NewActivityDraw", i)) if drawId then local IsInList = false for _, v in pairs(list or {}) do if drawId == v then IsInList = true end end if not IsInList then XSaveTool.RemoveData(string.format("%d%s%d", XPlayer.Id, "NewActivityDraw", i)) end end end end end function XDrawManager.SetNewActivityDraw(list)--记录是否有新卡池开启 IsHasNewActivityDraw = false for _, v in pairs(list or {}) do IsHasNewActivityDraw = IsHasNewActivityDraw or (not XDrawManager.GetActivityDrawMarkId(v)) end end function XDrawManager.CheckNewActivityDraw()--检查是否有新卡池开启 if not XFunctionManager.JudgeCanOpen(XFunctionManager.FunctionName.DrawCard) then return false end return IsHasNewActivityDraw end function XDrawManager.UpdateDrawActivityCount(count) DrawActivityCount = count end function XDrawManager.UpdateActivityDrawList(list) ActivityDrawList = list end function XDrawManager.UpdateActivityDrawListByTag(lnfoList) for _, v in pairs(lnfoList) do if not ActivityDrawListByTag[v.Tag] then ActivityDrawListByTag[v.Tag] = {} end local drawInfo = XDataCenter.DrawManager.GetUseDrawInfoByGroupId(v.Id) table.insert(ActivityDrawListByTag[v.Tag], drawInfo.Id) end end function XDrawManager.CheckDrawActivityCount() return DrawActivityCount > 0 end function XDrawManager.IsCanAutoOpenAimGroupSelect(time, groupId) --判断time时间以内是否可以自动打开狙击池组合选择界面 local data = XSaveTool.GetData(string.format("%d%s%d", XPlayer.Id, "AimAutoOpenState", groupId)) if data then if time > data then XSaveTool.SaveData(string.format("%d%s%d", XPlayer.Id, "AimAutoOpenState", groupId), time) return true else return false end else XSaveTool.SaveData(string.format("%d%s%d", XPlayer.Id, "AimAutoOpenState", groupId), time) return true end end function XDrawManager.IsShowNewTag(time, ruleType, groupId) --判断time时间以内是否显示新标签 local data = XSaveTool.GetData(string.format("%d%s%d%d", XPlayer.Id, "DrawShowNewTag", ruleType, groupId)) if data then if time > data then return true else return false end else return true end end function XDrawManager.MarkNewTag(time, ruleType, groupId) --标记新标签 local data = XSaveTool.GetData(string.format("%d%s%d%d", XPlayer.Id, "DrawShowNewTag", ruleType, groupId)) if data then if time > data then XSaveTool.SaveData(string.format("%d%s%d%d", XPlayer.Id, "DrawShowNewTag", ruleType, groupId), time) end else XSaveTool.SaveData(string.format("%d%s%d%d", XPlayer.Id, "DrawShowNewTag", ruleType, groupId), time) end end function XDrawManager.GetDrawPurchase(drawId) local drawInfo = XDataCenter.DrawManager.GetDrawInfo(drawId) if not drawInfo then return {} end local purchaseIds = drawInfo.PurchaseId local drawPurchase = {} if purchaseIds and next(purchaseIds) then for _, purchaseId in ipairs(purchaseIds) do local purchaseData = XDataCenter.PurchaseManager.GetPurchaseDataById( purchaseId) if purchaseData then tableInsert(drawPurchase, purchaseData) end end end return drawPurchase end -- WindEnd -- XDrawManager.Init() return XDrawManager end XRpc.NotifyActivityDrawGroupCount = function(data) XDataCenter.DrawManager.UpdateDrawActivityCount(data.Count) XEventManager.DispatchEvent(XEventId.EVENT_DRAW_ACTIVITYCOUNT_CHANGE) end XRpc.NotifyActivityDrawList = function(data) XDataCenter.DrawManager.UpdateActivityDrawList(data.DrawIdList) XDataCenter.DrawManager.SetNewActivityDraw(data.DrawIdList) XDataCenter.DrawManager.UnMarkOldActivityDraw(data.DrawIdList) XEventManager.DispatchEvent(XEventId.EVENT_DRAW_ACTIVITYDRAW_CHANGE) end