错误诊断:变量类型不匹配
根据报错信息,这是典型的变量名不合法或变量类型冲突。MOV指令将“法师”这个字符串赋值给了A551,但A开头的变量通常用作个人自定义变量。INC指令尝试将G507增加2,但G变量是全局变量,操作不当也会报错。
变量命名与使用规则
不同引擎的变量命名规范不同,但通用规则如下:
变量类型通用格式(HERO/GEE引擎)使用范围常见错误
个人变量A(数字)如A1A100私人属性,同账号可共享数字超出范围,混用字符串
个人临时变量S(字符串)如S1S10临时存储,下线清空与P、M等类型混淆
全局变量G(数字)如G1G200全服唯一,用于活动开关重复INC导致数值过大
行会变量H(数字)如H1H10行会内部使用与G变量冲突
核心规则:
•变量名后必须接纯数字,如A100正确,A一百错误。
•数字变量(A、G、H)只能赋值或计算数字,不能存放字符串。
•字符串变量(S)可存文本,但不支持数学运算。
•变量值在脚本引擎中有上限,INCG1002可能因G100已达最大值而溢出。
修复方案:修正变量类型
假设你原脚本意图是:记录玩家职业,并对全服某个计数+2。
原错误脚本(示例):
#IF
CHECKJOBwarrior
#ACT
MOVA551战士
INCG5072
修正后的正确脚本:
#IF
CHECKJOBwarrior
#ACT
MOVS1战士;用S变量(字符串)存储职业名
INCG5072;检查G507是否已接近引擎上限(如1000万)
新增脚本的正确放置步骤
第一步:定位NPC脚本文件
脚本错误发生在竞价地图这个NPC。需找到其脚本文件:
1.打开服务端Mir200\Envir\Merchant.txt,查找包含“竞价地图”的行。
2.其最后一列(如.../竞价管理员3330321竞价地图-1)指明了脚本位置。
3.前往Mir200\Envir\Npc_def\目录,找到对应文件(如竞价管理员-3.txt)。
第二步:编辑脚本并设置变量
用Notepad++打开文件(切勿用Windows记事本),在适当位置(如[@main]段下方)添加。例如,想实现“点击按钮记录职业并增加全服计数”:
[@main]
我是竞价管理员。\\
<记录职业/@记录职业>\\
[@记录职业]
#IF
CHECKJOBwarrior
#ACT
MOVS1战士
INCG5072
SENDMSG6提示:您的职业[战士]已记录,全服计数+2。
BREAK
#IF
CHECKJOBwizard
#ACT
MOVS1法师
INCG5072
SENDMSG6提示:您的职业[法师]已记录,全服计数+2。
BREAK
#IF
CHECKJOBtaoist
#ACT
MOVS1道士
INCG5072
SENDMSG6提示:您的职业[道士]已记录,全服计数+2。
BREAK
#ELSEACT
SENDMSG6提示:职业判定失败。
BREAK
第三步:变量初始化与边界检查
在QManage.txt的[@Login]段添加变量初始化,避免NULL错误:
[@Login]
#IF
EQUALG507
#ACT
MOVG5070
同时,在INC操作前增加上限检查:
#IF
SMALLG5079999998
#ACT
INCG5072
SENDMSG6增加成功,当前全服计数:<S$G507>。
#ELSEACT
SENDMSG6提示:全服计数已达上限,无法增加。
引擎兼容性排查
若上述修正后仍报错,需检查引擎差异:
•GEE引擎:支持INCG5072,也支持MOVG5072,但G变量默认需在QuestDiary\G变量目录下声明。
•GOM引擎:变量操作类似,但字符串需用S变量,如MOVS$职业法师。
•V8M2引擎:需注意变量值范围,G变量建议在0-1000000之间。
验证与调试
1.修改后,保存脚本文件(务必确认编码为ANSI)。
2.重启M2Server,观察启动日志是否还有报错。
3.在游戏中与NPC对话,点击测试按钮,看消息提示是否正常。
4.可临时添加调试命令,如#ACTMOVS$测试成功并在聊天框输出<S$测试>,验证脚本块是否被执行。
若遵循以上步骤,MOV和INC的变量错误基本可解决。关键在于:用S变量存文本,用G/A变量存数字,并在INC前检查数值边界。
根据报错信息,这是典型的变量名不合法或变量类型冲突。MOV指令将“法师”这个字符串赋值给了A551,但A开头的变量通常用作个人自定义变量。INC指令尝试将G507增加2,但G变量是全局变量,操作不当也会报错。
变量命名与使用规则
不同引擎的变量命名规范不同,但通用规则如下:
变量类型通用格式(HERO/GEE引擎)使用范围常见错误
个人变量A(数字)如A1A100私人属性,同账号可共享数字超出范围,混用字符串
个人临时变量S(字符串)如S1S10临时存储,下线清空与P、M等类型混淆
全局变量G(数字)如G1G200全服唯一,用于活动开关重复INC导致数值过大
行会变量H(数字)如H1H10行会内部使用与G变量冲突
核心规则:
•变量名后必须接纯数字,如A100正确,A一百错误。
•数字变量(A、G、H)只能赋值或计算数字,不能存放字符串。
•字符串变量(S)可存文本,但不支持数学运算。
•变量值在脚本引擎中有上限,INCG1002可能因G100已达最大值而溢出。
修复方案:修正变量类型
假设你原脚本意图是:记录玩家职业,并对全服某个计数+2。
原错误脚本(示例):
#IF
CHECKJOBwarrior
#ACT
MOVA551战士
INCG5072
修正后的正确脚本:
#IF
CHECKJOBwarrior
#ACT
MOVS1战士;用S变量(字符串)存储职业名
INCG5072;检查G507是否已接近引擎上限(如1000万)
新增脚本的正确放置步骤
第一步:定位NPC脚本文件
脚本错误发生在竞价地图这个NPC。需找到其脚本文件:
1.打开服务端Mir200\Envir\Merchant.txt,查找包含“竞价地图”的行。
2.其最后一列(如.../竞价管理员3330321竞价地图-1)指明了脚本位置。
3.前往Mir200\Envir\Npc_def\目录,找到对应文件(如竞价管理员-3.txt)。
第二步:编辑脚本并设置变量
用Notepad++打开文件(切勿用Windows记事本),在适当位置(如[@main]段下方)添加。例如,想实现“点击按钮记录职业并增加全服计数”:
[@main]
我是竞价管理员。\\
<记录职业/@记录职业>\\
[@记录职业]
#IF
CHECKJOBwarrior
#ACT
MOVS1战士
INCG5072
SENDMSG6提示:您的职业[战士]已记录,全服计数+2。
BREAK
#IF
CHECKJOBwizard
#ACT
MOVS1法师
INCG5072
SENDMSG6提示:您的职业[法师]已记录,全服计数+2。
BREAK
#IF
CHECKJOBtaoist
#ACT
MOVS1道士
INCG5072
SENDMSG6提示:您的职业[道士]已记录,全服计数+2。
BREAK
#ELSEACT
SENDMSG6提示:职业判定失败。
BREAK
第三步:变量初始化与边界检查
在QManage.txt的[@Login]段添加变量初始化,避免NULL错误:
[@Login]
#IF
EQUALG507
#ACT
MOVG5070
同时,在INC操作前增加上限检查:
#IF
SMALLG5079999998
#ACT
INCG5072
SENDMSG6增加成功,当前全服计数:<S$G507>。
#ELSEACT
SENDMSG6提示:全服计数已达上限,无法增加。
引擎兼容性排查
若上述修正后仍报错,需检查引擎差异:
•GEE引擎:支持INCG5072,也支持MOVG5072,但G变量默认需在QuestDiary\G变量目录下声明。
•GOM引擎:变量操作类似,但字符串需用S变量,如MOVS$职业法师。
•V8M2引擎:需注意变量值范围,G变量建议在0-1000000之间。
验证与调试
1.修改后,保存脚本文件(务必确认编码为ANSI)。
2.重启M2Server,观察启动日志是否还有报错。
3.在游戏中与NPC对话,点击测试按钮,看消息提示是否正常。
4.可临时添加调试命令,如#ACTMOVS$测试成功并在聊天框输出<S$测试>,验证脚本块是否被执行。
若遵循以上步骤,MOV和INC的变量错误基本可解决。关键在于:用S变量存文本,用G/A变量存数字,并在INC前检查数值边界。

