Ich habe mich mal hingesetzt und nen Equipchanger geschrieben, dessen Quellcode ich nicht unter Verschluss halten werde. Mir ist das zu dubios gewesen, da irgendwelche .exe Dateien im Zusammenhang mit D3 zu benutzen, deren Source ich nicht kenne. Deshalb liefere ich mit diesem Release einen einfach konfigurierbaren Equipchanger.
Alle wichtigen Einstellungen lassen sich über die "equipwechsler.ini" einstellen. Bilder zur Erklärung sind auch dabei. Er kann alle Slots equippen, auch den zweiten Ring usw.
Über Anregungen und Verbesserungsvorschläge würde ich mich freuen und diese bei Gelegenheit auch umsetzen.
Grüße
Checkliste für Verbesserungen:
-andere Auflösungen als 16:9-formatige unterstützen (wahrscheinlich über einfache Case-Abfragen, oder hat jemand ne bessere Idee?)
#RequireAdmin
#include <File.au3>
#Include <Date.au3>
#include <Misc.au3>
_Singleton(@ScriptName)
; Calculate Coordinates of Equip
; we start counting from bottom left to up right; 2nd Value of $ratio defines wether we deal with the x- axis (1) or the y-axis (2);
; Parameter [0] defines if we use it or not
; bekannte Probleme: arbeitet nur mit 16:9 Auflösungen zusammen, könnte über Fallunterscheidungen gelöst werden
$inventorykey=Iniread("equipwechsler.ini","Hotkeys","Inventar","d")
$wechselhotkey=Iniread("equipwechsler.ini","Hotkeys","Wechselhotkey","i")
$beendenhotkey=Iniread("equipwechsler.ini","Hotkeys","Beenden","i")
$cleanupkey=Iniread("equipwechsler.ini","Hotkeys","Screenclear","{SPACE}")
$wintitle=Iniread("equipwechsler.ini","Optionen","Windowname","Diablo III")
HotkeySet($beendenhotkey,"MyExit")
HotkeySet($wechselhotkey,"Wechsel")
Global $ratio[10][6][4]
Global $absolut[10][6][4]
Global $clickfield[11][7]
Global $D3win[4]
Global $hWnd = WinGetHandle($wintitle)
$ratio[0][0][1]=1440/1920 ; Verhältnis der Inventarslotposition ganz unten links zur Gesamtbreite des Fensters
$ratio[0][0][2]=848/1080 ; Verhältnis der Inventarslotposition ganz unten links zur Gesamthöhe des Fensters
$diffxratio=(1873-1440)/1920 ; verhältnismäßige Entfernung zwischen dem ganz linken und ganz rechten bzw. ganz unteren und ganz oberen Inventarslot
$diffyratio=(848-610)/1080
$diffxratiostep=$diffxratio/9 ; Schrittweite zwischen den einzelnen Slots in x- bzw. y-Richtung
$diffyratiostep=$diffyratio/5
$ix=0
$iy=0
for $ix=0 to 9
for $iy=0 to 5
$ratio[$ix][$iy][1] = $ratio[0][0][1] + $ix * $diffxratiostep
$ratio[$ix][$iy][2] = $ratio[0][0][2] - $iy * $diffyratiostep
;~ _FileWriteLog("xlog.txt","ix =" & $ix & " xratio=" & $ratio[$ix][$iy][1] & " iy =" & $iy & " yratio=" & $ratio[$ix][$iy][2])
Next
Next
While ProcessExists("Diablo III.exe")
sleep(100)
Wend
Func Wechsel()
$blockinput=Iniread("equipwechsler.ini","Optionen","Input Blocken","0")
$Maxsleeptime=Iniread("equipwechsler.ini","Optionen","Maxsleeptime","30")
$Minsleeptime=Iniread("equipwechsler.ini","Optionen","Minsleeptime","100")
FileDelete(@Scriptdir & "\xlog.txt")
;~ WinWaitActive($wintitle)
$D3win=WinGetPos($wintitle)
Blockinput($blockinput)
;~ $mouseposi=MouseGetPos()
$ix=0
$iy=0
for $ix=1 to 10
for $iy=1 to 6
$clickfield[$ix][$iy] = Iniread("equipwechsler.ini","Inventar","Slot[" & $ix & "][" & $iy & "]",0)
Next
Next
$ix = 0
$iy = 0
for $ix=0 to 9
for $iy=0 to 5
$absolut[$ix][$iy][1] = $D3win[2] * $ratio[$ix][$iy][1]
$absolut[$ix][$iy][2] = $D3win[3] * $ratio[$ix][$iy][2]
Next
Next
Controlsend($wintitle,"",$hWnd,$cleanupkey)
;~ send($cleanupkey) ; schließt alle eventuell noch offenen Fenster
sleep(Random($Minsleeptime,$Maxsleeptime,1))
Controlsend($wintitle,"",$hWnd,$inventorykey)
;~ send($inventorykey)
sleep(Random($Minsleeptime,$Maxsleeptime,1))
;~ MouseMove($absolut[0][0][1], $absolut[0][0][2], 0)
$ix=0
$iy=0
for $ix = 0 to 9
for $iy = 0 to 5
Select
case $clickfield[$ix+1][$iy+1] = 1 ; Dieser Teil der Schleife klickt alle Equipteile mit Rechtsklick an, die angelegt werden sollen
Controlclick($wintitle,"",$hWnd,"right",1, $absolut[$ix][$iy][1], $absolut[$ix][$iy][2])
sleep(Random($Minsleeptime,$Maxsleeptime,1))
case $clickfield[$ix+1][$iy+1] = 2 ; Dieser Teil der Schleife klickt den zweiten Ring mit ALT + Rechtsklick an, um ihn auf den rechten Slot zu equippen
;~ send("{ALTDOWN}")
Controlsend($wintitle,"",$hWnd,"{ALTDOWN}")
Controlclick($wintitle,"",$hWnd,"right",1, $absolut[$ix][$iy][1], $absolut[$ix][$iy][2])
;~ Mouseclick("right", $absolut[$ix][$iy][1], $absolut[$ix][$iy][2], 1, 0)
sleep(Random($Minsleeptime,$Maxsleeptime,1))
Controlsend($wintitle,"",$hWnd,"{ALTUP}")
;~ send("{ALTUP}")
EndSelect
Next
Next
sleep(Random($Minsleeptime,$Maxsleeptime,1))
Controlsend($wintitle,"",$hWnd,$inventorykey)
;~ send($inventorykey)
;~ Mousemove($mouseposi[0], $mouseposi[1], 0)
Blockinput(0)
Endfunc
Func MyExit()
Exit
Endfunc
[Hotkeys]
//Der Hotkey, mit dem man das Inventar öffnet, Standard ist c oder i
Inventar=c
//Der Hotkey, mit dem man das Equipment austauschen will. Beispiele: {ENTER}, ^e (für strg+e), !e (für ALT+e), +e (für SHIFT+e)
Wechselhotkey={F1}
//Der Hotkey, mit dem man das Programm beendet
Beenden={F2}
//Der Hotkey, der eventuell noch offene Fenster (Skillfenster, Inventar) schließt (Standard: Space)
Screenclear={SPACE}
[Optionen]
Windowname=Diablo III
// Soll während des Itemwechsels Maus und Tastatur blockiert werden? Dies dient dazu, sicherzustellen, dass das Script sauber abläuft und man es nicht durch Mausbewegungen behindert
Input Blocken=1
// Maximale und Minimale Wartezeit zwischen dem Anlegen der verschiedenen Gegenstände. Die Randomzeiten dienen dazu, es menschlicher wirken zu lassen. Je kleiner die Zeiten (in Millisekunden) sind, desto schneller werden die Items gewechselt. Auf langsameren Systemen können höhere Zeiten erforderlich sein, um alle Items zuverlässig zu wechseln.
Minsleeptime=50
Maxsleeptime=100
[Inventar]
//Das Inventar ist wie folgt aufgebaut: Es besteht aus genau 60 Plätzen, 10 von links nach rechts und 6 von unten nach oben
//Hier die Aufteilung, wie das Inventar nummeriert wurde:
//1.6 ... 10.6
//1.5 .
//1.4 .
//1.3 .
//1.2 2.2 3.2
//1.1 2.1 3.1 4.1 5.1 6.1 7.1 8.1 9.1 10.1
//Will man nun beispielsweise den Equipwechsler dazu bringen, das Item ganz unten rechts auszuwechseln, so muss man die Option
//Slot[10][1] = 1 hinschreiben (natürlich ohne das Doubleslash ("//") davor
//Der Slot für den 2. Ring muss mit "Slot[x][y] = 2" gekennzeichnet werden, damit er per ALT + Rechtsklick angezogen werden kann
Slot[1][1] = 1
Slot[2][1] = 1
Slot[3][1] = 1
Slot[4][1] = 1
Slot[5][1] = 1
Slot[6][1] = 1
Slot[7][1] = 1
Slot[8][1] = 1
Slot[8][2] = 1
Slot[9][1] = 1
Slot[9][2] = 2
Slot[10][1] = 1
Bin deinen Code mal kurz überflogen, daher generelles Zeug:
Nutze wenn möglich Singleton bei solchen Tools.
Code:
#include <Misc.au3>
_Singleton(@ScriptName)
Damit immer nur eine Instanz läuft.
Den wenn die Leute so "blöd" sind es zwei mal zu öffnen dann funktioniert nur bei einer die Hotkeys (entsprechend der Exit hotkey) , was etwas unschön ist und mit Pech Probleme erzeugt.
Konfigurierbare Hotkeys finde ich in jedem fall ne super Idee, hab ich meist auch hardcoded.
u.U. musst du abprüfen das keine Doppelt Belegt sind, falls jemand so blöd ist und das eingibt (dann gilt nur der letzte Hotkey, der andere hat keine Funktion).
Das Tool sollte nur laufen wenn Diablo III auch offen ist ; beendet man Diablo III macht es Sinn das Tool gleich mit zu beenden.
Entsprechend bietet es sich an wenn du im While 1 einfach "While WinExists" machst, das sorgt entsprechend für eine schnelle einfache Lösung.
Du benutzt blockinput, was "gut" ist, beachte aber das man dazu Adminrechte benötigt.
Entsprechend macht es Sinn einen "#requireAdmin" hinzuzufügen, damit die Leute das auch richtig machen.
send("{SPACE}") soll das dafür sorgen, dass das Inventar geschlossen wird ?
Bin grad auf Arbeit und habe kein D3 hier, aber wenn "ja" gut so.
Die sleeps halte ich für unnötig an der Stelle, aber u.U. haben die ja einen Zweck.
Warum ein MouseMove ? Ergibt sich mir nicht warum das benötigt wird.
Nutze wenns geht "ControllClick" anstatt MouseClick, das ist einfach klar "superior". Sendet den Befehl direkt an das angegebene Controll und ist wohl auch einfach schneller (siehe dazu meinen Referenz Code, der macht das hoffentlich deutlich, ansonsten F1 in AutoIT sollte auch helfen).
Größter Vorteil von ControllClick, die Maus selbst wird nicht bewegt, es werden nur die Befehle gesendet, dadurch kann der Nutzer eigentlich tun was er will (sollte trotzdem BlockInput sein, den das macht das Macro einfach kaputt wenn der User dazwischen funkt).
Logging würde ich in jedem fall "optional" machen.
In meiner Referenz siehst du eine Alternative für das Macro.
Anstelle mit Rechtsklick verwende ich eine linksklick und füge die Items direkt dort ein wo sie hinsollen.
Das macht die Sache mit "Alt" unnötig und die Recorder Funktion erlaubt es mit jeder Auflösung seine Einstellung zu tätigen.
Die Option mit Rechtsklick und Alt funktioniert natürlich auch, im Detail müsste man das stärker Vergleichen ob es unterschiede gibt (nicht nur Geschwindigkeit, sondern Sicherheit auf Fehler, bzw. wie das Spiel in bestimmten Situation anders handelt, wenn vielleicht einmal eine 2h Waffe verwendet wird und im magic Set je 2x Einhand usw.).
Mein Recorder speichert einfach .ini files mit den Koordinaten als Namen die Auflösung.
Generell kann man einiges tun damit das Tool einfach "schöner" funktioniert und mehr Optionen zur Verfügung stehen, den die "eigentliche" Funktion des EquipWechsel ist ja ziemlich trivial.
Controlclick hab ich mir auch schon mal angeschaut, da es ja z.b. auch für inaktive und minimierte Fenster funktioniert, bzw. wenn D3 als Fenster im Hintergrund läuft. Allerdings hab ichs wieder veworfen, weil ich keine Ahnung hatte, was ich als ControlID angeben sollte, wenn ich son Spielfenster habe. Bei Windows GUI Fenstern kriegt man das ja leicht raus, aber bei Spielen gibt es so was ja nicht. Ich gucke mir das in deinem Script mal genauer an.
Könnte das nicht zu Problemen bei der Detectability führen, wenn man die Maus gar nicht mehr bewegt? Hauptaugenmerk meines Programms liegt ja darauf, es möglichst menschlich wirken zu lassen, daher auch die Random Delays zwischen allen Aktionen.
Danke für deine Anregungen auf jeden Fall. Einen Teil setze ich gerade um, einen Teil werde umzusetzen versuchen und eventuell nochmal hier nachfragen.
Quote:
Originally Posted by xXuserXx
Hey, ich bekomme den Fehler Equipwechsler.exe ist keine zulässige Win32-Anwendung. Woran kann das liegen?
Das liegt daran, dass ich es als 64Bit Anwendung compiliert habe. Werds bei Gelegenheit berichtigen und als 32 Bit compilen.
Controlclick hab ich mir auch schon mal angeschaut, da es ja z.b. auch für inaktive und minimierte Fenster funktioniert, bzw. wenn D3 als Fenster im Hintergrund läuft. Allerdings hab ichs wieder veworfen, weil ich keine Ahnung hatte, was ich als ControlID angeben sollte, wenn ich son Spielfenster habe. Bei Windows GUI Fenstern kriegt man das ja leicht raus, aber bei Spielen gibt es so was ja nicht. Ich gucke mir das in deinem Script mal genauer an.
Da musst du wohl noch etwas lesen, aber die kurzfassung:
Jedes Window hat ein Handle (hwnd), das kannst du als ID betrachten in dem Zusammenhang.
Das zu bekommen ist sehr einfach mit AutoIT, einfach "WinGetHandle" und fertig.
Falls benötigt kannst du auch den Prozess abgreifen "WinGetProcess" (brauchst du hier aber nicht tun, das Handle reicht).
Quote:
Könnte das nicht zu Problemen bei der Detectability führen, wenn man die Maus gar nicht mehr bewegt? Hauptaugenmerk meines Programms liegt ja darauf, es möglichst menschlich wirken zu lassen, daher auch die Random Delays zwischen allen Aktionen.
Im Endeffekt lösen beide Funktionen das gleiche aus.
MouseClick geht den "umweg" über den MouseCursor und bewegt die Maus, das sorgt dann für das entsprechende "MouseClick" Event.
ControllClick sendet dieses MouseClick Event einfach direkt, spart sich den Umweg.
In Sachen Detectability sollte das komplett zu vernachlässigen sein, ich meine sogar es macht absolut keinen Unterschied.
Quote:
Danke für deine Anregungen auf jeden Fall. Einen Teil setze ich gerade um, einen Teil werde umzusetzen versuchen und eventuell nochmal hier nachfragen.
Gut so ^^
Quote:
Das liegt daran, dass ich es als 64Bit Anwendung compiliert habe. Werds bei Gelegenheit berichtigen und als 32 Bit compilen.
Kannst auch beides machen und als "_32bit" bzw. "_64bit" angeben.
Die 32-bit version funktioniert in aller Regel aber auch unter 64bit.
Quote:
Originally Posted by EnnDee
Danke für die Hinweise, hab das alles mal umgesetzt und noch etwas mehr Konfigurierbarkeit rein gebracht. Außerdem sollte es nun auch unter 32 Bit Betriebssystemen laufen.
Problem:
Ich kann keinen ALT+Rechtsklick mit dem Controlclick machen .. Lösungsideen?
Aion AutoIt Bot Beta [Open Source] 01/05/2013 - Aion Hacks, Bots, Cheats & Exploits - 1078 Replies So hier ist mein Aion Bot, hab in selbst gecodet und ich weiss nicht gerade schön^^ Aber ich hab mir gedacht ich mach ihn mal public damit ihr euch Denkanstöße holen könnt wenn ihr selbst nen Bot schreibt. Wie gesagt er befindet sich noch in der beta phase, wenn nicht sogar alpha xD.
Hier ein paar Hinweise:
-einfach die keys für die einzelnen Attacken eintragen und fürs looten + regen.
-wenn ihr z.B. keine attacke 2 wollt ein "x" dafür eintragen
-reg und loot key müssen festgelegt werden...
Sbot AutoLogIn open source (autoit) 09/13/2011 - SRO Hacks, Bots, Cheats & Exploits - 4 Replies http://darkbudweiser.com/AL/AL-V3.jpg
source is now closed
i started back on my old login tool project
AL Functions
(Silkroad id and pw is encrypted with the password you enter on AL start up)
------------------------------------------------- -
[Release][AutoIt] SmileyBot [Open Source] 06/12/2011 - AutoIt - 17 Replies Hi.
es tut mir leid an Epvpers aber ich mag die Smileys hier im forum nicht!
der grüne lachsmiley sieht einfach krank aus: :D http://autoit.de/wcf/images/smilies/23.gif
also habe ich mal einen kleinen bot geschrieben der Smileys "umschreibt" und das nicht nur in Epvpers http://autoit.de/wcf/images/smilies/thumbup.png
so gehts: Markiert euren text im editor und drückt den Hotkey (standard F2)
wenn ich gaaanz viel tonnenweise langweile habe, mache ich noch ein makroprogramm damit ihr...
[RELEASE] [OPEN SOURCE] CE 5.5 Pointer to AutoIt Source-Code 02/13/2011 - AutoIt - 6 Replies Habe heute erst gemerkt, dass es hier eine AutoIt Sektion gibt xD also poste ich mal mein Programm mit rein.
Funktionsweise:
1. in CE Rechtsklick auf den Pointer und auf "Copy" klicken
2. in meinem Programm auf "Code generieren" klicken
3. In euer Scite gehen und einfügen
Hier ist der Source Code vom Programm: