Skip to content

Commit

Permalink
Reworked the Recipe Key Generator.
Browse files Browse the repository at this point in the history
  • Loading branch information
WanionCane committed Aug 25, 2016
1 parent 722fb8a commit 1cf1036
Show file tree
Hide file tree
Showing 4 changed files with 68 additions and 17 deletions.
22 changes: 19 additions & 3 deletions src/main/java/wanion/unidict/MetaItem.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,11 @@
import gnu.trove.set.hash.TIntHashSet;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraftforge.oredict.OreDictionary;
import wanion.unidict.resource.Resource;
import wanion.unidict.resource.ResourceHandler;

import javax.annotation.Nonnull;
import java.util.Collection;
import java.util.List;

Expand All @@ -37,20 +39,20 @@ public static int get(final ItemStack itemStack)
if (itemStack == null || (item = itemStack.getItem()) == null)
return 0;
final int id = itemRegistry.getId(item);
return (id > 0) ? id | item.getDamage(itemStack) + 1 << 16 : 0;
return id > 0 ? item.getDamage(itemStack) == OreDictionary.WILDCARD_VALUE ? id : id | item.getDamage(itemStack) + 1 << 16 : 0;
}

public static int get(final Item item)
{
if (item == null)
return 0;
final int id = itemRegistry.getIDForObject(item);
return (id > 0) ? id | 65536 : 0;
return id > 0 ? id | 65536 : 0;
}

public static ItemStack toItemStack(final int metaItemKey)
{
return metaItemKey > 0 ? new ItemStack(itemRegistry.getRaw(metaItemKey ^ (metaItemKey & 65536)), 0, metaItemKey >> 16) : null;
return metaItemKey > 0 ? new ItemStack(itemRegistry.getRaw(metaItemKey ^ (metaItemKey & 65536)), 0, metaItemKey >> 16) : null;
}

public static int getCumulative(final Object[] objects, final ResourceHandler resourceHandler)
Expand Down Expand Up @@ -87,6 +89,20 @@ public static TIntList getList(final Collection<ItemStack> itemStackCollection)
return keys;
}

public static TIntList getList(@Nonnull final Object[] objects, @Nonnull final ResourceHandler resourceHandler)
{
final TIntList keys = new TIntArrayList();
int bufKey;
for (final Object object : objects)
if (object instanceof ItemStack) {
if ((bufKey = get(resourceHandler.getMainItemStack((ItemStack) object))) > 0)
keys.add(bufKey);
} else if (object instanceof List && !((List) object).isEmpty())
if ((bufKey = get(((ItemStack) ((List) object).get(0)))) > 0)
keys.add(bufKey);
return keys;
}

public static TIntSet getSet(final Collection<Resource> resourceCollection, final long kind)
{
final TIntSet keys = new TIntHashSet();
Expand Down
16 changes: 14 additions & 2 deletions src/main/java/wanion/unidict/recipe/ForgeRecipeResearcher.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
*/

import cpw.mods.fml.common.Loader;
import gnu.trove.iterator.TIntIterator;
import gnu.trove.list.TIntList;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.IRecipe;
import net.minecraftforge.oredict.ShapedOreRecipe;
Expand All @@ -30,13 +32,23 @@ public final class ForgeRecipeResearcher implements IRecipeResearcher<ShapedOreR
@Override
public int getShapedRecipeKey(@Nonnull final IRecipe recipe, @Nonnull final ResourceHandler resourceHandler)
{
return MetaItem.getCumulative(((ShapedOreRecipe) recipe).getInput(), resourceHandler);
final TIntList recipeKeys = MetaItem.getList(((ShapedOreRecipe) recipe).getInput(), resourceHandler);
int recipeKey = 0;
recipeKeys.sort();
for (final TIntIterator recipeKeysIterator = recipeKeys.iterator(); recipeKeysIterator.hasNext(); )
recipeKey += 31 * recipeKeysIterator.next();
return recipeKey;
}

@Override
public int getShapelessRecipeKey(@Nonnull final IRecipe recipe, @Nonnull final ResourceHandler resourceHandler)
{
return MetaItem.getCumulative(((ShapelessOreRecipe) recipe).getInput().toArray(), resourceHandler);
final TIntList recipeKeys = MetaItem.getList(((ShapelessOreRecipe) recipe).getInput().toArray(), resourceHandler);
int recipeKey = 0;
recipeKeys.sort();
for (final TIntIterator recipeKeysIterator = recipeKeys.iterator(); recipeKeysIterator.hasNext(); )
recipeKey += 31 * recipeKeysIterator.next();
return recipeKey;
}

@SuppressWarnings("unchecked")
Expand Down
31 changes: 21 additions & 10 deletions src/main/java/wanion/unidict/recipe/IC2RecipeResearcher.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/

import gnu.trove.iterator.TIntIterator;
import gnu.trove.list.TIntList;
import gnu.trove.list.array.TIntArrayList;
import ic2.api.recipe.IRecipeInput;
import ic2.core.AdvRecipe;
import ic2.core.AdvShapelessRecipe;
Expand All @@ -30,40 +33,48 @@ public final class IC2RecipeResearcher implements IRecipeResearcher<AdvRecipe, A
@Override
public int getShapedRecipeKey(@Nonnull IRecipe recipe, @Nonnull final ResourceHandler resourceHandler)
{
int recipeId = 0;
final TIntList recipeKeys = new TIntArrayList();
int recipeKey = 0;
for (final Object input : ((AdvRecipe) recipe).input) {
if (input instanceof ItemStack)
recipeId += MetaItem.get(resourceHandler.getMainItemStack((ItemStack) input));
recipeKeys.add(MetaItem.get(resourceHandler.getMainItemStack((ItemStack) input)));
else if (input instanceof List) {
if (((List) input).isEmpty())
continue;
final Object obj = ((List) input).get(0);
if (obj instanceof ItemStack)
recipeId += MetaItem.get(resourceHandler.getMainItemStack((ItemStack) obj));
recipeKeys.add(MetaItem.get(resourceHandler.getMainItemStack((ItemStack) obj)));
} else if (input instanceof IRecipeInput)
recipeId += MetaItem.get(((IRecipeInput) input).getInputs().get(0));
recipeKeys.add(MetaItem.get(((IRecipeInput) input).getInputs().get(0)));
}
return recipeId;
recipeKeys.sort();
for (final TIntIterator recipeKeysIterator = recipeKeys.iterator(); recipeKeysIterator.hasNext(); )
recipeKey += 31 * recipeKeysIterator.next();
return recipeKey;
}

@Override
public int getShapelessRecipeKey(@Nonnull IRecipe recipe, @Nonnull final ResourceHandler resourceHandler)
{
int recipeId = 0;
final TIntList recipeKeys = new TIntArrayList();
int recipeKey = 0;
for (final Object input : ((AdvShapelessRecipe) recipe).input) {
if (input instanceof ItemStack)
recipeId += MetaItem.get(resourceHandler.getMainItemStack((ItemStack) input));
recipeKeys.add(MetaItem.get(resourceHandler.getMainItemStack((ItemStack) input)));
else if (input instanceof List) {
if (((List) input).isEmpty())
continue;
final Object obj = ((List) input).get(0);
if (obj instanceof ItemStack)
recipeId += MetaItem.get(resourceHandler.getMainItemStack((ItemStack) obj));
recipeKeys.add(MetaItem.get(resourceHandler.getMainItemStack((ItemStack) obj)));
else if (obj instanceof IRecipeInput)
recipeId += MetaItem.get(((IRecipeInput) obj).getInputs().get(0));
recipeKeys.add(MetaItem.get(((IRecipeInput) obj).getInputs().get(0)));
}
}
return recipeId;
recipeKeys.sort();
for (final TIntIterator recipeKeysIterator = recipeKeys.iterator(); recipeKeysIterator.hasNext(); )
recipeKey += 31 * recipeKeysIterator.next();
return recipeKey;
}

@Override
Expand Down
16 changes: 14 additions & 2 deletions src/main/java/wanion/unidict/recipe/VanillaRecipeResearcher.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/

import gnu.trove.iterator.TIntIterator;
import gnu.trove.list.TIntList;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.IRecipe;
import net.minecraft.item.crafting.ShapedRecipes;
Expand All @@ -29,13 +31,23 @@ public final class VanillaRecipeResearcher implements IRecipeResearcher<ShapedRe
@Override
public int getShapedRecipeKey(@Nonnull final IRecipe recipe, @Nonnull final ResourceHandler resourceHandler)
{
return MetaItem.getCumulative(((ShapedRecipes) recipe).recipeItems, resourceHandler);
final TIntList recipeKeys = MetaItem.getList(((ShapedRecipes) recipe).recipeItems, resourceHandler);
int recipeKey = 0;
recipeKeys.sort();
for (final TIntIterator recipeKeysIterator = recipeKeys.iterator(); recipeKeysIterator.hasNext(); )
recipeKey += 31 * recipeKeysIterator.next();
return recipeKey;
}

@Override
public int getShapelessRecipeKey(@Nonnull final IRecipe recipe, @Nonnull final ResourceHandler resourceHandler)
{
return MetaItem.getCumulative(((ShapelessRecipes) recipe).recipeItems.toArray(), resourceHandler);
final TIntList recipeKeys = MetaItem.getList(((ShapelessRecipes) recipe).recipeItems.toArray(), resourceHandler);
int recipeKey = 0;
recipeKeys.sort();
for (final TIntIterator recipeKeysIterator = recipeKeys.iterator(); recipeKeysIterator.hasNext(); )
recipeKey += 31 * recipeKeysIterator.next();
return recipeKey;
}

@Override
Expand Down

0 comments on commit 1cf1036

Please sign in to comment.