传奇服务端脚本错误排查实录:M2报错定位与常见语法修复全流程

来源: 作者: 点击:
传奇出现脚本错误,表现通常是 M2Server 控制台弹红字、点 NPC 没反应、登录卡属性、杀怪不触发、地图事件失效、M2 启动到一半停住。错误源全部落在 Mir200\Envir 下的文本脚本里,按报错信息和文件分类直接定位修,不用重装引擎。

一、报错信息在哪看、怎么读
• 实时窗口:M2Server.exe 控制台滚动日志,红字格式一般为

[Error] Line 45 in QFunction-0.txt : Unknown command 'MOVAB'
或 脚本错误: [@MAIN] 第15行 段错误 格式不对 加载NPC失败: Market_Def\比奇老兵-0.txt
• 日志文件:Mir200\Log\ 下 -M2Server-日期.log、SystemLog.txt、ScriptError.log,搜 script error / load fail / Syntax error / Not Found / Invalid / Type Mismatch

- 关键信息三段:出错文件名 → 行号 → 错误类型(未知命令 / 标签不存在 / 变量未定义 / 参数错误 / 文件缺失)

二、脚本文件分布与高发目录
• Market_Def\ :NPC 对话脚本(比奇老兵-0.txt、福利使者.txt 等)

- QuestDiary\ :任务、活动、充值、回收、登录分支(可按子目录拆分)
• MapQuest_def\ :QFunction-0.txt(杀怪/捡物/死亡/使用物品触发)、QManage-0.txt(登录/下线/全局事件)

- MonItems\ :怪物爆率脚本(物品名/ID、数量、概率)
• Robot_def\ :RobotManage.txt 与定时机器人任务

• !Setup.txt :确认 QFunctionDir、脚本主目录指向正确 Envir 路径

三、高频错误类型与直修方案
1. 编码与换行符错误(最隐蔽)
所有 .txt 脚本必须 ANSI(简体下即 GBK),UTF-8 / UTF-8 BOM 必乱码或命令失效;换行用 Windows CRLF,LF 会被跳过。
修:Notepad++ 打开 → 格式 → 转为 ANSI / 转为 Windows 格式 → 覆盖保存

2. 命令拼写 / 大小写 / 空格错误
#ACT 写成 #ATC、CHECKITEM 拼错、MOV A0 100 写成 MOVA0 100、GIVE 写成 gvie、中文引号逗号混用。
修:对照引擎命令手册(Hero / GOM / GEE / V8 命令集不同),全命令大写,参数空格分隔,字符串用英文双引号

3. 结构标签错误
• [@Label] 必须顶格独占一行,GOTO / #CALL 指向的标签不存在 → 报 GOTO @xxx 不存在

- 同目录多文件都写 [@Main] → 跳转错乱,标签加前缀(@War_Main、@Tao_Main)
• #IF 无 #ACT / #ELSEACT、缺 #ENDIF、嵌套超引擎限制 → 段错误

- 行尾全角空格、零宽字符、隐藏 BOM → Notepad++ 开“显示所有字符”清掉

4. 变量未定义 / 作用域错
• 未 MOV 赋值直接 CHECK / EQUAL / LARGE → 判定异常或报错

- P0-P9 临时、D0-D9 / N 个人持久、G0-G9 全局、S 字符串混用;自定义变量与系统保留字重名
• 部分引擎要求开头 VAR 类型 HUMAN/GLOBAL 变量名 声明

修:统一命名,首次使用前置 MOV D0 0,跨会话数据别用 P 系临时变量

5. 物品 / 地图 / 怪物名与数据库不一致
脚本写 GIVE 屠龙 1,StdItems.DB 里是 屠龙刀;MAPMOVE 0 330 330 地图号不存在;MonItems 爆率文件怪物名拼错。
修:直接抄 DB 字段,或改用数字 ID(GIVE 10011 1),地图号核对 MapInfo.txt

6. 路径与 #CALL 引用错误
#CALL [\QuestDiary\功能\奖励.txt] @段 实际文件在 Market_Def\功能\ ;..\\ 多写一层;相对路径以 Envir 为根。
修:按报错路径逐层对目录,文件确实存在再改引用

7. 引擎版本命令不兼容
Hero 支持 CALC、旧 C2 只认 INC/DEC;[@OnMapEnterEx] 新引擎才有;S 变量上限 S49 超了报错。
修:确认当前 M2 引擎版本命令表,降级写法

8. 爆率文件格式错
MonItems\怪物.txt 标准:物品名 数量 概率(概率为 1/分母),物品 ID 错、概率写 0 或超范围、缺字段。
修:对照正常怪物文件格式抄

四、标准排查顺序(照做最快)
1. 抄 M2 红字:文件名 + 行号 + 错误类型
2. 开对应 txt,跳行号,看上下 5 行结构
3. 查编码(ANSI?CRLF?隐藏符?)
4. 查命令拼写、参数个数、引号、#IF/#ACT 配对
5. 查标签唯一、GOTO/#CALL 目标存在
6. 查物品/地图/怪物名与 DB 一致
7. 改完 M2 点“重载NPC / 重载登录脚本 / 重载QFunction”,不行再清 Log\ScriptCache.dat 重启 M2
8. 仍不明就分段注释(; 注释块)逐步取消定位

五、典型报错对照
• Unknown command 'XXX' → 拼错或引擎不支持该命令

• 变量未定义 / variable not defined → 未 MOV 初始化或未 VAR 声明

- GOTO @xxx 不存在 → 标签漏写或拼写不一致
• File not found → #CALL 路径错或文件没放对目录

• Syntax error / 脚本语句未闭合 → 缺引号、缺括号、#IF 无 #ACT

- NPC脚本加载失败 → 编码非 ANSI、头部 [@Main] 缺失、路径错
• Type Mismatch → 数字加引号 / 字符串没加引号 / 变量类型混用

改脚本前备份原文件,M2 开“显示脚本执行日志”可逐行跟执行流,复杂功能拆小段单独测,报错直接锁到行。