package minefantasy.mf2.item.gadget;
import java.util.ArrayList;
import java.util.List;
import minefantasy.mf2.MineFantasyII;
import minefantasy.mf2.api.crafting.ISpecialSalvage;
import minefantasy.mf2.entity.EntityBomb;
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.Entity;
import net.minecraft.entity.EntityList;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.passive.EntityChicken;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Items;
import net.minecraft.item.EnumAction;
import net.minecraft.item.EnumRarity;
import net.minecraft.item.Item;
import net.minecraft.item.ItemMonsterPlacer;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.EnumChatFormatting;
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 ItemBomb extends Item implements ISpecialSalvage
{
public ItemBomb(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);
world.playSoundEffect(user.posX, user.posY+1.5, user.posZ, "game.tnt.primed", 1.0F, 1.0F);
user.setItemInUse(item, getMaxItemUseDuration(item));
}
return item;
}
@Override
public int getMaxItemUseDuration(ItemStack item)
{
return 15;
}
@Override
public ItemStack onEaten(ItemStack item, World world, EntityPlayer user)
{
user.swingItem();
if (!user.capabilities.isCreativeMode)
{
--item.stackSize;
}
if (!world.isRemote)
{
EntityBomb bomb = new EntityBomb(world, user).setType(getFilling(item), getCasing(item), getFuse(item), getPowder(item));
world.spawnEntityInWorld(bomb);
if(item.hasTagCompound() && item.getTagCompound().hasKey("stickyBomb"))
{
bomb.getEntityData().setBoolean("stickyBomb", true);
}
}
return item;
}
@Override
public void addInformation(ItemStack item, EntityPlayer user, List list, boolean fullInfo)
{
super.addInformation(item, user, list, fullInfo);
if(item.hasTagCompound() && item.getTagCompound().hasKey("stickyBomb"))
{
list.add(EnumChatFormatting.GREEN + StatCollector.translateToLocal("bomb.case.sticky") + EnumChatFormatting.GRAY);
}
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.bomb_"+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 setSticky(ItemStack item)
{
NBTTagCompound nbt = getNBT(item);
nbt.setBoolean("stickyBomb", true);
}
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(item.getItem() instanceof ItemBomb)
{
return ((ItemBomb)item.getItem()).getItemFuse(nbt.getByte(fuseNBT));
}
return nbt.getByte(fuseNBT);
}
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(item.getItem() instanceof ItemBomb)
{
return ((ItemBomb)item.getItem()).getItemPowder(nbt.getByte(powderNBT));
}
return nbt.getByte(powderNBT);
}
/**
* 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(item.getItem() instanceof ItemBomb)
{
return ((ItemBomb)item.getItem()).getItemFilling(nbt.getByte(fillingNBT));
}
return nbt.getByte(fillingNBT);
}
/**
* 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(item.getItem() instanceof ItemBomb)
{
return ((ItemBomb)item.getItem()).getItemCasing(nbt.getByte(casingNBT));
}
return nbt.getByte(casingNBT);
}
public static NBTTagCompound getNBT(ItemStack item)
{
if(!item.hasTagCompound())item.setTagCompound(new NBTTagCompound());
return item.getTagCompound();
}
public static ItemStack createExplosive(Item item, byte casing, byte filling, byte fuse, byte powder, int stackSize, boolean sticky)
{
ItemStack bomb = new ItemStack(item, stackSize);
setFilling(bomb, filling);
setCasing(bomb, casing);
setFuse(bomb, fuse);
setPowder(bomb, powder);
if(sticky)
{
setSticky(bomb);
}
return bomb;
}
public static ItemStack createExplosive(Item item, byte casing, byte filling, byte fuse, byte powder, int stackSize)
{
return createExplosive(item, casing, filling, fuse, powder, stackSize, false);
}
public ItemStack createBomb(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(createBomb((byte)0, (byte)0, (byte)0, (byte)0, 1));
list.add(createBomb((byte)0, (byte)1, (byte)0, (byte)0, 1));
list.add(createBomb((byte)0, (byte)2, (byte)0, (byte)0, 1));
list.add(createBomb((byte)1, (byte)0, (byte)0, (byte)0, 1));
list.add(createBomb((byte)1, (byte)1, (byte)0, (byte)0, 1));
list.add(createBomb((byte)1, (byte)2, (byte)0, (byte)0, 1));
list.add(createBomb((byte)2, (byte)0, (byte)0, (byte)0, 1));
list.add(createBomb((byte)2, (byte)1, (byte)0, (byte)0, 1));
list.add(createBomb((byte)2, (byte)2, (byte)0, (byte)0, 1));
list.add(createBomb((byte)3, (byte)0, (byte)0, (byte)0, 1));
list.add(createBomb((byte)3, (byte)1, (byte)0, (byte)0, 1));
list.add(createBomb((byte)3, (byte)2, (byte)0, (byte)0, 1));
}
//TODO Icons
@SideOnly(Side.CLIENT)
public IIcon getIcon(byte type)
{
if(type < 0)
{
return ToolListMF.bomb_crude.getIcon(type);
}
return bombs[type];
}
public IIcon[] icons = new IIcon[2];
private IIcon[] bombs = new IIcon[4];
@Override
@SideOnly(Side.CLIENT)
public void registerIcons(IIconRegister reg)
{
icons[0] = reg.registerIcon("minefantasy2:Other/bomb_icon_shrapnel");
icons[1] = reg.registerIcon("minefantasy2:Other/bomb_icon_fire");
this.itemIcon = bombs[0] = reg.registerIcon("minefantasy2:Other/bomb_ceramic");
bombs[1] = reg.registerIcon("minefantasy2:Other/bomb_iron");
bombs[2] = reg.registerIcon("minefantasy2:Other/bomb_obsidian");
bombs[3] = reg.registerIcon("minefantasy2:Other/bomb_crystal");
}
@Override
@SideOnly(Side.CLIENT)
public IIcon getIconIndex(ItemStack item)
{
int type = getCasing(item);
return bombs[type];
}
@Override
@SideOnly(Side.CLIENT)
public int getRenderPasses(int metadata)
{
return 3;
}
@Override
@SideOnly(Side.CLIENT)
public IIcon getIcon(ItemStack item, int layer)
{
boolean sticky = item.hasTagCompound() && item.getTagCompound().hasKey("stickyBomb");
if(layer == 0 && sticky)
{
return Items.slime_ball.getIconFromDamage(0);
}
if(layer > (sticky ? 1 : 0))
{
int type = getFilling(item);
if(type != 0)
{
return 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("bombcase", getCasing(item)),
ItemBombComponent.getBombComponent("fuse", getFuse(item)),
ItemBombComponent.getBombComponent("powder", getPowder(item)),
ItemBombComponent.getBombComponent("filling", getFilling(item)),
};
}
public byte getItemFuse(byte value)
{
return value;
}
public byte getItemFilling(byte value)
{
return value;
}
public byte getItemCasing(byte value)
{
return value;
}
public byte getItemPowder(byte value)
{
return value;
}
}