From 7e7772d789f02c021a6ce7e706a44027619d4763 Mon Sep 17 00:00:00 2001 From: AlexiyOrlov Date: Fri, 20 Dec 2024 14:23:07 +0200 Subject: [PATCH 1/3] Expose recipe transfer handler helper to mod plugin; add optional item amount transfer method; expose stack helper; implement item transfer with variable size input stack --- .../network/packets/PacketRecipeTransfer.java | 30 ++++++----- .../BasicRecipeTransferHandlerServer.java | 53 +++++++++++-------- .../main/java/mezz/jei/api/IModPlugin.java | 3 +- .../transfer/IRecipeTransferHandler.java | 7 +++ .../IRecipeTransferHandlerHelper.java | 3 ++ .../mezz/jei/library/load/PluginLoader.java | 2 +- .../plugins/vanilla/VanillaPlugin.java | 2 +- .../transfer/BasicRecipeTransferHandler.java | 3 +- .../transfer/RecipeTransferHandlerHelper.java | 5 ++ 9 files changed, 69 insertions(+), 39 deletions(-) diff --git a/Common/src/main/java/mezz/jei/common/network/packets/PacketRecipeTransfer.java b/Common/src/main/java/mezz/jei/common/network/packets/PacketRecipeTransfer.java index 54e1818a0..f4ef6e975 100644 --- a/Common/src/main/java/mezz/jei/common/network/packets/PacketRecipeTransfer.java +++ b/Common/src/main/java/mezz/jei/common/network/packets/PacketRecipeTransfer.java @@ -27,7 +27,9 @@ public class PacketRecipeTransfer extends PlayToServerPacket p.maxTransfer, ByteBufCodecs.BOOL, p -> p.requireCompleteSets, - PacketRecipeTransfer::new + ByteBufCodecs.VAR_INT.apply(ByteBufCodecs.list()), + p->p.itemTransferAmounts, + PacketRecipeTransfer::new ); public final List transferOperations; @@ -35,36 +37,39 @@ public class PacketRecipeTransfer extends PlayToServerPacket inventorySlots; private final boolean maxTransfer; private final boolean requireCompleteSets; + private final List itemTransferAmounts; public static PacketRecipeTransfer fromSlots( List transferOperations, List craftingSlots, List inventorySlots, boolean maxTransfer, - boolean requireCompleteSets - ) { + boolean requireCompleteSets, + List itemTransferAmounts) { return new PacketRecipeTransfer( transferOperations, craftingSlots.stream().map(s -> s.index).toList(), inventorySlots.stream().map(s -> s.index).toList(), maxTransfer, - requireCompleteSets + requireCompleteSets, + itemTransferAmounts ); } public PacketRecipeTransfer( - List transferOperations, - List craftingSlots, - List inventorySlots, - boolean maxTransfer, - boolean requireCompleteSets - ) { + List transferOperations, + List craftingSlots, + List inventorySlots, + boolean maxTransfer, + boolean requireCompleteSets, List itemTransferAmounts + ) { this.transferOperations = transferOperations; this.craftingSlots = craftingSlots; this.inventorySlots = inventorySlots; this.maxTransfer = maxTransfer; this.requireCompleteSets = requireCompleteSets; - } + this.itemTransferAmounts = itemTransferAmounts; + } @Override public Type type() { @@ -85,7 +90,8 @@ public void process(ServerPacketContext context) { craftingSlots.stream().map(container::getSlot).toList(), inventorySlots.stream().map(container::getSlot).toList(), maxTransfer, - requireCompleteSets + requireCompleteSets, + itemTransferAmounts ); } diff --git a/Common/src/main/java/mezz/jei/common/transfer/BasicRecipeTransferHandlerServer.java b/Common/src/main/java/mezz/jei/common/transfer/BasicRecipeTransferHandlerServer.java index dba8a5344..1270a7a68 100644 --- a/Common/src/main/java/mezz/jei/common/transfer/BasicRecipeTransferHandlerServer.java +++ b/Common/src/main/java/mezz/jei/common/transfer/BasicRecipeTransferHandlerServer.java @@ -9,14 +9,8 @@ import javax.annotation.Nonnull; import org.jetbrains.annotations.Nullable; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.Set; + +import java.util.*; public final class BasicRecipeTransferHandlerServer { private static final Logger LOGGER = LogManager.getLogger(); @@ -33,8 +27,8 @@ public static void setItems( List craftingSlots, List inventorySlots, boolean maxTransfer, - boolean requireCompleteSets - ) { + boolean requireCompleteSets, + List itemTransferAmounts) { if (!RecipeTransferUtil.validateSlots(player, transferOperations, craftingSlots, inventorySlots)) { return; } @@ -54,7 +48,8 @@ public static void setItems( craftingSlots, inventorySlots, transferAsCompleteSets, - maxTransfer + maxTransfer, + itemTransferAmounts ); if (recipeSlotToTakenStacks.isEmpty()) { @@ -132,7 +127,7 @@ private static List putItemsIntoCraftingGrid( @Nullable private static Map calculateRequiredStacks(List transferOperations, Player player) { - Map recipeSlotToRequired = new HashMap<>(transferOperations.size()); + Map recipeSlotToRequired = new LinkedHashMap<>(transferOperations.size()); for (TransferOperation transferOperation : transferOperations) { Slot recipeSlot = transferOperation.craftingSlot(player.containerMenu); Slot inventorySlot = transferOperation.inventorySlot(player.containerMenu); @@ -167,26 +162,28 @@ private static Map takeItemsFromInventory( List craftingSlots, List inventorySlots, boolean transferAsCompleteSets, - boolean maxTransfer - ) { + boolean maxTransfer, + List itemTransferAmount) { if (!maxTransfer) { return removeOneSetOfItemsFromInventory( player, recipeSlotToRequiredItemStack, craftingSlots, inventorySlots, - transferAsCompleteSets + transferAsCompleteSets, + itemTransferAmount ); } - final Map recipeSlotToResult = new HashMap<>(recipeSlotToRequiredItemStack.size()); + final Map recipeSlotToResult = new LinkedHashMap<>(recipeSlotToRequiredItemStack.size()); while (true) { final Map foundItemsInSet = removeOneSetOfItemsFromInventory( player, recipeSlotToRequiredItemStack, craftingSlots, inventorySlots, - transferAsCompleteSets + transferAsCompleteSets, + itemTransferAmount ); if (foundItemsInSet.isEmpty()) { @@ -210,8 +207,8 @@ private static Map removeOneSetOfItemsFromInventory( Map recipeSlotToRequiredItemStack, List craftingSlots, List inventorySlots, - boolean transferAsCompleteSets - ) { + boolean transferAsCompleteSets, + List itemTransferAmounts) { Map originalSlotContents = null; if (transferAsCompleteSets) { // We only need to create a new map for each set iteration if we're transferring as complete sets. @@ -221,8 +218,10 @@ private static Map removeOneSetOfItemsFromInventory( // This map holds items found for each set iteration. Its contents are added to the result map // after each complete set iteration. If we are transferring as complete sets, this allows // us to simply ignore the map's contents when a complete set isn't found. - final Map foundItemsInSet = new HashMap<>(recipeSlotToRequiredItemStack.size()); + final Map foundItemsInSet = new LinkedHashMap<>(recipeSlotToRequiredItemStack.size()); + //TODO order + int index=0; for (Map.Entry entry : recipeSlotToRequiredItemStack.entrySet()) { // for each item in set final Slot recipeSlot = entry.getKey(); final ItemStack requiredStack = entry.getValue().stack; @@ -240,9 +239,16 @@ private static Map removeOneSetOfItemsFromInventory( } // Reduce the size of the found slot. - ItemStack removedItemStack = sourceSlot.safeTake(1, Integer.MAX_VALUE, player); - foundItemsInSet.put(recipeSlot, removedItemStack); - } else { + ItemStack removedItemStack; + if(itemTransferAmounts.isEmpty()) + { + removedItemStack = sourceSlot.safeTake(1, Integer.MAX_VALUE, player); + } + else { + removedItemStack = sourceSlot.safeTake(itemTransferAmounts.get(index), Integer.MAX_VALUE, player); + } + foundItemsInSet.put(recipeSlot, removedItemStack); + } else { // We can't find any more slots to fulfill the requirements. if (transferAsCompleteSets) { @@ -256,6 +262,7 @@ private static Map removeOneSetOfItemsFromInventory( return Map.of(); } } + index++; } return foundItemsInSet; } diff --git a/CommonApi/src/main/java/mezz/jei/api/IModPlugin.java b/CommonApi/src/main/java/mezz/jei/api/IModPlugin.java index 01d4d301c..0aef6aef7 100644 --- a/CommonApi/src/main/java/mezz/jei/api/IModPlugin.java +++ b/CommonApi/src/main/java/mezz/jei/api/IModPlugin.java @@ -1,6 +1,7 @@ package mezz.jei.api; import mezz.jei.api.helpers.IPlatformFluidHelper; +import mezz.jei.api.recipe.transfer.IRecipeTransferHandlerHelper; import mezz.jei.api.registration.IIngredientAliasRegistration; import mezz.jei.api.registration.IModInfoRegistration; import mezz.jei.api.registration.IRuntimeRegistration; @@ -111,7 +112,7 @@ default void registerRecipes(IRecipeRegistration registration) { /** * Register recipe transfer handlers (move ingredients from the inventory into crafting GUIs). */ - default void registerRecipeTransferHandlers(IRecipeTransferRegistration registration) { + default void registerRecipeTransferHandlers(IRecipeTransferRegistration registration, IRecipeTransferHandlerHelper transferHandlerHelper) { } diff --git a/CommonApi/src/main/java/mezz/jei/api/recipe/transfer/IRecipeTransferHandler.java b/CommonApi/src/main/java/mezz/jei/api/recipe/transfer/IRecipeTransferHandler.java index 04925b6cc..6a26ad5b0 100644 --- a/CommonApi/src/main/java/mezz/jei/api/recipe/transfer/IRecipeTransferHandler.java +++ b/CommonApi/src/main/java/mezz/jei/api/recipe/transfer/IRecipeTransferHandler.java @@ -8,6 +8,7 @@ import net.minecraft.world.inventory.MenuType; import org.jetbrains.annotations.Nullable; +import java.util.List; import java.util.Optional; /** @@ -51,4 +52,10 @@ public interface IRecipeTransferHandler { */ @Nullable IRecipeTransferError transferRecipe(C container, R recipe, IRecipeSlotsView recipeSlots, Player player, boolean maxTransfer, boolean doTransfer); + + default List getItemTransferAmounts(R recipe) + { + return List.of(); + } + } diff --git a/CommonApi/src/main/java/mezz/jei/api/recipe/transfer/IRecipeTransferHandlerHelper.java b/CommonApi/src/main/java/mezz/jei/api/recipe/transfer/IRecipeTransferHandlerHelper.java index a06a535ab..196b738df 100644 --- a/CommonApi/src/main/java/mezz/jei/api/recipe/transfer/IRecipeTransferHandlerHelper.java +++ b/CommonApi/src/main/java/mezz/jei/api/recipe/transfer/IRecipeTransferHandlerHelper.java @@ -3,6 +3,7 @@ import mezz.jei.api.gui.ingredient.ICraftingGridHelper; import mezz.jei.api.gui.ingredient.IRecipeSlotView; import mezz.jei.api.gui.ingredient.IRecipeSlotsView; +import mezz.jei.api.helpers.IStackHelper; import mezz.jei.api.recipe.RecipeType; import mezz.jei.api.recipe.transfer.IRecipeTransferError.Type; import mezz.jei.api.registration.IRecipeTransferRegistration; @@ -102,4 +103,6 @@ IRecipeTransferInfo createBasicRecipe * @since 19.16.1 */ Map getGuiSlotIndexToIngredientMap(RecipeHolder recipeHolder); + + IStackHelper getStackHelper(); } diff --git a/Library/src/main/java/mezz/jei/library/load/PluginLoader.java b/Library/src/main/java/mezz/jei/library/load/PluginLoader.java index 3defbdf2d..d66c5eefb 100644 --- a/Library/src/main/java/mezz/jei/library/load/PluginLoader.java +++ b/Library/src/main/java/mezz/jei/library/load/PluginLoader.java @@ -160,7 +160,7 @@ public static IRecipeTransferManager createRecipeTransferManager( .orElseThrow(() -> new NullPointerException("vanilla crafting category")); IRecipeTransferHandlerHelper handlerHelper = new RecipeTransferHandlerHelper(stackHelper, craftingCategory); RecipeTransferRegistration recipeTransferRegistration = new RecipeTransferRegistration(stackHelper, handlerHelper, jeiHelpers, connectionToServer); - PluginCaller.callOnPlugins("Registering recipes transfer handlers", plugins, p -> p.registerRecipeTransferHandlers(recipeTransferRegistration)); + PluginCaller.callOnPlugins("Registering recipes transfer handlers", plugins, p -> p.registerRecipeTransferHandlers(recipeTransferRegistration, handlerHelper)); return recipeTransferRegistration.createRecipeTransferManager(); } diff --git a/Library/src/main/java/mezz/jei/library/plugins/vanilla/VanillaPlugin.java b/Library/src/main/java/mezz/jei/library/plugins/vanilla/VanillaPlugin.java index 65b1e6fb4..3ed518973 100644 --- a/Library/src/main/java/mezz/jei/library/plugins/vanilla/VanillaPlugin.java +++ b/Library/src/main/java/mezz/jei/library/plugins/vanilla/VanillaPlugin.java @@ -302,7 +302,7 @@ public void registerGuiHandlers(IGuiHandlerRegistration registration) { } @Override - public void registerRecipeTransferHandlers(IRecipeTransferRegistration registration) { + public void registerRecipeTransferHandlers(IRecipeTransferRegistration registration, IRecipeTransferHandlerHelper transferHandlerHelper) { registration.addRecipeTransferHandler(CraftingMenu.class, MenuType.CRAFTING, RecipeTypes.CRAFTING, 1, 9, 10, 36); registration.addRecipeTransferHandler(CrafterMenu.class, MenuType.CRAFTER_3x3, RecipeTypes.CRAFTING, 0, 9, 9, 36); registration.addRecipeTransferHandler(FurnaceMenu.class, MenuType.FURNACE, RecipeTypes.SMELTING, 0, 1, 3, 36); diff --git a/Library/src/main/java/mezz/jei/library/transfer/BasicRecipeTransferHandler.java b/Library/src/main/java/mezz/jei/library/transfer/BasicRecipeTransferHandler.java index f58e0ebd0..68792ded0 100644 --- a/Library/src/main/java/mezz/jei/library/transfer/BasicRecipeTransferHandler.java +++ b/Library/src/main/java/mezz/jei/library/transfer/BasicRecipeTransferHandler.java @@ -130,7 +130,8 @@ public IRecipeTransferError transferRecipe(C container, R recipe, IRecipeSlotsVi craftingSlots, inventorySlots, maxTransfer, - requireCompleteSets + requireCompleteSets, + getItemTransferAmounts(recipe) ); serverConnection.sendPacketToServer(packet); } diff --git a/Library/src/main/java/mezz/jei/library/transfer/RecipeTransferHandlerHelper.java b/Library/src/main/java/mezz/jei/library/transfer/RecipeTransferHandlerHelper.java index ddffdf182..3809c4cd4 100644 --- a/Library/src/main/java/mezz/jei/library/transfer/RecipeTransferHandlerHelper.java +++ b/Library/src/main/java/mezz/jei/library/transfer/RecipeTransferHandlerHelper.java @@ -95,4 +95,9 @@ public Map getGuiSlotIndexToIngredientMap(RecipeHolder Date: Fri, 20 Dec 2024 14:30:25 +0200 Subject: [PATCH 2/3] Comment --- .../mezz/jei/api/recipe/transfer/IRecipeTransferHandler.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CommonApi/src/main/java/mezz/jei/api/recipe/transfer/IRecipeTransferHandler.java b/CommonApi/src/main/java/mezz/jei/api/recipe/transfer/IRecipeTransferHandler.java index 6a26ad5b0..03e01a204 100644 --- a/CommonApi/src/main/java/mezz/jei/api/recipe/transfer/IRecipeTransferHandler.java +++ b/CommonApi/src/main/java/mezz/jei/api/recipe/transfer/IRecipeTransferHandler.java @@ -53,6 +53,10 @@ public interface IRecipeTransferHandler { @Nullable IRecipeTransferError transferRecipe(C container, R recipe, IRecipeSlotsView recipeSlots, Player player, boolean maxTransfer, boolean doTransfer); + /** + * Provide here how many items to transfer for each requested item stack + * @return list of amounts for items to transfer + */ default List getItemTransferAmounts(R recipe) { return List.of(); From f4ddccf608de455c74e560edf3a390acf6c121dd Mon Sep 17 00:00:00 2001 From: AlexiyOrlov Date: Fri, 20 Dec 2024 14:52:11 +0200 Subject: [PATCH 3/3] Comment --- .../mezz/jei/api/recipe/transfer/IRecipeTransferHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CommonApi/src/main/java/mezz/jei/api/recipe/transfer/IRecipeTransferHandler.java b/CommonApi/src/main/java/mezz/jei/api/recipe/transfer/IRecipeTransferHandler.java index 03e01a204..432d9015f 100644 --- a/CommonApi/src/main/java/mezz/jei/api/recipe/transfer/IRecipeTransferHandler.java +++ b/CommonApi/src/main/java/mezz/jei/api/recipe/transfer/IRecipeTransferHandler.java @@ -54,7 +54,7 @@ public interface IRecipeTransferHandler { IRecipeTransferError transferRecipe(C container, R recipe, IRecipeSlotsView recipeSlots, Player player, boolean maxTransfer, boolean doTransfer); /** - * Provide here how many items to transfer for each requested item stack + * Provide here how many items to transfer for each requested item stack, typically, item amounts in the recipe * @return list of amounts for items to transfer */ default List getItemTransferAmounts(R recipe)