elitepvpers

elitepvpers (https://www.elitepvpers.com/forum/)
-   Coding Tutorials (https://www.elitepvpers.com/forum/coding-tutorials/)
-   -   Bot Programmierkurs by NetMax (https://www.elitepvpers.com/forum/coding-tutorials/290328-bot-programmierkurs-netmax.html)

NetMax 07/26/2009 11:10

Bot Programmierkurs by NetMax
 
Da ja jetzt die Zeit gekommen ist um hier Tutorials zu veröffentlichen werf ich gleich meine auch auf den Markt.
In diesen Tutorial werden wir schrittweise einen Bot erstellen:

Programmierkurs by NetMax - LEKTION I Installation
Willkommen bei meinem Programmierkurs für die Sprache AutoIT.
AutoIt bietet die Möglichkeit leicht BOTS zu programmieren. Ziel dieses Programmierkurses ist alle nötigen Fähigkeiten zu erlernen um einen Bot wie z.B. NetMax's NosBot selbst programmieren zu können.

1a) INSTALLATION
Wir benötigen
AUTOIT ([Only registered and activated users can see links. Click Here To Register...])
SciTE ([Only registered and activated users can see links. Click Here To Register...])
Kode Form Designer([Only registered and activated users can see links. Click Here To Register...])

1b) Installiert die 3 Programme.

1c) Für was brauchen wir das alles?
AutoIT
Bei Autoit handelt es sich um die Kernkomponten die wir zu übersetzen einer AU3 Datei benötigen.
SciTE
Der Editor der uns erlaubt komfortabel AutoIT Scripte zu erstellen
Koda
Damit können wir Dialoge designen (also die graphische Benutzeroberfläche)

NetMax 07/26/2009 11:12

Programmierkurs by NetMax - LEKTION II Grundstruktur und erstes Programm
 
Da wir ja jetzt über alle benötigten Programme verfügen, kann es nun endlich losgehen.

Aufgabestellung für diese Lektion:
Entwickeln Sie ein Programm das die ganze zeit text in das aktive Fenster senden. Zwischen den Tastdendrücken sollen 1,5 Sekunden Pause sein.

Was sagt uns die Angabe: "das die ganze zeit" --> wir brauchen eine schleife.

Was ist ein Schleife:
Ein schleife wiederholt Anweisungen die in ihr stehen bis eine Bedingung erfüllt ist:
Code:

While 1=1
    ....
WEND

Das ist eine While-Schleife. "..." stellt weitere Anweisungen dar die wiederholt werden sollen. 1 ist hier die Bedingung(d.h. solange 1=1 ist also endlosschleife)

Was sagt uns die Angabe: text in das aktive Fenster senden
Hierzu gibt es in Autoit einen Befehl: Send("TEXT")
Damit senden wir Text in das aktive Fenster...


Was sagt uns die Angabe:
Zwischen den Tastdendrücken sollen 1,5 Sekunden Pause sein
Wir müssen unser Programm nach einem Tastdruck 1,5 Sekunden schlafen legen(weil sonst wiederhollt sich die Schleife immer wieder ohne Pause)
Hierzu verwenden wir:
sleep(Zeit)
Besonders wichtig ist hierbei das die Zeit in Millisekunden angegeben werden muss(1 sek = 1000 Millisekunden)
Für unser Beispiel heißt das 1,5 Sekunden = 1500 Millisekunden also
sleep(1500)

Da wir jetz alles wissen um unser Programm zu entwicklen kann es nun los gehen.
  1. Wir starten SciTE (das finde wir im Startmeue unter Autoit V3/SciTe)
  2. Wir klicken auf das weiße Blatt Papier(New)
  3. Nun schreiben wir einmal unsere Schleife
Code:

While 1=1
 
WEND

4. Nun fügen wir das Send hinzu
Code:

While 1=1
 
    Send("asdf")
WEND

5. Jetzt wollen wir auch noch die gewünschte Pause hinzufügen
Code:

While 1=1
      Send("asdf")
      sleep(1500)
WEND

6.) Unser Programm ist jetzt fertig. Wir speichern es mit einem Klick auf das Diskettensymbol(Namen könnt ihr euch aussuchen).
7.) Jetzt braucht ihr nur mehr auf F5 drücken und euer Programm wird ausgeführt(F5 ist das selbe wie ein Klick auf Tools/Go)
8) Nun wird alle 1,5 Sekunden "asdf" an das Fenster im Vordergrund gesendet
9) Zum Stoppen des Programm macht ihr einen Rechtsklick auf den Blauen Kreis mit dem A(das Autoit-Symbol) und wählt "Exit".
10) FERTIG!


Ein konkrettes Beispiel oder wofür bracu ich das jetzt?
Das braucht ihr z.B. für einfache NosTale Bots:
EIn Bot der alle 0,5 Sekunden einmal die Leertaste drückt(was in Nostale ein Autofight-Bot wäre):
Code:

While 1=1
      Send(" ")
      sleep(500)
WEND

Und fertig =)

NetMax 07/26/2009 11:13

Programmierkurs by NetMax - LEKTION III Senden im Hintergrund, Variablen und Kommenta
 
Da wir jetzt schon Zeichen an Programme senden können wäre es doch schön wenn wir nebenbei z.B. Internet surfen könnten. Also müssten wir Zeichen an Programme senden die im Hintergrund ausgeführt werden. In folgenden Besipiel werden wir Space an das Programm NosTale senden.

Wie funktioniert das?
Wir brauchen den Titel des Programms. Diesen wollen wir in einer Variable speichern. Dann öffent unser Programm die Kommunikationsschnittstellen des Fensters mit dem Namen aus der Variable. Wenn dies gelingt können wir mit ControllSend texte an das Fenster schicken. Wenn nicht wird eine fehlermeldung ausgeben(MsgBox) und das Programm beendet. Um diese Bedingung zu überprüfen brauch wir ein IF.

Was ist ein IF?
Mit einem If können wir bedingungen überprüfen.
Code:

If Bedingung Then
  ....
Else
.....
EndIf

Die Anweisungen unter dem Else geben an was gemacht werden sol wenn die Bedingung nicht erfüllt ist

Nun gehts los:
1) Wir speichern uns den Namen des Fensters das wir ansprechen wollen in der Variable
Code:

$fenstername = "NosTale"
2) Nun öffnen wir die Kommunikationsschniitstellen(das machen wir weil wir wissen wollen ob es überhaupt ein Fenster gibt das diesen Namen hat)
Code:

$handle = WinGetHandle($windowname, "")
3) Nun müssen wir überprüfen ob wir das Fenster öffnen konnten. Dazu verwenden wir eine Systemvariable von Autoit @error. Es gibt einige Varaiblen die von AutoIT bereits vordefiniert und automatisch befüllt sind. In @error steht true(also wahr) wenn ein fehler aufgetreten ist und false(also falsch) wenn keiner aufgetreten ist.
Code:

If @error Then
   
Else
         
EndIf

4) Nun geben wir eine Fehlermeldung aus wenn ein Fehler aufgetreten ist. Dafür verwenden wir die Funktion MsgBox
MsgBox(Nr, "Titel", "Text")

Für unser Programm schaut das so aus:
Code:

AutoItSetOption("WinTitleMatchMode", 4)
$windowname="NosTale"
$handle  = WinGetHandle($windowname, "")
If @error Then
    MsgBox(4096, "Error", "Could not find the correct window")
Else
   
EndIf

5) Nun sollten wir auch was tun wenn kein Fehler auftritt :D
Wir schreiben wieder unsere Schleife mit dem sleep wie vorher. Das Send lassen wir jetzt aber vorläufig weg.
Code:

AutoItSetOption("WinTitleMatchMode", 4)
$windowname="NosTale"
$handle  = WinGetHandle($windowname, "")
If @error Then
    MsgBox(4096, "Error", "Could not find the correct window")
Else
 
    while 1
     
        sleep(150)
    WEnd

EndIf

6) Jetzt kann unser Programm schon ziemlich viel(außer texte senden).
Um im Hintergund zu senden verwenden wir ControllSend
Code:

ControlSend($fenstername,'','',"TEXT")
Die Paramter in der Mitte sind uns daweil noch egal.
Bauen wir das ganze jetzt in unser Programm ein:
Code:

AutoItSetOption("WinTitleMatchMode", 4)
$windowname="NosTale"
$handle = WinGetHandle($windowname, "")
If @error Then
    MsgBox(4096, "Error", "Fenster konnte nicht gefunden werden")
Else
 
    while 1
        ControlSend($windowname,'',''," ")
        sleep(150)
    WEnd

       
EndIf

Unser Programm ist nun fertig. Wir können es nun speichern und mit F5 ausführen.

Anwenden könnte man so ein Script für Bots.

NetMax 07/26/2009 11:16

Programmierkurs by NetMax - LEKTION IV Hotkeys
 
Jetzt da unser Programm ja schon ziemlich gut läuft wollen wir vielleicht die Möglichkeit schaffen es über die Tastatur zu beenden, zu pausierenn bzw wieder fortzusetzen...

Was wir bisher haben:
Code:

AutoItSetOption("WinTitleMatchMode", 4)
$windowname="NosTale"
$handle = WinGetHandle($windowname, "")
If @error Then
    MsgBox(4096, "Error", "Fenster konnte nicht gefunden werden")
Else
 
    while 1
        ControlSend($windowname,'','',"asdf")
        sleep(150)
    WEnd

       
    EndIf

Jetz wollen wir unser Script mit Escape beenden und mit der Pause-Taste pausieren bzw wieder fortstetzen können.

Zuerst müssen wir festlegen das eine Taste eine bestimmte Funktion aufruft das machen wir so:
HotKeySet("{PAUSE}","TogglePause")
{PAUSE} ist die Taste. Also in diesen Fall die Pause Taste
TooglePause ist die Funktion die aufgerufen werden soll(Diese müssen wir selbst programmieren.)

Nun wollen wir die Funktion TooglePause porgrammieren. Daweil wissen wir aber noch nicht einmal was eine Funktion ist. Eine Funktion kann aufgerufen werden. Sie bekommt verschiedene Parameter und kann einen Wert zurückgeben.

Nun zu unserer TogglePause-Funktion. Wir brauchen eine Variable die speichert ob das Script pausiert ist oder nicht. Bei jedem aufruf von TogglePause müssen wir den Wert von Pause umsetzen.
z.b. wenn $Paused true ist wird durch $pause = not $Pause der wert genau geändert
also $pause = not true = false. Jetzt machen wir eine Schleife die abbricht wenn Paused false ist(also nicht pausiert).Um nicht die CPU-Resourcen zu verschwenden findet die Überprüfung nur alle 100 Millisekunden statt.
Code:

Global $Paused
 Func TogglePause()
    $Paused = NOT $Paused
    While $Paused
        sleep(100)
    WEnd
   
 EndFunc

Jetzt wollen wir das Programm mit ESC beenden dazu benötigen wir wieder ein HotKeySet
HotKeySet("{ESC}","Terminate")

jetzt müssen wir wieder die Funktion Terminate programmieren:
Code:

Func Terminate()
    Exit  0
 EndFunc


Unser Bsp aus der Lektion 3 sieht nun so aus:
Code:

AutoItSetOption("WinTitleMatchMode", 4)
Global $Paused
 HotKeySet("{PAUSE}", "TogglePause")
 HotKeySet("{ESC}", "Terminate")
$windowname="NosTale"
$handle  = WinGetHandle($windowname, "")
If @error Then
    MsgBox(4096,  "Error", "Fenster konnte nicht gefunden werden")
Else
 
    while 1
        ControlSend($windowname,'','',"asdf")
        sleep(150)
    WEnd

Func TogglePause()
    $Paused = NOT $Paused
    While $Paused
        sleep(100)
      WEnd
  EndFunc
 
 Func Terminate()
    Exit  0
 EndFunc
       
    EndIf


NetMax 07/26/2009 11:17

Programmierkurs by NetMax - LEKTION V InputBoxen und Timer
 
Heute lernen wir einen der wichtigsten Aspekte für Bots: Timer.
TImer führen Befehle oder Funktionen nach einer bestimmten Zeit aus.

Wofür brauch ich Timer:
Programmiere einen Bot der alle 3 Minuten schalfen geht(die Taste T drückt) und sonst immer die Leertaste. Der Bot soll eine bestimmte Zeit die vom Benutzer eingebe wurde schlafen.

Wie funktiioniert ein timer:
  • Zuerst speichern man die aktuelle Zeit(ist ein Timestamp aber das ist uns egal) $WertVonAnfang = TImerInit()
  • Dann macht man eine Hauptschleife
  • In der Hauptschleife muss man Vergleichen ob die Differenz eine bestimmte Zeit in Millisekunden übersteigt TimerDiff(WertVonAnfang) > ZeitDieManWartenWill
Mit diesem Wissen können wir jetzt schon unseren ersten Timer programmieren:
Damit sich er Ablauf immer widerholt nehmen wir in der Schleife nach dem der befehl ausgeführt wurde den aktuellen Wert und setzen ihn als neuen Anfangswert: $timer1 = TimerInit()
Code:

$timer1 = TimerInit ()

While 1
    If TimerDiff ($timer1) > 5000 then
        MsgBox (0,"","5 sekunden sind vergangen")
        $timer1 = TimerInit()
    EndIf
WEnd


Nun wollen wir vielleicht den Benutzer entscheiden lassen wie lange gewartet werden soll:
Eingaben einlesen können wir mit dem Befehl InputBox("Titel","Frage"). Diese Funktion gibt uns einen Wert zurück den wir natürlich in einer Variable speichern müssen:
$zeit = InputBox("Frage?","Wielange soll gewartet werden?")


Da wir nun alles wissen programmieren wir jetzt das Beispiel von oben.
Hier nochmal zur Erinnerung
Programmiere einen Bot der alle x Minuten schlafen geht(die Taste T drückt) und sonst immer die Leertaste. Der Bot soll eine bestimmte Zeit die vom Benutzer eingebe wurde schlafen. Auch x ist vom Benutzer einzulesen

Code:


$zeitLeveln = InputBox("Frage?","Wielange Leveln bis geschlafen wird? (zeit in Millisekunden)")
$zeitSchlafen = InputBox("Frage?","Wielange soll geschlafen werden? (zeit in Millisekunden)")
$timer1 = TimerInit ()

While 1
    If TimerDiff  ($timer1) > $zeitLeveln then
        send("T")
        sleep($zeitSchlafen)
        send("T")
        $timer1 = TimerInit()
    EndIf
  Send(" ")
WEnd

Und fertig ist der Bot der Leveln und Schlafen kann ;)


Jetzt wollen wir das ganze natütlich auch in user großes Beispiel integrieren:
Code:

AutoItSetOption("WinTitleMatchMode", 4)
Global $Paused
 HotKeySet("{PAUSE}", "TogglePause")
 HotKeySet("{ESC}", "Terminate")
$zeitLeveln = InputBox("Frage?","Wielange Leveln bis geschlafen wird?  (zeit in Millisekunden)")
$zeitSchlafen = InputBox("Frage?","Wielange  soll geschlafen werden? (zeit in Millisekunden)")
$timer1 =  TimerInit ()
$windowname="NosTale"
$handle  = WinGetHandle($windowname, "")
If @error Then
    MsgBox(4096,  "Error", "Fenster konnte nicht gefunden werden")
Else
 
    while 1
If TimerDiff  ($timer1) > $zeitLeveln then
        ControlSend($windowname,'','',"T")
        sleep($zeitSchlafen)
        ControlSend($windowname,'','',"T")
        $timer1 =  TimerInit()
    EndIf
        ControlSend($windowname,'',''," ")
        sleep(150)
    WEnd


       
    EndIf

Func TogglePause()
    $Paused = NOT $Paused
    While $Paused
          sleep(100)
      WEnd
  EndFunc
 
 Func  Terminate()
    Exit  0
 EndFunc


NetMax 07/26/2009 11:19

Programmierkurs by NetMax - LEKTION VI Struktiuriertes Programmieren und Kommentare
 
[align=left]Bei der Entwicklung größerer Programme ist es besonders wichtig das man strukturiet programmiert d.h. das man z.B. sich wiederhollende Bestandteile in Funktionen auslagert. Auch ist es wichtig das man z.B Teile wie angreifen und diverse Funktionen auslagert. Dies erleichert später den Austausch dieser Funktionen.


Beispiel erweitern Sie das Programm um eine Aufsammel funktion. Der Benutzer soll eingeben können nach wievielen Tastendrücken der Leertaste 2 mal die Aufsammeltaste gedrückt werden soll. Auch soll nach dem Schlafen 2 mal die Aufsammel Taste gedürckt werden. Die Aufasammeltaste soll in einer Variable definiert sein.

Das haben wir bisher.
Code:

AutoItSetOption("WinTitleMatchMode", 4)
Global $Paused
HotKeySet("{PAUSE}", "TogglePause")
HotKeySet("{ESC}", "Terminate")
$zeitLeveln = InputBox("Frage?", "Wielange Leveln bis geschlafen wird?  (zeit in Millisekunden)")
$zeitSchlafen = InputBox("Frage?", "Wielange  soll geschlafen werden? (zeit in Millisekunden)")
$timer1 = TimerInit()
$windowname = "NosTale"
$handle = WinGetHandle($windowname, "")
If @error Then
    MsgBox(4096, "Error", "Fenster konnte nicht gefunden werden")
Else

    While 1
        If(TimerDiff($timer1) > $zeitLeveln) Then
            ControlSend($windowname, '', '', "T")
            Sleep($zeitSchlafen)
            ControlSend($windowname, '', '', "T")
            $timer1 = TimerInit()
        EndIf
        ControlSend($windowname, '', '', " ")
        Sleep(150)
    WEnd


   

EndIf




Func TogglePause()
        $Paused = Not $Paused
        While $Paused
            Sleep(100)
        WEnd
    EndFunc 


Func Terminate()
    Exit 0
EndFunc


Zunächst schreiben wir jetzt eine Angriffsfuntkion(diese können wir später z.B. für den EInsatz von Skills erweitern):
Code:

Func Attack()
    ControlSend($windowname, '', '', " ")
EndFunc

Nun schreiben wir eine Funktion die Überprüft ob esZeit ist zum schlafen. Dieser geben wir den sprechenden Namen isSleepTime. Diese Funktion gibt True zurück wenn es Zeit ist zu schlafen und False wenn wir nicht schlafen müssen
Code:

Func isSleepTime()
    If(TimerDiff($timer1) > $zeitLeveln) Then
        return True
    Else
        return False
    EndIf
EndFunc

Nun programmieren wir noch eine Funktion die Schlafen heißt:
Sie führt einfach alle befehle aus die wir für einen Schlafvorgang bracuhen also Niedersetzen, Warten, Aufstehen
Code:

Func Schlafen()
    ControlSend($windowname, '', '', "T")
    Sleep($zeitSchlafen)
    ControlSend($windowname, '', '', "T")
    $timer1 = TimerInit()
EndFunc


Nun bauen wir die Funktionen ein. Das sollte dann so aussehen:

Code:

AutoItSetOption("WinTitleMatchMode", 4)
Global $Paused
HotKeySet("{PAUSE}", "TogglePause")
HotKeySet("{ESC}", "Terminate")
$zeitLeveln = InputBox("Frage?", "Wielange Leveln bis geschlafen wird?  (zeit in Millisekunden)")
$zeitSchlafen = InputBox("Frage?", "Wielange  soll geschlafen werden? (zeit in Millisekunden)")
$timer1 = TimerInit()
$windowname = "NosTale"
$handle = WinGetHandle($windowname, "")
If @error Then
    MsgBox(4096, "Error", "Fenster konnte nicht gefunden werden")
Else

    While 1
        If(isSleepTime()) Then
            Schlafen()
           
        EndIf
        Attack()
        Sleep(150)
    WEnd


   

EndIf


Func Attack()
    ControlSend($windowname, '', '', " ")
EndFunc
Func isSleepTime()
    If(TimerDiff($timer1) > $zeitLeveln) Then
        return True
    Else
        return False
    EndIf
EndFunc

Func Schlafen()
    ControlSend($windowname, '', '', "T")
    Sleep($zeitSchlafen)
    ControlSend($windowname, '', '', "T")
    $timer1 = TimerInit()
EndFunc
   

Func TogglePause()
        $Paused = Not $Paused
        While $Paused
            Sleep(100)
        WEnd
    EndFunc 


Func Terminate()
    Exit 0
EndFunc

Jetzt müssen wir nur noch die neuen Funktionen porgrammieren.

Beispiel erweitern Sie das Programm um eine Aufsammel funktion. Der Benutzer soll eingeben können nach wievielen Tastendrücken der Leertaste 2 mal die Aufsammeltaste gedrückt werden soll. Auch soll nach dem Schlafen 2 mal die Aufsammel Taste gedürckt werden. Die Aufasammeltaste soll in einer Variable definiert sein.

Ok. Wie wir Benutzereingaben realisieren können wissen wir schon:
Mit einer InputBox

$nachwvdl = InputBox("Frage?","Nach wievielen Schleifendurchläufen soll aufgesammlt werden")

Der LootKey soll in einer Variable gespeichert sein:
$lootkey = "R";

Nun müssen wir die Aufsammel-Funktion programmieren
Code:

Func Loot()
    ControlSend($windowname, '', '', $lootkey)
    Sleep(1000)
    ControlSend($windowname, '', '', $lootkey)
    EndFunc

Diese Funktion müssen wir jetzt nur mehr an den richtigen Stellen in unserem Beispiel aufrufen:

Code:

AutoItSetOption("WinTitleMatchMode", 4)
$nachwvdl = InputBox("Frage?","Nach wievielen Schleifendurchläufen soll  aufgesammlt werden")
Global $Paused
$lootkey = "R";
HotKeySet("{PAUSE}",  "TogglePause")
HotKeySet("{ESC}", "Terminate")
$zeitLeveln =  InputBox("Frage?", "Wielange Leveln bis geschlafen wird?  (zeit in  Millisekunden)")
$zeitSchlafen = InputBox("Frage?", "Wielange  soll  geschlafen werden? (zeit in Millisekunden)")
$timer1 = TimerInit()
$windowname  = "NosTale"
$handle = WinGetHandle($windowname, "")
If @error  Then
    MsgBox(4096, "Error", "Fenster konnte nicht gefunden  werden")
Else
$durchl = 0
    While 1
        If(isSleepTime()) Then
            Schlafen()
Loot()
           
        EndIf
        Attack()

        Sleep(150)
if($durchl >=  $nachwvdl) THEN
            Loot()
            $durchl = 0
EndIf
$durchl = $durchl + 1

    WEnd


   

EndIf


Func  Attack()
    ControlSend($windowname, '', '', " ")
EndFunc
Func  isSleepTime()
    If(TimerDiff($timer1) > $zeitLeveln) Then
        return True
    Else
        return False
    EndIf
EndFunc

Func  Schlafen()
    ControlSend($windowname, '', '', "T")
    Sleep($zeitSchlafen)
    ControlSend($windowname, '', '', "T")
    $timer1 = TimerInit()
EndFunc
   

Func TogglePause()
        $Paused = Not $Paused
        While $Paused
            Sleep(100)
        WEnd
    EndFunc 


Func Terminate()
    Exit 0
EndFunc

Func Loot()
    ControlSend($windowname, '', '', $lootkey)
      Sleep(1000)
    ControlSend($windowname, '', '', $lootkey)
      EndFunc



[/align]

NetMax 07/26/2009 11:22

Programmierkurs by NetMax - LEKTION VII Arbeitspeicher lesen I
 
Jetzt soll sich unser Bot natürlich nur hinsetzen wenn es wirklcih notwendig ist

Wie könnte man vorgehen:
HP ermitteln --> schauen ob kleiner als Wert --> hinsetzen --> Überprüfen ob HP > WertMax --> Aufstehen sonst NIXTUN

Wie gehen wir jetzt vor:
Wir starten das Spiel von dem wir den Wert ermitteln wollen in unserem Beispiel NosTale
Wir loggen uns ein
Wir sehen unseren derzeitigen HP Stand.
Diesen Wert merken wir uns.

Nun brauchen wir Cheatengine
[Only registered and activated users can see links. Click Here To Register...]

Nun solltet ihr CheatEngine installieren

Starte CheatEngine
Nun nehme deine aktuelle HealthPoints(nicht die MaxPoints) und merke sie dir.
Klicke in Cheatengine auf das Lupensymbol

Das rot Markiete!

Du kommst in die ProcessList:

Wähle NostaleX.dat und drücke auf OPEN



Nun gibt deine aktuellen Healthpoints von vorher in das Feld Value ein!
Dann klicke auf First Scan(beim mir auf der Grafik steht „New Scan“ weil ich da schon drauf geklickt habe).

Nun lasse dich leicht verwunden

Gib deine veringerte HP Zahl nun in das Value-Feld ein und drücke „Next Scan“
Nun solltest du die Speicheradresse sehen(in diesem Fall 027A839C)



Der Bot benötigt die Speicheradresse allerdings nicht so: 027A839C
Plaziere nun zwischen 0 der daraufolgenden Zahl ein x also:
0x27A839C
Diese Adresse brauchen wir

Nun zum eigentlichen Programm
Code:

$SPA = "0x27A839C"
$pid = WinGetProcess($windowname) ; hier besorge ich die PID
;open the process
$ProcessInformation = _MemoryOpen($pid)
$Number = _MemoryRead($SPA, $ProcessInformation)
_MemoryClose($ProcessInformation)

Mit diesem Wissen können wir:
  • Die HP auslesen und darauf reagieren
  • Die MP auslesen und darauf reagieren
  • Auslesen ob unser Charakter sitzt oder steht
  • Auslesen ob wir ein Monster ausgewählt haben

BILDER FOLGEN SPÄTER!

NetMax 07/26/2009 11:23

Programmierkurs by NetMax - LEKTION VIII Grafisches Benutzerinterface(GUI) Teil I
 
Das GUI werde ich anhand von KODA erklären
Der Koda ist ein Programm um GUI´s (Graphical User Interface) für AutoIt Programme zu schreiben und zu gestalten. Das Programm haben wir ja schon bereits in Lektion I installiert.

Nun ändern wir die Sprache auf Deutsch. Dazu klickt Man auf den Menuepunkt "Options" und wählt danach "Settings". Hier dann "German" anwählen nun OK klicken.
Zum erstellen eines GUIs öffnet man den Formdesigner. Hier kann man ein GUI anlegen. Nach einem Klick auf Neu steht man vor einem leeren Formular was nun mit Elementen füllen kann. Sitlich im sogenannten ObjectInspector ist es ganz wichtig die EIgenschaften Name(der Name des Elements) und Caption(der Text der angezeigt wird) auszufüllen. Cation gibt es nicht immer da für z.B. Eingabefelder dieser Wert Text heißt(kann auch leer bleiben)
[Only registered and activated users can see links. Click Here To Register...]

Für einen einfachen Button und eine Checkbox könnte das so aussehen:
[Only registered and activated users can see links. Click Here To Register...]
Nun wählt man Erzeuge Code und kopiert den Code. Diesen kann man dann in sein AutoIt-Programm einfügen
[Only registered and activated users can see links. Click Here To Register...]
So kann der Code aussehen
[Only registered and activated users can see links. Click Here To Register...]
Die eigentlichen Programmierschritte lernen wir in der nächsten Lektion.

NetMax 07/26/2009 11:25

FRAGEN BITTE IN DEN THREAD "Fragen zu NetMax's Programmiertutorial"

NetMax 08/26/2009 11:26

Programmierkurs by NetMax - LEKTION IX Grafisches Benutzerinterface(GUI) Teil II, Ini
 
Im heutigen Tutorial werden wir mit Hilfe des Wissens was wir bisher erworben haben dieses Benutzerinterface erstellen.

[Only registered and activated users can see links. Click Here To Register...]


Wichtig:
Name für das HP-Eingabefeld = txtHP
name für das Aufsammeltastenfeld = txtASK
name für das Schlaftastenfeld = txtSK
name für die minHP = txtMinHP
name für die maxHP = txtMaxHP
Für die Checkbox(Das zu Anhaken) = chkAufsammeln
der StartButton = cmdSS
der Pausebutton = cmdPause

Legt nun das Benutzerinterface so wie abgebildet an!

Nun lassen wir uns(wieim letzten Tutorial gelernt) den Code generieren.

Wir erhalten in etwas folgendes:
Code:

#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("NetMax's TutorialBot", 259, 403, 192, 124)
$grpAufsammeln = GUICtrlCreateGroup("Aufsammeln", 16, 88, 233, 65)
$chkAufsammeln = GUICtrlCreateCheckbox("Aufsammeln", 88, 128, 97, 17)
$Label2 = GUICtrlCreateLabel("Aufsammeltaste", 32, 104, 78, 17)
$txtASK = GUICtrlCreateInput("", 120, 104, 121, 21)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$grpAdd = GUICtrlCreateGroup("Adressen", 16, 24, 233, 57)
$Label1 = GUICtrlCreateLabel("HP", 32, 56, 19, 17)
$txtHP = GUICtrlCreateInput("", 88, 48, 121, 21)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$grpSteuerung = GUICtrlCreateGroup("Steuerung", 16, 304, 233, 81)
$cmdSS = GUICtrlCreateButton("Start", 48, 320, 179, 25, 0)
$cmdPause = GUICtrlCreateButton("Pause", 48, 348, 179, 25, 0)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Sonstige = GUICtrlCreateGroup("Sonstige Tasten", 16, 152, 233, 57)
$Label3 = GUICtrlCreateLabel("Schlaf-Taste", 32, 176, 64, 17)
$txtSK = GUICtrlCreateInput("", 120, 174, 121, 21)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Group1 = GUICtrlCreateGroup("Sonstige Einstellungen", 16, 216, 233, 89)
$Label4 = GUICtrlCreateLabel("MinHP", 32, 240, 36, 17)
$Label5 = GUICtrlCreateLabel("MaxHP", 32, 274, 39, 17)
$txtMinHP = GUICtrlCreateInput("", 99, 238, 121, 21)
$txtMaxHP = GUICtrlCreateInput("", 97, 271, 121, 21)
GUICtrlCreateGroup("", -99, -99, 1, 1)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case $GUI_EVENT_CLOSE
                        Exit

        EndSwitch
WEnd

Nun wollen wir die Aktionen für die Tasten definieren. Wir sehen eine While-Schleife.
$nMsg = GUIGetMsg() fragt ab ob sich etwas am formular geändert hat.
Das Switch unterscheidet die einzelnen Veränderungen.
Standartmäßig gibt es
Code:

Case $GUI_EVENT_CLOSE
                        Exit

Nun wollen wir eine Aktion für unseren Startknopf definieren. Dieser heißt cmdSS
Wir fügen ein Case hinzu:
Code:

Case $cmdSS
                        startstop()

Die Funktion startstop() werden wir später definieren

Nun definieren wir auch noch eine Aktion für den Pause-Knopf(cmdPause):
Code:

Case $cmdPause
                        pause()

Der fertige Code mit dem Rohbau der Funktionen startstop() und TogglePause() sollte so aussehen:
Code:

#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

#Region ### START Koda GUI section ### Form=
...
#EndRegion ### END Koda GUI section ###
func startstop()
        ;die StartStopFUnktion
EndFunc
func TogglePause()
        ;die PauseFUnktion
EndFunc

While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case $GUI_EVENT_CLOSE
                        Exit
                Case $cmdSS
                        startstop()
                Case $cmdPause
                        TogglePause()

        EndSwitch
WEnd


Da wir das Rad nicht jedesmal neuerfinden müssen nehmen wir einfach die Pause Funktion aus LEKTION VI.
Zur erinnerung folgende Code-Teile sind für die Pause funktion wichtig:
Code:

Global $Paused
HotKeySet("{PAUSE}", "TogglePause")
Func TogglePause()
        $Paused = Not $Paused
        While $Paused
            Sleep(100)
        WEnd
    EndFunc

Diese Funktion bauen wir jetzt gleih in unseren Code ein:
Code:

#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
Global $Paused
HotKeySet("{PAUSE}", "TogglePause")
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("NetMax's TutorialBot", 259, 340, 192, 124)
$grpAufsammeln = GUICtrlCreateGroup("Aufsammeln", 16, 104, 233, 105)
$chkAufsammeln = GUICtrlCreateCheckbox("Aufsammeln", 88, 176, 97, 17)
$Label2 = GUICtrlCreateLabel("Aufsammeltaste", 32, 136, 78, 17)
$txtASK = GUICtrlCreateInput("", 120, 136, 121, 21)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$grpAdd = GUICtrlCreateGroup("Adressen", 16, 24, 233, 73)
$Label1 = GUICtrlCreateLabel("HP", 32, 56, 19, 17)
$txtHP = GUICtrlCreateInput("", 88, 48, 121, 21)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$grpSteuerung = GUICtrlCreateGroup("Steuerung", 16, 216, 233, 105)
$cmdSS = GUICtrlCreateButton("Start", 48, 240, 179, 25, 0)
$cmdPause = GUICtrlCreateButton("Pause", 48, 268, 179, 25, 0)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Sonstige = GUICtrlCreateGroup("Sonstige Tasten", 16, 152, 233, 57)
$Label3 = GUICtrlCreateLabel("Schlaf-Taste", 32, 176, 64, 17)
$txtSK = GUICtrlCreateInput("", 120, 174, 121, 21)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Group1 = GUICtrlCreateGroup("Sonstige Einstellungen", 16, 216, 233, 89)
$Label4 = GUICtrlCreateLabel("MinHP", 32, 240, 36, 17)
$Label5 = GUICtrlCreateLabel("MaxHP", 32, 274, 39, 17)
$txtMinHP = GUICtrlCreateInput("", 99, 238, 121, 21)
$txtMaxHP = GUICtrlCreateInput("", 97, 271, 121, 21)
GUICtrlCreateGroup("", -99, -99, 1, 1)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
func startstop()
        ;die StartStopFUnktion
EndFunc
Func TogglePause()
        $Paused = Not $Paused
        While $Paused
            Sleep(100)
        WEnd
    EndFunc

While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case $GUI_EVENT_CLOSE
                        Exit
                Case $cmdSS
                        startstop()
                Case $cmdPause
                        TogglePause()

        EndSwitch
WEnd

Wir wollen einen Bot machen der sich hinsetzt wenn zu wenig HP vorhanden sind. Dann sitzen bleibt bis wieder die Maximalen HP erreicht sind. Zwischendurch greift er an und sammelt auf. Die HP Zahl lesen wir wie in LEKTION VII aus dem Arbeitspeicher aus.

Was brauchen wir?
4 neue Funktionen:
doSleep() --> Setzt sich hin und wartet bis HP wieder voll. Steht dannach auf.
attack() --> Drückt den Attack Key
loot() --> Drückt die Aufsammeltaste
checkHP() --> Ließt die aktuellen HP aus dem Arbeitsspeicher und gibt sie Zurück

und wir müssen das Programm erweitern:

checkHP():
Code:

func checkHP()
$SPA = "0x27A839C" ; Die Speicheradresse(mit CE suchen)
$pid = WinGetProcess($windowname) ; hier besorge ich die PID
; process öffnen
$ProcessInformation = _MemoryOpen($pid)
$Number = _MemoryRead($SPA, $ProcessInformation) ;Lesen
_MemoryClose($ProcessInformation)
return $Number ; Wert zurückgeben
EndFunc

doSleep():
Code:

func doSleep()
        ControlSend($windowname, '', '', $sk) ;Schlaftaste drücken
        while(checkHP()<$maxHP) ; Schauen ob aktuelle HP < maxHP sind
                sleep(500) ; Warten
        WEnd
        ControlSend($windowname, '', '', $sk) ; Wiederaufstehen
       
EndFunc

attack und loot senden jeweils nur eine Taste:
Code:

func loot()
        ControlSend($windowname, '', '', $lk)
EndFunc

func attack()
        ControlSend($windowname, '', '', $atk)
EndFunc

Das hauptprogramm:
Code:

if $running == True Then ; $running müssen wir in der Funktion startstop() setzen
        if(checkHP()<$minHP) Then ; wir schauen ob die Hp kleiner als die MinimumHP sind --> wenn ja schlafen
                doSleep()
        EndIf
       
        attack() ;--> Angreifen
        loot() ; --> Aufsammeln
EndIf


Die veränderte startstop Funktion:
Code:

$running = false
func startstop()
        $running = NOT $running
EndFunc

Das ganze sieht nun so aus:
Code:

#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
Global $Paused
HotKeySet("{PAUSE}", "TogglePause")
#Region ### START Koda GUI section ### Form=
...gekürzt...
#EndRegion ### END Koda GUI section ###
func startstop()
        $running = NOT $running
EndFunc
Func TogglePause()
        $Paused = Not $Paused
        While $Paused
            Sleep(100)
        WEnd
EndFunc
func checkHP()
$SPA = "0x27A839C"
$pid = WinGetProcess($windowname) ; hier besorge ich die PID
;open the process
$ProcessInformation = _MemoryOpen($pid)
$Number = _MemoryRead($SPA, $ProcessInformation)
_MemoryClose($ProcessInformation)
return $Number
EndFunc
func loot()
        ControlSend($windowname, '', '', $lk)
EndFunc

func attack()
        ControlSend($windowname, '', '', $atk)
EndFunc

func doSleep()
        ControlSend($windowname, '', '', $sk)
        while(checkHP()<$maxHP)
                sleep(500)
        WEnd
        ControlSend($windowname, '', '', $sk)
       
EndFunc

While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case $GUI_EVENT_CLOSE
                        Exit
                Case $cmdSS
                        startstop()
                Case $cmdPause
                        TogglePause()
        EndSwitch
if $running == True Then
        if(checkHP()<$minHP) Then
                doSleep()
        EndIf
       
        attack()
        loot()
EndIf
WEnd


NetMax 08/26/2009 11:28

LEKTION IX Grafisches Benutzerinterface(GUI) Teil II, Inis, Arbeitspeicher TEIL2
 
Nun brauchen wir folgende Informationen
$minHP --> minimale HP
$maxHP --> maximale HP
$windowName --> fenstername
$SPA --> HPAdresse
$sk --> SleepKey
$ASK --> Aufsammeltaste

WindowName definieren wir einfach
$windowname = "NosTale"

Doch wie bekommen wir jetzt die anderen Werte(die wir ja schon in den Textboxen haben)?
Für normale textfelder geht das ganz einfach GUICtrlRead(TEXTFELDNAME)
Also z.B.
$minHP = GUICtrlRead($txtMinHP)
$maxHP = GUICtrlRead($txtMaxHP)
$SPA = GUICtrlRead($txtHP)
$sk = GUICtrlRead($txtSK)
$lk = GUICtrlRead($txtASK)

Nun bauen wir diese Zeile vor den ersten Funktionen ein:
Code:

#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>


#include <NomadMemory.au3>



Global $Paused
$running = false
HotKeySet("{PAUSE}", "TogglePause")
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("NetMax's TutorialBot", 259, 403, 192, 124)
$grpAufsammeln = GUICtrlCreateGroup("Aufsammeln", 16, 88, 233, 65)
$chkAufsammeln = GUICtrlCreateCheckbox("Aufsammeln", 88, 128, 97, 17)
$Label2 = GUICtrlCreateLabel("Aufsammeltaste", 32, 104, 78, 17)
$txtASK = GUICtrlCreateInput("", 120, 104, 121, 21)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$grpAdd = GUICtrlCreateGroup("Adressen", 16, 24, 233, 57)
$Label1 = GUICtrlCreateLabel("HP", 32, 56, 19, 17)
$txtHP = GUICtrlCreateInput("", 88, 48, 121, 21)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$grpSteuerung = GUICtrlCreateGroup("Steuerung", 16, 304, 233, 81)
$cmdSS = GUICtrlCreateButton("Start", 48, 320, 179, 25, 0)
$cmdPause = GUICtrlCreateButton("Pause", 48, 348, 179, 25, 0)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Sonstige = GUICtrlCreateGroup("Sonstige Tasten", 16, 152, 233, 57)
$Label3 = GUICtrlCreateLabel("Schlaf-Taste", 32, 176, 64, 17)
$txtSK = GUICtrlCreateInput("", 120, 174, 121, 21)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Group1 = GUICtrlCreateGroup("Sonstige Einstellungen", 16, 216, 233, 89)
$Label4 = GUICtrlCreateLabel("MinHP", 32, 240, 36, 17)
$Label5 = GUICtrlCreateLabel("MaxHP", 32, 274, 39, 17)
$txtMinHP = GUICtrlCreateInput("", 99, 238, 121, 21)
$txtMaxHP = GUICtrlCreateInput("", 97, 271, 121, 21)
GUICtrlCreateGroup("", -99, -99, 1, 1)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
$windowname = "NosTale"
$minHP = GUICtrlRead($txtMinHP)
$maxHP = GUICtrlRead($txtMaxHP)
$SPA = GUICtrlRead($txtHP)
$sk = GUICtrlRead($txtSK)
$lk = GUICtrlRead($txtASK)

func startstop()
        $running = NOT $running
EndFunc

Func TogglePause()
        $Paused = Not $Paused
        While $Paused
            Sleep(100)
        WEnd
EndFunc

func checkHP()
$SPA = "0x27A839C"
$pid = WinGetProcess($windowname) ; hier besorge ich die PID
;open the process
$ProcessInformation = _MemoryOpen($pid)
$Number = _MemoryRead($SPA, $ProcessInformation)
_MemoryClose($ProcessInformation)
return $Number
EndFunc
func loot()
        ControlSend($windowname, '', '', $lk)
EndFunc

func attack()
        ControlSend($windowname, '', '', "{SPACE}")
EndFunc

func doSleep()
        ControlSend($windowname, '', '', $sk)
        while(checkHP()<$maxHP)
                sleep(500)
        WEnd
        ControlSend($windowname, '', '', $sk)

EndFunc

While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case $GUI_EVENT_CLOSE
                        Exit
                Case $cmdSS
                        startstop()
                Case $cmdPause
                        TogglePause()

        EndSwitch

if $running == True Then
        if(checkHP()<$minHP) Then
                doSleep()
        EndIf

        attack()
        loot()
EndIf


WEnd

Nun fehlt uns noch die Checkbox(Diese gibt an ob der Bot aufsammeln soll oder nicht)
Code:

if BitAnd(GUICtrlRead($chkNAME), $GUI_CHECKED) THEN
        ;Ausgewählt also sammeln
Else
        ;nicht ausgewählt
EndIf

Nun passen wir unsere Loot-Funktion(die Funktion zum Aufsammeln) an:
Code:

func loot()
        if BitAnd(GUICtrlRead($chkAufsammeln), $GUI_CHECKED) THEN
                                ControlSend($windowname, '', '', $lk)
        Else
                                ;NIX TUN --> WEIL NICHT AUSGEWÄHLT
        EndIf
       
EndFunc

Das sollte dann insgesamt so aussehen:
Code:

#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>


#include <NomadMemory.au3>



Global $Paused
$running = false
HotKeySet("{PAUSE}", "TogglePause")
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("NetMax's TutorialBot", 259, 403, 192, 124)
$grpAufsammeln = GUICtrlCreateGroup("Aufsammeln", 16, 88, 233, 65)
$chkAufsammeln = GUICtrlCreateCheckbox("Aufsammeln", 88, 128, 97, 17)
$Label2 = GUICtrlCreateLabel("Aufsammeltaste", 32, 104, 78, 17)
$txtASK = GUICtrlCreateInput("", 120, 104, 121, 21)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$grpAdd = GUICtrlCreateGroup("Adressen", 16, 24, 233, 57)
$Label1 = GUICtrlCreateLabel("HP", 32, 56, 19, 17)
$txtHP = GUICtrlCreateInput("", 88, 48, 121, 21)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$grpSteuerung = GUICtrlCreateGroup("Steuerung", 16, 304, 233, 81)
$cmdSS = GUICtrlCreateButton("Start", 48, 320, 179, 25, 0)
$cmdPause = GUICtrlCreateButton("Pause", 48, 348, 179, 25, 0)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Sonstige = GUICtrlCreateGroup("Sonstige Tasten", 16, 152, 233, 57)
$Label3 = GUICtrlCreateLabel("Schlaf-Taste", 32, 176, 64, 17)
$txtSK = GUICtrlCreateInput("", 120, 174, 121, 21)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Group1 = GUICtrlCreateGroup("Sonstige Einstellungen", 16, 216, 233, 89)
$Label4 = GUICtrlCreateLabel("MinHP", 32, 240, 36, 17)
$Label5 = GUICtrlCreateLabel("MaxHP", 32, 274, 39, 17)
$txtMinHP = GUICtrlCreateInput("", 99, 238, 121, 21)
$txtMaxHP = GUICtrlCreateInput("", 97, 271, 121, 21)
GUICtrlCreateGroup("", -99, -99, 1, 1)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
$windowname = "NosTale"
$minHP = GUICtrlRead($txtMinHP)
$maxHP = GUICtrlRead($txtMaxHP)
$SPA = GUICtrlRead($txtHP)
$sk = GUICtrlRead($txtSK)
$lk = GUICtrlRead($txtASK)

func startstop()
        $running = NOT $running
EndFunc

Func TogglePause()
        $Paused = Not $Paused
        While $Paused
            Sleep(100)
        WEnd
EndFunc

func checkHP()
$SPA = "0x27A839C"
$pid = WinGetProcess($windowname) ; hier besorge ich die PID
;open the process
$ProcessInformation = _MemoryOpen($pid)
$Number = _MemoryRead($SPA, $ProcessInformation)
_MemoryClose($ProcessInformation)
return $Number
EndFunc
func loot()
        if BitAnd(GUICtrlRead($chkAufsammeln), $GUI_CHECKED) THEN
                                ControlSend($windowname, '', '', $lk)
        Else
                                ;NIX TUN --> WEIL NICHT AUSGEWÄHLT
        EndIf
        ControlSend($windowname, '', '', $lk)
EndFunc

func attack()
        ControlSend($windowname, '', '', "{SPACE}")
EndFunc

func doSleep()
        ControlSend($windowname, '', '', $sk)
        while(checkHP()<$maxHP)
                sleep(500)
        WEnd
        ControlSend($windowname, '', '', $sk)

EndFunc

While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case $GUI_EVENT_CLOSE
                        Exit
                Case $cmdSS
                        startstop()
                Case $cmdPause
                        TogglePause()

        EndSwitch

if $running == True Then
        if(checkHP()<$minHP) Then
                doSleep()
        EndIf

        attack()
        loot()
EndIf


WEnd


Jeopardize 08/26/2009 15:24

Hi,
Sehr gutes Tutorial, mein Thanks hast du jedenfalls schon. ;)

Gianotti 09/02/2009 15:05

nice tut hast dir viel mühe gemacht +thx

50cent1234 09/04/2009 16:59

Sehr sehr gutes Tut!!! Ich finde sowas sollte auf jdenFall belohnt werden!
Die Muehe die da drin steckt ist beeindruckend!

trisithack 09/07/2009 14:47

Hey netMax..
Also als erstes SUPER!

Zweitens ..wie finde ich die Sachen heraus wie z.B Speedhack..also dass man solange schlägt nd so was fr zahlen und so muss ich eingeben?..und is das für metin2 oder überhaut=?

TheGuiTarJokeR 09/09/2009 18:26

hey!

ich weiß nicht genau, ob man hier fragen stellen darf, aber ich bin einfach mal mutig ^^

ich hab versucht mir nen kleinen aufsammelbot zu schreiben, mit pause und an/abschaltfunktion, aber hab das problem, dass der bot zwar offensichtlich den key an das prog sendet (in der chatleiste kommts an) aber zum aufsammeln gehts net...

großer meister, erleuchte mich mit deiner weisheit :D

CODE:

AutoItSetOption("WinTitleMatchMode", 4)

Global $Paused = 1
Global $Collect = 0
HotKeySet("{PAUSE}", "TogglePause")
HotKeySet("{F10}", "ToggleCollect")
HotKeySet("{F11}", "Terminate")

$windowname = "METIN2"
$handle = WinGetHandle($windowname, "")
If @error Then
MsgBox(4096, "Error", "Fenster konnte nicht gefunden werden")
Else
while 1
CheckAction()
WEnd
EndIf

Func CheckAction()
If $Collect Then
ControlSend($windowname, '', '', "y")
sleep(1000)
EndIf
EndFunc

Func ToggleCollect()
$Collect = NOT $Collect
EndFunc

Func TogglePause()
$Paused = NOT $Paused
While $Paused
Sleep(100)
WEnd
EndFunc

Func Terminate()
Exit 0
EndFunc

wensor 10/15/2009 19:13

Echt Geil gemacht und sich auch sehr viel mühe bei gegeben jetzt wäre noch pracktich zu wissen wie man mobs und gegner scant und dan in den bot so ein baut das er daruf den immer bestimmte sachen macht

bloodx 10/15/2009 19:20

nach mobs suchen tust du am besten mit sowas:

PHP Code:

;Monster farbe Festlegen
MsgBox
(64"Monster Farbe per Maus""Hol dir die Mob Farbe.")
$Mobcoord MouseGetPos()
$MonsterColor PixelGetColor($Mobcoord [0], $Mobcoord [1])

;
Halt die Size etc bekommen...
$winpos WinGetPos("Fenster Name")
$winx $winpos[0]
$winy $winpos[1] + 100
$winy2 
$winpos[1] + 200
$width 
$winpos[2]-10
$height 
$winpos[3] - 100
$right 
$winx $width
$bottom 
$winy $height

;Nach dem Monster Suchen
PixelSearch
($winx$winy$right$bottom$MonsterColor25


wensor 10/15/2009 21:22

ok ein teil verstehe ich mit mein wissen schon nur was macht genau weil der pixel wird nie mit ein tasten druck gespeicher und ist so mit den eine variable die man verarbeiten kann also fände ich es nett wen du verleicht noch mal pls dne code oben noch mal zu erläutern

bloodx 10/15/2009 21:31

der Holt die Größe/Position vom Fenster.. PixelSearch muss ja wissen in welchem Bildschirm bereich es suchen muss.

ゆうじ 10/16/2009 13:07

Sehr nice tut hast dir nen Thanks verdient ^^

Freundmonster 10/19/2009 20:02

echt klasse diese mühe aber leider check ichs net bin ja noch viel zuklein bin 9jahre lach

frh 10/22/2009 14:59

Joa Gut erläutert...immer mit Bilder :)
ich bin hier jetzt en Jahr angemeldet dein Thread ist der erste wo ich was schreib :D

das hat was zu bedeuten... :)

m0hamed 10/23/2009 00:36

WTF ....
Some one translate this in english for god dame sake !

Shadow992 10/24/2009 16:12

Ok das Tutorial ist gut geworden , wirklich gut und auch alles schön erklärt .

Aber ich persönlich finde das komplette Tutorial recht unübersichtlich , mir würden da allgemein 2 Lösung einfallen , die das vielleicht etwas übersichtlicher gestalten :D :

1.Eine Art Verzeichnis , was jetzt eigentlich wo steht und was man in dem jeweiligen Kapitel lernt . Grund ist einfach , dass nicht jeder bei 0 anfängt manche haben vielleicht schon die Grundlagen und sind vielleicht auch nur in Memory editing interessiert , jemand , der nur die ersten 3 Lektionen von dir liest wird sich denken "ach das weiß ich doch alles schon" und wird wo anders nach einem "Tutorial" dazu suchen .

2.Ein bisschen Farbgebung peppt das ganze nochmal ein bisschen auf .
Z.b. könntest du immer die Variablen farbig gestalten , oder einfach immer nur die Überschrift , aber ein bisschen Farbe würde das ganze noch einen Tick besser aussehen lassen :D .

Edit :
Noch eine kleine Anregung , benutze die php-tags für ein stück code , also

[ php]

[ /php]

anstatt

[ code]

[ /code]

das macht das ganze noch ein bisschen leichter lesbar .

djdaniel3000 10/27/2009 13:46

danke is sehr hilfreich

sehr gut erklärt

».×. Zero.×.« 10/28/2009 19:25

das sollte echt mal sticked

Assass1n 10/28/2009 19:56

Quote:

Originally Posted by m0hamed (Post 3287678)
WTF ....
Some one translate this in english for god dame sake !

This is a german site.

brtcont 10/30/2009 21:13

HAY leute der bot ist ech supaa!!
aber ich krig ihn nicht ricxhtig zum laufen+
kann jmd ne anleitung pls schicken was mnan einge ben muss
in welcher reihen folge mannn genau vorgehwen muss

$PAM3R 10/31/2009 11:14

Quote:

Originally Posted by Freundmonster (Post 3261474)
echt klasse diese mühe aber leider check ichs net bin ja noch viel zuklein bin 9jahre lach

9 jahre und dann schon online gamer mein bruder ist 10 und
spielt lieber draußen als vorm combi sitzen ich kann das nicht leiden
wie sich so junge kinder in ein forum stellen und warscheinlich auch noch
WoW, oder M2 spielen sind zwar beides kack games aber ich finde das schade
mit dem alter schon vor der flimmer kiste zu sitzen =°( :(

killerhuhu 11/07/2009 13:55

okee ab lektion 2 check ich gar nix mehr aber ansonsten hab ich mir schon n Bot gemacht also das mit start sstop verstehe ich nicht

NetMax 11/07/2009 16:26

Was genau verstehst du nicht?

Also das pausieren:
Wenn du eine Taste("hotkey") drückst wird eine bestimmte Funktion(Programmabschnitt der gesondert aufgerufen werden kann und der bestimmte werte mitgeliefert bekommt ) aufgerufen.

Bei Pause wird abgefragt ob das Programm schon pausiert ist wenn ja --> weitermachen sonst --> pausieren.

Ob das Programm pausiert ist merkst du dir in einer Variable(eine Variable kann bestimmt werte haben).

xzyerasu 11/08/2009 19:55

Hey, coole Sache gute Erklärung, meine thanks kriegst du ^^

EDIT:
Hab ein Paar fragen:

wenn ich den ganzen kopierten bot laufen lassen will kommen bei mir filgende Probleme:

1.
(8) : ==> Error opening the file.:
#include <NomadMemory.au3>

2.
(59) : ==> Unknown function name.:
$ProcessInformation = _MemoryOpen($pid)
$ProcessInformation = ^ ERROR

3.
(60) : ==> Unknown function name.:
$Number = _MemoryRead($SPA, $ProcessInformation)
$Number = ^ ERROR

4.
Hab erst mal _MermoryRead gelöscht dann:
(60) : ==> Missing right bracket ')' in expression.:
$Number = ($SPA, $ProcessInformation)

5.
Klammer geschlossen dann:
(60) : ==> Illegal text at the end of statement (one statement per line).:
$Number = ($SPA), $ProcessInformation)
$Number = ($SPA)^ ERROR

6.
processInformation gelöscht dann:
(61) : ==> Unknown function name.:
_MemoryClose($ProcessInformation)
^ ERROR

7.
_mermoryClose wieder gelöscht dann:
(61) : ==> Unable to parse line.:
($ProcessInformation)
^ ERROR

8.
processInformation gelöscht
Dan laufts, aber iwie komisch.

Wie kann ich die Fehler oben beheben, ich denk nich, dass ich es verbessere indem ich alles lösch ^^'

EDIT'':
Noch was: Wenn ich mit der CE meine HP adresse suche komm ich auf zwei verschieden Adressen, ist es normal ? welche soll och nehmen?

Vielen dank im voraus für antworten =DD

eXcalibur93 11/09/2009 22:11

Also ich find des TuT is richtig gut, etwas mehr struckturieren und es wäre perfekt :D
Ich hab ein problem, und zwar versteh ich das schon alles, aber wenn ich den bot bei IV starte kommt immer ein error:
Line 16 (File "C:/....... .au3"):
Func TogglePause()
Error :"If" statement has no matching "EndIf" statement

ichh ba aber alles genauso wie im TuT beschrieben gemacht, hab danach sogar mal des ganze kopiert, aber die error meldun kommt trotzdem.
Also so wie ich des seh, erkennt mein AutoIt den selbst definierten befehl net.
Kann mir da mal wer helfen?
mfg
Konrad

NetMax 11/20/2009 16:13

euch fehlt die NomadMemory.au3. Ich lade sie heute noch hoch

WiiZocker 12/19/2009 03:32

Hallo Netmax^^

Hab ein problem mit Koda,unzwar möchte ich eine normale Levelfunktion erstellen.(zum testen erstmal im editor die leertaste drücken) Aber irgendwie Funktioniert es nicht aber mit Mousemove klappt es. Ich vermute es liegt daran das das fenster, wenn es nicht mehr aktiv ist also wenn ich den Editor anklicke, das die Funktion wieder sozusagen Deaktiviert wird.

Bitte helf mir bin schon am verzweifeln...

Hier mein Code

Code:

$windowname = "Unbenannt - Editor"

#include <GUIConstants.au3>

#Region ### START Koda GUI section ### Form=
$Test = GUICreate("Test", 625, 445, 193, 125)
$Leveln = GUICtrlCreateButton("Leveln", 144, 280, 321, 81, 0)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###




While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case $GUI_EVENT_CLOSE
                        Exit
                Case $Leveln
                        Leveln()



        EndSwitch
WEnd

Func Leveln()
        ControlSend($windowname, '', '', " ")
        Sleep(500)
        EndFunc


HardCore.1337 12/19/2009 09:45

ControlSend($windowname, '', "15", "Dein Text")

oder

ControlSend($windowname, '', "Edit1", "Dein Text")

mfg

WiiZocker 12/19/2009 13:56

Ok Thx ich versuch's mal aber eine Frage hab ich noch:

1.Wieso muss da eine 15 hin?

Ps.Bekommst ein Thx wenns klappt...(=

edit: Hab noch eine Frage^^

2.Es funktioniert jetzt aber wenn ich einmal auf den Button Klicke kommt einmal die leertaste
aber er soll die ja permanent ausgeben o_O

Was kiann man da machen? damit er die Hintereinander ausgiebt?

sry das ich so viel Frage^^

Frage 2 hab ich mit einer While schleife gelöst aber punkt 1 weiß ich immernoch nicht^^

HardCore.1337 12/19/2009 13:59

Beim Editor kommt auf jeden Fall 15 hin. Musst einfach mal im AutoIt Info Toll schauen.
Online Games haben da immer eine 0 stehen.

WiiZocker 12/19/2009 14:42

Achso ok Thx


All times are GMT +2. The time now is 23:00.

Powered by vBulletin®
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.