Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -27,44 +27,49 @@ public class PacketRecipeTransfer extends PlayToServerPacket<PacketRecipeTransfe
p -> p.maxTransfer,
ByteBufCodecs.BOOL,
p -> p.requireCompleteSets,
PacketRecipeTransfer::new
ByteBufCodecs.VAR_INT.apply(ByteBufCodecs.list()),
p->p.itemTransferAmounts,
PacketRecipeTransfer::new
);

public final List<TransferOperation> transferOperations;
public final List<Integer> craftingSlots;
public final List<Integer> inventorySlots;
private final boolean maxTransfer;
private final boolean requireCompleteSets;
private final List<Integer> itemTransferAmounts;

public static PacketRecipeTransfer fromSlots(
List<TransferOperation> transferOperations,
List<Slot> craftingSlots,
List<Slot> inventorySlots,
boolean maxTransfer,
boolean requireCompleteSets
) {
boolean requireCompleteSets,
List<Integer> 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<TransferOperation> transferOperations,
List<Integer> craftingSlots,
List<Integer> inventorySlots,
boolean maxTransfer,
boolean requireCompleteSets
) {
List<TransferOperation> transferOperations,
List<Integer> craftingSlots,
List<Integer> inventorySlots,
boolean maxTransfer,
boolean requireCompleteSets, List<Integer> itemTransferAmounts
) {
this.transferOperations = transferOperations;
this.craftingSlots = craftingSlots;
this.inventorySlots = inventorySlots;
this.maxTransfer = maxTransfer;
this.requireCompleteSets = requireCompleteSets;
}
this.itemTransferAmounts = itemTransferAmounts;
}

@Override
public Type<PacketRecipeTransfer> type() {
Expand All @@ -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
);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand All @@ -33,8 +27,8 @@ public static void setItems(
List<Slot> craftingSlots,
List<Slot> inventorySlots,
boolean maxTransfer,
boolean requireCompleteSets
) {
boolean requireCompleteSets,
List<Integer> itemTransferAmounts) {
if (!RecipeTransferUtil.validateSlots(player, transferOperations, craftingSlots, inventorySlots)) {
return;
}
Expand All @@ -54,7 +48,8 @@ public static void setItems(
craftingSlots,
inventorySlots,
transferAsCompleteSets,
maxTransfer
maxTransfer,
itemTransferAmounts
);

if (recipeSlotToTakenStacks.isEmpty()) {
Expand Down Expand Up @@ -132,7 +127,7 @@ private static List<ItemStack> putItemsIntoCraftingGrid(

@Nullable
private static Map<Slot, ItemStackWithSlotHint> calculateRequiredStacks(List<TransferOperation> transferOperations, Player player) {
Map<Slot, ItemStackWithSlotHint> recipeSlotToRequired = new HashMap<>(transferOperations.size());
Map<Slot, ItemStackWithSlotHint> recipeSlotToRequired = new LinkedHashMap<>(transferOperations.size());
for (TransferOperation transferOperation : transferOperations) {
Slot recipeSlot = transferOperation.craftingSlot(player.containerMenu);
Slot inventorySlot = transferOperation.inventorySlot(player.containerMenu);
Expand Down Expand Up @@ -167,26 +162,28 @@ private static Map<Slot, ItemStack> takeItemsFromInventory(
List<Slot> craftingSlots,
List<Slot> inventorySlots,
boolean transferAsCompleteSets,
boolean maxTransfer
) {
boolean maxTransfer,
List<Integer> itemTransferAmount) {
if (!maxTransfer) {
return removeOneSetOfItemsFromInventory(
player,
recipeSlotToRequiredItemStack,
craftingSlots,
inventorySlots,
transferAsCompleteSets
transferAsCompleteSets,
itemTransferAmount
);
}

final Map<Slot, ItemStack> recipeSlotToResult = new HashMap<>(recipeSlotToRequiredItemStack.size());
final Map<Slot, ItemStack> recipeSlotToResult = new LinkedHashMap<>(recipeSlotToRequiredItemStack.size());
while (true) {
final Map<Slot, ItemStack> foundItemsInSet = removeOneSetOfItemsFromInventory(
player,
recipeSlotToRequiredItemStack,
craftingSlots,
inventorySlots,
transferAsCompleteSets
transferAsCompleteSets,
itemTransferAmount
);

if (foundItemsInSet.isEmpty()) {
Expand All @@ -210,8 +207,8 @@ private static Map<Slot, ItemStack> removeOneSetOfItemsFromInventory(
Map<Slot, ItemStackWithSlotHint> recipeSlotToRequiredItemStack,
List<Slot> craftingSlots,
List<Slot> inventorySlots,
boolean transferAsCompleteSets
) {
boolean transferAsCompleteSets,
List<Integer> itemTransferAmounts) {
Map<Slot, ItemStack> originalSlotContents = null;
if (transferAsCompleteSets) {
// We only need to create a new map for each set iteration if we're transferring as complete sets.
Expand All @@ -221,8 +218,10 @@ private static Map<Slot, ItemStack> 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<Slot, ItemStack> foundItemsInSet = new HashMap<>(recipeSlotToRequiredItemStack.size());
final Map<Slot, ItemStack> foundItemsInSet = new LinkedHashMap<>(recipeSlotToRequiredItemStack.size());

//TODO order
int index=0;
for (Map.Entry<Slot, ItemStackWithSlotHint> entry : recipeSlotToRequiredItemStack.entrySet()) { // for each item in set
final Slot recipeSlot = entry.getKey();
final ItemStack requiredStack = entry.getValue().stack;
Expand All @@ -240,9 +239,16 @@ private static Map<Slot, ItemStack> 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) {
Expand All @@ -256,6 +262,7 @@ private static Map<Slot, ItemStack> removeOneSetOfItemsFromInventory(
return Map.of();
}
}
index++;
}
return foundItemsInSet;
}
Expand Down
3 changes: 2 additions & 1 deletion CommonApi/src/main/java/mezz/jei/api/IModPlugin.java
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -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) {

}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import net.minecraft.world.inventory.MenuType;
import org.jetbrains.annotations.Nullable;

import java.util.List;
import java.util.Optional;

/**
Expand Down Expand Up @@ -51,4 +52,14 @@ public interface IRecipeTransferHandler<C extends AbstractContainerMenu, R> {
*/
@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, typically, item amounts in the recipe
* @return list of amounts for items to transfer
*/
default List<Integer> getItemTransferAmounts(R recipe)
{
return List.of();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -102,4 +103,6 @@ <C extends AbstractContainerMenu, R> IRecipeTransferInfo<C, R> createBasicRecipe
* @since 19.16.1
*/
Map<Integer, Ingredient> getGuiSlotIndexToIngredientMap(RecipeHolder<CraftingRecipe> recipeHolder);

IStackHelper getStackHelper();
}
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,8 @@ public IRecipeTransferError transferRecipe(C container, R recipe, IRecipeSlotsVi
craftingSlots,
inventorySlots,
maxTransfer,
requireCompleteSets
requireCompleteSets,
getItemTransferAmounts(recipe)
);
serverConnection.sendPacketToServer(packet);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -95,4 +95,9 @@ public Map<Integer, Ingredient> getGuiSlotIndexToIngredientMap(RecipeHolder<Craf
ImmutableSize2i recipeSize = craftingRecipeCategory.getRecipeSize(recipeHolder);
return CraftingGridHelper.getGuiSlotToIngredientMap(recipeHolder, recipeSize.width(), recipeSize.height());
}

@Override
public IStackHelper getStackHelper() {
return stackHelper;
}
}