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.World;
007
008public class WorldGenSwamp extends WorldGenerator
009{
010    public boolean generate(World par1World, Random par2Random, int par3, int par4, int par5)
011    {
012        int var6;
013
014        for (var6 = par2Random.nextInt(4) + 5; par1World.getBlockMaterial(par3, par4 - 1, par5) == Material.water; --par4)
015        {
016            ;
017        }
018
019        boolean var7 = true;
020
021        if (par4 >= 1 && par4 + var6 + 1 <= 128)
022        {
023            int var8;
024            int var10;
025            int var11;
026            int var12;
027
028            for (var8 = par4; var8 <= par4 + 1 + var6; ++var8)
029            {
030                byte var9 = 1;
031
032                if (var8 == par4)
033                {
034                    var9 = 0;
035                }
036
037                if (var8 >= par4 + 1 + var6 - 2)
038                {
039                    var9 = 3;
040                }
041
042                for (var10 = par3 - var9; var10 <= par3 + var9 && var7; ++var10)
043                {
044                    for (var11 = par5 - var9; var11 <= par5 + var9 && var7; ++var11)
045                    {
046                        if (var8 >= 0 && var8 < 128)
047                        {
048                            var12 = par1World.getBlockId(var10, var8, var11);
049
050                            if (var12 != 0 && (Block.blocksList[var12] != null && !Block.blocksList[var12].isLeaves(par1World, var10, var8, var11)))
051                            {
052                                if (var12 != Block.waterStill.blockID && var12 != Block.waterMoving.blockID)
053                                {
054                                    var7 = false;
055                                }
056                                else if (var8 > par4)
057                                {
058                                    var7 = false;
059                                }
060                            }
061                        }
062                        else
063                        {
064                            var7 = false;
065                        }
066                    }
067                }
068            }
069
070            if (!var7)
071            {
072                return false;
073            }
074            else
075            {
076                var8 = par1World.getBlockId(par3, par4 - 1, par5);
077
078                if ((var8 == Block.grass.blockID || var8 == Block.dirt.blockID) && par4 < 128 - var6 - 1)
079                {
080                    this.setBlock(par1World, par3, par4 - 1, par5, Block.dirt.blockID);
081                    int var13;
082                    int var16;
083
084                    for (var16 = par4 - 3 + var6; var16 <= par4 + var6; ++var16)
085                    {
086                        var10 = var16 - (par4 + var6);
087                        var11 = 2 - var10 / 2;
088
089                        for (var12 = par3 - var11; var12 <= par3 + var11; ++var12)
090                        {
091                            var13 = var12 - par3;
092
093                            for (int var14 = par5 - var11; var14 <= par5 + var11; ++var14)
094                            {
095                                int var15 = var14 - par5;
096
097                                Block block = Block.blocksList[par1World.getBlockId(var12, var16, var14)];
098
099                                if ((Math.abs(var13) != var11 || Math.abs(var15) != var11 || par2Random.nextInt(2) != 0 && var10 != 0) && 
100                                    (block == null || block.canBeReplacedByLeaves(par1World, var12, var16, var14)))
101                                {
102                                    this.setBlock(par1World, var12, var16, var14, Block.leaves.blockID);
103                                }
104                            }
105                        }
106                    }
107
108                    for (var16 = 0; var16 < var6; ++var16)
109                    {
110                        var10 = par1World.getBlockId(par3, par4 + var16, par5);
111
112                        Block block = Block.blocksList[var10];
113
114                        if (var10 == 0 || (block != null && block.isLeaves(par1World, par3, par4 + var16, par5)) || var10 == Block.waterMoving.blockID || var10 == Block.waterStill.blockID)
115                        {
116                            this.setBlock(par1World, par3, par4 + var16, par5, Block.wood.blockID);
117                        }
118                    }
119
120                    for (var16 = par4 - 3 + var6; var16 <= par4 + var6; ++var16)
121                    {
122                        var10 = var16 - (par4 + var6);
123                        var11 = 2 - var10 / 2;
124
125                        for (var12 = par3 - var11; var12 <= par3 + var11; ++var12)
126                        {
127                            for (var13 = par5 - var11; var13 <= par5 + var11; ++var13)
128                            {
129                                Block block = Block.blocksList[par1World.getBlockId(var12, var16, var13)];
130                                if (block != null && block.isLeaves(par1World, var12, var16, var13))
131                                {
132                                    if (par2Random.nextInt(4) == 0 && par1World.getBlockId(var12 - 1, var16, var13) == 0)
133                                    {
134                                        this.generateVines(par1World, var12 - 1, var16, var13, 8);
135                                    }
136
137                                    if (par2Random.nextInt(4) == 0 && par1World.getBlockId(var12 + 1, var16, var13) == 0)
138                                    {
139                                        this.generateVines(par1World, var12 + 1, var16, var13, 2);
140                                    }
141
142                                    if (par2Random.nextInt(4) == 0 && par1World.getBlockId(var12, var16, var13 - 1) == 0)
143                                    {
144                                        this.generateVines(par1World, var12, var16, var13 - 1, 1);
145                                    }
146
147                                    if (par2Random.nextInt(4) == 0 && par1World.getBlockId(var12, var16, var13 + 1) == 0)
148                                    {
149                                        this.generateVines(par1World, var12, var16, var13 + 1, 4);
150                                    }
151                                }
152                            }
153                        }
154                    }
155
156                    return true;
157                }
158                else
159                {
160                    return false;
161                }
162            }
163        }
164        else
165        {
166            return false;
167        }
168    }
169
170    /**
171     * Generates vines at the given position until it hits a block.
172     */
173    private void generateVines(World par1World, int par2, int par3, int par4, int par5)
174    {
175        this.setBlockAndMetadata(par1World, par2, par3, par4, Block.vine.blockID, par5);
176        int var6 = 4;
177
178        while (true)
179        {
180            --par3;
181
182            if (par1World.getBlockId(par2, par3, par4) != 0 || var6 <= 0)
183            {
184                return;
185            }
186
187            this.setBlockAndMetadata(par1World, par2, par3, par4, Block.vine.blockID, par5);
188            --var6;
189        }
190    }
191}