diff options
author | BlueWeabo <76872108+BlueWeabo@users.noreply.github.com> | 2022-10-01 13:10:15 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-10-01 12:10:15 +0200 |
commit | 32d74ba4d4f17af68335c5af3fcc44e20da25fd0 (patch) | |
tree | f7741bd2dcfba31bf8aa878c3996a7111cebbe2f | |
parent | 51a41123b0ccdf10cb7b311f8d87d250f78d1b89 (diff) | |
download | GT5-Unofficial-32d74ba4d4f17af68335c5af3fcc44e20da25fd0.tar.gz GT5-Unofficial-32d74ba4d4f17af68335c5af3fcc44e20da25fd0.tar.bz2 GT5-Unofficial-32d74ba4d4f17af68335c5af3fcc44e20da25fd0.zip |
With recent changes, Allow PA to handle cell-less recipes (#1346)
* add recipe maps, and allow PA to handle more than 1 fluid output
* add some null checks
* add forestry combs to the recipe map
* safety null checks.
* spotless
6 files changed, 290 insertions, 10 deletions
diff --git a/src/main/java/gregtech/api/util/GT_Forestry_Compat.java b/src/main/java/gregtech/api/util/GT_Forestry_Compat.java index 6e73c099cb..1edfd836f3 100644 --- a/src/main/java/gregtech/api/util/GT_Forestry_Compat.java +++ b/src/main/java/gregtech/api/util/GT_Forestry_Compat.java @@ -137,6 +137,8 @@ public class GT_Forestry_Compat { } GT_Recipe.GT_Recipe_Map.sCentrifugeRecipes.addRecipe( true, new ItemStack[] {tRecipe.getInput()}, tOutputs, null, tChances, null, null, 128, 5, 0); + GT_Recipe.GT_Recipe_Map.sMultiblockCentrifugeRecipes.addRecipe( + true, new ItemStack[] {tRecipe.getInput()}, tOutputs, null, tChances, null, null, 128, 5, 0); } } catch (Throwable e) { if (GT_Values.D1) { diff --git a/src/main/java/gregtech/api/util/GT_Recipe.java b/src/main/java/gregtech/api/util/GT_Recipe.java index 1ab29c067b..26cff0b262 100644 --- a/src/main/java/gregtech/api/util/GT_Recipe.java +++ b/src/main/java/gregtech/api/util/GT_Recipe.java @@ -2142,6 +2142,54 @@ public class GT_Recipe implements Comparable<GT_Recipe> { " EU", true, true); + public static final GT_Recipe_Map sMultiblockElectrolyzerRecipes = new GT_Recipe_Map( + new HashSet<>(300), + "gt.recipe.largeelectrolyzer", + "Large(PA) Electrolyzer", + null, + RES_PATH_GUI + "basicmachines/LCRNEI", + 1, + 9, + 0, + 0, + 1, + "", + 0, + "", + true, + false); + public static final GT_Recipe_Map sMultiblockCentrifugeRecipes = new GT_Recipe_Map( + new HashSet<>(1200), + "gt.recipe.largecentrifuge", + "Large(PA) Centrifuge", + null, + RES_PATH_GUI + "basicmachines/LCRNEI", + 1, + 9, + 0, + 0, + 1, + "", + 0, + "", + true, + false); + public static final GT_Recipe_Map sMultiblockMixerRecipes = new GT_Recipe_Map( + new HashSet<>(900), + "gt.recipe.largemixer", + "Large(PA) Mixer", + null, + RES_PATH_GUI + "basicmachines/LCRNEI", + 9, + 3, + 0, + 0, + 1, + "", + 0, + "", + true, + false); public static final GT_Recipe_Map_LargeBoilerFakeFuels sLargeBoilerFakeFuels = new GT_Recipe_Map_LargeBoilerFakeFuels(); diff --git a/src/main/java/gregtech/api/util/GT_Utility.java b/src/main/java/gregtech/api/util/GT_Utility.java index 5898e5fd14..270619363f 100644 --- a/src/main/java/gregtech/api/util/GT_Utility.java +++ b/src/main/java/gregtech/api/util/GT_Utility.java @@ -4254,6 +4254,29 @@ public class GT_Utility { return Textures.BlockIcons.ERROR_TEXTURE_INDEX; } + public static boolean isCellEmpty(ItemStack itemStack) { + if (itemStack == null) return false; + ItemStack tStack = ItemList.Cell_Empty.get(1); + tStack.stackSize = itemStack.stackSize; + return GT_Utility.areStacksEqual(itemStack, tStack); + } + + public static FluidStack convertCellToFluid(ItemStack itemStack) { + if (itemStack == null) return null; + if (getFluidForFilledItem(itemStack, true) != null) { + FluidStack fluidStack = getFluidForFilledItem(itemStack, true); + if (fluidStack != null) fluidStack.amount = fluidStack.amount * itemStack.stackSize; + return fluidStack; + } + return null; + } + + public static boolean checkIfSameIntegratedCircuit(ItemStack itemStack) { + if (itemStack == null) return false; + for (int i = 0; i < 25; i++) if (itemStack.isItemEqual(GT_Utility.getIntegratedCircuit(i))) return true; + return false; + } + @AutoValue public abstract static class ItemId { /** This method copies NBT, as it is mutable. */ diff --git a/src/main/java/gregtech/common/GT_RecipeAdder.java b/src/main/java/gregtech/common/GT_RecipeAdder.java index b8a76d8980..01327b881f 100644 --- a/src/main/java/gregtech/common/GT_RecipeAdder.java +++ b/src/main/java/gregtech/common/GT_RecipeAdder.java @@ -223,6 +223,45 @@ public class GT_RecipeAdder implements IGT_RecipeAdder { aDuration, aEUt, aCleanroom ? -100 : 0); + ItemStack[] itemInputs = {aInput1, aInput2}; + ItemStack[] itemOutputs = {aOutput1, aOutput2, aOutput3, aOutput4, aOutput5, aOutput6}; + FluidStack[] fluidInputs = {aFluidInput, null, null}; + FluidStack[] fluidOutputs = {aFluidOutput, null, null, null, null, null, null}; + + byte iNumber = 0; + byte oNumber = 0; + + for (ItemStack item : itemInputs) { + if (item != null) { + if (GT_Utility.getFluidForFilledItem(aInput1, true) != null || GT_Utility.isCellEmpty(item)) { + fluidInputs[iNumber + 1] = GT_Utility.convertCellToFluid(item); + itemInputs[iNumber] = null; + } + } + iNumber++; + } + + for (ItemStack item : itemOutputs) { + if (item != null) { + if (GT_Utility.getFluidForFilledItem(item, true) != null || GT_Utility.isCellEmpty(item)) { + fluidOutputs[oNumber + 1] = GT_Utility.convertCellToFluid(item); + itemOutputs[oNumber] = null; + } + } + oNumber++; + } + + GT_Recipe.GT_Recipe_Map.sMultiblockCentrifugeRecipes.addRecipe( + false, + itemInputs, + itemOutputs, + null, + aChances, + fluidInputs, + fluidOutputs, + aDuration, + aEUt, + aCleanroom ? -100 : 0); return true; } @@ -308,6 +347,38 @@ public class GT_RecipeAdder implements IGT_RecipeAdder { aDuration, aEUt, 0); + ItemStack[] itemInputs = {aInput1, aInput2}; + ItemStack[] itemOutputs = {aOutput1, aOutput2, aOutput3, aOutput4, aOutput5, aOutput6}; + FluidStack[] fluidInputs = {aFluidInput, null, null}; + FluidStack[] fluidOutputs = {aFluidOutput, null, null, null, null, null, null}; + + byte iNumber = 0; + byte oNumber = 0; + + for (ItemStack item : itemInputs) { + if (item != null) { + if (GT_Utility.getFluidForFilledItem(aInput1, true) != null + || GT_Utility.isCellEmpty(item) + || GT_Utility.checkIfSameIntegratedCircuit(item)) { + fluidInputs[iNumber + 1] = GT_Utility.convertCellToFluid(item); + itemInputs[iNumber] = null; + } + } + iNumber++; + } + + for (ItemStack item : itemOutputs) { + if (item != null) { + if (GT_Utility.getFluidForFilledItem(item, true) != null || GT_Utility.isCellEmpty(item)) { + fluidOutputs[oNumber + 1] = GT_Utility.convertCellToFluid(item); + itemOutputs[oNumber] = null; + } + } + oNumber++; + } + + GT_Recipe.GT_Recipe_Map.sMultiblockElectrolyzerRecipes.addRecipe( + false, itemInputs, itemOutputs, null, aChances, fluidInputs, fluidOutputs, aDuration, aEUt, 0); return true; } @@ -2423,6 +2494,36 @@ public class GT_RecipeAdder implements IGT_RecipeAdder { aDuration, aEUt, 0); + ItemStack[] itemInputs = {aInput1, aInput2, aInput3, aInput4, aInput5, aInput6, aInput7, aInput8, aInput9}; + ItemStack[] itemOutputs = {aOutput}; + FluidStack[] fluidInputs = {aFluidInput, null, null, null, null, null, null, null, null, null}; + FluidStack[] fluidOutputs = {aFluidOutput, null}; + + byte iNumber = 0; + byte oNumber = 0; + + for (ItemStack item : itemInputs) { + if (item != null) { + if (GT_Utility.getFluidForFilledItem(aInput1, true) != null || GT_Utility.isCellEmpty(item)) { + fluidInputs[iNumber + 1] = GT_Utility.convertCellToFluid(item); + itemInputs[iNumber] = null; + } + } + iNumber++; + } + + for (ItemStack item : itemOutputs) { + if (item != null) { + if (GT_Utility.getFluidForFilledItem(item, true) != null || GT_Utility.isCellEmpty(item)) { + fluidOutputs[oNumber + 1] = GT_Utility.convertCellToFluid(item); + itemOutputs[oNumber] = null; + } + } + oNumber++; + } + + GT_Recipe.GT_Recipe_Map.sMultiblockMixerRecipes.addRecipe( + false, itemInputs, itemOutputs, null, null, fluidInputs, fluidOutputs, aDuration, aEUt, 0); return true; } @@ -2445,6 +2546,73 @@ public class GT_RecipeAdder implements IGT_RecipeAdder { aDuration, aEUt, 0); + List<ItemStack> tItemInputList; + if (ItemInputArray == null) { + tItemInputList = new ArrayList<>(1); + } else { + tItemInputList = new ArrayList<>(Arrays.asList(ItemInputArray)); + } + List<FluidStack> tFluidInputList; + if (FluidInputArray != null) { + tFluidInputList = new ArrayList<>(Arrays.asList(FluidInputArray)); + } else { + tFluidInputList = new ArrayList<>(1); + } + for (int i = 0; i < tItemInputList.size(); i++) { + if (tItemInputList.get(i) != null) { + if (GT_Utility.getFluidForFilledItem(tItemInputList.get(i), true) != null + || GT_Utility.isCellEmpty(tItemInputList.get(i))) { + tFluidInputList.add(GT_Utility.convertCellToFluid(tItemInputList.get(i))); + tItemInputList.set(i, null); + } + } + } + List<ItemStack> tItemOutputList; + if (ItemInputArray == null) { + tItemOutputList = new ArrayList<>(1); + } else { + tItemOutputList = new ArrayList<>(Arrays.asList(ItemInputArray)); + } + List<FluidStack> tFluidOutputList; + if (FluidOutputArray != null) { + tFluidOutputList = new ArrayList<>(Arrays.asList(FluidOutputArray)); + ; + } else { + tFluidOutputList = new ArrayList<>(1); + } + for (int i = 0; i < tItemOutputList.size(); i++) { + if (tItemOutputList.get(i) != null) { + if (GT_Utility.getFluidForFilledItem(tItemOutputList.get(i), true) != null + || GT_Utility.isCellEmpty(tItemOutputList.get(i))) { + tFluidInputList.add(GT_Utility.convertCellToFluid(tItemOutputList.get(i))); + tItemOutputList.set(i, null); + } + } + } + + ItemStack[] tItemInputArray = new ItemStack[tItemInputList.size()]; + for (int i = 0; i < tItemInputArray.length; i++) tItemInputArray[i] = tItemInputList.get(i); + + FluidStack[] tFluidInputArray = new FluidStack[tFluidInputList.size()]; + for (int i = 0; i < tFluidInputArray.length; i++) tFluidInputArray[i] = tFluidInputList.get(i); + + ItemStack[] tItemOutputArray = new ItemStack[tItemOutputList.size()]; + for (int i = 0; i < tItemOutputArray.length; i++) tItemOutputArray[i] = tItemOutputList.get(i); + + FluidStack[] tFluidOutputArray = new FluidStack[tFluidOutputList.size()]; + for (int i = 0; i < tFluidOutputArray.length; i++) tFluidOutputArray[i] = tFluidOutputList.get(i); + + GT_Recipe.GT_Recipe_Map.sMultiblockMixerRecipes.addRecipe( + false, + tItemInputArray, + tItemOutputArray, + null, + null, + tFluidInputArray, + tFluidOutputArray, + aDuration, + aEUt, + 0); return true; } @@ -2491,6 +2659,36 @@ public class GT_RecipeAdder implements IGT_RecipeAdder { aDuration, aEUt, 0); + ItemStack[] itemInputs = {aInput1, aInput2, aInput3, aInput4, aInput5, aInput6, aInput7, aInput8, aInput9}; + ItemStack[] itemOutputs = {aOutput1, aOutput2, aOutput3, aOutput4}; + FluidStack[] fluidInputs = {aFluidInput, null, null, null, null, null, null, null, null, null}; + FluidStack[] fluidOutputs = {aFluidOutput, null, null, null, null}; + + byte iNumber = 0; + byte oNumber = 0; + + for (ItemStack item : itemInputs) { + if (item != null) { + if (GT_Utility.getFluidForFilledItem(aInput1, true) != null || GT_Utility.isCellEmpty(item)) { + fluidInputs[iNumber + 1] = GT_Utility.convertCellToFluid(item); + itemInputs[iNumber] = null; + } + } + iNumber++; + } + + for (ItemStack item : itemOutputs) { + if (item != null) { + if (GT_Utility.getFluidForFilledItem(item, true) != null || GT_Utility.isCellEmpty(item)) { + fluidOutputs[oNumber + 1] = GT_Utility.convertCellToFluid(item); + itemOutputs[oNumber] = null; + } + } + oNumber++; + } + + GT_Recipe.GT_Recipe_Map.sMultiblockMixerRecipes.addRecipe( + false, itemInputs, itemOutputs, null, null, fluidInputs, fluidOutputs, aDuration, aEUt, 0); return true; } diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ProcessingArray.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ProcessingArray.java index 538290a4e8..0e68b0f312 100644 --- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ProcessingArray.java +++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ProcessingArray.java @@ -330,8 +330,10 @@ public class GT_MetaTileEntity_ProcessingArray tOut[h].stackSize = 0; } } - FluidStack tFOut = null; - if (aRecipe.getFluidOutput(0) != null) tFOut = aRecipe.getFluidOutput(0).copy(); + FluidStack[] tFOut = new FluidStack[aRecipe.mFluidOutputs.length]; + for (int i = 0; i < aRecipe.mFluidOutputs.length; i++) + if (aRecipe.getFluidOutput(i) != null) + tFOut[i] = aRecipe.getFluidOutput(i).copy(); for (int f = 0; f < tOut.length; f++) { if (aRecipe.mOutputs[f] != null && tOut[f] != null) { for (int g = 0; g < parallel; g++) { @@ -340,9 +342,13 @@ public class GT_MetaTileEntity_ProcessingArray } } } - if (tFOut != null) { - int tSize = tFOut.amount; - tFOut.amount = tSize * parallel; + byte oNumber = 0; + for (FluidStack fluidStack : tFOut) { + if (fluidStack != null) { + int tSize = fluidStack.amount; + tFOut[oNumber].amount = tSize * parallel; + } + oNumber++; } this.mMaxProgresstime = Math.max(1, this.mMaxProgresstime); this.mOutputItems = Arrays.stream(tOut) @@ -350,7 +356,7 @@ public class GT_MetaTileEntity_ProcessingArray .flatMap(GT_MetaTileEntity_ProcessingArray::splitOversizedStack) .filter(is -> is.stackSize > 0) .toArray(ItemStack[]::new); - this.mOutputFluids = new FluidStack[] {tFOut}; + this.mOutputFluids = tFOut; updateSlots(); return true; } diff --git a/src/main/java/gregtech/loaders/postload/GT_ProcessingArrayRecipeLoader.java b/src/main/java/gregtech/loaders/postload/GT_ProcessingArrayRecipeLoader.java index c9564dcd4a..b758ab2004 100644 --- a/src/main/java/gregtech/loaders/postload/GT_ProcessingArrayRecipeLoader.java +++ b/src/main/java/gregtech/loaders/postload/GT_ProcessingArrayRecipeLoader.java @@ -24,11 +24,13 @@ public class GT_ProcessingArrayRecipeLoader { // Canner GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.canner", GT_Recipe_Map.sCannerRecipes); // Centrifuge - GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.centrifuge", GT_Recipe_Map.sCentrifugeRecipes); + GT_ProcessingArray_Manager.addRecipeMapToPA( + "basicmachine.centrifuge", GT_Recipe_Map.sMultiblockCentrifugeRecipes); // Chemical Bath GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.chemicalbath", GT_Recipe_Map.sChemicalBathRecipes); // Chemical Reactor - GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.chemicalreactor", GT_Recipe_Map.sChemicalRecipes); + GT_ProcessingArray_Manager.addRecipeMapToPA( + "basicmachine.chemicalreactor", GT_Recipe_Map.sMultiblockChemicalRecipes); // Circuit Assembler GT_ProcessingArray_Manager.addRecipeMapToPA( "basicmachine.circuitassembler", GT_Recipe_Map.sCircuitAssemblerRecipes); @@ -39,7 +41,8 @@ public class GT_ProcessingArrayRecipeLoader { // Distillery GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.distillery", GT_Recipe_Map.sDistilleryRecipes); // Electrolyzer - GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.electrolyzer", GT_Recipe_Map.sElectrolyzerRecipes); + GT_ProcessingArray_Manager.addRecipeMapToPA( + "basicmachine.electrolyzer", GT_Recipe_Map.sMultiblockElectrolyzerRecipes); // Extractor GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.extractor", GT_Recipe_Map.sExtractorRecipes); // Extruder @@ -74,7 +77,7 @@ public class GT_ProcessingArrayRecipeLoader { // Microwave GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.microwave", GT_Recipe_Map.sMicrowaveRecipes); // Mixer - GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.mixer", GT_Recipe_Map.sMixerRecipes); + GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.mixer", GT_Recipe_Map.sMultiblockMixerRecipes); // Ore Washer GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.orewasher", GT_Recipe_Map.sOreWasherRecipes); // Plasma Arc Furnace |