package com.cricketcraft.chisel.carving;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import net.minecraft.block.Block;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraftforge.oredict.OreDictionary;
import com.cricketcraft.chisel.Chisel;
import com.cricketcraft.chisel.api.carving.CarvingUtils;
import com.cricketcraft.chisel.api.carving.ICarvingGroup;
import com.cricketcraft.chisel.api.carving.ICarvingRegistry;
import com.cricketcraft.chisel.api.carving.ICarvingVariation;
public class Carving implements ICarvingRegistry {
GroupList groups = new GroupList();
public static final ICarvingRegistry chisel = new Carving();
public static final Carving needle = new Carving();
static {
CarvingUtils.chisel = chisel;
}
public static void construct() {}
private Carving() {
}
@Override
public ICarvingVariation getVariation(Block block, int metadata) {
ICarvingGroup g = getGroup(block, metadata);
if (g != null) {
for (ICarvingVariation v : g.getVariations()) {
if (v.getBlock() == block && v.getBlockMeta() == metadata) {
return v;
}
}
}
return null;
}
@Override
public List<ICarvingVariation> getGroupVariations(Block block, int metadata) {
ICarvingGroup group = getGroup(block, metadata);
if (group == null)
return null;
return group.getVariations();
}
@Override
public String getOreName(Block block, int metadata) {
ICarvingGroup group = getGroup(block, metadata);
if (group == null)
return null;
return group.getOreName();
}
@Override
public List<ItemStack> getItemsForChiseling(ItemStack chiseledItem) {
ArrayList<ItemStack> items = new ArrayList<ItemStack>();
ICarvingGroup group = null;
int[] oreids = OreDictionary.getOreIDs(chiseledItem);
for (int i : oreids) {
group = groups.getGroupByOre(OreDictionary.getOreName(i));
if (group != null) {
break;
}
}
if (group == null) {
group = getGroup(Block.getBlockFromItem(chiseledItem.getItem()), chiseledItem.getItemDamage());
}
if (group == null)
return items;
HashMap<String, Integer> mapping = new HashMap<String, Integer>();
List<ICarvingVariation> variations = group.getVariations();
if (!group.getVariations().isEmpty()) {
for (ICarvingVariation v : variations) {
String key = Block.getIdFromBlock(v.getBlock()) + "|" + v.getItemMeta();
if (mapping.containsKey(key))
continue;
mapping.put(key, 1);
items.add(new ItemStack(v.getBlock(), 1, v.getItemMeta()));
}
}
ArrayList<ItemStack> ores;
String oreName = group.getOreName();
if (oreName != null && ((ores = OreDictionary.getOres(oreName)) != null)) {
for (ItemStack stack : ores) {
String key = Item.getIdFromItem(stack.getItem()) + "|" + stack.getItemDamage();
if (mapping.containsKey(key))
continue;
mapping.put(key, 2);
items.add(stack);
}
}
return items;
}
@Override
public ICarvingGroup getGroup(Block block, int metadata) {
int[] ids = OreDictionary.getOreIDs(new ItemStack(block, 1, metadata));
if (ids.length > 0) {
for (int id : ids) {
ICarvingGroup oreGroup = groups.getGroupByOre(OreDictionary.getOreName(id));
if (oreGroup != null) {
return oreGroup;
}
}
}
return groups.getGroup(block, metadata);
}
@Override
public ICarvingGroup getGroup(String name) {
return groups.getGroupByName(name);
}
@Override
public ICarvingGroup removeGroup(String groupName) {
ICarvingGroup g = groups.getGroupByName(groupName);
return groups.remove(g) ? g : null;
}
@Override
public ICarvingVariation removeVariation(Block block, int metadata) {
return removeVariation(block, metadata, null);
}
@Override
public ICarvingVariation removeVariation(Block block, int metadata, String group) {
return groups.removeVariation(block, metadata, group);
}
@Override
public void addVariation(String groupName, Block block, int metadata, int order) {
if (block == null) {
throw new NullPointerException("Cannot add variation in group " + groupName + " for null block.");
}
ICarvingVariation variation = CarvingUtils.getDefaultVariationFor(block, metadata, order);
addVariation(groupName, variation);
}
@Override
public void addVariation(String groupName, ICarvingVariation variation) {
if (groupName == null) {
throw new NullPointerException("Cannot add variation to null group name.");
} else if (variation == null) {
throw new NullPointerException("Cannot add variation in group " + groupName + " for null variation.");
}
ICarvingGroup group = groups.getGroupByName(groupName);
if (group == null) {
group = CarvingUtils.getDefaultGroupFor(groupName);
addGroup(group);
}
groups.addVariation(groupName, variation);
}
@Override
public void addGroup(ICarvingGroup group) {
groups.add(group);
}
@Override
public void registerOre(String name, String oreName) {
ICarvingGroup group = groups.getGroupByName(name);
if (group != null) {
group.setOreName(oreName);
} else {
throw new NullPointerException("Cannot register ore name for group " + name + ", as it does not exist.");
}
}
@Override
public void setVariationSound(String name, String sound) {
ICarvingGroup group = groups.getGroupByName(name);
if (group != null) {
group.setSound(sound);
} else {
throw new NullPointerException("Cannot set sound for group " + name + ", as it does not exist.");
}
}
@Override
public String getVariationSound(Block block, int metadata) {
return getVariationSound(Item.getItemFromBlock(block), metadata);
}
@Override
public String getVariationSound(Item item, int metadata) {
ICarvingGroup group = groups.getGroup(Block.getBlockFromItem(item), metadata);
String sound = group == null ? null : group.getSound();
return sound == null ? Chisel.MOD_ID + ":chisel.fallback" : sound;
}
@Override
public List<String> getSortedGroupNames() {
List<String> names = new ArrayList<String>();
names.addAll(groups.getNames());
Collections.sort(names);
return names;
}
}