Рендер блока с разными состояниями

Перевод Рендер блока с разными состояниями

Версия(и) Minecraft
1.12.х
Источник
https://wiki.mcjty.eu/modding/index.php?title=Render_Block_State-1.12
В этом примере будет показано, как сделать так, чтобы лицевая панель блока зависела от сигнала красного камня. Здесь мы добавляем дополнительное свойство к нашему состоянию блока, которое говорит, включен ли блок (есть сигнал красного камня) или нет.
ouNhzQy.png

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"
  }
}
  • Like
Реакции: mousecray
Автор
Garik
Просмотры
1,804
Первый выпуск
Обновление
Оценка
4.00 звёзд 3 оценок

Другие ресурсы пользователя Garik

Последние рецензии

Зачем что-то объяснять? Скинул код, да и так сойдёт)
Грик вернулся! Хороший ресурс.
Сверху