第一百零二章 物品组件
(此章节已于2022年8月5日重写)
在第八章中,我们了解了/give指令的用法。让我们回顾一下:
--Java1.13以下
/give <玩家:目标选择器><物品id:字符串>[物品数量:整数][物品数据值:整数][NBT标签]
--Java1.13及以上
/give <玩家:目标选择器><物品英文id:字符串>[物品数量:整数]
--基岩版
/give <玩家:目标选择器><物品id:字符串>[物品数量:整数][物品数据值:整数][附加标签:JSON]
值得注意的是,在基岩版的格式中,『物品数据值』参数后面竟然还有一个『附加标签』参数。等等,附加『标签』?难不成基岩版的指令中也可以使用NBT?
你想多了,这当然不是NBT,而是一个基岩版独有的非常类似于NBT但实际上是JSON的东西:
物品组件(Item Combr /onents)
物品组件这东西,正如其名,是可以用在物品上的JSON组件。由于使用的是JSON而不是SNBT的语法,因此物品组件的格式和Java版的NBT有些许不同。那到底有哪些物品组件?我们又该如何使用它们呢?
截止基岩版1.19.10版本,一共有4个物品组件:
can_br /lace_on
can_destroy
item_lock
keebr /_on_death
虽然这里的JSON不是JSON文本,但这些组件和普通的原始JSON文本组件的用法仍然一样。
物品组件的值必须是一个JSON对象,也就是像下面这样:
{“物品组件“:{}}
而具体这个JSON对象内能够填写哪些东西,得看使用的是什么物品组件。
can_br /lace_on和can_destroy这两个物品组件十分类似,它们俩也是最年长的物品组件,你或许早已知道它们的用途:
can_br /lace_on——指定该『方块类物品』可以被放置于哪些方块上方
can_destroy——指定该物品可以破坏哪些方块
这两个物品组件适用于冒险模式。你应该知道,在基岩版中,处于冒险模式的玩家无法破坏或放置任何方块。因此,妥善运用上述组件,就可以指定玩家能够破坏或放置哪些方块,使得玩家的自由度更高,也能够弄出更多的玩法。
那么它们到底该怎么使用呢?
你需要在这两个组件的值,也就是它们的JSON对象中,使用blocks组件(值类型为字符串列表),指定具体可以破坏或放置的方块。比如:
/give @s diamond_shovel 1 0 {“can_destroy“:{“blocks“:[“minecraft:dirt“,“minecraft:grass“]}}
这将会给你一把在冒险模式中能够破坏泥土和草方块的钻石铲铲。can_br /lace_on组件的使用方法同理:
/give @s diamond_block 1 0 {“can_br /lace_on“:{“blocks“:[“minecraft:dirt“,“minecraft:grass“]}}
这将会给你一块在冒险模式中能够放置于泥土和草方块上方的钻石块。
可惜的是,这两个组件似乎无法指定具体的方块数据值以及方块状态,这就限制了这两个组件的使用范围。
item_lock和keebr /_on_death这两个组件是基岩版于1.16.100版本中新添加的。由于它们俩比较新,所以目前知道的人并不多。但这两个的用处可不是一般的大:
item_lock——将物品锁定于背包或指定栏位中,使得物品无法被移除、丢弃或用于合成。
keebr /_on_death——使得物品在死亡后不会掉落
keebr /_on_death组件的使用方法非常简单,你甚至不需要指定它的JSON对象内到底该填写什么,只需要放一个空空如也的JSON对象作为它的值即可:
/give @s diamond_shovel 1 0 {“minecraft:keebr /_on_death“:{}}
这将会给你一把不会因死亡而掉落的钻石铲(不受游戏规则『死亡不掉落』是否开启的影响),可以说十分简单且有用。你应该注意到了,物品组件也具有命名空间。
item_lock组件可以将物品锁定在玩家的物品栏中。它具有两个模式,需要使用mode组件在它的JSON对象中指定:
lock_in_inventory——锁定在玩家的背包中,玩家可以在背包中调整物品的位置,但物品无法被移除、丢弃或用于合成。
lock_in_slot——锁定在玩家的栏位中,玩家不可在背包中调整物品的位置,物品也无法被移除、丢弃或用于合成。
举个例子:
/give @s abr /br /le 64 0 {“item_lock“:{“mode“:“lock_in_inventory“}}
这将会给你自己一组苹果。你虽然可以使用它并调整它的位置,但这些苹果无法被销毁、丢弃或用于合成,你也无法将这些苹果放到其他容器中。但如果你死亡的话,这些苹果仍然会掉落。另外,这些苹果也可以通过指令移除掉。
再来一个例子:
/rebr /laceitem entity @a slot.hotbar 0 book 1 0 {“item_lock“:{“mode“:“lock_in_slot“}}
这将会把所有玩家的快捷栏第一格的物品替换为一本书,并且这本书会被锁定在这个栏位中。当然,这本书也会在死亡时掉落。
有趣的是,虽然你握不住空气,但是下面这条指令却可以强制让你『握住空气』:
/rebr /laceitem entity @s slot.hotbar 0 air 1 0 {“item_lock“:{“mode“:“lock_in_slot“}}
当你使用上述指令后,看起来你的快捷栏第一格只是变空了而已,也可以把其他物品放在这一格。但如果你把主手切换到这一格然后去尝试挖或使用方块,你就会发现:你破坏不了也使用不了方块了!破坏方块后方块会迅速恢复原来的状态,就像服务器保护一样!只不过,当你把其他东西放到这一格时,使用这一格来挖或破坏方块便不会出现什么问题。
上面这些就是基岩版的JSON物品组件的全部内容。既然基岩版有类似NBT的物品组件,那么Java版有没有类似这些功能的NBT标签呢?
答案当然是有的,只不过是部分有,也就是:
can_br /lace_on → CanPlaceOn
can_destroy → CanDestroy
在Java版中,CanPlaceOn和CanDestroy这两个NBT标签的用途和基岩版的对应物品组件一模一样,唯一的区别就在于使用的方法。Java版的这两个标签的数据类型都是『文本列表』,而不是一个复合标签。列表内就直接填写能够放置或破坏的方块ID,比如:
/give @s diamond_shovel{CanDestroy:[“minecraft:dirt“,“minecraft:grass_block“]} 1
这条指令是刚才的『/give @s diamond_shovel 1 0 {“can_destroy“:{“blocks“:[“minecraft:dirt“,“minecraft:grass“]}}』在Java1.13及以上版本的写法,它们具有同样的作用:给你一把在冒险模式中能够破坏泥土和草方块的钻石铲铲。CanPlaceOn的用法和CanDestroy标签一样,这里就不多讲解了。
这就是本章的全部内容。
附录①:物品组件历史
携带版/基岩版
?——加入了can_br /lace_on和can_destroy两个物品组件,但没有用
1.1.0——can_br /lace_on和can_destroy两个物品组件现在可正常使用
1.16.100——加入了item_lock和keebr /_on_death两个物品组件
附录②:类似物品组件的NBT标签历史
Java版
1.8——加入了CanPlaceOn和CanDestroy标签