NiuMaZanZhuOBJ = {} -- 定义一个全局对象 NiuMaZanZhuOBJ
NiuMaZanZhuOBJ.__cname = "NiuMaZanZhuOBJ" -- 设置对象的类名
--NiuMaZanZhuOBJ.config = ssrRequireCsvCfg("cfg_NiuMaZanZhu") -- 注释掉的配置加载,可能从其他地方加载或未使用
-------------------------------↓↓↓ UI操作 ↓↓↓--------------------------------------- -- UI操作相关的函数区域标记
-- UI主入口函数,用于创建和初始化UI窗口
-- objcfg: UI配置对象,包含NPCID和UI_PATH等信息
function NiuMaZanZhuOBJ:main(objcfg)
-- 创建一个UI窗口
-- 参数依次为:窗口名称, x, y, 宽度, 高度, 是否模态, 是否可拖拽, 是否显示背景, 是否可关闭, 是否有标题栏, NPCID
local parent = GUI:Win_Create(self.__cname, 0, 0, 0, 0, false, false, true, true, true, objcfg.NPCID)
GUI:LoadExport(parent, objcfg.UI_PATH) -- 加载UI导出文件(布局和控件)到父窗口
self._parent = parent -- 存储父窗口对象
self.ui = GUI:ui_delegate(parent) -- 创建UI代理,方便通过self.ui访问UI控件
ssrSetWidgetPosition(parent, self.ui.ImageBG, 2,0) -- 设置背景图片的位置
-- 为背景图片添加点击事件,用于防止点击穿透到下层UI
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)
self:UpdateUI() -- 调用UpdateUI函数更新UI显示
-- 为Button_1添加点击事件,点击时发送网络消息 NiuMaZanZhu_Request,参数为1
GUI:addOnClickEvent(self.ui.Button_1,function()
ssrMessage:sendmsg(ssrNetMsgCfg.NiuMaZanZhu_Request, 1)
end)
-- 为Button_2添加点击事件,点击时发送网络消息 NiuMaZanZhu_Request,参数为2
GUI:addOnClickEvent(self.ui.Button_2,function()
ssrMessage:sendmsg(ssrNetMsgCfg.NiuMaZanZhu_Request, 2)
end)
-- 为Button_3添加点击事件,点击时发送网络消息 NiuMaZanZhu_Request,参数为3
GUI:addOnClickEvent(self.ui.Button_3,function()
ssrMessage:sendmsg(ssrNetMsgCfg.NiuMaZanZhu_Request, 3)
end)
end
-- 更新UI显示状态的函数
function NiuMaZanZhuOBJ:UpdateUI()
-- 默认隐藏所有按钮和图片
GUI:setVisible(self.ui.Button_1,false)
GUI:setVisible(self.ui.Button_2,false)
GUI:setVisible(self.ui.Button_3,false)
GUI:setVisible(self.ui.Image_1,false)
GUI:setVisible(self.ui.Image_2,false)
GUI:setVisible(self.ui.Image_3,false)
-- 根据self.data[1]的值来控制按钮和图片的显示
if self.data[1] == 0 then
-- 如果data[1]为0,显示所有按钮
GUI:setVisible(self.ui.Button_1,true)
GUI:setVisible(self.ui.Button_2,true)
GUI:setVisible(self.ui.Button_3,true)
elseif self.data[1] == 1 then
-- 如果data[1]为1,显示Image_1和Button_2, Button_3
GUI:setVisible(self.ui.Image_1,true)
GUI:setVisible(self.ui.Button_2,true)
GUI:setVisible(self.ui.Button_3,true)
elseif self.data[1] == 2 then
-- 如果data[1]为2,显示Image_1, Image_2和Button_3
GUI:setVisible(self.ui.Image_1,true)
GUI:setVisible(self.ui.Image_2,true)
GUI:setVisible(self.ui.Button_3,true)
elseif self.data[1] == 3 then
-- 如果data[1]为3,显示所有图片
GUI:setVisible(self.ui.Image_1,true)
GUI:setVisible(self.ui.Image_2,true)
GUI:setVisible(self.ui.Image_3,true)
end
end
-------------------------------↓↓↓ 网络消息 ↓↓↓--------------------------------------- -- 网络消息处理相关的函数区域标记
-- 处理服务器同步响应消息的函数
-- arg1, arg2, arg3: 消息参数,具体含义需要结合服务器端代码
-- data: 服务器发送的同步数据
function NiuMaZanZhuOBJ:SyncResponse(arg1, arg2, arg3, data)
SL:Print(data[1]) -- 打印data的第一个元素(调试用)
self.data = data -- 存储服务器同步的数据
-- 如果当前窗口存在,则更新UI显示
if GUI:GetWindow(nil, self.__cname) then
self:UpdateUI() -- 调用UpdateUI更新UI
end
end
-- 处理添加红点提示消息的函数
-- arg1, arg2, arg3: 消息参数
-- data: 消息数据
function NiuMaZanZhuOBJ:AddRedPoint(arg1, arg2, arg3, data)
-- 尝试获取顶层图标节点和特定的图标对象(名称为"111")
local TopIconNode_look = GUI:GetWindow(MainMiniMap._parent, "TopIconLayout")
local TopIconNode = GUI:GetWindow(TopIconNode_look, "TopIconNode_1")
local IconObj = GUI:GetWindow(TopIconNode, "111")
if IconObj then
delRedPoint(IconObj) -- 先移除可能存在的红点
if arg1 == 1 then
addRedPoint(IconObj, 20, 0) -- 如果arg1为1,则添加红点提示
end
end
end
return NiuMaZanZhuOBJ -- 返回NiuMaZanZhuOBJ对象
牛马赞助
local ui = {}
local _V = function(v) return SL:GetMetaValue(v) end
local FUNCQUEUE = {}
local TAGOBJ = {}
function ui.init(parent, __data__, __update__)
if __update__ then return ui.update(__data__) end
-- Create ImageBG
local ImageBG = GUI:Image_Create(parent, "ImageBG", 0.00, 0.00, "res/custom/niumatequan/jm.png")
GUI:setAnchorPoint(ImageBG, 0.00, 0.00)
GUI:setTouchEnabled(ImageBG, false)
GUI:setTag(ImageBG, -1)
-- Create CloseLayout
local CloseLayout = GUI:Layout_Create(ImageBG, "CloseLayout", 865.00, 451.00, 75, 75, false)
GUI:setAnchorPoint(CloseLayout, 0.00, 0.00)
GUI:setTouchEnabled(CloseLayout, false)
GUI:setTag(CloseLayout, -1)
-- Create CloseButton
local CloseButton = GUI:Button_Create(CloseLayout, "CloseButton", 18.00, 13.00, "res/public/1900000510.png")
GUI:Button_loadTexturePressed(CloseButton, "res/public/1900000511.png")
GUI:Button_loadTextureDisabled(CloseButton, "res/private/gui_edit/Button_Disable.png")
GUI:Button_setTitleText(CloseButton, [[]])
GUI:Button_setTitleColor(CloseButton, "#ffffff")
GUI:Button_setTitleFontSize(CloseButton, 14)
GUI:Button_titleEnableOutline(CloseButton, "#000000", 1)
GUI:setAnchorPoint(CloseButton, 0.00, 0.00)
GUI:setTouchEnabled(CloseButton, true)
GUI:setTag(CloseButton, -1)
-- Create Button_1
local Button_1 = GUI:Button_Create(ImageBG, "Button_1", 206.00, 138.00, "res/custom/niumatequan/an1.png")
GUI:Button_setTitleText(Button_1, [[]])
GUI:Button_setTitleColor(Button_1, "#ffffff")
GUI:Button_setTitleFontSize(Button_1, 16)
GUI:Button_titleEnableOutline(Button_1, "#000000", 1)
GUI:setAnchorPoint(Button_1, 0.00, 0.00)
GUI:setTouchEnabled(Button_1, true)
GUI:setTag(Button_1, 0)
-- Create Button_2
local Button_2 = GUI:Button_Create(ImageBG, "Button_2", 434.00, 138.00, "res/custom/niumatequan/an2.png")
GUI:Button_setTitleText(Button_2, [[]])
GUI:Button_setTitleColor(Button_2, "#ffffff")
GUI:Button_setTitleFontSize(Button_2, 16)
GUI:Button_titleEnableOutline(Button_2, "#000000", 1)
GUI:setAnchorPoint(Button_2, 0.00, 0.00)
GUI:setTouchEnabled(Button_2, true)
GUI:setTag(Button_2, 0)
-- Create Button_3
local Button_3 = GUI:Button_Create(ImageBG, "Button_3", 662.00, 138.00, "res/custom/niumatequan/an3.png")
GUI:Button_setTitleText(Button_3, [[]])
GUI:Button_setTitleColor(Button_3, "#ffffff")
GUI:Button_setTitleFontSize(Button_3, 16)
GUI:Button_titleEnableOutline(Button_3, "#000000", 1)
GUI:setAnchorPoint(Button_3, 0.00, 0.00)
GUI:setTouchEnabled(Button_3, true)
GUI:setTag(Button_3, 0)
-- Create Image_1
local Image_1 = GUI:Image_Create(ImageBG, "Image_1", 230.00, 141.00, "res/custom/JuQing/btn0.png")
GUI:setAnchorPoint(Image_1, 0.00, 0.00)
GUI:setScaleX(Image_1, 0.40)
GUI:setScaleY(Image_1, 0.40)
GUI:setTouchEnabled(Image_1, false)
GUI:setTag(Image_1, 0)
-- Create Image_2
local Image_2 = GUI:Image_Create(ImageBG, "Image_2", 457.00, 141.00, "res/custom/JuQing/btn0.png")
GUI:setAnchorPoint(Image_2, 0.00, 0.00)
GUI:setScaleX(Image_2, 0.40)
GUI:setScaleY(Image_2, 0.40)
GUI:setTouchEnabled(Image_2, false)
GUI:setTag(Image_2, 0)
-- Create Image_3
local Image_3 = GUI:Image_Create(ImageBG, "Image_3", 685.00, 141.00, "res/custom/JuQing/btn0.png")
GUI:setAnchorPoint(Image_3, 0.00, 0.00)
GUI:setScaleX(Image_3, 0.40)
GUI:setScaleY(Image_3, 0.40)
GUI:setTouchEnabled(Image_3, false)
GUI:setTag(Image_3, 0)
ui.update(__data__)
return ImageBG
end
function ui.update(data)
for _, func in pairs(FUNCQUEUE) do
if func then func(data) end
end
end
return ui
local NiuMaZanZhu = {} -- 定义一个本地表 NiuMaZanZhu,用于封装赞助相关功能
-- 定义赞助等级的数据,包含称号和所需的累计充值金额
local Title_Data = {{title = "白银赞助",num = 0},{title = "黄金赞助",num = 38},{title = "至尊赞助",num = 68},}
-- 处理玩家请求领取赞助的逻辑
-- actor: 玩家对象
-- var: 请求领取的赞助等级索引 (1:白银, 2:黄金, 3:至尊)
function NiuMaZanZhu.Request(actor, var)
local LeiChong = getplaydef(actor, VarCfg["U_真实充值"]) -- 获取玩家的真实累计充值金额
local cfg = Title_Data[var] -- 根据传入的var获取对应的赞助配置
if not cfg then
return -- 如果配置不存在,直接返回
end
-- 如果玩家已经是至尊赞助,则不能再领取其他赞助(至尊赞助是最高级)
if checktitle(actor, "至尊赞助") then return end
-- 检查玩家是否已经领取过当前请求的赞助称号
if checktitle(actor, cfg.title) then
Player.sendmsgEx(actor, "提示#251|:#255|你已领取过|" .. cfg.title .. "#249|请勿重复领取...") -- 提示重复领取
return
end
-- 检查玩家的累计充值是否满足领取条件
if LeiChong < cfg.num then
Player.sendmsgEx(actor, "提示#251|:#255|对不起,你的|累计充值#249|不足|" .. cfg.num .. "#249|领取失败...") -- 提示充值不足
return
end
-- 如果玩家已拥有白银赞助,则剥夺白银赞助称号(升级赞助时移除旧称号)
if checktitle(actor, "白银赞助") then deprivetitle(actor, "白银赞助") end
-- 如果玩家已拥有黄金赞助,则剥夺黄金赞助称号(升级赞助时移除旧称号)
if checktitle(actor, "黄金赞助") then deprivetitle(actor, "黄金赞助") end
confertitle(actor, cfg.title) -- 授予玩家新的赞助称号
Player.sendmsgEx(actor, "提示#251|:#255|恭喜你,领取|" .. cfg.title .. "#249|成功...") -- 提示领取成功
NiuMaZanZhu.SyncResponse(actor) -- 同步赞助状态到客户端
-- 处理红点提示逻辑
if getplaydef(actor, "N$牛马赞助红点") == 1 then -- 如果当前有红点提示
local flag = 0 -- 默认不显示红点
if var < 3 then -- 如果当前领取的不是最高级赞助(至尊赞助)
-- 检查是否满足下一个赞助等级的充值条件
if LeiChong >= Title_Data[var+1].num then
flag = 1 -- 如果满足,则下一个赞助有红点
else
flag = 0 -- 不满足,无红点
end
end
if flag == 0 then -- 如果最终判断没有红点
setplaydef(actor, "N$牛马赞助红点", flag) -- 清除红点变量
Message.sendmsg(actor, ssrNetMsgCfg.NiuMaZanZhu_AddRedPoint, flag, 0, 0, {}) -- 发送消息通知客户端清除红点
end
end
-- 如果领取的是至尊赞助(var > 2,即var=3)
if var > 2 then
local skill = getskillinfo(actor, 75, 3) -- 检查是否拥有特定技能
if not skill then
addskill(actor, 75, 3) -- 如果没有,则添加该技能
end
TopIcon.addico(actor) -- 添加顶部图标(可能与赞助特权相关)
end
end
-- 同步赞助状态到客户端
-- actor: 玩家对象
-- logindatas: 登录数据(可选,用于登录时批量发送消息)
function NiuMaZanZhu.SyncResponse(actor, logindatas)
local TitleNum = 0 -- 初始化赞助等级数字表示
-- 根据玩家当前拥有的赞助称号设置TitleNum
if checktitle(actor, "白银赞助") then
TitleNum = 1
elseif checktitle(actor, "黄金赞助") then
TitleNum = 2
elseif checktitle(actor, "至尊赞助") then
TitleNum = 3
end
local _login_data = { ssrNetMsgCfg.NiuMaZanZhu_SyncResponse, 0, 0, 0, {TitleNum}} -- 构造同步消息数据
if logindatas then
table.insert(logindatas, _login_data) -- 如果是登录时调用,则插入到登录数据列表中
else
Message.sendmsg(actor, ssrNetMsgCfg.NiuMaZanZhu_SyncResponse, 0, 0, 0, {TitleNum}) -- 否则直接发送消息
end
end
Message.RegisterNetMsg(ssrNetMsgCfg.NiuMaZanZhu, NiuMaZanZhu) -- 注册牛马赞助相关的网络消息处理
-- 充值结束事件处理函数
-- actor: 玩家对象
local function _onRechargeEnd(actor)
local reveive = getplaydef(actor, "N$牛马赞助红点") -- 获取当前红点状态
if reveive == 0 then -- 如果当前没有红点提示
local TitleNum = 0
-- 再次获取玩家当前赞助等级
if checktitle(actor, "白银赞助") then
TitleNum = 1
elseif checktitle(actor, "黄金赞助") then
TitleNum = 2
elseif checktitle(actor, "至尊赞助") then
TitleNum = 3
end
local money = getplaydef(actor, VarCfg["U_真实充值"]) -- 获取玩家的真实累计充值
local flag = 0 -- 默认不显示红点
-- 检查是否可以升级到下一个赞助等级,并且当前没有红点
if TitleNum < 3 and getplaydef(actor, "N$牛马赞助红点") == 0 then
if money >= Title_Data[TitleNum+1].num then -- 如果充值满足下一个等级条件
flag = 1 -- 设置红点标志
end
end
if flag > 0 then -- 如果需要显示红点
setplaydef(actor, "N$牛马赞助红点", 1) -- 设置红点变量
Message.sendmsg(actor, ssrNetMsgCfg.NiuMaZanZhu_AddRedPoint, 1, 0, 0, {}) -- 发送消息通知客户端显示红点
else
setplaydef(actor, "N$牛马赞助红点", 0) -- 清除红点变量
Message.sendmsg(actor, ssrNetMsgCfg.NiuMaZanZhu_AddRedPoint, 0, 0, 0, {}) -- 发送消息通知客户端清除红点
end
end
end
GameEvent.add(EventCfg.onRechargeEnd, _onRechargeEnd,NiuMaZanZhu) -- 注册充值结束事件监听
-- 登录触发事件处理函数
-- actor: 玩家对象
-- logindatas: 登录数据
local function _onLoginEnd(actor, logindatas)
NiuMaZanZhu.SyncResponse(actor, logindatas) -- 登录时同步赞助状态
-- 如果玩家拥有黄金赞助或至尊赞助,检查并添加特定技能
if checktitle(actor, "黄金赞助") or checktitle(actor, "至尊赞助") then
local skill = getskillinfo(actor, 75, 3)
if not skill then
addskill(actor, 75, 3)
end
end
delaygoto(actor,500,"niumazanzhu_init_redpoint") -- 延迟执行红点初始化函数
end
-- 红点初始化函数,在延迟后执行
function niumazanzhu_init_redpoint(actor)
_onRechargeEnd(actor) -- 调用充值结束事件处理函数来初始化红点状态
end
GameEvent.add(EventCfg.onLoginEnd, _onLoginEnd, NiuMaZanZhu) -- 注册登录结束事件监听
return NiuMaZanZhu -- 返回NiuMaZanZhu对象