001package net.minecraft.world.gen.feature;
002
003import java.util.Random;
004import net.minecraft.block.Block;
005import net.minecraft.world.World;
006
007public class WorldGenForest extends WorldGenerator
008{
009    public WorldGenForest(boolean par1)
010    {
011        super(par1);
012    }
013
014    public boolean generate(World par1World, Random par2Random, int par3, int par4, int par5)
015    {
016        int var6 = par2Random.nextInt(3) + 5;
017        boolean var7 = true;
018
019        if (par4 >= 1 && par4 + var6 + 1 <= 256)
020        {
021            int var8;
022            int var10;
023            int var11;
024            int var12;
025
026            for (var8 = par4; var8 <= par4 + 1 + var6; ++var8)
027            {
028                byte var9 = 1;
029
030                if (var8 == par4)
031                {
032                    var9 = 0;
033                }
034
035                if (var8 >= par4 + 1 + var6 - 2)
036                {
037                    var9 = 2;
038                }
039
040                for (var10 = par3 - var9; var10 <= par3 + var9 && var7; ++var10)
041                {
042                    for (var11 = par5 - var9; var11 <= par5 + var9 && var7; ++var11)
043                    {
044                        if (var8 >= 0 && var8 < 256)
045                        {
046                            var12 = par1World.getBlockId(var10, var8, var11);
047
048                            Block block = Block.blocksList[var12];
049
050                            if (var12 != 0 && (block != null && !block.isLeaves(par1World, var10,  var8, var11)))
051                            {
052                                var7 = false;
053                            }
054                        }
055                        else
056                        {
057                            var7 = false;
058                        }
059                    }
060                }
061            }
062
063            if (!var7)
064            {
065                return false;
066            }
067            else
068            {
069                var8 = par1World.getBlockId(par3, par4 - 1, par5);
070
071                if ((var8 == Block.grass.blockID || var8 == Block.dirt.blockID) && par4 < 256 - var6 - 1)
072                {
073                    this.setBlock(par1World, par3, par4 - 1, par5, Block.dirt.blockID);
074                    int var16;
075
076                    for (var16 = par4 - 3 + var6; var16 <= par4 + var6; ++var16)
077                    {
078                        var10 = var16 - (par4 + var6);
079                        var11 = 1 - var10 / 2;
080
081                        for (var12 = par3 - var11; var12 <= par3 + var11; ++var12)
082                        {
083                            int var13 = var12 - par3;
084
085                            for (int var14 = par5 - var11; var14 <= par5 + var11; ++var14)
086                            {
087                                int var15 = var14 - par5;
088
089                                Block block = Block.blocksList[par1World.getBlockId(var12, var16, var14)];
090                                
091                                if ((Math.abs(var13) != var11 || Math.abs(var15) != var11 || par2Random.nextInt(2) != 0 && var10 != 0) && 
092                                    (block == null || block.canBeReplacedByLeaves(par1World, var12, var16, var14)))
093                                {
094                                    this.setBlockAndMetadata(par1World, var12, var16, var14, Block.leaves.blockID, 2);
095                                }
096                            }
097                        }
098                    }
099
100                    for (var16 = 0; var16 < var6; ++var16)
101                    {
102                        var10 = par1World.getBlockId(par3, par4 + var16, par5);
103
104                        Block block = Block.blocksList[var10];
105
106                        if (var10 == 0 || block == null || block.isLeaves(par1World, par3, par4 + var16, par5))
107                        {
108                            this.setBlockAndMetadata(par1World, par3, par4 + var16, par5, Block.wood.blockID, 2);
109                        }
110                    }
111
112                    return true;
113                }
114                else
115                {
116                    return false;
117                }
118            }
119        }
120        else
121        {
122            return false;
123        }
124    }
125}