2016-08-09 54 views
1

Ich versuche, awt.Robot zu verwenden, um Maus- und Schlüsselereignisse programmgesteuert zu erstellen. Das Problem ist, dass Schlüsselereignisse schlecht oder nicht behandelt werden. Es gibt keine Fehlermeldung. Hier ist der Code:AWT mousePress() und keyPress() funktionieren nicht wie erwartet in Minecraft Forge

package com.ClCH38.CC_Macro.TDI; 

import java.awt.AWTException; 
import java.awt.Robot; 
import java.awt.event.KeyEvent; 
import java.awt.event.MouseEvent; 

public class Tdi { 

    Robot robot; 
    Tdi tdi; 

    public Tdi() { 
     try { 
      robot = new Robot(); 
     } catch (AWTException e) { 
      e.printStackTrace(); 
     } 
    } 

    public void directInputKey() { 
     try { 
      robot.keyPress(KeyEvent.VK_1); // Choose slot 1.    Work fine 
      Thread.sleep(50); 
      robot.keyRelease(KeyEvent.VK_1);// Needed to release key 
      Thread.sleep(50); 
      robot.keyPress(KeyEvent.VK_2); // Choose slot [email protected]    
       The item is put in hand, but slot 1 is seems always selected 
      Thread.sleep(50); 
      robot.keyRelease(KeyEvent.VK_2);// Needed to release key 
      Thread.sleep(50); 
      robot.keyPress(KeyEvent.VK_1); // Choose slot 1   Don’t change anything 
      Thread.sleep(50); 
      robot.keyRelease(KeyEvent.VK_1);// Needed to release key 
      Thread.sleep(50); 
      robot.keyPress(KeyEvent.VK_S); // Move player back  Don’t work 
      Thread.sleep(50); 
      robot.keyRelease(KeyEvent.VK_S);// Needed to release key 
      Thread.sleep(50); 
      robot.mousePress(MouseEvent.BUTTON3_DOWN_MASK);//    Place block 
      Thread.sleep(50); 
      robot.mouseRelease(MouseEvent.BUTTON3_DOWN_MASK); // mouse button 3 is for AWT mouse right button 
      Thread.sleep(50); 
      robot.mousePress(MouseEvent.BUTTON3_DOWN_MASK);//    Don’t work 
      Thread.sleep(50); 
      robot.mouseRelease(MouseEvent.BUTTON3_DOWN_MASK); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

Ich arbeite auf Mac OS 10.10.9, Java 8

Antwort

0

Forge nicht verarbeiten Drücken von Tasten und Mausereignisse leben.

Das Spiel läuft in "Ticks" 20 Mal pro Sekunde. Alle Interaktionen dazwischen werden in Puffern gehalten.

Ereignisse Maus aus org.lwjgl.input.Mouse;

Zum Beispiel abgerufen, was ich für Maus ist dies:

 if(this.isHoveringOverOptionsList) { 
      if (Mouse.isButtonDown(0)) 
       { 
       if(this.notThisTick == 0) { 
        this.notThisTick = 20; 
        this.handleClickOnQuestion(mouseX,mouseY); 
       } 
       } 
      else { 
       while (this.isHoveringOverOptionsList && Mouse.next()) 
       { 
        int scroll = Mouse.getEventDWheel(); 
        if (scroll != 0) 
        { 
         /** moderation is key **/ 
         if  (scroll > 0) scroll = -1; 
         else if (scroll < 0) scroll = 1; 
         this.scrollOptions(scroll); 
        } 
       } 
      } 
     } 

     if(this.isHoveringOverTextArea) { 
      if (Mouse.isButtonDown(0)) 
      { 
       if(this.notThisTick == 0) { 
        if(this.isHoveringOverLineDownButton) { 
         this.scroll(1); 
         this.notThisTick = 2; 
        } 
        if(this.isHoveringOverLineUpButton) { 
         this.scroll(-1); 
         this.notThisTick = 2; 
        } 
       } 
      } 

      else { 
       while (this.isHoveringOverTextArea && Mouse.next()) 
       { 
        int scroll = Mouse.getEventDWheel(); 
        if (scroll != 0) 
        { 
         /** moderation is key **/ 
         if  (scroll > 0) scroll = -1; 
         else if (scroll < 0) scroll = 1; 
         this.scroll(scroll); 
        } 
       } 
      } 
     } 

Also, was Sie ahve zu sehen, wie Sie benutzerdefinierte Elemente in die Maus-Puffer hinzufügen.

Für den Umgang mit Tastaturereignissen schlage ich vor, dass Sie sich GuiChat.java ansehen.

Es ist in der forgeSrc.jar in Ihrer Eclipse (wenn Sie Eclipse verwenden)

Sehen Sie, wo sie von ihrem Eingang zu lesen, und Ihre bufferend Eingang dort hinzuzufügen.

Verwenden Sie auch keine Threads! Feuern Sie einfach Ihre Veranstaltung im TickEvent

import net.minecraftforge.fml.common.gameevent.TickEvent; 
import net.minecraftforge.fml.common.gameevent.TickEvent.Phase; 
import net.minecraftforge.fml.common.gameevent.TickEvent.PlayerTickEvent; 
import net.minecraftforge.fml.common.gameevent.TickEvent.ServerTickEvent; 

public class EventHandlerWorld { 
    @SubscribeEvent 
    public void calculateAverageTickTime(ServerTickEvent event) { 
     if(event.phase == Phase.START) { 
      MinecraftServer x = FMLCommonHandler.instance().getMinecraftServerInstance(); 
     } 
    } 
} 
+0

Dies ist sehr interessant. Was mich aber interessiert, ist die Verwendung von AWT Robot keyPress und mousePress Methoden, um physikalische Eingaben zu simulieren. Bisher habe ich Erfolg mit anderen Apps wie TextEdit oder Page (mit Verzögerung Methode, um das erwartete Ergebnis zu bekommen), aber mit Minecraft, Verhalten ist völlig unerwartet. Es ist vielleicht mit der Tatsache verbunden, dass ich einen Mac benutze, da ich festgestellt habe, dass es Probleme mit AWT Robot auf solchen Maschinen geben könnte. Hast du eine Idee? –

+0

Und auch ich möchte Ereignisse an die Welt senden, nicht an eine GUI. Zu guter letzt bin ich nur am Einzelspielermodus interessiert. –

+0

AWT! = Lwjgl. Sie können diese beiden nicht austauschbar mischen. Wenn Sie sie an die Welt senden möchten, senden Sie auch Datenpakete vom Client an die Welt mit den entsprechenden Ereignissen ... http://greyminecraftcoder.blogspot.nl/2013/10/packets-from-client-to -server.html – Tschallacka