传奇脚本死循环是最常见的问题——要么NPC对话卡死、要么进地图刷怪不停,甚至M2服务端卡崩溃。其实90%的死循环都是条件没闭合、变量没更新、事件互相勾连导致的。不用找高手,按下面步骤自己就能揪出问题:
第一步:先定位“死在哪”——找到触发循环的源头
死循环不是整个脚本崩,而是某个环节一直在重复执行。先搞清楚:“是进某个地图就卡?”“还是点某个NPC后没反应?”“或者刷怪任务停不下来?”
用M2引擎的脚本调试功能定位:
1. 打开M2控制台,输入@ScriptDebug开启调试模式;
2. 复现死循环场景(比如点那个卡住的NPC);
3. 看控制台输出的脚本执行栈——最后反复出现的脚本文件/函数,就是“罪魁祸首”(比如@ShopNPC或者Map001.txt里的某段代码)。
第二步:查“条件判断”——是不是漏了“终止开关”?
传奇脚本里,if...else、switch这类条件判断最容易漏“出口”。比如:
if 玩家等级 < 30 then
SendMsg("等级不够,无法进入!")
else
MoveToMap(3, 330, 320) -- 进入高级地图
end
这段看起来没问题,但如果进入地图后又触发某个事件,又回到这个判断(比如地图3的传送点又把你弹回NPC),就会形成循环。
解决办法:给循环加“状态锁”——比如进地图后设置一个标记变量@SetVar(玩家ID, "InMap3", 1),下次再触发时先查这个变量:
if @GetVar(玩家ID, "InMap3") == 1 then
SendMsg("你已经在地图里了!")
return -- 直接退出,不再执行后续代码
end
第三步:看“循环变量”——是不是没“往前走”?
while、for这类循环,最怕变量没更新。比如经典的“无限刷怪脚本”:
while true do
SpawnMonster(100, 3, 330, 320) -- 刷祖玛卫士
Wait(1000) -- 等1秒
end
这段代码的问题是:while true永远不会停,就算刷了怪也不会退出。正确的写法是加终止条件:
local 怪物数量 = 0
while 怪物数量 < 10 do -- 刷10只就停
SpawnMonster(100, 3, 330, 320)
怪物数量 = 怪物数量 + 1 -- 变量必须更新!
Wait(1000)
end
第四步:防“事件勾连”——是不是A触发B,B又触发A?
传奇里很多死循环是事件互相触发导致的。比如:
• NPC1的对话触发“传送至地图A”;
• 地图A的传送点又触发“回到NPC1”;
• 循环开始。
解决办法:给事件加“单向锁”——比如从NPC1传送到地图A后,禁用NPC1的触发:
-- NPC1的脚本
SendMsg("前往地图A...")
MoveToMap(3, 330, 320)
DisableNpc(1001) -- 1001是这个NPC的编号,禁用后再点也没用
最后:两个快速测试技巧
1. 注释法:把怀疑的脚本段用--注释掉,看循环还出不出现——比如注释掉NPC的传送代码,看是不是就不卡了;
2. 日志法:在脚本里加Trace("当前变量值:"..变量名),输出到M2日志(Log/Log.txt),看变量有没有变化——比如循环里的计数器一直是0,那就是没更新。
其实传奇脚本死循环的核心逻辑很简单:要么没“停”的条件,要么没“走”的步骤。按上面的方法一步步排查,99%的问题都能解决。实在搞不定,就把出问题的脚本段复制到论坛问,老玩家看一眼就知道哪里漏了。
(注:不同版本的传奇脚本语法略有差异,比如GEE引擎和Hero引擎的变量函数不一样,但排查逻辑通用。)

