Gems processor optimized now

This commit is contained in:
TheDarkDnKTv 2021-03-14 08:04:30 +02:00
parent 372bcdf89b
commit 3868d14f45
4 changed files with 110 additions and 38 deletions

View file

@ -724,12 +724,19 @@ public class GT_ModHandler {
public static boolean addCompressionRecipe(ItemStack aInput, ItemStack aOutput) {
aOutput = GT_OreDictUnificator.get(true, aOutput);
if (aInput == null || aOutput == null) return false;
GT_Utility.removeSimpleIC2MachineRecipe(aInput, getCompressorRecipeList(), null);
if (!GregTech_API.sRecipeFile.get(GT_ConfigCategories.Machines.compression, aInput, true)) return false;
GT_Utility.addSimpleIC2MachineRecipe(aInput, getCompressorRecipeList(), null, aOutput);
return true;
}
public static boolean addCompressionRecipe(OreDictEntry aInput, int amount, ItemStack aOutput) {
aOutput = GT_OreDictUnificator.get(true, aOutput);
if (aInput == null || aOutput == null) return false;
if (!GregTech_API.sRecipeFile.get(GT_ConfigCategories.Machines.compression, aInput.oreDictName, true)) return false;
GT_Utility.addSimpleIC2MachineRecipe(RecipeEntry.fromStacks(amount, aInput.ores, Match.STRICT), getCompressorRecipeList(), null, aOutput);
return true;
}
/**
* @param aValue Scrap = 5000, Scrapbox = 45000
* @param aAmplifiers stacks apply to

View file

@ -1,15 +1,24 @@
package gregtechmod.common;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Objects;
import com.google.common.collect.Multimap;
import com.google.common.collect.Multimaps;
import gregtechmod.api.GregTech_API;
import gregtechmod.api.util.GT_Log;
import gregtechmod.api.util.GT_Utility;
import ic2.api.recipe.IRecipeInput;
import ic2.api.recipe.RecipeOutput;
import net.minecraft.inventory.InventoryCrafting;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.CraftingManager;
@ -25,6 +34,9 @@ public class RecipeHandler {
private static List<IRecipeMatcher> craftingRemove;
private static List<IFurnanceMatcher> smeltingRemove;
private static Multimap<Integer, IIC2Matcher> IC2Remove;
private static Map<Integer, Map<IRecipeInput, RecipeOutput>> IC2Mapping;
private static List<Runnable> onFinishTasks;
//////////////////////
@ -41,6 +53,14 @@ public class RecipeHandler {
smeltingRemove.add(matcher);
}
public static void scheduleIC2RecipeToRemove(Map<IRecipeInput, RecipeOutput> recipeMap, IIC2Matcher matcher) {
Objects.requireNonNull(recipeMap);
Objects.requireNonNull(matcher);
int hash = System.identityHashCode(recipeMap);
IC2Mapping.put(hash, recipeMap);
IC2Remove.put(hash, matcher);
}
public static void executeOnFinish(Runnable runnable) {
Objects.requireNonNull(runnable);
onFinishTasks.add(runnable);
@ -100,6 +120,29 @@ public class RecipeHandler {
GT_Log.log.info(String.format("\tCrafting processor finished for %.3f seconds", (System.currentTimeMillis() - time) / 1000.0F));
}
private static void processIC2() {
long time = System.currentTimeMillis();
for (Entry<Integer, Collection<IIC2Matcher>> recipeMap : IC2Remove.asMap().entrySet()) {
Collection<IIC2Matcher> tasks = new ArrayList<>(recipeMap.getValue());
Iterator<Entry<IRecipeInput, RecipeOutput>> iter = IC2Mapping.get(recipeMap.getKey()).entrySet().iterator();
while (iter.hasNext() && !tasks.isEmpty()) {
Entry<IRecipeInput, RecipeOutput> entry = iter.next();
Iterator<IIC2Matcher> iter2 = tasks.iterator();
while (iter2.hasNext()) {
IIC2Matcher matcher = iter2.next();
if (matcher.matches(entry.getKey(), entry.getValue())) {
iter.remove();
iter2.remove();
}
}
}
}
GT_Log.log.info(String.format("\tIC2 Recipe processor finished for %.3f seconds", (System.currentTimeMillis() - time) / 1000.0F));
}
/**
* Called on POST to proceed all job
*/
@ -108,11 +151,14 @@ public class RecipeHandler {
processSmelting();
processCrafting();
processIC2();
proceedTasks();
craftingRemove = null;
smeltingRemove = null;
onFinishTasks = null;
IC2Mapping = null;
IC2Remove = null;
GT_Log.log.info(String.format("Recipe handler finished for %.3f seconds", (System.currentTimeMillis() - time) / 1000.0F));
}
@ -121,6 +167,9 @@ public class RecipeHandler {
craftingRemove = new ArrayList<>();
smeltingRemove = new ArrayList<>();
onFinishTasks = new ArrayList<>();
IC2Remove = Multimaps.newListMultimap(new HashMap<>(), ArrayList::new);
IC2Mapping = new HashMap<>();
}
/**
@ -160,6 +209,21 @@ public class RecipeHandler {
}
}
/**
*
* @author TheDarkDnKTv
*
*/
@FunctionalInterface
public static interface IIC2Matcher {
/**
*
* Returns true if recipe matches some criteria
*/
boolean matches(IRecipeInput in, RecipeOutput out);
}
/** Standard implementation, default use case of IRecipeMatcher
* @author TheDarkDnKTv
*

View file

@ -196,18 +196,35 @@ public class ProcessingDust implements IOreRecipeRegistrator {
ItemStack tStack = GT_OreDictUnificator.get(OrePrefixes.ingot, aMaterial, 1L);
if (aMaterial.mBlastFurnaceRequired && null != tStack && !aMaterial.contains(SubTag.NO_SMELTING)) {
factory = RecipeMaps.BLAST_FURNANCE.factory()
.minTemperature(aMaterial.mBlastFurnaceTemp).EUt(120)
.duration(Math.max(aMaterial.getMass() / 40, 1) * aMaterial.mBlastFurnaceTemp)
.input(RecipeEntry.fromStacks(entry.ores, Match.STRICT));
if (aMaterial.mBlastFurnaceTemp > 1750)
factory.output(GT_OreDictUnificator.get(OrePrefixes.ingotHot, aMaterial, tStack, 1));
else
factory.output(tStack);
factory.buildAndRegister();
if (!aMaterial.contains(SubTag.NO_SMELTING)) {
if (aMaterial.mBlastFurnaceRequired && null != tStack) {
factory = RecipeMaps.BLAST_FURNANCE.factory()
.minTemperature(aMaterial.mBlastFurnaceTemp).EUt(120)
.duration(Math.max(aMaterial.getMass() / 40, 1) * aMaterial.mBlastFurnaceTemp)
.input(RecipeEntry.fromStacks(entry.ores, Match.STRICT));
if (aMaterial.mBlastFurnaceTemp > 1750)
factory.output(GT_OreDictUnificator.get(OrePrefixes.ingotHot, aMaterial, tStack, 1));
else
factory.output(tStack);
factory.buildAndRegister();
}
} else {
if (!OrePrefixes.block.isIgnored(aMaterial) && null == GT_OreDictUnificator.get(OrePrefixes.gem, aMaterial, 1L)) {
RecipeHandler.scheduleIC2RecipeToRemove(GT_ModHandler.getCompressorRecipeList(), (in, out) -> in.matches(entry.ores.get(0)));
RecipeHandler.executeOnFinish(() -> GT_ModHandler.addCompressionRecipe(entry, 1, GT_OreDictUnificator.get(OrePrefixes.block, aMaterial, 1L)));
}
if ((OrePrefixes.block.isIgnored(aMaterial)
|| null == GT_OreDictUnificator.get(OrePrefixes.block, aMaterial, 1L))
&& aMaterial != Materials.GraniteRed && aMaterial != Materials.GraniteBlack
&& aMaterial != Materials.Obsidian && aMaterial != Materials.Glowstone
&& aMaterial != Materials.Paper) {
RecipeHandler.scheduleIC2RecipeToRemove(GT_ModHandler.getCompressorRecipeList(), (in, out) -> in.matches(GT_Utility.copyAmount(9, entry.ores.get(0))));
RecipeHandler.executeOnFinish(() -> GT_ModHandler.addCompressionRecipe(entry, 1, GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L)));
}
}
for (ItemStack aStack : entry.ores) {
if (null != tStack && !aMaterial.contains(SubTag.NO_SMELTING)) {
if (aMaterial.mBlastFurnaceRequired) {
@ -219,18 +236,6 @@ public class ProcessingDust implements IOreRecipeRegistrator {
} else {
RecipeHandler.executeOnFinish(() -> GT_ModHandler.addSmeltingRecipe(aStack, tStack));
}
} else {
if (!OrePrefixes.block.isIgnored(aMaterial) && null == GT_OreDictUnificator.get(OrePrefixes.gem, aMaterial, 1L)) {
GT_ModHandler.addCompressionRecipe(GT_Utility.copyAmount(9, aStack), GT_OreDictUnificator.get(OrePrefixes.block, aMaterial, 1L));
}
if ((OrePrefixes.block.isIgnored(aMaterial)
|| null == GT_OreDictUnificator.get(OrePrefixes.block, aMaterial, 1L))
&& aMaterial != Materials.GraniteRed && aMaterial != Materials.GraniteBlack
&& aMaterial != Materials.Obsidian && aMaterial != Materials.Glowstone
&& aMaterial != Materials.Paper) {
GT_ModHandler.addCompressionRecipe(GT_Utility.copyAmount(1, aStack), GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L));
}
}
switch (aMaterial) {

View file

@ -12,7 +12,6 @@ import gregtechmod.api.interfaces.IOreRecipeRegistrator;
import gregtechmod.api.recipe.RecipeFactory;
import gregtechmod.api.util.GT_ModHandler;
import gregtechmod.api.util.GT_OreDictUnificator;
import gregtechmod.api.util.GT_RecipeRegistrator;
import gregtechmod.api.util.GT_Utility;
import gregtechmod.api.util.OreDictEntry;
@ -84,23 +83,20 @@ public class ProcessingGem implements IOreRecipeRegistrator {
.buildAndRegister();
}
for (ItemStack stack : entry.ores) { // FIXME cause real load lag
if (!OrePrefixes.block.isIgnored(aMaterial)) {
GT_ModHandler.addCompressionRecipe(GT_Utility.copyAmount(9, stack), GT_OreDictUnificator.get(OrePrefixes.block, aMaterial, 1L));
}
if (!OrePrefixes.block.isIgnored(aMaterial)) {
ItemStack a = entry.ores.get(0);
if (GT_ModHandler.getRecipeOutput(a, a, a, a, a, a, a, a, a) != null)
if (!GregTech_API.sRecipeFile.get(GT_ConfigCategories.Recipes.storageblockcrafting, OrePrefixes.block.get(aMaterial), false))
RecipeHandler.scheduleCraftingToRemove(new RecipeHandler.InventoryRecipeMatcher(false, a, a, a, a, a, a, a, a, a));
RecipeHandler.scheduleIC2RecipeToRemove(GT_ModHandler.getCompressorRecipeList(), (in, out) -> in.matches(entry.ores.get(0)));
RecipeHandler.executeOnFinish(() -> GT_ModHandler.addCompressionRecipe(entry, 9, GT_OreDictUnificator.get(OrePrefixes.block, aMaterial, 1L)));
}
for (ItemStack stack : entry.ores) {
if (!aMaterial.contains(SubTag.NO_SMELTING)) {
RecipeHandler.executeOnFinish(() -> GT_ModHandler.addSmeltingRecipe(GT_Utility.copyAmount(1, stack), GT_OreDictUnificator.get(OrePrefixes.ingot, aMaterial, 1L)));
}
ItemStack tStack;
if (null != (tStack = GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial, 1L))) {
GT_RecipeRegistrator.registerUsagesForMaterials(GT_Utility.copyAmount(1, stack),
GT_Utility.copyAmount(1L, new Object[] { tStack }), (String) null, false, true, false);
} else {
GT_RecipeRegistrator.registerUsagesForMaterials(GT_Utility.copyAmount(1, stack),
GT_Utility.copyAmount(1, stack), (String) null, false, true, false);
}
}
}
}