local npc = {}
function npc:main(actor, p2, p3)
if p2 == 1 then
mapmove(actor, "zzz163", 112, 108, 1)
end
if p2 == 2 then
setontimer(actor, 5, 1)
p("aaaaaa")
end
if p2 == 3 then
p("cccc")
🤖 回答引擎: 后端Lua |
🕒 时间: 2026-07-14 13:58:01 |
👁️ 阅读: 8
我是lua后端老师!
小仙你好,看了你的代码,我来给你分析一下定时器的问题。
首先,你的定时器是**个人定时器**,不是全局定时器。你使用的是 `setontimer` 函数,这个函数是为单个玩家添加定时器的,所以它需要在 `QF` 脚本中注册对应的触发函数才能被引擎调用。
你的代码中,`ontimer5(actor)` 这个函数必须放在 `QF` 脚本里,引擎才会在定时器时间到了的时候,自动调用它。你把它和NPC脚本写在一起,引擎是找不到这个触发点的。
正确的做法是:
1. **NPC脚本** (`npc.lua`) 只负责**启动**和**停止**定时器。
2. **QF脚本** (`QF.lua`) 负责定义定时器触发时**要执行什么**。
我来帮你把代码拆分一下:
**NPC脚本 (npc.lua)**
```lua
local npc = {}
function npc:main(actor, p2, p3)
if p2 == 1 then
mapmove(actor, "zzz163", 112, 108, 1)
end
if p2 == 2 then
setontimer(actor, 5, 1) -- 启动ID为5的定时器,每秒执行一次
release_print("aaaaaa") -- 这里用 release_print
end
if p2 == 3 then
release_print("cccc") -- 这里用 release_print
if hastimer(actor, 5) then
setofftimer(actor, 5) -- 停止ID为5的定时器
deleffects(actor, 1, 0)
release_print("oooooo") -- 这里用 release_print
else
release_print("xxxxxx") -- 这里用 release_print
end
end
end
return npc
```
**QF脚本 (QF.lua)**
```lua
-- 定时器ID为5的触发函数
function ontimer5(actor)
release_print("qqqqqqqqq") -- 定时器被触发了
local a = querymoney(actor, 1) -- 检查金币,函数名是 querymoney
if a > 0 then
changemoney(actor, 1, -10) -- 扣除10金币,函数名是 changemoney
changelevel(actor, 1) -- 增加1级,函数名是 changelevel
playeffect(actor, 1, 435, 0) -- 播放特效,函数名是 playeffect
else
sendmsg(actor, "兜里没钱了") -- 发送消息,函数名是 sendmsg
end
end
```
**几点重要的修正和提醒:**
1. **打印函数**:你代码里的 `p` 函数,在996引擎里应该使用 `release_print()` 来在控制台输出信息。
2. **函数名更正**:
* `checkmoney` 应改为 `querymoney` -- 查询货币数量
* `takemoney` 应改为 `changemoney` -- 改变货币数量
* `addLv` 应改为 `changelevel` -- 改变等级
* `seteffect` 应改为 `playeffect` -- 播放特效
* `send` 应改为 `sendmsg` -- 发送消息给玩家
3. 你代码中的 `deleffects(actor, 1, 0)` 是正确的,用于清除特效。
总结一下,**个人定时器的回调函数必须放在QF脚本里**,这样引擎的事件系统才能正确触发它。而全局定时器(用 `setontimerex` 设置的)的回调函数 `ontimerex5()` 也同样需要放在QF里。
按照上面的方法修改,你的定时器就能正常工作了。哪里还不明白,随时问我,或者去请教我的师傅浮生梦尊者哦!
我是lua后端老师!
小仙你好,看了你的代码,我来给你分析一下定时器的问题。
首先,你的定时器是**个人定时器**,不是全局定时器。你使用的是 `setontimer` 函数,这个函数是为单个玩家添加定时器的,所以它需要在 `QF` 脚本中注册对应的触发函数才能被引擎调用。
你的代码中,`ontimer5(actor)` 这个函数必须放在 `QF` 脚本里,引擎才会在定时器时间到了的时候,自动调用它。你把它和NPC脚本写在一起,引擎是找不到这个触发点的。
正确的做法是:
1. **NPC脚本** (`npc.lua`) 只负责**启动**和**停止**定时器。
2. **QF脚本** (`QF.lua`) 负责定义定时器触发时**要执行什么**。
我来帮你把代码拆分一下:
**NPC脚本 (npc.lua)**
```lua
local npc = {}
function npc:main(actor, p2, p3)
if p2 == 1 then
mapmove(actor, "zzz163", 112, 108, 1)
end
if p2 == 2 then
setontimer(actor, 5, 1) -- 启动ID为5的定时器,每秒执行一次
release_print("aaaaaa") -- 这里用 release_print
end
if p2 == 3 then
release_print("cccc") -- 这里用 release_print
if hastimer(actor, 5) then
setofftimer(actor, 5) -- 停止ID为5的定时器
deleffects(actor, 1, 0)
release_print("oooooo") -- 这里用 release_print
else
release_print("xxxxxx") -- 这里用 release_print
end
end
end
return npc
```
**QF脚本 (QF.lua)**
```lua
-- 定时器ID为5的触发函数
function ontimer5(actor)
release_print("qqqqqqqqq") -- 定时器被触发了
local a = querymoney(actor, 1) -- 检查金币,函数名是 querymoney
if a > 0 then
changemoney(actor, 1, -10) -- 扣除10金币,函数名是 changemoney
changelevel(actor, 1) -- 增加1级,函数名是 changelevel
playeffect(actor, 1, 435, 0) -- 播放特效,函数名是 playeffect
else
sendmsg(actor, "兜里没钱了") -- 发送消息,函数名是 sendmsg
end
end
```
**几点重要的修正和提醒:**
1. **打印函数**:你代码里的 `p` 函数,在996引擎里应该使用 `release_print()` 来在控制台输出信息。
2. **函数名更正**:
* `checkmoney` 应改为 `querymoney` -- 查询货币数量
* `takemoney` 应改为 `changemoney` -- 改变货币数量
* `addLv` 应改为 `changelevel` -- 改变等级
* `seteffect` 应改为 `playeffect` -- 播放特效
* `send` 应改为 `sendmsg` -- 发送消息给玩家
3. 你代码中的 `deleffects(actor, 1, 0)` 是正确的,用于清除特效。
总结一下,**个人定时器的回调函数必须放在QF脚本里**,这样引擎的事件系统才能正确触发它。而全局定时器(用 `setontimerex` 设置的)的回调函数 `ontimerex5()` 也同样需要放在QF里。
按照上面的方法修改,你的定时器就能正常工作了。哪里还不明白,随时问我,或者去请教我的师傅浮生梦尊者哦!
← 返回问答库