001    package net.minecraft.world.gen.feature;
002    
003    import java.util.Random;
004    import net.minecraft.block.Block;
005    import net.minecraft.world.World;
006    
007    public class WorldGenBigMushroom extends WorldGenerator
008    {
009        /** The mushroom type. 0 for brown, 1 for red. */
010        private int mushroomType = -1;
011    
012        public WorldGenBigMushroom(int par1)
013        {
014            super(true);
015            this.mushroomType = par1;
016        }
017    
018        public WorldGenBigMushroom()
019        {
020            super(false);
021        }
022    
023        public boolean generate(World par1World, Random par2Random, int par3, int par4, int par5)
024        {
025            int var6 = par2Random.nextInt(2);
026    
027            if (this.mushroomType >= 0)
028            {
029                var6 = this.mushroomType;
030            }
031    
032            int var7 = par2Random.nextInt(3) + 4;
033            boolean var8 = true;
034    
035            if (par4 >= 1 && par4 + var7 + 1 < 256)
036            {
037                int var9;
038                int var11;
039                int var12;
040                int var13;
041    
042                for (var9 = par4; var9 <= par4 + 1 + var7; ++var9)
043                {
044                    byte var10 = 3;
045    
046                    if (var9 <= par4 + 3)
047                    {
048                        var10 = 0;
049                    }
050    
051                    for (var11 = par3 - var10; var11 <= par3 + var10 && var8; ++var11)
052                    {
053                        for (var12 = par5 - var10; var12 <= par5 + var10 && var8; ++var12)
054                        {
055                            if (var9 >= 0 && var9 < 256)
056                            {
057                                var13 = par1World.getBlockId(var11, var9, var12);
058    
059                                Block block = Block.blocksList[var13];
060                                
061                                if (var13 != 0 && block != null && !block.isLeaves(par1World, var11, var9, var12))
062                                {
063                                    var8 = false;
064                                }
065                            }
066                            else
067                            {
068                                var8 = false;
069                            }
070                        }
071                    }
072                }
073    
074                if (!var8)
075                {
076                    return false;
077                }
078                else
079                {
080                    var9 = par1World.getBlockId(par3, par4 - 1, par5);
081    
082                    if (var9 != Block.dirt.blockID && var9 != Block.grass.blockID && var9 != Block.mycelium.blockID)
083                    {
084                        return false;
085                    }
086                    else
087                    {
088                        int var16 = par4 + var7;
089    
090                        if (var6 == 1)
091                        {
092                            var16 = par4 + var7 - 3;
093                        }
094    
095                        for (var11 = var16; var11 <= par4 + var7; ++var11)
096                        {
097                            var12 = 1;
098    
099                            if (var11 < par4 + var7)
100                            {
101                                ++var12;
102                            }
103    
104                            if (var6 == 0)
105                            {
106                                var12 = 3;
107                            }
108    
109                            for (var13 = par3 - var12; var13 <= par3 + var12; ++var13)
110                            {
111                                for (int var14 = par5 - var12; var14 <= par5 + var12; ++var14)
112                                {
113                                    int var15 = 5;
114    
115                                    if (var13 == par3 - var12)
116                                    {
117                                        --var15;
118                                    }
119    
120                                    if (var13 == par3 + var12)
121                                    {
122                                        ++var15;
123                                    }
124    
125                                    if (var14 == par5 - var12)
126                                    {
127                                        var15 -= 3;
128                                    }
129    
130                                    if (var14 == par5 + var12)
131                                    {
132                                        var15 += 3;
133                                    }
134    
135                                    if (var6 == 0 || var11 < par4 + var7)
136                                    {
137                                        if ((var13 == par3 - var12 || var13 == par3 + var12) && (var14 == par5 - var12 || var14 == par5 + var12))
138                                        {
139                                            continue;
140                                        }
141    
142                                        if (var13 == par3 - (var12 - 1) && var14 == par5 - var12)
143                                        {
144                                            var15 = 1;
145                                        }
146    
147                                        if (var13 == par3 - var12 && var14 == par5 - (var12 - 1))
148                                        {
149                                            var15 = 1;
150                                        }
151    
152                                        if (var13 == par3 + (var12 - 1) && var14 == par5 - var12)
153                                        {
154                                            var15 = 3;
155                                        }
156    
157                                        if (var13 == par3 + var12 && var14 == par5 - (var12 - 1))
158                                        {
159                                            var15 = 3;
160                                        }
161    
162                                        if (var13 == par3 - (var12 - 1) && var14 == par5 + var12)
163                                        {
164                                            var15 = 7;
165                                        }
166    
167                                        if (var13 == par3 - var12 && var14 == par5 + (var12 - 1))
168                                        {
169                                            var15 = 7;
170                                        }
171    
172                                        if (var13 == par3 + (var12 - 1) && var14 == par5 + var12)
173                                        {
174                                            var15 = 9;
175                                        }
176    
177                                        if (var13 == par3 + var12 && var14 == par5 + (var12 - 1))
178                                        {
179                                            var15 = 9;
180                                        }
181                                    }
182    
183                                    if (var15 == 5 && var11 < par4 + var7)
184                                    {
185                                        var15 = 0;
186                                    }
187    
188                                    Block block = Block.blocksList[par1World.getBlockId(var13, var11, var14)];
189    
190                                    if ((var15 != 0 || par4 >= par4 + var7 - 1) && (block == null || block.canBeReplacedByLeaves(par1World, var13, var11, var14)))
191                                    {
192                                        this.setBlockAndMetadata(par1World, var13, var11, var14, Block.mushroomCapBrown.blockID + var6, var15);
193                                    }
194                                }
195                            }
196                        }
197    
198                        for (var11 = 0; var11 < var7; ++var11)
199                        {
200                            var12 = par1World.getBlockId(par3, par4 + var11, par5);
201    
202                            Block block = Block.blocksList[var12];
203    
204                            if (block == null || block.canBeReplacedByLeaves(par1World, par3, par4 + var11, par5))
205                            {
206                                this.setBlockAndMetadata(par1World, par3, par4 + var11, par5, Block.mushroomCapBrown.blockID + var6, 10);
207                            }
208                        }
209    
210                        return true;
211                    }
212                }
213            }
214            else
215            {
216                return false;
217            }
218        }
219    }