Browse Source

Build 111, updated to 1.14.1, discontinuing 1.14 support

Unknown 6 years ago
parent
commit
a1990a8f00
31 changed files with 129 additions and 116 deletions
  1. 3 0
      CHANGELOG.md
  2. 5 7
      build.gradle
  3. 7 8
      gradle.properties
  4. 2 1
      src/main/java/me/shedaniel/rei/REIModMenuEntryPoint.java
  5. 15 15
      src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java
  6. 1 1
      src/main/java/me/shedaniel/rei/api/BaseBoundsHandler.java
  7. 1 1
      src/main/java/me/shedaniel/rei/api/ConfigManager.java
  8. 1 1
      src/main/java/me/shedaniel/rei/api/REIPlugin.java
  9. 1 1
      src/main/java/me/shedaniel/rei/api/SpeedCraftFunctional.java
  10. 1 1
      src/main/java/me/shedaniel/rei/client/BaseBoundsHandlerImpl.java
  11. 2 2
      src/main/java/me/shedaniel/rei/client/ClientHelperImpl.java
  12. 1 1
      src/main/java/me/shedaniel/rei/client/ConfigManagerImpl.java
  13. 6 6
      src/main/java/me/shedaniel/rei/client/ScreenHelper.java
  14. 8 4
      src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java
  15. 1 1
      src/main/java/me/shedaniel/rei/gui/PreRecipeViewingScreen.java
  16. 32 11
      src/main/java/me/shedaniel/rei/gui/RecipeViewingScreen.java
  17. 2 2
      src/main/java/me/shedaniel/rei/gui/VillagerRecipeViewingScreen.java
  18. 1 1
      src/main/java/me/shedaniel/rei/gui/credits/CreditsEntryListWidget.java
  19. 4 4
      src/main/java/me/shedaniel/rei/gui/credits/CreditsScreen.java
  20. 1 1
      src/main/java/me/shedaniel/rei/gui/widget/TextFieldWidget.java
  21. 2 2
      src/main/java/me/shedaniel/rei/listeners/ContainerScreenHooks.java
  22. 2 2
      src/main/java/me/shedaniel/rei/listeners/CreativePlayerInventoryScreenHooks.java
  23. 5 5
      src/main/java/me/shedaniel/rei/listeners/RecipeBookGuiHooks.java
  24. 1 1
      src/main/java/me/shedaniel/rei/plugin/DefaultBlastingDisplay.java
  25. 1 1
      src/main/java/me/shedaniel/rei/plugin/DefaultCampfireDisplay.java
  26. 18 31
      src/main/java/me/shedaniel/rei/plugin/DefaultPlugin.java
  27. 1 1
      src/main/java/me/shedaniel/rei/plugin/DefaultShapedDisplay.java
  28. 1 1
      src/main/java/me/shedaniel/rei/plugin/DefaultShapelessDisplay.java
  29. 1 1
      src/main/java/me/shedaniel/rei/plugin/DefaultSmeltingDisplay.java
  30. 1 1
      src/main/java/me/shedaniel/rei/plugin/DefaultSmokingDisplay.java
  31. 1 1
      src/main/java/me/shedaniel/rei/utils/ClothScreenRegistry.java

+ 3 - 0
CHANGELOG.md

@@ -1,4 +1,7 @@
 View full changelog [here](https://github.com/shedaniel/RoughlyEnoughItems/blob/1.14/CHANGELOG.md).
+## v2.9+build.111
+- Added: Buttons to switch category page in original recipe viewing screen
+- Updated: Mappings to 1.14.1
 ## v2.9+build.110
 - Fixed: Build 109 Crash
 - Fixed: Next Page / Previous Page crash in villager recipe mode

+ 5 - 7
build.gradle

@@ -50,7 +50,6 @@ dependencies {
     minecraft "com.mojang:minecraft:${project.minecraft_version}"
     mappings "net.fabricmc:yarn:${project.yarn_version}"
     modCompile "net.fabricmc:fabric-loader:${project.fabricloader_version}"
-//    modCompile "net.fabricmc:fabric:${project.fabric_version}"
     modCompile "net.fabricmc.fabric-api:fabric-keybindings-v0:${project.fabric_keybindings}"
     modCompile "net.fabricmc.fabric-api:fabric-api-base:${project.fabric_api_base}"
     modCompile "net.fabricmc.fabric-api:fabric-networking-v0:${project.fabric_networking}"
@@ -59,12 +58,11 @@ dependencies {
     modCompile "cloth:ClothEvents:${cloth_events_version}"
     modCompile "cloth-config:ClothConfig:${cloth_config_version}"
     if (includeDep) {
-        include "net.fabricmc:fabric:${project.fabric_version}"
-//        include "net.fabricmc.fabric-api:fabric-keybindings-v0:${project.fabric_keybindings}"
-//        include "net.fabricmc.fabric-api:fabric-api-base:${project.fabric_api_base}"
-//        include "net.fabricmc.fabric-api:fabric-networking-v0:${project.fabric_networking}"
-//        include "net.fabricmc.fabric-api:fabric-events-lifecycle-v0:${project.fabric_events_lifecycle}"
-//        include "net.fabricmc.fabric-api:fabric-resource-loader-v0:${project.fabric_resource_loader}"
+        include "net.fabricmc.fabric-api:fabric-keybindings-v0:${project.fabric_keybindings}"
+        include "net.fabricmc.fabric-api:fabric-api-base:${project.fabric_api_base}"
+        include "net.fabricmc.fabric-api:fabric-networking-v0:${project.fabric_networking}"
+        include "net.fabricmc.fabric-api:fabric-events-lifecycle-v0:${project.fabric_events_lifecycle}"
+        include "net.fabricmc.fabric-api:fabric-resource-loader-v0:${project.fabric_resource_loader}"
         include "cloth:ClothEvents:${cloth_events_version}"
         include "cloth-config:ClothConfig:${cloth_config_version}"
     }

+ 7 - 8
gradle.properties

@@ -1,15 +1,14 @@
-mod_version=2.9+build.110
-minecraft_version=1.14
-yarn_version=1.14+build.21
-fabricloader_version=0.4.6+build.141
+mod_version=2.9+build.111
+minecraft_version=1.14.1
+yarn_version=1.14.1+build.10
+fabricloader_version=0.4.7+build.147
 jankson_version=1.1.0
 cloth_events_version=0.3.1.23
 cloth_config_version=0.2.1.14
-modmenu_version=1.4.0-71
-fabric_version=0.2.7+build.127
+modmenu_version=1.5.4-85
 
 fabric_keybindings=0.1.0+f1618918
-fabric_networking=0.1.0+f1618918
+fabric_networking=0.1.1+945f265f
 fabric_events_lifecycle=0.1.0+9232ac87
-fabric_resource_loader=0.1.0+f1618918
+fabric_resource_loader=0.1.1+eff4f58d
 fabric_api_base=0.1.0+f1618918

+ 2 - 1
src/main/java/me/shedaniel/rei/REIModMenuEntryPoint.java

@@ -6,7 +6,7 @@
 package me.shedaniel.rei;
 
 import io.github.prospector.modmenu.api.ModMenuApi;
-import net.minecraft.client.gui.Screen;
+import net.minecraft.client.gui.screen.Screen;
 
 import java.util.Optional;
 import java.util.function.Supplier;
@@ -18,6 +18,7 @@ public class REIModMenuEntryPoint implements ModMenuApi {
         return "roughlyenoughitems";
     }
     
+    @SuppressWarnings("deprecation")
     @Override
     public Optional<Supplier<Screen>> getConfigScreen(Screen screen) {
         return Optional.of(() -> getScreen(screen));

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

@@ -21,11 +21,11 @@ import net.fabricmc.loader.api.FabricLoader;
 import net.fabricmc.loader.api.ModContainer;
 import net.fabricmc.loader.api.metadata.ModMetadata;
 import net.minecraft.client.MinecraftClient;
-import net.minecraft.client.gui.ContainerScreen;
 import net.minecraft.client.gui.Element;
-import net.minecraft.client.gui.ingame.CreativePlayerInventoryScreen;
-import net.minecraft.client.gui.ingame.PlayerInventoryScreen;
-import net.minecraft.client.gui.recipebook.RecipeBookGui;
+import net.minecraft.client.gui.screen.ingame.AbstractContainerScreen;
+import net.minecraft.client.gui.screen.ingame.CreativeInventoryScreen;
+import net.minecraft.client.gui.screen.ingame.InventoryScreen;
+import net.minecraft.client.gui.screen.recipebook.RecipeBookScreen;
 import net.minecraft.client.gui.widget.RecipeBookButtonWidget;
 import net.minecraft.client.gui.widget.TextFieldWidget;
 import net.minecraft.util.ActionResult;
@@ -190,15 +190,15 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer {
             ((RecipeHelperImpl) RoughlyEnoughItemsCore.getRecipeHelper()).recipesLoaded(recipeManager);
         });
         ClothClientHooks.SCREEN_ADD_BUTTON.register((minecraftClient, screen, abstractButtonWidget) -> {
-            if (RoughlyEnoughItemsCore.getConfigManager().getConfig().disableRecipeBook && screen instanceof ContainerScreen && abstractButtonWidget instanceof RecipeBookButtonWidget)
+            if (RoughlyEnoughItemsCore.getConfigManager().getConfig().disableRecipeBook && screen instanceof AbstractContainerScreen && abstractButtonWidget instanceof RecipeBookButtonWidget)
                 return ActionResult.FAIL;
             return ActionResult.PASS;
         });
         ClothClientHooks.SCREEN_INIT_POST.register((minecraftClient, screen, screenHooks) -> {
-            if (screen instanceof ContainerScreen) {
-                if (screen instanceof PlayerInventoryScreen && minecraftClient.interactionManager.hasCreativeInventory())
+            if (screen instanceof AbstractContainerScreen) {
+                if (screen instanceof InventoryScreen && minecraftClient.interactionManager.hasCreativeInventory())
                     return;
-                ScreenHelper.setLastContainerScreen((ContainerScreen) screen);
+                ScreenHelper.setLastContainerScreen((AbstractContainerScreen) screen);
                 boolean alreadyAdded = false;
                 for(Element element : Lists.newArrayList(screenHooks.cloth_getInputListeners()))
                     if (ContainerScreenOverlay.class.isAssignableFrom(element.getClass()))
@@ -211,11 +211,11 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer {
             }
         });
         ClothClientHooks.SCREEN_RENDER_POST.register((minecraftClient, screen, i, i1, v) -> {
-            if (screen instanceof ContainerScreen)
+            if (screen instanceof AbstractContainerScreen)
                 ScreenHelper.getLastOverlay().render(i, i1, v);
         });
         ClothClientHooks.SCREEN_MOUSE_CLICKED.register((minecraftClient, screen, v, v1, i) -> {
-            if (screen instanceof CreativePlayerInventoryScreen)
+            if (screen instanceof CreativeInventoryScreen)
                 if (ScreenHelper.isOverlayVisible() && ScreenHelper.getLastOverlay().mouseClicked(v, v1, i)) {
                     screen.setFocused(ScreenHelper.getLastOverlay());
                     if (i == 0)
@@ -225,13 +225,13 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer {
             return ActionResult.PASS;
         });
         ClothClientHooks.SCREEN_MOUSE_SCROLLED.register((minecraftClient, screen, v, v1, v2) -> {
-            if (screen instanceof ContainerScreen)
+            if (screen instanceof AbstractContainerScreen)
                 if (ScreenHelper.isOverlayVisible() && ScreenHelper.getLastOverlay().isInside(ClientUtils.getMouseLocation()) && ScreenHelper.getLastOverlay().mouseScrolled(v, v1, v2))
                     return ActionResult.SUCCESS;
             return ActionResult.PASS;
         });
         ClothClientHooks.SCREEN_CHAR_TYPED.register((minecraftClient, screen, character, keyCode) -> {
-            if (screen instanceof ContainerScreen)
+            if (screen instanceof AbstractContainerScreen)
                 if (ScreenHelper.getLastOverlay().charTyped(character, keyCode))
                     return ActionResult.SUCCESS;
             return ActionResult.PASS;
@@ -239,13 +239,13 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer {
         ClothClientHooks.SCREEN_LATE_RENDER.register((minecraftClient, screen, i, i1, v) -> {
             if (!ScreenHelper.isOverlayVisible())
                 return;
-            if (screen instanceof ContainerScreen)
+            if (screen instanceof AbstractContainerScreen)
                 ScreenHelper.getLastOverlay().lateRender(i, i1, v);
         });
         ClothClientHooks.SCREEN_KEY_PRESSED.register((minecraftClient, screen, i, i1, i2) -> {
-            if (screen.getFocused() != null && screen.getFocused() instanceof TextFieldWidget || (screen.getFocused() instanceof RecipeBookGui && ((RecipeBookGuiHooks) screen.getFocused()).rei_getSearchField() != null && ((RecipeBookGuiHooks) screen.getFocused()).rei_getSearchField().isFocused()))
+            if (screen.getFocused() != null && screen.getFocused() instanceof TextFieldWidget || (screen.getFocused() instanceof RecipeBookScreen && ((RecipeBookGuiHooks) screen.getFocused()).rei_getSearchField() != null && ((RecipeBookGuiHooks) screen.getFocused()).rei_getSearchField().isFocused()))
                 return ActionResult.PASS;
-            if (screen instanceof ContainerScreen)
+            if (screen instanceof AbstractContainerScreen)
                 if (ScreenHelper.getLastOverlay().keyPressed(i, i1, i2))
                     return ActionResult.SUCCESS;
             return ActionResult.PASS;

+ 1 - 1
src/main/java/me/shedaniel/rei/api/BaseBoundsHandler.java

@@ -5,7 +5,7 @@
 
 package me.shedaniel.rei.api;
 
-import net.minecraft.client.gui.Screen;
+import net.minecraft.client.gui.screen.Screen;
 
 import java.awt.*;
 import java.util.List;

+ 1 - 1
src/main/java/me/shedaniel/rei/api/ConfigManager.java

@@ -6,7 +6,7 @@
 package me.shedaniel.rei.api;
 
 import me.shedaniel.rei.client.ConfigObject;
-import net.minecraft.client.gui.Screen;
+import net.minecraft.client.gui.screen.Screen;
 
 import java.io.IOException;
 

+ 1 - 1
src/main/java/me/shedaniel/rei/api/REIPlugin.java

@@ -16,6 +16,6 @@ import net.minecraft.util.Identifier;
 public interface REIPlugin extends REIPluginEntry {
     @Override
     default Identifier getPluginIdentifier() {
-        return RoughlyEnoughItemsCore.getPluginIdentifier(this).orElse(Identifier.create("null"));
+        return RoughlyEnoughItemsCore.getPluginIdentifier(this).orElse(Identifier.ofNullable("null"));
     }
 }

+ 1 - 1
src/main/java/me/shedaniel/rei/api/SpeedCraftFunctional.java

@@ -5,7 +5,7 @@
 
 package me.shedaniel.rei.api;
 
-import net.minecraft.client.gui.Screen;
+import net.minecraft.client.gui.screen.Screen;
 
 public interface SpeedCraftFunctional<T extends RecipeDisplay> {
     

+ 1 - 1
src/main/java/me/shedaniel/rei/client/BaseBoundsHandlerImpl.java

@@ -10,7 +10,7 @@ import me.shedaniel.rei.RoughlyEnoughItemsCore;
 import me.shedaniel.rei.api.BaseBoundsHandler;
 import me.shedaniel.rei.api.DisplayHelper;
 import net.minecraft.client.MinecraftClient;
-import net.minecraft.client.gui.Screen;
+import net.minecraft.client.gui.screen.Screen;
 import net.minecraft.util.ActionResult;
 import net.minecraft.util.Pair;
 

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

@@ -25,7 +25,7 @@ import net.fabricmc.loader.api.FabricLoader;
 import net.fabricmc.loader.api.ModContainer;
 import net.fabricmc.loader.api.metadata.ModMetadata;
 import net.minecraft.client.MinecraftClient;
-import net.minecraft.client.gui.ingame.CreativePlayerInventoryScreen;
+import net.minecraft.client.gui.screen.ingame.CreativeInventoryScreen;
 import net.minecraft.client.util.InputUtil;
 import net.minecraft.item.Item;
 import net.minecraft.item.ItemStack;
@@ -131,7 +131,7 @@ public class ClientHelperImpl implements ClientHelper, ClientModInitializer {
     
     @Override
     public void sendDeletePacket() {
-        if (ScreenHelper.getLastContainerScreen() instanceof CreativePlayerInventoryScreen) {
+        if (ScreenHelper.getLastContainerScreen() instanceof CreativeInventoryScreen) {
             MinecraftClient.getInstance().player.inventory.setCursorStack(ItemStack.EMPTY);
             return;
         }

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

@@ -13,7 +13,7 @@ import me.shedaniel.rei.RoughlyEnoughItemsCore;
 import me.shedaniel.rei.api.ConfigManager;
 import net.fabricmc.loader.api.FabricLoader;
 import net.minecraft.client.MinecraftClient;
-import net.minecraft.client.gui.Screen;
+import net.minecraft.client.gui.screen.Screen;
 import net.minecraft.client.resource.language.I18n;
 import net.minecraft.network.chat.TextComponent;
 

+ 6 - 6
src/main/java/me/shedaniel/rei/client/ScreenHelper.java

@@ -12,7 +12,7 @@ import me.shedaniel.rei.listeners.ContainerScreenHooks;
 import net.fabricmc.api.ClientModInitializer;
 import net.fabricmc.fabric.api.event.client.ClientTickCallback;
 import net.minecraft.client.MinecraftClient;
-import net.minecraft.client.gui.ContainerScreen;
+import net.minecraft.client.gui.screen.ingame.AbstractContainerScreen;
 import net.minecraft.client.util.Window;
 import net.minecraft.item.ItemStack;
 import org.apache.logging.log4j.util.TriConsumer;
@@ -26,7 +26,7 @@ public class ScreenHelper implements ClientModInitializer {
     public static List<ItemStack> inventoryStacks = Lists.newArrayList();
     private static boolean overlayVisible = true;
     private static ContainerScreenOverlay overlay;
-    private static ContainerScreen lastContainerScreen = null;
+    private static AbstractContainerScreen lastContainerScreen = null;
     
     public static boolean isOverlayVisible() {
         return overlayVisible;
@@ -48,11 +48,11 @@ public class ScreenHelper implements ClientModInitializer {
         return getLastOverlay(false, false);
     }
     
-    public static ContainerScreen getLastContainerScreen() {
+    public static AbstractContainerScreen getLastContainerScreen() {
         return lastContainerScreen;
     }
     
-    public static void setLastContainerScreen(ContainerScreen lastContainerScreen) {
+    public static void setLastContainerScreen(AbstractContainerScreen lastContainerScreen) {
         ScreenHelper.lastContainerScreen = lastContainerScreen;
     }
     
@@ -78,8 +78,8 @@ public class ScreenHelper implements ClientModInitializer {
     @Override
     public void onInitializeClient() {
         ClientTickCallback.EVENT.register(client -> {
-            if (lastContainerScreen != client.currentScreen && client.currentScreen instanceof ContainerScreen)
-                lastContainerScreen = (ContainerScreen) client.currentScreen;
+            if (lastContainerScreen != client.currentScreen && client.currentScreen instanceof AbstractContainerScreen)
+                lastContainerScreen = (AbstractContainerScreen) client.currentScreen;
         });
     }
     

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

@@ -17,7 +17,11 @@ import me.shedaniel.rei.gui.widget.*;
 import me.shedaniel.rei.listeners.ContainerScreenHooks;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.font.TextRenderer;
-import net.minecraft.client.gui.*;
+import net.minecraft.client.gui.AbstractParentElement;
+import net.minecraft.client.gui.Drawable;
+import net.minecraft.client.gui.Element;
+import net.minecraft.client.gui.screen.Screen;
+import net.minecraft.client.gui.screen.ingame.AbstractContainerScreen;
 import net.minecraft.client.render.GuiLighting;
 import net.minecraft.client.resource.language.I18n;
 import net.minecraft.client.sound.PositionedSoundInstance;
@@ -344,12 +348,12 @@ public class ContainerScreenOverlay extends AbstractParentElement implements Dra
             DisplayHelper.DisplayBoundsHandler boundsHandler = RoughlyEnoughItemsCore.getDisplayHelper().getResponsibleBoundsHandler(MinecraftClient.getInstance().currentScreen.getClass());
             itemListOverlay.updateList(boundsHandler, boundsHandler.getItemListArea(rectangle), page, searchTerm, true);
         }
-        if (MinecraftClient.getInstance().currentScreen instanceof ContainerScreen && SearchFieldWidget.isSearching) {
+        if (MinecraftClient.getInstance().currentScreen instanceof AbstractContainerScreen && SearchFieldWidget.isSearching) {
             GuiLighting.disable();
             blitOffset = 200;
             ContainerScreenHooks hooks = (ContainerScreenHooks) MinecraftClient.getInstance().currentScreen;
             int left = hooks.rei_getContainerLeft(), top = hooks.rei_getContainerTop();
-            for(Slot slot : ((ContainerScreen) MinecraftClient.getInstance().currentScreen).getContainer().slotList)
+            for(Slot slot : ((AbstractContainerScreen) MinecraftClient.getInstance().currentScreen).getContainer().slotList)
                 if (!slot.hasStack() || !itemListOverlay.filterItem(slot.getStack(), itemListOverlay.getLastSearchArgument()))
                     fillGradient(left + slot.xPosition, top + slot.yPosition, left + slot.xPosition + 16, top + slot.yPosition + 16, -601874400, -601874400);
             blitOffset = 0;
@@ -474,7 +478,7 @@ public class ContainerScreenOverlay extends AbstractParentElement implements Dra
         if (!ScreenHelper.isOverlayVisible())
             return false;
         ItemStack itemStack = null;
-        if (MinecraftClient.getInstance().currentScreen instanceof ContainerScreen)
+        if (MinecraftClient.getInstance().currentScreen instanceof AbstractContainerScreen)
             if (ScreenHelper.getLastContainerScreenHooks().rei_getHoveredSlot() != null && !ScreenHelper.getLastContainerScreenHooks().rei_getHoveredSlot().getStack().isEmpty())
                 itemStack = ScreenHelper.getLastContainerScreenHooks().rei_getHoveredSlot().getStack();
         if (itemStack != null && !itemStack.isEmpty()) {

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

@@ -17,7 +17,7 @@ import me.shedaniel.rei.gui.widget.HighlightableWidget;
 import me.shedaniel.rei.gui.widget.Widget;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.gui.Element;
-import net.minecraft.client.gui.Screen;
+import net.minecraft.client.gui.screen.Screen;
 import net.minecraft.client.render.GuiLighting;
 import net.minecraft.client.resource.language.I18n;
 import net.minecraft.client.sound.PositionedSoundInstance;

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

@@ -13,9 +13,9 @@ import me.shedaniel.rei.api.*;
 import me.shedaniel.rei.client.ScreenHelper;
 import me.shedaniel.rei.gui.widget.*;
 import net.minecraft.client.MinecraftClient;
-import net.minecraft.client.gui.ContainerScreen;
 import net.minecraft.client.gui.Element;
-import net.minecraft.client.gui.Screen;
+import net.minecraft.client.gui.screen.Screen;
+import net.minecraft.client.gui.screen.ingame.AbstractContainerScreen;
 import net.minecraft.client.render.GuiLighting;
 import net.minecraft.client.resource.language.I18n;
 import net.minecraft.client.sound.PositionedSoundInstance;
@@ -37,6 +37,7 @@ public class RecipeViewingScreen extends Screen {
     
     public static final Identifier CHEST_GUI_TEXTURE = new Identifier("roughlyenoughitems", "textures/gui/recipecontainer.png");
     public static final Color SUB_COLOR = new Color(159, 159, 159);
+    private static final int TABS_PER_PAGE = 5;
     private final List<Widget> widgets;
     private final List<TabWidget> tabs;
     private final Map<RecipeCategory, List<RecipeDisplay>> categoriesMap;
@@ -68,7 +69,7 @@ public class RecipeViewingScreen extends Screen {
         this.choosePageActivated = false;
     }
     
-    public static SpeedCraftFunctional getSpeedCraftFunctionalByCategory(ContainerScreen containerScreen, RecipeCategory category) {
+    public static SpeedCraftFunctional getSpeedCraftFunctionalByCategory(AbstractContainerScreen containerScreen, RecipeCategory category) {
         for(SpeedCraftFunctional functional : RecipeHelper.getInstance().getSpeedCraftFunctional(category))
             for(Class aClass : functional.getFunctioningFor())
                 if (containerScreen.getClass().isAssignableFrom(aClass))
@@ -129,6 +130,26 @@ public class RecipeViewingScreen extends Screen {
         this.bounds = new Rectangle(width / 2 - guiWidth / 2, height / 2 - guiHeight / 2, guiWidth, guiHeight);
         this.page = MathHelper.clamp(page, 0, getTotalPages(selectedCategory) - 1);
         
+        ButtonWidget w, w2;
+        this.widgets.add(w = new ButtonWidget(bounds.x + 2, bounds.y - 16, 10, 10, new TranslatableComponent("text.rei.left_arrow")) {
+            @Override
+            public void onPressed() {
+                categoryPages--;
+                if (categoryPages < 0)
+                    categoryPages = MathHelper.ceil(categories.size() / (float) TABS_PER_PAGE) - 1;
+                RecipeViewingScreen.this.init();
+            }
+        });
+        this.widgets.add(w2 = new ButtonWidget(bounds.x + bounds.width - 12, bounds.y - 16, 10, 10, new TranslatableComponent("text.rei.right_arrow")) {
+            @Override
+            public void onPressed() {
+                categoryPages++;
+                if (categoryPages > MathHelper.ceil(categories.size() / (float) TABS_PER_PAGE) - 1)
+                    categoryPages = 0;
+                RecipeViewingScreen.this.init();
+            }
+        });
+        w.enabled = w2.enabled = categories.size() > TABS_PER_PAGE;
         widgets.add(categoryBack = new ButtonWidget((int) bounds.getX() + 5, (int) bounds.getY() + 5, 12, 12, new TranslatableComponent("text.rei.left_arrow")) {
             @Override
             public void onPressed() {
@@ -137,7 +158,7 @@ public class RecipeViewingScreen extends Screen {
                 if (currentCategoryIndex < 0)
                     currentCategoryIndex = categories.size() - 1;
                 selectedCategory = categories.get(currentCategoryIndex);
-                categoryPages = MathHelper.floor(currentCategoryIndex / 6d);
+                categoryPages = MathHelper.floor(currentCategoryIndex / (double) TABS_PER_PAGE);
                 page = 0;
                 RecipeViewingScreen.this.init();
             }
@@ -173,7 +194,7 @@ public class RecipeViewingScreen extends Screen {
                 if (currentCategoryIndex >= categories.size())
                     currentCategoryIndex = 0;
                 selectedCategory = categories.get(currentCategoryIndex);
-                categoryPages = MathHelper.floor(currentCategoryIndex / 6d);
+                categoryPages = MathHelper.floor(currentCategoryIndex / (double) TABS_PER_PAGE);
                 page = 0;
                 RecipeViewingScreen.this.init();
             }
@@ -234,18 +255,18 @@ public class RecipeViewingScreen extends Screen {
             }
         });
         recipeBack.enabled = recipeNext.enabled = categoriesMap.get(selectedCategory).size() > getRecipesPerPageByHeight();
-        for(int i = 0; i < 6; i++) {
-            int j = i + categoryPages * 6;
+        for(int i = 0; i < TABS_PER_PAGE; i++) {
+            int j = i + categoryPages * TABS_PER_PAGE;
             if (categories.size() > j) {
                 TabWidget tab;
-                tabs.add(tab = new TabWidget(i, new Rectangle(bounds.x + 4 + 28 * i, bounds.y - 28, 28, 28)) {
+                tabs.add(tab = new TabWidget(i, new Rectangle(bounds.x + bounds.width / 2 - Math.min(categories.size() - categoryPages * TABS_PER_PAGE, TABS_PER_PAGE) * 14 + i * 28, bounds.y - 28, 28, 28)) {
                     @Override
                     public boolean mouseClicked(double mouseX, double mouseY, int button) {
                         if (getBounds().contains(mouseX, mouseY)) {
                             MinecraftClient.getInstance().getSoundManager().play(PositionedSoundInstance.master(SoundEvents.UI_BUTTON_CLICK, 1.0F));
-                            if (getId() + categoryPages * 6 == categories.indexOf(selectedCategory))
+                            if (getId() + categoryPages * TABS_PER_PAGE == categories.indexOf(selectedCategory))
                                 return false;
-                            selectedCategory = categories.get(getId() + categoryPages * 6);
+                            selectedCategory = categories.get(getId() + categoryPages * TABS_PER_PAGE);
                             page = 0;
                             RecipeViewingScreen.this.init();
                             return true;
@@ -253,7 +274,7 @@ public class RecipeViewingScreen extends Screen {
                         return false;
                     }
                 });
-                tab.setRenderer(categories.get(j), categories.get(j).getIcon(), categories.get(j).getCategoryName(), tab.getId() + categoryPages * 6 == categories.indexOf(selectedCategory));
+                tab.setRenderer(categories.get(j), categories.get(j).getIcon(), categories.get(j).getCategoryName(), tab.getId() + categoryPages * TABS_PER_PAGE == categories.indexOf(selectedCategory));
             }
         }
         Optional<ButtonAreaSupplier> supplier = RecipeHelper.getInstance().getSpeedCraftButtonArea(selectedCategory);

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

@@ -16,7 +16,7 @@ import me.shedaniel.rei.gui.renderables.RecipeRenderer;
 import me.shedaniel.rei.gui.widget.*;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.gui.Element;
-import net.minecraft.client.gui.Screen;
+import net.minecraft.client.gui.screen.Screen;
 import net.minecraft.client.render.GuiLighting;
 import net.minecraft.client.resource.language.I18n;
 import net.minecraft.client.sound.PositionedSoundInstance;
@@ -276,7 +276,7 @@ public class VillagerRecipeViewingScreen extends Screen {
         }
         if (ClientHelper.getInstance().getNextPageKeyBinding().matchesKey(int_1, int_2)) {
             if (categoryMap.get(categories.get(selectedCategoryIndex)).size() > 1) {
-                selectedRecipeIndex ++;
+                selectedRecipeIndex++;
                 if (selectedRecipeIndex >= categoryMap.get(categories.get(selectedCategoryIndex)).size())
                     selectedRecipeIndex = 0;
                 init();

+ 1 - 1
src/main/java/me/shedaniel/rei/gui/credits/CreditsEntryListWidget.java

@@ -6,7 +6,7 @@
 package me.shedaniel.rei.gui.credits;
 
 import net.minecraft.client.MinecraftClient;
-import net.minecraft.client.gui.menu.AlwaysSelectedEntryListWidget;
+import net.minecraft.client.gui.widget.AlwaysSelectedEntryListWidget;
 import net.minecraft.network.chat.Component;
 
 public class CreditsEntryListWidget extends AlwaysSelectedEntryListWidget<CreditsEntryListWidget.CreditsItem> {

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

@@ -8,8 +8,8 @@ package me.shedaniel.rei.gui.credits;
 import me.shedaniel.rei.client.ScreenHelper;
 import me.shedaniel.rei.gui.credits.CreditsEntryListWidget.CreditsItem;
 import me.shedaniel.rei.gui.widget.ButtonWidget;
-import net.minecraft.client.gui.ContainerScreen;
-import net.minecraft.client.gui.Screen;
+import net.minecraft.client.gui.screen.Screen;
+import net.minecraft.client.gui.screen.ingame.AbstractContainerScreen;
 import net.minecraft.client.resource.language.I18n;
 import net.minecraft.network.chat.TextComponent;
 
@@ -28,7 +28,7 @@ public class CreditsScreen extends Screen {
     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)
+            if (parent instanceof AbstractContainerScreen)
                 ScreenHelper.getLastOverlay().init();
             return true;
         }
@@ -46,7 +46,7 @@ public class CreditsScreen extends Screen {
             @Override
             public void onPressed() {
                 CreditsScreen.this.minecraft.openScreen(parent);
-                if (parent instanceof ContainerScreen)
+                if (parent instanceof AbstractContainerScreen)
                     ScreenHelper.getLastOverlay().init();
             }
         });

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

@@ -8,7 +8,7 @@ package me.shedaniel.rei.gui.widget;
 import com.google.common.base.Predicates;
 import com.mojang.blaze3d.platform.GlStateManager;
 import net.minecraft.SharedConstants;
-import net.minecraft.client.gui.Screen;
+import net.minecraft.client.gui.screen.Screen;
 import net.minecraft.client.render.BufferBuilder;
 import net.minecraft.client.render.Tessellator;
 import net.minecraft.client.render.VertexFormats;

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

@@ -5,12 +5,12 @@
 
 package me.shedaniel.rei.listeners;
 
-import net.minecraft.client.gui.ContainerScreen;
+import net.minecraft.client.gui.screen.ingame.AbstractContainerScreen;
 import net.minecraft.container.Slot;
 import org.spongepowered.asm.mixin.Mixin;
 import org.spongepowered.asm.mixin.gen.Accessor;
 
-@Mixin(ContainerScreen.class)
+@Mixin(AbstractContainerScreen.class)
 public interface ContainerScreenHooks {
     
     @Accessor("left")

+ 2 - 2
src/main/java/me/shedaniel/rei/listeners/CreativePlayerInventoryScreenHooks.java

@@ -5,11 +5,11 @@
 
 package me.shedaniel.rei.listeners;
 
-import net.minecraft.client.gui.ingame.CreativePlayerInventoryScreen;
+import net.minecraft.client.gui.screen.ingame.CreativeInventoryScreen;
 import org.spongepowered.asm.mixin.Mixin;
 import org.spongepowered.asm.mixin.gen.Accessor;
 
-@Mixin(CreativePlayerInventoryScreen.class)
+@Mixin(CreativeInventoryScreen.class)
 public interface CreativePlayerInventoryScreenHooks {
     @Accessor("selectedTab")
     int rei_getSelectedTab();

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

@@ -5,16 +5,16 @@
 
 package me.shedaniel.rei.listeners;
 
-import net.minecraft.client.gui.recipebook.GroupButtonWidget;
-import net.minecraft.client.gui.recipebook.RecipeBookGui;
-import net.minecraft.client.gui.widget.RecipeBookGhostSlots;
+import net.minecraft.client.gui.screen.recipebook.RecipeBookGhostSlots;
+import net.minecraft.client.gui.screen.recipebook.RecipeBookScreen;
+import net.minecraft.client.gui.screen.recipebook.RecipeGroupButtonWidget;
 import net.minecraft.client.gui.widget.TextFieldWidget;
 import org.spongepowered.asm.mixin.Mixin;
 import org.spongepowered.asm.mixin.gen.Accessor;
 
 import java.util.List;
 
-@Mixin(RecipeBookGui.class)
+@Mixin(RecipeBookScreen.class)
 public interface RecipeBookGuiHooks {
     
     @Accessor("ghostSlots")
@@ -24,6 +24,6 @@ public interface RecipeBookGuiHooks {
     TextFieldWidget rei_getSearchField();
     
     @Accessor("tabButtons")
-    List<GroupButtonWidget> rei_getTabButtons();
+    List<RecipeGroupButtonWidget> rei_getTabButtons();
     
 }

+ 1 - 1
src/main/java/me/shedaniel/rei/plugin/DefaultBlastingDisplay.java

@@ -10,7 +10,7 @@ import me.shedaniel.rei.api.RecipeDisplay;
 import net.minecraft.block.entity.FurnaceBlockEntity;
 import net.minecraft.item.Item;
 import net.minecraft.item.ItemStack;
-import net.minecraft.recipe.cooking.BlastingRecipe;
+import net.minecraft.recipe.BlastingRecipe;
 import net.minecraft.util.Identifier;
 
 import java.util.Collections;

+ 1 - 1
src/main/java/me/shedaniel/rei/plugin/DefaultCampfireDisplay.java

@@ -8,8 +8,8 @@ package me.shedaniel.rei.plugin;
 import com.google.common.collect.Lists;
 import me.shedaniel.rei.api.RecipeDisplay;
 import net.minecraft.item.ItemStack;
+import net.minecraft.recipe.CampfireCookingRecipe;
 import net.minecraft.recipe.Ingredient;
-import net.minecraft.recipe.cooking.CampfireCookingRecipe;
 import net.minecraft.util.DefaultedList;
 import net.minecraft.util.Identifier;
 

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

@@ -14,15 +14,9 @@ import me.shedaniel.rei.gui.VillagerRecipeViewingScreen;
 import me.shedaniel.rei.listeners.ContainerScreenHooks;
 import me.shedaniel.rei.listeners.RecipeBookGuiHooks;
 import net.minecraft.client.MinecraftClient;
-import net.minecraft.client.gui.ContainerScreen;
-import net.minecraft.client.gui.Screen;
-import net.minecraft.client.gui.container.BlastFurnaceScreen;
-import net.minecraft.client.gui.container.CraftingTableScreen;
-import net.minecraft.client.gui.container.FurnaceScreen;
-import net.minecraft.client.gui.container.SmokerScreen;
-import net.minecraft.client.gui.ingame.CreativePlayerInventoryScreen;
-import net.minecraft.client.gui.ingame.PlayerInventoryScreen;
-import net.minecraft.client.gui.ingame.RecipeBookProvider;
+import net.minecraft.client.gui.screen.Screen;
+import net.minecraft.client.gui.screen.ingame.*;
+import net.minecraft.client.gui.screen.recipebook.RecipeBookProvider;
 import net.minecraft.client.recipe.book.ClientRecipeBook;
 import net.minecraft.container.CraftingContainer;
 import net.minecraft.enchantment.Enchantment;
@@ -30,20 +24,13 @@ import net.minecraft.enchantment.EnchantmentHelper;
 import net.minecraft.item.ItemStack;
 import net.minecraft.item.Items;
 import net.minecraft.potion.PotionUtil;
-import net.minecraft.recipe.Recipe;
-import net.minecraft.recipe.StonecuttingRecipe;
-import net.minecraft.recipe.cooking.BlastingRecipe;
-import net.minecraft.recipe.cooking.CampfireCookingRecipe;
-import net.minecraft.recipe.cooking.SmeltingRecipe;
-import net.minecraft.recipe.cooking.SmokingRecipe;
-import net.minecraft.recipe.crafting.ShapedRecipe;
-import net.minecraft.recipe.crafting.ShapelessRecipe;
+import net.minecraft.recipe.*;
 import net.minecraft.util.Identifier;
 import net.minecraft.util.registry.Registry;
 
 import java.awt.*;
-import java.util.*;
 import java.util.List;
+import java.util.*;
 
 public class DefaultPlugin implements REIPluginEntry {
     
@@ -144,7 +131,7 @@ public class DefaultPlugin implements REIPluginEntry {
     
     @Override
     public void registerBounds(DisplayHelper displayHelper) {
-        displayHelper.getBaseBoundsHandler().registerExclusionZones(ContainerScreen.class, isOnRightSide -> {
+        displayHelper.getBaseBoundsHandler().registerExclusionZones(AbstractContainerScreen.class, isOnRightSide -> {
             if (isOnRightSide || !MinecraftClient.getInstance().player.getRecipeBook().isGuiOpen() || !(MinecraftClient.getInstance().currentScreen instanceof RecipeBookProvider) || !(ScreenHelper.getLastContainerScreen().getContainer() instanceof CraftingContainer))
                 return Collections.emptyList();
             ContainerScreenHooks screenHooks = ScreenHelper.getLastContainerScreenHooks();
@@ -154,19 +141,19 @@ public class DefaultPlugin implements REIPluginEntry {
                 l.add(new Rectangle(screenHooks.rei_getContainerLeft() - 4 - 145 - 30, screenHooks.rei_getContainerTop(), 30, (size - 1) * 27));
             return l;
         });
-        displayHelper.registerBoundsHandler(new DisplayHelper.DisplayBoundsHandler<ContainerScreen>() {
+        displayHelper.registerBoundsHandler(new DisplayHelper.DisplayBoundsHandler<AbstractContainerScreen>() {
             @Override
             public Class getBaseSupportedClass() {
-                return ContainerScreen.class;
+                return AbstractContainerScreen.class;
             }
             
             @Override
-            public Rectangle getLeftBounds(ContainerScreen screen) {
+            public Rectangle getLeftBounds(AbstractContainerScreen screen) {
                 return new Rectangle(2, 0, ScreenHelper.getLastContainerScreenHooks().rei_getContainerLeft() - 4, MinecraftClient.getInstance().window.getScaledHeight());
             }
             
             @Override
-            public Rectangle getRightBounds(ContainerScreen screen) {
+            public Rectangle getRightBounds(AbstractContainerScreen screen) {
                 int startX = ScreenHelper.getLastContainerScreenHooks().rei_getContainerLeft() + ScreenHelper.getLastContainerScreenHooks().rei_getContainerWidth() + 2;
                 return new Rectangle(startX, 0, MinecraftClient.getInstance().window.getScaledWidth() - startX - 2, MinecraftClient.getInstance().window.getScaledHeight());
             }
@@ -220,19 +207,19 @@ public class DefaultPlugin implements REIPluginEntry {
                 return -1.0f;
             }
         });
-        displayHelper.registerBoundsHandler(new DisplayHelper.DisplayBoundsHandler<CreativePlayerInventoryScreen>() {
+        displayHelper.registerBoundsHandler(new DisplayHelper.DisplayBoundsHandler<CreativeInventoryScreen>() {
             @Override
             public Class getBaseSupportedClass() {
-                return CreativePlayerInventoryScreen.class;
+                return CreativeInventoryScreen.class;
             }
             
             @Override
-            public Rectangle getLeftBounds(CreativePlayerInventoryScreen screen) {
+            public Rectangle getLeftBounds(CreativeInventoryScreen screen) {
                 return new Rectangle(2, 0, ScreenHelper.getLastContainerScreenHooks().rei_getContainerLeft() - 2, MinecraftClient.getInstance().window.getScaledHeight());
             }
             
             @Override
-            public Rectangle getRightBounds(CreativePlayerInventoryScreen screen) {
+            public Rectangle getRightBounds(CreativeInventoryScreen screen) {
                 int startX = ScreenHelper.getLastContainerScreenHooks().rei_getContainerLeft() + ScreenHelper.getLastContainerScreenHooks().rei_getContainerWidth();
                 return new Rectangle(startX, 0, MinecraftClient.getInstance().window.getScaledWidth() - startX - 2, MinecraftClient.getInstance().window.getScaledHeight());
             }
@@ -269,7 +256,7 @@ public class DefaultPlugin implements REIPluginEntry {
         recipeHelper.registerSpeedCraftFunctional(DefaultPlugin.CRAFTING, new SpeedCraftFunctional<DefaultCraftingDisplay>() {
             @Override
             public Class[] getFunctioningFor() {
-                return new Class[]{PlayerInventoryScreen.class, CraftingTableScreen.class};
+                return new Class[]{InventoryScreen.class, CraftingTableScreen.class};
             }
             
             @Override
@@ -278,8 +265,8 @@ public class DefaultPlugin implements REIPluginEntry {
                     return false;
                 if (screen.getClass().isAssignableFrom(CraftingTableScreen.class))
                     ((RecipeBookGuiHooks) (((CraftingTableScreen) screen).getRecipeBookGui())).rei_getGhostSlots().reset();
-                else if (screen.getClass().isAssignableFrom(PlayerInventoryScreen.class))
-                    ((RecipeBookGuiHooks) (((PlayerInventoryScreen) screen).getRecipeBookGui())).rei_getGhostSlots().reset();
+                else if (screen.getClass().isAssignableFrom(InventoryScreen.class))
+                    ((RecipeBookGuiHooks) (((InventoryScreen) screen).getRecipeBookGui())).rei_getGhostSlots().reset();
                 else
                     return false;
                 MinecraftClient.getInstance().interactionManager.clickRecipe(MinecraftClient.getInstance().player.container.syncId, (Recipe) recipe.getRecipe().get(), Screen.hasShiftDown());
@@ -288,7 +275,7 @@ public class DefaultPlugin implements REIPluginEntry {
             
             @Override
             public boolean acceptRecipe(Screen screen, DefaultCraftingDisplay recipe) {
-                return screen instanceof CraftingTableScreen || (screen instanceof PlayerInventoryScreen && recipe.getHeight() < 3 && recipe.getWidth() < 3);
+                return screen instanceof CraftingTableScreen || (screen instanceof InventoryScreen && recipe.getHeight() < 3 && recipe.getWidth() < 3);
             }
         });
         recipeHelper.registerSpeedCraftFunctional(DefaultPlugin.SMELTING, new SpeedCraftFunctional<DefaultSmeltingDisplay>() {

+ 1 - 1
src/main/java/me/shedaniel/rei/plugin/DefaultShapedDisplay.java

@@ -8,7 +8,7 @@ package me.shedaniel.rei.plugin;
 import com.google.common.collect.Lists;
 import net.minecraft.item.ItemStack;
 import net.minecraft.recipe.Recipe;
-import net.minecraft.recipe.crafting.ShapedRecipe;
+import net.minecraft.recipe.ShapedRecipe;
 
 import java.util.Collections;
 import java.util.List;

+ 1 - 1
src/main/java/me/shedaniel/rei/plugin/DefaultShapelessDisplay.java

@@ -7,7 +7,7 @@ package me.shedaniel.rei.plugin;
 
 import com.google.common.collect.Lists;
 import net.minecraft.item.ItemStack;
-import net.minecraft.recipe.crafting.ShapelessRecipe;
+import net.minecraft.recipe.ShapelessRecipe;
 
 import java.util.Collections;
 import java.util.List;

+ 1 - 1
src/main/java/me/shedaniel/rei/plugin/DefaultSmeltingDisplay.java

@@ -10,7 +10,7 @@ import me.shedaniel.rei.api.RecipeDisplay;
 import net.minecraft.block.entity.FurnaceBlockEntity;
 import net.minecraft.item.Item;
 import net.minecraft.item.ItemStack;
-import net.minecraft.recipe.cooking.SmeltingRecipe;
+import net.minecraft.recipe.SmeltingRecipe;
 import net.minecraft.util.Identifier;
 
 import java.util.Collections;

+ 1 - 1
src/main/java/me/shedaniel/rei/plugin/DefaultSmokingDisplay.java

@@ -10,7 +10,7 @@ import me.shedaniel.rei.api.RecipeDisplay;
 import net.minecraft.block.entity.FurnaceBlockEntity;
 import net.minecraft.item.Item;
 import net.minecraft.item.ItemStack;
-import net.minecraft.recipe.cooking.SmokingRecipe;
+import net.minecraft.recipe.SmokingRecipe;
 import net.minecraft.util.Identifier;
 
 import java.util.Collections;

+ 1 - 1
src/main/java/me/shedaniel/rei/utils/ClothScreenRegistry.java

@@ -17,7 +17,7 @@ import me.shedaniel.rei.client.RecipeScreenType;
 import me.shedaniel.rei.gui.config.ItemListOrderingConfig;
 import me.shedaniel.rei.gui.credits.CreditsScreen;
 import net.minecraft.client.MinecraftClient;
-import net.minecraft.client.gui.Screen;
+import net.minecraft.client.gui.screen.Screen;
 import net.minecraft.client.gui.widget.ButtonWidget;
 import net.minecraft.client.resource.language.I18n;