Résolu Probleme de touche
-
Bonjour, je suis entrain de faire un mod avec des actions de touche, et je voudrais savoir si c’est possible de faire en sorte que même si un gui est ouvert la touche sois pris en compte du genre comme le F2 pour le screen, ? j’ai regarder dans le code mais ça ne marche pas chez moi, une solutions ?
-
Le fait qu’un gui soit ouverte n’est pas sensé bloquer les touches si ?
En tout cas l’event de tick fonctionne toujours donc … -
apparemment si, j’ai fait des test, genre ecrire dans le chat “salut” quand on appui sur la touche U par exemple ça marche sauf quand on es dans l’inventaire. et pour l’event de tick il y a moyen de tout modifier pour quelque sois le gui d’ouvert ?
-
Envoies ton code. Car j’ai vérifiés la touche screenshot n’utilise rien de spécial.
-
public ClientProxy() { FMLCommonHandler.instance().bus().register(this); keyScreen = new KeyBinding("Screen", Keyboard.KEY_U, "Ushare"); keyGui = new KeyBinding("Gui", Keyboard.KEY_Y, "Ushare"); ClientRegistry.registerKeyBinding(keyScreen); ClientRegistry.registerKeyBinding(keyGui); } @SubscribeEvent public void onEvent(KeyInputEvent event) { int i = Keyboard.getEventKey() == 0 ? Keyboard.getEventCharacter() : Keyboard.getEventKey(); Minecraft mc = Minecraft.getMinecraft(); if (i != 0 && !Keyboard.isRepeatEvent()) { if (!(mc.currentScreen instanceof GuiControls) || ((GuiControls)mc.currentScreen).time <= mc.getSystemTime() - 20L) { if (Keyboard.getEventKeyState()) { if(i == keyScreen.getKeyCode()) { SendFile sfile = new SendFile("sendfile"); sfile.start() } } } } }
J’ai tester plusieurs de façon, mais là j’ai essayer d’un peut copier coller ce que mojang avais fait pour leurs screnshot
-
Mets un System.out.println dans ta fonction pour vérifier que la méthode est bien appelée, je pense qu’il y a un problème dans tes conditions.
-
Peut etre pour la condition oui, mais je ne vois pas ou mais j’avais déjà mis un system.out avant mais je l’ai enlever je ne sais pas pourquoi ^^’
-
Tu peux les remettre, çà prend 2 secondes…
-
j’ai remis c’est bon, mais ça m’aide toujours pas
-
Envoie ton code avec les System.out.print et dit nous ce que tu vois dans les logs lorsque tu appuies sur ta touche.
-
@SubscribeEvent public void onEvent(KeyInputEvent event) { int i = Keyboard.getEventKey() == 0 ? Keyboard.getEventCharacter() : Keyboard.getEventKey(); Minecraft mc = Minecraft.getMinecraft(); if(i == keyScreen.getKeyCode()) { System.out.println("ok!"); } if (i != 0 && !Keyboard.isRepeatEvent()) { if (!(mc.currentScreen instanceof GuiControls) || ((GuiControls)mc.currentScreen).time <= mc.getSystemTime() - 20L) { if (Keyboard.getEventKeyState()) { if(i == keyScreen.getKeyCode()) { System.out.println("ok"); // SendFile sfile = new SendFile("sendfile"); // sfile.start(); } } } } }
Voilà j’ai fais deux test, et dans aucun des deux cas, quand je suis dans mon inventaire ça n’écrit ok ou ok! dans la console
-
Et comme ça :
@SubscribeEvent public void onEvent(KeyInputEvent event) { System.out.println("debug 1"); int i = Keyboard.getEventKey() == 0 ? Keyboard.getEventCharacter() : Keyboard.getEventKey(); Minecraft mc = Minecraft.getMinecraft(); if(i == keyScreen.getKeyCode()) { System.out.println("debug 2"); } if (i != 0 && !Keyboard.isRepeatEvent()) { System.out.println("debug 3"); if (!(mc.currentScreen instanceof GuiControls) || ((GuiControls)mc.currentScreen).time <= mc.getSystemTime() - 20L) { System.out.println("debug 4"); if (Keyboard.getEventKeyState()) { if(i == keyScreen.getKeyCode()) { System.out.println("debug 5"); // SendFile sfile = new SendFile("sendfile"); // sfile.start(); } } } } }
?
-
ça va jusqu’au 5 quand je ne suis dans aucun gui, mais quand je suis dans un gui, rien ne fonctionne
-
J’ai regardé ou était déclenché l’event en question, mais je n’ai pas trouvé ce qui fait qu’il ne s’exécute pas quand tu es dans un gui.
J’ai trouvé ça :if (this.currentScreen != null) { this.currentScreen.handleKeyboardInput(); }
Mais il n’y a rien qui l’arrête après. En revanche dans GuiScreen.handleKeyboardInput() la fonction Minecraft.dispatchKeypresses() est appelé, et c’est elle qui gère la touche échap, F2, etc … (les touches qu’on peut faire dans un gui).
Donc tu avais raison, il semble bien que l’event ne se déclenche pas lorsqu’on est dans un gui.
Du-coup utilise plutôt l’event de tick (celui de rendu ou du joueur, peu importe). par contre si tu utilise celui du rendu pense bien à vérifier Minecraft.getMinecraft().theWorld ne soit pas null, sinon tu risque d’avoir des mauvaises surprise (du genre crash du jeu lorsqu’on est sur le menu est qu’on appuie sur la touche). -
ok je vais regarder merci !
-
C’est bon affaire résolu, j’ai juste un petit problème de spam dans la console, mais je réglerais ça
-
Bon je dois avoir un gros probleme niveau algo, j’ai trouver une procédure qui permet d’executer uniquement une action, mais ça ne marche plus quand un gui est ouvert
@SubscribeEvent public void onPlayerTick(PlayerTickEvent event) { int i = Keyboard.getEventKey() == 0 ? Keyboard.getEventCharacter() : Keyboard.getEventKey(); if (!(mc.currentScreen instanceof GuiControls) || ((GuiControls)mc.currentScreen).time <= Minecraft.getSystemTime() - 20L) { if (Keyboard.getEventKeyState()) { if(i == keyScreen.getKeyCode()) { if(keyScreen.isPressed()) { System.out.println("OK"); } //SendFile sfile = new SendFile("sendfile"); //sfile.start(); } } } }
isPressed marche uniquement quand je ne suis pas dans un gui, sinon il ne marche pas, et je ne vois pas comment faire, juste pour executer une action
-
Oui car tu utilises le PlayerTick event, or certains Gui mettent en pause le jeu, donc à ce moment là le tickEvent n’est plus exécuté, utilises le ClientTickEvent (penses aussi à préciser si c’est le post ou le pre, avant ou après que le cleint fasses le tick, çà évite que la méthode soit appelée 2 fois par tick)
-
C’est bien les PHASE qui permete de déterminer non ?
if(event.phase == Phase.START)
?
-
Oui. Il y a toujours de phase de tick, au début et à la fin.