From 40a8884c8133248602c61871cf6cc7f61b6ce2b2 Mon Sep 17 00:00:00 2001 From: way2muchnoise Date: Wed, 5 Oct 2016 16:00:23 +0200 Subject: [PATCH] add universal RecipeTransferHandler for the ProcessingPatternEncoder --- build.gradle | 4 +- .../java/refinedstorage/RefinedStorage.java | 2 +- .../ContainerProcessingPatternEncoder.java | 24 +++++++ .../jei/RecipeTransferHandlerPattern.java | 61 ++++++++++++++++++ .../jei/RefinedStorageJEIPlugin.java | 3 +- ...ssageProcessingPatternEncoderTransfer.java | 62 +++++++++++++++++++ .../refinedstorage/proxy/CommonProxy.java | 1 + 7 files changed, 153 insertions(+), 4 deletions(-) create mode 100644 src/main/java/refinedstorage/integration/jei/RecipeTransferHandlerPattern.java create mode 100644 src/main/java/refinedstorage/network/MessageProcessingPatternEncoderTransfer.java diff --git a/build.gradle b/build.gradle index 7e7142e74..1e094f856 100755 --- a/build.gradle +++ b/build.gradle @@ -51,8 +51,8 @@ repositories { } dependencies { - deobfCompile "mezz.jei:jei_1.10.2:3.11.+:api" - runtime "mezz.jei:jei_1.10.2:3.11.+" + deobfCompile "mezz.jei:jei_1.10.2:3.12.+:api" + runtime "mezz.jei:jei_1.10.2:3.12.+" compile "net.darkhax.tesla:Tesla:1.10-1.2.+" compile "net.industrial-craft:industrialcraft-2:2.6.67-ex110:api" deobfCompile "MCMultiPart:MCMultiPart:1.2.1+:universal" diff --git a/src/main/java/refinedstorage/RefinedStorage.java b/src/main/java/refinedstorage/RefinedStorage.java index 0a6566833..a98b6ff3b 100755 --- a/src/main/java/refinedstorage/RefinedStorage.java +++ b/src/main/java/refinedstorage/RefinedStorage.java @@ -19,7 +19,7 @@ import refinedstorage.proxy.CommonProxy; public final class RefinedStorage { public static final String ID = "refinedstorage"; public static final String VERSION = "1.2"; - public static final String DEPENDENCIES = "required-after:Forge@[12.18.1.2088,);required-after:mcmultipart@[1.2.1,);after:JEI@[3.11.0,);"; + public static final String DEPENDENCIES = "required-after:Forge@[12.18.1.2088,);required-after:mcmultipart@[1.2.1,);after:JEI@[3.12.0,);"; public static final String GUI_FACTORY = "refinedstorage.gui.config.ModGuiFactory"; @SidedProxy(clientSide = "refinedstorage.proxy.ClientProxy", serverSide = "refinedstorage.proxy.ServerProxy") diff --git a/src/main/java/refinedstorage/container/ContainerProcessingPatternEncoder.java b/src/main/java/refinedstorage/container/ContainerProcessingPatternEncoder.java index df4043d87..9289744f0 100755 --- a/src/main/java/refinedstorage/container/ContainerProcessingPatternEncoder.java +++ b/src/main/java/refinedstorage/container/ContainerProcessingPatternEncoder.java @@ -8,6 +8,8 @@ import refinedstorage.container.slot.SlotOutput; import refinedstorage.container.slot.SlotSpecimen; import refinedstorage.tile.TileProcessingPatternEncoder; +import java.util.Collection; + public class ContainerProcessingPatternEncoder extends ContainerBase { public ContainerProcessingPatternEncoder(TileProcessingPatternEncoder processingPatternEncoder, EntityPlayer player) { super(processingPatternEncoder, player); @@ -65,4 +67,26 @@ public class ContainerProcessingPatternEncoder extends ContainerBase { return stack; } + + public void setInputs(Collection stacks) { + setSlots(stacks, 2 , 2 + 9); + } + + public void setOutputs(Collection stacks) { + setSlots(stacks, 2 + 9, 2 + 9 * 2); + } + + private void setSlots(Collection stacks, int begin, int end) { + for (ItemStack stack : stacks) { + for (int i = begin; i < end; ++i) { + Slot slot = getSlot(i); + + if (!slot.getHasStack() && slot.isItemValid(stack)) { + slot.putStack(stack); + slot.onSlotChanged(); + break; + } + } + } + } } \ No newline at end of file diff --git a/src/main/java/refinedstorage/integration/jei/RecipeTransferHandlerPattern.java b/src/main/java/refinedstorage/integration/jei/RecipeTransferHandlerPattern.java new file mode 100644 index 000000000..6037c4fb3 --- /dev/null +++ b/src/main/java/refinedstorage/integration/jei/RecipeTransferHandlerPattern.java @@ -0,0 +1,61 @@ +package refinedstorage.integration.jei; + +import mezz.jei.api.gui.IGuiIngredient; +import mezz.jei.api.gui.IRecipeLayout; +import mezz.jei.api.recipe.transfer.IRecipeTransferError; +import mezz.jei.api.recipe.transfer.IRecipeTransferHandler; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import refinedstorage.RefinedStorage; +import refinedstorage.api.network.NetworkUtils; +import refinedstorage.container.ContainerProcessingPatternEncoder; +import refinedstorage.network.MessageProcessingPatternEncoderTransfer; + +import javax.annotation.Nullable; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +public class RecipeTransferHandlerPattern implements IRecipeTransferHandler { + @Override + public Class getContainerClass() { + return ContainerProcessingPatternEncoder.class; + } + + @Override + public String getRecipeCategoryUid() { + return "patternEncoding"; + } + + @Nullable + @Override + public IRecipeTransferError transferRecipe(ContainerProcessingPatternEncoder container, IRecipeLayout recipeLayout, EntityPlayer player, boolean maxTransfer, boolean doTransfer) { + if (doTransfer) { + Map inputs = new HashMap<>(); + Map outputs = new HashMap<>(); + for (IGuiIngredient guiIngredient : recipeLayout.getItemStacks().getGuiIngredients().values()) { + if (guiIngredient != null && guiIngredient.getDisplayedIngredient() != null) { + ItemStack ingredient = guiIngredient.getDisplayedIngredient(); + int hashCode = NetworkUtils.getItemStackHashCode(ingredient); + if (guiIngredient.isInput()) { + if (inputs.containsKey(hashCode)) { + inputs.get(hashCode).stackSize++; + } else { + inputs.put(hashCode, ingredient); + } + } else { + if (outputs.containsKey(hashCode)) { + outputs.get(hashCode).stackSize++; + } else { + outputs.put(hashCode, ingredient); + } + } + } + } + + RefinedStorage.INSTANCE.network.sendToServer(new MessageProcessingPatternEncoderTransfer(inputs.values(), outputs.values())); + } + return null; + } +} diff --git a/src/main/java/refinedstorage/integration/jei/RefinedStorageJEIPlugin.java b/src/main/java/refinedstorage/integration/jei/RefinedStorageJEIPlugin.java index e7eb02644..2aa56a32e 100755 --- a/src/main/java/refinedstorage/integration/jei/RefinedStorageJEIPlugin.java +++ b/src/main/java/refinedstorage/integration/jei/RefinedStorageJEIPlugin.java @@ -15,7 +15,8 @@ public class RefinedStorageJEIPlugin extends BlankModPlugin { public void register(IModRegistry registry) { INSTANCE = this; - registry.getRecipeTransferRegistry().addRecipeTransferHandler(new RecipeTransferHandlerGrid()); + registry.getRecipeTransferRegistry().addUniversalRecipeTransferHandler(new RecipeTransferHandlerPattern()); + registry.getRecipeTransferRegistry().addRecipeTransferHandler(new RecipeTransferHandlerGrid(), "minecraft.crafting"); registry.getRecipeTransferRegistry().addRecipeTransferHandler(ContainerSolderer.class, RecipeCategorySolderer.ID, 0, 3, 8, 36); registry.addRecipeCategories(new RecipeCategorySolderer(registry.getJeiHelpers().getGuiHelper())); diff --git a/src/main/java/refinedstorage/network/MessageProcessingPatternEncoderTransfer.java b/src/main/java/refinedstorage/network/MessageProcessingPatternEncoderTransfer.java new file mode 100644 index 000000000..d126efeea --- /dev/null +++ b/src/main/java/refinedstorage/network/MessageProcessingPatternEncoderTransfer.java @@ -0,0 +1,62 @@ +package refinedstorage.network; + +import io.netty.buffer.ByteBuf; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraftforge.fml.common.network.ByteBufUtils; +import net.minecraftforge.fml.common.network.simpleimpl.IMessage; +import refinedstorage.container.ContainerProcessingPatternEncoder; + +import java.util.ArrayList; +import java.util.Collection; + +public class MessageProcessingPatternEncoderTransfer extends MessageHandlerPlayerToServer implements IMessage { + + private Collection inputs, outputs; + + public MessageProcessingPatternEncoderTransfer() { + + } + + public MessageProcessingPatternEncoderTransfer(Collection inputs, Collection outputs) { + this.inputs = inputs; + this.outputs = outputs; + } + + + @Override + public void fromBytes(ByteBuf buf) { + int size = buf.readInt(); + this.inputs = new ArrayList<>(size); + for (int i = 0; i < size; i++) { + this.inputs.add(ByteBufUtils.readItemStack(buf)); + } + size = buf.readInt(); + this.outputs = new ArrayList<>(size); + for (int i = 0; i < size; i++) { + this.outputs.add(ByteBufUtils.readItemStack(buf)); + } + } + + @Override + public void toBytes(ByteBuf buf) { + buf.writeInt(inputs.size()); + for (ItemStack stack : inputs) { + ByteBufUtils.writeItemStack(buf, stack); + } + buf.writeInt(outputs.size()); + for (ItemStack stack : outputs) { + ByteBufUtils.writeItemStack(buf, stack); + } + } + + @Override + public void handle(MessageProcessingPatternEncoderTransfer message, EntityPlayerMP player) { + if (player.openContainer instanceof ContainerProcessingPatternEncoder) { + ContainerProcessingPatternEncoder encoder = (ContainerProcessingPatternEncoder) player.openContainer; + + encoder.setInputs(message.inputs); + encoder.setOutputs(message.outputs); + } + } +} diff --git a/src/main/java/refinedstorage/proxy/CommonProxy.java b/src/main/java/refinedstorage/proxy/CommonProxy.java index 5c220f292..b07abde40 100755 --- a/src/main/java/refinedstorage/proxy/CommonProxy.java +++ b/src/main/java/refinedstorage/proxy/CommonProxy.java @@ -71,6 +71,7 @@ public class CommonProxy { RefinedStorage.INSTANCE.network.registerMessage(MessageGridFilterUpdate.class, MessageGridFilterUpdate.class, id++, Side.SERVER); RefinedStorage.INSTANCE.network.registerMessage(MessageGridCraftingPreview.class, MessageGridCraftingPreview.class, id++, Side.SERVER); RefinedStorage.INSTANCE.network.registerMessage(MessageGridCraftingPreviewResponse.class, MessageGridCraftingPreviewResponse.class, id++, Side.CLIENT); + RefinedStorage.INSTANCE.network.registerMessage(MessageProcessingPatternEncoderTransfer.class, MessageProcessingPatternEncoderTransfer.class, id++, Side.SERVER); NetworkRegistry.INSTANCE.registerGuiHandler(RefinedStorage.INSTANCE, new GuiHandler());