001package net.minecraft.block;
002
003import cpw.mods.fml.relauncher.Side;
004import cpw.mods.fml.relauncher.SideOnly;
005import net.minecraft.block.material.Material;
006import net.minecraft.client.renderer.texture.IconRegister;
007import net.minecraft.creativetab.CreativeTabs;
008import net.minecraft.entity.item.EntityItem;
009import net.minecraft.entity.player.EntityPlayer;
010import net.minecraft.item.Item;
011import net.minecraft.item.ItemStack;
012import net.minecraft.tileentity.TileEntity;
013import net.minecraft.tileentity.TileEntityRecordPlayer;
014import net.minecraft.util.Icon;
015import net.minecraft.world.World;
016
017public class BlockJukeBox extends BlockContainer
018{
019    @SideOnly(Side.CLIENT)
020    private Icon theIcon;
021
022    protected BlockJukeBox(int par1)
023    {
024        super(par1, Material.wood);
025        this.setCreativeTab(CreativeTabs.tabDecorations);
026    }
027
028    @SideOnly(Side.CLIENT)
029
030    /**
031     * From the specified side and block metadata retrieves the blocks texture. Args: side, metadata
032     */
033    public Icon getBlockTextureFromSideAndMetadata(int par1, int par2)
034    {
035        return par1 == 1 ? this.theIcon : this.blockIcon;
036    }
037
038    /**
039     * Called upon block activation (right click on the block.)
040     */
041    public boolean onBlockActivated(World par1World, int par2, int par3, int par4, EntityPlayer par5EntityPlayer, int par6, float par7, float par8, float par9)
042    {
043        if (par1World.getBlockMetadata(par2, par3, par4) == 0)
044        {
045            return false;
046        }
047        else
048        {
049            this.ejectRecord(par1World, par2, par3, par4);
050            return true;
051        }
052    }
053
054    /**
055     * Insert the specified music disc in the jukebox at the given coordinates
056     */
057    public void insertRecord(World par1World, int par2, int par3, int par4, ItemStack par5ItemStack)
058    {
059        if (!par1World.isRemote)
060        {
061            TileEntityRecordPlayer tileentityrecordplayer = (TileEntityRecordPlayer)par1World.getBlockTileEntity(par2, par3, par4);
062
063            if (tileentityrecordplayer != null)
064            {
065                tileentityrecordplayer.func_96098_a(par5ItemStack.copy());
066                par1World.setBlockMetadataWithNotify(par2, par3, par4, 1, 2);
067            }
068        }
069    }
070
071    /**
072     * Ejects the current record inside of the jukebox.
073     */
074    public void ejectRecord(World par1World, int par2, int par3, int par4)
075    {
076        if (!par1World.isRemote)
077        {
078            TileEntityRecordPlayer tileentityrecordplayer = (TileEntityRecordPlayer)par1World.getBlockTileEntity(par2, par3, par4);
079
080            if (tileentityrecordplayer != null)
081            {
082                ItemStack itemstack = tileentityrecordplayer.func_96097_a();
083
084                if (itemstack != null)
085                {
086                    par1World.playAuxSFX(1005, par2, par3, par4, 0);
087                    par1World.playRecord((String)null, par2, par3, par4);
088                    tileentityrecordplayer.func_96098_a((ItemStack)null);
089                    par1World.setBlockMetadataWithNotify(par2, par3, par4, 0, 2);
090                    float f = 0.7F;
091                    double d0 = (double)(par1World.rand.nextFloat() * f) + (double)(1.0F - f) * 0.5D;
092                    double d1 = (double)(par1World.rand.nextFloat() * f) + (double)(1.0F - f) * 0.2D + 0.6D;
093                    double d2 = (double)(par1World.rand.nextFloat() * f) + (double)(1.0F - f) * 0.5D;
094                    ItemStack itemstack1 = itemstack.copy();
095                    EntityItem entityitem = new EntityItem(par1World, (double)par2 + d0, (double)par3 + d1, (double)par4 + d2, itemstack1);
096                    entityitem.delayBeforeCanPickup = 10;
097                    par1World.spawnEntityInWorld(entityitem);
098                }
099            }
100        }
101    }
102
103    /**
104     * ejects contained items into the world, and notifies neighbours of an update, as appropriate
105     */
106    public void breakBlock(World par1World, int par2, int par3, int par4, int par5, int par6)
107    {
108        this.ejectRecord(par1World, par2, par3, par4);
109        super.breakBlock(par1World, par2, par3, par4, par5, par6);
110    }
111
112    /**
113     * Drops the block items with a specified chance of dropping the specified items
114     */
115    public void dropBlockAsItemWithChance(World par1World, int par2, int par3, int par4, int par5, float par6, int par7)
116    {
117        if (!par1World.isRemote)
118        {
119            super.dropBlockAsItemWithChance(par1World, par2, par3, par4, par5, par6, 0);
120        }
121    }
122
123    /**
124     * Returns a new instance of a block's tile entity class. Called on placing the block.
125     */
126    public TileEntity createNewTileEntity(World par1World)
127    {
128        return new TileEntityRecordPlayer();
129    }
130
131    @SideOnly(Side.CLIENT)
132
133    /**
134     * When this method is called, your block should register all the icons it needs with the given IconRegister. This
135     * is the only chance you get to register icons.
136     */
137    public void registerIcons(IconRegister par1IconRegister)
138    {
139        this.blockIcon = par1IconRegister.registerIcon("musicBlock");
140        this.theIcon = par1IconRegister.registerIcon("jukebox_top");
141    }
142
143    /**
144     * If this returns true, then comparators facing away from this block will use the value from
145     * getComparatorInputOverride instead of the actual redstone signal strength.
146     */
147    public boolean hasComparatorInputOverride()
148    {
149        return true;
150    }
151
152    /**
153     * If hasComparatorInputOverride returns true, the return value from this is used instead of the redstone signal
154     * strength when this block inputs to a comparator.
155     */
156    public int getComparatorInputOverride(World par1World, int par2, int par3, int par4, int par5)
157    {
158        ItemStack itemstack = ((TileEntityRecordPlayer)par1World.getBlockTileEntity(par2, par3, par4)).func_96097_a();
159        return itemstack == null ? 0 : itemstack.itemID + 1 - Item.record13.itemID;
160    }
161}