Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update JEI integration and add potion fluids to the ingredient list #6934

Open
wants to merge 3 commits into
base: mc1.20.1/dev
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
20 changes: 20 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,22 @@ 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() * 3);
for (Potion potion : potions) {
// @goshante: Ingame potion fluids always have Bottle tag that specifies
// to what bottle type this potion belongs
// Potion fluid without this tag wouldn't be recognized by other mods
for (PotionFluid.BottleType bottleType : PotionFluid.BottleType.values()) {
FluidStack potionFluid = PotionFluid.of(1000, potion, bottleType);
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,19 +24,29 @@

public class PotionFluid extends VirtualFluid {

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

public static FluidStack of(int amount, Potion potion) {
FluidStack fluidStack = new FluidStack(AllFluids.POTION.get()
.getSource(), amount);
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, BottleType bottleType) {

FluidStack fluidStack;
fluidStack = new FluidStack(AllFluids.POTION.get().getSource(), amount);
addPotionToFluidStack(fluidStack, potion);
NBTHelper.writeEnum(fluidStack.getOrCreateTag(), "Bottle", bottleType);
return fluidStack;
}

public static FluidStack withEffects(int amount, Potion potion, List<MobEffectInstance> customEffects) {
FluidStack fluidStack = of(amount, potion);
FluidStack fluidStack = of(amount, potion, BottleType.REGULAR);
appendEffects(fluidStack, customEffects);
return fluidStack;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ public static boolean isPotionItem(ItemStack stack) {
return stack.getItem() instanceof PotionItem && !(stack.getCraftingRemainingItem()
.getItem() instanceof BucketItem);
}

public static Pair<FluidStack, ItemStack> emptyPotion(ItemStack stack, boolean simulate) {
FluidStack fluid = getFluidFromPotionItem(stack);
if (!simulate)
Expand All @@ -69,8 +69,7 @@ public static FluidStack getFluidFromPotionItem(ItemStack stack) {
public static FluidStack getFluidFromPotion(Potion potion, BottleType bottleType, int amount) {
if (potion == Potions.WATER && bottleType == BottleType.REGULAR)
return new FluidStack(Fluids.WATER, amount);
FluidStack fluid = PotionFluid.of(amount, potion);
NBTHelper.writeEnum(fluid.getOrCreateTag(), "Bottle", bottleType);
FluidStack fluid = PotionFluid.of(amount, potion, bottleType);
return fluid;
}

Expand Down
Loading