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