本书第一次大修新增章 ① 矿词与标签
这一章原本是第六十四章的番外,但由于内容感觉十分水就去掉了。
所以这里就变成了多出来一章,写什么呢?
这一章我们不妨来填一下一些之前挖的坑。
我们在第二十六章讲到family参数时,提到了这么一句话:
『记分板、NBT和标签可以很好的解决这个问题。但在了解这三个东西之前,我们暂且没有除多弄命令方块以外的更好的办法。』
计分板我们已经了解过了,NBT我们会在100章开始进入正式学习阶段。
那么这个『标签』是什么东西?计分板标签吗?
我们知道,Minecraft Java版可以装上各种第三方的模组加载器(Mod Loader),其中最出名的就是Minecraft Forge。在Minecraft1.13版本更新之前,Minecraft Forge内有一个重要的系统:矿物词典(OreDictionary)。
『矿物词典』又是什么鬼?这跟『标签』有什么关系?
Minecraft Forge官方文档中对『矿物词典』的定义如下:
『矿物词典(OreDictionary)主要是为了Mod间兼容而存在。
已注册到矿物词典的物品将能够代替其它拥有相同矿物词典名的物品。这样就可以使用以上任一物品合成相同的结果。
虽然名字是“矿物(Ore)”词典,但是它也可以使用在非矿物的物品上。只要一个物品与另一个物品(比如染料)相似,就都可以注册进矿物词典,并通过矿物词典调用。』
举个例子,在工业时代2(Industrial Craft 2)模组中添加了铜锭,沉浸工程(Immersive Engineering)模组中也添加了铜锭,这两个铜锭由于是不同模组所添加的,所以是不同的物品,这就导致一个问题:
假如我死活搞不到工业时代2的铜锭,只能搞到沉浸工程的铜锭,既然都是铜锭,为什么就不能通用啊!!!我还想造IC2的机器呢!!!
于是,矿物词典就来了。沉浸工程的开发者只需要给自家的铜锭添加上一个铜锭的矿物词典(ingotCobr /br /er),工业时代2的开发者也只需要给自家的铜锭添加上一样的矿物词典(ingotCobr /br /er),然后你就会惊喜地发现,两边的铜锭可以通用了!
当然,实际情况肯定比这更加复杂,只不过我们又不开发模组,干嘛要去管这些更深层次的东西。我们只需要知道:
不同模组类似的物品可以注册到同一个矿物词典中,来使得不同模组的类似物品能够通用。
那么标签又是什么呢?
MC百科(mcmod.cn)中对标签的解释如下:
『数据包中的标签(Tag)允许玩家使用JSON文件将物品、方块、流体、实体类型和函数分组,标签在原版 1.13 及以上版本中替代了矿物词典的功能。』
需要注意,这里的原版指的是Minecraft Java版,基岩版并没有什么矿物词典和这种类型的标签。
看起来很高端的样子啊?但其实这标签仅仅是一个官方逼死第三方的更高端的『矿物词典』。
和矿物词典一样,不同的物品也可以注册到同一个标签中,来使得不同模组的类似物品能够通用。
但在之前,矿物词典最多也仅仅能让物品在工作台中、熔炉中等特定功能性方块中才能通用,官方的标签却更上一层楼,使得类似物品几乎能在任何地方通用!
比如你可以给你自己开发的箭添加上arrows标签,你这个物品就可以被原版的弓和弩射出去;你可以给你自己的食物添加上fox_food标签,这个食物就可以被喂食给狐狸......
但官方的格局可不止仅仅限制在物品中,让我们把格局打开一点,你就会发现官方让Minecraft中的其他东西也能够用上标签来使得其他东西也能够通用。这些『其他东西』一共有十四类,加上物品就十五类了,包括:方块、实体、流体、游戏事件、物品、猫、生物群系、超平坦模式生成器配置、结构、世界预设、画种类、旗帜图案、乐器、兴趣点和函数。
标签在这些其他东西上的运作方式也一样:具有同一个标签的东西,就可以具有同样的功能或性质。
比如拥有frog_food标签的实体,就会被青蛙当成食物来吃;拥有lava标签的流体,就会具有岩浆的功能;拥有tick标签的函数,会在每游戏刻开始时运行;拥有village标签的结构,会像村庄一样生成......
讲了那么多,那这跟指令有什么关系呢?
回到最开始的那句话:『记分板、NBT和标签可以很好的解决这个问题。但在了解这三个东西之前,我们暂且没有除多弄命令方块以外的更好的办法。』
这个问题是什么?就是你怎样才能在目标选择器中一次性选取多个类型的实体。
在基岩版我们可以通过family参数来选择,但在Java版呢?
Mojang在Minecraft Java1.14中开始为实体添加标签,这就代表着我们在Minecraft Java1.14及以上版本可以通过标签来对实体进行选择。
怎么选择呢?在目标选择器的tybr /e参数中,使用『#+命名空间+标签名称』即可。
比如要选中所有骷髅类型的实体,你只需要:
@e[tybr /e=#minecraft:skeletons]
这样子就可以选择包括骷髅、凋零骷髅等骷髅类的实体。
而且由于一个实体可以具有多个标签,所以你可以使用多个tybr /e参数指定多个标签来筛选。
比如@e[tybr /e=#minecraft:skeletons,tybr /e=#minecraft:freeze_immune_entity_tybr /es],这就可以选择同时具有freeze_immune_entity_tybr /es和skeletons标签的实体,即流浪者。
你还可以在#前面加上!来实现『不选择具有指定标签实体』的功能。比如@e[tybr /e=#minecraft:skeletons,tybr /e=!#minecraft:freeze_immune_entity_tybr /es],这就将会排除流浪者,只会选择普通骷髅和凋零骷髅。
只不过和family参数一样,目前Mojang给原版实体添加的标签还太少了。但别担心,因为你不仅仅可以使用实体的标签,你还可以使用函数、方块和物品的标签。
比如在指令clear中,你就可以这样子:
/clear @a #minecraft:buttons
这将会清除所有玩家背包中的按钮,不管是什么按钮都行。
也比如在指令execute中,你就可以这样子:
/execute at @a if block ~~-1 ~#minecraft:snow run kill @s
这将会使得所有脚下踩着雪的玩家死亡,不管这个雪是顶层雪还是雪块还是什么其他类型的雪。
(这个execute指令的语法是第八卷,也就是下一卷的内容,我们很快就会学习其具体的用法了)
只不过Mojang太懒了,导致在原版中,即使是方块和物品,标签也是太少,发挥不了很大的作用。
那怎么办?装Forge啊!
Forge为原版提供了许多有用的标签,虽然这些主要用途是像矿物词典那样帮助模组互通,但我们指令也是可以用的。
比如使用Forge提供的矿物锭标签,就可以实现检测一个玩家背包内所有类型锭的数量:
/execute as @a store result score @s ingot_count run clear @s #forge:ingots 0
这条指令将会将所有玩家背包内任何类型锭的总数量以分数的形式存储在玩家自己的ingot_count计分板中。
所以这就是本章的全部内容了,Have you learned it?