--- 限时礼包 --[[ db.limitGiftBag = { actTime = {} -- 激活方式 的激活时间 [1] = time actNum = {} -- 激活方式 的激活次数 [1] = 10 bagBuy = {} -- 礼包购买状态 [1] = 1 重新激活时 清除 } ]] local Msg = require("core.Msg") local BagLogic = require("bag.BagLogic") local Grid = require("bag.Grid") local BuyLogic = require("topup.BuyLogic") local LimitGiftBagExcel = require("excel.limitBuy").limitGiftBag LIMITGIFTBAG_TYPE_1 = 1 -- 获得X星英雄 LIMITGIFTBAG_TYPE_2 = 2 -- 达到X级 LIMITGIFTBAG_TYPE_3 = 3 -- 爬塔X层 -- 激活方式 (同种激活方式激活 一起激活 策划需求 这里定义是为了防止 策划忘记 ) local LIMITGIFTBAG_ACT_TYPE_1 = 1 -- 获得5X英雄 local LIMITGIFTBAG_ACT_TYPE_2 = 2 -- 获得6X英雄 local LIMITGIFTBAG_ACT_TYPE_3 = 3 -- 达到20级 local LIMITGIFTBAG_ACT_TYPE_4 = 4 -- 达到30级 local LIMITGIFTBAG_ACT_TYPE_5 = 5 -- 爬塔100层 function inintDB(human) if not human.db.limitGiftBag then human.db.limitGiftBag = {} human.db.limitGiftBag.actTime = {} human.db.limitGiftBag.actNum = {} human.db.limitGiftBag.bagBuy = {} end end local PERSON_LIMITGIFTBAG_MAX_TIME = nil -- actType 最大持续时间 local PERSON_LIMITGIFTBAG_ID_ACTTYPE = nil -- ID 所对应的 actType local PERSON_LIMITGIFTBAG_ACTTPE_ID = nil -- 同激活方式的 ID local function updateExcel() if PERSON_LIMITGIFTBAG_MAX_TIME then return end PERSON_LIMITGIFTBAG_MAX_TIME = {} PERSON_LIMITGIFTBAG_ID_ACTTYPE = {} PERSON_LIMITGIFTBAG_ACTTPE_ID = {} for k, v in ipairs(LimitGiftBagExcel) do PERSON_LIMITGIFTBAG_ID_ACTTYPE[k] = v.actType PERSON_LIMITGIFTBAG_ACTTPE_ID[v.actType] = PERSON_LIMITGIFTBAG_ACTTPE_ID[v.actType] or {} PERSON_LIMITGIFTBAG_ACTTPE_ID[v.actType][#PERSON_LIMITGIFTBAG_ACTTPE_ID[v.actType] + 1] = k if not PERSON_LIMITGIFTBAG_MAX_TIME[v.actType] then PERSON_LIMITGIFTBAG_MAX_TIME[v.actType] = v.endTime elseif PERSON_LIMITGIFTBAG_MAX_TIME[v.actType] and PERSON_LIMITGIFTBAG_MAX_TIME[v.actType] < v.endTime then PERSON_LIMITGIFTBAG_MAX_TIME[v.actType] = v.endTime end end end -- 获取最老结束时间 local function getMaxEndTime(actType) updateExcel() return PERSON_LIMITGIFTBAG_MAX_TIME[actType] end -- 获取该激活类型 是否已经激活 local function getActTypeState(human, actType, now) now = now or os.time() local maxEndTime = getMaxEndTime(actType) if maxEndTime <= 0 then return assert(nil, "actType endTime is not find : " .. actType .. " .") end local lastTime = human.db.actTime[actType] or 0 return now < lastTime + maxEndTime or false end local function getIdState(time, id, now) local config = LimitGiftBagExcel[id] local endTime = time + config.endTime return endTime - now > 0 and true or false end -- 清理掉上次 激活时 购买次数 local function cleanGiftBagBuy(human, actType) for _, id in ipairs(PERSON_LIMITGIFTBAG_ACTTPE_ID[actType]) do human.db.limitGiftBag.bagBuy[id] = nil end end -- 获取 限时礼包是否能购买 local function getGiftBagBuyState(human, config) if not human.db.limitGiftBag.bagBuy[config.id] then return true end if config.canBuy > 0 and human.db.limitGiftBag.bagBuy[config.id] >= config.canBuy then return false end return true end function fontLimitBagNet(human, msgRet, id, actTime, now) local config = LimitGiftBagExcel[id] local state = getIdState(actTime, id, os.time()) if not state then return end msgRet.list[0] = msgRet.list[0] + 1 local net = msgRet.list[msgRet.list[0]] net.id = id net.name = config.name net.buy = human.db.limitGiftBag.bagBuy[id] and human.db.limitGiftBag.bagBuy[id] or 0 net.maxBuy = config.canBuy net.endTime = actTime + config.endTime - now net.endTime = net.endTime > 0 and net.endTime or 0 BuyLogic.fontBuyItem(human,net.buyItem, config.buyID) for k, v in ipairs(config.item) do Grid.makeItem(net.reward[k], v[1], v[2]) end net.reward[0] = #config.item end -- 查询 function query(human) local msgRet = Msg.gc.GC_PRESENT_LIMITGIFT_BAG_QUERY if not human.db.limitGiftBag then msgRet.list[0] = 0 Msg.send(msgRet, human.fd) end local now = os.time() for k, v in pairs(human.db.limitGiftBag.actTime) do if getActTypeState(human, k, now) then for _,id in ipairs(PERSON_LIMITGIFTBAG_ACTTPE_ID[k]) do fontLimitBagNet(human, msgRet, id, v, now) end end end Msg.send(msgRet, human.fd) end -- 激活 local function active(human, actType) if true then return end inintDB(human) if not getActTypeState(human, actType, os.time()) then human.db.limitGiftBag.actTime[actType] = os.time() cleanGiftBagBuy(human, actType) end end -- 尝试激活 function touchActive(human, type, cnt) updateExcel() local activeList = {} for k, v in ipairs(LimitGiftBagExcel) do if v.type == type and v.need <= cnt then activeList[v.actType] = 1 end end for actType in pairs(activeList) do active(human, actType) end end -- 购买 后台触发 发送 function buy(human, id) if true then return end local config = LimitGiftBagExcel[id] if not config then return end local state = getGiftBagBuyState(human, config) if not state then return end BagLogic.addItemList(human, config.item, "limitBag") end