脚本报错在传奇服务端中分好几种类型,处理方式各不相同。常见的包括语法错误导致启动加载失败、死循环造成CPU飙升卡顿、脚本重载后不生效、以及路径或编码问题引发的加载异常。定位报错的第一步是看M2控制台的输出窗口,红色提示会直接给出出错的文件名和行号,顺着这条线索查下去比盲目翻脚本快得多。
## 启动加载类报错的处理
M2启动时提示“script error, load fail”或者找不到某个脚本文件,通常是因为版本里引用了不存在的脚本。报错信息会指明具体的路径,比如类似 `\功能NPC\功能NPC\功能NPC.txt@领取功能NPC` 这样的格式。去对应的目录下检查那个文件是否存在,不存在的话有两种处理方式:如果这个脚本是版本功能需要的,补上对应的脚本文件;如果它本身没什么用,去Merchant.txt里把调用这个NPC的配置删掉,报错就消失了。
还有一种启动报错是“Invalid Filename”这类文件名不合规的问题。GOM引擎对文件名要求比较严,脚本文件名里不能有中文、空格或者特殊符号,路径分隔符也要注意,反斜杠在某些配置里会引发解析错误。把文件名改成纯英文加下划线的格式,路径统一用正斜杠或者引擎要求的格式,保存后重启M2就能解决。
## 语法错误的排查方法
脚本写错语法是报错最常见的原因。传奇脚本的语法看起来简单,但有几个地方特别容易出问题。命令拼写错误是其一,比如把CHECKSKILL写成CHECKskills,或者命令名里的大小写不统一,引擎解析不了直接报错。变量名用了中文或者特殊符号也是高频问题,HERO引擎的用户变量必须加#USERVAR前缀,全局变量要加#GLOBALVAR,变量名只能包含字母数字和下划线。
条件判断段落的括号闭合也要检查。#IF和#ACT之间的逻辑,如果#IF后面跟了多个条件,每个条件是否都能正常解析。有时候脚本看起来没毛病,但某个条件用到了不存在的变量或者物品名,引擎在解析阶段就会失败。用M2控制台的脚本重载功能先把修改过的脚本重新加载一遍,加载过程中如果控制台出现红色报错,说明语法还有问题,根据提示的行号回去改。
## 死循环导致服务卡顿的定位
死循环是脚本错误里危害最大的一种,表现是CPU占用飙升、服务端响应变慢甚至崩溃。传奇脚本里的死循环通常有几个来源:状态机跳转条件没写完整,NPC在两个状态之间来回跳转停不下来;循环变量在循环体里忘了递增,while条件永远为真;递归调用没有设置出口条件。
定位死循环靠日志和堆栈采样。开启M2的脚本执行日志,重点看那些每秒执行次数异常高的脚本条目。GOM引擎的日志位置在MirServer/Mir200/Log/ScriptRun.log,可以设置过滤条件只记录执行时间超过50毫秒的脚本。如果日志里看到某个脚本每秒执行几百次,基本就是它了。找到之后检查循环结构,给每个循环加上最大迭代次数限制,或者在关键跳转处加上退出条件。
## 脚本修改后不生效的排查顺序
改了脚本但游戏里没反应,第一步是执行重载操作而不是重启。M2控制台点控制菜单里的重新加载,选择对应的脚本类型,NPC脚本选Market重载或者直接重载所有NPC,功能脚本选QFunction重载。重载完小退角色重新登录测试。
重载后还不生效,检查编码格式。传奇脚本要用ANSI编码保存,用UTF-8带BOM格式保存的文件在引擎里会解析出乱码或者直接加载失败。用Notepad++打开脚本,编码菜单里选转为ANSI编码再保存。路径和文件名也要核对,NPC脚本必须放在Mir200\Envir\Market_Def目录下,文件名要和Merchant.txt里的配置完全一致,大小写都不能差。
## 角色状态异常的脚本修复
有些脚本错误不报错但功能不正常,比如破复活脚本执行后角色复活了但不能动、不能放技能。这类问题的根源是脚本绕过了引擎的标准复活流程,状态字段没有重置。GOM引擎的复活逻辑会调用ClearStatus、重置动作状态、清空技能CD、刷新Buff列表这些操作,自定义脚本如果只设置了HP和MP,角色看起来活着但实际上还卡在死亡状态。
修复需要补齐状态重置的步骤。把SetActionState重置为站立状态、清空技能冷却映射、刷新Buff列表,并且要调用SendUpdateStatus和SendSkillCD把新状态同步给客户端。少一步客户端和服务端的状态就对不上,表现就是血条不动、技能按了没反应、角色漂移。
传奇脚本错误修复方法与各类报错排查解决指南
来源:
作者:
点击:

