Skip to content

Commit

Permalink
Add new cauldron mix recipe to mix two fluids into an item
Browse files Browse the repository at this point in the history
Adds a default recipe with that for obsidian, disabled by default
  • Loading branch information
KnightMiner committed Apr 20, 2019
1 parent cf43380 commit 238bfcc
Show file tree
Hide file tree
Showing 7 changed files with 140 additions and 14 deletions.
3 changes: 3 additions & 0 deletions src/main/java/knightminer/inspirations/common/Config.java
Expand Up @@ -105,6 +105,7 @@ public class Config {
public static boolean enableBiggerCauldron = false;
public static boolean fasterCauldronRain = true;
public static boolean spongeEmptyCauldron = true;
public static boolean cauldronObsidian = false;
public static boolean spongeCauldronFull = false;
public static boolean dropCauldronContents = false;
// cauldron - fluids
Expand Down Expand Up @@ -359,6 +360,8 @@ public static void preInit(FMLPreInitializationEvent event) {
fasterCauldronRain = configFile.getBoolean("fasterRain", "recipes.cauldron", fasterCauldronRain, "Cauldrons fill faster in the rain than vanilla painfully slow rate.") && enableExtendedCauldron;
dropCauldronContents = configFile.getBoolean("dropContents", "recipes.cauldron", dropCauldronContents, "Cauldrons will drop their contents when broken.") && enableExtendedCauldron;

cauldronObsidian = configFile.getBoolean("obsidian", "recipes.cauldron", cauldronObsidian, "Allows making obsidian in a cauldron by using a lava bucket on a water filled cauldron. Supports modded buckets. If cauldron fluids is enabled, you can also use a water bucket on a lava filled cauldron.");

// fluids
enableCauldronFluids = configFile.getBoolean("fluids", "recipes.cauldron", enableCauldronFluids, "Allows cauldrons to be filled with any fluid and use them in recipes") && enableExtendedCauldron;
configFile.moveProperty("recipes.cauldron", "milk", "recipes.cauldron.fluids");
Expand Down
@@ -0,0 +1,84 @@
package knightminer.inspirations.library.recipe.cauldron;

import java.util.List;

import com.google.common.collect.ImmutableList;

import knightminer.inspirations.library.InspirationsRegistry;
import net.minecraft.item.ItemStack;
import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.FluidUtil;
import net.minecraftforge.fluids.capability.IFluidHandlerItem;

/**
* Recipe to combine two fluids into an item output
*/
public class CauldronMixRecipe implements ISimpleCauldronRecipe {

private CauldronState input1, input2;
private ItemStack result;

/**
* Combines two inputs into an item output. Input order does not matter, both can be either the container or in the cauldron
* @param result Item result
* @param input1 First fluid for either container or cauldron, will show in JEI as the cauldron contents
* @param input2 Second fluid for either container or cauldron, will show in JEI as a bucket
*/
public CauldronMixRecipe(Fluid input1, Fluid input2, ItemStack result) {
this.result = result;
this.input1 = CauldronState.fluid(input1);
this.input2 = CauldronState.fluid(input2);
}

@Override
public boolean matches(ItemStack stack, boolean boiling, int level, CauldronState state) {
// cauldron must be full of a fluid
if(level != InspirationsRegistry.getCauldronMax() || state.getFluid() == null) {
return false;
}

// stack must be a fluid container
IFluidHandlerItem fluidHandler = FluidUtil.getFluidHandler(stack);
if(fluidHandler == null) {
return false;
}

// fluid in stack must be a cauldron fluid
FluidStack fluidStack = fluidHandler.drain(1000, false);
if(!CauldronState.fluidValid(fluidStack)) {
return false;
}

// either input must be in the cauldron
Fluid fluid = fluidStack.getFluid();
return input1.matches(state) && input2.getFluid() == fluid
|| input2.matches(state) && input1.getFluid() == fluid;
}

@Override
public int getLevel(int level) {
return 0;
}

/* JEI */
@Override
public Fluid getInputState() {
return input1.getFluid();
}

@Override
public List<ItemStack> getInput() {
return ImmutableList.of(FluidUtil.getFilledBucket(input2.getFluidStack()));
}

@Override
public ItemStack getResult() {
return result;
}

@Override
public String toString() {
return String.format("CauldronMixRecipe: %s from %s and %s", getResult().toString(), input1.getFluid().getName(), input2.getFluid().getName());
}
}
Expand Up @@ -167,7 +167,7 @@ public static CauldronState fluid(Fluid fluid) {
}

CauldronState state = new CauldronState();
state.fluid = new FluidStack(fluid, 1);
state.fluid = new FluidStack(fluid, Fluid.BUCKET_VOLUME);
return state;
}

Expand Down Expand Up @@ -212,13 +212,36 @@ public Fluid getFluid() {
return fluid == null ? null : fluid.getFluid();
}

public boolean matches(CauldronState state) {
if(this == state) {
return true;
/**
* Gets the fluid stack for this state
* @return fluid stack for this state, or null if it is not a fluid
*/
public FluidStack getFluidStack() {
if(this == WATER) {
return new FluidStack(FluidRegistry.WATER, Fluid.BUCKET_VOLUME);
}
return state.color == this.color
return fluid == null ? null : fluid.copy();
}

/**
* Checks if two cauldron states match
* @param state State to compare
* @return True if the states match, that is they are the same type (dye, potion, or fluid) and have the same contents
*/
public boolean matches(CauldronState state) {
return this == state
|| (state.color == this.color
&& state.potion == this.potion
&& state.getFluid() == this.getFluid();
&& state.getFluid() == this.getFluid());
}

/**
* Checks if a fluid is valid for a cauldron state
* @param fluid Fluid to check
* @return True if the fluid is valid, that is its non null, bucket volume, and no NBT
*/
public static boolean fluidValid(FluidStack fluid) {
return fluid != null && fluid.amount == Fluid.BUCKET_VOLUME && fluid.tag == null;
}

/* NBT */
Expand Down Expand Up @@ -248,7 +271,7 @@ public static CauldronState fromNBT(NBTTagCompound tags) {
if(tags.hasKey(TAG_FLUID)) {
Fluid fluid = FluidRegistry.getFluid(tags.getString(TAG_FLUID));
if(fluid != null) {
state.fluid = new FluidStack(fluid, 1);
state.fluid = new FluidStack(fluid, Fluid.BUCKET_VOLUME);
}
}

Expand Down
Expand Up @@ -16,7 +16,9 @@
import knightminer.inspirations.library.recipe.cauldron.CauldronBrewingRecipe;
import knightminer.inspirations.library.recipe.cauldron.CauldronDyeRecipe;
import knightminer.inspirations.library.recipe.cauldron.CauldronFluidRecipe;
import knightminer.inspirations.library.recipe.cauldron.CauldronMixRecipe;
import knightminer.inspirations.library.recipe.cauldron.FillCauldronRecipe;
import knightminer.inspirations.library.recipe.cauldron.ICauldronRecipe;
import knightminer.inspirations.library.util.RecipeUtil;
import knightminer.inspirations.library.util.ReflectionUtil;
import knightminer.inspirations.recipes.block.BlockEnhancedCauldron;
Expand Down Expand Up @@ -104,7 +106,8 @@ public void preInit(FMLPreInitializationEvent event) {
beetrootSoup = registerColoredFluid("beetroot_soup", 0xFFB82A30);
rabbitStew = registerColoredFluid("rabbit_stew", 0xFF984A2C);
if(Config.enableMilk) {
milk = registerFluid(new Fluid("milk", Util.getResource("blocks/milk"), Util.getResource("blocks/milk_flow"))); }
milk = registerFluid(new Fluid("milk", Util.getResource("blocks/milk"), Util.getResource("blocks/milk_flow")));
}
}
}

Expand All @@ -126,7 +129,7 @@ public void registerItems(Register<Item> event) {
IForgeRegistry<Item> r = event.getRegistry();

if(Config.enableCauldronDyeing) {
InspirationsRecipes.dyedWaterBottle = registerItem(r, new ItemDyedWaterBottle(), "dyed_bottle");
dyedWaterBottle = registerItem(r, new ItemDyedWaterBottle(), "dyed_bottle");
}
}

Expand Down Expand Up @@ -190,6 +193,18 @@ private void registerCauldronRecipes() {
if(Config.spongeEmptyCauldron) {
InspirationsRegistry.addCauldronRecipe(SpongeEmptyCauldron.INSTANCE);
}
if(Config.cauldronObsidian) {
ICauldronRecipe recipe;
// minor detail: if the cauldron can hold fluids, show the lava in the cauldron in JEI
// else show water in the cauldron as lava is not allowed
// in either case both are supporteds
if(Config.enableCauldronFluids) {
recipe = new CauldronMixRecipe(FluidRegistry.LAVA, FluidRegistry.WATER, new ItemStack(Blocks.OBSIDIAN));
} else {
recipe = new CauldronMixRecipe(FluidRegistry.WATER, FluidRegistry.LAVA, new ItemStack(Blocks.OBSIDIAN));
}
InspirationsRegistry.addCauldronRecipe(recipe);
}

if(!Config.enableExtendedCauldron) {
return;
Expand Down
Expand Up @@ -12,7 +12,7 @@ public enum FillCauldronFromDyedBottle implements ICauldronRecipe {
INSTANCE;

@Override
public boolean matches(ItemStack stack, boolean boiling, int level, ICauldronRecipe.CauldronState state) {
public boolean matches(ItemStack stack, boolean boiling, int level, CauldronState state) {
if(level == InspirationsRegistry.getCauldronMax()) {
return false;
}
Expand All @@ -22,7 +22,7 @@ public boolean matches(ItemStack stack, boolean boiling, int level, ICauldronRec
}

@Override
public CauldronState getState(ItemStack stack, boolean boiling, int level, ICauldronRecipe.CauldronState state) {
public CauldronState getState(ItemStack stack, boolean boiling, int level, CauldronState state) {
int newColor = InspirationsRecipes.dyedWaterBottle.getColor(stack);
if(level == 0) {
return CauldronState.dye(newColor);
Expand Down
Expand Up @@ -24,7 +24,7 @@ public boolean matches(ItemStack stack, boolean boiling, int level, CauldronStat
}

FluidStack fluidStack = fluidHandler.drain(1000, false);
return fluidStack != null && fluidStack.amount == 1000 && (level == 0 || fluidStack.getFluid() == state.getFluid()) && fluidStack.tag == null;
return CauldronState.fluidValid(fluidStack) && (level == 0 || fluidStack.getFluid() == state.getFluid());
}

@Override
Expand Down
Expand Up @@ -31,8 +31,9 @@ public boolean matches(ItemStack stack, boolean boiling, int level, CauldronStat
public ItemStack getResult(ItemStack stack, boolean boiling, int level, CauldronState state) {
stack = stack.copy();
stack.setCount(1);
FluidUtil.getFluidHandler(stack).fill(new FluidStack(state.getFluid(), 1000), true);
return FluidUtil.getFluidHandler(stack).getContainer();
IFluidHandlerItem handler = FluidUtil.getFluidHandler(stack);
handler.fill(state.getFluidStack(), true);
return handler.getContainer();
}

@Override
Expand Down

0 comments on commit 238bfcc

Please sign in to comment.