001package net.minecraft.block;
002
003import cpw.mods.fml.relauncher.Side;
004import cpw.mods.fml.relauncher.SideOnly;
005import java.util.Random;
006import net.minecraft.entity.player.EntityPlayer;
007import net.minecraft.item.Item;
008import net.minecraft.world.IBlockAccess;
009import net.minecraft.world.World;
010
011public class BlockRedstoneRepeater extends BlockRedstoneLogic
012{
013    /** The offsets for the two torches in redstone repeater blocks. */
014    public static final double[] repeaterTorchOffset = new double[] { -0.0625D, 0.0625D, 0.1875D, 0.3125D};
015
016    /** The states in which the redstone repeater blocks can be. */
017    private static final int[] repeaterState = new int[] {1, 2, 3, 4};
018
019    protected BlockRedstoneRepeater(int par1, boolean par2)
020    {
021        super(par1, par2);
022    }
023
024    /**
025     * Called upon block activation (right click on the block.)
026     */
027    public boolean onBlockActivated(World par1World, int par2, int par3, int par4, EntityPlayer par5EntityPlayer, int par6, float par7, float par8, float par9)
028    {
029        int i1 = par1World.getBlockMetadata(par2, par3, par4);
030        int j1 = (i1 & 12) >> 2;
031        j1 = j1 + 1 << 2 & 12;
032        par1World.setBlockMetadataWithNotify(par2, par3, par4, j1 | i1 & 3, 3);
033        return true;
034    }
035
036    protected int func_94481_j_(int par1)
037    {
038        return repeaterState[(par1 & 12) >> 2] * 2;
039    }
040
041    protected BlockRedstoneLogic func_94485_e()
042    {
043        return Block.redstoneRepeaterActive;
044    }
045
046    protected BlockRedstoneLogic func_94484_i()
047    {
048        return Block.redstoneRepeaterIdle;
049    }
050
051    /**
052     * Returns the ID of the items to drop on destruction.
053     */
054    public int idDropped(int par1, Random par2Random, int par3)
055    {
056        return Item.redstoneRepeater.itemID;
057    }
058
059    @SideOnly(Side.CLIENT)
060
061    /**
062     * only called by clickMiddleMouseButton , and passed to inventory.setCurrentItem (along with isCreative)
063     */
064    public int idPicked(World par1World, int par2, int par3, int par4)
065    {
066        return Item.redstoneRepeater.itemID;
067    }
068
069    /**
070     * The type of render function that is called for this block
071     */
072    public int getRenderType()
073    {
074        return 15;
075    }
076
077    public boolean func_94476_e(IBlockAccess par1IBlockAccess, int par2, int par3, int par4, int par5)
078    {
079        return this.func_94482_f(par1IBlockAccess, par2, par3, par4, par5) > 0;
080    }
081
082    protected boolean func_94477_d(int par1)
083    {
084        return isRedstoneRepeaterBlockID(par1);
085    }
086
087    @SideOnly(Side.CLIENT)
088
089    /**
090     * A randomly called display update to be able to add particles or other items for display
091     */
092    public void randomDisplayTick(World par1World, int par2, int par3, int par4, Random par5Random)
093    {
094        if (this.isRepeaterPowered)
095        {
096            int l = par1World.getBlockMetadata(par2, par3, par4);
097            int i1 = getDirection(l);
098            double d0 = (double)((float)par2 + 0.5F) + (double)(par5Random.nextFloat() - 0.5F) * 0.2D;
099            double d1 = (double)((float)par3 + 0.4F) + (double)(par5Random.nextFloat() - 0.5F) * 0.2D;
100            double d2 = (double)((float)par4 + 0.5F) + (double)(par5Random.nextFloat() - 0.5F) * 0.2D;
101            double d3 = 0.0D;
102            double d4 = 0.0D;
103
104            if (par5Random.nextInt(2) == 0)
105            {
106                switch (i1)
107                {
108                    case 0:
109                        d4 = -0.3125D;
110                        break;
111                    case 1:
112                        d3 = 0.3125D;
113                        break;
114                    case 2:
115                        d4 = 0.3125D;
116                        break;
117                    case 3:
118                        d3 = -0.3125D;
119                }
120            }
121            else
122            {
123                int j1 = (l & 12) >> 2;
124
125                switch (i1)
126                {
127                    case 0:
128                        d4 = repeaterTorchOffset[j1];
129                        break;
130                    case 1:
131                        d3 = -repeaterTorchOffset[j1];
132                        break;
133                    case 2:
134                        d4 = -repeaterTorchOffset[j1];
135                        break;
136                    case 3:
137                        d3 = repeaterTorchOffset[j1];
138                }
139            }
140
141            par1World.spawnParticle("reddust", d0 + d3, d1, d2 + d4, 0.0D, 0.0D, 0.0D);
142        }
143    }
144
145    /**
146     * ejects contained items into the world, and notifies neighbours of an update, as appropriate
147     */
148    public void breakBlock(World par1World, int par2, int par3, int par4, int par5, int par6)
149    {
150        super.breakBlock(par1World, par2, par3, par4, par5, par6);
151        this.func_94483_i_(par1World, par2, par3, par4);
152    }
153}