001package net.minecraft.block;
002
003import java.util.ArrayList;
004import java.util.List;
005import net.minecraft.world.ChunkPosition;
006import net.minecraft.world.World;
007
008public class BlockBaseRailLogic
009{
010    private World field_94516_b;
011    private int field_94517_c;
012    private int field_94514_d;
013    private int field_94515_e;
014    private final boolean field_94512_f;
015    private List field_94513_g;
016
017    private final boolean canMakeSlopes;
018
019    final BlockRailBase field_94518_a;
020
021    public BlockBaseRailLogic(BlockRailBase par1, World par2, int par3, int par4, int par5)
022    {
023        this.field_94518_a = par1;
024        this.field_94513_g = new ArrayList();
025        this.field_94516_b = par2;
026        this.field_94517_c = par3;
027        this.field_94514_d = par4;
028        this.field_94515_e = par5;
029        int l = par2.getBlockId(par3, par4, par5);
030
031        BlockRailBase target = (BlockRailBase)Block.blocksList[l];
032        int i1 = target.getBasicRailMetadata(par2, null, par3, par4, par5);
033        field_94512_f = !target.isFlexibleRail(par2, par3, par4, par5);
034        canMakeSlopes = target.canMakeSlopes(par2, par3, par4, par5);
035
036        this.func_94504_a(i1);
037    }
038
039    private void func_94504_a(int par1)
040    {
041        this.field_94513_g.clear();
042
043        if (par1 == 0)
044        {
045            this.field_94513_g.add(new ChunkPosition(this.field_94517_c, this.field_94514_d, this.field_94515_e - 1));
046            this.field_94513_g.add(new ChunkPosition(this.field_94517_c, this.field_94514_d, this.field_94515_e + 1));
047        }
048        else if (par1 == 1)
049        {
050            this.field_94513_g.add(new ChunkPosition(this.field_94517_c - 1, this.field_94514_d, this.field_94515_e));
051            this.field_94513_g.add(new ChunkPosition(this.field_94517_c + 1, this.field_94514_d, this.field_94515_e));
052        }
053        else if (par1 == 2)
054        {
055            this.field_94513_g.add(new ChunkPosition(this.field_94517_c - 1, this.field_94514_d, this.field_94515_e));
056            this.field_94513_g.add(new ChunkPosition(this.field_94517_c + 1, this.field_94514_d + 1, this.field_94515_e));
057        }
058        else if (par1 == 3)
059        {
060            this.field_94513_g.add(new ChunkPosition(this.field_94517_c - 1, this.field_94514_d + 1, this.field_94515_e));
061            this.field_94513_g.add(new ChunkPosition(this.field_94517_c + 1, this.field_94514_d, this.field_94515_e));
062        }
063        else if (par1 == 4)
064        {
065            this.field_94513_g.add(new ChunkPosition(this.field_94517_c, this.field_94514_d + 1, this.field_94515_e - 1));
066            this.field_94513_g.add(new ChunkPosition(this.field_94517_c, this.field_94514_d, this.field_94515_e + 1));
067        }
068        else if (par1 == 5)
069        {
070            this.field_94513_g.add(new ChunkPosition(this.field_94517_c, this.field_94514_d, this.field_94515_e - 1));
071            this.field_94513_g.add(new ChunkPosition(this.field_94517_c, this.field_94514_d + 1, this.field_94515_e + 1));
072        }
073        else if (par1 == 6)
074        {
075            this.field_94513_g.add(new ChunkPosition(this.field_94517_c + 1, this.field_94514_d, this.field_94515_e));
076            this.field_94513_g.add(new ChunkPosition(this.field_94517_c, this.field_94514_d, this.field_94515_e + 1));
077        }
078        else if (par1 == 7)
079        {
080            this.field_94513_g.add(new ChunkPosition(this.field_94517_c - 1, this.field_94514_d, this.field_94515_e));
081            this.field_94513_g.add(new ChunkPosition(this.field_94517_c, this.field_94514_d, this.field_94515_e + 1));
082        }
083        else if (par1 == 8)
084        {
085            this.field_94513_g.add(new ChunkPosition(this.field_94517_c - 1, this.field_94514_d, this.field_94515_e));
086            this.field_94513_g.add(new ChunkPosition(this.field_94517_c, this.field_94514_d, this.field_94515_e - 1));
087        }
088        else if (par1 == 9)
089        {
090            this.field_94513_g.add(new ChunkPosition(this.field_94517_c + 1, this.field_94514_d, this.field_94515_e));
091            this.field_94513_g.add(new ChunkPosition(this.field_94517_c, this.field_94514_d, this.field_94515_e - 1));
092        }
093    }
094
095    private void func_94509_b()
096    {
097        for (int i = 0; i < this.field_94513_g.size(); ++i)
098        {
099            BlockBaseRailLogic blockbaseraillogic = this.func_94501_a((ChunkPosition)this.field_94513_g.get(i));
100
101            if (blockbaseraillogic != null && blockbaseraillogic.func_94508_a(this))
102            {
103                this.field_94513_g.set(i, new ChunkPosition(blockbaseraillogic.field_94517_c, blockbaseraillogic.field_94514_d, blockbaseraillogic.field_94515_e));
104            }
105            else
106            {
107                this.field_94513_g.remove(i--);
108            }
109        }
110    }
111
112    private boolean func_94502_a(int par1, int par2, int par3)
113    {
114        return BlockRailBase.isRailBlockAt(this.field_94516_b, par1, par2, par3) ? true : (BlockRailBase.isRailBlockAt(this.field_94516_b, par1, par2 + 1, par3) ? true : BlockRailBase.isRailBlockAt(this.field_94516_b, par1, par2 - 1, par3));
115    }
116
117    private BlockBaseRailLogic func_94501_a(ChunkPosition par1ChunkPosition)
118    {
119        return BlockRailBase.isRailBlockAt(this.field_94516_b, par1ChunkPosition.x, par1ChunkPosition.y, par1ChunkPosition.z) ? new BlockBaseRailLogic(this.field_94518_a, this.field_94516_b, par1ChunkPosition.x, par1ChunkPosition.y, par1ChunkPosition.z) : (BlockRailBase.isRailBlockAt(this.field_94516_b, par1ChunkPosition.x, par1ChunkPosition.y + 1, par1ChunkPosition.z) ? new BlockBaseRailLogic(this.field_94518_a, this.field_94516_b, par1ChunkPosition.x, par1ChunkPosition.y + 1, par1ChunkPosition.z) : (BlockRailBase.isRailBlockAt(this.field_94516_b, par1ChunkPosition.x, par1ChunkPosition.y - 1, par1ChunkPosition.z) ? new BlockBaseRailLogic(this.field_94518_a, this.field_94516_b, par1ChunkPosition.x, par1ChunkPosition.y - 1, par1ChunkPosition.z) : null));
120    }
121
122    private boolean func_94508_a(BlockBaseRailLogic par1BlockBaseRailLogic)
123    {
124        for (int i = 0; i < this.field_94513_g.size(); ++i)
125        {
126            ChunkPosition chunkposition = (ChunkPosition)this.field_94513_g.get(i);
127
128            if (chunkposition.x == par1BlockBaseRailLogic.field_94517_c && chunkposition.z == par1BlockBaseRailLogic.field_94515_e)
129            {
130                return true;
131            }
132        }
133
134        return false;
135    }
136
137    private boolean func_94510_b(int par1, int par2, int par3)
138    {
139        for (int l = 0; l < this.field_94513_g.size(); ++l)
140        {
141            ChunkPosition chunkposition = (ChunkPosition)this.field_94513_g.get(l);
142
143            if (chunkposition.x == par1 && chunkposition.z == par3)
144            {
145                return true;
146            }
147        }
148
149        return false;
150    }
151
152    public int func_94505_a()
153    {
154        int i = 0;
155
156        if (this.func_94502_a(this.field_94517_c, this.field_94514_d, this.field_94515_e - 1))
157        {
158            ++i;
159        }
160
161        if (this.func_94502_a(this.field_94517_c, this.field_94514_d, this.field_94515_e + 1))
162        {
163            ++i;
164        }
165
166        if (this.func_94502_a(this.field_94517_c - 1, this.field_94514_d, this.field_94515_e))
167        {
168            ++i;
169        }
170
171        if (this.func_94502_a(this.field_94517_c + 1, this.field_94514_d, this.field_94515_e))
172        {
173            ++i;
174        }
175
176        return i;
177    }
178
179    private boolean func_94507_b(BlockBaseRailLogic par1BlockBaseRailLogic)
180    {
181        return this.func_94508_a(par1BlockBaseRailLogic) ? true : (this.field_94513_g.size() == 2 ? false : (this.field_94513_g.isEmpty() ? true : true));
182    }
183
184    private void func_94506_c(BlockBaseRailLogic par1BlockBaseRailLogic)
185    {
186        this.field_94513_g.add(new ChunkPosition(par1BlockBaseRailLogic.field_94517_c, par1BlockBaseRailLogic.field_94514_d, par1BlockBaseRailLogic.field_94515_e));
187        boolean flag = this.func_94510_b(this.field_94517_c, this.field_94514_d, this.field_94515_e - 1);
188        boolean flag1 = this.func_94510_b(this.field_94517_c, this.field_94514_d, this.field_94515_e + 1);
189        boolean flag2 = this.func_94510_b(this.field_94517_c - 1, this.field_94514_d, this.field_94515_e);
190        boolean flag3 = this.func_94510_b(this.field_94517_c + 1, this.field_94514_d, this.field_94515_e);
191        byte b0 = -1;
192
193        if (flag || flag1)
194        {
195            b0 = 0;
196        }
197
198        if (flag2 || flag3)
199        {
200            b0 = 1;
201        }
202
203        if (!this.field_94512_f)
204        {
205            if (flag1 && flag3 && !flag && !flag2)
206            {
207                b0 = 6;
208            }
209
210            if (flag1 && flag2 && !flag && !flag3)
211            {
212                b0 = 7;
213            }
214
215            if (flag && flag2 && !flag1 && !flag3)
216            {
217                b0 = 8;
218            }
219
220            if (flag && flag3 && !flag1 && !flag2)
221            {
222                b0 = 9;
223            }
224        }
225
226        if (b0 == 0 && canMakeSlopes)
227        {
228            if (BlockRailBase.isRailBlockAt(this.field_94516_b, this.field_94517_c, this.field_94514_d + 1, this.field_94515_e - 1))
229            {
230                b0 = 4;
231            }
232
233            if (BlockRailBase.isRailBlockAt(this.field_94516_b, this.field_94517_c, this.field_94514_d + 1, this.field_94515_e + 1))
234            {
235                b0 = 5;
236            }
237        }
238
239        if (b0 == 1 && canMakeSlopes)
240        {
241            if (BlockRailBase.isRailBlockAt(this.field_94516_b, this.field_94517_c + 1, this.field_94514_d + 1, this.field_94515_e))
242            {
243                b0 = 2;
244            }
245
246            if (BlockRailBase.isRailBlockAt(this.field_94516_b, this.field_94517_c - 1, this.field_94514_d + 1, this.field_94515_e))
247            {
248                b0 = 3;
249            }
250        }
251
252        if (b0 < 0)
253        {
254            b0 = 0;
255        }
256
257        int i = b0;
258
259        if (this.field_94512_f)
260        {
261            i = this.field_94516_b.getBlockMetadata(this.field_94517_c, this.field_94514_d, this.field_94515_e) & 8 | b0;
262        }
263
264        this.field_94516_b.setBlockMetadataWithNotify(this.field_94517_c, this.field_94514_d, this.field_94515_e, i, 3);
265    }
266
267    private boolean func_94503_c(int par1, int par2, int par3)
268    {
269        BlockBaseRailLogic blockbaseraillogic = this.func_94501_a(new ChunkPosition(par1, par2, par3));
270
271        if (blockbaseraillogic == null)
272        {
273            return false;
274        }
275        else
276        {
277            blockbaseraillogic.func_94509_b();
278            return blockbaseraillogic.func_94507_b(this);
279        }
280    }
281
282    public void func_94511_a(boolean par1, boolean par2)
283    {
284        boolean flag2 = this.func_94503_c(this.field_94517_c, this.field_94514_d, this.field_94515_e - 1);
285        boolean flag3 = this.func_94503_c(this.field_94517_c, this.field_94514_d, this.field_94515_e + 1);
286        boolean flag4 = this.func_94503_c(this.field_94517_c - 1, this.field_94514_d, this.field_94515_e);
287        boolean flag5 = this.func_94503_c(this.field_94517_c + 1, this.field_94514_d, this.field_94515_e);
288        byte b0 = -1;
289
290        if ((flag2 || flag3) && !flag4 && !flag5)
291        {
292            b0 = 0;
293        }
294
295        if ((flag4 || flag5) && !flag2 && !flag3)
296        {
297            b0 = 1;
298        }
299
300        if (!this.field_94512_f)
301        {
302            if (flag3 && flag5 && !flag2 && !flag4)
303            {
304                b0 = 6;
305            }
306
307            if (flag3 && flag4 && !flag2 && !flag5)
308            {
309                b0 = 7;
310            }
311
312            if (flag2 && flag4 && !flag3 && !flag5)
313            {
314                b0 = 8;
315            }
316
317            if (flag2 && flag5 && !flag3 && !flag4)
318            {
319                b0 = 9;
320            }
321        }
322
323        if (b0 == -1)
324        {
325            if (flag2 || flag3)
326            {
327                b0 = 0;
328            }
329
330            if (flag4 || flag5)
331            {
332                b0 = 1;
333            }
334
335            if (!this.field_94512_f)
336            {
337                if (par1)
338                {
339                    if (flag3 && flag5)
340                    {
341                        b0 = 6;
342                    }
343
344                    if (flag4 && flag3)
345                    {
346                        b0 = 7;
347                    }
348
349                    if (flag5 && flag2)
350                    {
351                        b0 = 9;
352                    }
353
354                    if (flag2 && flag4)
355                    {
356                        b0 = 8;
357                    }
358                }
359                else
360                {
361                    if (flag2 && flag4)
362                    {
363                        b0 = 8;
364                    }
365
366                    if (flag5 && flag2)
367                    {
368                        b0 = 9;
369                    }
370
371                    if (flag4 && flag3)
372                    {
373                        b0 = 7;
374                    }
375
376                    if (flag3 && flag5)
377                    {
378                        b0 = 6;
379                    }
380                }
381            }
382        }
383
384        if (b0 == 0 && canMakeSlopes)
385        {
386            if (BlockRailBase.isRailBlockAt(this.field_94516_b, this.field_94517_c, this.field_94514_d + 1, this.field_94515_e - 1))
387            {
388                b0 = 4;
389            }
390
391            if (BlockRailBase.isRailBlockAt(this.field_94516_b, this.field_94517_c, this.field_94514_d + 1, this.field_94515_e + 1))
392            {
393                b0 = 5;
394            }
395        }
396
397        if (b0 == 1 && canMakeSlopes)
398        {
399            if (BlockRailBase.isRailBlockAt(this.field_94516_b, this.field_94517_c + 1, this.field_94514_d + 1, this.field_94515_e))
400            {
401                b0 = 2;
402            }
403
404            if (BlockRailBase.isRailBlockAt(this.field_94516_b, this.field_94517_c - 1, this.field_94514_d + 1, this.field_94515_e))
405            {
406                b0 = 3;
407            }
408        }
409
410        if (b0 < 0)
411        {
412            b0 = 0;
413        }
414
415        this.func_94504_a(b0);
416        int i = b0;
417
418        if (this.field_94512_f)
419        {
420            i = this.field_94516_b.getBlockMetadata(this.field_94517_c, this.field_94514_d, this.field_94515_e) & 8 | b0;
421        }
422
423        if (par2 || this.field_94516_b.getBlockMetadata(this.field_94517_c, this.field_94514_d, this.field_94515_e) != i)
424        {
425            this.field_94516_b.setBlockMetadataWithNotify(this.field_94517_c, this.field_94514_d, this.field_94515_e, i, 3);
426
427            for (int j = 0; j < this.field_94513_g.size(); ++j)
428            {
429                BlockBaseRailLogic blockbaseraillogic = this.func_94501_a((ChunkPosition)this.field_94513_g.get(j));
430
431                if (blockbaseraillogic != null)
432                {
433                    blockbaseraillogic.func_94509_b();
434
435                    if (blockbaseraillogic.func_94507_b(this))
436                    {
437                        blockbaseraillogic.func_94506_c(this);
438                    }
439                }
440            }
441        }
442    }
443}