package net.minecraft.block; import com.google.common.collect.Lists; import com.google.common.collect.Sets; import java.util.ArrayList; import java.util.EnumSet; import java.util.Iterator; import java.util.Random; import java.util.Set; import net.minecraft.block.material.Material; import net.minecraft.block.properties.IProperty; import net.minecraft.block.properties.PropertyEnum; import net.minecraft.block.properties.PropertyInteger; import net.minecraft.block.state.BlockState; import net.minecraft.block.state.IBlockState; import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.item.Item; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.BlockPos; import net.minecraft.util.EnumFacing; import net.minecraft.util.IStringSerializable; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; public class BlockRedstoneWire extends Block { public static final PropertyEnum NORTH = PropertyEnum.create("north", BlockRedstoneWire.EnumAttachPosition.class); public static final PropertyEnum EAST = PropertyEnum.create("east", BlockRedstoneWire.EnumAttachPosition.class); public static final PropertyEnum SOUTH = PropertyEnum.create("south", BlockRedstoneWire.EnumAttachPosition.class); public static final PropertyEnum WEST = PropertyEnum.create("west", BlockRedstoneWire.EnumAttachPosition.class); public static final PropertyInteger POWER = PropertyInteger.create("power", 0, 15); private boolean canProvidePower = true; private final Set field_150179_b = Sets.newHashSet(); private static final String __OBFID = "CL_00000295"; public BlockRedstoneWire() { super(Material.circuits); this.setDefaultState(this.blockState.getBaseState().withProperty(NORTH, BlockRedstoneWire.EnumAttachPosition.NONE).withProperty(EAST, BlockRedstoneWire.EnumAttachPosition.NONE).withProperty(SOUTH, BlockRedstoneWire.EnumAttachPosition.NONE).withProperty(WEST, BlockRedstoneWire.EnumAttachPosition.NONE).withProperty(POWER, Integer.valueOf(0))); this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.0625F, 1.0F); } /** * Get the actual Block state of this Block at the given position. This applies properties not visible in the * metadata, such as fence connections. */ public IBlockState getActualState(IBlockState state, IBlockAccess worldIn, BlockPos pos) { state = state.withProperty(WEST, this.getAttachPosition(worldIn, pos, EnumFacing.WEST)); state = state.withProperty(EAST, this.getAttachPosition(worldIn, pos, EnumFacing.EAST)); state = state.withProperty(NORTH, this.getAttachPosition(worldIn, pos, EnumFacing.NORTH)); state = state.withProperty(SOUTH, this.getAttachPosition(worldIn, pos, EnumFacing.SOUTH)); return state; } private BlockRedstoneWire.EnumAttachPosition getAttachPosition(IBlockAccess p_176341_1_, BlockPos p_176341_2_, EnumFacing p_176341_3_) { BlockPos var4 = p_176341_2_.offset(p_176341_3_); Block var5 = p_176341_1_.getBlockState(p_176341_2_.offset(p_176341_3_)).getBlock(); if (!func_176343_a(p_176341_1_.getBlockState(var4), p_176341_3_) && (var5.isSolidFullCube() || !func_176346_d(p_176341_1_.getBlockState(var4.offsetDown())))) { Block var6 = p_176341_1_.getBlockState(p_176341_2_.offsetUp()).getBlock(); return !var6.isSolidFullCube() && var5.isSolidFullCube() && func_176346_d(p_176341_1_.getBlockState(var4.offsetUp())) ? BlockRedstoneWire.EnumAttachPosition.UP : BlockRedstoneWire.EnumAttachPosition.NONE; } else { return BlockRedstoneWire.EnumAttachPosition.SIDE; } } public AxisAlignedBB getCollisionBoundingBox(World worldIn, BlockPos pos, IBlockState state) { return null; } public boolean isOpaqueCube() { return false; } public boolean isFullCube() { return false; } public boolean canPlaceBlockAt(World worldIn, BlockPos pos) { return World.doesBlockHaveSolidTopSurface(worldIn, pos.offsetDown()) || worldIn.getBlockState(pos.offsetDown()).getBlock() == Blocks.glowstone; } private IBlockState updateSurroundingRedstone(World worldIn, BlockPos p_176338_2_, IBlockState p_176338_3_) { p_176338_3_ = this.func_176345_a(worldIn, p_176338_2_, p_176338_2_, p_176338_3_); ArrayList var4 = Lists.newArrayList(this.field_150179_b); this.field_150179_b.clear(); Iterator var5 = var4.iterator(); while (var5.hasNext()) { BlockPos var6 = (BlockPos)var5.next(); worldIn.notifyNeighborsOfStateChange(var6, this); } return p_176338_3_; } private IBlockState func_176345_a(World worldIn, BlockPos p_176345_2_, BlockPos p_176345_3_, IBlockState p_176345_4_) { IBlockState var5 = p_176345_4_; int var6 = ((Integer)p_176345_4_.getValue(POWER)).intValue(); byte var7 = 0; int var14 = this.func_176342_a(worldIn, p_176345_3_, var7); this.canProvidePower = false; int var8 = worldIn.func_175687_A(p_176345_2_); this.canProvidePower = true; if (var8 > 0 && var8 > var14 - 1) { var14 = var8; } int var9 = 0; Iterator var10 = EnumFacing.Plane.HORIZONTAL.iterator(); while (var10.hasNext()) { EnumFacing var11 = (EnumFacing)var10.next(); BlockPos var12 = p_176345_2_.offset(var11); boolean var13 = var12.getX() != p_176345_3_.getX() || var12.getZ() != p_176345_3_.getZ(); if (var13) { var9 = this.func_176342_a(worldIn, var12, var9); } if (worldIn.getBlockState(var12).getBlock().isNormalCube() && !worldIn.getBlockState(p_176345_2_.offsetUp()).getBlock().isNormalCube()) { if (var13 && p_176345_2_.getY() >= p_176345_3_.getY()) { var9 = this.func_176342_a(worldIn, var12.offsetUp(), var9); } } else if (!worldIn.getBlockState(var12).getBlock().isNormalCube() && var13 && p_176345_2_.getY() <= p_176345_3_.getY()) { var9 = this.func_176342_a(worldIn, var12.offsetDown(), var9); } } if (var9 > var14) { var14 = var9 - 1; } else if (var14 > 0) { --var14; } else { var14 = 0; } if (var8 > var14 - 1) { var14 = var8; } if (var6 != var14) { p_176345_4_ = p_176345_4_.withProperty(POWER, Integer.valueOf(var14)); if (worldIn.getBlockState(p_176345_2_) == var5) { worldIn.setBlockState(p_176345_2_, p_176345_4_, 2); } this.field_150179_b.add(p_176345_2_); EnumFacing[] var15 = EnumFacing.values(); int var16 = var15.length; for (int var17 = 0; var17 < var16; ++var17) { EnumFacing var18 = var15[var17]; this.field_150179_b.add(p_176345_2_.offset(var18)); } } return p_176345_4_; } private void func_176344_d(World worldIn, BlockPos p_176344_2_) { if (worldIn.getBlockState(p_176344_2_).getBlock() == this) { worldIn.notifyNeighborsOfStateChange(p_176344_2_, this); EnumFacing[] var3 = EnumFacing.values(); int var4 = var3.length; for (int var5 = 0; var5 < var4; ++var5) { EnumFacing var6 = var3[var5]; worldIn.notifyNeighborsOfStateChange(p_176344_2_.offset(var6), this); } } } public void onBlockAdded(World worldIn, BlockPos pos, IBlockState state) { if (!worldIn.isRemote) { this.updateSurroundingRedstone(worldIn, pos, state); Iterator var4 = EnumFacing.Plane.VERTICAL.iterator(); EnumFacing var5; while (var4.hasNext()) { var5 = (EnumFacing)var4.next(); worldIn.notifyNeighborsOfStateChange(pos.offset(var5), this); } var4 = EnumFacing.Plane.HORIZONTAL.iterator(); while (var4.hasNext()) { var5 = (EnumFacing)var4.next(); this.func_176344_d(worldIn, pos.offset(var5)); } var4 = EnumFacing.Plane.HORIZONTAL.iterator(); while (var4.hasNext()) { var5 = (EnumFacing)var4.next(); BlockPos var6 = pos.offset(var5); if (worldIn.getBlockState(var6).getBlock().isNormalCube()) { this.func_176344_d(worldIn, var6.offsetUp()); } else { this.func_176344_d(worldIn, var6.offsetDown()); } } } } public void breakBlock(World worldIn, BlockPos pos, IBlockState state) { super.breakBlock(worldIn, pos, state); if (!worldIn.isRemote) { EnumFacing[] var4 = EnumFacing.values(); int var5 = var4.length; for (int var6 = 0; var6 < var5; ++var6) { EnumFacing var7 = var4[var6]; worldIn.notifyNeighborsOfStateChange(pos.offset(var7), this); } this.updateSurroundingRedstone(worldIn, pos, state); Iterator var8 = EnumFacing.Plane.HORIZONTAL.iterator(); EnumFacing var9; while (var8.hasNext()) { var9 = (EnumFacing)var8.next(); this.func_176344_d(worldIn, pos.offset(var9)); } var8 = EnumFacing.Plane.HORIZONTAL.iterator(); while (var8.hasNext()) { var9 = (EnumFacing)var8.next(); BlockPos var10 = pos.offset(var9); if (worldIn.getBlockState(var10).getBlock().isNormalCube()) { this.func_176344_d(worldIn, var10.offsetUp()); } else { this.func_176344_d(worldIn, var10.offsetDown()); } } } } private int func_176342_a(World worldIn, BlockPos p_176342_2_, int p_176342_3_) { if (worldIn.getBlockState(p_176342_2_).getBlock() != this) { return p_176342_3_; } else { int var4 = ((Integer)worldIn.getBlockState(p_176342_2_).getValue(POWER)).intValue(); return var4 > p_176342_3_ ? var4 : p_176342_3_; } } public void onNeighborBlockChange(World worldIn, BlockPos pos, IBlockState state, Block neighborBlock) { if (!worldIn.isRemote) { if (this.canPlaceBlockAt(worldIn, pos)) { this.updateSurroundingRedstone(worldIn, pos, state); } else { this.dropBlockAsItem(worldIn, pos, state, 0); worldIn.setBlockToAir(pos); } } } /** * Get the Item that this Block should drop when harvested. * * @param fortune the level of the Fortune enchantment on the player's tool */ public Item getItemDropped(IBlockState state, Random rand, int fortune) { return Items.redstone; } public int isProvidingStrongPower(IBlockAccess worldIn, BlockPos pos, IBlockState state, EnumFacing side) { return !this.canProvidePower ? 0 : this.isProvidingWeakPower(worldIn, pos, state, side); } public int isProvidingWeakPower(IBlockAccess worldIn, BlockPos pos, IBlockState state, EnumFacing side) { if (!this.canProvidePower) { return 0; } else { int var5 = ((Integer)state.getValue(POWER)).intValue(); if (var5 == 0) { return 0; } else if (side == EnumFacing.UP) { return var5; } else { EnumSet var6 = EnumSet.noneOf(EnumFacing.class); Iterator var7 = EnumFacing.Plane.HORIZONTAL.iterator(); while (var7.hasNext()) { EnumFacing var8 = (EnumFacing)var7.next(); if (this.func_176339_d(worldIn, pos, var8)) { var6.add(var8); } } if (side.getAxis().isHorizontal() && var6.isEmpty()) { return var5; } else if (var6.contains(side) && !var6.contains(side.rotateYCCW()) && !var6.contains(side.rotateY())) { return var5; } else { return 0; } } } } private boolean func_176339_d(IBlockAccess p_176339_1_, BlockPos p_176339_2_, EnumFacing p_176339_3_) { BlockPos var4 = p_176339_2_.offset(p_176339_3_); IBlockState var5 = p_176339_1_.getBlockState(var4); Block var6 = var5.getBlock(); boolean var7 = var6.isNormalCube(); boolean var8 = p_176339_1_.getBlockState(p_176339_2_.offsetUp()).getBlock().isNormalCube(); return !var8 && var7 && func_176340_e(p_176339_1_, var4.offsetUp()) ? true : (func_176343_a(var5, p_176339_3_) ? true : (var6 == Blocks.powered_repeater && var5.getValue(BlockRedstoneDiode.AGE) == p_176339_3_ ? true : !var7 && func_176340_e(p_176339_1_, var4.offsetDown()))); } protected static boolean func_176340_e(IBlockAccess p_176340_0_, BlockPos p_176340_1_) { return func_176346_d(p_176340_0_.getBlockState(p_176340_1_)); } protected static boolean func_176346_d(IBlockState p_176346_0_) { return func_176343_a(p_176346_0_, (EnumFacing)null); } protected static boolean func_176343_a(IBlockState p_176343_0_, EnumFacing p_176343_1_) { Block var2 = p_176343_0_.getBlock(); if (var2 == Blocks.redstone_wire) { return true; } else if (Blocks.unpowered_repeater.func_149907_e(var2)) { EnumFacing var3 = (EnumFacing)p_176343_0_.getValue(BlockRedstoneRepeater.AGE); return var3 == p_176343_1_ || var3.getOpposite() == p_176343_1_; } else { return var2.canProvidePower() && p_176343_1_ != null; } } /** * Can this block provide power. Only wire currently seems to have this change based on its state. */ public boolean canProvidePower() { return this.canProvidePower; } /** * Convert the given metadata into a BlockState for this Block */ public IBlockState getStateFromMeta(int meta) { return this.getDefaultState().withProperty(POWER, Integer.valueOf(meta)); } /** * Convert the BlockState into the correct metadata value */ public int getMetaFromState(IBlockState state) { return ((Integer)state.getValue(POWER)).intValue(); } protected BlockState createBlockState() { return new BlockState(this, new IProperty[] {NORTH, EAST, SOUTH, WEST, POWER}); } static enum EnumAttachPosition implements IStringSerializable { UP("UP", 0, "up"), SIDE("SIDE", 1, "side"), NONE("NONE", 2, "none"); private final String field_176820_d; private static final BlockRedstoneWire.EnumAttachPosition[] $VALUES = new BlockRedstoneWire.EnumAttachPosition[]{UP, SIDE, NONE}; private static final String __OBFID = "CL_00002070"; private EnumAttachPosition(String p_i45689_1_, int p_i45689_2_, String p_i45689_3_) { this.field_176820_d = p_i45689_3_; } public String toString() { return this.getName(); } public String getName() { return this.field_176820_d; } } }