001 package net.minecraft.world.gen.feature;
002
003 import java.util.Random;
004 import net.minecraft.block.Block;
005 import net.minecraft.block.material.Material;
006 import net.minecraft.world.EnumSkyBlock;
007 import net.minecraft.world.World;
008 import net.minecraft.world.biome.BiomeGenBase;
009
010 public class WorldGenLakes extends WorldGenerator
011 {
012 private int blockIndex;
013
014 public WorldGenLakes(int par1)
015 {
016 this.blockIndex = par1;
017 }
018
019 public boolean generate(World par1World, Random par2Random, int par3, int par4, int par5)
020 {
021 par3 -= 8;
022
023 for (par5 -= 8; par4 > 5 && par1World.isAirBlock(par3, par4, par5); --par4)
024 {
025 ;
026 }
027
028 if (par4 <= 4)
029 {
030 return false;
031 }
032 else
033 {
034 par4 -= 4;
035 boolean[] var6 = new boolean[2048];
036 int var7 = par2Random.nextInt(4) + 4;
037 int var8;
038
039 for (var8 = 0; var8 < var7; ++var8)
040 {
041 double var9 = par2Random.nextDouble() * 6.0D + 3.0D;
042 double var11 = par2Random.nextDouble() * 4.0D + 2.0D;
043 double var13 = par2Random.nextDouble() * 6.0D + 3.0D;
044 double var15 = par2Random.nextDouble() * (16.0D - var9 - 2.0D) + 1.0D + var9 / 2.0D;
045 double var17 = par2Random.nextDouble() * (8.0D - var11 - 4.0D) + 2.0D + var11 / 2.0D;
046 double var19 = par2Random.nextDouble() * (16.0D - var13 - 2.0D) + 1.0D + var13 / 2.0D;
047
048 for (int var21 = 1; var21 < 15; ++var21)
049 {
050 for (int var22 = 1; var22 < 15; ++var22)
051 {
052 for (int var23 = 1; var23 < 7; ++var23)
053 {
054 double var24 = ((double)var21 - var15) / (var9 / 2.0D);
055 double var26 = ((double)var23 - var17) / (var11 / 2.0D);
056 double var28 = ((double)var22 - var19) / (var13 / 2.0D);
057 double var30 = var24 * var24 + var26 * var26 + var28 * var28;
058
059 if (var30 < 1.0D)
060 {
061 var6[(var21 * 16 + var22) * 8 + var23] = true;
062 }
063 }
064 }
065 }
066 }
067
068 int var10;
069 int var32;
070 boolean var33;
071
072 for (var8 = 0; var8 < 16; ++var8)
073 {
074 for (var32 = 0; var32 < 16; ++var32)
075 {
076 for (var10 = 0; var10 < 8; ++var10)
077 {
078 var33 = !var6[(var8 * 16 + var32) * 8 + var10] && (var8 < 15 && var6[((var8 + 1) * 16 + var32) * 8 + var10] || var8 > 0 && var6[((var8 - 1) * 16 + var32) * 8 + var10] || var32 < 15 && var6[(var8 * 16 + var32 + 1) * 8 + var10] || var32 > 0 && var6[(var8 * 16 + (var32 - 1)) * 8 + var10] || var10 < 7 && var6[(var8 * 16 + var32) * 8 + var10 + 1] || var10 > 0 && var6[(var8 * 16 + var32) * 8 + (var10 - 1)]);
079
080 if (var33)
081 {
082 Material var12 = par1World.getBlockMaterial(par3 + var8, par4 + var10, par5 + var32);
083
084 if (var10 >= 4 && var12.isLiquid())
085 {
086 return false;
087 }
088
089 if (var10 < 4 && !var12.isSolid() && par1World.getBlockId(par3 + var8, par4 + var10, par5 + var32) != this.blockIndex)
090 {
091 return false;
092 }
093 }
094 }
095 }
096 }
097
098 for (var8 = 0; var8 < 16; ++var8)
099 {
100 for (var32 = 0; var32 < 16; ++var32)
101 {
102 for (var10 = 0; var10 < 8; ++var10)
103 {
104 if (var6[(var8 * 16 + var32) * 8 + var10])
105 {
106 par1World.setBlock(par3 + var8, par4 + var10, par5 + var32, var10 >= 4 ? 0 : this.blockIndex);
107 }
108 }
109 }
110 }
111
112 for (var8 = 0; var8 < 16; ++var8)
113 {
114 for (var32 = 0; var32 < 16; ++var32)
115 {
116 for (var10 = 4; var10 < 8; ++var10)
117 {
118 if (var6[(var8 * 16 + var32) * 8 + var10] && par1World.getBlockId(par3 + var8, par4 + var10 - 1, par5 + var32) == Block.dirt.blockID && par1World.getSavedLightValue(EnumSkyBlock.Sky, par3 + var8, par4 + var10, par5 + var32) > 0)
119 {
120 BiomeGenBase var35 = par1World.getBiomeGenForCoords(par3 + var8, par5 + var32);
121
122 if (var35.topBlock == Block.mycelium.blockID)
123 {
124 par1World.setBlock(par3 + var8, par4 + var10 - 1, par5 + var32, Block.mycelium.blockID);
125 }
126 else
127 {
128 par1World.setBlock(par3 + var8, par4 + var10 - 1, par5 + var32, Block.grass.blockID);
129 }
130 }
131 }
132 }
133 }
134
135 if (Block.blocksList[this.blockIndex].blockMaterial == Material.lava)
136 {
137 for (var8 = 0; var8 < 16; ++var8)
138 {
139 for (var32 = 0; var32 < 16; ++var32)
140 {
141 for (var10 = 0; var10 < 8; ++var10)
142 {
143 var33 = !var6[(var8 * 16 + var32) * 8 + var10] && (var8 < 15 && var6[((var8 + 1) * 16 + var32) * 8 + var10] || var8 > 0 && var6[((var8 - 1) * 16 + var32) * 8 + var10] || var32 < 15 && var6[(var8 * 16 + var32 + 1) * 8 + var10] || var32 > 0 && var6[(var8 * 16 + (var32 - 1)) * 8 + var10] || var10 < 7 && var6[(var8 * 16 + var32) * 8 + var10 + 1] || var10 > 0 && var6[(var8 * 16 + var32) * 8 + (var10 - 1)]);
144
145 if (var33 && (var10 < 4 || par2Random.nextInt(2) != 0) && par1World.getBlockMaterial(par3 + var8, par4 + var10, par5 + var32).isSolid())
146 {
147 par1World.setBlock(par3 + var8, par4 + var10, par5 + var32, Block.stone.blockID);
148 }
149 }
150 }
151 }
152 }
153
154 if (Block.blocksList[this.blockIndex].blockMaterial == Material.water)
155 {
156 for (var8 = 0; var8 < 16; ++var8)
157 {
158 for (var32 = 0; var32 < 16; ++var32)
159 {
160 byte var34 = 4;
161
162 if (par1World.isBlockFreezable(par3 + var8, par4 + var34, par5 + var32))
163 {
164 par1World.setBlock(par3 + var8, par4 + var34, par5 + var32, Block.ice.blockID);
165 }
166 }
167 }
168 }
169
170 return true;
171 }
172 }
173 }