Перейти к содержанию

Состояние блока#

Что такое Blockstates или же по простому состояние блоков? Данный термин появился в 1.8, состояние блоков позволяет задать определённый параметр блоку, при достижении которого, блок будет менять свою модель. Примером могут послужить: пшеница, датчик дневного света, калитка, забор и т.д. У каждого из этих блоков есть свои состояния, которые применяются в тех или иных ситуациях, и о которых пойдёт речь в данной статье.

В игре существует только 3 типа состояний блоков: * PropertyBool - логический тип. Хранит в себе логические значения. * PropertyEnum - перечисляемый тип. Хранит в себе перечисляемые значения. * PropertyInteger - целочисленный тип. Хранит в себе числа от 0 до 2147483647. (знак минус применять не рекомендуется, так что весь счёт начинается от 0!)

PropertyBool#

Перейдём в ранее созданный класс BlockBestStone и создадим переменную PropertyBool типа.

public static final PropertyBool UPPER = PropertyBool.create("upper");

Добавим в конструктор стандартное значение для данной переменной.

this.setDefaultState(this.blockState.getBaseState().withProperty(UPPER, false));

Если хотим больше одного типа прописать, то делаем это так:

this.setDefaultState(this.blockState.getBaseState().withProperty(UPPER, false).withProperty(NEXT_TYPE, EnumType));

Давайте сделаем простой пример использования переменной PropertyBool. Добавим в класс нашего блока метод getActualState, getStateFromMeta, getMetaFromState.

@Override
public IBlockState getActualState(IBlockState state, IBlockAccess worldIn, BlockPos pos)
{
    Block block = worldIn.getBlockState(pos.up()).getBlock();
    return state.withProperty(UPPER, Boolean.valueOf(block != Blocks.AIR));
}

@Override
public IBlockState getStateFromMeta(int meta)
{
    return this.getDefaultState();
}

@Override
public int getMetaFromState(IBlockState state)
{
    return 0;
}

Зарегистрируем состояние блоков.

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

Перейдём в папку blockstates и откроем файл с названием нашего блока

{
    "variants": {
        "upper=false": { "model": "tut:best_stone" },
        "upper=true": { "model": "tut:best_stone_up" }
    }
}

Вы могли заметить, что вместо normal стоит наша переменная с двумя значениями true и false. А так же указаны модели для состояния upper=false и upper=true. Зайдём в игру и поставим на наши камни любой блок, откроем меню отладки на кнопку F3 и наведём на наш блок камней и увидим, что значение upper стоит на true.

PropertyEnum#

TODO

PropertyInteger#

TODO