- Версия(и) Minecraft
- 1.12.х
В этом примере мы показываем, как вы можете сделать блок, который имеет разные текстуры на каждой стороне. Кроме того, блок будет также ориентироваться в соответствии с тем, как игрок размещает блок.
Обратите внимание, что состояние блока является аналогом метаданных, как это было сделано и использовано в более старых версиях Minecraft. С=Однако система состояния блоков намного чище и удобнее, помните, как в 1.8.9 метаданные были представлены 4-я битами (по крайней мере, для блоков), поэтому вы были ограничены 16-тью различными состояниями. В приведенном ниже примере мы используем свойство, называемое
Вот состояние блока в .json файле (blockstates/multitexturedblock.json):
А вот актуальная модель (models/block/multitexturedblock.json):
Обратите внимание, что состояние блока является аналогом метаданных, как это было сделано и использовано в более старых версиях Minecraft. С=Однако система состояния блоков намного чище и удобнее, помните, как в 1.8.9 метаданные были представлены 4-я битами (по крайней мере, для блоков), поэтому вы были ограничены 16-тью различными состояниями. В приведенном ниже примере мы используем свойство, называемое
FACING
, которое поможет задать направление блока. Основываясь на этом свойстве, мы решим, как повернуть нашу модель в блок-состоянии json.
MultiTexturedBlock.java:
public class MultiTexturedBlock extends Block {
public static final PropertyDirection FACING = PropertyDirection.create("facing");
public MultiTexturedBlock() {
super(Material.ROCK);
setUnlocalizedName(ModTut.MODID + ".multitexturedblock");
setRegistryName("multitexturedblock");
setDefaultState(blockState.getBaseState().withProperty(FACING, EnumFacing.NORTH));
}
@SideOnly(Side.CLIENT)
public void initModel() {
ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(this), 0, new ModelResourceLocation(getRegistryName(), "inventory"));
}
@Override
public void onBlockPlacedBy(World world, BlockPos pos, IBlockState state, EntityLivingBase placer, ItemStack stack) {
world.setBlockState(pos, state.withProperty(FACING, getFacingFromEntity(pos, placer)), 2);
}
public static EnumFacing getFacingFromEntity(BlockPos clickedBlock, EntityLivingBase entity) {
return EnumFacing.getFacingFromVector(
(float) (entity.posX - clickedBlock.getX()),
(float) (entity.posY - clickedBlock.getY()),
(float) (entity.posZ - clickedBlock.getZ()));
}
@Override
public IBlockState getStateFromMeta(int meta) {
return getDefaultState().withProperty(FACING, EnumFacing.getFront(meta & 7));
}
@Override
public int getMetaFromState(IBlockState state) {
return state.getValue(FACING).getIndex();
}
@Override
protected BlockStateContainer createBlockState() {
return new BlockStateContainer(this, FACING);
}
}
Вот состояние блока в .json файле (blockstates/multitexturedblock.json):
multitexturedblock.json:
{
"forge_marker": 1,
"defaults": {
"model": "modtut:multitexturedblock"
},
"variants": {
"normal": [{}],
"inventory": [{}],
"facing": {
"north": {},
"south": {"y": 180},
"west": {"y": 270},
"east": {"y": 90},
"up": {"x": -90},
"down": {"x": 90}
}
}
}
А вот актуальная модель (models/block/multitexturedblock.json):
multitexturedblock.json:
{
"parent": "block/cube",
"textures": {
"particle": "modtut:blocks/faceFront",
"down": "modtut:blocks/faceDown",
"up": "modtut:blocks/faceUp",
"east": "modtut:blocks/faceLeft",
"west": "modtut:blocks/faceRight",
"north": "modtut:blocks/faceFront",
"south": "modtut:blocks/faceBack"
}
}