---@diagnostic disable: undefined-global
local M = {}
function M.main(actor, msgID, param1, param2, param3, str)
local BUFF_ID = 10001
local MAP_ID = 135
local X = 37
local Y = 39
if param2 == 1 then
local result = hasbuf
你好,修仙者!
我是Lua后端老师!看了你的代码,你遇到的问题是在点击传送地图后,虽然使用 `mapmove` 将玩家传送走了,但之前打开的NPC界面可能还停留在屏幕上,没有自动关闭。
这个问题在996引擎中很常见,通常的解决方案是在传送玩家之后,**主动关闭当前的NPC对话窗口**。
根据你的代码逻辑,当 `param2 == 2` 时执行传送。我们可以在传送后,调用一个关闭NPC界面的函数。引擎没有直接关闭NPC界面的函数,但我们可以通过**发送一个空的或特定的客户端消息**,或者**利用引擎的特性**来达到关闭效果。
一个常用且有效的方法是:在 `mapmove` 之后,立即调用 `opennpcshow` 函数,但传入一个不存在的或无效的NPC索引(比如0),这通常会导致客户端关闭当前的NPC界面。
让我们修改你的代码,在传送部分加入这个操作:
```lua
---@diagnostic disable: undefined-global
local M = {}
function M.main(actor, msgID, param1, param2, param3, str)
local BUFF_ID = 10001
local MAP_ID = 135
local X = 37
local Y = 39
if param2 == 1 then
local result = hasbuff(actor, BUFF_ID)
if result then
sendcentermsg(actor, 255, 180, "狂暴之力已开启", 0, 3)
else
sendcentermsg(actor, 255, 180, "狂暴之力未开启", 0, 3)
end
return
end
if param2 == 2 then
-- 先执行传送
mapmove(actor, MAP_ID, X, Y, 1, 0)
-- 传送后,强制关闭当前NPC界面
-- 方法:尝试打开一个不存在的NPC,通常会关闭当前窗口
opennpcshow(actor, 0, 0)
return
end
if param2 == 3 then
local result = hasbuff(actor, BUFF_ID)
if result then
sendcentermsg(actor, 255, 180, "狂暴之力已开启", 0, 3)
return
end
end
end
return M
```
**修改说明:**
1. 我们在 `mapmove` 之后立即添加了一行:`opennpcshow(actor, 0, 0)`。
2. 这里的 `NPCIndex` 参数传入 `0`(一个通常不存在的NPC ID),`nRange` 也传入 `0`。
3. 引擎在处理这个调用时,因为找不到对应的NPC,通常会执行一个“关闭当前对话”的操作,从而实现自动关闭界面的效果。
**注意:** 这种方法利用了引擎客户端的默认行为,在绝大多数情况下都是有效的。如果遇到特殊情况,可能需要配合其他客户端消息或使用 `sendactionofjson` 发送特定指令,但上述方法是最简洁通用的。
试试这个修改,应该就能解决传送后界面不关闭的问题了。如果还有其他疑问,随时可以问我,或者请教我的师傅浮生梦尊师!