package buildcraft.core.list;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import buildcraft.api.lists.ListMatchHandler;
import buildcraft.api.lists.ListRegistry;
import buildcraft.core.lib.inventory.StackHelper;
import buildcraft.core.lib.utils.NBTUtils;
public final class ListHandlerNew {
public static final int WIDTH = 9;
public static final int HEIGHT = 2;
public static class Line {
public final ItemStack[] stacks;
public boolean precise, byType, byMaterial;
public Line() {
stacks = new ItemStack[WIDTH];
}
public boolean isOneStackMode() {
return byType || byMaterial;
}
public boolean getOption(int id) {
return id == 0 ? precise : (id == 1 ? byType : byMaterial);
}
public void toggleOption(int id) {
if (byType == false && byMaterial == false && (id == 1 || id == 2)) {
for (int i = 1; i < stacks.length; i++) {
stacks[i] = null;
}
}
switch (id) {
case 0:
precise = !precise;
break;
case 1:
byType = !byType;
break;
case 2:
byMaterial = !byMaterial;
break;
}
}
public boolean matches(ItemStack target) {
if (byType || byMaterial) {
if (stacks[0] == null) {
return false;
}
List<ListMatchHandler> handlers = ListRegistry.getHandlers();
ListMatchHandler.Type type = getSortingType();
for (ListMatchHandler h : handlers) {
if (h.matches(type, stacks[0], target, precise)) {
return true;
}
}
} else {
for (ItemStack s : stacks) {
if (s != null && StackHelper.isMatchingItem(s, target, true, precise)) {
// If precise, re-check damage
if (!precise || s.getItemDamage() == target.getItemDamage()) {
return true;
}
}
}
}
return false;
}
public ListMatchHandler.Type getSortingType() {
return byType ? (byMaterial ? ListMatchHandler.Type.CLASS : ListMatchHandler.Type.TYPE) : ListMatchHandler.Type.MATERIAL;
}
public static Line fromNBT(NBTTagCompound data) {
Line line = new Line();
if (data != null && data.hasKey("st")) {
NBTTagList l = data.getTagList("st", 10);
for (int i = 0; i < l.tagCount(); i++) {
line.stacks[i] = ItemStack.loadItemStackFromNBT(l.getCompoundTagAt(i));
}
line.precise = data.getBoolean("Fp");
line.byType = data.getBoolean("Ft");
line.byMaterial = data.getBoolean("Fm");
}
return line;
}
public NBTTagCompound toNBT() {
NBTTagCompound data = new NBTTagCompound();
NBTTagList stackList = new NBTTagList();
for (ItemStack stack1 : stacks) {
NBTTagCompound stack = new NBTTagCompound();
if (stack1 != null) {
stack1.writeToNBT(stack);
}
stackList.appendTag(stack);
}
data.setTag("st", stackList);
data.setBoolean("Fp", precise);
data.setBoolean("Ft", byType);
data.setBoolean("Fm", byMaterial);
return data;
}
public void setStack(int slotIndex, ItemStack stack) {
if (slotIndex == 0 || (!byType && !byMaterial)) {
if (stack != null && stack.getItem() != null) {
stacks[slotIndex] = stack.copy();
stacks[slotIndex].stackSize = 1;
} else {
stacks[slotIndex] = null;
}
}
}
public ItemStack getStack(int i) {
return i >= 0 && i < stacks.length ? stacks[i] : null;
}
public List<ItemStack> getExamples() {
List<ItemStack> stackList = new ArrayList<ItemStack>();
if (stacks[0] != null) {
List<ListMatchHandler> handlers = ListRegistry.getHandlers();
List<ListMatchHandler> handlersCustom = new ArrayList<ListMatchHandler>();
ListMatchHandler.Type type = getSortingType();
for (ListMatchHandler h : handlers) {
if (h.isValidSource(type, stacks[0])) {
List<ItemStack> examples = h.getClientExamples(type, stacks[0]);
if (examples != null) {
stackList.addAll(examples);
} else {
handlersCustom.add(h);
}
}
}
if (handlersCustom.size() > 0) {
for (Object o : Item.itemRegistry) {
if (o != null && o instanceof Item) {
Item i = (Item) o;
List<ItemStack> examples = new ArrayList<ItemStack>();
i.getSubItems(i, CreativeTabs.tabMisc, examples);
for (ItemStack s : examples) {
for (ListMatchHandler mh : handlersCustom) {
if (mh.matches(type, stacks[0], s, false)) {
stackList.add(s);
break;
}
}
}
}
}
}
Collections.shuffle(stackList);
}
return stackList;
}
}
private ListHandlerNew() {
}
public static Line[] getLines(ItemStack item) {
NBTTagCompound data = NBTUtils.getItemData(item);
if (data.hasKey("written") && data.hasKey("lines")) {
NBTTagList list = data.getTagList("lines", 10);
Line[] lines = new Line[list.tagCount()];
for (int i = 0; i < lines.length; i++) {
lines[i] = Line.fromNBT(list.getCompoundTagAt(i));
}
return lines;
} else {
Line[] lines = new Line[HEIGHT];
for (int i = 0; i < lines.length; i++) {
lines[i] = new Line();
}
return lines;
}
}
public static void saveLines(ItemStack stackList, Line[] lines) {
NBTTagCompound data = NBTUtils.getItemData(stackList);
data.setBoolean("written", true);
NBTTagList lineList = new NBTTagList();
for (Line l : lines) {
lineList.appendTag(l.toNBT());
}
data.setTag("lines", lineList);
}
public static boolean matches(ItemStack stackList, ItemStack item) {
NBTTagCompound data = NBTUtils.getItemData(stackList);
if (data.hasKey("written") && data.hasKey("lines")) {
NBTTagList list = data.getTagList("lines", 10);
for (int i = 0; i < list.tagCount(); i++) {
Line line = Line.fromNBT(list.getCompoundTagAt(i));
if (line.matches(item)) {
return true;
}
}
}
return false;
}
}