传奇脚本发生错误怎么解决各类报错排查方法

来源: 作者: 点击:
脚本报错的处理核心是拿到准确的错误信息。M2控制台的实时输出窗口会直接用红字标出出错的文件名和行号,格式通常是“ScriptError: 文件名 Line数字: 错误类型”。拿到这条信息之后,直接定位到对应文件的对应行去检查,比漫无目的地翻整个脚本目录效率高得多。

## 启动时报script error load fail

这类报错最常见的原因是版本里调用了不存在的脚本文件。M2启动加载时,会去Envir目录下查找Merchant.txt里配置的每一个NPC脚本,如果某个脚本文件缺失或者路径写错了,就会抛出“script error, load fail”并指明缺失的文件。处理方式分两种:如果这个脚本对应的功能是版本需要的,补上缺失的文件;如果这个NPC本身没用,去Merchant.txt里把对应的配置行删掉,报错就消失了。

路径和文件名的大小写不一致也会引发同样的报错。Windows系统虽然不区分大小写,但某些引擎在解析配置文件时严格匹配字符。Merchant.txt里写的NPC名称和Market_Def目录下的脚本文件名必须完全一致,包括扩展名前面的所有字符。检查的时候用Notepad++打开Merchant.txt和脚本目录对比着看。

## 脚本语法错误的定位与修复

语法报错通常在M2控制台显示为“CommandSyntaxError”,后面跟着出错的具体行号。重点检查几个位置:#IF和#ACT是否独立成行且顶格书写,段头[@Main]前面不能有空格或制表符,否则引擎会把这一行当成普通文本跳过,后面的逻辑全部乱套。命令拼写也要逐个核对,比如CHECKLEVELEX写成CHECKLEVEL、GOTO指向的@标签根本不存在,这类低级错误占了语法报错的大部分。

括号和引号的闭合状态也要查。脚本里用到符号和文本的地方,必须用英文半角输入,中文全角的空格和标点会让引擎解析失败。用Notepad++打开脚本,从视图菜单里开启“显示所有字符”,全角空格和制表符会以不同颜色或符号显示出来,一眼就能发现。

## 脚本死循环导致服务卡顿

死循环的表现是M2的CPU占用率飙升,服务端响应变慢,严重时直接卡死。脚本里的死循环通常来自几个地方:状态跳转在两个节点之间来回循环没有出口,循环变量忘了递增导致条件永远为真,或者递归调用没有设置终止条件。传奇脚本里大量使用goto跳转,如果A标签goto到B,B又goto回A,就形成了闭环。

排查死循环可以用M2的日志功能。在M2控制台开启脚本执行日志,观察是否有某个脚本条目在短时间内被反复执行。GOM引擎的日志文件在MirServer/Mir200/Log/目录下,可以设置过滤条件只看执行时间异常的条目。找到可疑的循环之后,在循环体里加上退出条件,比如最大迭代次数限制,或者在跳转逻辑里加一个延迟命令delaygoto来代替直接goto。

M2本身也有脚本死循环的保护参数。在M2控制台的参数设置里,游戏选项1下面有一个“脚本死循环”的数值,默认可能是300,把它调大一些可以容忍更复杂的脚本逻辑而不被强制中断。!setup.txt文件里的ScriptGotoCountLimit参数也可以调整,建议设置为10000到50000之间。

## 脚本改了不生效的排查顺序

改了脚本但游戏里没反应,第一步是在M2控制台执行重载操作,而不是重启整个服务端。NPC脚本在控制菜单里选择重新加载所有NPC,功能脚本选择重载QFunction,重载完小退角色重新登录测试。

重载后还不生效,检查脚本文件的编码格式。传奇脚本必须用ANSI编码保存,用UTF-8格式保存的文件带有BOM头,引擎读取时会解析出乱码或者直接跳过。用Notepad++打开脚本,编码菜单里选择转为ANSI编码,保存后重新加载。

文件存放位置也要核对。NPC脚本必须放在Mir200\Envir\Market_Def目录下,并且文件名格式要符合“[NPC名称]-[地图编号].txt”的规则。比如盟重省的传送员脚本应该命名为“盟重省_传送员-3.txt”,地图编号3代表盟重省。文件名缺少地图编号后缀,或者存放目录搞错了,引擎就找不到这个脚本。

## QF和QM脚本的特殊问题

QFunction脚本里的CALL命令失效是另一个高频问题。有玩家反馈QF里加了一个新的触发字段之后,原来的CALL全部不执行了。这可能是QF脚本的触发字段有数量上限,或者某个CALL指向的脚本文件出了问题,导致后续的CALL连带失效。处理方式是逐个排查QF里的CALL语句,确认每个目标文件存在且路径正确,删掉暂时不需要的触发字段再测试。

引擎升级之后QF失灵也是一个原因。新引擎对脚本错误的容忍度比老引擎低,以前能跑的脚本换了新引擎之后会直接报错或者静默失败。如果升级引擎之后出现QF问题,把QF脚本完整检查一遍,删掉不规范的写法和过时的命令,或者回退到升级前的引擎版本。

## 数据库和物品相关的脚本报错

脚本执行时提示“无法获取物品对象”或者“对象为null”,通常和数据库的加载顺序有关。M2启动时如果脚本初始化在物品数据库加载之前执行,脚本里去获取物品对象的命令就会失败。检查脚本的初始化时机,确保依赖数据库的命令放在引擎完全启动之后执行。

物品IDX字段的连续性也会影响脚本执行。物品数据库里的IDX如果跳号或者字段值格式错误(比如数值型字段里填了字符),脚本在读取物品数据时会报错。用数据库管理工具打开物品DB,检查IDX列是否连续,字段类型是否匹配。导出数据再重新导入的时候,空白字段勾选自动填充默认值,避免因为字段为空导致解析失败。

## 编码和系统环境问题

脚本文件用UTF-8保存是隐形杀手。引擎读取带BOM的UTF-8文件时,中文会变成乱码,脚本里的段头和命令解析全部出错。所有QuestDiary和Market_Def目录下的脚本,统一转成ANSI编码保存。

杀毒软件误拦截也会导致脚本加载失败。有些杀毒软件会把M2Server或者GameLoad.exe进程的行为判定为可疑,阻止它读取脚本文件。把整个MirServer目录加入杀毒软件的白名单,或者暂时关闭实时防护再测试。

客户端弹出的脚本错误和M2服务端报错是两条不同的线。客户端登录器内嵌的网页脚本报错,通常是IE组件没有正确注册。用管理员权限打开命令提示符,依次执行regsvr32 jscript.dll、regsvr32 vbscript.dll、regsvr32 mshtml.dll这几条命令,注册完成之后重启客户端。