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