Tastenbelegung 26.2
Erstellen von Tastenbelegungen und darauf reagieren.
Minecraft verarbeitet Benutzereingaben von Peripheriegeräten wie Tastatur und Maus mithilfe von Tastenbelegungen. Viele dieser Tastenbelegungen können über das Einstellungsmenü konfiguriert werden.
Mit Hilfe der Fabric-API kannst du deine eigenen benutzerdefinierten Tastenbelegungen erstellen und in deinem Mod darauf reagieren.
Tastenbelegungen existieren nur auf der Client-Seite. Das bedeutet, dass die Registrierung und die Reaktion auf Tastenbelegungen auf der Client-Seite erfolgen sollten. Hierfür kannst du den Client-Initialisierer verwenden.
Erstellen einer Tastenbelegung
Eine Tastenbelegung besteht aus zwei Teilen: der Belegung einer Taste und der Kategorie, zu der sie gehört.
Lasst uns mit der Erstellung einer Kategorie beginnen. Eine Kategorie definiert eine Gruppe von Tastenbelegungen, die zusammen im Einstellungsmenü angezeigt werden.
java
KeyMapping.Category CATEGORY = KeyMapping.Category.register(
ExampleMod.id("custom_category")
);1
2
3
2
3
Als Nächstes können wir eine Tastenbelegung erstellen. Wir werden Fabric APIs KeyMappingHelper verwenden, um gleichzeitig unsere Tastenbelegung zu registrieren.
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
Beachte, dass die Namen der Tastentoken (InputConstants.KEY_*) von einem Standard-US-Layout ausgehen.
Das bedeutet, dass bei Verwendung eines AZERTY-Layouts das Drücken von A zu InputConstants.KEY_Q führt.
Klebrige Tasten können auch mit dem KeyMappingHelper erstellt werden, indem anstelle einer KeyMapping-Instanz eine ToggleKeyMapping-Instanz übergeben wird.
Sobald registriert, findest du Tastenbelegungen unter Optionen > Steuerung > Tastenbelegung.

Übersetzungen
Du musst sowohl für die Tastenbelegung als auch für die Kategorie Übersetzungen bereitstellen.
Der Übersetzungscode für den Kategorienamen hat die Form key.category.<namespace>.<path>. Der Schlüssel für die Schlüsselzuordnung ist derjenige, den du beim Erstellen der Schlüsselzuordnung angegeben hast.
Übersetzungen können manuell oder mithilfe der Datengenerierung hinzugefügt werden.
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

Reagieren auf Tastenbelegungen in der Welt
Da wir nun eine Tastenbelegung haben, können wir ein Client-Tick-Event verwenden, wenn wir während des Spiels darauf reagieren möchten:
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
Jedes Mal, wenn die zugewiesene Taste gedrückt wird, wird im Chat des Spiels die Nachricht "Key press detected in the world" angezeigt. Beachte, dass durch Gedrückthalten der Taste die Nachricht wiederholt im Chat angezeigt wird. Daher solltest du möglicherweise Schutzmaßnahmen implementieren, wenn diese Logik nur einmal ausgelöst werden soll.

Reagieren auf Tastenbelegungen im GUI
Wir können auch auf Tastenbelegungen innerhalb von Oberflächen reagieren, sowohl wenn eine Welt geöffnet ist als auch wenn sie geschlossen ist.
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
Und füge die zwei Handler hinzu:
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
Dies prüft, ob es sich bei der aktuellen Oberfläche um den TitleScreen oder den CreativeModeInventoryScreen handelt. Ist dies der Fall, implementieren wir zwei unterschiedliche Verhaltensweisen, je nachdem, ob wir uns innerhalb oder außerhalb einer Welt befinden:
- Befindet man sich außerhalb einer Welt, in anderen Worten, wenn keine Spieler-Entität vorhanden ist, wird die Meldung "Key press detected in the title screen" in die Konsole geloggt.
- Andernfalls, wenn die Taste in einer Welt gedrückt wird, wird die Meldung "Key press detected in the GUI with a world open, closing screen" an den Chat im Spiel gesendet und die Oberfläche geschlossen.
INFO
Die zweite Meldung "Key press detected in the world" wird aufgrund des zuvor registrierten Event-Listeners clientTickEvents an den Chat gesendet.
TIP
screen ist im Überlebensmodus eine Instanz von InventoryScreen, während es im Kreativmodus eine Instanz von CreativeModeInventoryScreen ist.
Bei Bedarf kannst du die Überprüfung screen instanceof entfernen, um den Event-Listener an alle Oberflächen anzuhängen.



