diff --git a/dependencies.gradle b/dependencies.gradle index 112c8e2d2c9..f70b692ae2b 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -40,7 +40,7 @@ dependencies { // Published dependencies api("codechicken:codechickenlib:3.2.3.358") - api("com.cleanroommc:modularui:3.0.4") { transitive = false } + api("com.cleanroommc:modularui:3.0.6") { transitive = false } api("com.cleanroommc:groovyscript:1.2.0-hotfix1") { transitive = false } api("curse.maven:inventory-bogosorter-632327:7102721-deobf-6717233-sources-6717234") // Inventory BogoSorter − v1.5.0 api("curse.maven:key-binding-patch-928895:5951859") // Key Binding Patch v1.3.3.3, needed by Inventory BogoSorter v1.5.0+ diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index bdd21a36b27..f1e70af7e1e 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -234,7 +234,6 @@ public MultiblockUIFactory addScreenChildren(ScreenFunction function) { */ public @NotNull ModularPanel buildUI(PosGuiData guiData, PanelSyncManager panelSyncManager) { var panel = GTGuis.createPanel(mte, width, height) - .debugName("root_panel") .childIf(!disableDisplay, () -> createScreen(panelSyncManager)); // TODO createExtras() hook for overrides? diff --git a/src/main/java/gregtech/api/mui/GregTechGuiScreen.java b/src/main/java/gregtech/api/mui/GregTechGuiScreen.java index ad5c48449c5..a938624c8f2 100644 --- a/src/main/java/gregtech/api/mui/GregTechGuiScreen.java +++ b/src/main/java/gregtech/api/mui/GregTechGuiScreen.java @@ -1,15 +1,35 @@ package gregtech.api.mui; import gregtech.api.GTValues; +import gregtech.client.ClientProxy; +import gregtech.integration.jei.JustEnoughItemsModule; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; +import com.cleanroommc.modularui.integration.recipeviewer.RecipeViewerRecipeTransferHandler; import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.screen.ModularScreen; +import com.cleanroommc.modularui.value.sync.SyncHandler; +import com.cleanroommc.modularui.widget.Widget; +import it.unimi.dsi.fastutil.ints.Int2ObjectAVLTreeMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; +import it.unimi.dsi.fastutil.ints.IntComparators; +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; +import mezz.jei.api.gui.IRecipeLayout; +import mezz.jei.api.recipe.transfer.IRecipeTransferError; +import org.jetbrains.annotations.NotNull; +import java.util.Map; + +@SuppressWarnings("UnstableApiUsage") @SideOnly(Side.CLIENT) -public class GregTechGuiScreen extends ModularScreen { +public class GregTechGuiScreen extends ModularScreen implements RecipeViewerRecipeTransferHandler { + + // Stores lists of higher priority recipe receivers to the left of the tree + @SideOnly(Side.CLIENT) + private static final Int2ObjectMap> registeredRecipeTransferReceivers = new Int2ObjectAVLTreeMap<>( + IntComparators.OPPOSITE_COMPARATOR); public GregTechGuiScreen(ModularPanel mainPanel) { this(mainPanel, GTGuiTheme.STANDARD); @@ -27,4 +47,86 @@ public GregTechGuiScreen(String owner, ModularPanel mainPanel, String themeId) { super(owner, mainPanel); useTheme(themeId); } + + @Override + public void onClose() { + // Only clear all registered recipe receivers when the UI is truly closing, ie not just opening JEI over it. + if (ClientProxy.isGUIClosingPermanently) { + // Clear all registered recipe receivers on UI close, just in case. + registeredRecipeTransferReceivers.clear(); + } + } + + @Override + public IRecipeTransferError transferRecipe(IRecipeLayout recipeLayout, boolean maxTransfer, boolean simulate) { + // Receivers are sorted high to low on registration + for (Map subMap : registeredRecipeTransferReceivers.values()) { + for (IRecipeTransferReceiver receiver : subMap.values()) { + IRecipeTransferError result = receiver.receiveRecipe(recipeLayout, maxTransfer, simulate); + if (result != null && result.getType() == IRecipeTransferError.Type.INTERNAL) continue; + return result; + } + } + + // No valid transfer handler was found + return JustEnoughItemsModule.transferHelper.createInternalError(); + } + + /** + * Register an {@link IRecipeTransferReceiver} to this screen.
+ * Recipe transfer handlers registered through this method will have a priority of {@code 0}.
+ * Important: ensure that you remove this handler with {@link #removeRecipeTransferHandler(String)} when it's + * disposed of!
+ * Remove it by calling {@link #removeRecipeTransferHandler(String)} from {@link Widget#dispose()} for widgets and + * {@link SyncHandler#dispose()} for sync handlers. + * + * @throws IllegalArgumentException if a receiver with the given key already exists. + */ + @SideOnly(Side.CLIENT) + public static void registerRecipeTransferHandler(@NotNull String key, + @NotNull IRecipeTransferReceiver transferReceiver) { + registerRecipeTransferHandler(key, transferReceiver, 0); + } + + /** + * Register an {@link IRecipeTransferReceiver} to this screen with a certain priority. Higher numbers will be tried + * first.
+ * Important: ensure that you remove this handler with {@link #removeRecipeTransferHandler(String)} when it's + * disposed of!
+ * Remove it by calling {@link #removeRecipeTransferHandler(String)} from {@link Widget#dispose()} for widgets and + * {@link SyncHandler#dispose()} for sync handlers. + * + * @throws IllegalArgumentException if a receiver with the given key already exists. + */ + @SideOnly(Side.CLIENT) + public static void registerRecipeTransferHandler(@NotNull String key, + @NotNull IRecipeTransferReceiver transferReceiver, + int priority) { + for (Map subMap : registeredRecipeTransferReceivers.values()) { + if (subMap.containsKey(key)) { + throw new IllegalArgumentException( + "Tried to register a recipe transfer receiver to a key that's already used!"); + } + } + + registeredRecipeTransferReceivers.computeIfAbsent(priority, $ -> new Object2ObjectOpenHashMap<>()) + .put(key, transferReceiver); + } + + /** + * Remove a registered {@link IRecipeTransferReceiver} from this screen. + * + * @throws IllegalArgumentException if no receiver exists with the given key. + */ + @SideOnly(Side.CLIENT) + public static void removeRecipeTransferHandler(@NotNull String key) { + for (Map subMap : registeredRecipeTransferReceivers.values()) { + if (subMap.containsKey(key)) { + subMap.remove(key); + return; + } + } + + throw new IllegalArgumentException("Tried to remove a recipe transfer receiver by a key that didn't exist!"); + } } diff --git a/src/main/java/gregtech/api/mui/GregTechGuiTransferHandler.java b/src/main/java/gregtech/api/mui/GregTechGuiTransferHandler.java deleted file mode 100644 index 9332b8a9a70..00000000000 --- a/src/main/java/gregtech/api/mui/GregTechGuiTransferHandler.java +++ /dev/null @@ -1,69 +0,0 @@ -package gregtech.api.mui; - -import gregtech.api.mui.sync.PagedWidgetSyncHandler; -import gregtech.common.metatileentities.storage.CraftingRecipeLogic; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; - -import com.cleanroommc.modularui.screen.ModularContainer; -import com.cleanroommc.modularui.value.sync.PanelSyncManager; -import it.unimi.dsi.fastutil.ints.Int2ObjectArrayMap; -import it.unimi.dsi.fastutil.ints.Int2ObjectMap; -import mezz.jei.api.gui.IGuiItemStackGroup; -import mezz.jei.api.gui.IRecipeLayout; -import mezz.jei.api.recipe.transfer.IRecipeTransferError; -import mezz.jei.api.recipe.transfer.IRecipeTransferHandler; -import mezz.jei.api.recipe.transfer.IRecipeTransferHandlerHelper; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -public class GregTechGuiTransferHandler implements IRecipeTransferHandler { - - private final IRecipeTransferHandlerHelper handlerHelper; - - public GregTechGuiTransferHandler(IRecipeTransferHandlerHelper handlerHelper) { - this.handlerHelper = handlerHelper; - } - - @Override - public @NotNull Class getContainerClass() { - return ModularContainer.class; - } - - @Override - public @Nullable IRecipeTransferError transferRecipe(ModularContainer container, - @NotNull IRecipeLayout recipeLayout, - @NotNull EntityPlayer player, boolean maxTransfer, - boolean doTransfer) { - if (!container.getSyncManager().isOpen("workbench")) { - return null; - } - PanelSyncManager syncManager = container.getSyncManager().getPanelSyncManager("workbench"); - var recipeLogic = (CraftingRecipeLogic) syncManager.getSyncHandler("recipe_logic:0"); - var pageController = (PagedWidgetSyncHandler) syncManager.getSyncHandler("page_controller:0"); - - if (!doTransfer) { - // todo highlighting in JEI? - return null; - } - - var matrix = extractMatrix(recipeLayout.getItemStacks()); - recipeLogic.fillCraftingGrid(matrix); - pageController.setPage(0); - return null; - } - - private Int2ObjectMap extractMatrix(IGuiItemStackGroup stackGroup) { - var ingredients = stackGroup.getGuiIngredients(); - Int2ObjectMap matrix = new Int2ObjectArrayMap<>(9); - for (var slot : ingredients.keySet()) { - if (slot != 0) { - var ing = ingredients.get(slot).getDisplayedIngredient(); - if (ing == null) continue; - matrix.put(slot - 1, ingredients.get(slot).getDisplayedIngredient()); - } - } - return matrix; - } -} diff --git a/src/main/java/gregtech/api/mui/IRecipeTransferReceiver.java b/src/main/java/gregtech/api/mui/IRecipeTransferReceiver.java new file mode 100644 index 00000000000..ea963c7c3fd --- /dev/null +++ b/src/main/java/gregtech/api/mui/IRecipeTransferReceiver.java @@ -0,0 +1,53 @@ +package gregtech.api.mui; + +import gregtech.api.mui.sync.RecipeTransferSyncHandler; +import gregtech.integration.jei.JustEnoughItemsModule; + +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +import com.cleanroommc.modularui.value.sync.SyncHandler; +import com.cleanroommc.modularui.widget.Widget; +import mezz.jei.api.gui.IRecipeLayout; +import mezz.jei.api.recipe.transfer.IRecipeTransferError; +import mezz.jei.api.recipe.transfer.IRecipeTransferHandlerHelper; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Collection; + +/** + * An interface for receiving a recipe from a recipe viewer to anything on the panel, such as a {@link Widget} or + * {@link SyncHandler}.
+ * Register it via {@link GregTechGuiScreen#registerRecipeTransferHandler(String, IRecipeTransferReceiver)} or + * {@link GregTechGuiScreen#registerRecipeTransferHandler(String, IRecipeTransferReceiver, int)} if you want to + * prioritize checking a certain handler first.
+ * If you're implementing this on a {@link SyncHandler}, it's recommended to extend {@link RecipeTransferSyncHandler} + * instead as registering and unregistering from {@link GregTechGuiScreen} is done for you. + */ +public interface IRecipeTransferReceiver { + + /** + * Attempt or simulate transferring a recipe from a recipe viewer like JEI or HEI.
+ * A factory for default {@link IRecipeTransferError}s is available at {@link JustEnoughItemsModule#transferHelper}. + * There are three default options for errors:
+ * - {@link IRecipeTransferHandlerHelper#createInternalError()}: mark the recipe as invalid for transferring by + * graying out the + button.
+ * - {@link IRecipeTransferHandlerHelper#createUserErrorWithTooltip(String)}: the same as above, but also display a + * message when hovering over the + button.
+ * - {@link IRecipeTransferHandlerHelper#createUserErrorForSlots(String, Collection)}: the same as above, but + * additionally highlight certain slots in the recipe to, for example, mark missing ingredients. Important: will + * throw {@link IllegalArgumentException} if the supplied {@link Collection} is empty! + * + * @param recipeLayout the recipe layout that contains the recipe category, and the item and fluid stacks. + * @param maxTransfer if the receiver should try to move as many ingredients as possible to the crafting slots, ie + * shift clicking a recipe into a crafting table. + * @param simulate if this recipe should only simulate being transferred + * @return {@code null} if the transfer should succeed or an {@link IRecipeTransferError} if not. If there are + * multiple registered recipe transfer receivers on the same panel, returning an error with type + * {@link IRecipeTransferError.Type#INTERNAL} will skip this and attempt the next one. + */ + @Nullable + @SideOnly(Side.CLIENT) + IRecipeTransferError receiveRecipe(@NotNull IRecipeLayout recipeLayout, boolean maxTransfer, boolean simulate); +} diff --git a/src/main/java/gregtech/api/mui/sync/FixedIntArraySyncValue.java b/src/main/java/gregtech/api/mui/sync/FixedIntArraySyncValue.java index c3f29ee80b5..5fe7e294604 100644 --- a/src/main/java/gregtech/api/mui/sync/FixedIntArraySyncValue.java +++ b/src/main/java/gregtech/api/mui/sync/FixedIntArraySyncValue.java @@ -25,6 +25,10 @@ public class FixedIntArraySyncValue extends ValueSyncHandler { private final Supplier getter; private final @Nullable Consumer setter; + public FixedIntArraySyncValue(@NotNull Supplier getter) { + this(getter, null); + } + public FixedIntArraySyncValue(@NotNull Supplier getter, @Nullable Consumer setter) { this.getter = Objects.requireNonNull(getter); this.setter = setter; @@ -70,6 +74,11 @@ public boolean updateCacheFromSource(boolean isFirstSync) { return false; } + @Override + public void notifyUpdate() { + setValue(this.getter.get(), false, true); + } + @Override public void write(@NotNull PacketBuffer buffer) throws IOException { for (int i : cache) { @@ -92,4 +101,9 @@ public int[] getValue() { public int getValue(int index) { return this.cache[index]; } + + @Override + public Class getValueType() { + return int[].class; + } } diff --git a/src/main/java/gregtech/api/mui/sync/RecipeTransferSyncHandler.java b/src/main/java/gregtech/api/mui/sync/RecipeTransferSyncHandler.java new file mode 100644 index 00000000000..8943f960b84 --- /dev/null +++ b/src/main/java/gregtech/api/mui/sync/RecipeTransferSyncHandler.java @@ -0,0 +1,40 @@ +package gregtech.api.mui.sync; + +import gregtech.api.mui.GregTechGuiScreen; +import gregtech.api.mui.IRecipeTransferReceiver; + +import com.cleanroommc.modularui.value.sync.PanelSyncManager; +import com.cleanroommc.modularui.value.sync.SyncHandler; +import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.MustBeInvokedByOverriders; + +/** + * A base class for to handle implementing {@link IRecipeTransferReceiver} on a {@link SyncHandler}s to automatically + * register and unregister it from the map of valid handlers in {@link GregTechGuiScreen}. + */ +public abstract class RecipeTransferSyncHandler extends SyncHandler implements IRecipeTransferReceiver { + + @ApiStatus.OverrideOnly + @MustBeInvokedByOverriders + @Override + public void init(String key, PanelSyncManager syncManager) { + super.init(key, syncManager); + if (syncManager.isClient()) { + GregTechGuiScreen.registerRecipeTransferHandler(getKey(), this, getTransferHandlerPriority()); + } + } + + protected int getTransferHandlerPriority() { + return 0; + } + + @ApiStatus.OverrideOnly + @MustBeInvokedByOverriders + @Override + public void dispose() { + if (getSyncManager().isClient()) { + GregTechGuiScreen.removeRecipeTransferHandler(getKey()); + } + super.dispose(); + } +} diff --git a/src/main/java/gregtech/client/ClientProxy.java b/src/main/java/gregtech/client/ClientProxy.java index f9b712309a2..fdc894c53f1 100644 --- a/src/main/java/gregtech/client/ClientProxy.java +++ b/src/main/java/gregtech/client/ClientProxy.java @@ -57,6 +57,7 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.text.TextFormatting; import net.minecraftforge.client.GuiIngameForge; +import net.minecraftforge.client.event.GuiOpenEvent; import net.minecraftforge.client.event.ModelBakeEvent; import net.minecraftforge.client.event.ModelRegistryEvent; import net.minecraftforge.client.event.MouseEvent; @@ -86,6 +87,8 @@ @Mod.EventBusSubscriber(Side.CLIENT) public class ClientProxy extends CommonProxy { + public static boolean isGUIClosingPermanently = false; + public void onPreLoad() { super.onPreLoad(); @@ -428,4 +431,9 @@ private static void renderToolbeltHotbar(GuiIngameForge gui, ItemStack stack, It GlStateManager.disableBlend(); } } + + @SubscribeEvent + public static void onGuiChange(GuiOpenEvent event) { + isGUIClosingPermanently = (event.getGui() == null); + } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java index 7c367d349b6..37c7f075a00 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java @@ -250,7 +250,7 @@ public int getProgressBarCount() { @Override public void registerBars(List> bars, PanelSyncManager syncManager) { - FixedIntArraySyncValue fuelValue = new FixedIntArraySyncValue(this::getFuelAmount, null); + FixedIntArraySyncValue fuelValue = new FixedIntArraySyncValue(this::getFuelAmount); syncManager.syncValue("fuel_amount", fuelValue); StringSyncValue fuelNameValue = new StringSyncValue(() -> { FluidStack stack = ((MultiblockFuelRecipeLogic) recipeMapWorkable).getInputFluidStack(); @@ -264,9 +264,9 @@ public void registerBars(List> bars, PanelSync return fluid.getName(); }); syncManager.syncValue("fuel_name", fuelNameValue); - FixedIntArraySyncValue lubricantValue = new FixedIntArraySyncValue(this::getLubricantAmount, null); + FixedIntArraySyncValue lubricantValue = new FixedIntArraySyncValue(this::getLubricantAmount); syncManager.syncValue("lubricant_amount", lubricantValue); - FixedIntArraySyncValue oxygenValue = new FixedIntArraySyncValue(this::getOxygenAmount, null); + FixedIntArraySyncValue oxygenValue = new FixedIntArraySyncValue(this::getOxygenAmount); syncManager.syncValue("oxygen_amount", oxygenValue); BooleanSyncValue boostValue = new BooleanSyncValue(this::isBoostAllowed); syncManager.syncValue("boost_allowed", boostValue); diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java index 5a15302484d..ce69d58658b 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java @@ -272,7 +272,7 @@ public int getProgressBarCount() { @Override public void registerBars(List> bars, PanelSyncManager syncManager) { - FixedIntArraySyncValue fuelValue = new FixedIntArraySyncValue(this::getFuelAmount, null); + FixedIntArraySyncValue fuelValue = new FixedIntArraySyncValue(this::getFuelAmount); StringSyncValue fuelNameValue = new StringSyncValue(() -> { FluidStack stack = ((MultiblockFuelRecipeLogic) recipeMapWorkable).getInputFluidStack(); if (stack == null) { diff --git a/src/main/java/gregtech/common/metatileentities/storage/CraftingRecipeLogic.java b/src/main/java/gregtech/common/metatileentities/storage/CraftingRecipeLogic.java index eece105d06d..0314a8b23f9 100644 --- a/src/main/java/gregtech/common/metatileentities/storage/CraftingRecipeLogic.java +++ b/src/main/java/gregtech/common/metatileentities/storage/CraftingRecipeLogic.java @@ -1,12 +1,15 @@ package gregtech.common.metatileentities.storage; import gregtech.api.items.toolitem.ItemGTToolbelt; +import gregtech.api.mui.sync.PagedWidgetSyncHandler; +import gregtech.api.mui.sync.RecipeTransferSyncHandler; import gregtech.api.util.DummyContainer; import gregtech.api.util.GTTransferUtils; import gregtech.api.util.GTUtility; import gregtech.api.util.ItemStackHashStrategy; import gregtech.common.crafting.ShapedOreEnergyTransferRecipe; import gregtech.common.mui.widget.workbench.CraftingInputSlot; +import gregtech.integration.jei.JustEnoughItemsModule; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.inventory.IInventory; @@ -23,7 +26,6 @@ import net.minecraftforge.items.IItemHandlerModifiable; import com.cleanroommc.modularui.network.NetworkUtils; -import com.cleanroommc.modularui.value.sync.SyncHandler; import it.unimi.dsi.fastutil.ints.Int2BooleanArrayMap; import it.unimi.dsi.fastutil.ints.Int2BooleanMap; import it.unimi.dsi.fastutil.ints.Int2IntArrayMap; @@ -38,11 +40,18 @@ import it.unimi.dsi.fastutil.objects.Object2IntMap; import it.unimi.dsi.fastutil.objects.Object2IntOpenCustomHashMap; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenCustomHashMap; +import mezz.jei.api.gui.IGuiIngredient; +import mezz.jei.api.gui.IGuiItemStackGroup; +import mezz.jei.api.gui.IRecipeLayout; +import mezz.jei.api.recipe.VanillaRecipeCategoryUid; +import mezz.jei.api.recipe.transfer.IRecipeTransferError; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.Collections; import java.util.Map; -public class CraftingRecipeLogic extends SyncHandler { +public class CraftingRecipeLogic extends RecipeTransferSyncHandler { // client only public static final int UPDATE_INGREDIENTS = 1; @@ -120,6 +129,37 @@ public void fillCraftingGrid(Map ingredients) { updateCurrentRecipe(); } + @Override + public @Nullable IRecipeTransferError receiveRecipe(@NotNull IRecipeLayout recipeLayout, boolean maxTransfer, + boolean simulate) { + if (!recipeLayout.getRecipeCategory().getUid().equals(VanillaRecipeCategoryUid.CRAFTING)) { + JustEnoughItemsModule.transferHelper.createInternalError(); + } else if (simulate) { + // TODO: highlight missing items in recipe viewer + return null; + } + + Int2ObjectMap matrix = extractMatrix(recipeLayout.getItemStacks()); + fillCraftingGrid(matrix); + getSyncManager().findSyncHandler("page_controller", 0, PagedWidgetSyncHandler.class).setPage(0); + + return null; + } + + private Int2ObjectMap extractMatrix(IGuiItemStackGroup stackGroup) { + Map> ingredients = stackGroup.getGuiIngredients(); + Int2ObjectMap matrix = new Int2ObjectArrayMap<>(9); + for (int slot : ingredients.keySet()) { + if (slot != 0) { + ItemStack ingredient = ingredients.get(slot).getDisplayedIngredient(); + if (ingredient == null) continue; + matrix.put(slot - 1, ingredient); + } + } + + return matrix; + } + public void setInputSlot(CraftingInputSlot slot, int index) { this.inputSlots[index] = slot; } diff --git a/src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityWorkbench.java b/src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityWorkbench.java index 3483c603223..c1d45fb6515 100644 --- a/src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityWorkbench.java +++ b/src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityWorkbench.java @@ -226,7 +226,7 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager syncManager, UI syncManager.syncValue("recipe_memory", this.recipeMemory); var controller = new PagedWidget.Controller(); - syncManager.syncValue("page_controller", new PagedWidgetSyncHandler(controller)); + syncManager.syncValue("page_controller", 0, new PagedWidgetSyncHandler(controller)); return GTGuis.createPanel(this, 176, 224) .child(Flow.row() diff --git a/src/main/java/gregtech/integration/jei/JustEnoughItemsModule.java b/src/main/java/gregtech/integration/jei/JustEnoughItemsModule.java index 7772e0ada44..cd578908577 100644 --- a/src/main/java/gregtech/integration/jei/JustEnoughItemsModule.java +++ b/src/main/java/gregtech/integration/jei/JustEnoughItemsModule.java @@ -12,7 +12,6 @@ import gregtech.api.metatileentity.SteamMetaTileEntity; import gregtech.api.metatileentity.registry.MTERegistry; import gregtech.api.modules.GregTechModule; -import gregtech.api.mui.GregTechGuiTransferHandler; import gregtech.api.recipes.Recipe; import gregtech.api.recipes.RecipeMap; import gregtech.api.recipes.category.GTRecipeCategory; @@ -74,6 +73,7 @@ import mezz.jei.api.recipe.IRecipeCategory; import mezz.jei.api.recipe.IRecipeCategoryRegistration; import mezz.jei.api.recipe.VanillaRecipeCategoryUid; +import mezz.jei.api.recipe.transfer.IRecipeTransferHandlerHelper; import mezz.jei.config.Constants; import mezz.jei.input.IShowsRecipeFocuses; import mezz.jei.input.InputHandler; @@ -105,6 +105,7 @@ public class JustEnoughItemsModule extends IntegrationSubmodule implements IModP public static IIngredientRegistry ingredientRegistry; public static IJeiRuntime jeiRuntime; public static IGuiHelper guiHelper; + public static IRecipeTransferHandlerHelper transferHelper; @Override public void loadComplete(FMLLoadCompleteEvent event) { @@ -167,10 +168,6 @@ public void register(IModRegistry registry) { registry.getRecipeTransferRegistry().addRecipeTransferHandler(modularUIGuiHandler, Constants.UNIVERSAL_RECIPE_TRANSFER_UID); - // register transfer handler for crafting recipes - registry.getRecipeTransferRegistry().addRecipeTransferHandler(new GregTechGuiTransferHandler( - jeiHelpers.recipeTransferHandlerHelper()), VanillaRecipeCategoryUid.CRAFTING); - registry.addAdvancedGuiHandlers(modularUIGuiHandler); registry.addGhostIngredientHandler(modularUIGuiHandler.getGuiContainerClass(), modularUIGuiHandler); @@ -331,6 +328,8 @@ public void register(IModRegistry registry) { // Refresh Ore Ingredients Cache GTRecipeOreInput.refreshStackCache(); + + transferHelper = jeiHelpers.recipeTransferHandlerHelper(); } private void setupInputHandler() {