001package net.minecraft.world.gen.feature;
002
003import java.util.Random;
004import net.minecraft.block.Block;
005import net.minecraft.world.World;
006
007public 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}