package net.minecraft.block; import com.google.common.base.Predicate; import java.util.List; import java.util.Random; 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.command.IEntitySelector; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityMinecartCommandBlock; import net.minecraft.entity.item.EntityMinecart; import net.minecraft.inventory.Container; import net.minecraft.inventory.IInventory; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.BlockPos; import net.minecraft.util.EnumFacing; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; public class BlockRailDetector extends BlockRailBase { public static final PropertyEnum field_176573_b = PropertyEnum.create("shape", BlockRailBase.EnumRailDirection.class, new Predicate() { private static final String __OBFID = "CL_00002126"; public boolean func_180344_a(BlockRailBase.EnumRailDirection p_180344_1_) { return p_180344_1_ != BlockRailBase.EnumRailDirection.NORTH_EAST && p_180344_1_ != BlockRailBase.EnumRailDirection.NORTH_WEST && p_180344_1_ != BlockRailBase.EnumRailDirection.SOUTH_EAST && p_180344_1_ != BlockRailBase.EnumRailDirection.SOUTH_WEST; } public boolean apply(Object p_apply_1_) { return this.func_180344_a((BlockRailBase.EnumRailDirection)p_apply_1_); } }); public static final PropertyBool field_176574_M = PropertyBool.create("powered"); private static final String __OBFID = "CL_00000225"; public BlockRailDetector() { super(true); this.setDefaultState(this.blockState.getBaseState().withProperty(field_176574_M, Boolean.valueOf(false)).withProperty(field_176573_b, BlockRailBase.EnumRailDirection.NORTH_SOUTH)); this.setTickRandomly(true); } /** * How many world ticks before ticking */ public int tickRate(World worldIn) { return 20; } /** * Can this block provide power. Only wire currently seems to have this change based on its state. */ public boolean canProvidePower() { return true; } /** * Called When an Entity Collided with the Block */ public void onEntityCollidedWithBlock(World worldIn, BlockPos pos, IBlockState state, Entity entityIn) { if (!worldIn.isRemote) { if (!((Boolean)state.getValue(field_176574_M)).booleanValue()) { this.func_176570_e(worldIn, pos, state); } } } /** * Called randomly when setTickRandomly is set to true (used by e.g. crops to grow, etc.) */ public void randomTick(World worldIn, BlockPos pos, IBlockState state, Random random) {} public void updateTick(World worldIn, BlockPos pos, IBlockState state, Random rand) { if (!worldIn.isRemote && ((Boolean)state.getValue(field_176574_M)).booleanValue()) { this.func_176570_e(worldIn, pos, state); } } public int isProvidingWeakPower(IBlockAccess worldIn, BlockPos pos, IBlockState state, EnumFacing side) { return ((Boolean)state.getValue(field_176574_M)).booleanValue() ? 15 : 0; } public int isProvidingStrongPower(IBlockAccess worldIn, BlockPos pos, IBlockState state, EnumFacing side) { return !((Boolean)state.getValue(field_176574_M)).booleanValue() ? 0 : (side == EnumFacing.UP ? 15 : 0); } private void func_176570_e(World worldIn, BlockPos p_176570_2_, IBlockState p_176570_3_) { boolean var4 = ((Boolean)p_176570_3_.getValue(field_176574_M)).booleanValue(); boolean var5 = false; List var6 = this.func_176571_a(worldIn, p_176570_2_, EntityMinecart.class, new Predicate[0]); if (!var6.isEmpty()) { var5 = true; } if (var5 && !var4) { worldIn.setBlockState(p_176570_2_, p_176570_3_.withProperty(field_176574_M, Boolean.valueOf(true)), 3); worldIn.notifyNeighborsOfStateChange(p_176570_2_, this); worldIn.notifyNeighborsOfStateChange(p_176570_2_.offsetDown(), this); worldIn.markBlockRangeForRenderUpdate(p_176570_2_, p_176570_2_); } if (!var5 && var4) { worldIn.setBlockState(p_176570_2_, p_176570_3_.withProperty(field_176574_M, Boolean.valueOf(false)), 3); worldIn.notifyNeighborsOfStateChange(p_176570_2_, this); worldIn.notifyNeighborsOfStateChange(p_176570_2_.offsetDown(), this); worldIn.markBlockRangeForRenderUpdate(p_176570_2_, p_176570_2_); } if (var5) { worldIn.scheduleUpdate(p_176570_2_, this, this.tickRate(worldIn)); } worldIn.updateComparatorOutputLevel(p_176570_2_, this); } public void onBlockAdded(World worldIn, BlockPos pos, IBlockState state) { super.onBlockAdded(worldIn, pos, state); this.func_176570_e(worldIn, pos, state); } public IProperty func_176560_l() { return field_176573_b; } public boolean hasComparatorInputOverride() { return true; } public int getComparatorInputOverride(World worldIn, BlockPos pos) { if (((Boolean)worldIn.getBlockState(pos).getValue(field_176574_M)).booleanValue()) { List var3 = this.func_176571_a(worldIn, pos, EntityMinecartCommandBlock.class, new Predicate[0]); if (!var3.isEmpty()) { return ((EntityMinecartCommandBlock)var3.get(0)).func_145822_e().getSuccessCount(); } List var4 = this.func_176571_a(worldIn, pos, EntityMinecart.class, new Predicate[] {IEntitySelector.selectInventories}); if (!var4.isEmpty()) { return Container.calcRedstoneFromInventory((IInventory)var4.get(0)); } } return 0; } protected List func_176571_a(World worldIn, BlockPos p_176571_2_, Class p_176571_3_, Predicate ... p_176571_4_) { AxisAlignedBB var5 = this.func_176572_a(p_176571_2_); return p_176571_4_.length != 1 ? worldIn.getEntitiesWithinAABB(p_176571_3_, var5) : worldIn.func_175647_a(p_176571_3_, var5, p_176571_4_[0]); } private AxisAlignedBB func_176572_a(BlockPos p_176572_1_) { float var2 = 0.2F; return new AxisAlignedBB((double)((float)p_176572_1_.getX() + 0.2F), (double)p_176572_1_.getY(), (double)((float)p_176572_1_.getZ() + 0.2F), (double)((float)(p_176572_1_.getX() + 1) - 0.2F), (double)((float)(p_176572_1_.getY() + 1) - 0.2F), (double)((float)(p_176572_1_.getZ() + 1) - 0.2F)); } /** * Convert the given metadata into a BlockState for this Block */ public IBlockState getStateFromMeta(int meta) { return this.getDefaultState().withProperty(field_176573_b, BlockRailBase.EnumRailDirection.func_177016_a(meta & 7)).withProperty(field_176574_M, Boolean.valueOf((meta & 8) > 0)); } /** * Convert the BlockState into the correct metadata value */ public int getMetaFromState(IBlockState state) { byte var2 = 0; int var3 = var2 | ((BlockRailBase.EnumRailDirection)state.getValue(field_176573_b)).func_177015_a(); if (((Boolean)state.getValue(field_176574_M)).booleanValue()) { var3 |= 8; } return var3; } protected BlockState createBlockState() { return new BlockState(this, new IProperty[] {field_176573_b, field_176574_M}); } }