Newer
Older
void-pack-super-server / work / decompile-ee3ecae0 / net / minecraft / server / MinecartTrackLogic.java
package net.minecraft.server;

import com.google.common.collect.Lists;
import java.util.Iterator;
import java.util.List;
import javax.annotation.Nullable;

public class MinecartTrackLogic {

    private final World a;
    private final BlockPosition b;
    private final BlockMinecartTrackAbstract c;
    private IBlockData d;
    private final boolean e;
    private final List<BlockPosition> f = Lists.newArrayList();

    public MinecartTrackLogic(World world, BlockPosition blockposition, IBlockData iblockdata) {
        this.a = world;
        this.b = blockposition;
        this.d = iblockdata;
        this.c = (BlockMinecartTrackAbstract) iblockdata.getBlock();
        BlockPropertyTrackPosition blockpropertytrackposition = (BlockPropertyTrackPosition) iblockdata.get(this.c.d());

        this.e = this.c.c();
        this.a(blockpropertytrackposition);
    }

    public List<BlockPosition> a() {
        return this.f;
    }

    private void a(BlockPropertyTrackPosition blockpropertytrackposition) {
        this.f.clear();
        switch (blockpropertytrackposition) {
            case NORTH_SOUTH:
                this.f.add(this.b.north());
                this.f.add(this.b.south());
                break;
            case EAST_WEST:
                this.f.add(this.b.west());
                this.f.add(this.b.east());
                break;
            case ASCENDING_EAST:
                this.f.add(this.b.west());
                this.f.add(this.b.east().up());
                break;
            case ASCENDING_WEST:
                this.f.add(this.b.west().up());
                this.f.add(this.b.east());
                break;
            case ASCENDING_NORTH:
                this.f.add(this.b.north().up());
                this.f.add(this.b.south());
                break;
            case ASCENDING_SOUTH:
                this.f.add(this.b.north());
                this.f.add(this.b.south().up());
                break;
            case SOUTH_EAST:
                this.f.add(this.b.east());
                this.f.add(this.b.south());
                break;
            case SOUTH_WEST:
                this.f.add(this.b.west());
                this.f.add(this.b.south());
                break;
            case NORTH_WEST:
                this.f.add(this.b.west());
                this.f.add(this.b.north());
                break;
            case NORTH_EAST:
                this.f.add(this.b.east());
                this.f.add(this.b.north());
        }

    }

    private void d() {
        for (int i = 0; i < this.f.size(); ++i) {
            MinecartTrackLogic minecarttracklogic = this.b((BlockPosition) this.f.get(i));

            if (minecarttracklogic != null && minecarttracklogic.a(this)) {
                this.f.set(i, minecarttracklogic.b);
            } else {
                this.f.remove(i--);
            }
        }

    }

    private boolean a(BlockPosition blockposition) {
        return BlockMinecartTrackAbstract.a(this.a, blockposition) || BlockMinecartTrackAbstract.a(this.a, blockposition.up()) || BlockMinecartTrackAbstract.a(this.a, blockposition.down());
    }

    @Nullable
    private MinecartTrackLogic b(BlockPosition blockposition) {
        IBlockData iblockdata = this.a.getType(blockposition);

        if (BlockMinecartTrackAbstract.h(iblockdata)) {
            return new MinecartTrackLogic(this.a, blockposition, iblockdata);
        } else {
            BlockPosition blockposition1 = blockposition.up();

            iblockdata = this.a.getType(blockposition1);
            if (BlockMinecartTrackAbstract.h(iblockdata)) {
                return new MinecartTrackLogic(this.a, blockposition1, iblockdata);
            } else {
                blockposition1 = blockposition.down();
                iblockdata = this.a.getType(blockposition1);
                return BlockMinecartTrackAbstract.h(iblockdata) ? new MinecartTrackLogic(this.a, blockposition1, iblockdata) : null;
            }
        }
    }

    private boolean a(MinecartTrackLogic minecarttracklogic) {
        return this.c(minecarttracklogic.b);
    }

    private boolean c(BlockPosition blockposition) {
        for (int i = 0; i < this.f.size(); ++i) {
            BlockPosition blockposition1 = (BlockPosition) this.f.get(i);

            if (blockposition1.getX() == blockposition.getX() && blockposition1.getZ() == blockposition.getZ()) {
                return true;
            }
        }

        return false;
    }

    protected int b() {
        int i = 0;
        Iterator iterator = EnumDirection.EnumDirectionLimit.HORIZONTAL.iterator();

        while (iterator.hasNext()) {
            EnumDirection enumdirection = (EnumDirection) iterator.next();

            if (this.a(this.b.shift(enumdirection))) {
                ++i;
            }
        }

        return i;
    }

    private boolean b(MinecartTrackLogic minecarttracklogic) {
        return this.a(minecarttracklogic) || this.f.size() != 2;
    }

    private void c(MinecartTrackLogic minecarttracklogic) {
        this.f.add(minecarttracklogic.b);
        BlockPosition blockposition = this.b.north();
        BlockPosition blockposition1 = this.b.south();
        BlockPosition blockposition2 = this.b.west();
        BlockPosition blockposition3 = this.b.east();
        boolean flag = this.c(blockposition);
        boolean flag1 = this.c(blockposition1);
        boolean flag2 = this.c(blockposition2);
        boolean flag3 = this.c(blockposition3);
        BlockPropertyTrackPosition blockpropertytrackposition = null;

        if (flag || flag1) {
            blockpropertytrackposition = BlockPropertyTrackPosition.NORTH_SOUTH;
        }

        if (flag2 || flag3) {
            blockpropertytrackposition = BlockPropertyTrackPosition.EAST_WEST;
        }

        if (!this.e) {
            if (flag1 && flag3 && !flag && !flag2) {
                blockpropertytrackposition = BlockPropertyTrackPosition.SOUTH_EAST;
            }

            if (flag1 && flag2 && !flag && !flag3) {
                blockpropertytrackposition = BlockPropertyTrackPosition.SOUTH_WEST;
            }

            if (flag && flag2 && !flag1 && !flag3) {
                blockpropertytrackposition = BlockPropertyTrackPosition.NORTH_WEST;
            }

            if (flag && flag3 && !flag1 && !flag2) {
                blockpropertytrackposition = BlockPropertyTrackPosition.NORTH_EAST;
            }
        }

        if (blockpropertytrackposition == BlockPropertyTrackPosition.NORTH_SOUTH) {
            if (BlockMinecartTrackAbstract.a(this.a, blockposition.up())) {
                blockpropertytrackposition = BlockPropertyTrackPosition.ASCENDING_NORTH;
            }

            if (BlockMinecartTrackAbstract.a(this.a, blockposition1.up())) {
                blockpropertytrackposition = BlockPropertyTrackPosition.ASCENDING_SOUTH;
            }
        }

        if (blockpropertytrackposition == BlockPropertyTrackPosition.EAST_WEST) {
            if (BlockMinecartTrackAbstract.a(this.a, blockposition3.up())) {
                blockpropertytrackposition = BlockPropertyTrackPosition.ASCENDING_EAST;
            }

            if (BlockMinecartTrackAbstract.a(this.a, blockposition2.up())) {
                blockpropertytrackposition = BlockPropertyTrackPosition.ASCENDING_WEST;
            }
        }

        if (blockpropertytrackposition == null) {
            blockpropertytrackposition = BlockPropertyTrackPosition.NORTH_SOUTH;
        }

        this.d = (IBlockData) this.d.set(this.c.d(), blockpropertytrackposition);
        this.a.setTypeAndData(this.b, this.d, 3);
    }

    private boolean d(BlockPosition blockposition) {
        MinecartTrackLogic minecarttracklogic = this.b(blockposition);

        if (minecarttracklogic == null) {
            return false;
        } else {
            minecarttracklogic.d();
            return minecarttracklogic.b(this);
        }
    }

    public MinecartTrackLogic a(boolean flag, boolean flag1, BlockPropertyTrackPosition blockpropertytrackposition) {
        BlockPosition blockposition = this.b.north();
        BlockPosition blockposition1 = this.b.south();
        BlockPosition blockposition2 = this.b.west();
        BlockPosition blockposition3 = this.b.east();
        boolean flag2 = this.d(blockposition);
        boolean flag3 = this.d(blockposition1);
        boolean flag4 = this.d(blockposition2);
        boolean flag5 = this.d(blockposition3);
        BlockPropertyTrackPosition blockpropertytrackposition1 = null;
        boolean flag6 = flag2 || flag3;
        boolean flag7 = flag4 || flag5;

        if (flag6 && !flag7) {
            blockpropertytrackposition1 = BlockPropertyTrackPosition.NORTH_SOUTH;
        }

        if (flag7 && !flag6) {
            blockpropertytrackposition1 = BlockPropertyTrackPosition.EAST_WEST;
        }

        boolean flag8 = flag3 && flag5;
        boolean flag9 = flag3 && flag4;
        boolean flag10 = flag2 && flag5;
        boolean flag11 = flag2 && flag4;

        if (!this.e) {
            if (flag8 && !flag2 && !flag4) {
                blockpropertytrackposition1 = BlockPropertyTrackPosition.SOUTH_EAST;
            }

            if (flag9 && !flag2 && !flag5) {
                blockpropertytrackposition1 = BlockPropertyTrackPosition.SOUTH_WEST;
            }

            if (flag11 && !flag3 && !flag5) {
                blockpropertytrackposition1 = BlockPropertyTrackPosition.NORTH_WEST;
            }

            if (flag10 && !flag3 && !flag4) {
                blockpropertytrackposition1 = BlockPropertyTrackPosition.NORTH_EAST;
            }
        }

        if (blockpropertytrackposition1 == null) {
            if (flag6 && flag7) {
                blockpropertytrackposition1 = blockpropertytrackposition;
            } else if (flag6) {
                blockpropertytrackposition1 = BlockPropertyTrackPosition.NORTH_SOUTH;
            } else if (flag7) {
                blockpropertytrackposition1 = BlockPropertyTrackPosition.EAST_WEST;
            }

            if (!this.e) {
                if (flag) {
                    if (flag8) {
                        blockpropertytrackposition1 = BlockPropertyTrackPosition.SOUTH_EAST;
                    }

                    if (flag9) {
                        blockpropertytrackposition1 = BlockPropertyTrackPosition.SOUTH_WEST;
                    }

                    if (flag10) {
                        blockpropertytrackposition1 = BlockPropertyTrackPosition.NORTH_EAST;
                    }

                    if (flag11) {
                        blockpropertytrackposition1 = BlockPropertyTrackPosition.NORTH_WEST;
                    }
                } else {
                    if (flag11) {
                        blockpropertytrackposition1 = BlockPropertyTrackPosition.NORTH_WEST;
                    }

                    if (flag10) {
                        blockpropertytrackposition1 = BlockPropertyTrackPosition.NORTH_EAST;
                    }

                    if (flag9) {
                        blockpropertytrackposition1 = BlockPropertyTrackPosition.SOUTH_WEST;
                    }

                    if (flag8) {
                        blockpropertytrackposition1 = BlockPropertyTrackPosition.SOUTH_EAST;
                    }
                }
            }
        }

        if (blockpropertytrackposition1 == BlockPropertyTrackPosition.NORTH_SOUTH) {
            if (BlockMinecartTrackAbstract.a(this.a, blockposition.up())) {
                blockpropertytrackposition1 = BlockPropertyTrackPosition.ASCENDING_NORTH;
            }

            if (BlockMinecartTrackAbstract.a(this.a, blockposition1.up())) {
                blockpropertytrackposition1 = BlockPropertyTrackPosition.ASCENDING_SOUTH;
            }
        }

        if (blockpropertytrackposition1 == BlockPropertyTrackPosition.EAST_WEST) {
            if (BlockMinecartTrackAbstract.a(this.a, blockposition3.up())) {
                blockpropertytrackposition1 = BlockPropertyTrackPosition.ASCENDING_EAST;
            }

            if (BlockMinecartTrackAbstract.a(this.a, blockposition2.up())) {
                blockpropertytrackposition1 = BlockPropertyTrackPosition.ASCENDING_WEST;
            }
        }

        if (blockpropertytrackposition1 == null) {
            blockpropertytrackposition1 = blockpropertytrackposition;
        }

        this.a(blockpropertytrackposition1);
        this.d = (IBlockData) this.d.set(this.c.d(), blockpropertytrackposition1);
        if (flag1 || this.a.getType(this.b) != this.d) {
            this.a.setTypeAndData(this.b, this.d, 3);

            for (int i = 0; i < this.f.size(); ++i) {
                MinecartTrackLogic minecarttracklogic = this.b((BlockPosition) this.f.get(i));

                if (minecarttracklogic != null) {
                    minecarttracklogic.d();
                    if (minecarttracklogic.b(this)) {
                        minecarttracklogic.c(this);
                    }
                }
            }
        }

        return this;
    }

    public IBlockData c() {
        return this.d;
    }
}