Fork of Poseidon providing Bukkit #1060 to older Beta versions (b1.0-b1.7.3)
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}