Как сделать направленный блок в моддинге Minecraft 1.12.2? - PullRequest
0 голосов
/ 27 апреля 2019

Я занимаюсь разработкой мода Minecraft 1.12.2 уже несколько месяцев.Я хотел сделать направленный блок.Блок представляет собой чёрно-фиолетовый куб (при размещении в руке есть текстура).Файлы JSON, которые я проверял несколько раз.Каждый раз, когда я запускаю игру, все направления устанавливаются по умолчанию.Спасибо за помощь!

PS Я проверял оригинальную версию Minecraft BlockFurnace, но вместо того, чтобы помочь, меня смутило.

Вот код, который у меня уже есть:

public class DirBlock extends BlockHorizontal implements IHasModel {

public DirBlock(String name) {
    super(Material.CLOTH);
    setSoundType(SoundType.CLOTH);
    setCreativeTab(Main.RM_TAB1);
    setUnlocalizedName(name);
    setRegistryName(name);
    setDefaultState(this.blockState.getBaseState().withProperty(FACING, EnumFacing.NORTH));

    ModBlocks.BLOCKS.add(this);
    ModItems.ITEMS.add(new ItemBlock(this).setRegistryName(this.getRegistryName()));
}

public static final PropertyDirection FACING = PropertyDirection.create("facing", EnumFacing.Plane.HORIZONTAL);

@Override
protected BlockStateContainer createBlockState() {
    return new BlockStateContainer(this, new IProperty[] { FACING });
}

@Override
public IBlockState getStateFromMeta(int meta) {
    return getDefaultState().withProperty(FACING, meta == 0 ? EnumFacing.WEST : EnumFacing.EAST);
}

@Override
public int getMetaFromState(IBlockState state) {
    EnumFacing facing = (EnumFacing) state.getValue(FACING);
    return facing.getHorizontalIndex();
}

@Override
public IBlockState getStateForPlacement(World world, BlockPos pos, EnumFacing facing, float hitX, float hitY,
    float hitZ, int meta, EntityLivingBase placer, EnumHand hand) {
return super.getStateForPlacement(world, pos, facing, hitX, hitY, hitZ, meta, placer, hand).withProperty(FACING, placer.getHorizontalFacing());
}

@Override
public void registerModels() {
    Main.proxy.registerItemRenderer(Item.getItemFromBlock(this), 0, "inventory");
}
}

1 Ответ

0 голосов
/ 28 апреля 2019

Ваши функции metaFromState и stateFromMeta не являются зеркалами (и они должны быть)

@Override
public IBlockState getStateFromMeta(int meta) {
    return getDefaultState().withProperty(FACING, meta == 0 ? EnumFacing.WEST : EnumFacing.EAST);
}

@Override
public int getMetaFromState(IBlockState state) {
    EnumFacing facing = (EnumFacing) state.getValue(FACING);
    return facing.getHorizontalIndex();
}

Вы используете лицевой индекс для кодирования в метаданные, но когда вы вернетесь, вы решите, точно ли метаданные равны 0, и если да, то лицевая сторона имеет значение WEST (а все остальные значения означают EAST).

К сожалению, WEST не равен 0. Это из кода Javadoc для getHorizontalIndex():

/**
 * Get the index of this horizontal facing (0-3). The order is S-W-N-E
 */

Вы должны использовать это:

//use existing getMetaFromState
@Override
public IBlockState getStateFromMeta(int meta)
{
    return this.getDefaultState().withProperty(FACING, EnumFacing.getHorizontal(meta));
}

Если вы хотите, чтобы ваш блок только когда-либо сталкивался с EAST и WEST (и никогда с NORTH / SOUTH), то вам следует применить его к помещенному блоку и затем кодировать, используя один бит метаданных:

//use existing getStateFromMeta
@Override
public int getMetaFromState(IBlockState state) {
    EnumFacing facing = (EnumFacing) state.getValue(FACING);
    return facing == EnumFacing.WEST?0:1;
}
...