diff options
author | Alexdoru <57050655+Alexdoru@users.noreply.github.com> | 2024-10-09 18:11:00 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-10-09 18:11:00 +0200 |
commit | d2a9ed7be356fda78de11a5bceedec501a9f1ffc (patch) | |
tree | 68e0141f05d6f52b53c2906c2a6deeacfac05d36 /src/main | |
parent | b27b4c35fb01bdabe29abf780486475e2d758e9c (diff) | |
download | GT5-Unofficial-d2a9ed7be356fda78de11a5bceedec501a9f1ffc.tar.gz GT5-Unofficial-d2a9ed7be356fda78de11a5bceedec501a9f1ffc.tar.bz2 GT5-Unofficial-d2a9ed7be356fda78de11a5bceedec501a9f1ffc.zip |
Remove tremendous and useless RAM allocation from GT++ algae pond recipes (#3338)
Diffstat (limited to 'src/main')
4 files changed, 141 insertions, 309 deletions
diff --git a/src/main/java/gtPlusPlus/api/objects/data/WeightedCollection.java b/src/main/java/gtPlusPlus/api/objects/data/WeightedCollection.java deleted file mode 100644 index 6a14b97e0b..0000000000 --- a/src/main/java/gtPlusPlus/api/objects/data/WeightedCollection.java +++ /dev/null @@ -1,102 +0,0 @@ -package gtPlusPlus.api.objects.data; - -import java.util.Collection; -import java.util.Map; -import java.util.NavigableMap; -import java.util.Random; -import java.util.Set; -import java.util.TreeMap; - -import gregtech.api.objects.XSTR; - -public class WeightedCollection<E> implements Map<Integer, E> { - - private final NavigableMap<Integer, E> map = new TreeMap<>(); - private final Random random; - private int total = 0; - - public WeightedCollection() { - this(new XSTR()); - } - - public WeightedCollection(Random random) { - this.random = random; - } - - public E add(int weight, E object) { - if (weight <= 0) return null; - total += weight; - return map.put(total, object); - } - - private E next() { - int value = random.nextInt(total) + 1; // Can also use floating-point weights - return map.ceilingEntry(value) - .getValue(); - } - - @Override - public int size() { - return map.size(); - } - - @Override - public boolean isEmpty() { - return map.isEmpty(); - } - - @Override - public boolean containsKey(Object key) { - return map.containsKey(key); - } - - @Override - public boolean containsValue(Object value) { - return map.containsValue(value); - } - - public E get() { - return next(); - } - - @Override - public E get(Object key) { - return next(); - } - - @Override - public void putAll(Map m) { - map.putAll(m); - } - - @Override - public void clear() { - map.clear(); - this.total = 0; - } - - @Override - public Set keySet() { - return map.keySet(); - } - - @Override - public Collection values() { - return map.values(); - } - - @Override - public Set entrySet() { - return map.entrySet(); - } - - @Override - public E put(Integer key, E value) { - return add(key, value); - } - - @Override - public E remove(Object key) { - return map.remove(key); - } -} diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/HandlerGT.java b/src/main/java/gtPlusPlus/xmod/gregtech/HandlerGT.java index 2db9a1e80c..c42061478d 100644 --- a/src/main/java/gtPlusPlus/xmod/gregtech/HandlerGT.java +++ b/src/main/java/gtPlusPlus/xmod/gregtech/HandlerGT.java @@ -20,7 +20,6 @@ import gtPlusPlus.xmod.gregtech.loaders.GTPPBlocks; import gtPlusPlus.xmod.gregtech.loaders.ProcessingAngleGrinder; import gtPlusPlus.xmod.gregtech.loaders.ProcessingElectricSnips; import gtPlusPlus.xmod.gregtech.loaders.misc.AddCustomMachineToPA; -import gtPlusPlus.xmod.gregtech.loaders.recipe.RecipeLoaderAlgaeFarm; import gtPlusPlus.xmod.gregtech.loaders.recipe.RecipeLoaderMolecularTransformer; import gtPlusPlus.xmod.gregtech.loaders.recipe.RecipeLoaderTreeFarm; import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechConduits; @@ -85,7 +84,6 @@ public class HandlerGT { public static void onLoadComplete(FMLLoadCompleteEvent event) { CokeAndPyrolyseOven.onLoadComplete(); MetaGTProxy.fixIC2FluidNames(); - RecipeLoaderAlgaeFarm.generateRecipes(); RecipeLoaderTreeFarm.generateRecipes(); RecipeLoaderMolecularTransformer.run(); } diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/algae/MTEAlgaePondBase.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/algae/MTEAlgaePondBase.java index 6b266908ce..01369df1f3 100644 --- a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/algae/MTEAlgaePondBase.java +++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/algae/MTEAlgaePondBase.java @@ -9,6 +9,7 @@ import static gregtech.api.enums.HatchElement.InputHatch; import static gregtech.api.enums.HatchElement.OutputBus; import static gregtech.api.util.GTStructureUtility.buildHatchAdder; +import java.util.ArrayList; import java.util.stream.Stream; import javax.annotation.Nonnull; @@ -30,6 +31,7 @@ import com.gtnewhorizon.structurelib.structure.StructureDefinition; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import gregtech.api.GregTechAPI; +import gregtech.api.enums.GTValues; import gregtech.api.enums.SoundResource; import gregtech.api.enums.TAE; import gregtech.api.interfaces.IIconContainer; @@ -51,17 +53,19 @@ import gtPlusPlus.core.block.ModBlocks; import gtPlusPlus.core.config.Configuration; import gtPlusPlus.core.item.chemistry.AgriculturalChem; import gtPlusPlus.core.lib.GTPPCore; +import gtPlusPlus.core.util.math.MathUtils; import gtPlusPlus.core.util.minecraft.FluidUtils; import gtPlusPlus.core.util.minecraft.ItemUtils; import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GTPPMultiBlockBase; import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock; -import gtPlusPlus.xmod.gregtech.loaders.recipe.RecipeLoaderAlgaeFarm; import ic2.core.init.BlocksItems; import ic2.core.init.InternalName; import tectech.thing.casing.TTCasingsContainer; public class MTEAlgaePondBase extends GTPPMultiBlockBase<MTEAlgaePondBase> implements ISurvivalConstructable { + // TODO add a NEI handler for this machine + private int mLevel = -1; private int mCasing; private static IStructureDefinition<MTEAlgaePondBase> STRUCTURE_DEFINITION = null; @@ -336,8 +340,7 @@ public class MTEAlgaePondBase extends GTPPMultiBlockBase<MTEAlgaePondBase> imple @Nonnull @Override protected Stream<GTRecipe> findRecipeMatches(@Nullable RecipeMap<?> map) { - return GTStreamUtil - .ofNullable(RecipeLoaderAlgaeFarm.getTieredRecipeFromCache(mLevel, isUsingCompost(inputItems))); + return GTStreamUtil.ofNullable(getTieredRecipe(mLevel, inputItems)); } @NotNull @@ -352,18 +355,6 @@ public class MTEAlgaePondBase extends GTPPMultiBlockBase<MTEAlgaePondBase> imple .setMaxParallelSupplier(this::getMaxParallelRecipes); } - private boolean isUsingCompost(ItemStack[] aItemInputs) { - ItemStack aCompost = ItemUtils.getSimpleStack(AgriculturalChem.mCompost, 1); - for (ItemStack i : aItemInputs) { - if (GTUtility.areStacksEqual(aCompost, i)) { - if (i.stackSize >= RecipeLoaderAlgaeFarm.compostForTier(mLevel)) { - return true; - } - } - } - return false; - } - private int getCasingTier() { if (this.getBaseMetaTileEntity() .getWorld() == null) { @@ -398,4 +389,139 @@ public class MTEAlgaePondBase extends GTPPMultiBlockBase<MTEAlgaePondBase> imple protected SoundResource getActivitySoundLoop() { return SoundResource.GT_MACHINES_ALGAE_LOOP; } + + private static GTRecipe getTieredRecipe(int aTier, ItemStack[] aItemInputs) { + return generateBaseRecipe(aTier, isUsingCompost(aItemInputs, aTier)); + } + + private static boolean isUsingCompost(ItemStack[] aItemInputs, int aTier) { + ItemStack aCompost = ItemUtils.getSimpleStack(AgriculturalChem.mCompost, 1); + final int compostForTier = compostForTier(aTier); + int compostFound = 0; + for (ItemStack i : aItemInputs) { + if (GTUtility.areStacksEqual(aCompost, i)) { + compostFound += i.stackSize; + if (compostFound >= compostForTier) { + return true; + } + } + } + return false; + } + + private static int compostForTier(int aTier) { + return aTier > 1 ? (int) Math.min(64, Math.pow(2, aTier - 1)) : 1; + } + + private static GTRecipe generateBaseRecipe(int aTier, boolean isUsingCompost) { + + if (aTier < 0) return null; // Type Safety + + final ItemStack[] aInputs; + if (isUsingCompost) { + // Make it use 4 compost per tier if we have some available + // Compost consumption maxes out at 1 stack per cycle + ItemStack aCompost = ItemUtils.getSimpleStack(AgriculturalChem.mCompost, compostForTier(aTier)); + aInputs = new ItemStack[] { aCompost }; + // Boost Tier by one if using compost, so it gets a speed boost + aTier++; + } else { + aInputs = new ItemStack[] {}; + } + + ItemStack[] aOutputs = getOutputsForTier(aTier); + GTRecipe tRecipe = new GTRecipe( + false, + aInputs, + aOutputs, + null, + new int[] {}, + new FluidStack[] { GTValues.NF }, + new FluidStack[] { GTValues.NF }, + getRecipeDuration(aTier), + 0, + 0); + tRecipe.mSpecialValue = tRecipe.hashCode(); + return tRecipe; + } + + private static final int[] aDurations = new int[] { 2000, 1800, 1600, 1400, 1200, 1000, 512, 256, 128, 64, 32, 16, + 8, 4, 2, 1 }; + + private static int getRecipeDuration(int aTier) { + final float randFloat = GTPPCore.RANDOM.nextFloat(); + float randMult; + if (randFloat < 0.96237624) randMult = 1f; + else if (randFloat < 0.9912871) randMult = 2f; + else randMult = 3f; + return (int) (aDurations[aTier] * randMult / 2); + } + + private static ItemStack[] getOutputsForTier(int aTier) { + ArrayList<ItemStack> outputList = new ArrayList<>(); + + if (aTier >= 0) { + outputList.add(ItemUtils.getSimpleStack(AgriculturalChem.mAlgaeBiosmass, 2)); + outputList.add(ItemUtils.getSimpleStack(AgriculturalChem.mAlgaeBiosmass, 4)); + if (MathUtils.randInt(0, 10) > 9) { + outputList.add(ItemUtils.getSimpleStack(AgriculturalChem.mGreenAlgaeBiosmass, 2)); + } + } + if (aTier >= 1) { + outputList.add(ItemUtils.getSimpleStack(AgriculturalChem.mAlgaeBiosmass, 4)); + outputList.add(ItemUtils.getSimpleStack(AgriculturalChem.mGreenAlgaeBiosmass, 2)); + if (MathUtils.randInt(0, 10) > 9) { + outputList.add(ItemUtils.getSimpleStack(AgriculturalChem.mGreenAlgaeBiosmass, 4)); + } + } + if (aTier >= 2) { + outputList.add(ItemUtils.getSimpleStack(AgriculturalChem.mGreenAlgaeBiosmass, 2)); + outputList.add(ItemUtils.getSimpleStack(AgriculturalChem.mGreenAlgaeBiosmass, 3)); + if (MathUtils.randInt(0, 10) > 9) { + outputList.add(ItemUtils.getSimpleStack(AgriculturalChem.mGreenAlgaeBiosmass, 8)); + } + } + if (aTier >= 3) { + outputList.add(ItemUtils.getSimpleStack(AgriculturalChem.mGreenAlgaeBiosmass, 4)); + outputList.add(ItemUtils.getSimpleStack(AgriculturalChem.mBrownAlgaeBiosmass, 1)); + if (MathUtils.randInt(0, 10) > 9) { + outputList.add(ItemUtils.getSimpleStack(AgriculturalChem.mBrownAlgaeBiosmass, 4)); + } + } + if (aTier >= 4) { + outputList.add(ItemUtils.getSimpleStack(AgriculturalChem.mBrownAlgaeBiosmass, 2)); + outputList.add(ItemUtils.getSimpleStack(AgriculturalChem.mBrownAlgaeBiosmass, 3)); + if (MathUtils.randInt(0, 10) > 9) { + outputList.add(ItemUtils.getSimpleStack(AgriculturalChem.mGoldenBrownAlgaeBiosmass, 4)); + } + } + if (aTier >= 5) { + outputList.add(ItemUtils.getSimpleStack(AgriculturalChem.mBrownAlgaeBiosmass, 4)); + outputList.add(ItemUtils.getSimpleStack(AgriculturalChem.mGoldenBrownAlgaeBiosmass, 2)); + if (MathUtils.randInt(0, 10) > 9) { + outputList.add(ItemUtils.getSimpleStack(AgriculturalChem.mRedAlgaeBiosmass, 4)); + } + } + if (aTier >= 6) { + outputList.add(ItemUtils.getSimpleStack(AgriculturalChem.mGoldenBrownAlgaeBiosmass, 4)); + outputList.add(ItemUtils.getSimpleStack(AgriculturalChem.mRedAlgaeBiosmass, 2)); + if (MathUtils.randInt(0, 10) > 9) { + outputList.add(ItemUtils.getSimpleStack(AgriculturalChem.mRedAlgaeBiosmass, 8)); + } + // Iterate a special loop at higher tiers to provide more Red/Gold Algae. + for (int i = 0; i < 20; i++) { + if (aTier >= (6 + i)) { + int aMulti = i + 1; + outputList.add(ItemUtils.getSimpleStack(AgriculturalChem.mGreenAlgaeBiosmass, aMulti * 4)); + outputList.add(ItemUtils.getSimpleStack(AgriculturalChem.mBrownAlgaeBiosmass, aMulti * 3)); + outputList.add(ItemUtils.getSimpleStack(AgriculturalChem.mGoldenBrownAlgaeBiosmass, aMulti * 2)); + outputList.add(ItemUtils.getSimpleStack(AgriculturalChem.mRedAlgaeBiosmass, aMulti)); + } else { + break; + } + } + } + + return outputList.toArray(new ItemStack[0]); + } } diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/loaders/recipe/RecipeLoaderAlgaeFarm.java b/src/main/java/gtPlusPlus/xmod/gregtech/loaders/recipe/RecipeLoaderAlgaeFarm.java deleted file mode 100644 index 0ec27e6cee..0000000000 --- a/src/main/java/gtPlusPlus/xmod/gregtech/loaders/recipe/RecipeLoaderAlgaeFarm.java +++ /dev/null @@ -1,190 +0,0 @@ -package gtPlusPlus.xmod.gregtech.loaders.recipe; - -import java.util.ArrayList; -import java.util.HashMap; - -import net.minecraft.item.ItemStack; -import net.minecraftforge.fluids.FluidStack; - -import gregtech.api.enums.GTValues; -import gregtech.api.util.GTRecipe; -import gtPlusPlus.api.objects.Logger; -import gtPlusPlus.api.objects.data.WeightedCollection; -import gtPlusPlus.core.item.chemistry.AgriculturalChem; -import gtPlusPlus.core.util.math.MathUtils; -import gtPlusPlus.core.util.minecraft.ItemUtils; - -public class RecipeLoaderAlgaeFarm { - - private static final HashMap<Integer, ArrayList<GTRecipe>> mRecipeCache = new HashMap<>(); - private static final HashMap<Integer, ArrayList<GTRecipe>> mRecipeCompostCache = new HashMap<>(); - - public static void generateRecipes() { - for (int i = 0; i < 15; i++) { - getTieredRecipeFromCache(i, false); - } - for (int i = 0; i < 15; i++) { - getTieredRecipeFromCache(i, true); - } - } - - public static GTRecipe getTieredRecipeFromCache(int aTier, boolean aCompost) { - HashMap<Integer, ArrayList<GTRecipe>> aMap = aCompost ? mRecipeCompostCache : mRecipeCache; - String aComp = aCompost ? "(Compost)" : ""; - - ArrayList<GTRecipe> aTemp = aMap.get(aTier); - if (aTemp == null || aTemp.isEmpty()) { - aTemp = new ArrayList<>(); - aMap.put(aTier, aTemp); - Logger.INFO("Tier " + aTier + aComp + " had no recipes, initialising new map."); - } - if (aTemp.size() < 500) { - Logger - .INFO("Tier " + aTier + aComp + " has less than 500 recipes, generating " + (500 - aTemp.size()) + "."); - for (int i = aTemp.size(); i < 500; i++) { - aTemp.add(generateBaseRecipe(aCompost, aTier)); - } - } - int aIndex = MathUtils.randInt(0, (aTemp.isEmpty() ? 1 : aTemp.size()) - 1); - Logger.INFO("Using recipe with index of " + aIndex + ". " + aComp); - return aTemp.get(aIndex); - } - - public static int compostForTier(int aTier) { - return aTier > 1 ? (int) Math.min(64, Math.pow(2, aTier - 1)) : 1; - } - - private static GTRecipe generateBaseRecipe(boolean aUsingCompost, int aTier) { - - // Type Safety - if (aTier < 0) { - return null; - } - - WeightedCollection<Float> aOutputTimeMulti = new WeightedCollection<>(); - for (int i = 100; i > 0; i--) { - float aValue = 0; - if (i < 10) { - aValue = 3f; - } else if (i < 20) { - aValue = 2f; - } else { - aValue = 1f; - } - aOutputTimeMulti.put(i, aValue); - } - - final int[] aDurations = new int[] { 2000, 1800, 1600, 1400, 1200, 1000, 512, 256, 128, 64, 32, 16, 8, 4, 2, - 1 }; - - ItemStack[] aInputs = new ItemStack[] {}; - - if (aUsingCompost) { - // Make it use 4 compost per tier if we have some available - // Compost consumption maxes out at 1 stack per cycle - ItemStack aCompost = ItemUtils.getSimpleStack(AgriculturalChem.mCompost, compostForTier(aTier)); - aInputs = new ItemStack[] { aCompost }; - // Boost Tier by one if using compost so it gets a speed boost - aTier++; - } - - // We set these elsewhere - ItemStack[] aOutputs = getOutputsForTier(aTier); - - GTRecipe tRecipe = new GTRecipe( - false, - aInputs, - aOutputs, - null, - new int[] {}, - new FluidStack[] { GTValues.NF }, - new FluidStack[] { GTValues.NF }, - (int) (aDurations[aTier] * aOutputTimeMulti.get() / 2), // Time - 0, - 0); - - tRecipe.mSpecialValue = tRecipe.hashCode(); - - return tRecipe; - } - - private static ItemStack[] getOutputsForTier(int aTier) { - ArrayList<ItemStack> aOutputMap = new ArrayList<>(); - - // Add loot relevant to tier and also add any from lower tiers. - - if (aTier >= 0) { - aOutputMap.add(ItemUtils.getSimpleStack(AgriculturalChem.mAlgaeBiosmass, 2)); - aOutputMap.add(ItemUtils.getSimpleStack(AgriculturalChem.mAlgaeBiosmass, 4)); - if (MathUtils.randInt(0, 10) > 9) { - aOutputMap.add(ItemUtils.getSimpleStack(AgriculturalChem.mGreenAlgaeBiosmass, 2)); - } - } - - if (aTier >= 1) { - aOutputMap.add(ItemUtils.getSimpleStack(AgriculturalChem.mAlgaeBiosmass, 4)); - aOutputMap.add(ItemUtils.getSimpleStack(AgriculturalChem.mGreenAlgaeBiosmass, 2)); - if (MathUtils.randInt(0, 10) > 9) { - aOutputMap.add(ItemUtils.getSimpleStack(AgriculturalChem.mGreenAlgaeBiosmass, 4)); - } - } - if (aTier >= 2) { - aOutputMap.add(ItemUtils.getSimpleStack(AgriculturalChem.mGreenAlgaeBiosmass, 2)); - aOutputMap.add(ItemUtils.getSimpleStack(AgriculturalChem.mGreenAlgaeBiosmass, 3)); - if (MathUtils.randInt(0, 10) > 9) { - aOutputMap.add(ItemUtils.getSimpleStack(AgriculturalChem.mGreenAlgaeBiosmass, 8)); - } - } - if (aTier >= 3) { - aOutputMap.add(ItemUtils.getSimpleStack(AgriculturalChem.mGreenAlgaeBiosmass, 4)); - aOutputMap.add(ItemUtils.getSimpleStack(AgriculturalChem.mBrownAlgaeBiosmass, 1)); - if (MathUtils.randInt(0, 10) > 9) { - aOutputMap.add(ItemUtils.getSimpleStack(AgriculturalChem.mBrownAlgaeBiosmass, 4)); - } - } - if (aTier >= 4) { - aOutputMap.add(ItemUtils.getSimpleStack(AgriculturalChem.mBrownAlgaeBiosmass, 2)); - aOutputMap.add(ItemUtils.getSimpleStack(AgriculturalChem.mBrownAlgaeBiosmass, 3)); - if (MathUtils.randInt(0, 10) > 9) { - aOutputMap.add(ItemUtils.getSimpleStack(AgriculturalChem.mGoldenBrownAlgaeBiosmass, 4)); - } - } - if (aTier >= 5) { - aOutputMap.add(ItemUtils.getSimpleStack(AgriculturalChem.mBrownAlgaeBiosmass, 4)); - aOutputMap.add(ItemUtils.getSimpleStack(AgriculturalChem.mGoldenBrownAlgaeBiosmass, 2)); - if (MathUtils.randInt(0, 10) > 9) { - aOutputMap.add(ItemUtils.getSimpleStack(AgriculturalChem.mRedAlgaeBiosmass, 4)); - } - } - // Tier 6 is Highest for outputs - if (aTier >= 6) { - aOutputMap.add(ItemUtils.getSimpleStack(AgriculturalChem.mGoldenBrownAlgaeBiosmass, 4)); - aOutputMap.add(ItemUtils.getSimpleStack(AgriculturalChem.mRedAlgaeBiosmass, 2)); - if (MathUtils.randInt(0, 10) > 9) { - aOutputMap.add(ItemUtils.getSimpleStack(AgriculturalChem.mRedAlgaeBiosmass, 8)); - } - } - - // Iterate a special loop at higher tiers to provide more Red/Gold Algae. - for (int i2 = 0; i2 < 20; i2++) { - if (aTier >= (6 + i2)) { - int aMulti = i2 + 1; - aOutputMap.add(ItemUtils.getSimpleStack(AgriculturalChem.mGreenAlgaeBiosmass, aMulti * 4)); - aOutputMap.add(ItemUtils.getSimpleStack(AgriculturalChem.mBrownAlgaeBiosmass, aMulti * 3)); - aOutputMap.add(ItemUtils.getSimpleStack(AgriculturalChem.mGoldenBrownAlgaeBiosmass, aMulti * 2)); - aOutputMap.add(ItemUtils.getSimpleStack(AgriculturalChem.mRedAlgaeBiosmass, aMulti)); - } else { - i2 = 20; - } - } - - // Map the AutoMap contents to an Itemstack Array. - ItemStack[] aOutputs = new ItemStack[aOutputMap.size()]; - for (int i = 0; i < aOutputMap.size(); i++) { - aOutputs[i] = aOutputMap.get(i); - } - - // Return filled ItemStack Array. - return aOutputs; - } -} |