--[[
@file ChongZhiZhongXinOBJ.lua
@brief 充值中心UI对象类
@description 处理游戏内充值功能的UI界面,包括支付方式切换、充值档位显示、自定义充值等功能
@author 游戏开发团队
]]
-- 充值中心对象类定义
ChongZhiZhongXinOBJ = {}
-- 类名标识,用于窗口管理和调试
ChongZhiZhongXinOBJ.__cname = "ChongZhiZhongXinOBJ"
-- 加载充值中心配置文件,包含充值档位、奖励等信息
ChongZhiZhongXinOBJ.config = ssrRequireCsvCfg("cfg_ChongZhiZhongXin")
-- 当前选择的支付方式 (1=支付宝, 2=微信, 3=其他)
ChongZhiZhongXinOBJ.PayWay = 1
-------------------------------↓↓↓ UI操作 ↓↓↓---------------------------------------
--[[
@function main
@brief 充值中心主界面初始化函数
@param objcfg 对象配置参数,包含UI路径和NPC ID等信息
@description 创建充值中心窗口,设置UI布局,绑定事件处理函数
]]
function ChongZhiZhongXinOBJ:main(objcfg)
-- 创建主窗口容器,设置为模态窗口
local parent = GUI:Win_Create(self.__cname, 0, 0, 0, 0, false, false, true, true, true, objcfg.NPCID)
-- 加载UI布局文件
GUI:LoadExport(parent, objcfg.UI_PATH)
-- 保存父窗口引用
self._parent = parent
-- 创建UI代理对象,便于访问UI控件
self.ui = GUI:ui_delegate(parent)
-- 设置背景图片位置(居中偏移-30像素)
ssrSetWidgetPosition(parent, self.ui.ImageBG, 2, -30, 0)
-- 背景点击事件(防止点击穿透到下层界面)
GUI:addOnClickEvent(self.ui.ImageBG, function()
--ssrPrint("我是防点击穿透")
end)
-- 启用关闭区域的触摸响应
GUI:setTouchEnabled(self.ui.CloseLayout,true)
-- 点击背景关闭区域关闭窗口
GUI:addOnClickEvent(self.ui.CloseLayout, function()
GUI:Win_Close(self._parent)
end)
-- 点击关闭按钮关闭窗口
GUI:addOnClickEvent(self.ui.CloseButton, function()
GUI:Win_Close(self._parent)
end)
-- 播放窗口打开的缩放动画效果
GUI:Timeline_Window1(self._parent)
-- 初始化UI显示内容
self:UpdateUI()
-------------------------------↓↓↓支付方式切换↓↓↓-------------------------------
-- 支付方式按钮1点击事件(支付宝)
GUI:addOnClickEvent(self.ui.TopUp_Button_1, function()
ChongZhiZhongXinOBJ:Switchpay(1)
end)
-- 支付方式按钮2点击事件(微信支付)
GUI:addOnClickEvent(self.ui.TopUp_Button_2, function()
ChongZhiZhongXinOBJ:Switchpay(2)
end)
-- 支付方式按钮3点击事件(其他支付方式)
GUI:addOnClickEvent(self.ui.TopUp_Button_3, function()
ChongZhiZhongXinOBJ:Switchpay(3)
end)
-------------------------------↑↑↑支付方式切换↑↑↑-------------------------------
-- 自定义充值按钮点击事件
GUI:addOnClickEvent(self.ui.Request_Button, function()
-- 获取用户输入的充值金额
local num = GUI:TextInput_getString(self.ui.Input)
-- 发送自定义充值请求到服务器
ssrMessage:sendmsg(ssrNetMsgCfg.ChongZhiZhongXin_Request1, self.PayWay, num)
end)
end
--[[
@function Switchpay
@brief 切换支付方式显示
@param num 支付方式编号 (1=支付宝, 2=微信, 3=其他)
@description 隐藏所有支付方式界面,只显示选中的支付方式
]]
function ChongZhiZhongXinOBJ:Switchpay(num)
-- 隐藏所有支付方式界面
GUI:setVisible(self.ui.ZhiFuFangShi1, false) -- 支付宝
GUI:setVisible(self.ui.ZhiFuFangShi2, false) -- 微信支付
GUI:setVisible(self.ui.ZhiFuFangShi3, false) -- 其他支付方式
-- 显示选中的支付方式界面
GUI:setVisible(self.ui["ZhiFuFangShi"..num], true)
-- 更新当前支付方式
self.PayWay = num
end
--[[
@function UpdateUI
@brief 更新充值中心UI显示
@description 刷新支付方式选择、充值档位列表、奖励显示等所有UI元素
]]
function ChongZhiZhongXinOBJ:UpdateUI()
-- 切换到当前选择的支付方式
ChongZhiZhongXinOBJ:Switchpay(self.PayWay)
-- 清空充值档位容器中的所有子控件
GUI:removeAllChildren(self.ui.Panel_1)
-- [1] = {
-- Image = "type1",
-- Sum = 10,
-- award = {
-- [1] = {
-- [1] = "绑定灵符",
-- [2] = 100,
-- },
-- [2] = {
-- [1] = "元宝",
-- [2] = 50000,
-- },
-- [3] = {
-- [1] = "焚天石",
-- [2] = 188,
-- },
-- [4] = {
-- [1] = "天工之锤",
-- [2] = 188,
-- },
-- },
-- },
-- 创建8个充值档位按钮
for i = 1, 8 do
-- 获取当前档位的配置信息
local cfg = self.config[i]
-- 创建档位背景图片
local Type_Image = GUI:Image_Create(self.ui.Panel_1, "Type_Image"..i, 0.00, 0.00, "res/custom/ChongZhiZhongXin/".. cfg.Image ..".png")
-- 创建可点击的按钮区域
local ButtonLayout = GUI:Layout_Create(Type_Image, "ButtonLayout"..i, 5.00, 15.00, 190, 235, false)
-- 启用触摸响应
GUI:setTouchEnabled(ButtonLayout,true)
-- 绑定充值按钮点击事件
GUI:addOnClickEvent(ButtonLayout, function()
-- 发送充值请求:支付方式、档位编号、充值金额
ssrMessage:sendmsg(ssrNetMsgCfg.ChongZhiZhongXin_Request2,self.PayWay,i,cfg.Sum)
end)
-- 创建奖励物品显示区域
local itemlooks = GUI:Layout_Create(Type_Image, "itemlooks"..i, 35.00, 67.00, 160, 35, false)
-- 根据领取状态显示不同的奖励内容
if self.data[i] == 0 then
-- 未领取:显示完整奖励列表
ssrAddItemListX(itemlooks, cfg.award,"奖励1",{imgRes = "",spacing = 45, itemScale = 1})
else
-- 已领取:只显示首个奖励物品
ssrAddItemListX(itemlooks, {cfg.award[1]},"奖励",{imgRes = "",spacing = 45, itemScale = 1})
end
end
-- 设置充值档位容器的自动布局(4列网格布局)
GUI:UserUILayout(self.ui.Panel_1, { dir=3, addDir=1, colnum=4 })
-- 统计已领取的档位数量
local AwardState = 0
for i = 1, 8 do
AwardState = AwardState + self.data[i]
end
-- 如果所有档位都已领取,隐藏累计充值显示
if AwardState == 8 then
GUI:setVisible(self.ui.Money_24_Img, false)
else
-- 显示当前累计充值金额
GUI:Text_setString(self.ui.Money_24_Num, self.data[9])
end
-- 显示玩家当前拥有的货币数量
GUI:Text_setString(self.ui.Money_22_Num, self.data[10])
end
-------------------------------↓↓↓ 网络消息 ↓↓↓---------------------------------------
--[[
@function SyncResponse
@brief 同步充值数据响应处理
@param arg1, arg2, arg3 网络消息参数(未使用)
@param data 服务器返回的充值数据
@description 接收服务器推送的充值状态更新,刷新UI显示
]]
function ChongZhiZhongXinOBJ:SyncResponse(arg1, arg2, arg3, data)
-- 保存服务器返回的充值数据
self.data = data
-- SL:dump(data) -- 调试用:打印数据内容
-- 如果充值中心窗口当前处于打开状态,则刷新UI
if GUI:GetWindow(nil, self.__cname) then
self:UpdateUI()
end
end
--[[
@function OpenUI
@brief 打开充值中心UI请求处理
@param arg1, arg2, arg3 网络消息参数(未使用)
@param data 服务器数据(未使用)
@description 响应服务器的打开充值中心UI指令
]]
function ChongZhiZhongXinOBJ:OpenUI(arg1, arg2, arg3, data)
-- 通过UI管理器打开充值中心窗口
ssrUIManager:OPEN(ssrObjCfg.ChongZhiZhongXin)
end
-- 返回充值中心对象类
return ChongZhiZhongXinOBJ
充值中心
local config = {
[1] = {
Image = "type1",
Sum = 10,
award = {
[1] = {
[1] = "绑定灵符",
[2] = 100,
},
[2] = {
[1] = "元宝",
[2] = 50000,
},
[3] = {
[1] = "焚天石",
[2] = 188,
},
[4] = {
[1] = "天工之锤",
[2] = 188,
},
},
},
[2] = {
Image = "type2",
Sum = 30,
award = {
[1] = {
[1] = "绑定灵符",
[2] = 300,
},
[2] = {
[1] = "绑定金币",
[2] = 10000000,
},
[3] = {
[1] = "元宝",
[2] = 100000,
},
[4] = {
[1] = "幻灵水晶",
[2] = 188,
},
},
},
[3] = {
Image = "type3",
Sum = 68,
award = {
[1] = {
[1] = "绑定灵符",
[2] = 680,
},
[2] = {
[1] = "元宝",
[2] = 300000,
},
[3] = {
[1] = "焚天石",
[2] = 588,
},
[4] = {
[1] = "天工之锤",
[2] = 588,
},
},
},
[4] = {
Image = "type4",
Sum = 128,
award = {
[1] = {
[1] = "绑定灵符",
[2] = 1280,
},
[2] = {
[1] = "绑定金币",
[2] = 30000000,
},
[3] = {
[1] = "幻灵水晶",
[2] = 328,
},
[4] = {
[1] = "打工皇帝[称号]",
[2] = 1,
},
},
},
[5] = {
Image = "type5",
Sum = 198,
award = {
[1] = {
[1] = "绑定灵符",
[2] = 1980,
},
[2] = {
[1] = "元宝",
[2] = 500000,
},
[3] = {
[1] = "鸿运当头",
[2] = 1,
},
[4] = {
[1] = "怪物猎人[称号]",
[2] = 1,
},
},
},
[6] = {
Image = "type6",
Sum = 328,
award = {
[1] = {
[1] = "绑定灵符",
[2] = 3280,
},
[2] = {
[1] = "绑定金币",
[2] = 50000000,
},
[3] = {
[1] = "鸿运当头",
[2] = 1,
},
[4] = {
[1] = "魔法盾[技能]",
[2] = 1,
},
},
},
[7] = {
Image = "type7",
Sum = 648,
award = {
[1] = {
[1] = "绑定灵符",
[2] = 6480,
},
[2] = {
[1] = "元宝",
[2] = 1000000,
},
[3] = {
[1] = "鸿运当头",
[2] = 1,
},
[4] = {
[1] = "夜明珠",
[2] = 1,
},
},
},
[8] = {
Image = "type8",
Sum = 998,
award = {
[1] = {
[1] = "绑定灵符",
[2] = 9980,
},
[2] = {
[1] = "元宝",
[2] = 2000000,
},
[3] = {
[1] = "鸿运当头",
[2] = 2,
},
[4] = {
[1] = "牛马主宰印",
[2] = 1,
},
},
},
}
return config
-- 定义充值中心模块表
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