Monstersuche mit Autoit

08/11/2013 11:21 Megawurrrm#1
Monstersuche mit Autoit

Hey Freunde,

Ich versuche einer Idee für einen Levelbot hinterherzujagen habe dabei aber Probleme
Ich arbeite mit Autoit und versuche aus der Minimap auszulesen wo die Monster sind und dann den Charakter darauf zulaufen zu lassen

Mein Ansatz:

PHP Code:
Func Suche () 
$Pfeilspitze PixelSearch (900,15,1000,1100xFFFFE7)  
If 
not @error Then    
$Monster 
PixelSearch (900,15,1000,1100xEB1609)  
If 
not @error Then 
$M 
= (68 $Pfeilspitze[1]) / (955 $Pfeilspitze[0]) 
$B $Pfeilspitze[1] - ($Pfeilspitze[0] * $M
$Ergebnis = ($M $Monster[0])+$B 
If $Monster[1] = $Ergebnis Then 
   Send
("{W}"
Else 
   
Send("{E}"
EndIf 
Else 
Suche() 
EndIf 
Else 
Send("{E down}"
Sleep(100
Send("{E up}")    
EndIf 
EndFunc 
Ich habe 2 Punkte Die Spitze des Pfeiles ($Pfeilspitze[0],$Pfeilspitze[1]) und die Mitte (955,68) daraus rechne ich eine Grade und wenn das Monster auf dieser graden ist soll er sich dahin bewegen

in der Praxis passiert einfach nichts - Warum?
08/11/2013 12:54 alpines#2
Hast du versucht ob das Spiel überhaupt Send/ControlSend unterstützt?
Eventuell kannst du es mit PostMessage probieren aber die meisten Spiele haben einen Anti-Hack installiert bei denen Send von AutoIt nicht mehr funktioniert.

Desweiteren musst du beachten, das du eine Rekursion in deiner Funktion hat, nach 1899 Aufrufen wird das Script abstürzen, denn du startest Search() in Func Search()
08/12/2013 08:05 Megawurrrm#3
aso stimmt habe ich nicht genannt - ich spiele auf einem selbst gemachtem p server von Metin2
send und so funktioniert eigentlich immer sehr gut

wie kann ich die Rekursion verhindern aber noch von vorne anfangen?

Zu meinem eigentlichem Problem hat jemand schonmal mit autoit versucht zu rechnen kann es das überhaupt? ich glaube langsam das für $M eine zu kleine zahl raus kommt und das autoit die nicht benutzen kann oder als 0 wertet - kann das sein?
08/12/2013 14:51 alpines#4
Um das Rechnen in AutoIt brauchst du dir keinen Kopf zu machen, 15 Nachkommastellen erreichst du bei einer Pixelsuche glaub ich nicht.
Neustarten könntest du das, indem du ExitLoop verwendest.
Versuch die ganze Position in eine While 1 zu packen und bei der Zeile mit Search() schreibst du gar nichts hin und bei den anderen nimmst du ExitLoop damit, die Schleife unterbrochen wird.

Der Code könnte so vielleicht korrekt aussehen, musst du eventuell noch anpassen:

Code:
Func Suche ()
	While 1
		$Pfeilspitze = PixelSearch (900,15,1000,110, 0xFFFFE7)
		If not @error Then
			$Monster = PixelSearch (900,15,1000,110, 0xEB1609)
			If not @error Then
				$M = (68 - $Pfeilspitze[1]) / (955 - $Pfeilspitze[0])
				$B = $Pfeilspitze[1] - ($Pfeilspitze[0] * $M)
				$Ergebnis = ($M * $Monster[0])+$B
				If $Monster[1] = $Ergebnis Then
					Send("{W}")
				Else
					Send("{E}")
				EndIf
				ExitLoop
			Else
				Sleep(100) ;Hier war die Rekursion
			EndIf
		Else
			Send("{E down}")
			Sleep(100)
			Send("{E up}")
			ExitLoop
		EndIf
	WEnd
EndFunc
08/14/2013 09:42 Megawurrrm#5
besten dank :)

nur hat sich leider an meinem eigentlichem Problem nichts verändert

angenommen die komplette rechnung sei falsch dan müsste doch mehr oder weniger dauerhaft ein E gesendet werden aber ingame passiert einfach garnichts
wo könnte das programm sonst noch probleme haben oder hängen?
08/14/2013 12:45 alpines#6
Stürzt das Script denn ab oder hängt es sich nur irgendwie auf?
Wenn es nicht abstürzt dann müssen wir den restlichen Source sehen, weil dort wahrscheinlich der Fehler liegen wird.

Du kannst ab und zu MsgBoxen einbauen die Zahlen ausgeben und an bestimmten Positionen stehen, wie z.B. der If / Send um zu gucken, ob das Script überhaupt so weit kommt.
08/18/2013 17:18 Megawurrrm#7
Super idee und du hast promt recht er kommt garnicht weit genug

is kein zitat aber ich kenne die cods nicht auswendig^^
PHP Code:
HotKeySet "{F8}" "Leveln" )

HotKeySet "{F9}" "Pause" )
HotKeySet "{F10}" "Ende" )

while 
1
sleep
(1)
wend


Func Suche 
()
           
Send("{Enter}")
           
Send("Ich lvl jetzt :)")
           
Send("{Enter}")
    While 
1
        $Pfeilspitze 
PixelSearch (900,15,1000,1100xFFFFE7)
        If 
not @error Then
            $Monster 
PixelSearch (900,15,1000,1100xEB1609)
            If 
not @error Then
                $M 
= (68 $Pfeilspitze[1]) / (955 $Pfeilspitze[0])
                
$B $Pfeilspitze[1] - ($Pfeilspitze[0] * $M)
                
$Ergebnis = ($M $Monster[0])+$B
                
If $Monster[1] = $Ergebnis Then
                    Send
("{W}")
                Else
                    
Send("{E down}")
                    
Sleep(500)
                    
Send("{E up}")
                EndIf
                
ExitLoop
            
Else
                
Sleep(100) ;Hier war die Rekursion
            
EndIf
        Else
            
Send("{E down}")
            
Sleep(100)
            
Send("{E up}")
            
ExitLoop
        
EndIf
    
WEnd
EndFunc

Func Ende 
()
Exit
EndFunc
func Pause
()
while (
1)
sleep(100)
Wend
EndFunc 
€dit -.- jetzt seh ichs oh man bin ich blöd trotzdem danke für eure hilfe
08/18/2013 17:56 alpines#8
Funktioniert jetzt alles, es könnten ja Fehler auftreten, weil die Rekursion nicht mehr da ist.
Hat sich alles geklärt?
08/22/2013 09:38 Megawurrrm#9
jo an sich funktioniert jetzt alles :)
Besten Dank