function kf_hyd(actor)
local msg = ""
if not checkkuafu(actor) then
return false
end
local map_id = getbaseinfo(actor, 3)
local map_name = getmapname(map_id)
if string.find(map_name, "外") then
changemoney(acto
🤖 回答引擎: 后端Lua |
🕒 时间: 2026-03-14 16:27:22 |
👁️ 阅读: 18
我是lua后端老师!
小仙,你的代码要实现一个跨服活动中的传送门状态控制,我看到了你的需求。根据你的描述,需要判断当前时间是否在指定的几个时间段内,然后设置 `km_zt` 变量的状态。我们来一步步完善这个功能。
首先,我们需要获取当前的服务器时间。在996引擎中,可以使用 `getsys()` 函数来获取系统信息,其中就包含了当前时间。然后,我们将时间格式化为“HH:MM”的字符串,以便进行比较。
你的时间段规则是:
1. 20:31 开启,20:34 关闭
2. 20:36 开启,20:49 关闭
3. 20:40 开启,20:43 关闭
4. 20:44 开启,20:47 关闭
5. 20:49 开启,20:52 关闭
6. 20:54 开启,20:57 关闭
这里有一个细节需要注意:你的第二段(20:36-20:49)和第三段(20:40-20:43)有重叠,并且第五段(20:49-20:52)的开始时间正好是第二段的结束时间。在逻辑处理上我们需要考虑清楚。
我将为你编写一个辅助函数 `isDoorOpen` 来判断当前时间门是否开启。然后根据这个函数的返回值来设置 `km_zt` 变量。
下面是修改后的完整代码:
```lua
function kf_hyd(actor)
local msg = ""
if not checkkuafu(actor) then
return false
end
-- 定义一个函数,用于判断当前时间传送门是否开启
local function isDoorOpen()
-- 获取当前系统时间
local sysInfo = getsys()
-- sysInfo[1] 通常是年,sysInfo[2]是月,sysInfo[3]是日,sysInfo[4]是时,sysInfo[5]是分,sysInfo[6]是秒
local currentHour = sysInfo[4] or 0
local currentMinute = sysInfo[5] or 0
-- 将当前时间转换为分钟数,便于比较
local currentTotalMinutes = currentHour * 60 + currentMinute
-- 定义传送门开启和关闭的时间段(每个子表是 {开始分钟数, 结束分钟数})
local timePeriods = {
{20*60 + 31, 20*60 + 34}, -- 20:31 - 20:34
{20*60 + 36, 20*60 + 49}, -- 20:36 - 20:49
{20*60 + 40, 20*60 + 43}, -- 20:40 - 20:43
{20*60 + 44, 20*60 + 47}, -- 20:44 - 20:47
{20*60 + 49, 20*60 + 52}, -- 20:49 - 20:52
{20*60 + 54, 20*60 + 57} -- 20:54 - 20:57
}
-- 遍历所有时间段,检查当前时间是否在任何一个时间段内
for _, period in ipairs(timePeriods) do
local startMin = period[1]
local endMin = period[2]
-- 注意:这里使用 >= startMin 和 < endMin,表示包含开始时间,不包含结束时间
-- 如果你希望包含结束时间,可以改为 <= endMin
if currentTotalMinutes >= startMin and currentTotalMinutes < endMin then
return true
end
end
return false
end
local map_id = getbaseinfo(actor, 3)
local map_name = getmapname(map_id)
if string.find(map_name, "外") then
changemoney(actor, 25, '+', 10, '跨服积分', true)
end
if string.find(map_name, "内") then
changemoney(actor, 25, '+', 20, '跨服积分', true)
end
local money_jf = querymoney(actor, 25)
-- 根据当前时间判断传送门状态
local km_zt = "关闭"
if isDoorOpen() then
km_zt = "开启"
end
-- 注意:你原来的消息模板中有一处是固定的“<开启/FCOLOR=249>”,现在需要根据km_zt变量来动态显示
msg = [[<RText|x=10|y=25|color=255|size=18|text=<归属:/FCOLOR=255><暂无归属/FCOLOR=250>>
<RText|x=10|y=55.0|color=255|size=18|text=<当前积分:/FCOLOR=255><]] .. money_jf .. [[/FCOLOR=250>>
<RText|x=10|y=85.0|color=249|size=18|text=<结束时间:/FCOLOR=255><20:30/FCOLOR=249>>
<RText|x=10|y=115.0|color=255|size=18|text=<内门状态:/FCOLOR=255><]] .. km_zt .. [[/FCOLOR=249>>
<Button|x=58.0|y=145.0|color=255|size=18|nimg=public/1900000689.png|text=回城|link=@kf_huicheng>]]
addbutton(actor, 110, 0, msg)
end
```
**代码说明:**
1. `isDoorOpen` 函数:这个函数内部定义了你的6个时间段,然后获取当前时间,判断当前时间是否落在任何一个时间段内。如果是,返回 `true`(门开启),否则返回 `false`(门关闭)。
2. 时间处理:我们将时间统一转换为从0点开始的“总分钟数”进行比较,这样逻辑更清晰。
3. 状态变量 `km_zt`:根据 `isDoorOpen()` 的返回值,动态设置为“开启”或“关闭”。
4. 消息模板:注意我修改了消息模板中显示内门状态的那一行,原来是写死的“开启”,现在改为动态显示 `km_zt` 变量的值 `.. km_zt ..`。
**使用建议:**
这个函数可能会被频繁调用(比如玩家点击NPC时),每次都会获取系统时间并判断。如果你的活动时间固定只在晚上20点后,可以在函数开始加一个简单判断,如果当前小时小于20,直接返回“关闭”,避免不必要的计算。
另外,关于时间段重叠的问题,我的代码逻辑是:只要当前时间落在**任何一个**定义的时间段内,门就是开启状态。根据你给出的时间点,在20:40到20:43之间,门会是开启状态(同时满足第二段和第三段),这应该符合你的预期。
如果还有不明白的地方,随时问我,或者可以去请教我的师傅浮生梦尊者哦!
我是lua后端老师!
小仙,你的代码要实现一个跨服活动中的传送门状态控制,我看到了你的需求。根据你的描述,需要判断当前时间是否在指定的几个时间段内,然后设置 `km_zt` 变量的状态。我们来一步步完善这个功能。
首先,我们需要获取当前的服务器时间。在996引擎中,可以使用 `getsys()` 函数来获取系统信息,其中就包含了当前时间。然后,我们将时间格式化为“HH:MM”的字符串,以便进行比较。
你的时间段规则是:
1. 20:31 开启,20:34 关闭
2. 20:36 开启,20:49 关闭
3. 20:40 开启,20:43 关闭
4. 20:44 开启,20:47 关闭
5. 20:49 开启,20:52 关闭
6. 20:54 开启,20:57 关闭
这里有一个细节需要注意:你的第二段(20:36-20:49)和第三段(20:40-20:43)有重叠,并且第五段(20:49-20:52)的开始时间正好是第二段的结束时间。在逻辑处理上我们需要考虑清楚。
我将为你编写一个辅助函数 `isDoorOpen` 来判断当前时间门是否开启。然后根据这个函数的返回值来设置 `km_zt` 变量。
下面是修改后的完整代码:
```lua
function kf_hyd(actor)
local msg = ""
if not checkkuafu(actor) then
return false
end
-- 定义一个函数,用于判断当前时间传送门是否开启
local function isDoorOpen()
-- 获取当前系统时间
local sysInfo = getsys()
-- sysInfo[1] 通常是年,sysInfo[2]是月,sysInfo[3]是日,sysInfo[4]是时,sysInfo[5]是分,sysInfo[6]是秒
local currentHour = sysInfo[4] or 0
local currentMinute = sysInfo[5] or 0
-- 将当前时间转换为分钟数,便于比较
local currentTotalMinutes = currentHour * 60 + currentMinute
-- 定义传送门开启和关闭的时间段(每个子表是 {开始分钟数, 结束分钟数})
local timePeriods = {
{20*60 + 31, 20*60 + 34}, -- 20:31 - 20:34
{20*60 + 36, 20*60 + 49}, -- 20:36 - 20:49
{20*60 + 40, 20*60 + 43}, -- 20:40 - 20:43
{20*60 + 44, 20*60 + 47}, -- 20:44 - 20:47
{20*60 + 49, 20*60 + 52}, -- 20:49 - 20:52
{20*60 + 54, 20*60 + 57} -- 20:54 - 20:57
}
-- 遍历所有时间段,检查当前时间是否在任何一个时间段内
for _, period in ipairs(timePeriods) do
local startMin = period[1]
local endMin = period[2]
-- 注意:这里使用 >= startMin 和 < endMin,表示包含开始时间,不包含结束时间
-- 如果你希望包含结束时间,可以改为 <= endMin
if currentTotalMinutes >= startMin and currentTotalMinutes < endMin then
return true
end
end
return false
end
local map_id = getbaseinfo(actor, 3)
local map_name = getmapname(map_id)
if string.find(map_name, "外") then
changemoney(actor, 25, '+', 10, '跨服积分', true)
end
if string.find(map_name, "内") then
changemoney(actor, 25, '+', 20, '跨服积分', true)
end
local money_jf = querymoney(actor, 25)
-- 根据当前时间判断传送门状态
local km_zt = "关闭"
if isDoorOpen() then
km_zt = "开启"
end
-- 注意:你原来的消息模板中有一处是固定的“<开启/FCOLOR=249>”,现在需要根据km_zt变量来动态显示
msg = [[<RText|x=10|y=25|color=255|size=18|text=<归属:/FCOLOR=255><暂无归属/FCOLOR=250>>
<RText|x=10|y=55.0|color=255|size=18|text=<当前积分:/FCOLOR=255><]] .. money_jf .. [[/FCOLOR=250>>
<RText|x=10|y=85.0|color=249|size=18|text=<结束时间:/FCOLOR=255><20:30/FCOLOR=249>>
<RText|x=10|y=115.0|color=255|size=18|text=<内门状态:/FCOLOR=255><]] .. km_zt .. [[/FCOLOR=249>>
<Button|x=58.0|y=145.0|color=255|size=18|nimg=public/1900000689.png|text=回城|link=@kf_huicheng>]]
addbutton(actor, 110, 0, msg)
end
```
**代码说明:**
1. `isDoorOpen` 函数:这个函数内部定义了你的6个时间段,然后获取当前时间,判断当前时间是否落在任何一个时间段内。如果是,返回 `true`(门开启),否则返回 `false`(门关闭)。
2. 时间处理:我们将时间统一转换为从0点开始的“总分钟数”进行比较,这样逻辑更清晰。
3. 状态变量 `km_zt`:根据 `isDoorOpen()` 的返回值,动态设置为“开启”或“关闭”。
4. 消息模板:注意我修改了消息模板中显示内门状态的那一行,原来是写死的“开启”,现在改为动态显示 `km_zt` 变量的值 `.. km_zt ..`。
**使用建议:**
这个函数可能会被频繁调用(比如玩家点击NPC时),每次都会获取系统时间并判断。如果你的活动时间固定只在晚上20点后,可以在函数开始加一个简单判断,如果当前小时小于20,直接返回“关闭”,避免不必要的计算。
另外,关于时间段重叠的问题,我的代码逻辑是:只要当前时间落在**任何一个**定义的时间段内,门就是开启状态。根据你给出的时间点,在20:40到20:43之间,门会是开启状态(同时满足第二段和第三段),这应该符合你的预期。
如果还有不明白的地方,随时问我,或者可以去请教我的师傅浮生梦尊者哦!
← 返回问答库