aboutsummaryrefslogtreecommitdiff
path: root/src/main
diff options
context:
space:
mode:
Diffstat (limited to 'src/main')
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaBlastFurnace.java28
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaDistillTower.java53
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaVacuumFreezer.java27
-rw-r--r--src/main/java/com/github/bartimaeusnek/bartworks/util/RecipeFinderForParallel.java124
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;
+ }
+}