aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorUnknown <shekwancheung0528@gmail.com>2019-06-08 00:20:05 +0800
committerUnknown <shekwancheung0528@gmail.com>2019-06-08 00:20:05 +0800
commit28adfa726bcdb27eea4ffa39962c881d5c3d929b (patch)
tree47976693fe01ae4b81b18dae50cb61589dcf70d9 /src
parentf893515dd0c8b6bd54acde91fd1000ca984a81cd (diff)
downloadRoughlyEnoughItems-28adfa726bcdb27eea4ffa39962c881d5c3d929b.tar.gz
RoughlyEnoughItems-28adfa726bcdb27eea4ffa39962c881d5c3d929b.tar.bz2
RoughlyEnoughItems-28adfa726bcdb27eea4ffa39962c881d5c3d929b.zip
Adds Composting Recipes
Diffstat (limited to 'src')
-rw-r--r--src/main/java/me/shedaniel/rei/gui/VillagerRecipeViewingScreen.java4
-rw-r--r--src/main/java/me/shedaniel/rei/plugin/DefaultCompostingCategory.java123
-rw-r--r--src/main/java/me/shedaniel/rei/plugin/DefaultCompostingDisplay.java74
-rw-r--r--src/main/java/me/shedaniel/rei/plugin/DefaultPlugin.java29
-rwxr-xr-xsrc/main/resources/assets/roughlyenoughitems/lang/en_us.json3
5 files changed, 230 insertions, 3 deletions
diff --git a/src/main/java/me/shedaniel/rei/gui/VillagerRecipeViewingScreen.java b/src/main/java/me/shedaniel/rei/gui/VillagerRecipeViewingScreen.java
index 5d754fb91..6a39f06d9 100644
--- a/src/main/java/me/shedaniel/rei/gui/VillagerRecipeViewingScreen.java
+++ b/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;
diff --git a/src/main/java/me/shedaniel/rei/plugin/DefaultCompostingCategory.java b/src/main/java/me/shedaniel/rei/plugin/DefaultCompostingCategory.java
new file mode 100644
index 000000000..39c4be7f1
--- /dev/null
+++ b/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;
+ }
+ };
+ }
+
+} \ No newline at end of file
diff --git a/src/main/java/me/shedaniel/rei/plugin/DefaultCompostingDisplay.java b/src/main/java/me/shedaniel/rei/plugin/DefaultCompostingDisplay.java
new file mode 100644
index 000000000..235bbcd06
--- /dev/null
+++ b/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;
+ }
+
+}
diff --git a/src/main/java/me/shedaniel/rei/plugin/DefaultPlugin.java b/src/main/java/me/shedaniel/rei/plugin/DefaultPlugin.java
index ea4b21d43..c04aba51a 100644
--- a/src/main/java/me/shedaniel/rei/plugin/DefaultPlugin.java
+++ b/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) {
diff --git a/src/main/resources/assets/roughlyenoughitems/lang/en_us.json b/src/main/resources/assets/roughlyenoughitems/lang/en_us.json
index 49659dc77..8bad0875e 100755
--- a/src/main/resources/assets/roughlyenoughitems/lang/en_us.json
+++ b/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: ",