======标签生成====== ''[[https://github.com/FabricMC/fabric/blob/1.19.2/fabric-data-generation-api-v1/src/main/java/net/fabricmc/fabric/api/datagen/v1/provider/FabricTagProvider.java|FabricTagProvider]]'' 类可以让你生成标签的 JSON 文件。 本页面将会跟随你了解提供者(provider)的所有方面。 为了创建一个标签生成器,请创建一个类来继承(extends)''FabricTagProvider''。其中 ''T'' 为你想要生成的标签的类型。然后在你的数据根入口(datagen entrypoint)像这样注册它: private static class MyTagGenerator extends FabricTagProvider { public MyTagGenerator(FabricDataGenerator dataGenerator) { super(dataGenerator, Registries.ITEM); } @Override protected void generateTags() { } } // ... @Override public void onInitializeDataGenerator(FabricDataGenerator fabricDataGenerator) { // ... fabricDataGenerator.addProvider(MyTagGenerator::new); // ... } ''FabricTagProvider'' 类支持所有可以被支持的标签。请确认已经把构造函数(constructor)中的 ''Registries'' 改为你想要生成的标签的类型。 =====添加一个标签===== 添加一个标签,只需要简单在 ''generateTags()'' 方法中使用 ''TagKey'' 调用 ''getOrCreateTagBuilder'' 方法,就像这样: private static final TagKey SMELLY_ITEMS = TagKey.of(Registries.ITEM_KEY, new Identifier("tutorial:smelly_items")); @Override protected void generateTags() { // 这将会创建一个标签建造器(tag builder),我们在里面添加史莱姆球、腐肉和任何东西在 minecraft:dirt 的物品标签中。 getOrCreateTagBuilder(SMELLY_ITEMS) .add(Items.SLIME_BALL) .add(Items.ROTTEN_FLESH) .addOptionalTag(ItemTags.DIRT); // This will automatically generate "assets/mymod/tags/items/smelly_items.json" in the "generated" folder. // 这将会自动在 ''generated'' 文件夹中生成 ''assets/tutorial/tags/items/smelly_items.json'' } 以上代码的输出样例: { "replace": false, "values": [ "minecraft:slime_ball", "minecraft:rotten_flesh", { "id": "#minecraft:dirt", "required": false } ] } =====向建造器中添加物品===== 往你的标签建造器(tag builder)中添加物品,只需要简单地调用 ''add(Item item)''。 如果你想要向你的建造器中添加物品,请确认是调用 ''addOptionalTag(TagKey tag)'',因为在数据生成的过程中,标签的内容(contents)可能不会被加载。如果你已经确认这个标签已经被加载,那么请调用 ''addTag(TagKey tag)''。 接受 ''Identifiers'', ''Strings'' 和 ''RegistryKey'' 的 ''addTag'', ''addOptionalTag'', ''addItem'' 存在各种重载(overloads)。 如果你想要忽略损坏的格式地强制地添加标签,你可以使用 ''forceAddTag(TagKey tag)'' 最后,如果你想要你的标签替换已经存在的标签,你可以使用 ''setReplace(boolean replace)'' 上述所有方法的使用都可以在这个样例中找到: private static final TagKey SMELLY_ITEMS = TagKey.of(Registries.ITEM_KEY, new Identifier("tutorial:smelly_items")); @Override protected void generateTags() { getOrCreateTagBuilder(SMELLY_ITEMS) .add(Items.SLIME_BALL) .add(Items.ROTTEN_FLESH) .addOptionalTag(ItemTags.DIRT) .add(new Identifier("minecraft", "wooden_planks")) .forceAddTag(ItemTags.BANNERS) .setReplace(true) .add(Items.ROTTEN_FLESH.getRegistryEntry().registryKey()); }