local TianXuanZhiRen = {}
TianXuanZhiRen.ID = “天选之人”
local config = include(“QuestDiary/cfgcsv/cfg_TianXuanZhiRen.lua”)
local top1Reward = {
{ “金手指”, 1 },
{ “烈焰战车[时装]”, 1 },
{ “高级神器盲盒”, 1 },
{ “神秘专属盲盒”, 1 },
{ “自己摸的鱼”, 1 },
}
–获取下一轮的剩余时间
–[[
函数名: TianXuanZhiRen.nextRoundTime
功能: 计算天选之人活动下一轮的剩余时间(秒)
返回值:
- 正数: 下一轮开始前的剩余秒数
- -1: 活动已结束或未开始
流程:
1. 获取活动开始时间戳和开区时间
2. 判断活动是否在有效时间范围内
3. 根据当前轮数确定时间间隔
4. 计算并返回剩余时间
]]
function TianXuanZhiRen.nextRoundTime()
– 获取天选之人活动开始时间戳(由goTXTiming函数设置)
local startTime = getsysvar(VarCfg[“G天选之人开始时间戳”])
-- 获取开区分钟计时器,用于判断当前所处阶段
local min = getsysvar(VarCfg["G_开区分钟计时器"])
-- 判断活动是否在有效时间范围内(已开始且开区时间小于120分钟)
if startTime > 0 and min < 120 then
-- 获取当前轮数(1-4轮)
local round = TianXuanZhiRen.currentRound()
-- 获取当前时间戳
local currTime = os.time()
-- 根据当前轮数确定时间间隔
local interval
if round == 1 then
interval = 1740 -- 第一轮间隔为1740秒(29分钟)
else
interval = 1800 -- 其他轮次间隔为1800秒(30分钟)
end
-- 计算已经过去的时间(当前时间 - 开始时间)
local elapsed_time = currTime - startTime
-- 计算剩余时间(总间隔 - 已过时间)
local remaining_time = interval - elapsed_time
-- 返回剩余秒数
return remaining_time
else
-- 活动未开始或已结束,返回-1
return -1
end
end
–获取当前轮数
function TianXuanZhiRen.currentRound()
local min = getsysvar(VarCfg[“G_开区分钟计时器”])
local human_var
if min < 30 then
human_var = 1
elseif min >= 30 and min < 60 then
human_var = 2
elseif min >= 60 and min < 90 then
human_var = 3
elseif min >= 90 then
human_var = 4
end
return human_var
end
–请求打开界面
–[[
函数名: TianXuanZhiRen.RequestOpenUI
功能: 处理玩家请求打开天选之人活动界面的逻辑
参数:
actor - 玩家对象
流程:
1. 检查活动是否已结束
2. 获取当前轮数和玩家号码信息
3. 收集所有轮次的排行榜数据
4. 发送UI数据到客户端
]]
function TianXuanZhiRen.RequestOpenUI(actor)
– 获取开区时间(分钟)
local min = getsysvar(VarCfg[“G_开区分钟计时器”])
-- 检查活动是否已结束(超过150分钟)
if min > 150 then
Player.sendmsgEx(actor, "活动已结束!#249")
return
end
-- 获取当前轮数
local roundNumber = TianXuanZhiRen.currentRound()
-- 初始化数据容器
local data = {}
data["rankingArr"] = {} -- 排名数据数组
data["myNumberList"] = {} -- 玩家在各轮次的号码列表
-- 收集所有四轮的排行榜数据和玩家号码
for i = 1, 4 do
-- 获取第i轮的排行榜(降序,最多10名)
local ranking = sorthumvar("TianXuanZhiRen_" .. i, 0, 1, 10)
-- 添加到排行榜数组
table.insert(data["rankingArr"], ranking)
-- 获取并添加玩家在该轮的号码
table.insert(data["myNumberList"], getplayvar(actor, "HUMAN", "TianXuanZhiRen_" .. i))
end
-- 获取玩家在当前轮次的号码
local myNumber = getplayvar(actor, "HUMAN", "TianXuanZhiRen_" .. roundNumber)
-- 发送UI数据到客户端
-- 参数:玩家对象,消息类型,开区时间,当前号码,当前轮数,完整数据
Message.sendmsg(actor, ssrNetMsgCfg.TianXuanZhiRen_ResponseOpenUI, min, myNumber, roundNumber, data)
end
–声明个人变量
local function PlayerVar(actor)
for i = 1, 4 do
FIniPlayVar(actor, “TianXuanZhiRen” .. i, false)
end
end
GameEvent.add(EventCfg.goPlayerVar, _PlayerVar, TianXuanZhiRen)
–[[
函数名: _sendReward
功能: 天选之人活动奖励发放函数
参数:
round - 当前轮数(1-4)
流程:
1. 为所有首充玩家生成随机号码
2. 获取号码排行榜并按照规则分配奖励
3. 发送系统公告和邮件奖励
4. 触发下一轮计时器
]]
local function _sendReward(round)
– 参数有效性检查:轮数必须在1-4之间
if round > 4 or not round then
return
end
-- 获取所有在线玩家列表
local actor_list = getplayerlst(0)
for i, actor in ipairs(actor_list or {}) do
local roundNumber = round
local is_ShouChong = getflagstatus(actor, VarCfg["F_是否首充"]) -- 检查玩家是否首充
if is_ShouChong == 1 then
-- 为首充玩家生成9000-9999之间的随机号码
FSetPlayVar(actor, "TianXuanZhiRen_" .. roundNumber, math.random(9000, 9999))
end
end
-- 中文数字表,用于邮件和公告中显示轮数和名次
local chineseNumbers = { "一", "二", "三", "四", "五", "六", "七", "八", "九", "十" }
-- 获取当前轮次的玩家号码排行榜(降序,最多10名)
local ranking = sorthumvar("TianXuanZhiRen_" .. round, 0, 1, 10)
local rankingNew = {}
-- 人数检查:如果参与人数少于2人,则取消本轮奖励发放
if #ranking < 2 then
return
end
-- 将排行榜按照每2人一组进行分组
-- 例如:["玩家1", "号码1", "玩家2", "号码2", ...] 转换为 [{"玩家1", "号码1"}, {"玩家2", "号码2"}, ...]
for i = 1, #ranking, 2 do
local pair = { ranking[i], ranking[i + 1] }
table.insert(rankingNew, pair)
end
-- 公告Y轴起始位置,用于控制多条公告的显示位置
local gonggaoY = 100
-- 遍历排名组,为每组发放对应奖励
for index, value in ipairs(rankingNew) do
local cfg = config[index] -- 从配置表获取对应名次的奖励配置
if cfg then
-- 复制奖励表,避免修改原始配置
local Reward = clone(cfg.reward)
-- 第一名额外奖励:从top1Reward中随机选择一项添加
if index == 1 then
local random = math.random(#top1Reward)
table.insert(Reward, top1Reward[random])
end
-- 生成邮件标题:例如"天选之人第一轮第一名奖励"
local mailTitle = "天选之人第" .. chineseNumbers[round] .. "轮第" .. chineseNumbers[index] .. "名奖励"
-- 生成邮件内容:包含玩家名、轮数和名次信息
local mailContent = string.format("%s您好,恭喜您在天选之人第%s轮中获得第%s名,请领取您的奖励",
value[1], chineseNumbers[round], chineseNumbers[index])
-- 将奖励物品数组转换为字符串,用于公告显示
local rewardStr = getItemArrToStr(Reward)
-- release_print(rewardStr) -- 调试用,已注释
-- 生成系统公告内容
local gongGaostr = string.format("恭喜玩家[%s]在天选之人活动中获得第%s名,获得奖励[%s]",
value[1], chineseNumbers[index], rewardStr)
-- 移除公告中的"1元"字样
local modified_str = gongGaostr:gsub("1元", "")
-- 发送系统公告,Y坐标递增以避免重叠
FsendTianXuanZhiRen(modified_str, gonggaoY)
gonggaoY = gonggaoY + 40
-- 发送奖励邮件给玩家
-- 参数说明:玩家名前加#表示精确匹配,1表示邮件类型,标题,内容,奖励表,1表示有效期(天),true表示立即生效
Player.giveMailByTable("#" .. value[1], 1, mailTitle, mailContent, Reward, 1, true)
end
end
-- 触发天选之人计时事件,开始下一轮的倒计时
GameEvent.push(EventCfg.goTXTiming)
end
–发送奖励
GameEvent.add(EventCfg.goTXreward, _sendReward, TianXuanZhiRen)
–发送通知
local function _goTXSendTongZhi()
FsendHuoDongGongGao(“距离本轮天选之人开奖还剩余5分钟,请各位玩家抓紧机会!!!”)
end
GameEvent.add(EventCfg.goTXSendTongZhi, _goTXSendTongZhi, TianXuanZhiRen)
–计时,用来计算下一轮的时间
–[[
函数名: _goTXTiming
功能: 天选之人活动计时器函数,用于更新活动时间并通知所有玩家
触发: 通过EventCfg.goTXTiming事件触发,在奖励发放后启动下一轮计时
流程:
1. 记录当前时间戳作为活动开始时间
2. 计算下一轮活动的剩余时间
3. 向所有在线玩家发送时间更新消息
]]
local function goTXTiming()
– 设置系统变量,记录当前时间戳作为活动开始时间点
setsysvar(VarCfg[“G天选之人开始时间戳”], os.time())
-- 调用nextRoundTime函数计算下一轮活动的剩余时间(秒)
local nextTime = TianXuanZhiRen.nextRoundTime()
-- 获取所有在线玩家列表(参数1表示获取所有在线玩家)
local playerList = getplayerlst(1)
-- 遍历所有在线玩家,向每个玩家发送时间更新消息
for _, actor in ipairs(playerList) do
-- 发送网络消息更新客户端UI上的倒计时
-- 参数说明: 玩家对象, 消息类型, 剩余时间(秒), 0(未使用), 0(未使用), 空数据表
Message.sendmsg(actor, ssrNetMsgCfg.TianXuanZhiRen_UpdataTime, nextTime, 0, 0, {})
end
end
– 注册事件监听器,当EventCfg.goTXTiming事件触发时,调用_goTXTiming函数
– 第三个参数TianXuanZhiRen指定了函数所属的模块上下文
GameEvent.add(EventCfg.goTXTiming, _goTXTiming, TianXuanZhiRen)
–[[
函数名: _onLoginEnd
功能: 玩家登录完成时的处理函数,用于更新天选之人活动倒计时
参数:
actor - 玩家对象
logindatas - 登录数据(未使用)
触发: 通过EventCfg.onLoginEnd事件触发,在玩家登录完成时执行
]]
local function _onLoginEnd(actor, logindatas)
– 获取天选之人活动下一轮的剩余时间(秒)
local nextTime = TianXuanZhiRen.nextRoundTime()
-- 调试代码(已注释)
-- release_print(nextTime)
-- 向客户端发送时间更新消息,更新UI上的倒计时显示
-- 参数说明: 玩家对象, 消息类型, 剩余时间(秒), 0(未使用), 0(未使用), 空数据表
Message.sendmsg(actor, ssrNetMsgCfg.TianXuanZhiRen_UpdataTime, nextTime, 0, 0, {})
end
– 注册事件监听器,当玩家登录完成时触发_onLoginEnd函数
– 第三个参数TianXuanZhiRen指定了函数所属的模块上下文
GameEvent.add(EventCfg.onLoginEnd, _onLoginEnd, TianXuanZhiRen)
–注册网络消息
Message.RegisterNetMsg(ssrNetMsgCfg.TianXuanZhiRen, TianXuanZhiRen)
return TianXuanZhiRen