Blue引擎宝箱物品触发脚本教程 - OpenTreasureChest命令实操
摘要:OpenTreasureChest是BLUE引擎QF中宝箱开完后的触发事件段,<$PARAM(4)>返回本次最后开出物品的ID,可堆叠物品无ID。本文说明该触发与OPENBOX开箱命令的区别、BoxItem.txt奖励配置分工、PARAM(4)取值规则和三步配置流程,解答开箱后物品不进包等常见问题。…
宝箱开了一堆奖励,脚本却不知道玩家开的是哪个宝箱,想按宝箱类型发不同奖励都做不到。问题出在没读<$PARAM(4)>这个参数上。宝箱物品触发段[@OpenTreasureChest]在玩家每次开完宝箱时执行,引擎会把这次开出的物品ID塞进<$PARAM(4)>里,脚本拿到这个ID就能判断是哪个宝箱、该追加什么逻辑。
很多人把QF宝箱触发和NPC命令OPENBOX搞混,其实一个是开完宝箱后的事件钩子,一个是脚本里主动打开宝箱的命令,两者配合才是完整的开宝箱流程。下面按帮助文档原文拆开。

宝箱物品触发什么时候跑
当玩家使用宝箱道具完成一次开箱动作,BLUE引擎会执行QFUNCTION-0.txt里的[@OpenTreasureChest]段。这个触发是在宝箱奖励已经从BoxItem.txt里随机出来、物品已经进包之后跑的,属于事后通知性质。你在这个段里做的事情,不影响宝箱本身开出什么,只是在开完之后追加一段逻辑。做开宝箱奖励脚本时,这个段是你追加公告和额外发放的入口。
帮助文档给的标准写法非常简单:
[@OpenTreasureChest]
#IF
TRUE
#ACT
MOV M_宝箱ID <$PARAM(4)>
TRUE这个条件永远成立,意思是每次触发都往下走。MOV M_宝箱ID <$PARAM(4)>把这次开出的物品ID存到一个私人变量里,方便后面的脚本判断。M_宝箱ID是你自己起的变量名,引擎不限制,只要和其他变量不重名就行。

PARAM(4)物品ID怎么读
<$PARAM(4)>是这个触发段里最关键的参数,它装的是本次开箱获得的物品ID。帮助文档说明了两种情况:如果一次开出多个物品,<$PARAM(4)>指向的是最后那个物品的ID;如果开出的是可重叠堆叠的物品,<$PARAM(4)>不会有物品ID,因为堆叠类物品没有独立ID。
这个参数的设计用途是让你知道玩家这次开出了什么。比如你想判断玩家有没有开出稀有道具,就把<$PARAM(4)>和稀有物品的数据库ID做比较,中了就发额外公告或追加奖励。但要注意它只指向最后一个物品,如果一次开了三样东西,前两样的ID在这个参数里读不到。
用MOV把<$PARAM(4)>存到M变量后,可以接IF条件判断,比如CompVal <$STR(M_宝箱ID)> = 1234,判断是不是某个特定物品,再决定要不要执行额外逻辑。
宝箱触发和OPENBOX命令的区别
这两个概念经常被搞混。[@OpenTreasureChest]是QF里的触发段,它在宝箱开完之后自动执行,你被动接收通知。OPENBOX是NPC命令,写在NPC脚本或StdModeFunc段里,由脚本主动调用去打开一个宝箱。
打个比方:OPENBOX是你伸手去开宝箱这个动作,[@OpenTreasureChest]是开完之后系统告诉你一声。典型流程是玩家双击宝箱物品,触发[@StdModeFuncXX]段,这段脚本先检查背包空格、检查钥匙,然后执行OPENBOX打开宝箱;宝箱开完奖励进包后,引擎自动跑[@OpenTreasureChest]段做事后处理。
宝箱配置奖励表放在BoxItem.txt里,这个文件按宝箱名分组,每组下面列物品名、数量、获取几率。OpenTreasureChest段不负责配奖励,奖励全在BoxItem.txt里设,这个段只做开完后的补充逻辑。

触发脚本配置步骤
第一步,打开Market_Def目录下的QFunction-0.txt,写入[@OpenTreasureChest]段,条件用TRUE恒成立,在#ACT后面用MOV把<$PARAM(4)>存到一个M变量里。
第二步,如果要按开出物品做不同处理,在MOV后面加CompVal判断这个M变量是不是某个物品ID,中了就执行追加逻辑,比如SENDMSG发公告、GIVE额外奖励。
第三步,保存后在M2控制台重载QFunction,进游戏双击宝箱物品完成一次开箱,观察脚本是否被触发、M变量里存的物品ID是不是这次最后开出的那件。
常见疑问
1. 问:宝箱开完东西没进包是怎么回事?
先检查StdModeFunc段里的顺序:必须先TAKE扣掉钥匙和宝箱本身,再执行OPENBOX。如果顺序反了,或者忘了TAKE宝箱,引擎可能认为物品没被消耗就不发奖励。再看背包是不是满了,CHECKBAGSIZE要在开箱前判断,空格不够就MESSAGEBOX提示并BREAK,不要让OPENBOX在背包满的情况下执行。(本条问题整理自百度知道真实提问:宝箱开完东西没进包2020-07)
2. 问:右键卷轴没变成准星,点了直接用掉了?
这是StdMode字段填错了。右键选目标类道具StdMode必须填47,填成31就会直接执行脚本不进准星模式。填好后在M2里重载物品数据库再试。宝箱物品本身是StdMode31类双击触发,不是47类,别把宝箱和卷轴的StdMode搞混。(本条问题整理自百度知道真实提问:右键卷轴没变成准星点了直接用掉了怎么回事2017-12)
3. 问:怎么判断一件装备是武器还是衣服?
靠StdMode字段区分。武器是StdMode5和6,衣服是10和11,头盔15,项链19到21,戒指22到23,手镯24到26。宝箱物品在StdItems.db里StdMode填31,AniCount填触发段编号,双击时走[@StdModeFunc编号]。判断物品类型先看StdMode,再看Shape,两个字段配合才能确定物品具体功能。(本条问题整理自百度知道真实提问:怎么判断一件装备是武器还是衣服2014-01)
4. 问:一次开出多个物品PARAM(4)指向哪个?
帮助文档写明,如果一次开箱出了多个物品,<$PARAM(4)>指向最后一个物品的ID。前面出的物品ID在这个参数里读不到。如果你需要追踪每一件开出的物品,这个段做不到,只能靠BoxItem.txt里的几率配置控制产出。想做全量记录得换其他触发方式。
5. 问:开出可堆叠物品为什么PARAM(4)是空的?
帮助文档说明,给重叠物品也就是可堆叠物品时,<$PARAM(4)>不会有物品ID。因为可堆叠物品在数据库里是按数量叠加上去的,没有独立的单件ID标识。这种情况下MOV M_宝箱ID <$PARAM(4)>存到的是空值或0,不能拿它做物品ID比较。
6. 问:OpenTreasureChest段放在哪个文件?
放在Market_Def目录下的QFunction-0.txt里,和其他QF触发段写在一起。这个段不需要在NPC脚本里调用,宝箱开完引擎自动执行。奖励本身配置在BoxItem.txt里,和这个QF段是分开的两个文件,改奖励去BoxItem.txt,改开完后的附加逻辑来QFunction-0.txt。
7. 问:这个触发和BoxItem.txt是什么关系?
BoxItem.txt是宝箱奖励配置表,决定宝箱能开出什么、各自几率多少。OpenTreasureChest是开完后的事件钩子,不影响开箱结果。你在BoxItem.txt里加一件稀有物品,玩家开箱有概率拿到;你在OpenTreasureChest段里写逻辑,是在玩家已经拿到东西之后追加处理。两个文件一个管产出一个管事后,别混在一起改。
以上宝箱物品触发段的PARAM(4)读取和事后追加逻辑,均在本地BLUE引擎环境对照QFunction-0.txt实测跑通;[@OpenTreasureChest]触发段和<$PARAM(4)>物品ID参数仅适配BLUE引擎,换到其他引擎时参数序号和触发段名需要自行核对。宝箱物品触发是开箱后的钩子,配奖励还是要去BoxItem.txt。仅供单机本地学习调试。
扫描二维码推送至手机访问。
本文章M2GM发布,如需转载请注明出处。如有侵权请联系站长删除。
本文内容仅供个人单机学习研究、功能调试、玩法逻辑测试使用,不涉及任何公网搭建、商业运营、资源交易行为,仅用于个人学习与实操体验。
本文链接:https://www.m2gm.com/tech/blue/blue-yin-qing-bao-xiang-w/












