热血传奇NPC/功能脚本写来回跑点陷入死循环原因排查与修复 加计数器跳出及ScriptGotoC

来源: 作者: 点击:
传奇脚本(QuestDiary或Market_Def)写来回跑点或WHILE/GOTO无限跳转导致死循环,通常分服务端NPC脚本死循环和客户端按键精灵类跑点脚本死循环两种情况,按现象对应处理:

一、NPC/功能脚本(QuestDiary)死循环——最常见

现象

点NPC没反应、M2提示"脚本执行超过最大跳转次数"、M2Server CPU飙升、角色卡住,日志出现 ScriptGotoCountLimit exceeded 并指明是哪个NPC/脚本文件。

原因1:GOTO 跳回自身无延迟无退出

错误写法:

[@Main]
#ACT
GOTO @Main ;;直接跳自己,瞬间超次数

修复——改成 DELAYGOTO 加延迟,或加计数器退出:

[@Main]
#IF LARGE H$跑次数 500
#ACT BREAK
#ELSEACT
INC H$跑次数 1
MAPMOVE 3 320 330
DELAYGOTO 1000 @去B点

[@去B点]
#ACT MAPMOVE 3 330 320
DELAYGOTO 1000 @Main

H 或 N(NPC私有变量)作计数器,跑够次数 BREAK 跳出,避免无限执行。

原因2:WHILE 无条件或变量不递增


WHILE 1
#ACT MOV D0 0 ;;永远真,死循环

修复——给 WHILE 加判断条件和计数器:

MOV D0 0
[@循环]
#IF SMALL D0 100
#ACT INC D0 1
;;你的跑点逻辑
DELAYGOTO 800 @循环
#ELSEACT BREAK


原因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 判断是否到达目标点再执行下一步移动命令,别裸 MoveTo x,y 后立刻跳回

- 加最大循环次数:For 100 包住主循环,Exit For 在手动停止热键触发时跳出
• 路径遇墙卡住可加 Delay 500~1000 降低点击频率,或在两点间插入途经点绕过障碍

三、快速定位是哪段脚本出问题

1. 开 M2控制台看 Error.log 或实时日志,会报 NPC:某某NPC 脚本死循环 位置:X(Y:Z),直接定位文件
2. 对照上面四种原因检查该段脚本有无无条件的 GOTO @自身、WHILE 1 无 BREAK、计数器变量是否 INC、MAPMOVE 坐标是否有效
3. 临时把 ScriptGotoCountLimit 改大确认不是单纯超限报错,再回去补退出条件

正确写法核心原则:所有循环(GOTO/WHILE/DELAYGOTO递归)必须有计数器或明确条件分支能走到 BREAK/返回主菜单,禁止纯 GOTO @自身 无延迟无判断。

改完记得重载脚本(M2→文件→重新加载所有脚本)或重启 GameGate+M2Server 使修改生效。