diff options
Diffstat (limited to 'src')
4 files changed, 168 insertions, 64 deletions
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..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; @@ -59,6 +60,8 @@ 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; import static gregtech.api.enums.GT_Values.V; @@ -161,9 +164,9 @@ public class GT_TileEntity_MegaBlastFurnace extends GT_MetaTileEntity_ElectricBl } @SuppressWarnings("rawtypes") - public ArrayList TTTunnels = new ArrayList<>(); + public ArrayList<Object> TTTunnels = new ArrayList<>(); @SuppressWarnings("rawtypes") - public ArrayList TTMultiAmp = new ArrayList<>(); + public ArrayList<Object> TTMultiAmp = new ArrayList<>(); @Override public void loadNBTData(NBTTagCompound aNBT) { @@ -390,18 +393,15 @@ 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) { - 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; + 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; + Pair<ArrayList<FluidStack>, ArrayList<ItemStack>> 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 15105babf0..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 @@ -44,6 +44,8 @@ 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; import static gregtech.api.util.GT_StructureUtility.ofHatchAdder; @@ -226,32 +228,25 @@ 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<FluidStack[]> outputFluids = new ArrayList<>(); + ArrayList<FluidStack> outputFluids = new ArrayList<>(); + ArrayList<ItemStack> outputItems = new ArrayList<>(); + Pair<ArrayList<FluidStack>, ArrayList<ItemStack>> 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}); - 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 (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; + Outputs = getMultiOutput(tRecipe, tCurrentPara); + outputFluids = Outputs.getKey(); + outputItems = Outputs.getValue(); } + 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; @@ -271,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 2fdaa545dc..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; @@ -45,6 +46,8 @@ 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; @Optional.Interface(iface = "com.github.bartimaeusnek.crossmod.tectech.TecTechEnabledMulti", modid = "tectech", striprefs = true) @@ -108,22 +111,14 @@ 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 && ((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 (tRecipe != null) { + found_Recipe = true; + long tMaxPara = Math.min(ConfigHandler.megaMachinesMax, nominalV / tRecipe.mEUt); + int tCurrentPara = handleParallelRecipe(tRecipe, tInputFluids, tInputs, (int) tMaxPara); + processed = tCurrentPara; + Pair<ArrayList<FluidStack>, ArrayList<ItemStack>> 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 new file mode 100644 index 0000000000..ab2fd8976a --- /dev/null +++ b/src/main/java/com/github/bartimaeusnek/bartworks/util/RecipeFinderForParallel.java @@ -0,0 +1,124 @@ +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.ArrayList; +import java.util.HashMap; + +public class RecipeFinderForParallel { + + /** + This method is used for mega multis which have extremely high parallel.<BR> + Never use it for non parallel machines, it will have worse performance.<BR> + */ + + 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<Integer, Integer> tCompressedFluidInput = compressFluid(aFluidInputs); + HashMap<Integer, Integer> tCompressedItemInput = compressItem(aItemStacks); + HashMap<Integer, Integer> tCompressedFluidRecipe = compressFluid(aRecipe.mFluidInputs); + HashMap<Integer, Integer> 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 Pair<ArrayList<FluidStack>, ArrayList<ItemStack>> getMultiOutput(GT_Recipe aRecipe, int aPall) { + ArrayList<FluidStack> tFluidList = new ArrayList<>(); + ArrayList<ItemStack> tItemList = new ArrayList<>(); + if (aRecipe == null) + return new Pair<>(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 Pair<>(tFluidList, tItemList); + } + + public static HashMap<Integer, Integer> compressItem(ItemStack[] aItemStacks) { + HashMap<Integer, Integer> tCompressed = new HashMap<>(); + for (ItemStack tItem : aItemStacks) { + if (tItem != null) { + int tItemID = GT_Utility.stackToInt(tItem); + int tItemSize = tItem.stackSize; + tCompressed.merge(tItemID, tItemSize, Integer::sum); + } + } + return tCompressed; + } + + public static HashMap<Integer, Integer> compressFluid(FluidStack[] aFluidStack) { + HashMap<Integer, Integer> tCompressed = new HashMap<>(); + for (FluidStack tFluid : aFluidStack) { + if (tFluid != null) { + int tFluidID = tFluid.getFluidID(); + int tFluidSize = tFluid.amount; + tCompressed.merge(tFluidID, tFluidSize, Integer::sum); + } + } + return tCompressed; + } +} |