🇺🇦 Українська (Ukrainian - Ukraine)
🇺🇦 Українська (Ukrainian - Ukraine)
Зовнішній вигляд
🇺🇦 Українська (Ukrainian - Ukraine)
🇺🇦 Українська (Ukrainian - Ukraine)
Зовнішній вигляд
Ця сторінка написана для версії:
1.21.4
Стан блоку — це частина даних, що прикріплюється до окремого блоку у світі Minecraft та містить інформацію про блок у вигляді властивостей. Ось кілька прикладів властивостей, які в стандартній версії гри зберігаються в станах блоків:
Ви, напевно, розумієте чому вони корисні - вони уникають необхідності зберігати дані NBT дані у блоковій сутності - зменшуючи розмір світу, та запобігаючи проблемам із TPS!
Ви, напевно, розумієте чому вони корисні - вони уникають необхідності зберігати дані NBT дані у блоковій сутності - зменшуючи розмір світу, та запобігаючи проблемам із TPS!
Minecraft має деякі користувальницькі класи, які дозволять вам швидко створити певні типи блоків - в цьому прикладі розглядається створення блоку з властивістю axios
шляхом створення блоку "Condensed Oak Log".
Minecraft має деякі користувальницькі класи, які дозволять вам швидко створити певні типи блоків - в цьому прикладі розглядається створення блоку з властивістю axios
шляхом створення блоку "Condensed Oak Log".
public static final Block CONDENSED_OAK_LOG = register(
"condensed_oak_log",
PillarBlock::new,
AbstractBlock.Settings.create().sounds(BlockSoundGroup.WOOD),
true
);
Блоки колон мають дві текстури, верхню та бічну - вони використовують модель block/cube_column
.
Блоки колон мають дві текстури, верхню та бічну - вони використовують модель block/cube_column
.
Як і зазвичай, з усіма текстурами блоків, текстури можна знайти в assets/mod-id/textures/block
condensed_oak_log_horizontal.json
, який розширює модель block/cube_column_horizontal
.condensed_oak_log.json
, який розширює модель block/cube_column
.Приклад файлу condensed_oak_log_horizontal.json
:
{
"parent": "minecraft: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/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 — Моделі (Стани блоків).
Далі нам потрібно створити файл стану блоку, і саме тут відбувається магія. Блоки стовпів мають три осі, тому ми будемо використовувати конкретні моделі для таких ситуацій:
axis=x
– коли блок розміщено вздовж осі X, ми повертатимемо модель у позитивному напрямку X.axis=y
– коли блок розміщено вздовж осі Y, ми будемо використовувати звичайну вертикальну модель.axis=z
– коли блок розміщується вздовж осі Z, ми повертаємо модель у позитивний X.{
"variants": {
"axis=x": {
"model": "fabric-docs-reference:block/condensed_oak_log_horizontal",
"x": 90,
"y": 90
},
"axis=y": {
"model": "fabric-docs-reference:block/condensed_oak_log"
},
"axis=z": {
"model": "fabric-docs-reference:block/condensed_oak_log_horizontal",
"x": 90
}
}
}
Як завжди, вам потрібно буде створити переклад для свого блоку та модель предмета, яка є батьками будь-якої з двох моделей.
У цьому прикладі буде створено унікальну логічну властивість під назвою activated
- коли гравець натискає ПКМ по блоку, він змінюватиме значення activated=false
на activated=true
, відповідно змінюючи свою текстуру.
У цьому прикладі буде створено унікальну логічну властивість під назвою activated
- коли гравець натискає ПКМ по блоку, він змінюватиме значення activated=false
на activated=true
, відповідно змінюючи свою текстуру.
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));
}
У цьому прикладі змінюється логічна властивість 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;
}
}
Перед створенням файлу стану блоку вам потрібно буде надати текстури як для активованого, так і для деактивованого станів блоку, а також для моделі блоку.
Використовуйте свої знання про моделі блоків, щоб створити дві моделі для блоку: одну для активованого стану та одну для деактивованого стану. Зробивши це, ви можете розпочати створення файлу стану блоку.
Якщо у вас є кілька властивостей у блоці, вам потрібно врахувати всі можливі комбінації. Наприклад, activated
і axis
призведе до 6 комбінацій (два можливі значення для activated
і три можливі значення для axis
).
Оскільки ви створили нову властивість, вам потрібно буде оновити файл стану блоку для врахування цієї властивості.
{
"multipart": [
{
"apply": {
"model": "fabric-docs-reference:block/prismarine_lamp_on"
},
"when": {
"activated": "true"
}
},
{
"apply": {
"model": "fabric-docs-reference:block/prismarine_lamp"
},
"when": {
"activated": "false"
}
}
]
}
TIP
Не забудьте додати опис моделі предмета для блоку, щоб він показувався в інвентарі!
Оскільки прикладом блоку є лампа, нам також потрібно змусити її випромінювати світло, коли властивість 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(
"prismarine_lamp",
PrismarineLampBlock::new,
AbstractBlock.Settings.create()
.sounds(BlockSoundGroup.LANTERN)
.luminance(PrismarineLampBlock::getLuminance),
true
);
Коли ви все завершите, кінцевий результат має виглядати приблизно так: