Vous saurez après avoir lu ce petit tuto comment créer vos touches personalisées et comment les gérer
Bug de la 1.7.2: Si jamais le joueur modifie les touches, elles ne sont pas enregistrées. C’est un bug dû à Minecraft (source) et j’espère qu’il sera corrigé rapidement.
En attendant, il faudra mettre dans votre fichier de configuration la touche à utiliser…
Sommaire
- Création d’une nouvelle touche
- Gestion de la touche
- Localization
Création d’une nouvelle touche
ProxyClient.java
package test;
import org.lwjgl.input.Keyboard;
import cpw.mods.fml.client.registry.ClientRegistry;
import net.minecraft.client.settings.KeyBinding;
public class ProxyClient
{
private static KeyBinding keyBindTest;
public ProxyClient()
{
keyBindTest = new KeyBinding("modtest.key", Keyboard.KEY_T, "key.categories.gameplay");
ClientRegistry.registerKeyBinding(keyBindTest);
}
}
Explications:
Les contrôles ne sont disponibles que du côté client, donc il s’agit là de la classe client de votre proxy.
Et puis on voit rarement un proxy serveur s’appeler ProxyClient.
Voici le constructeur de KeyBinding:
KeyBinding(String description, int keyId, String category);
description: C’est le texte à afficher dans le gui des contrôles. Vous devrez l’ajouter dans votre fichier de langue.
keyId: ID de la touche de l’api LWJGL. Liste complète des touches disponibles
Pour vous, il vaut mieux prendre une constante de la classe Keyboard, pour mieux expliciter le code. Vous pouvez aussi directement saisir la valeur de la touche (pas conseillé…)
category: catégorie à laquelle appartient votre nouvelle touche. Les catégories disponibles sont les mêmes que dans le Gui des contrôles, soit:
- key.categories.movement (“mouvement”)
- key.categories.inventory
- key.categories.gameplay
- key.categories.multiplayer ("multijoueur)
- key.categories.misc (“utilitaires”, par exemple prendre un screenshot)
J’ai décidé de mettre la nouvelle touche dans la catégorie gameplay, car elle servira à… afficher un message dans le chat. Oui c’est tout
Vous savez maintenant ajouter une touche au GUI des touches !
C’est bien, mais on va voir comment l’utiliser.
Gestion de la touche
Il faudra traiter un évènement de FML pour vérifier si la touche est enfoncée ou non.
Rajoutez déjà dans le constructeur de votre ProxyClient:
FMLCommonHandler.instance().bus().register(this);
Vous allons traiter l’évènement KeyInputEvent, qui est en fait un simple tick Minecraft.
Comment savoir si une KeyBinding est enfoncée ?
Il existe deux méthodes qui ont chacun leur utilité.
final boolean hasBeenPressed = keyBindTest.isPressed();
final boolean pressed = keyBindTest.getIsKeyPressed();
La première méthode vérifie si la touche vient d’être appuyée. Même si le joueur laisse la touché enfoncé, la méthode ne renverra true qu’une seul fois par appui.
La seconde vérifie si la touche est en train d’être appuyée, c’est à dire qu’elle renverra true tant que le joueur laisse la touche enfoncé. C’est l’option à choisir si vous voulez créer une touche de mouvement par exemple. Dans notre cas, pour un message dans le chat, nous ne sommes pas des floodeurs donc nous allons préférer la première option.
@SubscribeEvent
public void onEvent(KeyInputEvent event)
{
// Si vous remplacez isPressed() par getIsKeyPressed()
// Le chat sera inondé à chaque fois que vous presserez la touche
if(keyBindTest.isPressed())
{
keyTestTyped(); // Traitement de la touche
}
}
private void keyTestTyped()
{
// La touche vient d'être appuyé !!
Minecraft.getMinecraft().thePlayer.addChatComponentMessage(new ChatComponentText("lol, it works"));
}
ProxyClient.java
package test;
import net.minecraft.client.Minecraft;
import net.minecraft.client.settings.KeyBinding;
import net.minecraft.util.ChatComponentText;
import org.lwjgl.input.Keyboard;
import cpw.mods.fml.client.registry.ClientRegistry;
import cpw.mods.fml.common.FMLCommonHandler;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import cpw.mods.fml.common.gameevent.InputEvent.KeyInputEvent;
public class ProxyClient
{
private static KeyBinding keyBindTest;
public ProxyClient()
{
FMLCommonHandler.instance().bus().register(this);
keyBindTest = new KeyBinding("modtest.key", Keyboard.KEY_T, "key.categories.gameplay");
ClientRegistry.registerKeyBinding(keyBindTest);
}
@SubscribeEvent
public void onEvent(KeyInputEvent event)
{
if(keyBindTest.isPressed())
{
keyTestTyped();
}
}
private void keyTestTyped()
{
Minecraft.getMinecraft().thePlayer.addChatComponentMessage(new ChatComponentText("lol, it works"));
}
}
Localization
Rajoutez enfin dans votre fichier de localization:
en_US.lang
modtest.key="Afficher un message utile dans le chat"
Fin du tutoriel