Skip to content
This repository was archived by the owner on Mar 10, 2024. It is now read-only.

Commit 977e7c2

Browse files
committed
Merge branch '1.18-2.0' into 1.19-2.0
2 parents 2fa8a77 + f1708c7 commit 977e7c2

5 files changed

Lines changed: 58 additions & 34 deletions

File tree

gradle.properties

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@ org.gradle.jvmargs=-Xmx1G
77
minecraft_version=1.19
88
minecraft_major_version = 1.19
99
yarn_mappings=4:v2
10-
loader_version=0.14.8
10+
loader_version=0.14.10
1111

1212
# Mod Properties
13-
mod_version = 2.2.2
13+
mod_version = 2.2.3
1414
mod_release = release
1515
mod_mc_version_specifier = 1.19
1616
mod_mc_versions = 1.19;1.19.1;1.19.2

src/main/java/de/siphalor/nbtcrafting/api/recipe/NBTCRecipe.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,4 +35,15 @@ public interface NBTCRecipe<I extends Inventory> extends Recipe<I> {
3535
* @return A map consisting of keys and belonging {@link net.minecraft.nbt.NbtCompound}s, {@link Number}s or {@link String}s
3636
*/
3737
Map<String, Object> buildDollarReference(I inv);
38+
39+
/**
40+
* An advanced form of the reference map, that allows to make use of the ingredient to stack resolution that Nbt Crafting does anyway.
41+
* @implNote For backwards compatibility, you must still override the simpler form {@link #buildDollarReference(Inventory)} either way.
42+
* @param inv the inventory for that this method is being called
43+
* @param ingredientToStackResolution An array which resolves the ingredient indexes from {@link #getIngredients()} to the stacks in the inventory.
44+
* @return A map consisting of keys and belonging {@link net.minecraft.nbt.CompoundTag}s, {@link Number}s or {@link String}s
45+
*/
46+
default Map<String, Object> buildDollarReference(I inv, int[] ingredientToStackResolution) {
47+
return buildDollarReference(inv);
48+
}
3849
}

src/main/java/de/siphalor/nbtcrafting/mixin/MixinIngredient.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -312,10 +312,7 @@ private static IngredientEntryCondition loadIngredientEntryCondition(JsonObject
312312
if (advancedEntries != null) {
313313
for (IngredientEntry entry : advancedEntries) {
314314
if (entry.matches(stack)) {
315-
ItemStack remainder = entry.getRecipeRemainder(stack, reference);
316-
if (remainder != null) {
317-
return remainder;
318-
}
315+
return entry.getRecipeRemainder(stack, reference);
319316
}
320317
}
321318
}

src/main/java/de/siphalor/nbtcrafting/mixin/MixinRecipe.java

Lines changed: 43 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@
1717

1818
package de.siphalor.nbtcrafting.mixin;
1919

20-
import java.util.ArrayList;
21-
import java.util.List;
22-
import java.util.Map;
20+
import de.siphalor.nbtcrafting.api.RecipeUtil;
21+
import de.siphalor.nbtcrafting.api.recipe.NBTCRecipe;
22+
import de.siphalor.nbtcrafting.ingredient.IIngredient;
2323

2424
import net.minecraft.inventory.Inventory;
2525
import net.minecraft.item.ItemStack;
@@ -28,53 +28,69 @@
2828
import net.minecraft.util.collection.DefaultedList;
2929
import org.apache.commons.lang3.ArrayUtils;
3030
import org.spongepowered.asm.mixin.Mixin;
31-
import org.spongepowered.asm.mixin.Overwrite;
3231
import org.spongepowered.asm.mixin.Shadow;
32+
import org.spongepowered.asm.mixin.injection.At;
33+
import org.spongepowered.asm.mixin.injection.Inject;
34+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
35+
import org.spongepowered.asm.mixin.injection.callback.LocalCapture;
3336

34-
import de.siphalor.nbtcrafting.api.RecipeUtil;
35-
import de.siphalor.nbtcrafting.api.recipe.NBTCRecipe;
36-
import de.siphalor.nbtcrafting.ingredient.IIngredient;
37+
import java.util.ArrayList;
38+
import java.util.List;
39+
import java.util.Map;
3740

3841
@Mixin(Recipe.class)
3942
public interface MixinRecipe {
4043
@Shadow
4144
DefaultedList<Ingredient> getIngredients();
4245

43-
/**
44-
* @reason Returns the recipe remainders. Sadly has to overwrite since this is an interface.
45-
* @author Siphalor
46-
*/
47-
@Overwrite
48-
default DefaultedList<ItemStack> getRemainder(Inventory inventory) {
49-
final DefaultedList<ItemStack> stackList = DefaultedList.ofSize(inventory.size(), ItemStack.EMPTY);
50-
Map<String, Object> reference;
46+
@Inject(method = "getRemainder", at = @At("RETURN"), locals = LocalCapture.CAPTURE_FAILSOFT)
47+
default void modifyRemainingStacks(Inventory inventory, CallbackInfoReturnable<DefaultedList<ItemStack>> cir, DefaultedList<ItemStack> stackList) {
48+
// The stackList is already pre-populated with Vanilla and Fabric API remainders
5149
List<Ingredient> ingredients;
52-
int[] resolvedIngredientStacks;
53-
if (this instanceof NBTCRecipe) {
50+
boolean customRecipe = this instanceof NBTCRecipe;
51+
if (customRecipe) {
5452
ingredients = new ArrayList<>(((NBTCRecipe<?>) this).getIngredients());
55-
// noinspection unchecked
56-
reference = ((NBTCRecipe<Inventory>) this).buildDollarReference(inventory);
57-
resolvedIngredientStacks = RecipeUtil.resolveIngredients(ingredients, inventory);
5853
} else {
5954
ingredients = getIngredients();
60-
resolvedIngredientStacks = RecipeUtil.resolveIngredients(ingredients, inventory);
55+
}
56+
57+
boolean shallContinue = false;
58+
for (Ingredient ingredient : ingredients) {
59+
if (((IIngredient) (Object) ingredient).nbtCrafting$isAdvanced()) {
60+
shallContinue = true;
61+
break;
62+
}
63+
}
64+
if (!shallContinue) {
65+
return;
66+
}
67+
68+
// Resolve the ingredient indexes to the belonging stack indices
69+
int[] resolvedIngredientStacks = RecipeUtil.resolveIngredients(ingredients, inventory);
70+
Map<String, Object> reference;
71+
72+
if (customRecipe) {
73+
// noinspection unchecked
74+
reference = ((NBTCRecipe<Inventory>) this).buildDollarReference(inventory, resolvedIngredientStacks);
75+
} else {
6176
reference = RecipeUtil.buildReferenceMapFromResolvedIngredients(resolvedIngredientStacks, inventory);
6277
}
6378

6479
for (int i = 0; i < stackList.size(); ++i) {
6580
ItemStack stack = inventory.getStack(i);
6681
int ingredientIndex = ArrayUtils.indexOf(resolvedIngredientStacks, i);
6782
if (ingredientIndex >= 0) {
68-
ItemStack remainder = ((IIngredient) (Object) ingredients.get(ingredientIndex)).nbtCrafting$getRecipeRemainder(stack, reference);
83+
IIngredient ingredient = (IIngredient) (Object) ingredients.get(ingredientIndex);
84+
// Simple, Vanilla-ish entries should already be set
85+
if (!ingredient.nbtCrafting$isAdvanced()) {
86+
continue;
87+
}
88+
89+
ItemStack remainder = ingredient.nbtCrafting$getRecipeRemainder(stack, reference);
6990
if (remainder != null) {
7091
stackList.set(i, remainder);
71-
continue;
7292
}
7393
}
74-
if (stack.getItem().hasRecipeRemainder()) {
75-
stackList.set(i, new ItemStack(stack.getItem().getRecipeRemainder()));
76-
}
7794
}
78-
return stackList;
7995
}
8096
}

src/main/resources/fabric.mod.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@
4343
]
4444
},
4545
"depends": {
46-
"fabricloader": ">=0.4.0"
46+
"fabricloader": ">=0.13.0"
4747
},
4848
"custom": {
4949
"modmenu": {

0 commit comments

Comments
 (0)