aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGlease <4586901+Glease@users.noreply.github.com>2023-04-10 01:31:06 +0800
committerGitHub <noreply@github.com>2023-04-09 19:31:06 +0200
commitfa97edd920c35c0f289bc0d8382d021d21a4a668 (patch)
tree53a9568328cdd3743648c9e6394c534b35fe73bb
parent5601f4b9eda93d3174b59c6eecd629280d2ef9e9 (diff)
downloadGT5-Unofficial-fa97edd920c35c0f289bc0d8382d021d21a4a668.tar.gz
GT5-Unofficial-fa97edd920c35c0f289bc0d8382d021d21a4a668.tar.bz2
GT5-Unofficial-fa97edd920c35c0f289bc0d8382d021d21a4a668.zip
fix RA2 universal chemical target using inverted dispatch rule (#1861)
* fix RA2 universal chemical target using inverted dispatch rule * add noOptimize
-rw-r--r--src/main/java/gregtech/api/util/GT_Recipe.java16
-rw-r--r--src/main/java/gregtech/api/util/GT_RecipeBuilder.java18
-rw-r--r--src/main/java/gregtech/api/util/GT_RecipeConstants.java21
-rw-r--r--src/main/java/gregtech/api/util/GT_RecipeMapUtil.java43
4 files changed, 64 insertions, 34 deletions
diff --git a/src/main/java/gregtech/api/util/GT_Recipe.java b/src/main/java/gregtech/api/util/GT_Recipe.java
index 9f266ba550..6d4dda838a 100644
--- a/src/main/java/gregtech/api/util/GT_Recipe.java
+++ b/src/main/java/gregtech/api/util/GT_Recipe.java
@@ -2347,7 +2347,8 @@ public class GT_Recipe implements Comparable<GT_Recipe> {
GT_UITextures.PROGRESSBAR_ARROW_MULTIPLE,
ProgressBar.Direction.RIGHT)
.setUsualFluidInputCount(6)
- .setUsualFluidOutputCount(6);
+ .setUsualFluidOutputCount(6)
+ .setDisableOptimize(true);
public static final GT_Recipe_Map sDistillationRecipes = //
new GT_Recipe_Map_DistillationTower().setRecipeConfigFile("distillation", FIRST_FLUIDSTACK_INPUT)
.setProgressBar(
@@ -3780,10 +3781,15 @@ public class GT_Recipe implements Comparable<GT_Recipe> {
public final Iterable<? extends GT_Recipe> defaultBuildRecipe(GT_RecipeBuilder builder) {
// TODO sensible validation
- if (!downstreams.isEmpty() && disableOptimize && !builder.optimize) return buildOrEmpty(
- builder.copy()
- .noOptimize());
- return buildOrEmpty(builder);
+ GT_RecipeBuilder b = builder;
+ if (disableOptimize && builder.optimize) {
+ b = copy(builder, b).noOptimize();
+ }
+ return buildOrEmpty(b);
+ }
+
+ private static GT_RecipeBuilder copy(GT_RecipeBuilder original, GT_RecipeBuilder b) {
+ return b == original ? b.copy() : b;
}
public GT_Recipe add(GT_Recipe aRecipe) {
diff --git a/src/main/java/gregtech/api/util/GT_RecipeBuilder.java b/src/main/java/gregtech/api/util/GT_RecipeBuilder.java
index 6f9907401c..bd3e35c2a1 100644
--- a/src/main/java/gregtech/api/util/GT_RecipeBuilder.java
+++ b/src/main/java/gregtech/api/util/GT_RecipeBuilder.java
@@ -205,6 +205,20 @@ public class GT_RecipeBuilder {
return this;
}
+ /**
+ * Not intended to be used by recipe authors.
+ * Intended for recipe rewrite middlewares.
+ */
+ public GT_RecipeBuilder itemOutputs(ItemStack[] outputs, int[] chances) {
+ if (DEBUG_MODE && containsNull(outputs)) handleNullRecipeComponents("itemOutputs");
+ this.outputs = outputs;
+ this.chances = chances;
+ if (chances != null && chances.length != outputs.length) {
+ throw new IllegalArgumentException("Output chances array and items array length differs");
+ }
+ return this;
+ }
+
public GT_RecipeBuilder noItemOutputs() {
return itemOutputs();
}
@@ -445,6 +459,10 @@ public class GT_RecipeBuilder {
return duration;
}
+ public int[] getChances() {
+ return chances;
+ }
+
public int getEUt() {
return eut;
}
diff --git a/src/main/java/gregtech/api/util/GT_RecipeConstants.java b/src/main/java/gregtech/api/util/GT_RecipeConstants.java
index 5c619d5fba..bdb3346454 100644
--- a/src/main/java/gregtech/api/util/GT_RecipeConstants.java
+++ b/src/main/java/gregtech/api/util/GT_RecipeConstants.java
@@ -1,5 +1,7 @@
package gregtech.api.util;
+import static gregtech.api.util.GT_RecipeMapUtil.convertCellToFluid;
+
import java.util.*;
import net.minecraft.init.Items;
@@ -126,14 +128,19 @@ public class GT_RecipeConstants {
*/
public static final IGT_RecipeMap UniversalChemical = IGT_RecipeMap.newRecipeMap(builder -> {
for (ItemStack input : builder.getItemInputsBasic()) {
- if (GT_Utility.isAnyIntegratedCircuit(input) && input.getItemDamage() >= 10) return GT_Utility.concat(
- builder.copy()
- .addTo(GT_Recipe_Map.sChemicalRecipes),
- // LCR does not need cleanroom, for now.
- builder.metadata(CLEANROOM, false)
- .addTo(GT_Recipe_Map.sMultiblockChemicalRecipes));
+ // config >= 10 -> this is a special chemical recipe that output fluid/canned fluid variant.
+ // it doesn't belong to multiblocks
+ if (GT_Utility.isAnyIntegratedCircuit(input) && input.getItemDamage() >= 10) {
+ return builder.addTo(GT_Recipe_Map.sChemicalRecipes);
+ }
}
- return builder.addTo(GT_Recipe_Map.sChemicalRecipes);
+ return GT_Utility.concat(
+ builder.copy()
+ .addTo(GT_Recipe_Map.sChemicalRecipes),
+ convertCellToFluid(builder, false)
+ // LCR does not need cleanroom, for now.
+ .metadata(CLEANROOM, false)
+ .addTo(GT_Recipe_Map.sMultiblockChemicalRecipes));
});
/**
diff --git a/src/main/java/gregtech/api/util/GT_RecipeMapUtil.java b/src/main/java/gregtech/api/util/GT_RecipeMapUtil.java
index 542821ecbb..ee524c913c 100644
--- a/src/main/java/gregtech/api/util/GT_RecipeMapUtil.java
+++ b/src/main/java/gregtech/api/util/GT_RecipeMapUtil.java
@@ -15,6 +15,8 @@ import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Multimap;
import cpw.mods.fml.common.Loader;
+import gnu.trove.list.TIntList;
+import gnu.trove.list.array.TIntArrayList;
import gregtech.api.interfaces.IGT_RecipeMap;
/**
@@ -74,40 +76,37 @@ public class GT_RecipeMapUtil {
}
public static List<GT_Recipe> buildRecipeForMultiblock(GT_RecipeBuilder b) {
- List<ItemStack> itemInputs = new ArrayList<>(Arrays.asList(b.getItemInputsBasic()));
- List<ItemStack> itemOutputs = new ArrayList<>(Arrays.asList(b.getItemOutputs()));
- List<FluidStack> fluidInputs = new ArrayList<>(Arrays.asList(b.getFluidInputs()));
- List<FluidStack> fluidOutputs = new ArrayList<>(Arrays.asList(b.getFluidOutputs()));
- cellToFluid(itemInputs, fluidInputs, true);
- cellToFluid(itemInputs, fluidInputs, false);
- return buildOrEmpty(
- b.itemInputs(itemInputs.toArray(new ItemStack[0]))
- .itemOutputs(itemOutputs.toArray(new ItemStack[0]))
- .fluidInputs(fluidInputs.toArray(new FluidStack[0]))
- .fluidOutputs(fluidOutputs.toArray(new FluidStack[0])));
+ return buildOrEmpty(convertCellToFluid(b, true));
+
}
public static List<GT_Recipe> buildRecipeForMultiblockNoCircuit(GT_RecipeBuilder b) {
+ return buildOrEmpty(convertCellToFluid(b, false));
+ }
+
+ public static GT_RecipeBuilder convertCellToFluid(GT_RecipeBuilder b, boolean removeIntegratedCircuit) {
List<ItemStack> itemInputs = new ArrayList<>(Arrays.asList(b.getItemInputsBasic()));
List<ItemStack> itemOutputs = new ArrayList<>(Arrays.asList(b.getItemOutputs()));
List<FluidStack> fluidInputs = new ArrayList<>(Arrays.asList(b.getFluidInputs()));
List<FluidStack> fluidOutputs = new ArrayList<>(Arrays.asList(b.getFluidOutputs()));
- cellToFluid(itemInputs, fluidInputs, false);
- cellToFluid(itemInputs, fluidInputs, false);
- return buildOrEmpty(
- b.itemInputs(itemInputs.toArray(new ItemStack[0]))
- .itemOutputs(itemOutputs.toArray(new ItemStack[0]))
- .fluidInputs(fluidInputs.toArray(new FluidStack[0]))
- .fluidOutputs(fluidOutputs.toArray(new FluidStack[0])));
+ TIntList chances = b.getChances() != null ? new TIntArrayList(b.getChances()) : null;
+ cellToFluid(itemInputs, fluidInputs, removeIntegratedCircuit, null);
+ cellToFluid(itemOutputs, fluidOutputs, removeIntegratedCircuit, chances);
+ return b.itemInputs(itemInputs.toArray(new ItemStack[0]))
+ .itemOutputs(itemOutputs.toArray(new ItemStack[0]), chances != null ? chances.toArray() : null)
+ .fluidInputs(fluidInputs.toArray(new FluidStack[0]))
+ .fluidOutputs(fluidOutputs.toArray(new FluidStack[0]));
}
- private static void cellToFluid(List<ItemStack> items, List<FluidStack> fluids, boolean removeIntegratedCircuit) {
- for (ListIterator<ItemStack> iterator = items.listIterator(items.size()); iterator.hasPrevious();) {
- ItemStack item = iterator.previous();
+ private static void cellToFluid(List<ItemStack> items, List<FluidStack> fluids, boolean removeIntegratedCircuit,
+ TIntList chances) {
+ for (int i = items.size() - 1; i >= 0; i--) {
+ ItemStack item = items.get(i);
if (GT_Utility.getFluidForFilledItem(item, true) != null || GT_Utility.isCellEmpty(item)
|| (removeIntegratedCircuit && GT_Utility.isAnyIntegratedCircuit(item))) {
fluids.add(GT_Utility.convertCellToFluid(item));
- iterator.remove();
+ items.remove(i);
+ if (chances != null) chances.removeAt(i);
}
}
}