From 4802ceeccc52bcf596ef626364887ea3e574ca44 Mon Sep 17 00:00:00 2001 From: ChampionAsh5357 Date: Mon, 12 Dec 2022 13:23:10 -0500 Subject: [PATCH] Replace AdvancementProvider patch with Forge helper (#9188) --- .../AdvancementProvider.java.patch | 59 +++------------- .../common/data/ForgeAdvancementProvider.java | 67 +++++++++++++++++++ src/main/resources/forge.exc | 1 - .../debug/DataGeneratorTest.java | 24 +++---- 4 files changed, 86 insertions(+), 65 deletions(-) create mode 100644 src/main/java/net/minecraftforge/common/data/ForgeAdvancementProvider.java diff --git a/patches/minecraft/net/minecraft/data/advancements/AdvancementProvider.java.patch b/patches/minecraft/net/minecraft/data/advancements/AdvancementProvider.java.patch index 79f2838287..f3db7712b3 100644 --- a/patches/minecraft/net/minecraft/data/advancements/AdvancementProvider.java.patch +++ b/patches/minecraft/net/minecraft/data/advancements/AdvancementProvider.java.patch @@ -1,53 +1,14 @@ --- a/net/minecraft/data/advancements/AdvancementProvider.java +++ b/net/minecraft/data/advancements/AdvancementProvider.java -@@ -18,8 +_,19 @@ +@@ -14,6 +_,11 @@ + import net.minecraft.data.PackOutput; + import net.minecraft.resources.ResourceLocation; + ++/** ++ * @deprecated Forge: Use {@link net.minecraftforge.common.data.ForgeAdvancementProvider} instead, ++ * provides ease of access for the {@link net.minecraftforge.common.data.ExistingFileHelper} in the generator ++ */ ++@Deprecated + public class AdvancementProvider implements DataProvider { private final PackOutput.PathProvider f_236156_; private final List f_244266_; - private final CompletableFuture f_254664_; -+ @org.jetbrains.annotations.Nullable -+ protected final net.minecraftforge.common.data.ExistingFileHelper existingFileHelper; - -+ /** -+ * @deprecated Forge: Use the {@linkplain #AdvancementProvider(PackOutput, CompletableFuture, List, net.minecraftforge.common.data.ExistingFileHelper) existing file helper variant} -+ */ -+ @Deprecated - public AdvancementProvider(PackOutput p_256529_, CompletableFuture p_255722_, List p_255883_) { -+ this(p_256529_, p_255722_, p_255883_, null); -+ } -+ -+ public AdvancementProvider(PackOutput p_256529_, CompletableFuture p_255722_, List p_255883_, @org.jetbrains.annotations.Nullable net.minecraftforge.common.data.ExistingFileHelper existingFileHelper) { -+ this.existingFileHelper = existingFileHelper; - this.f_236156_ = p_256529_.m_245269_(PackOutput.Target.DATA_PACK, "advancements"); - this.f_244266_ = p_255883_; - this.f_254664_ = p_255722_; -@@ -38,14 +_,27 @@ - } - }; - -- for(AdvancementSubProvider advancementsubprovider : this.f_244266_) { -- advancementsubprovider.m_245571_(p_255484_, consumer); -- } -+ // Forge: Allow mods to take control of advancement registration -+ this.registerAdvancements(p_255484_, consumer, this.existingFileHelper); - - return CompletableFuture.allOf(list.toArray((p_253393_) -> { - return new CompletableFuture[p_253393_]; - })); - }); -+ } -+ -+ /** -+ * Registers all {@linkplain Advancement advancements}. -+ * -+ * @param registries the registries available for lookup including all registries in {@link net.minecraft.core.registries.Registries} -+ * @param saver a {@link Consumer} which saves any advancements provided -+ * @param existingFileHelper the existing file helper to check for the existence of files like parent advancements -+ * @see Advancement.Builder#save(Consumer, ResourceLocation, net.minecraftforge.common.data.ExistingFileHelper) -+ */ -+ protected void registerAdvancements(HolderLookup.Provider registries, Consumer saver, net.minecraftforge.common.data.ExistingFileHelper existingFileHelper) { -+ for (AdvancementSubProvider subProvider : this.f_244266_) { -+ subProvider.m_245571_(registries, saver); -+ } - } - - public final String m_6055_() { diff --git a/src/main/java/net/minecraftforge/common/data/ForgeAdvancementProvider.java b/src/main/java/net/minecraftforge/common/data/ForgeAdvancementProvider.java new file mode 100644 index 0000000000..ea26cd1301 --- /dev/null +++ b/src/main/java/net/minecraftforge/common/data/ForgeAdvancementProvider.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) Forge Development LLC and contributors + * SPDX-License-Identifier: LGPL-2.1-only + */ + +package net.minecraftforge.common.data; + +import net.minecraft.advancements.Advancement; +import net.minecraft.core.HolderLookup; +import net.minecraft.data.PackOutput; +import net.minecraft.data.advancements.AdvancementProvider; +import net.minecraft.data.advancements.AdvancementSubProvider; +import net.minecraft.resources.ResourceLocation; + +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; + +/** + * An extension of the {@link AdvancementProvider} to provide a feature-complete + * experience to generate modded advancements. + */ +public abstract class ForgeAdvancementProvider extends AdvancementProvider +{ + /** + * Default constructor. + * + * @param output the target directory of the data generator + * @param registries a future of a lookup for registries and their objects + * @param existingFileHelper a helper used to find whether a file exists + * @param subProviders the generators used to create the advancements + */ + public ForgeAdvancementProvider(PackOutput output, CompletableFuture registries, ExistingFileHelper existingFileHelper, List subProviders) + { + super(output, registries, subProviders.stream().map(generator -> generator.toSubProvider(existingFileHelper)).toList()); + } + + /** + * An interface used to generated modded advancements. This is parallel to + * vanilla's {@link AdvancementSubProvider} with access to the {@link ExistingFileHelper}. + * + * @see AdvancementSubProvider + */ + public interface AdvancementGenerator + { + /** + * A method used to generate advancements for a mod. Advancements should be + * built via {@link net.minecraftforge.common.extensions.IForgeAdvancementBuilder#save(Consumer, ResourceLocation, ExistingFileHelper)}. + * + * @param registries a lookup for registries and their objects + * @param saver a consumer used to write advancements to a file + * @param existingFileHelper a helper used to find whether a file exists + */ + void generate(HolderLookup.Provider registries, Consumer saver, ExistingFileHelper existingFileHelper); + + /** + * Creates an {@link AdvancementSubProvider} from this generator. + * + * @param existingFileHelper a helper used to find whether a file exists + * @return a sub provider wrapping this generator + */ + default AdvancementSubProvider toSubProvider(ExistingFileHelper existingFileHelper) + { + return (registries, saver) -> this.generate(registries, saver, existingFileHelper); + } + } +} diff --git a/src/main/resources/forge.exc b/src/main/resources/forge.exc index be53fa5712..bd4158af43 100644 --- a/src/main/resources/forge.exc +++ b/src/main/resources/forge.exc @@ -31,7 +31,6 @@ net/minecraft/client/resources/model/MultiPartBakedModel.getQuads(Lnet/minecraft net/minecraft/client/resources/model/SimpleBakedModel$Builder.build(Lnet/minecraftforge/client/RenderTypeGroup;)Lnet/minecraft/client/resources/model/BakedModel;=|renderTypes net/minecraft/client/resources/model/SimpleBakedModel.(Ljava/util/List;Ljava/util/Map;ZZZLnet/minecraft/client/renderer/texture/TextureAtlasSprite;Lnet/minecraft/client/renderer/block/model/ItemTransforms;Lnet/minecraft/client/renderer/block/model/ItemOverrides;Lnet/minecraftforge/client/RenderTypeGroup;)V=|p_119489_,p_119490_,p_119491_,p_119492_,p_119493_,p_119494_,p_119495_,p_119496_,renderTypes net/minecraft/client/resources/model/WeightedBakedModel.getQuads(Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/core/Direction;Lnet/minecraft/util/RandomSource;Lnet/minecraftforge/client/model/data/ModelData;Lnet/minecraft/client/renderer/RenderType;)Ljava/util/List;=|p_235058_,p_235059_,p_235060_,modelData,renderType -net/minecraft/data/advancements/AdvancementProvider.(Lnet/minecraft/data/PackOutput;Ljava/util/concurrent/CompletableFuture;Ljava/util/List;Lnet/minecraftforge/common/data/ExistingFileHelper;)V=|p_256529_,p_255722_,p_255883_,existingFileHelper net/minecraft/data/tags/BannerPatternTagsProvider.(Lnet/minecraft/data/PackOutput;Ljava/util/concurrent/CompletableFuture;Ljava/lang/String;Lnet/minecraftforge/common/data/ExistingFileHelper;)V=|p_256451_,p_256420_,modId,existingFileHelper net/minecraft/data/tags/BiomeTagsProvider.(Lnet/minecraft/data/PackOutput;Ljava/util/concurrent/CompletableFuture;Ljava/lang/String;Lnet/minecraftforge/common/data/ExistingFileHelper;)V=|p_255800_,p_256205_,modId,existingFileHelper net/minecraft/data/tags/CatVariantTagsProvider.(Lnet/minecraft/data/PackOutput;Ljava/util/concurrent/CompletableFuture;Ljava/lang/String;Lnet/minecraftforge/common/data/ExistingFileHelper;)V=|p_256547_,p_256090_,modId,existingFileHelper diff --git a/src/test/java/net/minecraftforge/debug/DataGeneratorTest.java b/src/test/java/net/minecraftforge/debug/DataGeneratorTest.java index 77ce054e18..2035f6c286 100644 --- a/src/test/java/net/minecraftforge/debug/DataGeneratorTest.java +++ b/src/test/java/net/minecraftforge/debug/DataGeneratorTest.java @@ -1016,25 +1016,19 @@ public class DataGeneratorTest } } - public static class Advancements extends AdvancementProvider + public static class Advancements extends ForgeAdvancementProvider { public Advancements(PackOutput output, CompletableFuture providerCompletableFuture, ExistingFileHelper existingFileHelper) { - super(output, providerCompletableFuture, List.of(new Provider(existingFileHelper))); + super(output, providerCompletableFuture, existingFileHelper, List.of(new Provider())); } - private static class Provider implements AdvancementSubProvider { - - private final ExistingFileHelper fileHelper; - - private Provider(ExistingFileHelper fileHelper) { - this.fileHelper = fileHelper; - } + private static class Provider implements AdvancementGenerator { @Override - public void generate(HolderLookup.Provider registries, Consumer consumer) { + public void generate(HolderLookup.Provider registries, Consumer saver, ExistingFileHelper existingFileHelper) { Advancement.Builder.advancement().display(Items.DIRT, Component.translatable(Items.DIRT.getDescriptionId()), Component.translatable("dirt_description"), @@ -1044,7 +1038,7 @@ public class DataGeneratorTest true, false) .addCriterion("has_dirt", InventoryChangeTrigger.TriggerInstance.hasItems(Items.DIRT)) - .save(consumer, new ResourceLocation(MODID, "obtain_dirt"), fileHelper); + .save(saver, new ResourceLocation(MODID, "obtain_dirt"), existingFileHelper); Advancement.Builder.advancement().display(Items.DIAMOND_BLOCK, Component.translatable(Items.DIAMOND_BLOCK.getDescriptionId()), @@ -1055,7 +1049,7 @@ public class DataGeneratorTest true, false) .addCriterion("obtained_diamond_block", InventoryChangeTrigger.TriggerInstance.hasItems(Items.DIAMOND_BLOCK)) - .save(consumer, new ResourceLocation("obtain_diamond_block"), fileHelper); + .save(saver, new ResourceLocation("obtain_diamond_block"), existingFileHelper); Advancement.Builder.advancement() .display(Blocks.GRASS_BLOCK, @@ -1067,7 +1061,7 @@ public class DataGeneratorTest false, false) .addCriterion("crafting_table", InventoryChangeTrigger.TriggerInstance.hasItems(Blocks.CRAFTING_TABLE)) - .save(consumer, new ResourceLocation("story/root"), fileHelper); + .save(saver, new ResourceLocation("story/root"), existingFileHelper); // This should cause an error because of the parent not existing /* Advancement.Builder.advancement().display(Blocks.COBBLESTONE, @@ -1092,7 +1086,7 @@ public class DataGeneratorTest false) .addCriterion("get_cobbleStone", InventoryChangeTrigger.TriggerInstance.hasItems(Items.COBBLESTONE)) .parent(new ResourceLocation("forge", "dummy_parent")) - .save(consumer, new ResourceLocation("good_parent"), fileHelper); + .save(saver, new ResourceLocation("good_parent"), existingFileHelper); } } } @@ -1161,4 +1155,4 @@ public class DataGeneratorTest // So remove modid to match return model.replaceAll("^\\w+:", "minecraft:"); } -} \ No newline at end of file +}