传奇脚本(QuestDiary或Market_Def)写来回跑点或WHILE/GOTO无限跳转导致死循环,通常分服务端NPC脚本死循环和客户端按键精灵类跑点脚本死循环两种情况,按现象对应处理:
一、NPC/功能脚本(QuestDiary)死循环——最常见
现象
点NPC没反应、M2提示"脚本执行超过最大跳转次数"、M2ServerCPU飙升、角色卡住,日志出现ScriptGotoCountLimitexceeded并指明是哪个NPC/脚本文件。
原因1:GOTO跳回自身无延迟无退出
错误写法:
[@Main]
#ACT
GOTO@Main;;直接跳自己,瞬间超次数
修复——改成DELAYGOTO加延迟,或加计数器退出:
[@Main]
#IFLARGEH$跑次数500
#ACTBREAK
#ELSEACT
INCH$跑次数1
MAPMOVE3320330
DELAYGOTO1000@去B点
[@去B点]
#ACTMAPMOVE3330320
DELAYGOTO1000@Main
H或N(NPC私有变量)作计数器,跑够次数BREAK跳出,避免无限执行。
原因2:WHILE无条件或变量不递增
WHILE1
#ACTMOVD00;;永远真,死循环
修复——给WHILE加判断条件和计数器:
MOVD00
[@循环]
#IFSMALLD0100
#ACTINCD01
;;你的跑点逻辑
DELAYGOTO800@循环
#ELSEACTBREAK
原因3:ScriptGotoCountLimit太小(默认常是10或100)
M2判定脚本瞬间GOTO跳转超限也会报死循环。修改D:\MirServer\Mir200\!Setup.txt:
ScriptGotoCountLimit=10000
改完重启M2Server生效。这只解决"引擎误报正常循环超限",若逻辑真是无限GOTO不写退出条件,调再大也会卡服,必须先改脚本加BREAK/计数器。
原因4:来回跑点坐标无效或相同致反复触发
MAPMOVE目标坐标超出地图范围或A/B两点坐标完全相同,角色传不过去脚本反复执行MAPMOVE形成逻辑死循环。核对MapInfo.txt里地图宽高,确保两点不同且在可行走区域,两点间距建议大于5格。
二、按键精灵/辅助来回跑点脚本卡死
现象
人物在两个点间疯跑停不下来、中途卡墙后原地抖、按停止键关不掉。
修复要点
•用IfColor/FindPic判断是否到达目标点再执行下一步移动命令,别裸MoveToxy后立刻跳回
-加最大循环次数:For100包住主循环,ExitFor在手动停止热键触发时跳出
•路径遇墙卡住可加Delay500~1000降低点击频率,或在两点间插入途经点绕过障碍
三、快速定位是哪段脚本出问题
1.开M2控制台看Error.log或实时日志,会报NPC:某某NPC脚本死循环位置:X(Y:Z),直接定位文件
2.对照上面四种原因检查该段脚本有无无条件的GOTO@自身、WHILE1无BREAK、计数器变量是否INC、MAPMOVE坐标是否有效
3.临时把ScriptGotoCountLimit改大确认不是单纯超限报错,再回去补退出条件
正确写法核心原则:所有循环(GOTO/WHILE/DELAYGOTO递归)必须有计数器或明确条件分支能走到BREAK/返回主菜单,禁止纯GOTO@自身无延迟无判断。
改完记得重载脚本(M2→文件→重新加载所有脚本)或重启GameGate+M2Server使修改生效。
一、NPC/功能脚本(QuestDiary)死循环——最常见
现象
点NPC没反应、M2提示"脚本执行超过最大跳转次数"、M2ServerCPU飙升、角色卡住,日志出现ScriptGotoCountLimitexceeded并指明是哪个NPC/脚本文件。
原因1:GOTO跳回自身无延迟无退出
错误写法:
[@Main]
#ACT
GOTO@Main;;直接跳自己,瞬间超次数
修复——改成DELAYGOTO加延迟,或加计数器退出:
[@Main]
#IFLARGEH$跑次数500
#ACTBREAK
#ELSEACT
INCH$跑次数1
MAPMOVE3320330
DELAYGOTO1000@去B点
[@去B点]
#ACTMAPMOVE3330320
DELAYGOTO1000@Main
H或N(NPC私有变量)作计数器,跑够次数BREAK跳出,避免无限执行。
原因2:WHILE无条件或变量不递增
WHILE1
#ACTMOVD00;;永远真,死循环
修复——给WHILE加判断条件和计数器:
MOVD00
[@循环]
#IFSMALLD0100
#ACTINCD01
;;你的跑点逻辑
DELAYGOTO800@循环
#ELSEACTBREAK
原因3:ScriptGotoCountLimit太小(默认常是10或100)
M2判定脚本瞬间GOTO跳转超限也会报死循环。修改D:\MirServer\Mir200\!Setup.txt:
ScriptGotoCountLimit=10000
改完重启M2Server生效。这只解决"引擎误报正常循环超限",若逻辑真是无限GOTO不写退出条件,调再大也会卡服,必须先改脚本加BREAK/计数器。
原因4:来回跑点坐标无效或相同致反复触发
MAPMOVE目标坐标超出地图范围或A/B两点坐标完全相同,角色传不过去脚本反复执行MAPMOVE形成逻辑死循环。核对MapInfo.txt里地图宽高,确保两点不同且在可行走区域,两点间距建议大于5格。
二、按键精灵/辅助来回跑点脚本卡死
现象
人物在两个点间疯跑停不下来、中途卡墙后原地抖、按停止键关不掉。
修复要点
•用IfColor/FindPic判断是否到达目标点再执行下一步移动命令,别裸MoveToxy后立刻跳回
-加最大循环次数:For100包住主循环,ExitFor在手动停止热键触发时跳出
•路径遇墙卡住可加Delay500~1000降低点击频率,或在两点间插入途经点绕过障碍
三、快速定位是哪段脚本出问题
1.开M2控制台看Error.log或实时日志,会报NPC:某某NPC脚本死循环位置:X(Y:Z),直接定位文件
2.对照上面四种原因检查该段脚本有无无条件的GOTO@自身、WHILE1无BREAK、计数器变量是否INC、MAPMOVE坐标是否有效
3.临时把ScriptGotoCountLimit改大确认不是单纯超限报错,再回去补退出条件
正确写法核心原则:所有循环(GOTO/WHILE/DELAYGOTO递归)必须有计数器或明确条件分支能走到BREAK/返回主菜单,禁止纯GOTO@自身无延迟无判断。
改完记得重载脚本(M2→文件→重新加载所有脚本)或重启GameGate+M2Server使修改生效。

