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 }