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:10:16 |
👁️ 阅读: 4
我是lua后端老师!
小仙你好,从你的代码来看,你希望“零点自动清零”的功能只在当前文件中实现,不依赖QF的`resetday`触发。
不过,根据引擎的设计,“跨天自动触发”必须通过QF的`resetday`接口才能实现。你的代码中虽然判断了`dayAddNum == 0`来模拟跨天,但前提是需要有一个“跨天时自动重置”的机制,而这个机制本身是引擎在零点时自动触发的,你无法在单个Lua文件中“主动感知”到零点时刻。
所以,如果你坚持不写QF触发,那么唯一的办法是**在玩家每次登录或执行相关操作时,判断是否跨天**,然后进行清零。但这并不是真正的“零点自动清零”,而是“登录时检查并清零”。
以下是修改后的代码(在`syncData`函数中增加跨天判断和清零逻辑):
```lua
DengjiChaotuo = class("DengjiChaotuo", BaseSystemLogic)
function DengjiChaotuo:init()
self._cfg = Util:requireCfg(self.mCfg.severPath)
self.varName = VarCfg.player.nDengjiChaotuo -- 存储超脱次数的变量名
self.dayVar = VarCfg.player.nDengJi --天变量
self.maxChaotuo = 100 -- 最高超脱次数
end
function DengjiChaotuo:syncData(actor, showUI)
local count = GetInt(0, actor, self.varName) or 0
local dayAddNum = GMLib:getObjTLInt(actor, self.dayVar)
-- 【跨天检查】如果天变量为0(表示跨天),且今天有超脱次数,则恢复等级并清零
if dayAddNum == 0 and 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) -- 清空今天次数
count = 0
release_print("【跨天重置】玩家等级已恢复原始值")
Msg.richMsg(actor, "已到达零点,等级已恢复原始值")
end
if showUI then
self:initUI(actor, count)
end
end
function DengjiChaotuo:ChaoTuo(actor, data)
local cfg = self._cfg[1]
local cost = cfg.cost or {}
local level = data
local dayAddNum = GMLib:getObjTLInt(actor, self.dayVar)
release_print("当前等级超脱天变量值:", dayAddNum)
-- 检查消耗
if not GMLib:checkItems(actor, cost, 0, 1) then
return
end
-- 获取当前超脱次数
local count = GetInt(0, actor, self.varName) or 0
-- 检查是否达到上限
if count >= self.maxChaotuo then
Msg.richMsg(actor, "已达到最高超脱次数(" .. self.maxChaotuo .. "次),无法继续超脱!")
return
end
-- 扣除材料
if not GMLib:takes(actor, cost, "等级超脱") then
return
end
--人物等级+1
local curLevel = getbaseinfo(actor, 6)
setbaseinfo(actor, 6, curLevel + 1)
-- 更新超脱总次数
count = count + 1
SetInt(0, actor, self.varName, count)
-- 更新天变量(记录今天已超脱次数)
GMLib:setDayTLInt(actor, self.dayVar, GMLib:getObjTLInt(actor, self.dayVar) + 1)
self:updateUI(actor, count)
-- 提示成功
Msg.richMsg(actor, "等级超脱成功!当前已超脱 " .. count .. "/" .. self.maxChaotuo .. " 次")
end
return DengjiChaotuo
```
**说明**:
1. 我在`syncData`函数中增加了跨天判断逻辑。当玩家打开UI(或执行其他调用`syncData`的操作)时,会检查天变量是否为0,如果是,则自动恢复等级并清零超脱次数。
2. 这样做的缺点是:**如果玩家零点后不进行任何操作(比如不打开UI),那么清零不会自动触发**。
3. 真正的“零点自动清零”必须依赖QF的`resetday`触发,因为只有引擎才能在零点时刻主动调用你的代码。
如果你坚持不写QF触发,那么只能通过这种方式“被动检查”。但请注意,这并不能保证“零点准时清零”,而是“玩家下次操作时清零”。
← 返回问答库