[2026/7/14 13:46:46] Print:===== 收到前端消息 =====
[2026/7/14 13:46:46] Print:消息ID: 2027
[2026/7/14 13:46:46] Print:参数1: 27
[2026/7/14 13:46:46] Print:参数2: 2
[2026/7/14 13:46:46] Print:参数3: 0
[2026/7/14 13:46:46] Print:字符串: 跨服使者
[2026/7/14 13:46:46] Print
🤖 回答引擎: 后端Lua |
🕒 时间: 2026-07-14 13:47:51 |
👁️ 阅读: 8
我是lua后端老师!
小仙,看到你的代码了,这个问题很典型,是定时器触发逻辑没对上号。
首先,你的代码里用 `p()` 函数打印,这在996引擎里是不对的,应该用 `release_print()`。不过,这还不是导致定时器没触发的根本原因。
核心问题在于:**你的定时器触发函数写错了地方**。
在996引擎的Lua脚本里,像 `ontimer5` 这类由QF事件触发的函数,必须**直接写在脚本的全局作用域**,而不是封装在 `npc:main` 这个表里面。
引擎在触发 `ontimer(5)` 时,会在全局寻找名为 `ontimer5` 的函数,如果找不到,就不会执行。你的 `ontimer5` 函数写在 `npc` 表后面,并且是全局函数,这部分逻辑是对的,但问题可能出在另一个细节。
让我们根据你的日志和代码逻辑来梳理一下:
1. 你点击了某个按钮,传入了 `p2=2`,于是执行了 `setontimer(actor, 5, 1)`。这行代码的意思是:为玩家 `actor` 设置一个ID为 `5` 的定时器,`1`秒后触发。
2. 1秒后,引擎应该会去调用全局函数 `ontimer5(actor)`。
3. 你的 `ontimer5` 函数里用了 `p(“qqqqqqqqq”)` 和 `checkmoney`、`takemoney` 等函数。`p()` 不是标准函数,所以没有输出。`checkmoney` 和 `takemoney` 也不是996引擎的标准函数,标准函数是 `querymoney` 和 `changemoney`。
所以,你的定时器很可能因为函数名错误(`p` 而非 `release_print`)以及使用了不存在的函数(`checkmoney`, `takemoney`, `addLv`, `seteffect`, `send`)而导致脚本报错中断,使得你既看不到打印,也看不到效果。
**修改建议如下:**
```lua
local npc = {}
function npc:main(actor, p2, p3)
release_print(“进入NPC主函数,参数p2=“, p2) -- 使用正确的打印函数
if p2 == 1 then
mapmove(actor, “zzz163”, 112, 108, 1)
end
if p2 == 2 then
setontimer(actor, 5, 1) -- 设置1秒后触发ontimer5
release_print(“已设置定时器5”)
end
if p2 == 3 then
release_print(“点击了按钮3”)
if hastimer(actor, 5) then
setofftimer(actor, 5)
deleffects(actor, 1, 0)
release_print(“定时器5存在,已关闭并删除特效”)
else
release_print(“定时器5不存在”)
end
end
end
-- **重要:定时器触发函数必须写在全局**
function ontimer5(actor)
release_print(“定时器5被触发!qqqqqqqqq”) -- 使用正确的打印函数
local currentMoney = querymoney(actor, 1) -- 使用正确的函数查询金币
release_print(“玩家当前金币:”, currentMoney)
if currentMoney >= 10 then -- 判断是否有10金币
changemoney(actor, 1, -10) -- 使用正确的函数扣除金币
release_print(“扣除了10金币”)
-- addLv 和 seteffect 不是标准函数,你需要替换成正确的引擎函数
-- 例如,增加等级可能是 changelevel(actor, 1)
-- 增加特效可能是 playeffect(actor, 435, 0)
changelevel(actor, 1) -- 示例:增加1级
playeffect(actor, 435, 0) -- 示例:播放435号特效
else
sendmsg(actor, “兜里没钱了”, 1) -- 使用正确的发送消息函数
end
end
return npc
```
**修改点总结:**
1. 将所有 `p()` 替换为 `release_print()`。
2. 将 `checkmoney` 替换为 `querymoney`。
3. 将 `takemoney` 替换为 `changemoney(actor, 币种, -数量)`。
4. 将 `send` 替换为 `sendmsg`。
5. `addLv` 和 `seteffect` 不是标准函数,我替换为了功能相近的 `changelevel` 和 `playeffect`,你需要根据你的实际需求查找正确的函数。
6. 确保 `ontimer5` 函数是全局的。
按照这样修改后,再测试一下。如果还有问题,记得查看 `M2Server` 的控制台或者 `Log` 文件夹下的脚本错误日志,那里会有更详细的错误信息。不懂的可以随时再来问我,或者请教浮生梦尊师!
← 返回问答库