package net.minecraft.block; import com.google.common.base.Predicate; import java.util.List; import java.util.Random; import net.minecraft.block.material.Material; import net.minecraft.block.properties.IProperty; import net.minecraft.block.properties.PropertyBool; import net.minecraft.block.properties.PropertyEnum; import net.minecraft.block.state.BlockState; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.item.EntityItemFrame; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.item.Item; import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntityComparator; 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 BlockRedstoneComparator extends BlockRedstoneDiode implements ITileEntityProvider { public static final PropertyBool field_176464_a = PropertyBool.create("powered"); public static final PropertyEnum field_176463_b = PropertyEnum.create("mode", BlockRedstoneComparator.Mode.class); private static final String __OBFID = "CL_00000220"; public BlockRedstoneComparator(boolean p_i45399_1_) { super(p_i45399_1_); this.setDefaultState(this.blockState.getBaseState().withProperty(AGE, EnumFacing.NORTH).withProperty(field_176464_a, Boolean.valueOf(false)).withProperty(field_176463_b, BlockRedstoneComparator.Mode.COMPARE)); this.isBlockContainer = true; } /** * 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.comparator; } protected int func_176403_d(IBlockState p_176403_1_) { return 2; } protected IBlockState func_180674_e(IBlockState p_180674_1_) { Boolean var2 = (Boolean)p_180674_1_.getValue(field_176464_a); BlockRedstoneComparator.Mode var3 = (BlockRedstoneComparator.Mode)p_180674_1_.getValue(field_176463_b); EnumFacing var4 = (EnumFacing)p_180674_1_.getValue(AGE); return Blocks.powered_comparator.getDefaultState().withProperty(AGE, var4).withProperty(field_176464_a, var2).withProperty(field_176463_b, var3); } protected IBlockState func_180675_k(IBlockState p_180675_1_) { Boolean var2 = (Boolean)p_180675_1_.getValue(field_176464_a); BlockRedstoneComparator.Mode var3 = (BlockRedstoneComparator.Mode)p_180675_1_.getValue(field_176463_b); EnumFacing var4 = (EnumFacing)p_180675_1_.getValue(AGE); return Blocks.unpowered_comparator.getDefaultState().withProperty(AGE, var4).withProperty(field_176464_a, var2).withProperty(field_176463_b, var3); } protected boolean func_176406_l(IBlockState p_176406_1_) { return this.isRepeaterPowered || ((Boolean)p_176406_1_.getValue(field_176464_a)).booleanValue(); } protected int func_176408_a(IBlockAccess p_176408_1_, BlockPos p_176408_2_, IBlockState p_176408_3_) { TileEntity var4 = p_176408_1_.getTileEntity(p_176408_2_); return var4 instanceof TileEntityComparator ? ((TileEntityComparator)var4).getOutputSignal() : 0; } private int func_176460_j(World worldIn, BlockPos p_176460_2_, IBlockState p_176460_3_) { return p_176460_3_.getValue(field_176463_b) == BlockRedstoneComparator.Mode.SUBTRACT ? Math.max(this.func_176397_f(worldIn, p_176460_2_, p_176460_3_) - this.func_176407_c(worldIn, p_176460_2_, p_176460_3_), 0) : this.func_176397_f(worldIn, p_176460_2_, p_176460_3_); } protected boolean func_176404_e(World worldIn, BlockPos p_176404_2_, IBlockState p_176404_3_) { int var4 = this.func_176397_f(worldIn, p_176404_2_, p_176404_3_); if (var4 >= 15) { return true; } else if (var4 == 0) { return false; } else { int var5 = this.func_176407_c(worldIn, p_176404_2_, p_176404_3_); return var5 == 0 ? true : var4 >= var5; } } protected int func_176397_f(World worldIn, BlockPos p_176397_2_, IBlockState p_176397_3_) { int var4 = super.func_176397_f(worldIn, p_176397_2_, p_176397_3_); EnumFacing var5 = (EnumFacing)p_176397_3_.getValue(AGE); BlockPos var6 = p_176397_2_.offset(var5); Block var7 = worldIn.getBlockState(var6).getBlock(); if (var7.hasComparatorInputOverride()) { var4 = var7.getComparatorInputOverride(worldIn, var6); } else if (var4 < 15 && var7.isNormalCube()) { var6 = var6.offset(var5); var7 = worldIn.getBlockState(var6).getBlock(); if (var7.hasComparatorInputOverride()) { var4 = var7.getComparatorInputOverride(worldIn, var6); } else if (var7.getMaterial() == Material.air) { EntityItemFrame var8 = this.func_176461_a(worldIn, var5, var6); if (var8 != null) { var4 = var8.func_174866_q(); } } } return var4; } private EntityItemFrame func_176461_a(World worldIn, final EnumFacing p_176461_2_, BlockPos p_176461_3_) { List var4 = worldIn.func_175647_a(EntityItemFrame.class, new AxisAlignedBB((double)p_176461_3_.getX(), (double)p_176461_3_.getY(), (double)p_176461_3_.getZ(), (double)(p_176461_3_.getX() + 1), (double)(p_176461_3_.getY() + 1), (double)(p_176461_3_.getZ() + 1)), new Predicate() { private static final String __OBFID = "CL_00002129"; public boolean func_180416_a(Entity p_180416_1_) { return p_180416_1_ != null && p_180416_1_.func_174811_aO() == p_176461_2_; } public boolean apply(Object p_apply_1_) { return this.func_180416_a((Entity)p_apply_1_); } }); return var4.size() == 1 ? (EntityItemFrame)var4.get(0) : null; } public boolean onBlockActivated(World worldIn, BlockPos pos, IBlockState state, EntityPlayer playerIn, EnumFacing side, float hitX, float hitY, float hitZ) { if (!playerIn.capabilities.allowEdit) { return false; } else { state = state.cycleProperty(field_176463_b); worldIn.playSoundEffect((double)pos.getX() + 0.5D, (double)pos.getY() + 0.5D, (double)pos.getZ() + 0.5D, "random.click", 0.3F, state.getValue(field_176463_b) == BlockRedstoneComparator.Mode.SUBTRACT ? 0.55F : 0.5F); worldIn.setBlockState(pos, state, 2); this.func_176462_k(worldIn, pos, state); return true; } } protected void func_176398_g(World worldIn, BlockPos p_176398_2_, IBlockState p_176398_3_) { if (!worldIn.isBlockTickPending(p_176398_2_, this)) { int var4 = this.func_176460_j(worldIn, p_176398_2_, p_176398_3_); TileEntity var5 = worldIn.getTileEntity(p_176398_2_); int var6 = var5 instanceof TileEntityComparator ? ((TileEntityComparator)var5).getOutputSignal() : 0; if (var4 != var6 || this.func_176406_l(p_176398_3_) != this.func_176404_e(worldIn, p_176398_2_, p_176398_3_)) { if (this.func_176402_i(worldIn, p_176398_2_, p_176398_3_)) { worldIn.func_175654_a(p_176398_2_, this, 2, -1); } else { worldIn.func_175654_a(p_176398_2_, this, 2, 0); } } } } private void func_176462_k(World worldIn, BlockPos p_176462_2_, IBlockState p_176462_3_) { int var4 = this.func_176460_j(worldIn, p_176462_2_, p_176462_3_); TileEntity var5 = worldIn.getTileEntity(p_176462_2_); int var6 = 0; if (var5 instanceof TileEntityComparator) { TileEntityComparator var7 = (TileEntityComparator)var5; var6 = var7.getOutputSignal(); var7.setOutputSignal(var4); } if (var6 != var4 || p_176462_3_.getValue(field_176463_b) == BlockRedstoneComparator.Mode.COMPARE) { boolean var9 = this.func_176404_e(worldIn, p_176462_2_, p_176462_3_); boolean var8 = this.func_176406_l(p_176462_3_); if (var8 && !var9) { worldIn.setBlockState(p_176462_2_, p_176462_3_.withProperty(field_176464_a, Boolean.valueOf(false)), 2); } else if (!var8 && var9) { worldIn.setBlockState(p_176462_2_, p_176462_3_.withProperty(field_176464_a, Boolean.valueOf(true)), 2); } this.func_176400_h(worldIn, p_176462_2_, p_176462_3_); } } public void updateTick(World worldIn, BlockPos pos, IBlockState state, Random rand) { if (this.isRepeaterPowered) { worldIn.setBlockState(pos, this.func_180675_k(state).withProperty(field_176464_a, Boolean.valueOf(true)), 4); } this.func_176462_k(worldIn, pos, state); } public void onBlockAdded(World worldIn, BlockPos pos, IBlockState state) { super.onBlockAdded(worldIn, pos, state); worldIn.setTileEntity(pos, this.createNewTileEntity(worldIn, 0)); } public void breakBlock(World worldIn, BlockPos pos, IBlockState state) { super.breakBlock(worldIn, pos, state); worldIn.removeTileEntity(pos); this.func_176400_h(worldIn, pos, state); } /** * Called on both Client and Server when World#addBlockEvent is called */ public boolean onBlockEventReceived(World worldIn, BlockPos pos, IBlockState state, int eventID, int eventParam) { super.onBlockEventReceived(worldIn, pos, state, eventID, eventParam); TileEntity var6 = worldIn.getTileEntity(pos); return var6 == null ? false : var6.receiveClientEvent(eventID, eventParam); } /** * Returns a new instance of a block's tile entity class. Called on placing the block. */ public TileEntity createNewTileEntity(World worldIn, int meta) { return new TileEntityComparator(); } /** * Convert the given metadata into a BlockState for this Block */ public IBlockState getStateFromMeta(int meta) { return this.getDefaultState().withProperty(AGE, EnumFacing.getHorizontal(meta)).withProperty(field_176464_a, Boolean.valueOf((meta & 8) > 0)).withProperty(field_176463_b, (meta & 4) > 0 ? BlockRedstoneComparator.Mode.SUBTRACT : BlockRedstoneComparator.Mode.COMPARE); } /** * Convert the BlockState into the correct metadata value */ public int getMetaFromState(IBlockState state) { byte var2 = 0; int var3 = var2 | ((EnumFacing)state.getValue(AGE)).getHorizontalIndex(); if (((Boolean)state.getValue(field_176464_a)).booleanValue()) { var3 |= 8; } if (state.getValue(field_176463_b) == BlockRedstoneComparator.Mode.SUBTRACT) { var3 |= 4; } return var3; } protected BlockState createBlockState() { return new BlockState(this, new IProperty[] {AGE, field_176463_b, field_176464_a}); } public IBlockState onBlockPlaced(World worldIn, BlockPos pos, EnumFacing facing, float hitX, float hitY, float hitZ, int meta, EntityLivingBase placer) { return this.getDefaultState().withProperty(AGE, placer.func_174811_aO().getOpposite()).withProperty(field_176464_a, Boolean.valueOf(false)).withProperty(field_176463_b, BlockRedstoneComparator.Mode.COMPARE); } public static enum Mode implements IStringSerializable { COMPARE("COMPARE", 0, "compare"), SUBTRACT("SUBTRACT", 1, "subtract"); private final String field_177041_c; private static final BlockRedstoneComparator.Mode[] $VALUES = new BlockRedstoneComparator.Mode[]{COMPARE, SUBTRACT}; private static final String __OBFID = "CL_00002128"; private Mode(String p_i45731_1_, int p_i45731_2_, String p_i45731_3_) { this.field_177041_c = p_i45731_3_; } public String toString() { return this.field_177041_c; } public String getName() { return this.field_177041_c; } } }