自己架设传奇M2Server脚本错误排查修复全指南

来源: 作者: 点击:
M2Server脚本错误是传奇单机架设中最常见的故障类型。控制台刷出一片红字,NPC功能失效,服务端启动卡死,本质上都是脚本解析或执行环节出了问题。排查这类问题不需要重装服务端,也不需要逐行重读脚本,关键在于看懂报错信息,按类型对号入座。

## 先定位错误文件和行号

M2Server启动后,控制台会实时输出红色报错信息,格式通常为“脚本错误:命令名称 第:X行:脚本路径”。这段信息已经给出了三个关键线索:出错的命令、具体行号、脚本文件的完整路径。记下这三项,直接打开对应文件跳到该行开始检查。

如果控制台信息刷得太快来不及看,打开服务端Mir200\Log\目录,找到ScriptError.txt或按日期命名的日志文件。日志中会记录错误时间、脚本路径、行号及错误描述,其中“LineXXX”和错误描述是定位问题的核心依据。

GEE引擎的日志路径略有不同,在MirServer\GeeLog\Script.log,需要在Mir200\Setup.txt中开启日志记录功能。无论哪个引擎,养成先看日志再动手的习惯,比凭经验猜问题效率高得多。

## 文件加载失败的处理

报错提示“加载文件错误loadfail:\打造配方\打造列表.txt”这类信息,说明M2Server启动时找不到指定文件,或者文件存在但无法读取。这种情况在单机架设中非常普遍。

先确认文件是否真的存在。打开服务端目录,按报错中的路径逐层检查文件夹和文件。如果文件夹不存在,手动新建;如果文件夹存在但文件缺失,从原始版本包中复制同名文件放进去。文件名必须完全一致,包括后缀和大小写。

如果文件确实存在但仍然报错,检查路径写法。脚本中调用的路径如果用的是绝对路径,而服务端实际安装位置不同,就会找不到文件。将脚本中的路径改为相对路径,或者核对Envir.ini中的脚本路径配置是否与实际存放位置一致。

编码问题是另一个隐蔽的坑。用记事本打开报错文件,点“另存为”,查看编码选项。传奇引擎的TXT脚本只认ANSI编码,如果文件保存为UTF-8或带BOM的UTF-8,引擎读取时会变成乱码或直接加载失败。将编码改为ANSI后覆盖保存即可。

## 脚本命令报错的分类修复

命令类报错分两种:一种是命令格式错误,一种是引擎不支持该命令。

格式错误最常见的是参数数量不对或参数类型错误。比如SetOnTimer命令,正确格式是SetOnTimer 定时器编号 间隔秒数,如果脚本中写成了SetOnTimer 1 1 却没有对应的[@OnTimer1]标签,引擎找不到触发目标就会报错。修复方法是打开报错行,对照引擎自带的脚本命令手册核对参数顺序和数量,缺什么补什么。

引擎不支持的命令需要区分处理。ChangeSkill这类命令在部分GOM或GEE版本中已经废弃或语法变更,如果确认引擎不支持,在报错行的行首加半角分号“;”将其注释掉,或者替换为当前引擎支持的等效命令。修改前先确认该功能在版本中是否必要,如果是核心功能,需要查阅引擎手册找到替代方案;如果是附带功能,直接注释掉不影响正常游戏。

还有一类命令报错容易被忽略:物品名称与数据库不一致。脚本中写GIVE裁决1,但StdItems.DB中的物品全称是“裁决之杖”,引擎找不到“裁决”这个物品就会报错。打开数据库查看准确名称,复制到脚本中替换即可。

## 变量未定义和赋值异常

M2Server提示“变量XXX不存在”或“变量未定义”,根源在于脚本调用了没有在引擎中注册的变量。变量分为全局变量、角色变量和自定义变量,每种都需要在使用前完成定义或赋值。

最直接的修复方式是在StringDefine.txt中注册变量。打开Mir200\Envir\StringDefine.txt,查找[HUMAN]或[GLOBAL]字段,在对应字段下方添加报错的变量名。如果字段不存在,在文件末尾手动添加[HUMAN]或[GLOBAL]标记,再写入变量名。保存后必须重启M2Server,配置才会生效。

变量定义好之后,还要在脚本的登录段添加初始化赋值,避免空值参与运算导致后续报错。在QFunction.txt或QManage.txt的[@Login]标签下,添加VAR HUMAN 变量名=0这样的初始化语句,确保玩家每次上线变量都有明确初始值。

变量类型不匹配也是常见问题。数字型变量(P、G、M、I、D、N开头)只能赋数字,字符型变量(S、A开头)可以赋文字和符号。给数字型变量赋字符串,或者给字符型变量赋数字,都会触发类型错误。检查赋值语句中的变量名和赋值内容,确保类型对应。

## 脚本死循环和循环次数超限

报错提示“ScriptGotoCount超限”或脚本执行卡死,说明脚本中的GOTO跳转次数超过了引擎设定的上限。传奇引擎默认的GOTO次数限制通常只有10次,复杂脚本很容易触发这个限制。

紧急处理方法是修改循环上限。打开服务端Mir200目录下的!Setup.txt文件,找到ScriptGotoCountLimit参数,默认值是10,将其改为1000或更大。建议不要设得太高,1000到5000之间比较合理,设得过高会掩盖脚本本身的逻辑问题。

改完参数只是临时方案,根本解决还要回到脚本本身。检查报错脚本中的GOTO命令,看是否存在重复跳转或没有终止条件的循环。给循环判定脚本添加明确的退出条件,删除冗余的GOTO跳转,才能从源头消除死循环隐患。

## 改完脚本后的收尾操作

脚本修改保存后,不要直接在M2Server中点击重载了事。复杂改动需要完全关闭M2Server,删除Mir200\Log目录下的ScriptCache.dat缓存文件(如果有的话),再重新启动引擎。缓存文件不清理,引擎可能仍然读取旧的脚本解析结果,报错依旧存在。

重启后观察控制台是否还有红色报错。如果没有报错,进入游戏测试对应的NPC对话和功能触发,确认脚本逻辑按预期执行。如果报错依然存在,检查脚本文件的编码是否被改回UTF-8,以及文件是否被设置为只读属性,这两个细节在修改过程中很容易被忽略。