当前位置 : 145z游戏站 | 热血传奇 | 技术教程 | 

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

热度:
传奇脚本(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使修改生效。
[顶部]