    001package net.minecraft.world.gen.feature;
    002
    003import java.util.Random;
    004import net.minecraft.block.Block;
    005import net.minecraft.block.material.Material;
    006import net.minecraft.world.EnumSkyBlock;
    007import net.minecraft.world.World;
    008import net.minecraft.world.biome.BiomeGenBase;
    009
    010public 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[] aboolean = new boolean[2048];
    036            int l = par2Random.nextInt(4) + 4;
    037            int i1;
    038
    039            for (i1 = 0; i1 < l; ++i1)
    040            {
    041                double d0 = par2Random.nextDouble() * 6.0D + 3.0D;
    042                double d1 = par2Random.nextDouble() * 4.0D + 2.0D;
    043                double d2 = par2Random.nextDouble() * 6.0D + 3.0D;
    044                double d3 = par2Random.nextDouble() * (16.0D - d0 - 2.0D) + 1.0D + d0 / 2.0D;
    045                double d4 = par2Random.nextDouble() * (8.0D - d1 - 4.0D) + 2.0D + d1 / 2.0D;
    046                double d5 = par2Random.nextDouble() * (16.0D - d2 - 2.0D) + 1.0D + d2 / 2.0D;
    047
    048                for (int j1 = 1; j1 < 15; ++j1)
    049                {
    050                    for (int k1 = 1; k1 < 15; ++k1)
    051                    {
    052                        for (int l1 = 1; l1 < 7; ++l1)
    053                        {
    054                            double d6 = ((double)j1 - d3) / (d0 / 2.0D);
    055                            double d7 = ((double)l1 - d4) / (d1 / 2.0D);
    056                            double d8 = ((double)k1 - d5) / (d2 / 2.0D);
    057                            double d9 = d6 * d6 + d7 * d7 + d8 * d8;
    058
    059                            if (d9 < 1.0D)
    060                            {
    061                                aboolean[(j1 * 16 + k1) * 8 + l1] = true;
    062                            }
    063                        }
    064                    }
    065                }
    066            }
    067
    068            int i2;
    069            int j2;
    070            boolean flag;
    071
    072            for (i1 = 0; i1 < 16; ++i1)
    073            {
    074                for (j2 = 0; j2 < 16; ++j2)
    075                {
    076                    for (i2 = 0; i2 < 8; ++i2)
    077                    {
    078                        flag = !aboolean[(i1 * 16 + j2) * 8 + i2] && (i1 < 15 && aboolean[((i1 + 1) * 16 + j2) * 8 + i2] || i1 > 0 && aboolean[((i1 - 1) * 16 + j2) * 8 + i2] || j2 < 15 && aboolean[(i1 * 16 + j2 + 1) * 8 + i2] || j2 > 0 && aboolean[(i1 * 16 + (j2 - 1)) * 8 + i2] || i2 < 7 && aboolean[(i1 * 16 + j2) * 8 + i2 + 1] || i2 > 0 && aboolean[(i1 * 16 + j2) * 8 + (i2 - 1)]);
    079
    080                        if (flag)
    081                        {
    082                            Material material = par1World.getBlockMaterial(par3 + i1, par4 + i2, par5 + j2);
    083
    084                            if (i2 >= 4 && material.isLiquid())
    085                            {
    086                                return false;
    087                            }
    088
    089                            if (i2 < 4 && !material.isSolid() && par1World.getBlockId(par3 + i1, par4 + i2, par5 + j2) != this.blockIndex)
    090                            {
    091                                return false;
    092                            }
    093                        }
    094                    }
    095                }
    096            }
    097
    098            for (i1 = 0; i1 < 16; ++i1)
    099            {
    100                for (j2 = 0; j2 < 16; ++j2)
    101                {
    102                    for (i2 = 0; i2 < 8; ++i2)
    103                    {
    104                        if (aboolean[(i1 * 16 + j2) * 8 + i2])
    105                        {
    106                            par1World.setBlockAndMetadataWithNotify(par3 + i1, par4 + i2, par5 + j2, i2 >= 4 ? 0 : this.blockIndex, 0, 2);
    107                        }
    108                    }
    109                }
    110            }
    111
    112            for (i1 = 0; i1 < 16; ++i1)
    113            {
    114                for (j2 = 0; j2 < 16; ++j2)
    115                {
    116                    for (i2 = 4; i2 < 8; ++i2)
    117                    {
    118                        if (aboolean[(i1 * 16 + j2) * 8 + i2] && par1World.getBlockId(par3 + i1, par4 + i2 - 1, par5 + j2) == Block.dirt.blockID && par1World.getSavedLightValue(EnumSkyBlock.Sky, par3 + i1, par4 + i2, par5 + j2) > 0)
    119                        {
    120                            BiomeGenBase biomegenbase = par1World.getBiomeGenForCoords(par3 + i1, par5 + j2);
    121
    122                            if (biomegenbase.topBlock == Block.mycelium.blockID)
    123                            {
    124                                par1World.setBlockAndMetadataWithNotify(par3 + i1, par4 + i2 - 1, par5 + j2, Block.mycelium.blockID, 0, 2);
    125                            }
    126                            else
    127                            {
    128                                par1World.setBlockAndMetadataWithNotify(par3 + i1, par4 + i2 - 1, par5 + j2, Block.grass.blockID, 0, 2);
    129                            }
    130                        }
    131                    }
    132                }
    133            }
    134
    135            if (Block.blocksList[this.blockIndex].blockMaterial == Material.lava)
    136            {
    137                for (i1 = 0; i1 < 16; ++i1)
    138                {
    139                    for (j2 = 0; j2 < 16; ++j2)
    140                    {
    141                        for (i2 = 0; i2 < 8; ++i2)
    142                        {
    143                            flag = !aboolean[(i1 * 16 + j2) * 8 + i2] && (i1 < 15 && aboolean[((i1 + 1) * 16 + j2) * 8 + i2] || i1 > 0 && aboolean[((i1 - 1) * 16 + j2) * 8 + i2] || j2 < 15 && aboolean[(i1 * 16 + j2 + 1) * 8 + i2] || j2 > 0 && aboolean[(i1 * 16 + (j2 - 1)) * 8 + i2] || i2 < 7 && aboolean[(i1 * 16 + j2) * 8 + i2 + 1] || i2 > 0 && aboolean[(i1 * 16 + j2) * 8 + (i2 - 1)]);
    144
    145                            if (flag && (i2 < 4 || par2Random.nextInt(2) != 0) && par1World.getBlockMaterial(par3 + i1, par4 + i2, par5 + j2).isSolid())
    146                            {
    147                                par1World.setBlockAndMetadataWithNotify(par3 + i1, par4 + i2, par5 + j2, Block.stone.blockID, 0, 2);
    148                            }
    149                        }
    150                    }
    151                }
    152            }
    153
    154            if (Block.blocksList[this.blockIndex].blockMaterial == Material.water)
    155            {
    156                for (i1 = 0; i1 < 16; ++i1)
    157                {
    158                    for (j2 = 0; j2 < 16; ++j2)
    159                    {
    160                        byte b0 = 4;
    161
    162                        if (par1World.isBlockFreezable(par3 + i1, par4 + b0, par5 + j2))
    163                        {
    164                            par1World.setBlockAndMetadataWithNotify(par3 + i1, par4 + b0, par5 + j2, Block.ice.blockID, 0, 2);
    165                        }
    166                    }
    167                }
    168            }
    169
    170            return true;
    171        }
    172    }
    173}