From daa9ab0ab3c1850fbe078238846da2a28b40e657 Mon Sep 17 00:00:00 2001 From: Siphalor Date: Tue, 22 Nov 2022 21:26:17 +0100 Subject: [PATCH] Fix #126 (Compatibility with Fabric API 0.67.0+) --- gradle.properties | 2 +- .../nbtcrafting/mixin/MixinRecipe.java | 70 ++++++++++++------- src/main/resources/fabric.mod.json | 2 +- 3 files changed, 45 insertions(+), 29 deletions(-) diff --git a/gradle.properties b/gradle.properties index 6c49bbfe..03052cc8 100644 --- a/gradle.properties +++ b/gradle.properties @@ -7,7 +7,7 @@ org.gradle.jvmargs=-Xmx1G minecraft_version=1.17.1 minecraft_major_version = 1.17 yarn_mappings=1:v2 - loader_version=0.11.6 + loader_version=0.14.10 # Mod Properties mod_version = 2.2.2 diff --git a/src/main/java/de/siphalor/nbtcrafting/mixin/MixinRecipe.java b/src/main/java/de/siphalor/nbtcrafting/mixin/MixinRecipe.java index d6b0f573..fa3189ca 100644 --- a/src/main/java/de/siphalor/nbtcrafting/mixin/MixinRecipe.java +++ b/src/main/java/de/siphalor/nbtcrafting/mixin/MixinRecipe.java @@ -17,9 +17,9 @@ package de.siphalor.nbtcrafting.mixin; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; +import de.siphalor.nbtcrafting.api.RecipeUtil; +import de.siphalor.nbtcrafting.api.recipe.NBTCRecipe; +import de.siphalor.nbtcrafting.ingredient.IIngredient; import net.minecraft.inventory.Inventory; import net.minecraft.item.ItemStack; @@ -28,36 +28,51 @@ import net.minecraft.util.collection.DefaultedList; import org.apache.commons.lang3.ArrayUtils; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Overwrite; 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.CallbackInfoReturnable; +import org.spongepowered.asm.mixin.injection.callback.LocalCapture; -import de.siphalor.nbtcrafting.api.RecipeUtil; -import de.siphalor.nbtcrafting.api.recipe.NBTCRecipe; -import de.siphalor.nbtcrafting.ingredient.IIngredient; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; @Mixin(Recipe.class) public interface MixinRecipe { @Shadow DefaultedList getIngredients(); - /** - * @reason Returns the recipe remainders. Sadly has to overwrite since this is an interface. - * @author Siphalor - */ - @Overwrite - default DefaultedList getRemainder(Inventory inventory) { - final DefaultedList stackList = DefaultedList.ofSize(inventory.size(), ItemStack.EMPTY); - Map reference; + @Inject(method = "getRemainder", at = @At("RETURN"), locals = LocalCapture.CAPTURE_FAILSOFT) + default void modifyRemainingStacks(Inventory inventory, CallbackInfoReturnable> cir, DefaultedList stackList) { + // The stackList is already pre-populated with Vanilla and Fabric API remainders List ingredients; - int[] resolvedIngredientStacks; - if (this instanceof NBTCRecipe) { + boolean customRecipe = this instanceof NBTCRecipe; + if (customRecipe) { ingredients = new ArrayList<>(((NBTCRecipe) this).getIngredients()); - resolvedIngredientStacks = RecipeUtil.resolveIngredients(ingredients, inventory); - // noinspection unchecked - reference = ((NBTCRecipe) this).buildDollarReference(inventory, resolvedIngredientStacks); } else { ingredients = getIngredients(); - resolvedIngredientStacks = RecipeUtil.resolveIngredients(ingredients, inventory); + } + + boolean shallContinue = false; + for (Ingredient ingredient : ingredients) { + if (((IIngredient) (Object) ingredient).nbtCrafting$isAdvanced()) { + shallContinue = true; + break; + } + } + if (!shallContinue) { + return; + } + + // Resolve the ingredient indexes to the belonging stack indices + int[] resolvedIngredientStacks = RecipeUtil.resolveIngredients(ingredients, inventory); + Map reference; + + if (customRecipe) { + // noinspection unchecked + reference = ((NBTCRecipe) this).buildDollarReference(inventory, resolvedIngredientStacks); + } else { reference = RecipeUtil.buildReferenceMapFromResolvedIngredients(resolvedIngredientStacks, inventory); } @@ -65,16 +80,17 @@ default DefaultedList getRemainder(Inventory inventory) { ItemStack stack = inventory.getStack(i); int ingredientIndex = ArrayUtils.indexOf(resolvedIngredientStacks, i); if (ingredientIndex >= 0) { - ItemStack remainder = ((IIngredient) (Object) ingredients.get(ingredientIndex)).nbtCrafting$getRecipeRemainder(stack, reference); + IIngredient ingredient = (IIngredient) (Object) ingredients.get(ingredientIndex); + // Simple, Vanilla-ish entries should already be set + if (!ingredient.nbtCrafting$isAdvanced()) { + continue; + } + + ItemStack remainder = ingredient.nbtCrafting$getRecipeRemainder(stack, reference); if (remainder != null) { stackList.set(i, remainder); - continue; } } - if (stack.getItem().hasRecipeRemainder()) { - stackList.set(i, new ItemStack(stack.getItem().getRecipeRemainder())); - } } - return stackList; } } diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 614d3dd6..c536e41f 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -43,7 +43,7 @@ ] }, "depends": { - "fabricloader": ">=0.4.0" + "fabricloader": ">=0.13.0" }, "custom": { "modmenu": {