死循环典型表现
M2Server窗口持续弹"脚本死循环"或"GOTO超过上限",CPU占用飙升,玩家点NPC卡住或角色动不了,Log目录下的ScriptLog.txt不断追加相同脚本名和行号。
最常见三类错误写法
•无条件GOTO跳转回自身或互跳:[@Main]里写#ACTGOTO@Main,或[@A]跳[@B]、[@B]又跳回[@A],没有#IF判定阻断,引擎反复执行无法退出。
-循环回收/检测无退出条件:装备回收脚本用GOTO@Recycle不断检测并TAKE物品,但没先CHECKITEM判断背包是否还有,有就无限循环。
•QFunction-0.txt或QManage.txt触发段互调:在[@PlayLevelUp]或[@GetExp]等触发标签里CALL或GOTO其他标签,被调标签又触发原事件形成递归,尤其常见于经验加成、登录奖励脚本。
快速定位出问题的脚本文件
1.看M2Server报错提示——会写明NPC名称、脚本路径(如QuestDiary\活动系统\转盘.txt第xx行)或标记QFunction,这是最直接线索。
2.M2没标明细就进Mir200\Log看ScriptLog.txt或最新的错误日志,搜重复出现的.txt文件名。
3.回想你最近改过或新增的脚本(NPC功能、任务、Robot_def机器人脚本、QFunction-0.txt),死循环九成出在刚动过的文件。
重点排查目录:
•Envir\Market_Def\——NPC对话脚本(*.txt)
-Envir\QuestDiary\——任务/功能分支脚本
•Envir\MapQuest_def\——地图触发,尤其QManage.txt
•Envir\Market_Def\QFunction-0.txt——物品/触发类脚本
修复方法
•无条件GOTO:给GOTO加#IF前置判断(如检测变量值、道具数量),不符合条件就不跳转;或用DELAYGOTO设延迟并配计数器,到次数BREAK退出。
•循环无退出:在循环入口先CHECKITEM/CHECKVAR判断是否满足继续条件,不满足直接BREAK;加计数器INCD0,达到上限强制BREAK防溢出。
-QFunction递归:触发标签(@GetExp/@Login等)中不要直接GOTO另一个会再次触发同事件的标签,改为只做变量赋值再CALL独立处理段,且被CALL段末尾必须有BREAK。
-每个标签结尾加BREAK:Legend引擎和Hero/GOM部分版本要求每段逻辑结束显式BREAK,防止引擎沿标签继续往下跑引发意外跳转。
临时缓解与预防配置
若暂时找不到或版本自带老脚本有问题,可临时放宽限制争取时间:打开Mir200\!Setup.txt找到ScriptGotoCountLimit=10(或GotoLoop),改成1000~10000(视脚本复杂度,别太大),保存后重启M2——这只延缓崩溃不会根治,根上还得改脚本逻辑。
修改任何脚本前先备份原文件,用Notepad++打开查GOTO、CALL、循环段效率更高。改完保存,M2点"重新加载脚本"或重启生效。
M2Server窗口持续弹"脚本死循环"或"GOTO超过上限",CPU占用飙升,玩家点NPC卡住或角色动不了,Log目录下的ScriptLog.txt不断追加相同脚本名和行号。
最常见三类错误写法
•无条件GOTO跳转回自身或互跳:[@Main]里写#ACTGOTO@Main,或[@A]跳[@B]、[@B]又跳回[@A],没有#IF判定阻断,引擎反复执行无法退出。
-循环回收/检测无退出条件:装备回收脚本用GOTO@Recycle不断检测并TAKE物品,但没先CHECKITEM判断背包是否还有,有就无限循环。
•QFunction-0.txt或QManage.txt触发段互调:在[@PlayLevelUp]或[@GetExp]等触发标签里CALL或GOTO其他标签,被调标签又触发原事件形成递归,尤其常见于经验加成、登录奖励脚本。
快速定位出问题的脚本文件
1.看M2Server报错提示——会写明NPC名称、脚本路径(如QuestDiary\活动系统\转盘.txt第xx行)或标记QFunction,这是最直接线索。
2.M2没标明细就进Mir200\Log看ScriptLog.txt或最新的错误日志,搜重复出现的.txt文件名。
3.回想你最近改过或新增的脚本(NPC功能、任务、Robot_def机器人脚本、QFunction-0.txt),死循环九成出在刚动过的文件。
重点排查目录:
•Envir\Market_Def\——NPC对话脚本(*.txt)
-Envir\QuestDiary\——任务/功能分支脚本
•Envir\MapQuest_def\——地图触发,尤其QManage.txt
•Envir\Market_Def\QFunction-0.txt——物品/触发类脚本
修复方法
•无条件GOTO:给GOTO加#IF前置判断(如检测变量值、道具数量),不符合条件就不跳转;或用DELAYGOTO设延迟并配计数器,到次数BREAK退出。
•循环无退出:在循环入口先CHECKITEM/CHECKVAR判断是否满足继续条件,不满足直接BREAK;加计数器INCD0,达到上限强制BREAK防溢出。
-QFunction递归:触发标签(@GetExp/@Login等)中不要直接GOTO另一个会再次触发同事件的标签,改为只做变量赋值再CALL独立处理段,且被CALL段末尾必须有BREAK。
-每个标签结尾加BREAK:Legend引擎和Hero/GOM部分版本要求每段逻辑结束显式BREAK,防止引擎沿标签继续往下跑引发意外跳转。
临时缓解与预防配置
若暂时找不到或版本自带老脚本有问题,可临时放宽限制争取时间:打开Mir200\!Setup.txt找到ScriptGotoCountLimit=10(或GotoLoop),改成1000~10000(视脚本复杂度,别太大),保存后重启M2——这只延缓崩溃不会根治,根上还得改脚本逻辑。
修改任何脚本前先备份原文件,用Notepad++打开查GOTO、CALL、循环段效率更高。改完保存,M2点"重新加载脚本"或重启生效。

