Мы же с тобой не на сайте фрилансеров, верно? Я что-то не увидел, чтобы на этом форуме было написано, что он платный или помощь только за деньги.Есть те которые делают это бесплатно, это называется альтруизм.
Ок, вот код и я не могу понять некоторые моменты. Укажу свое понимание после "//"Если бы ты кинул кусок кода, который не понимаешь - тебе бы объяснили.
public class BlockGasPump extends BlockRotatedObject //тут все понятно
{
public static final PropertyBool TOP = PropertyBool.create("top"); //тут мы, как бы, забиваем верх модели - верно?
public BlockGasPump() // понятно все
{
super(Material.ANVIL, "gas_pump"); //понятно
this.setDefaultState(this.blockState.getBaseState().withProperty(FACING, EnumFacing.NORTH).withProperty(TOP, false)); //не понимаю
this.setHardness(1.0F); //понятно
}
//расплывчато понял о чем речь ниже? Понятно, что в самом низу о рендеринге код, а вот выше рендеринга?
@Override
public boolean canPlaceBlockAt(World worldIn, BlockPos pos)
{
return worldIn.isAirBlock(pos) && worldIn.isAirBlock(pos.up());
}
@Override
public void onBlockPlacedBy(World worldIn, BlockPos pos, IBlockState state, EntityLivingBase placer, ItemStack stack)
{
worldIn.setBlockState(pos.up(), state.withProperty(TOP, true));
}
@Override
public void onBlockHarvested(World worldIn, BlockPos pos, IBlockState state, EntityPlayer player)
{
if(state.getValue(TOP))
{
if(worldIn.getBlockState(pos.down()).getBlock() instanceof BlockGasPump)
{
worldIn.setBlockToAir(pos.down());
}
}
else
{
if(worldIn.getBlockState(pos.up()).getBlock() instanceof BlockGasPump)
{
worldIn.setBlockToAir(pos.up());
}
}
}
@Override
public int getMetaFromState(IBlockState state)
{
return state.getValue(FACING).getHorizontalIndex() + (state.getValue(TOP) ? 4 : 0);
}
@Override
public IBlockState getStateFromMeta(int meta)
{
return this.getDefaultState().withProperty(FACING, EnumFacing.getHorizontal(meta % 4)).withProperty(TOP, meta / 4 > 0);
}
@Override
protected BlockStateContainer createBlockState()
{
return new BlockStateContainer(this, FACING, TOP);
}
@Override
public BlockRenderLayer getBlockLayer()
{
return BlockRenderLayer.CUTOUT;
}
}
@Override
public void onBlockHarvested(World worldIn, BlockPos pos, IBlockState state, EntityPlayer player)
{
if(state.getValue(TOP))
{
if(worldIn.getBlockState(pos.down()).getBlock() instanceof BlockGasPump)
{
worldIn.setBlockToAir(pos.down());
}
}
else
{
if(worldIn.getBlockState(pos.up()).getBlock() instanceof BlockGasPump)
{
worldIn.setBlockToAir(pos.up());
}
}
}
Тут мы создаем параметр для нашего BlockState. В данном случае - параметр типа булев, который говорит верхний это блок или нет.public static final PropertyBool TOP = PropertyBool.create("top"); //тут мы, как бы, забиваем верх модели - верно?
Метод, как можно понять по названию, возвращает тру если блок можно установить. В методе мы проверяешь, что позиция в мире куда мы хотим поставить блок - пустая(воздух), а так же выше на один блок тоже воздух.@Override public boolean canPlaceBlockAt(World worldIn, BlockPos pos) { return worldIn.isAirBlock(pos) && worldIn.isAirBlock(pos.up()); }
Метод вызывается при ломании блока. Там есть проверка, что если блок верхний - значит ломаем нижний. Если же игрок сломал нижний - ломаем верхний.@Override public void onBlockHarvested(World worldIn, BlockPos pos, IBlockState state, EntityPlayer player) { if(state.getValue(TOP)) { if(worldIn.getBlockState(pos.down()).getBlock() instanceof BlockGasPump) { worldIn.setBlockToAir(pos.down()); } } else { if(worldIn.getBlockState(pos.up()).getBlock() instanceof BlockGasPump) { worldIn.setBlockToAir(pos.up()); } } }
Я на новых версиях не кодил почти, по-этому с жсонами очень мало знаком. Попробуй заглянуть в жсон цветка и глянуть как там это выглядит все, может какие-то параметры есть.Я этот код пробовал применить к себе. В принципе работает установка блока поверх другого блока, точнее модели json, но есть ошибки:
1. Модели не имеют формы. Ставится обычный блок без текстур.
2. Поставленные модели не срубаются вместе.