Skip to content

Commit

Permalink
New: Input Replacement, Fix Issue#5.
Browse files Browse the repository at this point in the history
  • Loading branch information
WanionCane committed Sep 6, 2016
1 parent 1cf1036 commit f4cde15
Show file tree
Hide file tree
Showing 7 changed files with 161 additions and 46 deletions.
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -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"

Expand Down
1 change: 1 addition & 0 deletions src/main/java/wanion/unidict/Config.java
Original file line number Diff line number Diff line change
Expand Up @@ -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<String> 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<String> 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."))));
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/wanion/unidict/common/Reference.java
Original file line number Diff line number Diff line change
Expand Up @@ -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]";

Expand Down
41 changes: 37 additions & 4 deletions src/main/java/wanion/unidict/integration/FurnaceIntegration.java
Original file line number Diff line number Diff line change
Expand Up @@ -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
{
Expand All @@ -34,7 +39,35 @@ public String call()
@SuppressWarnings("unchecked")
private void optimizeFurnaceRecipes()
{
for (final Map.Entry<ItemStack, ItemStack> furnaceRecipe : (Set<Map.Entry<ItemStack, ItemStack>>) FurnaceRecipes.smelting().getSmeltingList().entrySet())
furnaceRecipe.setValue(resourceHandler.getMainItemStack(furnaceRecipe.getValue()));
if (!Config.inputReplacement)
for (final Map.Entry<ItemStack, ItemStack> furnaceRecipe : (Set<Map.Entry<ItemStack, ItemStack>>) FurnaceRecipes.smelting().getSmeltingList().entrySet())
furnaceRecipe.setValue(resourceHandler.getMainItemStack(furnaceRecipe.getValue()));
else {
final Map<UniResourceContainer, TLongSet> containerKindMap = new IdentityHashMap<>();
final Map<ItemStack, ItemStack> furnaceRecipes = FurnaceRecipes.smelting().getSmeltingList();
final Map<ItemStack, ItemStack> newRecipes = new HashMap<>();
for (final Iterator<Map.Entry<ItemStack, ItemStack>> furnaceRecipeIterator = furnaceRecipes.entrySet().iterator(); furnaceRecipeIterator.hasNext(); )
{
final Map.Entry<ItemStack, ItemStack> 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);
}
}
}
153 changes: 118 additions & 35 deletions src/main/java/wanion/unidict/integration/MekanismIntegration.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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()
Expand All @@ -34,6 +38,7 @@ final class MekanismIntegration extends AbstractIntegrationThread
}

@Override
@SuppressWarnings("unchecked")
public String call()
{
try {
Expand All @@ -44,52 +49,130 @@ public String call()
return threadName + "All the mekanisms were checked.";
}

private void fixMekanismRecipes(Map<ItemStackInput, MachineRecipe<ItemStackInput, ItemStackOutput, ? extends MachineRecipe>> recipes)
private void fixMekanismRecipes(@Nonnull final Map<ItemStackInput, MachineRecipe<ItemStackInput, ItemStackOutput, ? extends MachineRecipe>> recipes)
{
final int initialSize = recipes.size();
final Map<ItemStackInput, MachineRecipe<ItemStackInput, ItemStackOutput, ? extends MachineRecipe>> correctRecipes = new HashMap<>(initialSize, 1);
final TIntSet uniques = new TIntHashSet(initialSize, 1);
for (final Iterator<MachineRecipe<ItemStackInput, ItemStackOutput, ? extends MachineRecipe>> mekanismRecipeIterator = recipes.values().iterator(); mekanismRecipeIterator.hasNext(); )
{
final MachineRecipe<ItemStackInput, ItemStackOutput, ? extends MachineRecipe> mekanismRecipe = mekanismRecipeIterator.next();
final ItemStack correctOutput = resourceHandler.getMainItemStack(mekanismRecipe.recipeOutput.output);
if (correctOutput == mekanismRecipe.recipeOutput.output)
continue;
final MachineRecipe<ItemStackInput, ItemStackOutput, ? extends 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<UniResourceContainer, TIntSet> containerInputKeyMap = new IdentityHashMap<>();
for (final Iterator<MachineRecipe<ItemStackInput, ItemStackOutput, ? extends MachineRecipe>> mekanismRecipeIterator = recipes.values().iterator(); mekanismRecipeIterator.hasNext(); )
{
final MachineRecipe<ItemStackInput, ItemStackOutput, ? extends 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<ItemStackInput, ItemStackOutput, ? extends 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<UniResourceContainer, TLongSet> containerKindMap = new IdentityHashMap<>();
for (final Iterator<MachineRecipe<ItemStackInput, ItemStackOutput, ? extends MachineRecipe>> mekanismRecipeIterator = recipes.values().iterator(); mekanismRecipeIterator.hasNext(); )
{
final MachineRecipe<ItemStackInput, ItemStackOutput, ? extends 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<ItemStackInput, ItemStackOutput, ? extends 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<InfusionInput, MachineRecipe<InfusionInput, ItemStackOutput, MetallurgicInfuserRecipe>> recipes)
private void fixInfusionMekanismRecipes(@Nonnull final Map<InfusionInput, MachineRecipe<InfusionInput, ItemStackOutput, MetallurgicInfuserRecipe>> recipes)
{
final int initialSize = recipes.size();
final Map<InfusionInput, MachineRecipe<InfusionInput, ItemStackOutput, MetallurgicInfuserRecipe>> correctRecipes = new HashMap<>(initialSize, 1);
final TIntSet uniques = new TIntHashSet(initialSize, 1);
for (final Iterator<MachineRecipe<InfusionInput, ItemStackOutput, MetallurgicInfuserRecipe>> infusionRecipeIterator = recipes.values().iterator(); infusionRecipeIterator.hasNext(); )
{
final MachineRecipe<InfusionInput, ItemStackOutput, MetallurgicInfuserRecipe> infusionRecipe = infusionRecipeIterator.next();
final ItemStack correctOutput = resourceHandler.getMainItemStack(infusionRecipe.recipeOutput.output);
if (correctOutput == infusionRecipe.recipeOutput.output)
continue;
final MachineRecipe<InfusionInput, ItemStackOutput, MetallurgicInfuserRecipe> 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<UniResourceContainer, TIntSet> containerInputKeyMap = new IdentityHashMap<>();
for (final Iterator<MachineRecipe<InfusionInput, ItemStackOutput, MetallurgicInfuserRecipe>> infusionRecipeIterator = recipes.values().iterator(); infusionRecipeIterator.hasNext(); )
{
final MachineRecipe<InfusionInput, ItemStackOutput, MetallurgicInfuserRecipe> 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<InfusionInput, ItemStackOutput, MetallurgicInfuserRecipe> 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<UniResourceContainer, TLongSet> containerKindMap = new IdentityHashMap<>();
for (final Iterator<MachineRecipe<InfusionInput, ItemStackOutput, MetallurgicInfuserRecipe>> infusionRecipeIterator = recipes.values().iterator(); infusionRecipeIterator.hasNext(); )
{
final MachineRecipe<InfusionInput, ItemStackOutput, MetallurgicInfuserRecipe> 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<InfusionInput, ItemStackOutput, MetallurgicInfuserRecipe> 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);
}
Expand Down
6 changes: 2 additions & 4 deletions src/main/java/wanion/unidict/resource/ResourceHandler.java
Original file line number Diff line number Diff line change
Expand Up @@ -99,10 +99,8 @@ public List<ItemStack> getMainItemStackList(@Nonnull final Collection<ItemStack>

public void setMainItemStacks(@Nonnull final List<ItemStack> thingList)
{
final List<ItemStack> newThings = new ArrayList<>();
for (Iterator<ItemStack> 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)
Expand Down
2 changes: 1 addition & 1 deletion src/main/resources/mcmod.info
Original file line number Diff line number Diff line change
Expand Up @@ -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": "",
Expand Down

0 comments on commit f4cde15

Please sign in to comment.