Store ItemStackWrappers instead of just ItemStacks (#844)

* Store ItemStackWrappers instead of just ItemStacks
Allows proper usage of getRecipeForInput()

* Refactoring and helper methods
This commit is contained in:
Arcaratus 2016-07-08 18:13:46 -04:00 committed by Nick Ignoffo
parent 46a35ac1fb
commit c34bd48aa5
5 changed files with 51 additions and 15 deletions

View file

@ -1,5 +1,6 @@
package WayofTime.bloodmagic.altar; package WayofTime.bloodmagic.altar;
import java.util.Collections;
import java.util.List; import java.util.List;
import lombok.Getter; import lombok.Getter;
@ -354,7 +355,8 @@ public class BloodAltar implements IFluidHandler
if (tileAltar.getStackInSlot(0) != null) if (tileAltar.getStackInSlot(0) != null)
{ {
// Do recipes // Do recipes
for (AltarRecipe recipe : AltarRecipeRegistry.getRecipes().values()) AltarRecipe recipe = AltarRecipeRegistry.getRecipeForInput(tileAltar.getStackInSlot(0));
if (recipe != null)
{ {
if (recipe.doesRequiredItemMatch(tileAltar.getStackInSlot(0), altarTier)) if (recipe.doesRequiredItemMatch(tileAltar.getStackInSlot(0), altarTier))
{ {

View file

@ -8,6 +8,9 @@ import net.minecraft.item.Item;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagCompound;
import java.util.ArrayList;
import java.util.List;
@RequiredArgsConstructor @RequiredArgsConstructor
@EqualsAndHashCode @EqualsAndHashCode
public class ItemStackWrapper public class ItemStackWrapper
@ -80,4 +83,22 @@ public class ItemStackWrapper
result.setTagCompound(nbtTag); result.setTagCompound(nbtTag);
return result; return result;
} }
public static List<ItemStackWrapper> toWrapperList(List<ItemStack> itemStackList)
{
List<ItemStackWrapper> wrapperList = new ArrayList<ItemStackWrapper>();
for (ItemStack stack : itemStackList)
wrapperList.add(ItemStackWrapper.getHolder(stack));
return wrapperList;
}
public static List<ItemStack> toStackList(List<ItemStackWrapper> wrapperList)
{
List<ItemStack> stackList = new ArrayList<ItemStack>();
for (ItemStackWrapper wrapper : wrapperList)
stackList.add(wrapper.toStack());
return stackList;
}
} }

View file

@ -1,6 +1,7 @@
package WayofTime.bloodmagic.api.registry; package WayofTime.bloodmagic.api.registry;
import WayofTime.bloodmagic.api.BloodMagicAPI; import WayofTime.bloodmagic.api.BloodMagicAPI;
import WayofTime.bloodmagic.api.ItemStackWrapper;
import WayofTime.bloodmagic.api.altar.EnumAltarTier; import WayofTime.bloodmagic.api.altar.EnumAltarTier;
import com.google.common.collect.BiMap; import com.google.common.collect.BiMap;
import com.google.common.collect.HashBiMap; import com.google.common.collect.HashBiMap;
@ -15,7 +16,7 @@ import java.util.List;
public class AltarRecipeRegistry public class AltarRecipeRegistry
{ {
private static BiMap<List<ItemStack>, AltarRecipe> recipes = HashBiMap.create(); private static BiMap<List<ItemStackWrapper>, AltarRecipe> recipes = HashBiMap.create();
/** /**
* Registers an {@link AltarRecipe} for the Blood Altar. This can be a * Registers an {@link AltarRecipe} for the Blood Altar. This can be a
@ -50,13 +51,24 @@ public class AltarRecipeRegistry
*/ */
public static AltarRecipe getRecipeForInput(List<ItemStack> input) public static AltarRecipe getRecipeForInput(List<ItemStack> input)
{ {
if (recipes.keySet().contains(input)) List<ItemStackWrapper> wrapperList = ItemStackWrapper.toWrapperList(input);
return recipes.get(input); if (recipes.keySet().contains(wrapperList))
return recipes.get(wrapperList);
return null; return null;
} }
public static BiMap<List<ItemStack>, AltarRecipe> getRecipes() public static AltarRecipe getRecipeForInput(ItemStack input)
{
return getRecipeForInput(Collections.singletonList(input));
}
public static AltarRecipe getRecipeForInput(String input)
{
return getRecipeForInput(OreDictionary.getOres(input));
}
public static BiMap<List<ItemStackWrapper>, AltarRecipe> getRecipes()
{ {
return HashBiMap.create(recipes); return HashBiMap.create(recipes);
} }
@ -66,7 +78,7 @@ public class AltarRecipeRegistry
@EqualsAndHashCode @EqualsAndHashCode
public static class AltarRecipe public static class AltarRecipe
{ {
private final List<ItemStack> input; private final List<ItemStackWrapper> input;
private final ItemStack output; private final ItemStack output;
private final EnumAltarTier minTier; private final EnumAltarTier minTier;
private final int syphon, consumeRate, drainRate; private final int syphon, consumeRate, drainRate;
@ -96,7 +108,7 @@ public class AltarRecipeRegistry
*/ */
public AltarRecipe(List<ItemStack> input, ItemStack output, EnumAltarTier minTier, int syphon, int consumeRate, int drainRate, boolean fillable) public AltarRecipe(List<ItemStack> input, ItemStack output, EnumAltarTier minTier, int syphon, int consumeRate, int drainRate, boolean fillable)
{ {
this.input = input; this.input = ItemStackWrapper.toWrapperList(input);
this.output = output; this.output = output;
this.minTier = minTier; this.minTier = minTier;
this.syphon = syphon < 0 ? -syphon : syphon; this.syphon = syphon < 0 ? -syphon : syphon;
@ -138,8 +150,8 @@ public class AltarRecipeRegistry
if (tierCheck.ordinal() < minTier.ordinal()) if (tierCheck.ordinal() < minTier.ordinal())
return false; return false;
for (ItemStack stack : input) for (ItemStackWrapper stack : input)
if (comparedStack.isItemEqual(stack)) if (comparedStack.isItemEqual(stack.toStack()))
return true; return true;
return false; return false;

View file

@ -1,5 +1,6 @@
package WayofTime.bloodmagic.compat.guideapi.page; package WayofTime.bloodmagic.compat.guideapi.page;
import WayofTime.bloodmagic.api.ItemStackWrapper;
import WayofTime.bloodmagic.api.registry.AltarRecipeRegistry; import WayofTime.bloodmagic.api.registry.AltarRecipeRegistry;
import WayofTime.bloodmagic.util.helper.TextHelper; import WayofTime.bloodmagic.util.helper.TextHelper;
import amerifrance.guideapi.api.impl.Book; import amerifrance.guideapi.api.impl.Book;
@ -29,7 +30,7 @@ public class PageAltarRecipe extends Page
public PageAltarRecipe(AltarRecipeRegistry.AltarRecipe recipe) public PageAltarRecipe(AltarRecipeRegistry.AltarRecipe recipe)
{ {
this.input = recipe.getInput(); this.input = ItemStackWrapper.toStackList(recipe.getInput());
this.output = recipe.getOutput(); this.output = recipe.getOutput();
this.tier = recipe.getMinTier().toInt(); this.tier = recipe.getMinTier().toInt();
this.bloodRequired = recipe.getSyphon(); this.bloodRequired = recipe.getSyphon();

View file

@ -7,27 +7,27 @@ import java.util.Map;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import WayofTime.bloodmagic.api.BloodMagicAPI; import WayofTime.bloodmagic.api.BloodMagicAPI;
import WayofTime.bloodmagic.api.ItemStackWrapper;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import WayofTime.bloodmagic.api.orb.IBloodOrb; import WayofTime.bloodmagic.api.orb.IBloodOrb;
import WayofTime.bloodmagic.api.registry.AltarRecipeRegistry; import WayofTime.bloodmagic.api.registry.AltarRecipeRegistry;
import net.minecraftforge.common.ForgeModContainer; import net.minecraftforge.common.ForgeModContainer;
import net.minecraftforge.fluids.UniversalBucket;
public class AltarRecipeMaker public class AltarRecipeMaker
{ {
@Nonnull @Nonnull
public static List<AltarRecipeJEI> getRecipes() public static List<AltarRecipeJEI> getRecipes()
{ {
Map<List<ItemStack>, AltarRecipeRegistry.AltarRecipe> altarMap = AltarRecipeRegistry.getRecipes(); Map<List<ItemStackWrapper>, AltarRecipeRegistry.AltarRecipe> altarMap = AltarRecipeRegistry.getRecipes();
ArrayList<AltarRecipeJEI> recipes = new ArrayList<AltarRecipeJEI>(); ArrayList<AltarRecipeJEI> recipes = new ArrayList<AltarRecipeJEI>();
for (Map.Entry<List<ItemStack>, AltarRecipeRegistry.AltarRecipe> itemStackAltarRecipeEntry : altarMap.entrySet()) for (Map.Entry<List<ItemStackWrapper>, AltarRecipeRegistry.AltarRecipe> itemStackAltarRecipeEntry : altarMap.entrySet())
{ {
// Make sure input is not a Blood Orb. If it is, the recipe is for a filling orb, and we don't want that. // Make sure input is not a Blood Orb. If it is, the recipe is for a filling orb, and we don't want that.
if (!(itemStackAltarRecipeEntry.getKey().get(0).getItem() instanceof IBloodOrb)) if (!(itemStackAltarRecipeEntry.getKey().get(0).toStack().getItem() instanceof IBloodOrb))
{ {
List<ItemStack> input = itemStackAltarRecipeEntry.getValue().getInput(); List<ItemStack> input = ItemStackWrapper.toStackList(itemStackAltarRecipeEntry.getValue().getInput());
ItemStack output = itemStackAltarRecipeEntry.getValue().getOutput(); ItemStack output = itemStackAltarRecipeEntry.getValue().getOutput();
int requiredTier = itemStackAltarRecipeEntry.getValue().getMinTier().toInt(); int requiredTier = itemStackAltarRecipeEntry.getValue().getMinTier().toInt();
int requiredLP = itemStackAltarRecipeEntry.getValue().getSyphon(); int requiredLP = itemStackAltarRecipeEntry.getValue().getSyphon();