脚本错误的弹窗标题、正文和报错位置,直接决定了应该从哪一层入手。客户端弹窗只写“当前页的脚本发生错误”或“Internet Explorer 脚本错误”,问题在本地IE内核或登录器缓存;M2控制台刷红字并给出具体文件路径和行号,根因在服务端脚本文件;两者都不占、只弹一个没有路径的“脚本错误”,多半是登录器自带脚本文件损坏或被杀软隔离。路径给得越具体,修复越直接;只给现象不给路径,先按客户端层处理,再向服务端推进。
进游戏之前先把弹窗压住。打开Internet选项,切到高级标签,勾选“禁用脚本调试(Internet Explorer)”和“禁用脚本调试(其他)”,取消“显示每个脚本错误的通知”,确定后重启登录器。这一步不修任何文件,只让系统静默忽略脚本解析异常,先拿到进入游戏的操作窗口。部分登录器在自身设置里也有“关闭脚本错误提示”的开关,一并勾上。如果弹窗在运行中反复阻断操作,任务管理器找到登录器相关进程下的脚本错误提示子进程,结束进程可以临时打断弹窗循环。
弹窗压住之后,立刻处理客户端侧最频繁的断点。关掉游戏和登录器,进入安装目录删除Cache、Temp、WebCache、Scripts这几个文件夹里的内容,文件夹本身保留;再用Internet选项的常规页删除临时文件、Cookie和脱机内容。老缓存里存的是上一版本的脚本编译结果,新版脚本加载后与新缓存直接冲突,清完能消掉相当一部分“更新后才出现”的弹窗。清缓存之后以管理员身份打开命令提示符,依次执行regsvr32 jscript.dll、regsvr32 vbscript.dll、regsvr32 actxprxy.dll、regsvr32 shdocvw.dll,每一条看到“DllRegisterServer 成功”再执行下一条,完成后重启电脑。Win10和Win11上jscript与vbscript宿主注册项在系统升级或清理工具运行后失效,所有依赖IE内核WebBrowser控件的登录器都会连续弹脚本错误,重注册是止住反复弹窗最直接的手段。接着在“启用或关闭Windows功能”里确认Internet Explorer 11处于勾选状态,哪怕日常只用Edge,登录器的公告页和活动面板仍然需要这个组件在位。
客户端处理完仍然弹,或者弹窗正文里带了服务端路径和行号,问题转入服务端。M2报错信息里出现“Can'tfind Market_Def\某NPC-3.txt”或类似路径缺失的提示,先在MirServer\Mir200\Envir\Market_Def下按文件名补建对应脚本,复制同目录下其他NPC脚本的基础格式,保存后在M2里重新加载NPC,不需要重启整个引擎。报错指向QuestDiary下的某个子目录和文本文件,同样按路径逐级补建文件夹和空白文本文件,文件名大小写与调用处保持一致。路径存在但引擎仍然报找不到文件,检查调用处写的是相对路径还是多层“..\”回溯,优先改成从Envir起算的直接路径,手动输入容易多一个点或少一个点,复制粘贴比重新敲一遍可靠。
文件路径没有问题,报错变成“Line XX:命令不存在”“未预期的标识符”或“参数数量错误”,查脚本本身的语法。用Notepad++打开报错指向的txt文件,Ctrl+G跳到对应行,先看命令前的#符号是否漏写,#say写成say、#give写成give都会直接触发“命令不存在”。再看条件结构和循环结构是否闭合,#IF下面没有跟条件就接#ACT、#SAY与#ENDSAY被截断、括号或引号不配对,都会让引擎在加载阶段直接拒绝整个脚本。引擎升级后出现大面积“找不到命令”,通常不是脚本写错,而是旧命令在新引擎中被取消或改名,比如ResetLoopCounter在新Blue引擎中已经移除,保留在脚本里就会逐行报错,批量搜索删除或替换成新引擎支持的写法即可。
变量类报错按“不存在”和“已存在”分开处理。提示“变量XXX不存在”,在报错脚本的头部补上VAR声明,声明类型与使用方式一致,INTEGER用于数值,STRING用于文本,同时确认SAVEVAR指定的保存路径下文件夹和txt文件真实存在。提示“变量XXX已存在”,说明同一个变量被声明了两次,打开相关脚本搜索变量名,只保留一处VAR声明,其余声明行删除或注释,使用该变量的行不动。脚本从别的引擎移植过来时,变量前缀与当前引擎保留字冲突也会触发同类报错,检查变量名是否以P、G、M、I、D、N、S、A等系统前缀开头,换成带业务含义的唯一名称,再重新加载。
M2报错里出现“[脚本死循环]”并伴随GOTO反复跳转,说明循环逻辑没有出口,引擎在反复执行同一段跳转后强制中断。打开报错指向的NPC脚本,找到GOTO目标标签,确认跳转条件中存在可以走出的分支,而不是无论条件真假都跳回同一行。部分引擎的死循环计数上限写在Mir200目录下的!Setup.txt中,ScriptGotoCountLimit的值决定引擎容忍多少次跳转后报错,但调高这个数值只是推迟报错,不能替代对循环出口的修复。把GOTO改成条件分支,或者在循环体内加入明确的终止条件,比单纯修改上限更彻底。
服务端脚本修复之后,在M2控制台使用“重新加载”功能而不是直接重启整个引擎,加载QFunction或指定NPC,观察红字是否消失。重新加载后红字不再出现,但对应NPC点击仍然无反应,回头核对MerChant.txt里该NPC登记的脚本文件名与Market_Def下的实际文件名是否完全一致,文件名多一个空格、地图编号写错、脚本已废弃但配置行还在,都会导致加载不报错而功能不执行。把MerChant.txt中无效的NPC配置行删除或注释,重新加载NPC,残留的静默失效会一并清掉。
网络抖动导致的单次脚本错误不需要动文件。登录器需要实时拉取页面代码,WiFi波动或代理干扰会让JS下载不完整就进入执行,表现为偶发一次弹窗后重启登录器即恢复。换有线连接、关闭VPN或代理、执行ipconfig /flushdns,观察弹窗是否还与网络状态同步出现。如果断网重连后立刻复发、换网络环境依然出现,问题就不在网络,回到缓存、组件和服务端文件三个方向继续查。单开正常、多开连续报错的情况,把多余窗口全部退出,等缓存写入落盘后再逐个启动,同时把登录器和游戏主程序的兼容模式设为Windows 7并勾选以管理员身份运行,避免权限不足导致脚本读取和写入中断。
排查顺序固定为:先看弹窗有没有给出文件路径,有路径直接进服务端查文件、语法和变量,没有路径先做Internet选项禁用脚本调试把弹窗压住,进游戏后清缓存、重注册jscript和vbscript、验证IE11组件在位。客户端层处理完仍然报错,再按服务端路径补建、命令替换、变量声明和死循环修复逐层推进。弹窗被压住不等于脚本恢复正常,真正让报错不再复发的是把缺失或写错的脚本文件补回来或改对,而不是让错误提示不再显示。

