- 55
- 1
Проблема такая: есть блок, который должен принимать сигнал редстоуна. Если поставить с ним рядом красный факел, или другой излучатель редстоуна, всё нормально, метод getWeakPower() показывает силу сигнала, но если сигнал идет по проводам (красной пыли), то этот метод всегда показывает - 0. Пробовал также getStrongPower , но и здесь такой же результат.
Код блока:
Я поробовал также так:
и так работает, но если, например использовать провода из Project red , то уже не работает. Как это решить, может где-то есть еще какой-то метод, который нужен здесь?
Код блока:
Java:
public class DeviceBlock extends Block {
public static final PropertyBool POWERED = PropertyBool.create("powered");
public static final PropertyDirection FACING = BlockHorizontal.FACING;
public static final AxisAlignedBB DEVICE_AABB = new AxisAlignedBB(0.0D, 0.0D, 0.0D, 1.0D, 0.125D, 1.0D);
public DeviceBlock(Material materialIn, String name, float hardness,
float resistance, String harvLevel, int level, SoundType soundType) {
super(materialIn);
setRegistryName(name);
setUnlocalizedName(name);
setHardness(hardness);
setResistance(resistance);
setHarvestLevel(harvLevel, level);
setSoundType(soundType);
setCreativeTab(CreativeTabs.REDSTONE);
setDefaultState(blockState.getBaseState().withProperty(FACING, EnumFacing.NORTH).withProperty(POWERED, false));
}
@Override
public EnumBlockRenderType getRenderType(IBlockState state) {
return EnumBlockRenderType.MODEL;
}
@Override
public boolean isOpaqueCube(IBlockState state) {
return false;
}
public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) {
return DEVICE_AABB;
}
@Override
protected BlockStateContainer createBlockState() {
return new BlockStateContainer(this, new IProperty[] {POWERED, FACING});
}
@Override
public IBlockState getStateFromMeta(int meta) {
boolean powered = false;
if (meta > 3) {
powered = true;
meta -= 4;
}
EnumFacing facing = null;
switch (meta) {
case 3:
facing = EnumFacing.EAST;
break;
case 2:
facing = EnumFacing.SOUTH;
break;
case 1:
facing = EnumFacing.WEST;
break;
case 0:
facing = EnumFacing.NORTH;
break;
}
return this.getDefaultState().withProperty(FACING, facing).withProperty(POWERED, powered);
}
@Override
public int getMetaFromState(IBlockState state) {
int meta = 0;
switch (state.getValue(FACING)) {
case NORTH:
meta = 0;
break;
case WEST:
meta = 1;
break;
case SOUTH:
meta = 2;
break;
case EAST:
meta = 3;
break;
default:
meta = 0;
}
if (state.getValue(POWERED) == true)
meta += 4;
return meta;
}
@Override
public IBlockState getStateForPlacement(World world, BlockPos pos, EnumFacing facing, float hitX, float hitY,
float hitZ, int meta, EntityLivingBase placer) {
int dir = MathHelper.floor((double)((placer.rotationYaw * 4F) / 360F) + 0.5D) & 3;
return getDefaultState().withProperty(FACING, Tools.getFacing(dir));
}
@Override
public boolean canConnectRedstone(IBlockState state, IBlockAccess world, BlockPos pos, EnumFacing side) {
if (side == state.getValue(FACING) ||
side == state.getValue(FACING).getOpposite())
return true;
return false;
}
@Override
public boolean canProvidePower(IBlockState state) {
return true;
}
@Override
public int getWeakPower(IBlockState state, IBlockAccess blockAccess, BlockPos pos, EnumFacing side) {
if (state.getValue(POWERED) == true) {
if (side == state.getValue(FACING).getOpposite()) {
return 15;
}
}
return 0;
}
@Override
public void neighborChanged(IBlockState state, World world,
BlockPos pos, Block block, BlockPos fromPos) {
if (!world.isRemote) {
EnumFacing def = state.getValue(FACING);
BlockPos posit = pos.offset(def.getOpposite());
IBlockState st = world.getBlockState(posit);
int energy = 0;
if (st.getBlock() == Blocks.REDSTONE_WIRE) {
energy = st.getValue(BlockRedstoneWire.POWER).intValue();
} else {
energy = st.getWeakPower(world, pos, def.getOpposite());
}
if (energy > 0) {
if (!((TEDevice)world.getTileEntity(pos)).signal)
((TEDevice)world.getTileEntity(pos)).block();
} else {
((TEDevice)world.getTileEntity(pos)).unlock();
}
}
}
@Override
public boolean hasTileEntity(IBlockState state) {
return true;
}
@Override
public TileEntity createTileEntity(World world, IBlockState state) {
return new TEDevice();
}
}
Я поробовал также так:
Java:
energy = st.getValue(BlockRedstoneWire.POWER).intValue();