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 16:31:53 |
👁️ 阅读: 6
我是lua后端老师!
小仙,你这个问题很典型啊!很多同学都会遇到这种定时触发的问题。从你的代码来看,你原本想通过全局定时器在零点自动处理,但是注释掉了。现在我来帮你改造成自动触发的版本。
首先,你需要取消注释全局定时器的注册,并确保在服务端启动时就注册这个定时器。然后修改`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 -- 最高超脱次数
-- 取消注释这行,注册全局定时器
GMLib:registerGlobalTimerHandler(ConstCfg.GlobalTimer.DengjiChaotuo, handler(self, self.onZeroTimer))
end
-- 新增:零点定时器触发函数
function DengjiChaotuo:onZeroTimer()
-- 获取所有在线玩家
local playerList = getplayerlst()
for _, actor in ipairs(playerList or {}) do
-- 对每个玩家执行清零和恢复等级操作
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) -- 清空今天次数
-- 发送消息给玩家
Msg.richMsg(actor, "已到达零点,等级已恢复原始值")
-- 更新UI(如果玩家在线)
self:updateUI(actor, 0)
end
end
end
function DengjiChaotuo:syncData(actor, showUI)
local count = GetInt(0, actor, self.varName) or 0
local dayAddNum = GMLib:getObjTLInt(actor, self.dayVar)
-- 这里可以保留原有的逻辑,作为备用检查
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
Msg.richMsg(actor, "已到达零点,等级已恢复原始值")
self:updateUI(actor, count)
end
if showUI then
self:initUI(actor, count)
end
end
function DengjiChaotuo:ChaoTuo(actor)
local cfg = self._cfg[1]
local cost = cfg.cost or {}
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. **取消注释定时器注册**:第10行的`GMLib:registerGlobalTimerHandler`要取消注释,这样服务端启动时就会注册零点定时器。
2. **新增`onZeroTimer`函数**:这个函数会在每天零点自动触发,遍历所有在线玩家,自动执行等级恢复和次数清零操作。
3. **保留原有逻辑**:`syncData`函数中的检查逻辑可以保留,作为双重保险。
4. **关键函数说明**:
- `getplayerlst()`:获取所有在线玩家列表
- `getbaseinfo(actor, 6)`:获取玩家当前等级
- `setbaseinfo(actor, 6, value)`:设置玩家等级
**还需要做的配置:**
你需要在全局定时器配置中设置`ConstCfg.GlobalTimer.DengjiChaotuo`对应的定时器,让它每天零点触发。通常配置格式类似:
```lua
GlobalTimer = {
DengjiChaotuo = "0 0 * * *", -- 每天零点触发
}
```
这样修改后,就算玩家不点击NPC或按钮,每天零点系统也会自动处理所有在线玩家的等级恢复和次数清零。如果有不懂的,可以随时问浮生梦尊师哦!
← 返回问答库