Unknown 6 роки тому
батько
коміт
70d6b7b3e0
69 змінених файлів з 948 додано та 696 видалено
  1. 4 0
      README.md
  2. 18 39
      build.gradle
  3. BIN
      gradle/wrapper/gradle-wrapper.jar
  4. 2 2
      gradle/wrapper/gradle-wrapper.properties
  5. 10 13
      gradlew
  6. 84 84
      gradlew.bat
  7. 10 2
      settings.gradle
  8. 13 13
      src/main/java/me/shedaniel/ClientListener.java
  9. 42 5
      src/main/java/me/shedaniel/Core.java
  10. 3 1
      src/main/java/me/shedaniel/api/IREIPlugin.java
  11. 51 47
      src/main/java/me/shedaniel/gui/GuiItemList.java
  12. 33 30
      src/main/java/me/shedaniel/gui/REIRenderHelper.java
  13. 4 3
      src/main/java/me/shedaniel/gui/RecipeContainer.java
  14. 46 53
      src/main/java/me/shedaniel/gui/RecipeGui.java
  15. 13 20
      src/main/java/me/shedaniel/gui/widget/Button.java
  16. 25 25
      src/main/java/me/shedaniel/gui/widget/Control.java
  17. 28 29
      src/main/java/me/shedaniel/gui/widget/REISlot.java
  18. 8 9
      src/main/java/me/shedaniel/gui/widget/Tab.java
  19. 4 4
      src/main/java/me/shedaniel/gui/widget/TextBox.java
  20. 14 8
      src/main/java/me/shedaniel/gui/widget/WidgetArrow.java
  21. 11 11
      src/main/java/me/shedaniel/impl/REIRecipeManager.java
  22. 5 5
      src/main/java/me/shedaniel/library/KeyBindManager.java
  23. 1 1
      src/main/java/me/shedaniel/listenerdefinitions/CharInput.java
  24. 5 0
      src/main/java/me/shedaniel/listenerdefinitions/ClientTickable.java
  25. 1 1
      src/main/java/me/shedaniel/listenerdefinitions/DoneLoading.java
  26. 3 3
      src/main/java/me/shedaniel/listenerdefinitions/DrawContainer.java
  27. 1 1
      src/main/java/me/shedaniel/listenerdefinitions/GuiCickListener.java
  28. 1 1
      src/main/java/me/shedaniel/listenerdefinitions/GuiKeyDown.java
  29. 4 0
      src/main/java/me/shedaniel/listenerdefinitions/IEvent.java
  30. 2 2
      src/main/java/me/shedaniel/listenerdefinitions/IMixinContainerGui.java
  31. 7 0
      src/main/java/me/shedaniel/listenerdefinitions/KeybindHandler.java
  32. 1 1
      src/main/java/me/shedaniel/listenerdefinitions/MinecraftResize.java
  33. 1 1
      src/main/java/me/shedaniel/listenerdefinitions/MouseScrollListener.java
  34. 21 0
      src/main/java/me/shedaniel/listenerdefinitions/PacketAdder.java
  35. 3 3
      src/main/java/me/shedaniel/listenerdefinitions/PotionCraftingAdder.java
  36. 1 1
      src/main/java/me/shedaniel/listenerdefinitions/PreLoadOptions.java
  37. 2 2
      src/main/java/me/shedaniel/listenerdefinitions/RecipeLoadListener.java
  38. 20 20
      src/main/java/me/shedaniel/listeners/DrawContainerListener.java
  39. 0 21
      src/main/java/me/shedaniel/listeners/InitListener.java
  40. 22 0
      src/main/java/me/shedaniel/mixins/MixinBrewingRecipeRegistry.java
  41. 5 6
      src/main/java/me/shedaniel/mixins/MixinDoneLoading.java
  42. 23 23
      src/main/java/me/shedaniel/mixins/MixinGuiContainer.java
  43. 38 39
      src/main/java/me/shedaniel/mixins/MixinGuiContainerCreative.java
  44. 5 5
      src/main/java/me/shedaniel/mixins/MixinKeyboardListener.java
  45. 40 0
      src/main/java/me/shedaniel/mixins/MixinMinecraftClient.java
  46. 11 8
      src/main/java/me/shedaniel/mixins/MixinMinecraftResize.java
  47. 0 21
      src/main/java/me/shedaniel/mixins/MixinPotionBrewing.java
  48. 8 8
      src/main/java/me/shedaniel/mixins/MixinRecipeManager.java
  49. 6 8
      src/main/java/me/shedaniel/mixins/SettingsMixin.java
  50. 15 15
      src/main/java/me/shedaniel/network/CheatPacket.java
  51. 16 15
      src/main/java/me/shedaniel/network/DeletePacket.java
  52. 3 3
      src/main/java/me/shedaniel/plugin/RandomRecipe.java
  53. 0 3
      src/main/java/me/shedaniel/plugin/TestRandomCategory.java
  54. 41 18
      src/main/java/me/shedaniel/plugin/VanillaPlugin.java
  55. 8 9
      src/main/java/me/shedaniel/plugin/crafting/VanillaCraftingCategory.java
  56. 5 5
      src/main/java/me/shedaniel/plugin/crafting/VanillaShapedCraftingRecipe.java
  57. 7 7
      src/main/java/me/shedaniel/plugin/crafting/VanillaShapelessCraftingRecipe.java
  58. 8 8
      src/main/java/me/shedaniel/plugin/furnace/VanillaFurnaceCategory.java
  59. 7 7
      src/main/java/me/shedaniel/plugin/furnace/VanillaFurnaceRecipe.java
  60. 16 16
      src/main/java/me/shedaniel/plugin/potion/VanillaPotionCategory.java
  61. 1 1
      src/main/java/me/shedaniel/plugin/potion/VanillaPotionRecipe.java
  62. 89 0
      src/main/java/me/shedaniel/plugin/smoker/VanillaSmokerCategory.java
  63. 43 0
      src/main/java/me/shedaniel/plugin/smoker/VanillaSmokerRecipe.java
  64. 0 0
      src/main/resources/assets/roughlyenoughitems/.modassetroot
  65. 1 0
      src/main/resources/assets/roughlyenoughitems/lang/en_us.json
  66. 0 0
      src/main/resources/assets/roughlyenoughitems/lang/fr_fr.json
  67. 0 0
      src/main/resources/assets/roughlyenoughitems/textures/gui/recipecontainer.png
  68. 19 0
      src/main/resources/fabric.mod.json
  69. 9 10
      src/main/resources/roughlyenoughitems.client.json

+ 4 - 0
README.md

@@ -17,6 +17,10 @@ A project to make (AEI) [https://minecraft.curseforge.com/projects/almost-enough
 - Fixed Scrolling (by a bit)
 - One page now shows 2 recipe
 
+### 1.14 Port
+- Not Called Listeners
+  - PacketAdder
+
 ### Features that I will work on in the future
 - Hide Gui with Control / Command + O
 

+ 18 - 39
build.gradle

@@ -1,50 +1,29 @@
-buildscript {
-    repositories {
-        jcenter()
-        maven { url 'https://www.jitpack.io' }
-        maven { url 'http://repo.spongepowered.org/maven' }
-        maven { url 'http://files.minecraftforge.net/maven' }
-    }
-    dependencies {
-        classpath 'com.github.Chocohead:ForgeGradle:moderniser-SNAPSHOT'
-        classpath 'org.spongepowered:mixingradle:0.6-SNAPSHOT'
-    }
+plugins {
+	id 'fabric-loom' version '0.2.0-SNAPSHOT'
 }
 
-apply plugin: 'net.minecraftforge.gradle.tweaker-client'
-apply plugin: 'org.spongepowered.mixin'
-apply plugin: 'java'
-
-group 'me.shedaniel'
-version '1.0b-1'
-archivesBaseName = 'RoughlyEnoughItems'
-
 sourceCompatibility = 1.8
 targetCompatibility = 1.8
 
-repositories {
-    mavenCentral()
-    maven { url 'https://www.dimdev.org/maven/' }
-    maven { url 'https://repo.spongepowered.org/maven/' }
-    maven { url 'https://www.jitpack.io' }
-    maven { url "http://repo.strezz.org/artifactory/list/Strezz-Central" }
-}
+archivesBaseName = "RoughlyEnoughItems"
+version = "1.0-1"
 
+minecraft {
+}
 
+dependencies {
+	minecraft "com.mojang:minecraft:18w50a"
+	mappings "net.fabricmc:yarn:18w50a.83"
+	modCompile "net.fabricmc:fabric-loader:0.3.1.82"
 
-mixin {
-    defaultObfuscationEnv notch
-    add sourceSets.main, 'mixins.roughlyenoughitems.refmap.json'
+	// Fabric API. This is technically optional, but you probably want it anyway.
+	modCompile "net.fabricmc:fabric:0.1.2.63"
 }
 
-minecraft {
-    version = '1.13.2'
-    mappings = 'snapshot_20181130'
-    runDir = 'run'
-    tweakClass = 'org.dimdev.riftloader.launch.RiftLoaderClientTweaker'
+// Loom will automatically attach sourcesJar to a RemapSourcesJar task and to the "build" task
+// if it is present.
+// If you remove this task, sources will not be generated.
+task sourcesJar(type: Jar, dependsOn: classes) {
+	classifier = 'sources'
+	from sourceSets.main.allSource
 }
-
-dependencies {
-    implementation 'com.github.Chocohead:Rift:f76cf44d887d290782590c99770876393c924333:dev'
-    implementation 'com.google.code.gson:gson:2.8.5'
-}

BIN
gradle/wrapper/gradle-wrapper.jar


+ 2 - 2
gradle/wrapper/gradle-wrapper.properties

@@ -1,6 +1,6 @@
-#Fri Dec 21 19:34:34 HKT 2018
+#Sun Dec 30 21:50:18 HKT 2018
 distributionBase=GRADLE_USER_HOME
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-4.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip

+ 10 - 13
gradlew

@@ -1,4 +1,4 @@
-#!/usr/bin/env sh
+#!/usr/bin/env bash
 
 ##############################################################################
 ##
@@ -33,11 +33,11 @@ DEFAULT_JVM_OPTS=""
 # Use the maximum available, or set MAX_FD != -1 to use that value.
 MAX_FD="maximum"
 
-warn () {
+warn ( ) {
     echo "$*"
 }
 
-die () {
+die ( ) {
     echo
     echo "$*"
     echo
@@ -154,19 +154,16 @@ if $cygwin ; then
     esac
 fi
 
-# Escape application args
-save () {
-    for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
-    echo " "
+# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
+function splitJvmOpts() {
+    JVM_OPTS=("$@")
 }
-APP_ARGS=$(save "$@")
-
-# Collect all arguments for the java command, following the shell quoting and substitution rules
-eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
+JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
 
 # by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
-if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
+if [[ "$(uname)" == "Darwin" ]] && [[ "$HOME" == "$PWD" ]]; then
   cd "$(dirname "$0")"
 fi
 
-exec "$JAVACMD" "$@"
+exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"

+ 84 - 84
gradlew.bat

@@ -1,84 +1,84 @@
-@if "%DEBUG%" == "" @echo off
-@rem ##########################################################################
-@rem
-@rem  Gradle startup script for Windows
-@rem
-@rem ##########################################################################
-
-@rem Set local scope for the variables with windows NT shell
-if "%OS%"=="Windows_NT" setlocal
-
-set DIRNAME=%~dp0
-if "%DIRNAME%" == "" set DIRNAME=.
-set APP_BASE_NAME=%~n0
-set APP_HOME=%DIRNAME%
-
-@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-set DEFAULT_JVM_OPTS=
-
-@rem Find java.exe
-if defined JAVA_HOME goto findJavaFromJavaHome
-
-set JAVA_EXE=java.exe
-%JAVA_EXE% -version >NUL 2>&1
-if "%ERRORLEVEL%" == "0" goto init
-
-echo.
-echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
-
-goto fail
-
-:findJavaFromJavaHome
-set JAVA_HOME=%JAVA_HOME:"=%
-set JAVA_EXE=%JAVA_HOME%/bin/java.exe
-
-if exist "%JAVA_EXE%" goto init
-
-echo.
-echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
-
-goto fail
-
-:init
-@rem Get command-line arguments, handling Windows variants
-
-if not "%OS%" == "Windows_NT" goto win9xME_args
-
-:win9xME_args
-@rem Slurp the command line arguments.
-set CMD_LINE_ARGS=
-set _SKIP=2
-
-:win9xME_args_slurp
-if "x%~1" == "x" goto execute
-
-set CMD_LINE_ARGS=%*
-
-:execute
-@rem Setup the command line
-
-set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
-
-@rem Execute Gradle
-"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
-
-:end
-@rem End local scope for the variables with windows NT shell
-if "%ERRORLEVEL%"=="0" goto mainEnd
-
-:fail
-rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
-rem the _cmd.exe /c_ return code!
-if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
-exit /b 1
-
-:mainEnd
-if "%OS%"=="Windows_NT" endlocal
-
-:omega
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem  Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windows variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega

+ 10 - 2
settings.gradle

@@ -1,2 +1,10 @@
-rootProject.name = 'RoughlyEnoughItems'
-
+pluginManagement {
+    repositories {
+        jcenter()
+        maven {
+            name = 'Fabric'
+            url = 'https://maven.fabricmc.net/'
+        }
+        gradlePluginPortal()
+    }
+}

+ 13 - 13
src/main/java/me/shedaniel/ClientListener.java

@@ -9,12 +9,12 @@ import me.shedaniel.listenerdefinitions.RecipeLoadListener;
 import net.minecraft.client.settings.KeyBinding;
 import net.minecraft.enchantment.Enchantment;
 import net.minecraft.enchantment.EnchantmentHelper;
-import net.minecraft.init.Items;
 import net.minecraft.item.Item;
-import net.minecraft.item.ItemGroup;
 import net.minecraft.item.ItemStack;
-import net.minecraft.util.NonNullList;
-import net.minecraft.util.registry.IRegistry;
+import net.minecraft.item.Items;
+import net.minecraft.recipe.RecipeManager;
+import net.minecraft.util.DefaultedList;
+import net.minecraft.util.registry.Registry;
 
 import java.awt.event.KeyEvent;
 import java.util.ArrayList;
@@ -43,24 +43,24 @@ public class ClientListener implements DoneLoading, RecipeLoadListener {
     }
     
     private void buildItemList() {
-        if (!IRegistry.ITEM.isEmpty())
-            IRegistry.ITEM.forEach(this::processItem);
-        if (!IRegistry.ENCHANTMENT.isEmpty())
-            IRegistry.ENCHANTMENT.forEach(enchantment -> {
-                for(int i = enchantment.getMinLevel(); i < enchantment.getMaxLevel(); i++) {
+        if (!Registry.ITEM.isEmpty())
+            Registry.ITEM.forEach(this::processItem);
+        if (Registry.ENCHANTMENT.stream().count() > 0)
+            Registry.ENCHANTMENT.forEach(enchantment -> {
+                for(int i = enchantment.getMinimumLevel(); i < enchantment.getMaximumLevel(); i++) {
                     ItemStack stack = new ItemStack(Items.ENCHANTED_BOOK);
                     Map<Enchantment, Integer> map = new HashMap<>();
                     map.put(enchantment, i);
-                    EnchantmentHelper.setEnchantments(map, stack);
+                    EnchantmentHelper.set(map, stack);
                     processItemStack(stack);
                 }
             });
     }
     
     private void processItem(Item item) {
-        NonNullList<ItemStack> items = NonNullList.create();
+        DefaultedList<ItemStack> items = DefaultedList.create();
         try {
-            item.fillItemGroup(item.getGroup(), items);
+            item.addStacksForDisplay(item.getItemGroup(), items);
             items.forEach(stackList::add);
         } catch (NullPointerException e) {
 //            if (item == Items.ENCHANTED_BOOK) {
@@ -75,7 +75,7 @@ public class ClientListener implements DoneLoading, RecipeLoadListener {
     }
     
     @Override
-    public void recipesLoaded(net.minecraft.item.crafting.RecipeManager recipeManager) {
+    public void recipesLoaded(RecipeManager recipeManager) {
         REIRecipeManager.instance().RecipesLoaded(recipeManager);
     }
 }

+ 42 - 5
src/main/java/me/shedaniel/Core.java

@@ -1,22 +1,32 @@
 package me.shedaniel;
 
+import me.shedaniel.library.KeyBindManager;
+import me.shedaniel.listenerdefinitions.IEvent;
+import me.shedaniel.listenerdefinitions.PacketAdder;
+import me.shedaniel.listeners.DrawContainerListener;
+import me.shedaniel.listeners.ResizeListener;
 import me.shedaniel.network.CheatPacket;
 import me.shedaniel.network.DeletePacket;
-import net.minecraft.network.EnumPacketDirection;
-import org.dimdev.rift.listener.PacketAdder;
+import me.shedaniel.plugin.VanillaPlugin;
+import net.fabricmc.api.ModInitializer;
+import net.minecraft.network.NetworkSide;
+
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
 
 /**
  * Created by James on 7/27/2018.
  */
-public class Core implements PacketAdder {
+public class Core implements ModInitializer, PacketAdder {
     @Override
     public void registerHandshakingPackets(PacketRegistrationReceiver receiver) {
     }
     
     @Override
     public void registerPlayPackets(PacketRegistrationReceiver receiver) {
-        receiver.registerPacket(EnumPacketDirection.SERVERBOUND, CheatPacket.class);
-        receiver.registerPacket(EnumPacketDirection.SERVERBOUND, DeletePacket.class);
+        receiver.registerPacket(NetworkSide.SERVER, CheatPacket.class);
+        receiver.registerPacket(NetworkSide.SERVER, DeletePacket.class);
     }
     
     @Override
@@ -29,5 +39,32 @@ public class Core implements PacketAdder {
     
     }
     
+    private static List<IEvent> events = new LinkedList<>();
+    
+    @Override
+    public void onInitialize() {
+        registerEvents();
+    }
+    
+    private void registerEvents() {
+        registerEvent(new DrawContainerListener());
+        registerEvent(new ResizeListener());
+        registerEvent(new KeyBindManager());
+        registerEvent(new VanillaPlugin());
+        registerEvent(new ClientListener());
+    }
+    
+    public static void registerEvent(IEvent event) {
+        events.add(event);
+    }
+    
+    public static <T> List<T> getListeners(Class<T> listenerInterface) {
+        List<T> list = new ArrayList<>();
+        events.forEach(iEvent -> {
+            if (listenerInterface.isAssignableFrom(iEvent.getClass()))
+                list.add(listenerInterface.cast(iEvent));
+        });
+        return list;
+    }
     
 }

+ 3 - 1
src/main/java/me/shedaniel/api/IREIPlugin.java

@@ -1,9 +1,11 @@
 package me.shedaniel.api;
 
+import me.shedaniel.listenerdefinitions.IEvent;
+
 /**
  * Created by James on 7/27/2018.
  */
-public interface IREIPlugin {
+public interface IREIPlugin extends IEvent {
     
     public void register();
 }

+ 51 - 47
src/main/java/me/shedaniel/gui/GuiItemList.java

@@ -1,21 +1,23 @@
 package me.shedaniel.gui;
 
+import com.mojang.blaze3d.platform.GlStateManager;
 import me.shedaniel.ClientListener;
+import me.shedaniel.Core;
 import me.shedaniel.gui.widget.Button;
 import me.shedaniel.gui.widget.Control;
 import me.shedaniel.gui.widget.REISlot;
 import me.shedaniel.gui.widget.TextBox;
-import me.shedaniel.listenerdefinitions.IMixinGuiContainer;
-import net.minecraft.client.MainWindow;
-import net.minecraft.client.Minecraft;
-import net.minecraft.client.gui.inventory.GuiContainer;
-import net.minecraft.client.renderer.GlStateManager;
-import net.minecraft.entity.player.EntityPlayer;
+import me.shedaniel.listenerdefinitions.IMixinContainerGui;
+import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.gui.ContainerGui;
+import net.minecraft.client.network.ClientPlayerEntity;
+import net.minecraft.client.util.Window;
 import net.minecraft.item.ItemStack;
-import net.minecraft.util.ResourceLocation;
+import net.minecraft.text.TextComponent;
+import net.minecraft.text.TranslatableTextComponent;
+import net.minecraft.util.Identifier;
 import net.minecraft.util.math.MathHelper;
-import net.minecraft.util.registry.IRegistry;
-import net.minecraft.util.text.TextComponentTranslation;
+import net.minecraft.util.registry.Registry;
 
 import java.awt.*;
 import java.util.ArrayList;
@@ -27,7 +29,7 @@ import java.util.stream.Stream;
 public class GuiItemList extends Drawable {
     
     public static final int FOOTERSIZE = 44;
-    private GuiContainer overlayedGui;
+    private ContainerGui overlayedGui;
     private static int page = 0;
     private ArrayList<REISlot> displaySlots;
     protected ArrayList<Control> controls;
@@ -42,7 +44,7 @@ public class GuiItemList extends Drawable {
     private int oldGuiLeft = 0;
     private boolean cheatMode = false;
     
-    public GuiItemList(GuiContainer overlayedGui) {
+    public GuiItemList(ContainerGui overlayedGui) {
         super(calculateRect(overlayedGui));
         displaySlots = new ArrayList<>();
         controls = new ArrayList<>();
@@ -52,9 +54,9 @@ public class GuiItemList extends Drawable {
     }
     
     public boolean canCheat() {
-        EntityPlayer player = Minecraft.getInstance().player;
+        ClientPlayerEntity player = MinecraftClient.getInstance().player;
         if (cheatMode) {
-            if (!player.hasPermissionLevel(1)) {
+            if (!player.allowsPermissionLevel(1)) {
                 cheatClicked(0);
                 return false;
             }
@@ -63,26 +65,25 @@ public class GuiItemList extends Drawable {
         return false;
     }
     
-    private static Rectangle calculateRect(GuiContainer overlayedGui) {
-        MainWindow res = REIRenderHelper.getResolution();
-        int startX = (((IMixinGuiContainer) overlayedGui).getGuiLeft() + ((IMixinGuiContainer) overlayedGui).getXSize()) + 10;
+    private static Rectangle calculateRect(ContainerGui overlayedGui) {
+        Window res = REIRenderHelper.getResolution();
+        int startX = (((IMixinContainerGui) overlayedGui).getGuiLeft() + ((IMixinContainerGui) overlayedGui).getXSize()) + 10;
         int width = res.getScaledWidth() - startX;
         return new Rectangle(startX, 0, width, res.getScaledHeight());
     }
     
     protected void resize() {
-        MainWindow res = REIRenderHelper.getResolution();
+        Window res = REIRenderHelper.getResolution();
         
-        if (overlayedGui != Minecraft.getInstance().currentScreen) {
-            if (Minecraft.getInstance().currentScreen instanceof GuiContainer) {
-                overlayedGui = (GuiContainer) Minecraft.getInstance().currentScreen;
-                
+        if (overlayedGui != MinecraftClient.getInstance().currentGui) {
+            if (MinecraftClient.getInstance().currentGui instanceof ContainerGui) {
+                overlayedGui = (ContainerGui) MinecraftClient.getInstance().currentGui;
             } else {
                 needsResize = true;
                 return;
             }
         }
-        oldGuiLeft = ((IMixinGuiContainer) overlayedGui).getGuiLeft();
+        oldGuiLeft = ((IMixinContainerGui) overlayedGui).getGuiLeft();
         rect = calculateRect(overlayedGui);
         page = 0;
         buttonLeft = new Button(rect.x, rect.y + 3, 16, 20, "<");
@@ -122,7 +123,7 @@ public class GuiItemList extends Drawable {
     
     private void calculateSlots() {
         int x = rect.x, y = rect.y + 20;
-        MainWindow res = REIRenderHelper.getResolution();
+        Window res = REIRenderHelper.getResolution();
         displaySlots.clear();
         int xOffset = 0, yOffset = 0, row = 0, perRow = 0, currentX = 0, currentY = 0;
         while (true) {
@@ -165,13 +166,13 @@ public class GuiItemList extends Drawable {
             return;
         if (needsResize == true)
             resize();
-        if (oldGuiLeft != ((IMixinGuiContainer) overlayedGui).getGuiLeft())
+        if (oldGuiLeft != ((IMixinContainerGui) overlayedGui).getGuiLeft())
             resize();
         GlStateManager.pushMatrix();
         updateButtons();
         controls.forEach(Control::draw);
         String header = String.format("%s/%s", page + 1, ((int) Math.floor(view.size() / displaySlots.size())) + 1);
-        Minecraft.getInstance().fontRenderer.drawStringWithShadow(header, rect.x + (rect.width / 2) - (Minecraft.getInstance().fontRenderer.getStringWidth(header) / 2), rect.y + 10, -1);
+        MinecraftClient.getInstance().fontRenderer.drawWithShadow(header, rect.x + (rect.width / 2) - (MinecraftClient.getInstance().fontRenderer.getStringWidth(header) / 2), rect.y + 10, -1);
         GlStateManager.popMatrix();
     }
     
@@ -217,10 +218,10 @@ public class GuiItemList extends Drawable {
     
     private String getCheatModeText() {
         if (cheatMode) {
-            TextComponentTranslation cheat = new TextComponentTranslation("text.rei.cheat", new Object[]{null});
+            TextComponent cheat = new TranslatableTextComponent("text.rei.cheat", new Object[]{null});
             return cheat.getFormattedText();
         }
-        TextComponentTranslation noCheat = new TextComponentTranslation("text.rei.nocheat", new Object[]{null});
+        TextComponent noCheat = new TranslatableTextComponent("text.rei.nocheat", new Object[]{null});
         return noCheat.getFormattedText();
     }
     
@@ -228,24 +229,27 @@ public class GuiItemList extends Drawable {
         String searchText = searchBox.getText();
         view.clear();
         List<ItemStack> stacks = new ArrayList<>();
-        Arrays.stream(searchText.split("\\|")).forEachOrdered(s -> {
-            List<SearchArgument> arguments = new ArrayList<>();
-            while (s.startsWith(" ")) s = s.substring(1);
-            while (s.endsWith(" ")) s = s.substring(0, s.length());
-            if (s.startsWith("@-") || s.startsWith("-@"))
-                arguments.add(new SearchArgument(SearchArgument.ArgumentType.MOD, s.substring(2), false));
-            else if (s.startsWith("@"))
-                arguments.add(new SearchArgument(SearchArgument.ArgumentType.MOD, s.substring(1), true));
-            else if (s.startsWith("#-") || s.startsWith("-#"))
-                arguments.add(new SearchArgument(SearchArgument.ArgumentType.TOOLTIP, s.substring(2), false));
-            else if (s.startsWith("#"))
-                arguments.add(new SearchArgument(SearchArgument.ArgumentType.TOOLTIP, s.substring(1), true));
-            else if (s.startsWith("-"))
-                arguments.add(new SearchArgument(SearchArgument.ArgumentType.TEXT, s.substring(1), false));
-            else
-                arguments.add(new SearchArgument(SearchArgument.ArgumentType.TEXT, s, true));
-            ClientListener.stackList.stream().filter(itemStack -> filterItem(itemStack, arguments)).forEachOrdered(stacks::add);
-        });
+        if (ClientListener.stackList == null && !Registry.ITEM.isEmpty())
+            Core.getListeners(ClientListener.class).forEach(ClientListener::onDoneLoading);
+        if (ClientListener.stackList != null)
+            Arrays.stream(searchText.split("\\|")).forEachOrdered(s -> {
+                List<SearchArgument> arguments = new ArrayList<>();
+                while (s.startsWith(" ")) s = s.substring(1);
+                while (s.endsWith(" ")) s = s.substring(0, s.length());
+                if (s.startsWith("@-") || s.startsWith("-@"))
+                    arguments.add(new SearchArgument(SearchArgument.ArgumentType.MOD, s.substring(2), false));
+                else if (s.startsWith("@"))
+                    arguments.add(new SearchArgument(SearchArgument.ArgumentType.MOD, s.substring(1), true));
+                else if (s.startsWith("#-") || s.startsWith("-#"))
+                    arguments.add(new SearchArgument(SearchArgument.ArgumentType.TOOLTIP, s.substring(2), false));
+                else if (s.startsWith("#"))
+                    arguments.add(new SearchArgument(SearchArgument.ArgumentType.TOOLTIP, s.substring(1), true));
+                else if (s.startsWith("-"))
+                    arguments.add(new SearchArgument(SearchArgument.ArgumentType.TEXT, s.substring(1), false));
+                else
+                    arguments.add(new SearchArgument(SearchArgument.ArgumentType.TEXT, s, true));
+                ClientListener.stackList.stream().filter(itemStack -> filterItem(itemStack, arguments)).forEachOrdered(stacks::add);
+            });
         view.addAll(stacks.stream().distinct().collect(Collectors.toList()));
         page = 0;
         fillSlots();
@@ -253,7 +257,7 @@ public class GuiItemList extends Drawable {
     
     private boolean filterItem(ItemStack itemStack, List<SearchArgument> arguments) {
         String mod = getMod(itemStack);
-        List<String> toolTipsList = REIRenderHelper.getOverlayedGui().getItemToolTip(itemStack);
+        List<String> toolTipsList = REIRenderHelper.getOverlayedGui().getStackTooltip(itemStack);
         String toolTipsMixed = toolTipsList.stream().skip(1).collect(Collectors.joining()).toLowerCase();
         String allMixed = Stream.of(itemStack.getDisplayName().getString(), toolTipsMixed).collect(Collectors.joining()).toLowerCase();
         for(SearchArgument searchArgument : arguments.stream().filter(searchArgument -> !searchArgument.isInclude()).collect(Collectors.toList())) {
@@ -295,7 +299,7 @@ public class GuiItemList extends Drawable {
     
     private String getMod(ItemStack stack) {
         if (stack != null && !stack.isEmpty()) {
-            ResourceLocation location = IRegistry.ITEM.getKey(stack.getItem());
+            Identifier location = Registry.ITEM.getId(stack.getItem());
             return location.getNamespace();
         }
         return "";

+ 33 - 30
src/main/java/me/shedaniel/gui/REIRenderHelper.java

@@ -1,19 +1,19 @@
 package me.shedaniel.gui;
 
+import com.mojang.blaze3d.platform.GlStateManager;
 import me.shedaniel.gui.widget.Control;
 import me.shedaniel.gui.widget.IFocusable;
 import me.shedaniel.gui.widget.REISlot;
 import me.shedaniel.impl.REIRecipeManager;
 import me.shedaniel.library.KeyBindManager;
-import me.shedaniel.listenerdefinitions.IMixinGuiContainer;
-import net.minecraft.client.MainWindow;
-import net.minecraft.client.Minecraft;
-import net.minecraft.client.gui.FontRenderer;
-import net.minecraft.client.gui.inventory.GuiContainer;
-import net.minecraft.client.renderer.GlStateManager;
-import net.minecraft.client.renderer.ItemRenderer;
+import me.shedaniel.listenerdefinitions.IMixinContainerGui;
+import net.fabricmc.loader.FabricLoader;
+import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.font.FontRenderer;
+import net.minecraft.client.gui.ContainerGui;
+import net.minecraft.client.render.item.ItemRenderer;
+import net.minecraft.client.util.Window;
 import net.minecraft.item.ItemStack;
-import org.dimdev.riftloader.RiftLoader;
 
 import java.awt.*;
 import java.util.ArrayList;
@@ -27,7 +27,7 @@ import java.util.Optional;
 public class REIRenderHelper {
     static Point mouseLoc;
     static public GuiItemList reiGui;
-    static GuiContainer overlayedGui;
+    static ContainerGui overlayedGui;
     static List<TooltipData> tooltipsToRender = new ArrayList<>();
     
     public static void setMouseLoc(int x, int y) {
@@ -40,23 +40,26 @@ public class REIRenderHelper {
         return mouseLoc;
     }
     
-    public static MainWindow getResolution() {
-        return Minecraft.getInstance().mainWindow;
+    public static Window getResolution() {
+        return MinecraftClient.getInstance().window;
     }
     
     public static String tryGettingModName(String modid) {
         if (modid.equalsIgnoreCase("minecraft"))
             return "Minecraft";
-        return RiftLoader.instance.getMods().stream()
-                .filter(modInfo -> modInfo.id.equals(modid) || (modInfo.name != null && modInfo.name.equals(modid)))
+        return FabricLoader.INSTANCE.getModContainers().stream()
+                .map(modContainer -> {
+                    return modContainer.getInfo();
+                })
+                .filter(modInfo -> modInfo.getId().equals(modid) || (modInfo.getName() != null && modInfo.getName().equals(modid)))
                 .findFirst().map(modInfo -> {
-                    if (modInfo.name != null)
-                        return modInfo.name;
+                    if (modInfo.getName() != null)
+                        return modInfo.getName();
                     return modid;
                 }).orElse(modid);
     }
     
-    public static void drawREI(GuiContainer overlayedGui) {
+    public static void drawREI(ContainerGui overlayedGui) {
         REIRenderHelper.overlayedGui = overlayedGui;
         if (reiGui == null) {
             reiGui = new GuiItemList(overlayedGui);
@@ -70,20 +73,20 @@ public class REIRenderHelper {
             reiGui.resize();
         }
         if (overlayedGui instanceof RecipeGui) {
-            overlayedGui.onResize(Minecraft.getInstance(), scaledWidth, scaledHeight);
+            overlayedGui.onScaleChanged(MinecraftClient.getInstance(), scaledWidth, scaledHeight);
         }
     }
     
     public static ItemRenderer getItemRender() {
-        return Minecraft.getInstance().getItemRenderer();
+        return MinecraftClient.getInstance().getItemRenderer();
     }
     
     public static FontRenderer getFontRenderer() {
-        return Minecraft.getInstance().fontRenderer;
+        return MinecraftClient.getInstance().fontRenderer;
     }
     
-    public static GuiContainer getOverlayedGui() {
-        if (overlayedGui instanceof GuiContainer)
+    public static ContainerGui getOverlayedGui() {
+        if (overlayedGui instanceof ContainerGui)
             return overlayedGui;
         return null;
     }
@@ -97,7 +100,7 @@ public class REIRenderHelper {
         GlStateManager.pushMatrix();
         GlStateManager.enableLighting();
         for(TooltipData tooltipData : tooltipsToRender) {
-            getOverlayedGui().drawHoveringText(tooltipData.text, tooltipData.x, tooltipData.y);
+            getOverlayedGui().drawTooltip(tooltipData.text, tooltipData.x, tooltipData.y);
         }
         GlStateManager.disableLighting();
         tooltipsToRender.clear();
@@ -203,12 +206,12 @@ public class REIRenderHelper {
     }
     
     public static void tick() {
-        if (reiGui != null && Minecraft.getInstance().currentScreen == overlayedGui)
+        if (reiGui != null && MinecraftClient.getInstance().currentGui == overlayedGui)
             reiGui.tick();
     }
     
     public static void recipeKeybind() {
-        if (!(Minecraft.getInstance().currentScreen instanceof GuiContainer))
+        if (!(MinecraftClient.getInstance().currentGui instanceof ContainerGui))
             return;
         Control control = reiGui.getLastHovered();
         if (control != null && control.isHighlighted() && control instanceof REISlot) {
@@ -216,15 +219,15 @@ public class REIRenderHelper {
             REIRecipeManager.instance().displayRecipesFor(slot.getStack());
             return;
         }
-        if (((IMixinGuiContainer) overlayedGui).getHoveredSlot() != null) {
-            ItemStack stack = ((IMixinGuiContainer) overlayedGui).getHoveredSlot().getStack();
+        if (((IMixinContainerGui) overlayedGui).getHoveredSlot() != null) {
+            ItemStack stack = ((IMixinContainerGui) overlayedGui).getHoveredSlot().getStack();
             REIRecipeManager.instance().displayRecipesFor(stack);
         }
         
     }
     
     public static void useKeybind() {
-        if (!(Minecraft.getInstance().currentScreen instanceof GuiContainer))
+        if (!(MinecraftClient.getInstance().currentGui instanceof ContainerGui))
             return;
         Control control = reiGui.getLastHovered();
         if (control != null && control.isHighlighted() && control instanceof REISlot) {
@@ -232,15 +235,15 @@ public class REIRenderHelper {
             REIRecipeManager.instance().displayUsesFor(slot.getStack());
             return;
         }
-        if (((IMixinGuiContainer) overlayedGui).getHoveredSlot() != null) {
-            ItemStack stack = ((IMixinGuiContainer) overlayedGui).getHoveredSlot().getStack();
+        if (((IMixinContainerGui) overlayedGui).getHoveredSlot() != null) {
+            ItemStack stack = ((IMixinContainerGui) overlayedGui).getHoveredSlot().getStack();
             REIRecipeManager.instance().displayUsesFor(stack);
         }
         
     }
     
     public static void hideKeybind() {
-        if (Minecraft.getInstance().currentScreen == overlayedGui && reiGui != null) {
+        if (MinecraftClient.getInstance().currentGui == overlayedGui && reiGui != null) {
             reiGui.visible = !reiGui.visible;
         }
     }

+ 4 - 3
src/main/java/me/shedaniel/gui/RecipeContainer.java

@@ -1,13 +1,14 @@
 package me.shedaniel.gui;
 
 
-import net.minecraft.entity.player.EntityPlayer;
-import net.minecraft.inventory.Container;
+import net.minecraft.container.Container;
+import net.minecraft.entity.player.PlayerEntity;
 
 public class RecipeContainer extends Container {
     
     @Override
-    public boolean canInteractWith(EntityPlayer entityPlayer) {
+    public boolean canUse(PlayerEntity playerEntity) {
         return true;
     }
+    
 }

+ 46 - 53
src/main/java/me/shedaniel/gui/RecipeGui.java

@@ -1,5 +1,6 @@
 package me.shedaniel.gui;
 
+import com.mojang.blaze3d.platform.GlStateManager;
 import me.shedaniel.api.IDisplayCategory;
 import me.shedaniel.api.IRecipe;
 import me.shedaniel.gui.widget.Button;
@@ -7,14 +8,13 @@ import me.shedaniel.gui.widget.Control;
 import me.shedaniel.gui.widget.REISlot;
 import me.shedaniel.gui.widget.Tab;
 import me.shedaniel.impl.REIRecipeManager;
-import net.minecraft.client.MainWindow;
-import net.minecraft.client.Minecraft;
-import net.minecraft.client.gui.GuiScreen;
-import net.minecraft.client.gui.inventory.GuiContainer;
-import net.minecraft.client.renderer.GlStateManager;
-import net.minecraft.client.renderer.RenderHelper;
-import net.minecraft.inventory.Container;
-import net.minecraft.util.ResourceLocation;
+import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.gui.ContainerGui;
+import net.minecraft.client.gui.Gui;
+import net.minecraft.client.render.GuiLighting;
+import net.minecraft.client.util.Window;
+import net.minecraft.container.Container;
+import net.minecraft.util.Identifier;
 import net.minecraft.util.math.MathHelper;
 
 import java.util.ArrayList;
@@ -22,13 +22,13 @@ import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 
-public class RecipeGui extends GuiContainer {
+public class RecipeGui extends ContainerGui {
     
-    private static final ResourceLocation CREATIVE_INVENTORY_TABS = new ResourceLocation("textures/gui/container/creative_inventory/tabs.png");
-    private static final ResourceLocation CHEST_GUI_TEXTURE = new ResourceLocation("almostenoughitems", "textures/gui/recipecontainer.png");
-    private final MainWindow mainWindow;
+    private static final Identifier CREATIVE_INVENTORY_TABS = new Identifier("textures/gui/container/creative_inventory/tabs.png");
+    private static final Identifier CHEST_GUI_TEXTURE = new Identifier("roughlyenoughitems", "textures/gui/recipecontainer.png");
+    private final Window mainWindow;
     private final Container container;
-    private final GuiScreen prevScreen;
+    private final Gui prevScreen;
     private final Map<IDisplayCategory, List<IRecipe>> recipes;
     private int guiWidth = 176;
     private int guiHeight = 222;
@@ -43,15 +43,15 @@ public class RecipeGui extends GuiContainer {
     private List<Tab> tabs;
     private boolean tabsEnabled = false;
     
-    public RecipeGui(Container p_i1072_1_, GuiScreen prevScreen, Map<IDisplayCategory, List<IRecipe>> recipes) {
+    public RecipeGui(Container p_i1072_1_, Gui prevScreen, Map<IDisplayCategory, List<IRecipe>> recipes) {
         super(new RecipeContainer());
         this.container = p_i1072_1_;
         this.prevScreen = prevScreen;
         this.recipes = recipes;
-        this.mc = Minecraft.getInstance();
-        this.itemRender = mc.getItemRenderer();
-        this.fontRenderer = mc.fontRenderer;
-        this.mainWindow = Minecraft.getInstance().mainWindow;
+        this.client = MinecraftClient.getInstance();
+        this.itemRenderer = client.getItemRenderer();
+        this.fontRenderer = client.fontRenderer;
+        this.mainWindow = client.window;
         
         setupCategories();
     }
@@ -71,13 +71,12 @@ public class RecipeGui extends GuiContainer {
         updateRecipe();
     }
     
-    
     @Override
-    public void render(int mouseX, int mouseY, float partialTicks) {
-        super.render(mouseX, mouseY, partialTicks);
+    public void draw(int mouseX, int mouseY, float partialTicks) {
+        super.draw(mouseX, mouseY, partialTicks);
         int y = (int) ((mainWindow.getScaledHeight() / 2 - this.guiHeight / 2));
-        drawCenteredString(this.fontRenderer, selectedCategory.getDisplayName(), guiLeft + guiWidth / 2, y + 11, -1);
-        drawCenteredString(this.fontRenderer, String.format("%d/%d", 1 + getCurrentPage(), getTotalPages()), guiLeft + guiWidth / 2, y + 34, -1);
+        drawStringCentered(this.fontRenderer, selectedCategory.getDisplayName(), left + guiWidth / 2, y + 11, -1);
+        drawStringCentered(this.fontRenderer, String.format("%d/%d", 1 + getCurrentPage(), getTotalPages()), left + guiWidth / 2, y + 34, -1);
         controls.forEach(Control::draw);
     }
     
@@ -86,16 +85,15 @@ public class RecipeGui extends GuiContainer {
     }
     
     @Override
-    public void tick() {
-        super.tick();
+    public void update() {
+        super.update();
         slots.forEach(REISlot::tick);
         controls.forEach(Control::tick);
     }
     
-    
     @Override
-    public void onResize(Minecraft p_onResize_1_, int p_onResize_2_, int p_onResize_3_) {
-        super.onResize(p_onResize_1_, p_onResize_2_, p_onResize_3_);
+    public void onScaleChanged(MinecraftClient p_onResize_1_, int p_onResize_2_, int p_onResize_3_) {
+        super.onScaleChanged(p_onResize_1_, p_onResize_2_, p_onResize_3_);
         updateRecipe();
     }
     
@@ -111,18 +109,18 @@ public class RecipeGui extends GuiContainer {
             slots.addAll(categories.get(categoryPointer).setupDisplay(1));
         }
         
-        guiLeft = (int) ((mainWindow.getScaledWidth() / 2 - this.guiWidth / 2));
-        guiTop = (int) ((mainWindow.getScaledHeight() / 2 - this.guiHeight / 2));
+        left = (int) ((mainWindow.getScaledWidth() / 2 - this.guiWidth / 2));
+        top = (int) ((mainWindow.getScaledHeight() / 2 - this.guiHeight / 2));
         
-        slots.forEach(reiSlot -> reiSlot.move(guiLeft, guiTop));
+        slots.forEach(reiSlot -> reiSlot.move(left, top));
         
-        Button btnCategoryLeft = new Button(guiLeft + 10, guiTop + 5, 15, 20, "<");
-        Button btnCategoryRight = new Button(guiLeft + guiWidth - 25, guiTop + 5, 15, 20, ">");
+        Button btnCategoryLeft = new Button(left + 10, top + 5, 15, 20, "<");
+        Button btnCategoryRight = new Button(left + guiWidth - 25, top + 5, 15, 20, ">");
         btnCategoryRight.onClick = this::btnCategoryRight;
         btnCategoryLeft.onClick = this::btnCategoryLeft;
         
-        Button btnRecipeLeft = new Button(guiLeft + 10, guiTop + 28, 15, 20, "<");
-        Button btnRecipeRight = new Button(guiLeft + guiWidth - 25, guiTop + 28, 15, 20, ">");
+        Button btnRecipeLeft = new Button(left + 10, top + 28, 15, 20, "<");
+        Button btnRecipeRight = new Button(left + guiWidth - 25, top + 28, 15, 20, ">");
         btnRecipeLeft.setEnabled(recipes.get(categories.get(categoryPointer)).size() > 1 && recipePointer > 0);
         btnRecipeRight.setEnabled(recipes.get(categories.get(categoryPointer)).size() > 1 && getCurrentPage() + 1 < getTotalPages());
         btnRecipeRight.onClick = this::btnRecipeRight;
@@ -148,16 +146,16 @@ public class RecipeGui extends GuiContainer {
         categories.get(categoryPointer).addWidget(newControls, 0);
         if (recipes.get(categories.get(categoryPointer)).size() >= categoryPointer + 2)
             categories.get(categoryPointer).addWidget(newControls, 1);
-        newControls.forEach(f -> f.move(guiLeft, guiTop));
+        newControls.forEach(f -> f.move(left, top));
         controls.addAll(newControls);
         
         updateTabs();
     }
     
     private void updateTabs() {
-        tabsEnabled = guiTop - 28 > 4;
+        tabsEnabled = top - 28 > 4;
         if (tabsEnabled) {
-            tabs.forEach(tab -> tab.moveTo(guiLeft + 4, guiLeft + 2 + tabs.indexOf(tab) * 28, guiTop - 28));
+            tabs.forEach(tab -> tab.moveTo(left + 4, left + 2 + tabs.indexOf(tab) * 28, top - 28));
             for(int i = 0; i < tabs.size(); i++) {
                 int ref = i + categoryTabPage * 6;
                 if (categories.size() > ref) {
@@ -169,38 +167,38 @@ public class RecipeGui extends GuiContainer {
     }
     
     private boolean onClickTab(int index) {
-        System.out.println(index);
         if (index + categoryTabPage * 6 == categories.indexOf(selectedCategory))
             return false;
         selectedCategory = categories.get(index + categoryTabPage * 6);
+        updateRecipe();
         return false;
     }
     
     @Override
-    protected void drawGuiContainerBackgroundLayer(float v, int i, int i1) {
+    protected void drawBackground(float v, int i, int i1) {
         //Tabs
         if (tabsEnabled) {
             GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F);
-            RenderHelper.enableGUIStandardItemLighting();
-            this.mc.getTextureManager().bindTexture(CREATIVE_INVENTORY_TABS);
+            GuiLighting.enableForItems();
+            this.client.getTextureManager().bindTexture(CREATIVE_INVENTORY_TABS);
             tabs.stream().filter(tab -> tab.getId() + categoryTabPage * 6 == categories.indexOf(selectedCategory)).forEach(Tab::drawTab);
         }
         
-        drawDefaultBackground();
+        drawBackground();
         GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F);
-        this.mc.getTextureManager().bindTexture(CHEST_GUI_TEXTURE);
+        this.client.getTextureManager().bindTexture(CHEST_GUI_TEXTURE);
         
         int lvt_4_1_ = (int) ((mainWindow.getScaledWidth() / 2 - this.guiWidth / 2));
         int lvt_5_1_ = (int) ((mainWindow.getScaledHeight() / 2 - this.guiHeight / 2));
         
-        this.drawTexturedModalRect(lvt_4_1_, lvt_5_1_, 0, 0, this.guiWidth, this.guiHeight);
+        this.drawTexturedRect(lvt_4_1_, lvt_5_1_, 0, 0, this.guiWidth, this.guiHeight);
         slots.forEach(REISlot::draw);
         
         if (tabsEnabled)
             tabs.stream().filter(tab -> tab.getId() + categoryTabPage * 6 != categories.indexOf(selectedCategory)).forEach(tab -> {
                 GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F);
-                RenderHelper.enableGUIStandardItemLighting();
-                this.mc.getTextureManager().bindTexture(CREATIVE_INVENTORY_TABS);
+                GuiLighting.enableForItems();
+                this.client.getTextureManager().bindTexture(CREATIVE_INVENTORY_TABS);
                 tab.drawTab();
             });
     }
@@ -208,18 +206,13 @@ public class RecipeGui extends GuiContainer {
     @Override
     public boolean keyPressed(int p_keyPressed_1_, int p_keyPressed_2_, int p_keyPressed_3_) {
         if (p_keyPressed_1_ == 259 && prevScreen != null && REIRenderHelper.focusedControl == null) {
-            Minecraft.getInstance().displayGuiScreen(prevScreen);
+            this.client.openGui(prevScreen);
             return true;
         }
         
         return super.keyPressed(p_keyPressed_1_, p_keyPressed_2_, p_keyPressed_3_);
     }
     
-    @Override
-    public void onGuiClosed() {
-        super.onGuiClosed();
-    }
-    
     private boolean btnCategoryLeft(int button) {
         recipePointer = 0;
         int categoryPointer = categories.indexOf(selectedCategory);

+ 13 - 20
src/main/java/me/shedaniel/gui/widget/Button.java

@@ -1,11 +1,11 @@
 package me.shedaniel.gui.widget;
 
+import com.mojang.blaze3d.platform.GlStateManager;
 import me.shedaniel.gui.REIRenderHelper;
-import net.minecraft.client.Minecraft;
-import net.minecraft.client.gui.FontRenderer;
-import net.minecraft.client.gui.inventory.GuiContainer;
-import net.minecraft.client.renderer.GlStateManager;
-import net.minecraft.util.ResourceLocation;
+import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.font.FontRenderer;
+import net.minecraft.client.gui.ContainerGui;
+import net.minecraft.util.Identifier;
 
 import java.awt.*;
 
@@ -14,7 +14,7 @@ import java.awt.*;
  */
 public class Button extends Control {
     private String buttonText;
-    protected static final ResourceLocation BUTTON_TEXTURES = new ResourceLocation("textures/gui/widgets.png");
+    protected static final Identifier BUTTON_TEXTURES = new Identifier("textures/gui/widgets.png");
     
     
     public Button(int x, int y, int width, int height, String buttonText) {
@@ -36,8 +36,8 @@ public class Button extends Control {
     public void draw() {
         GlStateManager.pushMatrix();
         GlStateManager.disableLighting();
-        GuiContainer gui = REIRenderHelper.getOverlayedGui();
-        Minecraft lvt_4_1_ = Minecraft.getInstance();
+        ContainerGui gui = REIRenderHelper.getOverlayedGui();
+        MinecraftClient lvt_4_1_ = MinecraftClient.getInstance();
         FontRenderer lvt_5_1_ = lvt_4_1_.fontRenderer;
         lvt_4_1_.getTextureManager().bindTexture(BUTTON_TEXTURES);
         GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F);
@@ -50,20 +50,13 @@ public class Button extends Control {
         }
         
         GlStateManager.enableBlend();
-        GlStateManager.blendFuncSeparate(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO);
-        GlStateManager.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA);
-        gui.drawTexturedModalRect(rect.x, rect.y, 0, 46 + hoverState * 20, rect.width / 2, rect.height);
-        gui.drawTexturedModalRect(rect.x + rect.width / 2, rect.y, 200 - rect.width / 2, 46 + hoverState * 20, rect.width / 2, rect.height);
-        //this.mouseDragged(lvt_4_1_, p_194828_1_, p_194828_2_);
+        GlStateManager.blendFuncSeparate(GlStateManager.SrcBlendFactor.SRC_ALPHA, GlStateManager.DstBlendFactor.ONE_MINUS_SRC_ALPHA, GlStateManager.SrcBlendFactor.ONE, GlStateManager.DstBlendFactor.ZERO);
+        GlStateManager.blendFunc(GlStateManager.SrcBlendFactor.SRC_ALPHA, GlStateManager.DstBlendFactor.ONE_MINUS_SRC_ALPHA);
+        gui.drawTexturedRect(rect.x, rect.y, 0, 46 + hoverState * 20, rect.width / 2, rect.height);
+        gui.drawTexturedRect(rect.x + rect.width / 2, rect.y, 200 - rect.width / 2, 46 + hoverState * 20, rect.width / 2, rect.height);
         int lvt_7_1_ = 14737632;
-//        if(!this.enabled) {
-//            lvt_7_1_ = 10526880;
-//        } else if(this.hovered) {
-//            lvt_7_1_ = 16777120;
-//        }
         
-        
-        gui.drawCenteredString(lvt_5_1_, this.buttonText, rect.x + rect.width / 2, rect.y + (rect.height - 8) / 2, lvt_7_1_);
+        gui.drawStringCentered(lvt_5_1_, this.buttonText, rect.x + rect.width / 2, rect.y + (rect.height - 8) / 2, lvt_7_1_);
         GlStateManager.enableLighting();
         GlStateManager.popMatrix();
     }

+ 25 - 25
src/main/java/me/shedaniel/gui/widget/Control.java

@@ -1,11 +1,11 @@
 package me.shedaniel.gui.widget;
 
+import com.mojang.blaze3d.platform.GlStateManager;
 import me.shedaniel.api.TriBooleanProducer;
 import me.shedaniel.gui.Drawable;
-import net.minecraft.client.renderer.BufferBuilder;
-import net.minecraft.client.renderer.GlStateManager;
-import net.minecraft.client.renderer.Tessellator;
-import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
+import net.minecraft.client.render.BufferBuilder;
+import net.minecraft.client.render.Tessellator;
+import net.minecraft.client.render.VertexFormats;
 
 import java.awt.*;
 import java.util.function.BiConsumer;
@@ -61,19 +61,19 @@ public abstract class Control extends Drawable {
         float lvt_7_1_ = (float) (p_drawRect_4_ >> 8 & 255) / 255.0F;
         float lvt_8_1_ = (float) (p_drawRect_4_ & 255) / 255.0F;
         Tessellator lvt_9_1_ = Tessellator.getInstance();
-        BufferBuilder lvt_10_1_ = lvt_9_1_.getBuffer();
+        BufferBuilder lvt_10_1_ = lvt_9_1_.getBufferBuilder();
         GlStateManager.enableAlphaTest();
         GlStateManager.enableBlend();
-        GlStateManager.disableTexture2D();
-        GlStateManager.blendFuncSeparate(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO);
+        GlStateManager.disableTexture();
+        GlStateManager.blendFuncSeparate(GlStateManager.SrcBlendFactor.SRC_ALPHA, GlStateManager.DstBlendFactor.ONE_MINUS_SRC_ALPHA, GlStateManager.SrcBlendFactor.ONE, GlStateManager.DstBlendFactor.ZERO);
         GlStateManager.color4f(lvt_6_1_, lvt_7_1_, lvt_8_1_, lvt_5_3_1);
-        lvt_10_1_.begin(7, DefaultVertexFormats.POSITION);
-        lvt_10_1_.pos((double) p_drawRect_0_, (double) p_drawRect_3_, 0.0D).endVertex();
-        lvt_10_1_.pos((double) p_drawRect_2_, (double) p_drawRect_3_, 0.0D).endVertex();
-        lvt_10_1_.pos((double) p_drawRect_2_, (double) p_drawRect_1_, 0.0D).endVertex();
-        lvt_10_1_.pos((double) p_drawRect_0_, (double) p_drawRect_1_, 0.0D).endVertex();
+        lvt_10_1_.begin(7, VertexFormats.POSITION);
+        lvt_10_1_.vertex((double) p_drawRect_0_, (double) p_drawRect_3_, 0.0D).next();
+        lvt_10_1_.vertex((double) p_drawRect_2_, (double) p_drawRect_3_, 0.0D).next();
+        lvt_10_1_.vertex((double) p_drawRect_2_, (double) p_drawRect_1_, 0.0D).next();
+        lvt_10_1_.vertex((double) p_drawRect_0_, (double) p_drawRect_1_, 0.0D).next();
         lvt_9_1_.draw();
-        GlStateManager.enableTexture2D();
+        GlStateManager.enableTexture();
         GlStateManager.disableBlend();
         GlStateManager.disableAlphaTest();
     }
@@ -82,12 +82,12 @@ public abstract class Control extends Drawable {
         float lvt_7_1_ = 0.00390625F;
         float lvt_8_1_ = 0.00390625F;
         Tessellator lvt_9_1_ = Tessellator.getInstance();
-        BufferBuilder lvt_10_1_ = lvt_9_1_.getBuffer();
-        lvt_10_1_.begin(7, DefaultVertexFormats.POSITION_TEX);
-        lvt_10_1_.pos((double) (x + 0), (double) (y + height), (double) 200).tex((double) ((float) (u + 0) * 0.00390625F), (double) ((float) (v + height) * 0.00390625F)).endVertex();
-        lvt_10_1_.pos((double) (x + width), (double) (y + height), (double) 200).tex((double) ((float) (u + width) * 0.00390625F), (double) ((float) (v + height) * 0.00390625F)).endVertex();
-        lvt_10_1_.pos((double) (x + width), (double) (y + 0), (double) 200).tex((double) ((float) (u + width) * 0.00390625F), (double) ((float) (v + 0) * 0.00390625F)).endVertex();
-        lvt_10_1_.pos((double) (x + 0), (double) (y + 0), (double) 200).tex((double) ((float) (u + 0) * 0.00390625F), (double) ((float) (v + 0) * 0.00390625F)).endVertex();
+        BufferBuilder lvt_10_1_ = lvt_9_1_.getBufferBuilder();
+        lvt_10_1_.begin(7, VertexFormats.POSITION_UV);
+        lvt_10_1_.vertex((double) (x + 0), (double) (y + height), (double) 200).texture((double) ((float) (u + 0) * 0.00390625F), (double) ((float) (v + height) * 0.00390625F)).next();
+        lvt_10_1_.vertex((double) (x + width), (double) (y + height), (double) 200).texture((double) ((float) (u + width) * 0.00390625F), (double) ((float) (v + height) * 0.00390625F)).next();
+        lvt_10_1_.vertex((double) (x + width), (double) (y + 0), (double) 200).texture((double) ((float) (u + width) * 0.00390625F), (double) ((float) (v + 0) * 0.00390625F)).next();
+        lvt_10_1_.vertex((double) (x + 0), (double) (y + 0), (double) 200).texture((double) ((float) (u + 0) * 0.00390625F), (double) ((float) (v + 0) * 0.00390625F)).next();
         lvt_9_1_.draw();
     }
     
@@ -95,12 +95,12 @@ public abstract class Control extends Drawable {
         float lvt_7_1_ = 0.00390625F;
         float lvt_8_1_ = 0.00390625F;
         Tessellator lvt_9_1_ = Tessellator.getInstance();
-        BufferBuilder lvt_10_1_ = lvt_9_1_.getBuffer();
-        lvt_10_1_.begin(7, DefaultVertexFormats.POSITION_TEX);
-        lvt_10_1_.pos((double) (x + 0), (double) (y + height), zLevel).tex((double) ((float) (u + 0) * 0.00390625F), (double) ((float) (v + height) * 0.00390625F)).endVertex();
-        lvt_10_1_.pos((double) (x + width), (double) (y + height), zLevel).tex((double) ((float) (u + width) * 0.00390625F), (double) ((float) (v + height) * 0.00390625F)).endVertex();
-        lvt_10_1_.pos((double) (x + width), (double) (y + 0), zLevel).tex((double) ((float) (u + width) * 0.00390625F), (double) ((float) (v + 0) * 0.00390625F)).endVertex();
-        lvt_10_1_.pos((double) (x + 0), (double) (y + 0), zLevel).tex((double) ((float) (u + 0) * 0.00390625F), (double) ((float) (v + 0) * 0.00390625F)).endVertex();
+        BufferBuilder lvt_10_1_ = lvt_9_1_.getBufferBuilder();
+        lvt_10_1_.begin(7, VertexFormats.POSITION_UV);
+        lvt_10_1_.vertex((double) (x + 0), (double) (y + height), zLevel).texture((double) ((float) (u + 0) * 0.00390625F), (double) ((float) (v + height) * 0.00390625F)).next();
+        lvt_10_1_.vertex((double) (x + width), (double) (y + height), zLevel).texture((double) ((float) (u + width) * 0.00390625F), (double) ((float) (v + height) * 0.00390625F)).next();
+        lvt_10_1_.vertex((double) (x + width), (double) (y + 0), zLevel).texture((double) ((float) (u + width) * 0.00390625F), (double) ((float) (v + 0) * 0.00390625F)).next();
+        lvt_10_1_.vertex((double) (x + 0), (double) (y + 0), zLevel).texture((double) ((float) (u + 0) * 0.00390625F), (double) ((float) (v + 0) * 0.00390625F)).next();
         lvt_9_1_.draw();
     }
     

+ 28 - 29
src/main/java/me/shedaniel/gui/widget/REISlot.java

@@ -2,17 +2,16 @@ package me.shedaniel.gui.widget;
 
 import com.google.common.collect.Lists;
 import me.shedaniel.gui.REIRenderHelper;
-import me.shedaniel.impl.REIRecipeManager;
-import me.shedaniel.listenerdefinitions.IMixinGuiContainer;
+import me.shedaniel.listenerdefinitions.IMixinContainerGui;
 import me.shedaniel.network.CheatPacket;
 import me.shedaniel.network.DeletePacket;
-import net.minecraft.client.Minecraft;
-import net.minecraft.client.gui.inventory.GuiContainer;
-import net.minecraft.client.renderer.RenderHelper;
-import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.gui.ContainerGui;
+import net.minecraft.client.network.ClientPlayerEntity;
+import net.minecraft.client.render.GuiLighting;
 import net.minecraft.item.ItemStack;
-import net.minecraft.util.ResourceLocation;
-import net.minecraft.util.registry.IRegistry;
+import net.minecraft.util.Identifier;
+import net.minecraft.util.registry.Registry;
 
 import java.awt.*;
 import java.util.LinkedList;
@@ -22,7 +21,7 @@ import java.util.List;
  * Created by James on 7/28/2018.
  */
 public class REISlot extends Control {
-    private static final ResourceLocation RECIPE_GUI = new ResourceLocation("almostenoughitems", "textures/gui/recipecontainer.png");
+    private static final Identifier RECIPE_GUI = new Identifier("roughlyenoughitems", "textures/gui/recipecontainer.png");
     private boolean cheatable = false;
     private List<ItemStack> itemList = new LinkedList<>();
     private int itemListPointer = 0;
@@ -85,12 +84,12 @@ public class REISlot extends Control {
     @Override
     public void draw() {
         if (drawBackground) {
-            Minecraft.getInstance().getTextureManager().bindTexture(RECIPE_GUI);
+            MinecraftClient.getInstance().getTextureManager().bindTexture(RECIPE_GUI);
             drawTexturedModalRect(rect.x - 1, rect.y - 1, backgroundUV.x, backgroundUV.y, rect.width, rect.height);
         }
         if (getStack().isEmpty())
             return;
-        RenderHelper.enableGUIStandardItemLighting();
+        GuiLighting.enableForItems();
         
         drawStack(rect.x, rect.y);
         if (isHighlighted())
@@ -105,13 +104,13 @@ public class REISlot extends Control {
     }
     
     private boolean onClick(int button) {
-        EntityPlayer player = Minecraft.getInstance().player;
-        if (REIRenderHelper.reiGui.canCheat() && !(player.inventory.getItemStack().isEmpty())) {
+        ClientPlayerEntity player = MinecraftClient.getInstance().player;
+        if (REIRenderHelper.reiGui.canCheat() && !(player.inventory.getCursorStack().isEmpty())) {
             //Delete the itemstack.
-            Minecraft.getInstance().getConnection().sendPacket(new DeletePacket());
+            MinecraftClient.getInstance().getNetworkHandler().sendPacket(new DeletePacket());
             return true;
         }
-        if (!player.inventory.getItemStack().isEmpty()) {
+        if (!player.inventory.getCursorStack().isEmpty()) {
             return false;
         }
         
@@ -119,11 +118,11 @@ public class REISlot extends Control {
             if (getStack() != null && !getStack().isEmpty()) {
                 ItemStack cheatedStack = getStack().copy();
                 if (button == 0)
-                    cheatedStack.setCount(1);
+                    cheatedStack.setAmount(1);
                 if (button == 1) {
-                    cheatedStack.setCount(cheatedStack.getMaxStackSize());
+                    cheatedStack.setAmount(cheatedStack.getMaxAmount());
                 }
-                Minecraft.getInstance().getConnection().sendPacket(new CheatPacket(cheatedStack));
+                MinecraftClient.getInstance().getNetworkHandler().sendPacket(new CheatPacket(cheatedStack));
                 return true;
             }
         } else {
@@ -134,20 +133,20 @@ public class REISlot extends Control {
     
     
     private void drawStack(int x, int y) {
-        GuiContainer gui = REIRenderHelper.getOverlayedGui();
-        REIRenderHelper.getItemRender().zLevel = 200.0F;
-        REIRenderHelper.getItemRender().renderItemAndEffectIntoGUI(getStack(), x, y);
+        ContainerGui gui = REIRenderHelper.getOverlayedGui();
+        REIRenderHelper.getItemRender().zOffset = 200.0F;
+        REIRenderHelper.getItemRender().renderItemAndGlowInGui(getStack(), x, y);
         assert gui != null;
-        if (((IMixinGuiContainer) gui).getDraggedStack().isEmpty())
-            REIRenderHelper.getItemRender().renderItemOverlayIntoGUI(Minecraft.getInstance().fontRenderer, getStack(), x, y - 0, "");
+        if (((IMixinContainerGui) gui).getDraggedStack().isEmpty())
+            REIRenderHelper.getItemRender().renderItemOverlaysInGUIWithText(MinecraftClient.getInstance().fontRenderer, getStack(), x, y - 0, "");
         else
-            REIRenderHelper.getItemRender().renderItemOverlayIntoGUI(Minecraft.getInstance().fontRenderer, getStack(), x, y - 8, "");
-        REIRenderHelper.getItemRender().zLevel = 0.0F;
+            REIRenderHelper.getItemRender().renderItemOverlaysInGUIWithText(MinecraftClient.getInstance().fontRenderer, getStack(), x, y - 8, "");
+        REIRenderHelper.getItemRender().zOffset = 0.0F;
     }
     
     public String getMod() {
         if (!getStack().isEmpty()) {
-            ResourceLocation location = IRegistry.ITEM.getKey(getStack().getItem());
+            Identifier location = Registry.ITEM.getId(getStack().getItem());
             assert location != null;
             return REIRenderHelper.tryGettingModName(location.getNamespace());
         }
@@ -155,11 +154,11 @@ public class REISlot extends Control {
     }
     
     protected List<String> getTooltip() {
-        Minecraft mc = Minecraft.getInstance();
-        GuiContainer gui = REIRenderHelper.getOverlayedGui();
+        MinecraftClient mc = MinecraftClient.getInstance();
+        ContainerGui gui = REIRenderHelper.getOverlayedGui();
         List<String> toolTip = Lists.newArrayList();
         if (gui != null) {
-            toolTip = gui.getItemToolTip(getStack());
+            toolTip = gui.getStackTooltip(getStack());
         } else {
             toolTip.add(getStack().getDisplayName().getFormattedText());
         }

+ 8 - 9
src/main/java/me/shedaniel/gui/widget/Tab.java

@@ -1,10 +1,9 @@
 package me.shedaniel.gui.widget;
 
+import com.mojang.blaze3d.platform.GlStateManager;
 import me.shedaniel.gui.REIRenderHelper;
-import net.minecraft.client.Minecraft;
-import net.minecraft.client.renderer.GlStateManager;
-import net.minecraft.client.renderer.ItemRenderer;
-import net.minecraft.item.Item;
+import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.render.item.ItemRenderer;
 import net.minecraft.item.ItemStack;
 
 import java.awt.*;
@@ -22,7 +21,7 @@ public class Tab extends Control {
         super(x, y, width, height);
         this.id = id;
         this.guiLeft = guiLeft;
-        itemRender = Minecraft.getInstance().getItemRenderer();
+        itemRender = MinecraftClient.getInstance().getItemRenderer();
     }
     
     public void moveTo(int guiLeft, int x, int y) {
@@ -79,13 +78,13 @@ public class Tab extends Control {
             GlStateManager.disableLighting();
             this.drawTexturedModalRect(rect.x, rect.y - (selected ? 0 : 2), 28, (selected ? 32 : 0), 28, (selected ? 32 : 31));
             this.zLevel = 100.0F;
-            this.itemRender.zLevel = 100.0F;
+            this.itemRender.zOffset = 100.0F;
             GlStateManager.enableLighting();
             GlStateManager.enableRescaleNormal();
-            this.itemRender.renderItemAndEffectIntoGUI(getItemStack(), l, i1);
-            this.itemRender.renderItemOverlays(Minecraft.getInstance().fontRenderer, getItemStack(), l, i1);
+            this.itemRender.renderItemAndGlowInGui(getItemStack(), l, i1);
+            this.itemRender.renderItemOverlaysInGUI(MinecraftClient.getInstance().fontRenderer, getItemStack(), l, i1);
             GlStateManager.disableLighting();
-            this.itemRender.zLevel = 0.0F;
+            this.itemRender.zOffset = 0.0F;
             this.zLevel = 0.0F;
             if (isHighlighted())
                 drawTooltip();

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

@@ -1,7 +1,7 @@
 package me.shedaniel.gui.widget;
 
 import me.shedaniel.gui.REIRenderHelper;
-import net.minecraft.client.gui.GuiTextField;
+import net.minecraft.client.gui.widget.TextFieldWidget;
 
 import java.awt.*;
 
@@ -10,11 +10,11 @@ import java.awt.*;
  */
 public class TextBox extends Control implements IFocusable {
     
-    private GuiTextField textField;
+    private TextFieldWidget textField;
     
     public TextBox(int x, int y, int width, int height) {
         super(x, y, width, height);
-        textField = new GuiTextField(-1, REIRenderHelper.getFontRenderer(), x, y, width, height);
+        textField = new TextFieldWidget(-1, REIRenderHelper.getFontRenderer(), x, y, width, height);
         this.onClick = this::doMouseClick;
         this.onKeyDown = this::onKeyPressed;
         this.charPressed = this::charTyped;
@@ -22,7 +22,7 @@ public class TextBox extends Control implements IFocusable {
     
     @Override
     public void draw() {
-        textField.drawTextField(0, 0, 0);
+        textField.render(0, 0, 0);
     }
     
     @Override

+ 14 - 8
src/main/java/me/shedaniel/gui/widget/WidgetArrow.java

@@ -1,26 +1,32 @@
 package me.shedaniel.gui.widget;
 
-import net.minecraft.client.Minecraft;
-import net.minecraft.client.renderer.GlStateManager;
-import net.minecraft.client.renderer.RenderHelper;
-import net.minecraft.util.ResourceLocation;
+import com.mojang.blaze3d.platform.GlStateManager;
+import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.render.GuiLighting;
+import net.minecraft.util.Identifier;
 
 public class WidgetArrow extends Control {
-    private static final ResourceLocation RECIPE_GUI = new ResourceLocation("almostenoughitems", "textures/gui/recipecontainer.png");
+    private static final Identifier RECIPE_GUI = new Identifier("roughlyenoughitems", "textures/gui/recipecontainer.png");
     private int progress = 0;
     private int updateTick = 0;
+    private final int speed;
     private boolean animated;
     
     public WidgetArrow(int x, int y, boolean animated) {
+        this(x, y, animated, 20);
+    }
+    
+    public WidgetArrow(int x, int y, boolean animated, int speed) {
         super(x, y, 22, 18);
         this.animated = animated;
+        this.speed = speed;
     }
     
     @Override
     public void draw() {
         GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F);
-        RenderHelper.disableStandardItemLighting();
-        Minecraft.getInstance().getTextureManager().bindTexture(RECIPE_GUI);
+        GuiLighting.disable();
+        MinecraftClient.getInstance().getTextureManager().bindTexture(RECIPE_GUI);
         this.drawTexturedModalRect(rect.x, rect.y, 18, 222, 22, 18);
         if (animated) {
             int width = (int) ((progress / 10f) * 22);
@@ -31,7 +37,7 @@ public class WidgetArrow extends Control {
     @Override
     public void tick() {
         updateTick++;
-        if (updateTick >= 20) {
+        if (updateTick >= speed) {
             updateTick = 0;
             
             progress++;

+ 11 - 11
src/main/java/me/shedaniel/impl/REIRecipeManager.java

@@ -1,15 +1,15 @@
 package me.shedaniel.impl;
 
-import me.shedaniel.api.IREIPlugin;
+import me.shedaniel.Core;
 import me.shedaniel.api.IDisplayCategory;
+import me.shedaniel.api.IREIPlugin;
 import me.shedaniel.api.IRecipe;
 import me.shedaniel.api.IRecipeManager;
 import me.shedaniel.gui.RecipeGui;
-import net.minecraft.client.Minecraft;
+import net.minecraft.client.MinecraftClient;
 import net.minecraft.item.Item;
 import net.minecraft.item.ItemStack;
-import net.minecraft.item.crafting.RecipeManager;
-import org.dimdev.riftloader.RiftLoader;
+import net.minecraft.recipe.RecipeManager;
 
 import java.util.HashMap;
 import java.util.LinkedList;
@@ -78,7 +78,7 @@ public class REIRecipeManager implements IRecipeManager {
             for(IRecipe iRecipe : value) {
                 for(Object o : iRecipe.getOutput()) {
                     if (o instanceof ItemStack) {
-                        if (ItemStack.areItemsEqual(stack, (ItemStack) o)) {
+                        if (ItemStack.areEqualIgnoreTags(stack, (ItemStack) o)) {
                             for(IDisplayCategory iDisplayCategory : categories.keySet()) {
                                 if (iDisplayCategory.getId() == iRecipe.getId()) {
                                     categories.get(iDisplayCategory).add(iRecipe);
@@ -103,7 +103,7 @@ public class REIRecipeManager implements IRecipeManager {
                     List<ItemStack> input = (List<ItemStack>) o;
                     
                     for(ItemStack itemStack : input) {
-                        if (ItemStack.areItemsEqual(itemStack, stack)) {
+                        if (ItemStack.areEqualIgnoreTags(itemStack, stack)) {
                             for(IDisplayCategory iDisplayCategory : categories.keySet()) {
                                 if (iDisplayCategory.getId() == iRecipe.getId()) {
                                     categories.get(iDisplayCategory).add(iRecipe);
@@ -136,22 +136,22 @@ public class REIRecipeManager implements IRecipeManager {
         recipeList.clear();
         displayAdapters.clear();
         REIRecipeManager.instance().recipeManager = manager;
-        RiftLoader.instance.getListeners(IREIPlugin.class).forEach(IREIPlugin::register);
+        Core.getListeners(IREIPlugin.class).forEach(IREIPlugin::register);
     }
     
     public void displayRecipesFor(ItemStack stack) {
         Map<IDisplayCategory, List<IRecipe>> recipes = REIRecipeManager.instance().getRecipesFor(stack);
         if (recipes.isEmpty())
             return;
-        RecipeGui gui = new RecipeGui(null, Minecraft.getInstance().currentScreen, recipes);
-        Minecraft.getInstance().displayGuiScreen(gui);
+        RecipeGui gui = new RecipeGui(null, MinecraftClient.getInstance().currentGui, recipes);
+        MinecraftClient.getInstance().openGui(gui);
     }
     
     public void displayUsesFor(ItemStack stack) {
         Map<IDisplayCategory, List<IRecipe>> recipes = REIRecipeManager.instance().getUsesFor(stack);
         if (recipes.isEmpty())
             return;
-        RecipeGui gui = new RecipeGui(null, Minecraft.getInstance().currentScreen, recipes);
-        Minecraft.getInstance().displayGuiScreen(gui);
+        RecipeGui gui = new RecipeGui(null, MinecraftClient.getInstance().currentGui, recipes);
+        MinecraftClient.getInstance().openGui(gui);
     }
 }

+ 5 - 5
src/main/java/me/shedaniel/library/KeyBindManager.java

@@ -1,10 +1,10 @@
 package me.shedaniel.library;
 
+import me.shedaniel.listenerdefinitions.KeybindHandler;
 import me.shedaniel.listenerdefinitions.PreLoadOptions;
-import net.minecraft.client.Minecraft;
+import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.settings.KeyBinding;
 import org.apache.commons.lang3.ArrayUtils;
-import org.dimdev.rift.listener.client.KeybindHandler;
 
 import java.util.*;
 
@@ -21,7 +21,7 @@ public class KeyBindManager implements PreLoadOptions, KeybindHandler {
         KeyBinding newBinding;
         newBinding = new KeyBinding(bindingName, key, categoryName);
         if (optionsLoaded) {
-            ArrayUtils.add(Minecraft.getInstance().gameSettings.keyBindings, newBinding);
+            ArrayUtils.add(MinecraftClient.getInstance().options.keysAll, newBinding);
         } else {
             bindingsToAdd.add(newBinding);
         }
@@ -44,11 +44,11 @@ public class KeyBindManager implements PreLoadOptions, KeybindHandler {
     
     @Override
     public void processKeybinds() {
-        bindingFunctions.keySet().stream().filter(KeyBinding::isPressed).forEach(f -> bindingFunctions.get(f).Sink());
+        bindingFunctions.keySet().stream().filter(KeyBinding::method_1434).forEach(f -> bindingFunctions.get(f).Sink()); //isPressed
     }
     
     public static boolean processGuiKeybinds(int typedChar) {
-        Optional<KeyBinding> binding = bindingFunctions.keySet().stream().filter(f -> f.getDefault().getKeyCode() == typedChar).findFirst();
+        Optional<KeyBinding> binding = bindingFunctions.keySet().stream().filter(f -> f.getDefaultKeyCode().getKeyCode() == typedChar).findFirst();
         if (binding.isPresent()) {
             bindingFunctions.get(binding.get()).Sink();
             return true;

+ 1 - 1
src/main/java/me/shedaniel/listenerdefinitions/CharInput.java

@@ -3,7 +3,7 @@ package me.shedaniel.listenerdefinitions;
 /**
  * Created by James on 8/4/2018.
  */
-public interface CharInput {
+public interface CharInput extends IEvent {
     
     public boolean charInput(long p_onCharEvent_1_, int p_onCharEvent_3_, int p_onCharEvent_4_);
 }

+ 5 - 0
src/main/java/me/shedaniel/listenerdefinitions/ClientTickable.java

@@ -0,0 +1,5 @@
+package me.shedaniel.listenerdefinitions;
+
+public interface ClientTickable extends IEvent {
+    public void clientTick();
+}

+ 1 - 1
src/main/java/me/shedaniel/listenerdefinitions/DoneLoading.java

@@ -3,6 +3,6 @@ package me.shedaniel.listenerdefinitions;
 /**
  * Created by James on 7/27/2018.
  */
-public interface DoneLoading {
+public interface DoneLoading extends IEvent {
     void onDoneLoading();
 }

+ 3 - 3
src/main/java/me/shedaniel/listenerdefinitions/DrawContainer.java

@@ -1,10 +1,10 @@
 package me.shedaniel.listenerdefinitions;
 
-import net.minecraft.client.gui.inventory.GuiContainer;
+import net.minecraft.client.gui.ContainerGui;
 
 /**
  * Created by James on 7/27/2018.
  */
-public interface DrawContainer {
-    public void draw(int mouseX, int mouseY, float dunno, GuiContainer gui);
+public interface DrawContainer extends IEvent {
+    public void draw(int mouseX, int mouseY, float dunno, ContainerGui gui);
 }

+ 1 - 1
src/main/java/me/shedaniel/listenerdefinitions/GuiCickListener.java

@@ -3,6 +3,6 @@ package me.shedaniel.listenerdefinitions;
 /**
  * Created by James on 7/29/2018.
  */
-public interface GuiCickListener {
+public interface GuiCickListener extends IEvent {
     public boolean onClick(int x, int y, int button);
 }

+ 1 - 1
src/main/java/me/shedaniel/listenerdefinitions/GuiKeyDown.java

@@ -3,7 +3,7 @@ package me.shedaniel.listenerdefinitions;
 /**
  * Created by James on 8/3/2018.
  */
-public interface GuiKeyDown {
+public interface GuiKeyDown extends IEvent {
     
     public boolean keyDown(int p_keyPressed_1_, int p_keyPressed_2_, int p_keyPressed_3_);
 }

+ 4 - 0
src/main/java/me/shedaniel/listenerdefinitions/IEvent.java

@@ -0,0 +1,4 @@
+package me.shedaniel.listenerdefinitions;
+
+public interface IEvent {
+}

+ 2 - 2
src/main/java/me/shedaniel/listenerdefinitions/IMixinGuiContainer.java → src/main/java/me/shedaniel/listenerdefinitions/IMixinContainerGui.java

@@ -1,9 +1,9 @@
 package me.shedaniel.listenerdefinitions;
 
-import net.minecraft.inventory.Slot;
+import net.minecraft.container.Slot;
 import net.minecraft.item.ItemStack;
 
-public interface IMixinGuiContainer {
+public interface IMixinContainerGui {
     public ItemStack getDraggedStack();
     
     public int getGuiLeft();

+ 7 - 0
src/main/java/me/shedaniel/listenerdefinitions/KeybindHandler.java

@@ -0,0 +1,7 @@
+package me.shedaniel.listenerdefinitions;
+
+public interface KeybindHandler extends IEvent {
+    
+    public void processKeybinds();
+    
+}

+ 1 - 1
src/main/java/me/shedaniel/listenerdefinitions/MinecraftResize.java

@@ -3,6 +3,6 @@ package me.shedaniel.listenerdefinitions;
 /**
  * Created by James on 7/28/2018.
  */
-public interface MinecraftResize {
+public interface MinecraftResize extends IEvent {
     public void resize(int scaledWidth, int scaledHeight);
 }

+ 1 - 1
src/main/java/me/shedaniel/listenerdefinitions/MouseScrollListener.java

@@ -1,5 +1,5 @@
 package me.shedaniel.listenerdefinitions;
 
-public interface MouseScrollListener {
+public interface MouseScrollListener extends IEvent {
     public boolean mouseScrolled(double direction);
 }

+ 21 - 0
src/main/java/me/shedaniel/listenerdefinitions/PacketAdder.java

@@ -0,0 +1,21 @@
+package me.shedaniel.listenerdefinitions;
+
+import net.minecraft.network.NetworkSide;
+import net.minecraft.network.NetworkState;
+import net.minecraft.network.Packet;
+
+public interface PacketAdder extends IEvent {
+    
+    interface PacketRegistrationReceiver {
+        NetworkState registerPacket(NetworkSide direction, Class<? extends Packet<?>> packetClass);
+    }
+    
+    void registerHandshakingPackets(PacketRegistrationReceiver receiver);
+    
+    void registerPlayPackets(PacketRegistrationReceiver receiver);
+    
+    void registerStatusPackets(PacketRegistrationReceiver receiver);
+    
+    void registerLoginPackets(PacketRegistrationReceiver receiver);
+    
+}

+ 3 - 3
src/main/java/me/shedaniel/listenerdefinitions/PotionCraftingAdder.java

@@ -1,8 +1,8 @@
 package me.shedaniel.listenerdefinitions;
 
 import net.minecraft.item.Item;
-import net.minecraft.potion.PotionType;
+import net.minecraft.potion.Potion;
 
-public interface PotionCraftingAdder {
-    public void addPotionRecipe(PotionType inputType, Item reagent, PotionType outputType);
+public interface PotionCraftingAdder extends IEvent {
+    public void addPotionRecipe(Potion inputType, Item reagent, Potion outputType);
 }

+ 1 - 1
src/main/java/me/shedaniel/listenerdefinitions/PreLoadOptions.java

@@ -4,6 +4,6 @@ import net.minecraft.client.settings.KeyBinding;
 
 import java.util.List;
 
-public interface PreLoadOptions {
+public interface PreLoadOptions extends IEvent {
     public List<KeyBinding> loadOptions();
 }

+ 2 - 2
src/main/java/me/shedaniel/listenerdefinitions/RecipeLoadListener.java

@@ -1,7 +1,7 @@
 package me.shedaniel.listenerdefinitions;
 
-import net.minecraft.item.crafting.RecipeManager;
+import net.minecraft.recipe.RecipeManager;
 
-public interface RecipeLoadListener {
+public interface RecipeLoadListener extends IEvent {
     public void recipesLoaded(RecipeManager recipeManager);
 }

+ 20 - 20
src/main/java/me/shedaniel/listeners/DrawContainerListener.java

@@ -2,20 +2,20 @@ package me.shedaniel.listeners;
 
 import me.shedaniel.gui.REIRenderHelper;
 import me.shedaniel.listenerdefinitions.*;
-import net.minecraft.client.Minecraft;
-import net.minecraft.client.gui.GuiScreen;
-import net.minecraft.client.gui.inventory.GuiContainer;
-import net.minecraft.client.gui.inventory.GuiContainerCreative;
+import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.gui.ContainerGui;
+import net.minecraft.client.gui.Gui;
+import net.minecraft.client.gui.ingame.CreativePlayerInventoryGui;
 import net.minecraft.item.ItemGroup;
-import org.dimdev.rift.listener.client.ClientTickable;
 
 /**
  * Created by James on 7/27/2018.
  */
 public class DrawContainerListener implements DrawContainer, GuiCickListener, GuiKeyDown, CharInput, ClientTickable, MouseScrollListener {
+    
     @Override
-    public void draw(int x, int y, float dunno, GuiContainer gui) {
-        if (!(gui instanceof GuiContainerCreative) || ((GuiContainerCreative) gui).getSelectedTabIndex() == ItemGroup.INVENTORY.getIndex()) {
+    public void draw(int x, int y, float dunno, ContainerGui gui) {
+        if (!(gui instanceof CreativePlayerInventoryGui) || ((CreativePlayerInventoryGui) gui).method_2469() == ItemGroup.INVENTORY.getId()) {
             REIRenderHelper.setMouseLoc(x, y);
             REIRenderHelper.drawREI(gui);
         }
@@ -23,38 +23,38 @@ public class DrawContainerListener implements DrawContainer, GuiCickListener, Gu
     
     @Override
     public boolean onClick(int x, int y, int button) {
-        GuiScreen gui = Minecraft.getInstance().currentScreen;
-        if (!(gui instanceof GuiContainerCreative) || ((GuiContainerCreative) gui).getSelectedTabIndex() == ItemGroup.INVENTORY.getIndex())
+        Gui gui = MinecraftClient.getInstance().currentGui;
+        if (!(gui instanceof CreativePlayerInventoryGui) || ((CreativePlayerInventoryGui) gui).method_2469() == ItemGroup.INVENTORY.getId())
             return REIRenderHelper.mouseClick(x, y, button);
         return false;
     }
     
     @Override
     public boolean keyDown(int p_keyPressed_1_, int p_keyPressed_2_, int p_keyPressed_3_) {
-        GuiScreen gui = Minecraft.getInstance().currentScreen;
-        if (!(gui instanceof GuiContainerCreative) || ((GuiContainerCreative) gui).getSelectedTabIndex() == ItemGroup.INVENTORY.getIndex())
+        Gui gui = MinecraftClient.getInstance().currentGui;
+        if (!(gui instanceof CreativePlayerInventoryGui) || ((CreativePlayerInventoryGui) gui).method_2469() == ItemGroup.INVENTORY.getId())
             return REIRenderHelper.keyDown(p_keyPressed_1_, p_keyPressed_2_, p_keyPressed_3_);
         return false;
     }
     
     @Override
     public boolean charInput(long p_onCharEvent_1_, int p_onCharEvent_3_, int p_onCharEvent_4_) {
-        GuiScreen gui = Minecraft.getInstance().currentScreen;
-        if (!(gui instanceof GuiContainerCreative) || ((GuiContainerCreative) gui).getSelectedTabIndex() == ItemGroup.INVENTORY.getIndex())
+        Gui gui = MinecraftClient.getInstance().currentGui;
+        if (!(gui instanceof CreativePlayerInventoryGui) || ((CreativePlayerInventoryGui) gui).method_2469() == ItemGroup.INVENTORY.getId())
             return REIRenderHelper.charInput(p_onCharEvent_1_, p_onCharEvent_3_, p_onCharEvent_4_);
         return false;
     }
     
-    @Override
-    public void clientTick(final Minecraft minecraft) {
-        REIRenderHelper.tick();
-    }
-    
     @Override
     public boolean mouseScrolled(double direction) {
-        GuiScreen gui = Minecraft.getInstance().currentScreen;
-        if (!(gui instanceof GuiContainerCreative) || ((GuiContainerCreative) gui).getSelectedTabIndex() == ItemGroup.INVENTORY.getIndex())
+        Gui gui = MinecraftClient.getInstance().currentGui;
+        if (!(gui instanceof CreativePlayerInventoryGui) || ((CreativePlayerInventoryGui) gui).method_2469() == ItemGroup.INVENTORY.getId())
             return REIRenderHelper.mouseScrolled(direction);
         return false;
     }
+    
+    @Override
+    public void clientTick() {
+        REIRenderHelper.tick();
+    }
 }

+ 0 - 21
src/main/java/me/shedaniel/listeners/InitListener.java

@@ -1,21 +0,0 @@
-package me.shedaniel.listeners;
-
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
-import org.dimdev.riftloader.listener.InitializationListener;
-import org.spongepowered.asm.launch.MixinBootstrap;
-import org.spongepowered.asm.mixin.Mixins;
-
-/**
- * Created by James on 7/27/2018.
- */
-public class InitListener implements InitializationListener {
-    private static final Logger LOGGER = LogManager.getLogger();
-    
-    @Override
-    public void onInitialization() {
-        LOGGER.info("Adding REI Mixins");
-        MixinBootstrap.init();
-        Mixins.addConfiguration("mixins.roughlyenoughitems.json");
-    }
-}

+ 22 - 0
src/main/java/me/shedaniel/mixins/MixinBrewingRecipeRegistry.java

@@ -0,0 +1,22 @@
+package me.shedaniel.mixins;
+
+import me.shedaniel.Core;
+import me.shedaniel.listenerdefinitions.PotionCraftingAdder;
+import net.minecraft.item.Item;
+import net.minecraft.potion.Potion;
+import net.minecraft.recipe.BrewingRecipeRegistry;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.Inject;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+
+@Mixin(BrewingRecipeRegistry.class)
+public class MixinBrewingRecipeRegistry {
+    
+    @Inject(method = "registerPotionRecipe", at = @At("RETURN"))
+    private static void registerPotionRecipe(Potion potion_1, Item item_1, Potion potion_2, CallbackInfo info) {
+        System.out.println("a");
+        Core.getListeners(PotionCraftingAdder.class).forEach(potionCraftingAdder -> potionCraftingAdder.addPotionRecipe(potion_1, item_1, potion_2));
+    }
+    
+}

+ 5 - 6
src/main/java/me/shedaniel/mixins/MixinDoneLoading.java

@@ -1,8 +1,8 @@
 package me.shedaniel.mixins;
 
+import me.shedaniel.Core;
 import me.shedaniel.listenerdefinitions.DoneLoading;
-import net.minecraft.init.Bootstrap;
-import org.dimdev.riftloader.RiftLoader;
+import net.minecraft.Bootstrap;
 import org.spongepowered.asm.mixin.Mixin;
 import org.spongepowered.asm.mixin.injection.At;
 import org.spongepowered.asm.mixin.injection.Inject;
@@ -13,10 +13,9 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
  */
 @Mixin(Bootstrap.class)
 public class MixinDoneLoading {
-    @Inject(method = "register", at = @At("RETURN"))
+    @Inject(method = "initialize", at = @At("RETURN"))
     private static void onBootstrapRegister(CallbackInfo ci) {
-        for(DoneLoading listener : RiftLoader.instance.getListeners(DoneLoading.class)) {
-            listener.onDoneLoading();
-        }
+        System.out.println("Done Loading");
+        Core.getListeners(DoneLoading.class).forEach(DoneLoading::onDoneLoading);
     }
 }

+ 23 - 23
src/main/java/me/shedaniel/mixins/MixinGuiContainer.java

@@ -1,12 +1,12 @@
 package me.shedaniel.mixins;
 
+import me.shedaniel.Core;
 import me.shedaniel.listenerdefinitions.*;
-import net.minecraft.client.Minecraft;
-import net.minecraft.client.gui.IGuiEventListenerDeferred;
-import net.minecraft.client.gui.inventory.GuiContainer;
-import net.minecraft.inventory.Slot;
+import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.gui.ContainerGui;
+import net.minecraft.client.gui.GuiEventListener;
+import net.minecraft.container.Slot;
 import net.minecraft.item.ItemStack;
-import org.dimdev.riftloader.RiftLoader;
 import org.spongepowered.asm.mixin.Mixin;
 import org.spongepowered.asm.mixin.Shadow;
 import org.spongepowered.asm.mixin.injection.At;
@@ -17,32 +17,32 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
 /**
  * Created by James on 7/27/2018.
  */
-@Mixin(GuiContainer.class)
-public abstract class MixinGuiContainer implements IGuiEventListenerDeferred, IMixinGuiContainer {
+@Mixin(ContainerGui.class)
+public abstract class MixinGuiContainer implements GuiEventListener, IMixinContainerGui {
     @Shadow
-    protected Slot hoveredSlot;
+    protected Slot focusedSlot;
     @Shadow
-    private ItemStack draggedStack;
+    private ItemStack field_2782; //draggedStack
     @Shadow
-    protected int guiLeft;
+    protected int left;
     @Shadow
-    protected int guiTop;
+    protected int top;
     @Shadow
-    protected int xSize;
+    protected int containerWidth;
     @Shadow
-    protected int ySize;
+    protected int containerHeight;
     
-    @Inject(method = "render", at = @At("RETURN"))
+    @Inject(method = "draw", at = @At("RETURN"))
     private void onRender(int p_drawScreen_1_, int p_drawScreen_2_, float p_drawScreen_3_, CallbackInfo ci) {
-        for(DrawContainer listener : RiftLoader.instance.getListeners(DrawContainer.class)) {
-            listener.draw(p_drawScreen_1_, p_drawScreen_2_, p_drawScreen_3_, (GuiContainer) Minecraft.getInstance().currentScreen);
+        for(DrawContainer listener : Core.getListeners(DrawContainer.class)) {
+            listener.draw(p_drawScreen_1_, p_drawScreen_2_, p_drawScreen_3_, (ContainerGui) MinecraftClient.getInstance().currentGui);
         }
     }
     
     @Inject(method = "mouseClicked", at = @At("HEAD"), cancellable = true)
     private void onMouseClicked(double p_mouseClicked_1_, double p_mouseClicked_3_, int p_mouseClicked_5_, CallbackInfoReturnable<Boolean> ci) {
         boolean handled = false;
-        for(GuiCickListener listener : RiftLoader.instance.getListeners(GuiCickListener.class)) {
+        for(GuiCickListener listener : Core.getListeners(GuiCickListener.class)) {
             if (listener.onClick((int) p_mouseClicked_1_, (int) p_mouseClicked_3_, p_mouseClicked_5_)) {
                 ci.setReturnValue(true);
                 handled = true;
@@ -56,7 +56,7 @@ public abstract class MixinGuiContainer implements IGuiEventListenerDeferred, IM
     @Inject(method = "keyPressed", at = @At("HEAD"), cancellable = true)
     private void onKeyPressed(int p_keyPressed_1_, int p_keyPressed_2_, int p_keyPressed_3_, CallbackInfoReturnable<Boolean> ci) {
         boolean handled = false;
-        for(GuiKeyDown listener : RiftLoader.instance.getListeners(GuiKeyDown.class)) {
+        for(GuiKeyDown listener : Core.getListeners(GuiKeyDown.class)) {
             if (listener.keyDown(p_keyPressed_1_, p_keyPressed_2_, p_keyPressed_3_))
                 handled = true;
         }
@@ -68,7 +68,7 @@ public abstract class MixinGuiContainer implements IGuiEventListenerDeferred, IM
     
     public boolean mouseScrolled(double p_mouseScrolled_1_) {
         boolean handled = false;
-        for(MouseScrollListener listener : RiftLoader.instance.getListeners(MouseScrollListener.class)) {
+        for(MouseScrollListener listener : Core.getListeners(MouseScrollListener.class)) {
             if (listener.mouseScrolled(p_mouseScrolled_1_)) {
                 handled = true;
             }
@@ -78,21 +78,21 @@ public abstract class MixinGuiContainer implements IGuiEventListenerDeferred, IM
     
     @Override
     public ItemStack getDraggedStack() {
-        return draggedStack;
+        return field_2782;
     }
     
     @Override
     public int getGuiLeft() {
-        return guiLeft;
+        return left;
     }
     
     @Override
     public int getXSize() {
-        return xSize;
+        return containerWidth;
     }
     
     @Override
     public Slot getHoveredSlot() {
-        return hoveredSlot;
+        return focusedSlot;
     }
 }

+ 38 - 39
src/main/java/me/shedaniel/mixins/MixinGuiContainerCreative.java

@@ -1,76 +1,75 @@
 package me.shedaniel.mixins;
 
+import me.shedaniel.Core;
 import me.shedaniel.listenerdefinitions.GuiKeyDown;
-import net.minecraft.client.gui.GuiTextField;
-import net.minecraft.client.gui.inventory.GuiContainerCreative;
-import net.minecraft.client.renderer.InventoryEffectRenderer;
-import net.minecraft.inventory.Container;
-import net.minecraft.inventory.Slot;
+import net.minecraft.client.gui.ingame.AbstractPlayerInventoryGui;
+import net.minecraft.client.gui.ingame.CreativePlayerInventoryGui;
+import net.minecraft.client.gui.widget.TextFieldWidget;
+import net.minecraft.container.Container;
+import net.minecraft.container.Slot;
 import net.minecraft.item.ItemGroup;
 import net.minecraft.util.math.MathHelper;
-import org.dimdev.riftloader.RiftLoader;
 import org.spongepowered.asm.mixin.Mixin;
 import org.spongepowered.asm.mixin.Overwrite;
 import org.spongepowered.asm.mixin.Shadow;
 
-import javax.annotation.Nullable;
 import java.util.Objects;
 
-@Mixin(GuiContainerCreative.class)
-public abstract class MixinGuiContainerCreative extends InventoryEffectRenderer {
+@Mixin(CreativePlayerInventoryGui.class)
+public abstract class MixinGuiContainerCreative extends AbstractPlayerInventoryGui {
     
     @Shadow
-    private static int selectedTabIndex = ItemGroup.BUILDING_BLOCKS.getIndex();
+    private boolean field_2888;
+    
     @Shadow
-    private GuiTextField searchField;
+    public abstract int method_2469();
     
     @Shadow
-    protected abstract boolean hasTmpInventory(@Nullable Slot p_208018_1_);
+    protected abstract void setSelectedTab(ItemGroup itemGroup_1);
     
     @Shadow
-    protected abstract void setCurrentCreativeTab(ItemGroup tab);
+    protected abstract boolean method_2470(Slot slot_1);
     
     @Shadow
-    protected abstract void updateCreativeSearch();
+    private TextFieldWidget searchBox;
     
     @Shadow
-    private boolean field_195377_F;
+    protected abstract void method_2464();
     
     @Shadow
-    protected abstract boolean needsScrollBars();
+    protected abstract boolean doRenderScrollBar();
     
     @Shadow
-    private float currentScroll;
+    private float scrollPosition;
     
-    public MixinGuiContainerCreative(Container inventorySlotsIn) {
-        super(inventorySlotsIn);
+    public MixinGuiContainerCreative(Container container_1) {
+        super(container_1);
     }
     
     @Overwrite
     public boolean keyPressed(int p_keyPressed_1_, int p_keyPressed_2_, int p_keyPressed_3_) {
-        this.field_195377_F = false;
-        if (selectedTabIndex != ItemGroup.SEARCH.getIndex()) {
-            if (selectedTabIndex != ItemGroup.INVENTORY.getIndex()) {
-                if (this.mc.gameSettings.keyBindChat.matchesKey(p_keyPressed_1_, p_keyPressed_2_)) {
-                    this.field_195377_F = true;
-                    this.setCurrentCreativeTab(ItemGroup.SEARCH);
+        this.field_2888 = false;
+        if (method_2469() != ItemGroup.SEARCH.getId()) {
+            if (method_2469() != ItemGroup.INVENTORY.getId()) {
+                if (this.client.options.keyChat.matches(p_keyPressed_1_, p_keyPressed_2_)) {
+                    this.field_2888 = true;
+                    this.setSelectedTab(ItemGroup.SEARCH);
                     return true;
                 }
-            } else for(GuiKeyDown listener : RiftLoader.instance.getListeners(GuiKeyDown.class))
+            } else for(GuiKeyDown listener : Core.getListeners(GuiKeyDown.class))
                 if (listener.keyDown(p_keyPressed_1_, p_keyPressed_2_, p_keyPressed_3_))
                     return true;
         } else {
-            boolean flag = !this.hasTmpInventory(this.hoveredSlot) || this.hoveredSlot != null && this.hoveredSlot.getHasStack();
-            
-            if (flag && this.func_195363_d(p_keyPressed_1_, p_keyPressed_2_)) {
-                this.field_195377_F = true;
+            boolean flag = !this.method_2470(this.focusedSlot) || this.focusedSlot != null && this.focusedSlot.hasStack();
+            if (flag && this.handleHotbarKeyPressed(p_keyPressed_1_, p_keyPressed_2_)) {
+                this.field_2888 = true;
                 return true;
             } else {
-                String s = this.searchField.getText();
+                String s = this.searchBox.getText();
                 
-                if (this.searchField.keyPressed(p_keyPressed_1_, p_keyPressed_2_, p_keyPressed_3_)) {
-                    if (!Objects.equals(s, this.searchField.getText()))
-                        this.updateCreativeSearch();
+                if (this.searchBox.keyPressed(p_keyPressed_1_, p_keyPressed_2_, p_keyPressed_3_)) {
+                    if (!Objects.equals(s, this.searchBox.getText()))
+                        this.method_2464();
                     return true;
                 }
             }
@@ -80,13 +79,13 @@ public abstract class MixinGuiContainerCreative extends InventoryEffectRenderer
     
     @Overwrite
     public boolean mouseScrolled(double p_mouseScrolled_1_) {
-        if (!this.needsScrollBars()) {
+        if (!this.doRenderScrollBar()) {
             return super.mouseScrolled(p_mouseScrolled_1_);
         } else {
-            int i = (((GuiContainerCreative.ContainerCreative) this.inventorySlots).itemList.size() + 9 - 1) / 9 - 5;
-            this.currentScroll = (float) ((double) this.currentScroll - p_mouseScrolled_1_ / (double) i);
-            this.currentScroll = MathHelper.clamp(this.currentScroll, 0.0F, 1.0F);
-            ((GuiContainerCreative.ContainerCreative) this.inventorySlots).scrollTo(this.currentScroll);
+            int i = (((CreativePlayerInventoryGui.CreativeContainer) this.container).itemList.size() + 9 - 1) / 9 - 5;
+            this.scrollPosition = (float) ((double) this.scrollPosition - p_mouseScrolled_1_ / (double) i);
+            this.scrollPosition = MathHelper.clamp(this.scrollPosition, 0.0F, 1.0F);
+            ((CreativePlayerInventoryGui.CreativeContainer) this.container).method_2473(this.scrollPosition);
             return true;
         }
     }

+ 5 - 5
src/main/java/me/shedaniel/mixins/MixinKeyboardListener.java

@@ -1,8 +1,8 @@
 package me.shedaniel.mixins;
 
+import me.shedaniel.Core;
 import me.shedaniel.listenerdefinitions.CharInput;
-import net.minecraft.client.KeyboardListener;
-import org.dimdev.riftloader.RiftLoader;
+import net.minecraft.client.Keyboard;
 import org.spongepowered.asm.mixin.Mixin;
 import org.spongepowered.asm.mixin.injection.At;
 import org.spongepowered.asm.mixin.injection.Inject;
@@ -11,12 +11,12 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
 /**
  * Created by James on 8/4/2018.
  */
-@Mixin(KeyboardListener.class)
+@Mixin(Keyboard.class)
 public class MixinKeyboardListener {
-    @Inject(method = "onCharEvent", at = @At("RETURN"), cancellable = true)
+    @Inject(method = "onChar", at = @At("RETURN"), cancellable = true)
     private void onCharEvent(long p_onCharEvent_1_, int p_onCharEvent_3_, int p_onCharEvent_4_, CallbackInfo ci) {
         boolean handled = false;
-        for(CharInput listener : RiftLoader.instance.getListeners(CharInput.class)) {
+        for(CharInput listener : Core.getListeners(CharInput.class)) {
             if (listener.charInput(p_onCharEvent_1_, p_onCharEvent_3_, p_onCharEvent_4_)) {
                 handled = true;
             }

+ 40 - 0
src/main/java/me/shedaniel/mixins/MixinMinecraftClient.java

@@ -0,0 +1,40 @@
+package me.shedaniel.mixins;
+
+import me.shedaniel.Core;
+import me.shedaniel.listenerdefinitions.ClientTickable;
+import me.shedaniel.listenerdefinitions.KeybindHandler;
+import net.minecraft.class_3689;
+import net.minecraft.client.MinecraftClient;
+import org.spongepowered.asm.mixin.Final;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.Shadow;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.Inject;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+
+@Mixin(MinecraftClient.class)
+public class MixinMinecraftClient {
+    
+    @Shadow
+    @Final
+    private class_3689 profiler;
+    
+    @Inject(method = "tick", at = @At("RETURN"))
+    private void onTick(CallbackInfo ci) {
+        profiler.begin("mods");
+        for(ClientTickable tickable : Core.getListeners(ClientTickable.class)) {
+            profiler.begin(() -> tickable.getClass().getCanonicalName().replace('.', '/'));
+            tickable.clientTick();
+            profiler.end();
+        }
+        profiler.end();
+    }
+    
+    @Inject(method = "method_1508", at = @At("HEAD"))
+    public void onProcessKeyBinds(CallbackInfo ci) {
+        for (KeybindHandler keybindHandler : Core.getListeners(KeybindHandler.class)) {
+            keybindHandler.processKeybinds();
+        }
+    }
+    
+}

+ 11 - 8
src/main/java/me/shedaniel/mixins/MixinMinecraftResize.java

@@ -1,8 +1,8 @@
 package me.shedaniel.mixins;
 
+import me.shedaniel.Core;
 import me.shedaniel.listenerdefinitions.MinecraftResize;
-import net.minecraft.client.MainWindow;
-import org.dimdev.riftloader.RiftLoader;
+import net.minecraft.client.util.Window;
 import org.spongepowered.asm.mixin.Mixin;
 import org.spongepowered.asm.mixin.Shadow;
 import org.spongepowered.asm.mixin.injection.At;
@@ -12,15 +12,18 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
 /**
  * Created by James on 7/28/2018.
  */
-@Mixin(MainWindow.class)
+@Mixin(Window.class)
 public abstract class MixinMinecraftResize implements AutoCloseable {
-    @Shadow private int scaledHeight;
     
-    @Shadow private int scaledWidth;
+    @Shadow
+    private int scaledHeight;
     
-    @Inject(method = "updateSize", at = @At("RETURN"))
-    private void onResize(CallbackInfo ci) {
-        for(MinecraftResize listener : RiftLoader.instance.getListeners(MinecraftResize.class)) {
+    @Shadow
+    private int scaledWidth;
+    
+    @Inject(method = "onSizeChanged", at = @At("RETURN"))
+    private void onSizeChanged(long long_1, int int_1, int int_2, CallbackInfo ci) {
+        for(MinecraftResize listener : Core.getListeners(MinecraftResize.class)) {
             listener.resize(this.scaledWidth, this.scaledHeight);
         }
     }

+ 0 - 21
src/main/java/me/shedaniel/mixins/MixinPotionBrewing.java

@@ -1,21 +0,0 @@
-package me.shedaniel.mixins;
-
-import me.shedaniel.listenerdefinitions.PotionCraftingAdder;
-import net.minecraft.item.Item;
-import net.minecraft.potion.PotionBrewing;
-import net.minecraft.potion.PotionType;
-import org.dimdev.riftloader.RiftLoader;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.Inject;
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
-
-@Mixin(PotionBrewing.class)
-public class MixinPotionBrewing {
-    
-    @Inject(method = "addMix", at = @At("RETURN"))
-    private static void addMix(PotionType inputPotion, Item reagent, PotionType outputPotion, CallbackInfo info) {
-        RiftLoader.instance.getListeners(PotionCraftingAdder.class).forEach(potionCraftingAdder -> potionCraftingAdder.addPotionRecipe(inputPotion, reagent, outputPotion));
-    }
-    
-}

+ 8 - 8
src/main/java/me/shedaniel/mixins/MixinRecipeManager.java

@@ -1,25 +1,25 @@
 package me.shedaniel.mixins;
 
+import me.shedaniel.Core;
 import me.shedaniel.listenerdefinitions.RecipeLoadListener;
-import net.minecraft.client.network.NetHandlerPlayClient;
-import net.minecraft.item.crafting.RecipeManager;
-import net.minecraft.network.play.server.SPacketUpdateRecipes;
-import org.dimdev.riftloader.RiftLoader;
+import net.minecraft.client.network.ClientPlayNetworkHandler;
+import net.minecraft.client.network.packet.SynchronizeRecipesClientPacket;
+import net.minecraft.recipe.RecipeManager;
 import org.spongepowered.asm.mixin.Mixin;
 import org.spongepowered.asm.mixin.Shadow;
 import org.spongepowered.asm.mixin.injection.At;
 import org.spongepowered.asm.mixin.injection.Inject;
 import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
 
-@Mixin(NetHandlerPlayClient.class)
+@Mixin(ClientPlayNetworkHandler.class)
 public class MixinRecipeManager {
     
     @Shadow
     RecipeManager recipeManager;
     
-    @Inject(method = "handleUpdateRecipes", at = @At("RETURN"))
-    private void onUpdateRecipies(SPacketUpdateRecipes packetIn, CallbackInfo ci) {
-        for(RecipeLoadListener listener : RiftLoader.instance.getListeners(RecipeLoadListener.class)) {
+    @Inject(method = "onSynchronizeRecipes", at = @At("RETURN"))
+    private void onUpdateRecipies(SynchronizeRecipesClientPacket packetIn, CallbackInfo ci) {
+        for(RecipeLoadListener listener : Core.getListeners(RecipeLoadListener.class)) {
             listener.recipesLoaded(recipeManager);
         }
     }

+ 6 - 8
src/main/java/me/shedaniel/mixins/SettingsMixin.java

@@ -1,9 +1,9 @@
 package me.shedaniel.mixins;
 
+import me.shedaniel.Core;
 import me.shedaniel.listenerdefinitions.PreLoadOptions;
-import net.minecraft.client.GameSettings;
+import net.minecraft.client.settings.GameOptions;
 import net.minecraft.client.settings.KeyBinding;
-import org.dimdev.riftloader.RiftLoader;
 import org.spongepowered.asm.mixin.Mixin;
 import org.spongepowered.asm.mixin.Shadow;
 import org.spongepowered.asm.mixin.injection.At;
@@ -17,7 +17,7 @@ import java.util.List;
  * Created by James on 8/7/2018.
  */
 
-@Mixin(GameSettings.class)
+@Mixin(GameOptions.class)
 public class SettingsMixin {
     @Shadow
     public KeyBinding[] keyBindings;
@@ -26,18 +26,16 @@ public class SettingsMixin {
         System.out.println("loaded");
     }
     
-    @Inject(method = "loadOptions", at = @At("HEAD"))
+    @Inject(method = "load", at = @At("HEAD"))
     public void beforeLoadOptions(CallbackInfo ci) {
-        
-        RiftLoader.instance.getListeners(PreLoadOptions.class).stream().forEach(f -> processNewBindings(f.loadOptions()));
+        Core.getListeners(PreLoadOptions.class).stream().forEach(f -> processNewBindings(f.loadOptions()));
     }
     
     private void processNewBindings(List<KeyBinding> newBindings) {
         List<KeyBinding> toAdd = new ArrayList<>();
         toAdd.addAll(newBindings);
-        for(KeyBinding keyBinding : keyBindings) {
+        for(KeyBinding keyBinding : keyBindings)
             toAdd.add(keyBinding);
-        }
         keyBindings = (KeyBinding[]) toAdd.toArray(new KeyBinding[0]);
     }
     

+ 15 - 15
src/main/java/me/shedaniel/network/CheatPacket.java

@@ -1,19 +1,18 @@
 package me.shedaniel.network;
 
-import net.minecraft.entity.player.EntityPlayerMP;
 import net.minecraft.item.ItemStack;
-import net.minecraft.nbt.NBTTagCompound;
-import net.minecraft.network.NetHandlerPlayServer;
+import net.minecraft.nbt.CompoundTag;
 import net.minecraft.network.Packet;
-import net.minecraft.network.PacketBuffer;
-import net.minecraft.network.play.INetHandlerPlayServer;
+import net.minecraft.server.network.ServerPlayNetworkHandler;
+import net.minecraft.server.network.ServerPlayerEntity;
+import net.minecraft.util.PacketByteBuf;
 
 import java.io.IOException;
 
 /**
  * Created by James on 7/29/2018.
  */
-public class CheatPacket implements Packet<INetHandlerPlayServer> {
+public class CheatPacket implements Packet<ServerPlayNetworkHandler> {
     
     private ItemStack stack;
     
@@ -25,21 +24,22 @@ public class CheatPacket implements Packet<INetHandlerPlayServer> {
     }
     
     @Override
-    public void readPacketData(PacketBuffer packetBuffer) throws IOException {
-        stack = ItemStack.read(packetBuffer.readCompoundTag());
+    public void read(PacketByteBuf packetBuffer) throws IOException {
+        stack = ItemStack.fromTag(packetBuffer.readCompoundTag());
     }
     
     @Override
-    public void writePacketData(PacketBuffer packetBuffer) throws IOException {
-        NBTTagCompound tag = new NBTTagCompound();
-        stack.write(tag);
+    public void write(PacketByteBuf packetBuffer) throws IOException {
+        CompoundTag tag = new CompoundTag();
+        stack.setTag(tag);
         packetBuffer.writeCompoundTag(tag);
     }
     
     @Override
-    public void processPacket(INetHandlerPlayServer iNetHandlerPlayServer) {
-        NetHandlerPlayServer server = (NetHandlerPlayServer) iNetHandlerPlayServer;
-        EntityPlayerMP player = server.player;
-        player.inventory.addItemStackToInventory(stack);
+    public void apply(ServerPlayNetworkHandler iNetHandlerPlayServer) {
+        ServerPlayNetworkHandler server = (ServerPlayNetworkHandler) iNetHandlerPlayServer;
+        ServerPlayerEntity player = server.player;
+        player.inventory.addPickBlock(stack);
     }
+    
 }

+ 16 - 15
src/main/java/me/shedaniel/network/DeletePacket.java

@@ -1,32 +1,33 @@
 package me.shedaniel.network;
 
-import net.minecraft.entity.player.EntityPlayerMP;
 import net.minecraft.item.ItemStack;
-import net.minecraft.network.NetHandlerPlayServer;
 import net.minecraft.network.Packet;
-import net.minecraft.network.PacketBuffer;
-import net.minecraft.network.play.INetHandlerPlayServer;
+import net.minecraft.server.network.ServerPlayNetworkHandler;
+import net.minecraft.server.network.ServerPlayerEntity;
+import net.minecraft.util.PacketByteBuf;
 
 import java.io.IOException;
 
-public class DeletePacket implements Packet<INetHandlerPlayServer> {
-    @Override
-    public void readPacketData(PacketBuffer packetBuffer) throws IOException {
+public class DeletePacket implements Packet<ServerPlayNetworkHandler> {
     
+    @Override
+    public void apply(ServerPlayNetworkHandler iNetHandlerPlayServer) {
+        ServerPlayNetworkHandler server = (ServerPlayNetworkHandler) iNetHandlerPlayServer;
+        ServerPlayerEntity player = server.player;
+        
+        if (!player.inventory.getCursorStack().isEmpty()) {
+            player.inventory.setCursorStack(ItemStack.EMPTY);
+        }
     }
     
     @Override
-    public void writePacketData(PacketBuffer packetBuffer) throws IOException {
+    public void read(PacketByteBuf packetByteBuf) throws IOException {
     
     }
     
     @Override
-    public void processPacket(INetHandlerPlayServer iNetHandlerPlayServer) {
-        NetHandlerPlayServer server = (NetHandlerPlayServer) iNetHandlerPlayServer;
-        EntityPlayerMP player = server.player;
-        
-        if (!player.inventory.getItemStack().isEmpty()) {
-            player.inventory.setItemStack(ItemStack.EMPTY);
-        }
+    public void write(PacketByteBuf packetByteBuf) throws IOException {
+    
     }
+    
 }

+ 3 - 3
src/main/java/me/shedaniel/plugin/RandomRecipe.java

@@ -1,7 +1,7 @@
 package me.shedaniel.plugin;
 
 import me.shedaniel.api.IRecipe;
-import net.minecraft.init.Blocks;
+import net.minecraft.block.Blocks;
 import net.minecraft.item.ItemStack;
 
 import java.util.Arrays;
@@ -23,11 +23,11 @@ public class RandomRecipe implements IRecipe<ItemStack> {
     
     @Override
     public List<ItemStack> getOutput() {
-        return new LinkedList<>(Arrays.asList(new ItemStack[]{new ItemStack(Blocks.BEETROOTS.asItem())}));
+        return new LinkedList<>(Arrays.asList(new ItemStack[]{new ItemStack(Blocks.BEETROOTS.getItem())}));
     }
     
     @Override
     public List<List<ItemStack>> getInput() {
-        return new LinkedList<>(Arrays.asList(new LinkedList<>(Arrays.asList(new ItemStack[]{new ItemStack(Blocks.OAK_LOG.asItem())}))));
+        return new LinkedList<>(Arrays.asList(new LinkedList<>(Arrays.asList(new ItemStack[]{new ItemStack(Blocks.OAK_LOG.getItem())}))));
     }
 }

+ 0 - 3
src/main/java/me/shedaniel/plugin/TestRandomCategory.java

@@ -3,9 +3,6 @@ package me.shedaniel.plugin;
 import me.shedaniel.api.IDisplayCategory;
 import me.shedaniel.gui.widget.Control;
 import me.shedaniel.gui.widget.REISlot;
-import me.shedaniel.plugin.crafting.VanillaCraftingRecipe;
-import net.minecraft.init.Blocks;
-import net.minecraft.item.Item;
 import net.minecraft.item.ItemStack;
 
 import java.util.ArrayList;

+ 41 - 18
src/main/java/me/shedaniel/plugin/VanillaPlugin.java

@@ -11,14 +11,21 @@ import me.shedaniel.plugin.furnace.VanillaFurnaceCategory;
 import me.shedaniel.plugin.furnace.VanillaFurnaceRecipe;
 import me.shedaniel.plugin.potion.VanillaPotionCategory;
 import me.shedaniel.plugin.potion.VanillaPotionRecipe;
-import net.minecraft.init.Items;
-import net.minecraft.init.PotionTypes;
+import me.shedaniel.plugin.smoker.VanillaSmokerCategory;
+import me.shedaniel.plugin.smoker.VanillaSmokerRecipe;
 import net.minecraft.item.Item;
 import net.minecraft.item.ItemStack;
-import net.minecraft.item.crafting.*;
-import net.minecraft.potion.PotionType;
-import net.minecraft.potion.PotionUtils;
-import net.minecraft.util.registry.IRegistry;
+import net.minecraft.item.Items;
+import net.minecraft.potion.Potion;
+import net.minecraft.potion.PotionUtil;
+import net.minecraft.potion.Potions;
+import net.minecraft.recipe.Ingredient;
+import net.minecraft.recipe.Recipe;
+import net.minecraft.recipe.crafting.ShapedRecipe;
+import net.minecraft.recipe.crafting.ShapelessRecipe;
+import net.minecraft.recipe.smelting.SmeltingRecipe;
+import net.minecraft.recipe.smelting.SmokingRecipe;
+import net.minecraft.util.registry.Registry;
 
 import java.util.LinkedList;
 import java.util.List;
@@ -32,39 +39,54 @@ public class VanillaPlugin implements IREIPlugin, PotionCraftingAdder {
     public void register() {
         List<VanillaCraftingRecipe> recipes = new LinkedList<>();
         List<VanillaFurnaceRecipe> furnaceRecipes = new LinkedList<>();
+        List<VanillaSmokerRecipe> smokerRecipes = new LinkedList<>();
         REIRecipeManager.instance().addDisplayAdapter(new VanillaCraftingCategory());
         REIRecipeManager.instance().addDisplayAdapter(new VanillaFurnaceCategory());
         REIRecipeManager.instance().addDisplayAdapter(new VanillaPotionCategory());
+        REIRecipeManager.instance().addDisplayAdapter(new VanillaSmokerCategory());
 //        REIRecipeManager.instance().addDisplayAdapter(new TestRandomCategory("a", new ItemStack(Blocks.ACACIA_BUTTON.asItem())));
 //        REIRecipeManager.instance().addDisplayAdapter(new TestRandomCategory("b", new ItemStack(Blocks.ACACIA_LOG.asItem())));
 //        REIRecipeManager.instance().addDisplayAdapter(new TestRandomCategory("c", new ItemStack(Blocks.ACACIA_LOG.asItem())));
 //        REIRecipeManager.instance().addDisplayAdapter(new TestRandomCategory("d", new ItemStack(Blocks.ACACIA_LOG.asItem())));
 //        REIRecipeManager.instance().addDisplayAdapter(new TestRandomCategory("e", new ItemStack(Blocks.ACACIA_LOG.asItem())));
         
-        for(IRecipe recipe : REIRecipeManager.instance().recipeManager.getRecipes()) {
+        for(Recipe recipe : REIRecipeManager.instance().recipeManager.values()) {
             if (recipe instanceof ShapelessRecipe) {
                 recipes.add(new VanillaShapelessCraftingRecipe((ShapelessRecipe) recipe));
             }
             if (recipe instanceof ShapedRecipe) {
                 recipes.add(new VanillaShapedCraftingRecipe((ShapedRecipe) recipe));
             }
-            if (recipe instanceof FurnaceRecipe) {
-                furnaceRecipes.add(new VanillaFurnaceRecipe((FurnaceRecipe) recipe));
+            if (recipe instanceof SmeltingRecipe) {
+                furnaceRecipes.add(new VanillaFurnaceRecipe((SmeltingRecipe) recipe));
+            }
+            if (recipe instanceof SmokingRecipe) {
+                smokerRecipes.add(new VanillaSmokerRecipe((SmokingRecipe) recipe));
             }
         }
-        IRegistry.POTION.stream().filter(potionType -> !potionType.equals(PotionTypes.EMPTY)).forEach(potionType -> {
+        Registry.POTION.stream().filter(potion -> !potion.equals(Potions.EMPTY)).forEach(potion -> {
+            ItemStack basePotion = PotionUtil.setPotion(new ItemStack(Items.POTION), potion),
+                    splashPotion = PotionUtil.setPotion(new ItemStack(Items.SPLASH_POTION), potion),
+                    lingeringPotion = PotionUtil.setPotion(new ItemStack(Items.LINGERING_POTION), potion);
+            potionRecipes.add(new VanillaPotionRecipe(new ItemStack[]{basePotion}, Ingredient.ofItems(Items.GUNPOWDER).getStackArray(),
+                    new ItemStack[]{splashPotion}));
+            potionRecipes.add(new VanillaPotionRecipe(new ItemStack[]{splashPotion}, Ingredient.ofItems(Items.DRAGON_BREATH).getStackArray(),
+                    new ItemStack[]{lingeringPotion}));
+        });
+        /*PotionType.REGISTRY.stream().filter(potionType -> !potionType.equals(PotionTypes.EMPTY)).forEach(potionType -> {
             ItemStack basePotion = PotionUtils.addPotionToItemStack(new ItemStack(Items.POTION), potionType),
                     splashPotion = PotionUtils.addPotionToItemStack(new ItemStack(Items.SPLASH_POTION), potionType),
                     lingeringPotion = PotionUtils.addPotionToItemStack(new ItemStack(Items.LINGERING_POTION), potionType);
-            potionRecipes.add(new VanillaPotionRecipe(new ItemStack[]{basePotion}, Ingredient.fromItems(Items.GUNPOWDER).getMatchingStacks(),
+            potionRecipes.add(new VanillaPotionRecipe(new ItemStack[]{basePotion}, Ingredient.ofItems(Items.GUNPOWDER).getStackArray(),
                     new ItemStack[]{splashPotion}));
-            potionRecipes.add(new VanillaPotionRecipe(new ItemStack[]{splashPotion}, Ingredient.fromItems(Items.DRAGON_BREATH).getMatchingStacks(),
+            potionRecipes.add(new VanillaPotionRecipe(new ItemStack[]{splashPotion}, Ingredient.ofItems(Items.DRAGON_BREATH).getStackArray(),
                     new ItemStack[]{lingeringPotion}));
-        });
+        });*/
         
         REIRecipeManager.instance().addRecipe("vanilla", recipes);
         REIRecipeManager.instance().addRecipe("furnace", furnaceRecipes);
-        REIRecipeManager.instance().addRecipe("potion", potionRecipes.stream().collect(Collectors.toList()));
+        REIRecipeManager.instance().addRecipe("smoker", smokerRecipes);
+        REIRecipeManager.instance().addRecipe("potion", potionRecipes.stream().distinct().collect(Collectors.toList()));
 //        REIRecipeManager.instance().addPotionRecipe("a", new RandomRecipe("a"));
 //        REIRecipeManager.instance().addPotionRecipe("b", new RandomRecipe("b"));
 //        REIRecipeManager.instance().addPotionRecipe("c", new RandomRecipe("c"));
@@ -72,10 +94,11 @@ public class VanillaPlugin implements IREIPlugin, PotionCraftingAdder {
 //        REIRecipeManager.instance().addPotionRecipe("e", new RandomRecipe("e"));
     }
     
+    
     @Override
-    public void addPotionRecipe(PotionType inputType, Item reagent, PotionType outputType) {
-        potionRecipes.add(new VanillaPotionRecipe(new ItemStack[]{PotionUtils.addPotionToItemStack(new ItemStack(Items.POTION), inputType)},
-                Ingredient.fromItems(reagent).getMatchingStacks(),
-                new ItemStack[]{PotionUtils.addPotionToItemStack(new ItemStack(Items.POTION), outputType)}));
+    public void addPotionRecipe(Potion inputType, Item reagent, Potion outputType) {
+        potionRecipes.add(new VanillaPotionRecipe(new ItemStack[]{PotionUtil.setPotion(new ItemStack(Items.POTION), inputType)},
+                Ingredient.ofItems(reagent).getStackArray(),
+                new ItemStack[]{PotionUtil.setPotion(new ItemStack(Items.POTION), outputType)}));
     }
 }

+ 8 - 9
src/main/java/me/shedaniel/plugin/crafting/VanillaCraftingCategory.java

@@ -1,14 +1,13 @@
 package me.shedaniel.plugin.crafting;
 
 import me.shedaniel.api.IDisplayCategory;
-import me.shedaniel.gui.widget.REISlot;
 import me.shedaniel.gui.widget.Control;
+import me.shedaniel.gui.widget.REISlot;
 import me.shedaniel.gui.widget.WidgetArrow;
-import net.minecraft.client.MainWindow;
-import net.minecraft.client.Minecraft;
-import net.minecraft.client.resources.I18n;
-import net.minecraft.init.Blocks;
-import net.minecraft.item.Item;
+import net.minecraft.block.Blocks;
+import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.resource.language.I18n;
+import net.minecraft.client.util.Window;
 import net.minecraft.item.ItemStack;
 
 import java.util.ArrayList;
@@ -16,7 +15,7 @@ import java.util.LinkedList;
 import java.util.List;
 
 public class VanillaCraftingCategory implements IDisplayCategory<VanillaCraftingRecipe> {
-    MainWindow mainWindow = Minecraft.getInstance().mainWindow;
+    Window mainWindow = MinecraftClient.getInstance().window;
     private List<VanillaCraftingRecipe> recipes;
     
     @Override
@@ -26,7 +25,7 @@ public class VanillaCraftingCategory implements IDisplayCategory<VanillaCrafting
     
     @Override
     public String getDisplayName() {
-        return I18n.format("category.rei.crafting");
+        return I18n.translate("category.rei.crafting");
     }
     
     @Override
@@ -109,7 +108,7 @@ public class VanillaCraftingCategory implements IDisplayCategory<VanillaCrafting
     
     @Override
     public ItemStack getCategoryIcon() {
-        return new ItemStack(Blocks.CRAFTING_TABLE.asItem());
+        return new ItemStack(Blocks.CRAFTING_TABLE.getItem());
     }
     
 }

+ 5 - 5
src/main/java/me/shedaniel/plugin/crafting/VanillaShapedCraftingRecipe.java

@@ -1,8 +1,8 @@
 package me.shedaniel.plugin.crafting;
 
 import net.minecraft.item.ItemStack;
-import net.minecraft.item.crafting.Ingredient;
-import net.minecraft.item.crafting.ShapedRecipe;
+import net.minecraft.recipe.Ingredient;
+import net.minecraft.recipe.crafting.ShapedRecipe;
 
 import java.util.LinkedList;
 import java.util.List;
@@ -34,7 +34,7 @@ public class VanillaShapedCraftingRecipe extends VanillaCraftingRecipe {
     @Override
     public List<ItemStack> getOutput() {
         List<ItemStack> output = new LinkedList<>();
-        output.add(recipe.getRecipeOutput());
+        output.add(recipe.getOutput());
         return output;
     }
     
@@ -42,9 +42,9 @@ public class VanillaShapedCraftingRecipe extends VanillaCraftingRecipe {
     public List<List<ItemStack>> getInput() {
         List<List<ItemStack>> input = new LinkedList<>();
         int count = 0;
-        for(Ingredient ingredient : recipe.getIngredients()) {
+        for(Ingredient ingredient : recipe.getPreviewInputs()) {
             List<ItemStack> ingList = new LinkedList<>();
-            for(ItemStack matchingStack : ingredient.getMatchingStacks()) {
+            for(ItemStack matchingStack : ingredient.getStackArray()) {
                 ingList.add(matchingStack);
             }
             input.add(ingList);

+ 7 - 7
src/main/java/me/shedaniel/plugin/crafting/VanillaShapelessCraftingRecipe.java

@@ -1,8 +1,8 @@
 package me.shedaniel.plugin.crafting;
 
 import net.minecraft.item.ItemStack;
-import net.minecraft.item.crafting.Ingredient;
-import net.minecraft.item.crafting.ShapelessRecipe;
+import net.minecraft.recipe.Ingredient;
+import net.minecraft.recipe.crafting.ShapelessRecipe;
 
 import java.util.LinkedList;
 import java.util.List;
@@ -24,16 +24,16 @@ public class VanillaShapelessCraftingRecipe extends VanillaCraftingRecipe {
     @Override
     public List<ItemStack> getOutput() {
         List<ItemStack> output = new LinkedList<>();
-        output.add(recipe.getRecipeOutput());
+        output.add(recipe.getOutput());
         return output;
     }
     
     @Override
     public List<List<ItemStack>> getInput() {
         List<List<ItemStack>> input = new LinkedList<>();
-        for(Ingredient ingredient : recipe.getIngredients()) {
+        for(Ingredient ingredient : recipe.getPreviewInputs()) {
             List<ItemStack> ingList = new LinkedList<>();
-            for(ItemStack matchingStack : ingredient.getMatchingStacks()) {
+            for(ItemStack matchingStack : ingredient.getStackArray()) {
                 ingList.add(matchingStack);
             }
             input.add(ingList);
@@ -43,14 +43,14 @@ public class VanillaShapelessCraftingRecipe extends VanillaCraftingRecipe {
     
     @Override
     public int getWidth() {
-        if (recipe.getIngredients().size() > 4)
+        if (recipe.getPreviewInputs().size() > 4)
             return 3;
         return 2;
     }
     
     @Override
     public int getHeight() {
-        if (recipe.getIngredients().size() > 4)
+        if (recipe.getPreviewInputs().size() > 4)
             return 3;
         return 2;
     }

+ 8 - 8
src/main/java/me/shedaniel/plugin/furnace/VanillaFurnaceCategory.java

@@ -1,14 +1,14 @@
 package me.shedaniel.plugin.furnace;
 
 import me.shedaniel.api.IDisplayCategory;
-import me.shedaniel.gui.widget.REISlot;
 import me.shedaniel.gui.widget.Control;
+import me.shedaniel.gui.widget.REISlot;
 import me.shedaniel.gui.widget.WidgetArrow;
-import net.minecraft.client.resources.I18n;
-import net.minecraft.init.Blocks;
+import net.minecraft.block.Blocks;
+import net.minecraft.block.entity.FurnaceBlockEntity;
+import net.minecraft.client.resource.language.I18n;
 import net.minecraft.item.Item;
 import net.minecraft.item.ItemStack;
-import net.minecraft.tileentity.TileEntityFurnace;
 
 import java.util.ArrayList;
 import java.util.LinkedList;
@@ -25,7 +25,7 @@ public class VanillaFurnaceCategory implements IDisplayCategory<VanillaFurnaceRe
     
     @Override
     public String getDisplayName() {
-        return I18n.format("category.rei.smelting");
+        return I18n.translate("category.rei.smelting");
     }
     
     @Override
@@ -54,7 +54,7 @@ public class VanillaFurnaceCategory implements IDisplayCategory<VanillaFurnaceRe
         REISlot fuelSlot = new REISlot(80, 100 + number * 75);
         fuelSlot.setStackList(getFuel());
         fuelSlot.setDrawBackground(true);
-        fuelSlot.setExtraTooltip(I18n.format("category.rei.smelting.fuel"));
+        fuelSlot.setExtraTooltip(I18n.translate("category.rei.smelting.fuel"));
         
         slots.add(inputSlot);
         slots.add(outputSlot);
@@ -79,11 +79,11 @@ public class VanillaFurnaceCategory implements IDisplayCategory<VanillaFurnaceRe
     }
     
     private List<ItemStack> getFuel() {
-        return TileEntityFurnace.getBurnTimes().keySet().stream().map(Item::getDefaultInstance).collect(Collectors.toList());
+        return FurnaceBlockEntity.getBurnTimeMap().keySet().stream().map(Item::getDefaultStack).collect(Collectors.toList());
     }
     
     @Override
     public ItemStack getCategoryIcon() {
-        return new ItemStack(Blocks.FURNACE.asItem());
+        return new ItemStack(Blocks.FURNACE.getItem());
     }
 }

+ 7 - 7
src/main/java/me/shedaniel/plugin/furnace/VanillaFurnaceRecipe.java

@@ -2,37 +2,37 @@ package me.shedaniel.plugin.furnace;
 
 import me.shedaniel.api.IRecipe;
 import net.minecraft.item.ItemStack;
-import net.minecraft.item.crafting.FurnaceRecipe;
-import net.minecraft.item.crafting.Ingredient;
+import net.minecraft.recipe.Ingredient;
+import net.minecraft.recipe.smelting.SmeltingRecipe;
 
 import java.util.LinkedList;
 import java.util.List;
 
 public class VanillaFurnaceRecipe implements IRecipe<ItemStack> {
-    private final FurnaceRecipe recipe;
+    private final SmeltingRecipe recipe;
     
     @Override
     public String getId() {
         return "furnace";
     }
     
-    public VanillaFurnaceRecipe(FurnaceRecipe recipe) {
+    public VanillaFurnaceRecipe(SmeltingRecipe recipe) {
         this.recipe = recipe;
     }
     
     @Override
     public List<ItemStack> getOutput() {
         List<ItemStack> output = new LinkedList<>();
-        output.add(recipe.getRecipeOutput().copy());
+        output.add(recipe.getOutput().copy());
         return output;
     }
     
     @Override
     public List<List<ItemStack>> getInput() {
         List<List<ItemStack>> input = new LinkedList<>();
-        for(Ingredient ingredient : recipe.getIngredients()) {
+        for(Ingredient ingredient : recipe.getPreviewInputs()) {
             List<ItemStack> ingredients = new LinkedList<>();
-            for(ItemStack matchingStack : ingredient.getMatchingStacks()) {
+            for(ItemStack matchingStack : ingredient.getStackArray()) {
                 ingredients.add(matchingStack);
             }
             input.add(ingredients);

+ 16 - 16
src/main/java/me/shedaniel/plugin/potion/VanillaPotionCategory.java

@@ -1,16 +1,16 @@
 package me.shedaniel.plugin.potion;
 
+import com.mojang.blaze3d.platform.GlStateManager;
 import me.shedaniel.api.IDisplayCategory;
 import me.shedaniel.gui.REIRenderHelper;
 import me.shedaniel.gui.widget.Control;
 import me.shedaniel.gui.widget.REISlot;
-import net.minecraft.client.Minecraft;
-import net.minecraft.client.renderer.GlStateManager;
-import net.minecraft.client.resources.I18n;
-import net.minecraft.init.Blocks;
-import net.minecraft.init.Items;
+import net.minecraft.block.Blocks;
+import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.resource.language.I18n;
 import net.minecraft.item.ItemStack;
-import net.minecraft.util.ResourceLocation;
+import net.minecraft.item.Items;
+import net.minecraft.util.Identifier;
 
 import java.awt.*;
 import java.util.ArrayList;
@@ -27,7 +27,7 @@ public class VanillaPotionCategory implements IDisplayCategory<VanillaPotionReci
     
     @Override
     public String getDisplayName() {
-        return I18n.format("category.rei.brewing");
+        return I18n.translate("category.rei.brewing");
     }
     
     @Override
@@ -76,7 +76,7 @@ public class VanillaPotionCategory implements IDisplayCategory<VanillaPotionReci
     
     }
     
-    private static final ResourceLocation RECIPE_GUI = new ResourceLocation("textures/gui/container/brewing_stand.png");
+    private static final Identifier RECIPE_GUI = new Identifier("textures/gui/container/brewing_stand.png");
     
     @Override
     public void addWidget(List<Control> controls, int number) {
@@ -118,7 +118,7 @@ public class VanillaPotionCategory implements IDisplayCategory<VanillaPotionReci
     
     @Override
     public ItemStack getCategoryIcon() {
-        return new ItemStack(Blocks.BREWING_STAND.asItem());
+        return new ItemStack(Blocks.BREWING_STAND.getItem());
     }
     
     private class PotionScreen extends Control {
@@ -131,7 +131,7 @@ public class VanillaPotionCategory implements IDisplayCategory<VanillaPotionReci
         public void draw() {
             GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F);
             GlStateManager.disableLighting();
-            Minecraft.getInstance().getTextureManager().bindTexture(RECIPE_GUI);
+            MinecraftClient.getInstance().getTextureManager().bindTexture(RECIPE_GUI);
             this.drawTexturedModalRect(rect.x, rect.y, 16, 15, 103, 60, 0);
             this.drawTexturedModalRect(rect.x + 97 - 16, rect.y + 16 - 15, 176, 0, 9, (int) (((double) System.currentTimeMillis() % 2800d / 2800d) * 28), 0);
             this.drawTexturedModalRect(rect.x + 45, rect.y, 110, 15, 15, 27, 0);
@@ -156,7 +156,7 @@ public class VanillaPotionCategory implements IDisplayCategory<VanillaPotionReci
             if (getStack().isEmpty())
                 return;
             if (drawMiniBackground) {
-                Minecraft.getInstance().getTextureManager().bindTexture(RECIPE_GUI);
+                MinecraftClient.getInstance().getTextureManager().bindTexture(RECIPE_GUI);
                 drawTexturedModalRect(rect.x + 1, rect.y + 1, 0 + 2, 222 + 2, rect.width - 4, rect.height - 4);
             }
             super.draw();
@@ -165,20 +165,20 @@ public class VanillaPotionCategory implements IDisplayCategory<VanillaPotionReci
         @Override
         protected void drawTooltip() {
             List<String> toolTip = getTooltip();
-            toolTip.add(I18n.format("text.rei.mod", getMod()));
+            toolTip.add(I18n.translate("text.rei.mod", getMod()));
             Point mouse = REIRenderHelper.getMouseLoc();
-            Minecraft.getInstance().currentScreen.drawHoveringText(toolTip, mouse.x, mouse.y);
+            MinecraftClient.getInstance().currentGui.drawTooltip(toolTip, mouse.x, mouse.y);
         }
     }
     
     public static String getTooltip(SlotType slotType) {
         switch (slotType) {
             case INPUT:
-                return I18n.format("category.rei.brewing.input");
+                return I18n.translate("category.rei.brewing.input");
             case REACT:
-                return I18n.format("category.rei.brewing.reactant");
+                return I18n.translate("category.rei.brewing.reactant");
             case OUTPUT:
-                return I18n.format("category.rei.brewing.result");
+                return I18n.translate("category.rei.brewing.result");
         }
         return null;
     }

+ 1 - 1
src/main/java/me/shedaniel/plugin/potion/VanillaPotionRecipe.java

@@ -1,7 +1,7 @@
 package me.shedaniel.plugin.potion;
 
 import me.shedaniel.api.IRecipe;
-import net.minecraft.init.Blocks;
+import net.minecraft.block.Blocks;
 import net.minecraft.item.ItemStack;
 
 import java.util.ArrayList;

+ 89 - 0
src/main/java/me/shedaniel/plugin/smoker/VanillaSmokerCategory.java

@@ -0,0 +1,89 @@
+package me.shedaniel.plugin.smoker;
+
+import me.shedaniel.api.IDisplayCategory;
+import me.shedaniel.gui.widget.Control;
+import me.shedaniel.gui.widget.REISlot;
+import me.shedaniel.gui.widget.WidgetArrow;
+import net.minecraft.block.Blocks;
+import net.minecraft.block.entity.SmokerBlockEntity;
+import net.minecraft.client.resource.language.I18n;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class VanillaSmokerCategory implements IDisplayCategory<VanillaSmokerRecipe> {
+    private List<VanillaSmokerRecipe> recipes;
+    
+    @Override
+    public String getId() {
+        return "smoker";
+    }
+    
+    @Override
+    public String getDisplayName() {
+        return I18n.translate("category.rei.smoking");
+    }
+    
+    @Override
+    public void addRecipe(VanillaSmokerRecipe recipe) {
+        if (this.recipes == null)
+            this.recipes = new ArrayList<>();
+        this.recipes.add(recipe);
+    }
+    
+    @Override
+    public void resetRecipes() {
+        this.recipes = new ArrayList<>();
+    }
+    
+    @Override
+    public List<REISlot> setupDisplay(int number) {
+        List<REISlot> slots = new LinkedList<>();
+        REISlot inputSlot = new REISlot(50, 70 + number * 75);
+        inputSlot.setStackList(recipes.get(number).getInput().get(0));
+        inputSlot.setDrawBackground(true);
+        
+        REISlot outputSlot = new REISlot(110, 70 + number * 75);
+        outputSlot.setStackList(recipes.get(number).getOutput());
+        outputSlot.setDrawBackground(true);
+        
+        REISlot fuelSlot = new REISlot(80, 100 + number * 75);
+        fuelSlot.setStackList(getFuel());
+        fuelSlot.setDrawBackground(true);
+        fuelSlot.setExtraTooltip(I18n.translate("category.rei.smelting.fuel"));
+        
+        slots.add(inputSlot);
+        slots.add(outputSlot);
+        slots.add(fuelSlot);
+        return slots;
+    }
+    
+    @Override
+    public boolean canDisplay(VanillaSmokerRecipe recipe) {
+        return false;
+    }
+    
+    @Override
+    public void drawExtras() {
+    
+    }
+    
+    @Override
+    public void addWidget(List<Control> controls, int number) {
+        WidgetArrow wa = new WidgetArrow(75, 70 + number * 75, true, 10);
+        controls.add(wa);
+    }
+    
+    private List<ItemStack> getFuel() {
+        return SmokerBlockEntity.getBurnTimeMap().keySet().stream().map(Item::getDefaultStack).collect(Collectors.toList());
+    }
+    
+    @Override
+    public ItemStack getCategoryIcon() {
+        return new ItemStack(Blocks.SMOKER.getItem());
+    }
+}

+ 43 - 0
src/main/java/me/shedaniel/plugin/smoker/VanillaSmokerRecipe.java

@@ -0,0 +1,43 @@
+package me.shedaniel.plugin.smoker;
+
+import me.shedaniel.api.IRecipe;
+import net.minecraft.item.ItemStack;
+import net.minecraft.recipe.Ingredient;
+import net.minecraft.recipe.smelting.SmeltingRecipe;
+import net.minecraft.recipe.smelting.SmokingRecipe;
+
+import java.util.LinkedList;
+import java.util.List;
+
+public class VanillaSmokerRecipe implements IRecipe<ItemStack> {
+    private final SmokingRecipe recipe;
+    
+    @Override
+    public String getId() {
+        return "smoker";
+    }
+    
+    public VanillaSmokerRecipe(SmokingRecipe recipe) {
+        this.recipe = recipe;
+    }
+    
+    @Override
+    public List<ItemStack> getOutput() {
+        List<ItemStack> output = new LinkedList<>();
+        output.add(recipe.getOutput().copy());
+        return output;
+    }
+    
+    @Override
+    public List<List<ItemStack>> getInput() {
+        List<List<ItemStack>> input = new LinkedList<>();
+        for(Ingredient ingredient : recipe.getPreviewInputs()) {
+            List<ItemStack> ingredients = new LinkedList<>();
+            for(ItemStack matchingStack : ingredient.getStackArray()) {
+                ingredients.add(matchingStack);
+            }
+            input.add(ingredients);
+        }
+        return input;
+    }
+}

+ 0 - 0
src/main/resources/assets/almostenoughitems/.modassetroot → src/main/resources/assets/roughlyenoughitems/.modassetroot


+ 1 - 0
src/main/resources/assets/almostenoughitems/lang/en_us.json → src/main/resources/assets/roughlyenoughitems/lang/en_us.json

@@ -9,6 +9,7 @@
   "category.rei.crafting": "Crafting",
   "category.rei.smelting": "Smelting",
   "category.rei.smelting.fuel": "§eFuel",
+  "category.rei.smoking": "Smoking",
   "category.rei.brewing": "Brewing",
   "category.rei.brewing.input": "§eOriginal Potion",
   "category.rei.brewing.reactant": "§eIngredient",

+ 0 - 0
src/main/resources/assets/almostenoughitems/lang/fr_fr.json → src/main/resources/assets/roughlyenoughitems/lang/fr_fr.json


+ 0 - 0
src/main/resources/assets/almostenoughitems/textures/gui/recipecontainer.png → src/main/resources/assets/roughlyenoughitems/textures/gui/recipecontainer.png


+ 19 - 0
src/main/resources/fabric.mod.json

@@ -0,0 +1,19 @@
+{
+  "id": "roughlyenoughitems",
+  "name": "RoughlyEnoughItems",
+  "description": "This is an example description! Tell everyone what your mod is about!",
+  "version": "1.0-SNAPSHOT",
+  "side": "client",
+  "authors": [
+    "Danielshe"
+  ],
+  "initializers": [
+    "me.shedaniel.Core"
+  ],
+  "requires": {
+    "fabric": "*"
+  },
+  "mixins": {
+    "client": "roughlyenoughitems.client.json"
+  }
+}

+ 9 - 10
src/main/resources/mixins.roughlyenoughitems.json → src/main/resources/roughlyenoughitems.client.json

@@ -1,19 +1,18 @@
 {
   "required": true,
-  "minVersion": "0.7.7",
-  "compatibilityLevel": "JAVA_8",
-  "target": "@env(DEFAULT)",
   "package": "me.shedaniel.mixins",
-  "refmap": "mixins.roughlyenoughitems.refmap.json",
+  "compatibilityLevel": "JAVA_8",
   "mixins": [
     "MixinDoneLoading",
-    "MixinPotionBrewing"
-  ],
-  "client": [
+    "MixinBrewingRecipeRegistry",
     "MixinGuiContainer",
     "MixinMinecraftResize",
     "MixinKeyboardListener",
     "MixinRecipeManager",
-    "MixinGuiContainerCreative"
-  ]
-}
+    "MixinGuiContainerCreative",
+    "MixinMinecraftClient"
+  ],
+  "injectors": {
+    "defaultRequire": 1
+  }
+}