From dd680c2cd41f11eccd294ca30c38b82565cd1633 Mon Sep 17 00:00:00 2001 From: Unknown Date: Fri, 9 Aug 2019 16:45:41 +0800 Subject: Auto Crafting should work perfectly on vanilla stuff now --- .../rei/plugin/DefaultAutoCraftingPlugin.java | 11 +- .../plugin/autocrafting/AutoCraftingHandler.java | 116 +++++++++++++++++++++ .../autocrafting/AutoCraftingTableHandler.java | 116 --------------------- 3 files changed, 123 insertions(+), 120 deletions(-) create mode 100644 src/main/java/me/shedaniel/rei/plugin/autocrafting/AutoCraftingHandler.java delete mode 100644 src/main/java/me/shedaniel/rei/plugin/autocrafting/AutoCraftingTableHandler.java (limited to 'src/main/java/me/shedaniel/rei/plugin') diff --git a/src/main/java/me/shedaniel/rei/plugin/DefaultAutoCraftingPlugin.java b/src/main/java/me/shedaniel/rei/plugin/DefaultAutoCraftingPlugin.java index 07e8850e3..8bcbe5083 100644 --- a/src/main/java/me/shedaniel/rei/plugin/DefaultAutoCraftingPlugin.java +++ b/src/main/java/me/shedaniel/rei/plugin/DefaultAutoCraftingPlugin.java @@ -8,7 +8,10 @@ package me.shedaniel.rei.plugin; import me.shedaniel.rei.RoughlyEnoughItemsCore; import me.shedaniel.rei.api.RecipeHelper; import me.shedaniel.rei.api.plugins.REIPluginV0; -import me.shedaniel.rei.plugin.autocrafting.*; +import me.shedaniel.rei.plugin.autocrafting.AutoBlastingBookHandler; +import me.shedaniel.rei.plugin.autocrafting.AutoCraftingHandler; +import me.shedaniel.rei.plugin.autocrafting.AutoFurnaceBookHandler; +import me.shedaniel.rei.plugin.autocrafting.AutoSmokerBookHandler; import net.fabricmc.loader.api.SemanticVersion; import net.fabricmc.loader.util.version.VersionParsingException; import net.minecraft.util.Identifier; @@ -32,12 +35,12 @@ public class DefaultAutoCraftingPlugin implements REIPluginV0 { if (!RoughlyEnoughItemsCore.getConfigManager().getConfig().isLoadingDefaultPlugin()) { return; } - recipeHelper.registerAutoCraftingHandler(new AutoCraftingTableBookHandler()); - recipeHelper.registerAutoCraftingHandler(new AutoInventoryBookHandler()); + // recipeHelper.registerAutoCraftingHandler(new AutoCraftingTableBookHandler()); + // recipeHelper.registerAutoCraftingHandler(new AutoInventoryBookHandler()); recipeHelper.registerAutoCraftingHandler(new AutoFurnaceBookHandler()); recipeHelper.registerAutoCraftingHandler(new AutoSmokerBookHandler()); recipeHelper.registerAutoCraftingHandler(new AutoBlastingBookHandler()); - recipeHelper.registerAutoCraftingHandler(new AutoCraftingTableHandler()); + recipeHelper.registerAutoCraftingHandler(new AutoCraftingHandler()); } } diff --git a/src/main/java/me/shedaniel/rei/plugin/autocrafting/AutoCraftingHandler.java b/src/main/java/me/shedaniel/rei/plugin/autocrafting/AutoCraftingHandler.java new file mode 100644 index 000000000..f99a8734b --- /dev/null +++ b/src/main/java/me/shedaniel/rei/plugin/autocrafting/AutoCraftingHandler.java @@ -0,0 +1,116 @@ +/* + * Roughly Enough Items by Danielshe. + * Licensed under the MIT License. + */ + +package me.shedaniel.rei.plugin.autocrafting; + +import com.google.common.collect.Lists; +import io.netty.buffer.Unpooled; +import me.shedaniel.rei.RoughlyEnoughItemsNetwork; +import me.shedaniel.rei.api.AutoTransferHandler; +import me.shedaniel.rei.listeners.RecipeBookGuiHooks; +import me.shedaniel.rei.plugin.crafting.DefaultCraftingCategory; +import me.shedaniel.rei.plugin.crafting.DefaultCraftingDisplay; +import me.shedaniel.rei.plugin.crafting.DefaultShapedDisplay; +import net.fabricmc.fabric.api.network.ClientSidePacketRegistry; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.gui.screen.ingame.CraftingTableScreen; +import net.minecraft.client.gui.screen.ingame.InventoryScreen; +import net.minecraft.client.gui.screen.recipebook.RecipeBookProvider; +import net.minecraft.container.CraftingContainer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.DefaultedList; +import net.minecraft.util.PacketByteBuf; + +import java.util.List; + +public class AutoCraftingHandler implements AutoTransferHandler { + @Override + public Result handle(Context context) { + if (!(context.getRecipe() instanceof DefaultCraftingDisplay)) + return Result.createNotApplicable(); + if (!(context.getContainerScreen() instanceof CraftingTableScreen) && !(context.getContainerScreen() instanceof InventoryScreen)) + return Result.createNotApplicable(); + if (context.getContainerScreen() instanceof InventoryScreen && (((DefaultCraftingDisplay) context.getRecipe()).getWidth() > 2 || ((DefaultCraftingDisplay) context.getRecipe()).getHeight() > 2)) + return Result.createFailed("error.rei.transfer.too_small"); + if (!canUseMovePackets()) + return Result.createFailed("error.rei.not.on.server"); + if (!hasItems(context.getRecipe().getInput())) + return Result.createFailed("error.rei.not.enough.materials"); + if (!context.isActuallyCrafting()) + return Result.createSuccessful(); + + context.getMinecraft().openScreen(context.getContainerScreen()); + ((RecipeBookGuiHooks) ((RecipeBookProvider) context.getContainerScreen()).getRecipeBookGui()).rei_getGhostSlots().reset(); + DefaultCraftingDisplay display = (DefaultCraftingDisplay) context.getRecipe(); + PacketByteBuf buf = new PacketByteBuf(Unpooled.buffer()); + buf.writeUuid(RoughlyEnoughItemsNetwork.CRAFTING_TABLE_MOVE); + buf.writeBoolean(Screen.hasShiftDown()); + CraftingContainer craftingContainer = (CraftingContainer) context.getContainer(); + + List> ogInput = display.getInput(); + List> input = Lists.newArrayListWithCapacity(craftingContainer.getCraftingWidth() * craftingContainer.getCraftingHeight()); + for (int i = 0; i < craftingContainer.getCraftingWidth() * craftingContainer.getCraftingHeight(); i++) { + input.add(Lists.newArrayList()); + } + for (int i = 0; i < ogInput.size(); i++) { + List ogStacks = ogInput.get(i); + if (display instanceof DefaultShapedDisplay) { + if (!ogInput.get(i).isEmpty()) + input.set(DefaultCraftingCategory.getSlotWithSize(display, i), ogInput.get(i)); + } else if (!ogInput.get(i).isEmpty()) + input.set(i, ogInput.get(i)); + } + + buf.writeInt(input.size()); + for (List stacks : input) { + buf.writeInt(stacks.size()); + for (ItemStack stack : stacks) { + buf.writeItemStack(stack); + } + } + ClientSidePacketRegistry.INSTANCE.sendToServer(RoughlyEnoughItemsNetwork.MOVE_ITEMS_PACKET, buf); + return Result.createSuccessful(); + } + + @Override + public double getPriority() { + return -10; + } + + public boolean canUseMovePackets() { + return ClientSidePacketRegistry.INSTANCE.canServerReceive(RoughlyEnoughItemsNetwork.MOVE_ITEMS_PACKET); + } + + public boolean hasItems(List> inputs) { + // Create a clone of player's inventory, and count + DefaultedList copyMain = DefaultedList.create(); + for (ItemStack stack : MinecraftClient.getInstance().player.inventory.main) { + copyMain.add(stack.copy()); + } + for (List possibleStacks : inputs) { + boolean done = possibleStacks.isEmpty(); + for (ItemStack possibleStack : possibleStacks) { + if (!done) { + int invRequiredCount = possibleStack.getCount(); + for (ItemStack stack : copyMain) { + if (ItemStack.areItemsEqualIgnoreDamage(possibleStack, stack)) { + while (invRequiredCount > 0 && !stack.isEmpty()) { + invRequiredCount--; + stack.decrement(1); + } + } + } + if (invRequiredCount <= 0) { + done = true; + } + } + } + if (!done) + return false; + } + return true; + } +} diff --git a/src/main/java/me/shedaniel/rei/plugin/autocrafting/AutoCraftingTableHandler.java b/src/main/java/me/shedaniel/rei/plugin/autocrafting/AutoCraftingTableHandler.java deleted file mode 100644 index d92b40de9..000000000 --- a/src/main/java/me/shedaniel/rei/plugin/autocrafting/AutoCraftingTableHandler.java +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Roughly Enough Items by Danielshe. - * Licensed under the MIT License. - */ - -package me.shedaniel.rei.plugin.autocrafting; - -import com.google.common.collect.Lists; -import io.netty.buffer.Unpooled; -import me.shedaniel.rei.RoughlyEnoughItemsNetwork; -import me.shedaniel.rei.api.AutoTransferHandler; -import me.shedaniel.rei.listeners.RecipeBookGuiHooks; -import me.shedaniel.rei.plugin.crafting.DefaultCraftingCategory; -import me.shedaniel.rei.plugin.crafting.DefaultCraftingDisplay; -import me.shedaniel.rei.plugin.crafting.DefaultShapedDisplay; -import net.fabricmc.fabric.api.network.ClientSidePacketRegistry; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.gui.screen.ingame.CraftingTableScreen; -import net.minecraft.client.gui.screen.ingame.InventoryScreen; -import net.minecraft.client.gui.screen.recipebook.RecipeBookProvider; -import net.minecraft.container.CraftingContainer; -import net.minecraft.item.ItemStack; -import net.minecraft.util.DefaultedList; -import net.minecraft.util.PacketByteBuf; - -import java.util.List; - -public class AutoCraftingTableHandler implements AutoTransferHandler { - @Override - public Result handle(Context context) { - if (!(context.getRecipe() instanceof DefaultCraftingDisplay)) - return Result.createNotApplicable(); - if (!(context.getContainerScreen() instanceof CraftingTableScreen) && !(context.getContainerScreen() instanceof InventoryScreen)) - return Result.createNotApplicable(); - if (context.getContainerScreen() instanceof InventoryScreen && (((DefaultCraftingDisplay) context.getRecipe()).getWidth() > 2 || ((DefaultCraftingDisplay) context.getRecipe()).getHeight() > 2)) - return Result.createFailed("error.rei.transfer.too_small"); - if (!canUseMovePackets()) - return Result.createFailed("error.rei.not.on.server"); - if (!hasItems(context.getRecipe().getInput())) - return Result.createFailed("error.rei.not.enough.materials"); - if (!context.isActuallyCrafting()) - return Result.createSuccessful(); - - context.getMinecraft().openScreen(context.getContainerScreen()); - ((RecipeBookGuiHooks) ((RecipeBookProvider) context.getContainerScreen()).getRecipeBookGui()).rei_getGhostSlots().reset(); - DefaultCraftingDisplay display = (DefaultCraftingDisplay) context.getRecipe(); - PacketByteBuf buf = new PacketByteBuf(Unpooled.buffer()); - buf.writeUuid(RoughlyEnoughItemsNetwork.CRAFTING_TABLE_MOVE); - buf.writeBoolean(Screen.hasShiftDown()); - CraftingContainer craftingContainer = (CraftingContainer) context.getContainer(); - - List> ogInput = display.getInput(); - List> input = Lists.newArrayListWithCapacity(craftingContainer.getCraftingWidth() * craftingContainer.getCraftingHeight()); - for (int i = 0; i < craftingContainer.getCraftingWidth() * craftingContainer.getCraftingHeight(); i++) { - input.add(Lists.newArrayList()); - } - for (int i = 0; i < ogInput.size(); i++) { - List ogStacks = ogInput.get(i); - if (display instanceof DefaultShapedDisplay) { - if (!ogInput.get(i).isEmpty()) - input.set(DefaultCraftingCategory.getSlotWithSize(display, i), ogInput.get(i)); - } else if (!ogInput.get(i).isEmpty()) - input.set(i, ogInput.get(i)); - } - - buf.writeInt(input.size()); - for (List stacks : input) { - buf.writeInt(stacks.size()); - for (ItemStack stack : stacks) { - buf.writeItemStack(stack); - } - } - ClientSidePacketRegistry.INSTANCE.sendToServer(RoughlyEnoughItemsNetwork.MOVE_ITEMS_PACKET, buf); - return Result.createSuccessful(); - } - - @Override - public double getPriority() { - return -10; - } - - public boolean canUseMovePackets() { - return ClientSidePacketRegistry.INSTANCE.canServerReceive(RoughlyEnoughItemsNetwork.MOVE_ITEMS_PACKET); - } - - public boolean hasItems(List> inputs) { - // Create a clone of player's inventory, and count - DefaultedList copyMain = DefaultedList.create(); - for (ItemStack stack : MinecraftClient.getInstance().player.inventory.main) { - copyMain.add(stack.copy()); - } - for (List possibleStacks : inputs) { - boolean done = possibleStacks.isEmpty(); - for (ItemStack possibleStack : possibleStacks) { - if (!done) { - int invRequiredCount = possibleStack.getCount(); - for (ItemStack stack : copyMain) { - if (ItemStack.areItemsEqualIgnoreDamage(possibleStack, stack)) { - while (invRequiredCount > 0 && !stack.isEmpty()) { - invRequiredCount--; - stack.decrement(1); - } - } - } - if (invRequiredCount <= 0) { - done = true; - } - } - } - if (!done) - return false; - } - return true; - } -} -- cgit