From 8b8f50976c3e74f3a72d19c2fcf577efb15d47d1 Mon Sep 17 00:00:00 2001 From: GlodBlock <1356392126@qq.com> Date: Tue, 16 Nov 2021 23:30:59 +0800 Subject: optimize parallel algorithm Former-commit-id: b4d3eeaa77c61c2597326a3e659c008c07087779 --- .../mega/GT_TileEntity_MegaBlastFurnace.java | 37 ++++++- .../mega/GT_TileEntity_MegaDistillTower.java | 26 ++++- .../mega/GT_TileEntity_MegaVacuumFreezer.java | 36 ++++++- .../bartworks/util/RecipeFinderForParallel.java | 106 +++++++++++++++++++++ 4 files changed, 197 insertions(+), 8 deletions(-) create mode 100644 src/main/java/com/github/bartimaeusnek/bartworks/util/RecipeFinderForParallel.java (limited to 'src') diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaBlastFurnace.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaBlastFurnace.java index 7213e7de25..8a018d9c2a 100644 --- a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaBlastFurnace.java +++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaBlastFurnace.java @@ -59,6 +59,7 @@ import net.minecraftforge.fluids.FluidStack; import java.util.*; import java.util.stream.Collectors; +import static com.github.bartimaeusnek.bartworks.util.RecipeFinderForParallel.handleParallelRecipe; import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlockAdder; import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose; import static gregtech.api.enums.GT_Values.V; @@ -390,7 +391,39 @@ public class GT_TileEntity_MegaBlastFurnace extends GT_MetaTileEntity_ElectricBl int tHeatCapacityDivTiers = (this.mHeatingCapacity - tRecipe.mSpecialValue) / 900; long precutRecipeVoltage = (long) (tRecipe.mEUt * Math.pow(0.95, tHeatCapacityDivTiers)); - while (this.getStoredInputs().size() > 0 && processed < ConfigHandler.megaMachinesMax) { + long tMaxPara = Math.min(ConfigHandler.megaMachinesMax, nominalV / precutRecipeVoltage); + + if (this.mHeatingCapacity >= tRecipe.mSpecialValue) { + int tCurrentPara = handleParallelRecipe(tRecipe, tFluids, tInputs, (int) tMaxPara); + processed = tCurrentPara; + found_Recipe = true; + if (tRecipe.mOutputs != null) { + for (int i = 0; i < tRecipe.mOutputs.length; i++) { + tCurrentPara = processed; + while (tCurrentPara > 0 && tRecipe.getOutput(i) != null) { + int maxSize = tRecipe.getOutput(i).getMaxStackSize(); + if (tCurrentPara <= maxSize) { + outputItems.add(GT_Utility.copyAmount(maxSize, tRecipe.getOutput(i))); + tCurrentPara -= maxSize; + } + else { + outputItems.add(GT_Utility.copyAmount(tCurrentPara, tRecipe.getOutput(i))); + tCurrentPara = 0; + } + } + } + } + if (tRecipe.mFluidOutputs != null) { + for (int i = 0; i < tRecipe.mFluidOutputs.length; i++) { + while (tRecipe.getFluidOutput(i) != null) { + FluidStack tOutputFluid = new FluidStack(tRecipe.getFluidOutput(i).getFluid(), tRecipe.getFluidOutput(i).amount * processed); + outputFluids.add(tOutputFluid); + } + } + } + } + + /* while (this.getStoredInputs().size() > 0 && processed < ConfigHandler.megaMachinesMax) { if (this.mHeatingCapacity >= tRecipe.mSpecialValue && (precutRecipeVoltage * (processed + 1)) < nominalV && tRecipe.isRecipeInputEqual(true, tFluids, tInputs)) { found_Recipe = true; for (int i = 0; i < tRecipe.mOutputs.length; i++) { @@ -402,7 +435,7 @@ public class GT_TileEntity_MegaBlastFurnace extends GT_MetaTileEntity_ElectricBl ++processed; } else break; - } + }*/ if (found_Recipe) { this.mEfficiency = (10000 - (this.getIdealStatus() - this.getRepairStatus()) * 1000); diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaDistillTower.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaDistillTower.java index 15105babf0..d365a75bd1 100644 --- a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaDistillTower.java +++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaDistillTower.java @@ -44,6 +44,7 @@ import net.minecraftforge.fluids.FluidStack; import java.util.ArrayList; import java.util.List; +import static com.github.bartimaeusnek.bartworks.util.RecipeFinderForParallel.handleParallelRecipe; import static com.gtnewhorizon.structurelib.structure.StructureUtility.*; import static gregtech.api.enums.GT_Values.V; import static gregtech.api.util.GT_StructureUtility.ofHatchAdder; @@ -231,7 +232,24 @@ public class GT_TileEntity_MegaDistillTower extends GT_MetaTileEntity_Distillati boolean found_Recipe = false; FluidStack[] output; GT_Recipe tRecipe = GT_Recipe.GT_Recipe_Map.sDistillationRecipes.findRecipe(this.getBaseMetaTileEntity(), false, GT_Values.V[tTier], new FluidStack[]{tFluid}); - while (this.getStoredFluids().size() > 0 && processed < ConfigHandler.megaMachinesMax) { + + if (tRecipe != null) { + found_Recipe = true; + long tMaxPara = Math.min(ConfigHandler.megaMachinesMax, nominalV / tRecipe.mEUt); + int tCurrentPara = handleParallelRecipe(tRecipe, new FluidStack[]{tFluid}, null, (int) tMaxPara); + processed = tCurrentPara; + if (tRecipe.mFluidOutputs != null) { + output = new FluidStack[tRecipe.mFluidOutputs.length]; + for (int i = 0; i < tRecipe.mFluidOutputs.length; i++) { + if (tRecipe.getFluidOutput(i) != null) { + output[i] = new FluidStack(tRecipe.getFluidOutput(i).getFluid(), tRecipe.getFluidOutput(i).amount * tCurrentPara); + } + } + outputFluids.add(output); + } + } + + /* while (this.getStoredFluids().size() > 0 && processed < ConfigHandler.megaMachinesMax) { if (tRecipe != null && (tRecipe.mEUt * (processed + 1)) < nominalV && tRecipe.isRecipeInputEqual(true, tFluids)) { found_Recipe = true; if (tRecipe.mFluidOutputs.length == 1 && tRecipe.mFluidOutputs[0].amount == 0) @@ -244,14 +262,14 @@ public class GT_TileEntity_MegaDistillTower extends GT_MetaTileEntity_Distillati ++processed; } else break; - } + }*/ if (!found_Recipe) continue; - for (int j = 1; j < outputFluids.size(); j++) { + /*for (int j = 1; j < outputFluids.size(); j++) { for (int k = 0; k < outputFluids.get(j).length; k++) { outputFluids.get(0)[k].amount += outputFluids.get(j)[k].amount; } - } + }*/ this.mEfficiency = (10000 - (this.getIdealStatus() - this.getRepairStatus()) * 1000); this.mEfficiencyIncrease = 10000; long actualEUT = (long) (tRecipe.mEUt) * processed; diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaVacuumFreezer.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaVacuumFreezer.java index 2fdaa545dc..c9febd1fa8 100644 --- a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaVacuumFreezer.java +++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaVacuumFreezer.java @@ -45,6 +45,7 @@ import net.minecraftforge.fluids.FluidStack; import java.util.ArrayList; import java.util.List; +import static com.github.bartimaeusnek.bartworks.util.RecipeFinderForParallel.handleParallelRecipe; import static gregtech.api.enums.GT_Values.V; @Optional.Interface(iface = "com.github.bartimaeusnek.crossmod.tectech.TecTechEnabledMulti", modid = "tectech", striprefs = true) @@ -108,7 +109,38 @@ public class GT_TileEntity_MegaVacuumFreezer extends GT_MetaTileEntity_VacuumFre boolean found_Recipe = false; int processed = 0; - while ((this.getStoredInputs().size() > 0 || this.getStoredFluids().size() > 0) && processed < ConfigHandler.megaMachinesMax) { + if (tRecipe != null) { + found_Recipe = true; + long tMaxPara = Math.min(ConfigHandler.megaMachinesMax, nominalV / tRecipe.mEUt); + int tCurrentPara = handleParallelRecipe(tRecipe, tInputFluids, tInputs, (int) tMaxPara); + processed = tCurrentPara; + if (tRecipe.mOutputs != null) { + for (int i = 0; i < tRecipe.mOutputs.length; i++) { + tCurrentPara = processed; + while (tCurrentPara > 0 && tRecipe.getOutput(i) != null) { + int maxSize = tRecipe.getOutput(i).getMaxStackSize(); + if (tCurrentPara <= maxSize) { + outputItems.add(GT_Utility.copyAmount(maxSize, tRecipe.getOutput(i))); + tCurrentPara -= maxSize; + } + else { + outputItems.add(GT_Utility.copyAmount(tCurrentPara, tRecipe.getOutput(i))); + tCurrentPara = 0; + } + } + } + } + if (tRecipe.mFluidOutputs != null) { + for (int i = 0; i < tRecipe.mFluidOutputs.length; i++) { + while (tRecipe.getFluidOutput(i) != null) { + FluidStack tOutputFluid = new FluidStack(tRecipe.getFluidOutput(i).getFluid(), tRecipe.getFluidOutput(i).amount * processed); + outputFluids.add(tOutputFluid); + } + } + } + } + + /*while ((this.getStoredInputs().size() > 0 || this.getStoredFluids().size() > 0) && processed < ConfigHandler.megaMachinesMax) { if (tRecipe != null && ((long) tRecipe.mEUt * (processed + 1)) < nominalV && tRecipe.isRecipeInputEqual(true, tInputFluids, tInputs)) { found_Recipe = true; if (tRecipe.mOutputs != null) { @@ -124,7 +156,7 @@ public class GT_TileEntity_MegaVacuumFreezer extends GT_MetaTileEntity_VacuumFre ++processed; } else break; - } + }*/ if (found_Recipe) { this.mEfficiency = (10000 - (this.getIdealStatus() - this.getRepairStatus()) * 1000); diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/util/RecipeFinderForParallel.java b/src/main/java/com/github/bartimaeusnek/bartworks/util/RecipeFinderForParallel.java new file mode 100644 index 0000000000..a0061564a6 --- /dev/null +++ b/src/main/java/com/github/bartimaeusnek/bartworks/util/RecipeFinderForParallel.java @@ -0,0 +1,106 @@ +package com.github.bartimaeusnek.bartworks.util; + +import gregtech.api.util.GT_Recipe; +import gregtech.api.util.GT_Utility; +import net.minecraft.item.ItemStack; +import net.minecraftforge.fluids.FluidStack; + +import java.util.HashMap; + +public class RecipeFinderForParallel { + + /** + This method is used for mega multis which have extremely high parallel.
+ Never use it for non parallel machines, it will have worse performance.
+ */ + + public static int handleParallelRecipe(GT_Recipe aRecipe, FluidStack[] aFluidInputs, ItemStack[] aItemStacks, int aMaxParallel) { + HashMap tCompressedFluidInput = compressFluid(aFluidInputs); + HashMap tCompressedItemInput = compressItem(aItemStacks); + HashMap tCompressedFluidRecipe = compressFluid(aRecipe.mFluidInputs); + HashMap tCompressedItemRecipe = compressItem(aRecipe.mInputs); + int tCurrentPara = aMaxParallel; + for (int tFluid : tCompressedFluidRecipe.keySet()) { + if (tCompressedFluidInput.containsKey(tFluid) && tCompressedFluidRecipe.get(tFluid) != 0) { + tCurrentPara = Math.min(tCurrentPara, tCompressedFluidInput.get(tFluid) / tCompressedFluidRecipe.get(tFluid)); + } + } + for (int tItem : tCompressedItemRecipe.keySet()) { + if (tCompressedItemInput.containsKey(tItem) && tCompressedItemRecipe.get(tItem) != 0) { + tCurrentPara = Math.min(tCurrentPara, tCompressedItemInput.get(tItem) / tCompressedItemRecipe.get(tItem)); + } + } + + for (int tFluid : tCompressedFluidRecipe.keySet()) { + int tOldSize = tCompressedFluidRecipe.get(tFluid); + tCompressedFluidRecipe.put(tFluid, tOldSize * tCurrentPara); + } + for (int tItem : tCompressedItemRecipe.keySet()) { + int tOldSize = tCompressedItemRecipe.get(tItem); + tCompressedItemRecipe.put(tItem, tOldSize * tCurrentPara); + } + + for (FluidStack tFluid : aFluidInputs) { + if (tFluid != null && tCompressedFluidRecipe.containsKey(tFluid.getFluidID())) { + if (tFluid.amount >= tCompressedFluidRecipe.get(tFluid.getFluidID())) { + tFluid.amount -= tCompressedFluidRecipe.get(tFluid.getFluidID()); + tCompressedItemRecipe.remove(tFluid.getFluidID()); + } + else { + tCompressedFluidRecipe.put(tFluid.getFluidID(), tCompressedFluidRecipe.get(tFluid.getFluidID()) - tFluid.amount); + tFluid.amount = 0; + } + } + } + + for (ItemStack tItem : aItemStacks) { + if (tItem != null && tCompressedItemRecipe.containsKey(GT_Utility.stackToInt(tItem))) { + if (tItem.stackSize >= tCompressedItemRecipe.get(GT_Utility.stackToInt(tItem))) { + tItem.stackSize -= tCompressedItemRecipe.get(GT_Utility.stackToInt(tItem)); + tCompressedItemRecipe.remove(GT_Utility.stackToInt(tItem)); + } + else { + tCompressedItemRecipe.put(GT_Utility.stackToInt(tItem), tCompressedItemRecipe.get(GT_Utility.stackToInt(tItem)) - tItem.stackSize); + tItem.stackSize = 0; + } + } + } + return tCurrentPara; + } + + public static HashMap compressItem(ItemStack[] aItemStacks) { + HashMap tCompressed = new HashMap<>(); + for (ItemStack tItem : aItemStacks) { + if (tItem != null) { + int tItemID = GT_Utility.stackToInt(tItem); + int tItemSize = tItem.stackSize; + if (tCompressed.containsKey(tItemID)) { + int tOldSize = tCompressed.get(tItemID); + tCompressed.put(tItemID, tOldSize + tItemSize); + } + else { + tCompressed.put(tItemID, tItemSize); + } + } + } + return tCompressed; + } + + public static HashMap compressFluid(FluidStack[] aFluidStack) { + HashMap tCompressed = new HashMap<>(); + for (FluidStack tFluid : aFluidStack) { + if (tFluid != null) { + int tFluidID = tFluid.getFluidID(); + int tFluidSize = tFluid.amount; + if (tCompressed.containsKey(tFluidID)) { + int tOldSize = tCompressed.get(tFluidID); + tCompressed.put(tFluidID, tOldSize + tFluidSize); + } + else { + tCompressed.put(tFluidID, tFluidSize); + } + } + } + return tCompressed; + } +} -- cgit From 116ae744161eff30f8e7e536d5193391686d2a49 Mon Sep 17 00:00:00 2001 From: GlodBlock <1356392126@qq.com> Date: Fri, 19 Nov 2021 23:05:03 +0800 Subject: merge common code Former-commit-id: 6f3a4fb6857843e310ebcc71596f127c202a81cc --- .../mega/GT_TileEntity_MegaBlastFurnace.java | 46 +++--------------- .../mega/GT_TileEntity_MegaDistillTower.java | 55 +++++----------------- .../mega/GT_TileEntity_MegaVacuumFreezer.java | 46 ++---------------- .../bartworks/util/RecipeFinderForParallel.java | 30 ++++++++++++ 4 files changed, 51 insertions(+), 126 deletions(-) (limited to 'src') diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaBlastFurnace.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaBlastFurnace.java index 8a018d9c2a..0c99ff8947 100644 --- a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaBlastFurnace.java +++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaBlastFurnace.java @@ -59,6 +59,7 @@ import net.minecraftforge.fluids.FluidStack; import java.util.*; import java.util.stream.Collectors; +import static com.github.bartimaeusnek.bartworks.util.RecipeFinderForParallel.getMultiOutput; import static com.github.bartimaeusnek.bartworks.util.RecipeFinderForParallel.handleParallelRecipe; import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlockAdder; import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose; @@ -162,9 +163,9 @@ public class GT_TileEntity_MegaBlastFurnace extends GT_MetaTileEntity_ElectricBl } @SuppressWarnings("rawtypes") - public ArrayList TTTunnels = new ArrayList<>(); + public ArrayList TTTunnels = new ArrayList<>(); @SuppressWarnings("rawtypes") - public ArrayList TTMultiAmp = new ArrayList<>(); + public ArrayList TTMultiAmp = new ArrayList<>(); @Override public void loadNBTData(NBTTagCompound aNBT) { @@ -397,46 +398,11 @@ public class GT_TileEntity_MegaBlastFurnace extends GT_MetaTileEntity_ElectricBl int tCurrentPara = handleParallelRecipe(tRecipe, tFluids, tInputs, (int) tMaxPara); processed = tCurrentPara; found_Recipe = true; - if (tRecipe.mOutputs != null) { - for (int i = 0; i < tRecipe.mOutputs.length; i++) { - tCurrentPara = processed; - while (tCurrentPara > 0 && tRecipe.getOutput(i) != null) { - int maxSize = tRecipe.getOutput(i).getMaxStackSize(); - if (tCurrentPara <= maxSize) { - outputItems.add(GT_Utility.copyAmount(maxSize, tRecipe.getOutput(i))); - tCurrentPara -= maxSize; - } - else { - outputItems.add(GT_Utility.copyAmount(tCurrentPara, tRecipe.getOutput(i))); - tCurrentPara = 0; - } - } - } - } - if (tRecipe.mFluidOutputs != null) { - for (int i = 0; i < tRecipe.mFluidOutputs.length; i++) { - while (tRecipe.getFluidOutput(i) != null) { - FluidStack tOutputFluid = new FluidStack(tRecipe.getFluidOutput(i).getFluid(), tRecipe.getFluidOutput(i).amount * processed); - outputFluids.add(tOutputFluid); - } - } - } + Object[] Outputs = getMultiOutput(tRecipe, tCurrentPara); + outputFluids = (ArrayList) Outputs[0]; + outputItems = (ArrayList) Outputs[1]; } - /* while (this.getStoredInputs().size() > 0 && processed < ConfigHandler.megaMachinesMax) { - if (this.mHeatingCapacity >= tRecipe.mSpecialValue && (precutRecipeVoltage * (processed + 1)) < nominalV && tRecipe.isRecipeInputEqual(true, tFluids, tInputs)) { - found_Recipe = true; - for (int i = 0; i < tRecipe.mOutputs.length; i++) { - outputItems.add(tRecipe.getOutput(i)); - } - for (int i = 0; i < tRecipe.mFluidOutputs.length; i++) { - outputFluids.add(tRecipe.getFluidOutput(i)); - } - ++processed; - } else - break; - }*/ - if (found_Recipe) { this.mEfficiency = (10000 - (this.getIdealStatus() - this.getRepairStatus()) * 1000); this.mEfficiencyIncrease = 10000; diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaDistillTower.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaDistillTower.java index d365a75bd1..d13b5d8016 100644 --- a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaDistillTower.java +++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaDistillTower.java @@ -44,6 +44,7 @@ import net.minecraftforge.fluids.FluidStack; import java.util.ArrayList; import java.util.List; +import static com.github.bartimaeusnek.bartworks.util.RecipeFinderForParallel.getMultiOutput; import static com.github.bartimaeusnek.bartworks.util.RecipeFinderForParallel.handleParallelRecipe; import static com.gtnewhorizon.structurelib.structure.StructureUtility.*; import static gregtech.api.enums.GT_Values.V; @@ -227,10 +228,11 @@ public class GT_TileEntity_MegaDistillTower extends GT_MetaTileEntity_Distillati FluidStack[] tFluids = tFluidList.toArray(new FluidStack[0]); if (tFluids.length > 0) { for (FluidStack tFluid : tFluids) { - ArrayList outputFluids = new ArrayList<>(); + ArrayList outputFluids = new ArrayList<>(); + ArrayList outputItems = new ArrayList<>(); + Object[] Outputs; int processed = 0; boolean found_Recipe = false; - FluidStack[] output; GT_Recipe tRecipe = GT_Recipe.GT_Recipe_Map.sDistillationRecipes.findRecipe(this.getBaseMetaTileEntity(), false, GT_Values.V[tTier], new FluidStack[]{tFluid}); if (tRecipe != null) { @@ -238,38 +240,13 @@ public class GT_TileEntity_MegaDistillTower extends GT_MetaTileEntity_Distillati long tMaxPara = Math.min(ConfigHandler.megaMachinesMax, nominalV / tRecipe.mEUt); int tCurrentPara = handleParallelRecipe(tRecipe, new FluidStack[]{tFluid}, null, (int) tMaxPara); processed = tCurrentPara; - if (tRecipe.mFluidOutputs != null) { - output = new FluidStack[tRecipe.mFluidOutputs.length]; - for (int i = 0; i < tRecipe.mFluidOutputs.length; i++) { - if (tRecipe.getFluidOutput(i) != null) { - output[i] = new FluidStack(tRecipe.getFluidOutput(i).getFluid(), tRecipe.getFluidOutput(i).amount * tCurrentPara); - } - } - outputFluids.add(output); - } + Outputs = getMultiOutput(tRecipe, tCurrentPara); + outputFluids = (ArrayList) Outputs[0]; + outputItems = (ArrayList) Outputs[1]; } - /* while (this.getStoredFluids().size() > 0 && processed < ConfigHandler.megaMachinesMax) { - if (tRecipe != null && (tRecipe.mEUt * (processed + 1)) < nominalV && tRecipe.isRecipeInputEqual(true, tFluids)) { - found_Recipe = true; - if (tRecipe.mFluidOutputs.length == 1 && tRecipe.mFluidOutputs[0].amount == 0) - tRecipe.mFluidOutputs[0].amount = tRecipe.mFluidInputs[0].amount; - output = new FluidStack[tRecipe.mFluidOutputs.length]; - for (int i = 0; i < output.length; i++) { - output[i] = new FluidStack(tRecipe.mFluidOutputs[i],tRecipe.mFluidOutputs[i].amount); - } - outputFluids.add(output); - ++processed; - } else - break; - }*/ if (!found_Recipe) continue; - /*for (int j = 1; j < outputFluids.size(); j++) { - for (int k = 0; k < outputFluids.get(j).length; k++) { - outputFluids.get(0)[k].amount += outputFluids.get(j)[k].amount; - } - }*/ this.mEfficiency = (10000 - (this.getIdealStatus() - this.getRepairStatus()) * 1000); this.mEfficiencyIncrease = 10000; long actualEUT = (long) (tRecipe.mEUt) * processed; @@ -289,20 +266,10 @@ public class GT_TileEntity_MegaDistillTower extends GT_MetaTileEntity_Distillati this.mEUt = (-this.mEUt); } this.mMaxProgresstime = Math.max(1, this.mMaxProgresstime); - this.mOutputFluids = outputFluids.get(0).clone(); - if (tRecipe.getOutput(0) != null) { - int stacks = processed / 64; - ItemStack[] outputs = new ItemStack[stacks]; - if (stacks > 0) { - for (int i = 0; i < stacks; i++) - if (i != stacks - 1) - outputs[i] = BW_Util.setStackSize(tRecipe.getOutput(0),64); - else - outputs[i] = BW_Util.setStackSize(tRecipe.getOutput(0),processed - (64 * i)); - this.mOutputItems = outputs; - } else - this.mOutputItems = null; - } else + this.mOutputFluids = outputFluids.toArray(new FluidStack[0]); + if (!outputItems.isEmpty()) + this.mOutputItems = outputItems.toArray(new ItemStack[0]); + else this.mOutputItems = null; this.updateSlots(); return true; diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaVacuumFreezer.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaVacuumFreezer.java index c9febd1fa8..3e6506eb27 100644 --- a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaVacuumFreezer.java +++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaVacuumFreezer.java @@ -45,6 +45,7 @@ import net.minecraftforge.fluids.FluidStack; import java.util.ArrayList; import java.util.List; +import static com.github.bartimaeusnek.bartworks.util.RecipeFinderForParallel.getMultiOutput; import static com.github.bartimaeusnek.bartworks.util.RecipeFinderForParallel.handleParallelRecipe; import static gregtech.api.enums.GT_Values.V; @@ -114,50 +115,11 @@ public class GT_TileEntity_MegaVacuumFreezer extends GT_MetaTileEntity_VacuumFre long tMaxPara = Math.min(ConfigHandler.megaMachinesMax, nominalV / tRecipe.mEUt); int tCurrentPara = handleParallelRecipe(tRecipe, tInputFluids, tInputs, (int) tMaxPara); processed = tCurrentPara; - if (tRecipe.mOutputs != null) { - for (int i = 0; i < tRecipe.mOutputs.length; i++) { - tCurrentPara = processed; - while (tCurrentPara > 0 && tRecipe.getOutput(i) != null) { - int maxSize = tRecipe.getOutput(i).getMaxStackSize(); - if (tCurrentPara <= maxSize) { - outputItems.add(GT_Utility.copyAmount(maxSize, tRecipe.getOutput(i))); - tCurrentPara -= maxSize; - } - else { - outputItems.add(GT_Utility.copyAmount(tCurrentPara, tRecipe.getOutput(i))); - tCurrentPara = 0; - } - } - } - } - if (tRecipe.mFluidOutputs != null) { - for (int i = 0; i < tRecipe.mFluidOutputs.length; i++) { - while (tRecipe.getFluidOutput(i) != null) { - FluidStack tOutputFluid = new FluidStack(tRecipe.getFluidOutput(i).getFluid(), tRecipe.getFluidOutput(i).amount * processed); - outputFluids.add(tOutputFluid); - } - } - } + Object[] Outputs = getMultiOutput(tRecipe, tCurrentPara); + outputFluids = (ArrayList) Outputs[0]; + outputItems = (ArrayList) Outputs[1]; } - /*while ((this.getStoredInputs().size() > 0 || this.getStoredFluids().size() > 0) && processed < ConfigHandler.megaMachinesMax) { - if (tRecipe != null && ((long) tRecipe.mEUt * (processed + 1)) < nominalV && tRecipe.isRecipeInputEqual(true, tInputFluids, tInputs)) { - found_Recipe = true; - if (tRecipe.mOutputs != null) { - for (int i = 0; i < tRecipe.mOutputs.length; i++) { - outputItems.add(tRecipe.getOutput(i)); - } - } - if (tRecipe.mFluidOutputs != null) { - for (int i = 0; i < tRecipe.mFluidOutputs.length; i++) { - outputFluids.add(tRecipe.getFluidOutput(i)); - } - } - ++processed; - } else - break; - }*/ - if (found_Recipe) { this.mEfficiency = (10000 - (this.getIdealStatus() - this.getRepairStatus()) * 1000); this.mEfficiencyIncrease = 10000; diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/util/RecipeFinderForParallel.java b/src/main/java/com/github/bartimaeusnek/bartworks/util/RecipeFinderForParallel.java index a0061564a6..0d7da1ccd3 100644 --- a/src/main/java/com/github/bartimaeusnek/bartworks/util/RecipeFinderForParallel.java +++ b/src/main/java/com/github/bartimaeusnek/bartworks/util/RecipeFinderForParallel.java @@ -5,6 +5,7 @@ import gregtech.api.util.GT_Utility; import net.minecraft.item.ItemStack; import net.minecraftforge.fluids.FluidStack; +import java.util.ArrayList; import java.util.HashMap; public class RecipeFinderForParallel { @@ -68,6 +69,35 @@ public class RecipeFinderForParallel { return tCurrentPara; } + public static Object[] getMultiOutput(GT_Recipe aRecipe, int aPall) { + ArrayList tFluidList = new ArrayList<>(); + ArrayList tItemList = new ArrayList<>(); + if (aRecipe == null) + return new Object[]{tFluidList, tItemList}; + if (aRecipe.mFluidOutputs != null && aRecipe.mFluidOutputs.length > 0) { + for (FluidStack tFluid : aRecipe.mFluidOutputs) { + if (tFluid != null && tFluid.amount > 0) { + tFluidList.add(new FluidStack(tFluid.getFluid(), tFluid.amount * aPall)); + } + } + } + if (aRecipe.mOutputs != null && aRecipe.mOutputs.length > 0) { + for (ItemStack tItem : aRecipe.mOutputs) { + if (tItem != null && tItem.stackSize > 0) { + int tAmount = tItem.stackSize * aPall; + while (tAmount > tItem.getMaxStackSize()) { + tItemList.add(GT_Utility.copyAmount(tItem.getMaxStackSize(), tItem)); + tAmount -= tItem.getMaxStackSize(); + } + tItemList.add(GT_Utility.copyAmount(tAmount, tItem)); + } + } + } + return new Object[]{ + tFluidList, tItemList + }; + } + public static HashMap compressItem(ItemStack[] aItemStacks) { HashMap tCompressed = new HashMap<>(); for (ItemStack tItem : aItemStacks) { -- cgit From 5d274d2be291d76b898f709535d316b0b672e76f Mon Sep 17 00:00:00 2001 From: GlodBlock <1356392126@qq.com> Date: Sat, 20 Nov 2021 21:52:00 +0800 Subject: remove hacky code Former-commit-id: 78faefd2b12534fcb0fe06738abd34b24c98174b --- .../mega/GT_TileEntity_MegaBlastFurnace.java | 7 +++--- .../mega/GT_TileEntity_MegaDistillTower.java | 6 ++--- .../mega/GT_TileEntity_MegaVacuumFreezer.java | 7 +++--- .../bartworks/util/RecipeFinderForParallel.java | 26 ++++++---------------- 4 files changed, 18 insertions(+), 28 deletions(-) (limited to 'src') diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaBlastFurnace.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaBlastFurnace.java index 0c99ff8947..f2af0dd849 100644 --- a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaBlastFurnace.java +++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaBlastFurnace.java @@ -28,6 +28,7 @@ import com.github.bartimaeusnek.bartworks.common.loaders.ItemRegistry; import com.github.bartimaeusnek.bartworks.util.BW_Tooltip_Reference; import com.github.bartimaeusnek.bartworks.util.BW_Util; import com.github.bartimaeusnek.bartworks.util.MegaUtils; +import com.github.bartimaeusnek.bartworks.util.Pair; import com.github.bartimaeusnek.crossmod.tectech.TecTechEnabledMulti; import com.github.bartimaeusnek.crossmod.tectech.helper.TecTechUtils; import com.github.bartimaeusnek.crossmod.tectech.tileentites.tiered.LowPowerLaser; @@ -398,9 +399,9 @@ public class GT_TileEntity_MegaBlastFurnace extends GT_MetaTileEntity_ElectricBl int tCurrentPara = handleParallelRecipe(tRecipe, tFluids, tInputs, (int) tMaxPara); processed = tCurrentPara; found_Recipe = true; - Object[] Outputs = getMultiOutput(tRecipe, tCurrentPara); - outputFluids = (ArrayList) Outputs[0]; - outputItems = (ArrayList) Outputs[1]; + Pair, ArrayList> Outputs = getMultiOutput(tRecipe, tCurrentPara); + outputFluids = Outputs.getKey(); + outputItems = Outputs.getValue(); } if (found_Recipe) { diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaDistillTower.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaDistillTower.java index d13b5d8016..4604f2d230 100644 --- a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaDistillTower.java +++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaDistillTower.java @@ -230,7 +230,7 @@ public class GT_TileEntity_MegaDistillTower extends GT_MetaTileEntity_Distillati for (FluidStack tFluid : tFluids) { ArrayList outputFluids = new ArrayList<>(); ArrayList outputItems = new ArrayList<>(); - Object[] Outputs; + Pair, ArrayList> Outputs; int processed = 0; boolean found_Recipe = false; GT_Recipe tRecipe = GT_Recipe.GT_Recipe_Map.sDistillationRecipes.findRecipe(this.getBaseMetaTileEntity(), false, GT_Values.V[tTier], new FluidStack[]{tFluid}); @@ -241,8 +241,8 @@ public class GT_TileEntity_MegaDistillTower extends GT_MetaTileEntity_Distillati int tCurrentPara = handleParallelRecipe(tRecipe, new FluidStack[]{tFluid}, null, (int) tMaxPara); processed = tCurrentPara; Outputs = getMultiOutput(tRecipe, tCurrentPara); - outputFluids = (ArrayList) Outputs[0]; - outputItems = (ArrayList) Outputs[1]; + outputFluids = Outputs.getKey(); + outputItems = Outputs.getValue(); } if (!found_Recipe) diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaVacuumFreezer.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaVacuumFreezer.java index 3e6506eb27..8a968094d3 100644 --- a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaVacuumFreezer.java +++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaVacuumFreezer.java @@ -27,6 +27,7 @@ import com.github.bartimaeusnek.bartworks.common.configs.ConfigHandler; import com.github.bartimaeusnek.bartworks.util.BW_Tooltip_Reference; import com.github.bartimaeusnek.bartworks.util.BW_Util; import com.github.bartimaeusnek.bartworks.util.MegaUtils; +import com.github.bartimaeusnek.bartworks.util.Pair; import com.github.bartimaeusnek.crossmod.tectech.TecTechEnabledMulti; import com.github.bartimaeusnek.crossmod.tectech.helper.TecTechUtils; import com.gtnewhorizon.structurelib.structure.IStructureDefinition; @@ -115,9 +116,9 @@ public class GT_TileEntity_MegaVacuumFreezer extends GT_MetaTileEntity_VacuumFre long tMaxPara = Math.min(ConfigHandler.megaMachinesMax, nominalV / tRecipe.mEUt); int tCurrentPara = handleParallelRecipe(tRecipe, tInputFluids, tInputs, (int) tMaxPara); processed = tCurrentPara; - Object[] Outputs = getMultiOutput(tRecipe, tCurrentPara); - outputFluids = (ArrayList) Outputs[0]; - outputItems = (ArrayList) Outputs[1]; + Pair, ArrayList> Outputs = getMultiOutput(tRecipe, tCurrentPara); + outputFluids = Outputs.getKey(); + outputItems = Outputs.getValue(); } if (found_Recipe) { diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/util/RecipeFinderForParallel.java b/src/main/java/com/github/bartimaeusnek/bartworks/util/RecipeFinderForParallel.java index 0d7da1ccd3..ab2fd8976a 100644 --- a/src/main/java/com/github/bartimaeusnek/bartworks/util/RecipeFinderForParallel.java +++ b/src/main/java/com/github/bartimaeusnek/bartworks/util/RecipeFinderForParallel.java @@ -16,6 +16,8 @@ public class RecipeFinderForParallel { */ public static int handleParallelRecipe(GT_Recipe aRecipe, FluidStack[] aFluidInputs, ItemStack[] aItemStacks, int aMaxParallel) { + if (aFluidInputs == null) aFluidInputs = new FluidStack[0]; + if (aItemStacks == null) aItemStacks = new ItemStack[0]; HashMap tCompressedFluidInput = compressFluid(aFluidInputs); HashMap tCompressedItemInput = compressItem(aItemStacks); HashMap tCompressedFluidRecipe = compressFluid(aRecipe.mFluidInputs); @@ -69,11 +71,11 @@ public class RecipeFinderForParallel { return tCurrentPara; } - public static Object[] getMultiOutput(GT_Recipe aRecipe, int aPall) { + public static Pair, ArrayList> getMultiOutput(GT_Recipe aRecipe, int aPall) { ArrayList tFluidList = new ArrayList<>(); ArrayList tItemList = new ArrayList<>(); if (aRecipe == null) - return new Object[]{tFluidList, tItemList}; + return new Pair<>(tFluidList, tItemList); if (aRecipe.mFluidOutputs != null && aRecipe.mFluidOutputs.length > 0) { for (FluidStack tFluid : aRecipe.mFluidOutputs) { if (tFluid != null && tFluid.amount > 0) { @@ -93,9 +95,7 @@ public class RecipeFinderForParallel { } } } - return new Object[]{ - tFluidList, tItemList - }; + return new Pair<>(tFluidList, tItemList); } public static HashMap compressItem(ItemStack[] aItemStacks) { @@ -104,13 +104,7 @@ public class RecipeFinderForParallel { if (tItem != null) { int tItemID = GT_Utility.stackToInt(tItem); int tItemSize = tItem.stackSize; - if (tCompressed.containsKey(tItemID)) { - int tOldSize = tCompressed.get(tItemID); - tCompressed.put(tItemID, tOldSize + tItemSize); - } - else { - tCompressed.put(tItemID, tItemSize); - } + tCompressed.merge(tItemID, tItemSize, Integer::sum); } } return tCompressed; @@ -122,13 +116,7 @@ public class RecipeFinderForParallel { if (tFluid != null) { int tFluidID = tFluid.getFluidID(); int tFluidSize = tFluid.amount; - if (tCompressed.containsKey(tFluidID)) { - int tOldSize = tCompressed.get(tFluidID); - tCompressed.put(tFluidID, tOldSize + tFluidSize); - } - else { - tCompressed.put(tFluidID, tFluidSize); - } + tCompressed.merge(tFluidID, tFluidSize, Integer::sum); } } return tCompressed; -- cgit