aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGlodBlock <1356392126@qq.com>2021-11-16 23:30:59 +0800
committerGlodBlock <1356392126@qq.com>2021-11-16 23:30:59 +0800
commit8b8f50976c3e74f3a72d19c2fcf577efb15d47d1 (patch)
tree4de75e954649e5cc6b290fe4cd01652e25e4c613 /src
parent5e7adebcb017dad2bdcc5830b59f90286677538d (diff)
downloadGT5-Unofficial-8b8f50976c3e74f3a72d19c2fcf577efb15d47d1.tar.gz
GT5-Unofficial-8b8f50976c3e74f3a72d19c2fcf577efb15d47d1.tar.bz2
GT5-Unofficial-8b8f50976c3e74f3a72d19c2fcf577efb15d47d1.zip
optimize parallel algorithm
Former-commit-id: b4d3eeaa77c61c2597326a3e659c008c07087779
Diffstat (limited to 'src')
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaBlastFurnace.java37
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaDistillTower.java26
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaVacuumFreezer.java36
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/util/RecipeFinderForParallel.java106
4 files changed, 197 insertions, 8 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..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.<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) {
+ 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 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;
+ if (tCompressed.containsKey(tItemID)) {
+ int tOldSize = tCompressed.get(tItemID);
+ tCompressed.put(tItemID, tOldSize + tItemSize);
+ }
+ else {
+ tCompressed.put(tItemID, tItemSize);
+ }
+ }
+ }
+ 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;
+ if (tCompressed.containsKey(tFluidID)) {
+ int tOldSize = tCompressed.get(tFluidID);
+ tCompressed.put(tFluidID, tOldSize + tFluidSize);
+ }
+ else {
+ tCompressed.put(tFluidID, tFluidSize);
+ }
+ }
+ }
+ return tCompressed;
+ }
+}