--[[
活动大厅UI模块
功能:
1. 管理和显示所有游戏活动
2. 处理活动状态和提醒
3. 提供活动入口和跳转
]]
HuoDongDaTingOBJ = {}
HuoDongDaTingOBJ.__cname = "HuoDongDaTingOBJ"
-- 加载活动配置表
HuoDongDaTingOBJ.config = ssrRequireCsvCfg("cfg_HuoDongDaTing")
-- 活动资源路径
HuoDongDaTingOBJ.imgPath = "res/custom/HuoDongDaTing/"
--[[
活动提醒配置表
键:服务器变量G1的值
值:活动提醒配置
imgPath: 提醒图片路径
name: 提醒按钮名称
actIndex: 活动类型(1:天选之人 2:福星棋盘 3:全民花树 4:激情跑点 5:魔域之王)
]]
HuoDongDaTingOBJ.emunHuoDongTiXing = {
[1] = {imgPath = "tixing/txzrtx.png",name = "txzrtx", actIndex = 1},
[15] = {imgPath = "tixing/fxqptx.png",name = "fxqptx", actIndex = 2},
[25] = {imgPath = "tixing/txzrtx.png",name = "txzrtx", actIndex = 1},
[45] = {imgPath = "tixing/qmhstx.png",name = "qmhstx", actIndex = 3},
[55] = {imgPath = "tixing/txzrtx.png",name = "txzrtx", actIndex = 1},
[75] = {imgPath = "tixing/jqpdtx.png",name = "jqpdtx", actIndex = 4},
[85] = {imgPath = "tixing/txzrtx.png",name = "txzrtx", actIndex = 1},
[105] = {imgPath = "tixing/myzwtx.png",name = "myzwtx", actIndex = 5},
[115] = {imgPath = "tixing/txzrtx.png",name = "txzrtx", actIndex = 1},
[135] = {imgPath = "tixing/fxqptx.png",name = "fxqptx", actIndex = 2},
}
-------------------------------↓↓↓ UI操作 ↓↓↓---------------------------------------
--[[
初始化活动大厅界面
@param objcfg - UI配置对象
]]
function HuoDongDaTingOBJ:main(objcfg)
-- 创建主窗口
-- 参数说明:
-- self.__cname: 窗口名称
-- 0, 0, 0, 0: 窗口位置和大小(x, y, width, height)
-- false, false: 是否可见、是否模态
-- true, true, true: 是否可拖动、是否显示关闭按钮、是否显示标题栏
-- objcfg.NPCID: NPC ID(用于关联对话NPC)
local parent = GUI:Win_Create(self.__cname, 0, 0, 0, 0, false, false, true, true, true, objcfg.NPCID)
-- 加载UI布局文件
-- objcfg.UI_PATH: UI布局文件路径(通常是CocoStudio导出的布局)
GUI:LoadExport(parent, objcfg.UI_PATH)
-- 保存窗口引用
self._parent = parent
-- 获取UI控件代理对象,用于访问布局中的所有UI控件
self.ui = GUI:ui_delegate(parent)
-- 设置背景图片位置
-- 参数2表示居中对齐
ssrSetWidgetPosition(parent, self.ui.ImageBG, 2,0)
-- 为背景添加点击事件(防止点击穿透到下层窗口)
GUI:addOnClickEvent(self.ui.ImageBG, function()
--ssrPrint("我是防点击穿透")
end)
--关闭按钮
GUI:addOnClickEvent(self.ui.CloseButton, function()
GUI:Win_Close(self._parent)
end)
-- 打开窗口缩放动画
GUI:Timeline_Window1(self._parent)
self.lastBtn = nil
self:UpdateUI()
end
--[[
更新活动列表UI
功能:
1. 处理活动显示条件
2. 排序活动列表
3. 更新活动状态显示
]]
function HuoDongDaTingOBJ:UpdateUI()
local newTbl = {}
-- 遍历所有活动配置
for i, v in ipairs(self.config) do
-- 处理活动显示条件
-- evaluate_condition: 检查条件是否满足(如等级、VIP等)
-- hideCondition: 活动隐藏条件(配置在cfg_HuoDongDaTing表中)
if not evaluate_condition(v.hideCondition) then
v.sort = i * 100 -- 未隐藏的活动排后(乘100是为了保证排序空间)
else
v.sort = i -- 隐藏的活动保持原序(可能是未开启或已结束的活动)
end
-- 检查活动开启状态
-- varCondition: 活动开启条件(配置在cfg_HuoDongDaTing表中)
-- 可能包含时间、等级、任务等条件
if evaluate_condition(v.varCondition) then
v.isOpen = true -- 活动已开启
else
v.isOpen = false -- 活动未开启
end
-- 将处理后的活动配置添加到新表中
table.insert(newTbl,v)
end
--排序
table.sort(newTbl, function(a, b)
return a.sort < b.sort
end)
GUI:ListView_removeAllItems(self.ui.ListView_1)
self.btnList = {}
-- 遍历排序后的活动列表
for i, v in ipairs(newTbl) do
-- 再次检查活动是否需要隐藏
if not evaluate_condition(v.hideCondition) then
-- 创建活动按钮
-- ListView_1: 活动列表容器
-- "Button_"..i: 按钮唯一标识
-- 0.00, 0.00: 按钮在列表项中的相对位置
-- v.listImg: 按钮背景图片
local btn = GUI:Button_Create(self.ui.ListView_1, "Button_"..i, 0.00, 0.00, self.imgPath .. v.listImg)
-- 将按钮添加到按钮列表中,用于后续管理
table.insert(self.btnList, btn)
-- 根据活动状态显示不同的状态图标
-- 501.00, 6.00: 状态图标在按钮中的位置
if v.isOpen then
-- 显示"进行中"状态图标
GUI:Image_Create(btn, "image"..i, 501.00, 6.00, self.imgPath.."jinxingzhong.png")
else
-- 显示"未开启"状态图标
GUI:Image_Create(btn, "image"..i, 501.00, 6.00, self.imgPath.."weikaiqi.png")
end
-- 为按钮添加点击事件
-- 点击时调用selected函数处理选中逻辑
GUI:addOnClickEvent(btn,function ()
self:selected(v,btn)
end)
end
end
-- 默认选中第一个活动并显示其详情
local cfg = newTbl[1]
self:selected(cfg,self.btnList[1])
end
--[[
活动跳转处理
@param actIndex - 活动类型索引
]]
function HuoDongDaTingOBJ:act(actIndex)
-- 根据活动类型发送对应的网络消息
if actIndex == 1 then
ssrMessage:sendmsg(ssrNetMsgCfg.TianXuanZhiRen_RequestOpenUI)
elseif actIndex == 2 then
ssrMessage:sendmsg(ssrNetMsgCfg.FuXingQiPan_EnterMap)
elseif actIndex == 3 then
ssrMessage:sendmsg(ssrNetMsgCfg.QuanMinHuaShui_EnterMap)
elseif actIndex == 4 then
ssrMessage:sendmsg(ssrNetMsgCfg.JiQingPaoDian_EnterMap)
elseif actIndex == 5 then
ssrMessage:sendmsg(ssrNetMsgCfg.MoYuZhiWang_EnterMap)
end
-- 关闭活动大厅窗口
if GUI:GetWindow(nil, self.__cname) then
GUI:Win_Close(self._parent)
end
end
--[[
活动选中处理
@param cfg - 活动配置
@param btn - 活动按钮对象
]]
function HuoDongDaTingOBJ:selected(cfg,btn)
self.actIndex = cfg.actIndex
-- 清除上一个选中状态
if self.lastBtn then
local selectObj = GUI:getChildByName(self.lastBtn, "selected")
if GUI:Win_IsNotNull(selectObj) then
GUI:removeChildByName(self.lastBtn, "selected")
end
end
-- 更新活动详情显示
-- 加载活动详情介绍图片
-- Image_1: 详情界面的主图控件
-- cfg.jsImg: 活动介绍图片资源名
GUI:Image_loadTexture(self.ui.Image_1,self.imgPath..cfg.jsImg)
-- 在按钮上添加选中状态标记
-- 5.00, 5.00: 选中标记的偏移位置
-- selected.png: 选中状态的标记图片
GUI:Image_Create(btn, "selected", 5.00, 5.00, self.imgPath.."selected.png")
-- 显示活动奖励列表
-- Panel_1: 奖励列表的容器面板
-- cfg.reward: 活动奖励配置数据
-- "item_": 奖励项的名称前缀
-- itembg.png: 奖励项的背景图片
ssrAddItemListX(self.ui.Panel_1,cfg.reward,"item_",{imgRes = self.imgPath .. "itembg.png"})
-- 设置活动描述文本
-- Text_desc: 描述文本控件
-- cfg.desc: 活动描述内容
GUI:Text_setString(self.ui.Text_desc,cfg.desc)
-- 设置描述文本区域大小
-- 238, 78: 文本框的宽度和高度(像素)
GUI:setContentSize(self.ui.Text_desc, 238, 78)
self.lastBtn = btn
--网络消息示例
GUI:addOnClickEvent(self.ui.Button_1, function()
self:act(self.actIndex)
end)
end
--[[
活动提醒系统
条件:玩家等级小于300级
功能:监听服务器变量G1变化,显示活动提醒
]]
-- 检查玩家等级是否小于300级
-- Player:getServerVar("G1"): 获取服务器变量G1的值
-- tonumber(...) or 0: 确保返回数值,如果转换失败则返回0
if (tonumber(Player:getServerVar("G1")) or 0) < 300 then
-- 注册服务器变量变化事件监听器
-- LUA_EVENT_SERVER_VALUE_CHANGE: 服务器变量变化事件类型
-- "HuoDongDaTingOBJ": 监听器标识名
SL:RegisterLUAEvent(LUA_EVENT_SERVER_VALUE_CHANGE, "HuoDongDaTingOBJ", function(data)
-- 只处理G1变量的变化
if data.key == "G1" then
-- 获取新的G1值并查找对应的活动配置
local value = tonumber(data.value)
local cfg = HuoDongDaTingOBJ.emunHuoDongTiXing[value]
-- 如果找到对应的活动配置
if cfg then
-- 获取UI根节点(ID:102为主界面容器)
local parent = GUI:Win_FindParent(102)
-- 根据客户端类型创建不同位置的提醒按钮
-- client_type == 2: 可能是不同分辨率或设备类型
if ssrConstCfg.client_type == 2 then
-- 创建活动提醒按钮
-- -390, -440: 按钮位置坐标
local btn = GUI:Button_Create(parent, cfg.name , -390, -440, HuoDongDaTingOBJ.imgPath .. cfg.imgPath)
-- 创建关闭按钮
-- 138, 144: 关闭按钮相对于提醒按钮的位置
local close = GUI:Button_Create(btn, "hdClose", 138, 144, "res/public/1900000510.png")
-- 设置关闭按钮按下时的图片
GUI:Button_loadTexturePressed(close, "res/public/1900000511.png")
-- 点击提醒按钮时跳转到对应活动并移除提醒
GUI:addOnClickEvent(btn,function ()
HuoDongDaTingOBJ:act(cfg.actIndex)
GUI:removeChildByName(parent,cfg.name)
end)
-- 点击关闭按钮时移除提醒
GUI:addOnClickEvent(close,function ()
GUI:removeChildByName(parent,cfg.name)
end)
else
-- 创建另一个位置的提醒按钮(-330, -440)
-- 其他逻辑与上面相同
local btn = GUI:Button_Create(parent, cfg.name, -330, -440, HuoDongDaTingOBJ.imgPath .. cfg.imgPath)
local close = GUI:Button_Create(btn, "hdClose", 138, 144, "res/public/1900000510.png")
GUI:Button_loadTexturePressed(close, "res/public/1900000511.png")
GUI:addOnClickEvent(btn,function ()
HuoDongDaTingOBJ:act(cfg.actIndex)
GUI:removeChildByName(parent,cfg.name)
end)
GUI:addOnClickEvent(close,function ()
GUI:removeChildByName(parent,cfg.name)
end)
end
end
end
end)
end
-------------------------------↓↓↓ 网络消息 ↓↓↓---------------------------------------
--[[
网络消息响应
@param data - 服务器返回的数据
功能:收到服务器同步消息时更新UI
]]
function HuoDongDaTingOBJ:SyncResponse(arg1, arg2, arg3, data)
if GUI:GetWindow(nil, self.__cname) then
self:UpdateUI()
end
end
return HuoDongDaTingOBJ