diff --git a/src/main/kotlin/com/possible_triangle/sliceanddice/compat/FarmersDelightCompat.kt b/src/main/kotlin/com/possible_triangle/sliceanddice/compat/FarmersDelightCompat.kt index 04b9164..3fcacb2 100644 --- a/src/main/kotlin/com/possible_triangle/sliceanddice/compat/FarmersDelightCompat.kt +++ b/src/main/kotlin/com/possible_triangle/sliceanddice/compat/FarmersDelightCompat.kt @@ -5,16 +5,13 @@ import com.possible_triangle.sliceanddice.SliceAndDice import com.possible_triangle.sliceanddice.config.Configs import com.possible_triangle.sliceanddice.recipe.CuttingProcessingRecipe import com.simibubi.create.content.fluids.transfer.EmptyingRecipe -import com.simibubi.create.content.kinetics.mixer.MixingRecipe import com.simibubi.create.content.processing.recipe.HeatCondition import com.simibubi.create.content.processing.recipe.ProcessingRecipeBuilder -import com.simibubi.create.foundation.fluid.FluidIngredient import mezz.jei.api.registration.IRecipeCatalystRegistration import net.minecraft.resources.ResourceLocation import net.minecraft.world.item.ItemStack import net.minecraft.world.item.crafting.Ingredient import net.minecraft.world.item.crafting.Recipe -import net.minecraftforge.fluids.FluidStack import vectorwing.farmersdelight.common.crafting.CookingPotRecipe import vectorwing.farmersdelight.common.crafting.CuttingBoardRecipe import vectorwing.farmersdelight.integration.jei.FDRecipeTypes @@ -78,29 +75,14 @@ class FarmersDelightCompat private constructor() : IRecipeInjector { SliceAndDice.LOGGER.debug("Found {} cooking recipes", cookingRecipes.size) - fun fluidOf(ingredient: Ingredient): FluidStack? { - if (!Configs.SERVER.REPLACE_FLUID_CONTAINERS.get()) return null - val cloned = Ingredient.fromJson(ingredient.toJson()) - val fluids = cloned.items.mapNotNull { stack -> - emptyingRecipes.find { - val required = it.ingredients[0] - required.test(stack) - }?.resultingFluid - } - - return fluids.minByOrNull { it.amount } - } - return cookingRecipes.forEach { (originalID, recipe) -> val id = ResourceLocation(SliceAndDice.MOD_ID, "cooking/${originalID.namespace}/${originalID.path}") - val builder = ProcessingRecipeBuilder(::MixingRecipe, id) + val builder = ProcessingRecipeBuilder(::LazyMixingRecipe, id) builder.duration(recipe.cookTime) builder.requiresHeat(HeatCondition.HEATED) recipe.ingredients.forEach { ingredient -> - val fluid = fluidOf(ingredient) - if (fluid != null) builder.require(FluidIngredient.fromFluidStack(fluid)) - else builder.require(ingredient) + builder.require(ingredient) } @Suppress("SENSELESS_COMPARISON") @@ -109,7 +91,7 @@ class FarmersDelightCompat private constructor() : IRecipeInjector { } builder.output(recipe.resultItem) - add.accept(id, builder.build()) + add.accept(id, builder.build().withRecipeLookup(emptyingRecipes)) } } diff --git a/src/main/kotlin/com/possible_triangle/sliceanddice/compat/LazyMixingRecipe.kt b/src/main/kotlin/com/possible_triangle/sliceanddice/compat/LazyMixingRecipe.kt new file mode 100644 index 0000000..360c0fc --- /dev/null +++ b/src/main/kotlin/com/possible_triangle/sliceanddice/compat/LazyMixingRecipe.kt @@ -0,0 +1,63 @@ +package com.possible_triangle.sliceanddice.compat + +import com.possible_triangle.sliceanddice.config.Configs +import com.simibubi.create.content.fluids.transfer.EmptyingRecipe +import com.simibubi.create.content.kinetics.mixer.MixingRecipe +import com.simibubi.create.content.processing.recipe.ProcessingRecipeBuilder.ProcessingRecipeParams +import com.simibubi.create.foundation.fluid.FluidIngredient +import net.minecraft.core.NonNullList +import net.minecraft.world.item.crafting.Ingredient +import net.minecraftforge.fluids.FluidStack + +private fun Collection.toNonnullList() = let { + NonNullList.createWithCapacity(it.size).apply { + addAll(it) + } +} + +class LazyMixingRecipe(params: ProcessingRecipeParams) : MixingRecipe(params) { + + private var emptyingRecipes: Collection = emptyList() + private var resolved = false + private lateinit var resolvedIngredients: NonNullList + private lateinit var resolvedFluidIngredients: NonNullList + + fun withRecipeLookup(emptyingRecipes: Collection) = apply { + this.emptyingRecipes = emptyingRecipes + } + + private fun fluidOf(ingredient: Ingredient): FluidStack { + if (!Configs.SERVER.REPLACE_FLUID_CONTAINERS.get()) return FluidStack.EMPTY + val fluids = ingredient.items.mapNotNull { stack -> + emptyingRecipes.find { + val required = it.ingredients[0] + required.test(stack) + }?.resultingFluid + } + + return fluids.minByOrNull { it.amount } ?: FluidStack.EMPTY + } + + private fun resolve() { + if (resolved) return + val replaceable = super.ingredients + .associateWith { fluidOf(it) } + .filterValues { !it.isEmpty } + .mapValues { FluidIngredient.fromFluidStack(it.value) } + + resolvedIngredients = super.ingredients.filterNot { replaceable.containsKey(it) }.toNonnullList() + resolvedFluidIngredients = (super.fluidIngredients + replaceable.values).toNonnullList() + resolved = true + } + + override fun getIngredients(): NonNullList { + resolve() + return resolvedIngredients + } + + override fun getFluidIngredients(): NonNullList { + resolve() + return resolvedFluidIngredients + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/possible_triangle/sliceanddice/config/ServerConfig.kt b/src/main/kotlin/com/possible_triangle/sliceanddice/config/ServerConfig.kt index c2f1b4f..a6ffd6f 100644 --- a/src/main/kotlin/com/possible_triangle/sliceanddice/config/ServerConfig.kt +++ b/src/main/kotlin/com/possible_triangle/sliceanddice/config/ServerConfig.kt @@ -1,7 +1,6 @@ package com.possible_triangle.sliceanddice.config import net.minecraftforge.common.ForgeConfigSpec -import java.util.function.Supplier class ServerConfig(builder: ForgeConfigSpec.Builder) { @@ -9,8 +8,7 @@ class ServerConfig(builder: ForgeConfigSpec.Builder) { val IGNORE_ROTATION = builder.define("slicer.ignore_rotation", false) val BASIN_COOKING = builder.define("basin_cooking.enabled", true) - //val REPLACE_FLUID_CONTAINERS = builder.define("basin_cooking.replace_fluid_containers", true) - val REPLACE_FLUID_CONTAINERS = Supplier { false } + val REPLACE_FLUID_CONTAINERS = builder.define("basin_cooking.replace_fluid_containers", true) val SPRINKLER_CAPACITY = builder.defineInRange("sprinkler.fluid_capacity", 300, 10, 2048) val SPRINKLER_USAGE = builder.defineInRange("sprinkler.fluid_per_use", 100, 0, 2048) diff --git a/src/main/resources/data/sliceanddice/recipes/mixing/creamed_corn_from_fluid.json b/src/main/resources/data/sliceanddice/recipes/mixing/creamed_corn_from_fluid.json deleted file mode 100644 index fe8f004..0000000 --- a/src/main/resources/data/sliceanddice/recipes/mixing/creamed_corn_from_fluid.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "heatRequirement": "heated", - "processingTime": 200, - "type": "create:mixing", - "ingredients": [ - { - "tag": "forge:crops/corn" - }, - { - "tag": "forge:crops/corn" - }, - { - "fluidTag": "forge:milk", - "amount": 250 - }, - { - "item": "minecraft:bowl" - } - ], - "results": [ - { - "item": "culturaldelights:creamed_corn" - } - ], - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "culturaldelights" - } - ] -} \ No newline at end of file diff --git a/src/main/resources/data/sliceanddice/recipes/mixing/pumpkin_soup_from_fluid.json b/src/main/resources/data/sliceanddice/recipes/mixing/pumpkin_soup_from_fluid.json deleted file mode 100644 index 9547b10..0000000 --- a/src/main/resources/data/sliceanddice/recipes/mixing/pumpkin_soup_from_fluid.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "heatRequirement": "heated", - "processingTime": 200, - "type": "create:mixing", - "ingredients": [ - { - "item": "farmersdelight:pumpkin_slice" - }, - { - "tag": "forge:salad_ingredients/cabbage" - }, - { - "tag": "forge:raw_pork" - }, - { - "fluidTag": "forge:milk", - "amount": 250 - }, - { - "item": "minecraft:bowl" - } - ], - "results": [ - { - "item": "farmersdelight:pumpkin_soup" - } - ], - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "farmersdelight" - } - ] -} \ No newline at end of file