-- 定义充值中心模块表
local ChongZhiZhongXin = {}
-- 引入充值中心配置文件
local config = include("QuestDiary/cfgcsv/cfg_ChongZhiZhongXin.lua")
--[[
处理充值请求1 (自定义金额充值)
@param actor 发起请求的玩家对象
@param PayWay 支付方式
@param Sum 充值金额
]]
function ChongZhiZhongXin.Request1(actor, PayWay ,Sum)
-- 校验充值金额是否为整数
if Sum % 1 ~= 0 then return end
-- 校验最低充值金额
if Sum < 10 then
Player.sendmsgEx(actor, "提示#251|:#255|最低充值|10元#249|,请重新输入...")
return
end
-- 调用支付接口,7可能代表某种货币类型或渠道
pullpay(actor,Sum,PayWay,7)
end
--[[
检查玩家是否已领取所有首充翻倍奖励,并授予“至尊玩家”称号
@param actor 玩家对象
]]
local function CheckAwardState(actor)
local Num = 0
-- 遍历8个首充翻倍标识
for i = 1, 8 do
-- 获取对应标识的状态
local bool = getflagstatus(actor, VarCfg["F_首充翻倍标识_".. i ..""])
Num = Num + bool
end
-- 如果8个标识都已激活,则授予称号
if Num < 8 then return end
confertitle(actor, "至尊玩家", 1)
end
--[[
处理充值请求2 (固定档位充值或礼包购买)
@param actor 发起请求的玩家对象
@param PayWay 支付方式
@param Sort 礼包或档位编号
@param Sum 支付金额 (在某些情况下,如果玩家有足够积分,则用积分兑换,否则走支付流程)
]]
function ChongZhiZhongXin.Request2(actor,PayWay,Sort,Sum)
-- 获取指定档位首充翻倍标识的状态
local bool = getflagstatus(actor, VarCfg["F_首充翻倍标识_".. Sort ..""])
-- 获取玩家当前的换购积分
local JiFenNum = getplaydef(actor, VarCfg["U_换购积分"])
-- 从配置中获取当前档位的信息
local cfg = config[Sort]
-- 如果该档位首充翻倍标识未激活 (bool == 0)
if bool == 0 then
-- 如果玩家的换购积分足够支付当前档位
if JiFenNum >= cfg.Sum then
-- 激活该档位的首充翻倍标识
setflagstatus(actor, VarCfg["F_首充翻倍标识_".. Sort ..""], 1)
-- 重新获取换购积分 (虽然前面获取过,但这里可能是为了确保最新值,或者编码习惯)
local JiFenNum = getplaydef(actor, VarCfg["U_换购积分"])
-- 扣除消耗的积分
JiFenNum = JiFenNum - cfg.Sum
setplaydef(actor, VarCfg["U_换购积分"], JiFenNum)
-- 获取该档位的奖励配置
local award = cfg.award
local JieShao = "" -- 用于邮件内容的奖励描述字符串
local JiangLi = "" -- 用于邮件附件的奖励字符串
-- 遍历奖励配置,拼接奖励描述 (跳过第一个,通常第一个是货币)
for i, v in ipairs(award) do
if i >= 2 then
JieShao = JieShao .. "\\获得"..v[1].."x"..v[2]
end
end
-- 遍历奖励配置,拼接邮件附件奖励字符串 (跳过第一个)
for i, v in ipairs(award) do
if i >= 2 then
JiangLi = JiangLi .. "".. v[1] .."#"..v[2].."#51&"
end
end
-- 获取玩家UserID
local UserId = getconst(actor, "<$USERID>")
-- 发送奖励邮件
sendmail(UserId, 5001, cfg.Sum.."元充值礼包",JieShao,JiangLi)
-- 给玩家发送提示消息
Player.sendmsgEx(actor, "提示#251|:#255|恭喜你,领取|".. cfg.Sum .."元充值礼包#249|,祝您游戏愉快...")
-- 同步充值数据到客户端
ChongZhiZhongXin.SyncResponse(actor)
-- 检查是否满足授予“至尊玩家”称号的条件
CheckAwardState(actor)
else
-- 如果积分不足,则走正常支付流程
pullpay(actor,Sum,PayWay,7)
end
else
-- 如果该档位首充翻倍标识已激活,则直接走正常支付流程 (可能是重复购买)
pullpay(actor,Sum,PayWay,7)
end
-- release_print("支付方式",PayWay) -- 调试打印,已注释
-- release_print("礼包编号",Sort) -- 调试打印,已注释
-- release_print("支付金额",Sum) -- 调试打印,已注释
end
--[[
同步充值相关数据到客户端
@param actor 玩家对象
@param logindatas 可选参数,登录时批量同步数据用,如果提供,则将数据插入此表,否则直接发送消息
]]
function ChongZhiZhongXin.SyncResponse(actor, logindatas)
local data = { } -- 用于存储同步数据的表
-- 遍历8个首充翻倍标识,获取状态并存入data表
for i = 1, 8 do
local num = getflagstatus(actor, VarCfg["F_首充翻倍标识_".. i ..""])
table.insert(data, num)
end
-- 获取并存入玩家的换购积分
local JiFenNum = getplaydef(actor, VarCfg["U_换购积分"])
table.insert(data, JiFenNum)
-- 获取并存入玩家的累计真实充值金额
local LeiJiChongZhi = getplaydef(actor, VarCfg["U_真实充值"])
table.insert(data, LeiJiChongZhi)
-- 构建网络消息数据包
local _login_data = { ssrNetMsgCfg.ChongZhiZhongXin_SyncResponse, 0, 0, 0, data }
-- 如果提供了logindatas (通常在登录流程中),则将数据添加到logindatas表中批量发送
if logindatas then
table.insert(logindatas, _login_data)
else
-- 否则,直接发送同步消息给客户端
Message.sendmsg(actor, ssrNetMsgCfg.ChongZhiZhongXin_SyncResponse, 0, 0, 0, data)
end
end
-- 注册充值中心相关的网络消息处理函数
Message.RegisterNetMsg(ssrNetMsgCfg.ChongZhiZhongXin, ChongZhiZhongXin)
--[[
充值回调函数,当玩家充值成功后由支付系统调用
@param actor 玩家对象
@param gold 充值获得的货币数量
@param productid 商品ID或NPC标识 (在此处未使用)
@param moneyid 充值货币类型 (7:灵符, 20:绑定灵符)
]]
local function _onRecharge(actor, gold, productid, moneyid)
-- 只处理灵符和绑定灵符的充值回调
if moneyid ~= 7 and moneyid ~= 20 then return end
-- local name = getbaseinfo(actor, ConstCfg.gbase.name) -- 调试代码,已注释
-- sendmsg(actor, 1, '{"Msg":"<font color=\'#ff0000\'>玩家'.. name ..'。。。</font>","Type":9}') -- 调试代码
-- sendmsg(actor, 1, '{"Msg":"<font color=\'#ff0000\'>货币'.. moneyid ..'。。。</font>","Type":9}') -- 调试代码
-- sendmsg(actor, 1, '{"Msg":"<font color=\'#ff0000\'>数量'.. gold ..'。。。</font>","Type":9}') -- 调试代码
-- sendmsg(actor, 1, '{"Msg":"<font color=\'#ff0000\'>NPC'.. productid ..'。。。</font>","Type":9}') -- 调试代码
-- 给玩家增加对应货币 (货币类型11可能是游戏内的通用充值货币)
changemoney(actor, 11, "+", gold, "充值回调增加", true)
--------------增加每日充值记录--------------
local RiChongNum = getplaydef(actor, VarCfg["J_日冲记录"])
RiChongNum = RiChongNum + gold
setplaydef(actor, VarCfg["J_日冲记录"], RiChongNum)
--------------增加真实充值累计--------------
local LeiJiChongZhi = getplaydef(actor, VarCfg["U_真实充值"])
LeiJiChongZhi = LeiJiChongZhi + gold
setplaydef(actor, VarCfg["U_真实充值"], LeiJiChongZhi)
--------------增加礼包积分 (如果玩家不是“至尊玩家”)--------------
if not checktitle(actor, "至尊玩家") then
local JiFenNum = getplaydef(actor, VarCfg["U_换购积分"])
JiFenNum = JiFenNum + gold
setplaydef(actor, VarCfg["U_换购积分"], JiFenNum)
end
local OnTheList = false -- 标记充值金额是否匹配某个首充档位
local AwardInfo = {} -- 存储匹配到的档位信息
-- 遍历充值配置,检查充值金额是否与某个档位的金额完全匹配
for i, v in ipairs(config) do
if gold == v.Sum then
-- 获取该档位首充翻倍标识的状态
local num = getflagstatus(actor, VarCfg["F_首充翻倍标识_".. i ..""])
-- 如果该档位尚未首充 (标识为0)
if num == 0 then
-- 激活首充标识
setflagstatus(actor, VarCfg["F_首充翻倍标识_".. i ..""], 1)
OnTheList = true -- 标记已匹配到首充档位
AwardInfo = v -- 保存档位信息
ChongZhiZhongXin.SyncResponse(actor) -- 同步数据到客户端
break -- 找到匹配即跳出循环
end
end
end
-- 如果成功匹配到首充档位并激活了标识 (OnTheList为true)
if OnTheList then
-- 获取当前换购积分 (此时应该是已经加上了本次充值额度的积分)
local JiFenNum = getplaydef(actor, VarCfg["U_换购积分"])
-- 扣除该档位对应的“消耗”积分 (因为首充通常是直接给奖励,这里的逻辑可能是:充值先加等额积分,然后如果触发首充,再用积分“兑换”首充礼包)
JiFenNum = JiFenNum - AwardInfo.Sum
setplaydef(actor, VarCfg["U_换购积分"], JiFenNum)
local award = AwardInfo.award -- 获取档位奖励配置
local JieShao = "" -- 邮件描述
local JiangLi = "" -- 邮件附件
-- 拼接邮件奖励描述
for i, v in ipairs(award) do
if i >= 2 then
JieShao = JieShao .. "\\获得"..v[1].."x"..v[2]
end
end
-- 拼接邮件附件奖励
for i, v in ipairs(award) do
if i >= 2 then
JiangLi = JiangLi .. "".. v[1] .."#"..v[2].."#51&"
end
end
local UserId = getconst(actor, "<$USERID>")
-- 发送首充礼包邮件
sendmail(UserId, 5001, AwardInfo.Sum.."元充值礼包",JieShao,JiangLi)
-- 给玩家发送提示
Player.sendmsgEx(actor, "提示#251|:#255|恭喜你,领取|".. AwardInfo.Sum .."元充值礼包#249|,祝您游戏愉快...")
-- 同步充值数据到客户端
ChongZhiZhongXin.SyncResponse(actor)
-- 检查是否满足授予“至尊玩家”称号的条件
CheckAwardState(actor)
end
-- 无论是否触发首充,都同步一次数据 (确保累计充值等信息更新)
ChongZhiZhongXin.SyncResponse(actor)
-- 推送充值完成事件
GameEvent.push(EventCfg.onRechargeEnd, actor)
end
-- 注册充值事件回调
GameEvent.add(EventCfg.onRecharge, _onRecharge, ChongZhiZhongXin)
--[[
玩家登录完成事件回调
@param actor 玩家对象
@param logindatas 登录时用于批量同步数据的表
]]
local function _onLoginEnd(actor, logindatas)
-- 同步充值相关数据到客户端
ChongZhiZhongXin.SyncResponse(actor, logindatas)
end
-- 注册登录完成事件回调
GameEvent.add(EventCfg.onLoginEnd, _onLoginEnd, ChongZhiZhongXin)
--[[
杀怪事件回调 (怪物猎人功能)
每击杀10只怪物,如果玩家拥有“怪物猎人”称号,则永久增加1点切割伤害
@param actor 玩家对象
@param monobj 被击杀的怪物对象
]]
local function _onKillMon(actor, monobj)
-- 检查玩家是否拥有“怪物猎人”称号
if checktitle(actor, "怪物猎人") then
-- 获取当前杀怪计数
local KillMonNum = getplaydef(actor, VarCfg["N$怪物猎人_杀怪计数"])
KillMonNum = KillMonNum + 1
setplaydef(actor, VarCfg["N$怪物猎人_杀怪计数"], KillMonNum)
-- 如果杀怪数量达到10
if KillMonNum >= 10 then
-- 重置杀怪计数
setplaydef(actor, VarCfg["N$怪物猎人_杀怪计数"], 0)
-- 获取当前“怪物猎人”层数
local num = getplaydef(actor, VarCfg["U_怪物猎人层数"])
num = num + 1
setplaydef(actor, VarCfg["U_怪物猎人层数"], num)
-- 增加玩家切割属性 (具体属性ID和计算方式由"3#200#".. num ..""决定)
setaddnewabil(actor,12,"=","3#200#".. num .."")
end
end
end
-- 注册杀怪事件回调
GameEvent.add(EventCfg.onKillMon, _onKillMon, ChongZhiZhongXin)
-- 返回模块表,使其可以被其他脚本引用
return ChongZhiZhongXin