Fixed recipe map glitched recipe search

This commit is contained in:
TheDarkDnKTv 2021-02-24 23:03:24 +02:00
parent 655c5daf2f
commit d7fb3faa18

View file

@ -1,11 +1,14 @@
package gregtechmod.api.recipe; package gregtechmod.api.recipe;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
import java.util.Set;
import java.util.function.IntConsumer; import java.util.function.IntConsumer;
import gregtechmod.api.util.GT_RecipeException; import gregtechmod.api.util.GT_RecipeException;
@ -63,44 +66,35 @@ public class RecipeMap<F extends RecipeFactory<F>> {
public Recipe findRecipe(List<ItemStack> input, List<FluidStack> fluidInputs) { public Recipe findRecipe(List<ItemStack> input, List<FluidStack> fluidInputs) {
if (input.size() < minInputs) if (input.size() < minInputs)
throw new IllegalArgumentException("Inputs of machine can not be smaller than minimum RecipeMap inputs amount"); throw new IllegalArgumentException("Inputs of machine can not be smaller than minimum RecipeMap inputs amount");
// FIXME fix this shit, recipe should not be searched only for first item Set<Recipe> recipesTotal = new HashSet<>();
ItemStack first = null; for (FluidStack fluid : fluidInputs) {
for (ItemStack stack : input) { if (GT_Utility.isFluidStackValid(fluid)) {
if (GT_Utility.isStackValid(stack)) { List<Recipe> recipesFluid = MAPPINGS.get(GT_Utility.fluidStackToInt(fluid));
first = stack; if (recipesFluid != null)
break; recipesTotal.addAll(recipesFluid);
} }
} }
FluidStack fFluid = null; for (ItemStack item : input) {
for (FluidStack fluid : fluidInputs) { if (GT_Utility.isStackValid(item)) {
if (GT_Utility.isFluidStackValid(fluid)) { List<Recipe> recipesItems = MAPPINGS.get(GT_Utility.stackToInt(item));
fFluid = fluid; List<Recipe> recipesItemsWild = MAPPINGS.get(GT_Utility.stackToWildcard(item));
break; if (recipesItems != null)
recipesTotal.addAll(recipesItems);
if (recipesItemsWild != null)
recipesTotal.addAll(recipesItemsWild);
} }
} }
Recipe result = null; Recipe result = null;
if (GT_Utility.isFluidStackValid(fFluid)) { if (!recipesTotal.isEmpty()) {
List<Recipe> recipesFluid = MAPPINGS.get(GT_Utility.fluidStackToInt(fFluid)); result = findRecipe(recipesTotal, input, fluidInputs);
if (recipesFluid != null)
result = findRecipe(recipesFluid, input, fluidInputs);
} }
if (result == null && GT_Utility.isStackValid(first)) {
List<Recipe> recipes = MAPPINGS.get(GT_Utility.stackToInt(first));
List<Recipe> recipesWild = MAPPINGS.get(GT_Utility.stackToWildcard(first));
if (recipes != null)
result = findRecipe(recipes, input, fluidInputs);
if (result == null && recipesWild != null)
result = findRecipe(recipesWild, input, fluidInputs);
}
return result != null && result.enabled ? result : null; return result != null && result.enabled ? result : null;
} }
private Recipe findRecipe(List<Recipe> recipes, List<ItemStack> input, List<FluidStack> fluidInputs) { private Recipe findRecipe(Collection<Recipe> recipes, List<ItemStack> input, List<FluidStack> fluidInputs) {
if (recipes != null) { if (recipes != null) {
for (Recipe recipe : recipes) { for (Recipe recipe : recipes) {
if (recipe.matches(false, input, fluidInputs)) { if (recipe.matches(false, input, fluidInputs)) {