我是lua后端老师!
修仙者你好!看了你的代码,我来帮你分析一下这个逻辑问题。
在你的代码中,`SBK_CAN_FLY` 这个变量是通过 `OnSbkSchedule` 函数来控制的。当 `AddScheduled` 在 `20:00:00` 触发时,参数为 `"open"`,这时会设置 `SBK_CAN_FLY = true`;在 `21:00:00` 触发时,参数为 `"close"`,这时会设置 `SBK_CAN_FLY = false`。
问题在于,`AddScheduled` 是全局定时器,而你的 `FlyMap` 函数是在玩家点击NPC时触发的。如果玩家在 `20:00:00` 之前就已经在游戏里,那么 `SBK_CAN_FLY` 的值可能还是 `false`,因为 `OnSbkSchedule` 函数还没有被触发过。
要解决这个问题,你需要在 `FlyMap` 函数中增加对当前时间的判断,而不仅仅依赖 `SBK_CAN_FLY` 变量。可以这样修改:
```lua
function XueZhanShaCheng:FlyMap(actor,data)
-- 获取当前小时和分钟
local currentHour = tonumber(getconst(actor, "<$Hour>"))
local currentMinute = tonumber(getconst(actor, "<$MINUTE>"))
-- 判断是否在20:00-21:00之间
if currentHour < 20 or (currentHour == 21 and currentMinute > 0) or currentHour > 21 then
Msg.richMsg(actor, "非攻城时间段(20:00-21:00),无法传送!")
return
end
-- 这里可以保留原来的SBK_CAN_FLY检查作为双重保险
if not SBK_CAN_FLY then
-- 如果变量没更新,可以尝试重新判断
local inWar = castleinfo(5)
if not inWar then
Msg.richMsg(actor, "攻城战未开启,无法传送!")
return
end
end
-- 判断条件是否满足
local level = getbaseinfo(actor, 6) -- 获取玩家等级
local zsLevel = GetStr(0,actor, ZhuanSheng) -- 获取玩家转生等级
local t = string.split(zsLevel,",")
local zs = tonumber(string.match(t[2],"%d+"))
local kuangbao = GetStr(0,actor, KuangBao) -- 获取玩家狂暴开启
local y = string.split(kuangbao,",")
local kb = tonumber(string.match(y[1],"%d+"))
local wangzhezanzu = GetStr(0,actor, WangZheZanZu) -- 获取玩家王者等级
local cfg = self._cfg
local lev = cfg[2].condition
local zhuans = cfg[3].condition
local kuangb = cfg[4].condition
local d = cfg[data].map
local nx, ny = string.match(d, "(%d+),(%d+)")
GMLib:checkItems(actor, cfg[data].cost, 0, 1)
if kb ~= 1 then
Msg.richMsg(actor, "狂暴未开启,无法传送!")
elseif level < lev then
Msg.richMsg(actor, "等级不足" .. lev .. "级,无法传送!")
elseif zs < 3 then
Msg.richMsg(actor, "转生等级不足10转,无法传送!")
else
mapmove(actor, "0150", nx, ny,0)
end
end
```
这样修改后,即使 `SBK_CAN_FLY` 变量没有及时更新,也能通过当前时间来判断是否在攻城时间段内。同时,你还可以通过 `castleinfo(5)` 来检查当前是否在攻沙状态,作为额外的判断条件。
不懂的可以再问我,或者去请教浮生梦尊师!