在高版本中,往往需要使用tag来归类一系列物品/方块/生物等等。但是这里就产生了一个问题:很多情况下需要添加的对象过多,手写十分不便而且容易出错。尤其原版增加了很多标签之后,为了让添加的物品和方块具有各种功能往往需要添加许多标签,这里就讲述了如何使用DataGenerator批量简便的产生tag文件。
原版提供了TagsProvider<T>来方便的产生tag,你需要继承这个抽象类并编写addTags方法来产生对应的Provider。其中T是tag类型,比如TagsProvider<Block>是方块tag生成器,TagsProvider<Item>则是物品标签生成器。于是我们有了这样一个类:
public class ExampleItemTagGenerator extends TagsProvider&lt;Item&gt; {
public ExampleItemTagGenerator(DataGenerator dataGenerator, String modId, ExistingFileHelper existingFileHelper,CompletableFuture&lt;HolderLookup.Provider&gt; provider) {
super(dataGenerator.getPackOutput(), Registries.ITEM,provider, modId, existingFileHelper);
}
@Override
protected void addTags(Provider pProvider) {
}
} 接下来我们要开始编写addTags方法了,TagsProvder类提供了一个tag方法,该方法输入一个tag并提供一个TagAppender,这个就是对应tag的builder。输入的tag如果是原版tag,可以使用ItemTags这个类的常数,或者方块tag生成器则用BlockTags等;如果需要创建自定义的tag,这些工具类也有一个create方法可以生成对应的标签。如果你的tag类型不是这些常规的类型,也可以使用TagKey.create,这里不详细讲述。
TagAppender使用起来也非常简单:有add,addOptional,addTag,addOptionalTag这4个方法,熟悉tag数据包的都知道有个required:false可以避免对应物品不存在时数据包出错,这就对应两个Optional方法。add和addOptional是添加对象(物品、方块、实体等),这些方法都接受一个ResourceKey,这个既可以使用注册表的getResourceKey获取,也可以用ResourceKey.create并输入注册表和对象id获取。addTag和addOptionalTag则是添加其它的tag,只需要输入对应的id即可。如果在同一个Provider里面反复用tag方法重复产生同一个tag的Appender,不会导致后续调用覆盖前面定义的tag,而是会继续往该tag添加对象,因此无需缓存TagAppender对象,随时调用tag方法获取即可。
用这个简单的对象,你可以使用for/while或者其它循环和生成控制语句,从而批量迅速的产生tag对应的json文件。这对于具有大量物品和方块的模组是十分有意义的。同时也可以直接使用你注册的RegistryObject,这样可以极大的减少输入错误的风险,并避免了重命名和版本迁移导致的大量修改。最后别忘了注册!