diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/crafting/FermentingRecipe.java b/src/main/java/de/ellpeck/actuallyadditions/mod/crafting/FermentingRecipe.java index 8a0beb681..72315ec9e 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/mod/crafting/FermentingRecipe.java +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/crafting/FermentingRecipe.java @@ -2,6 +2,7 @@ package de.ellpeck.actuallyadditions.mod.crafting; import com.google.gson.JsonObject; import com.google.gson.JsonParseException; +import de.ellpeck.actuallyadditions.mod.inventory.gui.FluidDisplay; import net.minecraft.data.IFinishedRecipe; import net.minecraft.fluid.Fluid; import net.minecraft.inventory.IInventory; @@ -19,13 +20,17 @@ import net.minecraftforge.registries.ForgeRegistryEntry; import javax.annotation.Nonnull; import javax.annotation.Nullable; +import java.util.Optional; public class FermentingRecipe implements IRecipe { public static final String NAME = "fermenting"; private final ResourceLocation ID; private final FluidStack input; private final FluidStack output; - private int time; + private final int time; + + private Optional inputDisplay; + private Optional outputDisplay; public FermentingRecipe(ResourceLocation ID, FluidStack input, FluidStack output, int timeIn) { this.ID = ID; @@ -42,6 +47,22 @@ public class FermentingRecipe implements IRecipe { return input.isFluidEqual(this.input) && (output.isEmpty() || output.isFluidEqual(this.output) && input.getAmount() >= this.input.getAmount()); } + public Optional getInputDisplay() { + return inputDisplay; + } + + public void setInputDisplay(FluidDisplay inputDisplay) { + this.inputDisplay = Optional.of(inputDisplay); + } + + public Optional getOutputDisplay() { + return outputDisplay; + } + + public void setOutputDisplay(FluidDisplay outputDisplay) { + this.outputDisplay = Optional.of(outputDisplay); + } + public int getTime() { return this.time; } diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/inventory/gui/FluidDisplay.java b/src/main/java/de/ellpeck/actuallyadditions/mod/inventory/gui/FluidDisplay.java index 9b22d9dc0..bdba504dc 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/mod/inventory/gui/FluidDisplay.java +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/inventory/gui/FluidDisplay.java @@ -23,9 +23,11 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.IFluidTank; +import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.fluids.capability.templates.FluidTank; import net.minecraftforge.fml.client.gui.GuiUtils; +import javax.annotation.Nonnull; import java.text.NumberFormat; import java.util.Collections; @@ -43,6 +45,8 @@ public class FluidDisplay extends AbstractGui { private boolean drawTextNextTo; + private boolean drawCapacityInTooltip = true; + public FluidDisplay(int x, int y, IFluidTank fluidReference, boolean outline, boolean drawTextNextTo) { this.setData(x, y, fluidReference, outline, drawTextNextTo); } @@ -51,6 +55,17 @@ public class FluidDisplay extends AbstractGui { this(x, y, fluidReference, false, false); } + public FluidDisplay(int x, int y, FluidStack stack, int capacity, boolean drawCapacity) { + this.x = x; + this.y = y; + this.drawCapacityInTooltip = drawCapacity; + this.fluidReference = new DummyTank(stack, capacity); + } + + public void setDrawCapacityInTooltip(boolean drawCapacityInTooltip) { + this.drawCapacityInTooltip = drawCapacityInTooltip; + } + public void setData(int x, int y, IFluidTank fluidReference, boolean outline, boolean drawTextNextTo) { this.x = x; this.y = y; @@ -122,6 +137,54 @@ public class FluidDisplay extends AbstractGui { String cap = format.format(this.fluidReference.getCapacity()); return stack.isEmpty() ? "0/" + cap + " mB" - : format.format(this.fluidReference.getFluidAmount()) + "/" + cap + " mB " + stack.getDisplayName().getString(); + : format.format(this.fluidReference.getFluidAmount()) + (drawCapacityInTooltip?"/" + cap + " mB ":" mB ") + stack.getDisplayName().getString(); + } + + public static class DummyTank implements IFluidTank { + private final FluidStack fluid; + private final int capacity; + + public DummyTank(FluidStack fluid, int capacity) { + this.fluid = fluid; + this.capacity = capacity; + } + + @Nonnull + @Override + public FluidStack getFluid() { + return fluid; + } + + @Override + public int getFluidAmount() { + return fluid.getAmount(); + } + + @Override + public int getCapacity() { + return capacity; + } + + @Override + public boolean isFluidValid(FluidStack stack) { + return false; + } + + @Override + public int fill(FluidStack resource, IFluidHandler.FluidAction action) { + return 0; + } + + @Nonnull + @Override + public FluidStack drain(int maxDrain, IFluidHandler.FluidAction action) { + return FluidStack.EMPTY; + } + + @Nonnull + @Override + public FluidStack drain(FluidStack resource, IFluidHandler.FluidAction action) { + return FluidStack.EMPTY; + } } } diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/jei/FermentingCategory.java b/src/main/java/de/ellpeck/actuallyadditions/mod/jei/FermentingCategory.java new file mode 100644 index 000000000..8cebb0751 --- /dev/null +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/jei/FermentingCategory.java @@ -0,0 +1,84 @@ +package de.ellpeck.actuallyadditions.mod.jei; + +import com.mojang.blaze3d.matrix.MatrixStack; +import de.ellpeck.actuallyadditions.mod.ActuallyAdditions; +import de.ellpeck.actuallyadditions.mod.crafting.FermentingRecipe; +import de.ellpeck.actuallyadditions.mod.inventory.gui.FluidDisplay; +import mezz.jei.api.constants.VanillaTypes; +import mezz.jei.api.gui.IRecipeLayout; +import mezz.jei.api.gui.drawable.IDrawable; +import mezz.jei.api.gui.drawable.IDrawableStatic; +import mezz.jei.api.helpers.IGuiHelper; +import mezz.jei.api.ingredients.IIngredients; +import mezz.jei.api.recipe.category.IRecipeCategory; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fluids.FluidAttributes; + +import javax.annotation.Nonnull; + +public class FermentingCategory implements IRecipeCategory { + public static final ResourceLocation ID = new ResourceLocation(ActuallyAdditions.MODID, "fermenting_jei"); + + private final IDrawableStatic background; + + public FermentingCategory(IGuiHelper guiHelper) { + background = guiHelper.drawableBuilder(new ResourceLocation(ActuallyAdditions.MODID, "textures/gui/gui_fermenting_barrel.png"), 41, 4, 94, 86).setTextureSize(256,256).build(); + } + + @Override + public ResourceLocation getUid() { + return ID; + } + + @Override + public Class getRecipeClass() { + return FermentingRecipe.class; + } + + @Override + public String getTitle() { + return "Fermenting Recipe"; + } + + @Override + public IDrawable getBackground() { + return background; + } + + @Override + public IDrawable getIcon() { + return null; + } + + @Override + public void setIngredients(@Nonnull FermentingRecipe fermentingRecipe, @Nonnull IIngredients ingredients) { + ingredients.setInput(VanillaTypes.FLUID, fermentingRecipe.getInput()); + ingredients.setOutput(VanillaTypes.FLUID, fermentingRecipe.getOutput()); + } + + @Override + public void setRecipe(@Nonnull IRecipeLayout recipeLayout, @Nonnull FermentingRecipe fermentingRecipe, @Nonnull IIngredients ingredients) { + int maxFluid = Math.max(FluidAttributes.BUCKET_VOLUME, Math.max(fermentingRecipe.getInput().getAmount(), fermentingRecipe.getOutput().getAmount())); + + fermentingRecipe.setInputDisplay(new FluidDisplay(19, 1, fermentingRecipe.getInput(), maxFluid, false)); + fermentingRecipe.setOutputDisplay(new FluidDisplay(19+38, 1, fermentingRecipe.getOutput(), maxFluid, false)); + } + + @Override + public void draw(FermentingRecipe recipe, MatrixStack matrixStack, double mouseX, double mouseY) { + IRecipeCategory.super.draw(recipe, matrixStack, mouseX, mouseY); + + recipe.getInputDisplay().ifPresent(display -> { + display.draw(matrixStack); + display.render(matrixStack, (int) mouseX, (int) mouseY); + }); + + recipe.getOutputDisplay().ifPresent(display -> { + display.draw(matrixStack); + display.render(matrixStack, (int) mouseX, (int) mouseY); + }); + + + //TODO draw the progress indicator, scaled to the recipe duration. + } +} diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/jei/JEIActuallyAdditionsPlugin.java b/src/main/java/de/ellpeck/actuallyadditions/mod/jei/JEIActuallyAdditionsPlugin.java index 16ada60bb..a01465242 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/mod/jei/JEIActuallyAdditionsPlugin.java +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/jei/JEIActuallyAdditionsPlugin.java @@ -11,6 +11,8 @@ package de.ellpeck.actuallyadditions.mod.jei; import de.ellpeck.actuallyadditions.mod.ActuallyAdditions; +import de.ellpeck.actuallyadditions.mod.blocks.ActuallyBlocks; +import de.ellpeck.actuallyadditions.mod.crafting.ActuallyRecipes; import de.ellpeck.actuallyadditions.mod.items.ActuallyItems; import mezz.jei.api.IModPlugin; import mezz.jei.api.JeiPlugin; @@ -19,8 +21,10 @@ import mezz.jei.api.helpers.IJeiHelpers; import mezz.jei.api.registration.IRecipeCatalystRegistration; import mezz.jei.api.registration.IRecipeCategoryRegistration; import mezz.jei.api.registration.IRecipeRegistration; +import net.minecraft.client.Minecraft; import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; +import net.minecraft.world.World; @JeiPlugin public class JEIActuallyAdditionsPlugin implements IModPlugin { @@ -33,12 +37,17 @@ public class JEIActuallyAdditionsPlugin implements IModPlugin { @Override public void registerCategories(IRecipeCategoryRegistration registry) { IJeiHelpers helpers = registry.getJeiHelpers(); + + registry.addRecipeCategories(new FermentingCategory(helpers.getGuiHelper())); + //registry.addRecipeCategories(new CoffeeMachineRecipeCategory(helpers.getGuiHelper()), new CompostRecipeCategory(helpers.getGuiHelper()), new CrusherRecipeCategory(helpers.getGuiHelper()), new ReconstructorRecipeCategory(helpers.getGuiHelper()), new EmpowererRecipeCategory(helpers.getGuiHelper()), new BookletRecipeCategory(helpers.getGuiHelper())); } @Override public void registerRecipeCatalysts(IRecipeCatalystRegistration registry) { registry.addRecipeCatalyst(new ItemStack(ActuallyItems.CRAFTER_ON_A_STICK.get()), VanillaRecipeCategoryUid.CRAFTING); + registry.addRecipeCatalyst(new ItemStack(ActuallyBlocks.FERMENTING_BARREL.getItem()), FermentingCategory.ID); + // registry.addRecipeCatalyst(new ItemStack(ActuallyBlocks.blockFurnaceDouble.get()), VanillaRecipeCategoryUid.SMELTING); // registry.addRecipeCatalyst(new ItemStack(ActuallyBlocks.blockGrinder.get()), CrusherRecipeCategory.NAME); // registry.addRecipeCatalyst(new ItemStack(ActuallyBlocks.blockGrinderDouble.get()), CrusherRecipeCategory.NAME); @@ -51,6 +60,11 @@ public class JEIActuallyAdditionsPlugin implements IModPlugin { @Override public void registerRecipes(IRecipeRegistration registry) { + World level = Minecraft.getInstance().level; + + registry.addRecipes(level.getRecipeManager().getAllRecipesFor(ActuallyRecipes.Types.FERMENTING), FermentingCategory.ID); + + //registry.addRecipes(ActuallyAdditionsAPI.BOOKLET_PAGES_WITH_ITEM_OR_FLUID_DATA, BookletRecipeCategory.NAME); //registry.addRecipes(ActuallyAdditionsAPI.COFFEE_MACHINE_INGREDIENTS, CoffeeMachineRecipeCategory.NAME); //registry.addRecipes(ActuallyAdditionsAPI.CRUSHER_RECIPES, CrusherRecipeCategory.NAME); diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/tile/TileEntityFermentingBarrel.java b/src/main/java/de/ellpeck/actuallyadditions/mod/tile/TileEntityFermentingBarrel.java index aa5a6b478..296998943 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/mod/tile/TileEntityFermentingBarrel.java +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/tile/TileEntityFermentingBarrel.java @@ -77,7 +77,9 @@ public class TileEntityFermentingBarrel extends TileEntityBase implements IShari return; if (currentRecipe == null) { - this.currentRecipe = ActuallyAdditionsAPI.FERMENTING_RECIPES.stream().filter(recipe -> recipe.matches(this.tanks.getFluidInTank(0), this.tanks.getFluidInTank(1))).findFirst().orElse(null); + //No recipe currently selected, check for one every 20 ticks + if (ticksElapsed % 20 == 0) + this.currentRecipe = ActuallyAdditionsAPI.FERMENTING_RECIPES.stream().filter(recipe -> recipe.matches(this.tanks.getFluidInTank(0), this.tanks.getFluidInTank(1))).findFirst().orElse(null); } else { if (this.tanks.getFluidInTank(0).getAmount() >= currentRecipe.getInput().getAmount() && this.tanks.getFluidInTank(0).getFluid().isSame(currentRecipe.getInput().getFluid()) && @@ -154,6 +156,7 @@ public class TileEntityFermentingBarrel extends TileEntityBase implements IShari return Direction.values(); } + @Nonnull @Override public ITextComponent getDisplayName() { return new TranslationTextComponent("container.actuallyadditions.fermenting_barrel"); @@ -161,7 +164,7 @@ public class TileEntityFermentingBarrel extends TileEntityBase implements IShari @Nullable @Override - public Container createMenu(int windowId, PlayerInventory playerInventory, PlayerEntity p_createMenu_3_) { + public Container createMenu(int windowId, @Nonnull PlayerInventory playerInventory, @Nonnull PlayerEntity p_createMenu_3_) { return new ContainerFermentingBarrel(windowId, playerInventory, this); } @@ -174,9 +177,9 @@ public class TileEntityFermentingBarrel extends TileEntityBase implements IShari } - public class FermentingBarrelMultiTank implements IFluidHandler { + public static class FermentingBarrelMultiTank implements IFluidHandler { - private int capacity = FluidAttributes.BUCKET_VOLUME * 2; + private final int capacity = FluidAttributes.BUCKET_VOLUME * 2; public FluidTank inputTank = new FluidTank(capacity); public FluidTank outputTank = new FluidTank(capacity);