package minefantasy.mf2.item.gadget;
import java.util.List;
import minefantasy.mf2.MineFantasyII;
import minefantasy.mf2.api.crafting.ISpecialSalvage;
import minefantasy.mf2.entity.EntityMine;
import minefantasy.mf2.item.list.CreativeTabMF;
import minefantasy.mf2.item.list.ToolListMF;
import minefantasy.mf2.mechanics.BombDispenser;
import net.minecraft.block.BlockDispenser;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.EnumAction;
import net.minecraft.item.EnumRarity;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.IIcon;
import net.minecraft.util.StatCollector;
import net.minecraft.world.World;
import cpw.mods.fml.common.registry.GameRegistry;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
public class ItemMine extends Item implements ISpecialSalvage
{
public ItemMine(String name)
{
this.maxStackSize = 16;
this.setCreativeTab(CreativeTabMF.tabGadget);
setTextureName("minefantasy2:Other/"+name);
GameRegistry.registerItem(this, name, MineFantasyII.MODID);
this.setUnlocalizedName(name);
BlockDispenser.dispenseBehaviorRegistry.putObject(this, new BombDispenser());
}
@Override
public EnumAction getItemUseAction(ItemStack item)
{
return EnumAction.block;
}
@Override
public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer user)
{
if(!user.isSwingInProgress)
{
world.playSoundEffect(user.posX, user.posY + 1.5D, user.posZ, "fire.ignite", 1.0F, itemRand.nextFloat() * 0.4F + 0.8F);
user.setItemInUse(item, getMaxItemUseDuration(item));
}
return item;
}
@Override
public int getMaxItemUseDuration(ItemStack item)
{
return 35;
}
@Override
public ItemStack onEaten(ItemStack item, World world, EntityPlayer user)
{
world.playSoundEffect(user.posX, user.posY+1.5, user.posZ, "random.click", 1.0F, 1.0F);
user.swingItem();
if (!user.capabilities.isCreativeMode)
{
--item.stackSize;
}
if (!world.isRemote)
{
world.spawnEntityInWorld(new EntityMine(world, user).setType(getFilling(item), getCasing(item), getFuse(item), getPowder(item)));
}
return item;
}
@Override
public void addInformation(ItemStack item, EntityPlayer user, List list, boolean fullInfo)
{
super.addInformation(item, user, list, fullInfo);
EnumExplosiveType fill = EnumExplosiveType.getType(getFilling(item));
EnumCasingType casing = EnumCasingType.getType(getCasing(item));
EnumFuseType fuse = EnumFuseType.getType(getFuse(item));
EnumPowderType powder = EnumPowderType.getType(getPowder(item));
int damage = (int) (fill.damage*casing.damageModifier*powder.damageModifier);
float range = fill.range*casing.rangeModifier*powder.rangeModifier;
float fusetime = (float)fuse.time/20F;
list.add(StatCollector.translateToLocal("bomb.case."+casing.name+".name"));
list.add(StatCollector.translateToLocal("bomb.powder."+powder.name+".name"));
list.add(StatCollector.translateToLocal("bomb.fuse."+fuse.name+".name"));
list.add("");
list.add(StatCollector.translateToLocalFormatted("bomb.fusetime.name", fusetime));
list.add(StatCollector.translateToLocal("bomb.damage.name")+": "+damage);
list.add(StatCollector.translateToLocalFormatted("bomb.range.metric.name", range));
}
@Override
public String getUnlocalizedName(ItemStack item)
{
EnumExplosiveType type = EnumExplosiveType.getType(getFilling(item));
return "item.mine_"+type.name;
}
private static final String powderNBT = "MineFantasy_PowderType";
private static final String fuseNBT = "MineFantasy_FuseType";
private static final String fillingNBT = "MineFantasy_ExplosiveType";
private static final String casingNBT = "MineFantasy_CaseType";
public static void setFuse(ItemStack item, byte fuse)
{
NBTTagCompound nbt = getNBT(item);
nbt.setByte(fuseNBT, fuse);
}
public static byte getFuse(ItemStack item)
{
NBTTagCompound nbt = getNBT(item);
if(nbt.hasKey(fuseNBT))
{
return nbt.getByte(fuseNBT);
}
return (byte)0;
}
public static void setPowder(ItemStack item, byte powder)
{
NBTTagCompound nbt = getNBT(item);
nbt.setByte(powderNBT, powder);
}
public static byte getPowder(ItemStack item)
{
NBTTagCompound nbt = getNBT(item);
if(nbt.hasKey(powderNBT))
{
return nbt.getByte(powderNBT);
}
return (byte)0;
}
/**
* 0 = Basic
* 1 = Shrapnel
* 2 = Fire
*/
public static void setFilling(ItemStack item, byte filling)
{
NBTTagCompound nbt = getNBT(item);
nbt.setByte(fillingNBT, filling);
}
public static byte getFilling(ItemStack item)
{
NBTTagCompound nbt = getNBT(item);
if(nbt.hasKey(fillingNBT))
{
return nbt.getByte(fillingNBT);
}
return (byte)0;
}
/**
* 0 = Ceramic
* 1 = Iron
*/
public static void setCasing(ItemStack item, byte casing)
{
NBTTagCompound nbt = getNBT(item);
nbt.setByte(casingNBT, casing);
}
public static byte getCasing(ItemStack item)
{
NBTTagCompound nbt = getNBT(item);
if(nbt.hasKey(casingNBT))
{
return nbt.getByte(casingNBT);
}
return (byte)0;
}
public static NBTTagCompound getNBT(ItemStack item)
{
if(!item.hasTagCompound())item.setTagCompound(new NBTTagCompound());
return item.getTagCompound();
}
public ItemStack createMine(byte casing, byte filling, byte fuse, byte powder, int stackSize)
{
return ItemBomb.createExplosive(this, casing, filling, fuse, powder, stackSize);
}
@Override
public void getSubItems(Item item, CreativeTabs tab, List list)
{
list.add(createMine((byte)0, (byte)0, (byte)0, (byte)0, 1));
list.add(createMine((byte)0, (byte)1, (byte)0, (byte)0, 1));
list.add(createMine((byte)0, (byte)2, (byte)0, (byte)0, 1));
list.add(createMine((byte)1, (byte)0, (byte)0, (byte)0, 1));
list.add(createMine((byte)1, (byte)1, (byte)0, (byte)0, 1));
list.add(createMine((byte)1, (byte)2, (byte)0, (byte)0, 1));
list.add(createMine((byte)2, (byte)0, (byte)0, (byte)0, 1));
list.add(createMine((byte)2, (byte)1, (byte)0, (byte)0, 1));
list.add(createMine((byte)2, (byte)2, (byte)0, (byte)0, 1));
list.add(createMine((byte)3, (byte)0, (byte)0, (byte)0, 1));
list.add(createMine((byte)3, (byte)1, (byte)0, (byte)0, 1));
list.add(createMine((byte)3, (byte)2, (byte)0, (byte)0, 1));
}
//TODO Icons
@SideOnly(Side.CLIENT)
public IIcon getIcon(byte type)
{
return mines[type];
}
private IIcon[] mines = new IIcon[4];
@Override
@SideOnly(Side.CLIENT)
public void registerIcons(IIconRegister reg)
{
this.itemIcon = mines[0] = reg.registerIcon("minefantasy2:Other/mine_ceramic");
mines[1] = reg.registerIcon("minefantasy2:Other/mine_iron");
mines[2] = reg.registerIcon("minefantasy2:Other/mine_obsidian");
mines[3] = reg.registerIcon("minefantasy2:Other/mine_crystal");
}
@Override
@SideOnly(Side.CLIENT)
public IIcon getIconIndex(ItemStack item)
{
int type = getCasing(item);
return mines[type];
}
@Override
@SideOnly(Side.CLIENT)
public IIcon getIcon(ItemStack item, int layer)
{
if(layer > 0)
{
int type = getFilling(item);
if(type != 0)
{
return ToolListMF.bomb_custom.icons[type-1];
}
}
return getIconIndex(item);
}
@Override
@SideOnly(Side.CLIENT)
public boolean requiresMultipleRenderPasses()
{
return true;
}
@Override
public EnumRarity getRarity(ItemStack item)
{
if(getFilling(item) >= 2 || getCasing(item) >= 2)
{
return EnumRarity.uncommon;
}
return EnumRarity.common;
}
@Override
public Object[] getSalvage(ItemStack item)
{
return new Object[]
{
ItemBombComponent.getBombComponent("minecase", getCasing(item)),
ItemBombComponent.getBombComponent("fuse", getFuse(item)),
ItemBombComponent.getBombComponent("powder", getPowder(item)),
ItemBombComponent.getBombComponent("filling", getFilling(item)),
};
}
}