package net.minecraft.block; import java.util.ArrayList; import java.util.List; import net.minecraft.world.ChunkPosition; import net.minecraft.world.World; public class BlockBaseRailLogic { private World logicWorld; private int railX; private int railY; private int railZ; private final boolean isStraightRail; /** The chunk position the rail is at. */ private List railChunkPosition; private final boolean canMakeSlopes; final BlockRailBase theRail; public BlockBaseRailLogic(BlockRailBase par1, World par2, int par3, int par4, int par5) { this.theRail = par1; this.railChunkPosition = new ArrayList(); this.logicWorld = par2; this.railX = par3; this.railY = par4; this.railZ = par5; int l = par2.getBlockId(par3, par4, par5); BlockRailBase target = (BlockRailBase)Block.blocksList[l]; int i1 = target.getBasicRailMetadata(par2, null, par3, par4, par5); isStraightRail = !target.isFlexibleRail(par2, par3, par4, par5); canMakeSlopes = target.canMakeSlopes(par2, par3, par4, par5); this.setBasicRail(i1); } private void setBasicRail(int par1) { this.railChunkPosition.clear(); if (par1 == 0) { this.railChunkPosition.add(new ChunkPosition(this.railX, this.railY, this.railZ - 1)); this.railChunkPosition.add(new ChunkPosition(this.railX, this.railY, this.railZ + 1)); } else if (par1 == 1) { this.railChunkPosition.add(new ChunkPosition(this.railX - 1, this.railY, this.railZ)); this.railChunkPosition.add(new ChunkPosition(this.railX + 1, this.railY, this.railZ)); } else if (par1 == 2) { this.railChunkPosition.add(new ChunkPosition(this.railX - 1, this.railY, this.railZ)); this.railChunkPosition.add(new ChunkPosition(this.railX + 1, this.railY + 1, this.railZ)); } else if (par1 == 3) { this.railChunkPosition.add(new ChunkPosition(this.railX - 1, this.railY + 1, this.railZ)); this.railChunkPosition.add(new ChunkPosition(this.railX + 1, this.railY, this.railZ)); } else if (par1 == 4) { this.railChunkPosition.add(new ChunkPosition(this.railX, this.railY + 1, this.railZ - 1)); this.railChunkPosition.add(new ChunkPosition(this.railX, this.railY, this.railZ + 1)); } else if (par1 == 5) { this.railChunkPosition.add(new ChunkPosition(this.railX, this.railY, this.railZ - 1)); this.railChunkPosition.add(new ChunkPosition(this.railX, this.railY + 1, this.railZ + 1)); } else if (par1 == 6) { this.railChunkPosition.add(new ChunkPosition(this.railX + 1, this.railY, this.railZ)); this.railChunkPosition.add(new ChunkPosition(this.railX, this.railY, this.railZ + 1)); } else if (par1 == 7) { this.railChunkPosition.add(new ChunkPosition(this.railX - 1, this.railY, this.railZ)); this.railChunkPosition.add(new ChunkPosition(this.railX, this.railY, this.railZ + 1)); } else if (par1 == 8) { this.railChunkPosition.add(new ChunkPosition(this.railX - 1, this.railY, this.railZ)); this.railChunkPosition.add(new ChunkPosition(this.railX, this.railY, this.railZ - 1)); } else if (par1 == 9) { this.railChunkPosition.add(new ChunkPosition(this.railX + 1, this.railY, this.railZ)); this.railChunkPosition.add(new ChunkPosition(this.railX, this.railY, this.railZ - 1)); } } private void refreshConnectedTracks() { for (int i = 0; i < this.railChunkPosition.size(); ++i) { BlockBaseRailLogic blockbaseraillogic = this.getRailLogic((ChunkPosition)this.railChunkPosition.get(i)); if (blockbaseraillogic != null && blockbaseraillogic.isRailChunkPositionCorrect(this)) { this.railChunkPosition.set(i, new ChunkPosition(blockbaseraillogic.railX, blockbaseraillogic.railY, blockbaseraillogic.railZ)); } else { this.railChunkPosition.remove(i--); } } } private boolean isMinecartTrack(int par1, int par2, int par3) { return BlockRailBase.isRailBlockAt(this.logicWorld, par1, par2, par3) ? true : (BlockRailBase.isRailBlockAt(this.logicWorld, par1, par2 + 1, par3) ? true : BlockRailBase.isRailBlockAt(this.logicWorld, par1, par2 - 1, par3)); } private BlockBaseRailLogic getRailLogic(ChunkPosition par1ChunkPosition) { return BlockRailBase.isRailBlockAt(this.logicWorld, par1ChunkPosition.x, par1ChunkPosition.y, par1ChunkPosition.z) ? new BlockBaseRailLogic(this.theRail, this.logicWorld, par1ChunkPosition.x, par1ChunkPosition.y, par1ChunkPosition.z) : (BlockRailBase.isRailBlockAt(this.logicWorld, par1ChunkPosition.x, par1ChunkPosition.y + 1, par1ChunkPosition.z) ? new BlockBaseRailLogic(this.theRail, this.logicWorld, par1ChunkPosition.x, par1ChunkPosition.y + 1, par1ChunkPosition.z) : (BlockRailBase.isRailBlockAt(this.logicWorld, par1ChunkPosition.x, par1ChunkPosition.y - 1, par1ChunkPosition.z) ? new BlockBaseRailLogic(this.theRail, this.logicWorld, par1ChunkPosition.x, par1ChunkPosition.y - 1, par1ChunkPosition.z) : null)); } /** * Checks if the rail is at the chunk position it is expected to be. */ private boolean isRailChunkPositionCorrect(BlockBaseRailLogic par1BlockBaseRailLogic) { for (int i = 0; i < this.railChunkPosition.size(); ++i) { ChunkPosition chunkposition = (ChunkPosition)this.railChunkPosition.get(i); if (chunkposition.x == par1BlockBaseRailLogic.railX && chunkposition.z == par1BlockBaseRailLogic.railZ) { return true; } } return false; } private boolean isPartOfTrack(int par1, int par2, int par3) { for (int l = 0; l < this.railChunkPosition.size(); ++l) { ChunkPosition chunkposition = (ChunkPosition)this.railChunkPosition.get(l); if (chunkposition.x == par1 && chunkposition.z == par3) { return true; } } return false; } public int getNumberOfAdjacentTracks() { int i = 0; if (this.isMinecartTrack(this.railX, this.railY, this.railZ - 1)) { ++i; } if (this.isMinecartTrack(this.railX, this.railY, this.railZ + 1)) { ++i; } if (this.isMinecartTrack(this.railX - 1, this.railY, this.railZ)) { ++i; } if (this.isMinecartTrack(this.railX + 1, this.railY, this.railZ)) { ++i; } return i; } private boolean canConnectTo(BlockBaseRailLogic par1BlockBaseRailLogic) { return this.isRailChunkPositionCorrect(par1BlockBaseRailLogic) ? true : (this.railChunkPosition.size() == 2 ? false : (this.railChunkPosition.isEmpty() ? true : true)); } private void connectToNeighbor(BlockBaseRailLogic par1BlockBaseRailLogic) { this.railChunkPosition.add(new ChunkPosition(par1BlockBaseRailLogic.railX, par1BlockBaseRailLogic.railY, par1BlockBaseRailLogic.railZ)); boolean flag = this.isPartOfTrack(this.railX, this.railY, this.railZ - 1); boolean flag1 = this.isPartOfTrack(this.railX, this.railY, this.railZ + 1); boolean flag2 = this.isPartOfTrack(this.railX - 1, this.railY, this.railZ); boolean flag3 = this.isPartOfTrack(this.railX + 1, this.railY, this.railZ); byte b0 = -1; if (flag || flag1) { b0 = 0; } if (flag2 || flag3) { b0 = 1; } if (!this.isStraightRail) { if (flag1 && flag3 && !flag && !flag2) { b0 = 6; } if (flag1 && flag2 && !flag && !flag3) { b0 = 7; } if (flag && flag2 && !flag1 && !flag3) { b0 = 8; } if (flag && flag3 && !flag1 && !flag2) { b0 = 9; } } if (b0 == 0 && canMakeSlopes) { if (BlockRailBase.isRailBlockAt(this.logicWorld, this.railX, this.railY + 1, this.railZ - 1)) { b0 = 4; } if (BlockRailBase.isRailBlockAt(this.logicWorld, this.railX, this.railY + 1, this.railZ + 1)) { b0 = 5; } } if (b0 == 1 && canMakeSlopes) { if (BlockRailBase.isRailBlockAt(this.logicWorld, this.railX + 1, this.railY + 1, this.railZ)) { b0 = 2; } if (BlockRailBase.isRailBlockAt(this.logicWorld, this.railX - 1, this.railY + 1, this.railZ)) { b0 = 3; } } if (b0 < 0) { b0 = 0; } int i = b0; if (this.isStraightRail) { i = this.logicWorld.getBlockMetadata(this.railX, this.railY, this.railZ) & 8 | b0; } this.logicWorld.setBlockMetadataWithNotify(this.railX, this.railY, this.railZ, i, 3); } private boolean canConnectFrom(int par1, int par2, int par3) { BlockBaseRailLogic blockbaseraillogic = this.getRailLogic(new ChunkPosition(par1, par2, par3)); if (blockbaseraillogic == null) { return false; } else { blockbaseraillogic.refreshConnectedTracks(); return blockbaseraillogic.canConnectTo(this); } } public void func_94511_a(boolean par1, boolean par2) { boolean flag2 = this.canConnectFrom(this.railX, this.railY, this.railZ - 1); boolean flag3 = this.canConnectFrom(this.railX, this.railY, this.railZ + 1); boolean flag4 = this.canConnectFrom(this.railX - 1, this.railY, this.railZ); boolean flag5 = this.canConnectFrom(this.railX + 1, this.railY, this.railZ); byte b0 = -1; if ((flag2 || flag3) && !flag4 && !flag5) { b0 = 0; } if ((flag4 || flag5) && !flag2 && !flag3) { b0 = 1; } if (!this.isStraightRail) { if (flag3 && flag5 && !flag2 && !flag4) { b0 = 6; } if (flag3 && flag4 && !flag2 && !flag5) { b0 = 7; } if (flag2 && flag4 && !flag3 && !flag5) { b0 = 8; } if (flag2 && flag5 && !flag3 && !flag4) { b0 = 9; } } if (b0 == -1) { if (flag2 || flag3) { b0 = 0; } if (flag4 || flag5) { b0 = 1; } if (!this.isStraightRail) { if (par1) { if (flag3 && flag5) { b0 = 6; } if (flag4 && flag3) { b0 = 7; } if (flag5 && flag2) { b0 = 9; } if (flag2 && flag4) { b0 = 8; } } else { if (flag2 && flag4) { b0 = 8; } if (flag5 && flag2) { b0 = 9; } if (flag4 && flag3) { b0 = 7; } if (flag3 && flag5) { b0 = 6; } } } } if (b0 == 0 && canMakeSlopes) { if (BlockRailBase.isRailBlockAt(this.logicWorld, this.railX, this.railY + 1, this.railZ - 1)) { b0 = 4; } if (BlockRailBase.isRailBlockAt(this.logicWorld, this.railX, this.railY + 1, this.railZ + 1)) { b0 = 5; } } if (b0 == 1 && canMakeSlopes) { if (BlockRailBase.isRailBlockAt(this.logicWorld, this.railX + 1, this.railY + 1, this.railZ)) { b0 = 2; } if (BlockRailBase.isRailBlockAt(this.logicWorld, this.railX - 1, this.railY + 1, this.railZ)) { b0 = 3; } } if (b0 < 0) { b0 = 0; } this.setBasicRail(b0); int i = b0; if (this.isStraightRail) { i = this.logicWorld.getBlockMetadata(this.railX, this.railY, this.railZ) & 8 | b0; } if (par2 || this.logicWorld.getBlockMetadata(this.railX, this.railY, this.railZ) != i) { this.logicWorld.setBlockMetadataWithNotify(this.railX, this.railY, this.railZ, i, 3); for (int j = 0; j < this.railChunkPosition.size(); ++j) { BlockBaseRailLogic blockbaseraillogic = this.getRailLogic((ChunkPosition)this.railChunkPosition.get(j)); if (blockbaseraillogic != null) { blockbaseraillogic.refreshConnectedTracks(); if (blockbaseraillogic.canConnectTo(this)) { blockbaseraillogic.connectToNeighbor(this); } } } } } }