Fork of Poseidon providing Bukkit #1060 to older Beta versions (b1.0-b1.7.3)
1package net.minecraft.server;
2
3import java.util.ArrayList;
4import java.util.List;
5
6class MinecartTrackLogic {
7
8 private World b;
9 private int c;
10 private int d;
11 private int e;
12 private final boolean f;
13 private List g;
14
15 final BlockMinecartTrack a;
16
17 public MinecartTrackLogic(BlockMinecartTrack blockminecarttrack, World world, int i, int j, int k) {
18 this.a = blockminecarttrack;
19 this.g = new ArrayList();
20 this.b = world;
21 this.c = i;
22 this.d = j;
23 this.e = k;
24 int l = world.getTypeId(i, j, k);
25 int i1 = world.getData(i, j, k);
26
27 if (BlockMinecartTrack.a((BlockMinecartTrack) Block.byId[l])) {
28 this.f = true;
29 i1 &= -9;
30 } else {
31 this.f = false;
32 }
33
34 this.a(i1);
35 }
36
37 private void a(int i) {
38 this.g.clear();
39 if (i == 0) {
40 this.g.add(new ChunkPosition(this.c, this.d, this.e - 1));
41 this.g.add(new ChunkPosition(this.c, this.d, this.e + 1));
42 } else if (i == 1) {
43 this.g.add(new ChunkPosition(this.c - 1, this.d, this.e));
44 this.g.add(new ChunkPosition(this.c + 1, this.d, this.e));
45 } else if (i == 2) {
46 this.g.add(new ChunkPosition(this.c - 1, this.d, this.e));
47 this.g.add(new ChunkPosition(this.c + 1, this.d + 1, this.e));
48 } else if (i == 3) {
49 this.g.add(new ChunkPosition(this.c - 1, this.d + 1, this.e));
50 this.g.add(new ChunkPosition(this.c + 1, this.d, this.e));
51 } else if (i == 4) {
52 this.g.add(new ChunkPosition(this.c, this.d + 1, this.e - 1));
53 this.g.add(new ChunkPosition(this.c, this.d, this.e + 1));
54 } else if (i == 5) {
55 this.g.add(new ChunkPosition(this.c, this.d, this.e - 1));
56 this.g.add(new ChunkPosition(this.c, this.d + 1, this.e + 1));
57 } else if (i == 6) {
58 this.g.add(new ChunkPosition(this.c + 1, this.d, this.e));
59 this.g.add(new ChunkPosition(this.c, this.d, this.e + 1));
60 } else if (i == 7) {
61 this.g.add(new ChunkPosition(this.c - 1, this.d, this.e));
62 this.g.add(new ChunkPosition(this.c, this.d, this.e + 1));
63 } else if (i == 8) {
64 this.g.add(new ChunkPosition(this.c - 1, this.d, this.e));
65 this.g.add(new ChunkPosition(this.c, this.d, this.e - 1));
66 } else if (i == 9) {
67 this.g.add(new ChunkPosition(this.c + 1, this.d, this.e));
68 this.g.add(new ChunkPosition(this.c, this.d, this.e - 1));
69 }
70 }
71
72 private void a() {
73 for (int i = 0; i < this.g.size(); ++i) {
74 MinecartTrackLogic minecarttracklogic = this.a((ChunkPosition) this.g.get(i));
75
76 if (minecarttracklogic != null && minecarttracklogic.b(this)) {
77 this.g.set(i, new ChunkPosition(minecarttracklogic.c, minecarttracklogic.d, minecarttracklogic.e));
78 } else {
79 this.g.remove(i--);
80 }
81 }
82 }
83
84 private boolean a(int i, int j, int k) {
85 return BlockMinecartTrack.g(this.b, i, j, k) ? true : (BlockMinecartTrack.g(this.b, i, j + 1, k) ? true : BlockMinecartTrack.g(this.b, i, j - 1, k));
86 }
87
88 private MinecartTrackLogic a(ChunkPosition chunkposition) {
89 return BlockMinecartTrack.g(this.b, chunkposition.x, chunkposition.y, chunkposition.z) ? new MinecartTrackLogic(this.a, this.b, chunkposition.x, chunkposition.y, chunkposition.z) : (BlockMinecartTrack.g(this.b, chunkposition.x, chunkposition.y + 1, chunkposition.z) ? new MinecartTrackLogic(this.a, this.b, chunkposition.x, chunkposition.y + 1, chunkposition.z) : (BlockMinecartTrack.g(this.b, chunkposition.x, chunkposition.y - 1, chunkposition.z) ? new MinecartTrackLogic(this.a, this.b, chunkposition.x, chunkposition.y - 1, chunkposition.z) : null));
90 }
91
92 private boolean b(MinecartTrackLogic minecarttracklogic) {
93 for (int i = 0; i < this.g.size(); ++i) {
94 ChunkPosition chunkposition = (ChunkPosition) this.g.get(i);
95
96 if (chunkposition.x == minecarttracklogic.c && chunkposition.z == minecarttracklogic.e) {
97 return true;
98 }
99 }
100
101 return false;
102 }
103
104 private boolean b(int i, int j, int k) {
105 for (int l = 0; l < this.g.size(); ++l) {
106 ChunkPosition chunkposition = (ChunkPosition) this.g.get(l);
107
108 if (chunkposition.x == i && chunkposition.z == k) {
109 return true;
110 }
111 }
112
113 return false;
114 }
115
116 private int b() {
117 int i = 0;
118
119 if (this.a(this.c, this.d, this.e - 1)) {
120 ++i;
121 }
122
123 if (this.a(this.c, this.d, this.e + 1)) {
124 ++i;
125 }
126
127 if (this.a(this.c - 1, this.d, this.e)) {
128 ++i;
129 }
130
131 if (this.a(this.c + 1, this.d, this.e)) {
132 ++i;
133 }
134
135 return i;
136 }
137
138 private boolean c(MinecartTrackLogic minecarttracklogic) {
139 if (this.b(minecarttracklogic)) {
140 return true;
141 } else if (this.g.size() == 2) {
142 return false;
143 } else if (this.g.size() == 0) {
144 return true;
145 } else {
146 ChunkPosition chunkposition = (ChunkPosition) this.g.get(0);
147
148 return minecarttracklogic.d == this.d && chunkposition.y == this.d ? true : true;
149 }
150 }
151
152 private void d(MinecartTrackLogic minecarttracklogic) {
153 this.g.add(new ChunkPosition(minecarttracklogic.c, minecarttracklogic.d, minecarttracklogic.e));
154 boolean flag = this.b(this.c, this.d, this.e - 1);
155 boolean flag1 = this.b(this.c, this.d, this.e + 1);
156 boolean flag2 = this.b(this.c - 1, this.d, this.e);
157 boolean flag3 = this.b(this.c + 1, this.d, this.e);
158 byte b0 = -1;
159
160 if (flag || flag1) {
161 b0 = 0;
162 }
163
164 if (flag2 || flag3) {
165 b0 = 1;
166 }
167
168 if (!this.f) {
169 if (flag1 && flag3 && !flag && !flag2) {
170 b0 = 6;
171 }
172
173 if (flag1 && flag2 && !flag && !flag3) {
174 b0 = 7;
175 }
176
177 if (flag && flag2 && !flag1 && !flag3) {
178 b0 = 8;
179 }
180
181 if (flag && flag3 && !flag1 && !flag2) {
182 b0 = 9;
183 }
184 }
185
186 if (b0 == 0) {
187 if (BlockMinecartTrack.g(this.b, this.c, this.d + 1, this.e - 1)) {
188 b0 = 4;
189 }
190
191 if (BlockMinecartTrack.g(this.b, this.c, this.d + 1, this.e + 1)) {
192 b0 = 5;
193 }
194 }
195
196 if (b0 == 1) {
197 if (BlockMinecartTrack.g(this.b, this.c + 1, this.d + 1, this.e)) {
198 b0 = 2;
199 }
200
201 if (BlockMinecartTrack.g(this.b, this.c - 1, this.d + 1, this.e)) {
202 b0 = 3;
203 }
204 }
205
206 if (b0 < 0) {
207 b0 = 0;
208 }
209
210 int i = b0;
211
212 if (this.f) {
213 i = this.b.getData(this.c, this.d, this.e) & 8 | b0;
214 }
215
216 this.b.setData(this.c, this.d, this.e, i);
217 }
218
219 private boolean c(int i, int j, int k) {
220 MinecartTrackLogic minecarttracklogic = this.a(new ChunkPosition(i, j, k));
221
222 if (minecarttracklogic == null) {
223 return false;
224 } else {
225 minecarttracklogic.a();
226 return minecarttracklogic.c(this);
227 }
228 }
229
230 public void a(boolean flag, boolean flag1) {
231 boolean flag2 = this.c(this.c, this.d, this.e - 1);
232 boolean flag3 = this.c(this.c, this.d, this.e + 1);
233 boolean flag4 = this.c(this.c - 1, this.d, this.e);
234 boolean flag5 = this.c(this.c + 1, this.d, this.e);
235 byte b0 = -1;
236
237 if ((flag2 || flag3) && !flag4 && !flag5) {
238 b0 = 0;
239 }
240
241 if ((flag4 || flag5) && !flag2 && !flag3) {
242 b0 = 1;
243 }
244
245 if (!this.f) {
246 if (flag3 && flag5 && !flag2 && !flag4) {
247 b0 = 6;
248 }
249
250 if (flag3 && flag4 && !flag2 && !flag5) {
251 b0 = 7;
252 }
253
254 if (flag2 && flag4 && !flag3 && !flag5) {
255 b0 = 8;
256 }
257
258 if (flag2 && flag5 && !flag3 && !flag4) {
259 b0 = 9;
260 }
261 }
262
263 if (b0 == -1) {
264 if (flag2 || flag3) {
265 b0 = 0;
266 }
267
268 if (flag4 || flag5) {
269 b0 = 1;
270 }
271
272 if (!this.f) {
273 if (flag) {
274 if (flag3 && flag5) {
275 b0 = 6;
276 }
277
278 if (flag4 && flag3) {
279 b0 = 7;
280 }
281
282 if (flag5 && flag2) {
283 b0 = 9;
284 }
285
286 if (flag2 && flag4) {
287 b0 = 8;
288 }
289 } else {
290 if (flag2 && flag4) {
291 b0 = 8;
292 }
293
294 if (flag5 && flag2) {
295 b0 = 9;
296 }
297
298 if (flag4 && flag3) {
299 b0 = 7;
300 }
301
302 if (flag3 && flag5) {
303 b0 = 6;
304 }
305 }
306 }
307 }
308
309 if (b0 == 0) {
310 if (BlockMinecartTrack.g(this.b, this.c, this.d + 1, this.e - 1)) {
311 b0 = 4;
312 }
313
314 if (BlockMinecartTrack.g(this.b, this.c, this.d + 1, this.e + 1)) {
315 b0 = 5;
316 }
317 }
318
319 if (b0 == 1) {
320 if (BlockMinecartTrack.g(this.b, this.c + 1, this.d + 1, this.e)) {
321 b0 = 2;
322 }
323
324 if (BlockMinecartTrack.g(this.b, this.c - 1, this.d + 1, this.e)) {
325 b0 = 3;
326 }
327 }
328
329 if (b0 < 0) {
330 b0 = 0;
331 }
332
333 this.a(b0);
334 int i = b0;
335
336 if (this.f) {
337 i = this.b.getData(this.c, this.d, this.e) & 8 | b0;
338 }
339
340 if (flag1 || this.b.getData(this.c, this.d, this.e) != i) {
341 this.b.setData(this.c, this.d, this.e, i);
342
343 for (int j = 0; j < this.g.size(); ++j) {
344 MinecartTrackLogic minecarttracklogic = this.a((ChunkPosition) this.g.get(j));
345
346 if (minecarttracklogic != null) {
347 minecarttracklogic.a();
348 if (minecarttracklogic.c(this)) {
349 minecarttracklogic.d(this);
350 }
351 }
352 }
353 }
354 }
355
356 static int a(MinecartTrackLogic minecarttracklogic) {
357 return minecarttracklogic.b();
358 }
359}