脚本错误在引擎启动、NPC交互、触发任务、执行功能的时候频繁出现,表现形式分为M2控制台输出红色报错文字、NPC点击无响应、对话弹窗错乱、功能指令不执行、脚本死循环、部分任务流程中断,部分严重错误还会造成服务端卡顿,不会直接让整个服务端关闭,但是对应的游戏功能直接失效,修复脚本错误不能直接盲目修改代码,优先读取报错日志定位问题来源,再分类型逐一处理问题点。
排查脚本错误第一步是读取M2Server控制台报错信息,控制台红色报错会标注出错NPC名称、地图坐标、脚本文件路径、出错行号以及错误描述,根据给出的行号直接打开对应脚本文件,跳转至对应行数附近检查内容,不要大范围改动无关代码。除控制台实时提示之外,服务端MirServer\Mir200\Log目录下的ScriptError.log文件会完整记录全部脚本异常,关闭服务端之后打开日志文件,可以回看全部报错记录,适合复现难度较高的偶发脚本错误。开启脚本调试模式之后,还会生成调试日志,能够看到脚本跳转执行过程,方便定位逻辑跳转异常问题。
语法类脚本错误是出现频率最高的类型,常见包含全角半角符号混用、关键字拼写错误、标签缺失、判断语句没有闭合、跳转标签不存在。#IF、#ACT、#ELSEACT这类关键字必须使用半角英文符号,使用中文输入法输入符号会直接触发报错,@开头的跳转标签名称大小写需要保持前后一致,脚本内调用的@标签必须在文件内真实存在,缺少对应的[@标签]片段就会提示找不到脚本段。IF判断结构必须完整配对,每一组条件逻辑需要对应结束标记,漏写闭合标记会报行号错乱错误。修改脚本不要使用系统自带记事本编辑,自带记事本容易产生编码异常,使用专业文本编辑器,开启显示全部字符功能,可以查看看不见的空格、换行、隐藏特殊字符,全角空格、多余制表符都会引发脚本解析失败。脚本文件保存编码需要匹配引擎要求,多数引擎脚本文件需要ANSI编码,保存为UTF‑8带BOM格式,会直接造成整份脚本加载异常,另存文件的时候手动选择正确编码格式,保存完成之后重新启动M2服务端加载脚本。
路径引用错误也是高频报错,脚本当中#call调用外部脚本文件,填写的文件路径必须和硬盘实际目录完全匹配,区分大小写,目录层级、文件名不能多写或者少写字符。QuestDiary目录下任务脚本,NPC配置文件指向的脚本路径出错,会出现点击NPC没有任何反应,控制台报找不到脚本文件。核对路径的时候直接复制硬盘上真实文件路径粘贴到脚本当中,减少手动输入带来的字符错误,移动脚本文件位置之后,所有调用该文件的位置都要同步修改路径地址,只移动文件不改调用路径依旧持续报错。
资源引用类错误,脚本代码语法本身没有问题,但是脚本内部调用物品名称、怪物名称、地图编号不存在,就会抛出脚本错误。脚本当中使用GIVE给予物品、MONGEN刷怪物、MAP跳转地图,这些名称编号必须和服务端数据库、地图文件内定义完全一致,名字多一个空格、文字写错字,引擎识别不到资源,执行这条指令的时候直接报错。处理这类错误,打开对应物品数据库、怪物数据库、地图列表,核对脚本内填写的名称编号,修改为数据库内真实存在内容即可。
脚本死循环报错,现象为控制台持续输出脚本死循环提示,严重会拖慢服务端运行速度,大多由GOTO跳转逻辑造成,脚本跳转之后没有退出条件,代码无限反复执行同一段内容。单段#act下面不能同时写多条GOTO跳转命令,条件分支没有出口也会触发循环报错。可以修改!Setup.txt当中ScriptGotoCountLimit参数调整循环上限,但是修改参数只是临时规避提示,根源还是改写脚本逻辑,补充退出条件,避免无限跳转,不能单纯依靠调大参数掩盖脚本逻辑缺陷。
引擎兼容性引发的脚本错误,一份脚本在A引擎可以正常运行,更换另外版本引擎就持续报错,原因是脚本使用了该引擎不支持的脚本命令、内置变量。不同引擎支持的指令库存在差异,旧引擎不支持新版扩展脚本命令,新版本引擎淘汰部分老旧指令。修复方式,查阅对应引擎命令说明书,把不兼容的命令替换为当前引擎支持写法,找不到替代命令的情况下,删减对应的功能片段。第三方插件实现的脚本功能,如果插件没有正常加载启用,相关脚本命令全部失效,同样报脚本错误,确认插件文件完整,插件开关配置开启之后再重启服务端测试。
修改脚本完成之后,必须重启M2Server服务端,脚本文件才会重新加载生效,只保存文本文件不重启服务端,修改不会体现出来。部分引擎支持热加载NPC脚本,热加载只针对NPC配置,任务类、功能类脚本依旧需要重启服务端。修改脚本之前备份原始脚本文件,出现越改错误越多的情况,可以直接回滚还原备份文件,对比前后差异缩小故障范围。
偶发间歇性脚本错误,服务端刚启动没有报错,运行一段时间之后随机出现,这类问题很难直接从静态代码看出问题,需要依靠ScriptDebug.log调试日志,复现错误场景,观察脚本执行流程,多为变量没有初始化、多人并发触发同一个脚本逻辑引发。优化脚本增加条件判断,校验变量状态,规避异常条件下执行脚本指令。
完成全部修复之后,清空Log文件夹旧日志,重启整套服务端,观察M2控制台不再输出对应红色报错,进入游戏反复触发对应NPC、任务、功能,确认功能完整运行,代表脚本错误修复完成。不同引擎版本报错文字、日志存储路径会有细微差别,全部以服务端实际输出信息作为修复依据。

