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

来源: 作者: 点击:
你贴出来的这段脚本,报错信息指向 `[@保管员]` 这个NPC对话段,具体错误是 `[脚本参数不正确] Cmd:CHECKOFGUILD`。这说明M2在执行到某一行命令时,命令格式不对或者参数缺失。下面把整个脚本拆开,一行一行过,把错误的地方全揪出来改掉。

**第一步:先看报错信息锁定问题命令**

报错原文:
`[脚本参数不正确] Cmd:CHECKOFGUILD NPC名称:QManage 地图:0 座标:0:0 参数1: 参数2: 参数3: 参数4: 参数5:`

这告诉你两件事:
1. 出问题的命令是 `CHECKOFGUILD`。
2. 这个命令执行时,参数1到参数5全是空的,所以引擎报“参数不正确”。

**第二步:在脚本里找到 `CHECKOFGUILD` 的位置**

你脚本里有一大段是 `[@保管员]` 的对话显示,但报错是在 `[@A400]` 段里。看这一段:

```
[@A400]
#IF
ONLINELONGMIN > 2
CheckAttackMode 1
EQUAL A400 <$USERNAME>
#ACT
POWERRATE 1000 9999999
CLOSE
```

这里根本没有 `CHECKOFGUILD` 啊?那问题出在哪?

有两种可能:
1. **脚本不完整**:你贴出来的只是部分内容,真正的 `[@A400]` 段里可能还有其他 `#IF` 条件,其中一条就是 `CHECKOFGUILD`,而且参数没写全。
2. **隐含错误**:`CLOSE` 命令用在这里不合适,`CLOSE` 通常用在对话段关闭窗口,在 `#ACT` 里用 `CLOSE` 可能会导致脚本逻辑混乱,但不会直接报 `CHECKOFGUILD` 错。

**第三步:检查 `CHECKOFGUILD` 命令的正确用法**

`CHECKOFGUILD` 是检测玩家是否在行会的命令,正确格式是:
`CHECKOFGUILD 行会名称`

比如:
`CHECKOFGUILD 沙巴克` 检测玩家是否在“沙巴克”行会。

如果后面不跟行会名称,或者行会名称用变量但变量是空的,就会报参数不正确。

所以,你要找的是:在 `[@A400]` 段或者整个脚本里,有没有一行写着 `CHECKOFGUILD` 但后面没东西,或者后面跟了个变量但变量没赋值。

**第四步:修复 `[@A400]` 段的其他问题**

不管 `CHECKOFGUILD` 藏在哪里,你这段 `[@A400]` 本身就有问题。看这几行:

```
#IF
ONLINELONGMIN > 2
CheckAttackMode 1
EQUAL A400 <$USERNAME>
```

**问题1:`ONLINELONGMIN` 用法**
`ONLINELONGMIN` 是检测在线分钟数,后面应该跟数字。`ONLINELONGMIN > 2` 这种写法在某些引擎里不支持,正确的应该是 `ONLINELONGMIN 3`(代表在线大于3分钟)。写成 `> 2` 引擎可能不认。

**问题2:`CheckAttackMode 1`**
`CheckAttackMode` 是检测攻击模式,参数1代表和平模式。这行本身没错,但要确保这个命令在你引擎里存在。

**问题3:`EQUAL A400 <$USERNAME>`**
`EQUAL` 是比较两个值是否相等。这里是把A400变量的值和当前玩家名字比较。A400变量在脚本开头被赋值了两次:

```
mov A400 不在线
mov A400 屌丝
```

先赋值“不在线”,马上又被“屌丝”覆盖。最后A400里存的是“屌丝”。那么 `EQUAL A400 <$USERNAME>` 就相当于在问“屌丝”是否等于当前玩家名字。除非玩家名字叫“屌丝”,否则永远不成立。

这显然是逻辑错误。

**第五步:给出修正后的脚本**

假设你的本意是:检测玩家在线超过2分钟,且攻击模式不是和平,且某个条件成立,然后给玩家加攻击倍数。下面给一个修正版,去掉有问题的命令,用标准写法重写。

**修正版 QManage.txt 片段**

```
[@保管员]
#IF
#ACT
CloseBigDialogBox
#SAY
您好。我是仓库保管员。为了您的仓库又方便又安全。\
我为您提供以下仓库服务功能: \
<存放物品/@storage>\
<取回物品/@getback>\
<仓库密码/@仓库命令>\
<捆/@mbind>各种卷书和药水\
<离开/@exit> \

[@exit]
#IF
#ACT
mov A400 不在线
mov A400 屌丝
GOTO @A400

[@A400]
#IF
ONLINELONGMIN 3
CheckAttackMode 1
#ACT
POWERRATE 1000 9999999
SENDMSG 6 你获得了1000倍攻击力,持续9999999分钟
CLOSE
#ELSESAY
你不满足条件,无法获得攻击倍数。\
<返回/@保管员>
```

**修改说明**:
1. 删掉了 `EQUAL A400 <$USERNAME>`,因为A400的值“屌丝”和玩家名字比较没有意义。
2. `ONLINELONGMIN > 2` 改成了 `ONLINELONGMIN 3`,标准写法。
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` 文件夹,把所有脚本文件都搜一遍,找到那行错误的命令,按上面的格式改好。