From 6ae511e48598fde849b20bddcc8203cc2b9d1c48 Mon Sep 17 00:00:00 2001 From: Ellpeck Date: Thu, 15 Oct 2020 06:07:06 +0200 Subject: [PATCH] unify equality types and add jei transfer --- .../jei/CraftingModuleTransferHandler.java | 52 +++++++++++ .../compat/jei/JEIPrettyPipesPlugin.java | 1 + .../de/ellpeck/prettypipes/items/IModule.java | 4 +- .../ellpeck/prettypipes/items/ModuleItem.java | 4 +- .../prettypipes/network/PipeNetwork.java | 4 +- .../packets/PacketCraftingModuleTransfer.java | 88 +++++++++++++++++++ .../prettypipes/packets/PacketHandler.java | 1 + .../prettypipes/pipe/PipeTileEntity.java | 8 +- .../craft/CraftingModuleContainer.java | 2 +- .../modules/craft/CraftingModuleItem.java | 11 ++- 10 files changed, 160 insertions(+), 15 deletions(-) create mode 100644 src/main/java/de/ellpeck/prettypipes/compat/jei/CraftingModuleTransferHandler.java create mode 100644 src/main/java/de/ellpeck/prettypipes/packets/PacketCraftingModuleTransfer.java diff --git a/src/main/java/de/ellpeck/prettypipes/compat/jei/CraftingModuleTransferHandler.java b/src/main/java/de/ellpeck/prettypipes/compat/jei/CraftingModuleTransferHandler.java new file mode 100644 index 0000000..85299b6 --- /dev/null +++ b/src/main/java/de/ellpeck/prettypipes/compat/jei/CraftingModuleTransferHandler.java @@ -0,0 +1,52 @@ +package de.ellpeck.prettypipes.compat.jei; + +import de.ellpeck.prettypipes.misc.ItemEqualityType; +import de.ellpeck.prettypipes.packets.PacketCraftingModuleTransfer; +import de.ellpeck.prettypipes.packets.PacketHandler; +import de.ellpeck.prettypipes.pipe.modules.craft.CraftingModuleContainer; +import mezz.jei.api.gui.IRecipeLayout; +import mezz.jei.api.gui.ingredient.IGuiIngredient; +import mezz.jei.api.recipe.transfer.IRecipeTransferError; +import mezz.jei.api.recipe.transfer.IRecipeTransferHandler; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class CraftingModuleTransferHandler implements IRecipeTransferHandler { + @Override + public Class getContainerClass() { + return CraftingModuleContainer.class; + } + + @Override + public IRecipeTransferError transferRecipe(CraftingModuleContainer container, Object recipe, IRecipeLayout recipeLayout, PlayerEntity player, boolean maxTransfer, boolean doTransfer) { + if (!doTransfer) + return null; + Map> ings = recipeLayout.getItemStacks().getGuiIngredients(); + List inputs = new ArrayList<>(); + List outputs = new ArrayList<>(); + for (Map.Entry> entry : ings.entrySet()) { + List allIngredients = entry.getValue().getAllIngredients(); + if (allIngredients.isEmpty()) + continue; + ItemStack remain = allIngredients.get(0).copy(); + List toAdd = entry.getValue().isInput() ? inputs : outputs; + for (ItemStack stack : toAdd) { + if (ItemEqualityType.compareItems(stack, remain)) { + int fits = Math.min(stack.getMaxStackSize() - stack.getCount(), remain.getCount()); + stack.grow(fits); + remain.shrink(fits); + if (remain.isEmpty()) + break; + } + } + if (!remain.isEmpty()) + toAdd.add(remain); + } + PacketHandler.sendToServer(new PacketCraftingModuleTransfer(inputs, outputs)); + return null; + } +} diff --git a/src/main/java/de/ellpeck/prettypipes/compat/jei/JEIPrettyPipesPlugin.java b/src/main/java/de/ellpeck/prettypipes/compat/jei/JEIPrettyPipesPlugin.java index 143d4f5..b89ea94 100644 --- a/src/main/java/de/ellpeck/prettypipes/compat/jei/JEIPrettyPipesPlugin.java +++ b/src/main/java/de/ellpeck/prettypipes/compat/jei/JEIPrettyPipesPlugin.java @@ -53,6 +53,7 @@ public class JEIPrettyPipesPlugin implements IModPlugin { @Override public void registerRecipeTransferHandlers(IRecipeTransferRegistration registration) { registration.addRecipeTransferHandler(new CraftingTerminalTransferHandler(), VanillaRecipeCategoryUid.CRAFTING); + registration.addUniversalRecipeTransferHandler(new CraftingModuleTransferHandler()); } @SubscribeEvent diff --git a/src/main/java/de/ellpeck/prettypipes/items/IModule.java b/src/main/java/de/ellpeck/prettypipes/items/IModule.java index d288343..ed104ed 100644 --- a/src/main/java/de/ellpeck/prettypipes/items/IModule.java +++ b/src/main/java/de/ellpeck/prettypipes/items/IModule.java @@ -37,7 +37,7 @@ public interface IModule { List getAllCraftables(ItemStack module, PipeTileEntity tile); - int getCraftableAmount(ItemStack module, PipeTileEntity tile, Consumer unavailableConsumer, ItemStack stack, ItemEqualityType... equalityTypes); + int getCraftableAmount(ItemStack module, PipeTileEntity tile, Consumer unavailableConsumer, ItemStack stack); - ItemStack craft(ItemStack module, PipeTileEntity tile, BlockPos destPipe, Consumer unavailableConsumer, ItemStack stack, ItemEqualityType... equalityTypes); + ItemStack craft(ItemStack module, PipeTileEntity tile, BlockPos destPipe, Consumer unavailableConsumer, ItemStack stack); } diff --git a/src/main/java/de/ellpeck/prettypipes/items/ModuleItem.java b/src/main/java/de/ellpeck/prettypipes/items/ModuleItem.java index 95b731b..3292189 100644 --- a/src/main/java/de/ellpeck/prettypipes/items/ModuleItem.java +++ b/src/main/java/de/ellpeck/prettypipes/items/ModuleItem.java @@ -84,12 +84,12 @@ public abstract class ModuleItem extends Item implements IModule { } @Override - public int getCraftableAmount(ItemStack module, PipeTileEntity tile, Consumer unavailableConsumer, ItemStack stack, ItemEqualityType... equalityTypes) { + public int getCraftableAmount(ItemStack module, PipeTileEntity tile, Consumer unavailableConsumer, ItemStack stack) { return 0; } @Override - public ItemStack craft(ItemStack module, PipeTileEntity tile, BlockPos destPipe, Consumer unavailableConsumer, ItemStack stack, ItemEqualityType... equalityTypes) { + public ItemStack craft(ItemStack module, PipeTileEntity tile, BlockPos destPipe, Consumer unavailableConsumer, ItemStack stack) { return stack; } } diff --git a/src/main/java/de/ellpeck/prettypipes/network/PipeNetwork.java b/src/main/java/de/ellpeck/prettypipes/network/PipeNetwork.java index 17eefa5..80d3a66 100644 --- a/src/main/java/de/ellpeck/prettypipes/network/PipeNetwork.java +++ b/src/main/java/de/ellpeck/prettypipes/network/PipeNetwork.java @@ -204,7 +204,7 @@ public class PipeNetwork implements ICapabilitySerializable, GraphL PipeTileEntity pipe = this.getPipe(craftable.getLeft()); if (pipe == null) continue; - stack = pipe.craft(destPipe, unavailableConsumer, stack, equalityTypes); + stack = pipe.craft(destPipe, unavailableConsumer, stack); if (stack.isEmpty()) break; } @@ -274,7 +274,7 @@ public class PipeNetwork implements ICapabilitySerializable, GraphL continue; PipeTileEntity pipe = this.getPipe(pair.getLeft()); if (pipe != null) - total += pipe.getCraftableAmount(unavailableConsumer, stack, equalityTypes); + total += pipe.getCraftableAmount(unavailableConsumer, stack); } return total; } diff --git a/src/main/java/de/ellpeck/prettypipes/packets/PacketCraftingModuleTransfer.java b/src/main/java/de/ellpeck/prettypipes/packets/PacketCraftingModuleTransfer.java new file mode 100644 index 0000000..b768591 --- /dev/null +++ b/src/main/java/de/ellpeck/prettypipes/packets/PacketCraftingModuleTransfer.java @@ -0,0 +1,88 @@ +package de.ellpeck.prettypipes.packets; + +import com.google.common.collect.ArrayListMultimap; +import com.google.common.collect.ListMultimap; +import de.ellpeck.prettypipes.Utility; +import de.ellpeck.prettypipes.misc.FilterSlot; +import de.ellpeck.prettypipes.misc.ItemEqualityType; +import de.ellpeck.prettypipes.pipe.PipeTileEntity; +import de.ellpeck.prettypipes.pipe.modules.craft.CraftingModuleContainer; +import de.ellpeck.prettypipes.pipe.modules.craft.CraftingModuleItem; +import de.ellpeck.prettypipes.terminal.CraftingTerminalTileEntity; +import de.ellpeck.prettypipes.terminal.ItemTerminalTileEntity; +import net.minecraft.client.Minecraft; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.inventory.container.Slot; +import net.minecraft.item.ItemStack; +import net.minecraft.network.PacketBuffer; +import net.minecraft.util.math.BlockPos; +import net.minecraftforge.fml.network.NetworkEvent; +import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.items.ItemHandlerHelper; +import net.minecraftforge.items.ItemStackHandler; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.function.Consumer; +import java.util.function.Supplier; + +public class PacketCraftingModuleTransfer { + + private List inputs; + private List outputs; + + public PacketCraftingModuleTransfer(List inputs, List outputs) { + this.inputs = inputs; + this.outputs = outputs; + } + + private PacketCraftingModuleTransfer() { + + } + + public static PacketCraftingModuleTransfer fromBytes(PacketBuffer buf) { + PacketCraftingModuleTransfer packet = new PacketCraftingModuleTransfer(); + packet.inputs = new ArrayList<>(); + for (int i = buf.readInt(); i > 0; i--) + packet.inputs.add(buf.readItemStack()); + packet.outputs = new ArrayList<>(); + for (int i = buf.readInt(); i > 0; i--) + packet.outputs.add(buf.readItemStack()); + return packet; + } + + public static void toBytes(PacketCraftingModuleTransfer packet, PacketBuffer buf) { + buf.writeInt(packet.inputs.size()); + for (ItemStack stack : packet.inputs) + buf.writeItemStack(stack); + buf.writeInt(packet.outputs.size()); + for (ItemStack stack : packet.outputs) + buf.writeItemStack(stack); + } + + @SuppressWarnings("Convert2Lambda") + public static void onMessage(PacketCraftingModuleTransfer message, Supplier ctx) { + ctx.get().enqueueWork(new Runnable() { + @Override + public void run() { + PlayerEntity player = ctx.get().getSender(); + if (player.openContainer instanceof CraftingModuleContainer) { + CraftingModuleContainer container = (CraftingModuleContainer) player.openContainer; + copy(container.input, message.inputs); + copy(container.output, message.outputs); + container.modified = true; + container.detectAndSendChanges(); + } + } + }); + ctx.get().setPacketHandled(true); + } + + private static void copy(ItemStackHandler container, List contents) { + for (int i = 0; i < container.getSlots(); i++) + container.setStackInSlot(i, ItemStack.EMPTY); + for (ItemStack stack : contents) + ItemHandlerHelper.insertItem(container, stack, false); + } +} diff --git a/src/main/java/de/ellpeck/prettypipes/packets/PacketHandler.java b/src/main/java/de/ellpeck/prettypipes/packets/PacketHandler.java index 380ee47..dc1909b 100644 --- a/src/main/java/de/ellpeck/prettypipes/packets/PacketHandler.java +++ b/src/main/java/de/ellpeck/prettypipes/packets/PacketHandler.java @@ -23,6 +23,7 @@ public final class PacketHandler { network.registerMessage(2, PacketNetworkItems.class, PacketNetworkItems::toBytes, PacketNetworkItems::fromBytes, PacketNetworkItems::onMessage); network.registerMessage(3, PacketRequest.class, PacketRequest::toBytes, PacketRequest::fromBytes, PacketRequest::onMessage); network.registerMessage(4, PacketGhostSlot.class, PacketGhostSlot::toBytes, PacketGhostSlot::fromBytes, PacketGhostSlot::onMessage); + network.registerMessage(5, PacketCraftingModuleTransfer.class, PacketCraftingModuleTransfer::toBytes, PacketCraftingModuleTransfer::fromBytes, PacketCraftingModuleTransfer::onMessage); } public static void sendToAllLoaded(World world, BlockPos pos, Object message) { diff --git a/src/main/java/de/ellpeck/prettypipes/pipe/PipeTileEntity.java b/src/main/java/de/ellpeck/prettypipes/pipe/PipeTileEntity.java index cdad262..1c3d18c 100644 --- a/src/main/java/de/ellpeck/prettypipes/pipe/PipeTileEntity.java +++ b/src/main/java/de/ellpeck/prettypipes/pipe/PipeTileEntity.java @@ -265,17 +265,17 @@ public class PipeTileEntity extends TileEntity implements INamedContainerProvide .collect(Collectors.toList()); } - public int getCraftableAmount(Consumer unavailableConsumer, ItemStack stack, ItemEqualityType... equalityTypes) { + public int getCraftableAmount(Consumer unavailableConsumer, ItemStack stack) { return this.streamModules() - .mapToInt(m -> m.getRight().getCraftableAmount(m.getLeft(), this, unavailableConsumer, stack, equalityTypes)) + .mapToInt(m -> m.getRight().getCraftableAmount(m.getLeft(), this, unavailableConsumer, stack)) .sum(); } - public ItemStack craft(BlockPos destPipe, Consumer unavailableConsumer, ItemStack stack, ItemEqualityType... equalityTypes) { + public ItemStack craft(BlockPos destPipe, Consumer unavailableConsumer, ItemStack stack) { Iterator> modules = this.streamModules().iterator(); while (modules.hasNext()) { Pair module = modules.next(); - stack = module.getRight().craft(module.getLeft(), this, destPipe, unavailableConsumer, stack, equalityTypes); + stack = module.getRight().craft(module.getLeft(), this, destPipe, unavailableConsumer, stack); if (stack.isEmpty()) break; } diff --git a/src/main/java/de/ellpeck/prettypipes/pipe/modules/craft/CraftingModuleContainer.java b/src/main/java/de/ellpeck/prettypipes/pipe/modules/craft/CraftingModuleContainer.java index 6db6f50..338a49b 100644 --- a/src/main/java/de/ellpeck/prettypipes/pipe/modules/craft/CraftingModuleContainer.java +++ b/src/main/java/de/ellpeck/prettypipes/pipe/modules/craft/CraftingModuleContainer.java @@ -11,7 +11,7 @@ public class CraftingModuleContainer extends AbstractPipeContainer type, int id, PlayerEntity player, BlockPos pos, int moduleIndex) { super(type, id, player, pos, moduleIndex); diff --git a/src/main/java/de/ellpeck/prettypipes/pipe/modules/craft/CraftingModuleItem.java b/src/main/java/de/ellpeck/prettypipes/pipe/modules/craft/CraftingModuleItem.java index 195afb8..0620355 100644 --- a/src/main/java/de/ellpeck/prettypipes/pipe/modules/craft/CraftingModuleItem.java +++ b/src/main/java/de/ellpeck/prettypipes/pipe/modules/craft/CraftingModuleItem.java @@ -81,9 +81,10 @@ public class CraftingModuleItem extends ModuleItem { if (!tile.craftIngredientRequests.isEmpty()) { network.startProfile("crafting_ingredients"); NetworkLock request = tile.craftIngredientRequests.peek(); + ItemEqualityType[] equalityTypes = ItemFilter.getEqualityTypes(tile); Pair dest = tile.getAvailableDestination(request.stack, true, true); if (dest != null) { - ItemStack requestRemain = network.requestExistingItem(request.location, tile.getPos(), dest.getLeft(), request, dest.getRight(), ItemEqualityType.NBT); + ItemStack requestRemain = network.requestExistingItem(request.location, tile.getPos(), dest.getLeft(), request, dest.getRight(),equalityTypes); network.resolveNetworkLock(request); tile.craftIngredientRequests.remove(); @@ -158,9 +159,10 @@ public class CraftingModuleItem extends ModuleItem { } @Override - public int getCraftableAmount(ItemStack module, PipeTileEntity tile, Consumer unavailableConsumer, ItemStack stack, ItemEqualityType... equalityTypes) { + public int getCraftableAmount(ItemStack module, PipeTileEntity tile, Consumer unavailableConsumer, ItemStack stack) { PipeNetwork network = PipeNetwork.get(tile.getWorld()); List items = network.getOrderedNetworkItems(tile.getPos()); + ItemEqualityType[] equalityTypes = ItemFilter.getEqualityTypes(tile); ItemStackHandler input = this.getInput(module); int craftable = 0; @@ -178,15 +180,16 @@ public class CraftingModuleItem extends ModuleItem { } @Override - public ItemStack craft(ItemStack module, PipeTileEntity tile, BlockPos destPipe, Consumer unavailableConsumer, ItemStack stack, ItemEqualityType... equalityTypes) { + public ItemStack craft(ItemStack module, PipeTileEntity tile, BlockPos destPipe, Consumer unavailableConsumer, ItemStack stack) { // check if we can craft the required amount of items - int craftableAmount = this.getCraftableAmount(module, tile, unavailableConsumer, stack, equalityTypes); + int craftableAmount = this.getCraftableAmount(module, tile, unavailableConsumer, stack); if (craftableAmount <= 0) return stack; PipeNetwork network = PipeNetwork.get(tile.getWorld()); List items = network.getOrderedNetworkItems(tile.getPos()); + ItemEqualityType[] equalityTypes = ItemFilter.getEqualityTypes(tile); int resultAmount = this.getResultAmountPerCraft(module, stack, equalityTypes); int requiredCrafts = MathHelper.ceil(stack.getCount() / (float) resultAmount); int toCraft = Math.min(craftableAmount, requiredCrafts);