Explorar o código

ScreenWithHandler refractor, why must we suffer

Signed-off-by: shedaniel <daniel@shedaniel.me>
shedaniel %!s(int64=5) %!d(string=hai) anos
pai
achega
4e1898aca8
Modificáronse 40 ficheiros con 272 adicións e 236 borrados
  1. 2 2
      gradle.properties
  2. 11 11
      src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java
  3. 7 7
      src/main/java/me/shedaniel/rei/RoughlyEnoughItemsNetwork.java
  4. 25 12
      src/main/java/me/shedaniel/rei/api/AutoTransferHandler.java
  5. 3 3
      src/main/java/me/shedaniel/rei/api/RecipeHelper.java
  6. 2 2
      src/main/java/me/shedaniel/rei/api/TransferRecipeDisplay.java
  7. 3 3
      src/main/java/me/shedaniel/rei/gui/ConfigReloadingScreen.java
  8. 18 18
      src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java
  9. 7 7
      src/main/java/me/shedaniel/rei/gui/PreRecipeViewingScreen.java
  10. 9 9
      src/main/java/me/shedaniel/rei/gui/RecipeViewingScreen.java
  11. 4 4
      src/main/java/me/shedaniel/rei/gui/VillagerRecipeViewingScreen.java
  12. 8 8
      src/main/java/me/shedaniel/rei/gui/credits/CreditsScreen.java
  13. 6 6
      src/main/java/me/shedaniel/rei/gui/widget/AutoCraftingButtonWidget.java
  14. 10 10
      src/main/java/me/shedaniel/rei/gui/widget/ButtonWidget.java
  15. 4 4
      src/main/java/me/shedaniel/rei/gui/widget/CraftableToggleButtonWidget.java
  16. 4 4
      src/main/java/me/shedaniel/rei/gui/widget/TextFieldWidget.java
  17. 2 2
      src/main/java/me/shedaniel/rei/gui/widget/Widget.java
  18. 2 2
      src/main/java/me/shedaniel/rei/impl/AbstractEntryStack.java
  19. 2 2
      src/main/java/me/shedaniel/rei/impl/ClientHelperImpl.java
  20. 1 1
      src/main/java/me/shedaniel/rei/impl/ConfigManagerImpl.java
  21. 6 6
      src/main/java/me/shedaniel/rei/impl/RecipeHelperImpl.java
  22. 2 2
      src/main/java/me/shedaniel/rei/impl/RenderingEntry.java
  23. 27 9
      src/main/java/me/shedaniel/rei/impl/ScreenHelper.java
  24. 4 4
      src/main/java/me/shedaniel/rei/impl/widgets/FillRectangleDrawableConsumer.java
  25. 1 1
      src/main/java/me/shedaniel/rei/impl/widgets/TexturedDrawableConsumer.java
  26. 5 5
      src/main/java/me/shedaniel/rei/listeners/ContainerScreenHooks.java
  27. 7 7
      src/main/java/me/shedaniel/rei/plugin/DefaultPlugin.java
  28. 2 2
      src/main/java/me/shedaniel/rei/plugin/DefaultPotionEffectExclusionZones.java
  29. 5 5
      src/main/java/me/shedaniel/rei/plugin/DefaultRecipeBookExclusionZones.java
  30. 6 6
      src/main/java/me/shedaniel/rei/plugin/DefaultServerContainerPlugin.java
  31. 11 11
      src/main/java/me/shedaniel/rei/plugin/autocrafting/DefaultCategoryHandler.java
  32. 13 13
      src/main/java/me/shedaniel/rei/plugin/autocrafting/DefaultRecipeBookHandler.java
  33. 6 6
      src/main/java/me/shedaniel/rei/plugin/containers/CraftingContainerInfoWrapper.java
  34. 2 2
      src/main/java/me/shedaniel/rei/plugin/cooking/DefaultCookingDisplay.java
  35. 3 3
      src/main/java/me/shedaniel/rei/plugin/crafting/DefaultCraftingCategory.java
  36. 2 2
      src/main/java/me/shedaniel/rei/plugin/crafting/DefaultCraftingDisplay.java
  37. 0 1
      src/main/java/me/shedaniel/rei/plugin/stonecutting/DefaultStoneCuttingCategory.java
  38. 3 3
      src/main/java/me/shedaniel/rei/server/ContainerInfo.java
  39. 13 6
      src/main/java/me/shedaniel/rei/server/ContainerInfoHandler.java
  40. 24 25
      src/main/java/me/shedaniel/rei/server/InputSlotCrafter.java

+ 2 - 2
gradle.properties

@@ -1,6 +1,6 @@
-mod_version=4.0.10-unstable
+mod_version=4.0.11-unstable
 minecraft_version=20w10a
-yarn_version=20w10a+build.2
+yarn_version=20w10a+build.15
 fabricloader_version=0.7.8+build.186
 cloth_events_version=2.0.0-unstable.202003051905
 cloth_config_version=3.0.2-unstable.202003090708

+ 11 - 11
src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java

@@ -40,22 +40,22 @@ import net.fabricmc.loader.api.ModContainer;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.gui.Element;
 import net.minecraft.client.gui.screen.Screen;
-import net.minecraft.client.gui.screen.ingame.ContainerScreen;
 import net.minecraft.client.gui.screen.ingame.CraftingTableScreen;
 import net.minecraft.client.gui.screen.ingame.CreativeInventoryScreen;
 import net.minecraft.client.gui.screen.ingame.InventoryScreen;
+import net.minecraft.client.gui.screen.ingame.ScreenWithHandler;
 import net.minecraft.client.gui.screen.recipebook.RecipeBookGhostSlots;
 import net.minecraft.client.gui.screen.recipebook.RecipeBookProvider;
 import net.minecraft.client.gui.screen.recipebook.RecipeBookWidget;
 import net.minecraft.client.gui.widget.TextFieldWidget;
 import net.minecraft.client.gui.widget.TexturedButtonWidget;
 import net.minecraft.client.resource.language.I18n;
-import net.minecraft.container.CraftingTableContainer;
-import net.minecraft.container.Slot;
 import net.minecraft.item.ItemStack;
 import net.minecraft.item.Items;
 import net.minecraft.recipe.Ingredient;
 import net.minecraft.recipe.RecipeManager;
+import net.minecraft.screen.CraftingTableScreenHandler;
+import net.minecraft.screen.slot.Slot;
 import net.minecraft.text.LiteralText;
 import net.minecraft.util.ActionResult;
 import net.minecraft.util.Identifier;
@@ -205,11 +205,11 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer {
                 }
                 
                 ghostSlots.addSlot(Ingredient.ofItems(Items.STONE), 381203812, 12738291);
-                CraftingTableContainer container = ((CraftingTableScreen) currentScreen).getContainer();
+                CraftingTableScreenHandler screenHandler = ((CraftingTableScreen) currentScreen).getScreenHandler();
                 for (int i = 0; i < input.size(); i++) {
                     List<ItemStack> stacks = input.get(i);
                     if (!stacks.isEmpty()) {
-                        Slot slot = container.getSlot(i + container.getCraftingResultSlotIndex() + 1);
+                        Slot slot = screenHandler.getSlot(i + screenHandler.getCraftingResultSlotIndex() + 1);
                         ghostSlots.addSlot(Ingredient.ofStacks(stacks.toArray(new ItemStack[0])), slot.xPosition, slot.yPosition);
                     }
                 }
@@ -253,7 +253,7 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer {
                 continue;
             ActionResult result = decider.shouldScreenBeOverlayed(screen);
             if (result != ActionResult.PASS)
-                return result == ActionResult.FAIL || ScreenHelper.getLastContainerScreenHooks() == null;
+                return result == ActionResult.FAIL || ScreenHelper.getLastScreenWithHandlerHooks() == null;
         }
         return true;
     }
@@ -263,7 +263,7 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer {
         long[] lastSync = {-1};
         ClothClientHooks.SYNC_RECIPES.register((minecraftClient, recipeManager, synchronizeRecipesS2CPacket) -> syncRecipes(lastSync));
         ClothClientHooks.SCREEN_ADD_BUTTON.register((minecraftClient, screen, abstractButtonWidget) -> {
-            if (ConfigObject.getInstance().doesDisableRecipeBook() && screen instanceof ContainerScreen && abstractButtonWidget instanceof TexturedButtonWidget)
+            if (ConfigObject.getInstance().doesDisableRecipeBook() && screen instanceof ScreenWithHandler && abstractButtonWidget instanceof TexturedButtonWidget)
                 if (((RecipeBookButtonWidgetHooks) abstractButtonWidget).rei_getTexture().equals(recipeButtonTex))
                     return ActionResult.FAIL;
             return ActionResult.PASS;
@@ -273,8 +273,8 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer {
                 return;
             if (shouldReturn(screen.getClass()))
                 return;
-            if (screen instanceof ContainerScreen)
-                ScreenHelper.setLastContainerScreen((ContainerScreen<?>) screen);
+            if (screen instanceof ScreenWithHandler)
+                ScreenHelper.setLastScreenWithHandler((ScreenWithHandler<?>) screen);
             boolean alreadyAdded = false;
             for (Element element : Lists.newArrayList(screenHooks.cloth_getChildren()))
                 if (ContainerScreenOverlay.class.isAssignableFrom(element.getClass()))
@@ -335,9 +335,9 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer {
                 return ActionResult.PASS;
             if (ScreenHelper.getLastOverlay().keyPressed(i, i1, i2))
                 return ActionResult.SUCCESS;
-            if (screen instanceof ContainerScreen && ConfigObject.getInstance().doesDisableRecipeBook() && ConfigObject.getInstance().doesFixTabCloseContainer())
+            if (screen instanceof ScreenWithHandler && ConfigObject.getInstance().doesDisableRecipeBook() && ConfigObject.getInstance().doesFixTabCloseContainer())
                 if (i == 258 && minecraftClient.options.keyInventory.matchesKey(i, i1)) {
-                    minecraftClient.player.closeContainer();
+                    minecraftClient.player.closeHandledScreen();
                     return ActionResult.SUCCESS;
                 }
             return ActionResult.PASS;

+ 7 - 7
src/main/java/me/shedaniel/rei/RoughlyEnoughItemsNetwork.java

@@ -30,10 +30,10 @@ import me.shedaniel.rei.server.InputSlotCrafter;
 import net.fabricmc.api.ModInitializer;
 import net.fabricmc.fabric.api.network.ServerSidePacketRegistry;
 import net.fabricmc.loader.api.FabricLoader;
-import net.minecraft.container.Container;
-import net.minecraft.container.CraftingContainer;
-import net.minecraft.container.PlayerContainer;
 import net.minecraft.item.ItemStack;
+import net.minecraft.screen.CraftingScreenHandler;
+import net.minecraft.screen.PlayerScreenHandler;
+import net.minecraft.screen.ScreenHandler;
 import net.minecraft.server.network.ServerPlayerEntity;
 import net.minecraft.text.TranslatableText;
 import net.minecraft.util.Formatting;
@@ -79,8 +79,8 @@ public class RoughlyEnoughItemsNetwork implements ModInitializer {
         ServerSidePacketRegistry.INSTANCE.register(MOVE_ITEMS_PACKET, (packetContext, packetByteBuf) -> {
             Identifier category = packetByteBuf.readIdentifier();
             ServerPlayerEntity player = (ServerPlayerEntity) packetContext.getPlayer();
-            Container container = player.container;
-            PlayerContainer playerContainer = player.playerContainer;
+            ScreenHandler screenHandler = player.currentScreenHandler;
+            PlayerScreenHandler playerScreenHandler = player.playerScreenHandler;
             try {
                 boolean shift = packetByteBuf.readBoolean();
                 Map<Integer, List<ItemStack>> input = Maps.newHashMap();
@@ -94,9 +94,9 @@ public class RoughlyEnoughItemsNetwork implements ModInitializer {
                     input.put(i, list);
                 }
                 try {
-                    InputSlotCrafter.start(category, container, player, input, shift);
+                    InputSlotCrafter.start(category, screenHandler, player, input, shift);
                 } catch (InputSlotCrafter.NotEnoughMaterialsException e) {
-                    if (!(container instanceof CraftingContainer))
+                    if (!(screenHandler instanceof CraftingScreenHandler))
                         return;
                     PacketByteBuf buf = new PacketByteBuf(Unpooled.buffer());
                     buf.writeInt(input.size());

+ 25 - 12
src/main/java/me/shedaniel/rei/api/AutoTransferHandler.java

@@ -28,10 +28,9 @@ import it.unimi.dsi.fastutil.ints.IntList;
 import me.shedaniel.rei.gui.ContainerScreenOverlay;
 import me.shedaniel.rei.impl.ScreenHelper;
 import net.minecraft.client.MinecraftClient;
-import net.minecraft.client.gui.screen.ingame.ContainerScreen;
-import net.minecraft.container.Container;
+import net.minecraft.client.gui.screen.ingame.ScreenWithHandler;
+import net.minecraft.screen.ScreenHandler;
 import org.jetbrains.annotations.ApiStatus;
-import org.spongepowered.asm.mixin.injection.Inject;
 
 import java.util.function.Supplier;
 
@@ -83,7 +82,7 @@ public interface AutoTransferHandler {
     }
     
     interface Context {
-        static Context create(boolean actuallyCrafting, ContainerScreen<?> containerScreen, RecipeDisplay recipeDisplay) {
+        static Context create(boolean actuallyCrafting, ScreenWithHandler<?> containerScreen, RecipeDisplay recipeDisplay) {
             return new ContextImpl(actuallyCrafting, containerScreen, () -> recipeDisplay);
         }
         
@@ -93,14 +92,28 @@ public interface AutoTransferHandler {
         
         boolean isActuallyCrafting();
         
-        ContainerScreen<?> getContainerScreen();
+        ScreenWithHandler<?> getScreenWithHandler();
+        
+        @Deprecated
+        @ApiStatus.ScheduledForRemoval
+        default ScreenWithHandler<?> getContainerScreen() {
+            return getScreenWithHandler();
+        }
         
         RecipeDisplay getRecipe();
         
-        default Container getContainer() {
-            return getContainerScreen().getContainer();
+        @Deprecated
+        @ApiStatus.ScheduledForRemoval
+        default ScreenHandler getContainer() {
+            return getScreenHandler();
+        }
+        
+        default ScreenHandler getScreenHandler() {
+            return getScreenWithHandler().getScreenHandler();
         }
         
+        @Deprecated
+        @ApiStatus.ScheduledForRemoval
         default ContainerScreenOverlay getOverlay() {
             return ScreenHelper.getLastOverlay();
         }
@@ -161,12 +174,12 @@ public interface AutoTransferHandler {
     @ApiStatus.Internal
     final class ContextImpl implements Context {
         boolean actuallyCrafting;
-        ContainerScreen<?> containerScreen;
+        ScreenWithHandler<?> screenWithHandler;
         Supplier<RecipeDisplay> recipeDisplaySupplier;
         
-        private ContextImpl(boolean actuallyCrafting, ContainerScreen<?> containerScreen, Supplier<RecipeDisplay> recipeDisplaySupplier) {
+        private ContextImpl(boolean actuallyCrafting, ScreenWithHandler<?> screenWithHandler, Supplier<RecipeDisplay> recipeDisplaySupplier) {
             this.actuallyCrafting = actuallyCrafting;
-            this.containerScreen = containerScreen;
+            this.screenWithHandler = screenWithHandler;
             this.recipeDisplaySupplier = recipeDisplaySupplier;
         }
         
@@ -176,8 +189,8 @@ public interface AutoTransferHandler {
         }
         
         @Override
-        public ContainerScreen<?> getContainerScreen() {
-            return containerScreen;
+        public ScreenWithHandler<?> getScreenWithHandler() {
+            return screenWithHandler;
         }
         
         @Override

+ 3 - 3
src/main/java/me/shedaniel/rei/api/RecipeHelper.java

@@ -25,7 +25,7 @@ package me.shedaniel.rei.api;
 
 import me.shedaniel.math.api.Rectangle;
 import me.shedaniel.rei.RoughlyEnoughItemsCore;
-import net.minecraft.client.gui.screen.ingame.ContainerScreen;
+import net.minecraft.client.gui.screen.ingame.ScreenWithHandler;
 import net.minecraft.recipe.Recipe;
 import net.minecraft.recipe.RecipeManager;
 import net.minecraft.util.Identifier;
@@ -220,7 +220,7 @@ public interface RecipeHelper {
      */
     void registerLiveRecipeGenerator(LiveRecipeGenerator<?> liveRecipeGenerator);
     
-    void registerScreenClickArea(Rectangle rectangle, Class<? extends ContainerScreen<?>> screenClass, Identifier... categories);
+    void registerScreenClickArea(Rectangle rectangle, Class<? extends ScreenWithHandler<?>> screenClass, Identifier... categories);
     
     <T extends Recipe<?>> void registerRecipes(Identifier category, Class<T> recipeClass, Function<T, RecipeDisplay> mappingFunction);
     
@@ -232,7 +232,7 @@ public interface RecipeHelper {
     boolean arePluginsLoading();
     
     interface ScreenClickArea {
-        Class<? extends ContainerScreen> getScreenClass();
+        Class<? extends ScreenWithHandler> getScreenClass();
         
         Rectangle getRectangle();
         

+ 2 - 2
src/main/java/me/shedaniel/rei/api/TransferRecipeDisplay.java

@@ -24,7 +24,7 @@
 package me.shedaniel.rei.api;
 
 import me.shedaniel.rei.server.ContainerInfo;
-import net.minecraft.container.Container;
+import net.minecraft.screen.ScreenHandler;
 
 import java.util.List;
 
@@ -40,6 +40,6 @@ public interface TransferRecipeDisplay extends RecipeDisplay {
      */
     int getHeight();
     
-    List<List<EntryStack>> getOrganisedInputEntries(ContainerInfo<Container> containerInfo, Container container);
+    List<List<EntryStack>> getOrganisedInputEntries(ContainerInfo<ScreenHandler> containerInfo, ScreenHandler container);
     
 }

+ 3 - 3
src/main/java/me/shedaniel/rei/gui/ConfigReloadingScreen.java

@@ -49,8 +49,8 @@ public class ConfigReloadingScreen extends Screen {
     public void render(int int_1, int int_2, float float_1) {
         this.renderDirtBackground(0);
         if (!RecipeHelper.getInstance().arePluginsLoading())
-            minecraft.openScreen(parent);
-        this.drawCenteredString(this.font, I18n.translate("text.rei.config.is.reloading"), this.width / 2, this.height / 2 - 50, 16777215);
+            client.openScreen(parent);
+        this.drawCenteredString(this.textRenderer, I18n.translate("text.rei.config.is.reloading"), this.width / 2, this.height / 2 - 50, 16777215);
         String string_3;
         switch ((int) (Util.getMeasuringTimeMs() / 300L % 4L)) {
             case 0:
@@ -64,7 +64,7 @@ public class ConfigReloadingScreen extends Screen {
             case 2:
                 string_3 = "o o O";
         }
-        this.drawCenteredString(this.font, string_3, this.width / 2, this.height / 2 - 41, 8421504);
+        this.drawCenteredString(this.textRenderer, string_3, this.width / 2, this.height / 2 - 41, 8421504);
         super.render(int_1, int_2, float_1);
     }
     

+ 18 - 18
src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java

@@ -40,7 +40,7 @@ import me.shedaniel.rei.utils.CollectionUtils;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.gui.Element;
 import net.minecraft.client.gui.screen.Screen;
-import net.minecraft.client.gui.screen.ingame.ContainerScreen;
+import net.minecraft.client.gui.screen.ingame.ScreenWithHandler;
 import net.minecraft.client.render.Tessellator;
 import net.minecraft.client.render.VertexConsumerProvider;
 import net.minecraft.client.resource.language.I18n;
@@ -50,8 +50,8 @@ import net.minecraft.client.util.Window;
 import net.minecraft.client.util.math.Matrix4f;
 import net.minecraft.client.util.math.MatrixStack;
 import net.minecraft.client.world.ClientWorld;
-import net.minecraft.container.Slot;
 import net.minecraft.item.ItemStack;
+import net.minecraft.screen.slot.Slot;
 import net.minecraft.sound.SoundEvents;
 import net.minecraft.text.TranslatableText;
 import net.minecraft.util.ActionResult;
@@ -78,7 +78,7 @@ public class ContainerScreenOverlay extends WidgetWithBounds {
     public final TriConsumer<Integer, Integer, Float> renderTooltipCallback = (x, y, aFloat) -> {
         RenderSystem.disableRescaleNormal();
         RenderSystem.disableDepthTest();
-        setBlitOffset(999);
+        setZOffset(999);
         this.fillGradient(x - 3, y - 4, x + tooltipWidth + 3, y - 3, -267386864, -267386864);
         this.fillGradient(x - 3, y + tooltipHeight + 3, x + tooltipWidth + 3, y + tooltipHeight + 4, -267386864, -267386864);
         this.fillGradient(x - 3, y - 3, x + tooltipWidth + 3, y + tooltipHeight + 3, -267386864, -267386864);
@@ -91,14 +91,14 @@ public class ContainerScreenOverlay extends WidgetWithBounds {
         int currentY = y;
         MatrixStack matrixStack_1 = new MatrixStack();
         VertexConsumerProvider.Immediate immediate = VertexConsumerProvider.immediate(Tessellator.getInstance().getBuffer());
-        matrixStack_1.translate(0.0D, 0.0D, getBlitOffset());
+        matrixStack_1.translate(0.0D, 0.0D, getZOffset());
         Matrix4f matrix4f_1 = matrixStack_1.peek().getModel();
         for (int lineIndex = 0; lineIndex < tooltipLines.size(); lineIndex++) {
             font.draw(tooltipLines.get(lineIndex), x, currentY, -1, true, matrix4f_1, immediate, false, 0, 15728880);
             currentY += lineIndex == 0 ? 12 : 10;
         }
         immediate.draw();
-        setBlitOffset(0);
+        setZOffset(0);
         RenderSystem.enableDepthTest();
         RenderSystem.enableRescaleNormal();
     };
@@ -180,7 +180,7 @@ public class ContainerScreenOverlay extends WidgetWithBounds {
                     ClientHelper.getInstance().setCheating(!ClientHelper.getInstance().isCheating());
                     return;
                 }
-                ConfigManager.getInstance().openConfigScreen(ScreenHelper.getLastContainerScreen());
+                ConfigManager.getInstance().openConfigScreen(ScreenHelper.getLastScreenWithHandler());
             }
             
             @Override
@@ -189,7 +189,7 @@ public class ContainerScreenOverlay extends WidgetWithBounds {
             
             @Override
             public void lateRender(int mouseX, int mouseY, float delta) {
-                setBlitOffset(600);
+                setZOffset(600);
                 super.render(mouseX, mouseY, delta);
                 Rectangle bounds = getBounds();
                 if (ClientHelper.getInstance().isCheating() && RoughlyEnoughItemsCore.hasOperatorPermission()) {
@@ -201,7 +201,7 @@ public class ContainerScreenOverlay extends WidgetWithBounds {
                 MinecraftClient.getInstance().getTextureManager().bindTexture(CHEST_GUI_TEXTURE);
                 RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F);
                 blit(bounds.x + 3, bounds.y + 3, 0, 0, 14, 14);
-                setBlitOffset(0);
+                setZOffset(0);
             }
             
             @Override
@@ -362,7 +362,7 @@ public class ContainerScreenOverlay extends WidgetWithBounds {
             VillagerRecipeViewingScreen widget = (VillagerRecipeViewingScreen) MinecraftClient.getInstance().currentScreen;
             return new Rectangle(widget.bounds.x, window.getScaledHeight() - 22, widget.bounds.width - widthRemoved, 18);
         }
-        return new Rectangle(ScreenHelper.getLastContainerScreenHooks().rei_getContainerLeft(), window.getScaledHeight() - 22, ScreenHelper.getLastContainerScreenHooks().rei_getContainerWidth() - widthRemoved, 18);
+        return new Rectangle(ScreenHelper.getLastScreenWithHandlerHooks().rei_getContainerLeft(), window.getScaledHeight() - 22, ScreenHelper.getLastScreenWithHandlerHooks().rei_getContainerWidth() - widthRemoved, 18);
     }
     
     private Rectangle getCraftableToggleArea() {
@@ -410,19 +410,19 @@ public class ContainerScreenOverlay extends WidgetWithBounds {
             ENTRY_LIST_WIDGET.updateSearch(ScreenHelper.getSearchField().getText(), true);
         }
         if (OverlaySearchField.isSearching) {
-            setBlitOffset(200);
-            if (MinecraftClient.getInstance().currentScreen instanceof ContainerScreen) {
+            setZOffset(200);
+            if (MinecraftClient.getInstance().currentScreen instanceof ScreenWithHandler) {
                 ContainerScreenHooks hooks = (ContainerScreenHooks) MinecraftClient.getInstance().currentScreen;
                 int left = hooks.rei_getContainerLeft(), top = hooks.rei_getContainerTop();
-                for (Slot slot : ((ContainerScreen<?>) MinecraftClient.getInstance().currentScreen).getContainer().slots)
+                for (Slot slot : ((ScreenWithHandler<?>) MinecraftClient.getInstance().currentScreen).getScreenHandler().slots)
                     if (!slot.hasStack() || !ENTRY_LIST_WIDGET.canLastSearchTermsBeAppliedTo(EntryStack.create(slot.getStack())))
                         fillGradient(left + slot.xPosition, top + slot.yPosition, left + slot.xPosition + 16, top + slot.yPosition + 16, -601874400, -601874400);
             }
-            setBlitOffset(0);
+            setZOffset(0);
         }
         RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F);
         this.renderWidgets(mouseX, mouseY, delta);
-        if (MinecraftClient.getInstance().currentScreen instanceof ContainerScreen && ConfigObject.getInstance().areClickableRecipeArrowsEnabled()) {
+        if (MinecraftClient.getInstance().currentScreen instanceof ScreenWithHandler && ConfigObject.getInstance().areClickableRecipeArrowsEnabled()) {
             ContainerScreenHooks hooks = (ContainerScreenHooks) MinecraftClient.getInstance().currentScreen;
             for (RecipeHelper.ScreenClickArea area : RecipeHelper.getInstance().getScreenClickAreas())
                 if (area.getScreenClass().equals(MinecraftClient.getInstance().currentScreen.getClass()))
@@ -527,9 +527,9 @@ public class ContainerScreenOverlay extends WidgetWithBounds {
             return true;
         }
         ItemStack itemStack = null;
-        if (MinecraftClient.getInstance().currentScreen instanceof ContainerScreen)
-            if (ScreenHelper.getLastContainerScreenHooks().rei_getHoveredSlot() != null && !ScreenHelper.getLastContainerScreenHooks().rei_getHoveredSlot().getStack().isEmpty())
-                itemStack = ScreenHelper.getLastContainerScreenHooks().rei_getHoveredSlot().getStack();
+        if (MinecraftClient.getInstance().currentScreen instanceof ScreenWithHandler)
+            if (ScreenHelper.getLastScreenWithHandlerHooks().rei_getHoveredSlot() != null && !ScreenHelper.getLastScreenWithHandlerHooks().rei_getHoveredSlot().getStack().isEmpty())
+                itemStack = ScreenHelper.getLastScreenWithHandlerHooks().rei_getHoveredSlot().getStack();
         if (itemStack != null && !itemStack.isEmpty()) {
             if (ConfigObject.getInstance().getRecipeKeybind().matchesKey(int_1, int_2))
                 return ClientHelper.getInstance().executeRecipeKeyBind(itemStack);
@@ -569,7 +569,7 @@ public class ContainerScreenOverlay extends WidgetWithBounds {
     public boolean mouseClicked(double double_1, double double_2, int int_1) {
         if (!ScreenHelper.isOverlayVisible())
             return false;
-        if (MinecraftClient.getInstance().currentScreen instanceof ContainerScreen && ConfigObject.getInstance().areClickableRecipeArrowsEnabled()) {
+        if (MinecraftClient.getInstance().currentScreen instanceof ScreenWithHandler && ConfigObject.getInstance().areClickableRecipeArrowsEnabled()) {
             ContainerScreenHooks hooks = (ContainerScreenHooks) MinecraftClient.getInstance().currentScreen;
             for (RecipeHelper.ScreenClickArea area : RecipeHelper.getInstance().getScreenClickAreas())
                 if (area.getScreenClass().equals(MinecraftClient.getInstance().currentScreen.getClass()))

+ 7 - 7
src/main/java/me/shedaniel/rei/gui/PreRecipeViewingScreen.java

@@ -38,7 +38,7 @@ import me.shedaniel.rei.impl.ScreenHelper;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.gui.Element;
 import net.minecraft.client.gui.screen.Screen;
-import net.minecraft.client.gui.screen.ingame.ContainerScreen;
+import net.minecraft.client.gui.screen.ingame.ScreenWithHandler;
 import net.minecraft.client.resource.language.I18n;
 import net.minecraft.client.util.NarratorManager;
 import net.minecraft.text.TranslatableText;
@@ -125,16 +125,16 @@ public class PreRecipeViewingScreen extends Screen {
     
     @Override
     public void render(int int_1, int int_2, float float_1) {
-        if (this.minecraft.world != null) {
+        if (this.client.world != null) {
             this.fillGradient(0, 0, this.width, this.height, -1072689136, -804253680);
         } else {
             this.fillGradient(0, 0, this.width, this.height, -16777216, -16777216);
         }
-        this.drawCenteredString(this.font, this.title.asFormattedString(), this.width / 2, 20, 16777215);
+        this.drawCenteredString(this.textRenderer, this.title.asFormattedString(), this.width / 2, 20, 16777215);
         if (showTips) {
             int i = 30;
-            for (String s : this.font.wrapStringToWidthAsList(I18n.translate("text.rei.recipe_screen_type.selection.sub"), width - 30)) {
-                this.drawCenteredString(this.font, Formatting.GRAY.toString() + s, width / 2, i, -1);
+            for (String s : this.textRenderer.wrapStringToWidthAsList(I18n.translate("text.rei.recipe_screen_type.selection.sub"), width - 30)) {
+                this.drawCenteredString(this.textRenderer, Formatting.GRAY.toString() + s, width / 2, i, -1);
                 i += 10;
             }
         }
@@ -167,9 +167,9 @@ public class PreRecipeViewingScreen extends Screen {
     
     @Override
     public boolean keyPressed(int int_1, int int_2, int int_3) {
-        if (int_1 == 256 || this.minecraft.options.keyInventory.matchesKey(int_1, int_2)) {
+        if (int_1 == 256 || this.client.options.keyInventory.matchesKey(int_1, int_2)) {
             MinecraftClient.getInstance().openScreen(parent);
-            if (parent instanceof ContainerScreen)
+            if (parent instanceof ScreenWithHandler)
                 ScreenHelper.getLastOverlay().init();
             return true;
         }

+ 9 - 9
src/main/java/me/shedaniel/rei/gui/RecipeViewingScreen.java

@@ -183,16 +183,16 @@ public class RecipeViewingScreen extends Screen implements RecipeScreen {
         for (Element element : children())
             if (element.keyPressed(int_1, int_2, int_3))
                 return true;
-        if (int_1 == 256 || this.minecraft.options.keyInventory.matchesKey(int_1, int_2)) {
-            MinecraftClient.getInstance().openScreen(ScreenHelper.getLastContainerScreen());
+        if (int_1 == 256 || this.client.options.keyInventory.matchesKey(int_1, int_2)) {
+            MinecraftClient.getInstance().openScreen(ScreenHelper.getLastScreenWithHandler());
             ScreenHelper.getLastOverlay().init();
             return true;
         }
         if (int_1 == 259) {
             if (ScreenHelper.hasLastRecipeScreen())
-                minecraft.openScreen(ScreenHelper.getLastRecipeScreen());
+                client.openScreen(ScreenHelper.getLastRecipeScreen());
             else
-                minecraft.openScreen(ScreenHelper.getLastContainerScreen());
+                client.openScreen(ScreenHelper.getLastScreenWithHandler());
             return true;
         }
         return super.keyPressed(int_1, int_2, int_3);
@@ -420,7 +420,7 @@ public class RecipeViewingScreen extends Screen implements RecipeScreen {
             if (export.matchesCurrentKey()) {
                 for (Map.Entry<Rectangle, List<Widget>> entry : recipeBounds.entrySet()) {
                     Rectangle bounds = entry.getKey();
-                    setBlitOffset(470);
+                    setZOffset(470);
                     if (bounds.contains(mouseX, mouseY)) {
                         fillGradient(bounds.x, bounds.y, bounds.getMaxX(), bounds.getMaxY(), 1744822402, 1744822402);
                         String s = I18n.translate("text.rei.release_export", export.getLocalizedName());
@@ -428,19 +428,19 @@ public class RecipeViewingScreen extends Screen implements RecipeScreen {
                         VertexConsumerProvider.Immediate immediate = VertexConsumerProvider.immediate(Tessellator.getInstance().getBuffer());
                         matrixStack_1.translate(0.0D, 0.0D, 480);
                         Matrix4f matrix4f_1 = matrixStack_1.peek().getModel();
-                        font.draw(s, bounds.getCenterX() - font.getStringWidth(s) / 2f, bounds.getCenterY() - 4.5f, 0xff000000, false, matrix4f_1, immediate, false, 0, 15728880);
+                        textRenderer.draw(s, bounds.getCenterX() - textRenderer.getStringWidth(s) / 2f, bounds.getCenterY() - 4.5f, 0xff000000, false, matrix4f_1, immediate, false, 0, 15728880);
                         immediate.draw();
                     } else {
                         fillGradient(bounds.x, bounds.y, bounds.getMaxX(), bounds.getMaxY(), 1744830463, 1744830463);
                     }
-                    setBlitOffset(0);
+                    setZOffset(0);
                 }
             }
         }
         if (choosePageActivated) {
-            setBlitOffset(500);
+            setZOffset(500);
             this.fillGradient(0, 0, this.width, this.height, -1072689136, -804253680);
-            setBlitOffset(0);
+            setZOffset(0);
             recipeChoosePageWidget.render(mouseX, mouseY, delta);
         }
     }

+ 4 - 4
src/main/java/me/shedaniel/rei/gui/VillagerRecipeViewingScreen.java

@@ -480,16 +480,16 @@ public class VillagerRecipeViewingScreen extends Screen implements RecipeScreen
         for (Element element : children())
             if (element.keyPressed(int_1, int_2, int_3))
                 return true;
-        if (int_1 == 256 || this.minecraft.options.keyInventory.matchesKey(int_1, int_2)) {
-            MinecraftClient.getInstance().openScreen(ScreenHelper.getLastContainerScreen());
+        if (int_1 == 256 || this.client.options.keyInventory.matchesKey(int_1, int_2)) {
+            MinecraftClient.getInstance().openScreen(ScreenHelper.getLastScreenWithHandler());
             ScreenHelper.getLastOverlay().init();
             return true;
         }
         if (int_1 == 259) {
             if (ScreenHelper.hasLastRecipeScreen())
-                minecraft.openScreen(ScreenHelper.getLastRecipeScreen());
+                client.openScreen(ScreenHelper.getLastRecipeScreen());
             else
-                minecraft.openScreen(ScreenHelper.getLastContainerScreen());
+                client.openScreen(ScreenHelper.getLastScreenWithHandler());
             return true;
         }
         return super.keyPressed(int_1, int_2, int_3);

+ 8 - 8
src/main/java/me/shedaniel/rei/gui/credits/CreditsScreen.java

@@ -30,7 +30,7 @@ import me.shedaniel.rei.impl.ScreenHelper;
 import net.fabricmc.loader.api.FabricLoader;
 import net.fabricmc.loader.api.metadata.CustomValue;
 import net.minecraft.client.gui.screen.Screen;
-import net.minecraft.client.gui.screen.ingame.ContainerScreen;
+import net.minecraft.client.gui.screen.ingame.ScreenWithHandler;
 import net.minecraft.client.gui.widget.AbstractPressableButtonWidget;
 import net.minecraft.client.resource.language.I18n;
 import net.minecraft.text.LiteralText;
@@ -57,8 +57,8 @@ public class CreditsScreen extends Screen {
     @Override
     public boolean keyPressed(int int_1, int int_2, int int_3) {
         if (int_1 == 256 && this.shouldCloseOnEsc()) {
-            this.minecraft.openScreen(parent);
-            if (parent instanceof ContainerScreen)
+            this.client.openScreen(parent);
+            if (parent instanceof ScreenWithHandler)
                 ScreenHelper.getLastOverlay().init();
             return true;
         }
@@ -67,7 +67,7 @@ public class CreditsScreen extends Screen {
     
     @Override
     protected void init() {
-        children.add(entryListWidget = new CreditsEntryListWidget(minecraft, width, height, 32, height - 32));
+        children.add(entryListWidget = new CreditsEntryListWidget(client, width, height, 32, height - 32));
         entryListWidget.creditsClearEntries();
         List<Pair<String, String>> translators = Lists.newArrayList();
         Exception[] exception = {null};
@@ -101,7 +101,7 @@ public class CreditsScreen extends Screen {
                     for (StackTraceElement traceElement : exception[0].getStackTrace())
                         entryListWidget.creditsAddEntry(new TextCreditsItem(new LiteralText("  at " + traceElement)));
                 } else {
-                    int maxWidth = translatorsMapped.stream().mapToInt(pair -> font.getStringWidth(pair.getLeft())).max().orElse(0) + 5;
+                    int maxWidth = translatorsMapped.stream().mapToInt(pair -> textRenderer.getStringWidth(pair.getLeft())).max().orElse(0) + 5;
                     for (Pair<String, String> pair : translatorsMapped) {
                         entryListWidget.creditsAddEntry(new TranslationCreditsItem(pair.getLeft(), pair.getRight(), i - maxWidth - 10, maxWidth));
                     }
@@ -111,8 +111,8 @@ public class CreditsScreen extends Screen {
         children.add(buttonDone = new AbstractPressableButtonWidget(width / 2 - 100, height - 26, 200, 20, I18n.translate("gui.done")) {
             @Override
             public void onPress() {
-                CreditsScreen.this.minecraft.openScreen(parent);
-                if (parent instanceof ContainerScreen)
+                CreditsScreen.this.client.openScreen(parent);
+                if (parent instanceof ScreenWithHandler)
                     ScreenHelper.getLastOverlay().init();
             }
         });
@@ -129,7 +129,7 @@ public class CreditsScreen extends Screen {
     public void render(int int_1, int int_2, float float_1) {
         this.renderDirtBackground(0);
         this.entryListWidget.render(int_1, int_2, float_1);
-        this.drawCenteredString(this.font, I18n.translate("text.rei.credits"), this.width / 2, 16, 16777215);
+        this.drawCenteredString(this.textRenderer, I18n.translate("text.rei.credits"), this.width / 2, 16, 16777215);
         super.render(int_1, int_2, float_1);
         buttonDone.render(int_1, int_2, float_1);
     }

+ 6 - 6
src/main/java/me/shedaniel/rei/gui/widget/AutoCraftingButtonWidget.java

@@ -33,7 +33,7 @@ import me.shedaniel.rei.gui.toast.CopyRecipeIdentifierToast;
 import me.shedaniel.rei.impl.ClientHelperImpl;
 import me.shedaniel.rei.impl.ScreenHelper;
 import me.shedaniel.rei.utils.CollectionUtils;
-import net.minecraft.client.gui.screen.ingame.ContainerScreen;
+import net.minecraft.client.gui.screen.ingame.ScreenWithHandler;
 import net.minecraft.client.resource.language.I18n;
 import net.minecraft.text.LiteralText;
 import net.minecraft.util.Formatting;
@@ -51,7 +51,7 @@ public class AutoCraftingButtonWidget extends ButtonWidget {
     private String extraTooltip;
     private List<String> errorTooltip;
     private List<Widget> setupDisplay;
-    private ContainerScreen<?> containerScreen;
+    private ScreenWithHandler<?> screenWithHandler;
     private boolean visible = false;
     private RecipeCategory<?> category;
     private Rectangle displayBounds;
@@ -62,14 +62,14 @@ public class AutoCraftingButtonWidget extends ButtonWidget {
         this.displaySupplier = displaySupplier;
         Optional<Identifier> recipe = displaySupplier.get().getRecipeLocation();
         extraTooltip = recipe.isPresent() ? I18n.translate("text.rei.recipe_id", Formatting.GRAY.toString(), recipe.get().toString()) : "";
-        this.containerScreen = ScreenHelper.getLastContainerScreen();
+        this.screenWithHandler = ScreenHelper.getLastScreenWithHandler();
         this.setupDisplay = setupDisplay;
         this.category = recipeCategory;
     }
     
     @Override
     public void onPressed() {
-        AutoTransferHandler.Context context = AutoTransferHandler.Context.create(true, containerScreen, displaySupplier.get());
+        AutoTransferHandler.Context context = AutoTransferHandler.Context.create(true, screenWithHandler, displaySupplier.get());
         for (AutoTransferHandler autoTransferHandler : RecipeHelper.getInstance().getSortedAutoCraftingHandler())
             try {
                 AutoTransferHandler.Result result = autoTransferHandler.handle(context);
@@ -78,7 +78,7 @@ public class AutoCraftingButtonWidget extends ButtonWidget {
             } catch (Exception e) {
                 e.printStackTrace();
             }
-        minecraft.openScreen(containerScreen);
+        minecraft.openScreen(screenWithHandler);
         ScreenHelper.getLastOverlay().init();
     }
     
@@ -89,7 +89,7 @@ public class AutoCraftingButtonWidget extends ButtonWidget {
         int color = 0;
         visible = false;
         IntList redSlots = null;
-        AutoTransferHandler.Context context = AutoTransferHandler.Context.create(false, containerScreen, displaySupplier.get());
+        AutoTransferHandler.Context context = AutoTransferHandler.Context.create(false, screenWithHandler, displaySupplier.get());
         for (AutoTransferHandler autoTransferHandler : RecipeHelper.getInstance().getSortedAutoCraftingHandler()) {
             try {
                 AutoTransferHandler.Result result = autoTransferHandler.handle(context);

+ 10 - 10
src/main/java/me/shedaniel/rei/gui/widget/ButtonWidget.java

@@ -122,19 +122,19 @@ public abstract class ButtonWidget extends WidgetWithBounds {
         RenderSystem.blendFuncSeparate(770, 771, 1, 0);
         RenderSystem.blendFunc(770, 771);
         //Four Corners
-        blit(x, y, getBlitOffset(), 0, textureOffset * 80, 4, 4, 512, 256);
-        blit(x + width - 4, y, getBlitOffset(), 252, textureOffset * 80, 4, 4, 512, 256);
-        blit(x, y + height - 4, getBlitOffset(), 0, textureOffset * 80 + 76, 4, 4, 512, 256);
-        blit(x + width - 4, y + height - 4, getBlitOffset(), 252, textureOffset * 80 + 76, 4, 4, 512, 256);
+        blit(x, y, getZOffset(), 0, textureOffset * 80, 4, 4, 512, 256);
+        blit(x + width - 4, y, getZOffset(), 252, textureOffset * 80, 4, 4, 512, 256);
+        blit(x, y + height - 4, getZOffset(), 0, textureOffset * 80 + 76, 4, 4, 512, 256);
+        blit(x + width - 4, y + height - 4, getZOffset(), 252, textureOffset * 80 + 76, 4, 4, 512, 256);
         
         //Sides
-        blit(x + 4, y, getBlitOffset(), 4, textureOffset * 80, MathHelper.ceil((width - 8) / 2f), 4, 512, 256);
-        blit(x + 4, y + height - 4, getBlitOffset(), 4, textureOffset * 80 + 76, MathHelper.ceil((width - 8) / 2f), 4, 512, 256);
-        blit(x + 4 + MathHelper.ceil((width - 8) / 2f), y + height - 4, getBlitOffset(), 252 - MathHelper.floor((width - 8) / 2f), textureOffset * 80 + 76, MathHelper.floor((width - 8) / 2f), 4, 512, 256);
-        blit(x + 4 + MathHelper.ceil((width - 8) / 2f), y, getBlitOffset(), 252 - MathHelper.floor((width - 8) / 2f), textureOffset * 80, MathHelper.floor((width - 8) / 2f), 4, 512, 256);
+        blit(x + 4, y, getZOffset(), 4, textureOffset * 80, MathHelper.ceil((width - 8) / 2f), 4, 512, 256);
+        blit(x + 4, y + height - 4, getZOffset(), 4, textureOffset * 80 + 76, MathHelper.ceil((width - 8) / 2f), 4, 512, 256);
+        blit(x + 4 + MathHelper.ceil((width - 8) / 2f), y + height - 4, getZOffset(), 252 - MathHelper.floor((width - 8) / 2f), textureOffset * 80 + 76, MathHelper.floor((width - 8) / 2f), 4, 512, 256);
+        blit(x + 4 + MathHelper.ceil((width - 8) / 2f), y, getZOffset(), 252 - MathHelper.floor((width - 8) / 2f), textureOffset * 80, MathHelper.floor((width - 8) / 2f), 4, 512, 256);
         for (int i = y + 4; i < y + height - 4; i += 76) {
-            blit(x, i, getBlitOffset(), 0, 4 + textureOffset * 80, MathHelper.ceil(width / 2f), MathHelper.clamp(y + height - 4 - i, 0, 76), 512, 256);
-            blit(x + MathHelper.ceil(width / 2f), i, getBlitOffset(), 256 - MathHelper.floor(width / 2f), 4 + textureOffset * 80, MathHelper.floor(width / 2f), MathHelper.clamp(y + height - 4 - i, 0, 76), 512, 256);
+            blit(x, i, getZOffset(), 0, 4 + textureOffset * 80, MathHelper.ceil(width / 2f), MathHelper.clamp(y + height - 4 - i, 0, 76), 512, 256);
+            blit(x + MathHelper.ceil(width / 2f), i, getZOffset(), 256 - MathHelper.floor(width / 2f), 4 + textureOffset * 80, MathHelper.floor(width / 2f), MathHelper.clamp(y + height - 4 - i, 0, 76), 512, 256);
         }
     }
     

+ 4 - 4
src/main/java/me/shedaniel/rei/gui/widget/CraftableToggleButtonWidget.java

@@ -53,17 +53,17 @@ public abstract class CraftableToggleButtonWidget extends LateRenderedButton {
     
     @Override
     public void lateRender(int mouseX, int mouseY, float delta) {
-        setBlitOffset(600);
+        setZOffset(600);
         super.render(mouseX, mouseY, delta);
         
-        this.itemRenderer.zOffset = getBlitOffset() - 98;
+        this.itemRenderer.zOffset = getZOffset() - 98;
         Rectangle bounds = getBounds();
         this.itemRenderer.renderGuiItemIcon(ICON, bounds.x + 2, bounds.y + 2);
         this.itemRenderer.zOffset = 0.0F;
         int color = ConfigManager.getInstance().isCraftableOnlyEnabled() ? 939579655 : 956235776;
-        setBlitOffset(getBlitOffset() + 1);
+        setZOffset(getZOffset() + 1);
         this.fillGradient(bounds.x + 1, bounds.y + 1, bounds.getMaxX() - 1, bounds.getMaxY() - 1, color, color);
-        setBlitOffset(0);
+        setZOffset(0);
     }
     
     @Override

+ 4 - 4
src/main/java/me/shedaniel/rei/gui/widget/TextFieldWidget.java

@@ -507,10 +507,10 @@ public class TextFieldWidget extends WidgetWithBounds implements Tickable {
         RenderSystem.blendFuncSeparate(770, 771, 1, 0);
         RenderSystem.shadeModel(7425);
         buffer.begin(7, VertexFormats.POSITION_COLOR);
-        buffer.vertex(x1, y2, getBlitOffset() + 50d).color(r, g, b, 120).next();
-        buffer.vertex(x2, y2, getBlitOffset() + 50d).color(r, g, b, 120).next();
-        buffer.vertex(x2, y1, getBlitOffset() + 50d).color(r, g, b, 120).next();
-        buffer.vertex(x1, y1, getBlitOffset() + 50d).color(r, g, b, 120).next();
+        buffer.vertex(x1, y2, getZOffset() + 50d).color(r, g, b, 120).next();
+        buffer.vertex(x2, y2, getZOffset() + 50d).color(r, g, b, 120).next();
+        buffer.vertex(x2, y1, getZOffset() + 50d).color(r, g, b, 120).next();
+        buffer.vertex(x1, y1, getZOffset() + 50d).color(r, g, b, 120).next();
         tessellator.draw();
         RenderSystem.shadeModel(7424);
         RenderSystem.disableBlend();

+ 2 - 2
src/main/java/me/shedaniel/rei/gui/widget/Widget.java

@@ -46,11 +46,11 @@ public abstract class Widget extends AbstractParentElement implements Drawable {
     protected final TextRenderer font = minecraft.textRenderer;
     
     public int getZ() {
-        return this.getBlitOffset();
+        return this.getZOffset();
     }
     
     public void setZ(int z) {
-        this.setBlitOffset(z);
+        this.setZOffset(z);
     }
     
     public boolean containsMouse(double mouseX, double mouseY) {

+ 2 - 2
src/main/java/me/shedaniel/rei/impl/AbstractEntryStack.java

@@ -100,11 +100,11 @@ public abstract class AbstractEntryStack extends DrawableHelper implements Entry
     
     @Override
     public int getZ() {
-        return getBlitOffset();
+        return getZOffset();
     }
     
     @Override
     public void setZ(int z) {
-        setBlitOffset(z);
+        setZOffset(z);
     }
 }

+ 2 - 2
src/main/java/me/shedaniel/rei/impl/ClientHelperImpl.java

@@ -146,7 +146,7 @@ public class ClientHelperImpl implements ClientHelper, ClientModInitializer {
     
     @Override
     public void sendDeletePacket() {
-        if (ScreenHelper.getLastContainerScreen() instanceof CreativeInventoryScreen) {
+        if (ScreenHelper.getLastScreenWithHandler() instanceof CreativeInventoryScreen) {
             MinecraftClient.getInstance().player.inventory.setCursorStack(ItemStack.EMPTY);
             return;
         }
@@ -257,7 +257,7 @@ public class ClientHelperImpl implements ClientHelper, ClientModInitializer {
             screen = new VillagerRecipeViewingScreen(map, category);
         } else if (ConfigObject.getInstance().getRecipeScreenType() == RecipeScreenType.UNSET) {
             @Nullable Identifier finalCategory = category;
-            screen = new PreRecipeViewingScreen(ScreenHelper.getLastContainerScreen(), RecipeScreenType.UNSET, true, original -> {
+            screen = new PreRecipeViewingScreen(ScreenHelper.getLastScreenWithHandler(), RecipeScreenType.UNSET, true, original -> {
                 ConfigObject.getInstance().setRecipeScreenType(original ? RecipeScreenType.ORIGINAL : RecipeScreenType.VILLAGER);
                 ConfigManager.getInstance().saveConfig();
                 openRecipeViewingScreen(map, finalCategory, ingredientNotice, resultNotice);

+ 1 - 1
src/main/java/me/shedaniel/rei/impl/ConfigManagerImpl.java

@@ -117,7 +117,7 @@ public class ConfigManagerImpl implements ConfigManager {
                         Collections.singletonList(new RecipeScreenTypeEntry(220, i13n, getUnsafely(field, config, RecipeScreenType.UNSET), getUnsafely(field, defaults), type -> setUnsafely(field, config, type)))
                 , (field) -> field.getType() == RecipeScreenType.class, ConfigObjectImpl.UseSpecialRecipeTypeScreen.class);
         guiRegistry.registerAnnotationProvider((i13n, field, config, defaults, guiProvider) ->
-                        ScreenHelper.getLastContainerScreenHooks() == null || MinecraftClient.getInstance().getNetworkHandler() == null || MinecraftClient.getInstance().getNetworkHandler().getRecipeManager() == null ?
+                        ScreenHelper.getLastScreenWithHandlerHooks() == null || MinecraftClient.getInstance().getNetworkHandler() == null || MinecraftClient.getInstance().getNetworkHandler().getRecipeManager() == null ?
                                 Collections.singletonList(new NoFilteringEntry(getUnsafely(field, config, new ArrayList<>()), getUnsafely(field, defaults), list -> setUnsafely(field, config, list)))
                                 :
                                 Collections.singletonList(new FilteringEntry(getUnsafely(field, config, new ArrayList<>()), getUnsafely(field, defaults), list -> setUnsafely(field, config, list)))

+ 6 - 6
src/main/java/me/shedaniel/rei/impl/RecipeHelperImpl.java

@@ -31,7 +31,7 @@ import me.shedaniel.rei.RoughlyEnoughItemsCore;
 import me.shedaniel.rei.api.*;
 import me.shedaniel.rei.api.plugins.REIPluginV0;
 import me.shedaniel.rei.utils.CollectionUtils;
-import net.minecraft.client.gui.screen.ingame.ContainerScreen;
+import net.minecraft.client.gui.screen.ingame.ScreenWithHandler;
 import net.minecraft.recipe.Recipe;
 import net.minecraft.recipe.RecipeManager;
 import net.minecraft.util.ActionResult;
@@ -355,7 +355,7 @@ public class RecipeHelperImpl implements RecipeHelper {
             
             @Override
             public ActionResult shouldScreenBeOverlayed(Class<?> screen) {
-                return ContainerScreen.class.isAssignableFrom(screen) ? ActionResult.SUCCESS : ActionResult.PASS;
+                return ScreenWithHandler.class.isAssignableFrom(screen) ? ActionResult.SUCCESS : ActionResult.PASS;
             }
             
             @Override
@@ -461,7 +461,7 @@ public class RecipeHelperImpl implements RecipeHelper {
     }
     
     @Override
-    public void registerScreenClickArea(Rectangle rectangle, Class<? extends ContainerScreen<?>> screenClass, Identifier... categories) {
+    public void registerScreenClickArea(Rectangle rectangle, Class<? extends ScreenWithHandler<?>> screenClass, Identifier... categories) {
         this.screenClickAreas.add(new ScreenClickAreaImpl(screenClass, rectangle, categories));
     }
     
@@ -493,17 +493,17 @@ public class RecipeHelperImpl implements RecipeHelper {
     }
     
     private static class ScreenClickAreaImpl implements ScreenClickArea {
-        Class<? extends ContainerScreen<?>> screenClass;
+        Class<? extends ScreenWithHandler<?>> screenClass;
         Rectangle rectangle;
         Identifier[] categories;
         
-        private ScreenClickAreaImpl(Class<? extends ContainerScreen<?>> screenClass, Rectangle rectangle, Identifier[] categories) {
+        private ScreenClickAreaImpl(Class<? extends ScreenWithHandler<?>> screenClass, Rectangle rectangle, Identifier[] categories) {
             this.screenClass = screenClass;
             this.rectangle = rectangle;
             this.categories = categories;
         }
         
-        public Class<? extends ContainerScreen<?>> getScreenClass() {
+        public Class<? extends ScreenWithHandler<?>> getScreenClass() {
             return screenClass;
         }
         

+ 2 - 2
src/main/java/me/shedaniel/rei/impl/RenderingEntry.java

@@ -96,12 +96,12 @@ public abstract class RenderingEntry extends DrawableHelper implements EntryStac
     
     @Override
     public int getZ() {
-        return getBlitOffset();
+        return getZOffset();
     }
     
     @Override
     public void setZ(int z) {
-        setBlitOffset(z);
+        setZOffset(z);
     }
     
     @Override

+ 27 - 9
src/main/java/me/shedaniel/rei/impl/ScreenHelper.java

@@ -40,7 +40,7 @@ import net.fabricmc.api.ClientModInitializer;
 import net.fabricmc.fabric.api.event.client.ClientTickCallback;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.gui.screen.Screen;
-import net.minecraft.client.gui.screen.ingame.ContainerScreen;
+import net.minecraft.client.gui.screen.ingame.ScreenWithHandler;
 import net.minecraft.client.util.Window;
 import net.minecraft.item.ItemStack;
 import net.minecraft.util.ActionResult;
@@ -59,7 +59,7 @@ public class ScreenHelper implements ClientModInitializer, REIHelper {
     @ApiStatus.Internal
     public static List<ItemStack> inventoryStacks = Lists.newArrayList();
     private static ContainerScreenOverlay overlay;
-    private static ContainerScreen<?> lastContainerScreen = null;
+    private static ScreenWithHandler<?> lastScreenWithHandler = null;
     private static LinkedHashSet<RecipeScreen> lastRecipeScreen = Sets.newLinkedHashSetWithExpectedSize(5);
     private static ScreenHelper instance;
     
@@ -146,16 +146,34 @@ public class ScreenHelper implements ClientModInitializer, REIHelper {
         return getLastOverlay(false, false);
     }
     
-    public static ContainerScreen<?> getLastContainerScreen() {
-        return lastContainerScreen;
+    @Deprecated
+    @ApiStatus.ScheduledForRemoval
+    public static ScreenWithHandler<?> getLastContainerScreen() {
+        return getLastScreenWithHandler();
+    }
+    
+    public static ScreenWithHandler<?> getLastScreenWithHandler() {
+        return lastScreenWithHandler;
+    }
+    
+    @Deprecated
+    @ApiStatus.ScheduledForRemoval
+    public static void setLastContainerScreen(ScreenWithHandler<?> lastScreenWithHandler) {
+        setLastScreenWithHandler(lastScreenWithHandler);
     }
     
-    public static void setLastContainerScreen(ContainerScreen<?> lastContainerScreen) {
-        ScreenHelper.lastContainerScreen = lastContainerScreen;
+    public static void setLastScreenWithHandler(ScreenWithHandler<?> lastScreenWithHandler) {
+        ScreenHelper.lastScreenWithHandler = lastScreenWithHandler;
     }
     
+    @Deprecated
+    @ApiStatus.ScheduledForRemoval
     public static ContainerScreenHooks getLastContainerScreenHooks() {
-        return (ContainerScreenHooks) lastContainerScreen;
+        return getLastScreenWithHandlerHooks();
+    }
+    
+    public static ContainerScreenHooks getLastScreenWithHandlerHooks() {
+        return (ContainerScreenHooks) lastScreenWithHandler;
     }
     
     public static void drawHoveringWidget(int x, int y, TriConsumer<Integer, Integer, Float> consumer, int width, int height, float delta) {
@@ -192,8 +210,8 @@ public class ScreenHelper implements ClientModInitializer, REIHelper {
     @Override
     public void onInitializeClient() {
         ClothClientHooks.SCREEN_INIT_PRE.register((client, screen, screenHooks) -> {
-            if (lastContainerScreen != screen && screen instanceof ContainerScreen)
-                lastContainerScreen = (ContainerScreen<?>) screen;
+            if (lastScreenWithHandler != screen && screen instanceof ScreenWithHandler)
+                lastScreenWithHandler = (ScreenWithHandler<?>) screen;
             return ActionResult.PASS;
         });
         ClientTickCallback.EVENT.register(minecraftClient -> {

+ 4 - 4
src/main/java/me/shedaniel/rei/impl/widgets/FillRectangleDrawableConsumer.java

@@ -54,10 +54,10 @@ public class FillRectangleDrawableConsumer implements DrawableConsumer {
         Tessellator tessellator = Tessellator.getInstance();
         BufferBuilder bufferBuilder = tessellator.getBuffer();
         bufferBuilder.begin(7, VertexFormats.POSITION_COLOR);
-        bufferBuilder.vertex(rectangle.getMaxX(), rectangle.getMinY(), helper.getBlitOffset()).color(r, g, b, a).next();
-        bufferBuilder.vertex(rectangle.getMinX(), rectangle.getMinY(), helper.getBlitOffset()).color(r, g, b, a).next();
-        bufferBuilder.vertex(rectangle.getMinX(), rectangle.getMaxY(), helper.getBlitOffset()).color(r, g, b, a).next();
-        bufferBuilder.vertex(rectangle.getMaxX(), rectangle.getMaxY(), helper.getBlitOffset()).color(r, g, b, a).next();
+        bufferBuilder.vertex(rectangle.getMaxX(), rectangle.getMinY(), helper.getZOffset()).color(r, g, b, a).next();
+        bufferBuilder.vertex(rectangle.getMinX(), rectangle.getMinY(), helper.getZOffset()).color(r, g, b, a).next();
+        bufferBuilder.vertex(rectangle.getMinX(), rectangle.getMaxY(), helper.getZOffset()).color(r, g, b, a).next();
+        bufferBuilder.vertex(rectangle.getMaxX(), rectangle.getMaxY(), helper.getZOffset()).color(r, g, b, a).next();
         tessellator.draw();
         RenderSystem.shadeModel(7424);
         RenderSystem.disableBlend();

+ 1 - 1
src/main/java/me/shedaniel/rei/impl/widgets/TexturedDrawableConsumer.java

@@ -55,7 +55,7 @@ public class TexturedDrawableConsumer implements DrawableConsumer {
     @Override
     public void render(DrawableHelper helper, int mouseX, int mouseY, float delta) {
         MinecraftClient.getInstance().getTextureManager().bindTexture(identifier);
-        innerBlit(x, x + width, y, y + height, helper.getBlitOffset(), uWidth, vHeight, u, v, textureWidth, textureHeight);
+        innerBlit(x, x + width, y, y + height, helper.getZOffset(), uWidth, vHeight, u, v, textureWidth, textureHeight);
     }
     
     private static void innerBlit(int xStart, int xEnd, int yStart, int yEnd, int z, int width, int height, float u, float v, int texWidth, int texHeight) {

+ 5 - 5
src/main/java/me/shedaniel/rei/listeners/ContainerScreenHooks.java

@@ -23,14 +23,14 @@
 
 package me.shedaniel.rei.listeners;
 
-import net.minecraft.client.gui.screen.ingame.ContainerScreen;
-import net.minecraft.container.Slot;
+import net.minecraft.client.gui.screen.ingame.ScreenWithHandler;
+import net.minecraft.screen.slot.Slot;
 import org.jetbrains.annotations.ApiStatus;
 import org.spongepowered.asm.mixin.Mixin;
 import org.spongepowered.asm.mixin.gen.Accessor;
 
 @ApiStatus.Internal
-@Mixin(ContainerScreen.class)
+@Mixin(ScreenWithHandler.class)
 public interface ContainerScreenHooks {
     
     @Accessor("x")
@@ -39,10 +39,10 @@ public interface ContainerScreenHooks {
     @Accessor("y")
     int rei_getContainerTop();
     
-    @Accessor("containerWidth")
+    @Accessor("backgroundWidth")
     int rei_getContainerWidth();
     
-    @Accessor("containerHeight")
+    @Accessor("backgroundHeight")
     int rei_getContainerHeight();
     
     @Accessor("focusedSlot")

+ 7 - 7
src/main/java/me/shedaniel/rei/plugin/DefaultPlugin.java

@@ -164,7 +164,7 @@ public class DefaultPlugin implements REIPluginV0 {
             @Override
             public void render(Rectangle bounds, int mouseX, int mouseY, float delta) {
                 MinecraftClient.getInstance().getTextureManager().bindTexture(id);
-                innerBlit(bounds.x, bounds.getMaxX(), bounds.y, bounds.getMaxY(), getBlitOffset(), 0, 1, 0, 1);
+                innerBlit(bounds.x, bounds.getMaxX(), bounds.y, bounds.getMaxY(), getZOffset(), 0, 1, 0, 1);
             }
             
             @Override
@@ -310,20 +310,20 @@ public class DefaultPlugin implements REIPluginV0 {
 //                return 10f;
 //            }
 //        });
-        displayHelper.registerHandler(new DisplayHelper.DisplayBoundsHandler<ContainerScreen<?>>() {
+        displayHelper.registerHandler(new DisplayHelper.DisplayBoundsHandler<ScreenWithHandler<?>>() {
             @Override
             public Class<?> getBaseSupportedClass() {
-                return ContainerScreen.class;
+                return ScreenWithHandler.class;
             }
             
             @Override
-            public Rectangle getLeftBounds(ContainerScreen<?> screen) {
-                return new Rectangle(2, 0, ScreenHelper.getLastContainerScreenHooks().rei_getContainerLeft() - 4, MinecraftClient.getInstance().getWindow().getScaledHeight());
+            public Rectangle getLeftBounds(ScreenWithHandler<?> screen) {
+                return new Rectangle(2, 0, ScreenHelper.getLastScreenWithHandlerHooks().rei_getContainerLeft() - 4, MinecraftClient.getInstance().getWindow().getScaledHeight());
             }
             
             @Override
-            public Rectangle getRightBounds(ContainerScreen<?> screen) {
-                int startX = ScreenHelper.getLastContainerScreenHooks().rei_getContainerLeft() + ScreenHelper.getLastContainerScreenHooks().rei_getContainerWidth() + 2;
+            public Rectangle getRightBounds(ScreenWithHandler<?> screen) {
+                int startX = ScreenHelper.getLastScreenWithHandlerHooks().rei_getContainerLeft() + ScreenHelper.getLastScreenWithHandlerHooks().rei_getContainerWidth() + 2;
                 return new Rectangle(startX, 0, MinecraftClient.getInstance().getWindow().getScaledWidth() - startX - 2, MinecraftClient.getInstance().getWindow().getScaledHeight());
             }
             

+ 2 - 2
src/main/java/me/shedaniel/rei/plugin/DefaultPotionEffectExclusionZones.java

@@ -41,12 +41,12 @@ import java.util.function.Supplier;
 public class DefaultPotionEffectExclusionZones implements Supplier<List<Rectangle>> {
     @Override
     public List<Rectangle> get() {
-        if (!(ScreenHelper.getLastContainerScreen() instanceof AbstractInventoryScreen) || !((AbstractInventoryScreenHooks) ScreenHelper.getLastContainerScreen()).rei_doesOffsetGuiForEffects())
+        if (!(ScreenHelper.getLastScreenWithHandler() instanceof AbstractInventoryScreen) || !((AbstractInventoryScreenHooks) ScreenHelper.getLastScreenWithHandler()).rei_doesOffsetGuiForEffects())
             return Collections.emptyList();
         Collection<StatusEffectInstance> activePotionEffects = MinecraftClient.getInstance().player.getStatusEffects();
         if (activePotionEffects.isEmpty())
             return Collections.emptyList();
-        ContainerScreenHooks hooks = ScreenHelper.getLastContainerScreenHooks();
+        ContainerScreenHooks hooks = ScreenHelper.getLastScreenWithHandlerHooks();
         List<Rectangle> list = new ArrayList<>();
         int x = hooks.rei_getContainerLeft() - 124;
         int y = hooks.rei_getContainerTop();

+ 5 - 5
src/main/java/me/shedaniel/rei/plugin/DefaultRecipeBookExclusionZones.java

@@ -29,8 +29,8 @@ import me.shedaniel.rei.impl.ScreenHelper;
 import me.shedaniel.rei.listeners.ContainerScreenHooks;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.gui.screen.recipebook.RecipeBookProvider;
-import net.minecraft.client.recipe.book.ClientRecipeBook;
-import net.minecraft.container.CraftingContainer;
+import net.minecraft.client.recipebook.ClientRecipeBook;
+import net.minecraft.screen.CraftingScreenHandler;
 
 import java.util.Collections;
 import java.util.List;
@@ -40,11 +40,11 @@ public class DefaultRecipeBookExclusionZones implements Supplier<List<Rectangle>
     
     @Override
     public List<Rectangle> get() {
-        if (!MinecraftClient.getInstance().player.getRecipeBook().isGuiOpen() || !(MinecraftClient.getInstance().currentScreen instanceof RecipeBookProvider) || !(ScreenHelper.getLastContainerScreen().getContainer() instanceof CraftingContainer))
+        if (!MinecraftClient.getInstance().player.getRecipeBook().isGuiOpen() || !(MinecraftClient.getInstance().currentScreen instanceof RecipeBookProvider) || !(ScreenHelper.getLastScreenWithHandler().getScreenHandler() instanceof CraftingScreenHandler))
             return Collections.emptyList();
-        ContainerScreenHooks screenHooks = ScreenHelper.getLastContainerScreenHooks();
+        ContainerScreenHooks screenHooks = ScreenHelper.getLastScreenWithHandlerHooks();
         List<Rectangle> l = Lists.newArrayList(new Rectangle(screenHooks.rei_getContainerLeft() - 4 - 145, screenHooks.rei_getContainerTop(), 4 + 145 + 30, screenHooks.rei_getContainerHeight()));
-        int size = ClientRecipeBook.getGroupsForContainer((CraftingContainer<?>) ScreenHelper.getLastContainerScreen().getContainer()).size();
+        int size = ClientRecipeBook.getGroups((CraftingScreenHandler<?>) ScreenHelper.getLastScreenWithHandler().getScreenHandler()).size();
         if (size > 0)
             l.add(new Rectangle(screenHooks.rei_getContainerLeft() - 4 - 145 - 30, screenHooks.rei_getContainerTop(), 30, size * 27));
         return l;

+ 6 - 6
src/main/java/me/shedaniel/rei/plugin/DefaultServerContainerPlugin.java

@@ -25,16 +25,16 @@ package me.shedaniel.rei.plugin;
 
 import me.shedaniel.rei.plugin.containers.CraftingContainerInfoWrapper;
 import me.shedaniel.rei.server.ContainerInfoHandler;
-import net.minecraft.container.*;
+import net.minecraft.screen.*;
 import net.minecraft.util.Identifier;
 
 public class DefaultServerContainerPlugin implements Runnable {
     @Override
     public void run() {
-        ContainerInfoHandler.registerContainerInfo(new Identifier("minecraft", "plugins/crafting"), CraftingContainerInfoWrapper.create(CraftingTableContainer.class));
-        ContainerInfoHandler.registerContainerInfo(new Identifier("minecraft", "plugins/crafting"), CraftingContainerInfoWrapper.create(PlayerContainer.class));
-        ContainerInfoHandler.registerContainerInfo(new Identifier("minecraft", "plugins/smelting"), CraftingContainerInfoWrapper.create(FurnaceContainer.class));
-        ContainerInfoHandler.registerContainerInfo(new Identifier("minecraft", "plugins/smoking"), CraftingContainerInfoWrapper.create(SmokerContainer.class));
-        ContainerInfoHandler.registerContainerInfo(new Identifier("minecraft", "plugins/blasting"), CraftingContainerInfoWrapper.create(BlastFurnaceContainer.class));
+        ContainerInfoHandler.registerScreenWithHandlerInfo(new Identifier("minecraft", "plugins/crafting"), CraftingContainerInfoWrapper.create(CraftingTableScreenHandler.class));
+        ContainerInfoHandler.registerScreenWithHandlerInfo(new Identifier("minecraft", "plugins/crafting"), CraftingContainerInfoWrapper.create(PlayerScreenHandler.class));
+        ContainerInfoHandler.registerScreenWithHandlerInfo(new Identifier("minecraft", "plugins/smelting"), CraftingContainerInfoWrapper.create(FurnaceScreenHandler.class));
+        ContainerInfoHandler.registerScreenWithHandlerInfo(new Identifier("minecraft", "plugins/smoking"), CraftingContainerInfoWrapper.create(SmokerScreenHandler.class));
+        ContainerInfoHandler.registerScreenWithHandlerInfo(new Identifier("minecraft", "plugins/blasting"), CraftingContainerInfoWrapper.create(BlastFurnaceScreenHandler.class));
     }
 }

+ 11 - 11
src/main/java/me/shedaniel/rei/plugin/autocrafting/DefaultCategoryHandler.java

@@ -36,11 +36,11 @@ import me.shedaniel.rei.server.ContainerInfoHandler;
 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.ContainerScreen;
+import net.minecraft.client.gui.screen.ingame.ScreenWithHandler;
 import net.minecraft.client.gui.screen.recipebook.RecipeBookProvider;
 import net.minecraft.client.resource.language.I18n;
-import net.minecraft.container.Container;
 import net.minecraft.item.ItemStack;
+import net.minecraft.screen.ScreenHandler;
 import net.minecraft.util.DefaultedList;
 import net.minecraft.util.PacketByteBuf;
 
@@ -57,14 +57,14 @@ public class DefaultCategoryHandler implements AutoTransferHandler {
         if (!(context.getRecipe() instanceof TransferRecipeDisplay))
             return Result.createNotApplicable();
         TransferRecipeDisplay recipe = (TransferRecipeDisplay) context.getRecipe();
-        ContainerScreen<?> containerScreen = context.getContainerScreen();
-        Container container = containerScreen.getContainer();
-        ContainerInfo<Container> containerInfo = (ContainerInfo<Container>) ContainerInfoHandler.getContainerInfo(recipe.getRecipeCategory(), container.getClass());
+        ScreenWithHandler<?> screenWithHandler = context.getScreenWithHandler();
+        ScreenHandler screenHandler = context.getScreenHandler();
+        ContainerInfo<ScreenHandler> containerInfo = (ContainerInfo<ScreenHandler>) ContainerInfoHandler.getContainerInfo(recipe.getRecipeCategory(), screenHandler.getClass());
         if (containerInfo == null)
             return Result.createNotApplicable();
-        if (recipe.getHeight() > containerInfo.getCraftingHeight(container) || recipe.getWidth() > containerInfo.getCraftingWidth(container))
-            return Result.createFailed(I18n.translate("error.rei.transfer.too_small", containerInfo.getCraftingWidth(container), containerInfo.getCraftingHeight(container)));
-        List<List<EntryStack>> input = recipe.getOrganisedInputEntries(containerInfo, container);
+        if (recipe.getHeight() > containerInfo.getCraftingHeight(screenHandler) || recipe.getWidth() > containerInfo.getCraftingWidth(screenHandler))
+            return Result.createFailed(I18n.translate("error.rei.transfer.too_small", containerInfo.getCraftingWidth(screenHandler), containerInfo.getCraftingHeight(screenHandler)));
+        List<List<EntryStack>> input = recipe.getOrganisedInputEntries(containerInfo, screenHandler);
         IntList intList = hasItems(input);
         if (!intList.isEmpty())
             return Result.createFailed("error.rei.not.enough.materials", intList);
@@ -73,9 +73,9 @@ public class DefaultCategoryHandler implements AutoTransferHandler {
         if (!context.isActuallyCrafting())
             return Result.createSuccessful();
         
-        context.getMinecraft().openScreen(containerScreen);
-        if (containerScreen instanceof RecipeBookProvider)
-            ((RecipeBookGuiHooks) ((RecipeBookProvider) containerScreen).getRecipeBookWidget()).rei_getGhostSlots().reset();
+        context.getMinecraft().openScreen(screenWithHandler);
+        if (screenWithHandler instanceof RecipeBookProvider)
+            ((RecipeBookGuiHooks) ((RecipeBookProvider) screenWithHandler).getRecipeBookWidget()).rei_getGhostSlots().reset();
         PacketByteBuf buf = new PacketByteBuf(Unpooled.buffer());
         buf.writeIdentifier(recipe.getRecipeCategory());
         buf.writeBoolean(Screen.hasShiftDown());

+ 13 - 13
src/main/java/me/shedaniel/rei/plugin/autocrafting/DefaultRecipeBookHandler.java

@@ -33,10 +33,10 @@ import me.shedaniel.rei.plugin.crafting.DefaultCraftingDisplay;
 import net.minecraft.client.gui.screen.Screen;
 import net.minecraft.client.gui.screen.recipebook.RecipeBookProvider;
 import net.minecraft.client.resource.language.I18n;
-import net.minecraft.container.CraftingContainer;
-import net.minecraft.container.CraftingTableContainer;
-import net.minecraft.container.PlayerContainer;
 import net.minecraft.recipe.Recipe;
+import net.minecraft.screen.CraftingScreenHandler;
+import net.minecraft.screen.CraftingTableScreenHandler;
+import net.minecraft.screen.PlayerScreenHandler;
 
 public class DefaultRecipeBookHandler implements AutoTransferHandler {
     @Override
@@ -44,17 +44,17 @@ public class DefaultRecipeBookHandler implements AutoTransferHandler {
         if (context.getRecipe() instanceof TransferRecipeDisplay && DefaultCategoryHandler.canUseMovePackets())
             return Result.createNotApplicable();
         RecipeDisplay display = context.getRecipe();
-        if (!(context.getContainer() instanceof CraftingContainer))
+        if (!(context.getScreenHandler() instanceof CraftingScreenHandler))
             return Result.createNotApplicable();
-        CraftingContainer<?> container = (CraftingContainer<?>) context.getContainer();
+        CraftingScreenHandler<?> container = (CraftingScreenHandler<?>) context.getScreenHandler();
         if (display instanceof DefaultCraftingDisplay) {
             DefaultCraftingDisplay craftingDisplay = (DefaultCraftingDisplay) display;
             if (craftingDisplay.getOptionalRecipe().isPresent()) {
                 int h = -1, w = -1;
-                if (container instanceof CraftingTableContainer) {
+                if (container instanceof CraftingTableScreenHandler) {
                     h = 3;
                     w = 3;
-                } else if (container instanceof PlayerContainer) {
+                } else if (container instanceof PlayerScreenHandler) {
                     h = 2;
                     w = 2;
                 }
@@ -67,9 +67,9 @@ public class DefaultRecipeBookHandler implements AutoTransferHandler {
                     return Result.createFailed(I18n.translate("error.rei.recipe.not.unlocked"));
                 if (!context.isActuallyCrafting())
                     return Result.createSuccessful();
-                context.getMinecraft().openScreen(context.getContainerScreen());
-                if (context.getContainerScreen() instanceof RecipeBookProvider)
-                    ((RecipeBookGuiHooks) ((RecipeBookProvider) context.getContainerScreen()).getRecipeBookWidget()).rei_getGhostSlots().reset();
+                context.getMinecraft().openScreen(context.getScreenWithHandler());
+                if (context.getScreenWithHandler() instanceof RecipeBookProvider)
+                    ((RecipeBookGuiHooks) ((RecipeBookProvider) context.getScreenWithHandler()).getRecipeBookWidget()).rei_getGhostSlots().reset();
                 context.getMinecraft().interactionManager.clickRecipe(container.syncId, recipe, Screen.hasShiftDown());
                 ScreenHelper.getLastOverlay().init();
             }
@@ -81,9 +81,9 @@ public class DefaultRecipeBookHandler implements AutoTransferHandler {
                     return Result.createFailed(I18n.translate("error.rei.recipe.not.unlocked"));
                 if (!context.isActuallyCrafting())
                     return Result.createSuccessful();
-                context.getMinecraft().openScreen(context.getContainerScreen());
-                if (context.getContainerScreen() instanceof RecipeBookProvider)
-                    ((RecipeBookGuiHooks) ((RecipeBookProvider) context.getContainerScreen()).getRecipeBookWidget()).rei_getGhostSlots().reset();
+                context.getMinecraft().openScreen(context.getScreenWithHandler());
+                if (context.getScreenWithHandler() instanceof RecipeBookProvider)
+                    ((RecipeBookGuiHooks) ((RecipeBookProvider) context.getScreenWithHandler()).getRecipeBookWidget()).rei_getGhostSlots().reset();
                 context.getMinecraft().interactionManager.clickRecipe(container.syncId, recipe, Screen.hasShiftDown());
                 ScreenHelper.getLastOverlay().init();
             }

+ 6 - 6
src/main/java/me/shedaniel/rei/plugin/containers/CraftingContainerInfoWrapper.java

@@ -25,23 +25,23 @@ package me.shedaniel.rei.plugin.containers;
 
 import me.shedaniel.rei.server.ContainerInfo;
 import me.shedaniel.rei.server.RecipeFinder;
-import net.minecraft.container.Container;
-import net.minecraft.container.CraftingContainer;
 import net.minecraft.item.ItemStack;
+import net.minecraft.screen.CraftingScreenHandler;
+import net.minecraft.screen.ScreenHandler;
 
-public class CraftingContainerInfoWrapper<T extends CraftingContainer<?>> implements ContainerInfo<T> {
-    private Class<? extends CraftingContainer<?>> containerClass;
+public class CraftingContainerInfoWrapper<T extends CraftingScreenHandler<?>> implements ContainerInfo<T> {
+    private Class<? extends CraftingScreenHandler<?>> containerClass;
     
     public CraftingContainerInfoWrapper(Class<T> containerClass) {
         this.containerClass = containerClass;
     }
     
-    public static <R extends CraftingContainer<?>> ContainerInfo<R> create(Class<R> containerClass) {
+    public static <R extends CraftingScreenHandler<?>> ContainerInfo<R> create(Class<R> containerClass) {
         return new CraftingContainerInfoWrapper<>(containerClass);
     }
     
     @Override
-    public Class<? extends Container> getContainerClass() {
+    public Class<? extends ScreenHandler> getContainerClass() {
         return containerClass;
     }
     

+ 2 - 2
src/main/java/me/shedaniel/rei/plugin/cooking/DefaultCookingDisplay.java

@@ -29,9 +29,9 @@ import me.shedaniel.rei.server.ContainerInfo;
 import me.shedaniel.rei.utils.CollectionUtils;
 import net.minecraft.block.entity.FurnaceBlockEntity;
 import net.minecraft.client.resource.language.I18n;
-import net.minecraft.container.Container;
 import net.minecraft.item.Item;
 import net.minecraft.recipe.AbstractCookingRecipe;
+import net.minecraft.screen.ScreenHandler;
 import net.minecraft.util.Formatting;
 import net.minecraft.util.Identifier;
 import org.jetbrains.annotations.ApiStatus;
@@ -110,7 +110,7 @@ public abstract class DefaultCookingDisplay implements TransferRecipeDisplay {
     }
     
     @Override
-    public List<List<EntryStack>> getOrganisedInputEntries(ContainerInfo<Container> containerInfo, Container container) {
+    public List<List<EntryStack>> getOrganisedInputEntries(ContainerInfo<ScreenHandler> containerInfo, ScreenHandler container) {
         return input;
     }
     

+ 3 - 3
src/main/java/me/shedaniel/rei/plugin/crafting/DefaultCraftingCategory.java

@@ -40,7 +40,7 @@ import me.shedaniel.rei.server.ContainerInfoHandler;
 import net.minecraft.block.Blocks;
 import net.minecraft.client.gui.DrawableHelper;
 import net.minecraft.client.resource.language.I18n;
-import net.minecraft.container.Container;
+import net.minecraft.screen.ScreenHandler;
 import net.minecraft.util.Identifier;
 import net.minecraft.util.math.MathHelper;
 
@@ -95,12 +95,12 @@ public class DefaultCraftingCategory implements TransferRecipeCategory<DefaultCr
     
     @Override
     public void renderRedSlots(List<Widget> widgets, me.shedaniel.math.api.Rectangle bounds, DefaultCraftingDisplay display, IntList redSlots) {
-        ContainerInfo<Container> info = (ContainerInfo<Container>) ContainerInfoHandler.getContainerInfo(getIdentifier(), ScreenHelper.getLastContainerScreen().getContainer().getClass());
+        ContainerInfo<ScreenHandler> info = (ContainerInfo<ScreenHandler>) ContainerInfoHandler.getContainerInfo(getIdentifier(), ScreenHelper.getLastScreenWithHandler().getScreenHandler().getClass());
         if (info == null)
             return;
         RenderSystem.translatef(0, 0, 400);
         Point startPoint = new Point(bounds.getCenterX() - 58, bounds.getCenterY() - 27);
-        int width = info.getCraftingWidth(ScreenHelper.getLastContainerScreen().getContainer());
+        int width = info.getCraftingWidth(ScreenHelper.getLastScreenWithHandler().getScreenHandler());
         for (Integer slot : redSlots) {
             int i = slot;
             int x = i % width;

+ 2 - 2
src/main/java/me/shedaniel/rei/plugin/crafting/DefaultCraftingDisplay.java

@@ -28,8 +28,8 @@ import me.shedaniel.rei.api.EntryStack;
 import me.shedaniel.rei.api.TransferRecipeDisplay;
 import me.shedaniel.rei.plugin.DefaultPlugin;
 import me.shedaniel.rei.server.ContainerInfo;
-import net.minecraft.container.Container;
 import net.minecraft.recipe.Recipe;
+import net.minecraft.screen.ScreenHandler;
 import net.minecraft.util.Identifier;
 
 import java.util.Collections;
@@ -56,7 +56,7 @@ public interface DefaultCraftingDisplay extends TransferRecipeDisplay {
     Optional<Recipe<?>> getOptionalRecipe();
     
     @Override
-    default List<List<EntryStack>> getOrganisedInputEntries(ContainerInfo<Container> containerInfo, Container container) {
+    default List<List<EntryStack>> getOrganisedInputEntries(ContainerInfo<ScreenHandler> containerInfo, ScreenHandler container) {
         List<List<EntryStack>> list = Lists.newArrayListWithCapacity(containerInfo.getCraftingWidth(container) * containerInfo.getCraftingHeight(container));
         for (int i = 0; i < containerInfo.getCraftingWidth(container) * containerInfo.getCraftingHeight(container); i++) {
             list.add(Collections.emptyList());

+ 0 - 1
src/main/java/me/shedaniel/rei/plugin/stonecutting/DefaultStoneCuttingCategory.java

@@ -29,7 +29,6 @@ import me.shedaniel.math.Rectangle;
 import me.shedaniel.rei.api.EntryStack;
 import me.shedaniel.rei.api.RecipeCategory;
 import me.shedaniel.rei.api.widgets.Widgets;
-import me.shedaniel.rei.gui.widget.EntryWidget;
 import me.shedaniel.rei.gui.widget.Widget;
 import me.shedaniel.rei.plugin.DefaultPlugin;
 import net.minecraft.block.Blocks;

+ 3 - 3
src/main/java/me/shedaniel/rei/server/ContainerInfo.java

@@ -23,10 +23,10 @@
 
 package me.shedaniel.rei.server;
 
-import net.minecraft.container.Container;
+import net.minecraft.screen.ScreenHandler;
 
-public interface ContainerInfo<T extends Container> {
-    Class<? extends Container> getContainerClass();
+public interface ContainerInfo<T extends ScreenHandler> {
+    Class<? extends ScreenHandler> getContainerClass();
     
     int getCraftingResultSlotIndex(T container);
     

+ 13 - 6
src/main/java/me/shedaniel/rei/server/ContainerInfoHandler.java

@@ -24,15 +24,22 @@
 package me.shedaniel.rei.server;
 
 import com.google.common.collect.Maps;
-import net.minecraft.container.Container;
+import net.minecraft.screen.ScreenHandler;
 import net.minecraft.util.Identifier;
+import org.jetbrains.annotations.ApiStatus;
 
 import java.util.Map;
 
 public class ContainerInfoHandler {
-    private static final Map<String, Map<Class<? extends Container>, ContainerInfo<? extends Container>>> containerInfoMap = Maps.newLinkedHashMap();
+    private static final Map<String, Map<Class<? extends ScreenHandler>, ContainerInfo<? extends ScreenHandler>>> containerInfoMap = Maps.newLinkedHashMap();
     
-    public static void registerContainerInfo(Identifier category, ContainerInfo<? extends Container> containerInfo) {
+    @Deprecated
+    @ApiStatus.ScheduledForRemoval
+    public static void registerContainerInfo(Identifier category, ContainerInfo<? extends ScreenHandler> containerInfo) {
+        registerScreenWithHandlerInfo(category, containerInfo);
+    }
+    
+    public static void registerScreenWithHandlerInfo(Identifier category, ContainerInfo<? extends ScreenHandler> containerInfo) {
         if (!containerInfoMap.containsKey(category.toString()))
             containerInfoMap.put(category.toString(), Maps.newLinkedHashMap());
         containerInfoMap.get(category.toString()).put(containerInfo.getContainerClass(), containerInfo);
@@ -42,13 +49,13 @@ public class ContainerInfoHandler {
         return containerInfoMap.containsKey(category.toString()) && !containerInfoMap.get(category.toString()).isEmpty();
     }
     
-    public static ContainerInfo<? extends Container> getContainerInfo(Identifier category, Class<?> containerClass) {
+    public static ContainerInfo<? extends ScreenHandler> getContainerInfo(Identifier category, Class<?> containerClass) {
         if (!isCategoryHandled(category))
             return null;
-        Map<Class<? extends Container>, ContainerInfo<? extends Container>> infoMap = containerInfoMap.get(category.toString());
+        Map<Class<? extends ScreenHandler>, ContainerInfo<? extends ScreenHandler>> infoMap = containerInfoMap.get(category.toString());
         if (infoMap.containsKey(containerClass))
             return infoMap.get(containerClass);
-        for (Map.Entry<Class<? extends Container>, ContainerInfo<? extends Container>> entry : infoMap.entrySet())
+        for (Map.Entry<Class<? extends ScreenHandler>, ContainerInfo<? extends ScreenHandler>> entry : infoMap.entrySet())
             if (entry.getKey().isAssignableFrom(containerClass))
                 return entry.getValue();
         return null;

+ 24 - 25
src/main/java/me/shedaniel/rei/server/InputSlotCrafter.java

@@ -26,13 +26,13 @@ package me.shedaniel.rei.server;
 import com.google.common.collect.Lists;
 import it.unimi.dsi.fastutil.ints.IntArrayList;
 import it.unimi.dsi.fastutil.ints.IntList;
-import net.minecraft.container.Container;
-import net.minecraft.container.Slot;
 import net.minecraft.entity.player.PlayerInventory;
 import net.minecraft.inventory.Inventory;
 import net.minecraft.item.Item;
 import net.minecraft.item.ItemStack;
 import net.minecraft.recipe.Ingredient;
+import net.minecraft.screen.ScreenHandler;
+import net.minecraft.screen.slot.Slot;
 import net.minecraft.server.network.ServerPlayerEntity;
 import net.minecraft.util.DefaultedList;
 import net.minecraft.util.Identifier;
@@ -41,17 +41,17 @@ import java.util.*;
 
 public class InputSlotCrafter<C extends Inventory> implements RecipeGridAligner<Integer> {
     
-    protected Container craftingContainer;
+    protected ScreenHandler screenHandler;
     protected ContainerInfo containerInfo;
     protected PlayerInventory inventory;
     
-    private InputSlotCrafter(Container craftingContainer, ContainerInfo<? extends Container> containerInfo) {
-        this.craftingContainer = craftingContainer;
+    private InputSlotCrafter(ScreenHandler screenHandler, ContainerInfo<? extends ScreenHandler> containerInfo) {
+        this.screenHandler = screenHandler;
         this.containerInfo = containerInfo;
     }
     
-    public static <C extends Inventory> void start(Identifier category, Container craftingContainer_1, ServerPlayerEntity player, Map<Integer, List<ItemStack>> map, boolean hasShift) {
-        ContainerInfo<? extends Container> containerInfo = Objects.requireNonNull(ContainerInfoHandler.getContainerInfo(category, craftingContainer_1.getClass()), "Container Info does not exist on the server!");
+    public static <C extends Inventory> void start(Identifier category, ScreenHandler craftingContainer_1, ServerPlayerEntity player, Map<Integer, List<ItemStack>> map, boolean hasShift) {
+        ContainerInfo<? extends ScreenHandler> containerInfo = Objects.requireNonNull(ContainerInfoHandler.getContainerInfo(category, craftingContainer_1.getClass()), "Container Info does not exist on the server!");
         new InputSlotCrafter<C>(craftingContainer_1, containerInfo).fillInputSlots(player, map, hasShift);
     }
     
@@ -66,7 +66,7 @@ public class InputSlotCrafter<C extends Inventory> implements RecipeGridAligner<
             for (ItemStack stack : player.inventory.main) {
                 recipeFinder.addNormalItem(stack);
             }
-            this.containerInfo.populateRecipeFinder(craftingContainer, recipeFinder);
+            this.containerInfo.populateRecipeFinder(screenHandler, recipeFinder);
             DefaultedList<Ingredient> ingredients = DefaultedList.of();
             map.entrySet().stream().sorted(Comparator.comparingInt(Map.Entry::getKey)).forEach(entry -> {
                 ingredients.add(Ingredient.ofItems(entry.getValue().stream().map(ItemStack::getItem).toArray(Item[]::new)));
@@ -85,7 +85,7 @@ public class InputSlotCrafter<C extends Inventory> implements RecipeGridAligner<
     
     @Override
     public void acceptAlignedInput(Iterator<Integer> iterator_1, int int_1, int int_2, int int_3, int int_4) {
-        Slot slot_1 = this.craftingContainer.getSlot(int_1);
+        Slot slot_1 = this.screenHandler.getSlot(int_1);
         ItemStack itemStack_1 = RecipeFinder.getStackFromId(iterator_1.next());
         if (!itemStack_1.isEmpty()) {
             for (int int_5 = 0; int_5 < int_2; ++int_5) {
@@ -116,16 +116,15 @@ public class InputSlotCrafter<C extends Inventory> implements RecipeGridAligner<
         }
     }
     
-    @SuppressWarnings("deprecation")
     protected void fillInputSlots(RecipeFinder recipeFinder, DefaultedList<Ingredient> ingredients, boolean hasShift) {
         //        boolean boolean_2 = this.craftingContainer.matches(recipe_1);
         boolean boolean_2 = false;
         int int_1 = recipeFinder.countRecipeCrafts(ingredients, null);
         int int_2;
         if (boolean_2) {
-            for (int_2 = 0; int_2 < this.containerInfo.getCraftingHeight(craftingContainer) * this.containerInfo.getCraftingWidth(craftingContainer) + 1; ++int_2) {
-                if (int_2 != this.containerInfo.getCraftingResultSlotIndex(craftingContainer)) {
-                    ItemStack itemStack_1 = this.craftingContainer.getSlot(int_2).getStack();
+            for (int_2 = 0; int_2 < this.containerInfo.getCraftingHeight(screenHandler) * this.containerInfo.getCraftingWidth(screenHandler) + 1; ++int_2) {
+                if (int_2 != this.containerInfo.getCraftingResultSlotIndex(screenHandler)) {
+                    ItemStack itemStack_1 = this.screenHandler.getSlot(int_2).getStack();
                     if (!itemStack_1.isEmpty() && Math.min(int_1, itemStack_1.getMaxCount()) < itemStack_1.getCount() + 1) {
                         return;
                     }
@@ -147,7 +146,7 @@ public class InputSlotCrafter<C extends Inventory> implements RecipeGridAligner<
             
             if (recipeFinder.findRecipe(ingredients, intList_1, int_4)) {
                 this.returnInputs();
-                this.alignRecipeToGrid(this.containerInfo.getCraftingWidth(craftingContainer), this.containerInfo.getCraftingHeight(craftingContainer), this.containerInfo.getCraftingResultSlotIndex(craftingContainer), ingredients, intList_1.iterator(), int_4);
+                this.alignRecipeToGrid(this.containerInfo.getCraftingWidth(screenHandler), this.containerInfo.getCraftingHeight(screenHandler), this.containerInfo.getCraftingResultSlotIndex(screenHandler), ingredients, intList_1.iterator(), int_4);
             }
         }
         
@@ -159,9 +158,9 @@ public class InputSlotCrafter<C extends Inventory> implements RecipeGridAligner<
             int_2 = int_1;
         } else if (boolean_2) {
             int_2 = 64;
-            for (int int_3 = 0; int_3 < this.containerInfo.getCraftingWidth(craftingContainer) * this.containerInfo.getCraftingHeight(craftingContainer) + 1; ++int_3) {
-                if (int_3 != this.containerInfo.getCraftingResultSlotIndex(craftingContainer)) {
-                    ItemStack itemStack_1 = this.craftingContainer.getSlot(int_3).getStack();
+            for (int int_3 = 0; int_3 < this.containerInfo.getCraftingWidth(screenHandler) * this.containerInfo.getCraftingHeight(screenHandler) + 1; ++int_3) {
+                if (int_3 != this.containerInfo.getCraftingResultSlotIndex(screenHandler)) {
+                    ItemStack itemStack_1 = this.screenHandler.getSlot(int_3).getStack();
                     if (!itemStack_1.isEmpty() && int_2 > itemStack_1.getCount()) {
                         int_2 = itemStack_1.getCount();
                     }
@@ -175,19 +174,19 @@ public class InputSlotCrafter<C extends Inventory> implements RecipeGridAligner<
     }
     
     protected void returnInputs() {
-        for (int int_1 = 0; int_1 < this.containerInfo.getCraftingWidth(craftingContainer) * this.containerInfo.getCraftingHeight(craftingContainer) + 1; ++int_1) {
-            if (int_1 != this.containerInfo.getCraftingResultSlotIndex(craftingContainer)) {
+        for (int int_1 = 0; int_1 < this.containerInfo.getCraftingWidth(screenHandler) * this.containerInfo.getCraftingHeight(screenHandler) + 1; ++int_1) {
+            if (int_1 != this.containerInfo.getCraftingResultSlotIndex(screenHandler)) {
                 this.returnSlot(int_1);
             }
         }
         
-        this.containerInfo.clearCraftingSlots(craftingContainer);
+        this.containerInfo.clearCraftingSlots(screenHandler);
     }
     
     protected void returnSlot(int int_1) {
-        ItemStack itemStack_1 = this.craftingContainer.getSlot(int_1).getStack();
+        ItemStack itemStack_1 = this.screenHandler.getSlot(int_1).getStack();
         if (!itemStack_1.isEmpty()) {
-            for (; itemStack_1.getCount() > 0; this.craftingContainer.getSlot(int_1).takeStack(1)) {
+            for (; itemStack_1.getCount() > 0; this.screenHandler.getSlot(int_1).takeStack(1)) {
                 int int_2 = this.inventory.getOccupiedSlotWithRoomForStack(itemStack_1);
                 if (int_2 == -1) {
                     int_2 = this.inventory.getEmptySlot();
@@ -206,9 +205,9 @@ public class InputSlotCrafter<C extends Inventory> implements RecipeGridAligner<
         List<ItemStack> list_1 = Lists.newArrayList();
         int int_1 = this.getFreeInventorySlots();
         
-        for (int int_2 = 0; int_2 < this.containerInfo.getCraftingWidth(craftingContainer) * this.containerInfo.getCraftingHeight(craftingContainer) + 1; ++int_2) {
-            if (int_2 != this.containerInfo.getCraftingResultSlotIndex(craftingContainer)) {
-                ItemStack itemStack_1 = this.craftingContainer.getSlot(int_2).getStack().copy();
+        for (int int_2 = 0; int_2 < this.containerInfo.getCraftingWidth(screenHandler) * this.containerInfo.getCraftingHeight(screenHandler) + 1; ++int_2) {
+            if (int_2 != this.containerInfo.getCraftingResultSlotIndex(screenHandler)) {
+                ItemStack itemStack_1 = this.screenHandler.getSlot(int_2).getStack().copy();
                 if (!itemStack_1.isEmpty()) {
                     int int_3 = this.inventory.getOccupiedSlotWithRoomForStack(itemStack_1);
                     if (int_3 == -1 && list_1.size() <= int_1) {