Auto-Loot Bot/Macro

01/15/2013 14:25 kumpel100#1
gibt es einen Speicherauslesenden Loot Bot der die Taste F drückt sobald "Durchsuchen" erscheint?

Habe es selbst mit IMG und Pixelsearch versucht, beides ist zu langsam.

wäre um Antworten dankbar.
01/15/2013 14:34 buFFy!#2
Es gibt ne Addresse (UNICODE) mit dem Wert "Durchsuchen [F]".
Der dafür zuständige Code wird nur aufgerufen wenn das Fenster erscheint.

Hooken -> Aufsammeln
01/15/2013 15:35 TheOnlyOne652089#3
Quote:
Originally Posted by kumpel100 View Post
gibt es einen Speicherauslesenden Loot Bot der die Taste F drückt sobald "Durchsuchen" erscheint?

Habe es selbst mit IMG und Pixelsearch versucht, beides ist zu langsam.

wäre um Antworten dankbar.
Stellt sich die Frage warum es "zu langsam" ist.

Im Prinzip ist Pixelsearch schnell genug für deine zwecke, wir reden von wenigen Milisekunden, das merkst du garnicht.


da du aber meinst es ist zu langsam, wirst du wahrscheinlich schlichtweg den kompletten Bildschirm gescannt haben, nach einen viel zu großen Muster und mit absoluter Genauigkeit.


Das ist klar, das ist quark, das willst du garnicht und brauchst du gar nicht.


Beispiel in AutoIT mit PixelChecksum:

Code:
AutoItSetOption("PixelCoordMode", 2) ;relative to client

HotKeySet("{End}", "_exit")
Func _exit()
	Exit 1
EndFunc

HotKeySet("{PAUSE}", "_pause")
Global $isPaused = false
Func _pause()
	$isPaused = NOT $isPaused
	if ($isPaused == true) Then
		ToolTip("paused",0,0) ;display paused tooltip
		While $isPaused == true
			;paused loop
		WEnd
		ToolTip("") ;remove tooltip if no longer paused
	EndIf
EndFunc

Global $title = "Guild Wars 2"
Global $hwnd = WinGetHandle($title)
if (NOT $hwnd) Then
	MsgBox("", "Error", "No window found with title " & $title)
	Exit 2
EndIf

Func _checkForLoot()

;~ Scans for the Loot Icon for direct match
	local $checkSumForLoot = "1848261822"

	local $pixelCheckSum = PixelChecksum(1238, 689, 1253, 709, 1, $hwnd)
;~	ToolTip("CheckSum = " & $pixelCheckSum, 0, 0)

	if ($pixelCheckSum = $checkSumForLoot) Then
		_loot()
	EndIf

EndFunc

Global $lootKey = "f"
Func _loot()
	ControlSend($hwnd, "", "", $lootKey)
EndFunc

While True
	_checkForLoot()
WEnd

Das CheckForLoot muss man eben entsprechend anpassen, je nach Auflösung das man das Icon bekommt für den Loot wenn man eben F drücken will.


Die Geschwindigkeit ist wie gesagt im Millisekunden bereich.


Damit es wirklich funktioniert muss man etwas aufpassen das man keine Checksum erzeugt mit durchsichtigen teilen, die sind natürlich nicht immer identisch.

Die Checksum muss aber auch nur einen kleinen bereich abdecken.


Es geht natürlich auch mit Pixelsearch, aber auch hier sollte man die Suche auf einen kleinen bereich beschränken, den kompletten Bildschirm zu scannen ist zeitaufwendiger und schlichtweg unnötig.
01/15/2013 16:00 buFFy!#4
Quote:
Originally Posted by TheOnlyOne652089 View Post
Stellt sich die Frage warum es "zu langsam" ist.

Im Prinzip ist Pixelsearch schnell genug für deine zwecke, wir reden von wenigen Milisekunden, das merkst du garnicht.


da du aber meinst es ist zu langsam, wirst du wahrscheinlich schlichtweg den kompletten Bildschirm gescannt haben, nach einen viel zu großen Muster und mit absoluter Genauigkeit.


Das ist klar, das ist quark, das willst du garnicht und brauchst du gar nicht.


Beispiel in AutoIT mit PixelChecksum:

Code:
AutoItSetOption("PixelCoordMode", 2) ;relative to client

HotKeySet("{End}", "_exit")
Func _exit()
	Exit 1
EndFunc

HotKeySet("{PAUSE}", "_pause")
Global $isPaused = false
Func _pause()
	$isPaused = NOT $isPaused
	if ($isPaused == true) Then
		ToolTip("paused",0,0) ;display paused tooltip
		While $isPaused == true
			;paused loop
		WEnd
		ToolTip("") ;remove tooltip if no longer paused
	EndIf
EndFunc

Global $title = "Guild Wars 2"
Global $hwnd = WinGetHandle($title)
if (NOT $hwnd) Then
	MsgBox("", "Error", "No window found with title " & $title)
	Exit 2
EndIf

Func _checkForLoot()

;~ Scans for the Loot Icon for direct match
	local $checkSumForLoot = "1848261822"

	local $pixelCheckSum = PixelChecksum(1238, 689, 1253, 709, 1, $hwnd)
;~	ToolTip("CheckSum = " & $pixelCheckSum, 0, 0)

	if ($pixelCheckSum = $checkSumForLoot) Then
		_loot()
	EndIf

EndFunc

Global $lootKey = "f"
Func _loot()
	ControlSend($hwnd, "", "", $lootKey)
EndFunc

While True
	_checkForLoot()
WEnd

Das CheckForLoot muss man eben entsprechend anpassen, je nach Auflösung das man das Icon bekommt für den Loot wenn man eben F drücken will.


Die Geschwindigkeit ist wie gesagt im Millisekunden bereich.


Damit es wirklich funktioniert muss man etwas aufpassen das man keine Checksum erzeugt mit durchsichtigen teilen, die sind natürlich nicht immer identisch.

Die Checksum muss aber auch nur einen kleinen bereich abdecken.


Es geht natürlich auch mit Pixelsearch, aber auch hier sollte man die Suche auf einen kleinen bereich beschränken, den kompletten Bildschirm zu scannen ist zeitaufwendiger und schlichtweg unnötig.
in deine schleife solltest du ein Sleep(0) tun. einfach nur deiner cpu auslastung zu liebe.
01/15/2013 18:41 TheOnlyOne652089#5
Quote:
Originally Posted by buFFy! View Post
in deine schleife solltest du ein Sleep(0) tun. einfach nur deiner cpu auslastung zu liebe.
Sicherlich sinnvoll, merkt man erst richtig auf Low-End Laptops ^^
01/16/2013 11:30 kumpel100#6
Quote:
Originally Posted by buFFy! View Post
Es gibt ne Addresse (UNICODE) mit dem Wert "Durchsuchen [F]".
Der dafür zuständige Code wird nur aufgerufen wenn das Fenster erscheint.
Hooken -> Aufsammeln
ich versuche es gerade über 4Byte Adresse für die Ausgabe 0 und 1, bisher habe ich noch nicht die Statische gefunden.

Das Unicode hatte ich schon versucht allerdings nur mit "Durchsuchen".
werde ich später mit Durchsuchen [F] nochmal versuchen.


Pixelerkennung habe ich auf 2 Pixel im Wort "Durchsuchen" festgelegt.

Das Pixelsearch trotz sleep, 750 vor dem Hotkey F und sleep, 250 nach dem looten brachte nach ca 2 stunden das macro zum crashen.
eine abfrage von dem pixel zur treffgenauigkeit (loop 3x) mit je 50ms pause habe ich auch drin.Insgesamt funktioniert das looten auch nicht schlecht.
Nur über auslesen der Adresse wird das ganze einfach geschmeidiger.

Img search war zu langsam keine Ahnung weshalb.
das Img search war auf eine größe von ca 20x20mm festgelegt und nicht screenwide.


Edit: Ich Arbeite mit Autohotkey welches AutoIt sehr ähnelt.
01/16/2013 12:16 buFFy!#7
Quote:
Originally Posted by kumpel100 View Post
ich versuche es gerade über 4Byte Adresse für die Ausgabe 0 und 1, bisher habe ich noch nicht die Statische gefunden.

Das Unicode hatte ich schon versucht allerdings nur mit "Durchsuchen".
werde ich später mit Durchsuchen [F] nochmal versuchen.
Ist doch egal o0
Wenn du nach Durchsuchen suchst findest er auch Durchsuchen [F] :rolleyes:

Das eine ist eben UNICODE[11] und das andere UNICODE[15].
Nur anders rum würde das nicht gehen.

Oh und achja, als boolean gibts das nicht.
01/16/2013 16:11 TheOnlyOne652089#8
Quote:
Originally Posted by buFFy! View Post
Ist doch egal o0
Wenn du nach Durchsuchen suchst findest er auch Durchsuchen [F] :rolleyes:

Das eine ist eben UNICODE[11] und das andere UNICODE[15].
Nur anders rum würde das nicht gehen.

Oh und achja, als boolean gibts das nicht.
Naja im Prinzip gibts das auch als boolean, wenn der Unicode entweder "0" oder belegt ist.

Also im Prinzip kann man das auch mit boolean machen ^^ (also schlichtweg 1 Bit) wenn einen tatsächlich nur interessiert ob da etwas steht oder nicht (den eine Logik muss ja existieren ob es angezeigt wird oder nicht, meist eine art "isVisible" was eben auch boolean ist).
01/16/2013 18:41 buFFy!#9
Quote:
Originally Posted by TheOnlyOne652089 View Post
Naja im Prinzip gibts das auch als boolean, wenn der Unicode entweder "0" oder belegt ist.

Also im Prinzip kann man das auch mit boolean machen ^^ (also schlichtweg 1 Bit) wenn einen tatsächlich nur interessiert ob da etwas steht oder nicht (den eine Logik muss ja existieren ob es angezeigt wird oder nicht, meist eine art "isVisible" was eben auch boolean ist).
Nein. Boolean ist in VC++10 einfach nur ein Int der als Boolean interpretiert wird.
Und das wurde hier nunmal verwendet.

Die Logik dahinter dahinter ist doch kein Ding. Es gibt ne Addresse die 0/3 ist, je nachdem ob's angezeigt wird oder nicht. Von da aus einfach ein bisschen durchsteppen und man versteht's relativ fix ;)