package net.minecraft.block; import com.google.common.collect.Lists; import java.util.Iterator; import java.util.List; import net.minecraft.block.material.Material; import net.minecraft.block.properties.IProperty; import net.minecraft.block.state.IBlockState; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.init.Blocks; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.BlockPos; import net.minecraft.util.EnumFacing; import net.minecraft.util.IStringSerializable; import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.Vec3; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; public abstract class BlockRailBase extends Block { protected final boolean isPowered; private static final String __OBFID = "CL_00000195"; public static boolean func_176562_d(World worldIn, BlockPos p_176562_1_) { return func_176563_d(worldIn.getBlockState(p_176562_1_)); } public static boolean func_176563_d(IBlockState p_176563_0_) { Block var1 = p_176563_0_.getBlock(); return var1 == Blocks.rail || var1 == Blocks.golden_rail || var1 == Blocks.detector_rail || var1 == Blocks.activator_rail; } protected BlockRailBase(boolean p_i45389_1_) { super(Material.circuits); this.isPowered = p_i45389_1_; this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.125F, 1.0F); this.setCreativeTab(CreativeTabs.tabTransport); } public AxisAlignedBB getCollisionBoundingBox(World worldIn, BlockPos pos, IBlockState state) { return null; } public boolean isOpaqueCube() { return false; } /** * Ray traces through the blocks collision from start vector to end vector returning a ray trace hit. * * @param start The start vector * @param end The end vector */ public MovingObjectPosition collisionRayTrace(World worldIn, BlockPos pos, Vec3 start, Vec3 end) { this.setBlockBoundsBasedOnState(worldIn, pos); return super.collisionRayTrace(worldIn, pos, start, end); } public void setBlockBoundsBasedOnState(IBlockAccess access, BlockPos pos) { IBlockState var3 = access.getBlockState(pos); BlockRailBase.EnumRailDirection var4 = var3.getBlock() == this ? (BlockRailBase.EnumRailDirection)var3.getValue(this.func_176560_l()) : null; if (var4 != null && var4.func_177018_c()) { this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.625F, 1.0F); } else { this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.125F, 1.0F); } } public boolean isFullCube() { return false; } public boolean canPlaceBlockAt(World worldIn, BlockPos pos) { return World.doesBlockHaveSolidTopSurface(worldIn, pos.offsetDown()); } public void onBlockAdded(World worldIn, BlockPos pos, IBlockState state) { if (!worldIn.isRemote) { state = this.func_176564_a(worldIn, pos, state, true); if (this.isPowered) { this.onNeighborBlockChange(worldIn, pos, state, this); } } } public void onNeighborBlockChange(World worldIn, BlockPos pos, IBlockState state, Block neighborBlock) { if (!worldIn.isRemote) { BlockRailBase.EnumRailDirection var5 = (BlockRailBase.EnumRailDirection)state.getValue(this.func_176560_l()); boolean var6 = false; if (!World.doesBlockHaveSolidTopSurface(worldIn, pos.offsetDown())) { var6 = true; } if (var5 == BlockRailBase.EnumRailDirection.ASCENDING_EAST && !World.doesBlockHaveSolidTopSurface(worldIn, pos.offsetEast())) { var6 = true; } else if (var5 == BlockRailBase.EnumRailDirection.ASCENDING_WEST && !World.doesBlockHaveSolidTopSurface(worldIn, pos.offsetWest())) { var6 = true; } else if (var5 == BlockRailBase.EnumRailDirection.ASCENDING_NORTH && !World.doesBlockHaveSolidTopSurface(worldIn, pos.offsetNorth())) { var6 = true; } else if (var5 == BlockRailBase.EnumRailDirection.ASCENDING_SOUTH && !World.doesBlockHaveSolidTopSurface(worldIn, pos.offsetSouth())) { var6 = true; } if (var6) { this.dropBlockAsItem(worldIn, pos, state, 0); worldIn.setBlockToAir(pos); } else { this.func_176561_b(worldIn, pos, state, neighborBlock); } } } protected void func_176561_b(World worldIn, BlockPos p_176561_2_, IBlockState p_176561_3_, Block p_176561_4_) {} protected IBlockState func_176564_a(World worldIn, BlockPos p_176564_2_, IBlockState p_176564_3_, boolean p_176564_4_) { return worldIn.isRemote ? p_176564_3_ : (new BlockRailBase.Rail(worldIn, p_176564_2_, p_176564_3_)).func_180364_a(worldIn.isBlockPowered(p_176564_2_), p_176564_4_).func_180362_b(); } public int getMobilityFlag() { return 0; } public void breakBlock(World worldIn, BlockPos pos, IBlockState state) { super.breakBlock(worldIn, pos, state); if (((BlockRailBase.EnumRailDirection)state.getValue(this.func_176560_l())).func_177018_c()) { worldIn.notifyNeighborsOfStateChange(pos.offsetUp(), this); } if (this.isPowered) { worldIn.notifyNeighborsOfStateChange(pos, this); worldIn.notifyNeighborsOfStateChange(pos.offsetDown(), this); } } public abstract IProperty func_176560_l(); public static enum EnumRailDirection implements IStringSerializable { NORTH_SOUTH("NORTH_SOUTH", 0, 0, "north_south"), EAST_WEST("EAST_WEST", 1, 1, "east_west"), ASCENDING_EAST("ASCENDING_EAST", 2, 2, "ascending_east"), ASCENDING_WEST("ASCENDING_WEST", 3, 3, "ascending_west"), ASCENDING_NORTH("ASCENDING_NORTH", 4, 4, "ascending_north"), ASCENDING_SOUTH("ASCENDING_SOUTH", 5, 5, "ascending_south"), SOUTH_EAST("SOUTH_EAST", 6, 6, "south_east"), SOUTH_WEST("SOUTH_WEST", 7, 7, "south_west"), NORTH_WEST("NORTH_WEST", 8, 8, "north_west"), NORTH_EAST("NORTH_EAST", 9, 9, "north_east"); private static final BlockRailBase.EnumRailDirection[] field_177030_k = new BlockRailBase.EnumRailDirection[values().length]; private final int field_177027_l; private final String field_177028_m; private static final BlockRailBase.EnumRailDirection[] $VALUES = new BlockRailBase.EnumRailDirection[]{NORTH_SOUTH, EAST_WEST, ASCENDING_EAST, ASCENDING_WEST, ASCENDING_NORTH, ASCENDING_SOUTH, SOUTH_EAST, SOUTH_WEST, NORTH_WEST, NORTH_EAST}; private static final String __OBFID = "CL_00002137"; private EnumRailDirection(String p_i45738_1_, int p_i45738_2_, int p_i45738_3_, String p_i45738_4_) { this.field_177027_l = p_i45738_3_; this.field_177028_m = p_i45738_4_; } public int func_177015_a() { return this.field_177027_l; } public String toString() { return this.field_177028_m; } public boolean func_177018_c() { return this == ASCENDING_NORTH || this == ASCENDING_EAST || this == ASCENDING_SOUTH || this == ASCENDING_WEST; } public static BlockRailBase.EnumRailDirection func_177016_a(int p_177016_0_) { if (p_177016_0_ < 0 || p_177016_0_ >= field_177030_k.length) { p_177016_0_ = 0; } return field_177030_k[p_177016_0_]; } public String getName() { return this.field_177028_m; } static { BlockRailBase.EnumRailDirection[] var0 = values(); int var1 = var0.length; for (int var2 = 0; var2 < var1; ++var2) { BlockRailBase.EnumRailDirection var3 = var0[var2]; field_177030_k[var3.func_177015_a()] = var3; } } } public class Rail { private final World field_150660_b; private final BlockPos field_180367_c; private final BlockRailBase field_180365_d; private IBlockState field_180366_e; private final boolean field_150656_f; private final List field_150657_g = Lists.newArrayList(); private static final String __OBFID = "CL_00000196"; public Rail(World worldIn, BlockPos p_i45739_3_, IBlockState p_i45739_4_) { this.field_150660_b = worldIn; this.field_180367_c = p_i45739_3_; this.field_180366_e = p_i45739_4_; this.field_180365_d = (BlockRailBase)p_i45739_4_.getBlock(); BlockRailBase.EnumRailDirection var5 = (BlockRailBase.EnumRailDirection)p_i45739_4_.getValue(BlockRailBase.this.func_176560_l()); this.field_150656_f = this.field_180365_d.isPowered; this.func_180360_a(var5); } private void func_180360_a(BlockRailBase.EnumRailDirection p_180360_1_) { this.field_150657_g.clear(); switch (BlockRailBase.SwitchEnumRailDirection.field_180371_a[p_180360_1_.ordinal()]) { case 1: this.field_150657_g.add(this.field_180367_c.offsetNorth()); this.field_150657_g.add(this.field_180367_c.offsetSouth()); break; case 2: this.field_150657_g.add(this.field_180367_c.offsetWest()); this.field_150657_g.add(this.field_180367_c.offsetEast()); break; case 3: this.field_150657_g.add(this.field_180367_c.offsetWest()); this.field_150657_g.add(this.field_180367_c.offsetEast().offsetUp()); break; case 4: this.field_150657_g.add(this.field_180367_c.offsetWest().offsetUp()); this.field_150657_g.add(this.field_180367_c.offsetEast()); break; case 5: this.field_150657_g.add(this.field_180367_c.offsetNorth().offsetUp()); this.field_150657_g.add(this.field_180367_c.offsetSouth()); break; case 6: this.field_150657_g.add(this.field_180367_c.offsetNorth()); this.field_150657_g.add(this.field_180367_c.offsetSouth().offsetUp()); break; case 7: this.field_150657_g.add(this.field_180367_c.offsetEast()); this.field_150657_g.add(this.field_180367_c.offsetSouth()); break; case 8: this.field_150657_g.add(this.field_180367_c.offsetWest()); this.field_150657_g.add(this.field_180367_c.offsetSouth()); break; case 9: this.field_150657_g.add(this.field_180367_c.offsetWest()); this.field_150657_g.add(this.field_180367_c.offsetNorth()); break; case 10: this.field_150657_g.add(this.field_180367_c.offsetEast()); this.field_150657_g.add(this.field_180367_c.offsetNorth()); } } private void func_150651_b() { for (int var1 = 0; var1 < this.field_150657_g.size(); ++var1) { BlockRailBase.Rail var2 = this.func_180697_b((BlockPos)this.field_150657_g.get(var1)); if (var2 != null && var2.func_150653_a(this)) { this.field_150657_g.set(var1, var2.field_180367_c); } else { this.field_150657_g.remove(var1--); } } } private boolean func_180359_a(BlockPos p_180359_1_) { return BlockRailBase.func_176562_d(this.field_150660_b, p_180359_1_) || BlockRailBase.func_176562_d(this.field_150660_b, p_180359_1_.offsetUp()) || BlockRailBase.func_176562_d(this.field_150660_b, p_180359_1_.offsetDown()); } private BlockRailBase.Rail func_180697_b(BlockPos p_180697_1_) { IBlockState var3 = this.field_150660_b.getBlockState(p_180697_1_); if (BlockRailBase.func_176563_d(var3)) { return BlockRailBase.this.new Rail(this.field_150660_b, p_180697_1_, var3); } else { BlockPos var2 = p_180697_1_.offsetUp(); var3 = this.field_150660_b.getBlockState(var2); if (BlockRailBase.func_176563_d(var3)) { return BlockRailBase.this.new Rail(this.field_150660_b, var2, var3); } else { var2 = p_180697_1_.offsetDown(); var3 = this.field_150660_b.getBlockState(var2); return BlockRailBase.func_176563_d(var3) ? BlockRailBase.this.new Rail(this.field_150660_b, var2, var3) : null; } } } private boolean func_150653_a(BlockRailBase.Rail p_150653_1_) { return this.func_180363_c(p_150653_1_.field_180367_c); } private boolean func_180363_c(BlockPos p_180363_1_) { for (int var2 = 0; var2 < this.field_150657_g.size(); ++var2) { BlockPos var3 = (BlockPos)this.field_150657_g.get(var2); if (var3.getX() == p_180363_1_.getX() && var3.getZ() == p_180363_1_.getZ()) { return true; } } return false; } protected int countAdjacentRails() { int var1 = 0; Iterator var2 = EnumFacing.Plane.HORIZONTAL.iterator(); while (var2.hasNext()) { EnumFacing var3 = (EnumFacing)var2.next(); if (this.func_180359_a(this.field_180367_c.offset(var3))) { ++var1; } } return var1; } private boolean func_150649_b(BlockRailBase.Rail p_150649_1_) { return this.func_150653_a(p_150649_1_) || this.field_150657_g.size() != 2; } private void func_150645_c(BlockRailBase.Rail p_150645_1_) { this.field_150657_g.add(p_150645_1_.field_180367_c); BlockPos var2 = this.field_180367_c.offsetNorth(); BlockPos var3 = this.field_180367_c.offsetSouth(); BlockPos var4 = this.field_180367_c.offsetWest(); BlockPos var5 = this.field_180367_c.offsetEast(); boolean var6 = this.func_180363_c(var2); boolean var7 = this.func_180363_c(var3); boolean var8 = this.func_180363_c(var4); boolean var9 = this.func_180363_c(var5); BlockRailBase.EnumRailDirection var10 = null; if (var6 || var7) { var10 = BlockRailBase.EnumRailDirection.NORTH_SOUTH; } if (var8 || var9) { var10 = BlockRailBase.EnumRailDirection.EAST_WEST; } if (!this.field_150656_f) { if (var7 && var9 && !var6 && !var8) { var10 = BlockRailBase.EnumRailDirection.SOUTH_EAST; } if (var7 && var8 && !var6 && !var9) { var10 = BlockRailBase.EnumRailDirection.SOUTH_WEST; } if (var6 && var8 && !var7 && !var9) { var10 = BlockRailBase.EnumRailDirection.NORTH_WEST; } if (var6 && var9 && !var7 && !var8) { var10 = BlockRailBase.EnumRailDirection.NORTH_EAST; } } if (var10 == BlockRailBase.EnumRailDirection.NORTH_SOUTH) { if (BlockRailBase.func_176562_d(this.field_150660_b, var2.offsetUp())) { var10 = BlockRailBase.EnumRailDirection.ASCENDING_NORTH; } if (BlockRailBase.func_176562_d(this.field_150660_b, var3.offsetUp())) { var10 = BlockRailBase.EnumRailDirection.ASCENDING_SOUTH; } } if (var10 == BlockRailBase.EnumRailDirection.EAST_WEST) { if (BlockRailBase.func_176562_d(this.field_150660_b, var5.offsetUp())) { var10 = BlockRailBase.EnumRailDirection.ASCENDING_EAST; } if (BlockRailBase.func_176562_d(this.field_150660_b, var4.offsetUp())) { var10 = BlockRailBase.EnumRailDirection.ASCENDING_WEST; } } if (var10 == null) { var10 = BlockRailBase.EnumRailDirection.NORTH_SOUTH; } this.field_180366_e = this.field_180366_e.withProperty(this.field_180365_d.func_176560_l(), var10); this.field_150660_b.setBlockState(this.field_180367_c, this.field_180366_e, 3); } private boolean func_180361_d(BlockPos p_180361_1_) { BlockRailBase.Rail var2 = this.func_180697_b(p_180361_1_); if (var2 == null) { return false; } else { var2.func_150651_b(); return var2.func_150649_b(this); } } public BlockRailBase.Rail func_180364_a(boolean p_180364_1_, boolean p_180364_2_) { BlockPos var3 = this.field_180367_c.offsetNorth(); BlockPos var4 = this.field_180367_c.offsetSouth(); BlockPos var5 = this.field_180367_c.offsetWest(); BlockPos var6 = this.field_180367_c.offsetEast(); boolean var7 = this.func_180361_d(var3); boolean var8 = this.func_180361_d(var4); boolean var9 = this.func_180361_d(var5); boolean var10 = this.func_180361_d(var6); BlockRailBase.EnumRailDirection var11 = null; if ((var7 || var8) && !var9 && !var10) { var11 = BlockRailBase.EnumRailDirection.NORTH_SOUTH; } if ((var9 || var10) && !var7 && !var8) { var11 = BlockRailBase.EnumRailDirection.EAST_WEST; } if (!this.field_150656_f) { if (var8 && var10 && !var7 && !var9) { var11 = BlockRailBase.EnumRailDirection.SOUTH_EAST; } if (var8 && var9 && !var7 && !var10) { var11 = BlockRailBase.EnumRailDirection.SOUTH_WEST; } if (var7 && var9 && !var8 && !var10) { var11 = BlockRailBase.EnumRailDirection.NORTH_WEST; } if (var7 && var10 && !var8 && !var9) { var11 = BlockRailBase.EnumRailDirection.NORTH_EAST; } } if (var11 == null) { if (var7 || var8) { var11 = BlockRailBase.EnumRailDirection.NORTH_SOUTH; } if (var9 || var10) { var11 = BlockRailBase.EnumRailDirection.EAST_WEST; } if (!this.field_150656_f) { if (p_180364_1_) { if (var8 && var10) { var11 = BlockRailBase.EnumRailDirection.SOUTH_EAST; } if (var9 && var8) { var11 = BlockRailBase.EnumRailDirection.SOUTH_WEST; } if (var10 && var7) { var11 = BlockRailBase.EnumRailDirection.NORTH_EAST; } if (var7 && var9) { var11 = BlockRailBase.EnumRailDirection.NORTH_WEST; } } else { if (var7 && var9) { var11 = BlockRailBase.EnumRailDirection.NORTH_WEST; } if (var10 && var7) { var11 = BlockRailBase.EnumRailDirection.NORTH_EAST; } if (var9 && var8) { var11 = BlockRailBase.EnumRailDirection.SOUTH_WEST; } if (var8 && var10) { var11 = BlockRailBase.EnumRailDirection.SOUTH_EAST; } } } } if (var11 == BlockRailBase.EnumRailDirection.NORTH_SOUTH) { if (BlockRailBase.func_176562_d(this.field_150660_b, var3.offsetUp())) { var11 = BlockRailBase.EnumRailDirection.ASCENDING_NORTH; } if (BlockRailBase.func_176562_d(this.field_150660_b, var4.offsetUp())) { var11 = BlockRailBase.EnumRailDirection.ASCENDING_SOUTH; } } if (var11 == BlockRailBase.EnumRailDirection.EAST_WEST) { if (BlockRailBase.func_176562_d(this.field_150660_b, var6.offsetUp())) { var11 = BlockRailBase.EnumRailDirection.ASCENDING_EAST; } if (BlockRailBase.func_176562_d(this.field_150660_b, var5.offsetUp())) { var11 = BlockRailBase.EnumRailDirection.ASCENDING_WEST; } } if (var11 == null) { var11 = BlockRailBase.EnumRailDirection.NORTH_SOUTH; } this.func_180360_a(var11); this.field_180366_e = this.field_180366_e.withProperty(this.field_180365_d.func_176560_l(), var11); if (p_180364_2_ || this.field_150660_b.getBlockState(this.field_180367_c) != this.field_180366_e) { this.field_150660_b.setBlockState(this.field_180367_c, this.field_180366_e, 3); for (int var12 = 0; var12 < this.field_150657_g.size(); ++var12) { BlockRailBase.Rail var13 = this.func_180697_b((BlockPos)this.field_150657_g.get(var12)); if (var13 != null) { var13.func_150651_b(); if (var13.func_150649_b(this)) { var13.func_150645_c(this); } } } } return this; } public IBlockState func_180362_b() { return this.field_180366_e; } } static final class SwitchEnumRailDirection { static final int[] field_180371_a = new int[BlockRailBase.EnumRailDirection.values().length]; private static final String __OBFID = "CL_00002138"; static { try { field_180371_a[BlockRailBase.EnumRailDirection.NORTH_SOUTH.ordinal()] = 1; } catch (NoSuchFieldError var10) { ; } try { field_180371_a[BlockRailBase.EnumRailDirection.EAST_WEST.ordinal()] = 2; } catch (NoSuchFieldError var9) { ; } try { field_180371_a[BlockRailBase.EnumRailDirection.ASCENDING_EAST.ordinal()] = 3; } catch (NoSuchFieldError var8) { ; } try { field_180371_a[BlockRailBase.EnumRailDirection.ASCENDING_WEST.ordinal()] = 4; } catch (NoSuchFieldError var7) { ; } try { field_180371_a[BlockRailBase.EnumRailDirection.ASCENDING_NORTH.ordinal()] = 5; } catch (NoSuchFieldError var6) { ; } try { field_180371_a[BlockRailBase.EnumRailDirection.ASCENDING_SOUTH.ordinal()] = 6; } catch (NoSuchFieldError var5) { ; } try { field_180371_a[BlockRailBase.EnumRailDirection.SOUTH_EAST.ordinal()] = 7; } catch (NoSuchFieldError var4) { ; } try { field_180371_a[BlockRailBase.EnumRailDirection.SOUTH_WEST.ordinal()] = 8; } catch (NoSuchFieldError var3) { ; } try { field_180371_a[BlockRailBase.EnumRailDirection.NORTH_WEST.ordinal()] = 9; } catch (NoSuchFieldError var2) { ; } try { field_180371_a[BlockRailBase.EnumRailDirection.NORTH_EAST.ordinal()] = 10; } catch (NoSuchFieldError var1) { ; } } } }