传奇脚本报错常见原因排查步骤以及对应的处理办法

来源: 作者: 点击:
脚本出错的时候,先记下弹窗里提示的错误文字和错误代码,不同报错对应的问题方向不一样,优先区分是M2加载时报错,还是NPC对话、触发脚本、怪物脚本在游戏内运行时报错,两种场景的处理方式有明显区别。
M2启动加载阶段弹出脚本错误,大多是脚本文件格式、路径、文件名或者数据库调用不匹配造成。首先检查脚本文件名称,文件名不能包含特殊符号、空格,部分引擎对中文文件名兼容性差,改成纯英文或者数字命名更稳妥。然后看文件编码,很多脚本保存的时候选用了错误编码,打开脚本文本,另存为的时候选择ANSI编码,编码不对会直接出现乱码报错,指令识别失败。接着核对脚本里的文件路径,路径分隔符只使用单斜杠,不要混用正反斜杠,路径里过长的文件夹名称也容易触发读取失败。
NPC脚本对话报错,进游戏点NPC就弹出错误提示,先找到这个NPC对应的脚本文件,定位到报错行号。常见问题是括号、引号没有成对,少写半边括号,引号前后不匹配,是最频繁的低级错误。然后检查变量,变量名称重复、变量没有提前定义、变量类型混用都会中断执行,数字类变量不要直接和文本拼接。还有跳转指令,goto、@标签的写法,标签名称大小写、文字必须完全一致,标签丢失或者标签写错,执行到对应位置就报错。部分引擎不支持过长的单行脚本,单行指令堆砌太多,需要拆分多行书写。
怪物触发脚本、击杀触发脚本报错,重点检查触发器写法,比如killmon、die、timer这类触发标识,标识写错,引擎不会识别触发逻辑。检查怪物数据库里的脚本编号,怪物DB里的script字段填写的编号,要和脚本文件夹里对应的脚本编号文件一一对应,编号不存在就会提示读取失败。怪物脚本里的掉落、给奖励、传送指令,核对物品名称,物品名字必须和物品数据库里面的名称完全一致,多一个空格、错一个字都会执行失败,识别不到物品就抛出错误。
功能脚本、登录脚本、定时器脚本报错,先看定时器设置,定时器间隔不能设置负数,循环定时器没有写关闭逻辑,长时间运行会内存溢出报错。登录触发脚本里面,不要放大量高消耗的逻辑,玩家上线瞬间批量执行复杂判断,容易造成引擎卡顿报错。检查全局变量使用,全局变量如果没有合理清理,大量堆积之后,后续调用变量会出现取值异常。
还有一类是脚本调用其他外部文件出错,比如读取文本列表、读取自定义配置文件,要确认目标文件存在,权限正常,文件内容格式规范,每行一条数据,不要有空行或者乱码字符。如果脚本里调用自定义函数,函数定义部分要放在调用之前,函数参数数量和调用时传入的参数数量必须保持一致,参数数量不对直接报错。
引擎版本不兼容也是很容易忽略的一点,同一段脚本,在不同引擎之间语法存在差异,有些指令在这个引擎可以正常运行,换到别的引擎就无法识别。拿到别人写好的脚本,先确认脚本适配的引擎类型,不要直接跨引擎导入使用,不兼容的指令需要替换成当前引擎支持的写法。
排查顺序可以按照固定流程来,先重启M2,看报错是否重复,偶尔一次报错有可能是临时读取异常,反复出现就是脚本本身问题。记下报错行号,直接打开对应脚本跳到该行,逐行检查符号、标签、物品名称。注释掉怀疑有问题的段落,分段测试,一段一段取消注释,定位到具体出错的指令。修改完成之后保存脚本,部分引擎需要重载脚本,不用重启整个服务端,在M2菜单里找到重载NPC脚本、重载怪物脚本、重载功能脚本选项执行,重载之后进游戏测试。
修改脚本的时候,不要一次性改动大量内容,一次只改一处,测试没问题再继续调整,一次性修改很多地方,报错之后很难找到问题源头。保存脚本之后,注意文本编辑器的换行符,部分编辑器默认的换行格式会让引擎识别出错,使用适配的文本工具打开编辑,不要用复杂的文档工具直接编辑脚本。
如果报错提示为找不到指定文件,除了核对路径,还要检查文件权限,文件被占用或者只读状态,引擎无法读取内容,也会触发报错。脚本里面的数值判断,注意数值范围,超出引擎支持的数值上限,也会出现异常中断。
处理完成之后,反复多场景测试,NPC多点几次,击杀对应怪物,登录账号测试登录触发,定时器等待时间到了观察是否正常执行,确认不再弹出报错,逻辑和预期效果一致才算修复完成。