Призначення клавіш 26.2
Створення призначень клавіш та реагування на них.
Minecraft обробляє введення користувачами з периферійних пристроїв, таких як клавіатура та миша, використовуючи призначення клавіш. Багато з цих призначень клавіш можна налаштувати через меню налаштувань.
За допомогою Fabric API ви можете створювати власні користувацькі призначення клавіш і реагувати на них у своєму моді.
Призначення клавіш існують лише на стороні клієнта. Це означає, що реєстрація та реакція на призначення клавіш має виконуватися на стороні клієнта. Для цього можна використовувати ініціалізатор клієнта.
Створення призначень клавіш
Призначення клавіш складається з двох частин: призначення ключа та категорії, до якої воно належить.
Почнімо зі створення категорії. Категорія визначає групу призначень клавіш, які видно в меню налаштувань.
java
KeyMapping.Category CATEGORY = KeyMapping.Category.register(
ExampleMod.id("custom_category")
);1
2
3
2
3
Далі, ми маємо створити призначення клавіші. Ми будемо використовувати API Fabric KeyMappingHelper, щоб одночасно зареєструвати наше призначення клавіш.
java
KeyMapping sendToChatKey = KeyMappingHelper.registerKeyMapping(
new KeyMapping(
"key.example-mod.send_to_chat", // The translation key for the key mapping.
InputConstants.Type.KEYSYM, // The type of the keybinding; KEYSYM for keyboard, MOUSE for mouse.
InputConstants.KEY_J, // The keycode of the key.
this.CATEGORY // The category of the mapping.
));1
2
3
4
5
6
7
2
3
4
5
6
7
INFO
Зауважте, що назви маркерів ключів (InputConstants.KEY_*) припускаються стандартному макету США.
Це означає, що якщо ви використовуєте розкладку AZERTY, натискання клавіші A дасть InputConstants.KEY_Q.
Закріплені клавіші також можна створити за допомогою KeyMappingHelper, передавши екземпляр ToggleKeyMapping замість KeyMapping.
Після реєстрації ви зможете знайти призначення клавіші у Налаштування > Керування > Призначення клавіш.

Переклад
Вам потрібно буде надати переклади як для призначення, так і для категорії.
Ключ перекладу імені категорії приймає форму key.category.<namespace>.<path>. Ключ перекладу призначення клавіші буде тим, який ви надали під час створення призначення.
Переклади можна додати вручну або за допомогою генерації даних.
json
{
"key.category.example-mod.custom_category": "Example Mod Custom Category",
"key.example-mod.send_to_chat": "Send to Chat"
}1
2
3
4
2
3
4

Дія призначення клавіші у світі
Тепер, коли ми маємо призначення клавіш, ми можемо запускати дію прямо в ігровому процесі, використовуючи подію клієнтського такту:
java
ClientTickEvents.END_CLIENT_TICK.register(client -> {
while (this.sendToChatKey.consumeClick()) {
if (client.player == null) return;
client.player.sendSystemMessage(Component.literal("Key press detected in the world"));
}
});1
2
3
4
5
6
7
2
3
4
5
6
7
Це виводитиме повідомлення «Key press detected in the world» у внутрішньоігровий чат щоразу, коли натискається призначена клавіша. Майте на увазі, що утримування клавіші призведе до повторного друку повідомлення в чаті, тому ви можете застосувати запобіжники, якщо ця логіка має спрацювати лише один раз.

Дія призначення клавіші в інтерфейсі
Ми також можемо запускати дію у межах екранів — як коли світ відкрито, так і коли ні.
java
ScreenEvents.BEFORE_INIT.register((client, screen, scaledWidth, scaledHeight) -> {
if (!(screen instanceof CreativeModeInventoryScreen) && !(screen instanceof TitleScreen)) {
return;
}
ScreenKeyboardEvents.beforeKeyPress(screen).register((s, keyEvent) -> {
if (!this.sendToChatKey.matches(keyEvent)) return;
this.handleKeyPressInMainScreen(client);
this.handleKeyPressInGameScreen(client);
});
});1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
І додайте два обробники:
java
private void handleKeyPressInMainScreen(Minecraft client) {
if (client.player != null) return;
ExampleMod.LOGGER.info("Key press detected in the title screen");
}
private void handleKeyPressInGameScreen(Minecraft client) {
if (client.player == null) return;
client.player.sendSystemMessage(Component.literal("Key press detected in the GUI with a world open, closing screen"));
client.gui.setScreen(null);
}1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
Це перевіряє, чи є поточний екран TitleScreen або CreativeModeInventoryScreen. Якщо це так, ми реалізуємо дві різні моделі поведінки залежно від того, перебуваємо ми всередині світу чи за його межами:
- Коли гравець перебуває поза межами світу — тобто коли не існує сутності гравця,— у консоль виводиться повідомлення «Key press detected in the title screen».
- В іншому разі, якщо натиснути клавішу під час перебування у світі, у внутрішньоігровий чат надсилається повідомлення «Key press detected in the GUI with a world open, closing screen», а екран закривається.
INFO
Друге повідомлення «Key press detected in the world» надсилається в чат через попередньо зареєстрований слухач події clientTickEvents.
TIP
У режимі виживання screen буде екземпляром InventoryScreen, тоді як у творчості це буде CreativeModeInventoryScreen.
За потреби ви можете видалити перевірку screen instanceof, щоб прив'язати слухач подій до всіх екранів.



