传奇服务端脚本错误修复全解 QQ礼包报错与M2引擎报错逐项排查指南

来源: 作者: 点击:
服务端脚本报错先看两个地方。M2Server控制台弹出的红字错误窗口会直接写明文件名和行号,比如“QuestDiary\QFunction-0.txt Line56”或者“QFunction.txt第88行变量未定义”。这是定位问题的第一手信息。如果弹窗一闪而过没看清,打开MirServer\Log文件夹,找到当天的-M2Server-日期.log文件,搜索ScriptError关键词,日志里同样会记录完整的文件路径和行号。拿到报错文件和行号之后,用Notepad++打开对应脚本文件,Ctrl+G直接跳到出错的那一行开始排查。

如果报错信息没有给出明确行号,或者行号和实际文件行数对不上,先不要急着改脚本。这种情况八成是文件编码和换行符的问题。传奇引擎只认ANSI编码,如果脚本被保存成了UTF-8或者带BOM的UTF-8,引擎读取时会把文件头部的隐藏字符也算进去,导致行号偏移。解决办法是用Notepad++打开文件,在编码菜单里选择“转为ANSI编码”,然后另存为时确认换行符是Windows格式的CRLF。很多脚本看起来语法没问题但一直报错,就是编码格式在作怪。

编码确认没问题之后,开始检查脚本语法。传奇脚本的命令和参数之间必须有空格,标点符号必须全部用英文半角。中文全角的逗号、引号、括号混在里面,引擎直接认不出来。段头标签像[@Main]必须顶格写,前面不能有任何空格。条件判断语句的格式是#IF后面空一格再写条件,#ACT后面空一格再写执行动作。每行命令只能写一条,不要在一行里堆叠多个命令。用Notepad++的“显示所有字符”功能打开空格和制表符的可见标记,把多余的空格和中文标点全部替换掉。

变量报错是另一个高频问题,日志里会提示“变量未定义:HUMAN未定义”这类信息。传奇引擎中所有变量必须先通过LOADVAR加载或者用SETVAR初始化赋值之后才能使用。自定义变量如果没在QManage.txt的登录段落里提前声明,脚本执行到那一行就会直接报错。变量名还必须全部大写,写成小写或者大小写混合引擎同样认不出来。检查脚本里所有变量,把HCall@TTT这样的写法统一改成HCall@TTT全大写格式。

路径错误的表现是控制台提示“脚本加载失败:文件未找到”或者“Can't find某文件”。脚本里用#CALL命令调用的子脚本,被调用的文件必须实际存在于指定的文件夹里。打开服务端根目录,按报错提示的路径一级一级点进去,看文件到底在不在。注意路径分隔符不能写错,反斜杠\和正斜杠/在不同引擎里要求不一样。路径开头写“.\”代表服务端根目录,“..\”代表上一级目录,搞混了也会找不到文件。如果文件确实不存在,要么在脚本里把路径改成实际存在的位置,要么手动创建对应的文件夹和TXT文件。

插件缺失导致的脚本函数报错需要单独处理。有些脚本依赖特定的DLL插件才能执行某些命令,比如GOM引擎的复活脚本、自动拾取功能。如果PlugList.txt文件里没有写入对应插件的文件名,M2引擎启动时不会加载这个插件,脚本执行到相关命令时就会报“命令不能使用”或者“函数未找到”。打开Mir200\PlugList.txt,确认脚本所依赖的插件已经写入这个文件,保存后关闭所有网关程序,重新启动M2引擎。如果换过登录器版本,PlugList.txt里的插件DLL也要跟着换,比如从原版登录器换成绿盟登录器,gompj.dll就要换成945Engine.dll,写错了插件加载不上,脚本命令照样报错。

QQ礼包脚本报错主要集中在三个地方。第一个是路径引用失败,脚本里写了#CALL调用某个子脚本,但目标文件在QuestDiary目录下不存在,或者文件名大小写不一致。打开QQ礼包脚本文件,搜索Path和#CALL字段,把路径复制出来在电脑上直接粘贴打开,确认文件实际存在。不存在就按实际位置修改脚本里的路径,注意文件夹名称和大小写必须完全一致。

第二个是变量未定义。礼包脚本里用的变量比如QQGift_1、QQ_Limit_1,如果没在GlobalVar.txt全局变量文件里提前定义,或者没有在UserVar.txt用户变量文件里声明,脚本执行时会直接中断。打开脚本文件找到报错提示的变量名,然后在Config\GlobalVar.txt里添加变量定义,格式是“变量名=对应值”。涉及领取次数限制的变量要确认在UserVar.txt里存在对应记录。

第三个是礼包触发条件冲突。部分玩家能领部分玩家不能领,或者同一账号重复领取不受限制,问题出在#IF条件段的设置上。打开脚本找到#IF和#ACT段落,检查条件之间有没有矛盾,比如同时写了LEVEL>30和LEVEL<20,符合条件的玩家范围就是空的。需要限制领取次数的话,在#IF后面加CHECKVAR条件检查用户领取次数,在#ACT后面加SETVAR记录领取状态。

不同引擎的命令写法有差异,混用会导致脚本报错。GOM引擎和GEE引擎在部分命令上不通用,比如GEE引擎校验输入字符串用的是#CheckString命令,BLUE引擎用的是#InputString命令,如果脚本原本是按GOM写的拿到GEE引擎上跑,这些命令就得替换成对应引擎支持的写法。HERO引擎和GOM引擎在传送命令上也不一样,GOM用MAPMOVE,HERO用MOVETOMAP,写错了引擎不识别就会报命令错误。先确认当前服务端用的是哪个引擎,看根目录下的核心进程文件名,GeeM2.exe是GEE引擎,GomM2.exe是GOM引擎,HeroM2.exe是HERO引擎,然后在脚本编辑器里对照引擎命令大全逐条核对。

死循环报错的表现是M2控制台提示“脚本死循环”,CPU占用率飙升甚至服务端卡死。这类问题通常由GOTO跳转命令引起,脚本在两个标签之间来回跳转没有退出条件。处理办法是打开!SetUp.txt配置文件,找到ScriptGotoCountLimit参数,默认值是10,把它改大一些比如200或者500,给脚本足够的循环次数。但这只是缓解,根本解决办法还是回到脚本里检查GOTO的跳转逻辑,确认每个循环都有明确的退出条件。

所有修改完成之后,保存脚本文件,在M2控制台点击“重新加载所有NPC”让改动生效。如果重新加载后报错没有消失,检查脚本文件是不是被设成了只读属性。右键脚本文件点属性,取消只读勾选,确认用户权限里有读取和写入权限。杀毒软件也可能拦截脚本文件,把服务端整个目录加到杀毒软件的信任白名单里,避免实时防护误删或者锁住脚本文件导致引擎读不到。如果以上步骤都走完还是报错,用二分法逐段注释脚本内容,在行首加;符号把代码段注释掉,每次注释一半然后重启服务端看报错是否消失,逐步缩小范围定位到具体出错的代码行。