CreateMod/src/main/java/com/simibubi/create/content/fluids/spout/FillingBySpout.java
simibubi 6819fc1c42 Issue. Gesundheit
- Fixed an incompatibility with Supplementaries leading to a server crash
- Fixed fallback damage bar colour for air powered tools
- Various NPE guards
- Fixed sequenced assembly recipes conflicting when starting with a filling step
- Potato cannons can no longer plant crops on the side of farmland
- Fixed Mechanical rollers consuming filter items despite not supporting them
- Fixed brass tunnels not refunding previous filter items when changed
- Fixed catalyst ingredients getting consumed in the basin
2023-07-04 17:43:54 +02:00

98 lines
3.5 KiB
Java

package com.simibubi.create.content.fluids.spout;
import java.util.List;
import java.util.Optional;
import java.util.function.Predicate;
import com.simibubi.create.AllRecipeTypes;
import com.simibubi.create.content.fluids.transfer.FillingRecipe;
import com.simibubi.create.content.fluids.transfer.GenericItemFilling;
import com.simibubi.create.content.processing.sequenced.SequencedAssemblyRecipe;
import com.simibubi.create.foundation.fluid.FluidIngredient;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.crafting.Recipe;
import net.minecraft.world.level.Level;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.items.ItemStackHandler;
import net.minecraftforge.items.wrapper.RecipeWrapper;
public class FillingBySpout {
private static final RecipeWrapper WRAPPER = new RecipeWrapper(new ItemStackHandler(1));
public static boolean canItemBeFilled(Level world, ItemStack stack) {
WRAPPER.setItem(0, stack);
Optional<FillingRecipe> assemblyRecipe =
SequencedAssemblyRecipe.getRecipe(world, WRAPPER, AllRecipeTypes.FILLING.getType(), FillingRecipe.class);
if (assemblyRecipe.isPresent())
return true;
if (AllRecipeTypes.FILLING.find(WRAPPER, world)
.isPresent())
return true;
return GenericItemFilling.canItemBeFilled(world, stack);
}
public static int getRequiredAmountForItem(Level world, ItemStack stack, FluidStack availableFluid) {
WRAPPER.setItem(0, stack);
Optional<FillingRecipe> assemblyRecipe = SequencedAssemblyRecipe.getRecipe(world, WRAPPER,
AllRecipeTypes.FILLING.getType(), FillingRecipe.class, matchItemAndFluid(world, availableFluid));
if (assemblyRecipe.isPresent()) {
FluidIngredient requiredFluid = assemblyRecipe.get()
.getRequiredFluid();
if (requiredFluid.test(availableFluid))
return requiredFluid.getRequiredAmount();
}
for (Recipe<RecipeWrapper> recipe : world.getRecipeManager()
.getRecipesFor(AllRecipeTypes.FILLING.getType(), WRAPPER, world)) {
FillingRecipe fillingRecipe = (FillingRecipe) recipe;
FluidIngredient requiredFluid = fillingRecipe.getRequiredFluid();
if (requiredFluid.test(availableFluid))
return requiredFluid.getRequiredAmount();
}
return GenericItemFilling.getRequiredAmountForItem(world, stack, availableFluid);
}
public static ItemStack fillItem(Level world, int requiredAmount, ItemStack stack, FluidStack availableFluid) {
FluidStack toFill = availableFluid.copy();
toFill.setAmount(requiredAmount);
WRAPPER.setItem(0, stack);
FillingRecipe fillingRecipe = SequencedAssemblyRecipe
.getRecipe(world, WRAPPER, AllRecipeTypes.FILLING.getType(), FillingRecipe.class,
matchItemAndFluid(world, availableFluid))
.filter(fr -> fr.getRequiredFluid()
.test(toFill))
.orElseGet(() -> {
for (Recipe<RecipeWrapper> recipe : world.getRecipeManager()
.getRecipesFor(AllRecipeTypes.FILLING.getType(), WRAPPER, world)) {
FillingRecipe fr = (FillingRecipe) recipe;
FluidIngredient requiredFluid = fr.getRequiredFluid();
if (requiredFluid.test(toFill))
return fr;
}
return null;
});
if (fillingRecipe != null) {
List<ItemStack> results = fillingRecipe.rollResults();
availableFluid.shrink(requiredAmount);
stack.shrink(1);
return results.isEmpty() ? ItemStack.EMPTY : results.get(0);
}
return GenericItemFilling.fillItem(world, requiredAmount, stack, availableFluid);
}
private static Predicate<FillingRecipe> matchItemAndFluid(Level world, FluidStack availableFluid) {
return r -> r.matches(WRAPPER, world) && r.getRequiredFluid()
.test(availableFluid);
}
}