From f4cde15f4d4c793aed92b43da69db281dc7171d3 Mon Sep 17 00:00:00 2001 From: WanionCane Date: Tue, 6 Sep 2016 15:47:09 -0300 Subject: [PATCH] New: Input Replacement, Fix Issue#5. --- build.gradle | 2 +- src/main/java/wanion/unidict/Config.java | 1 + .../java/wanion/unidict/common/Reference.java | 2 +- .../integration/FurnaceIntegration.java | 41 ++++- .../integration/MekanismIntegration.java | 153 ++++++++++++++---- .../unidict/resource/ResourceHandler.java | 6 +- src/main/resources/mcmod.info | 2 +- 7 files changed, 161 insertions(+), 46 deletions(-) diff --git a/build.gradle b/build.gradle index 76f3dae..8fa0905 100644 --- a/build.gradle +++ b/build.gradle @@ -17,7 +17,7 @@ buildscript { apply plugin: 'forge' -version = "1.7.10-2.9c" +version = "1.7.10-2.9.1" group= "wanion.unidict" // http://maven.apache.org/guides/mini/guide-naming-conventions.html archivesBaseName = "UniDict" diff --git a/src/main/java/wanion/unidict/Config.java b/src/main/java/wanion/unidict/Config.java index 2952060..95d8564 100644 --- a/src/main/java/wanion/unidict/Config.java +++ b/src/main/java/wanion/unidict/Config.java @@ -39,6 +39,7 @@ public final class Config // general configs private static final String general = Configuration.CATEGORY_GENERAL; public static final boolean keepOneEntry = config.getBoolean("keepOneEntry", general, false, "keep only one entry per ore dict entry?"); + public static final boolean inputReplacement = config.getBoolean("inputReplacement", general, false, "Enabling this will remove all non-standard items as input.\nNote: this will only affect machines that doesn't use OreDictionary."); public static final Set keepOneEntryModBlackSet = Collections.unmodifiableSet(Sets.newLinkedHashSet(Arrays.asList(config.getStringList("keepOneEntryModBlackList", Configuration.CATEGORY_GENERAL, new String[]{}, "mods listed here will be blacklisted in keepOneEntry.\nmust be the exact modID.")))); public static boolean autoHideInNEI; public static final Set hideInNEIBlackSet = Collections.unmodifiableSet(Sets.newLinkedHashSet(Arrays.asList(config.getStringList("autoHideInNEIBlackList", general, new String[]{"ore"}, "put here things that you don't want to hide in NEI.\nonly works if keepOneEntry is false.")))); diff --git a/src/main/java/wanion/unidict/common/Reference.java b/src/main/java/wanion/unidict/common/Reference.java index 47a0182..721f2d6 100644 --- a/src/main/java/wanion/unidict/common/Reference.java +++ b/src/main/java/wanion/unidict/common/Reference.java @@ -14,7 +14,7 @@ public final class Reference { public static final String MOD_ID = "UniDict"; public static final String MOD_NAME = MOD_ID; - public static final String MOD_VERSION = "1.7.10-2.9c"; + public static final String MOD_VERSION = "1.7.10-2.9.1"; public static final char SLASH = separatorChar; public static final String MC_VERSION = "[1.7.10]"; diff --git a/src/main/java/wanion/unidict/integration/FurnaceIntegration.java b/src/main/java/wanion/unidict/integration/FurnaceIntegration.java index f5d65ee..3030196 100644 --- a/src/main/java/wanion/unidict/integration/FurnaceIntegration.java +++ b/src/main/java/wanion/unidict/integration/FurnaceIntegration.java @@ -8,12 +8,17 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +import gnu.trove.set.TIntSet; +import gnu.trove.set.TLongSet; +import gnu.trove.set.hash.TIntHashSet; +import gnu.trove.set.hash.TLongHashSet; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.FurnaceRecipes; +import wanion.unidict.Config; import wanion.unidict.UniDict; +import wanion.unidict.resource.UniResourceContainer; -import java.util.Map; -import java.util.Set; +import java.util.*; final class FurnaceIntegration extends AbstractIntegrationThread { @@ -34,7 +39,35 @@ public String call() @SuppressWarnings("unchecked") private void optimizeFurnaceRecipes() { - for (final Map.Entry furnaceRecipe : (Set>) FurnaceRecipes.smelting().getSmeltingList().entrySet()) - furnaceRecipe.setValue(resourceHandler.getMainItemStack(furnaceRecipe.getValue())); + if (!Config.inputReplacement) + for (final Map.Entry furnaceRecipe : (Set>) FurnaceRecipes.smelting().getSmeltingList().entrySet()) + furnaceRecipe.setValue(resourceHandler.getMainItemStack(furnaceRecipe.getValue())); + else { + final Map containerKindMap = new IdentityHashMap<>(); + final Map furnaceRecipes = FurnaceRecipes.smelting().getSmeltingList(); + final Map newRecipes = new HashMap<>(); + for (final Iterator> furnaceRecipeIterator = furnaceRecipes.entrySet().iterator(); furnaceRecipeIterator.hasNext(); ) + { + final Map.Entry furnaceRecipe = furnaceRecipeIterator.next(); + final UniResourceContainer inputContainer = resourceHandler.getContainer(furnaceRecipe.getKey()); + final UniResourceContainer outputContainer = resourceHandler.getContainer(furnaceRecipe.getValue()); + if (outputContainer == null) + continue; + else if (inputContainer == null) { + furnaceRecipe.setValue(outputContainer.getMainEntry(furnaceRecipe.getValue().stackSize)); + continue; + } + final long kind = inputContainer.kind; + if (!containerKindMap.containsKey(outputContainer)) + containerKindMap.put(outputContainer, new TLongHashSet()); + final TLongSet kindSet = containerKindMap.get(outputContainer); + if (!kindSet.contains(kind)) { + kindSet.add(kind); + newRecipes.put(inputContainer.getMainEntry(furnaceRecipe.getKey().stackSize), outputContainer.getMainEntry(furnaceRecipe.getValue().stackSize)); + } + furnaceRecipeIterator.remove(); + } + furnaceRecipes.putAll(newRecipes); + } } } \ No newline at end of file diff --git a/src/main/java/wanion/unidict/integration/MekanismIntegration.java b/src/main/java/wanion/unidict/integration/MekanismIntegration.java index 4133e3b..2007387 100644 --- a/src/main/java/wanion/unidict/integration/MekanismIntegration.java +++ b/src/main/java/wanion/unidict/integration/MekanismIntegration.java @@ -9,7 +9,9 @@ */ import gnu.trove.set.TIntSet; +import gnu.trove.set.TLongSet; import gnu.trove.set.hash.TIntHashSet; +import gnu.trove.set.hash.TLongHashSet; import mekanism.common.recipe.RecipeHandler; import mekanism.common.recipe.inputs.InfusionInput; import mekanism.common.recipe.inputs.ItemStackInput; @@ -20,12 +22,14 @@ import wanion.unidict.Config; import wanion.unidict.MetaItem; import wanion.unidict.UniDict; +import wanion.unidict.resource.UniResourceContainer; +import javax.annotation.Nonnull; import java.util.HashMap; +import java.util.IdentityHashMap; import java.util.Iterator; import java.util.Map; -@SuppressWarnings("unchecked") final class MekanismIntegration extends AbstractIntegrationThread { MekanismIntegration() @@ -34,6 +38,7 @@ final class MekanismIntegration extends AbstractIntegrationThread } @Override + @SuppressWarnings("unchecked") public String call() { try { @@ -44,52 +49,130 @@ public String call() return threadName + "All the mekanisms were checked."; } - private void fixMekanismRecipes(Map> recipes) + private void fixMekanismRecipes(@Nonnull final Map> recipes) { final int initialSize = recipes.size(); final Map> correctRecipes = new HashMap<>(initialSize, 1); - final TIntSet uniques = new TIntHashSet(initialSize, 1); - for (final Iterator> mekanismRecipeIterator = recipes.values().iterator(); mekanismRecipeIterator.hasNext(); ) - { - final MachineRecipe mekanismRecipe = mekanismRecipeIterator.next(); - final ItemStack correctOutput = resourceHandler.getMainItemStack(mekanismRecipe.recipeOutput.output); - if (correctOutput == mekanismRecipe.recipeOutput.output) - continue; - final MachineRecipe newRecipe = mekanismRecipe.copy(); - newRecipe.recipeOutput.output = correctOutput; - if (Config.keepOneEntry) - newRecipe.recipeInput.ingredient = resourceHandler.getMainItemStack(newRecipe.recipeInput.ingredient); - final int recipeID = MetaItem.getCumulative(newRecipe.recipeOutput.output, newRecipe.recipeInput.ingredient); - if (!uniques.contains(recipeID)) { - correctRecipes.put(newRecipe.recipeInput, newRecipe); - uniques.add(recipeID); + if (!Config.inputReplacement) { + final Map containerInputKeyMap = new IdentityHashMap<>(); + for (final Iterator> mekanismRecipeIterator = recipes.values().iterator(); mekanismRecipeIterator.hasNext(); ) + { + final MachineRecipe mekanismRecipe = mekanismRecipeIterator.next(); + final UniResourceContainer inputContainer = resourceHandler.getContainer(mekanismRecipe.recipeInput.ingredient); + final UniResourceContainer outputContainer = resourceHandler.getContainer(mekanismRecipe.recipeOutput.output); + if (outputContainer == null) + continue; + else if (inputContainer == null) { + mekanismRecipe.recipeOutput.output = outputContainer.getMainEntry(mekanismRecipe.recipeOutput.output.stackSize); + continue; + } + final MachineRecipe correctRecipe = mekanismRecipe.copy(); + final ItemStack inputStack; + if (Config.keepOneEntry) + inputStack = correctRecipe.recipeInput.ingredient = inputContainer.getMainEntry(correctRecipe.recipeInput.ingredient.stackSize); + else + inputStack = correctRecipe.recipeInput.ingredient = correctRecipe.recipeInput.ingredient.copy(); + final int inputId = MetaItem.get(inputStack); + if (!containerInputKeyMap.containsKey(outputContainer)) + containerInputKeyMap.put(outputContainer, new TIntHashSet()); + final TIntSet inputKeySet = containerInputKeyMap.get(outputContainer); + if (!inputKeySet.contains(inputId)) { + inputKeySet.add(inputId); + correctRecipe.recipeOutput.output = outputContainer.getMainEntry(correctRecipe.recipeOutput.output.stackSize); + correctRecipes.put(correctRecipe.recipeInput, correctRecipe); + } + mekanismRecipeIterator.remove(); + } + } else { + final Map containerKindMap = new IdentityHashMap<>(); + for (final Iterator> mekanismRecipeIterator = recipes.values().iterator(); mekanismRecipeIterator.hasNext(); ) + { + final MachineRecipe mekanismRecipe = mekanismRecipeIterator.next(); + final UniResourceContainer inputContainer = resourceHandler.getContainer(mekanismRecipe.recipeInput.ingredient); + final UniResourceContainer outputContainer = resourceHandler.getContainer(mekanismRecipe.recipeOutput.output); + if (outputContainer == null) + continue; + if (inputContainer == null) { + mekanismRecipe.recipeOutput.output = outputContainer.getMainEntry(mekanismRecipe.recipeOutput.output.stackSize); + continue; + } + final long kind = inputContainer.kind; + if (!containerKindMap.containsKey(outputContainer)) + containerKindMap.put(outputContainer, new TLongHashSet()); + final TLongSet kindSet = containerKindMap.get(outputContainer); + if (!kindSet.contains(kind)) { + kindSet.add(kind); + final MachineRecipe correctRecipe = mekanismRecipe.copy(); + correctRecipe.recipeInput.ingredient = inputContainer.getMainEntry(correctRecipe.recipeInput.ingredient.stackSize); + correctRecipe.recipeOutput.output = outputContainer.getMainEntry(mekanismRecipe.recipeOutput.output.stackSize); + correctRecipes.put(correctRecipe.recipeInput, correctRecipe); + } + mekanismRecipeIterator.remove(); } - mekanismRecipeIterator.remove(); } recipes.putAll(correctRecipes); } - private void fixInfusionMekanismRecipes(Map> recipes) + private void fixInfusionMekanismRecipes(@Nonnull final Map> recipes) { final int initialSize = recipes.size(); final Map> correctRecipes = new HashMap<>(initialSize, 1); - final TIntSet uniques = new TIntHashSet(initialSize, 1); - for (final Iterator> infusionRecipeIterator = recipes.values().iterator(); infusionRecipeIterator.hasNext(); ) - { - final MachineRecipe infusionRecipe = infusionRecipeIterator.next(); - final ItemStack correctOutput = resourceHandler.getMainItemStack(infusionRecipe.recipeOutput.output); - if (correctOutput == infusionRecipe.recipeOutput.output) - continue; - final MachineRecipe newRecipe = infusionRecipe.copy(); - newRecipe.recipeOutput.output = correctOutput; - if (Config.keepOneEntry) - newRecipe.recipeInput.inputStack = resourceHandler.getMainItemStack(newRecipe.recipeInput.inputStack); - final int recipeID = MetaItem.getCumulative(newRecipe.recipeOutput.output, newRecipe.recipeInput.inputStack); - if (!uniques.contains(recipeID)) { - correctRecipes.put(newRecipe.recipeInput, newRecipe); - uniques.add(recipeID); + if (!Config.inputReplacement) { + final Map containerInputKeyMap = new IdentityHashMap<>(); + for (final Iterator> infusionRecipeIterator = recipes.values().iterator(); infusionRecipeIterator.hasNext(); ) + { + final MachineRecipe infusionRecipe = infusionRecipeIterator.next(); + final UniResourceContainer inputContainer = resourceHandler.getContainer(infusionRecipe.recipeInput.inputStack); + final UniResourceContainer outputContainer = resourceHandler.getContainer(infusionRecipe.recipeOutput.output); + if (outputContainer == null) + continue; + else if (inputContainer == null) { + infusionRecipe.recipeOutput.output = outputContainer.getMainEntry(infusionRecipe.recipeOutput.output.stackSize); + continue; + } + final MachineRecipe correctRecipe = infusionRecipe.copy(); + final ItemStack inputStack; + if (Config.keepOneEntry) + inputStack = correctRecipe.recipeInput.inputStack = inputContainer.getMainEntry(correctRecipe.recipeInput.inputStack.stackSize); + else + inputStack = correctRecipe.recipeInput.inputStack = correctRecipe.recipeInput.inputStack.copy(); + final int inputId = MetaItem.get(inputStack); + if (!containerInputKeyMap.containsKey(outputContainer)) + containerInputKeyMap.put(outputContainer, new TIntHashSet()); + final TIntSet inputKeySet = containerInputKeyMap.get(outputContainer); + if (!inputKeySet.contains(inputId)) { + inputKeySet.add(inputId); + correctRecipe.recipeOutput.output = outputContainer.getMainEntry(correctRecipe.recipeOutput.output.stackSize); + correctRecipes.put(correctRecipe.recipeInput, correctRecipe); + } + infusionRecipeIterator.remove(); + } + } else { + final Map containerKindMap = new IdentityHashMap<>(); + for (final Iterator> infusionRecipeIterator = recipes.values().iterator(); infusionRecipeIterator.hasNext(); ) + { + final MachineRecipe mekanismRecipe = infusionRecipeIterator.next(); + final UniResourceContainer inputContainer = resourceHandler.getContainer(mekanismRecipe.recipeInput.inputStack); + final UniResourceContainer outputContainer = resourceHandler.getContainer(mekanismRecipe.recipeOutput.output); + if (outputContainer == null) + continue; + if (inputContainer == null) { + mekanismRecipe.recipeOutput.output = outputContainer.getMainEntry(mekanismRecipe.recipeOutput.output.stackSize); + continue; + } + final long kind = inputContainer.kind; + if (!containerKindMap.containsKey(outputContainer)) + containerKindMap.put(outputContainer, new TLongHashSet()); + final TLongSet kindSet = containerKindMap.get(outputContainer); + if (!kindSet.contains(kind)) { + kindSet.add(kind); + final MachineRecipe correctRecipe = mekanismRecipe.copy(); + correctRecipe.recipeInput.inputStack = inputContainer.getMainEntry(correctRecipe.recipeInput.inputStack.stackSize); + correctRecipe.recipeOutput.output = outputContainer.getMainEntry(mekanismRecipe.recipeOutput.output.stackSize); + correctRecipes.put(correctRecipe.recipeInput, correctRecipe); + } + infusionRecipeIterator.remove(); } - infusionRecipeIterator.remove(); } recipes.putAll(correctRecipes); } diff --git a/src/main/java/wanion/unidict/resource/ResourceHandler.java b/src/main/java/wanion/unidict/resource/ResourceHandler.java index 9b16ad7..44693bd 100644 --- a/src/main/java/wanion/unidict/resource/ResourceHandler.java +++ b/src/main/java/wanion/unidict/resource/ResourceHandler.java @@ -99,10 +99,8 @@ public List getMainItemStackList(@Nonnull final Collection public void setMainItemStacks(@Nonnull final List thingList) { - final List newThings = new ArrayList<>(); - for (Iterator thingListIterator = thingList.iterator(); thingListIterator.hasNext(); thingListIterator.remove()) - newThings.add(getMainItemStack(thingListIterator.next())); - thingList.addAll(newThings); + for (int i = 0; i < thingList.size(); i++) + thingList.set(i, getMainItemStack(thingList.get(i))); } public ItemStack[] getMainItemStacks(@Nonnull final ItemStack[] things) diff --git a/src/main/resources/mcmod.info b/src/main/resources/mcmod.info index 5b91821..c941d18 100644 --- a/src/main/resources/mcmod.info +++ b/src/main/resources/mcmod.info @@ -3,7 +3,7 @@ "modid": "UniDict", "name": "UniDict", "description": "a mod about unifying all the things.", - "version": "2.9c", + "version": "2.9.1", "mcversion": "${mcversion}", "url": "http://minecraft.curseforge.com/projects/unidict", "updateUrl": "",