我是Lua后端老师!小仙,我来帮你看看这个攻城脚本的问题。根据你的代码,晚上9点不飞回主城的问题主要出在`autoCloseAt21`函数的调用时机上。
你的代码中有一个每分钟检查的函数:
```lua
function XueZhanShaCheng:autoCloseAt21()
local hour = tonumber(getconst(0, "<$Hour>"))
local min = tonumber(getconst(0, "<$MINUTE>"))
local s = tonumber(getconst(0, "<$SECOND>"))
-- 21:00 准时关闭攻城
if hour == 21 and min == 0 then
release_print("21:00 自动关闭攻城")
if castleinfo(5) then
self:castleWarEnd(0) -- 调用你的结束函数
sendmsg("0", 2, "【系统】沙巴克攻城已 21:00 自动结束!")
end
end
end
```
但是问题在于:
1. 这个函数是通过`EventManager:add(EventCfg.everyMin, handler(self, self.autoCloseAt21), self)`每分钟触发一次
2. 当21:00触发时,它调用了`self:castleWarEnd(0)`来结束攻城
在`castleWarEnd`函数中,确实有将玩家传送回主城的逻辑:
```lua
function XueZhanShaCheng:castleWarEnd(actor)
if not castleinfo(5) then
return
end
gmexecute("0", "ForcedWallConQuestwar")
-- 移除所有玩家的皇宫定时器
local allPlayers = getplayerlst(0)
for _, player in pairs(allPlayers or {}) do
if hastimer(player, 7) then
setofftimer(player, 7)
end
if getbaseinfo(player, 3) ~= "dl01" then
mapmove(player, "dl01", 290, 392)
end
end
-- 设置首沙为老区
if checkNewZone(actor) then
SetSysInt("G500", 1)
end
end
```
这里有几个可能的问题:
1. `getplayerlst(0)`获取的是当前地图的玩家列表,如果玩家不在皇宫地图,可能不会被传回
2. `getbaseinfo(player, 3)`获取的是玩家当前地图名称,条件判断可能有问题
建议你检查一下:
1. 在21:00时,`autoCloseAt21`函数是否真的被触发了(可以加个更明显的打印)
2. 检查`castleinfo(5)`在21:00时是否返回true(表示正在攻城状态)
3. 检查`getplayerlst(0)`返回的玩家列表是否包含所有在线玩家
可以尝试在`autoCloseAt21`函数中增加调试信息:
```lua
function XueZhanShaCheng:autoCloseAt21()
local hour = tonumber(getconst(0, "<$Hour>"))
local min = tonumber(getconst(0, "<$MINUTE>"))
local s = tonumber(getconst(0, "<$SECOND>"))
release_print("每分钟检查:当前时间 " .. hour .. ":" .. min .. ":" .. s)
-- 21:00 准时关闭攻城
if hour == 21 and min == 0 then
release_print("21:00 触发自动关闭攻城")
local inWar = castleinfo(5)
release_print("当前攻城状态:" .. tostring(inWar))
if inWar then
self:castleWarEnd(0)
sendmsg("0", 2, "【系统】沙巴克攻城已 21:00 自动结束!")
else
release_print("21:00时攻城已结束,无需操作")
end
end
end
```
这样就能看到每分钟检查是否正常执行,以及21:00时是否触发了关闭逻辑。