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 MapGenCaves extends MapGenBase {
6
7 public MapGenCaves() {
8 }
9
10 protected void a(int i, int j, byte[] abyte, double d0, double d1, double d2) {
11 this.a(i, j, abyte, d0, d1, d2, 1.0F + this.b.nextFloat() * 6.0F, 0.0F, 0.0F, -1, -1, 0.5D);
12 }
13
14 protected void a(int i, int j, byte[] abyte, double d0, double d1, double d2, float f, float f1, float f2, int k, int l, double d3) {
15 double d4 = (double) (i * 16 + 8);
16 double d5 = (double) (j * 16 + 8);
17 float f3 = 0.0F;
18 float f4 = 0.0F;
19 Random random = new Random(this.b.nextLong());
20
21 if (l <= 0) {
22 int i1 = this.a * 16 - 16;
23
24 l = i1 - random.nextInt(i1 / 4);
25 }
26
27 boolean flag = false;
28
29 if (k == -1) {
30 k = l / 2;
31 flag = true;
32 }
33
34 int j1 = random.nextInt(l / 2) + l / 4;
35
36 for (boolean flag1 = random.nextInt(6) == 0; k < l; ++k) {
37 double d6 = 1.5D + (double) (MathHelper.sin((float) k * 3.1415927F / (float) l) * f * 1.0F);
38 double d7 = d6 * d3;
39 float f5 = MathHelper.cos(f2);
40 float f6 = MathHelper.sin(f2);
41
42 d0 += (double) (MathHelper.cos(f1) * f5);
43 d1 += (double) f6;
44 d2 += (double) (MathHelper.sin(f1) * f5);
45 if (flag1) {
46 f2 *= 0.92F;
47 } else {
48 f2 *= 0.7F;
49 }
50
51 f2 += f4 * 0.1F;
52 f1 += f3 * 0.1F;
53 f4 *= 0.9F;
54 f3 *= 0.75F;
55 f4 += (random.nextFloat() - random.nextFloat()) * random.nextFloat() * 2.0F;
56 f3 += (random.nextFloat() - random.nextFloat()) * random.nextFloat() * 4.0F;
57 if (!flag && k == j1 && f > 1.0F) {
58 this.a(i, j, abyte, d0, d1, d2, random.nextFloat() * 0.5F + 0.5F, f1 - 1.5707964F, f2 / 3.0F, k, l, 1.0D);
59 this.a(i, j, abyte, d0, d1, d2, random.nextFloat() * 0.5F + 0.5F, f1 + 1.5707964F, f2 / 3.0F, k, l, 1.0D);
60 return;
61 }
62
63 if (flag || random.nextInt(4) != 0) {
64 double d8 = d0 - d4;
65 double d9 = d2 - d5;
66 double d10 = (double) (l - k);
67 double d11 = (double) (f + 2.0F + 16.0F);
68
69 if (d8 * d8 + d9 * d9 - d10 * d10 > d11 * d11) {
70 return;
71 }
72
73 if (d0 >= d4 - 16.0D - d6 * 2.0D && d2 >= d5 - 16.0D - d6 * 2.0D && d0 <= d4 + 16.0D + d6 * 2.0D && d2 <= d5 + 16.0D + d6 * 2.0D) {
74 int k1 = MathHelper.floor(d0 - d6) - i * 16 - 1;
75 int l1 = MathHelper.floor(d0 + d6) - i * 16 + 1;
76 int i2 = MathHelper.floor(d1 - d7) - 1;
77 int j2 = MathHelper.floor(d1 + d7) + 1;
78 int k2 = MathHelper.floor(d2 - d6) - j * 16 - 1;
79 int l2 = MathHelper.floor(d2 + d6) - j * 16 + 1;
80
81 if (k1 < 0) {
82 k1 = 0;
83 }
84
85 if (l1 > 16) {
86 l1 = 16;
87 }
88
89 if (i2 < 1) {
90 i2 = 1;
91 }
92
93 if (j2 > 120) {
94 j2 = 120;
95 }
96
97 if (k2 < 0) {
98 k2 = 0;
99 }
100
101 if (l2 > 16) {
102 l2 = 16;
103 }
104
105 boolean flag2 = false;
106
107 int i3;
108 int j3;
109
110 for (j3 = k1; !flag2 && j3 < l1; ++j3) {
111 for (int k3 = k2; !flag2 && k3 < l2; ++k3) {
112 for (int l3 = j2 + 1; !flag2 && l3 >= i2 - 1; --l3) {
113 i3 = (j3 * 16 + k3) * 128 + l3;
114 if (l3 >= 0 && l3 < 128) {
115 if (abyte[i3] == Block.WATER.id || abyte[i3] == Block.STATIONARY_WATER.id) {
116 flag2 = true;
117 }
118
119 if (l3 != i2 - 1 && j3 != k1 && j3 != l1 - 1 && k3 != k2 && k3 != l2 - 1) {
120 l3 = i2;
121 }
122 }
123 }
124 }
125 }
126
127 if (!flag2) {
128 for (j3 = k1; j3 < l1; ++j3) {
129 double d12 = ((double) (j3 + i * 16) + 0.5D - d0) / d6;
130
131 for (i3 = k2; i3 < l2; ++i3) {
132 double d13 = ((double) (i3 + j * 16) + 0.5D - d2) / d6;
133 int i4 = (j3 * 16 + i3) * 128 + j2;
134 boolean flag3 = false;
135
136 if (d12 * d12 + d13 * d13 < 1.0D) {
137 for (int j4 = j2 - 1; j4 >= i2; --j4) {
138 double d14 = ((double) j4 + 0.5D - d1) / d7;
139
140 if (d14 > -0.7D && d12 * d12 + d14 * d14 + d13 * d13 < 1.0D) {
141 byte b0 = abyte[i4];
142
143 if (b0 == Block.GRASS.id) {
144 flag3 = true;
145 }
146
147 if (b0 == Block.STONE.id || b0 == Block.DIRT.id || b0 == Block.GRASS.id) {
148 if (j4 < 10) {
149 abyte[i4] = (byte) Block.LAVA.id;
150 } else {
151 abyte[i4] = 0;
152 if (flag3 && abyte[i4 - 1] == Block.DIRT.id) {
153 abyte[i4 - 1] = (byte) Block.GRASS.id;
154 }
155 }
156 }
157 }
158
159 --i4;
160 }
161 }
162 }
163 }
164
165 if (flag) {
166 break;
167 }
168 }
169 }
170 }
171 }
172 }
173
174 protected void a(World world, int i, int j, int k, int l, byte[] abyte) {
175 int i1 = this.b.nextInt(this.b.nextInt(this.b.nextInt(40) + 1) + 1);
176
177 if (this.b.nextInt(15) != 0) {
178 i1 = 0;
179 }
180
181 for (int j1 = 0; j1 < i1; ++j1) {
182 double d0 = (double) (i * 16 + this.b.nextInt(16));
183 double d1 = (double) this.b.nextInt(this.b.nextInt(120) + 8);
184 double d2 = (double) (j * 16 + this.b.nextInt(16));
185 int k1 = 1;
186
187 if (this.b.nextInt(4) == 0) {
188 this.a(k, l, abyte, d0, d1, d2);
189 k1 += this.b.nextInt(4);
190 }
191
192 for (int l1 = 0; l1 < k1; ++l1) {
193 float f = this.b.nextFloat() * 3.1415927F * 2.0F;
194 float f1 = (this.b.nextFloat() - 0.5F) * 2.0F / 8.0F;
195 float f2 = this.b.nextFloat() * 2.0F + this.b.nextFloat();
196
197 this.a(k, l, abyte, d0, d1, d2, f2, f, f1, 0, 0, 1.0D);
198 }
199 }
200 }
201}