Moorhuhn Pixel-Aimbot mit Robot Library

Mirana

Mitglied
Moinsen, um besser im programmieren zu werden suche ich mir immer wieder eigene kleine Projekte aus die mich interessieren, und da mich bots, scripts,cheats,hacks etc. immer sehr interessiert haben dachte ich mir ich fang mal mit einer ganz kleinen Version von so etwas an :D dafür habe ich mir die F2P Version von Moorhuhn runtergeladen. Mein Ansatz ist hier, dass ich eine Aimbot Klasse erstellt habe, diese hat die Methode findDuck(), die mit zwei verschachtelten for-loops jede x und y Koordinate des BufferedImage screenshot nach der gewünschten Pixelfarbe des Huhns sucht und den Punkt dann zurückgibt. dann gibt es noch die Methode aimAndShoot() und bewegt die Maus zum Punkt und drückt die linke Maustaste zum schießen.
in der Main-Class versuche ich dann den Aimbot mit F1 zu starten und mit F2 zu beenden. Leider passiert bei der ganzen Geschichte so gar nichts :D es ist kompilierbar aber es regt sich nichts


Java:
import java.awt.AWTException;
import java.awt.GraphicsEnvironment;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;

public class Aimbot implements KeyListener{
    Robot robot;
    Rectangle screenBounds;
    Point duckLocation;
    boolean running;
    public Aimbot() {
        try {
            robot = new Robot();
        } catch (AWTException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        // Bounds des primärbildschirms
        screenBounds = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice()
                .getDefaultConfiguration().getBounds();
    }

    private Point findDuck(BufferedImage screenshot) {
        int redThreshold = 147;
        int greenThreshold = 97;
        int blueThreshold = 32;
        Point duckLocation = new Point(-1, -1);

        while (duckLocation.x == -1 && duckLocation.y == -1) {
            // Pixel im Screenshot analysieren um die Position der Ente zu finden
            for (int y = 0; y < screenshot.getHeight(); y++) {
                for (int x = 0; x < screenshot.getWidth(); x++) {
                    int pixel = screenshot.getRGB(x, y);
                    int red = (pixel >> 16) & 0xff;
                    int green = (pixel >> 8) & 0xff;
                    int blue = pixel & 0xff;
                    if (red >= redThreshold && red <= 210 && green >= greenThreshold && green <= 120
                            && blue >= blueThreshold && blue <= 40) {
                        // Dieser Pixel ist die Ente
                        duckLocation = new Point(x, y);
                        break;
                    }
                }
            }

            if (duckLocation.x == -1 && duckLocation.y == -1) {
                // keine Ente gefunden
                robot.mouseMove(screenBounds.width, screenBounds.height/2);

                // neuen Screenshot erstellen
                screenshot = robot.createScreenCapture(screenBounds);
            }
        }

        // Punkt der Ente zurückgeben
        return duckLocation;
    }

    public void aimAndShoot() {
        // Screenshot machen
        BufferedImage screenshot = robot.createScreenCapture(screenBounds);

        // Ente im Screenshot finden mit der findDuck methode
        Point duckLocation = findDuck(screenshot);

        // Maus auf Duck bewegen
        robot.mouseMove(duckLocation.x, duckLocation.y);

        // Abschießen
        robot.mousePress(InputEvent.BUTTON1_DOWN_MASK);
        robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
    }
  
     @Override
      public void keyPressed(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_F1) {
          running = true;
        } else if (e.getKeyCode() == KeyEvent.VK_F2) {
          running = false;
        }
      }

      @Override
      public void keyReleased(KeyEvent e) {
        // Not used
      }

      @Override
      public void keyTyped(KeyEvent e) {
        // Not used
      }

}


Java:
import java.awt.AWTEvent;
import java.awt.event.AWTEventListener;
import java.awt.event.KeyEvent;

public class Main {
  Aimbot aimbot = new Aimbot();
  boolean aimbotActive = false;

  public static void main(String[] args) {
    Main mainClass = new Main();
    mainClass.startAimbot();
  }

  private void startAimbot() {
    AWTEventListener eventListener = new AWTEventListener() {
        @Override
        public void eventDispatched(AWTEvent event) {
          KeyEvent keyEvent = (KeyEvent) event;
          if (keyEvent.getID() == KeyEvent.KEY_PRESSED) {
            if (keyEvent.getKeyCode() == KeyEvent.VK_F1) {
              aimbotActive = true;
            } else if (keyEvent.getKeyCode() == KeyEvent.VK_F2) {
              aimbotActive = false;
            }
          }
        }
      };
      java.awt.Toolkit.getDefaultToolkit().addAWTEventListener(eventListener, AWTEvent.KEY_EVENT_MASK);

      while (true) {
        if (aimbotActive) {
          aimbot.aimAndShoot();
        }
      }
  }
}


viel musste ich mir durch googeln aneignen darum bin ich mir auch nicht sicher ob ich überhaupt die richtigen libraries verwende.. und ich merke gerade, dass ich sowohl in der Aimbot Klasse als auch in der Main Klasse einfügen wollte dass ich mit f1 starten und mit f2 stoppen kann


Mir gehts hauptsächlich darum dass mir jemand mit Erfahrung sagt ob die Vorgehensweise so okay ist und woran es scheitert :D
 
Zuletzt bearbeitet:

KonradN

Super-Moderator
Mitarbeiter
Und wieder eine nicht entsprechend markierte Antwort von ChatGPT...
Ja, ich denke, da war jemand so nett und wollte mir / uns nach der theoretischen Betrachtung der ChatGPT Thematik diese dann auch in der Praxis vorführen. Das hat uns die Möglichkeit gegeben, zu erkennen, wie schlecht das tatsächlich ist :)

Also immer positiv sehen :)
 

KonradN

Super-Moderator
Mitarbeiter
Das ist eigentlich eine gute Idee. Das kann man alles voll automatisieren!

Dann haben wir diverse AIs, die hier posten und sich gegenseitig antworten. Dann haben wir Zeit, uns in irgend einer Kneipe zu treffen. Und das jeden Tag, denn wie viel Zeit hätten wir dann um in einer Kneipe abzuhängen.

ChatGPT: Wo ist in München eine gute Kneipe?
 

KonradN

Super-Moderator
Mitarbeiter
ChatGPT:
In München gibt es viele großartige Kneipen. Hier ist eine Auswahl einiger beliebter Kneipen: Theresienwiese, Giesinger Bräu, Der Pschorr, Hofbräukeller, Zum Dürnbräu, Augustiner Bräu, Paulaner1516, Auslage Burger & Cocktail, Künstlerhaus Cafe Bar, Biersalon Vroni.
 

Mirana

Mitglied
Ja, die ChatGPT Antwort ist leider nicht sehr hilfreich, zumal ich die Anlaufstelle schon probiert habe.. 😅 und so ganz versteht die AI mein Problem leider nicht…

Könnte es vielleicht daran liegen dass meine Listener (F1 und F2 für Start stop) nicht in Moorhuhn funktionieren? Hab da was über ein JNativeHook gelesen für globale Listener


Und eigentlich habe ich gehofft dass ihr mir helft und euch nicht über ChatGPT ärgert :D vorallem Konrad du weißt doch gefühlt alles hier über Java :p
 

KonradN

Super-Moderator
Mitarbeiter
Ich bin mir nicht sicher, ob ich das Problem richtig verstanden habe. Das Problem ist - so ich dich richtig verstanden habe - dass es auf die Tasten keine Reaktion gibt.

Aber wenn da ein Moorhuhn Programm läuft, dann hast das ja den Fokus. Die MouseListener einer Programmes lösen nur aus, wenn da das Fenster auch den Fokus hat.

Wenn das schon das ganze Problem sein sollte, dann hilft ggf. auch schon https://github.com/kwhat/jnativehook
 

Mirana

Mitglied
Ich bin mir nicht sicher, ob ich das Problem richtig verstanden habe. Das Problem ist - so ich dich richtig verstanden habe - dass es auf die Tasten keine Reaktion gibt.

Aber wenn da ein Moorhuhn Programm läuft, dann hast das ja den Fokus. Die MouseListener einer Programmes lösen nur aus, wenn da das Fenster auch den Fokus hat.

Wenn das schon das ganze Problem sein sollte, dann hilft ggf. auch schon https://github.com/kwhat/jnativehook
Naja, mein Ansatz war dass ich extra die Listener für die Hotkeys gemacht habe damit ich in Eclipse auf run drücken kann, das Moorhuhnspiel öffne, es damit mein primary Screen ist und ich dann ingame F1 drücke damit es sich in Gang setzt, aber so absolut gar nichts passiert :p und da habe ich mich gefragt ob mein Ansatz ansonsten okay ist automatisch die Hähnchen abzuschießen

Das mit der JNativeHook Library Probier ich später mal sobald ich verstanden habe wie ich das Ding zu meinem Projekt hinzufüge :)
 

Mirana

Mitglied
UPDATE:

Bin soweit gut vorangekommen, ich habe nun ein weiteres Problem seit gestern abend welches ich nicht in den Griff bekomme :p
Java:
private Point findDuck(BufferedImage screenshot) {
       
        int redThreshold = 230;
        int greenThreshold = 0;
        int blueThreshold = 0;
       
        duckLocation = new Point(-1, -1);
       
        while (duckLocation.x == -1 && duckLocation.y == -1 && andereRichtung == false) {
            richtungAendern();
            if (duckLocation.x == -1 && duckLocation.y == -1 && andereRichtung == true) {
                moveMouseToLeft();
                 andereRichtung=false;
               
            }
            for (int y = 0; y < screenshot.getHeight(); y++) {
                for (int x = 0; x < screenshot.getWidth(); x++) {
                    int pixel = screenshot.getRGB(x, y);
                    int red = (pixel >> 16) & 0xff;
                    int green = (pixel >> 8) & 0xff;
                    int blue = pixel & 0xff;
                    if (red >= redThreshold && red <= 235 && green >= greenThreshold && green <= 0
                            && blue >= blueThreshold && blue <= 0) {
                        duckLocation = new Point(x, y);
                        break;
                    }
                }
            }

            if (duckLocation.x == -1 && duckLocation.y == -1) {
                robot.mouseMove(1700, 255);
               
                screenshot = robot.createScreenCapture(screenBounds);
               
            }
        }

        return duckLocation;
    }
Java:
    private void richtungAendern() {
        ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
        scheduler.schedule(new Runnable() {
            public void run() {
                andereRichtung = true;
             
    }
        }, 10, TimeUnit.SECONDS);
    }
   
    private void moveMouseToLeft() {
        for (int i = 1; i <= 15; i++) {
            robot.mouseMove(235, 255);
        }

    }


die Enten werden nun abgeknallt, der grast das Fenster ab und sucht die Enten, wenn er keine findet, bewegt sich die Maus nach rechts. Nach ca. 10 Sekunden ist er unten rechts stuck, dafür habe ich einen scheduled Task eingebaut. Dieser ist nur dafür da den Wert boolean andereRichtung nach 10 Sekunden in true zu ändern. Dann geschieht das hier "
if (duckLocation.x == -1 && duckLocation.y == -1 && andereRichtung == true) {
moveMouseToLeft();
andereRichtung=false;

}"

die Maus bewegt sich wieder schön nach links. andereRichtung habe ich wieder auf false gesetzt, damit er, nun wo der Bildschirm wieder auf der linken Seite ist, weitermachen kann sich durch die Enten zu ballern. Leider ist die Maus nach der Links-Bewegung oben links stuck und schießt ins Leere anstatt weiter Enten zu suchen . Ich denk mal es liegt daran, dass der scheduled Executor sehr oft ausgeführt wird und die Maus dann dementsprechend für immer in die Richtung geschoben wird - weiß aber gerade nicht ganz wie ich das beheben kann:p

TL;DR :

hier mein Problem als kurzes Video:
 
Zuletzt bearbeitet:

KonradN

Super-Moderator
Mitarbeiter
Dein Code ist sehr unübersichtlich und ich muss gestehen, dass ich da auch noch nicht wirklich den Sinn dahinter verstehe.

Unterteile den Code doch einfach ein bisschen mehr so dass man über die Methodennamen einfach verstehen kann, was Du da überhaupt treibst.

Beispiel: In zwei verschachtelten Schleifen prüfst Du die Pixel:
Java:
            for (int y = 0; y < screenshot.getHeight(); y++) {
                for (int x = 0; x < screenshot.getWidth(); x++) {
                    int pixel = screenshot.getRGB(x, y);
                    int red = (pixel >> 16) & 0xff;
                    int green = (pixel >> 8) & 0xff;
                    int blue = pixel & 0xff;
                    if (red >= redThreshold && red <= 235 && green >= greenThreshold && green <= 0
                            && blue >= blueThreshold && blue <= 0) {
                        duckLocation = new Point(x, y);
                        break;
                    }
                }
            }

Mit dem break verlässt Du nur die innere for Schleife und die äußere läuft weiter. Aber das sillst Du ja nicht. Und das ist ideal für eine Methode - du hast halt statt der Zuweisung ein return new Point(x,y) und am Ende ein return new Point(-1,-1) oder so.

Und dann ist ja auch die Mausbewegung von der Suche nach den Vögeln unabhängig. Da muss man dann schauen, was Du genau willst / brauchst. mouseMove nimmt doch die Bildschirmkoordinaten - daher kann man die Maus doch gezielt bewegen, wenn man weiss, wo man hin muss.

Daher noch einmal die generelle Idee:
Beschreibe es in Worten in groben Schritten. Das kann dann etwas sein:
Code:
- foto := Mache Bildschirmfoto
- koordinaten := Suche Vogel in foto
- Wenn Koordinaten gefunden
--- gehe zu koordinaten
--- klicke

Halt etwas in der Art. Und das wird dann in Methoden umgesetzt - und damit wird der Code genau so gut lesbar wie schon die Beschreibung.

==> Fehler lassen sich einfacher finden.
 

Mirana

Mitglied
Dein Code ist sehr unübersichtlich und ich muss gestehen, dass ich da auch noch nicht wirklich den Sinn dahinter verstehe.

Unterteile den Code doch einfach ein bisschen mehr so dass man über die Methodennamen einfach verstehen kann, was Du da überhaupt treibst.

Beispiel: In zwei verschachtelten Schleifen prüfst Du die Pixel:
Java:
            for (int y = 0; y < screenshot.getHeight(); y++) {
                for (int x = 0; x < screenshot.getWidth(); x++) {
                    int pixel = screenshot.getRGB(x, y);
                    int red = (pixel >> 16) & 0xff;
                    int green = (pixel >> 8) & 0xff;
                    int blue = pixel & 0xff;
                    if (red >= redThreshold && red <= 235 && green >= greenThreshold && green <= 0
                            && blue >= blueThreshold && blue <= 0) {
                        duckLocation = new Point(x, y);
                        break;
                    }
                }
            }

Mit dem break verlässt Du nur die innere for Schleife und die äußere läuft weiter. Aber das sillst Du ja nicht. Und das ist ideal für eine Methode - du hast halt statt der Zuweisung ein return new Point(x,y) und am Ende ein return new Point(-1,-1) oder so.

Und dann ist ja auch die Mausbewegung von der Suche nach den Vögeln unabhängig. Da muss man dann schauen, was Du genau willst / brauchst. mouseMove nimmt doch die Bildschirmkoordinaten - daher kann man die Maus doch gezielt bewegen, wenn man weiss, wo man hin muss.

Daher noch einmal die generelle Idee:
Beschreibe es in Worten in groben Schritten. Das kann dann etwas sein:
Code:
- foto := Mache Bildschirmfoto
- koordinaten := Suche Vogel in foto
- Wenn Koordinaten gefunden
--- gehe zu koordinaten
--- klicke

Halt etwas in der Art. Und das wird dann in Methoden umgesetzt - und damit wird der Code genau so gut lesbar wie schon die Beschreibung.

==> Fehler lassen sich einfacher finden.


Meinen Fehler habe ich eigentlich schon - in der Methode richtungAendern() starte ich eine verzögerte Aufgabe, eigentlich um die Maus nach 10 Sekunden wieder zum Anfangspunkt zu bewegen und dann soll die Suche nach den Hühnern weitergehen
und diese Aufgabe wird leider in der while-loop endlos ausgeführt und schon ist meine Maus für immer in der Bewegung gefangen


um das Problem zu lösen habe ich diese verzögerte task entfernt und einfach einen counter eingebaut der sich jedes mal, wenn er keine Ente findet und nach rechts scrollt, erhöht


Java:
if (duckLocation.x == -1 && duckLocation.y == -1) {
                robot.mouseMove(1700, 255);
                screenshot = robot.createScreenCapture(screenBounds);
                counter++;
                if (counter == 10) {
                    for (int i = 1; i <= counter; i++) {
                        robot.mouseMove(235, 255);
                    }
                    counter = 0;
                }

dieser soll eigentlich, nachdem er 10x versucht hat rechts weitere Hühner zu finden, wieder 10x nach links gehen, aber anscheinend geschieht das nicht :p
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
A brauche eine Lösung für Problem bei Moorhuhn-Version Java Basics - Anfänger-Themen 5
I Greenscreen, funktioniert nicht zu 100%... nicht alle Pixel werden geändert Java Basics - Anfänger-Themen 1
J Größe eines Strings in Pixel Java Basics - Anfänger-Themen 18
A BufferedImage Pixel Java Basics - Anfänger-Themen 7
S suche nach varible POSITION ... fuer das pixel-maennchen Java Basics - Anfänger-Themen 4
M Einzelne Pixel in einem Bild auslesen und bearbeiten Java Basics - Anfänger-Themen 1
T Java gleichfarbige Pixel vergleichen Java Basics - Anfänger-Themen 5
I Zähler, der erst wieder zählt nachdem Pixel wieder andere Farbe hat Java Basics - Anfänger-Themen 2
B Äußere Pixel auslesen Java Basics - Anfänger-Themen 3
P pixel formel versetztes Schachbrettmuster Java Basics - Anfänger-Themen 2
llabusch Fenster um x Pixel verschieben Java Basics - Anfänger-Themen 4
S Speicherbedarf Pixel vs. Polygon? Java Basics - Anfänger-Themen 7
D Kleinere Positionsangabe als einzelne Pixel bei Image? Java Basics - Anfänger-Themen 28
V Pixel auslesen? Java Basics - Anfänger-Themen 3
L Wieviel Speicher braucht ein Pixel? Java Basics - Anfänger-Themen 14
R Kurze Linien alle x-Pixel Java Basics - Anfänger-Themen 2
O Maus / Pixel Position bei mir und bei anderen. Java Basics - Anfänger-Themen 8
S Pixel auf Screen setzen Java Basics - Anfänger-Themen 4
M einzelne Pixel setzen/auslesen Java Basics - Anfänger-Themen 2
S Pixel in Binärbildern zu Konturen zusammenfassen Java Basics - Anfänger-Themen 10
G Pixel-Abstand im JPanel Java Basics - Anfänger-Themen 11
G Bild einlesen und je Pixel die RGB-Werte ermitteln Java Basics - Anfänger-Themen 3
lin Farbwerte von Pixel Java Basics - Anfänger-Themen 4
T Bilder - Array - Pixel Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben