M2server运行时若提示“错误变量信息”或脚本执行异常,通常源于QFunction.txt、QManage.txt等脚本文件中变量使用不当、语法格式错误或引擎兼容性问题。需从变量定义、调用逻辑和文件结构三方面逐项核查。
一、变量命名与作用域错误
非法字符:变量名仅支持字母、数字、下划线,禁止使用中文、空格或符号(如$血量、Var-1)。正确示例:HPLAYER_HP。
作用域混淆:
A0-A9 为角色临时变量,重启失效;
G0-G9 为队伍共享变量;
S0-S99 为服务器全局变量。
若在组队脚本中误用A0代替G0,会导致成员间数据不同步。
未初始化直接比较:
#IF
LARGE A0 100 ; 若A0未赋值,默认为0,但部分引擎视为无效
应先设默认值:MOV A0 0。
二、脚本语法格式问题
标签缺失或重复:每个[@Label]必须唯一,且#ACT/#SAY指令需严格对齐。例如:
[@OnKillMob]
#IF
CHECKITEM 10 1
#ACT
GIVE 20 1
若#ACT前多出空格或缺少#IF,M2server将报“脚本错误”。
括号与引号不匹配:字符串参数必须用双引号包裹,如:
SENDMSG 5 "任务完成"
单引号或无引号会触发解析失败。
指令拼写错误:如MOVA0 100(缺空格)应为MOV A0 100;SENDMS G(漏字母)应为SENDMSG。
三、引擎版本兼容性冲突
高版本指令用于旧引擎:如Hero引擎支持CALC运算,但早期C2引擎仅支持ADD/SUB。
变量范围超限:部分引擎限制S变量最大为S49,若使用S50则报错。
事件标签不支持:如[@OnMapEnterEx]仅在特定版本可用,旧版需改用[@OnMapEnter]。
四、文件编码与换行符异常
脚本文件必须保存为ANSI编码(简体中文系统下即GBK),UTF-8会导致中文注释乱码并引发解析中断。
换行符需为Windows格式(CRLF),Linux格式(LF)可能使部分引擎跳过指令。可用Notepad++转换:菜单栏“编辑”→“文档格式”→“转换为Windows格式”。
五、调试定位具体错误行
查看M2server控制台输出,错误信息通常包含文件名及近似行号,如:
Error in QFunction.txt line 142: Invalid variable 'H%'
在可疑代码段前后插入测试消息:
#ACT
SENDMSG 7 "Debug: Before MOV A0"
MOV A0 100
SENDMSG 7 "Debug: After MOV A0"
通过客户端是否收到消息判断执行断点。
逐段注释代码(在行首加;),缩小错误范围。
六、常见错误示例与修正
错误1:#IF EQUAL A0(缺少比较值)
修正:#IF EQUAL A0 1
错误2:GIVE "命运之书" 1(物品需用Idx)
修正:GIVE 0 1
错误3:[@Main] 标签后直接写SENDMSG(缺少#ACT)
修正:
[@Main]
#ACT
SENDMSG 5 "欢迎"
确保所有脚本文件通过文本编辑器(非Word)编写,避免隐藏格式符。修改后重启M2server使变更生效,切勿热加载未验证脚本。

