M2上弹出脚本错误提示的时候,报错框里通常会给出一串信息:错误类型、所在文件、行号。很多人盯着自己写的代码反复看,觉得语法没问题、空格也对、路径也正确,但M2就是报错。这时候就得换一个排查方向,因为M2报错往往不是单一原因,前面一个错误没解决,后面所有的报错都是被它带出来的。
先说你遇到的那个“坐标0 0”的问题。M2报错里出现坐标0 0,基本上可以断定是脚本引擎在读取某个地图坐标参数时,没有拿到有效数值,于是默认填入0 0。但0 0在很多地图里是不可行走的区域,所以系统判定为非法坐标,接着触发一连串的连锁报错。这个0 0不是根源,是结果。根源在于引擎在解析你脚本里的坐标参数时,根本就没解析出来。
最常见的导致坐标解析失败的原因,是格式分隔符不对。传奇脚本里坐标通常写成“X Y”或者“X,Y”的格式,不同引擎对分隔符的宽容度不一样。GOM引擎通常认空格,HERO引擎认逗号,GEE引擎两种都认但必须有且只有一个分隔符。如果你写成了“X Y”中间用了两个空格,或者“X,Y”后面多了一个逗号,引擎取坐标值的时候取到的就是空字符串,转成数字就是0。检查脚本里所有坐标行,把多余的空格删干净,统一用一种分隔符,不要混用。
还有一个隐蔽的情况:坐标值前面带了Tab制表符。很多人在编辑器里为了对齐好看,在坐标前面敲了Tab键,但脚本引擎不认Tab,它会把Tab当成非法字符,导致整行解析失败。解决办法是把脚本文件全选,在编辑器里把Tab全部替换成普通空格,通常用替换功能把“\t”替换成“ ”就能解决。
地图编号写错也会导致坐标被系统当作0 0处理。比如你写的是“mapmove 3 333 333”,但如果当前版本里3号地图不存在,或者地图文件里根本没有这个编号,引擎找不到地图入口,就会把后面的坐标忽略掉,直接置成0 0。先打开服务端目录下的MapInfo.txt,确认你要使用的地图编号确实存在,而且地图配置文件里正确声明了地图大小范围。
更常见的一种情况是地图编号和坐标之间的格式错误。正确写法是“mapmove 3 333 333”,三个参数中间各一个空格。如果你写成了“mapmove 3 333 333”中间混了中文全角空格,引擎一样认不出来。把脚本里的所有空格换成英文半角空格,全角空格在视觉上和半角几乎一样,但引擎完全不认。
连锁报错是怎么发生的?M2启动时会加载所有脚本文件,从QManage.txt开始,然后是所有NPC脚本、功能脚本。加载过程中一旦遇到第一个错误,引擎会跳过当前脚本文件的后续内容,直接去加载下一个。但跳过的这部分脚本里如果定义了变量、函数或者触发了某些初始化逻辑,后面其他脚本引用这些内容的时候就找不到对应定义,于是每遇到一处引用就报一处错误。这就解释了为什么改了一个坐标0 0的错误,后面几十条报错也跟着消失了——因为它们都是在等第一个错误里的定义加载完成。
如果你确定自己的坐标写法完全正确,那就把目光从脚本文件移开,去查地图文件本身。MapInfo.txt里地图的定义行,格式是“[地图编号 地图名称]”,如果定义行里地图编号后面跟的名称里带了特殊字符,或者定义行的括号没闭合,整个地图的坐标系统就加载不完整。引擎在读取地图定义失败后,会把所有对该地图的坐标引用都设为0 0。检查MapInfo.txt里报错涉及的地图定义行,确保格式完整规范。
还有一种情况,地图文件存在但地图尺寸定义跟实际不符。地图尺寸在服务端的MapInfo里通常不直接写,而是读取对应.map文件头信息。如果.map文件损坏了,或者客户端和服务端的.map文件版本不一致,服务端读取地图尺寸时取不到正确数值,也会把坐标当作0 0处理。把服务端和客户端的.map文件替换成同一套完整的地图数据,重启M2再看。
如果排除了上面所有可能,报错还是指向坐标0 0,那就去看脚本里是不是用了变量来代替坐标数值。比如你写了“mapmove 3 <$USERX> <$USERY>”,但这两个变量在当前脚本上下文里还没有被赋值,取值就是空,转成0 0。在调用这种变量之前,先确保变量已经被正确赋值,或者加上判空逻辑,变量为空的时候直接跳出不执行移动命令。
最后说一个很多人忽略的点:脚本文件的编码格式。M2读取脚本文件时默认按ANSI编码解析,如果你的脚本保存成了UTF-8 with BOM,BOM头那三个字节会被引擎当作脚本内容的一部分来解析,第一行命令就被污染了。原本正常的坐标参数因为字节偏移读错位,引擎取到了乱码,转成数字失败,全变成0。把脚本文件另存为ANSI编码,再重新加载,坐标报错直接消失。
传奇M2报脚本错误根源排查 坐标0 0连锁反应全解
来源:
作者:
点击:

