当前位置 : 145z游戏站 | 热血传奇 | 技术教程 | 

传奇M2脚本错误提示保管员段逐行排查与修复指南

热度:
你贴出来的这段脚本,报错信息指向`[@保管员]`这个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`文件夹,把所有脚本文件都搜一遍,找到那行错误的命令,按上面的格式改好。
[顶部]