Fork of Poseidon providing Bukkit #1060 to older Beta versions (b1.0-b1.7.3)
at develop 387 lines 13 kB view raw
1package net.minecraft.server; 2 3import java.util.Random; 4 5public class ChunkProviderHell implements IChunkProvider { 6 7 private Random h; 8 private NoiseGeneratorOctaves i; 9 private NoiseGeneratorOctaves j; 10 private NoiseGeneratorOctaves k; 11 private NoiseGeneratorOctaves l; 12 private NoiseGeneratorOctaves m; 13 public NoiseGeneratorOctaves a; 14 public NoiseGeneratorOctaves b; 15 private World n; 16 private double[] o; 17 private double[] p = new double[256]; 18 private double[] q = new double[256]; 19 private double[] r = new double[256]; 20 private MapGenBase s = new MapGenCavesHell(); 21 double[] c; 22 double[] d; 23 double[] e; 24 double[] f; 25 double[] g; 26 27 public ChunkProviderHell(World world, long i) { 28 this.n = world; 29 this.h = new Random(i); 30 this.i = new NoiseGeneratorOctaves(this.h, 16); 31 this.j = new NoiseGeneratorOctaves(this.h, 16); 32 this.k = new NoiseGeneratorOctaves(this.h, 8); 33 this.l = new NoiseGeneratorOctaves(this.h, 4); 34 this.m = new NoiseGeneratorOctaves(this.h, 4); 35 this.a = new NoiseGeneratorOctaves(this.h, 10); 36 this.b = new NoiseGeneratorOctaves(this.h, 16); 37 } 38 39 public void a(int i, int j, byte[] abyte) { 40 byte b0 = 4; 41 byte b1 = 32; 42 int k = b0 + 1; 43 byte b2 = 17; 44 int l = b0 + 1; 45 46 this.o = this.a(this.o, i * b0, 0, j * b0, k, b2, l); 47 48 for (int i1 = 0; i1 < b0; ++i1) { 49 for (int j1 = 0; j1 < b0; ++j1) { 50 for (int k1 = 0; k1 < 16; ++k1) { 51 double d0 = 0.125D; 52 double d1 = this.o[((i1 + 0) * l + j1 + 0) * b2 + k1 + 0]; 53 double d2 = this.o[((i1 + 0) * l + j1 + 1) * b2 + k1 + 0]; 54 double d3 = this.o[((i1 + 1) * l + j1 + 0) * b2 + k1 + 0]; 55 double d4 = this.o[((i1 + 1) * l + j1 + 1) * b2 + k1 + 0]; 56 double d5 = (this.o[((i1 + 0) * l + j1 + 0) * b2 + k1 + 1] - d1) * d0; 57 double d6 = (this.o[((i1 + 0) * l + j1 + 1) * b2 + k1 + 1] - d2) * d0; 58 double d7 = (this.o[((i1 + 1) * l + j1 + 0) * b2 + k1 + 1] - d3) * d0; 59 double d8 = (this.o[((i1 + 1) * l + j1 + 1) * b2 + k1 + 1] - d4) * d0; 60 61 for (int l1 = 0; l1 < 8; ++l1) { 62 double d9 = 0.25D; 63 double d10 = d1; 64 double d11 = d2; 65 double d12 = (d3 - d1) * d9; 66 double d13 = (d4 - d2) * d9; 67 68 for (int i2 = 0; i2 < 4; ++i2) { 69 int j2 = i2 + i1 * 4 << 11 | 0 + j1 * 4 << 7 | k1 * 8 + l1; 70 short short1 = 128; 71 double d14 = 0.25D; 72 double d15 = d10; 73 double d16 = (d11 - d10) * d14; 74 75 for (int k2 = 0; k2 < 4; ++k2) { 76 int l2 = 0; 77 78 if (k1 * 8 + l1 < b1) { 79 l2 = Block.STATIONARY_LAVA.id; 80 } 81 82 if (d15 > 0.0D) { 83 l2 = Block.NETHERRACK.id; 84 } 85 86 abyte[j2] = (byte) l2; 87 j2 += short1; 88 d15 += d16; 89 } 90 91 d10 += d12; 92 d11 += d13; 93 } 94 95 d1 += d5; 96 d2 += d6; 97 d3 += d7; 98 d4 += d8; 99 } 100 } 101 } 102 } 103 } 104 105 public void b(int i, int j, byte[] abyte) { 106 byte b0 = 64; 107 double d0 = 0.03125D; 108 109 this.p = this.l.a(this.p, (double) (i * 16), (double) (j * 16), 0.0D, 16, 16, 1, d0, d0, 1.0D); 110 this.q = this.l.a(this.q, (double) (i * 16), 109.0134D, (double) (j * 16), 16, 1, 16, d0, 1.0D, d0); 111 this.r = this.m.a(this.r, (double) (i * 16), (double) (j * 16), 0.0D, 16, 16, 1, d0 * 2.0D, d0 * 2.0D, d0 * 2.0D); 112 113 for (int k = 0; k < 16; ++k) { 114 for (int l = 0; l < 16; ++l) { 115 boolean flag = this.p[k + l * 16] + this.h.nextDouble() * 0.2D > 0.0D; 116 boolean flag1 = this.q[k + l * 16] + this.h.nextDouble() * 0.2D > 0.0D; 117 int i1 = (int) (this.r[k + l * 16] / 3.0D + 3.0D + this.h.nextDouble() * 0.25D); 118 int j1 = -1; 119 byte b1 = (byte) Block.NETHERRACK.id; 120 byte b2 = (byte) Block.NETHERRACK.id; 121 122 for (int k1 = 127; k1 >= 0; --k1) { 123 int l1 = (l * 16 + k) * 128 + k1; 124 125 if (k1 >= 127 - this.h.nextInt(5)) { 126 abyte[l1] = (byte) Block.BEDROCK.id; 127 } else if (k1 <= 0 + this.h.nextInt(5)) { 128 abyte[l1] = (byte) Block.BEDROCK.id; 129 } else { 130 byte b3 = abyte[l1]; 131 132 if (b3 == 0) { 133 j1 = -1; 134 } else if (b3 == Block.NETHERRACK.id) { 135 if (j1 == -1) { 136 if (i1 <= 0) { 137 b1 = 0; 138 b2 = (byte) Block.NETHERRACK.id; 139 } else if (k1 >= b0 - 4 && k1 <= b0 + 1) { 140 b1 = (byte) Block.NETHERRACK.id; 141 b2 = (byte) Block.NETHERRACK.id; 142 if (flag1) { 143 b1 = (byte) Block.GRAVEL.id; 144 } 145 146 if (flag1) { 147 b2 = (byte) Block.NETHERRACK.id; 148 } 149 150 if (flag) { 151 b1 = (byte) Block.SOUL_SAND.id; 152 } 153 154 if (flag) { 155 b2 = (byte) Block.SOUL_SAND.id; 156 } 157 } 158 159 if (k1 < b0 && b1 == 0) { 160 b1 = (byte) Block.STATIONARY_LAVA.id; 161 } 162 163 j1 = i1; 164 if (k1 >= b0 - 1) { 165 abyte[l1] = b1; 166 } else { 167 abyte[l1] = b2; 168 } 169 } else if (j1 > 0) { 170 --j1; 171 abyte[l1] = b2; 172 } 173 } 174 } 175 } 176 } 177 } 178 } 179 180 public Chunk getChunkAt(int i, int j) { 181 return this.getOrCreateChunk(i, j); 182 } 183 184 public Chunk getOrCreateChunk(int i, int j) { 185 this.h.setSeed((long) i * 341873128712L + (long) j * 132897987541L); 186 byte[] abyte = new byte['\u8000']; 187 188 this.a(i, j, abyte); 189 this.b(i, j, abyte); 190 this.s.a(this, this.n, i, j, abyte); 191 Chunk chunk = new Chunk(this.n, abyte, i, j); 192 193 return chunk; 194 } 195 196 private double[] a(double[] adouble, int i, int j, int k, int l, int i1, int j1) { 197 if (adouble == null) { 198 adouble = new double[l * i1 * j1]; 199 } 200 201 double d0 = 684.412D; 202 double d1 = 2053.236D; 203 204 this.f = this.a.a(this.f, (double) i, (double) j, (double) k, l, 1, j1, 1.0D, 0.0D, 1.0D); 205 this.g = this.b.a(this.g, (double) i, (double) j, (double) k, l, 1, j1, 100.0D, 0.0D, 100.0D); 206 this.c = this.k.a(this.c, (double) i, (double) j, (double) k, l, i1, j1, d0 / 80.0D, d1 / 60.0D, d0 / 80.0D); 207 this.d = this.i.a(this.d, (double) i, (double) j, (double) k, l, i1, j1, d0, d1, d0); 208 this.e = this.j.a(this.e, (double) i, (double) j, (double) k, l, i1, j1, d0, d1, d0); 209 int k1 = 0; 210 int l1 = 0; 211 double[] adouble1 = new double[i1]; 212 213 int i2; 214 215 for (i2 = 0; i2 < i1; ++i2) { 216 adouble1[i2] = Math.cos((double) i2 * 3.141592653589793D * 6.0D / (double) i1) * 2.0D; 217 double d2 = (double) i2; 218 219 if (i2 > i1 / 2) { 220 d2 = (double) (i1 - 1 - i2); 221 } 222 223 if (d2 < 4.0D) { 224 d2 = 4.0D - d2; 225 adouble1[i2] -= d2 * d2 * d2 * 10.0D; 226 } 227 } 228 229 for (i2 = 0; i2 < l; ++i2) { 230 for (int j2 = 0; j2 < j1; ++j2) { 231 double d3 = (this.f[l1] + 256.0D) / 512.0D; 232 233 if (d3 > 1.0D) { 234 d3 = 1.0D; 235 } 236 237 double d4 = 0.0D; 238 double d5 = this.g[l1] / 8000.0D; 239 240 if (d5 < 0.0D) { 241 d5 = -d5; 242 } 243 244 d5 = d5 * 3.0D - 3.0D; 245 if (d5 < 0.0D) { 246 d5 /= 2.0D; 247 if (d5 < -1.0D) { 248 d5 = -1.0D; 249 } 250 251 d5 /= 1.4D; 252 d5 /= 2.0D; 253 d3 = 0.0D; 254 } else { 255 if (d5 > 1.0D) { 256 d5 = 1.0D; 257 } 258 259 d5 /= 6.0D; 260 } 261 262 d3 += 0.5D; 263 d5 = d5 * (double) i1 / 16.0D; 264 ++l1; 265 266 for (int k2 = 0; k2 < i1; ++k2) { 267 double d6 = 0.0D; 268 double d7 = adouble1[k2]; 269 double d8 = this.d[k1] / 512.0D; 270 double d9 = this.e[k1] / 512.0D; 271 double d10 = (this.c[k1] / 10.0D + 1.0D) / 2.0D; 272 273 if (d10 < 0.0D) { 274 d6 = d8; 275 } else if (d10 > 1.0D) { 276 d6 = d9; 277 } else { 278 d6 = d8 + (d9 - d8) * d10; 279 } 280 281 d6 -= d7; 282 double d11; 283 284 if (k2 > i1 - 4) { 285 d11 = (double) ((float) (k2 - (i1 - 4)) / 3.0F); 286 d6 = d6 * (1.0D - d11) + -10.0D * d11; 287 } 288 289 if ((double) k2 < d4) { 290 d11 = (d4 - (double) k2) / 4.0D; 291 if (d11 < 0.0D) { 292 d11 = 0.0D; 293 } 294 295 if (d11 > 1.0D) { 296 d11 = 1.0D; 297 } 298 299 d6 = d6 * (1.0D - d11) + -10.0D * d11; 300 } 301 302 adouble[k1] = d6; 303 ++k1; 304 } 305 } 306 } 307 308 return adouble; 309 } 310 311 public boolean isChunkLoaded(int i, int j) { 312 return true; 313 } 314 315 public void getChunkAt(IChunkProvider ichunkprovider, int i, int j) { 316 BlockSand.instaFall = true; 317 int k = i * 16; 318 int l = j * 16; 319 320 int i1; 321 int j1; 322 int k1; 323 int l1; 324 325 for (i1 = 0; i1 < 8; ++i1) { 326 j1 = k + this.h.nextInt(16) + 8; 327 k1 = this.h.nextInt(120) + 4; 328 l1 = l + this.h.nextInt(16) + 8; 329 (new WorldGenHellLava(Block.LAVA.id)).a(this.n, this.h, j1, k1, l1); 330 } 331 332 i1 = this.h.nextInt(this.h.nextInt(10) + 1) + 1; 333 334 int i2; 335 336 for (j1 = 0; j1 < i1; ++j1) { 337 k1 = k + this.h.nextInt(16) + 8; 338 l1 = this.h.nextInt(120) + 4; 339 i2 = l + this.h.nextInt(16) + 8; 340 (new WorldGenFire()).a(this.n, this.h, k1, l1, i2); 341 } 342 343 i1 = this.h.nextInt(this.h.nextInt(10) + 1); 344 345 for (j1 = 0; j1 < i1; ++j1) { 346 k1 = k + this.h.nextInt(16) + 8; 347 l1 = this.h.nextInt(120) + 4; 348 i2 = l + this.h.nextInt(16) + 8; 349 (new WorldGenLightStone2()).a(this.n, this.h, k1, l1, i2); 350 } 351 352 for (j1 = 0; j1 < 10; ++j1) { 353 k1 = k + this.h.nextInt(16) + 8; 354 l1 = this.h.nextInt(128); 355 i2 = l + this.h.nextInt(16) + 8; 356 (new WorldGenLightStone1()).a(this.n, this.h, k1, l1, i2); 357 } 358 359 if (this.h.nextInt(1) == 0) { 360 j1 = k + this.h.nextInt(16) + 8; 361 k1 = this.h.nextInt(128); 362 l1 = l + this.h.nextInt(16) + 8; 363 (new WorldGenFlowers(Block.BROWN_MUSHROOM.id)).a(this.n, this.h, j1, k1, l1); 364 } 365 366 if (this.h.nextInt(1) == 0) { 367 j1 = k + this.h.nextInt(16) + 8; 368 k1 = this.h.nextInt(128); 369 l1 = l + this.h.nextInt(16) + 8; 370 (new WorldGenFlowers(Block.RED_MUSHROOM.id)).a(this.n, this.h, j1, k1, l1); 371 } 372 373 BlockSand.instaFall = false; 374 } 375 376 public boolean saveChunks(boolean flag, IProgressUpdate iprogressupdate) { 377 return true; 378 } 379 380 public boolean unloadChunks() { 381 return false; 382 } 383 384 public boolean canSave() { 385 return true; 386 } 387}