传奇玩到一半弹脚本错误怎么办:M2报错定位与修法

来源: 作者: 点击:
进游戏点NPC弹出“脚本错误”红字,或者M2控制台刷屏报错,先别关服务端,也别急着删文件。传奇的脚本报错信息已经把路标写死了:哪一行、哪个文件、哪个NPC、是不是地图环境为空,全都打印出来了。按下面顺序对着查,大部分情况半小时内能消掉。

先看M2控制台最上面那几行红字,分辨是哪种错。一类是“Merchant Initalize fail (m.PEnvir=nil)”,这种是NPC加载时找不到地图环境,属于配置层问题;另一类是“脚本错误: <返回/@main> 第:967 行: D:\mirserver\Mir200\Envir\Market_Def\老兵/版本说明员-3.txt”,这种是指定了文件指定了行号,属于脚本语法层问题;还有一类是QFunction-0.txt报行号,属于全局触发脚本问题。三者修法不一样,混着搞会越改越乱。

碰到 m.PEnvir=nil,直接打开 Mir200\Envir\Merchant.txt,搜报错里那个NPC名(比如“天关统领”)。标准一行是“地图标识 X Y NPC名 脚本名 标志 外观 方向”,重点看第一列地图标识是不是0、空着、或者写了MapInfo.txt里不存在的编号。比如写成“0 100 100 天关统领 天关统领 0 15 0”,地图0不存在,引擎就拿不到m.PEnvir,必然nil。改成“盟重省 330 330 天关统领 天关统领 0 15 0”这种有效地图,保存。然后开 MapInfo.txt 核对这个地图标识确实定义了,再去 Mir200\Map 里确认有对应编号的 .map 文件(如3.map)。三个对不上任意一个,NPC都起不来。

指定行号的脚本错误,用 Notepad++ 打开报错路径,Ctrl+G 跳行。以“脚本错误: <返回/@main> 第:967 行”为例,跳到967行看上下文。最常见三种:
1. 中文标点混进去了,<返回/@main> 后面用了中文引号或中文括号,全改英文半角;
2. [@main] 标签本身没定义,或者定义在别的文件里但这行硬跳过去,把跳转目标改成当前文件存在的标签,比如 <返回/@start>;
3. #IF 底下没跟 #ACT 或 #SAY,或者 #IF 判断写完后少了 #ENDIF,导致引擎读到967行时上下文断裂。
改完这一行别顺手改别处,另存为 ANSI 编码覆盖原文件,UTF-8 带 BOM 的 txt 引擎读起来也会报格式错。

QFunction-0.txt 报行号(比如1938行)要更小心,这文件管登录、死亡、戴装备等全局触发,改崩了全服功能异常。同样 Ctrl+G 跳过去,看是 GOTO @某个标签但文件里没 [@某个标签],还是 MOV S1 后面变量没定义,或者 Give/Take 命令缺参数(如“TAKE 1”没写物品名)。临时止血办法是在那一行最前面加英文分号 ; 注释掉,存盘,M2控制台输 @ReloadQFunction 重载;若报错消失就证明病根在这行附近,再把注释打开逐句修。不要一上来就把1938行整段删了,可能连带把后面的触发逻辑一起废掉。

顺带提一句“已读取 0个行会信息”这种提示,本身不一定是错误,空库启动就会这样;但只要前面NPC和脚本错没修完,行会数据加载顺序也会被卡。等脚本错全清掉,重启一次 M2,看控制台是不是只剩“登录服务器连接成功 / 数据库服务器连接成功”这种绿字,再进游戏点原来报错的NPC,能正常对话就算过了。

改之前把 Envir 整个文件夹复制一份叫 Envir_bak,每次只动一个文件、重启一次、观察一次报错变化。同时按 F12 或看 Mir200\Log 下的 M2Server 日期日志,里面记录的行号比弹窗更准,有时弹窗行号和实际文件行号差几行,以日志为准。换行符乱掉也会让“报299行但文件只有170行”,这种用 Notepad++ 转成 Windows(CRLF) 换行再存 ANSI 就行。

引擎跨版本套用是最隐蔽的坑。LEG 的脚本直接扔 SKY 或翎风里跑,地图标识大小写、GOTO 语法、变量前缀都可能不认,表现就是满屏 Merchant nil 加随机行号错。这种不是单行能修的,拿同引擎的原始版本把 Merchant.txt、MapInfo.txt、Market_Def 下对应 NPC 脚本抽出来比对,缺的标签补标签,缺的地图补地图,比一行行猜命令快得多。