进游戏点NPC弹出“脚本错误”红字,或者M2控制台刷屏报错,先别关服务端,也别急着删文件。传奇的脚本报错信息已经把路标写死了:哪一行、哪个文件、哪个NPC、是不是地图环境为空,全都打印出来了。按下面顺序对着查,大部分情况半小时内能消掉。
先看M2控制台最上面那几行红字,分辨是哪种错。一类是“MerchantInitalizefail(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名(比如“天关统领”)。标准一行是“地图标识XYNPC名脚本名标志外观方向”,重点看第一列地图标识是不是0、空着、或者写了MapInfo.txt里不存在的编号。比如写成“0100100天关统领天关统领0150”,地图0不存在,引擎就拿不到m.PEnvir,必然nil。改成“盟重省330330天关统领天关统领0150”这种有效地图,保存。然后开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@某个标签但文件里没[@某个标签],还是MOVS1后面变量没定义,或者Give/Take命令缺参数(如“TAKE1”没写物品名)。临时止血办法是在那一行最前面加英文分号;注释掉,存盘,M2控制台输@ReloadQFunction重载;若报错消失就证明病根在这行附近,再把注释打开逐句修。不要一上来就把1938行整段删了,可能连带把后面的触发逻辑一起废掉。
顺带提一句“已读取0个行会信息”这种提示,本身不一定是错误,空库启动就会这样;但只要前面NPC和脚本错没修完,行会数据加载顺序也会被卡。等脚本错全清掉,重启一次M2,看控制台是不是只剩“登录服务器连接成功/数据库服务器连接成功”这种绿字,再进游戏点原来报错的NPC,能正常对话就算过了。
改之前把Envir整个文件夹复制一份叫Envir_bak,每次只动一个文件、重启一次、观察一次报错变化。同时按F12或看Mir200\Log下的M2Server日期日志,里面记录的行号比弹窗更准,有时弹窗行号和实际文件行号差几行,以日志为准。换行符乱掉也会让“报299行但文件只有170行”,这种用Notepad++转成Windows(CRLF)换行再存ANSI就行。
引擎跨版本套用是最隐蔽的坑。LEG的脚本直接扔SKY或翎风里跑,地图标识大小写、GOTO语法、变量前缀都可能不认,表现就是满屏Merchantnil加随机行号错。这种不是单行能修的,拿同引擎的原始版本把Merchant.txt、MapInfo.txt、Market_Def下对应NPC脚本抽出来比对,缺的标签补标签,缺的地图补地图,比一行行猜命令快得多。
先看M2控制台最上面那几行红字,分辨是哪种错。一类是“MerchantInitalizefail(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名(比如“天关统领”)。标准一行是“地图标识XYNPC名脚本名标志外观方向”,重点看第一列地图标识是不是0、空着、或者写了MapInfo.txt里不存在的编号。比如写成“0100100天关统领天关统领0150”,地图0不存在,引擎就拿不到m.PEnvir,必然nil。改成“盟重省330330天关统领天关统领0150”这种有效地图,保存。然后开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@某个标签但文件里没[@某个标签],还是MOVS1后面变量没定义,或者Give/Take命令缺参数(如“TAKE1”没写物品名)。临时止血办法是在那一行最前面加英文分号;注释掉,存盘,M2控制台输@ReloadQFunction重载;若报错消失就证明病根在这行附近,再把注释打开逐句修。不要一上来就把1938行整段删了,可能连带把后面的触发逻辑一起废掉。
顺带提一句“已读取0个行会信息”这种提示,本身不一定是错误,空库启动就会这样;但只要前面NPC和脚本错没修完,行会数据加载顺序也会被卡。等脚本错全清掉,重启一次M2,看控制台是不是只剩“登录服务器连接成功/数据库服务器连接成功”这种绿字,再进游戏点原来报错的NPC,能正常对话就算过了。
改之前把Envir整个文件夹复制一份叫Envir_bak,每次只动一个文件、重启一次、观察一次报错变化。同时按F12或看Mir200\Log下的M2Server日期日志,里面记录的行号比弹窗更准,有时弹窗行号和实际文件行号差几行,以日志为准。换行符乱掉也会让“报299行但文件只有170行”,这种用Notepad++转成Windows(CRLF)换行再存ANSI就行。
引擎跨版本套用是最隐蔽的坑。LEG的脚本直接扔SKY或翎风里跑,地图标识大小写、GOTO语法、变量前缀都可能不认,表现就是满屏Merchantnil加随机行号错。这种不是单行能修的,拿同引擎的原始版本把Merchant.txt、MapInfo.txt、Market_Def下对应NPC脚本抽出来比对,缺的标签补标签,缺的地图补地图,比一行行猜命令快得多。

