Probleme de touche
-
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"); } } } -
Sinon faut faire comme Minecraft :
public void dispatchKeypresses() { int i = Keyboard.getEventKey() == 0 ? Keyboard.getEventCharacter() : Keyboard.getEventKey(); if (i != 0 && !Keyboard.isRepeatEvent()) { if (!(this.currentScreen instanceof GuiControls) || ((GuiControls)this.currentScreen).time <= getSystemTime() - 20L) { if (Keyboard.getEventKeyState()) { if (i == this.gameSettings.keyBindStreamStartStop.getKeyCode()) { if (this.getTwitchStream().func_152934_n()) { this.getTwitchStream().func_152914_u(); } else if (this.getTwitchStream().func_152924_m()) { this.displayGuiScreen(new GuiYesNo(new GuiYesNoCallback() { private static final String __OBFID = "CL_00001852"; public void confirmClicked(boolean result, int id) { if (result) { Minecraft.this.getTwitchStream().func_152930_t(); } Minecraft.this.displayGuiScreen((GuiScreen)null); } }, I18n.format("stream.confirm_start", new Object[0]), "", 0)); } else if (this.getTwitchStream().func_152928_D() && this.getTwitchStream().func_152936_l()) { if (this.theWorld != null) { this.ingameGUI.getChatGUI().printChatMessage(new ChatComponentText("Not ready to start streaming yet!")); } } else { GuiStreamUnavailable.func_152321_a(this.currentScreen); } } else if (i == this.gameSettings.keyBindStreamPauseUnpause.getKeyCode()) { if (this.getTwitchStream().func_152934_n()) { if (this.getTwitchStream().isPaused()) { this.getTwitchStream().func_152933_r(); } else { this.getTwitchStream().func_152916_q(); } } } else if (i == this.gameSettings.keyBindStreamCommercials.getKeyCode()) { if (this.getTwitchStream().func_152934_n()) { this.getTwitchStream().func_152931_p(); } } else if (i == this.gameSettings.keyBindStreamToggleMic.getKeyCode()) { this.stream.func_152910_a(true); } else if (i == this.gameSettings.keyBindFullscreen.getKeyCode()) { this.toggleFullscreen(); } else if (i == this.gameSettings.keyBindScreenshot.getKeyCode()) // screenshot ici { this.ingameGUI.getChatGUI().printChatMessage(ScreenShotHelper.saveScreenshot(this.mcDataDir, this.displayWidth, this.displayHeight, this.framebufferMc)); } } else if (i == this.gameSettings.keyBindStreamToggleMic.getKeyCode()) { this.stream.func_152910_a(false); } } } } -
c’est ce que j’avais essayer de faire au début
-
Si tu utilises tickEvent + ces 3 conditions :
int i = Keyboard.getEventKey() == 0 ? Keyboard.getEventCharacter() : Keyboard.getEventKey(); if (i != 0 && !Keyboard.isRepeatEvent()) { if (!(this.currentScreen instanceof GuiControls) || ((GuiControls)this.currentScreen).time <= getSystemTime() - 20L) { if (Keyboard.getEventKeyState())- celle pour ta touche bien sûr
ça donne quoi ?
- celle pour ta touche bien sûr
-
ça marche mais ça spam toujours

-
Et avec un if(Keyboard.next()) en plus ?
-
ça ne marche plus apres je ne sais pas si ou il se trouve dans l’imbrication a de l’importance …
-
C’est bon affaire résulu, je bidouiller dans l’algo, j’ai trouver une solution merci pour votre aide !
-
Poste la solution au cas où quelqu’un en ait besoin

Sent from my GT-I9000 using Tapatalk 2