传奇版本里出现“脚本死循环”,通常不是游戏本身坏了,而是脚本跳转、机器人脚本、个人定时器、NPC触发或M2循环限制没有处理好。
常见表现有:
M2控制台提示:脚本死循环
提示类似:NPC:RobotManage、QManage、某个NPC名字
提示命令:GOTO @某个标签
游戏突然卡顿
玩家上线后卡死
某个NPC对话后卡住
机器人脚本一直执行不停
个人定时器频繁触发导致服务器压力变大
一、先判断死循环出现在哪个脚本
M2报错时一般会带出几个关键信息,例如:
[脚本死循环] NPC:RobotManage 位置:0(0:0) 命令:GOTO @判定人物是否在线
这里重点看三项:
NPC名称
看是 RobotManage、QManage、某个地图NPC,还是登录脚本。
命令类型
多数死循环和 GOTO、CALL、循环判断、定时器有关。
标签名称
例如 @判定人物是否在线、@main、@自动任务、@泡点、@检测 等,说明脚本卡在某个标签附近。
如果报错指向 RobotManage,重点查机器人脚本目录:
Mir200EnvirRobot_defAutoRunRobot.txt
Mir200EnvirRobot_defRobotManage.txt
如果报错指向 QManage,重点查:
Mir200EnvirMapQuest_defQManage.txt
如果报错指向某个NPC,就查对应NPC脚本文件。
二、最常见原因:GOTO循环次数不够
传奇脚本中 GOTO 跳转次数有上限。如果脚本短时间内连续 GOTO 很多次,就会触发引擎保护,报“脚本死循环”。
常见配置位置:
Mir200!Setup.txt
找到类似这一行:
ScriptGotoCountLimit=10
这个值表示脚本允许连续 GOTO 的次数。默认可能是 10,如果脚本逻辑复杂,10次很容易不够。
可以改成:
ScriptGotoCountLimit=50000
不同版本建议值不同,可以先改成 5000 或 10000 测试。如果版本脚本特别复杂,再适当加大。
注意:
不要改成 0 或负数
不要盲目改成极大值
修改后建议重启M2或重新加载脚本
如果改完仍然报错,说明不是单纯次数问题,而是脚本逻辑本身有问题
三、GOTO写得太密集导致循环
GOTO 是脚本跳转指令,如果一段脚本里大量使用 GOTO,很容易形成连续跳转。
错误写法示例:
[@main]
IF
checklevel > 10
ACT
GOTO @判断奖励
[@判断奖励]
IF
checklevel > 20
ACT
GOTO @高级奖励
[@高级奖励]
IF
checkitem 金币 1000
ACT
GOTO @发放奖励
如果后面还有多个 GOTO 互相跳转,就可能触发死循环。
优化思路:
能写在一个标签里的,不要拆成多个 GOTO
能用条件判断完成的,不要反复跳转
能用 DELAYGOTO 的,不要用普通 GOTO
能用 BREAK 结束的,不要让脚本继续往下跳
减少 CALL 和 GOTO 嵌套
推荐写法方向:
[@main]
IF
checklevel > 20
ACT
GOTO @高级奖励
IF
checklevel > 10
ACT
GOTO @普通奖励
IF
SAY
你的等级不足。
这样结构更清晰,不容易连续跳转。
四、DELAYGOTO使用不当也会卡
DELAYGOTO 是延迟跳转,比 GOTO 更适合做倒计时、等待、定时任务。
但如果 DELAYGOTO 时间太短,例如每秒跳一次,并且跳转后继续触发自己,也可能造成循环压力。
错误示例:
[@倒计时]
IF
ACT
DELAYGOTO 1 @倒计时
这种写法如果没有结束条件,就会一直循环。
正确思路是加变量或条件控制:
[@倒计时]
IF
CHECK [变量] > 0
ACT
MATH [变量] - 1
DELAYGOTO 1 @倒计时
IF
ACT
GOTO @倒计时结束
关键点:
必须有结束条件
不能无条件一直跳
时间间隔不要太短
玩家多时,避免大量玩家同时进入同一个高频循环
五、机器人脚本高频执行导致死循环
机器人脚本常见目录:
Mir200EnvirRobot_def\
主要文件:
AutoRunRobot.txt
RobotManage.txt
AutoRunRobot.txt 里常见写法:
AutoRun NPC SEC 1 @检测是否输A二级密码
AutoRun NPC SEC 1 @杀死
AutoRun NPC SEC 1 @清理隐身变量
SEC 1 表示每秒执行一次。
如果多个机器人脚本都是 1秒执行一次,玩家一多,M2压力会很大,容易触发脚本死循环或服务器卡顿。
建议修改方式:
AutoRun NPC SEC 5 @检测是否输A二级密码
AutoRun NPC SEC 10 @清理隐身变量
AutoRun NPC MIN 1 @每分钟任务
修改原则:
不需要每秒执行的,改成 5秒、10秒、30秒
泡点、检测、清理变量类脚本,尽量不要 SEC 1
能合并检测的,不要拆成多个高频脚本
不用的机器人脚本直接注释或删除
六、个人定时器循环太频繁
个人定时器也是常见死循环来源。
很多版本喜欢做:
安全区泡点
在线奖励
每秒检测经验
每秒检测金币
每秒检测装备
每秒检测任务进度
如果写成 1秒一循环,玩家数量一多,M2会不停处理数据,容易报错。
建议把:
1秒循环一次
改成:
5秒循环一次
或者:
10秒循环一次
例如原来:
1秒给10万经验
可以改成:
5秒给50万经验
效果一样,但循环次数减少,服务器压力小很多。
七、条件判断没有出口
有些脚本看起来没有 GOTO,但实际会一直执行。
例如:
[@任务检测]
IF
checkitem 任务卷轴 1
ACT
TAKE 任务卷轴 1
GOTO @任务检测
这里如果玩家背包里还有任务卷轴,就会一直 TAKE 并继续 GOTO。
如果数量很多,就可能触发循环限制。
正确写法:
[@任务检测]
IF
checkitem 任务卷轴 1
ACT
TAKE 任务卷轴 1
GOTO @任务检测继续
[@任务检测继续]
IF
checkitem 任务卷轴 1
ACT
GOTO @任务检测
IF
ACT
GOTO @任务完成
或者直接用变量控制次数,不要让它无限跳。
八、CALL和GOTO互相嵌套
有些版本为了整理脚本,会大量使用 CALL 调用其他文件。
例如:
CALL [任务日常任务.txt] @日常检测
如果 @日常检测 里面又 CALL 其他脚本,其他脚本又 GOTO 回来,就容易形成循环。
排查方法:
找到报错标签
看这个标签有没有 GOTO
看 GOTO 的目标标签有没有继续 GOTO
看有没有 CALL 回原文件
看有没有定时器重复触发
建议:
简单功能不要过度拆分
能在当前文件完成的,不要频繁 CALL
CALL 出去后要有明确返回或结束
不要 CALL 后再 GOTO 回原标签形成循环
九、NPC对话脚本触发异常
有些死循环发生在玩家和NPC对话后。
常见情况:
点击NPC后卡住
NPC对话一直刷新
选择选项后没有正确跳转
对话脚本里缺少 SAY 或 BREAK
条件不满足时没有出口
示例:
[@main]
IF
SAY
请选择功能。
<领取奖励/@领取奖励>
<关闭/@exit>
[@领取奖励]
IF
checklevel > 30
ACT
GIVE 金币 1000
GOTO @领取成功
IF
SAY
等级不足。
如果 @领取成功 里又写:
GOTO @main
玩家领取后马上回到主菜单,如果客户端重复触发,就可能形成频繁跳转。
建议改成:
[@领取成功]
IF
SAY
领取成功。
<返回主菜单/@main>
<关闭/@exit>
让玩家手动返回,而不是自动跳回。
十、登录脚本和上线触发脚本要重点查
玩家一上线就死循环,通常查这些位置:
QManage.txt
登录触发脚本
新人上线脚本
RobotManage.txt
个人定时器脚本
常见触发标签:
[@Login]
[@main]
[@上线]
[@玩家登录]
[@自动检测]
如果登录脚本里有:
IF
ACT
GOTO @检测任务
GOTO @检测泡点
GOTO @检测奖励
并且这些标签内部又互相跳转,就容易死循环。
建议登录脚本只做必要初始化:
给新人物品
设置初始变量
开启必要定时器
显示欢迎信息
调用一次任务检测
不要把大量循环检测全部放在登录瞬间执行。
十一、排查步骤
可以按这个顺序查:
看M2报错信息,找到NPC名称和标签名称
打开对应脚本文件,搜索报错标签
检查标签里是否有 GOTO
检查 GOTO 目标是否又跳回原标签
检查是否有 CALL 和 GOTO 互相调用
检查机器人脚本是否 SEC 1 太频繁
检查个人定时器是否 1秒一循环
检查登录脚本是否触发过多任务
修改 !Setup.txt 中的 ScriptGotoCountLimit
保存后重启M2或重新加载脚本测试
十二、修复后测试方法
修改完不要只看M2不报错,还要实际测试。
测试内容:
玩家上线是否卡
点击常用NPC是否正常
领取奖励是否正常
泡点是否正常
机器人任务是否正常
任务脚本是否能正常结束
连续点击NPC是否卡死
玩家多开测试是否卡顿
如果某个功能修改后不生效,优先检查:
标签名是否写错
变量名是否一致
BREAK 是否漏写
GOTO 目标是否存在
条件是否写反
文件是否保存成功
M2是否重新加载
十三、减少脚本死循环的长期习惯
少用连续 GOTO
多用 DELAYGOTO 做延迟任务
机器人脚本不要全部 SEC 1
个人定时器改成 5秒或10秒
登录脚本不要做太多循环检测
每个 GOTO 都要有明确出口
每个 CALL 都要有结束路径
不用的NPC和脚本及时删除
报错信息不要忽略,按NPC和标签定位
修改前备份原脚本文件
传奇版本脚本死循环多数不是引擎问题,而是脚本跳转太多、循环条件没出口、机器人脚本太频繁、个人定时器太密集。先把 M2 报错里的 NPC 和标签找出来,再针对性修改 GOTO、DELAYGOTO、CALL、机器人脚本和 !Setup.txt 中的循环限制,基本就能解决。

