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.World;
007    
008    public 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    }