PGRData/Script/matrix/xmanager/XDrawManager.lua

509 lines
No EOL
17 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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