Browse Source

Adds Composting Recipes

Unknown 6 năm trước cách đây
mục cha
commit
73fd136d94

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

@@ -102,7 +102,7 @@ public class VillagerRecipeViewingScreen extends Screen {
         if (!workingStations.isEmpty()) {
             int ww = MathHelper.floor((bounds.width - 16) / 18f);
             int w = Math.min(ww, workingStations.size());
-            int h = MathHelper.ceil(workingStations.size() / ((float)ww));
+            int h = MathHelper.ceil(workingStations.size() / ((float) ww));
             int xx = bounds.x + 16;
             int yy = bounds.y + bounds.height + 5;
             widgets.add(new CategoryBaseWidget(new Rectangle(xx - 6, bounds.y + bounds.height - 5, 11 + w * 18, 15 + h * 18)));
@@ -133,7 +133,7 @@ public class VillagerRecipeViewingScreen extends Screen {
         this.widgets.addAll(category.setupDisplay(() -> display, recipeBounds));
         Optional<ButtonAreaSupplier> supplier = RecipeHelper.getInstance().getSpeedCraftButtonArea(category);
         final SpeedCraftFunctional functional = getSpeedCraftFunctionalByCategory(ScreenHelper.getLastContainerScreen(), category);
-        if (supplier.isPresent())
+        if (supplier.isPresent() && supplier.get().get(recipeBounds) != null)
             this.widgets.add(new SpeedCraftingButtonWidget(supplier.get().get(recipeBounds), supplier.get().getButtonText(), functional, () -> display));
         
         int index = 0;

+ 123 - 0
src/main/java/me/shedaniel/rei/plugin/DefaultCompostingCategory.java

@@ -0,0 +1,123 @@
+/*
+ * Roughly Enough Items by Danielshe.
+ * Licensed under the MIT License.
+ */
+
+package me.shedaniel.rei.plugin;
+
+import com.google.common.collect.Lists;
+import com.mojang.blaze3d.platform.GlStateManager;
+import me.shedaniel.rei.api.*;
+import me.shedaniel.rei.gui.renderables.RecipeRenderer;
+import me.shedaniel.rei.gui.widget.RecipeBaseWidget;
+import me.shedaniel.rei.gui.widget.SlotWidget;
+import me.shedaniel.rei.gui.widget.Widget;
+import net.minecraft.block.Blocks;
+import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.render.GuiLighting;
+import net.minecraft.client.resource.language.I18n;
+import net.minecraft.item.ItemConvertible;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.Identifier;
+import net.minecraft.util.math.MathHelper;
+
+import java.awt.*;
+import java.util.Arrays;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.function.Supplier;
+
+public class DefaultCompostingCategory implements RecipeCategory<DefaultCompostingDisplay> {
+    
+    @Override
+    public Identifier getIdentifier() {
+        return DefaultPlugin.COMPOSTING;
+    }
+    
+    @Override
+    public Renderer getIcon() {
+        return Renderable.fromItemStack(new ItemStack(Blocks.COMPOSTER));
+    }
+    
+    @Override
+    public String getCategoryName() {
+        return I18n.translate("category.rei.composting");
+    }
+    
+    @Override
+    public RecipeRenderer getSimpleRenderer(DefaultCompostingDisplay recipe) {
+        return new RecipeRenderer() {
+            @Override
+            public int getHeight() {
+                return 10 + MinecraftClient.getInstance().textRenderer.fontHeight;
+            }
+            
+            @Override
+            public void render(int x, int y, double mouseX, double mouseY, float delta) {
+                MinecraftClient.getInstance().textRenderer.draw(I18n.translate("text.rei.composting.page", recipe.getPage() + 1), x + 5, y + 6, -1);
+            }
+        };
+    }
+    
+    @Override
+    public List<Widget> setupDisplay(Supplier<DefaultCompostingDisplay> recipeDisplaySupplier, Rectangle bounds) {
+        List<Widget> widgets = Lists.newArrayList();
+        Point startingPoint = new Point(bounds.x + bounds.width - 55, bounds.y + 110);
+        widgets.add(new RecipeBaseWidget(bounds) {
+            @Override
+            public void render(int mouseX, int mouseY, float partialTicks) {
+                GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F);
+                GuiLighting.disable();
+                MinecraftClient.getInstance().getTextureManager().bindTexture(DefaultPlugin.getDisplayTexture());
+                this.blit(startingPoint.x, startingPoint.y, 28, 221, 55, 26);
+            }
+        });
+        List<ItemConvertible> stacks = new LinkedList<>(recipeDisplaySupplier.get().getItemsByOrder());
+        int i = 0;
+        for(int y = 0; y < 6; y++)
+            for(int x = 0; x < 8; x++) {
+                widgets.add(new SlotWidget((int) bounds.getCenterX() - 72 + x * 18, bounds.y + y * 18, stacks.size() > i ? Arrays.asList(stacks.get(i).asItem().getDefaultStack()) : Lists.newArrayList(), true, true, true) {
+                    @Override
+                    protected List<String> getExtraToolTips(ItemStack stack) {
+                        final List<String>[] thing = new List[]{null};
+                        recipeDisplaySupplier.get().getInputMap().forEach((itemProvider, aFloat) -> {
+                            if (itemProvider.asItem().equals(stack.getItem()))
+                                thing[0] = Arrays.asList(I18n.translate("text.rei.composting.chance", MathHelper.fastFloor(aFloat * 100)));
+                        });
+                        if (thing[0] != null)
+                            return thing[0];
+                        return super.getExtraToolTips(stack);
+                    }
+                });
+                i++;
+            }
+        widgets.add(new SlotWidget((int) startingPoint.x + 34, startingPoint.y + 5, recipeDisplaySupplier.get().getOutput(), false, true, true));
+        return widgets;
+    }
+    
+    @Override
+    public DisplaySettings getDisplaySettings() {
+        return new DisplaySettings() {
+            @Override
+            public int getDisplayHeight(RecipeCategory iRecipeCategory) {
+                return 140;
+            }
+            
+            @Override
+            public int getDisplayWidth(RecipeCategory iRecipeCategory, RecipeDisplay display) {
+                return 150;
+            }
+            
+            @Override
+            public int getMaximumRecipePerPage(RecipeCategory iRecipeCategory) {
+                return -1;
+            }
+            
+            @Override
+            public int getFixedRecipesPerPage() {
+                return 1;
+            }
+        };
+    }
+    
+}

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

@@ -0,0 +1,74 @@
+/*
+ * Roughly Enough Items by Danielshe.
+ * Licensed under the MIT License.
+ */
+
+package me.shedaniel.rei.plugin;
+
+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.*;
+import java.util.stream.Collectors;
+
+public class DefaultCompostingDisplay implements RecipeDisplay {
+    
+    private List<ItemConvertible> order, allItems;
+    private Map<ItemConvertible, Float> inputMap;
+    private ItemStack[] output;
+    private int page;
+    
+    public DefaultCompostingDisplay(int page, List<ItemConvertible> order, Map<ItemConvertible, Float> inputMap, List<ItemConvertible> allItems, ItemStack[] output) {
+        this.page = page;
+        this.order = order;
+        this.inputMap = inputMap;
+        this.output = output;
+        this.allItems = allItems;
+    }
+    
+    public int getPage() {
+        return page;
+    }
+    
+    @Override
+    public Optional<Recipe> getRecipe() {
+        return Optional.empty();
+    }
+    
+    @Override
+    public List<List<ItemStack>> getInput() {
+        List<List<ItemStack>> lists = new ArrayList<>();
+        allItems.stream().forEachOrdered(itemProvider -> {
+            lists.add(Arrays.asList(itemProvider.asItem().getDefaultStack()));
+        });
+        return lists;
+    }
+    
+    public Map<ItemConvertible, Float> getInputMap() {
+        return inputMap;
+    }
+    
+    @Override
+    public List<ItemStack> getOutput() {
+        return Arrays.asList(output);
+    }
+    
+    @Override
+    public Identifier getRecipeCategory() {
+        return DefaultPlugin.COMPOSTING;
+    }
+    
+    @Override
+    public List<List<ItemStack>> getRequiredItems() {
+        return Arrays.asList(new LinkedList<>(allItems.stream().map(ItemConvertible::asItem).map(Item::getDefaultStack).collect(Collectors.toList())));
+    }
+    
+    public List<ItemConvertible> getItemsByOrder() {
+        return order;
+    }
+    
+}

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

@@ -6,6 +6,7 @@
 package me.shedaniel.rei.plugin;
 
 import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
 import me.shedaniel.rei.RoughlyEnoughItemsCore;
 import me.shedaniel.rei.api.*;
 import me.shedaniel.rei.client.ScreenHelper;
@@ -13,6 +14,7 @@ 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.*;
@@ -21,11 +23,13 @@ import net.minecraft.client.recipe.book.ClientRecipeBook;
 import net.minecraft.container.CraftingContainer;
 import net.minecraft.enchantment.Enchantment;
 import net.minecraft.enchantment.EnchantmentHelper;
+import net.minecraft.item.ItemConvertible;
 import net.minecraft.item.ItemStack;
 import net.minecraft.item.Items;
 import net.minecraft.potion.PotionUtil;
 import net.minecraft.recipe.*;
 import net.minecraft.util.Identifier;
+import net.minecraft.util.math.MathHelper;
 import net.minecraft.util.registry.Registry;
 
 import java.awt.*;
@@ -42,6 +46,7 @@ public class DefaultPlugin implements REIPluginEntry {
     public static final Identifier STONE_CUTTING = new Identifier("minecraft", "plugins/stone_cutting");
     public static final Identifier BREWING = new Identifier("minecraft", "plugins/brewing");
     public static final Identifier PLUGIN = new Identifier("roughlyenoughitems", "default_plugin");
+    public static final Identifier COMPOSTING = new Identifier("minecraft", "plugins/composting");
     private static final Identifier DISPLAY_TEXTURE = new Identifier("roughlyenoughitems", "textures/gui/display.png");
     private static final Identifier DISPLAY_TEXTURE_DARK = new Identifier("roughlyenoughitems", "textures/gui/display_dark.png");
     private static final List<DefaultBrewingDisplay> BREWING_DISPLAYS = Lists.newArrayList();
@@ -98,6 +103,7 @@ public class DefaultPlugin implements REIPluginEntry {
         recipeHelper.registerCategory(new DefaultCampfireCategory());
         recipeHelper.registerCategory(new DefaultStoneCuttingCategory());
         recipeHelper.registerCategory(new DefaultBrewingCategory());
+        recipeHelper.registerCategory(new DefaultCompostingCategory());
     }
     
     @Override
@@ -124,6 +130,25 @@ public class DefaultPlugin implements REIPluginEntry {
             List<ItemStack> output = Collections.singletonList(outputStack);
             recipeHelper.registerDisplay(CRAFTING, new DefaultCustomDisplay(input, output));
         });
+        Map<ItemConvertible, Float> map = Maps.newLinkedHashMap();
+        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);
+            if (chance > 0)
+                map.put(itemConvertible, chance);
+        });
+        List<ItemConvertible> stacks = new LinkedList<>(map.keySet());
+        stacks.sort((first, second) -> {
+            return (int) ((map.get(first) - map.get(second)) * 100);
+        });
+        for(int i = 0; i < stacks.size(); i += MathHelper.clamp(48, 1, stacks.size() - i)) {
+            List<ItemConvertible> thisStacks = Lists.newArrayList();
+            for(int j = i; j < i + 48; j++)
+                if (j < stacks.size())
+                    thisStacks.add(stacks.get(j));
+            recipeHelper.registerDisplay(COMPOSTING, new DefaultCompostingDisplay(MathHelper.floor(i / 48f), thisStacks, map, Lists.newArrayList(map.keySet()), new ItemStack[]{new ItemStack(Items.BONE_MEAL)}));
+        }
     }
     
     @Override
@@ -132,7 +157,7 @@ public class DefaultPlugin implements REIPluginEntry {
             if (isOnRightSide || !MinecraftClient.getInstance().player.getRecipeBook().isGuiOpen() || !(MinecraftClient.getInstance().currentScreen instanceof RecipeBookProvider) || !(ScreenHelper.getLastContainerScreen().getContainer() instanceof CraftingContainer))
                 return Collections.emptyList();
             ContainerScreenHooks screenHooks = ScreenHelper.getLastContainerScreenHooks();
-            List l = Lists.newArrayList(new Rectangle(screenHooks.rei_getContainerLeft() - 4 - 145, screenHooks.rei_getContainerTop(), 4 + 145 + 30, screenHooks.rei_getContainerHeight()));
+            List<Rectangle> l = Lists.newArrayList(new Rectangle(screenHooks.rei_getContainerLeft() - 4 - 145, screenHooks.rei_getContainerTop(), 4 + 145 + 30, screenHooks.rei_getContainerHeight()));
             int size = ClientRecipeBook.getGroupsForContainer((CraftingContainer) ScreenHelper.getLastContainerScreen().getContainer()).size();
             if (size > 0)
                 l.add(new Rectangle(screenHooks.rei_getContainerLeft() - 4 - 145 - 30, screenHooks.rei_getContainerTop(), 30, (size - 1) * 27));
@@ -242,6 +267,8 @@ public class DefaultPlugin implements REIPluginEntry {
         recipeHelper.registerWorkingStations(CAMPFIRE, new ItemStack(Items.CAMPFIRE));
         recipeHelper.registerWorkingStations(BREWING, new ItemStack(Items.BREWING_STAND));
         recipeHelper.registerWorkingStations(STONE_CUTTING, new ItemStack(Items.STONECUTTER));
+        recipeHelper.registerWorkingStations(COMPOSTING, new ItemStack(Items.COMPOSTER));
+        recipeHelper.registerSpeedCraftButtonArea(COMPOSTING, bounds -> null);
         recipeHelper.registerRecipeVisibilityHandler(new DisplayVisibilityHandler() {
             @Override
             public DisplayVisibility handleDisplay(RecipeCategory category, RecipeDisplay display) {

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

@@ -26,6 +26,9 @@
   "category.rei.brewing.input": "Original Potion",
   "category.rei.brewing.reactant": "Ingredient",
   "category.rei.brewing.result": "Resulted Potion",
+  "category.rei.composting": "Composting",
+  "text.rei.composting.chance": "§e%d%% Chance",
+  "text.rei.composting.page": "Page %d",
   "text.rei.config": "Config",
   "text.rei.config_tooltip": "Open Config Screen\n§7Shift-Click to toggle cheat mode",
   "text.rei.config.side_search_box": "Side Search Box: ",