package buildcraft.core.list;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.ItemStack;
import net.minecraftforge.oredict.OreDictionary;
import buildcraft.api.lists.ListMatchHandler;
import buildcraft.core.lib.inventory.StackHelper;
public class ListMatchHandlerOreDictionary extends ListMatchHandler {
private int getUppercaseCount(String s) {
int j = 0;
for (int i = 0; i < s.length(); i++) {
if (Character.isUpperCase(s.codePointAt(i))) {
j++;
}
}
return j;
}
@Override
public boolean matches(Type type, ItemStack stack, ItemStack target, boolean precise) {
int[] oreIds = OreDictionary.getOreIDs(stack);
if (oreIds.length == 0) {
// No ore IDs? Time for the best effort plan of METADATA!
if (type == Type.TYPE) {
return StackHelper.isMatchingItem(stack, target, false, false);
}
return false;
}
int[] matchesIds = OreDictionary.getOreIDs(target);
if (type == Type.CLASS) {
for (int i : oreIds) {
for (int j : matchesIds) {
if (i == j) {
return true;
}
}
}
} else {
// Always pick only the longest OreDictionary string for matching.
// It's ugly, but should give us the most precise result for the
// cases in which a given stone is also used for crafting equivalents.
String s = getBestOreString(oreIds);
if (s != null) {
Set<Integer> stackIds = ListOreDictionaryCache.INSTANCE.getListOfPartialMatches(
type == Type.MATERIAL ? ListOreDictionaryCache.getMaterial(s) : ListOreDictionaryCache.getType(s)
);
if (stackIds != null) {
for (int j : stackIds) {
for (int k : matchesIds) {
if (j == k) {
return true;
}
}
}
}
}
}
return false;
}
@Override
public boolean isValidSource(Type type, ItemStack stack) {
if (OreDictionary.getOreIDs(stack).length > 0) {
return true;
}
if (type == Type.TYPE && stack.getHasSubtypes()) {
return true;
}
return false;
}
private String getBestOreString(int[] oreIds) {
String s = null, st;
int suc = 0, suct;
for (int i : oreIds) {
st = OreDictionary.getOreName(i);
suct = getUppercaseCount(st);
if (s == null || suct > suc) {
s = st;
suc = suct;
}
}
return s;
}
@Override
public List<ItemStack> getClientExamples(Type type, ItemStack stack) {
int[] oreIds = OreDictionary.getOreIDs(stack);
List<ItemStack> stacks = new ArrayList<ItemStack>();
if (oreIds.length == 0) {
// No ore IDs? Time for the best effort plan of METADATA!
if (type == Type.TYPE) {
List<ItemStack> tempStack = new ArrayList<ItemStack>();
stack.getItem().getSubItems(stack.getItem(), CreativeTabs.tabMisc, tempStack);
for (ItemStack is : tempStack) {
if (is.getItem() == stack.getItem()) {
stacks.add(is);
}
}
}
return stacks;
}
if (type == Type.CLASS) {
for (int i : oreIds) {
stacks.addAll(OreDictionary.getOres(i));
}
} else {
String s = getBestOreString(oreIds);
if (s != null) {
Set<Integer> stackIds = ListOreDictionaryCache.INSTANCE.getListOfPartialMatches(
type == Type.MATERIAL ? ListOreDictionaryCache.getMaterial(s) : ListOreDictionaryCache.getType(s)
);
if (stackIds != null) {
for (int j : stackIds) {
stacks.addAll(OreDictionary.getOres(j));
}
}
}
}
List<ItemStack> wildcard = new ArrayList<ItemStack>();
for (ItemStack is : stacks) {
if (is != null && is.getItemDamage() == OreDictionary.WILDCARD_VALUE && is.getHasSubtypes()) {
wildcard.add(is);
}
}
for (ItemStack is : wildcard) {
List<ItemStack> wll = new ArrayList<ItemStack>();
is.getItem().getSubItems(is.getItem(), CreativeTabs.tabMisc, wll);
if (wll.size() > 0) {
stacks.remove(is);
stacks.addAll(wll);
}
}
return stacks;
}
}