GWCA Tutorial
Inhaltsverzeichniss:
- Vorwort
- Download + Injection
- Einführung: Die Basics
- Extended: Der SkillLog
- Schlußwort
Vorwort
Wahrscheinlich seit ihr gerade eben in dieses Thread geschlüpft und denkt euch "GWCA?", oder ihr habt schonmal davon gehört, aber so genau wisst ihr eigentlicht nicht, was das ist. Nun dann sei euch gesagt: Wenn ihr eure Bots, um einiges schneller schreiben wollt, oder keine Rumschlägerei mit Memorys mehr haben wollt, dann seit ihr hier genau richtig.
GWCA steht für GuildWars Client Api und es macht eigentlich nicht viel mehr, als euch ein Api zur Verfügung zu stellen und zwar das vom Guildwars Client. Das bedeutet für euch, dass ihr die Funktionen die der GW Client benutzt, auch in euren Script callen könnt.
Download + Injection
Das GWCA ist Open Source, dh. jeder kann sich den Source Code herunterladen. Jedoch benötigt ihr, wenn ihr GWCA in AutoIT benutzen wollt noch einen Include, der euch den größten Teil der Arbeit abnimmt.
GWCA (compiled): [Only registered and activated users can see links. Click Here To Register...]
GWCA (Source, rev 133): [Only registered and activated users can see links. Click Here To Register...]
GWCAConstants.au3: [Only registered and activated users can see links. Click Here To Register...]
LUA: [Only registered and activated users can see links. Click Here To Register...]
Downloadet euch entweder GWCA als compilete DLL (empfohlen) oder als Source. Bei Zweitem müsst ihr euch, die DLL dann selber compilen. Zudem benötigt ihr die GWCAConstants.au3, um, wie oben schon erwähnt, GWCA in AutoIT zu implementieren.
Packt nun die DLL in eurer Guildwars Ordner. Guildwars injected beim Start automatisch die Graphics.dll, jedoch ist dies nicht zwingend notwendig. Ihr könnt die DLL auch per Hand injecten.
Jetzt startet Guildwars und logt euch ein (bzw. Wählt auch einen Charakter aus). Sollte der Fenstername von Guildwars "Guildwars - [Charaktername]" seien, habt ihr alles richtig gemacht. Solltet ihr einen Error beim Starten von Guildwars bekommen, in dem steht, dass die Lua.5.1.dll nicht gefunden werden konnte, downloadet euch die DLL von oben(LUA) und tut sie auch in euren Guildwars Ordner.
Einführung: Die Basics
Nun da wir unser GWCA erfolgreich installiert haben, können wir mit dem Coden anfangen. Erstellt einen neuen .au3 File und kopiert die GWCAConstants.au3 in das selbe Verzeichniss, in welchem sich auch euer Script befindet.
Am Anfang war das GUI. So würde wohl die Bibel für GWCA´ler anfangen. Um überhaupt mit unserer injektzierten DLL in Verbindung zu stehen, brauchen wir einen Art Mittelmann. In unserem Fall ist dies, dass Messagesystem von Windows und daher brauchen wir ein GUI.
Code:
[COLOR="Red"]#include "GWCAConstants.au3"[/COLOR]
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
[COLOR="Red"]$cGui[/COLOR] = GUICreate("GWCA Beispiel", 363, 129, 200, 190) ;cGui sollte als Name beigelassen werden.
$posx = GUICtrlCreateLabel("X Position:", 5, 10, 350, 17)
GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
$posy = GUICtrlCreateLabel("Y Position:", 5, 38, 350, 17)
GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
$gold = GUICtrlCreateLabel("Aktuelles Gold:", 5, 62, 350, 17)
GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
$get_gold = GUICtrlCreateButton("Gold abheben", 5, 90, 351, 31, $WS_GROUP)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
[COLOR="Red"]
GUIRegisterMsg(0x500, "WndCallback") [/COLOR]
;Hier wird unser GUI registriert und immer, wenn wir eine 0x500 Nachricht empfangen,
;wird WndCallback aufgerufen(befindet sich im Include)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $get_gold
EndSwitch
WEnd
Da wir jetzt mit GWCA in Verbindung stehen, können wir die ersten Befehle callen. Es gibt zwei Möglichkeiten einen GWCA Befehl zu callen:
Code:
Cmd($Befehl,$Parameter1,$Parameter2) ;Call ohne Return Cmd[COLOR="Red"]CB[/COLOR]($Befehl,$Parameter1) ;Call mit Return
Fußnote: Für die Leute, die sich fragen, warum wir bei CmdCB nur einen Parameter übergeben können, sei gesagt, dass wir bei CmdCB in den ersten Parameter unsere Gui mitschicken, so dass GWCA weiß, wohin es den Return schicken soll.
Zudem gibt es 2 Möglichkeiten die Returns zu benutzen:
Code:
$return = CmdCB($Befehl) ;Call von irkennteinen Befehl $return[0] ;<- erster Rückgame Wert [COLOR="Red"]$CBVar[0][/COLOR] ;<- erster Rückgabe Wert Execute($return[0] == $CBVar[0]) ; true CmdCB($Befehl2) Execute($return[0] == $CBVar[0]) ; false
So, da ihr nun das System hinter GWCA verstanden habt, werden wir jetzt auch mal gleich unser Script vervollständigen:
Code:
While 1 . . . EndSwitch [COLOR="Green"]$CBType = "float"[/COLOR] CmdCB($CA_GetCoords,[COLOR="RoyalBlue"]-2[/COLOR]) GUICtrlSetData($posx,"X Position: " & $CBVar[0]) GUICtrlSetData($posy,"Y Position: " & $CBVar[1]) [COLOR="Green"]$CBType = "int"[/COLOR] CmdCB($CA_GetGold) GUICtrlSetData($gold,"Aktuelles Gold: " & $CBVar[0] & " In der Truhe: " & $CBVar[1]) WEnd
-2 = eigene ID (relativ)
-1 = ID des aktuellen Ziels (relativ)
>= 0 = Absolute ID
Nachdem wir uns nun unsere Koordinaten geholt haben, tragen wir sie in unsere Labels $posx und $posy ein. Danach besorgen wir uns noch mittels $CA_GetGold unser aktuelles Gold.
So zum Schluß fehlt jetzt nurnoch unser Button:
Code:
Case $get_gold
$q_gold = InputBox("Gold abheben","Wieviel Gold wollen sie abheben?",0)
$q_gold = Number($q_gold)
Cmd($CA_WithdrawGold,$q_gold)
Extended: Der SkillLog
Dieser Teil ist für Anfänger nicht geeiegnet und kann zu schweren Verwirrungen führen.
Der SkillLog ist eine sehr praktische Funktion von GWCA. Damit könnt ihr zum Beispiel sehen, welche Skills gerade auf euch abfeuert werden oder welche Skills ihr zurückfeuert.
Bevor wir beginnen benötigen wir wieder ein GUI:
Code:
#include "GWCAConstants.au3"
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
$cGui = GUICreate("GWCA Beispiel: SkillLog", 363, 60, 200, 190) ;cGui sollte als Name beigelassen werden.
$skill = GUICtrlCreateLabel("", 5, 10, 350, 30)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
GUIRegisterMsg(0x500, "WndCallback")
[COLOR="Red"]GUIRegisterMsg(0x4A, "SkillLog")[/COLOR]
[COLOR="Orange"]Cmd($CA_SETLOGANDHWND, 1, $cGUI)[/COLOR]
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
WEnd
Zu beachten ist das rot Makierte: Diese Funktion ("SkillLog") wird aufgerufen, wenn ein Skill gecastet wird. Die orange makierte Stelle ist dafür da, dass GWCA auch weiß das unser GUI $cGui ab jetzt auch den SkillLog empfangen möchte. Um GWCA zu sagen das es aufhören soll, reicht es antatt einer 1 eine 0 als Parameter zu übergeben.
Soweit so gut, aber etwas fehlt noch: Unsere SkillLog Funktion:
Code:
Func SkillLog[COLOR="YellowGreen"]($hwnd, $msg, $wparam, $lparam)[/COLOR]
[COLOR="RoyalBlue"]$recv = DllStructCreate("ptr;dword;ptr", $LParam)[/COLOR]
[COLOR="DarkOrange"]$skillStruct = DllStructCreate($tagSKILLLOGSTRUCT, DllStructGetData($recv, 3))[/COLOR]
[COLOR="DarkOrchid"]If DllStructGetData($skillStruct,"AgentId") == DllStructGetData($skillStruct,"MyId") Then
GUICtrlSetData($skill,"Du castes gerade den Skill mit der ID " & DllStructGetData($skillStruct,"SkillId") & " und wirst dafür " & Round(DllStructGetData($skillStruct,"Activation"),3) * 1000 & " MS benötigen.")
Sleep(Round(DllStructGetData($skillStruct,"Activation"),3) * 1000)
GUICtrlSetData($skill,"")
EndIf[/COLOR]
EndFunc
Code:
Func SkillLog[COLOR="YellowGreen"]($hwnd, $msg, $wparam, $lparam)[/COLOR]
Als nächstes empfangen wir die erste Struct:
Code:
[COLOR="RoyalBlue"]$recv = DllStructCreate("ptr;dword;ptr", $LParam)[/COLOR]
Um diese auszulesen, benötigen wir die nächste Zeile:
Code:
[COLOR="DarkOrange"]$skillStruct = DllStructCreate($tagSKILLLOGSTRUCT, DllStructGetData($recv, 3))[/COLOR]
Code:
[COLOR="DarkOrchid"]If DllStructGetData($skillStruct,"AgentId") == DllStructGetData($skillStruct,"MyId") Then GUICtrlSetData($skill,"Du castes gerade den Skill mit der ID " & DllStructGetData($skillStruct,"SkillId") & " und wirst dafür " & Round(DllStructGetData($skillStruct,"Activation"),3) * 1000 & " MS benötigen.") Sleep(Round(DllStructGetData($skillStruct,"Activation"),3) * 1000) GUICtrlSetData($skill,"") EndIf[/COLOR]
Schlußwort
Wenn ihr alles richtig gemacht habt, habt ihr jetzt 2 kleine Scripte mit denen ihr ein paar Werte aus Guildwars auslesen könnt. Interessiert ihr euch weiterhin für GWCA und wollt wissen was man mit GWCA noch so alles anstellen kannm lege ich euch die GWCA Command Documentation ans Herz: [Only registered and activated users can see links. Click Here To Register...].
Ansonsten verabschiede ich mich jetzt von euch und wünsche euch noch einen schönen Tag, bb ;)