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 l; 013 014 for (l = par2Random.nextInt(4) + 5; par1World.getBlockMaterial(par3, par4 - 1, par5) == Material.water; --par4) 015 { 016 ; 017 } 018 019 boolean flag = true; 020 021 if (par4 >= 1 && par4 + l + 1 <= 128) 022 { 023 int i1; 024 int j1; 025 int k1; 026 int l1; 027 028 for (i1 = par4; i1 <= par4 + 1 + l; ++i1) 029 { 030 byte b0 = 1; 031 032 if (i1 == par4) 033 { 034 b0 = 0; 035 } 036 037 if (i1 >= par4 + 1 + l - 2) 038 { 039 b0 = 3; 040 } 041 042 for (j1 = par3 - b0; j1 <= par3 + b0 && flag; ++j1) 043 { 044 for (k1 = par5 - b0; k1 <= par5 + b0 && flag; ++k1) 045 { 046 if (i1 >= 0 && i1 < 128) 047 { 048 l1 = par1World.getBlockId(j1, i1, k1); 049 050 if (l1 != 0 && (Block.blocksList[l1] != null && !Block.blocksList[l1].isLeaves(par1World, j1, i1, k1))) 051 { 052 if (l1 != Block.waterStill.blockID && l1 != Block.waterMoving.blockID) 053 { 054 flag = false; 055 } 056 else if (i1 > par4) 057 { 058 flag = false; 059 } 060 } 061 } 062 else 063 { 064 flag = false; 065 } 066 } 067 } 068 } 069 070 if (!flag) 071 { 072 return false; 073 } 074 else 075 { 076 i1 = par1World.getBlockId(par3, par4 - 1, par5); 077 078 if ((i1 == Block.grass.blockID || i1 == Block.dirt.blockID) && par4 < 128 - l - 1) 079 { 080 this.setBlock(par1World, par3, par4 - 1, par5, Block.dirt.blockID); 081 int i2; 082 int j2; 083 084 for (j2 = par4 - 3 + l; j2 <= par4 + l; ++j2) 085 { 086 j1 = j2 - (par4 + l); 087 k1 = 2 - j1 / 2; 088 089 for (l1 = par3 - k1; l1 <= par3 + k1; ++l1) 090 { 091 i2 = l1 - par3; 092 093 for (int k2 = par5 - k1; k2 <= par5 + k1; ++k2) 094 { 095 int l2 = k2 - par5; 096 097 Block block = Block.blocksList[par1World.getBlockId(l1, j2, k2)]; 098 099 if ((Math.abs(i2) != k1 || Math.abs(l2) != k1 || par2Random.nextInt(2) != 0 && j1 != 0) && 100 (block == null || block.canBeReplacedByLeaves(par1World, l1, j2, k2))) 101 { 102 this.setBlock(par1World, l1, j2, k2, Block.leaves.blockID); 103 } 104 } 105 } 106 } 107 108 for (j2 = 0; j2 < l; ++j2) 109 { 110 j1 = par1World.getBlockId(par3, par4 + j2, par5); 111 112 Block block = Block.blocksList[j1]; 113 114 if (j1 == 0 || (block != null && block.isLeaves(par1World, par3, par4 + j2, par5)) || j1 == Block.waterMoving.blockID || j1 == Block.waterStill.blockID) 115 { 116 this.setBlock(par1World, par3, par4 + j2, par5, Block.wood.blockID); 117 } 118 } 119 120 for (j2 = par4 - 3 + l; j2 <= par4 + l; ++j2) 121 { 122 j1 = j2 - (par4 + l); 123 k1 = 2 - j1 / 2; 124 125 for (l1 = par3 - k1; l1 <= par3 + k1; ++l1) 126 { 127 for (i2 = par5 - k1; i2 <= par5 + k1; ++i2) 128 { 129 Block block = Block.blocksList[par1World.getBlockId(l1, j2, i2)]; 130 if (block != null && block.isLeaves(par1World, l1, j2, i2)) 131 { 132 if (par2Random.nextInt(4) == 0 && par1World.getBlockId(l1 - 1, j2, i2) == 0) 133 { 134 this.generateVines(par1World, l1 - 1, j2, i2, 8); 135 } 136 137 if (par2Random.nextInt(4) == 0 && par1World.getBlockId(l1 + 1, j2, i2) == 0) 138 { 139 this.generateVines(par1World, l1 + 1, j2, i2, 2); 140 } 141 142 if (par2Random.nextInt(4) == 0 && par1World.getBlockId(l1, j2, i2 - 1) == 0) 143 { 144 this.generateVines(par1World, l1, j2, i2 - 1, 1); 145 } 146 147 if (par2Random.nextInt(4) == 0 && par1World.getBlockId(l1, j2, i2 + 1) == 0) 148 { 149 this.generateVines(par1World, l1, j2, i2 + 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 i1 = 4; 177 178 while (true) 179 { 180 --par3; 181 182 if (par1World.getBlockId(par2, par3, par4) != 0 || i1 <= 0) 183 { 184 return; 185 } 186 187 this.setBlockAndMetadata(par1World, par2, par3, par4, Block.vine.blockID, par5); 188 --i1; 189 } 190 } 191}