ModularMachinery Wiki(ZH)/NBT 检查 & 设置 【进阶】

NBTTag会保存关于物品的属性信息,当定义一个物品作为配方的输入物品或者是在配方的物品输出上设置特定的NBTTag时你可能需要对其进行检查。

NBTTag可以是复杂递归的。检查它的话你只需要检查一个特定的NBT值是否存在,或者说也可以检查NBTTag中的被检查的数字是否在特定范围内。所以大部分的Tag可能根本就没必要检查。

检查或者设置NBTTag不总是对玩家可用的。所以在做出复杂的NBT行为检测时需要注意这点。

你可以使用/mm-hand来获得你手上的itemstack的NBTTag。在信息栏中给你返回的信息也会以预设好的JSON格式复制到你的剪贴板上。

NBT检查方法是懒检查(lazy-checks),所以mod只检测你指定的NBT数据是否存在/可用。该模组会忽略itemstack中的其他tag/entries。要被检查的NBTTag在带有Tag为"nbt"的物品输入/输出定义中要定义以JSON形式。(样例在下)

在NBTTag中定义字符串时,你也可以把它定义为一个正则表达式。(请留意你给字符串定义的内容,因为它不仅会用来与ItemStack上的字符串匹配,它还会被设置在ItemStack中用于在JEI中预览。) 当在NBTTag中定义一个数字时,你可以直接使用"<","<=","==","=>",">"作为定义的数字的前缀(即设定检查范围),这样就可以不只检查定义数字是否等于ItemStack上的数字了。

即使只是为了检查/匹配NBTTag或它的值和可能的输入物品,在输入中定义的NBTTag也会在建立JEI的预览时直接应用到ItemStack中。为了在匹配字符串时使用正则表达式,并使JEI的预览不出错,你可以为物品添加定义一个"nbt-display"entries,同时在与"nbt"并列的地方你可以删除所有的NBT检查,比如正则表达式,因为在将NBTTag标签应用于JEI中的配方预览的ItemStack时NBTTag会优先"nbt"。

样例 #1

[...]
{
    "type": "item",
    "io-type": "input",
    "item": "forge:bucketfilled",
    "amount": 1,
    "nbt": {
        "FluidName": "ic2uu_matter",
        "Amount": ">=1000"
    }
},
[...]

此配方中只有输入物品是个盛装有大于等于1000mb的"ic2uu_matter"的Forge-Bucket物品时输入才会运行配方。

样例 #2:

[...]
{
    "type": "item",
    "io-type": "input",
    "item": "forge:bucketfilled",
    "amount": 1,
    "nbt": {
        "FluidName": "^.*water.*$",
        "Amount": "1000"
    }
},
[...]

现在此物品配方的输入只能接受恰好盛装有1000mb的名字带有"water"的液体的Forge-bucket物品。

定义的任意的数字比较运算方法(<、<=、==、>=、>)的含义代表它总是和完全匹配(==)的使用含义相同。但是,将"^.water.$"定义为FluidName也同时会将其设置为JEI配方渲染的FluidName从而导致错误。至于怎么避免这种情况,可以看看第一个样例上的最后行代码。

样例 #3:

[...]
{
    "type": "item",
    "io-type": "input",
    "item": "forge:bucketfilled",
    "amount": 1,
    "nbt": {
        "SomeWeirdTagName": {
            "SomeWeirdNumber": ">5000",
            "SomeWeirdList": [
                "AListEntry"
            ]
        }
    }
},
[...]

此配方中这样的NBT匹配可以根据需要而应用地十分复杂,要让样例#3中的物品可以被输入的话,输入物品它就必须是个Forge-bucket物品且必须在"SomeWeirdTagName"内有一个 NBTTagCompound。在这个NBTTagCompound中的"SomeWeirdNumber"key上有一个整数型数字,且这个数字必须大于5000。另外,"SomeWeirdList"的key需要有一个字符串数组且至少要有一个叫做"AListEntry"的entry。

样例 #4:

[...]
{
    "type": "item",
    "io-type": "output",
    "item": "forge:bucketfilled",
    "amount": 1,
    "nbt": {
        "FluidName": "ic2uu_matter",
        "Amount": "1000"
    }
},
[...]

在此配方中因为没有进行nbt匹配只是设置了nbttag,物品输出是直接输出的。所以,不管物品的"nbt"到底定义了什么,它都会直接应用到output stack。

然而,你不只可以将NBT检查应用于配方中的ItemStack输入,你也可以把它应用为多方块结构的一部分的TileEntities。效果的话,你可以用它做个特别的蜘蛛刷怪箱。被检查的NBTTag必须与特定的位置坐标一起定义。若被检查NBTTag与TileEntity的NBTTag相匹配,相当于它在保存和加载世界时保存到了一个区块中的NBTTag中。此NBTTag语法和设置与Item-Input的NBT-check相同。

样例 #1:

[...]
{
    "x": 1,
    "y": 1,
    "z": 1,
    "nbt": {
        ...
    },
    "elements": [
        ...
    ]
}
[...]

要是还不明白怎么回事的话(因为这可能确实复杂了"点")你可以去作者discord AstralSorcery/ModularMachinery's discord:Discord-Invite-Link 询问。

Tr:Eicy