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