diff options
Diffstat (limited to 'src/main/java')
4 files changed, 227 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) { |
