Die Podcaster schießen sich selber ins Bein

Nach langem Suchen habe ich endlich einen neuen Technik-Podcast auf Deutsch gefunden: Geekstammtisch heißt er. Und eigentlich wollte ich jetzt mal schön von oben herab ablästern was da inhaltlich alles falsch erzählt wurde. Also schön kritisch als Zuschauer sein. Leider bin ich gar nicht soweit gekommen. Die Folge 004 in der es über C ging, und wo mit Sicherheit auch viel zu kritisieren wäre ist online gar nicht mehr einsehbar http://podlist.de/podcast/episode/geekstammtisch/gst004-ich-dachte-c-ist-fertig

Das heißt, offenbar ist man der zu erwarteten Kritik aus der Community zuvorgekomme und hat sich selbst entschlossen, die mp3 Datei vom Server zu nehmen. Schade eigentlich. Und hier liegt das eigentliche Problem. Wenn die Autoren selber ihre Beiträge schon löschen aus welchen Gründen auch immer, kommt man gar nicht in den Genuss inhaltliche Kritik anbringen zu können. Ein wenig erinnnerte das an Pofacs der vor allem dadurch auffiel, dass er heute weder für Fans noch für Kritiker abrufbar ist.

Das DARPA Paradox

Als Paradoxon wird in den Naturwissenschaften eine Beobachtung bezeichnet, welche der ursprünglichen Annahme widerspricht. Also etwas aufzeigt, was so nicht da sein dürfte. Die ursprüngliche Annahme darüber wer oder was die DARPA ist lautet landläufig, dass es sich dabei um eine ultrageheime militärische Behörde handelt welche für die US-Streitkräfte Technologie entwickelt. So eine Art von Q-Abteilung wie bei James Bond. Man könnte die DARPA auch als Zentrum des militärisch-industriellen Komplexes bezeichnen, worüber die USA ihren technischen Vorspruch sicherstellen.

Wenn diese Annahme korrekt wäre, dürfte es keine oder allenfalls falsche Angaben in der Öffentlichkeit geben woran die DARPA forscht, wer die Forschung ausführt und wie man diese Technologie in konkrete Produkte überführt. Und hier gibt es das eingangs zitierte Paradoxon. Google Scholar findet unter https://scholar.google.de/scholar?hl=de&q=DARPA&btnG=&lr= nicht weniger als 244000 Paper die allesamt von der DARPA gesponsert wurden, bei denen die allergeheimsten Geheimnisse verraten werden. Anmelden um sie einzusehen muss man sich nicht. Ja die Paper sind sogar leichter aufzurufen als die Status-Updates bei einem Facebook Freund. Jetzt mag man sagen, dass das keine richtige Paper wären sondern reine Propaganda, also politisches Bla Bla. Doch schaut man man im Detail hinein, was dort thematisiert wird und wie das geschieht so handelt es sich um Forschungspaper. Genauer gesagt um Erwachsenenbildung die mit wissenschaftlichem Anspruch geschrieben wurde, und die Querverweise enthält. Fast hat man den Eindruck, einem großen verteilten Schulbuch gegenüberzustehen. Wenn man dann noch die Google Websuche bemüht https://www.google.de/search?client=ubuntu&channel=fs&q=darpa+filetype%3Apdf&ie=utf-8&oe=utf-8&gfe_rd=cr&ei=PBohWfCNLM_PXr-kkUA finden sich dort sogar 462000 Darpa Paper, wobei es sicherlich Doppelungen gibt, aber nicht nur.

Anders ausgedrückt, wenn die DARPA wirklich ein supergeheimer Militär-Apparat wäre, dann gibt es da ein riesiges Leck. Aber vielleicht weiß die Behörde ja gar nicht, dass all ihre Informationen frei zugänglich im Internet stehen und sogar der Quellcode der bei der letzten Darpa Robotics Challange eingesetzt wurde, mittlerweile bei Github bereitsteht? Natürlich wird sie es wissen, sondern eher heißt die Schlussfolgerung dass die ursprüngliche Annahme darüber wer oder was die Darpa ist falsch ist.

An dieser Stelle ein kleiner Exkurs zum Plato Computersystem, https://de.wikipedia.org/wiki/Plato_(Computersystem) Es handelt sich um ein computerunterstütztes Lernsystem.was Leuten ohne universitären Background eine höhere Bildung zukommen lassen wollte. Der Sinn von Plato war nicht etwa Geheimhaltung sondern dessen Gegenteil: möglichst viele Leute anzusprechen.

Es ist unklar wie die Nutzungszahlen der DARPA Paper sind. Fakt ist jedoch, dass rein technisch gesehen sie von potenziell 7 Milliarden Leuten gelesen werden können, so fern sie English verstehen und sie dafür interessieren. Man könnte die Darpa Paper durchaus mit Wikipedia vergleichen, der Sprachduktus ist vergleichbar und ähnlich wie bei Wikipedia gibt es einen pädagogischen Anspruch. Also die Leute darüber zu bilden. Jetzt könnte man natürlich einwenden, dass es sich um eine mißbräuchliche Nutzung handeln würde, wenn man sich wahllos durch DARPA Paper durchklickt worin Steahlt-Technologie, medizinische Forschung und Robotik thematisiert wurde. Nur, eine explizite Paywall oder Zutrittsbarrieren gibt es keine. Wenn ich Google Scholar richtig verstanden habe, gibt es da nochnichtmal ein Cookies was überprüft wieviele man von diesen Papern schon gelesen hat. Sondern die Paper-Hosting-Server sind dermaßen exponiert im Internet hingestellt als wäre es ein Ubuntu-Update-Server wo man also mit hohem Traffic Aufkommen rechnet.

In einem Paper über das Plato-computer-based-education system (Misselt, A Lynn: „Implementation and Operation of Computer-Based Education“, 1980, dtic-document) wird die Gründung von Plato untersucht:

„A program of implementation of one advanced form of CBE (Computer-Based Education), the PLATO system, was begun by DARPA in the 1960s.“

Weiterhin verweist das Paper auf ein sogenanntes „ARPA/PLATO project“, offenbar sollte das ARPA Net weniger ein Computerverbund für militäreinrichtungen sein, sondern eher als Computer-based-training ausgelegt sein.

Interessant ist auch der zeitliche Zusammenhang zwischen dem ARPANet und dem Plato Computersystem. Beides entstand Anfang der 1970’er als Forschungsverbund in den USA. Wurde das Arpanet noch für weitere Dinge als nur das Plato-System genutzt?

Spieleentwicklung in Python

Eigentlich wollte ich von pygame auf PySFML umsteigen. Das gestaltet sich jedoch schwieriger als ursprünglich gedacht. Der Grund ist, dass SFML im C/C++ Umfeld zu Hause ist und für diese Sprachen gibt es die Tutorials. Man kann zwar mittels „dir(command)“ auch in Python herausfinden, wie das Python Äquivalent lautet aber das ist mühsam. Erschwerend kommt hinzu, dass nach dem Start der GUI pySFML mindstens genauso viel CPU schluckt wie pygame. Stolze 15% werden von der CPU abgezweigt und das für ein paar Linien und 30 fps.

Offenbar führt im Python Umfeld an pygame nichts vorbei. Unter C würde SFML die bessere Wahl sein, dort ist dier Performance überragend und dort passen auch die Codebeispiele von der Hilfe-Seite. Unter Python jedoch sind Game-Engines immer so eine Sache. Wirklich guten Code kann man mit pygame beispielsweise nicht produzieren. Das ist aber nicht schlimm, weil es letztlich um den Prototypen geht und nicht um die fertige Applikation. Der Vorteil bei Python ist eben, dass man nur sehr wenige Lines of Code benötigt und man schnell fertig ist mit dem Projekt. Das die Anwendung zäh reagiert und manchmal abstürzt kann man da verschmerzen.

Was genau soll die Software einmal können wenn sie fertig ist? Nun, angedacht ist, einen Motion Graph in Python zu implementieren, also eine Animationssequenz die sich interaktiv steuern lässt. Anders als bei Box2D wird die Animation nur auf den Bildschirm ausgegeben, ohne dass im Hintergrund eine Kollisionsüberprüfung durchgeführt wird. Der darauf aufbauende RRT Solver dürfte pfeilschnell sein. Roboter kann man dann zwar nicht mehr damit steuern, aber dafür kann man das Prinzip leichter verdeutlichen bei dem Motion Primitive mit einem RRT Solver kombiniert werden.

Was schon geklärt ist ist die Frage wie die Map im Speicher gehalten wird, nämlich so: http://stackoverflow.com/questions/23318440/2d-array-to-tiled-map-pygame-python Also einfach eine Array-artige Liste als Tiled map. Auf dieser Map werden dann Hindernisse wie Graben eingeblendet und über ein Menü kann eine Animationssequenz aktiviert werden. Das jedenfalls die Idee, wenn das Projekt mal fertig ist.

Super-Human-AI in der Praxis

Im AGI Diskurs wird häufiger auf den Begriff „Super-Human-AI“ referenziert. Damit war ursprünglich die technische Realisierbarkeit hochintelligenten Maschinen gemeint, also Systeme welche den Menschen in Sachen Intelligenz überlegen sind. Meist betonen die Wissenschaftler dass solche Systeme derzeit nicht realisierbar sind, weil nicht klar ist wie man kognitive Leistungen reproduzieren kann.

Man kann den Begriff aber auch von einer anderen Seite beleuchten. Dazu ein kleiner Exkurs zum Marionetten-Theater und Puppenspiel. Diese Kulturtechnik ist sehr alt und hat mit Robotik jetzt nicht soviel zu tun. Beim Puppenspiel gibt es in aller Regel den Kasper, eine Figur die bestimmte Charaktereigenschaft hat und bei den Zuschauern beliebt ist. Im Regelfall ist der Kasper nicht realistisch angelegt sondern er neigt in allem zur Übertreibung. Das heißt, er ist grell geschminkt, und hat einen derben Humor. Man könnte solche Figuren als Super-Human bezeichnen, sie verkörpern Satire auf der Bühne. Das ganze ist nicht so sehr technisch zu verstehen, dass also die Gehirnzellen vom Kasper zahlreicher wären oder er überlegen ist, sondern es ist eher die soziale Rolle um die es geht.

Ist es möglich, Roboter mit den Charaktereigenschaften eines Kaspers zu programmieren? Mit Sicherheit, man muss sie lediglich äußerlich darauf hinoptimieren und man muss die Dialog-Scripte ebenfalls daran anpassen. Also einen Chatbot programmieren der Vorlaut ist, leicht bösartig usw. Sowas zu realisieren ist nicht schwerer als jede andere Persönlichkeit und es führt dazu, dass die Figur als Super-Human wahrgenommen wird. Damit ist gemeint, dass menscchliche Verhaltenszüge übertrieben dargestellt werden. Es ist sehr wahrscheinlich, dass sowas in der Robotik der Zukunft der Normalfall ist.

Hat Linux Schwachstellen?

[1]

„KillDisk, Amnesia und BrickerBot gemein ist, dass sie Linux einzige „echte“ Schwachstelle ausnutzen: den User. “

Soviel Lob über Linux mag ja gutgemeint sein, wird aber der Realität nicht gerecht. Linux strotzt nur so von ungestopften Exploits. Gerade vor kurzem wurde eine 8 jahre alte Sicherheitslücke direkt im Kernel entdeckt und was die Apache Webserver, PHP Installationen und sonstige Erweiterungen an nicht gemeldeten bzw. bekannten aber nicht gestopften Sicherheitslücken mitbringen füllt ganze Bände bei der „CVE Vulnerabilities Database“. Das Problem mit dem Linux-biotop ist, dass dort zuviele Leute mitprogrammieren die richtig viel Ahnung haben und wie hieß es nochmal in diesem Film Wargames? „Wenn ich ein neues System aufsetze, baue ich da erstmal eine Backdoor ein, damit ich später mich da wieder einloggen kann.“ Der WOPR aus dem Film lief mit Sicherheit auch mit Linux.

Hier https://www.sans.org/reading-room/whitepapers/malicious/introduction-linux-based-malware-36097 ist ein Paper was einige Linux Schädlinge auflistet, mitsamt der CVE Nummer über die sie ins System eingedrungen sind. Ein Großteil der Ausfälle der weltweiten Server geht auf das Konto von dezidierten Linux-Schädlingen.

Desweiteren sei auf die zahlreichen Router hingewiesen die gerne mal zu Botnetzen zusammengeschaltet werden. Und was läuft auf diesen kleinen Maschinen? Richtig, unixoide Betriebssysteme die mit den GNU Utilities angereichert wurden. Ähnlich wie Ubuntu übrigens ohne jegliche Update-Funktionalität, so dass einmal erkannte Sicherheitslücken bis in alle Ewigkeit da drin bleiben als mahnendes Beispiel wohin zuviel Technikgläubigkeit führt.

Einführung in die objektorientierte Programmierung mit Java

Java wird aus unterschiedlichen Gründen von vielen Leuten abgelehnt wobei vermutlich die strikte Orientierung an objektorientierter Programmierung dasjenige Feature sein dürfte, was am meisten Unwillen erzeugt sich näher mit dieser Programmiersprache auseinanderzusetzen. Gleichzeitig gibt es in der Fachliteratur einen Mangel bezüglich darin, diese Programmiermethode einsteigerfreundlich zu erläutern. Deshalb im folgenden eine kleine Übersicht wie OOP mit Java funktioniert.

Zunächst einmal sollte man sich frei machen von der üblichen Vorstellung, objektorientierte Programmierung hätte etwas mit Objekten zu tun (Objekte im Sinne von Klassen zur Beschreibung von Autos, Gebäuden usw) Bei der Programmierung geht es niemals um konkrete Objekte aus dem richtigen Leben, sondern es geht um Computercode, das ist etwas grundlegend verschiedenes. Um das besondere an OOP zu verstehen, zunächst ein kleiner Exkurs zu dessen Gegenteil, der strukturierten Programmierung.

Bei der strukturierten Programmierung werden Sub-Funktionen definiert, an die Variablen übergeben werden:

void function1 (int a, int b, int c) {

}

void function2 (int a) {

}

void function3 (int b, int c) {

}

Zusätzllich dürfen keine globale Variablen verwendet werden, weil dadurch das Unterteilen in Unterprobleme ausgehebelt werden würde. Ein Nachteil der strukturierten Programmierung besteht darin, dass bei größeren Problemen die Liste an zu übergebenden Variablen immer länger wird. Wenn man in einem Computerspiel beispielsweise eine Pfadplanung durchführen möchte, muss man neben einem Array was die Karte enthält auch noch weitere Arrays übergeben welche die aktuelle Punktzahl und den Aufenthaltsort der Gegner enthalten. Gleichzeitig gibt es in Sprachen wie C das Problem, dass man übergebende Variablen nicht abändern darf. Will man dies tun, müssen stattdessen Pointer auf die Variablen übergeben werden, die dann in der Funktion verändert werden. Wie man sieht stößt das Konzept relativ schnell an seine Grenzen.

Die Alternative dazu besteht in der Verwendung von globalen Variablen:

int a; 
int b;
int c;

void function1 () {

}

void function2 () {

}

void function3 () {

}

Man kann jetzt von jeder Funktion aus auf die Variablen zugreifen. Aus Sicht der strukturierten Programmierung wäre das ein Verstoß gegen die Regel „Verwende keine globalen Variablen“. Aber anstatt das ganze als schlechten Stil zu bezeichnen ist es in der Fachlitatur unter einem anderen Namen bekannt geworden: objektorientierte Programmierung. Das ganze kann man weiter vereinfachen, indem man die einzelnen Variablen zu einem Struct zusammenfasst:

class Class1 {
  struct Spielstand {
    int a; 
    int b;
    int c;
  }

  void function1 () {
    Spielstand.b = 5;
  }

  void function2 () {
    Spielstand.a=10;
  }

  void function3 () {

  }
}

Der Sinn des ganzen ist es, dass man die Übergabe von einer oder mehrerer Variablen an die Unterfunktionen einspart und auch nicht mit Zeigern hantieren muss, wenn man die Variablen in der Funktion verändern möchte. Das ist der ganze Sinn der objektorientierten Programmierung.

Man kann das ganze noch weiter ausbauen, hin zu Vererbung, Kommunikation der Objekte untereinander usw. Das würde den Rahmen dieser Einführung jedoch sprengen.

Semi-autonomes Platzieren von OpenRA Buildings

Der Quellcode im Anhang enthält einen Aimbot für das Echtzeitstrategiespiel OpenRA, der in der Lage ist, Kraftwerke auf der Map zu platzieren. Dazu wird über ein Mini-Screenshot und eine Pixelerkennung ein freier Bereich erkannt und darauf das Gebäude platziert. Leider funktioniert das Verfahren nur sehr unzuverlässig, so dass (wie im obigen Video auch zu sehen) es mitunter zu Aussetzern kommen kann. Ein praktischer Nutzen besteht deshalb nicht, allerdings ist die Idee spannend mit Hilfe von GUI Automatisierung einen Aimbot zu erstellen.

import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import javax.swing.*;
import java.awt.Robot;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.InputEvent;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import java.text.NumberFormat;

class Aimbot implements ActionListener
{
  // java.awt.robot
  Robot robot = new Robot();

  // GUI
  JFrame frame = new JFrame("Aimbot");
  JPanel mainPanel = new JPanel();
  JButton button1 = new JButton("OpenRA");
  JButton button2 = new JButton("SinglePlayer");
  JButton button3 = new JButton("Basis");
  JButton button4 = new JButton("Kraftwerk Auftrag");
  JButton button5 = new JButton("Kraftwerk platzieren");
  JButton button6 = new JButton("Mouse move");
  JButton button7 = new JButton("7");
  JButton button8 = new JButton("8");
  JLabel label1 = new JLabel("Mausposition: ");
  JLabel label2 = new JLabel("....... Pixelsearch: ");
  JLabel label3 = new JLabel("Farbe (rgb): ");
  JLabel mousex = new JLabel("");
  JLabel mousey = new JLabel("");
  JLabel labelpixelsearch = new JLabel("");
  JLabel farbe = new JLabel("");

  // Magnifier
  int size = 200; // OpenRA Ausschnitt: size=200, zoom=1
  double zoom = 1;
  BufferedImage image;
  ImageIcon icon = new ImageIcon();
  JLabel labelmag = new JLabel(icon);

  void FokusAufOpenRAFenster()
  {
    robot.mouseMove(600, 400);
    leftClick();
    type("h"); // Bauhof auswählen
  }

  void FokusAufBotFenster()
  {
    robot.mouseMove(200, 500);
    leftClick();
  }

  void type(String s)
  {
    byte[] bytes = s.getBytes();
    for (byte b : bytes) {
      int code = b;
      // keycode only handles [A-Z] (which is ASCII decimal [65-90])
      if (code > 96 && code < 123)
        code = code - 32;
      robot.delay(40);
      robot.keyPress(code);
      robot.keyRelease(code);
    }
  }

  void leftClick()
  {
    robot.mousePress(InputEvent.BUTTON1_MASK);
    robot.delay(100);
    robot.mouseRelease(InputEvent.BUTTON1_MASK);
    robot.delay(100);
  }

  void rightClick()
  {
    robot.mousePress(InputEvent.BUTTON3_MASK);
    robot.delay(100);
    robot.mouseRelease(InputEvent.BUTTON3_MASK);
    robot.delay(100);
  }

  void typeEnter()
  {
    robot.delay(40);
    robot.keyPress(KeyEvent.VK_ENTER);
    robot.keyRelease(KeyEvent.VK_ENTER);
    robot.delay(1000);
  }

  void makroOpenRAStarten()
  {
    // Terminal Starten
    robot.mouseMove(30, 50);
    leftClick();
    type("terminal");
    typeEnter();

    // OpenRA Starten
    type("openra");
    typeEnter();
    robot.delay(4000);

    FokusAufBotFenster();
  }

  void makroSinglePlayerStarten()
  {
    FokusAufOpenRAFenster();
    robot.mouseMove(400, 320); // Button Singleplayer
    leftClick();
    robot.delay(500);
    leftClick(); // Button Skirmish
    robot.delay(500);

    robot.mouseMove(800, 430); // Button Startgame
    leftClick();
    robot.delay(500);

    FokusAufBotFenster();
  }

  void makroKraftwerkPlatzieren()
  {
    FokusAufOpenRAFenster();

    // Kraftwerk in Menü auswählen
    robot.mouseMove(900, 430);
    leftClick();

    // Kraftwerk positionieren
    boolean finished = false;
    for (int y = 200; y <= 600 && !finished; y = y + 100) {
      for (int x = 400; x <= 800; x = x + 50) {
        robot.mouseMove(x, y);
        robot.delay(200); 
        if (labelpixelsearch.getText().equals("true")) {
          leftClick(); // Kraftwerk platzieren
          finished = true;
          break;
        }
      }
    }
    
    // neuen Auftrag für Kraftwerk
    robot.mouseMove(900, 430);
    leftClick();
    
    FokusAufBotFenster();

  }

  boolean inRange(int i, int min, int max)
  {
    if (i > min && i < max)
      return true;
    else
      return false;
  }

  boolean pixelSearch()
  {
    // Positive Color
    // OpenRA weiß frei: 252 252 252 (rgb)
    int positveRed = 252;
    int positveGreen = 252;
    int positveBlue = 252;
    int positiveEqual = 0;

    // Negative Color
    // OpenRA rot belegt: 168 0 0 (rgb)
    int negativeRed = 168;
    int negativeGreen = 0;
    int negativeBlue = 0;
    int negativeEqual = 0;

    int tolerance = 10;

    int width = image.getWidth();
    int height = image.getHeight();

    for (int row = 0; row < height; row++) {
      for (int col = 0; col < width; col++) {
        int pix = image.getRGB(row, col);
        Color c = new Color(pix, true); // true for hasalpha

        // determine "inRangeCount"
        int positiveCount = 0;
        int negativeCount = 0;

        if (inRange(c.getRed(), positveRed - tolerance, positveRed + tolerance) == true) {
          positiveCount++;
        }
        if (inRange(c.getRed(), negativeRed - tolerance, negativeRed
            + tolerance) == true) {
          negativeCount++;
        }
        if (inRange(c.getGreen(), positveGreen - tolerance, positveGreen
            + tolerance) == true) {
          positiveCount++;
        }
        if (inRange(c.getGreen(), negativeGreen - tolerance, negativeGreen
            + tolerance) == true) {
          negativeCount++;
        }
        if (inRange(c.getBlue(), positveBlue - tolerance, positveBlue
            + tolerance) == true) {
          positiveCount++;
        }
        if (inRange(c.getBlue(), negativeBlue - tolerance, negativeBlue
            + tolerance) == true) {
          negativeCount++;
        }
        if (positiveCount == 3)
          positiveEqual++;
        if (negativeCount == 3)
          negativeEqual++;

      }
    }
    // System.out.println(positiveEqual+" "+negativeEqual);
    int erkannteFelder = positiveEqual + negativeEqual;
    // System.out.println(positiveEqual + " " + negativeEqual);
    if (erkannteFelder < 2000)
      return false;
    else {
      if ((1.0 * positiveEqual / erkannteFelder) > 0.9) {
        return true;
      } else
        return false;
    }

  }

  Color pixelcolorOnCursor()
  {
    // Pixelcolor on Image-center
    int pix = image.getRGB(image.getHeight() / 2, image.getWidth() / 2);
    Color c = new Color(pix, true); // true for hasalpha
    return c;
  }

  void screenMagnifier()
  // http://openbook.rheinwerk-verlag.de/java7/1507_10_009.html
  {
    try {
      Rectangle location = new Rectangle(MouseInfo.getPointerInfo()
          .getLocation(), new Dimension(size, size));
      location.translate(-size / 2, -size / 2);
      image = new Robot().createScreenCapture(location);
      int width = (int) (image.getWidth() * zoom);
      int height = (int) (image.getHeight() * zoom);
      icon.setImage(image.getScaledInstance(width, height, Image.SCALE_FAST));
      labelmag.repaint();
      labelpixelsearch.setText("" + pixelSearch());

      // Cursorfarbe bestimmen
      Color c = pixelcolorOnCursor();
      farbe.setText(c.getRed() + " " + c.getGreen() + " " + c.getBlue());

    } catch (AWTException ae) {

    }

  }

  public void actionPerformed(ActionEvent e)
  {
    Object source = e.getSource();
    if (source == button1) {
      new Thread() {
        public void run()
        {
          makroOpenRAStarten();
        }
      }.start();

      // JOptionPane.showMessageDialog(null, "Button1");
    }
    if (source == button2) {
      new Thread() {
        public void run()
        {
          makroSinglePlayerStarten();
        }
      }.start();
    }
    if (source == button5) {
      new Thread() {
        public void run()
        {
          makroKraftwerkPlatzieren();
        }
      }.start();
    }
    if (source == button6) {
      new Thread() {
        @Override
        // override: braucht man das oder nicht?
        public void run()
        {
          robot.mouseMove(900, 430);
          robot.delay(1000);
          robot.mouseMove(800, 430);
          robot.delay(1000);
          robot.mouseMove(700, 430);
          robot.delay(1000);
        }
      }.start();

    }
    if (source == button7) {
      new Thread() {
        public void run()
        {

        }
      }.start();
    }

  }

  Aimbot() throws AWTException {
    // robot init
    robot.setAutoWaitForIdle(true);
    // robot.setAutoDelay(1000);

    // formular
    frame.setSize(250, 500);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    // mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS));
    mainPanel.setLayout(new FlowLayout());
    frame.setContentPane(mainPanel);

    mainPanel.add(label1);
    mainPanel.add(mousex);
    mainPanel.add(mousey);
    mainPanel.add(label3);
    mainPanel.add(farbe);
    mainPanel.add(label2);
    mainPanel.add(labelpixelsearch);

    mainPanel.add(labelmag);
    screenMagnifier();

    mainPanel.add(button1);
    button1.addActionListener(this);
    mainPanel.add(button2);
    button2.addActionListener(this);
    mainPanel.add(button3);
    button3.addActionListener(this);
    mainPanel.add(button4);
    button4.addActionListener(this);
    mainPanel.add(button5);
    button5.addActionListener(this);
    mainPanel.add(button6);
    button6.addActionListener(this);
    mainPanel.add(button7);
    button7.addActionListener(this);
    mainPanel.add(button8);
    button7.addActionListener(this);

    // frame.pack();
    frame.setVisible(true);

    // Timer Intervall 100 = 0,1 Sekunde
    new Timer(100, new ActionListener() {
      public void actionPerformed(ActionEvent e)
      {
        Point location = MouseInfo.getPointerInfo().getLocation();
        mousex.setText("" + location.x);
        mousey.setText("" + location.y);
        screenMagnifier();
      }
    }).start();

  }

}

class class1
{
  public static void main(String[] args) throws AWTException
  {
    Aimbot myAimbot = new Aimbot();
  }

}

]]>

3756
2015-04-28 15:02:49
2015-04-28 13:02:49
open
open
semi-autonomes-platzieren-von-openra-buildings
publish
0
0
post

0

_edit_last

geo_public

_publicize_pending

Bug: Aimbot für OpenRA hat delay-Probleme
https://aa5new.wordpress.com/2015/04/28/bug-aimbot-fur-openra-hat-delay-probleme/
Tue, 28 Apr 2015 13:03:44 +0000
aa5new
https://aa5new.wordpress.com/?p=3758

<![CDATA[https://www.youtube.com/watch?v=Mp9BWPvErPQ

Leider funktioniert der neu entwickelte Aimbot für OpenRA der mittels "java.awt.robot" über das GUI Fenster Befehle absendet nicht zuverlässig. Zwar kann er bereits Screenshots anfertigen, doch leider scheint diese Funktion nur im manuellen Modus zu funktionieren. Wenn der Mauscurser hingegen automatisch bewegt wird, funktioniert die Aktualisierung der Anzeige nicht mehr. Was die Ursachen sind ist derzeit unklar, vermutlich hat es etwas mit der Methode "waitforidle" in der "java.awt.robot" Klasse zu tun.

Mal ganz abgesehen davon gibt es noch weitere Probleme. Und zwar soll der Aimbot später einmal alleine leveln können. Damit ist gemeint, dass er seinen Zustand verbessern soll, und zwar dadurch dass er seinen Punktestand erhöht, seinen Einflussbereich auf der Map vergrößert, seine Gegner dominiert usw. Nur, eine Unterfunktion um zu "leveln" ist derzeit noch gar nicht implementiert. Es fehlt hier an grundlegenden Konzepten. Vermutlich müsste als erstes einmal eine menschliche Strategie als Software implementiert werden, was nicht nur aufwendig ist, sondern auch weitere Fehlerquellen eröffnet.