Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > General Coding > Coding Tutorials
You last visited: Today at 15:45

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



Bot Programmierkurs by NetMax

Discussion on Bot Programmierkurs by NetMax within the Coding Tutorials forum part of the General Coding category.

Reply
 
Old   #1
 
NetMax's Avatar
 
elite*gold: 20
Join Date: Feb 2009
Posts: 1,199
Received Thanks: 2,545
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 ()
SciTE ()
Kode Form Designer()

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 is offline  
Thanks
279 Users
Old 07/26/2009, 11:12   #2
 
NetMax's Avatar
 
elite*gold: 20
Join Date: Feb 2009
Posts: 1,199
Received Thanks: 2,545
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 is offline  
Thanks
163 Users
Old 07/26/2009, 11:13   #3
 
NetMax's Avatar
 
elite*gold: 20
Join Date: Feb 2009
Posts: 1,199
Received Thanks: 2,545
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
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 is offline  
Thanks
123 Users
Old 07/26/2009, 11:16   #4
 
NetMax's Avatar
 
elite*gold: 20
Join Date: Feb 2009
Posts: 1,199
Received Thanks: 2,545
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 is offline  
Thanks
98 Users
Old 07/26/2009, 11:17   #5
 
NetMax's Avatar
 
elite*gold: 20
Join Date: Feb 2009
Posts: 1,199
Received Thanks: 2,545
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 is offline  
Thanks
87 Users
Old 07/26/2009, 11:19   #6
 
NetMax's Avatar
 
elite*gold: 20
Join Date: Feb 2009
Posts: 1,199
Received Thanks: 2,545
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 is offline  
Thanks
75 Users
Old 07/26/2009, 11:22   #7
 
NetMax's Avatar
 
elite*gold: 20
Join Date: Feb 2009
Posts: 1,199
Received Thanks: 2,545
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


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 is offline  
Thanks
71 Users
Old 07/26/2009, 11:23   #8
 
NetMax's Avatar
 
elite*gold: 20
Join Date: Feb 2009
Posts: 1,199
Received Thanks: 2,545
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)


Für einen einfachen Button und eine Checkbox könnte das so aussehen:

Nun wählt man Erzeuge Code und kopiert den Code. Diesen kann man dann in sein AutoIt-Programm einfügen

So kann der Code aussehen

Die eigentlichen Programmierschritte lernen wir in der nächsten Lektion.
NetMax is offline  
Thanks
68 Users
Old 07/26/2009, 11:25   #9
 
NetMax's Avatar
 
elite*gold: 20
Join Date: Feb 2009
Posts: 1,199
Received Thanks: 2,545
FRAGEN BITTE IN DEN THREAD "Fragen zu NetMax's Programmiertutorial"
NetMax is offline  
Thanks
57 Users
Old 08/26/2009, 11:26   #10
 
NetMax's Avatar
 
elite*gold: 20
Join Date: Feb 2009
Posts: 1,199
Received Thanks: 2,545
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.




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 is offline  
Thanks
79 Users
Old 08/26/2009, 11:28   #11
 
NetMax's Avatar
 
elite*gold: 20
Join Date: Feb 2009
Posts: 1,199
Received Thanks: 2,545
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
NetMax is offline  
Thanks
78 Users
Old 08/26/2009, 15:24   #12
 
elite*gold: 0
Join Date: Feb 2009
Posts: 17
Received Thanks: 7
Hi,
Sehr gutes Tutorial, mein Thanks hast du jedenfalls schon.
Jeopardize is offline  
Thanks
6 Users
Old 09/02/2009, 15:05   #13
 
Gianotti's Avatar
 
elite*gold: 20
Join Date: Mar 2008
Posts: 1,455
Received Thanks: 140
nice tut hast dir viel mühe gemacht +thx
Gianotti is offline  
Thanks
1 User
Old 09/04/2009, 16:59   #14
 
elite*gold: 0
Join Date: Dec 2006
Posts: 371
Received Thanks: 105
Sehr sehr gutes Tut!!! Ich finde sowas sollte auf jdenFall belohnt werden!
Die Muehe die da drin steckt ist beeindruckend!
50cent1234 is offline  
Thanks
1 User
Old 09/07/2009, 14:47   #15
 
elite*gold: 0
Join Date: Jan 2009
Posts: 17
Received Thanks: 3
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=?
trisithack is offline  

Powered by vBulletin®
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2024 elitepvpers All Rights Reserved.