[Release] AutoIt v3 Equipchanger Open Source

06/05/2012 18:00 EnnDee#1
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. :D

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?)

Source:


Config:

[Only registered and activated users can see links. Click Here To Register...]
06/05/2012 18:53 TheOnlyOne652089#2
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.



Nur als Referenz Code:

RECORDER.au3


AutoEquipper.au3
06/05/2012 19:14 xXuserXx#3
Hey, ich bekomme den Fehler Equipwechsler.exe ist keine zulässige Win32-Anwendung. Woran kann das liegen?
06/05/2012 19:28 EnnDee#4
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. :D

Quote:
Originally Posted by xXuserXx View Post
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.
06/05/2012 20:02 TheOnlyOne652089#5
Quote:
Originally Posted by EnnDee View Post
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. :D
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 View Post
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?
Ich meine das geht.

Code:
ControlSend($winTitle, "", $hWnd, "{ALTDOWN}")
ControlClick($winTitle, "", $hWnd, "right", 1, $mouseCoord[0], $mouseCoord[1])
ControlSend($winTitle, "", $hWnd, "{ALTUP}")
Scheint relativ problemlos zu funktionieren.
06/05/2012 23:05 EnnDee#6
Quote:
Originally Posted by TheOnlyOne652089 View Post

Code:
ControlSend($winTitle, "", $hWnd, "{ALTDOWN}")
ControlClick($winTitle, "", $hWnd, "right", 1, $mouseCoord[0], $mouseCoord[1])
ControlSend($winTitle, "", $hWnd, "{ALTUP}")
Scheint relativ problemlos zu funktionieren.
jo, hab ich auch direkt danach herausgefunden und deshalb den Post schnell wieder gelöscht. :D