001package net.minecraft.block;
002
003import cpw.mods.fml.relauncher.Side;
004import cpw.mods.fml.relauncher.SideOnly;
005import java.util.List;
006import java.util.Random;
007import net.minecraft.block.material.Material;
008import net.minecraft.client.renderer.texture.IconRegister;
009import net.minecraft.creativetab.CreativeTabs;
010import net.minecraft.item.ItemStack;
011import net.minecraft.util.Icon;
012import net.minecraft.world.World;
013
014public class BlockLog extends Block
015{
016    /** The type of tree this log came from. */
017    public static final String[] woodType = new String[] {"oak", "spruce", "birch", "jungle"};
018    public static final String[] treeTextureTypes = new String[] {"tree_side", "tree_spruce", "tree_birch", "tree_jungle"};
019    @SideOnly(Side.CLIENT)
020    private Icon[] iconArray;
021    @SideOnly(Side.CLIENT)
022    private Icon tree_top;
023
024    protected BlockLog(int par1)
025    {
026        super(par1, Material.wood);
027        this.setCreativeTab(CreativeTabs.tabBlock);
028    }
029
030    /**
031     * The type of render function that is called for this block
032     */
033    public int getRenderType()
034    {
035        return 31;
036    }
037
038    /**
039     * Returns the quantity of items to drop on block destruction.
040     */
041    public int quantityDropped(Random par1Random)
042    {
043        return 1;
044    }
045
046    /**
047     * Returns the ID of the items to drop on destruction.
048     */
049    public int idDropped(int par1, Random par2Random, int par3)
050    {
051        return Block.wood.blockID;
052    }
053
054    /**
055     * ejects contained items into the world, and notifies neighbours of an update, as appropriate
056     */
057    public void breakBlock(World par1World, int par2, int par3, int par4, int par5, int par6)
058    {
059        byte b0 = 4;
060        int j1 = b0 + 1;
061
062        if (par1World.checkChunksExist(par2 - j1, par3 - j1, par4 - j1, par2 + j1, par3 + j1, par4 + j1))
063        {
064            for (int k1 = -b0; k1 <= b0; ++k1)
065            {
066                for (int l1 = -b0; l1 <= b0; ++l1)
067                {
068                    for (int i2 = -b0; i2 <= b0; ++i2)
069                    {
070                        int j2 = par1World.getBlockId(par2 + k1, par3 + l1, par4 + i2);
071
072                        if (Block.blocksList[j2] != null)
073                        {
074                            Block.blocksList[j2].beginLeavesDecay(par1World, par2 + k1, par3 + l1, par4 + i2);
075                        }
076                    }
077                }
078            }
079        }
080    }
081
082    /**
083     * Called when a block is placed using its ItemBlock. Args: World, X, Y, Z, side, hitX, hitY, hitZ, block metadata
084     */
085    public int onBlockPlaced(World par1World, int par2, int par3, int par4, int par5, float par6, float par7, float par8, int par9)
086    {
087        int j1 = par9 & 3;
088        byte b0 = 0;
089
090        switch (par5)
091        {
092            case 0:
093            case 1:
094                b0 = 0;
095                break;
096            case 2:
097            case 3:
098                b0 = 8;
099                break;
100            case 4:
101            case 5:
102                b0 = 4;
103        }
104
105        return j1 | b0;
106    }
107
108    @SideOnly(Side.CLIENT)
109
110    /**
111     * From the specified side and block metadata retrieves the blocks texture. Args: side, metadata
112     */
113    public Icon getIcon(int par1, int par2)
114    {
115        int k = par2 & 12;
116        int l = par2 & 3;
117        return k == 0 && (par1 == 1 || par1 == 0) ? this.tree_top : (k == 4 && (par1 == 5 || par1 == 4) ? this.tree_top : (k == 8 && (par1 == 2 || par1 == 3) ? this.tree_top : this.iconArray[l]));
118    }
119
120    /**
121     * Determines the damage on the item the block drops. Used in cloth and wood.
122     */
123    public int damageDropped(int par1)
124    {
125        return par1 & 3;
126    }
127
128    /**
129     * returns a number between 0 and 3
130     */
131    public static int limitToValidMetadata(int par0)
132    {
133        return par0 & 3;
134    }
135
136    @SideOnly(Side.CLIENT)
137
138    /**
139     * returns a list of blocks with the same ID, but different meta (eg: wood returns 4 blocks)
140     */
141    public void getSubBlocks(int par1, CreativeTabs par2CreativeTabs, List par3List)
142    {
143        par3List.add(new ItemStack(par1, 1, 0));
144        par3List.add(new ItemStack(par1, 1, 1));
145        par3List.add(new ItemStack(par1, 1, 2));
146        par3List.add(new ItemStack(par1, 1, 3));
147    }
148
149    /**
150     * Returns an item stack containing a single instance of the current block type. 'i' is the block's subtype/damage
151     * and is ignored for blocks which do not support subtypes. Blocks which cannot be harvested should return null.
152     */
153    protected ItemStack createStackedBlock(int par1)
154    {
155        return new ItemStack(this.blockID, 1, limitToValidMetadata(par1));
156    }
157
158    @SideOnly(Side.CLIENT)
159
160    /**
161     * When this method is called, your block should register all the icons it needs with the given IconRegister. This
162     * is the only chance you get to register icons.
163     */
164    public void registerIcons(IconRegister par1IconRegister)
165    {
166        this.tree_top = par1IconRegister.registerIcon("tree_top");
167        this.iconArray = new Icon[treeTextureTypes.length];
168
169        for (int i = 0; i < this.iconArray.length; ++i)
170        {
171            this.iconArray[i] = par1IconRegister.registerIcon(treeTextureTypes[i]);
172        }
173    }
174
175    @Override
176    public boolean canSustainLeaves(World world, int x, int y, int z)
177    {
178        return true;
179    }
180
181    @Override
182    public boolean isWood(World world, int x, int y, int z)
183    {
184        return true;
185    }
186}