package mods.eln.generic;
import cpw.mods.fml.common.registry.GameRegistry;
import cpw.mods.fml.common.registry.LanguageRegistry;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import mods.eln.misc.UtilsClient;
import net.minecraft.block.Block;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.IIcon;
import net.minecraft.world.World;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;
public class GenericItemUsingDamage<Descriptor extends GenericItemUsingDamageDescriptor> extends Item implements IGenericItemUsingDamage {
public Hashtable<Integer, Descriptor> subItemList = new Hashtable<Integer, Descriptor>();
ArrayList<Integer> orderList = new ArrayList<Integer>();
Descriptor defaultElement = null;
public GenericItemUsingDamage() {
super();
setHasSubtypes(true);
}
public void setDefaultElement(Descriptor descriptor) {
defaultElement = descriptor;
}
public void addWithoutRegistry(int damage, Descriptor descriptor) {
subItemList.put(damage, descriptor);
ItemStack stack = new ItemStack(this, 1, damage);
LanguageRegistry.addName(stack, descriptor.name);
descriptor.setParent(this, damage);
}
public void addElement(int damage, Descriptor descriptor) {
subItemList.put(damage, descriptor);
ItemStack stack = new ItemStack(this, 1, damage);
LanguageRegistry.addName(stack, descriptor.name);
orderList.add(damage);
descriptor.setParent(this, damage);
GameRegistry.registerCustomItemStack(descriptor.name, descriptor.newItemStack(1));
}
public Descriptor getDescriptor(int damage) {
return subItemList.get(damage);
}
public Descriptor getDescriptor(ItemStack itemStack) {
if (itemStack == null)
return defaultElement;
if (itemStack.getItem() != this)
return defaultElement;
return getDescriptor(itemStack.getItemDamage());
}
@Override
public ItemStack onItemRightClick(ItemStack s, World w, EntityPlayer p) {
Descriptor desc = getDescriptor(s);
if (desc == null)
return s;
return desc.onItemRightClick(s, w, p);
}
/*//caca1.5.1
@Override
@SideOnly(Side.CLIENT)
public int getIconFromDamage(int damage) {
return getDescriptor(damage).getIconId();
}
@Override
public String getTextureFile () {
return CommonProxy.ITEMS_PNG;
}
@Override
public String getItemNameIS(ItemStack itemstack) {
return getItemName() + "." + getDescriptor(itemstack).name;
}
/*
@Override
public String getUnlocalizedNameInefficiently(ItemStack par1ItemStack) {
return "trololol";
}
*/
@Override
public String getUnlocalizedName(ItemStack par1ItemStack) {
Descriptor desc = getDescriptor(par1ItemStack);
if (desc != null && desc.name != null) {
return desc.name.replaceAll("\\s+", "_");
} else {
return null;
}
}
/*
@Override
public String getItemStackDisplayName(ItemStack par1ItemStack) {
Descriptor desc = getDescriptor(par1ItemStack);
if (desc == null)
return "NullItem";
return desc.getName(par1ItemStack);
}
*/
public IIcon getIconFromDamage(int damage) {
GenericItemUsingDamageDescriptor desc = getDescriptor(damage);
if (desc != null) {
return getDescriptor(damage).getIcon();
}
return null;
}
@Override
@SideOnly(value = Side.CLIENT)
public void registerIcons(IIconRegister iconRegister) {
for (GenericItemUsingDamageDescriptor descriptor : subItemList.values()) {
descriptor.updateIcons(iconRegister);
}
}
@Override
@SideOnly(Side.CLIENT)
public void getSubItems(Item itemID, CreativeTabs tabs, List list) {
// You can also take a more direct approach and do each one individual but I prefer the lazy / right way
for (int id : orderList) {
subItemList.get(id).getSubItems(list);
}
}
public void addInformation(ItemStack itemStack, EntityPlayer entityPlayer, List list, boolean par4) {
/*Descriptor desc = getDescriptor(itemStack);
if (desc == null)
return;
desc.addInformation(itemStack, entityPlayer, list, par4);
*/
Descriptor desc = getDescriptor(itemStack);
if (desc == null) return;
List listFromDescriptor = new ArrayList();
desc.addInformation(itemStack, entityPlayer, listFromDescriptor, par4);
UtilsClient.showItemTooltip(listFromDescriptor, list);
}
/**
* Callback for item usage. If the item does something special on right clicking, he will have one of those. Return
* True if something happen and false if it don't. This is for ITEMS, not BLOCKS
*/
@Override
public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float vx, float vy, float vz) {
GenericItemUsingDamageDescriptor d = getDescriptor(stack);
if (d == null)
return false;
return d.onItemUse(stack, player, world, x, y, z, side, vx, vy, vz);
}
public boolean onEntitySwing(EntityLivingBase entityLiving, ItemStack stack) {
GenericItemUsingDamageDescriptor d = getDescriptor(stack);
if (d == null)
return super.onEntitySwing(entityLiving, stack);
return d.onEntitySwing(entityLiving, stack);
}
public boolean onBlockStartBreak(ItemStack itemstack, int X, int Y, int Z, EntityPlayer player) {
GenericItemUsingDamageDescriptor d = getDescriptor(itemstack);
if (d == null)
return super.onBlockStartBreak(itemstack, X, Y, Z, player);
return d.onBlockStartBreak(itemstack, X, Y, Z, player);
}
public void onUpdate(ItemStack stack, World world, Entity entity, int par4, boolean par5) {
if (world.isRemote) {
return;
}
GenericItemUsingDamageDescriptor d = getDescriptor(stack);
if (d == null)
return;
d.onUpdate(stack, world, entity, par4, par5);
}
@Override
public float func_150893_a(ItemStack stack, Block block) { //getStrVsBlock
GenericItemUsingDamageDescriptor d = getDescriptor(stack);
if (d == null)
return 0.2f;
return d.getStrVsBlock(stack, block);
}
@Override
public boolean canHarvestBlock(Block par1Block, ItemStack item) {
return true;
}
@Override
public boolean onBlockDestroyed(ItemStack stack, World w, Block block, int x, int y, int z, EntityLivingBase entity) {
if (w.isRemote) {
return false;
}
GenericItemUsingDamageDescriptor d = getDescriptor(stack);
if (d == null)
return true;
return d.onBlockDestroyed(stack, w, block, x, y, z, entity);
}
@Override
public boolean onDroppedByPlayer(ItemStack item, EntityPlayer player) {
GenericItemUsingDamageDescriptor d = getDescriptor(item);
if (d == null)
return super.onDroppedByPlayer(item, player);
return d.onDroppedByPlayer(item, player);
}
}