Hallo Java-Community,
ich versuche einen Farm-Bot in Crossout für mich privat zu programmieren.
Ich möchte keinen Memmory-Scanner benutzen, um die Map oder Gegner zu finden.
Um trotzdem die Welt zu "sehen", macht das Programm Screenshots und sucht dann aus den Screenshots die Farbe Rot (R255, G0, B0) und gibt mir die Koordinaten von diesem Punkt aus. Das funktioniert auch und auch nicht mal langsam.
Die Tastatursteuerung und die Mausklicks übernimmt der Java Robot (java.awt.*).
Das Problem was ich jetzt habe ist, dass wenn ich den Befehl robot.mouseMove(x,y); ausführe, dass der Mauszeiger außerhalb des Spiels auf die gewünschte Koordinate geht, aber im Spiel macht er das nicht (Bei Minecraft ist das gleiche Problem). Ich vermute mal, das kommt weil der Desktop 2D ist und die beiden getesteten Spiele 3D sind. Man kann ja in den beiden Spielen unendlich lang die Maus nach links Bewegen.
Am besten wäre es, wenn man in Java eine virtuelle Maus erschaffen kann und diese dann eine links Bewegung machen lassen kann. Die virtuelle Maus gibt dann wie eine echte Maus diese Bewegung aus.
Simple gesagt robot.mouseMove(x,y); funktioniert für meinen Zweck nicht.
Im deutsch- und im englischsprachigen Raum benutzen alle im Grunde die mouseMove Methode und ich konnte nichts brauchbares finden. Das Einzige was ich als Information gefunden habe, war hier im Forum auf Minecraft bezogen (1) Minecraft Bot Mouse Inputs | Java - Hilfe | Java-Forum.org (java-forum.org) . In der ersten Antwort wird geschrieben, dass man zur Mausansteuerung in Minecraft die Klasse "org.lwjgl.input.Mouse" benutzen muss, weil Minecraft LWJGL benutzt.
Zum Thema habe ich das hier gefunden Mouse (LWJGL API). Kann mir jemand erklären, wie ich die Befehle von dieser Internetseite in mein Programm implementieren kann. Würde mir sehr weiterhelfen. Vielleicht funktioniert es ja dann mit dem LWJGL.
Oder wenn jemand andere Befehle kennt, wie die Maus in einem 3D Spiel korrekt funktioniert, bitte schreiben.
Hier mein bisheriger Code: (Hoffe ich habe es richtig eingefügt)
Zusätzlich: Weiß jemand vielleicht was die Befehle in Z.35 und Z.40 machen?
Schon mal vielen Dank im Voraus!
MFG
Heck
[CODE lang="java" title="Bot"]package bot;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import support.Console;
public class bot {
public static void main(String[] args) throws Exception {
int x = 0;
int y = 0;
Robot robot = new Robot();
robot.keyPress(KeyEvent.VK_ALT);
robot.keyPress(KeyEvent.VK_TAB);
robot.delay(100); // Mit diesem Block tabt das Programm in das nächste Fenster, in meinem Fall das Spiel.
robot.keyRelease(KeyEvent.VK_TAB);
robot.keyRelease(KeyEvent.VK_ALT);
robot.delay(100);
Rectangle captureSize = new Rectangle(2500,1000);
BufferedImage bufferedImage = robot.createScreenCapture(captureSize); // Hier macht er den Screenshot
BufferedImage img = bufferedImage;
int matchColor = Color.RED.getRGB();
int h = img.getHeight();
int w = img.getWidth();
// Set<Point> points = new HashSet<Point>(); // Weiß nicht was er hier macht, deswegen habe ich es auskommentiert
for(int i = 0 ; i < w ; i++) {
for(int j = 0 ; j < h ; j++) { // Hier sucht er nach dem roten Pixel auf dem Screenshot
if(img.getRGB(i, j) == matchColor) {
// points.add(new Point(i, j)); // Da soll er dann auf den roten Pixel drücken. Weiß aber nicht wie er das macht und habe es so auskommentiert
Console.println(i+" "+j); // Console.println(); ist das Gleiche wie System.out.println();
x = i;
y = j;
}
}
}
Console.println();
Console.println(); // Hier gibt er die Koordinaten in der Console aus
Console.println("Koordinaten");
Console.println("x = "+x+" y = "+y);
robot.mouseMove(x,y); // Hier bewegt er die Maus zu einem der roten Pixel Koordinaten
robot.mousePress(InputEvent.BUTTON1_DOWN_MASK); // Drückt die Maus und lässt sie nach 2000 Millisekunden wieder los
robot.delay(2000);
robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
robot.delay(4000); // Zeigt den Screenshot nach 4000 Millisekunden in einem JFrame aus
JLabel imageLabel = new JLabel(new ImageIcon(img));
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.add(imageLabel);
frame.pack();
frame.setVisible(true);
}
}[/CODE]
ich versuche einen Farm-Bot in Crossout für mich privat zu programmieren.
Ich möchte keinen Memmory-Scanner benutzen, um die Map oder Gegner zu finden.
Um trotzdem die Welt zu "sehen", macht das Programm Screenshots und sucht dann aus den Screenshots die Farbe Rot (R255, G0, B0) und gibt mir die Koordinaten von diesem Punkt aus. Das funktioniert auch und auch nicht mal langsam.
Die Tastatursteuerung und die Mausklicks übernimmt der Java Robot (java.awt.*).
Das Problem was ich jetzt habe ist, dass wenn ich den Befehl robot.mouseMove(x,y); ausführe, dass der Mauszeiger außerhalb des Spiels auf die gewünschte Koordinate geht, aber im Spiel macht er das nicht (Bei Minecraft ist das gleiche Problem). Ich vermute mal, das kommt weil der Desktop 2D ist und die beiden getesteten Spiele 3D sind. Man kann ja in den beiden Spielen unendlich lang die Maus nach links Bewegen.
Am besten wäre es, wenn man in Java eine virtuelle Maus erschaffen kann und diese dann eine links Bewegung machen lassen kann. Die virtuelle Maus gibt dann wie eine echte Maus diese Bewegung aus.
Simple gesagt robot.mouseMove(x,y); funktioniert für meinen Zweck nicht.
Im deutsch- und im englischsprachigen Raum benutzen alle im Grunde die mouseMove Methode und ich konnte nichts brauchbares finden. Das Einzige was ich als Information gefunden habe, war hier im Forum auf Minecraft bezogen (1) Minecraft Bot Mouse Inputs | Java - Hilfe | Java-Forum.org (java-forum.org) . In der ersten Antwort wird geschrieben, dass man zur Mausansteuerung in Minecraft die Klasse "org.lwjgl.input.Mouse" benutzen muss, weil Minecraft LWJGL benutzt.
Zum Thema habe ich das hier gefunden Mouse (LWJGL API). Kann mir jemand erklären, wie ich die Befehle von dieser Internetseite in mein Programm implementieren kann. Würde mir sehr weiterhelfen. Vielleicht funktioniert es ja dann mit dem LWJGL.
Oder wenn jemand andere Befehle kennt, wie die Maus in einem 3D Spiel korrekt funktioniert, bitte schreiben.
Hier mein bisheriger Code: (Hoffe ich habe es richtig eingefügt)
Zusätzlich: Weiß jemand vielleicht was die Befehle in Z.35 und Z.40 machen?
Schon mal vielen Dank im Voraus!
MFG
Heck
[CODE lang="java" title="Bot"]package bot;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import support.Console;
public class bot {
public static void main(String[] args) throws Exception {
int x = 0;
int y = 0;
Robot robot = new Robot();
robot.keyPress(KeyEvent.VK_ALT);
robot.keyPress(KeyEvent.VK_TAB);
robot.delay(100); // Mit diesem Block tabt das Programm in das nächste Fenster, in meinem Fall das Spiel.
robot.keyRelease(KeyEvent.VK_TAB);
robot.keyRelease(KeyEvent.VK_ALT);
robot.delay(100);
Rectangle captureSize = new Rectangle(2500,1000);
BufferedImage bufferedImage = robot.createScreenCapture(captureSize); // Hier macht er den Screenshot
BufferedImage img = bufferedImage;
int matchColor = Color.RED.getRGB();
int h = img.getHeight();
int w = img.getWidth();
// Set<Point> points = new HashSet<Point>(); // Weiß nicht was er hier macht, deswegen habe ich es auskommentiert
for(int i = 0 ; i < w ; i++) {
for(int j = 0 ; j < h ; j++) { // Hier sucht er nach dem roten Pixel auf dem Screenshot
if(img.getRGB(i, j) == matchColor) {
// points.add(new Point(i, j)); // Da soll er dann auf den roten Pixel drücken. Weiß aber nicht wie er das macht und habe es so auskommentiert
Console.println(i+" "+j); // Console.println(); ist das Gleiche wie System.out.println();
x = i;
y = j;
}
}
}
Console.println();
Console.println(); // Hier gibt er die Koordinaten in der Console aus
Console.println("Koordinaten");
Console.println("x = "+x+" y = "+y);
robot.mouseMove(x,y); // Hier bewegt er die Maus zu einem der roten Pixel Koordinaten
robot.mousePress(InputEvent.BUTTON1_DOWN_MASK); // Drückt die Maus und lässt sie nach 2000 Millisekunden wieder los
robot.delay(2000);
robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
robot.delay(4000); // Zeigt den Screenshot nach 4000 Millisekunden in einem JFrame aus
JLabel imageLabel = new JLabel(new ImageIcon(img));
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.add(imageLabel);
frame.pack();
frame.setVisible(true);
}
}[/CODE]