Skip to content

Commit

Permalink
Update JEI integration and add potion fluids to the ingredient list
Browse files Browse the repository at this point in the history
This also resolves a minor issue where all virtual fluids were considered "flowing".
Fixes mezz/JustEnoughItems#3754
  • Loading branch information
mezz committed Sep 12, 2024
1 parent aa15182 commit 127b64e
Show file tree
Hide file tree
Showing 21 changed files with 92 additions and 48 deletions.
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ registrate_version = MC1.20-1.3.3
flywheel_minecraft_version = 1.20.1
flywheel_version = 1.0.0-beta-113
jei_minecraft_version = 1.20.1
jei_version = 15.10.0.39
jei_version = 15.19.0.85
curios_minecraft_version = 1.20.1
curios_version = 5.3.1

Expand Down
5 changes: 3 additions & 2 deletions src/main/java/com/simibubi/create/AllFluids.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,15 @@

import javax.annotation.Nullable;

import com.simibubi.create.content.fluids.VirtualFluid;

import org.jetbrains.annotations.NotNull;
import org.joml.Vector3f;

import com.mojang.blaze3d.shaders.FogShape;
import com.mojang.blaze3d.systems.RenderSystem;
import com.simibubi.create.AllTags.AllFluidTags;
import com.simibubi.create.content.decoration.palettes.AllPaletteStoneTypes;
import com.simibubi.create.content.fluids.VirtualFluid;
import com.simibubi.create.content.fluids.potion.PotionFluid;
import com.simibubi.create.content.fluids.potion.PotionFluid.PotionFluidType;
import com.simibubi.create.foundation.utility.Color;
Expand Down Expand Up @@ -46,7 +47,7 @@ public class AllFluids {
}

public static final FluidEntry<PotionFluid> POTION =
REGISTRATE.virtualFluid("potion", PotionFluidType::new, PotionFluid::new)
REGISTRATE.virtualFluid("potion", PotionFluidType::new, PotionFluid::createSource, PotionFluid::createFlowing)
.lang("Potion")
.register();

Expand Down
15 changes: 15 additions & 0 deletions src/main/java/com/simibubi/create/compat/jei/CreateJEI.java
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@
import mezz.jei.api.gui.drawable.IDrawable;
import mezz.jei.api.helpers.IPlatformFluidHelper;
import mezz.jei.api.recipe.category.IRecipeCategory;
import mezz.jei.api.registration.IExtraIngredientRegistration;
import mezz.jei.api.registration.IGuiHandlerRegistration;
import mezz.jei.api.registration.IRecipeCatalystRegistration;
import mezz.jei.api.registration.IRecipeCategoryRegistration;
Expand All @@ -90,6 +91,7 @@
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import net.minecraft.world.item.alchemy.Potion;
import net.minecraft.world.item.crafting.AbstractCookingRecipe;
import net.minecraft.world.item.crafting.CraftingRecipe;
import net.minecraft.world.item.crafting.Recipe;
Expand All @@ -98,7 +100,9 @@
import net.minecraft.world.level.ItemLike;
import net.minecraft.world.level.block.Blocks;
import net.minecraftforge.common.crafting.IShapedRecipe;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fml.ModList;
import net.minecraftforge.registries.ForgeRegistries;

@JeiPlugin
@SuppressWarnings("unused")
Expand Down Expand Up @@ -363,6 +367,17 @@ public <T> void registerFluidSubtypes(ISubtypeRegistration registration, IPlatfo
registration.registerSubtypeInterpreter(ForgeTypes.FLUID_STACK, potionFluid.getFlowing(), interpreter);
}

@Override
public void registerExtraIngredients(IExtraIngredientRegistration registration) {
Collection<Potion> potions = ForgeRegistries.POTIONS.getValues();
Collection<FluidStack> potionFluids = new ArrayList<>(potions.size());
for (Potion potion : potions) {
FluidStack potionFluid = PotionFluid.of(1000, potion);
potionFluids.add(potionFluid);
}
registration.addExtraIngredients(ForgeTypes.FLUID_STACK, potionFluids);
}

@SuppressWarnings({ "unchecked", "rawtypes" })
@Override
public void registerGuiHandlers(IGuiHandlerRegistration registration) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ public void setRecipe(IRecipeLayoutBuilder builder, BasinRecipe recipe, IFocusGr
.addSlot(RecipeIngredientRole.INPUT, 17 + xOffset + (i % 3) * 19, 51 - (i / 3) * 19)
.setBackground(getRenderedSlot(), -1, -1)
.addIngredients(ForgeTypes.FLUID_STACK, withImprovedVisibility(fluidIngredient.getMatchingFluidStacks()))
.addTooltipCallback(addFluidTooltip(fluidIngredient.getRequiredAmount()));
.addRichTooltipCallback(addFluidTooltip(fluidIngredient.getRequiredAmount()));
i++;
}

Expand All @@ -82,7 +82,7 @@ public void setRecipe(IRecipeLayoutBuilder builder, BasinRecipe recipe, IFocusGr
.addSlot(RecipeIngredientRole.OUTPUT, xPosition, yPosition)
.setBackground(getRenderedSlot(result), -1, -1)
.addItemStack(result.getStack())
.addTooltipCallback(addStochasticTooltip(result));
.addRichTooltipCallback(addStochasticTooltip(result));
i++;
}

Expand All @@ -94,7 +94,7 @@ public void setRecipe(IRecipeLayoutBuilder builder, BasinRecipe recipe, IFocusGr
.addSlot(RecipeIngredientRole.OUTPUT, xPosition, yPosition)
.setBackground(getRenderedSlot(), -1, -1)
.addIngredient(ForgeTypes.FLUID_STACK, withImprovedVisibility(fluidResult))
.addTooltipCallback(addFluidTooltip(fluidResult.getAmount()));
.addRichTooltipCallback(addFluidTooltip(fluidResult.getAmount()));
i++;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@

import javax.annotation.ParametersAreNonnullByDefault;

import mezz.jei.api.gui.ingredient.IRecipeSlotRichTooltipCallback;

import org.jetbrains.annotations.NotNull;

import com.simibubi.create.AllFluids;
Expand Down Expand Up @@ -108,11 +110,11 @@ public static ItemStack getResultItem(Recipe<?> recipe) {
return recipe.getResultItem(level.registryAccess());
}

public static IRecipeSlotTooltipCallback addStochasticTooltip(ProcessingOutput output) {
public static IRecipeSlotRichTooltipCallback addStochasticTooltip(ProcessingOutput output) {
return (view, tooltip) -> {
float chance = output.getChance();
if (chance != 1)
tooltip.add(1, Lang.translateDirect("recipe.processing.chance", chance < 0.01 ? "<1" : (int) (chance * 100))
tooltip.add(Lang.translateDirect("recipe.processing.chance", chance < 0.01 ? "<1" : (int) (chance * 100))
.withStyle(ChatFormatting.GOLD));
};
}
Expand All @@ -130,11 +132,11 @@ public static FluidStack withImprovedVisibility(FluidStack stack) {
return display;
}

public static IRecipeSlotTooltipCallback addFluidTooltip() {
public static IRecipeSlotRichTooltipCallback addFluidTooltip() {
return addFluidTooltip(-1);
}

public static IRecipeSlotTooltipCallback addFluidTooltip(int mbAmount) {
public static IRecipeSlotRichTooltipCallback addFluidTooltip(int mbAmount) {
return (view, tooltip) -> {
Optional<FluidStack> displayed = view.getDisplayedIngredient(ForgeTypes.FLUID_STACK);
if (displayed.isEmpty())
Expand All @@ -143,26 +145,14 @@ public static IRecipeSlotTooltipCallback addFluidTooltip(int mbAmount) {
FluidStack fluidStack = displayed.get();

if (fluidStack.getFluid().isSame(AllFluids.POTION.get())) {
Component name = fluidStack.getDisplayName();
if (tooltip.isEmpty())
tooltip.add(0, name);
else
tooltip.set(0, name);

ArrayList<Component> potionTooltip = new ArrayList<>();
PotionFluidHandler.addPotionTooltip(fluidStack, potionTooltip, 1);
tooltip.addAll(1, potionTooltip.stream().toList());
tooltip.addAll(potionTooltip.stream().toList());
}

int amount = mbAmount == -1 ? fluidStack.getAmount() : mbAmount;
Component text = Components.literal(String.valueOf(amount)).append(Lang.translateDirect("generic.unit.millibuckets")).withStyle(ChatFormatting.GOLD);
if (tooltip.isEmpty())
tooltip.add(0, text);
else {
List<Component> siblings = tooltip.get(0).getSiblings();
siblings.add(Components.literal(" "));
siblings.add(text);
}
tooltip.add(text);
};
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ public void setRecipe(IRecipeLayoutBuilder builder, AbstractCrushingRecipe recip
.addSlot(RecipeIngredientRole.OUTPUT, (xOffset) + layoutEntry.posX() + 1, yOffset + layoutEntry.posY() + 1)
.setBackground(getRenderedSlot(layoutEntry.output()), -1, -1)
.addItemStack(layoutEntry.output().getStack())
.addTooltipCallback(addStochasticTooltip(layoutEntry.output()))
.addRichTooltipCallback(addStochasticTooltip(layoutEntry.output()))
);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ public void setRecipe(IRecipeLayoutBuilder builder, DeployerApplicationRecipe re
builder.addSlot(RecipeIngredientRole.OUTPUT, single ? 132 : 132 + xOffset, 51 + yOffset)
.setBackground(getRenderedSlot(output), -1, -1)
.addItemStack(output.getStack())
.addTooltipCallback(addStochasticTooltip(output));
.addRichTooltipCallback(addStochasticTooltip(output));
}

if (recipe.shouldKeepHeldItem())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ public void setRecipe(IRecipeLayoutBuilder builder, ItemApplicationRecipe recipe
builder.addSlot(RecipeIngredientRole.OUTPUT, single ? 132 : 132 + xOffset, 38 + yOffset)
.setBackground(getRenderedSlot(output), -1, -1)
.addItemStack(output.getStack())
.addTooltipCallback(addStochasticTooltip(output));
.addRichTooltipCallback(addStochasticTooltip(output));
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ public void setRecipe(IRecipeLayoutBuilder builder, EmptyingRecipe recipe, IFocu
.addSlot(RecipeIngredientRole.OUTPUT, 132, 8)
.setBackground(getRenderedSlot(), -1, -1)
.addIngredient(ForgeTypes.FLUID_STACK, withImprovedVisibility(recipe.getResultingFluid()))
.addTooltipCallback(addFluidTooltip(recipe.getResultingFluid().getAmount()));
.addRichTooltipCallback(addFluidTooltip(recipe.getResultingFluid().getAmount()));
builder
.addSlot(RecipeIngredientRole.OUTPUT, 132, 27)
.setBackground(getRenderedSlot(), -1, -1)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ public void setRecipe(IRecipeLayoutBuilder builder, AbstractCrushingRecipe recip
.addSlot(RecipeIngredientRole.OUTPUT, single ? 139 : 133 + xOffset, 27 + yOffset)
.setBackground(getRenderedSlot(output), -1, -1)
.addItemStack(output.getStack())
.addTooltipCallback(addStochasticTooltip(output));
.addRichTooltipCallback(addStochasticTooltip(output));

i++;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ public void setRecipe(IRecipeLayoutBuilder builder, SandPaperPolishingRecipe rec
.addSlot(RecipeIngredientRole.OUTPUT, 132, 29)
.setBackground(getRenderedSlot(output), -1, -1)
.addItemStack(output.getStack())
.addTooltipCallback(addStochasticTooltip(output));
.addRichTooltipCallback(addStochasticTooltip(output));
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ public void setRecipe(IRecipeLayoutBuilder builder, PressingRecipe recipe, IFocu
builder.addSlot(RecipeIngredientRole.OUTPUT, 131 + 19 * i, 50)
.setBackground(getRenderedSlot(output), -1, -1)
.addItemStack(output.getStack())
.addTooltipCallback(addStochasticTooltip(output));
.addRichTooltipCallback(addStochasticTooltip(output));
i++;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@ public void setRecipe(IRecipeLayoutBuilder builder, T recipe, IFocusGroup focuse
.addSlot(RecipeIngredientRole.OUTPUT, 141 + xOffset, 48 + yOffset)
.setBackground(getRenderedSlot(output), -1, -1)
.addItemStack(output.getStack())
.addTooltipCallback(addStochasticTooltip(output));
.addRichTooltipCallback(addStochasticTooltip(output));
i++;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ public void setRecipe(IRecipeLayoutBuilder builder, CuttingRecipe recipe, IFocus
.addSlot(RecipeIngredientRole.OUTPUT, 118 + xOffset, 48 + yOffset)
.setBackground(getRenderedSlot(output), -1, -1)
.addItemStack(output.getStack())
.addTooltipCallback(addStochasticTooltip(output));
.addRichTooltipCallback(addStochasticTooltip(output));
i++;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ public void setRecipe(IRecipeLayoutBuilder builder, FillingRecipe recipe, IFocus
.addSlot(RecipeIngredientRole.INPUT, 27, 32)
.setBackground(getRenderedSlot(), -1, -1)
.addIngredients(ForgeTypes.FLUID_STACK, withImprovedVisibility(recipe.getRequiredFluid().getMatchingFluidStacks()))
.addTooltipCallback(addFluidTooltip(recipe.getRequiredFluid().getRequiredAmount()));
.addRichTooltipCallback(addFluidTooltip(recipe.getRequiredFluid().getRequiredAmount()));
builder
.addSlot(RecipeIngredientRole.OUTPUT, 132, 51)
.setBackground(getRenderedSlot(), -1, -1)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ public void setRecipe(IRecipeLayoutBuilder builder, SequencedRecipe<?> recipe, I
.addSlot(RecipeIngredientRole.INPUT, x + 4, 15)
.setBackground(CreateRecipeCategory.getRenderedSlot(), -1, -1)
.addIngredients(ForgeTypes.FLUID_STACK, CreateRecipeCategory.withImprovedVisibility(fluidIngredient.getMatchingFluidStacks()))
.addTooltipCallback(CreateRecipeCategory.addFluidTooltip(fluidIngredient.getRequiredAmount()));
.addRichTooltipCallback(CreateRecipeCategory.addFluidTooltip(fluidIngredient.getRequiredAmount()));
}

@Override
Expand Down
24 changes: 22 additions & 2 deletions src/main/java/com/simibubi/create/content/fluids/VirtualFluid.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package com.simibubi.create.content.fluids;

import com.simibubi.create.content.fluids.potion.PotionFluid;

import net.minecraft.world.item.Item;
import net.minecraft.world.item.Items;
import net.minecraft.world.level.block.Blocks;
Expand All @@ -10,17 +12,35 @@

public class VirtualFluid extends ForgeFlowingFluid {

public VirtualFluid(Properties properties) {
public static VirtualFluid createSource(Properties properties) {
return new VirtualFluid(properties, true);
}

public static VirtualFluid createFlowing(Properties properties) {
return new VirtualFluid(properties, false);
}


private final boolean source;

public VirtualFluid(Properties properties, boolean source) {
super(properties);
this.source = source;
}

@Override
public Fluid getSource() {
if (source) {
return this;
}
return super.getSource();
}

@Override
public Fluid getFlowing() {
if (source) {
return super.getFlowing();
}
return this;
}

Expand All @@ -36,7 +56,7 @@ protected BlockState createLegacyBlock(FluidState state) {

@Override
public boolean isSource(FluidState p_207193_1_) {
return false;
return source;
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,16 @@

public class PotionFluid extends VirtualFluid {

public PotionFluid(Properties properties) {
super(properties);
public static PotionFluid createSource(Properties properties) {
return new PotionFluid(properties, true);
}

public static PotionFluid createFlowing(Properties properties) {
return new PotionFluid(properties, false);
}

public PotionFluid(Properties properties, boolean source) {
super(properties, source);
}

public static FluidStack of(int amount, Potion potion) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -172,29 +172,30 @@ public BlockBuilder<Block, CreateRegistrate> paletteStoneBlock(String name, NonN
/* Fluids */

public <T extends ForgeFlowingFluid> FluidBuilder<T, CreateRegistrate> virtualFluid(String name,
FluidBuilder.FluidTypeFactory typeFactory, NonNullFunction<ForgeFlowingFluid.Properties, T> factory) {
FluidBuilder.FluidTypeFactory typeFactory, NonNullFunction<ForgeFlowingFluid.Properties, T> sourceFactory,
NonNullFunction<ForgeFlowingFluid.Properties, T> flowingFactory) {
return entry(name,
c -> new VirtualFluidBuilder<>(self(), self(), name, c, new ResourceLocation(getModid(), "fluid/" + name + "_still"),
new ResourceLocation(getModid(), "fluid/" + name + "_flow"), typeFactory, factory));
new ResourceLocation(getModid(), "fluid/" + name + "_flow"), typeFactory, sourceFactory, flowingFactory));
}

public <T extends ForgeFlowingFluid> FluidBuilder<T, CreateRegistrate> virtualFluid(String name,
ResourceLocation still, ResourceLocation flow, FluidBuilder.FluidTypeFactory typeFactory,
NonNullFunction<ForgeFlowingFluid.Properties, T> factory) {
return entry(name, c -> new VirtualFluidBuilder<>(self(), self(), name, c, still, flow, typeFactory, factory));
NonNullFunction<ForgeFlowingFluid.Properties, T> sourceFactory, NonNullFunction<ForgeFlowingFluid.Properties, T> flowingFactory) {
return entry(name, c -> new VirtualFluidBuilder<>(self(), self(), name, c, still, flow, typeFactory, sourceFactory, flowingFactory));
}

public FluidBuilder<VirtualFluid, CreateRegistrate> virtualFluid(String name) {
return entry(name,
c -> new VirtualFluidBuilder<VirtualFluid, CreateRegistrate>(self(), self(), name, c,
new ResourceLocation(getModid(), "fluid/" + name + "_still"), new ResourceLocation(getModid(), "fluid/" + name + "_flow"),
CreateRegistrate::defaultFluidType, VirtualFluid::new));
CreateRegistrate::defaultFluidType, VirtualFluid::createSource, VirtualFluid::createFlowing));
}

public FluidBuilder<VirtualFluid, CreateRegistrate> virtualFluid(String name, ResourceLocation still,
ResourceLocation flow) {
return entry(name, c -> new VirtualFluidBuilder<>(self(), self(), name, c, still, flow,
CreateRegistrate::defaultFluidType, VirtualFluid::new));
CreateRegistrate::defaultFluidType, VirtualFluid::createSource, VirtualFluid::createFlowing));
}

public FluidBuilder<ForgeFlowingFluid.Flowing, CreateRegistrate> standardFluid(String name) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,11 @@ public class VirtualFluidBuilder<T extends ForgeFlowingFluid, P> extends FluidBu

public VirtualFluidBuilder(AbstractRegistrate<?> owner, P parent, String name, BuilderCallback callback,
ResourceLocation stillTexture, ResourceLocation flowingTexture, FluidBuilder.FluidTypeFactory typeFactory,
NonNullFunction<Properties, T> factory) {
super(owner, parent, name, callback, stillTexture, flowingTexture, typeFactory, factory);
source(factory);
NonNullFunction<Properties, T> sourceFactory,
NonNullFunction<Properties, T> flowingFactory
) {
super(owner, parent, name, callback, stillTexture, flowingTexture, typeFactory, flowingFactory);
source(sourceFactory);
}

@Override
Expand Down
Loading

0 comments on commit 127b64e

Please sign in to comment.