ich möchte euch mit diesem Tutorial zwei bekannte und auch hilfsreiche Funktionen nutzen, die die Programmiersprache AutoIt zur Verfügung stellt, Image- und PixelSearch. Nach diesem Tutorial solltet ihr in der Lage sein, beide Funktionen nutzen zu können, um so auf Pixel basierende Bots zu schreiben. Pixelbots haben den Vorteil, dass sie nur mit dem arbeiten, was ihnen der Bildschirm anzeigt. Daher sind diese auch schwierig vom Spielehersteller zu detecten. Ein Nachteil dagegen ist jedoch, dass sie eure Maus steuern werden und das Spiel immer im Vordergrund sein muss, sodass ihr, während der bot läuft, euren PC nicht benutzen könnt. Wie man z.B. an der DarkOrbit Sektion sieht, gibt es aber auch Wege, Pixelbots im minimierten Fenster, also Background, laufen zu lassen.
Voraussetzungen:
- Programmiergrundlagen (If-Abfragen, While-Schleifen etc.)
- AutoIt (Ich werde in diesem Tutorial nicht auf die Syntax von AutoIt eingehen oder wie man es installiert. Wer jedoch eine andere Programmiersprache kann, AutoIt jedoch nicht, der wird keine großen Probleme haben)
- Man sollte ImageSearch und PixelSearch kennen
In diesem Tutorial werde ich mit euch einen kleinen Raidbot für das Spiel Seafight erstellen. Wer das Spiel nicht kennt, hier die Kurzfassung: Es befinden sich NPCs auf der Map, welche wir abschießen wollen, um Spielwährung zu erhalten. Das ist alles
Bevor wir aber dazu kommen, erstmal ein paar Dinge, die wir davor erledigen müssen. Zuerst erstellen wir einen neuen Ordner, nennen wir ihn mal Raidbot. Im Ordner erstellen wir dann unsere AutoIt Datei, sowie einen neuen Ordner namens Bilder.
So, kommen wir jetzt wirklich zum Spiel. Schauen wir uns mal das Spielfenster an:
Zwei Dinge sind jetzt essentiell.
1. Die Minimap
Hier werden uns NPCs in der Nähe durch einen orangenen Punkt angezeigt. Abgesehen von den NPCs brauchen wir die Minimap auch um durch die Map zu fahren.
2. Die Seekarte
In diesem Bereich werden wir später ImageSearch durchlaufen lassen, um die NPCs zu finden und anzugreifen
Wenn man einen Bot schreibt, möchte man auch, dass er auf anderen PCs funktioniert. Wie stellt man das jedoch an, wenn alle verschiedene Bildschirmauflösungen haben und ihre Minimap beispielsweise ganz wo anders liegt, als bei mir? Die Antwort ist ImageSearch. Wir nutzen diese Funktion, um die Koordinaten der Seekarte sowie Minimap auf jedem Rechner herauszubekommen. Beide sehen bei jedem PC gleich aus, befinden sich bloß auf verschiedenen Koordinaten des Bildschirms.
Für die Minimap nehmen wir ein Stück von der oberen linken Ecke:
Diese Ecke wird sich niemals verändern. Egal wo die Minimap platziert ist, diese Ecke wird durch ImageSearch immer gefunden. Schneidet diese Ecke mit Paint aus und speichert das Bild in eurem Bilder Ordner als minimap.bmp (Format: 24-Bit Bitmap)
Jetzt definieren wir den Bereich, der nach NPCs auf der Minimap durchsucht werden soll. Bei ImageSearch können wir uns aussuchen, ob wir bei einem gefundenen Bild die Koordinaten der oberen linken Ecke oder der Mitte haben wollen. Nehmen wir beispielsweise die obere linke Ecke. Wenn man nun 3 Pixel nach Rechts und 4 Pixel nach unten geht, hat man die perfekte obere linke Ecke der Minimap.
Mit der AutoIt Window Info finden wir heraus, dass die Minimap 90x90 Pixel groß ist. Mit dieser Info können wir nun die Minimap definieren:
PHP Code:
$MiniMap = _ImageSearch(@ScriptDir & "\Bilder\minimap.bmp",0,$mmX,$mmY,10)
If $MiniMap = 1 Then
$MiniMapX = $mmx+3
$MiniMapY = $mmy+4
EndIf
Nachdem ihr wisst, wie man die Minimap definiert, sollte euch nichts daran hindern, das selbe mit der Seekarte zu machen. Denkt daran, ein Stück der Seekarte auszusuchen, welches sich niemals ändert und von ImageSearch immer gefunden werden kann. Orientiert euch von dort aus nach $SeekarteX und $SeekarteY.
Bevor der Bot also anfängt zu botten, sollte euer Programm nach der Minimap und Seekarte suchen, um diese zu lokalisieren. Jetzt beginnt das eigentliche botten. Wir wollen erstmal erreichen, dass unser Schiff durch die Map segelt um Ausschau nach NPCs bzw. orangenen Punkten auf der Minimap zu halten. Schauen wir uns die Minimap nochmal genau an
Auf den blauen Pixeln, also auf dem Wasser, können wir den Kurs setzen. Da der Blauton nicht immer gleich ist, müssen wir die shade-variation von PixelSearch verwenden. Entnehmen wir mit der AutoIt Window Hilfe einen Farbton eines blauen Pixels auf der Minimap, erhalten wir beispielsweise 0x254563.
PHP Code:
While True
$RandomX = Random($MinimapX,$MinimapX+90,1)
$RandomY = Random($MinimapY,$MinimapY+90,1)
$PS = PixelSearch($RandomX,$RandomY,$RandomX,$RandomY,0x254563,30)
If IsArray($PS) Then
MouseClick("left",$RandomX,$RandomY,1,2)
Sleep(500)
Send("c")
NpcSuchen($RandomX,$RandomY)
EndIf
WEnd
Ihr habt also den Farbton des Spielers und die Koordinaten zu denen er hinsegelt. Wie ihr herausbekommt, dass der Spieler an der Stelle angekommen ist und ihr einen neuen Kurs setzen müsst, überlasse ich euch mal.
Wie der Funktionsname NpcSuchen schon erahnen lässt, gehts nun darum, die orangenen Punkte auf der Minimap zu finden. Den Farbton erhaltet ihr mithilfe von AutoIt Window Hilfe.
PHP Code:
$Pixel = PixelSearch($MiniMapX,$MiniMapY,$MinimapX+90,$MinimapY+90,0xFF9900,0)
PHP Code:
MouseClick("left",$Pixel[0],$Pixel[1],1,2)
NpcAnklicken()
In Seafight können die NPCs in vier verschiedene Richtungen segeln (oben links, oben rechts, unten links, unten rechts). Wir brauchen daher vier Bilder vom NPC, um diesen zu erkennen, egal in welche Richtung es fährt.
Zoomt in Paint ruhig ran und schneidet ein Teil aus, das sich niemals verändert. In diesem Fall könntet ihr beispielsweise den Fehler machen, ein Stück vom Wasser mitzuschneiden. Wenn ihr das tut, wird euer Bild nicht zu 100% gefunden, da das Wasser immer unterschiedlich ist.
Wenn das Bild gefunden worden ist, klickt ihr darauf und setzt mit c Kurs, sodass ihr dem NPC näher kommt. Es ist wichtig zu wissen, dass in Seafight der Angriffsbutton aufleuchtet, wenn man in Reichweite ist, den anvisierten Gegner anzugreifen:
Nicht in Reichweite
In Reichweite
Ihr sucht also einfach nach dem Bild, in dem man in Reichweite ist. Sobald gefunden, klickt ihr darauf, sodass der Spieler angreift. Wenn man jemanden angreift, leutet der "Angriff abbrechen" Button auf:
Solang dieses aufleuchtet, greift der Spieler noch an. Der NPC lebt also noch. Wenn es nicht mehr leuchtet, heißt das, dass der Spieler den NPC versenkt hat.
Damit hätten wirs. Ein Bot, der für dich NPCs schießt. Alles nur durch Image- und PixelSearch. Klar fehlen jetzt noch wichtige Features wie Schiff reparieren wenn man versunken wird, HP reparieren, falls man weniger als XY% HP hat und störende Ingamemeldungen wegklicken. Dies ist auch alles mit keinem großen Aufwand durch Image- und PixelSearch machbar, jedoch ging es mir in diesem Tutorial darum, zu verstehen wie ein Pixelbot funktioniert und wie man mit etwas Aufwand selbst eins schreiben kann.
Ein passendes Fenster dazu zu erstellen ist dank Koda auch keine Große Kunst:
Ich hatte vor einiger Zeit vor, einen Raidbot wie in diesem Thread beschrieben zu schreiben, jedoch fehlte mir irgendwann die Lust/Zeit dazu, weswegen ich das Projekt nie fertiggestellt habe. Sehr sehr wichig, was in diesem Thread nicht angesprochen wurde, ist Fehlerbehandlung. Ihr müsst schauen, wo Fehler auftreten können und diese z.B. mit MessageBoxen beschreiben. Ansonsten bekommt ihr von vielen Usern eures Bots Errors wie "variable used without being declared" zugespammt.
Generell möchte ich zu Pixelbots noch sagen, dass, egal für welches Spiel oder für welche Seite ihr ein Pixelbot erstellen wollt, ihr immer gucken müsst, wo sich was verändert, wenn man eine Aktion im Spiel ausführt. Wenn eine Fläche wie bei Seafight ausgegraut wird, falls man nicht mehr angreift, also wenn der Gegner zerstört wurde, dann soll euer Bot natürlich nicht blöd rumstehen, sondern ihr nutzt diese Information aus um dem Bot zu sagen, jetzt soll er weiter segeln und NPCs suchen. Sowas muss euch direkt ins Auge springen, wenn ihr eure Tests im Spiel macht.
Ich hoffe das Tutorial hat euch geholfen. Es ist extra kein Copy&Paste Tutorial, sondern eher theoriebasierend. Falls noch Fragen bestehen, oder man Verbesserungsvorschläge hat, schreibt es einfach hier rein.







