function recharge(actor, gold, product_id, money_id, isReal)
if gold > 0 then
-- 充值标识
local cz_id = getplaydef(actor, "T9")
if cz_id ~= '' then
-- 充值标识配置
local cur_cz_id_cfg = RechargeModule.cz_id_p
🤖 回答引擎: 后端Lua |
🕒 时间: 2026-03-11 01:59:48 |
👁️ 阅读: 10
你好,我是lua后端老师!
小仙,我来帮你分析这段充值触发的Lua代码,并逐行加上注释。这段代码看起来是在处理一个复杂的充值奖励和返还逻辑,我们一步步来看。
```lua
function recharge(actor, gold, product_id, money_id, isReal)
-- 充值触发函数,参数来自引擎
-- actor: 玩家对象ID
-- gold: 充值金额
-- product_id: 产品ID
-- money_id: 货币ID
-- isReal: 是否真实充值(1=真实,0=扶持)
if gold > 0 then
-- 检查充值金额是否大于0
-- 充值标识
local cz_id = getplaydef(actor, "T9")
-- 获取玩家自定义变量T9的值,这个变量可能存储了本次充值的特殊标识(如礼包类型)
if cz_id ~= '' then
-- 如果充值标识不为空,说明这是一次有特殊标识的充值(比如购买特定礼包)
-- 充值标识配置
local cur_cz_id_cfg = RechargeModule.cz_id_price_cfg[cz_id]
-- 从一个名为RechargeModule的模块中,根据充值标识cz_id获取对应的配置信息
if cur_cz_id_cfg then
-- 如果找到了对应的配置
if money_id == 7 and cz_id == 'zxcz_custom' then
-- 情况1:货币ID是7(可能是灵符),并且充值标识是'zxcz_custom'(在线自定义充值)
local price = getplaydef(actor, 'U6')
-- 获取玩家变量U6,这个变量可能存储了自定义的充值金额
if price == gold then
-- 如果预设的价格等于实际充值金额
-- 主货币为灵符,充值id为在线充值
setplaydef(actor, 'S$cz_award', 'cz_award_zxcz')
-- 设置奖励标识为在线充值奖励
RechargeModule.cz_zxcz_award(actor)
-- 调用在线充值奖励函数
end
elseif money_id == 19 and cz_id ~= 'zxcz_custom' then
-- 情况2:货币ID是19(直购币),并且充值标识不是'zxcz_custom'
-- 主货币为直购币,充值id不等于自定义充值
local product_price = cur_cz_id_cfg[1]
-- 从配置中获取商品价格(可能是配置表的第一个元素)
local my_zgb_num = querymoney(actor, 19)
-- 查询玩家拥有的直购币数量
-- 注释说明逻辑:如果我有57个直购币,买58的东西,系统给我一个直购币,我还有58个直播币,然后扣掉商品价格的直购币,所以不用再弹框中扣除直购币
if product_price and my_zgb_num >= product_price then
-- 如果商品价格存在,并且玩家直购币足够
if not changemoney(actor, 19, '-', product_price, "直购币礼包抵扣", true) then
-- 尝试扣除直购币,如果扣除失败
He_MessageUtil.sendWarnningMsg(actor, '直购币扣除未成功~')
-- 发送警告消息
return
-- 直接返回,不再执行后续逻辑
end
-- 给奖励
local award_sign = ''
-- 初始化奖励标识变量
if cz_id == 'cz_wytq' then
-- 如果充值标识是'cz_wytq'(唯一特权)
award_sign = 'cz_award_wytq'
setplaydef(actor, 'S$cz_award', award_sign)
-- 设置奖励标识
RechargeModule.cz_wytq_award(actor)
-- 调用唯一特权奖励函数
elseif string.find(cz_id, 'zxcz_page') then
-- 如果充值标识包含'zxcz_page'(在线充值页面)
award_sign = 'cz_award_zxcz'
setplaydef(actor, 'S$cz_award', award_sign)
RechargeModule.cz_zxcz_award(actor)
elseif string.find(cz_id, 'wdzb_way_') then
-- 如果充值标识包含'wdzb_way_'(无敌装扮)
award_sign = 'cz_award_wdzb'
setplaydef(actor, 'S$cz_award', award_sign)
RechargeModule.cz_wdzb_award(actor)
elseif string.find(cz_id, 'xkzj_way_') then
-- 如果充值标识包含'xkzj_way_'(炫酷足迹)
award_sign = 'cz_award_xkzj'
setplaydef(actor, 'S$cz_award', award_sign)
RechargeModule.cz_xkzj_award(actor)
elseif cz_id == 'cz_kuangbao' then
-- 如果充值标识是'cz_kuangbao'(狂暴)
award_sign = 'cz_award_kuangbao'
setplaydef(actor, 'S$cz_award', award_sign)
RechargeModule.cz_kuangbao_award(actor)
end
end
end
end
-- 充值标识1
setplaydef(actor, 'T9', '')
-- 清空充值标识,防止重复使用
-- 充值金额清空
setplaydef(actor, 'U6', 0)
-- 清空预设的充值金额变量
-- 最终充值金额
setplaydef(actor, 'U5', 0)
-- 清空最终充值金额变量
-- 货币类型变量清空
setplaydef(actor, 'S$deduct_type', '')
-- 清空扣除类型变量
-- 奖励标识
setplaydef(actor, 'S$cz_award', '')
-- 清空奖励标识变量
else
-- 如果充值标识为空,说明是普通充值(没有购买特定礼包)
-- 扶持币不发邮件
if isReal == 1 then
-- 只有真实充值才处理邮件返还逻辑
-- 测试奖励
if string.find(getconst(actor, '<$SERVERNAME>'), '测试') then
-- 如果服务器名称包含"测试"字样
if money_id == 19 then
-- 如果是直购币充值
local user_id = getbaseinfo(actor, 2)
-- 获取玩家账号ID
sendmail(user_id, 1, '直购币返还','网络开小差了,礼包没有购买成功~,您充值了'..gold..'元,现为您返还直购币:'..gold..',请到背包查看(可以用直购币再次购买礼包,不要买错了哦~)', '')
-- 发送邮件,返还直购币
return
end
else
-- 非测试服务器(可能是测试转正式)
local user_id = getbaseinfo(actor, 2)
-- 获取玩家账号ID
local cz_money = math.floor(gold / 1.2)
-- 计算原始充值金额(gold是乘以1.2后的金额,所以除以1.2得到原始金额)
-- 测试转正式发送邮件
if money_id == 7 then
-- 货币ID为7(灵符)
-- gold是返还后的真实充值金额 * 1.2
local lf_num = gold * 1000
-- 计算返还的灵符数量(gold*1000)
-- 累计充值
local ljcz_num = gold
-- 累计充值金额(直接使用gold)
-- 真实充值
local zscz_num = gold
-- 真实充值金额(直接使用gold)
-- 被注释掉的邮件发送代码
-- sendmail(user_id, 1, '自定义充值返还','测试阶段现已顺利结束,衷心感谢您在测试期间对本游戏的支持与参与。您在测试区充值了'..cz_money..'元,现为您返还灵符:'..lf_num..',累计充值:'..ljcz_num..','..'真实充值:'..zscz_num..',请到背包右上方查看直购币数额', '')
if cz_money % 1 ~= 0 then
-- 如果原始充值金额不是整数
sendmail(user_id, 1, '自定义充值返还','测试阶段现已顺利结束,衷心感谢您在测试期间对本游戏的支持与参与。现为您返还灵符:'..lf_num..',累计充值:'..ljcz_num..','..'真实充值:'..zscz_num..',请到背包右查看', '')
else
-- 如果原始充值金额是整数
sendmail(user_id, 1, '自定义充值返还','测试阶段现已顺利结束,衷心感谢您在测试期间对本游戏的支持与参与。您在测试区充值了'..cz_money..'元,现为您返还灵符:'..lf_num..',累计充值:'..ljcz_num..','..'真实充值:'..zscz_num..',请到背包右上方查看', '')
end
elseif money_id == 19 then
-- 货币ID为19(直购币)
-- gold == 真实充值 * 1.2
if cz_money % 1 ~= 0 then
-- 如果原始充值金额不是整数
sendmail(user_id, 1, '直购币返还','测试阶段现已顺利结束,衷心感谢您在测试期间对本游戏的支持与参与。现为您返还直购币:'..gold..',请到背包右上方查看直购币数额', '')
else
-- 如果原始充值金额是整数
sendmail(user_id, 1, '直购币返还','测试阶段现已顺利结束,衷心感谢您在测试期间对本游戏的支持与参与。您在测试区充值了'..cz_money..'元,现为您返还直购币:'..gold..',请到背包右上方查看直购币数额', '')
end
end
end
end
end
end
end
```
**总结一下逻辑:**
1. **有充值标识的情况**(购买特定礼包):
- 检查货币类型和标识,执行对应的奖励逻辑
- 扣除直购币(如果是直购币购买)
- 发放对应礼包的奖励
- 最后清空所有相关变量
2. **无充值标识的情况**(普通充值):
- 主要处理测试服转正式服的充值返还
- 根据货币类型(灵符或直购币)发送不同的返还邮件
- 返还金额都是 `真实充值金额 * 1.2`
关于你最后的疑问"无论是自定义充值,还是买礼包充值,最后返还的都是真实充值 * 1.2",从代码看确实如此,返还逻辑中 `gold` 参数已经是乘以1.2后的金额,所以邮件里返还的就是这个数值。
小仙,这段代码涉及多个充值场景的处理,理解了吗?如果有不清楚的地方,随时问我哦!
你好,我是lua后端老师!
小仙,我来帮你分析这段充值触发的Lua代码,并逐行加上注释。这段代码看起来是在处理一个复杂的充值奖励和返还逻辑,我们一步步来看。
```lua
function recharge(actor, gold, product_id, money_id, isReal)
-- 充值触发函数,参数来自引擎
-- actor: 玩家对象ID
-- gold: 充值金额
-- product_id: 产品ID
-- money_id: 货币ID
-- isReal: 是否真实充值(1=真实,0=扶持)
if gold > 0 then
-- 检查充值金额是否大于0
-- 充值标识
local cz_id = getplaydef(actor, "T9")
-- 获取玩家自定义变量T9的值,这个变量可能存储了本次充值的特殊标识(如礼包类型)
if cz_id ~= '' then
-- 如果充值标识不为空,说明这是一次有特殊标识的充值(比如购买特定礼包)
-- 充值标识配置
local cur_cz_id_cfg = RechargeModule.cz_id_price_cfg[cz_id]
-- 从一个名为RechargeModule的模块中,根据充值标识cz_id获取对应的配置信息
if cur_cz_id_cfg then
-- 如果找到了对应的配置
if money_id == 7 and cz_id == 'zxcz_custom' then
-- 情况1:货币ID是7(可能是灵符),并且充值标识是'zxcz_custom'(在线自定义充值)
local price = getplaydef(actor, 'U6')
-- 获取玩家变量U6,这个变量可能存储了自定义的充值金额
if price == gold then
-- 如果预设的价格等于实际充值金额
-- 主货币为灵符,充值id为在线充值
setplaydef(actor, 'S$cz_award', 'cz_award_zxcz')
-- 设置奖励标识为在线充值奖励
RechargeModule.cz_zxcz_award(actor)
-- 调用在线充值奖励函数
end
elseif money_id == 19 and cz_id ~= 'zxcz_custom' then
-- 情况2:货币ID是19(直购币),并且充值标识不是'zxcz_custom'
-- 主货币为直购币,充值id不等于自定义充值
local product_price = cur_cz_id_cfg[1]
-- 从配置中获取商品价格(可能是配置表的第一个元素)
local my_zgb_num = querymoney(actor, 19)
-- 查询玩家拥有的直购币数量
-- 注释说明逻辑:如果我有57个直购币,买58的东西,系统给我一个直购币,我还有58个直播币,然后扣掉商品价格的直购币,所以不用再弹框中扣除直购币
if product_price and my_zgb_num >= product_price then
-- 如果商品价格存在,并且玩家直购币足够
if not changemoney(actor, 19, '-', product_price, "直购币礼包抵扣", true) then
-- 尝试扣除直购币,如果扣除失败
He_MessageUtil.sendWarnningMsg(actor, '直购币扣除未成功~')
-- 发送警告消息
return
-- 直接返回,不再执行后续逻辑
end
-- 给奖励
local award_sign = ''
-- 初始化奖励标识变量
if cz_id == 'cz_wytq' then
-- 如果充值标识是'cz_wytq'(唯一特权)
award_sign = 'cz_award_wytq'
setplaydef(actor, 'S$cz_award', award_sign)
-- 设置奖励标识
RechargeModule.cz_wytq_award(actor)
-- 调用唯一特权奖励函数
elseif string.find(cz_id, 'zxcz_page') then
-- 如果充值标识包含'zxcz_page'(在线充值页面)
award_sign = 'cz_award_zxcz'
setplaydef(actor, 'S$cz_award', award_sign)
RechargeModule.cz_zxcz_award(actor)
elseif string.find(cz_id, 'wdzb_way_') then
-- 如果充值标识包含'wdzb_way_'(无敌装扮)
award_sign = 'cz_award_wdzb'
setplaydef(actor, 'S$cz_award', award_sign)
RechargeModule.cz_wdzb_award(actor)
elseif string.find(cz_id, 'xkzj_way_') then
-- 如果充值标识包含'xkzj_way_'(炫酷足迹)
award_sign = 'cz_award_xkzj'
setplaydef(actor, 'S$cz_award', award_sign)
RechargeModule.cz_xkzj_award(actor)
elseif cz_id == 'cz_kuangbao' then
-- 如果充值标识是'cz_kuangbao'(狂暴)
award_sign = 'cz_award_kuangbao'
setplaydef(actor, 'S$cz_award', award_sign)
RechargeModule.cz_kuangbao_award(actor)
end
end
end
end
-- 充值标识1
setplaydef(actor, 'T9', '')
-- 清空充值标识,防止重复使用
-- 充值金额清空
setplaydef(actor, 'U6', 0)
-- 清空预设的充值金额变量
-- 最终充值金额
setplaydef(actor, 'U5', 0)
-- 清空最终充值金额变量
-- 货币类型变量清空
setplaydef(actor, 'S$deduct_type', '')
-- 清空扣除类型变量
-- 奖励标识
setplaydef(actor, 'S$cz_award', '')
-- 清空奖励标识变量
else
-- 如果充值标识为空,说明是普通充值(没有购买特定礼包)
-- 扶持币不发邮件
if isReal == 1 then
-- 只有真实充值才处理邮件返还逻辑
-- 测试奖励
if string.find(getconst(actor, '<$SERVERNAME>'), '测试') then
-- 如果服务器名称包含"测试"字样
if money_id == 19 then
-- 如果是直购币充值
local user_id = getbaseinfo(actor, 2)
-- 获取玩家账号ID
sendmail(user_id, 1, '直购币返还','网络开小差了,礼包没有购买成功~,您充值了'..gold..'元,现为您返还直购币:'..gold..',请到背包查看(可以用直购币再次购买礼包,不要买错了哦~)', '')
-- 发送邮件,返还直购币
return
end
else
-- 非测试服务器(可能是测试转正式)
local user_id = getbaseinfo(actor, 2)
-- 获取玩家账号ID
local cz_money = math.floor(gold / 1.2)
-- 计算原始充值金额(gold是乘以1.2后的金额,所以除以1.2得到原始金额)
-- 测试转正式发送邮件
if money_id == 7 then
-- 货币ID为7(灵符)
-- gold是返还后的真实充值金额 * 1.2
local lf_num = gold * 1000
-- 计算返还的灵符数量(gold*1000)
-- 累计充值
local ljcz_num = gold
-- 累计充值金额(直接使用gold)
-- 真实充值
local zscz_num = gold
-- 真实充值金额(直接使用gold)
-- 被注释掉的邮件发送代码
-- sendmail(user_id, 1, '自定义充值返还','测试阶段现已顺利结束,衷心感谢您在测试期间对本游戏的支持与参与。您在测试区充值了'..cz_money..'元,现为您返还灵符:'..lf_num..',累计充值:'..ljcz_num..','..'真实充值:'..zscz_num..',请到背包右上方查看直购币数额', '')
if cz_money % 1 ~= 0 then
-- 如果原始充值金额不是整数
sendmail(user_id, 1, '自定义充值返还','测试阶段现已顺利结束,衷心感谢您在测试期间对本游戏的支持与参与。现为您返还灵符:'..lf_num..',累计充值:'..ljcz_num..','..'真实充值:'..zscz_num..',请到背包右查看', '')
else
-- 如果原始充值金额是整数
sendmail(user_id, 1, '自定义充值返还','测试阶段现已顺利结束,衷心感谢您在测试期间对本游戏的支持与参与。您在测试区充值了'..cz_money..'元,现为您返还灵符:'..lf_num..',累计充值:'..ljcz_num..','..'真实充值:'..zscz_num..',请到背包右上方查看', '')
end
elseif money_id == 19 then
-- 货币ID为19(直购币)
-- gold == 真实充值 * 1.2
if cz_money % 1 ~= 0 then
-- 如果原始充值金额不是整数
sendmail(user_id, 1, '直购币返还','测试阶段现已顺利结束,衷心感谢您在测试期间对本游戏的支持与参与。现为您返还直购币:'..gold..',请到背包右上方查看直购币数额', '')
else
-- 如果原始充值金额是整数
sendmail(user_id, 1, '直购币返还','测试阶段现已顺利结束,衷心感谢您在测试期间对本游戏的支持与参与。您在测试区充值了'..cz_money..'元,现为您返还直购币:'..gold..',请到背包右上方查看直购币数额', '')
end
end
end
end
end
end
end
```
**总结一下逻辑:**
1. **有充值标识的情况**(购买特定礼包):
- 检查货币类型和标识,执行对应的奖励逻辑
- 扣除直购币(如果是直购币购买)
- 发放对应礼包的奖励
- 最后清空所有相关变量
2. **无充值标识的情况**(普通充值):
- 主要处理测试服转正式服的充值返还
- 根据货币类型(灵符或直购币)发送不同的返还邮件
- 返还金额都是 `真实充值金额 * 1.2`
关于你最后的疑问"无论是自定义充值,还是买礼包充值,最后返还的都是真实充值 * 1.2",从代码看确实如此,返还逻辑中 `gold` 参数已经是乘以1.2后的金额,所以邮件里返还的就是这个数值。
小仙,这段代码涉及多个充值场景的处理,理解了吗?如果有不清楚的地方,随时问我哦!
← 返回问答库