aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGDCloud <93287602+GDCloudstrike@users.noreply.github.com>2023-11-23 01:06:56 +0100
committerGitHub <noreply@github.com>2023-11-23 00:06:56 +0000
commit804678d5f7e20ab0c5bacc9d00c4d76a30c6701c (patch)
tree40686b22071368923145f4b7c1cfb8adb105bc6a
parent5bee46df394e18a697749bc32bcae71c9a6b24c7 (diff)
downloadGT5-Unofficial-804678d5f7e20ab0c5bacc9d00c4d76a30c6701c.tar.gz
GT5-Unofficial-804678d5f7e20ab0c5bacc9d00c4d76a30c6701c.tar.bz2
GT5-Unofficial-804678d5f7e20ab0c5bacc9d00c4d76a30c6701c.zip
Fixing the EOH OC situation (#256)
* tooltip changes * typo * return to old formula and switch to bigint * add new item + texture * actually load the item * power formulas * start on stellar plasma integration * rework math * make static * grammar * spotless * astral array fabricator recipe * tooltip work * adjust recipe * fix build errors * address reviews * FluidStackLong * more long fluid stack stuff * fix nei fluid amounts * add brackets * undo wildcard import * rework loop for checking aaf amount * wrong nbt tag * address reviews v2
-rw-r--r--src/main/java/com/github/technus/tectech/loader/recipe/ResearchStationAssemblyLine.java29
-rw-r--r--src/main/java/com/github/technus/tectech/loader/thing/ThingsLoader.java2
-rw-r--r--src/main/java/com/github/technus/tectech/recipe/EyeOfHarmonyRecipe.java63
-rw-r--r--src/main/java/com/github/technus/tectech/recipe/EyeOfHarmonyRecipeStorage.java9
-rw-r--r--src/main/java/com/github/technus/tectech/thing/CustomItemList.java4
-rw-r--r--src/main/java/com/github/technus/tectech/thing/item/AstralArrayFabricator.java53
-rw-r--r--src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_EyeOfHarmony.java301
-rw-r--r--src/main/java/com/github/technus/tectech/util/FluidStackLong.java29
-rw-r--r--src/main/resources/assets/tectech/lang/en_US.lang8
-rw-r--r--src/main/resources/assets/tectech/textures/items/itemAstralArray.pngbin0 -> 4919 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/items/itemAstralArray.png.mcmeta5
11 files changed, 398 insertions, 105 deletions
diff --git a/src/main/java/com/github/technus/tectech/loader/recipe/ResearchStationAssemblyLine.java b/src/main/java/com/github/technus/tectech/loader/recipe/ResearchStationAssemblyLine.java
index a58cbbe72b..1dd36e0ed6 100644
--- a/src/main/java/com/github/technus/tectech/loader/recipe/ResearchStationAssemblyLine.java
+++ b/src/main/java/com/github/technus/tectech/loader/recipe/ResearchStationAssemblyLine.java
@@ -5,6 +5,7 @@ import static com.google.common.math.LongMath.pow;
import static gregtech.api.enums.Mods.*;
import static gregtech.api.util.GT_ModHandler.getModItem;
import static gregtech.api.util.GT_RecipeBuilder.MINUTES;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
import net.minecraft.item.ItemStack;
import net.minecraftforge.fluids.Fluid;
@@ -3022,6 +3023,34 @@ public class ResearchStationAssemblyLine implements Runnable {
(int) TierEU.RECIPE_UMV);
}
+ // Astral Array Fabricator
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ CustomItemList.SpacetimeCompressionFieldGeneratorTier8.get(1),
+ 480_000_000,
+ 32_768,
+ (int) TierEU.RECIPE_MAX,
+ 64,
+ new Object[] { GT_OreDictUnificator.get(OrePrefixes.frameGt, MaterialsUEVplus.WhiteDwarfMatter, 8),
+ GT_OreDictUnificator.get(OrePrefixes.frameGt, MaterialsUEVplus.BlackDwarfMatter, 8),
+ ItemList.EnergisedTesseract.get(32),
+ GT_OreDictUnificator.get(OrePrefixes.nanite, MaterialsUEVplus.Eternity, 16),
+ CustomItemList.SpacetimeCompressionFieldGeneratorTier8.get(64),
+ CustomItemList.SpacetimeCompressionFieldGeneratorTier8.get(64),
+ CustomItemList.SpacetimeCompressionFieldGeneratorTier8.get(10),
+ CustomItemList.TimeAccelerationFieldGeneratorTier8.get(64),
+ CustomItemList.TimeAccelerationFieldGeneratorTier8.get(64),
+ CustomItemList.TimeAccelerationFieldGeneratorTier8.get(40),
+ CustomItemList.StabilisationFieldGeneratorTier8.get(48),
+ CustomItemList.EOH_Infinite_Energy_Casing.get(32),
+ CustomItemList.EOH_Reinforced_Temporal_Casing.get(64),
+ CustomItemList.EOH_Reinforced_Spatial_Casing.get(64), ItemList.Field_Generator_UMV.get(16) },
+ new FluidStack[] { MaterialsUEVplus.Space.getMolten(32_768L * 64),
+ MaterialsUEVplus.Eternity.getMolten(16_384L * 64),
+ MaterialsUEVplus.ExcitedDTSC.getFluid(8_192L * 64) },
+ CustomItemList.astralArrayFabricator.get(1),
+ 300 * SECONDS,
+ (int) TierEU.RECIPE_UXV);
+
}
private void addWirelessEnergyRecipes() {
diff --git a/src/main/java/com/github/technus/tectech/loader/thing/ThingsLoader.java b/src/main/java/com/github/technus/tectech/loader/thing/ThingsLoader.java
index d1a1a135db..af383a18e8 100644
--- a/src/main/java/com/github/technus/tectech/loader/thing/ThingsLoader.java
+++ b/src/main/java/com/github/technus/tectech/loader/thing/ThingsLoader.java
@@ -13,6 +13,7 @@ import com.github.technus.tectech.thing.casing.SpacetimeCompressionFieldCasing;
import com.github.technus.tectech.thing.casing.StabilisationFieldCasing;
import com.github.technus.tectech.thing.casing.TT_Container_Casings;
import com.github.technus.tectech.thing.casing.TimeAccelerationFieldCasing;
+import com.github.technus.tectech.thing.item.AstralArrayFabricator;
import com.github.technus.tectech.thing.item.EnderFluidLinkCover;
import com.github.technus.tectech.thing.item.EuMeterGT;
import com.github.technus.tectech.thing.item.ParametrizerMemoryCard;
@@ -75,6 +76,7 @@ public class ThingsLoader implements Runnable {
TecTech.LOGGER.info("Useful Items registered");
TeslaCoilComponent.run();
+ AstralArrayFabricator.run();
TecTech.LOGGER.info("Crafting Components registered");
TecTech.LOGGER.info("Debug Items registered");
diff --git a/src/main/java/com/github/technus/tectech/recipe/EyeOfHarmonyRecipe.java b/src/main/java/com/github/technus/tectech/recipe/EyeOfHarmonyRecipe.java
index d217fe7db1..5447799afb 100644
--- a/src/main/java/com/github/technus/tectech/recipe/EyeOfHarmonyRecipe.java
+++ b/src/main/java/com/github/technus/tectech/recipe/EyeOfHarmonyRecipe.java
@@ -21,6 +21,7 @@ import net.minecraftforge.fluids.FluidStack;
import org.apache.commons.lang3.tuple.Pair;
+import com.github.technus.tectech.util.FluidStackLong;
import com.github.technus.tectech.util.ItemStackLong;
import gnu.trove.map.TMap;
@@ -37,12 +38,17 @@ import pers.gwyog.gtneioreplugin.util.GT5OreSmallHelper;
@SuppressWarnings("SpellCheckingInspection")
public class EyeOfHarmonyRecipe {
- static final FluidStack[] SPECIAL_FLUIDS = new FluidStack[] { MaterialsUEVplus.WhiteDwarfMatter.getMolten(1152),
- MaterialsUEVplus.WhiteDwarfMatter.getMolten(1152), MaterialsUEVplus.WhiteDwarfMatter.getMolten(4_608),
- MaterialsUEVplus.WhiteDwarfMatter.getMolten(18_432), MaterialsUEVplus.BlackDwarfMatter.getMolten(1152),
- MaterialsUEVplus.BlackDwarfMatter.getMolten(4_608), MaterialsUEVplus.BlackDwarfMatter.getMolten(18_432),
- MaterialsUEVplus.Universium.getMolten(1152), MaterialsUEVplus.Universium.getMolten(4_608),
- MaterialsUEVplus.Universium.getMolten(18_432) };
+ static final FluidStackLong[] SPECIAL_FLUIDS = new FluidStackLong[] {
+ new FluidStackLong(MaterialsUEVplus.WhiteDwarfMatter.getMolten(1_152), 1_152),
+ new FluidStackLong(MaterialsUEVplus.WhiteDwarfMatter.getMolten(1_152), 1_152),
+ new FluidStackLong(MaterialsUEVplus.WhiteDwarfMatter.getMolten(4_608), 4_608),
+ new FluidStackLong(MaterialsUEVplus.WhiteDwarfMatter.getMolten(18_432), 18_432),
+ new FluidStackLong(MaterialsUEVplus.BlackDwarfMatter.getMolten(1_152), 1_152),
+ new FluidStackLong(MaterialsUEVplus.BlackDwarfMatter.getMolten(4_608), 4_608),
+ new FluidStackLong(MaterialsUEVplus.BlackDwarfMatter.getMolten(18_432), 18_432),
+ new FluidStackLong(MaterialsUEVplus.Universium.getMolten(1_152), 1_152),
+ new FluidStackLong(MaterialsUEVplus.Universium.getMolten(4_608), 4_608),
+ new FluidStackLong(MaterialsUEVplus.Universium.getMolten(18_432), 18_432) };
HashingStrategy<ItemStack> itemStackHashingStrategy = new HashingStrategy<>() {
@@ -66,7 +72,7 @@ public class EyeOfHarmonyRecipe {
private final TMap<ItemStack, Long> itemStackToTrueStackSizeMap = new TCustomHashMap<>(itemStackHashingStrategy);
private final ArrayList<ItemStackLong> outputItems;
- private final ArrayList<FluidStack> outputFluids;
+ private final ArrayList<FluidStackLong> outputFluids;
private final long hydrogenRequirement;
private final long heliumRequirement;
@@ -137,25 +143,29 @@ public class EyeOfHarmonyRecipe {
// End item processing.
// --- Fluid handling ---
- ArrayList<FluidStack> fluidStackArrayList = new ArrayList<>();
+ ArrayList<FluidStackLong> fluidStackLongArrayList = new ArrayList<>();
+
+ int plasmaAmount = (int) ((this.spacetimeCasingTierRequired + 1) * 8_000_000L);
// If DeepDark then it should output all plasmas involved in making exotic catalyst.
if (rocketTier == 9) {
for (Materials material : VALID_PLASMAS) {
- fluidStackArrayList.add(material.getPlasma(1));
+ fluidStackLongArrayList.add(new FluidStackLong(material.getPlasma(plasmaAmount), plasmaAmount));
}
} else {
// --- Output and process fluids of the recipe.
- fluidStackArrayList.addAll(validPlasmaGenerator(materialList));
- }
-
- for (FluidStack fluidStack : fluidStackArrayList) {
- fluidStack.amount = (int) ((this.spacetimeCasingTierRequired + 1) * 8_000_000L);
+ ArrayList<FluidStack> fluidStackArrayList = new ArrayList<>(validPlasmaGenerator(materialList));
+ for (FluidStack fluidStack : fluidStackArrayList) {
+ fluidStack = new FluidStack(fluidStack, plasmaAmount);
+ fluidStackLongArrayList.add(new FluidStackLong(fluidStack, plasmaAmount));
+ }
}
// Add a bonus fluid of compressed star matter.
- fluidStackArrayList
- .add(MaterialsUEVplus.RawStarMatter.getFluid((this.spacetimeCasingTierRequired + 1) * 100_000));
+ fluidStackLongArrayList.add(
+ new FluidStackLong(
+ MaterialsUEVplus.RawStarMatter.getFluid((this.spacetimeCasingTierRequired + 1) * 100_000),
+ (this.spacetimeCasingTierRequired + 1) * 100_000));
// Tier 0 & 1 - 576 White
// Tier 2 - 2304 White
@@ -172,9 +182,9 @@ public class EyeOfHarmonyRecipe {
if (spacetimeTier == 0 || spacetimeTier == 9) {
spacetimeTier -= 1;
}
- fluidStackArrayList.add(SPECIAL_FLUIDS[spacetimeTier + 1]);
+ fluidStackLongArrayList.add(SPECIAL_FLUIDS[spacetimeTier + 1]);
- outputFluids = fluidStackArrayList;
+ outputFluids = fluidStackLongArrayList;
// --- End fluid handling ---.
this.hydrogenRequirement = hydrogenRequirement;
@@ -288,14 +298,14 @@ public class EyeOfHarmonyRecipe {
}
// Deep copy.
- public FluidStack[] getOutputFluids() {
- ArrayList<FluidStack> copyOutputList = new ArrayList<>();
+ public ArrayList<FluidStackLong> getOutputFluids() {
+ ArrayList<FluidStackLong> copyOutputList = new ArrayList<>();
- for (FluidStack fluidStack : outputFluids) {
- copyOutputList.add(fluidStack.copy());
+ for (FluidStackLong fluidStackLong : outputFluids) {
+ copyOutputList.add(new FluidStackLong(fluidStackLong));
}
- return copyOutputList.toArray(new FluidStack[0]);
+ return copyOutputList;
}
public long getHydrogenRequirement() {
@@ -428,12 +438,13 @@ public class EyeOfHarmonyRecipe {
return dustList;
}
- private static long plasmaCostCalculator(ArrayList<FluidStack> plasmas) {
+ private static long plasmaCostCalculator(ArrayList<FluidStackLong> plasmas) {
long total = 0;
- for (FluidStack plasma : plasmas) {
+ for (FluidStackLong plasma : plasmas) {
+ FluidStack plasmaFluid = plasma.getRegularFluidStack(plasma, 1);
try {
- String plasmaName = plasma.getFluid().getUnlocalizedName();
+ String plasmaName = plasmaFluid.getFluid().getUnlocalizedName();
total += plasmaEnergyMap.getOrDefault(plasmaName, 0L) * plasma.amount;
} catch (Exception e) {
e.printStackTrace();
diff --git a/src/main/java/com/github/technus/tectech/recipe/EyeOfHarmonyRecipeStorage.java b/src/main/java/com/github/technus/tectech/recipe/EyeOfHarmonyRecipeStorage.java
index 372d26a0bd..8aa801e153 100644
--- a/src/main/java/com/github/technus/tectech/recipe/EyeOfHarmonyRecipeStorage.java
+++ b/src/main/java/com/github/technus/tectech/recipe/EyeOfHarmonyRecipeStorage.java
@@ -10,9 +10,11 @@ import java.util.HashSet;
import net.minecraft.block.Block;
import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
import org.apache.commons.lang3.tuple.Pair;
+import com.github.technus.tectech.util.FluidStackLong;
import com.github.technus.tectech.util.ItemStackLong;
import com.google.common.math.LongMath;
@@ -99,6 +101,11 @@ public class EyeOfHarmonyRecipeStorage {
outputItems.add(itemStackLong.itemStack);
}
+ ArrayList<FluidStack> outputFluids = new ArrayList<>();
+ for (FluidStackLong fluidStackLong : recipe.getOutputFluids()) {
+ outputFluids.add(fluidStackLong.fluidStack);
+ }
+
ItemStack planetItem = recipe.getRecipeTriggerItem().copy();
planetItem.stackSize = 0;
@@ -109,7 +116,7 @@ public class EyeOfHarmonyRecipeStorage {
recipe,
null,
null,
- recipe.getOutputFluids(),
+ outputFluids.toArray(new FluidStack[0]),
(int) recipe.getRecipeTimeInTicks(),
0,
0);
diff --git a/src/main/java/com/github/technus/tectech/thing/CustomItemList.java b/src/main/java/com/github/technus/tectech/thing/CustomItemList.java
index 1fe7365757..6f19d13a24 100644
--- a/src/main/java/com/github/technus/tectech/thing/CustomItemList.java
+++ b/src/main/java/com/github/technus/tectech/thing/CustomItemList.java
@@ -429,7 +429,9 @@ public enum CustomItemList implements IItemContainer {
StabilisationFieldGeneratorTier5,
StabilisationFieldGeneratorTier6,
StabilisationFieldGeneratorTier7,
- StabilisationFieldGeneratorTier8;
+ StabilisationFieldGeneratorTier8,
+
+ astralArrayFabricator;
private ItemStack mStack;
private boolean mHasNotBeenSet = true;
diff --git a/src/main/java/com/github/technus/tectech/thing/item/AstralArrayFabricator.java b/src/main/java/com/github/technus/tectech/thing/item/AstralArrayFabricator.java
new file mode 100644
index 0000000000..04d55442c7
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/item/AstralArrayFabricator.java
@@ -0,0 +1,53 @@
+package com.github.technus.tectech.thing.item;
+
+import static com.github.technus.tectech.Reference.MODID;
+import static com.github.technus.tectech.TecTech.creativeTabTecTech;
+import static com.github.technus.tectech.thing.CustomItemList.astralArrayFabricator;
+import static net.minecraft.util.StatCollector.translateToLocal;
+
+import java.util.List;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+
+public class AstralArrayFabricator extends Item {
+
+ public static AstralArrayFabricator INSTANCE;
+
+ private AstralArrayFabricator() {
+ setHasSubtypes(false);
+ setUnlocalizedName("tm.itemAstralArrayFabricator");
+ setTextureName(MODID + ":itemAstralArray");
+ setCreativeTab(creativeTabTecTech);
+ }
+
+ @Override
+ public void addInformation(ItemStack aStack, EntityPlayer ep, List<String> aList, boolean boo) {
+ aList.add(EnumChatFormatting.GRAY + translateToLocal("item.tm.itemAstralArrayFabricator.desc1"));
+ aList.add(EnumChatFormatting.GRAY + translateToLocal("item.tm.itemAstralArrayFabricator.desc2"));
+ aList.add(EnumChatFormatting.GRAY + translateToLocal("item.tm.itemAstralArrayFabricator.desc3"));
+ aList.add(
+ EnumChatFormatting.AQUA.toString() + EnumChatFormatting.BOLD
+ + translateToLocal("item.tm.itemAstralArrayFabricator.desc0"));
+ }
+
+ public static void run() {
+ INSTANCE = new AstralArrayFabricator();
+ GameRegistry.registerItem(INSTANCE, INSTANCE.getUnlocalizedName());
+ astralArrayFabricator.set(INSTANCE);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerIcons(IIconRegister iconRegister) {
+ itemIcon = iconRegister.registerIcon(getIconString());
+ }
+
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_EyeOfHarmony.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_EyeOfHarmony.java
index ec251dc94a..5f39421f3f 100644
--- a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_EyeOfHarmony.java
+++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_EyeOfHarmony.java
@@ -1,6 +1,7 @@
package com.github.technus.tectech.thing.metaTileEntity.multi;
import static com.github.technus.tectech.TecTech.eyeOfHarmonyRecipeStorage;
+import static com.github.technus.tectech.thing.CustomItemList.astralArrayFabricator;
import static com.github.technus.tectech.thing.casing.GT_Block_CasingsTT.texturePage;
import static com.github.technus.tectech.thing.casing.TT_Container_Casings.eyeOfHarmonyRenderBlock;
import static com.github.technus.tectech.thing.casing.TT_Container_Casings.sBlockCasingsBA0;
@@ -17,6 +18,7 @@ import static gregtech.api.util.GT_Utility.formatNumbers;
import static java.lang.Math.*;
import static net.minecraft.util.EnumChatFormatting.*;
+import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
@@ -31,6 +33,7 @@ import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.ChatComponentText;
import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.MathHelper;
import net.minecraftforge.common.util.ForgeDirection;
import net.minecraftforge.fluids.FluidStack;
@@ -43,6 +46,7 @@ import com.github.technus.tectech.thing.casing.TT_Container_Casings;
import com.github.technus.tectech.thing.metaTileEntity.multi.base.GT_MetaTileEntity_MultiblockBase_EM;
import com.github.technus.tectech.thing.metaTileEntity.multi.base.render.TT_RenderedExtendedFacingTexture;
import com.github.technus.tectech.util.CommonValues;
+import com.github.technus.tectech.util.FluidStackLong;
import com.github.technus.tectech.util.ItemStackLong;
import com.google.common.collect.ImmutableList;
import com.google.common.math.LongMath;
@@ -78,7 +82,7 @@ public class GT_MetaTileEntity_EM_EyeOfHarmony extends GT_MetaTileEntity_Multibl
private static final long MOLTEN_SPACETIME_PER_FAILURE_TIER = 14_400L;
private static final double SPACETIME_FAILURE_BASE = 2;
private static final String TOOLTIP_BAR = GOLD
- + "------------------------------------------------------------------------------------";
+ + "---------------------------------------------------------------------------------------";
// Region variables.
private static Textures.BlockIcons.CustomIcon ScreenOFF;
@@ -92,13 +96,13 @@ public class GT_MetaTileEntity_EM_EyeOfHarmony extends GT_MetaTileEntity_Multibl
private static final double TIME_ACCEL_DECREASE_CHANCE_PER_TIER = 0.1;
// % Increase in recipe chance and % decrease in yield per tier.
private static final double STABILITY_INCREASE_PROBABILITY_DECREASE_YIELD_PER_TIER = 0.05;
- private static final double LOG_BASE_CONSTANT = Math.log(4.4);
-
+ private static final double LOG_CONSTANT = Math.log(1.7);
+ private static final double PARALLEL_MULTIPLIER_CONSTANT = 1.6 * 2 + 0.019 * Math.pow(2, 1.5);
+ private static final long POWER_DIVISION_CONSTANT = 18;
private static final int TOTAL_CASING_TIERS_WITH_POWER_PENALTY = 8;
private String userUUID = "";
- private long euOutput = 0;
-
+ private BigInteger outputEU_BigInt = BigInteger.ZERO;
private long startEU = 0;
@Override
@@ -741,43 +745,52 @@ public class GT_MetaTileEntity_EM_EyeOfHarmony extends GT_MetaTileEntity_Multibl
private double hydrogenOverflowProbabilityAdjustment;
private double heliumOverflowProbabilityAdjustment;
+ private double stellarPlasmaOverflowProbabilityAdjustment;
private static final long TICKS_BETWEEN_HATCH_DRAIN = EOH_DEBUG_MODE ? 10 : 20;
private List<ItemStackLong> outputItems = new ArrayList<>();
+ private List<FluidStackLong> outputFluids = new ArrayList<>();
- private void calculateHydrogenHeliumInputExcessValues(final long hydrogenRecipeRequirement,
+ private void calculateInputFluidExcessValues(final long hydrogenRecipeRequirement,
final long heliumRecipeRequirement) {
double hydrogenStored = validFluidMap.get(Materials.Hydrogen.getGas(1L));
double heliumStored = validFluidMap.get(Materials.Helium.getGas(1L));
+ double stellarPlasmaStored = validFluidMap.get(MaterialsUEVplus.RawStarMatter.getFluid(1L));
double hydrogenExcessPercentage = hydrogenStored / hydrogenRecipeRequirement - 1;
double heliumExcessPercentage = heliumStored / heliumRecipeRequirement - 1;
+ double stellarPlasmaExcessPercentage = stellarPlasmaStored
+ / (heliumRecipeRequirement * (9 / 1_000_000f) * parallelAmount) - 1;
hydrogenOverflowProbabilityAdjustment = 1 - exp(-pow(30 * hydrogenExcessPercentage, 2));
heliumOverflowProbabilityAdjustment = 1 - exp(-pow(30 * heliumExcessPercentage, 2));
+ stellarPlasmaOverflowProbabilityAdjustment = 1 - exp(-pow(30 * stellarPlasmaExcessPercentage, 2));
}
private double recipeChanceCalculator() {
double chance = currentRecipe.getBaseRecipeSuccessChance()
- timeAccelerationFieldMetadata * TIME_ACCEL_DECREASE_CHANCE_PER_TIER
- + stabilisationFieldMetadata * STABILITY_INCREASE_PROBABILITY_DECREASE_YIELD_PER_TIER
- - hydrogenOverflowProbabilityAdjustment
- - heliumOverflowProbabilityAdjustment;
+ + stabilisationFieldMetadata * STABILITY_INCREASE_PROBABILITY_DECREASE_YIELD_PER_TIER;
- return clamp(chance, 0.0, 1.0);
- }
+ if (parallelAmount > 1) {
+ chance -= stellarPlasmaOverflowProbabilityAdjustment;
+ } else {
+ chance -= (hydrogenOverflowProbabilityAdjustment + heliumOverflowProbabilityAdjustment);
+ }
- public static double clamp(double amount, double min, double max) {
- return Math.max(min, Math.min(amount, max));
+ return MathHelper.clamp_double(chance, 0.0, 1.0);
}
private double recipeYieldCalculator() {
- double yield = 1.0 - hydrogenOverflowProbabilityAdjustment
- - heliumOverflowProbabilityAdjustment
- - stabilisationFieldMetadata * STABILITY_INCREASE_PROBABILITY_DECREASE_YIELD_PER_TIER;
+ double yield = 1.0 - stabilisationFieldMetadata * STABILITY_INCREASE_PROBABILITY_DECREASE_YIELD_PER_TIER;
- return clamp(yield, 0.0, 1.0);
+ if (parallelAmount > 1) {
+ yield -= stellarPlasmaOverflowProbabilityAdjustment;
+ } else {
+ yield -= (hydrogenOverflowProbabilityAdjustment + heliumOverflowProbabilityAdjustment);
+ }
+ return MathHelper.clamp_double(yield, 0.0, 1.0);
}
private int recipeProcessTimeCalculator(final long recipeTime, final long recipeSpacetimeCasingRequired) {
@@ -950,13 +963,8 @@ public class GT_MetaTileEntity_EM_EyeOfHarmony extends GT_MetaTileEntity_Multibl
"is available the items/fluids will be " + UNDERLINE + DARK_RED + "voided" + RESET + GRAY + ".")
.addInfo(TOOLTIP_BAR)
.addInfo("This multiblock can be overclocked by placing a programmed circuit into the input bus.")
- .addInfo("Each OC halves recipe time and multiplies startup cost by a factor of:")
- .addInfo(GREEN + "(log4.4(overclockAmount + 1) + 1) * 0.77^overclockAmount")
.addInfo(
- "Furthermore, each OC decreases the power output by a factor of " + RED
- + "0.77^overclockAmount"
- + GRAY
- + ".")
+ "E.g. A circuit of 2 will provide 2 OCs, 16x EU consumed and 0.25x the time. All outputs are equal.")
.addInfo("All item and fluid output chances & amounts per recipe are unaffected.").addInfo(TOOLTIP_BAR)
.addInfo(
"If a recipe fails the EOH will output " + GREEN
@@ -970,6 +978,25 @@ public class GT_MetaTileEntity_EM_EyeOfHarmony extends GT_MetaTileEntity_Multibl
.addInfo(
MaterialsUEVplus.SpaceTime.getLocalizedNameForItem("%material")
+ " instead of fluid/item outputs and output as much EU as a successful recipe.")
+ .addInfo(TOOLTIP_BAR)
+ .addInfo(
+ "This multiblock can perform parallel processing by placing Astral Array Fabricators into the input bus.")
+ .addInfo("The amount of parallel is calculated via this formula:")
+ .addInfo(GREEN + "parallel = 2^(floor(log(8 * astralArrayAmount) / log(1.7)))")
+ .addInfo("If the EOH is running parallel recipes, the power calculation changes.")
+ .addInfo("The power needed for parallel processing is calculated as follows:")
+ .addInfo(
+ GREEN + "total EU = ((powerOutput * 2 - powerInput * (3.2 + 0.019 * 2^(1.5))) / 18) * 2.3^(log2(parallel) - 1)")
+ .addInfo(
+ "Furthermore, if parallel recipes are run, the recipes consume "
+ + MaterialsUEVplus.RawStarMatter.getLocalizedNameForItem("%material"))
+ .addInfo("instead of helium and hydrogen. Overflow penalties still apply.")
+ .addInfo(
+ "The required amount of fluid to start a recipe is " + GREEN
+ + "9 / 10^6 * heliumAmount * parallel"
+ + GRAY
+ + ".")
+ .addInfo("All item & fluid outputs including failure fluid are multiplied by the amount of parallel.")
.addInfo(TOOLTIP_BAR).addInfo("Animations can be disabled by using a screwdriver on the multiblock.")
.addSeparator().addStructureInfo("Eye of Harmony structure is too complex! See schematic for details.")
.addStructureInfo(
@@ -1035,6 +1062,7 @@ public class GT_MetaTileEntity_EM_EyeOfHarmony extends GT_MetaTileEntity_Multibl
{
put(Materials.Hydrogen.getGas(1), 0L);
put(Materials.Helium.getGas(1), 0L);
+ put(MaterialsUEVplus.RawStarMatter.getFluid(1), 0L);
}
};
@@ -1064,6 +1092,9 @@ public class GT_MetaTileEntity_EM_EyeOfHarmony extends GT_MetaTileEntity_Multibl
// Check for recipe every recipeCheckInterval ticks.
private static final long RECIPE_CHECK_INTERVAL = 3 * 20;
private long currentCircuitMultiplier = 0;
+ private long astralArrayAmount = 0;
+ private long parallelAmount = 1;
+ private BigInteger usedEU = BigInteger.ZERO;
@Override
@NotNull
@@ -1101,23 +1132,55 @@ public class GT_MetaTileEntity_EM_EyeOfHarmony extends GT_MetaTileEntity_Multibl
return validFluidMap.get(Materials.Helium.getGas(1));
}
+ private long getStellarPlasmaStored() {
+ return validFluidMap.get(MaterialsUEVplus.RawStarMatter.getFluid(1));
+ }
+
public CheckRecipeResult processRecipe(EyeOfHarmonyRecipe recipeObject) {
// Get circuit damage, clamp it and then use it later for overclocking.
for (ItemStack itemStack : mInputBusses.get(0).getRealInventory()) {
if (GT_Utility.isAnyIntegratedCircuit(itemStack)) {
- currentCircuitMultiplier = (long) clamp(itemStack.getItemDamage(), 0, 24);
+ currentCircuitMultiplier = MathHelper.clamp_int(itemStack.getItemDamage(), 0, 24);
break;
}
}
+ astralArrayAmount = 0;
+
+ for (ItemStack itemStack : mInputBusses.get(0).getRealInventory()) {
+ if (itemStack != null && itemStack.isItemEqual(astralArrayFabricator.get(1))) {
+ astralArrayAmount += itemStack.stackSize;
+ }
+ }
+
+ long parallelExponent = 1;
+
+ if (astralArrayAmount != 0) {
+ parallelExponent = (long) Math.floor(Math.log(8 * astralArrayAmount) / LOG_CONSTANT);
+ parallelAmount = (long) pow(2, parallelExponent);
+ } else {
+ parallelAmount = 1;
+ }
+
// Debug mode, overwrites the required fluids to initiate the recipe to 100L of each.
- if ((EOH_DEBUG_MODE && getHydrogenStored() < 100)
- || (getHydrogenStored() < currentRecipe.getHydrogenRequirement())) {
- return SimpleCheckRecipeResult.ofFailure("no_hydrogen");
+ if (parallelAmount > 1) {
+ if ((EOH_DEBUG_MODE && getStellarPlasmaStored() < 100) || (!EOH_DEBUG_MODE && getStellarPlasmaStored()
+ < currentRecipe.getHeliumRequirement() * (9 / 1_000_000f) * parallelAmount)) {
+ return SimpleCheckRecipeResult.ofFailure("no_stellarPlasma");
+ }
}
- if ((EOH_DEBUG_MODE && getHeliumStored() < 100) || (getHeliumStored() < currentRecipe.getHeliumRequirement())) {
- return SimpleCheckRecipeResult.ofFailure("no_helium");
+
+ if (parallelAmount == 1) {
+ if ((EOH_DEBUG_MODE && getHydrogenStored() < 100) || (!EOH_DEBUG_MODE
+ && getHydrogenStored() < currentRecipe.getHydrogenRequirement() * parallelAmount)) {
+ return SimpleCheckRecipeResult.ofFailure("no_hydrogen");
+ }
+
+ if ((EOH_DEBUG_MODE && getHeliumStored() < 100)
+ || (!EOH_DEBUG_MODE && getHeliumStored() < currentRecipe.getHeliumRequirement() * parallelAmount)) {
+ return SimpleCheckRecipeResult.ofFailure("no_helium");
+ }
}
if (spacetimeCompressionFieldMetadata == -1) {
@@ -1131,37 +1194,60 @@ public class GT_MetaTileEntity_EM_EyeOfHarmony extends GT_MetaTileEntity_Multibl
.insufficientMachineTier((int) recipeObject.getSpacetimeCasingTierRequired());
}
+ // Calculate multipliers used in power calculations
+ double powerMultiplier = Math.max(1, Math.pow(2.3, (parallelExponent - 1)));
+ long precisionMultiplier = (long) Math.pow(10, parallelExponent - 1);
+
+ // Determine EU recipe input
startEU = recipeObject.getEUStartCost();
+ // Determine EU recipe output
+ outputEU_BigInt = BigInteger.valueOf(recipeObject.getEUOutput());
+
+ double multiplier = 1;
+
+ // Calculate actual EU values
+ if (parallelAmount > 1) {
+ multiplier = PARALLEL_MULTIPLIER_CONSTANT / POWER_DIVISION_CONSTANT;
+ outputEU_BigInt = outputEU_BigInt
+ .multiply(
+ BigInteger.valueOf(
+ (long) (1 - ((TOTAL_CASING_TIERS_WITH_POWER_PENALTY - stabilisationFieldMetadata)
+ * STABILITY_INCREASE_PROBABILITY_DECREASE_YIELD_PER_TIER)) * 100))
+ .divide(BigInteger.valueOf(9 * 100))
+ .multiply(BigInteger.valueOf((long) (powerMultiplier * precisionMultiplier)))
+ .divide(BigInteger.valueOf(precisionMultiplier));
+ }
+ usedEU = BigInteger.valueOf((long) (-startEU * multiplier))
+ .multiply(
+ BigInteger.valueOf((long) Math.pow(4, currentCircuitMultiplier))
+ .multiply(BigInteger.valueOf((long) (powerMultiplier * precisionMultiplier))))
+ .divide(BigInteger.valueOf(precisionMultiplier));
+
// Remove EU from the users network.
- long usedEU = (long) (-startEU * (Math.log(currentCircuitMultiplier + 1) / LOG_BASE_CONSTANT + 1)
- * pow(0.77, currentCircuitMultiplier));
if (!addEUToGlobalEnergyMap(userUUID, usedEU)) {
- return CheckRecipeResultRegistry.insufficientPower(usedEU);
+ return SimpleCheckRecipeResult.ofFailure("insufficient_power_no_val");
}
mMaxProgresstime = recipeProcessTimeCalculator(
recipeObject.getRecipeTimeInTicks(),
recipeObject.getSpacetimeCasingTierRequired());
- calculateHydrogenHeliumInputExcessValues(
- recipeObject.getHydrogenRequirement(),
- recipeObject.getHeliumRequirement());
+ calculateInputFluidExcessValues(recipeObject.getHydrogenRequirement(), recipeObject.getHeliumRequirement());
if (EOH_DEBUG_MODE) {
hydrogenOverflowProbabilityAdjustment = 0;
heliumOverflowProbabilityAdjustment = 0;
+ stellarPlasmaOverflowProbabilityAdjustment = 0;
}
successChance = recipeChanceCalculator();
currentRecipeRocketTier = currentRecipe.getRocketTier();
- // Determine EU recipe output.
- euOutput = (long) (recipeObject.getEUOutput() * pow(0.77, currentCircuitMultiplier));
-
- // Reduce internal storage by hydrogen and helium quantity required for recipe.
+ // Reduce internal storage by input fluid quantity required for recipe.
validFluidMap.put(Materials.Hydrogen.getGas(1), 0L);
validFluidMap.put(Materials.Helium.getGas(1), 0L);
+ validFluidMap.put(MaterialsUEVplus.RawStarMatter.getFluid(1), 0L);
double yield = recipeYieldCalculator();
if (EOH_DEBUG_MODE) {
@@ -1169,19 +1255,17 @@ public class GT_MetaTileEntity_EM_EyeOfHarmony extends GT_MetaTileEntity_Multibl
}
// Return copies of the output objects.
- mOutputFluids = recipeObject.getOutputFluids();
+ outputFluids = recipeObject.getOutputFluids();
outputItems = recipeObject.getOutputItems();
- if (yield != 1.0) {
- // Iterate over item output list and apply yield values.
- for (ItemStackLong itemStackLong : outputItems) {
- itemStackLong.stackSize *= yield;
- }
+ // Iterate over item output list and apply yield & parallel values.
+ for (ItemStackLong itemStackLong : outputItems) {
+ itemStackLong.stackSize *= yield * parallelAmount;
+ }
- // Iterate over fluid output list and apply yield values.
- for (FluidStack fluidStack : mOutputFluids) {
- fluidStack.amount *= yield;
- }
+ // Iterate over fluid output list and apply yield & parallel values.
+ for (FluidStackLong fluidStackLong : outputFluids) {
+ fluidStackLong.amount *= yield * parallelAmount;
}
updateSlots();
@@ -1230,9 +1314,10 @@ public class GT_MetaTileEntity_EM_EyeOfHarmony extends GT_MetaTileEntity_Multibl
private void outputFailedChance() {
// 2^Tier spacetime released upon recipe failure.
- mOutputFluids = new FluidStack[] { MaterialsUEVplus.SpaceTime.getMolten(
+ outputFluidToAENetwork(
+ MaterialsUEVplus.SpaceTime.getMolten(1),
(long) (successChance * MOLTEN_SPACETIME_PER_FAILURE_TIER
- * pow(SPACETIME_FAILURE_BASE, currentRecipeRocketTier + 1))) };
+ * pow(SPACETIME_FAILURE_BASE, currentRecipeRocketTier + 1)) * parallelAmount);
super.outputAfterRecipe_EM();
}
@@ -1263,13 +1348,11 @@ public class GT_MetaTileEntity_EM_EyeOfHarmony extends GT_MetaTileEntity_Multibl
destroyRenderBlock();
- // Output power with stabilization factor (5% loss per tier below gallifreyan)
- addEUToGlobalEnergyMap(
- userUUID,
- (long) (euOutput * (1 - ((TOTAL_CASING_TIERS_WITH_POWER_PENALTY - stabilisationFieldMetadata)
- * STABILITY_INCREASE_PROBABILITY_DECREASE_YIELD_PER_TIER))));
+ // Output EU
+ addEUToGlobalEnergyMap(userUUID, outputEU_BigInt);
+
startEU = 0;
- euOutput = 0;
+ outputEU_BigInt = BigInteger.ZERO;
if (successChance < random()) {
outputFailedChance();
@@ -1281,8 +1364,13 @@ public class GT_MetaTileEntity_EM_EyeOfHarmony extends GT_MetaTileEntity_Multibl
outputItemToAENetwork(itemStack.itemStack, itemStack.stackSize);
}
+ for (FluidStackLong fluidStack : outputFluids) {
+ outputFluidToAENetwork(fluidStack.fluidStack, fluidStack.amount);
+ }
+
// Clear the array list for new recipes.
outputItems = new ArrayList<>();
+ outputFluids = new ArrayList<>();
// Do other stuff from TT superclasses. E.g. outputting fluids.
super.outputAfterRecipe_EM();
@@ -1332,6 +1420,30 @@ public class GT_MetaTileEntity_EM_EyeOfHarmony extends GT_MetaTileEntity_Multibl
}
}
+ private void outputFluidToAENetwork(FluidStack fluid, long amount) {
+
+ if ((fluid == null) || (amount <= 0)) {
+ return;
+ }
+
+ if (amount < Integer.MAX_VALUE) {
+ FluidStack tmpFluid = fluid.copy();
+ tmpFluid.amount = (int) amount;
+ ((GT_MetaTileEntity_Hatch_Output_ME) mOutputHatches.get(0)).tryFillAE(tmpFluid);
+ } else {
+ // For fluidStacks > Int max.
+ while (amount >= Integer.MAX_VALUE) {
+ FluidStack tmpFluid = fluid.copy();
+ tmpFluid.amount = Integer.MAX_VALUE;
+ ((GT_MetaTileEntity_Hatch_Output_ME) mOutputHatches.get(0)).tryFillAE(tmpFluid);
+ amount -= Integer.MAX_VALUE;
+ }
+ FluidStack tmpFluid = fluid.copy();
+ tmpFluid.amount = (int) amount;
+ ((GT_MetaTileEntity_Hatch_Output_ME) mOutputHatches.get(0)).tryFillAE(tmpFluid);
+ }
+ }
+
@Override
public String[] getInfoData() {
ArrayList<String> str = new ArrayList<>(Arrays.asList(super.getInfoData()));
@@ -1346,33 +1458,25 @@ public class GT_MetaTileEntity_EM_EyeOfHarmony extends GT_MetaTileEntity_Multibl
str.add(GOLD + "---------------------- Other Stats ---------------");
str.add("Recipe Success Chance: " + RED + formatNumbers(100 * successChance) + RESET + "%");
str.add("Recipe Yield: " + RED + formatNumbers(100 * recipeYieldCalculator()) + RESET + "%");
- str.add(
- "EU Output: " + RED
- + formatNumbers(
- euOutput * (1
- - ((TOTAL_CASING_TIERS_WITH_POWER_PENALTY - stabilisationFieldMetadata)
- * STABILITY_INCREASE_PROBABILITY_DECREASE_YIELD_PER_TIER)))
- + RESET
- + " EU");
- if (mOutputFluids.length > 0) {
+ str.add("Astral Array Fabricators detected: " + RED + formatNumbers(astralArrayAmount));
+ str.add("Total Parallel: " + RED + formatNumbers(parallelAmount));
+ str.add("EU Output: " + RED + formatNumbers(outputEU_BigInt) + RESET + " EU");
+ if (outputFluids.size() > 0) {
// Star matter is always the last element in the array.
str.add(
"Estimated Star Matter Output: " + RED
- + formatNumbers(mOutputFluids[mOutputFluids.length - 1].amount)
+ + formatNumbers(outputFluids.get(outputFluids.size() - 1).amount)
+ RESET
+ " L");
}
- long euPerTick = (long) (startEU * (Math.log(currentCircuitMultiplier + 1) / LOG_BASE_CONSTANT + 1)
- * pow(0.77, currentCircuitMultiplier)
- - euOutput * (1 - ((TOTAL_CASING_TIERS_WITH_POWER_PENALTY - stabilisationFieldMetadata)
- * STABILITY_INCREASE_PROBABILITY_DECREASE_YIELD_PER_TIER)))
- / -maxProgresstime();
- if (abs(euPerTick) < LongMath.pow(10, 12)) {
+ BigInteger euPerTick = (outputEU_BigInt.subtract(usedEU.abs()))
+ .divide(BigInteger.valueOf(maxProgresstime()));
+ if (abs(euPerTick.longValue()) < LongMath.pow(10, 12)) {
str.add("Estimated EU/t: " + RED + formatNumbers(euPerTick) + RESET + " EU/t");
} else {
str.add(
"Estimated EU/t: " + RED
- + ReadableNumberConverter.INSTANCE.toWideReadableForm(euPerTick)
+ + ReadableNumberConverter.INSTANCE.toWideReadableForm(euPerTick.longValue())
+ RESET
+ " EU/t");
}
@@ -1389,17 +1493,23 @@ public class GT_MetaTileEntity_EM_EyeOfHarmony extends GT_MetaTileEntity_Multibl
// NBT save/load strings.
private static final String EYE_OF_HARMONY = "eyeOfHarmonyOutput";
private static final String NUMBER_OF_ITEMS_NBT_TAG = EYE_OF_HARMONY + "numberOfItems";
+ private static final String NUMBER_OF_FLUIDS_NBT_TAG = EYE_OF_HARMONY + "numberOfFluids";
private static final String ITEM_OUTPUT_NBT_TAG = EYE_OF_HARMONY + "itemOutput";
+ private static final String FLUID_OUTPUT_NBT_TAG = EYE_OF_HARMONY + "fluidOutput";
private static final String RECIPE_RUNNING_NBT_TAG = EYE_OF_HARMONY + "recipeRunning";
- private static final String RECIPE_EU_OUTPUT_NBT_TAG = EYE_OF_HARMONY + "euOutput";
private static final String RECIPE_SUCCESS_CHANCE_NBT_TAG = EYE_OF_HARMONY + "recipeSuccessChance";
private static final String ROCKET_TIER_NBT_TAG = EYE_OF_HARMONY + "rocketTier";
private static final String CURRENT_CIRCUIT_MULTIPLIER_TAG = EYE_OF_HARMONY + "currentCircuitMultiplier";
private static final String ANIMATIONS_ENABLED = EYE_OF_HARMONY + "animationsEnabled";
+ private static final String CALCULATED_EU_OUTPUT_NBT_TAG = EYE_OF_HARMONY + "outputEU_BigInt";
+ private static final String PARALLEL_AMOUNT_NBT_TAG = EYE_OF_HARMONY + "parallelAmount";
+ private static final String ASTRAL_ARRAY_AMOUNT_NBT_TAG = EYE_OF_HARMONY + "astralArrayAmount";
// Sub tags, less specific names required.
private static final String STACK_SIZE = "stackSize";
private static final String ITEM_STACK_NBT_TAG = "itemStack";
+ private static final String FLUID_AMOUNT = "fluidAmount";
+ private static final String FLUID_STACK_NBT_TAG = "fluidStack";
@Override
public void saveNBTData(NBTTagCompound aNBT) {
@@ -1407,11 +1517,13 @@ public class GT_MetaTileEntity_EM_EyeOfHarmony extends GT_MetaTileEntity_Multibl
validFluidMap.forEach((key, value) -> aNBT.setLong("stored." + key.getUnlocalizedName(), value));
aNBT.setBoolean(RECIPE_RUNNING_NBT_TAG, recipeRunning);
- aNBT.setLong(RECIPE_EU_OUTPUT_NBT_TAG, euOutput);
aNBT.setDouble(RECIPE_SUCCESS_CHANCE_NBT_TAG, successChance);
aNBT.setLong(ROCKET_TIER_NBT_TAG, currentRecipeRocketTier);
aNBT.setLong(CURRENT_CIRCUIT_MULTIPLIER_TAG, currentCircuitMultiplier);
aNBT.setBoolean(ANIMATIONS_ENABLED, animationsEnabled);
+ aNBT.setLong(PARALLEL_AMOUNT_NBT_TAG, parallelAmount);
+ aNBT.setLong(ASTRAL_ARRAY_AMOUNT_NBT_TAG, astralArrayAmount);
+ aNBT.setByteArray(CALCULATED_EU_OUTPUT_NBT_TAG, outputEU_BigInt.toByteArray());
// Store damage values/stack sizes of GT items being outputted.
NBTTagCompound itemStackListNBTTag = new NBTTagCompound();
@@ -1430,6 +1542,23 @@ public class GT_MetaTileEntity_EM_EyeOfHarmony extends GT_MetaTileEntity_Multibl
aNBT.setTag(ITEM_OUTPUT_NBT_TAG, itemStackListNBTTag);
+ // Store damage values/stack sizes of GT fluida being outputted.
+ NBTTagCompound fluidStackListNBTTag = new NBTTagCompound();
+ fluidStackListNBTTag.setLong(NUMBER_OF_FLUIDS_NBT_TAG, outputFluids.size());
+
+ int indexFluids = 0;
+ for (FluidStackLong fluidStackLong : outputFluids) {
+ // Save fluid amount to NBT.
+ fluidStackListNBTTag.setLong(indexFluids + FLUID_AMOUNT, fluidStackLong.amount);
+
+ // Save FluidStack to NBT.
+ aNBT.setTag(indexFluids + FLUID_STACK_NBT_TAG, fluidStackLong.fluidStack.writeToNBT(new NBTTagCompound()));
+
+ indexFluids++;
+ }
+
+ aNBT.setTag(FLUID_OUTPUT_NBT_TAG, fluidStackListNBTTag);
+
super.saveNBTData(aNBT);
}
@@ -1442,11 +1571,13 @@ public class GT_MetaTileEntity_EM_EyeOfHarmony extends GT_MetaTileEntity_Multibl
// Load other stuff from NBT.
recipeRunning = aNBT.getBoolean(RECIPE_RUNNING_NBT_TAG);
- euOutput = aNBT.getLong(RECIPE_EU_OUTPUT_NBT_TAG);
successChance = aNBT.getDouble(RECIPE_SUCCESS_CHANCE_NBT_TAG);
currentRecipeRocketTier = aNBT.getLong(ROCKET_TIER_NBT_TAG);
currentCircuitMultiplier = aNBT.getLong(CURRENT_CIRCUIT_MULTIPLIER_TAG);
animationsEnabled = aNBT.getBoolean(ANIMATIONS_ENABLED);
+ parallelAmount = aNBT.getLong(PARALLEL_AMOUNT_NBT_TAG);
+ astralArrayAmount = aNBT.getLong(ASTRAL_ARRAY_AMOUNT_NBT_TAG);
+ outputEU_BigInt = new BigInteger(aNBT.getByteArray(CALCULATED_EU_OUTPUT_NBT_TAG));
// Load damage values/stack sizes of GT items being outputted and convert back to items.
NBTTagCompound tempItemTag = aNBT.getCompoundTag(ITEM_OUTPUT_NBT_TAG);
@@ -1463,6 +1594,22 @@ public class GT_MetaTileEntity_EM_EyeOfHarmony extends GT_MetaTileEntity_Multibl
outputItems.add(new ItemStackLong(itemStack, stackSize));
}
+ // Load damage values/fluid amounts of GT fluids being outputted and convert back to fluids.
+ NBTTagCompound tempFluidTag = aNBT.getCompoundTag(FLUID_OUTPUT_NBT_TAG);
+
+ // Iterate over all stored fluids.
+ for (int indexFluids = 0; indexFluids < tempFluidTag.getInteger(NUMBER_OF_FLUIDS_NBT_TAG); indexFluids++) {
+
+ // Load fluid amount from NBT.
+ long fluidAmount = tempFluidTag.getLong(indexFluids + FLUID_AMOUNT);
+
+ // Load FluidStack from NBT.
+ FluidStack fluidStack = FluidStack
+ .loadFluidStackFromNBT(aNBT.getCompoundTag(indexFluids + FLUID_STACK_NBT_TAG));
+
+ outputFluids.add(new FluidStackLong(fluidStack, fluidAmount));
+ }
+
super.loadNBTData(aNBT);
}
}
diff --git a/src/main/java/com/github/technus/tectech/util/FluidStackLong.java b/src/main/java/com/github/technus/tectech/util/FluidStackLong.java
new file mode 100644
index 0000000000..abd0134e85
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/util/FluidStackLong.java
@@ -0,0 +1,29 @@
+package com.github.technus.tectech.util;
+
+import net.minecraftforge.fluids.FluidStack;
+
+public class FluidStackLong {
+
+ public final FluidStack fluidStack;
+ public long amount;
+
+ public FluidStackLong(FluidStack fluidStack, long amount) {
+ this.fluidStack = fluidStack;
+ this.amount = amount;
+ }
+
+ // Copy constructor.
+ public FluidStackLong(FluidStackLong fluidStackLong) {
+ this.fluidStack = fluidStackLong.fluidStack;
+ this.amount = fluidStackLong.amount;
+ }
+
+ public long getFluidAmount() {
+ return amount;
+ }
+
+ public FluidStack getRegularFluidStack(FluidStackLong fluidStackLong, int amount) {
+ return new FluidStack(fluidStackLong.fluidStack, amount);
+ }
+
+}
diff --git a/src/main/resources/assets/tectech/lang/en_US.lang b/src/main/resources/assets/tectech/lang/en_US.lang
index 8fc11ec9dc..f5ccf9bcbc 100644
--- a/src/main/resources/assets/tectech/lang/en_US.lang
+++ b/src/main/resources/assets/tectech/lang/en_US.lang
@@ -101,6 +101,12 @@ item.tm.powerpassupgradecover.desc.0=Add power pass functionality to TecTech Mul
item.tm.powerpassupgradecover.desc.1=Active transformer in a can??
item.tm.powerpassupgradecover.desc.2=Chain them up like Christmas lights!
+item.tm.itemAstralArrayFabricator.name=Astral Array Fabricator
+item.tm.itemAstralArrayFabricator.desc0=Parallel dimensions?!
+item.tm.itemAstralArrayFabricator.desc1=Device capable of enhancing the Eye of Harmony's spatial compression,
+item.tm.itemAstralArrayFabricator.desc2=reaching into the space beyond.
+item.tm.itemAstralArrayFabricator.desc3=Allows for recipe parallelism.
+
#Death Messages
death.attack.microwaving=%1$s was dehydrated by radiation.
death.attack.microwaving.player=%1$s was dehydrated by radiation while fighting %2$s.
@@ -973,12 +979,14 @@ GT5U.gui.text.no_data=§7Can't output data
GT5U.gui.text.no_planet_block=§7Missing planet block
GT5U.gui.text.no_helium=§7Not enough Helium
GT5U.gui.text.no_hydrogen=§7Not enough Hydrogen
+GT5U.gui.text.no_stellar_plasma=§7Not enough Stellar Plasma
GT5U.gui.text.invalid_hysteresis=§7Invalid hysteresis settings
GT5U.gui.text.invalid_transfer_radius=§7Invalid transfer radius settings
GT5U.gui.text.invalid_voltage_setting=§7Invalid voltage setting
GT5U.gui.text.invalid_current_setting=§7Invalid current setting
GT5U.gui.text.invalid_time_setting=§7Invalid time setting
GT5U.gui.text.invalid_overdrive_setting=§7Invalid overdrive setting
+GT5U.gui.text.insufficient_power_no_val=§7Insufficient power
#Keywords and phrases
#Example: ID:3
diff --git a/src/main/resources/assets/tectech/textures/items/itemAstralArray.png b/src/main/resources/assets/tectech/textures/items/itemAstralArray.png
new file mode 100644
index 0000000000..b6dd9a88e6
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/items/itemAstralArray.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/items/itemAstralArray.png.mcmeta b/src/main/resources/assets/tectech/textures/items/itemAstralArray.png.mcmeta
new file mode 100644
index 0000000000..24f863c95e
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/items/itemAstralArray.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":3
+ }
+} \ No newline at end of file