传奇脚本报错常见类型排查步骤文件核对与修改修复实操教程

来源: 作者: 点击:
脚本出现报错,优先记录弹出的提示文字,不同报错对应的问题源头不一样,先区分是M2加载报错、NPC对话报错、触发脚本报错,还是怪物、物品相关脚本执行报错,不要直接改动代码,先备份整套脚本文件,防止修改之后原有内容无法恢复。
先处理文件读取类报错,提示文件名无效、找不到文件、读取失败的时候,检查脚本里面书写的文件路径和文件名,区分大小写,部分引擎对字母大小写敏感,路径里面多余空格、中文符号、全角逗号引号都会造成读取失败,脚本内的路径分隔统一使用英文斜杠,不要使用中文斜杠。查看对应的txt文件是否存在,有没有被杀毒程序隔离,文件编码也会引发乱码报错,脚本文件需要保存为ANSI编码,使用记事本打开,另存为的时候选择对应编码,不要使用UTF8格式。
NPC对话类报错大多集中在对话标签、跳转标签、参数格式,常见的是[@main]、[@xxx]这类标签重复或者缺失,同一个脚本里面不能出现两个相同的标签名称,标签后面不要附带多余文字。检查goto、call跳转指令,跳转的目标标签必须在当前脚本内,call调用外部脚本时,外部脚本路径和标签都要写对,缺少标签会直接中断脚本。对话语句里面的括号、冒号、等号全部使用英文半角符号,中文符号会直接导致脚本解析中断,检查对话文本里面有没有换行异常,不要在一行指令中间随意换行。
变量相关报错,提示变量不匹配、参数数量不对,需要核对指令后面的参数个数,比如给物品、给金币、检测等级的指令,每个指令都有固定的参数顺序,多写或者少写数字都会报错。局部变量和全局变量不要混用,局部变量只在单次脚本对话生效,跨脚本调用需要使用全局变量,变量名称不要使用引擎保留关键字,不要用纯数字作为变量名。检测类指令,比如CHECKITEM、CHECKGOLD、CHECKLEVEL,检测物品时物品名称要和物品数据库里面的名称完全一致,多一个空格都会判定物品不存在。
物品触发、拾取触发、双击触发脚本报错,先核对物品数据库的Anicount触发编号,脚本里面的触发编号和数据库填写的编号必须对应,编号重复会造成多个物品共用一套脚本,执行逻辑混乱。双击物品脚本里面,执行give指令的时候,物品名称严格对照DB,区分同名不同版本的物品,物品名称中间的空格不能随意增减。拾取触发脚本注意触发范围,不要在脚本里面加入大量延时循环指令,循环没有终止条件,会持续占用引擎资源,引发引擎卡顿或者直接报错退出。
怪物脚本报错,包括怪物死亡触发、怪物攻击触发、怪物移动触发,检查怪物数据库里面的触发脚本编号,编号指向的脚本文件和标签是否存在。死亡触发脚本里面,爆物指令的格式不能写错,爆物列表里面物品名称、数量、概率参数顺序不能颠倒,不要在怪物死亡脚本里面添加大量复杂跳转和弹窗对话,怪物批量死亡的时候,脚本并发执行很容易触发异常。怪物AI脚本里面,技能释放、召唤小怪指令参数超标,也会弹出range check error这类提示,下调召唤数量、调整技能触发间隔可以缓解。
功能类脚本,比如传送、回收、兑换、称号、泡点脚本,报错大多来自地图编号、坐标格式,地图编号要和地图列表文件一致,坐标书写格式是X,Y,中间英文逗号,不能有多余空格。传送指令检查目标地图是否开放,地图禁止进入标记开启时,脚本执行传送就会报错。回收脚本核对物品名称,批量回收的时候不要把不存在的物品写进列表,回收金币、元宝数值不要超过引擎支持的数值上限,数值溢出会直接报错。
引擎日志是排查最直接的依据,打开日志记录,重新加载脚本,日志会标注出错的脚本文件名、行数和报错代码,顺着日志定位到对应行,比逐行翻看效率高很多。修改完成之后,不要直接重启服务端,优先使用M2里面的重载脚本功能,重载NPC脚本、重载怪物脚本、重载物品脚本,重载之后测试功能,重载依旧报错,再去看日志新增记录。
还有一类隐性报错,不会弹出提示框,但是功能失效,点NPC没有反应,双击物品没有效果,怪物不按脚本执行动作。这类情况先检查脚本文件权限,文件被锁定只读的时候,引擎无法读取更新内容,右键文件取消只读勾选。检查脚本换行符,部分文本编辑器保存之后换行符异常,引擎识别不了换行,把脚本复制到系统自带记事本重新保存。
多人同时调用同一个脚本,频繁触发会出现连接中断、脚本执行异常,需要减少脚本内延时指令,拆分复杂逻辑,长脚本拆分成多个子脚本用call调用,减少单段脚本的执行压力。不要在脚本里面嵌套多层无限循环,缺少判断退出条件,持续占用资源,严重时会造成M2直接停止运行。
修改脚本的时候遵循一次只改一处的方式,改完重载测试,不要一次性批量修改大量内容,批量改动之后报错很难定位源头。如果是复制过来的现成脚本,先清空里面多余的注释符号,部分注释符号书写错误,引擎会把注释内容识别成指令,引发解析失败,注释前面的分号必须是英文分号。
全部排查完成,功能测试正常之后,再次备份脚本文件夹,后续修改都在备份副本上操作,避免再次出现问题之后没有原始文件回滚。