[@main]
#SAY
请先选择配方:\
<Img|img=public/bg_npc_01.png|loadDelay=1|move=0|reset=1|show=0|bg=1>
<Layout|x=545|y=0|width=80|height=80|link=@exit>
<Button|x=546|y=0|nimg=public/1900000510.png|pimg=public/1900000511.png|link=@exit>
<RText|x=25|y=20|text=<合成
🤖 回答引擎: TXT语法专家 |
🕒 时间: 2026-05-24 18:18:55 |
👁️ 阅读: 13
根据课程日志记录,你的脚本在 `[@开始合成检测]` 标签下逻辑存在漏洞。问题主要在于:
`CheckBoxItemCount` 命令只检查了自定义OK框(ITEMBOX)中物品的数量是否大于等于指定值,但没有检查物品名称是否正确。
在 `#ACT` 部分,你虽然将三个框的物品名称赋值给了 `S$框0名称`、`S$框1名称`、`S$框2名称`,但随后的 `#IF` 条件判断是独立的,它并没有和前面的 `CheckBoxItemCount` 条件形成“与”的关系。
引擎会依次执行 `#IF` 块。第一个 `#IF` 块(包含三个 `CheckBoxItemCount`)如果通过,就会执行其下的 `#ACT`(赋值变量)。然后,无论第一个 `#IF` 块是否通过,引擎都会继续判断第二个 `#IF` 块(检查物品名称和元宝)。如果第二个 `#IF` 块的条件通过,就会执行合成的 `#ACT`。
因此,即使OK框里是空的(`CheckBoxItemCount` 条件不成立,第一个 `#IF` 块不执行),只要第二个 `#IF` 块的条件成立(此时 `S$框X名称` 变量可能为空或为上次的值),就会错误地执行合成。
你需要将数量检查和名称/元宝检查合并到同一个 `#IF` 判断中,或者确保在检查名称之前,数量检查必须通过。修改后的 `[@开始合成检测]` 应类似这样:
```
[@开始合成检测]
#IF
CheckBoxItemCount 0 <$STR(N$数量1)>
CheckBoxItemCount 1 <$STR(N$数量2)>
CheckBoxItemCount 2 <$STR(N$数量3)>
EQUAL <$BOXITEM[0].NAME> <$STR(S$材料1)>
EQUAL <$BOXITEM[1].NAME> <$STR(S$材料2)>
EQUAL <$BOXITEM[2].NAME> <$STR(S$材料3)>
CHECKGAMEGOLD > <$STR(N$元宝消耗)>
#ACT
GAMEGOLD - <$STR(N$元宝消耗)>
DelBoxItem 0 <$STR(N$数量1)>
DelBoxItem 1 <$STR(N$数量2)>
DelBoxItem 2 <$STR(N$数量3)>
GIVE <$STR(S$配方名称)> 1
SENDMSG 6 恭喜你合成了【<$STR(S$配方名称)>】!
#ELSEACT
SENDMSG 6 材料或元宝不足,合成失败!请按配方放入正确物品。
BREAK
```
这样,所有条件(数量、物品名、元宝)必须在同一个 `#IF` 下全部满足,才会执行合成的 `#ACT`。
← 返回问答库