diff --git a/src/main/java/org/betterx/bclib/mixin/common/RecipeManagerMixin.java b/src/main/java/org/betterx/bclib/mixin/common/RecipeManagerMixin.java index 5e5af94c..31d650ec 100644 --- a/src/main/java/org/betterx/bclib/mixin/common/RecipeManagerMixin.java +++ b/src/main/java/org/betterx/bclib/mixin/common/RecipeManagerMixin.java @@ -3,16 +3,20 @@ package org.betterx.bclib.mixin.common; import org.betterx.bclib.recipes.BCLRecipeManager; import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.packs.resources.ResourceManager; +import net.minecraft.util.profiling.ProfilerFiller; import net.minecraft.world.Container; import net.minecraft.world.item.crafting.Recipe; import net.minecraft.world.item.crafting.RecipeManager; import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.world.level.Level; +import com.google.gson.JsonElement; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import java.util.Map; @@ -32,4 +36,15 @@ public abstract class RecipeManagerMixin { ) { info.setReturnValue(BCLRecipeManager.getSortedRecipe(type, inventory, level, this::byType)); } + + @Inject(method = "apply(Ljava/util/Map;Lnet/minecraft/server/packs/resources/ResourceManager;Lnet/minecraft/util/profiling/ProfilerFiller;)V", at = @At("HEAD")) + public void bcl_interceptApply( + Map map, + ResourceManager resourceManager, + ProfilerFiller profiler, + CallbackInfo info + ) { + BCLRecipeManager.removeDisabledRecipes(resourceManager, map); + } + } \ No newline at end of file diff --git a/src/main/java/org/betterx/bclib/recipes/BCLRecipeManager.java b/src/main/java/org/betterx/bclib/recipes/BCLRecipeManager.java index 9dfd1cbc..4c3aa166 100644 --- a/src/main/java/org/betterx/bclib/recipes/BCLRecipeManager.java +++ b/src/main/java/org/betterx/bclib/recipes/BCLRecipeManager.java @@ -1,10 +1,14 @@ package org.betterx.bclib.recipes; +import org.betterx.bclib.BCLib; +import org.betterx.bclib.config.Configs; import org.betterx.bclib.util.CollectionsUtil; +import org.betterx.worlds.together.util.DatapackConfigs; import net.minecraft.core.Registry; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.packs.resources.ResourceManager; import net.minecraft.world.Container; import net.minecraft.world.item.Items; import net.minecraft.world.item.crafting.Recipe; @@ -15,10 +19,14 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import com.google.common.collect.Maps; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; import java.util.*; import java.util.Map.Entry; import java.util.function.Function; +import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.NotNull; public class BCLRecipeManager { private static final Map> _RECIPES = Maps.newHashMap(); @@ -54,15 +62,6 @@ public class BCLRecipeManager { return recipes.stream().filter(recipe -> recipe.matches(inventory, level)).findFirst(); } - public static > void addRecipe(RecipeType type, T recipe) { - Map list = BCLRecipeManager.RECIPES().computeIfAbsent(type, i -> Maps.newHashMap()); - list.put(recipe.getId(), recipe); - } - - public static > T getRecipe(RecipeType type, ResourceLocation id) { - Map map = BCLRecipeManager.RECIPES().get(type); - return map != null ? map.get(id) : null; - } public static > Map, Map> getMap( Map, Map> recipes @@ -124,12 +123,36 @@ public class BCLRecipeManager { } } - public static boolean exists(ItemLike... items) { - for (ItemLike item : items) { - if (!exists(item)) { - return false; - } + private final static HashSet disabledRecipes = new HashSet<>(); + + private static void clearRecipeConfig() { + disabledRecipes.clear(); + } + + private static void processRecipeConfig(@NotNull ResourceLocation sourceId, @NotNull JsonObject root) { + if (root.has("disable")) { + root + .getAsJsonArray("disable") + .asList() + .stream() + .map(el -> ResourceLocation.tryParse(el.getAsString())) + .filter(id -> id != null) + .forEach(disabledRecipes::add); + } + } + + @ApiStatus.Internal + public static void removeDisabledRecipes(ResourceManager manager, Map map) { + clearRecipeConfig(); + DatapackConfigs + .instance() + .runForResources(manager, BCLib.MOD_ID, "recipes.json", BCLRecipeManager::processRecipeConfig); + + for (ResourceLocation id : disabledRecipes) { + if (Configs.MAIN_CONFIG.verboseLogging()) { + BCLib.LOGGER.info("Disabling Recipe: {}", id); + } + map.remove(id); } - return true; } } \ No newline at end of file