传奇服务端启动报脚本错误含义与全套检修步骤

来源: 作者: 点击:
服务端启动过程中弹出脚本错误提示,意味着M2引擎在加载和编译游戏脚本文件时遇到了无法正常解析的命令或逻辑。这个错误不会让服务端完全起不来,但会导致相关功能模块失效,比如某个NPC点不开、某个地图进不去、某个活动不触发。启动时报错跟运行时报错性质不同,启动阶段的错误是引擎在预编译阶段发现的硬伤,不修掉的话,那部分功能在游戏里就是废的。

启动时的脚本错误按来源分,大致可以归入三个层面:脚本文件本身的语法问题、脚本文件之间的调用依赖问题、以及服务端环境配置与脚本预期不符的问题。三个层面的排查顺序有先后,按步骤来比瞎翻代码快得多。

先把M2报错窗口里的具体内容截下来。报错框通常会写明错误发生在哪个文件、第几行、什么类型的错误。比如“QuestDiary\装备回收.txt 第45行 'Break'命令使用错误”,这就直接指向了具体位置。如果报错内容只有“脚本错误”四个字,没有具体文件行号,那就说明错误出在登录脚本QManage.txt或者系统功能脚本QFunction-0.txt的头部,引擎还没来得及读到具体行号就崩了。

语法类错误是最常见的。传奇脚本的命令都是固定格式,多一个空格少一个空格、中英文标点混用、括号不闭合、缺少必要的分隔符,都会触发启动报错。检查报错行时重点关注几个地方:IF和ACT有没有配对,每个#IF后面必须跟一个#ACT;GOTO跳转的目标标签是否存在;CHECK命令的参数数量是否跟引擎版本匹配。例如老版本引擎的CHECKITEM命令只需要一个物品名参数,新版本可能需要加上数量参数,参数个数对不上就报错。

标签重复或缺失引发的错误也不少见。脚本里用[@标签名]来定义跳转目标,如果两个不同的脚本段用了完全一样的标签名,引擎加载时只认第一个,第二个直接跳过,所有跳转到第二个标签的GOTO命令都会报找不到目标。检查报错文件里有没有重复的[@XXX]标签,把重复的改名。反过来,如果有GOTO跳转到一个不存在的标签,启动时引擎也会报错,把所有GOTO的目标标签全扫一遍,确保每个目标都在同一个文件里定义了。

文件路径引用错误是启动阶段的另一类高发问题。脚本里经常用#CALL [路径] 文件名 的方式来调用外部脚本段。如果路径写错了,或者被调用的文件压根不存在,引擎在加载时会直接报错并停止编译当前文件。检查所有#CALL命令里的路径是否真实存在,路径分隔符用的是反斜杠还是正斜杠,不同引擎要求不一样,GOM通常用反斜杠,GEE两者都认但必须统一。还有一种情况是文件存在但扩展名不对,写了.txt但实际文件是.ini或者没有扩展名,引擎找不到也会报错。

变量和常量定义冲突在启动阶段也会跳出来。服务端根目录下的!Setup.txt文件里定义了全局变量和常量,如果脚本里出现了同名的自定义变量,引擎加载时就会报变量重复定义。比如!Setup.txt里已经定义了“GLOBAL_LEVEL”这个变量,你在脚本里又用“VAR Integer GLOBAL_LEVEL”重新定义了一次,引擎直接报错退出。检查!Setup.txt里的全局变量表,避开已经被占用的名字。

服务端环境配置与脚本预期不匹配的情况,最典型的是地图编号不统一。脚本里写的地图编号,在MapInfo.txt里找不到对应定义,或者地图定义被注释掉了,启动时凡是涉及这个地图的移动指令和刷怪指令都会报错。打开MapInfo.txt,找到报错涉及的地图编号,确认该行没有被前面加分号注释掉,并且格式是标准的“[编号 名称]”。如果地图编号在脚本里以变量形式传递,检查变量在启动时是否已经被赋了有效值。

还有一类启动报错跟脚本内容完全无关,而是服务端文件权限问题。Windows系统下,如果M2程序没有对脚本文件夹的读写权限,启动时加载文件会失败,弹出来的错误也是“脚本错误”。检查服务端文件夹的权限设置,确保当前登录系统的账户对Mir200目录及其子目录有完全控制权限。尤其是放在C盘Program Files目录下的服务端,系统对Program Files默认有保护,文件写入被拦截就会触发加载失败。

启动报错处理完一条之后必须重启M2重新加载,因为引擎只在启动阶段做一次全量编译,改完不重启,改动的部分不会生效。每次改完一个错误,重启M2看报错数量是不是减少了。如果报错数量没变,说明刚才改的地方不是根源,换个方向查。如果报错数量减少但还有剩余,继续按报错顺序从第一个开始修,因为后面的报错往往是第一个错误引发的连锁反应,第一个修好了后面的可能自动消失。

最后提醒一点:启动报错里如果出现大量乱码字符,说明脚本文件的编码格式不对。把报错涉及的脚本文件用Notepad++打开,查看右下角的编码标识。如果显示UTF-8或UTF-8 with BOM,就转换成ANSI编码再保存。M2引擎对ANSI编码的兼容性最好,换完编码重启之后报错基本就清干净了。