Ver Fonte

We are going to break lots of mods

Unknown há 6 anos atrás
pai
commit
434e8d3515
32 ficheiros alterados com 154 adições e 265 exclusões
  1. 2 0
      HEADER
  2. 16 9
      build.gradle
  3. 9 5
      src/main/java/me/shedaniel/rei/api/RecipeDisplay.java
  4. 9 16
      src/main/java/me/shedaniel/rei/api/RecipeHelper.java
  5. 0 37
      src/main/java/me/shedaniel/rei/api/SpeedCraftFunctional.java
  6. 0 16
      src/main/java/me/shedaniel/rei/client/RecipeHelperImpl.java
  7. 1 11
      src/main/java/me/shedaniel/rei/gui/RecipeViewingScreen.java
  8. 1 4
      src/main/java/me/shedaniel/rei/gui/VillagerRecipeViewingScreen.java
  9. 32 1
      src/main/java/me/shedaniel/rei/gui/credits/CreditsScreen.java
  10. 14 15
      src/main/java/me/shedaniel/rei/gui/widget/AutoCraftingButtonWidget.java
  11. 3 2
      src/main/java/me/shedaniel/rei/plugin/DefaultBlastingDisplay.java
  12. 4 7
      src/main/java/me/shedaniel/rei/plugin/DefaultBrewingDisplay.java
  13. 3 2
      src/main/java/me/shedaniel/rei/plugin/DefaultCampfireDisplay.java
  14. 0 6
      src/main/java/me/shedaniel/rei/plugin/DefaultCompostingDisplay.java
  15. 7 2
      src/main/java/me/shedaniel/rei/plugin/DefaultCustomDisplay.java
  16. 4 99
      src/main/java/me/shedaniel/rei/plugin/DefaultPlugin.java
  17. 3 2
      src/main/java/me/shedaniel/rei/plugin/DefaultShapedDisplay.java
  18. 3 2
      src/main/java/me/shedaniel/rei/plugin/DefaultShapelessDisplay.java
  19. 3 2
      src/main/java/me/shedaniel/rei/plugin/DefaultSmeltingDisplay.java
  20. 3 2
      src/main/java/me/shedaniel/rei/plugin/DefaultSmokingDisplay.java
  21. 3 2
      src/main/java/me/shedaniel/rei/plugin/DefaultStoneCuttingDisplay.java
  22. 2 2
      src/main/resources/assets/roughlyenoughitems/lang/bg_bg.json
  23. 2 2
      src/main/resources/assets/roughlyenoughitems/lang/de_de.json
  24. 2 2
      src/main/resources/assets/roughlyenoughitems/lang/en_ud.json
  25. 3 4
      src/main/resources/assets/roughlyenoughitems/lang/en_us.json
  26. 2 2
      src/main/resources/assets/roughlyenoughitems/lang/et_ee.json
  27. 2 2
      src/main/resources/assets/roughlyenoughitems/lang/fr_fr.json
  28. 2 2
      src/main/resources/assets/roughlyenoughitems/lang/lol_us.json
  29. 2 2
      src/main/resources/assets/roughlyenoughitems/lang/pt_br.json
  30. 2 2
      src/main/resources/assets/roughlyenoughitems/lang/zh_cn.json
  31. 2 2
      src/main/resources/assets/roughlyenoughitems/lang/zh_tw.json
  32. 13 1
      src/main/resources/fabric.mod.json

+ 2 - 0
HEADER

@@ -0,0 +1,2 @@
+Roughly Enough Items by Danielshe.
+Licensed under the MIT License.

+ 16 - 9
build.gradle

@@ -1,6 +1,7 @@
 plugins {
     id 'fabric-loom' version '0.2.2-SNAPSHOT'
     id 'maven-publish'
+    id 'net.minecrell.licenser' version '0.4.1'
 }
 
 sourceCompatibility = 1.8
@@ -17,6 +18,12 @@ def includeDep = true
 minecraft {
 }
 
+license {
+    header rootProject.file('HEADER')
+    include '**/*.java'
+    exclude '**/Scissors.java'
+}
+
 repositories {
     maven { url "https://tehnut.info/maven/" }
     maven { url "https://oss.sonatype.org/content/repositories/snapshots" }
@@ -75,14 +82,14 @@ publishing {
     }
 
     repositories {
-        if (project.hasProperty('danielshe_pass')) {
-            maven {
-                url = "http://deploy.modmuss50.me/"
-                credentials {
-                    username = "danielshe"
-                    password = project.getProperty('danielshe_pass')
-                }
-            }
-        }
+//        if (project.hasProperty('danielshe_pass')) {
+//            maven {
+//                url = "http://deploy.modmuss50.me/"
+//                credentials {
+//                    username = "danielshe"
+//                    password = project.getProperty('danielshe_pass')
+//                }
+//            }
+//        }
     }
 }

+ 9 - 5
src/main/java/me/shedaniel/rei/api/RecipeDisplay.java

@@ -15,11 +15,6 @@ import java.util.Optional;
 
 public interface RecipeDisplay<T extends Recipe> {
     
-    /**
-     * @return the optional recipe
-     */
-    Optional<? extends Recipe> getRecipe();
-    
     /**
      * @return a list of items
      */
@@ -46,4 +41,13 @@ public interface RecipeDisplay<T extends Recipe> {
      */
     Identifier getRecipeCategory();
     
+    /**
+     * Gets the recipe location from datapack
+     *
+     * @return the recipe location
+     */
+    default Optional<Identifier> getRecipeLocation() {
+        return Optional.empty();
+    }
+    
 }

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

@@ -126,27 +126,20 @@ public interface RecipeHelper {
     void registerSpeedCraftButtonArea(Identifier category, ButtonAreaSupplier rectangle);
     
     /**
-     * @param category the category of the button area
-     * @deprecated Not required anymore
-     */
-    @Deprecated
-    void registerDefaultSpeedCraftButtonArea(Identifier category);
-    
-    /**
-     * Gets the speed crafting functional from a category
+     * Removes the speed crafting button
      *
-     * @param category the category of the speed crafting functional
-     * @return the list of speed crafting functionals
+     * @param category the category of the button
      */
-    List<SpeedCraftFunctional> getSpeedCraftFunctional(RecipeCategory category);
+    default void removeSpeedCraftButton(Identifier category) {
+        registerSpeedCraftButtonArea(category, bounds -> null);
+    }
     
     /**
-     * Registers a speed crafting functional
-     *
-     * @param category   the category of the speed crafting functional
-     * @param functional the functional to be registered
+     * @param category the category of the button area
+     * @deprecated Not required anymore
      */
-    void registerSpeedCraftFunctional(Identifier category, SpeedCraftFunctional functional);
+    @Deprecated
+    void registerDefaultSpeedCraftButtonArea(Identifier category);
     
     /**
      * Gets the map of all recipes visible to the player

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

@@ -1,37 +0,0 @@
-/*
- * Roughly Enough Items by Danielshe.
- * Licensed under the MIT License.
- */
-
-package me.shedaniel.rei.api;
-
-import net.minecraft.client.gui.screen.Screen;
-
-public interface SpeedCraftFunctional<T extends RecipeDisplay> {
-    
-    /**
-     * Gets the classes that it is functioning for
-     *
-     * @return the array of classes
-     */
-    Class[] getFunctioningFor();
-    
-    /**
-     * Performs the auto crafting
-     *
-     * @param screen the current screen
-     * @param recipe the current recipe
-     * @return whether it worked
-     */
-    boolean performAutoCraft(Screen screen, T recipe);
-    
-    /**
-     * Gets if this functional accepts the auto crafting
-     *
-     * @param screen the current screen
-     * @param recipe the current recipe
-     * @return whether it is accepted
-     */
-    boolean acceptRecipe(Screen screen, T recipe);
-    
-}

+ 0 - 16
src/main/java/me/shedaniel/rei/client/RecipeHelperImpl.java

@@ -43,7 +43,6 @@ public class RecipeHelperImpl implements RecipeHelper {
     private final Map<Identifier, DisplaySettings> categoryDisplaySettingsMap = Maps.newHashMap();
     private final List<RecipeCategory> categories = Lists.newArrayList();
     private final Map<Identifier, ButtonAreaSupplier> speedCraftAreaSupplierMap = Maps.newHashMap();
-    private final Map<Identifier, List<SpeedCraftFunctional>> speedCraftFunctionalMap = Maps.newHashMap();
     private final Map<Identifier, List<List<ItemStack>>> categoryWorkingStations = Maps.newHashMap();
     private final List<DisplayVisibilityHandler> displayVisibilityHandlers = Lists.newArrayList();
     private final List<LiveRecipeGenerator> liveRecipeGenerators = Lists.newArrayList();
@@ -211,20 +210,6 @@ public class RecipeHelperImpl implements RecipeHelper {
         registerSpeedCraftButtonArea(category, bounds -> new Rectangle((int) bounds.getMaxX() - 16, (int) bounds.getMaxY() - 16, 10, 10));
     }
     
-    @Override
-    public List<SpeedCraftFunctional> getSpeedCraftFunctional(RecipeCategory category) {
-        if (speedCraftFunctionalMap.get(category.getIdentifier()) == null)
-            return Lists.newArrayList();
-        return speedCraftFunctionalMap.get(category.getIdentifier());
-    }
-    
-    @Override
-    public void registerSpeedCraftFunctional(Identifier category, SpeedCraftFunctional functional) {
-        List<SpeedCraftFunctional> list = speedCraftFunctionalMap.containsKey(category) ? new LinkedList<>(speedCraftFunctionalMap.get(category)) : Lists.newLinkedList();
-        list.add(functional);
-        speedCraftFunctionalMap.put(category, list);
-    }
-    
     @SuppressWarnings("deprecation")
     public void recipesLoaded(RecipeManager recipeManager) {
         this.recipeCount.set(0);
@@ -233,7 +218,6 @@ public class RecipeHelperImpl implements RecipeHelper {
         this.categories.clear();
         this.speedCraftAreaSupplierMap.clear();
         this.categoryWorkingStations.clear();
-        this.speedCraftFunctionalMap.clear();
         this.categoryDisplaySettingsMap.clear();
         this.recipeFunctions.clear();
         this.displayVisibilityHandlers.clear();

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

@@ -16,7 +16,6 @@ import net.minecraft.ChatFormat;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.gui.Element;
 import net.minecraft.client.gui.screen.Screen;
-import net.minecraft.client.gui.screen.ingame.AbstractContainerScreen;
 import net.minecraft.client.render.GuiLighting;
 import net.minecraft.client.resource.language.I18n;
 import net.minecraft.client.sound.PositionedSoundInstance;
@@ -70,14 +69,6 @@ public class RecipeViewingScreen extends Screen {
         this.choosePageActivated = false;
     }
     
-    public static SpeedCraftFunctional getSpeedCraftFunctionalByCategory(AbstractContainerScreen containerScreen, RecipeCategory category) {
-        for(SpeedCraftFunctional functional : RecipeHelper.getInstance().getSpeedCraftFunctional(category))
-            for(Class aClass : functional.getFunctioningFor())
-                if (containerScreen.getClass().isAssignableFrom(aClass))
-                    return functional;
-        return null;
-    }
-    
     @Override
     public boolean keyPressed(int int_1, int int_2, int int_3) {
         if (int_1 == 256 && choosePageActivated) {
@@ -280,7 +271,6 @@ public class RecipeViewingScreen extends Screen {
             }
         }
         Optional<ButtonAreaSupplier> supplier = RecipeHelper.getInstance().getSpeedCraftButtonArea(selectedCategory);
-        final SpeedCraftFunctional functional = getSpeedCraftFunctionalByCategory(ScreenHelper.getLastContainerScreen(), selectedCategory);
         int recipeHeight = selectedCategory.getDisplayHeight();
         List<RecipeDisplay> currentDisplayed = getCurrentDisplayed();
         for(int i = 0; i < currentDisplayed.size(); i++) {
@@ -290,7 +280,7 @@ public class RecipeViewingScreen extends Screen {
             final Rectangle displayBounds = new Rectangle((int) getBounds().getCenterX() - displayWidth / 2, getBounds().y + 40 + recipeHeight * i + 7 * i, displayWidth, recipeHeight);
             widgets.addAll(selectedCategory.setupDisplay(displaySupplier, displayBounds));
             if (supplier.isPresent())
-                widgets.add(new SpeedCraftingButtonWidget(supplier.get().get(displayBounds), supplier.get().getButtonText(), functional, displaySupplier));
+                widgets.add(new AutoCraftingButtonWidget(supplier.get().get(displayBounds), supplier.get().getButtonText(), displaySupplier));
         }
         if (choosePageActivated)
             recipeChoosePageWidget = new RecipeChoosePageWidget(this, page, getTotalPages(selectedCategory));

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

@@ -38,8 +38,6 @@ import java.util.Map;
 import java.util.Optional;
 import java.util.stream.Collectors;
 
-import static me.shedaniel.rei.gui.RecipeViewingScreen.getSpeedCraftFunctionalByCategory;
-
 public class VillagerRecipeViewingScreen extends Screen {
     
     private static final int TABS_PER_PAGE = 8;
@@ -132,9 +130,8 @@ public class VillagerRecipeViewingScreen extends Screen {
         Rectangle recipeBounds = new Rectangle(bounds.x + 100 + (guiWidth - 100) / 2 - category.getDisplayWidth(display) / 2, bounds.y + bounds.height / 2 - category.getDisplayHeight() / 2, category.getDisplayWidth(display), category.getDisplayHeight());
         this.widgets.addAll(category.setupDisplay(() -> display, recipeBounds));
         Optional<ButtonAreaSupplier> supplier = RecipeHelper.getInstance().getSpeedCraftButtonArea(category);
-        final SpeedCraftFunctional functional = getSpeedCraftFunctionalByCategory(ScreenHelper.getLastContainerScreen(), category);
         if (supplier.isPresent() && supplier.get().get(recipeBounds) != null)
-            this.widgets.add(new SpeedCraftingButtonWidget(supplier.get().get(recipeBounds), supplier.get().getButtonText(), functional, () -> display));
+            this.widgets.add(new AutoCraftingButtonWidget(supplier.get().get(recipeBounds), supplier.get().getButtonText(), () -> display));
         
         int index = 0;
         for(RecipeDisplay recipeDisplay : categoryMap.get(category)) {

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

@@ -5,14 +5,22 @@
 
 package me.shedaniel.rei.gui.credits;
 
+import com.google.common.collect.Lists;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
 import me.shedaniel.rei.client.ScreenHelper;
 import me.shedaniel.rei.gui.credits.CreditsEntryListWidget.CreditsItem;
+import net.fabricmc.loader.api.FabricLoader;
 import net.minecraft.client.gui.screen.Screen;
 import net.minecraft.client.gui.screen.ingame.AbstractContainerScreen;
 import net.minecraft.client.gui.widget.AbstractPressableButtonWidget;
 import net.minecraft.client.resource.language.I18n;
 import net.minecraft.network.chat.TextComponent;
 
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
 public class CreditsScreen extends Screen {
     
     private Screen parent;
@@ -39,7 +47,30 @@ public class CreditsScreen extends Screen {
     protected void init() {
         children.add(entryListWidget = new CreditsEntryListWidget(minecraft, width, height, 32, height - 32));
         entryListWidget.creditsClearEntries();
-        for(String line : I18n.translate("text.rei.credit.text").split("\n"))
+        List<String> translators = Lists.newArrayList();
+        FabricLoader.getInstance().getModContainer("roughlyenoughitems").ifPresent(rei -> {
+            try {
+                if (rei.getMetadata().containsCustomElement("rei:translators")) {
+                    JsonObject jsonObject = rei.getMetadata().getCustomElement("rei:translators").getAsJsonObject();
+                    for(Map.Entry<String, JsonElement> entry : jsonObject.entrySet()) {
+                        JsonElement value = entry.getValue();
+                        String behind = value.isJsonArray() ? Lists.newArrayList(value.getAsJsonArray().iterator()).stream().map(json -> json.getAsString()).sorted(String::compareToIgnoreCase).collect(Collectors.joining(", ")) : value.getAsString();
+                        translators.add(String.format("  %s - %s", entry.getKey(), behind));
+                    }
+                }
+                translators.sort(String::compareToIgnoreCase);
+            } catch (Exception e) {
+                translators.clear();
+                translators.add("Failed to get translators: " + e.toString());
+                for(StackTraceElement traceElement : e.getStackTrace())
+                    translators.add("  at " + traceElement);
+                e.printStackTrace();
+            }
+        });
+        List<String> actualTranslators = Lists.newArrayList();
+        int i = width - 80 - 6;
+        translators.forEach(s -> font.wrapStringToWidthAsList(s, i).forEach(actualTranslators::add));
+        for(String line : I18n.translate("text.rei.credit.text", FabricLoader.getInstance().getModContainer("roughlyenoughitems").map(mod -> mod.getMetadata().getVersion().getFriendlyString()).orElse("Unknown"), String.join("\n", actualTranslators)).split("\n"))
             entryListWidget.creditsAddEntry(new CreditsItem(new TextComponent(line)));
         entryListWidget.creditsAddEntry(new CreditsItem(new TextComponent("")));
         children.add(buttonDone = new AbstractPressableButtonWidget(width / 2 - 100, height - 26, 200, 20, I18n.translate("gui.done")) {

+ 14 - 15
src/main/java/me/shedaniel/rei/gui/widget/SpeedCraftingButtonWidget.java → src/main/java/me/shedaniel/rei/gui/widget/AutoCraftingButtonWidget.java

@@ -6,40 +6,39 @@
 package me.shedaniel.rei.gui.widget;
 
 import me.shedaniel.rei.api.RecipeDisplay;
-import me.shedaniel.rei.api.SpeedCraftFunctional;
 import me.shedaniel.rei.client.ScreenHelper;
 import net.minecraft.ChatFormat;
+import net.minecraft.client.gui.screen.ingame.AbstractContainerScreen;
 import net.minecraft.client.resource.language.I18n;
-import net.minecraft.recipe.Recipe;
+import net.minecraft.util.Identifier;
 
 import java.awt.*;
 import java.util.Optional;
 import java.util.function.Supplier;
 
-public class SpeedCraftingButtonWidget extends ButtonWidget {
+public class AutoCraftingButtonWidget extends ButtonWidget {
     
     private final Supplier<RecipeDisplay> displaySupplier;
-    private final SpeedCraftFunctional functional;
     private String extraTooltip;
+    private AbstractContainerScreen containerScreen;
     
-    public SpeedCraftingButtonWidget(Rectangle rectangle, String text, SpeedCraftFunctional functional, Supplier<RecipeDisplay> displaySupplier) {
+    public AutoCraftingButtonWidget(Rectangle rectangle, String text, Supplier<RecipeDisplay> displaySupplier) {
         super(rectangle, text);
         this.displaySupplier = displaySupplier;
-        this.functional = functional;
-        Optional<Recipe> recipe = displaySupplier.get().getRecipe();
-        extraTooltip = recipe.isPresent() ? I18n.translate("text.rei.recipe_id", ChatFormat.GRAY.toString(), recipe.get().getId().toString()) : "";
+        Optional<Identifier> recipe = displaySupplier.get().getRecipeLocation();
+        extraTooltip = recipe.isPresent() ? I18n.translate("text.rei.recipe_id", ChatFormat.GRAY.toString(), recipe.get().toString()) : "";
+        this.containerScreen = ScreenHelper.getLastContainerScreen();
     }
     
     @Override
     public void onPressed() {
-        minecraft.openScreen(ScreenHelper.getLastContainerScreen());
+        minecraft.openScreen(containerScreen);
         ScreenHelper.getLastOverlay().init();
-        functional.performAutoCraft(ScreenHelper.getLastContainerScreen(), displaySupplier.get());
     }
     
     @Override
     public void render(int mouseX, int mouseY, float delta) {
-        this.enabled = functional != null && functional.acceptRecipe(ScreenHelper.getLastContainerScreen(), displaySupplier.get());
+        this.enabled = true;
         super.render(mouseX, mouseY, delta);
     }
     
@@ -47,12 +46,12 @@ public class SpeedCraftingButtonWidget extends ButtonWidget {
     public Optional<String> getTooltips() {
         if (this.minecraft.options.advancedItemTooltips)
             if (enabled)
-                return Optional.ofNullable(I18n.translate("text.speed_craft.move_items") + extraTooltip);
+                return Optional.ofNullable(I18n.translate("text.auto_craft.move_items") + extraTooltip);
             else
-                return Optional.ofNullable(I18n.translate("text.speed_craft.failed_move_items") + extraTooltip);
+                return Optional.ofNullable(I18n.translate("text.auto_craft.failed_move_items") + extraTooltip);
         if (enabled)
-            return Optional.ofNullable(I18n.translate("text.speed_craft.move_items"));
+            return Optional.ofNullable(I18n.translate("text.auto_craft.move_items"));
         else
-            return Optional.ofNullable(I18n.translate("text.speed_craft.failed_move_items"));
+            return Optional.ofNullable(I18n.translate("text.auto_craft.failed_move_items"));
     }
 }

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

@@ -9,6 +9,7 @@ import me.shedaniel.rei.api.RecipeDisplay;
 import net.minecraft.block.entity.FurnaceBlockEntity;
 import net.minecraft.item.Item;
 import net.minecraft.item.ItemStack;
+import net.minecraft.recipe.AbstractCookingRecipe;
 import net.minecraft.recipe.BlastingRecipe;
 import net.minecraft.util.Identifier;
 
@@ -32,8 +33,8 @@ public class DefaultBlastingDisplay implements RecipeDisplay<BlastingRecipe> {
     }
     
     @Override
-    public Optional<BlastingRecipe> getRecipe() {
-        return Optional.ofNullable(display);
+    public Optional<Identifier> getRecipeLocation() {
+        return Optional.ofNullable(display).map(AbstractCookingRecipe::getId);
     }
     
     @Override

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

@@ -10,10 +10,12 @@ import me.shedaniel.rei.api.RecipeDisplay;
 import net.minecraft.block.Blocks;
 import net.minecraft.item.ItemStack;
 import net.minecraft.recipe.Ingredient;
-import net.minecraft.recipe.Recipe;
 import net.minecraft.util.Identifier;
 
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
 
 public class DefaultBrewingDisplay implements RecipeDisplay {
     
@@ -26,11 +28,6 @@ public class DefaultBrewingDisplay implements RecipeDisplay {
         this.output = output;
     }
     
-    @Override
-    public Optional<Recipe> getRecipe() {
-        return Optional.empty();
-    }
-    
     @Override
     public List<List<ItemStack>> getInput() {
         return Lists.newArrayList(Collections.singletonList(input), Arrays.asList(reactant.getStackArray()));

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

@@ -7,6 +7,7 @@ package me.shedaniel.rei.plugin;
 
 import me.shedaniel.rei.api.RecipeDisplay;
 import net.minecraft.item.ItemStack;
+import net.minecraft.recipe.AbstractCookingRecipe;
 import net.minecraft.recipe.CampfireCookingRecipe;
 import net.minecraft.recipe.Ingredient;
 import net.minecraft.util.DefaultedList;
@@ -41,8 +42,8 @@ public class DefaultCampfireDisplay implements RecipeDisplay<CampfireCookingReci
     }
     
     @Override
-    public Optional<CampfireCookingRecipe> getRecipe() {
-        return Optional.ofNullable(display);
+    public Optional<Identifier> getRecipeLocation() {
+        return Optional.ofNullable(display).map(AbstractCookingRecipe::getId);
     }
     
     @Override

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

@@ -9,7 +9,6 @@ import me.shedaniel.rei.api.RecipeDisplay;
 import net.minecraft.item.Item;
 import net.minecraft.item.ItemConvertible;
 import net.minecraft.item.ItemStack;
-import net.minecraft.recipe.Recipe;
 import net.minecraft.util.Identifier;
 
 import java.util.*;
@@ -34,11 +33,6 @@ public class DefaultCompostingDisplay implements RecipeDisplay {
         return page;
     }
     
-    @Override
-    public Optional<Recipe> getRecipe() {
-        return Optional.empty();
-    }
-    
     @Override
     public List<List<ItemStack>> getInput() {
         List<List<ItemStack>> lists = new ArrayList<>();

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

@@ -8,6 +8,7 @@ package me.shedaniel.rei.plugin;
 import com.google.common.collect.Lists;
 import net.minecraft.item.ItemStack;
 import net.minecraft.recipe.Recipe;
+import net.minecraft.util.Identifier;
 
 import java.util.List;
 import java.util.Optional;
@@ -41,9 +42,13 @@ public class DefaultCustomDisplay implements DefaultCraftingDisplay {
         this(input, output, null);
     }
     
+    public Recipe getPossibleRecipe() {
+        return possibleRecipe;
+    }
+    
     @Override
-    public Optional<Recipe> getRecipe() {
-        return Optional.ofNullable(possibleRecipe);
+    public Optional<Identifier> getRecipeLocation() {
+        return Optional.ofNullable(possibleRecipe).map(Recipe::getId);
     }
     
     @Override

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

@@ -13,11 +13,10 @@ import me.shedaniel.rei.client.ScreenHelper;
 import me.shedaniel.rei.gui.RecipeViewingScreen;
 import me.shedaniel.rei.gui.VillagerRecipeViewingScreen;
 import me.shedaniel.rei.listeners.ContainerScreenHooks;
-import me.shedaniel.rei.listeners.RecipeBookGuiHooks;
 import net.minecraft.block.ComposterBlock;
 import net.minecraft.client.MinecraftClient;
-import net.minecraft.client.gui.screen.Screen;
-import net.minecraft.client.gui.screen.ingame.*;
+import net.minecraft.client.gui.screen.ingame.AbstractContainerScreen;
+import net.minecraft.client.gui.screen.ingame.CreativeInventoryScreen;
 import net.minecraft.client.gui.screen.recipebook.RecipeBookProvider;
 import net.minecraft.client.recipe.book.ClientRecipeBook;
 import net.minecraft.container.CraftingContainer;
@@ -134,7 +133,7 @@ public class DefaultPlugin implements REIPluginEntry {
         if (ComposterBlock.ITEM_TO_LEVEL_INCREASE_CHANCE.isEmpty())
             ComposterBlock.registerDefaultCompostableItems();
         ComposterBlock.ITEM_TO_LEVEL_INCREASE_CHANCE.keySet().forEach(itemConvertible -> {
-            float chance = ComposterBlock.ITEM_TO_LEVEL_INCREASE_CHANCE.get(itemConvertible);
+            float chance = ComposterBlock.ITEM_TO_LEVEL_INCREASE_CHANCE.getOrDefault(itemConvertible, 0);
             if (chance > 0)
                 map.put(itemConvertible, chance);
         });
@@ -269,6 +268,7 @@ public class DefaultPlugin implements REIPluginEntry {
         recipeHelper.registerWorkingStations(STONE_CUTTING, new ItemStack(Items.STONECUTTER));
         recipeHelper.registerWorkingStations(COMPOSTING, new ItemStack(Items.COMPOSTER));
         recipeHelper.registerSpeedCraftButtonArea(COMPOSTING, bounds -> null);
+        recipeHelper.registerSpeedCraftButtonArea(DefaultPlugin.CAMPFIRE, bounds -> new Rectangle((int) bounds.getMaxX() - 16, bounds.y + 6, 10, 10));
         recipeHelper.registerRecipeVisibilityHandler(new DisplayVisibilityHandler() {
             @Override
             public DisplayVisibility handleDisplay(RecipeCategory category, RecipeDisplay display) {
@@ -280,101 +280,6 @@ public class DefaultPlugin implements REIPluginEntry {
                 return -1f;
             }
         });
-        recipeHelper.registerSpeedCraftButtonArea(DefaultPlugin.CAMPFIRE, bounds -> new Rectangle((int) bounds.getMaxX() - 16, bounds.y + 6, 10, 10));
-        recipeHelper.registerSpeedCraftFunctional(DefaultPlugin.CRAFTING, new SpeedCraftFunctional<DefaultCraftingDisplay>() {
-            @Override
-            public Class[] getFunctioningFor() {
-                return new Class[]{InventoryScreen.class, CraftingTableScreen.class};
-            }
-            
-            @Override
-            public boolean performAutoCraft(Screen screen, DefaultCraftingDisplay recipe) {
-                if (!recipe.getRecipe().isPresent())
-                    return false;
-                if (screen.getClass().isAssignableFrom(CraftingTableScreen.class))
-                    ((RecipeBookGuiHooks) (((CraftingTableScreen) screen).getRecipeBookGui())).rei_getGhostSlots().reset();
-                else if (screen.getClass().isAssignableFrom(InventoryScreen.class))
-                    ((RecipeBookGuiHooks) (((InventoryScreen) screen).getRecipeBookGui())).rei_getGhostSlots().reset();
-                else
-                    return false;
-                MinecraftClient.getInstance().interactionManager.clickRecipe(MinecraftClient.getInstance().player.container.syncId, (Recipe<?>) recipe.getRecipe().get(), Screen.hasShiftDown());
-                return true;
-            }
-            
-            @Override
-            public boolean acceptRecipe(Screen screen, DefaultCraftingDisplay recipe) {
-                return screen instanceof CraftingTableScreen || (screen instanceof InventoryScreen && recipe.getHeight() < 3 && recipe.getWidth() < 3);
-            }
-        });
-        recipeHelper.registerSpeedCraftFunctional(DefaultPlugin.SMELTING, new SpeedCraftFunctional<DefaultSmeltingDisplay>() {
-            @Override
-            public Class[] getFunctioningFor() {
-                return new Class[]{FurnaceScreen.class};
-            }
-            
-            @Override
-            public boolean performAutoCraft(Screen screen, DefaultSmeltingDisplay recipe) {
-                if (!recipe.getRecipe().isPresent())
-                    return false;
-                if (screen instanceof FurnaceScreen)
-                    ((RecipeBookGuiHooks) (((FurnaceScreen) screen).getRecipeBookGui())).rei_getGhostSlots().reset();
-                else
-                    return false;
-                MinecraftClient.getInstance().interactionManager.clickRecipe(MinecraftClient.getInstance().player.container.syncId, (Recipe<?>) recipe.getRecipe().get(), Screen.hasShiftDown());
-                return true;
-            }
-            
-            @Override
-            public boolean acceptRecipe(Screen screen, DefaultSmeltingDisplay recipe) {
-                return screen instanceof FurnaceScreen;
-            }
-        });
-        recipeHelper.registerSpeedCraftFunctional(DefaultPlugin.SMOKING, new SpeedCraftFunctional<DefaultSmokingDisplay>() {
-            @Override
-            public Class[] getFunctioningFor() {
-                return new Class[]{SmokerScreen.class};
-            }
-            
-            @Override
-            public boolean performAutoCraft(Screen screen, DefaultSmokingDisplay recipe) {
-                if (!recipe.getRecipe().isPresent())
-                    return false;
-                if (screen instanceof SmokerScreen)
-                    ((RecipeBookGuiHooks) (((SmokerScreen) screen).getRecipeBookGui())).rei_getGhostSlots().reset();
-                else
-                    return false;
-                MinecraftClient.getInstance().interactionManager.clickRecipe(MinecraftClient.getInstance().player.container.syncId, (Recipe<?>) recipe.getRecipe().get(), Screen.hasShiftDown());
-                return true;
-            }
-            
-            @Override
-            public boolean acceptRecipe(Screen screen, DefaultSmokingDisplay recipe) {
-                return screen instanceof SmokerScreen;
-            }
-        });
-        recipeHelper.registerSpeedCraftFunctional(DefaultPlugin.BLASTING, new SpeedCraftFunctional<DefaultBlastingDisplay>() {
-            @Override
-            public Class[] getFunctioningFor() {
-                return new Class[]{BlastFurnaceScreen.class};
-            }
-            
-            @Override
-            public boolean acceptRecipe(Screen screen, DefaultBlastingDisplay recipe) {
-                return screen instanceof BlastFurnaceScreen;
-            }
-            
-            @Override
-            public boolean performAutoCraft(Screen screen, DefaultBlastingDisplay recipe) {
-                if (!recipe.getRecipe().isPresent())
-                    return false;
-                if (screen instanceof BlastFurnaceScreen)
-                    ((RecipeBookGuiHooks) (((BlastFurnaceScreen) screen).getRecipeBookGui())).rei_getGhostSlots().reset();
-                else
-                    return false;
-                MinecraftClient.getInstance().interactionManager.clickRecipe(MinecraftClient.getInstance().player.container.syncId, (Recipe<?>) recipe.getRecipe().get(), Screen.hasShiftDown());
-                return true;
-            }
-        });
     }
     
     @Override

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

@@ -8,6 +8,7 @@ package me.shedaniel.rei.plugin;
 import net.minecraft.item.ItemStack;
 import net.minecraft.recipe.Recipe;
 import net.minecraft.recipe.ShapedRecipe;
+import net.minecraft.util.Identifier;
 
 import java.util.Arrays;
 import java.util.Collections;
@@ -28,8 +29,8 @@ public class DefaultShapedDisplay implements DefaultCraftingDisplay<ShapedRecipe
     }
     
     @Override
-    public Optional<Recipe> getRecipe() {
-        return Optional.ofNullable(display);
+    public Optional<Identifier> getRecipeLocation() {
+        return Optional.ofNullable(display).map(ShapedRecipe::getId);
     }
     
     @Override

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

@@ -7,6 +7,7 @@ package me.shedaniel.rei.plugin;
 
 import net.minecraft.item.ItemStack;
 import net.minecraft.recipe.ShapelessRecipe;
+import net.minecraft.util.Identifier;
 
 import java.util.Arrays;
 import java.util.Collections;
@@ -27,8 +28,8 @@ public class DefaultShapelessDisplay implements DefaultCraftingDisplay {
     }
     
     @Override
-    public Optional<ShapelessRecipe> getRecipe() {
-        return Optional.ofNullable(display);
+    public Optional<Identifier> getRecipeLocation() {
+        return Optional.ofNullable(display).map(ShapelessRecipe::getId);
     }
     
     @Override

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

@@ -9,6 +9,7 @@ import me.shedaniel.rei.api.RecipeDisplay;
 import net.minecraft.block.entity.FurnaceBlockEntity;
 import net.minecraft.item.Item;
 import net.minecraft.item.ItemStack;
+import net.minecraft.recipe.AbstractCookingRecipe;
 import net.minecraft.recipe.SmeltingRecipe;
 import net.minecraft.util.Identifier;
 
@@ -32,8 +33,8 @@ public class DefaultSmeltingDisplay implements RecipeDisplay<SmeltingRecipe> {
     }
     
     @Override
-    public Optional<SmeltingRecipe> getRecipe() {
-        return Optional.ofNullable(display);
+    public Optional<Identifier> getRecipeLocation() {
+        return Optional.ofNullable(display).map(AbstractCookingRecipe::getId);
     }
     
     @Override

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

@@ -9,6 +9,7 @@ import me.shedaniel.rei.api.RecipeDisplay;
 import net.minecraft.block.entity.FurnaceBlockEntity;
 import net.minecraft.item.Item;
 import net.minecraft.item.ItemStack;
+import net.minecraft.recipe.AbstractCookingRecipe;
 import net.minecraft.recipe.SmokingRecipe;
 import net.minecraft.util.Identifier;
 
@@ -32,8 +33,8 @@ public class DefaultSmokingDisplay implements RecipeDisplay<SmokingRecipe> {
     }
     
     @Override
-    public Optional<SmokingRecipe> getRecipe() {
-        return Optional.ofNullable(display);
+    public Optional<Identifier> getRecipeLocation() {
+        return Optional.ofNullable(display).map(AbstractCookingRecipe::getId);
     }
     
     @Override

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

@@ -7,6 +7,7 @@ package me.shedaniel.rei.plugin;
 
 import me.shedaniel.rei.api.RecipeDisplay;
 import net.minecraft.item.ItemStack;
+import net.minecraft.recipe.CuttingRecipe;
 import net.minecraft.recipe.Ingredient;
 import net.minecraft.recipe.StonecuttingRecipe;
 import net.minecraft.util.DefaultedList;
@@ -35,8 +36,8 @@ public class DefaultStoneCuttingDisplay implements RecipeDisplay<StonecuttingRec
     }
     
     @Override
-    public Optional<StonecuttingRecipe> getRecipe() {
-        return Optional.ofNullable(display);
+    public Optional<Identifier> getRecipeLocation() {
+        return Optional.ofNullable(display).map(CuttingRecipe::getId);
     }
     
     @Override

+ 2 - 2
src/main/resources/assets/roughlyenoughitems/lang/bg_bg.json

@@ -32,8 +32,8 @@
   "ordering.rei.registry": "Регистратурен ред",
   "ordering.rei.name": "Име",
   "ordering.rei.item_groups": "Групи предмети",
-  "text.speed_craft.failed_move_items": "§cНеуспешно местене на предмети!",
-  "text.speed_craft.move_items": "Премести предмети",
+  "text.auto_craft.failed_move_items": "§cНеуспешно местене на предмети!",
+  "text.auto_craft.move_items": "Премести предмети",
   "text.rei.config.enable_craftable_only": "Включи филтър за показване само на изработваеми предмети: ",
   "text.rei.showing_craftable": "Показват се само изработваеми предмети",
   "text.rei.showing_all": "Показват се всички предмети",

+ 2 - 2
src/main/resources/assets/roughlyenoughitems/lang/de_de.json

@@ -23,8 +23,8 @@
   "ordering.rei.descending": "Absteigend",
   "ordering.rei.registry": "Registrierung",
   "ordering.rei.item_groups": "Itemgruppen",
-  "text.speed_craft.failed_move_items": "§cItems können nicht bewegt werden!",
-  "text.speed_craft.move_items": "Items bewegen",
+  "text.auto_craft.failed_move_items": "§cItems können nicht bewegt werden!",
+  "text.auto_craft.move_items": "Items bewegen",
   "text.rei.config.enable_craftable_only": "Aktiviere nur Herstellen: ",
   "text.rei.showing_craftable": "Zeige herstellbar",
   "text.rei.showing_all": "Zeige alle",

+ 2 - 2
src/main/resources/assets/roughlyenoughitems/lang/en_ud.json

@@ -29,8 +29,8 @@
   "ordering.rei.registry": "ʎɹʇsᴉƃǝɹ",
   "ordering.rei.name": "ǝɯɐN",
   "ordering.rei.item_groups": "sdnoɹפ ɯǝʇI",
-  "text.speed_craft.failed_move_items": "§c¡sɯǝʇᴉ ǝʌoɯ ʇ,uɐƆ",
-  "text.speed_craft.move_items": "sɯǝʇI ǝʌoW",
+  "text.auto_craft.failed_move_items": "§c¡sɯǝʇᴉ ǝʌoɯ ʇ,uɐƆ",
+  "text.auto_craft.move_items": "sɯǝʇI ǝʌoW",
   "text.rei.config.enable_craftable_only": "ɹǝʇlᴉℲ ǝlqɐʇɟɐɹƆ ǝlqɐuƎ: ",
   "text.rei.showing_craftable": "ǝlqɐʇɟɐɹƆ ƃuᴉʍoɥS",
   "text.rei.showing_all": "ll∀ ƃuᴉʍoɥS",

+ 3 - 4
src/main/resources/assets/roughlyenoughitems/lang/en_us.json

@@ -44,8 +44,8 @@
   "ordering.rei.registry": "Registry",
   "ordering.rei.name": "Name",
   "ordering.rei.item_groups": "Item Groups",
-  "text.speed_craft.failed_move_items": "§cCan't move items!",
-  "text.speed_craft.move_items": "Move Items",
+  "text.auto_craft.failed_move_items": "§cCan't move items!",
+  "text.auto_craft.move_items": "Move Items",
   "text.rei.config.enable_craftable_only": "Enable Craftable Filter: ",
   "text.rei.showing_craftable": "Showing Craftable",
   "text.rei.showing_all": "Showing All",
@@ -116,6 +116,5 @@
   "tooltip.rei.config.light_gray_recipe_border": "Declares the appearance of the recipe border:\nYes: Light Gray\nNo: Hard Black\n \nDefaulted: No",
   "tooltip.rei.config.april_fools.2019": "Forcefully enables the 2019 april fools joke:\nValues: Yes / No\n \nDefaulted: No",
   "tooltip.rei.config.register_in_other_thread": "Requires datapacks to be reloaded.\nCan be done by rejoin the world / server",
-  "_comment": "Don't change / translate the credit down below if you are doing it :)",
-  "text.rei.credit.text": "§lRoughly Enough Items\n§7Originally a fork for Almost Enough Items.\n\n§lDevelopers\n  - Originally by ZenDarva\n  - Created by Danielshe\n  - Plugin Support by TehNut\n\n§lLanguage Translation\n  English - Danielshe\n  Simplified Chinese - XuyuEre & Danielshe\n  Traditional Chinese - hugoalh, gxy17886 & Danielshe\n  French - Yanis48\n  German - MelanX\n  Estonian - Madis0\n  Portuguese - thiagokenis\n  LOLCAT - Danielshe\n  Upside Down - Danielshe\n  Brazilian Portuguese - thiagokenis\n  Bulgarian - geniiii\n\n§lLicense\n§7Roughly Enough Items is using MIT."
+  "text.rei.credit.text": "§lRoughly Enough Items (v%s)\n§7Originally a fork for Almost Enough Items.\n\n§lDevelopers\n  Originally by ZenDarva\n  Continued by Danielshe\n  Plugin Support by TehNut\n\n§lLanguage Translation\n%s\n\n§lLicense\n§7Roughly Enough Items is licensed with MIT."
 }

+ 2 - 2
src/main/resources/assets/roughlyenoughitems/lang/et_ee.json

@@ -41,8 +41,8 @@
   "ordering.rei.registry": "Register",
   "ordering.rei.name": "Nimi",
   "ordering.rei.item_groups": "Esemegrupid",
-  "text.speed_craft.failed_move_items": "§cEsemeid ei saa liigutada!",
-  "text.speed_craft.move_items": "Liiguta esemeid",
+  "text.auto_craft.failed_move_items": "§cEsemeid ei saa liigutada!",
+  "text.auto_craft.move_items": "Liiguta esemeid",
   "text.rei.config.enable_craftable_only": "Luba meisterdatavate filter: ",
   "text.rei.showing_craftable": "Kuvab meisterdatavaid",
   "text.rei.showing_all": "Kuvab kõiki",

+ 2 - 2
src/main/resources/assets/roughlyenoughitems/lang/fr_fr.json

@@ -29,8 +29,8 @@
   "ordering.rei.registry": "Registre",
   "ordering.rei.name": "Nom",
   "ordering.rei.item_groups": "Groupes d'objets",
-  "text.speed_craft.failed_move_items": "§cImpossible de déplacer les objets!",
-  "text.speed_craft.move_items": "Déplacer les objets",
+  "text.auto_craft.failed_move_items": "§cImpossible de déplacer les objets!",
+  "text.auto_craft.move_items": "Déplacer les objets",
   "text.rei.config.enable_craftable_only": "Activer les recettes réalisables uniquement : ",
   "text.rei.showing_craftable": "Recettes réalisables",
   "text.rei.showing_all": "Toutes les recettes",

+ 2 - 2
src/main/resources/assets/roughlyenoughitems/lang/lol_us.json

@@ -29,8 +29,8 @@
   "ordering.rei.registry": "Registry",
   "ordering.rei.name": "Nam",
   "ordering.rei.item_groups": "Itmz groupz",
-  "text.speed_craft.failed_move_items": "§cKan'z m0v itemz!",
-  "text.speed_craft.move_items": "M0v Itemz",
+  "text.auto_craft.failed_move_items": "§cKan'z m0v itemz!",
+  "text.auto_craft.move_items": "M0v Itemz",
   "text.rei.config.enable_craftable_only": "Enabel craftabel fit3r: ",
   "text.rei.showing_craftable": "Sowin Craftabel",
   "text.rei.showing_all": "Sowin all",

+ 2 - 2
src/main/resources/assets/roughlyenoughitems/lang/pt_br.json

@@ -31,8 +31,8 @@
   "ordering.rei.registry": "Registro",
   "ordering.rei.name": "Nome",
   "ordering.rei.item_groups": "Grupo de itens",
-  "text.speed_craft.failed_move_items": "§cNão pode mover os itens!",
-  "text.speed_craft.move_items": "Mover itens",
+  "text.auto_craft.failed_move_items": "§cNão pode mover os itens!",
+  "text.auto_craft.move_items": "Mover itens",
   "text.rei.config.enable_craftable_only": "Habilitar filtro de criação: ",
   "text.rei.showing_craftable": "Mostrando itens Criáveis",
   "text.rei.showing_all": "Mostrando tudo",

+ 2 - 2
src/main/resources/assets/roughlyenoughitems/lang/zh_cn.json

@@ -41,8 +41,8 @@
   "ordering.rei.registry": "注册",
   "ordering.rei.name": "名字",
   "ordering.rei.item_groups": "物品组",
-  "text.speed_craft.failed_move_items": "§c不能移动物品!",
-  "text.speed_craft.move_items": "移动物品",
+  "text.auto_craft.failed_move_items": "§c不能移动物品!",
+  "text.auto_craft.move_items": "移动物品",
   "text.rei.config.enable_craftable_only": "过滤不可合成的物品: ",
   "text.rei.showing_craftable": "显示可合成的物品",
   "text.rei.showing_all": "显示所有物品",

+ 2 - 2
src/main/resources/assets/roughlyenoughitems/lang/zh_tw.json

@@ -41,8 +41,8 @@
   "ordering.rei.registry": "註冊",
   "ordering.rei.name": "名字",
   "ordering.rei.item_groups": "物品組",
-  "text.speed_craft.failed_move_items": "§c不能移動物品!",
-  "text.speed_craft.move_items": "移動物品",
+  "text.auto_craft.failed_move_items": "§c不能移動物品!",
+  "text.auto_craft.move_items": "移動物品",
   "text.rei.config.enable_craftable_only": "過濾不可合成的物品: ",
   "text.rei.showing_craftable": "顯示可合成的物品",
   "text.rei.showing_all": "顯示所有物品",

+ 13 - 1
src/main/resources/fabric.mod.json

@@ -42,6 +42,18 @@
     "listeners.roughlyenoughitems.mixins.json"
   ],
   "custom": {
-    "modmenu:clientsideOnly": true
+    "rei:translators": {
+      "English": "Danielshe",
+      "Simplified Chinese": ["XuyuEre", "Danielshe"],
+      "Traditional Chinese": ["hugoalh", "gxy17886", "Danielshe"],
+      "French": "Yanis48",
+      "German": "MelanX",
+      "Estonian": "Madis0",
+      "Portuguese": "thiagokenis",
+      "LOLCAT": "Danielshe",
+      "Upside Down English": "Danielshe",
+      "Brazilian Portuguese": "thiagokenis",
+      "Bulgarian": "geniiii"
+    }
   }
 }