Probleme de touche
-
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.
-
Ca limite effictement le System.out.println() mais quand on laisse appuyer ça continue quand meme, et ça m’envoie toujours deux par deux mais avec un lapse de temps plus grand ;/
:::
@SubscribeEvent public void onClientTickEvent(ClientTickEvent event) { int i = Keyboard.getEventKey() == 0 ? Keyboard.getEventCharacter() : Keyboard.getEventKey(); if(event.phase == Phase.START) { if (!(mc.currentScreen instanceof GuiControls) || ((GuiControls)mc.currentScreen).time <= Minecraft.getSystemTime() - 20L) { if (Keyboard.getEventKeyState()) { if(i == keyScreen.getKeyCode()) { System.out.println("OK"); //SendFile sfile = new SendFile("sendfile"); //sfile.start(); } } } } }:::
-
Oui car ClientTickEvent n’est pas prévu pour cette usage à la base …
Sur un des mods que je dev avec Kévin on fait comme ça :
https://github.com/FFMT/nanotech_mod/blob/master/common/fr/mcnanotech/kevin_68/nanotechmod/ultimategravisuite/client/UGSClientEventHandler.java#L20-L24
https://github.com/FFMT/nanotech_mod/blob/master/common/fr/mcnanotech/kevin_68/nanotechmod/ultimategravisuite/client/UGSKeyboardClient.java#L30-L36
En fait on enregistre dans une variable quelle touche ont été pressé au tick précédent, et donc si la touche a déjà été appuyé en envoie pas le packet (et après le reste est géré côté serveur). Tu devrais utiliser ce même principe, vérifier que la touche a déjà été pressé au tick précédent et si oui ne rien faire. -
OK, je vais y jeté un œil merci :D___humm ça limite (même si ça s’envoie toujours pas paire, une fois qu’on appuie, mais du coup ça ne marche toujours pas dans une interface___ça fonctionne mais pas dans les interfaces

-
Toujours pas ? Pas possible, ClientTickEvent est appelé à chaque tick …
-
bha …. j’ai l’impressions que le isPressed marche pas quand le gui est ouvert.
public class ClientProxy extends CommonProxy{ public static KeyBinding keyScreen; private int lastKeyState = 0; public ClientProxy() { FMLCommonHandler.instance().bus().register(this); keyScreen = new KeyBinding("Screen", Keyboard.KEY_U, "Ushare"); ClientRegistry.registerKeyBinding(keyScreen); } @SubscribeEvent public void onClientTickEvent(ClientTickEvent event) { if(event.phase == Phase.END) { sendKeyUpdate(); //SendFile sfile = new SendFile("sendfile"); //sfile.start(); } } public void sendKeyUpdate() { int currentKeyState = (keyScreen.isPressed() ? 1 : 0) << 0; if(currentKeyState != this.lastKeyState) { lastKeyState = currentKeyState; System.out.println("ok"); } } }