From 9f5a9eae9a7863412cc5eb433bf15e5ee71da616 Mon Sep 17 00:00:00 2001 From: Danielshe Date: Sun, 3 Nov 2019 14:44:52 +0800 Subject: 3.2.1 --- .../me/shedaniel/rei/plugin/DefaultPlugin.java | 80 +++++++++--------- .../autocrafting/DefaultCategoryHandler.java | 22 +++-- .../plugin/blasting/DefaultBlastingCategory.java | 92 --------------------- .../plugin/blasting/DefaultBlastingDisplay.java | 68 +-------------- .../rei/plugin/brewing/DefaultBrewingCategory.java | 23 +++--- .../rei/plugin/brewing/DefaultBrewingDisplay.java | 45 ++++++---- .../plugin/campfire/DefaultCampfireCategory.java | 13 ++- .../plugin/campfire/DefaultCampfireDisplay.java | 31 ++++--- .../composting/DefaultCompostingCategory.java | 34 ++++---- .../composting/DefaultCompostingDisplay.java | 32 ++++---- .../rei/plugin/cooking/DefaultCookingCategory.java | 96 ++++++++++++++++++++++ .../rei/plugin/cooking/DefaultCookingDisplay.java | 84 +++++++++++++++++++ .../plugin/crafting/DefaultCraftingCategory.java | 14 ++-- .../plugin/crafting/DefaultCraftingDisplay.java | 10 +-- .../rei/plugin/crafting/DefaultCustomDisplay.java | 20 +++-- .../rei/plugin/crafting/DefaultShapedDisplay.java | 28 +++++-- .../plugin/crafting/DefaultShapelessDisplay.java | 28 +++++-- .../plugin/smelting/DefaultSmeltingCategory.java | 91 -------------------- .../plugin/smelting/DefaultSmeltingDisplay.java | 68 +-------------- .../rei/plugin/smoking/DefaultSmokingCategory.java | 91 -------------------- .../rei/plugin/smoking/DefaultSmokingDisplay.java | 69 +--------------- .../stonecutting/DefaultStoneCuttingCategory.java | 11 +-- .../stonecutting/DefaultStoneCuttingDisplay.java | 28 ++++--- .../plugin/stripping/DefaultStrippingCategory.java | 13 ++- .../plugin/stripping/DefaultStrippingDisplay.java | 20 ++--- 25 files changed, 446 insertions(+), 665 deletions(-) delete mode 100644 src/main/java/me/shedaniel/rei/plugin/blasting/DefaultBlastingCategory.java create mode 100644 src/main/java/me/shedaniel/rei/plugin/cooking/DefaultCookingCategory.java create mode 100644 src/main/java/me/shedaniel/rei/plugin/cooking/DefaultCookingDisplay.java delete mode 100644 src/main/java/me/shedaniel/rei/plugin/smelting/DefaultSmeltingCategory.java delete mode 100644 src/main/java/me/shedaniel/rei/plugin/smoking/DefaultSmokingCategory.java (limited to 'src/main/java/me/shedaniel/rei/plugin') diff --git a/src/main/java/me/shedaniel/rei/plugin/DefaultPlugin.java b/src/main/java/me/shedaniel/rei/plugin/DefaultPlugin.java index ef87e78c8..d3993a671 100644 --- a/src/main/java/me/shedaniel/rei/plugin/DefaultPlugin.java +++ b/src/main/java/me/shedaniel/rei/plugin/DefaultPlugin.java @@ -7,17 +7,17 @@ package me.shedaniel.rei.plugin; import com.google.common.collect.Lists; import com.google.common.collect.Maps; +import it.unimi.dsi.fastutil.objects.Object2FloatMap; import me.shedaniel.math.api.Rectangle; import me.shedaniel.rei.RoughlyEnoughItemsCore; import me.shedaniel.rei.api.DisplayHelper; -import me.shedaniel.rei.api.Entry; import me.shedaniel.rei.api.EntryRegistry; +import me.shedaniel.rei.api.EntryStack; import me.shedaniel.rei.api.RecipeHelper; import me.shedaniel.rei.api.plugins.REIPluginV0; import me.shedaniel.rei.gui.RecipeViewingScreen; import me.shedaniel.rei.gui.VillagerRecipeViewingScreen; import me.shedaniel.rei.impl.ScreenHelper; -import me.shedaniel.rei.plugin.blasting.DefaultBlastingCategory; import me.shedaniel.rei.plugin.blasting.DefaultBlastingDisplay; import me.shedaniel.rei.plugin.brewing.DefaultBrewingCategory; import me.shedaniel.rei.plugin.brewing.DefaultBrewingDisplay; @@ -25,13 +25,12 @@ import me.shedaniel.rei.plugin.campfire.DefaultCampfireCategory; import me.shedaniel.rei.plugin.campfire.DefaultCampfireDisplay; import me.shedaniel.rei.plugin.composting.DefaultCompostingCategory; import me.shedaniel.rei.plugin.composting.DefaultCompostingDisplay; +import me.shedaniel.rei.plugin.cooking.DefaultCookingCategory; import me.shedaniel.rei.plugin.crafting.DefaultCraftingCategory; import me.shedaniel.rei.plugin.crafting.DefaultCustomDisplay; import me.shedaniel.rei.plugin.crafting.DefaultShapedDisplay; import me.shedaniel.rei.plugin.crafting.DefaultShapelessDisplay; -import me.shedaniel.rei.plugin.smelting.DefaultSmeltingCategory; import me.shedaniel.rei.plugin.smelting.DefaultSmeltingDisplay; -import me.shedaniel.rei.plugin.smoking.DefaultSmokingCategory; import me.shedaniel.rei.plugin.smoking.DefaultSmokingDisplay; import me.shedaniel.rei.plugin.stonecutting.DefaultStoneCuttingCategory; import me.shedaniel.rei.plugin.stonecutting.DefaultStoneCuttingDisplay; @@ -47,6 +46,8 @@ import net.minecraft.client.gui.screen.recipebook.RecipeBookProvider; import net.minecraft.enchantment.Enchantment; import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.fluid.EmptyFluid; +import net.minecraft.fluid.Fluid; +import net.minecraft.item.Item; import net.minecraft.item.ItemConvertible; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; @@ -97,26 +98,28 @@ public class DefaultPlugin implements REIPluginV0 { if (!RoughlyEnoughItemsCore.getConfigManager().getConfig().isLoadingDefaultPlugin()) { return; } - Registry.ITEM.stream().forEach(item -> { - entryRegistry.registerItemStack(item.getStackForRender()); + for (Item item : Registry.ITEM) { + entryRegistry.registerEntry(EntryStack.create(item)); try { - entryRegistry.registerItemStack(entryRegistry.getAllStacksFromItem(item)); + for (ItemStack stack : entryRegistry.getAllStacksFromItem(item)) { + entryRegistry.registerEntry(EntryStack.create(stack)); + } } catch (Exception e) { } - }); - Registry.ENCHANTMENT.forEach(enchantment -> { + } + for (Enchantment enchantment : Registry.ENCHANTMENT) { for (int i = enchantment.getMinimumLevel(); i <= enchantment.getMaximumLevel(); i++) { Map map = new HashMap<>(); map.put(enchantment, i); ItemStack itemStack = new ItemStack(Items.ENCHANTED_BOOK); EnchantmentHelper.set(map, itemStack); - entryRegistry.registerItemStack(Items.ENCHANTED_BOOK, itemStack); + entryRegistry.registerEntriesAfter(EntryStack.create(Items.ENCHANTED_BOOK), EntryStack.create(itemStack)); } - }); - Registry.FLUID.forEach(fluid -> { + } + for (Fluid fluid : Registry.FLUID) { if (!(fluid instanceof EmptyFluid)) - entryRegistry.registerFluid(fluid); - }); + entryRegistry.registerEntry(EntryStack.create(fluid)); + } } @Override @@ -125,9 +128,9 @@ public class DefaultPlugin implements REIPluginV0 { return; } recipeHelper.registerCategory(new DefaultCraftingCategory()); - recipeHelper.registerCategory(new DefaultSmeltingCategory()); - recipeHelper.registerCategory(new DefaultSmokingCategory()); - recipeHelper.registerCategory(new DefaultBlastingCategory()); + recipeHelper.registerCategory(new DefaultCookingCategory(SMELTING, EntryStack.create(Items.FURNACE), "category.rei.smelting")); + recipeHelper.registerCategory(new DefaultCookingCategory(SMOKING, EntryStack.create(Items.SMOKER), "category.rei.smoking")); + recipeHelper.registerCategory(new DefaultCookingCategory(BLASTING, EntryStack.create(Items.BLAST_FURNACE), "category.rei.blasting")); recipeHelper.registerCategory(new DefaultCampfireCategory()); recipeHelper.registerCategory(new DefaultStoneCuttingCategory()); recipeHelper.registerCategory(new DefaultBrewingCategory()); @@ -147,29 +150,32 @@ public class DefaultPlugin implements REIPluginV0 { recipeHelper.registerRecipes(BLASTING, BlastingRecipe.class, DefaultBlastingDisplay::new); recipeHelper.registerRecipes(CAMPFIRE, CampfireCookingRecipe.class, DefaultCampfireDisplay::new); recipeHelper.registerRecipes(STONE_CUTTING, StonecuttingRecipe.class, DefaultStoneCuttingDisplay::new); - BREWING_DISPLAYS.stream().forEachOrdered(display -> recipeHelper.registerDisplay(BREWING, display)); - List arrowStack = Collections.singletonList(Items.ARROW.getStackForRender()); - RoughlyEnoughItemsCore.getEntryRegistry().getEntryList().stream().filter(stack -> stack.getEntryType() == Entry.Type.ITEM && stack.getItemStack().getItem().equals(Items.LINGERING_POTION)).forEach(entry -> { - List> input = new ArrayList<>(); - for (int i = 0; i < 4; i++) - input.add(arrowStack); - input.add(Collections.singletonList(entry.getItemStack())); - for (int i = 0; i < 4; i++) - input.add(arrowStack); - ItemStack outputStack = new ItemStack(Items.TIPPED_ARROW, 8); - PotionUtil.setPotion(outputStack, PotionUtil.getPotion(entry.getItemStack())); - PotionUtil.setCustomPotionEffects(outputStack, PotionUtil.getCustomPotionEffects(entry.getItemStack())); - List output = Collections.singletonList(outputStack); - recipeHelper.registerDisplay(CRAFTING, new DefaultCustomDisplay(input, output)); - }); + for (DefaultBrewingDisplay display : BREWING_DISPLAYS) { + recipeHelper.registerDisplay(BREWING, display); + } + List arrowStack = Collections.singletonList(EntryStack.create(Items.ARROW)); + for (EntryStack entry : RoughlyEnoughItemsCore.getEntryRegistry().getStacksList()) { + if (entry.getItem() == Items.LINGERING_POTION) { + List> input = new ArrayList<>(); + for (int i = 0; i < 4; i++) + input.add(arrowStack); + input.add(Collections.singletonList(EntryStack.create(entry.getItemStack()))); + for (int i = 0; i < 4; i++) + input.add(arrowStack); + ItemStack outputStack = new ItemStack(Items.TIPPED_ARROW, 8); + PotionUtil.setPotion(outputStack, PotionUtil.getPotion(entry.getItemStack())); + PotionUtil.setCustomPotionEffects(outputStack, PotionUtil.getCustomPotionEffects(entry.getItemStack())); + List output = Collections.singletonList(EntryStack.create(outputStack).addSetting(EntryStack.Settings.CHECK_TAGS, EntryStack.Settings.TRUE)); + recipeHelper.registerDisplay(CRAFTING, new DefaultCustomDisplay(null, input, output)); + } + } Map 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.getOrDefault(itemConvertible, 0); - if (chance > 0) - map.put(itemConvertible, chance); - }); + for (Object2FloatMap.Entry entry : ComposterBlock.ITEM_TO_LEVEL_INCREASE_CHANCE.object2FloatEntrySet()) { + if (entry.getFloatValue() > 0) + map.put(entry.getKey(), entry.getFloatValue()); + } List stacks = new LinkedList<>(map.keySet()); stacks.sort((first, second) -> { return (int) ((map.get(first) - map.get(second)) * 100); diff --git a/src/main/java/me/shedaniel/rei/plugin/autocrafting/DefaultCategoryHandler.java b/src/main/java/me/shedaniel/rei/plugin/autocrafting/DefaultCategoryHandler.java index 5df184dad..11e32fdef 100644 --- a/src/main/java/me/shedaniel/rei/plugin/autocrafting/DefaultCategoryHandler.java +++ b/src/main/java/me/shedaniel/rei/plugin/autocrafting/DefaultCategoryHandler.java @@ -10,6 +10,7 @@ import it.unimi.dsi.fastutil.ints.IntArrayList; import it.unimi.dsi.fastutil.ints.IntList; import me.shedaniel.rei.RoughlyEnoughItemsNetwork; import me.shedaniel.rei.api.AutoTransferHandler; +import me.shedaniel.rei.api.EntryStack; import me.shedaniel.rei.api.TransferRecipeDisplay; import me.shedaniel.rei.listeners.RecipeBookGuiHooks; import me.shedaniel.rei.server.ContainerInfo; @@ -43,7 +44,7 @@ public class DefaultCategoryHandler implements AutoTransferHandler { return Result.createNotApplicable(); if (recipe.getHeight() > containerInfo.getCraftingHeight(container) || recipe.getWidth() > containerInfo.getCraftingWidth(container)) return Result.createFailed(I18n.translate("error.rei.transfer.too_small", containerInfo.getCraftingWidth(container), containerInfo.getCraftingHeight(container))); - List> input = recipe.getOrganisedInput(containerInfo, container); + List> input = recipe.getOrganisedInputEntries(containerInfo, container); IntList intList = hasItems(input); if (!intList.isEmpty()) return Result.createFailed("error.rei.not.enough.materials", intList); @@ -60,10 +61,12 @@ public class DefaultCategoryHandler implements AutoTransferHandler { buf.writeBoolean(Screen.hasShiftDown()); buf.writeInt(input.size()); - for (List stacks : input) { + for (List stacks : input) { buf.writeInt(stacks.size()); - for (ItemStack stack : stacks) { - buf.writeItemStack(stack); + for (EntryStack stack : stacks) { + if (stack.getItemStack() != null) + buf.writeItemStack(stack.getItemStack()); + else buf.writeItemStack(ItemStack.EMPTY); } } ClientSidePacketRegistry.INSTANCE.sendToServer(RoughlyEnoughItemsNetwork.MOVE_ITEMS_PACKET, buf); @@ -79,7 +82,7 @@ public class DefaultCategoryHandler implements AutoTransferHandler { return ClientSidePacketRegistry.INSTANCE.canServerReceive(RoughlyEnoughItemsNetwork.MOVE_ITEMS_PACKET); } - public IntList hasItems(List> inputs) { + public IntList hasItems(List> inputs) { // Create a clone of player's inventory, and count DefaultedList copyMain = DefaultedList.of(); for (ItemStack stack : MinecraftClient.getInstance().player.inventory.main) { @@ -87,13 +90,14 @@ public class DefaultCategoryHandler implements AutoTransferHandler { } IntList intList = new IntArrayList(); for (int i = 0; i < inputs.size(); i++) { - List possibleStacks = inputs.get(i); + List possibleStacks = inputs.get(i); boolean done = possibleStacks.isEmpty(); - for (ItemStack possibleStack : possibleStacks) { + for (EntryStack possibleStack : possibleStacks) { if (!done) { - int invRequiredCount = possibleStack.getCount(); + int invRequiredCount = possibleStack.getAmount(); for (ItemStack stack : copyMain) { - if (ItemStack.areItemsEqualIgnoreDamage(possibleStack, stack)) { + EntryStack entryStack = EntryStack.create(stack); + if (entryStack.equals(possibleStack)) { while (invRequiredCount > 0 && !stack.isEmpty()) { invRequiredCount--; stack.decrement(1); diff --git a/src/main/java/me/shedaniel/rei/plugin/blasting/DefaultBlastingCategory.java b/src/main/java/me/shedaniel/rei/plugin/blasting/DefaultBlastingCategory.java deleted file mode 100644 index 4c5f3dac3..000000000 --- a/src/main/java/me/shedaniel/rei/plugin/blasting/DefaultBlastingCategory.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Roughly Enough Items by Danielshe. - * Licensed under the MIT License. - */ - -package me.shedaniel.rei.plugin.blasting; - -import com.mojang.blaze3d.systems.RenderSystem; -import it.unimi.dsi.fastutil.ints.IntList; -import me.shedaniel.math.api.Point; -import me.shedaniel.math.api.Rectangle; -import me.shedaniel.rei.api.Renderer; -import me.shedaniel.rei.api.TransferRecipeCategory; -import me.shedaniel.rei.gui.renderers.RecipeRenderer; -import me.shedaniel.rei.gui.widget.RecipeArrowWidget; -import me.shedaniel.rei.gui.widget.RecipeBaseWidget; -import me.shedaniel.rei.gui.widget.SlotWidget; -import me.shedaniel.rei.gui.widget.Widget; -import me.shedaniel.rei.plugin.DefaultPlugin; -import net.minecraft.block.Blocks; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.DrawableHelper; -import net.minecraft.client.render.GuiLighting; -import net.minecraft.client.resource.language.I18n; -import net.minecraft.item.ItemStack; -import net.minecraft.util.Formatting; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.MathHelper; - -import java.util.Arrays; -import java.util.Collections; -import java.util.LinkedList; -import java.util.List; -import java.util.function.Supplier; - -public class DefaultBlastingCategory implements TransferRecipeCategory { - - @Override - public Identifier getIdentifier() { - return DefaultPlugin.BLASTING; - } - - @Override - public Renderer getIcon() { - return Renderer.fromItemStack(new ItemStack(Blocks.BLAST_FURNACE)); - } - - @Override - public String getCategoryName() { - return I18n.translate("category.rei.blasting"); - } - - @Override - public RecipeRenderer getSimpleRenderer(DefaultBlastingDisplay recipe) { - return Renderer.fromRecipe(() -> Arrays.asList(recipe.getInput().get(0)), recipe::getOutput); - } - - @Override - public List setupDisplay(Supplier recipeDisplaySupplier, Rectangle bounds) { - final DefaultBlastingDisplay recipeDisplay = recipeDisplaySupplier.get(); - Point startPoint = new Point(bounds.getCenterX() - 41, bounds.getCenterY() - 27); - List widgets = new LinkedList<>(Arrays.asList(new RecipeBaseWidget(bounds) { - @Override - public void render(int mouseX, int mouseY, float delta) { - super.render(mouseX, mouseY, delta); - RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F); - GuiLighting.disable(); - MinecraftClient.getInstance().getTextureManager().bindTexture(DefaultPlugin.getDisplayTexture()); - blit(startPoint.x, startPoint.y, 0, 54, 82, 54); - int height = MathHelper.ceil((System.currentTimeMillis() / 250 % 14d) / 1f); - blit(startPoint.x + 2, startPoint.y + 21 + (14 - height), 82, 77 + (14 - height), 14, height); - } - })); - widgets.add(new RecipeArrowWidget(startPoint.x + 24, startPoint.y + 18, true)); - List> input = recipeDisplay.getInput(); - widgets.add(new SlotWidget(startPoint.x + 1, startPoint.y + 1, Renderer.fromItemStacks(input.get(0)), true, true, true)); - widgets.add(new SlotWidget(startPoint.x + 1, startPoint.y + 37, Renderer.fromItemStacks(() -> recipeDisplay.getFuel(), true, stack -> Collections.singletonList(Formatting.YELLOW.toString() + I18n.translate("category.rei.smelting.fuel"))), true, true, true)); - widgets.add(new SlotWidget(startPoint.x + 61, startPoint.y + 19, Renderer.fromItemStacks(recipeDisplay.getOutput()), false, true, true)); - return widgets; - } - - @Override - public void renderRedSlots(List widgets, Rectangle bounds, DefaultBlastingDisplay display, IntList redSlots) { - Point startPoint = new Point(bounds.getCenterX() - 41, bounds.getCenterY() - 27); - RenderSystem.translatef(0, 0, 400); - if (redSlots.contains(0)) { - DrawableHelper.fill(startPoint.x + 1, startPoint.y + 1, startPoint.x + 1 + 16, startPoint.y + 1 + 16, 822018048); - } - RenderSystem.translatef(0, 0, -400); - } - -} diff --git a/src/main/java/me/shedaniel/rei/plugin/blasting/DefaultBlastingDisplay.java b/src/main/java/me/shedaniel/rei/plugin/blasting/DefaultBlastingDisplay.java index 52f521a99..510d5eb96 100644 --- a/src/main/java/me/shedaniel/rei/plugin/blasting/DefaultBlastingDisplay.java +++ b/src/main/java/me/shedaniel/rei/plugin/blasting/DefaultBlastingDisplay.java @@ -5,81 +5,19 @@ package me.shedaniel.rei.plugin.blasting; -import me.shedaniel.rei.api.TransferRecipeDisplay; import me.shedaniel.rei.plugin.DefaultPlugin; -import me.shedaniel.rei.server.ContainerInfo; -import net.minecraft.block.entity.FurnaceBlockEntity; -import net.minecraft.container.Container; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.recipe.AbstractCookingRecipe; +import me.shedaniel.rei.plugin.cooking.DefaultCookingDisplay; import net.minecraft.recipe.BlastingRecipe; import net.minecraft.util.Identifier; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.Optional; -import java.util.stream.Collectors; - -public class DefaultBlastingDisplay implements TransferRecipeDisplay { - - private BlastingRecipe display; - private List> input; - private List output; +public class DefaultBlastingDisplay extends DefaultCookingDisplay { public DefaultBlastingDisplay(BlastingRecipe recipe) { - this.display = recipe; - this.input = recipe.getPreviewInputs().stream().map(i -> Arrays.asList(i.getMatchingStacksClient())).collect(Collectors.toList()); - this.input.add(FurnaceBlockEntity.createFuelTimeMap().keySet().stream().map(Item::getStackForRender).collect(Collectors.toList())); - this.output = Collections.singletonList(recipe.getOutput()); - } - - @Override - public Optional getRecipeLocation() { - return Optional.ofNullable(display).map(AbstractCookingRecipe::getId); - } - - @Override - public List> getInput() { - return input; - } - - public List getFuel() { - return input.get(1); - } - - @Override - public List getOutput() { - return output; + super(recipe); } @Override public Identifier getRecipeCategory() { return DefaultPlugin.BLASTING; } - - @Override - public List> getRequiredItems() { - return input; - } - - public Optional getOptionalRecipe() { - return Optional.ofNullable(display); - } - - @Override - public int getWidth() { - return 1; - } - - @Override - public int getHeight() { - return 1; - } - - @Override - public List> getOrganisedInput(ContainerInfo containerInfo, Container container) { - return display.getPreviewInputs().stream().map(i -> Arrays.asList(i.getMatchingStacksClient())).collect(Collectors.toList()); - } } diff --git a/src/main/java/me/shedaniel/rei/plugin/brewing/DefaultBrewingCategory.java b/src/main/java/me/shedaniel/rei/plugin/brewing/DefaultBrewingCategory.java index b17c0066d..466ab9c2c 100644 --- a/src/main/java/me/shedaniel/rei/plugin/brewing/DefaultBrewingCategory.java +++ b/src/main/java/me/shedaniel/rei/plugin/brewing/DefaultBrewingCategory.java @@ -8,24 +8,21 @@ package me.shedaniel.rei.plugin.brewing; import me.shedaniel.math.api.Point; import me.shedaniel.math.api.Rectangle; import com.mojang.blaze3d.systems.RenderSystem; +import me.shedaniel.rei.api.EntryStack; import me.shedaniel.rei.api.RecipeCategory; -import me.shedaniel.rei.api.Renderer; +import me.shedaniel.rei.gui.widget.EntryWidget; import me.shedaniel.rei.gui.widget.RecipeBaseWidget; -import me.shedaniel.rei.gui.widget.SlotWidget; import me.shedaniel.rei.gui.widget.Widget; import me.shedaniel.rei.plugin.DefaultPlugin; 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.ItemStack; import net.minecraft.item.Items; -import net.minecraft.util.Formatting; import net.minecraft.util.Identifier; import net.minecraft.util.math.MathHelper; import java.util.Arrays; -import java.util.Collections; import java.util.LinkedList; import java.util.List; import java.util.function.Supplier; @@ -38,8 +35,8 @@ public class DefaultBrewingCategory implements RecipeCategory recipeDisplay.getInput().get(0), true, stack -> Collections.singletonList(Formatting.YELLOW.toString() + I18n.translate("category.rei.brewing.input"))), false, true, true)); - widgets.add(new SlotWidget(startPoint.x + 63, startPoint.y + 1, Renderer.fromItemStacks(() -> recipeDisplay.getInput().get(1), true, stack -> Collections.singletonList(Formatting.YELLOW.toString() + I18n.translate("category.rei.brewing.reactant"))), false, true, true)); - widgets.add(new SlotWidget(startPoint.x + 40, startPoint.y + 35, Renderer.fromItemStacks(() -> recipeDisplay.getOutput(0), true, stack -> Collections.singletonList(Formatting.YELLOW.toString() + I18n.translate("category.rei.brewing.result"))), false, true, true)); - widgets.add(new SlotWidget(startPoint.x + 63, startPoint.y + 42, Renderer.fromItemStacks(() -> recipeDisplay.getOutput(1), true, stack -> Collections.singletonList(Formatting.YELLOW.toString() + I18n.translate("category.rei.brewing.result"))), false, true, true)); - widgets.add(new SlotWidget(startPoint.x + 86, startPoint.y + 35, Renderer.fromItemStacks(() -> recipeDisplay.getOutput(2), true, stack -> Collections.singletonList(Formatting.YELLOW.toString() + I18n.translate("category.rei.brewing.result"))), false, true, true)); + widgets.add(EntryWidget.create(startPoint.x + 1, startPoint.y + 1).entry(EntryStack.create(Items.BLAZE_POWDER)).noBackground()); + widgets.add(EntryWidget.create(startPoint.x + 40, startPoint.y + 1).entries(recipeDisplay.getInputEntries().get(0)).noBackground()); + widgets.add(EntryWidget.create(startPoint.x + 63, startPoint.y + 1).entries(recipeDisplay.getInputEntries().get(1)).noBackground()); + widgets.add(EntryWidget.create(startPoint.x + 40, startPoint.y + 35).entries(recipeDisplay.getOutput(0)).noBackground()); + widgets.add(EntryWidget.create(startPoint.x + 63, startPoint.y + 42).entries(recipeDisplay.getOutput(1)).noBackground()); + widgets.add(EntryWidget.create(startPoint.x + 86, startPoint.y + 35).entries(recipeDisplay.getOutput(2)).noBackground()); return widgets; } diff --git a/src/main/java/me/shedaniel/rei/plugin/brewing/DefaultBrewingDisplay.java b/src/main/java/me/shedaniel/rei/plugin/brewing/DefaultBrewingDisplay.java index 5a091e42b..3b8023779 100644 --- a/src/main/java/me/shedaniel/rei/plugin/brewing/DefaultBrewingDisplay.java +++ b/src/main/java/me/shedaniel/rei/plugin/brewing/DefaultBrewingDisplay.java @@ -6,36 +6,49 @@ package me.shedaniel.rei.plugin.brewing; import com.google.common.collect.Lists; +import me.shedaniel.rei.api.EntryStack; import me.shedaniel.rei.api.RecipeDisplay; import me.shedaniel.rei.plugin.DefaultPlugin; -import net.minecraft.block.Blocks; +import net.minecraft.client.resource.language.I18n; import net.minecraft.item.ItemStack; +import net.minecraft.item.PotionItem; import net.minecraft.recipe.Ingredient; +import net.minecraft.util.Formatting; import net.minecraft.util.Identifier; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collections; import java.util.List; public class DefaultBrewingDisplay implements RecipeDisplay { - private ItemStack input, output; - private Ingredient reactant; + private EntryStack input, output; + private List reactant; public DefaultBrewingDisplay(ItemStack input, Ingredient reactant, ItemStack output) { - this.input = input; - this.reactant = reactant; - this.output = output; + this.input = EntryStack.create(input).setting(EntryStack.Settings.TOOLTIP_APPEND_EXTRA, stack -> Collections.singletonList(Formatting.YELLOW.toString() + I18n.translate("category.rei.brewing.input"))); + if (this.input.getItem() instanceof PotionItem) + this.input = this.input.setting(EntryStack.Settings.CHECK_TAGS, EntryStack.Settings.TRUE); + this.reactant = new ArrayList<>(); + for (ItemStack stack : reactant.getStackArray()) { + EntryStack entryStack = EntryStack.create(stack); + if (stack.getItem() instanceof PotionItem) + entryStack.setting(EntryStack.Settings.CHECK_TAGS, EntryStack.Settings.TRUE); + entryStack.setting(EntryStack.Settings.TOOLTIP_APPEND_EXTRA, s -> Collections.singletonList(Formatting.YELLOW.toString() + I18n.translate("category.rei.brewing.reactant"))); + this.reactant.add(entryStack); + } + this.output = EntryStack.create(output).setting(EntryStack.Settings.TOOLTIP_APPEND_EXTRA, stack -> Collections.singletonList(Formatting.YELLOW.toString() + I18n.translate("category.rei.brewing.result"))); + if (this.output.getItem() instanceof PotionItem) + this.output = this.output.setting(EntryStack.Settings.CHECK_TAGS, EntryStack.Settings.TRUE); } @Override - public List> getInput() { - return Lists.newArrayList(Collections.singletonList(input), Arrays.asList(reactant.getMatchingStacksClient())); + public List> getInputEntries() { + return Lists.newArrayList(Collections.singletonList(input), reactant); } @Override - public List getOutput() { + public List getOutputEntries() { return Collections.singletonList(output); } @@ -44,17 +57,17 @@ public class DefaultBrewingDisplay implements RecipeDisplay { return DefaultPlugin.BREWING; } - public List getOutput(int slot) { - List stack = new ArrayList<>(); + public List getOutput(int slot) { + List stack = new ArrayList<>(); for (int i = 0; i < slot * 2; i++) - stack.add(new ItemStack(Blocks.AIR)); + stack.add(EntryStack.empty()); for (int i = 0; i < 6 - slot * 2; i++) - stack.addAll(getOutput()); + stack.addAll(getOutputEntries()); return stack; } @Override - public List> getRequiredItems() { - return Collections.singletonList(Collections.singletonList(ItemStack.EMPTY)); + public List> getRequiredEntries() { + return getInputEntries(); } } diff --git a/src/main/java/me/shedaniel/rei/plugin/campfire/DefaultCampfireCategory.java b/src/main/java/me/shedaniel/rei/plugin/campfire/DefaultCampfireCategory.java index cccf8c688..f6bce7b51 100644 --- a/src/main/java/me/shedaniel/rei/plugin/campfire/DefaultCampfireCategory.java +++ b/src/main/java/me/shedaniel/rei/plugin/campfire/DefaultCampfireCategory.java @@ -8,11 +8,11 @@ package me.shedaniel.rei.plugin.campfire; import me.shedaniel.math.api.Point; import me.shedaniel.math.api.Rectangle; import com.mojang.blaze3d.systems.RenderSystem; +import me.shedaniel.rei.api.EntryStack; import me.shedaniel.rei.api.RecipeCategory; -import me.shedaniel.rei.api.Renderer; +import me.shedaniel.rei.gui.widget.EntryWidget; import me.shedaniel.rei.gui.widget.RecipeArrowWidget; import me.shedaniel.rei.gui.widget.RecipeBaseWidget; -import me.shedaniel.rei.gui.widget.SlotWidget; import me.shedaniel.rei.gui.widget.Widget; import me.shedaniel.rei.impl.ScreenHelper; import me.shedaniel.rei.plugin.DefaultPlugin; @@ -20,7 +20,6 @@ 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.ItemStack; import net.minecraft.util.Identifier; import net.minecraft.util.math.MathHelper; @@ -37,8 +36,8 @@ public class DefaultCampfireCategory implements RecipeCategory> inputs; - private List output; + private List> inputs; + private List output; private int cookTime; private CampfireCookingRecipe display; @@ -33,8 +34,14 @@ public class DefaultCampfireDisplay implements RecipeDisplay { } public DefaultCampfireDisplay(DefaultedList ingredients, ItemStack output, int cookTime) { - this.inputs = ingredients.stream().map(i -> Arrays.asList(i.getMatchingStacksClient())).collect(Collectors.toList()); - this.output = Collections.singletonList(output); + this.inputs = ingredients.stream().map(i -> { + List entries = new ArrayList<>(); + for (ItemStack stack : i.getStackArray()) { + entries.add(EntryStack.create(stack)); + } + return entries; + }).collect(Collectors.toList()); + this.output = Collections.singletonList(EntryStack.create(output)); this.cookTime = cookTime; } @@ -48,23 +55,23 @@ public class DefaultCampfireDisplay implements RecipeDisplay { } @Override - public List> getInput() { + public List> getInputEntries() { return inputs; } @Override - public List getOutput() { - return this.output; + public List getOutputEntries() { + return output; } @Override - public Identifier getRecipeCategory() { - return DefaultPlugin.CAMPFIRE; + public List> getRequiredEntries() { + return inputs; } @Override - public List> getRequiredItems() { - return getInput(); + public Identifier getRecipeCategory() { + return DefaultPlugin.CAMPFIRE; } } diff --git a/src/main/java/me/shedaniel/rei/plugin/composting/DefaultCompostingCategory.java b/src/main/java/me/shedaniel/rei/plugin/composting/DefaultCompostingCategory.java index 5d9f06586..bf0eb9068 100644 --- a/src/main/java/me/shedaniel/rei/plugin/composting/DefaultCompostingCategory.java +++ b/src/main/java/me/shedaniel/rei/plugin/composting/DefaultCompostingCategory.java @@ -9,11 +9,11 @@ import com.google.common.collect.Lists; import me.shedaniel.math.api.Point; import me.shedaniel.math.api.Rectangle; import com.mojang.blaze3d.systems.RenderSystem; +import me.shedaniel.rei.api.EntryStack; import me.shedaniel.rei.api.RecipeCategory; -import me.shedaniel.rei.api.Renderer; import me.shedaniel.rei.gui.renderers.RecipeRenderer; +import me.shedaniel.rei.gui.widget.EntryWidget; import me.shedaniel.rei.gui.widget.RecipeBaseWidget; -import me.shedaniel.rei.gui.widget.SlotWidget; import me.shedaniel.rei.gui.widget.Widget; import me.shedaniel.rei.plugin.DefaultPlugin; import net.minecraft.block.Blocks; @@ -21,14 +21,13 @@ 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.util.Arrays; import java.util.Collections; import java.util.LinkedList; import java.util.List; +import java.util.Map; import java.util.function.Supplier; public class DefaultCompostingCategory implements RecipeCategory { @@ -39,8 +38,8 @@ public class DefaultCompostingCategory implements RecipeCategory stacks = new LinkedList<>(recipeDisplaySupplier.get().getItemsByOrder()); + List stacks = new LinkedList<>(recipeDisplaySupplier.get().getItemsByOrder()); int i = 0; for (int y = 0; y < 6; y++) for (int x = 0; x < 8; x++) { int finalI = i; - widgets.add(new SlotWidget(bounds.getCenterX() - 72 + x * 18, bounds.y + y * 18, stacks.size() > i ? Renderer.fromItemStacks(() -> Collections.singletonList(new ItemStack(stacks.get(finalI))), true, stack -> { - final List[] 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 null; - }) : Renderer.empty(), true, true, true)); + EntryStack entryStack = stacks.size() > i ? stacks.get(finalI) : EntryStack.empty(); + if (entryStack.getType() != EntryStack.Type.EMPTY) + for (Map.Entry entry : recipeDisplaySupplier.get().getInputMap().entrySet()) { + if (entry.getKey().asItem().equals(entryStack.getItem())) { + entryStack = entryStack.setting(EntryStack.Settings.TOOLTIP_APPEND_EXTRA, s -> Collections.singletonList(I18n.translate("text.rei.composting.chance", MathHelper.fastFloor(entry.getValue() * 100)))); + break; + } + } + widgets.add(EntryWidget.create(bounds.getCenterX() - 72 + x * 18, bounds.y + y * 18).entry(entryStack)); i++; } - widgets.add(new SlotWidget(startingPoint.x + 34, startingPoint.y + 5, Renderer.fromItemStacks(recipeDisplaySupplier.get().getOutput()), false, true, true)); + widgets.add(EntryWidget.create(startingPoint.x + 34, startingPoint.y + 5).entries(recipeDisplaySupplier.get().getOutputEntries()).noBackground()); return widgets; } diff --git a/src/main/java/me/shedaniel/rei/plugin/composting/DefaultCompostingDisplay.java b/src/main/java/me/shedaniel/rei/plugin/composting/DefaultCompostingDisplay.java index 1bb3c3d1a..d799a30f5 100644 --- a/src/main/java/me/shedaniel/rei/plugin/composting/DefaultCompostingDisplay.java +++ b/src/main/java/me/shedaniel/rei/plugin/composting/DefaultCompostingDisplay.java @@ -5,9 +5,9 @@ package me.shedaniel.rei.plugin.composting; +import me.shedaniel.rei.api.EntryStack; import me.shedaniel.rei.api.RecipeDisplay; import me.shedaniel.rei.plugin.DefaultPlugin; -import net.minecraft.item.Item; import net.minecraft.item.ItemConvertible; import net.minecraft.item.ItemStack; import net.minecraft.util.Identifier; @@ -17,17 +17,17 @@ import java.util.stream.Collectors; public class DefaultCompostingDisplay implements RecipeDisplay { - private List order, allItems; + private List order, allItems; private Map inputMap; - private ItemStack[] output; + private List output; private int page; public DefaultCompostingDisplay(int page, List order, Map inputMap, List allItems, ItemStack[] output) { this.page = page; - this.order = order; + this.order = order.stream().map(EntryStack::create).collect(Collectors.toList()); this.inputMap = inputMap; - this.output = output; - this.allItems = allItems; + this.output = Arrays.asList(output).stream().map(EntryStack::create).collect(Collectors.toList()); + this.allItems = allItems.stream().map(EntryStack::create).collect(Collectors.toList()); } public int getPage() { @@ -35,11 +35,11 @@ public class DefaultCompostingDisplay implements RecipeDisplay { } @Override - public List> getInput() { - List> lists = new ArrayList<>(); - allItems.stream().forEachOrdered(itemProvider -> { - lists.add(Arrays.asList(itemProvider.asItem().getStackForRender())); - }); + public List> getInputEntries() { + List> lists = new ArrayList<>(); + for (EntryStack allItem : allItems) { + lists.add(Collections.singletonList(allItem)); + } return lists; } @@ -48,8 +48,8 @@ public class DefaultCompostingDisplay implements RecipeDisplay { } @Override - public List getOutput() { - return Arrays.asList(output); + public List getOutputEntries() { + return output; } @Override @@ -58,11 +58,11 @@ public class DefaultCompostingDisplay implements RecipeDisplay { } @Override - public List> getRequiredItems() { - return Arrays.asList(new LinkedList<>(allItems.stream().map(ItemConvertible::asItem).map(Item::getStackForRender).collect(Collectors.toList()))); + public List> getRequiredEntries() { + return Collections.singletonList(allItems); } - public List getItemsByOrder() { + public List getItemsByOrder() { return order; } diff --git a/src/main/java/me/shedaniel/rei/plugin/cooking/DefaultCookingCategory.java b/src/main/java/me/shedaniel/rei/plugin/cooking/DefaultCookingCategory.java new file mode 100644 index 000000000..9588a239b --- /dev/null +++ b/src/main/java/me/shedaniel/rei/plugin/cooking/DefaultCookingCategory.java @@ -0,0 +1,96 @@ +/* + * Roughly Enough Items by Danielshe. + * Licensed under the MIT License. + */ + +package me.shedaniel.rei.plugin.cooking; + +import it.unimi.dsi.fastutil.ints.IntList; +import me.shedaniel.math.api.Point; +import me.shedaniel.math.api.Rectangle; +import me.shedaniel.math.compat.RenderHelper; +import me.shedaniel.rei.api.EntryStack; +import me.shedaniel.rei.api.Renderer; +import me.shedaniel.rei.api.TransferRecipeCategory; +import me.shedaniel.rei.gui.renderers.RecipeRenderer; +import me.shedaniel.rei.gui.widget.EntryWidget; +import me.shedaniel.rei.gui.widget.RecipeArrowWidget; +import me.shedaniel.rei.gui.widget.RecipeBaseWidget; +import me.shedaniel.rei.gui.widget.Widget; +import me.shedaniel.rei.plugin.DefaultPlugin; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.DrawableHelper; +import net.minecraft.client.render.GuiLighting; +import net.minecraft.client.resource.language.I18n; +import net.minecraft.util.Identifier; +import net.minecraft.util.math.MathHelper; + +import java.util.Arrays; +import java.util.LinkedList; +import java.util.List; +import java.util.function.Supplier; + +public class DefaultCookingCategory implements TransferRecipeCategory { + private Identifier identifier; + private EntryStack logo; + private String categoryName; + + public DefaultCookingCategory(Identifier identifier, EntryStack logo, String categoryName) { + this.identifier = identifier; + this.logo = logo; + this.categoryName = categoryName; + } + + @Override + public void renderRedSlots(List widgets, Rectangle bounds, DefaultCookingDisplay display, IntList redSlots) { + Point startPoint = new Point(bounds.getCenterX() - 41, bounds.getCenterY() - 27); + RenderHelper.translatef(0, 0, 400); + if (redSlots.contains(0)) { + DrawableHelper.fill(startPoint.x + 1, startPoint.y + 1, startPoint.x + 1 + 16, startPoint.y + 1 + 16, 822018048); + } + RenderHelper.translatef(0, 0, -400); + } + + @Override + public List setupDisplay(Supplier recipeDisplaySupplier, Rectangle bounds) { + Point startPoint = new Point(bounds.getCenterX() - 41, bounds.getCenterY() - 27); + List widgets = new LinkedList<>(Arrays.asList(new RecipeBaseWidget(bounds) { + @Override + public void render(int mouseX, int mouseY, float delta) { + super.render(mouseX, mouseY, delta); + RenderHelper.color4f(1.0F, 1.0F, 1.0F, 1.0F); + GuiLighting.disable(); + MinecraftClient.getInstance().getTextureManager().bindTexture(DefaultPlugin.getDisplayTexture()); + blit(startPoint.x, startPoint.y, 0, 54, 82, 54); + int height = MathHelper.ceil((System.currentTimeMillis() / 250 % 14d) / 1f); + blit(startPoint.x + 2, startPoint.y + 21 + (14 - height), 82, 77 + (14 - height), 14, height); + } + })); + widgets.add(new RecipeArrowWidget(startPoint.x + 24, startPoint.y + 18, true)); + List> input = recipeDisplaySupplier.get().getInputEntries(); + widgets.add(EntryWidget.create(startPoint.x + 1, startPoint.y + 1).entries(input.get(0))); + widgets.add(EntryWidget.create(startPoint.x + 1, startPoint.y + 37).entries(input.get(1))); + widgets.add(EntryWidget.create(startPoint.x + 61, startPoint.y + 19).entries(recipeDisplaySupplier.get().getOutputEntries()).noBackground()); + return widgets; + } + + @Override + public RecipeRenderer getSimpleRenderer(DefaultCookingDisplay recipe) { + return Renderer.fromRecipeEntries(() -> Arrays.asList(recipe.getInputEntries().get(0)), recipe::getOutputEntries); + } + + @Override + public Identifier getIdentifier() { + return identifier; + } + + @Override + public EntryStack getLogo() { + return logo; + } + + @Override + public String getCategoryName() { + return I18n.translate(categoryName); + } +} diff --git a/src/main/java/me/shedaniel/rei/plugin/cooking/DefaultCookingDisplay.java b/src/main/java/me/shedaniel/rei/plugin/cooking/DefaultCookingDisplay.java new file mode 100644 index 000000000..6de7700a1 --- /dev/null +++ b/src/main/java/me/shedaniel/rei/plugin/cooking/DefaultCookingDisplay.java @@ -0,0 +1,84 @@ +/* + * Roughly Enough Items by Danielshe. + * Licensed under the MIT License. + */ + +package me.shedaniel.rei.plugin.cooking; + +import me.shedaniel.rei.api.EntryStack; +import me.shedaniel.rei.api.TransferRecipeDisplay; +import me.shedaniel.rei.server.ContainerInfo; +import net.minecraft.block.entity.FurnaceBlockEntity; +import net.minecraft.client.resource.language.I18n; +import net.minecraft.container.Container; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.recipe.AbstractCookingRecipe; +import net.minecraft.util.Formatting; +import net.minecraft.util.Identifier; + +import java.util.*; +import java.util.stream.Collectors; + +public abstract class DefaultCookingDisplay implements TransferRecipeDisplay { + private AbstractCookingRecipe recipe; + private List> input; + private List output; + + public DefaultCookingDisplay(AbstractCookingRecipe recipe) { + this.recipe = recipe; + this.input = recipe.getPreviewInputs().stream().map(i -> { + List entries = new ArrayList<>(); + for (ItemStack stack : i.getStackArray()) { + entries.add(EntryStack.create(stack)); + } + return entries; + }).collect(Collectors.toList()); + this.input.add(FurnaceBlockEntity.createFuelTimeMap().keySet().stream().map(Item::getStackForRender).map(EntryStack::create).map(e -> e.setting(EntryStack.Settings.TOOLTIP_APPEND_EXTRA, stack -> Collections.singletonList(Formatting.YELLOW.toString() + I18n.translate("category.rei.smelting.fuel")))).collect(Collectors.toList())); + this.output = Collections.singletonList(EntryStack.create(recipe.getOutput())); + } + + @Override + public Optional getRecipeLocation() { + return Optional.ofNullable(recipe).map(AbstractCookingRecipe::getId); + } + + @Override + public List> getInputEntries() { + return input; + } + + @Override + public List getOutputEntries() { + return output; + } + + public List getFuel() { + return input.get(1); + } + + @Override + public List> getRequiredEntries() { + return input; + } + + @Deprecated + public Optional getOptionalRecipe() { + return Optional.ofNullable(recipe); + } + + @Override + public int getWidth() { + return 1; + } + + @Override + public int getHeight() { + return 1; + } + + @Override + public List> getOrganisedInput(ContainerInfo containerInfo, Container container) { + return recipe.getPreviewInputs().stream().map(i -> Arrays.asList(i.getStackArray())).collect(Collectors.toList()); + } +} diff --git a/src/main/java/me/shedaniel/rei/plugin/crafting/DefaultCraftingCategory.java b/src/main/java/me/shedaniel/rei/plugin/crafting/DefaultCraftingCategory.java index 0837c0ab5..a0c2320e4 100644 --- a/src/main/java/me/shedaniel/rei/plugin/crafting/DefaultCraftingCategory.java +++ b/src/main/java/me/shedaniel/rei/plugin/crafting/DefaultCraftingCategory.java @@ -9,9 +9,11 @@ import com.google.common.collect.Lists; import it.unimi.dsi.fastutil.ints.IntList; import me.shedaniel.math.api.Point; import me.shedaniel.math.api.Rectangle; +import me.shedaniel.rei.api.EntryStack; import com.mojang.blaze3d.systems.RenderSystem; import me.shedaniel.rei.api.Renderer; import me.shedaniel.rei.api.TransferRecipeCategory; +import me.shedaniel.rei.gui.widget.EntryWidget; import me.shedaniel.rei.gui.widget.RecipeBaseWidget; import me.shedaniel.rei.gui.widget.SlotWidget; import me.shedaniel.rei.gui.widget.Widget; @@ -71,20 +73,20 @@ public class DefaultCraftingCategory implements TransferRecipeCategory> input = recipeDisplaySupplier.get().getInput(); - List slots = Lists.newArrayList(); + List> input = recipeDisplaySupplier.get().getInputEntries(); + List slots = Lists.newArrayList(); for (int y = 0; y < 3; y++) for (int x = 0; x < 3; x++) - slots.add(new SlotWidget(startPoint.x + 1 + x * 18, startPoint.y + 1 + y * 18, Lists.newArrayList(), true, true, true)); + slots.add(EntryWidget.create(startPoint.x + 1 + x * 18, startPoint.y + 1 + y * 18)); for (int i = 0; i < input.size(); i++) { if (recipeDisplaySupplier.get() instanceof DefaultShapedDisplay) { if (!input.get(i).isEmpty()) - slots.get(getSlotWithSize(recipeDisplaySupplier.get(), i, 3)).setRenderers(Collections.singletonList(Renderer.fromItemStacks(input.get(i)))); + slots.get(getSlotWithSize(recipeDisplaySupplier.get(), i, 3)).entries(input.get(i)); } else if (!input.get(i).isEmpty()) - slots.get(i).setRenderers(Collections.singletonList(Renderer.fromItemStacks(input.get(i)))); + slots.get(i).entries(input.get(i)); } widgets.addAll(slots); - widgets.add(new SlotWidget(startPoint.x + 95, startPoint.y + 19, Renderer.fromItemStacks(recipeDisplaySupplier.get().getOutput()), false, true, true)); + widgets.add(EntryWidget.create(startPoint.x + 95, startPoint.y + 19).entries(recipeDisplaySupplier.get().getOutputEntries()).noBackground()); return widgets; } diff --git a/src/main/java/me/shedaniel/rei/plugin/crafting/DefaultCraftingDisplay.java b/src/main/java/me/shedaniel/rei/plugin/crafting/DefaultCraftingDisplay.java index 48601433c..b341beba5 100644 --- a/src/main/java/me/shedaniel/rei/plugin/crafting/DefaultCraftingDisplay.java +++ b/src/main/java/me/shedaniel/rei/plugin/crafting/DefaultCraftingDisplay.java @@ -6,11 +6,11 @@ package me.shedaniel.rei.plugin.crafting; import com.google.common.collect.Lists; +import me.shedaniel.rei.api.EntryStack; import me.shedaniel.rei.api.TransferRecipeDisplay; import me.shedaniel.rei.plugin.DefaultPlugin; import me.shedaniel.rei.server.ContainerInfo; import net.minecraft.container.Container; -import net.minecraft.item.ItemStack; import net.minecraft.recipe.Recipe; import net.minecraft.util.Identifier; @@ -37,13 +37,13 @@ public interface DefaultCraftingDisplay extends TransferRecipeDisplay { Optional> getOptionalRecipe(); @Override - default List> getOrganisedInput(ContainerInfo containerInfo, Container container) { - List> list = Lists.newArrayListWithCapacity(containerInfo.getCraftingWidth(container) * containerInfo.getCraftingHeight(container)); + default List> getOrganisedInputEntries(ContainerInfo containerInfo, Container container) { + List> list = Lists.newArrayListWithCapacity(containerInfo.getCraftingWidth(container) * containerInfo.getCraftingHeight(container)); for (int i = 0; i < containerInfo.getCraftingWidth(container) * containerInfo.getCraftingHeight(container); i++) { list.add(Lists.newArrayList()); } - for (int i = 0; i < getInput().size(); i++) { - List stacks = getInput().get(i); + for (int i = 0; i < getInputEntries().size(); i++) { + List stacks = getInputEntries().get(i); list.set(DefaultCraftingCategory.getSlotWithSize(this, i, containerInfo.getCraftingWidth(container)), stacks); } return list; diff --git a/src/main/java/me/shedaniel/rei/plugin/crafting/DefaultCustomDisplay.java b/src/main/java/me/shedaniel/rei/plugin/crafting/DefaultCustomDisplay.java index 756b1afe1..ef6b017ae 100644 --- a/src/main/java/me/shedaniel/rei/plugin/crafting/DefaultCustomDisplay.java +++ b/src/main/java/me/shedaniel/rei/plugin/crafting/DefaultCustomDisplay.java @@ -6,6 +6,8 @@ package me.shedaniel.rei.plugin.crafting; import com.google.common.collect.Lists; +import me.shedaniel.rei.api.EntryStack; +import me.shedaniel.rei.utils.CollectionUtils; import net.minecraft.item.ItemStack; import net.minecraft.recipe.Recipe; import net.minecraft.util.Identifier; @@ -15,20 +17,24 @@ import java.util.Optional; public class DefaultCustomDisplay implements DefaultCraftingDisplay { - private List> input; - private List output; + private List> input; + private List output; private Recipe possibleRecipe; private int width, height; public DefaultCustomDisplay(List> input, List output, Recipe possibleRecipe) { + this(possibleRecipe, CollectionUtils.map(input, i -> CollectionUtils.map(i, EntryStack::create)), CollectionUtils.map(output, EntryStack::create)); + } + + public DefaultCustomDisplay(Recipe possibleRecipe, List> input, List output) { this.input = input; this.output = output; this.possibleRecipe = possibleRecipe; List row = Lists.newArrayList(false, false, false); List column = Lists.newArrayList(false, false, false); for (int i = 0; i < 9; i++) - if (i < input.size()) { - List stacks = input.get(i); + if (i < this.input.size()) { + List stacks = this.input.get(i); if (stacks.stream().filter(stack -> !stack.isEmpty()).count() > 0) { row.set((i - (i % 3)) / 3, true); column.set(i % 3, true); @@ -52,17 +58,17 @@ public class DefaultCustomDisplay implements DefaultCraftingDisplay { } @Override - public List> getInput() { + public List> getInputEntries() { return input; } @Override - public List getOutput() { + public List getOutputEntries() { return output; } @Override - public List> getRequiredItems() { + public List> getRequiredEntries() { return input; } diff --git a/src/main/java/me/shedaniel/rei/plugin/crafting/DefaultShapedDisplay.java b/src/main/java/me/shedaniel/rei/plugin/crafting/DefaultShapedDisplay.java index f82a858f5..c14b18e53 100644 --- a/src/main/java/me/shedaniel/rei/plugin/crafting/DefaultShapedDisplay.java +++ b/src/main/java/me/shedaniel/rei/plugin/crafting/DefaultShapedDisplay.java @@ -5,12 +5,14 @@ package me.shedaniel.rei.plugin.crafting; +import me.shedaniel.rei.api.EntryStack; import net.minecraft.item.ItemStack; +import net.minecraft.item.PotionItem; import net.minecraft.recipe.Recipe; import net.minecraft.recipe.ShapedRecipe; import net.minecraft.util.Identifier; -import java.util.Arrays; +import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Optional; @@ -19,13 +21,23 @@ import java.util.stream.Collectors; public class DefaultShapedDisplay implements DefaultCraftingDisplay { private ShapedRecipe display; - private List> input; - private List output; + private List> input; + private List output; public DefaultShapedDisplay(ShapedRecipe recipe) { this.display = recipe; - this.input = recipe.getPreviewInputs().stream().map(i -> Arrays.asList(i.getMatchingStacksClient())).collect(Collectors.toList()); - this.output = Collections.singletonList(recipe.getOutput()); + this.input = recipe.getPreviewInputs().stream().map(i -> { + List entries = new ArrayList<>(); + for (ItemStack stack : i.getStackArray()) { + if (stack.getItem() instanceof PotionItem) + entries.add(EntryStack.create(stack).setting(EntryStack.Settings.CHECK_TAGS, EntryStack.Settings.TRUE)); + else entries.add(EntryStack.create(stack)); + } + return entries; + }).collect(Collectors.toList()); + if (recipe.getOutput().getItem() instanceof PotionItem) + this.output = Collections.singletonList(EntryStack.create(recipe.getOutput()).setting(EntryStack.Settings.CHECK_TAGS, EntryStack.Settings.TRUE)); + else this.output = Collections.singletonList(EntryStack.create(recipe.getOutput())); } @Override @@ -34,17 +46,17 @@ public class DefaultShapedDisplay implements DefaultCraftingDisplay { } @Override - public List> getInput() { + public List> getInputEntries() { return input; } @Override - public List getOutput() { + public List getOutputEntries() { return output; } @Override - public List> getRequiredItems() { + public List> getRequiredEntries() { return input; } diff --git a/src/main/java/me/shedaniel/rei/plugin/crafting/DefaultShapelessDisplay.java b/src/main/java/me/shedaniel/rei/plugin/crafting/DefaultShapelessDisplay.java index 29d0c790f..79b2b92ab 100644 --- a/src/main/java/me/shedaniel/rei/plugin/crafting/DefaultShapelessDisplay.java +++ b/src/main/java/me/shedaniel/rei/plugin/crafting/DefaultShapelessDisplay.java @@ -5,12 +5,14 @@ package me.shedaniel.rei.plugin.crafting; +import me.shedaniel.rei.api.EntryStack; import net.minecraft.item.ItemStack; +import net.minecraft.item.PotionItem; import net.minecraft.recipe.Recipe; import net.minecraft.recipe.ShapelessRecipe; import net.minecraft.util.Identifier; -import java.util.Arrays; +import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Optional; @@ -19,13 +21,23 @@ import java.util.stream.Collectors; public class DefaultShapelessDisplay implements DefaultCraftingDisplay { private ShapelessRecipe display; - private List> input; - private List output; + private List> input; + private List output; public DefaultShapelessDisplay(ShapelessRecipe recipe) { this.display = recipe; - this.input = recipe.getPreviewInputs().stream().map(i -> Arrays.asList(i.getMatchingStacksClient())).collect(Collectors.toList()); - this.output = Collections.singletonList(recipe.getOutput()); + this.input = recipe.getPreviewInputs().stream().map(i -> { + List entries = new ArrayList<>(); + for (ItemStack stack : i.getStackArray()) { + if (stack.getItem() instanceof PotionItem) + entries.add(EntryStack.create(stack).setting(EntryStack.Settings.CHECK_TAGS, EntryStack.Settings.TRUE)); + else entries.add(E