🇺🇦 Українська (Ukrainian - Ukraine)
🇺🇦 Українська (Ukrainian - Ukraine)
Зовнішній вигляд
🇺🇦 Українська (Ukrainian - Ukraine)
🇺🇦 Українська (Ukrainian - Ukraine)
Зовнішній вигляд
Ця сторінка написана для версії:
1.21.4
Ця сторінка написана для версії:
1.21.4
Стан блоку — це частина даних, що прикріплюється до окремого блоку у світі Minecraft та містить інформацію про блок у вигляді властивостей. Ось кілька прикладів властивостей, які в стандартній версії гри зберігаються в станах блоків:
Ви, напевно, розумієте чому вони корисні - вони уникають необхідності зберігати дані NBT дані у блоковій сутності - зменшуючи розмір світу, та запобігаючи проблемам із TPS!
Визначення станів блоку знаходиться у теці assets/<mod id here>/blockstates
.
Minecraft має деякі користувальницькі класи, які дозволять вам швидко створити певні типи блоків - в цьому прикладі розглядається створення блоку з властивістю axios
шляхом створення блоку "Condensed Oak Log".
Ванільний клас PillarBlock
дозволяє розміщувати блок по осях X, Y або Z.
public static final RegistryKey<Block> CONDENSED_OAK_LOG_KEY = RegistryKey.of(
RegistryKeys.BLOCK,
Identifier.of(FabricDocsReference.MOD_ID, "condensed_oak_log")
);
public static final Block CONDENSED_OAK_LOG = register(
new PillarBlock(
AbstractBlock.Settings.create()
.registryKey(CONDENSED_OAK_LOG_KEY)
.sounds(BlockSoundGroup.WOOD)
), CONDENSED_OAK_LOG_KEY, true
);
Блоки колон мають дві текстури, верхню та бічну - вони використовують модель 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
:
Not Found: /home/runner/work/fabric-docs/fabric-docs/reference/latest/src/main/resources/assets/fabric-docs-reference/models/block/condensed_oak_log_horizontal.json
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 — Моделі (Стани блоків).
Далі, ми повинні створити файл стану блоку У файлі blockstate відбувається магія — стовпові блоки мають три осі, тому ми використовуватимемо спеціальні моделі для таких ситуацій:
axis=x
– коли блок розміщено вздовж осі X, ми повертатимемо модель у позитивному напрямку X.axis=y
– коли блок розміщено вздовж осі Y, ми будемо використовувати звичайну вертикальну модель.axis=z
– коли блок розміщується вздовж осі Z, ми повертаємо модель у позитивний X.Not Found: /home/runner/work/fabric-docs/fabric-docs/reference/latest/src/main/resources/assets/fabric-docs-reference/blockstates/condensed_oak_log.json
Як завжди, вам потрібно буде створити переклад для свого блоку та модель предмета, яка є батьками будь-якої з двох моделей.
Спеціальні стани блоку чудові, якщо ваш блок має унікальні властивості - іноді ви можете виявити, що ваш блок може повторно використовувати ванілльні властивості.
У цьому прикладі буде створено унікальну логічну властивість під назвою 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;
}
}
Перед створенням файлу стану блоку вам потрібно буде надати текстури як для активованого, так і для деактивованого станів блоку, а також для моделі блоку.
Використовуйте свої знання про моделі блоків, щоб створити дві моделі для блоку: одну для активованого стану та одну для деактивованого стану. Зробивши це, ви можете розпочати створення файлу стану блоку.
Оскільки ви створили нову властивість, вам потрібно буде оновити файл стану блоку для врахування цієї властивості.
Якщо у вас є кілька властивостей у блоці, вам потрібно врахувати всі можливі комбінації. Наприклад, activated
і axis
призведе до 6 комбінацій (два можливі значення для activated
і три можливі значення для axis
).
Оскільки цей блок має лише два можливі варіанти, оскільки він має лише одну властивість («активовано»), стан блоку JSON виглядатиме приблизно так:
Not Found: /home/runner/work/fabric-docs/fabric-docs/reference/latest/src/main/resources/assets/fabric-docs-reference/blockstates/prismarine_lamp.json
Оскільки прикладом блоку є лампа, нам також потрібно змусити її випромінювати світло, коли властивість 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 RegistryKey<Block> PRISMARINE_LAMP_KEY = RegistryKey.of(
RegistryKeys.BLOCK,
Identifier.of(FabricDocsReference.MOD_ID, "prismarine_lamp")
);
public static final Block PRISMARINE_LAMP = register(
new PrismarineLampBlock(
AbstractBlock.Settings.create()
.registryKey(PRISMARINE_LAMP_KEY)
.sounds(BlockSoundGroup.LANTERN)
.luminance(PrismarineLampBlock::getLuminance)
), PRISMARINE_LAMP_KEY, true
);
Коли ви все завершите, кінцевий результат має виглядати приблизно так: