    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[] field_94389_b = new String[] {"tree_side", "tree_spruce", "tree_birch", "tree_jungle"};
    019    @SideOnly(Side.CLIENT)
    020    private Icon[] field_94390_c;
    021    @SideOnly(Side.CLIENT)
    022    private Icon field_94388_cO;
    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 getBlockTextureFromSideAndMetadata(int par1, int par2)
    114    {
    115        int k = par2 & 12;
    116        int l = par2 & 3;
    117        return k == 0 && (par1 == 1 || par1 == 0) ? this.field_94388_cO : (k == 4 && (par1 == 5 || par1 == 4) ? this.field_94388_cO : (k == 8 && (par1 == 2 || par1 == 3) ? this.field_94388_cO : this.field_94390_c[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    public void func_94332_a(IconRegister par1IconRegister)
    160    {
    161        this.field_94388_cO = par1IconRegister.func_94245_a("tree_top");
    162        this.field_94390_c = new Icon[field_94389_b.length];
    163
    164        for (int i = 0; i < this.field_94390_c.length; ++i)
    165        {
    166            this.field_94390_c[i] = par1IconRegister.func_94245_a(field_94389_b[i]);
    167        }
    168    }
    169
    170    @Override
    171    public boolean canSustainLeaves(World world, int x, int y, int z)
    172    {
    173        return true;
    174    }
    175
    176    @Override
    177    public boolean isWood(World world, int x, int y, int z)
    178    {
    179        return true;
    180    }
    181}