我是lua后端老师!
小仙,我来帮你把这段攻城战时间检查功能改成使用全局定时器的方式。根据你提供的资料,我们可以用 `setontimerex` 来创建一个全局定时器,这样就不需要依赖其他触发机制来检查时间了。
```lua
-- 首先,在服务端启动时(比如startup触发)设置一个全局定时器
-- 这个定时器每秒检查一次时间
function startup()
-- 设置一个ID为100的全局定时器,每秒执行一次
setontimerex(100, 1)
release_print("攻城战时间检查定时器已启动")
end
-- 全局定时器触发函数
function ontimerex100()
local hour = tonumber(getconst(0, "<$Hour>"))
local min = tonumber(getconst(0, "<$Minute>"))
-- 每天 20:00 自动开启沙城攻城
if hour == 20 and min == 0 then
-- 如果还没开启攻城
if not castleinfo(5) then
-- 强制开启攻城
gmexecute("0", "ForcedWallConQuestwar")
addtocastlewarlistex("*")
release_print("【系统】沙巴克攻城战自动开启!")
end
end
-- 每天 21:00 自动结束攻城
if hour == 21 and min == 0 then
if castleinfo(5) then
gmexecute("0", "ForcedWallConQuestwar")
release_print("【系统】沙巴克攻城战自动结束!")
end
end
end
```
这样改的好处是:
1. **全局生效**:这个定时器对整个服务器有效,不需要每个玩家单独触发
2. **精确控制**:每秒检查一次,确保在20:00和21:00准时触发
3. **性能更好**:避免了不必要的函数调用
不过小仙,我注意到你原来的代码中,开启攻城时先调用了 `addtocastlewarlistex("*")` 再调用 `gmexecute`,这个顺序是正确的,因为开启攻城前需要把所有行会添加到攻城列表。
如果你想要更精确的控制,比如只在攻城战期间每秒检查,平时不检查,可以这样优化:
```lua
-- 优化版:只在攻城战期间频繁检查
function ontimerex100()
local hour = tonumber(getconst(0, "<$Hour>"))
local min = tonumber(getconst(0, "<$Minute>"))
-- 只在19:55到21:05这个时间段内每秒检查
if (hour == 19 and min >= 55) or (hour == 20) or (hour == 21 and min <= 5) then
-- 每天 20:00 自动开启沙城攻城
if hour == 20 and min == 0 then
if not castleinfo(5) then
gmexecute("0", "ForcedWallConQuestwar")
addtocastlewarlistex("*")
release_print("【系统】沙巴克攻城战自动开启!")
end
end
-- 每天 21:00 自动结束攻城
if hour == 21 and min == 0 then
if castleinfo(5) then
gmexecute("0", "ForcedWallConQuestwar")
release_print("【系统】沙巴克攻城战自动结束!")
end
end
end
end
```
这样优化后,服务器在非攻城时间段就不会每秒都执行检查,减少了服务器负担。小仙你觉得哪种方式更适合你的需求呢?