    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 getIcon(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}