DengjiChaotuo = class("DengjiChaotuo", BaseSystemLogic)
function DengjiChaotuo:init()
self._cfg = Util:requireCfg(self.mCfg.severPath)
self.varName = VarCfg.player.nDengjiChaotuo -- 存储超脱次数的变量名
self.dayVar = VarCfg.player.nDengJi --天变量
🤖 回答引擎: 后端Lua |
🕒 时间: 2026-05-09 14:58:23 |
👁️ 阅读: 3
道友你好!我是Lua后端老师!
看了你的代码,小仙,我发现问题出在你的`syncData`函数里。你检查天变量`dayAddNum == 0`的逻辑,是在玩家**点击NPC打开界面**(或者`showUI`为true时)才触发的。
这就解释了为什么会出现“零点时要么关掉NPC再点开才生效,要么点按钮才变”的情况。因为你的等级恢复逻辑**只在玩家主动与系统交互时才会执行**,而不是在零点那一刻自动触发。
要解决这个问题,你需要利用引擎的**跨天触发**功能。在`QF`脚本(通常是`QFunction-0.txt`)里,有一个叫`resetday`的触发,它会在每天零点时自动执行。
你需要做的是:
1. 在`QF`脚本中,为`resetday`触发关联一个处理函数。
2. 在这个处理函数里,调用你的`DengjiChaotuo`系统,为**所有在线玩家**执行清理逻辑。
这里是一个修改思路和示例:
首先,在你的系统类里,增加一个专门处理跨天重置的静态方法(或者通过单例调用):
```lua
-- 在你的 DengjiChaotuo 类中添加这个函数
function DengjiChaotuo:resetAtMidnight(actor)
-- 这个函数专为QF的resetday触发调用
local count = GetInt(0, actor, self.varName) or 0
if count > 0 then
local curLv = getbaseinfo(actor, 6)
local resetLv = curLv - count -- 等级减去所有超脱次数
if resetLv < 1 then resetLv = 1 end
setbaseinfo(actor, 6, resetLv) -- 恢复等级
SetInt(0, actor, self.varName, 0) -- 清空今天次数
-- 注意:这里通常不需要再操作天变量,因为引擎会在跨天后自动清零或更新天变量
-- GMLib:setDayTLInt(actor, self.dayVar, 0) -- 如果需要,也可以在这里清零
Msg.richMsg(actor, "新的一天已到来,等级已恢复原始值")
-- 如果需要,可以在这里更新UI
-- self:updateUI(actor, 0)
end
end
```
然后,在你的`QF`脚本中(例如`QFunction-0.txt`),添加以下内容:
```lua
[@resetday]
#IF
#ACT
-- 获取所有在线玩家列表,并遍历他们
local playerList = getplayerlst()
for _, playerObj in ipairs(playerList or {}) do
-- 调用你的超脱系统的跨天重置方法
-- 假设你已经通过某种方式获取到了系统的实例,例如 System.DengjiChaotuo
if System and System.DengjiChaotuo then
System.DengjiChaotuo:resetAtMidnight(playerObj)
end
end
```
这样修改后,每天零点引擎会自动触发`resetday`,然后执行你写的重置逻辑,为**所有在线玩家**立即恢复等级并清零超脱次数,而不是等到他们下次点击NPC或按钮的时候。
记得检查你的`GMLib:getObjTLInt`和`GMLib:setDayTLInt`函数,确保它们操作的天变量在跨天后能被引擎正确重置为0,这样你`syncData`函数里的判断`dayAddNum == 0`才会在第二天玩家打开界面时生效。
如果还有不明白的地方,随时问我,或者请教我师傅浮生梦尊者!
← 返回问答库