- Версия(и) Minecraft
- 1.12.х
В этом примере будет показано, как сделать так, чтобы лицевая панель блока зависела от сигнала красного камня. Здесь мы добавляем дополнительное свойство к нашему состоянию блока, которое говорит, включен ли блок (есть сигнал красного камня) или нет.
А вот и состояние блока в .json файле (blockstates/statetexturedblock.json). Здесь вы видите, как мы меняем переднюю текстуру, когда свойство
Наконец нам нужен файл модели (models/block/statetexturedblock.json). Текстура
StateTexturedBlock.java:
public class StateTexturedBlock extends Block {
public static final PropertyDirection FACING = PropertyDirection.create("facing");
public static final PropertyBool ENABLED = PropertyBool.create("enabled");
public StateTexturedBlock() {
super(Material.ROCK);
setUnlocalizedName(ModTut.MODID + ".statetexturedblock");
setRegistryName("statetexturedblock");
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 neighborChanged(IBlockState state, World world, BlockPos pos, Block blockIn, BlockPos p_189540_5_) {
int powered = world.isBlockIndirectlyGettingPowered(pos);
world.setBlockState(pos, state.withProperty(ENABLED, powered > 0), 3);
}
@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))
.withProperty(ENABLED, (meta & 8) != 0);
}
@Override
public int getMetaFromState(IBlockState state) {
return state.getValue(FACING).getIndex() + (state.getValue(ENABLED) ? 8 : 0);
}
@Override
protected BlockStateContainer createBlockState() {
return new BlockStateContainer(this, FACING, ENABLED);
}
}
А вот и состояние блока в .json файле (blockstates/statetexturedblock.json). Здесь вы видите, как мы меняем переднюю текстуру, когда свойство
enabled
имеет значение true
. Это работает, потому что в нашем файле модели (см. ниже) мы добавили параметр #front
для одной из текстур:
statetexturedblock.json:
{
"forge_marker": 1,
"defaults": {
"model": "modtut:statetexturedblock",
"textures": {
"front": "modtut:blocks/statetexture_off"
}
},
"variants": {
"normal": [{}],
"inventory": [{}],
"facing": {
"north": {},
"south": {"y": 180},
"west": {"y": 270},
"east": {"y": 90},
"up": {"x": -90},
"down": {"x": 90}
},
"enabled": {
"false": {},
"true": {
"textures": {
"front": "modtut:blocks/statetexture_on"
}
}
}
}
}
Наконец нам нужен файл модели (models/block/statetexturedblock.json). Текстура
north
определяется параметром #front
, который указан в .json файле состояния блока:
statetexturedblock.json:
{
"parent": "block/cube",
"textures": {
"particle": "modtut:blocks/statetexture",
"down": "modtut:blocks/statetexture",
"up": "modtut:blocks/statetexture",
"east": "modtut:blocks/statetexture",
"west": "modtut:blocks/statetexture",
"north": "#front",
"south": "modtut:blocks/statetexture"
}
}