死循环典型表现
M2Server窗口持续弹"脚本死循环"或"GOTO超过上限",CPU占用飙升,玩家点NPC卡住或角色动不了,Log目录下的ScriptLog.txt不断追加相同脚本名和行号。
最常见三类错误写法
• 无条件GOTO跳转回自身或互跳:[@Main]里写#ACT GOTO @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;加计数器INC D0,达到上限强制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点"重新加载脚本"或重启生效。
热血传奇服务端版本脚本频繁报脚本死循环原因排查与修复方法 GOTO QFunction QuestDia
来源:
作者:
点击:

