🇷🇺 Русский (Russian)
🇷🇺 Русский (Russian)
Внешний вид
🇷🇺 Русский (Russian)
🇷🇺 Русский (Russian)
Внешний вид
This page is written for:
1.21
This page is written for:
1.21
Состояния блока — это фрагмент данных, привязанный к одному блоку в мире Minecraft, содержащий информацию о блоке в виде свойств. Вот несколько примеров свойств, которые стандартный Minecraft хранит в состояниях блока:
Вы, вероятно, понимаете, почему они полезны — они позволяют избежать необходимости хранения данных NBT в сущности блока, что уменьшает размер мира и предотвращает проблемы с TPS!
Определения состояний блока можно найти в папке assets/<mod id here>/blockstates
.
Minecraft уже имеет несколько пользовательских классов, которые позволяют быстро создавать определенные типы блоков. Этот пример демонстрирует создание блока со свойством axis
на примере блока "Обтёсанная дубовая древесина".
Стандартный класс PillarBlock
позволяет размещать блоки вдоль осей X, Y или Z.
public static final Block CONDENSED_OAK_LOG = register(
new PillarBlock(
AbstractBlock.Settings.create()
.sounds(BlockSoundGroup.WOOD)
), "condensed_oak_log", true
);
ItemGroupEvents.modifyEntriesEvent(ModItems.CUSTOM_ITEM_GROUP_KEY).register((itemGroup) -> {
itemGroup.add(ModBlocks.CONDENSED_DIRT.asItem());
});
Колоновые блоки имеют две текстуры: верхнюю и боковую. Они используют модель block/cube_column
.
Как всегда, со всеми текстурами блоков, файлы текстур могут быть найдены в assets/<mod id here>/textures/block
Из-за того что колоновый блок имеет две позиции: горизонтальную и вертикальную, мы должны сделать два отдельных файла моделей:
condensed_oak_log_horizontal.json
, который дополняет модель block/cube_column_horizontal
.condensed_oak_log.json
, который дополняет модель block/cube_column
.Пример файла condensed_oak_log_horizontal.json
:
{
"parent": "block/cube_column_horizontal",
"textures": {
"end": "fabric-docs-reference:block/condensed_oak_log_top",
"side": "fabric-docs-reference:block/condensed_oak_log"
}
}
INFO
Remember, blockstate files can be found in the assets/<mod id here>/blockstates
folder, the name of the blockstate file should match the block ID used when registering your block in the ModBlocks
class. For instance, if the block ID is condensed_oak_log
, the file should be named condensed_oak_log.json
.
Для более подробного изучения всех доступных модификаторов в файле состояний блоков, ознакомьтесь со страницей Minecraft Wiki - Models (Block States).
Далее, нам нужно создать файл состояний блока. Файл состояний блока — это где происходит магия — колоновые блоки имеют три оси, поэтому мы будем использовать конкретные модели для следующих ситуаций:
axis=x
- Когда блок помещён вдоль оси X, мы повернём модель так, чтобы она была ориентирована в положительном направлении оси X.axis=y
- Когда блок помещён вдоль оси Y, мы будем использовать нормальную вертикальную модель.axis=z
- Когда блок помещён вдоль оси Z, мы повернём модель так, чтобы она была ориентирована в положительном направлении оси X.{
"variants": {
"axis=x": {
"model": "mod_id:block/condensed_oak_log_horizontal",
"x": 90,
"y": 90
},
"axis=y": {
"model": "mod_id:block/condensed_oak_log"
},
"axis=z": {
"model": "mod_id:block/condensed_oak_log_horizontal",
"x": 90
}
}
}
Как всегда, вам нужно создать перевод для вашего блока и модель предмета, которая будет наследовать одну из двух моделей.
Пользовательские состояния блока хороши если ваш блок имеет уникальные свойства. Иногда вы можете обнаружить, что ваш блок может использовать стандартные свойства.
Этот пример создаст уникальное boolean-свойство под названием activated
- когда игрок нажимает ПКМ на блок, состояние блока меняется с activated=false
на activated=true
- соответствующим образом меняя его текстуру.
Сначала вам нужно создать свойство — так как это булево значение, мы будем использовать метод BooleanProperty.of
.
public class PrismarineLampBlock extends Block {
public static final BooleanProperty ACTIVATED = BooleanProperty.of("activated");
}
Далее нам необходимо добавить свойство к менеджеру состояний блока в методе appendProperties
. Вам необходимо переопределить метод для доступа к конструктору:
@Override
protected void appendProperties(StateManager.Builder<Block, BlockState> builder) {
builder.add(ACTIVATED);
}
Вам также придется установить состояние по умолчанию для свойства activated
в конструкторе вашего пользовательского блока.
public PrismarineLampBlock(Settings settings) {
super(settings);
// Set the default state of the block to be deactivated.
setDefaultState(getDefaultState().with(ACTIVATED, false));
}
WARNING
Не забудьте зарегистрировать свой блок, используя пользовательский класс вместо Block
!
В этом примере булево свойство activated
инвертируется, когда игрок взаимодействует с блоком. Для этого мы можем переопределить метод onUse
:
@Override
protected ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, BlockHitResult hit) {
if (!player.getAbilities().allowModifyWorld) {
// Skip if the player isn't allowed to modify the world.
return ActionResult.PASS;
} else {
// Get the current value of the "activated" property
boolean activated = state.get(ACTIVATED);
// Flip the value of activated and save the new blockstate.
world.setBlockState(pos, state.with(ACTIVATED, !activated));
// Play a click sound to emphasise the interaction.
world.playSound(player, pos, SoundEvents.BLOCK_COMPARATOR_CLICK, SoundCategory.BLOCKS, 1.0F, 1.0F);
return ActionResult.SUCCESS;
}
}
Перед созданием файла состояния блока вам необходимо предоставить текстуры для активированного и деактивированного состояний блока, а также модель блока.
Используйте свои знания о моделях блоков, чтобы создать две модели блока: одну для активированного состояния и одну для деактивированного состояния. После этого можно приступать к созданию файла blockstate.
Поскольку вы создали новое свойство, вам необходимо обновить файл blockstate для блока, чтобы учесть это свойство.
Если в блоке имеется несколько свой блока, вам необходимо учитывать все возможные комбинации. Например, «activated» и «axis» приведут к 6 комбинациям (два возможных значения для «activated» и три возможных значения для «axis»).
Поскольку этот блок имеет только два возможных варианта, поскольку у него есть только одно свойство (activated
), JSON-код состояния блока будет выглядеть примерно так:
{
"variants": {
"activated=false": {
"model": "fabric-docs-reference:block/prismarine_lamp"
},
"activated=true": {
"model": "fabric-docs-reference:block/prismarine_lamp_on"
}
}
}
Поскольку пример блока представляет собой лампу, нам также необходимо заставить ее излучать свет, когда свойство activated
имеет значение true. Это можно сделать с помощью настроек блока, передаваемых конструктору при регистрации блока.
Вы можете использовать метод luminance
для установки уровня освещенности, излучаемой блоком. Мы можем создать статический метод в классе PrismarineLampBlock
для возврата уровня освещенности на основе свойства activated
и передать его как ссылку на метод luminance
:
public static int getLuminance(BlockState currentBlockState) {
// Get the value of the "activated" property.
boolean activated = currentBlockState.get(PrismarineLampBlock.ACTIVATED);
// Return a light level if activated = true
return activated ? 15 : 0;
}
public static final Block PRISMARINE_LAMP = register(
new PrismarineLampBlock(
AbstractBlock.Settings.create()
.sounds(BlockSoundGroup.LANTERN)
.luminance(PrismarineLampBlock::getLuminance)
), "prismarine_lamp", true
);
После того как вы все завершите, конечный результат должен выглядеть примерно так: