diff --git a/dependencies.gradle b/dependencies.gradle index 7eea75bce..2b8fee0ab 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -65,4 +65,6 @@ dependencies { compileOnly rfg.deobf("curse.maven:bubbles-a-baubles-fork-995393:5719448") compileOnly rfg.deobf("curse.maven:barrels-drums-storage-more-319404:2708193") + + api("CraftTweaker2:CraftTweaker2-MC1120-Main:1.12-4.1.20.700") } diff --git a/src/main/java/supersymmetry/api/recipes/RecipeMapGroup.java b/src/main/java/supersymmetry/api/recipes/RecipeMapGroup.java new file mode 100644 index 000000000..aae5ae1c3 --- /dev/null +++ b/src/main/java/supersymmetry/api/recipes/RecipeMapGroup.java @@ -0,0 +1,63 @@ +package supersymmetry.api.recipes; + +import gregtech.api.recipes.Recipe; +import gregtech.api.recipes.RecipeBuilder; +import gregtech.api.recipes.RecipeMap; +import gregtech.api.recipes.builders.SimpleRecipeBuilder; +import gregtech.api.recipes.category.GTRecipeCategory; +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; +import net.minecraft.item.ItemStack; +import net.minecraftforge.fluids.FluidStack; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import javax.annotation.Nonnull; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.concurrent.atomic.AtomicReference; + +public class RecipeMapGroup> extends RecipeMap { + + protected final RecipeMap[] recipeMaps; + + protected RecipeMapGroup(@NotNull String unlocalizedName, int maxInputs, int maxOutputs, int maxFluidInputs, int maxFluidOutputs, @NotNull R defaultRecipeBuilder, boolean isHidden, @NotNull RecipeMap[] recipeMaps) { + super(unlocalizedName, maxInputs, maxOutputs, maxFluidInputs, maxFluidOutputs, defaultRecipeBuilder, isHidden); + this.recipeMaps = recipeMaps; + } + + @Nonnull + public static RecipeMapGroup create(@NotNull String unlocalizedName, @NotNull RecipeMap... recipeMaps) { + int maxInputs = 0, maxOutputs = 0, maxFluidInputs = 0, maxFluidOutputs = 0; + for (RecipeMap recipeMap : recipeMaps) { + maxInputs = Math.max(maxInputs, recipeMap.getMaxInputs()); + maxOutputs = Math.max(maxOutputs, recipeMap.getMaxOutputs()); + maxFluidInputs = Math.max(maxFluidInputs, recipeMap.getMaxFluidInputs()); + maxFluidOutputs = Math.max(maxFluidOutputs, recipeMap.getMaxFluidOutputs()); + } + return new RecipeMapGroup<>(unlocalizedName, maxInputs, maxOutputs, maxFluidInputs, maxFluidOutputs, new SimpleRecipeBuilder(), true, recipeMaps); + } + + @Nullable + @Override + public Recipe findRecipe(long voltage, List inputs, List fluidInputs, boolean exactVoltage) { + AtomicReference recipe = new AtomicReference<>(); + Arrays.stream(recipeMaps) + .parallel() + .map(recipeMap -> recipeMap.findRecipe(voltage, inputs, fluidInputs, exactVoltage)) + .filter(java.util.Objects::nonNull) + .findFirst().ifPresent(recipe::set); + return recipe.get(); + } + + @Nonnull + @Override + public Map> getRecipesByCategory() { + Map> res = new Object2ObjectOpenHashMap<>(); + for (RecipeMap recipeMap : recipeMaps) { + res.putAll(recipeMap.getRecipesByCategory()); + } + return Collections.unmodifiableMap(res); + } +}