package buildcraft.core.list;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.WeakHashMap;
import net.minecraft.block.Block;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import cpw.mods.fml.common.FMLCommonHandler;
import cpw.mods.fml.relauncher.Side;
import net.minecraftforge.oredict.OreDictionary;
import buildcraft.core.lib.inventory.StackHelper;
import buildcraft.core.lib.utils.NBTUtils;
public final class ListHandlerOld {
private static final WeakHashMap<ItemStack, StackLine[]> LINE_CACHE = new WeakHashMap<ItemStack, StackLine[]>();
public static class StackLine {
public boolean oreWildcard = false;
public boolean subitemsWildcard = false;
public boolean isOre;
private ItemStack[] stacks = new ItemStack[7];
private ArrayList<ItemStack> ores = new ArrayList<ItemStack>();
private ArrayList<ItemStack> relatedItems = new ArrayList<ItemStack>();
public ItemStack getStack(int index) {
if (index == 0 || (!oreWildcard && !subitemsWildcard)) {
if (index < 7) {
return stacks[index];
} else {
return null;
}
} else if (oreWildcard) {
if (ores.size() >= index) {
return ores.get(index - 1);
} else {
return null;
}
} else {
if (relatedItems.size() >= index) {
return relatedItems.get(index - 1);
} else {
return null;
}
}
}
public void setStack(int slot, ItemStack stack) {
stacks[slot] = stack;
if (stack != null) {
stacks[slot] = stacks[slot].copy();
stacks[slot].stackSize = 1;
}
if (slot == 0) {
relatedItems.clear();
ores.clear();
if (stack == null) {
isOre = false;
} else {
if (FMLCommonHandler.instance().getEffectiveSide() == Side.CLIENT) {
setClientPreviewLists();
} else {
isOre = OreDictionary.getOreIDs(stacks[0]).length > 0;
}
}
}
}
public void writeToNBT(NBTTagCompound nbt) {
nbt.setBoolean("ore", oreWildcard);
nbt.setBoolean("sub", subitemsWildcard);
for (int i = 0; i < 7; ++i) {
if (stacks[i] != null) {
NBTTagCompound stackNBT = new NBTTagCompound();
stacks[i].writeToNBT(stackNBT);
nbt.setTag("stacks[" + i + "]", stackNBT);
}
}
}
public void readFromNBT(NBTTagCompound nbt) {
oreWildcard = nbt.getBoolean("ore");
subitemsWildcard = nbt.getBoolean("sub");
for (int i = 0; i < 7; ++i) {
if (nbt.hasKey("stacks[" + i + "]")) {
setStack(i, ItemStack.loadItemStackFromNBT(nbt.getCompoundTag("stacks[" + i + "]")));
}
}
}
private boolean classMatch(Item base, Item matched) {
if (base.getClass() == Item.class) {
return base == matched;
} else if (base.getClass() == matched.getClass()) {
if (base instanceof ItemBlock) {
Block baseBlock = ((ItemBlock) base).field_150939_a;
Block matchedBlock = ((ItemBlock) matched).field_150939_a;
if (baseBlock.getClass() == Block.class) {
return baseBlock == matchedBlock;
} else {
return baseBlock.equals(matchedBlock);
}
} else {
return true;
}
} else {
return false;
}
}
private boolean oreMatch(ItemStack base, ItemStack matched) {
int[] oreIds = OreDictionary.getOreIDs(base);
int[] matchesIds = OreDictionary.getOreIDs(matched);
for (int stackId : oreIds) {
for (int matchId : matchesIds) {
if (stackId == matchId) {
return true;
}
}
}
return false;
}
private void setClientPreviewLists() {
Item baseItem = stacks[0].getItem();
int[] oreIds = OreDictionary.getOreIDs(stacks[0]);
isOre = oreIds.length > 0;
for (Object o : Item.itemRegistry) {
Item item = (Item) o;
boolean classMatch = classMatch(baseItem, item);
List list = new LinkedList();
for (CreativeTabs tab : item.getCreativeTabs()) {
item.getSubItems(item, tab, list);
}
if (list.size() > 0) {
for (Object ol : list) {
ItemStack stack = (ItemStack) ol;
if (classMatch && relatedItems.size() <= 7 && !StackHelper.isMatchingItemOrList(stacks[0], stack)) {
relatedItems.add(stack);
}
if (isOre && ores.size() <= 7 && !StackHelper.isMatchingItemOrList(stacks[0], stack)
&& oreMatch(stacks[0], stack)) {
ores.add(stack);
}
}
}
}
}
public boolean matches(ItemStack item) {
if (subitemsWildcard) {
if (stacks[0] == null) {
return false;
}
return classMatch(stacks[0].getItem(), item.getItem());
} else if (oreWildcard) {
if (stacks[0] == null) {
return false;
}
return oreMatch(stacks[0], item);
} else {
for (ItemStack stack : stacks) {
if (stack != null && StackHelper.isMatchingItem(stack, item, true, false)) {
return true;
}
}
return false;
}
}
}
private ListHandlerOld() {
}
public static void saveLine(ItemStack stack, StackLine line, int index) {
NBTTagCompound nbt = NBTUtils.getItemData(stack);
nbt.setBoolean("written", true);
NBTTagCompound lineNBT = new NBTTagCompound();
line.writeToNBT(lineNBT);
nbt.setTag("line[" + index + "]", lineNBT);
}
public static StackLine[] getLines(ItemStack stack) {
if (LINE_CACHE.containsKey(stack)) {
return LINE_CACHE.get(stack);
}
StackLine[] result = new StackLine[6];
for (int i = 0; i < 6; ++i) {
result[i] = new StackLine();
}
NBTTagCompound nbt = NBTUtils.getItemData(stack);
if (nbt.hasKey("written")) {
for (int i = 0; i < 6; ++i) {
result[i].readFromNBT(nbt.getCompoundTag("line[" + i + "]"));
}
}
LINE_CACHE.put(stack, result);
return result;
}
public static boolean matches(ItemStack stackList, ItemStack item) {
StackLine[] lines = getLines(stackList);
if (lines != null) {
for (StackLine line : lines) {
if (line != null && line.matches(item)) {
return true;
}
}
}
return false;
}
}