diff --git a/src/main/java/org/betterx/bclib/api/v2/advancement/AdvancementManager.java b/src/main/java/org/betterx/bclib/api/v2/advancement/AdvancementManager.java index dd3d5cc2..bfe678e0 100644 --- a/src/main/java/org/betterx/bclib/api/v2/advancement/AdvancementManager.java +++ b/src/main/java/org/betterx/bclib/api/v2/advancement/AdvancementManager.java @@ -26,27 +26,46 @@ import com.google.gson.Gson; import com.google.gson.GsonBuilder; import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.function.Consumer; -import org.jetbrains.annotations.ApiStatus; public class AdvancementManager { - private static final Map ADVANCEMENTS = new HashMap<>(); + private static final Map ADVANCEMENTS = new LinkedHashMap<>(); public static void register(ResourceLocation id, Advancement.Builder builder) { ADVANCEMENTS.put(id, builder); } - @ApiStatus.Internal - public static void addAdvancements(Map map) { + public static void registerAllDataGen(List namespaces, Consumer consumer) { + final Advancement ROOT_RECIPE = Advancement.Builder.advancement() + .addCriterion( + "impossible", + new ImpossibleTrigger.TriggerInstance() + ) + .build(RecipeBuilder.ROOT_RECIPE_ADVANCEMENT); + final Map BUILT = new HashMap<>(); + for (var entry : ADVANCEMENTS.entrySet()) { - if (!map.containsKey(entry.getKey())) { - map.put(entry.getKey(), entry.getValue()); + final ResourceLocation loc = entry.getKey(); + if (namespaces == null || namespaces.contains(loc.getNamespace())) { + final Advancement.Builder builder = entry.getValue(); + if (builder.canBuild(locToAdd -> { + if (locToAdd.equals(RecipeBuilder.ROOT_RECIPE_ADVANCEMENT)) return ROOT_RECIPE; + return BUILT.get(locToAdd); + })) { + final Advancement adv = builder.build(loc); + BUILT.put(loc, adv); + consumer.accept(adv); + } else { + BCLib.LOGGER.error("Unable to build Advancement " + loc); + } } } } + public static class RewardsBuilder { private final Builder calle; private final AdvancementRewards.Builder builder = new AdvancementRewards.Builder(); @@ -147,7 +166,11 @@ public class AdvancementManager { return create(new ItemStack(icon), type, displayAdapter); } - public static Builder create(ItemStack icon, AdvancementType type, Consumer displayAdapter) { + public static Builder create( + ItemStack icon, + AdvancementType type, + Consumer displayAdapter + ) { var id = BuiltInRegistries.ITEM.getKey(icon.getItem()); boolean canBuild = true; if (id == null || icon.is(Items.AIR)) { @@ -168,7 +191,10 @@ public class AdvancementManager { return b; } - public static > Builder createRecipe(T recipe, AdvancementType type) { + public static > Builder createRecipe( + T recipe, + AdvancementType type + ) { Item item = recipe.getResultItem().getItem(); return create(item, type, displayBuilder -> displayBuilder.hideToast().hideFromChat()) //.awardRecipe(item) @@ -365,15 +391,10 @@ public class AdvancementManager { return this; } - public ResourceLocation buildAndRegister() { + public ResourceLocation build() { AdvancementManager.register(id, this.builder); return this.id; } - - public ResourceLocation buildAndRegister(Map map) { - map.put(id, this.builder); - return this.id; - } } public static class DisplayBuilder { diff --git a/src/main/java/org/betterx/bclib/mixin/common/ServerAdvancementManagerMixin.java b/src/main/java/org/betterx/bclib/mixin/common/ServerAdvancementManagerMixin.java deleted file mode 100644 index 5dad6785..00000000 --- a/src/main/java/org/betterx/bclib/mixin/common/ServerAdvancementManagerMixin.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.betterx.bclib.mixin.common; - -import org.betterx.bclib.api.v2.advancement.AdvancementManager; - -import net.minecraft.advancements.Advancement; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.ServerAdvancementManager; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.ModifyArg; - -import java.util.Map; - -@Mixin(ServerAdvancementManager.class) -public class ServerAdvancementManagerMixin { - @ModifyArg(method = "apply(Ljava/util/Map;Lnet/minecraft/server/packs/resources/ResourceManager;Lnet/minecraft/util/profiling/ProfilerFiller;)V", - at = @At(value = "INVOKE", target = "Lnet/minecraft/advancements/AdvancementList;add(Ljava/util/Map;)V")) - public Map bcl_interceptApply(Map map) { - AdvancementManager.addAdvancements(map); - return map; - } -} diff --git a/src/main/java/org/betterx/bclib/recipes/AbstractAdvancementRecipe.java b/src/main/java/org/betterx/bclib/recipes/AbstractAdvancementRecipe.java index 7bab6877..f69e4318 100644 --- a/src/main/java/org/betterx/bclib/recipes/AbstractAdvancementRecipe.java +++ b/src/main/java/org/betterx/bclib/recipes/AbstractAdvancementRecipe.java @@ -214,7 +214,7 @@ public class AbstractAdvancementRecipe { .endReward() .requirements(RequirementsStrategy.OR); - advancement.buildAndRegister(); + advancement.build(); } } } diff --git a/src/main/resources/bclib.mixins.common.json b/src/main/resources/bclib.mixins.common.json index d60703da..36ce354f 100644 --- a/src/main/resources/bclib.mixins.common.json +++ b/src/main/resources/bclib.mixins.common.json @@ -32,7 +32,6 @@ "RecipeManagerMixin", "RecipeMixin", "RegistryDataLoaderMixin", - "ServerAdvancementManagerMixin", "ServerLevelMixin", "ShovelItemAccessor", "SurfaceRulesContextAccessor",