你贴出来的这段脚本,报错信息指向`[@保管员]`这个NPC对话段,具体错误是`[脚本参数不正确]Cmd:CHECKOFGUILD`。这说明M2在执行到某一行命令时,命令格式不对或者参数缺失。下面把整个脚本拆开,一行一行过,把错误的地方全揪出来改掉。
**第一步:先看报错信息锁定问题命令**
报错原文:
`[脚本参数不正确]Cmd:CHECKOFGUILDNPC名称:QManage地图:0座标:0:0参数1:参数2:参数3:参数4:参数5:`
这告诉你两件事:
1.出问题的命令是`CHECKOFGUILD`。
2.这个命令执行时,参数1到参数5全是空的,所以引擎报“参数不正确”。
**第二步:在脚本里找到`CHECKOFGUILD`的位置**
你脚本里有一大段是`[@保管员]`的对话显示,但报错是在`[@A400]`段里。看这一段:
```
[@A400]
#IF
ONLINELONGMIN>2
CheckAttackMode1
EQUALA400<$USERNAME>
#ACT
POWERRATE10009999999
CLOSE
```
这里根本没有`CHECKOFGUILD`啊?那问题出在哪?
有两种可能:
1.**脚本不完整**:你贴出来的只是部分内容,真正的`[@A400]`段里可能还有其他`#IF`条件,其中一条就是`CHECKOFGUILD`,而且参数没写全。
2.**隐含错误**:`CLOSE`命令用在这里不合适,`CLOSE`通常用在对话段关闭窗口,在`#ACT`里用`CLOSE`可能会导致脚本逻辑混乱,但不会直接报`CHECKOFGUILD`错。
**第三步:检查`CHECKOFGUILD`命令的正确用法**
`CHECKOFGUILD`是检测玩家是否在行会的命令,正确格式是:
`CHECKOFGUILD行会名称`
比如:
`CHECKOFGUILD沙巴克`检测玩家是否在“沙巴克”行会。
如果后面不跟行会名称,或者行会名称用变量但变量是空的,就会报参数不正确。
所以,你要找的是:在`[@A400]`段或者整个脚本里,有没有一行写着`CHECKOFGUILD`但后面没东西,或者后面跟了个变量但变量没赋值。
**第四步:修复`[@A400]`段的其他问题**
不管`CHECKOFGUILD`藏在哪里,你这段`[@A400]`本身就有问题。看这几行:
```
#IF
ONLINELONGMIN>2
CheckAttackMode1
EQUALA400<$USERNAME>
```
**问题1:`ONLINELONGMIN`用法**
`ONLINELONGMIN`是检测在线分钟数,后面应该跟数字。`ONLINELONGMIN>2`这种写法在某些引擎里不支持,正确的应该是`ONLINELONGMIN3`(代表在线大于3分钟)。写成`>2`引擎可能不认。
**问题2:`CheckAttackMode1`**
`CheckAttackMode`是检测攻击模式,参数1代表和平模式。这行本身没错,但要确保这个命令在你引擎里存在。
**问题3:`EQUALA400<$USERNAME>`**
`EQUAL`是比较两个值是否相等。这里是把A400变量的值和当前玩家名字比较。A400变量在脚本开头被赋值了两次:
```
movA400不在线
movA400屌丝
```
先赋值“不在线”,马上又被“屌丝”覆盖。最后A400里存的是“屌丝”。那么`EQUALA400<$USERNAME>`就相当于在问“屌丝”是否等于当前玩家名字。除非玩家名字叫“屌丝”,否则永远不成立。
这显然是逻辑错误。
**第五步:给出修正后的脚本**
假设你的本意是:检测玩家在线超过2分钟,且攻击模式不是和平,且某个条件成立,然后给玩家加攻击倍数。下面给一个修正版,去掉有问题的命令,用标准写法重写。
**修正版QManage.txt片段**
```
[@保管员]
#IF
#ACT
CloseBigDialogBox
#SAY
您好。我是仓库保管员。为了您的仓库又方便又安全。\
我为您提供以下仓库服务功能:\
<存放物品/@storage>\
<取回物品/@getback>\
<仓库密码/@仓库命令>\
<捆/@mbind>各种卷书和药水\
<离开/@exit>\
[@exit]
#IF
#ACT
movA400不在线
movA400屌丝
GOTO@A400
[@A400]
#IF
ONLINELONGMIN3
CheckAttackMode1
#ACT
POWERRATE10009999999
SENDMSG6你获得了1000倍攻击力,持续9999999分钟
CLOSE
#ELSESAY
你不满足条件,无法获得攻击倍数。\
<返回/@保管员>
```
**修改说明**:
1.删掉了`EQUALA400<$USERNAME>`,因为A400的值“屌丝”和玩家名字比较没有意义。
2.`ONLINELONGMIN>2`改成了`ONLINELONGMIN3`,标准写法。
3.加了`#ELSESAY`让不满足条件时有提示。
4.`[@exit]`段里`GOTO@A400`之后,`[@A400]`执行完应该返回,但`GOTO`不会自动返回,所以`[@A400]`里用了`CLOSE`结束对话,逻辑上合理。
**第六步:如果还有`CHECKOFGUILD`报错,去这里找**
在你整个QManage.txt文件里,搜索`CHECKOFGUILD`,找到它的位置。很可能它藏在某个`#IF`下面,而且后面是空的或者用了变量。
比如:
```
#IF
CHECKOFGUILD
#ACT
...
```
这种就是错的,必须改成:
```
#IF
CHECKOFGUILD沙巴克
#ACT
...
```
或者如果行会名是变量:
```
#IF
CHECKOFGUILD<$STR(S10)>
#ACT
...
```
前提是S10里已经存了正确的行会名字。
**第七步:重新加载脚本并测试**
改完保存文件,在M2上点“重新加载所有脚本”,或者重启M2。然后进游戏找保管员NPC对话,看报错还出不出。
如果还出,说明`CHECKOFGUILD`在别的地方。继续搜索整个`Envir`文件夹,把所有脚本文件都搜一遍,找到那行错误的命令,按上面的格式改好。
**第一步:先看报错信息锁定问题命令**
报错原文:
`[脚本参数不正确]Cmd:CHECKOFGUILDNPC名称:QManage地图:0座标:0:0参数1:参数2:参数3:参数4:参数5:`
这告诉你两件事:
1.出问题的命令是`CHECKOFGUILD`。
2.这个命令执行时,参数1到参数5全是空的,所以引擎报“参数不正确”。
**第二步:在脚本里找到`CHECKOFGUILD`的位置**
你脚本里有一大段是`[@保管员]`的对话显示,但报错是在`[@A400]`段里。看这一段:
```
[@A400]
#IF
ONLINELONGMIN>2
CheckAttackMode1
EQUALA400<$USERNAME>
#ACT
POWERRATE10009999999
CLOSE
```
这里根本没有`CHECKOFGUILD`啊?那问题出在哪?
有两种可能:
1.**脚本不完整**:你贴出来的只是部分内容,真正的`[@A400]`段里可能还有其他`#IF`条件,其中一条就是`CHECKOFGUILD`,而且参数没写全。
2.**隐含错误**:`CLOSE`命令用在这里不合适,`CLOSE`通常用在对话段关闭窗口,在`#ACT`里用`CLOSE`可能会导致脚本逻辑混乱,但不会直接报`CHECKOFGUILD`错。
**第三步:检查`CHECKOFGUILD`命令的正确用法**
`CHECKOFGUILD`是检测玩家是否在行会的命令,正确格式是:
`CHECKOFGUILD行会名称`
比如:
`CHECKOFGUILD沙巴克`检测玩家是否在“沙巴克”行会。
如果后面不跟行会名称,或者行会名称用变量但变量是空的,就会报参数不正确。
所以,你要找的是:在`[@A400]`段或者整个脚本里,有没有一行写着`CHECKOFGUILD`但后面没东西,或者后面跟了个变量但变量没赋值。
**第四步:修复`[@A400]`段的其他问题**
不管`CHECKOFGUILD`藏在哪里,你这段`[@A400]`本身就有问题。看这几行:
```
#IF
ONLINELONGMIN>2
CheckAttackMode1
EQUALA400<$USERNAME>
```
**问题1:`ONLINELONGMIN`用法**
`ONLINELONGMIN`是检测在线分钟数,后面应该跟数字。`ONLINELONGMIN>2`这种写法在某些引擎里不支持,正确的应该是`ONLINELONGMIN3`(代表在线大于3分钟)。写成`>2`引擎可能不认。
**问题2:`CheckAttackMode1`**
`CheckAttackMode`是检测攻击模式,参数1代表和平模式。这行本身没错,但要确保这个命令在你引擎里存在。
**问题3:`EQUALA400<$USERNAME>`**
`EQUAL`是比较两个值是否相等。这里是把A400变量的值和当前玩家名字比较。A400变量在脚本开头被赋值了两次:
```
movA400不在线
movA400屌丝
```
先赋值“不在线”,马上又被“屌丝”覆盖。最后A400里存的是“屌丝”。那么`EQUALA400<$USERNAME>`就相当于在问“屌丝”是否等于当前玩家名字。除非玩家名字叫“屌丝”,否则永远不成立。
这显然是逻辑错误。
**第五步:给出修正后的脚本**
假设你的本意是:检测玩家在线超过2分钟,且攻击模式不是和平,且某个条件成立,然后给玩家加攻击倍数。下面给一个修正版,去掉有问题的命令,用标准写法重写。
**修正版QManage.txt片段**
```
[@保管员]
#IF
#ACT
CloseBigDialogBox
#SAY
您好。我是仓库保管员。为了您的仓库又方便又安全。\
我为您提供以下仓库服务功能:\
<存放物品/@storage>\
<取回物品/@getback>\
<仓库密码/@仓库命令>\
<捆/@mbind>各种卷书和药水\
<离开/@exit>\
[@exit]
#IF
#ACT
movA400不在线
movA400屌丝
GOTO@A400
[@A400]
#IF
ONLINELONGMIN3
CheckAttackMode1
#ACT
POWERRATE10009999999
SENDMSG6你获得了1000倍攻击力,持续9999999分钟
CLOSE
#ELSESAY
你不满足条件,无法获得攻击倍数。\
<返回/@保管员>
```
**修改说明**:
1.删掉了`EQUALA400<$USERNAME>`,因为A400的值“屌丝”和玩家名字比较没有意义。
2.`ONLINELONGMIN>2`改成了`ONLINELONGMIN3`,标准写法。
3.加了`#ELSESAY`让不满足条件时有提示。
4.`[@exit]`段里`GOTO@A400`之后,`[@A400]`执行完应该返回,但`GOTO`不会自动返回,所以`[@A400]`里用了`CLOSE`结束对话,逻辑上合理。
**第六步:如果还有`CHECKOFGUILD`报错,去这里找**
在你整个QManage.txt文件里,搜索`CHECKOFGUILD`,找到它的位置。很可能它藏在某个`#IF`下面,而且后面是空的或者用了变量。
比如:
```
#IF
CHECKOFGUILD
#ACT
...
```
这种就是错的,必须改成:
```
#IF
CHECKOFGUILD沙巴克
#ACT
...
```
或者如果行会名是变量:
```
#IF
CHECKOFGUILD<$STR(S10)>
#ACT
...
```
前提是S10里已经存了正确的行会名字。
**第七步:重新加载脚本并测试**
改完保存文件,在M2上点“重新加载所有脚本”,或者重启M2。然后进游戏找保管员NPC对话,看报错还出不出。
如果还出,说明`CHECKOFGUILD`在别的地方。继续搜索整个`Envir`文件夹,把所有脚本文件都搜一遍,找到那行错误的命令,按上面的格式改好。

