Selaa lähdekoodia

增加运营活动--限时累充

gitxsm 11 kuukautta sitten
vanhempi
sitoutus
e8d123b3f3

+ 3 - 3
script/common/ProtoID.lua

@@ -1464,6 +1464,6 @@ _ENV[1515]="CG_HEROPUB_ACTIVATE"
 _ENV[1516]="GC_HEROPUB_ACTIVATE"
 
 
--- _ENV[1519]="CG_CYCLERECHARGE_QUERY"
--- _ENV[1520]="GC_CYCLERECHARGE_QUERY"
--- _ENV[1521]="CG_CYCLERECHARGE_GET_AWARD"
+_ENV[1519]="CG_CYCLERECHARGE_QUERY"
+_ENV[1520]="GC_CYCLERECHARGE_QUERY"
+_ENV[1521]="CG_CYCLERECHARGE_GET_AWARD"

+ 337 - 0
script/module/present/ActCycleRechargeLogic.lua

@@ -0,0 +1,337 @@
+-- 循环累计充值活动, 开服第8天开始, 每7天一轮, 活动循环开
+-- 为保证合服后玩家不受影响, 将活动时间, 充值等数据绑在玩家身上
+
+--db  
+--[[
+    human.db.cycleRechargeData = 
+    {
+        startTime = nil, 本轮开启时间
+        totalRecharge = 0, 本轮累计充值
+        receiveList  = {}, 已经领取列表
+    }
+]]--
+
+local Msg = require("core.Msg")
+local Grid = require("bag.Grid")
+local BagLogic = require("bag.BagLogic")
+local Lang = require("common.Lang")
+local Broadcast = require("broadcast.Broadcast")
+local CommonDB = require("common.CommonDB")
+local Util = require("common.Util")
+local cycleRechargeCfg = require("excel.cycleRecharge").cycleRecharge
+local MailManager = require("mail.MailManager")
+local MailExcel = require("excel.mail")
+local YunYingLogic = require("yunying.YunYingLogic")
+
+-- 开服第8天开始
+local OPEN_DAYS = 8
+
+-- 每轮活动持续天数
+local DURATION_DAYS = 7
+
+local DAY_SECS = 86400
+
+-- 邮件ID
+local MAILID = 7019
+
+-- 日志标识
+local LOGTAG = "ActCycleRechargeLogic"
+
+--活动ID
+local ACTID = 3314
+
+
+local function initActData(human)
+    human.db.cycleRechargeData = {}
+end
+
+local function getActData(human)
+    return human.db.cycleRechargeData
+end
+
+local function updateActStartTime(human, ti)
+    local cycleRechargeData = getActData(human)
+    cycleRechargeData.startTime = ti
+end
+
+local function updateActReceiveList(human, newReceiveList)
+    local cycleRechargeData = getActData(human)
+    cycleRechargeData.receiveList = cycleRechargeData.receiveList or {}
+    for k in pairs(newReceiveList) do
+        cycleRechargeData.receiveList[k] = '1'
+    end
+end
+
+local function updateActTotalRecharge(human, money)
+    local cycleRechargeData = getActData(human)
+    cycleRechargeData.totalRecharge = (cycleRechargeData.totalRecharge or 0) + money
+end
+
+
+
+
+local function isRecharge(human)
+    return (human.db.topupAcount and human.db.topupAcount > 0) and true or false
+end
+
+-- 开服时间
+local function getOpenServerTime()
+    return CommonDB.getServerOpenTime()
+end
+
+-- 计算角色的活动首次开启时间
+local function calcRoleFirstOpenTime()
+    local openServerTime = getOpenServerTime()
+    local dayStartTime = Util.getDayStartTime(os.time())
+    local actFirstOpenTime = Util.getDayStartTime(openServerTime + (OPEN_DAYS - 1) * DAY_SECS)
+
+    if dayStartTime < actFirstOpenTime then
+        return
+    end
+
+
+
+    -- -- 当天与活动首次开启时间的天数差
+    -- local days_passed = math.floor((dayStartTime - actFirstOpenTime) / DAY_SECS)
+
+    -- -- 当前属于第几轮
+    -- local crurrent_round = math.floor(days_passed / DURATION_DAYS) + 1
+
+    -- -- 本轮的开启时间
+    -- local crurrent_round_openTime = actFirstOpenTime + (crurrent_round - 1) * DURATION_DAYS * DAY_SECS
+
+    -- return crurrent_round_openTime
+
+    return dayStartTime
+end
+
+-- 获取可领档位的索引
+local function getAwardIdx(human)
+    local cycleRechargeData = getActData(human)
+    local totalRecharge = cycleRechargeData.totalRecharge
+    if not totalRecharge or totalRecharge <= 0 then
+        return
+    end
+
+    local idxList = {}
+    local receiveList = cycleRechargeData.receiveList or {}
+
+    for k,v in ipairs(cycleRechargeCfg) do
+        if totalRecharge >= v.moneyCond and not receiveList[k] then
+            idxList[k] = 1
+        end
+    end
+
+    if not next(idxList) then
+        return
+    end
+
+    return idxList
+end
+
+-- 可领取的奖励
+local function getAwardList(human)
+    local idxList = getAwardIdx(human)
+    if not idxList then
+        return
+    end
+
+    local len  = 0
+    local awardList, receiveList = {}, {}
+
+    for idx in pairs(idxList) do
+        local singleCfg = cycleRechargeCfg[idx]
+        for _,item in ipairs(singleCfg.awardList) do
+            len = len + 1
+            awardList[len] = item
+            receiveList[idx] = 1
+        end
+    end
+
+    return awardList, receiveList
+end
+
+-- 如果还有奖励未领取,通过邮件发送
+local function sendAwardByEmail(human)
+    local awardList, receiveList = getAwardList(human)
+
+    if awardList and #awardList > 0 then
+        updateActReceiveList(human, receiveList)
+
+        local mailCfg = MailExcel.mail[MAILID]
+        MailManager.add(MailManager.SYSTEM, human.db._id, mailCfg.title, mailCfg.content, awardList, mailCfg.senderName)
+    end
+end
+
+-- 检查红点
+local function redDotCheck(human, noCheckRed)
+    -- YunYingLogic.updateIcon(YYInfo[ACTID], human, noCheckRed)
+    YunYingLogic.sendGroupUpdate(YYInfo[ACTID], human, ACTID)
+end
+
+
+
+
+-- 跨天
+function updateDaily(human)
+    local cycleRechargeData = getActData(human)
+    if not cycleRechargeData then
+        local firstOpenTime = calcRoleFirstOpenTime()
+        if not firstOpenTime then
+            return
+        end
+
+        initActData(human)
+
+        updateActStartTime(human, firstOpenTime)
+
+        -- redDotCheck(human, true)
+
+        if isRecharge(human) then
+            -- 推送数据,更新界面
+            Query(human)
+        end
+    else
+        local now = os.time()
+        if now >= (cycleRechargeData.startTime + DURATION_DAYS * DAY_SECS) then
+            --检查是否有未领取的奖励
+            sendAwardByEmail(human)
+
+            -- 重置数据
+            initActData(human)
+
+            -- 更新新一轮开启时间
+            local dayStartTime = Util.getDayStartTime(now)
+            updateActStartTime(human, dayStartTime)
+
+
+            if isRecharge(human) then
+                -- 推送数据,更新界面
+                Query(human)
+
+                -- 红点更新
+                redDotCheck(human, true)
+            end
+        end
+
+    end
+end
+
+function isOpen(human)
+    local bl = isRecharge(human)
+    local cycleRechargeData = getActData(human)
+    if not cycleRechargeData or not bl then
+        return false
+    end
+
+    return true
+end
+
+function isRed(human, YYInfo, funcConfig)
+    if getAwardIdx(human) then
+        return true
+    end
+
+    return false
+end
+
+--充值
+function onCharge(human, price, funcID, buyID)
+    local cycleRechargeData = getActData(human)
+    if not cycleRechargeData then
+        return
+    end
+
+    updateActTotalRecharge(human, price)
+
+    redDotCheck(human)
+end
+
+
+
+function Query(human)
+    local bl = isRecharge(human)
+    local cycleRechargeData = getActData(human)
+    if not cycleRechargeData  or not bl then
+        return
+    end
+
+    local startTag = 1
+    local len = 0
+    local msgMaxLen = 5
+    local cfgCnt = #cycleRechargeCfg
+
+    local msgRet = Msg.gc.GC_CYCLERECHARGE_QUERY
+    msgRet.startTime = cycleRechargeData.startTime
+    msgRet.endTime = cycleRechargeData.startTime + DURATION_DAYS * DAY_SECS
+    msgRet.totalRecharge = cycleRechargeData.totalRecharge or 0
+
+    local msgAwardList = msgRet.awardList
+    local receiveList = cycleRechargeData.receiveList or {}
+
+    for k, v in ipairs(cycleRechargeCfg) do
+        len = len + 1
+        msgAwardList[0] = msgMaxLen
+        msgAwardList[len].idx = k
+        msgAwardList[len].moneyCond = v.moneyCond
+
+
+        msgAwardList[len].state = 0
+        if receiveList[k] then
+            msgAwardList[len].state = 2
+        else
+            if cycleRechargeData.totalRecharge and cycleRechargeData.totalRecharge >= v.moneyCond then
+                msgAwardList[len].state = 1
+            end
+        end
+
+        for i, itemInfo in ipairs(v.awardList) do
+            msgAwardList[len].itemList[0] = i
+            Grid.makeItem( msgAwardList[len].itemList[i], itemInfo[1], itemInfo[2])
+        end
+
+        if len >= msgMaxLen then
+            msgRet.startTag = startTag
+            msgRet.endTag = 0
+            if cfgCnt - len <= 0 then
+                msgRet.endTag = 1
+                return Msg.send(msgRet, human.fd)
+            end
+
+            Msg.send(msgRet, human.fd)
+
+            len = 0
+            startTag = 0
+            cfgCnt = cfgCnt - msgMaxLen
+        end
+    end
+
+    msgRet.startTag = startTag
+    msgRet.endTag = 1
+    Msg.send(msgRet, human.fd)
+end
+
+
+function GetAward(human)
+    local cycleRechargeData = getActData(human)
+    if not cycleRechargeData then
+        return Broadcast.sendErr(human, Lang.COMMOM_NOT_ENABLED)
+    end
+
+    if not cycleRechargeData.totalRecharge or cycleRechargeData.totalRecharge <= 0 then
+        return Broadcast.sendErr(human, Lang.COMMON_RECHARGE_NOT_ENOUGH)
+    end
+
+    local awardList, receiveList = getAwardList(human)
+    if not awardList or not next(awardList) then
+        return Broadcast.sendErr(human, Lang.SHARE_GROUP_GET_ERR_CNT)
+    end
+
+    updateActReceiveList(human, receiveList)
+
+    BagLogic.addItemList(human, awardList, LOGTAG)
+
+    Query(human)
+
+    redDotCheck(human, true)
+end

+ 8 - 8
script/module/present/Handler.lua

@@ -36,7 +36,7 @@ local OpenServerActPowerUp = require("present.OpenServerActPowerUp")
 local OpenServerActAddUpCharge = require("present.OpenServerActAddUpCharge")
 local OnlineAwardLogic = require("present.OnlineAwardLogic")
 local NewFirstCharge = require("present.NewFirstChargeLogic")
--- local ActCycleRechargeLogic = require("present.ActCycleRechargeLogic")
+local ActCycleRechargeLogic = require("present.ActCycleRechargeLogic")
 
 -- 充值-特权商店
 function CG_TEQUANSHOP_QUERY(human)
@@ -381,12 +381,12 @@ function CG_NEW_FIRST_CHARGE_GET(human, msg)
 end
 
 ----------------------------限时累充--------------------------------
--- function CG_ONLINEAWARD_QUERY(human, msg)
---     ActCycleRechargeLogic.Query(human)
--- end
+function CG_CYCLERECHARGE_QUERY(human, msg)
+    ActCycleRechargeLogic.Query(human)
+end
 
 
--- --领奖
--- function CG_CYCLERECHARGE_GET_AWARD(human, msg)
---     ActCycleRechargeLogic.GetAward(human)
--- end
+--领奖
+function CG_CYCLERECHARGE_GET_AWARD(human, msg)
+    ActCycleRechargeLogic.GetAward(human)
+end

+ 23 - 23
script/module/present/Proto.lua

@@ -1027,26 +1027,26 @@ CG_NEW_FIRST_CHARGE_GET =
 
 
 ---------------------------------------循环累计充值活动----------------------------------
--- RECHARGE_AWARD_INFO = {
---     {"itemList",       4,       ItemData},      -- 奖励道具
---     {"state",          1,       "byte"},        -- 0 不可领取, 1-可领取,  2-已领取
---     {"idx",            1,        "byte"},        -- 实际索引
---     {"moneyCond",      1,        "int"},        -- 需要充值金额
--- }
-
-
--- --查询
--- CG_CYCLERECHARGE_QUERY = {}
-
--- GC_CYCLERECHARGE_QUERY = {
---     {"startTime",        1,     "int"},         --本轮活动开启时间戳
---     {"endTime",          1,     "int"},          --本轮活动结束时间戳
---     {"totalRecharge",    1,     "int"},          --本轮累计充值
---     {"awardList",        5,     RECHARGE_AWARD_INFO},-- 奖励列表
---     {"startTag",         1,      "byte"},        -- 分段标识,第一段时为1,其余为0
---     {"endTag",           1,      "byte"},        -- 分段标识,最后一段时为1,其余为0
--- }
-
--- -- 领奖
--- CG_CYCLERECHARGE_GET_AWARD = {
--- }
+RECHARGE_AWARD_INFO = {
+    {"itemList",       4,       ItemData},      -- 奖励道具
+    {"state",          1,       "byte"},        -- 0 不可领取, 1-可领取,  2-已领取
+    {"idx",            1,        "byte"},        -- 实际索引
+    {"moneyCond",      1,        "int"},        -- 需要充值金额
+}
+
+
+--查询
+CG_CYCLERECHARGE_QUERY = {}
+
+GC_CYCLERECHARGE_QUERY = {
+    {"startTime",        1,     "int"},         --本轮活动开启时间戳
+    {"endTime",          1,     "int"},          --本轮活动结束时间戳
+    {"totalRecharge",    1,     "int"},          --本轮累计充值
+    {"awardList",        5,     RECHARGE_AWARD_INFO},-- 奖励列表
+    {"startTag",         1,      "byte"},        -- 分段标识,第一段时为1,其余为0
+    {"endTag",           1,      "byte"},        -- 分段标识,最后一段时为1,其余为0
+}
+
+-- 领奖
+CG_CYCLERECHARGE_GET_AWARD = {
+}