|
You last visited: Today at 20:52
Advertisement
[Tutorial] GWCA
Discussion on [Tutorial] GWCA within the GW Bots forum part of the Guild Wars category.
12/06/2009, 13:29
|
#1
|
elite*gold: 0
Join Date: Apr 2009
Posts: 793
Received Thanks: 366
|
[Tutorial] GWCA
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 Guild Wars 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):
GWCA (Source, rev 133):
GWCAConstants.au3:
LUA:
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
Ok dazu ist eigentlich nicht viel zu sagen, außer dass die rot makierten Stellen uns die Kommunikation mit GWCA ermöglichen.
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
Bei zweiter Möglichkeit ist noch zu erwähnen das der Return immer in einen Array der Größe 2 zurückgeleifert wird, auch wenn es nur ein Wert ist.
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
$CBVar ist eine globale Variable, die bei jeden Aufruf von CmdCB auf den Return Wert gesetzt wird, auch wenn wir den Return in eine Varaible speichern ( $return).
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
An den grünmakierten Stellen wird $CBType gesetzt. Diese Variable ist sehr wichtig, sie gibt an als was fürn ein Typ für die Return Werte bekommen möchten. Nachdem wir die Varaible auf "float" gesetzt haben, holen wir uns unsere Position (mittels $CA_GetCoords). Die blau makierte -2 gibt an das wir die Koordinaten von unseren eigenen Charakter empfangen wollen:
-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)
Wichtig: Der Button funktioniert nur in Außenposten!!!
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
Ok diesmal ist das ganze etwas kleiner aber das stört uns nicht 
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
Ok ich glaube man kann schon an den Farben sehen, dass es viel zu erklären gibt ^^. Gehen wir also Schritt für Schritt durch:
Code:
Func SkillLog[COLOR="YellowGreen"]($hwnd, $msg, $wparam, $lparam)[/COLOR]
Wichtig ist das die Parameterlist 4 oder weniger Parameter besitzt, nicht mehr. Die Parameter könnnen beleibig umbenannt werden, jedoch sind die Namen zu empfehlen, da man dann sofort weis was was iat
Als nächstes empfangen wir die erste Struct:
Code:
[COLOR="RoyalBlue"]$recv = DllStructCreate("ptr;dword;ptr", $LParam)[/COLOR]
Ich kann euch leider nicht sagen was im ersten ptr und im dword steht, aber ich kann euch sagen, dass sich im zweiten ptr die Struct von unseren Skill befindet.
Um diese auszulesen, benötigen wir die nächste Zeile:
Code:
[COLOR="DarkOrange"]$skillStruct = DllStructCreate($tagSKILLLOGSTRUCT, DllStructGetData($recv, 3))[/COLOR]
$tagSKILLLOGSTRUCT befindet sich in der GWCAConstants.au3 und enthält die "Formatierung" (kA wie man das in AutoIT nennt) für unsere Skillstruct. Solltet ihr also wissen wollen, was für Elemente unsere Struct besitzt, schaut in der GWCAConstants.au3 nach.
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]
In diesen Teil überprüfen wir, ob wir den Skill gecastet haben und lesne ein paar Werte aus der Struct und schreiben sie in unseren Label.
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:  .
Ansonsten verabschiede ich mich jetzt von euch und wünsche euch noch einen schönen Tag, bb
|
|
|
12/06/2009, 13:59
|
#2
|
elite*gold: 0
Join Date: Oct 2009
Posts: 557
Received Thanks: 160
|
Schöner Guide.
Hoffe mal, dass damit nun ´n paar mehr Leute mit begeistert werden können, denn auch wie du schon gesagt hast, mit GWCA gibt es keinerlei Mems, die verwertet werden müssen - so gibt es auch das rumgeschlage mit dem regelmäßigen Updaten nicht.
Zusätzlich sind die Funktionen auf der GoogleSite einzelnd definiert, sodass es keinerlei verständnissprobleme auftauchen sollten. Und wenn doch - Hilfe gibt es immer von ACB und Harboe.
Vorallem denen gehört mal ein großes Dankeschön ausgesprochen
|
|
|
12/06/2009, 16:51
|
#3
|
elite*gold: 20
Join Date: Oct 2008
Posts: 1,835
Received Thanks: 1,638
|
Falsche Sektion...
edit: Guides <> Tutorials or what?
|
|
|
12/06/2009, 21:58
|
#4
|
elite*gold: 1826
Join Date: Mar 2009
Posts: 4,310
Received Thanks: 6,287
|
Sektion stimmt.
GJ.
#sticked
|
|
|
12/07/2009, 09:51
|
#5
|
elite*gold: 0
Join Date: Jan 2008
Posts: 293
Received Thanks: 40
|
Vielen Dank =) dann code ich in den Wintertagen wieder bissel rum...und probier irgendwas aus xD
Thy
|
|
|
12/07/2009, 18:01
|
#6
|
elite*gold: 0
Join Date: Feb 2008
Posts: 191
Received Thanks: 135
|
Nice job! Always good to see someone make guides like these (I was pretty lazy when I made the First Time User Guide  ), and I'm sure it'll help anyone out there who still didn't catch on with GWCA yet.
Harboe
|
|
|
12/07/2009, 18:30
|
#7
|
elite*gold: 0
Join Date: Jan 2008
Posts: 293
Received Thanks: 40
|
also bei mir kommt immer der Fehler
"Error: No variable given for "Dim", "Local", "Global", "Struct" or "Const" statement"
es liegt wohl an der GWCAConstants.au3
könnt mir die jemand uploaden oder hat jemand gleichen Fehler/ kann ihn beheben ?
|
|
|
12/07/2009, 18:38
|
#8
|
elite*gold: 0
Join Date: Apr 2009
Posts: 793
Received Thanks: 366
|
Quote:
Originally Posted by NANAAA
also bei mir kommt immer der Fehler
"Error: No variable given for "Dim", "Local", "Global", "Struct" or "Const" statement"
es liegt wohl an der GWCAConstants.au3
könnt mir die jemand uploaden oder hat jemand gleichen Fehler/ kann ihn beheben ?
|
Irkenntwo ist eine Varaible bei dir falsch deklariert; kannst du mal die Zeile posten, wo der Fehler auftaucht?
|
|
|
12/07/2009, 18:46
|
#9
|
elite*gold: 0
Join Date: Jan 2008
Posts: 293
Received Thanks: 40
|
ja klar
|
|
|
12/07/2009, 18:54
|
#10
|
elite*gold: 0
Join Date: Apr 2009
Posts: 793
Received Thanks: 366
|
Wahrscheinlich hast du hinter der letzten Variable ein Komma
|
|
|
12/07/2009, 19:00
|
#11
|
elite*gold: 0
Join Date: Jan 2008
Posts: 293
Received Thanks: 40
|
hab den Fehler nicht gefunden bez. ein Komma zuviel
könntest du mir deine GWCAConstants hochlädst ?
|
|
|
12/07/2009, 19:04
|
#12
|
elite*gold: 0
Join Date: Apr 2009
Posts: 793
Received Thanks: 366
|
Hab noch die alte rev 107 und hab paar Dinge geändert, aber ich denke das stört dich nicht:
Code:
; # -+-+-+-+-+-+-+ #
; GWCA Constants
; By Sune C
; # +-+-+-+-+-+-+- #
#include-once
; The SkillLog structure for use with the Skill Log feature
Global $tagSKILLLOGSTRUCT = "long AgentId;long MyId;long SkillId;float Activation;byte TeamId;ushort Allegiance;float Distance;long Ping"
; The constants
Global Enum $CA_GetCurrentTarget = 0x401, $CA_GetMyId, $CA_Casting, $CA_SkillRecharge, $CA_SkillAdrenaline, _
$CA_StoreVar, $CA_SetLogAndHwnd, $CA_GetAgentAndTargetPtr, $CA_GetSkillbarSkillId, $CA_GetMyMaxHP, $CA_GetMyMaxEnergy, $CA_GetBuildNumber, _
$CA_ChangeMaxZoom, $CA_GetLastDialogId, $CA_SetEngineHook, _
$CA_Attack = 0x410, $CA_Move, $CA_UseSkill, _
$CA_ChangeWeaponSet, $CA_ZoneMap, $CA_DropGold, $CA_GoNpc, $CA_GoPlayer, $CA_GoSignpost, $CA_UseAttackSkill, _
$CA_EnterChallenge, $CA_OpenChest, $CA_SetEventSkillMode, $CA_UseSkillbarSkill, $CA_PickupItem, _
$CA_UseSkillbarAttackSkill, $CA_Dialog, $CA_ChangeTarget, $CA_StatusBot, $CA_TargetNearestFoe, $CA_TargetNearestAlly, _
$CA_TargetNearestItem, $CA_StatusDelay, $CA_TargetCalledTarget, $CA_UseHero1Skill, $CA_UseHero2Skill, $CA_UseHero3Skill, $CA_StatusMiss, _
$CA_CancelAction, $CA_StatusTab, $CA_GetNamePtr, $CA_CommandHero1, $CA_CommandHero2, $CA_CommandHero3, $CA_CommandAll, $CA_ChangeDistrict, _
$CA_Resign, $CA_ReturnToOutpost, _
$CA_GetMapLoading = 0x440, $CA_GetMapId, $CA_GetPing, $CA_GetLoggedIn, $CA_GetDead, $CA_GetBalthFaction, $CA_GetKurzFaction, $CA_GetLuxonFaction, _
$CA_GetTitleTreasure, $CA_GetTitleLucky, $CA_GetTitleUnlucky, $CA_GetTitleWisdom, _
$CA_GetAgentExist = 0x450, $CA_GetProfessions, $CA_GetPlayerNumber, _
$CA_GetHP, $CA_GetRotation, _
$CA_GetSkill, $CA_GetCoords, $CA_GetWeaponSpeeds, $CA_GetSpiritRange, $CA_GetTeamId, $CA_GetCombatMode, _
$CA_GetModelMode, $CA_GetHpPips, $CA_GetEffects, $CA_GetHex, $CA_GetModelAnimation, $CA_GetEnergy, $CA_GetAgentPtr, _
$CA_GetType, $CA_GetLevel, $CA_GetNameProperties, $CA_GetMaxId, $CA_GetMyNearestAgent, _
$CA_GetMyDistanceToAgent, $CA_GetNearestAgentToAgent, $CA_GetDistanceFromAgentToAgent, $CA_GetNearestAgentToAgentEx, _
$CA_GetModelState, $CA_GetIsAttacking, $CA_GetIsKnockedDown, $CA_GetIsMoving, $CA_GetIsDead, $CA_GetIsCasting, _
$CA_GetFirstAgentByPlayerNumber, $CA_GetAllegiance, $CA_GetNearestEnemyToAgentEx, $CA_GetIsAttackedMelee, $CA_GetNearestItemToAgentEx, _
$CA_GetNearestAgentByPlayerNumber, $CA_GetSpeed, $CA_GetNearestEnemyToAgentByAllegiance, $CA_GetNearestAliveEnemyToAgent, _
$CA_GetWeaponType, $CA_GetNearestSignpostToAgent, $CA_GetNearestNpcToAgentByAllegiance, $CA_GetNearestAgentToCoords, $CA_GetVars, _
$CA_GetNearestNpcToCoords, $CA_GetLoginNumber, _
$CA_GetGold = 0x510, $CA_GetBagSize, $CA_SetBag, $CA_GetItemId, _
$CA_GetIdKit, $CA_IdentifyItem, $CA_IdentifyItemById, $CA_DepositGold, $CA_WithdrawGold, $CA_SellItem, $CA_SellItemById, _
$CA_BuyIdKit, $CA_BuySuperiorIdKit, $CA_PrepareMoveItem, $CA_MoveItem, $CA_GetItemInfo, _
$CA_UseItem, $CA_UseItemById, $CA_DropItem, $CA_DropItemById, _
$CA_AcceptAllItems, $CA_GetItemLastModifier, _
$CA_GetTitleSunspear = 0x550, $CA_GetTitleLightbringer, $CA_GetTitleVanguard, $CA_GetTitleNorn, $CA_GetTitleAsura, $CA_GetTitleDeldrimor, _
$CA_GetTitleNorthMastery, $CA_GetTitleDrunkard, $CA_GetTitleSweet, $CA_GetTitleParty, $CA_GetTitleCommander, $CA_GetTitleLuxon, $CA_GetTitleKurzick, _
$CA_AddHero = 0x580, $CA_KickHero, $CA_SwitchMode, $CA_AddNpc, $CA_KickNpc, $CA_TravelGH, $CA_LeaveGH
Global Enum $RARITY_WHITE = 0x3D, $RARITY_BLUE = 0x3F, $RARITY_PURPLE = 0x42, $RARITY_GOLD = 0x40, $RARITY_GREEN = 0x43
Global Enum $BAG_BACKPACK = 1, $BAG_BELTPOUCH, $BAG_BAG1, $BAG_BAG2, $BAG_EQUIPMENTPACK, $BAG_UNCLAIMEDITEMS = 7, $BAG_STORAGE1, $BAG_STORAGE2, _
$BAG_STORAGE3, $BAG_STORAGE4, $BAG_STORAGE5, $BAG_STORAGE6, $BAG_STORAGE7, $BAG_STORAGE8, $BAG_STORAGEANNIVERSARY
Global Enum $HERO_NORGU = 1, $HERO_GOREN, $HERO_TAHLKORA, $HERO_MASTEROFWHISPERS, $HERO_ACOLYTEJIN, $HERO_KOSS, $HERO_DUNKORO, $HERO_ACOLYTESOUSUKE, $HERO_MELONNI, _
$HERO_ZHEDSHADOWHOOF, $HERO_GENERALMORGAHN, $HERO_MARGRIDTHESLY, $HERO_OLIAS = 14, $HERO_RAZAH, $HERO_MOX, $HERO_JORA = 18, $HERO_PYREFIERCESHOT, _
$HERO_LIVIA = 21, $HERO_KAHMU, $HERO_GWEN, $HERO_XANDRA, $HERO_VEKK, $HERO_OGDEN
; VARIABLES
Opt("WinTitleMatchMode", -1) ;Make sure that Guild Wars receives the messages (1 = match start, 2 = substring, 3 = exact)
Global $cbType = "int" ;What to read the callback values as
Global $cbVar[2] ;Array for callback wParam and lParam
Global $sGW = "Guild Wars -" ;Name of window
Global $cGUI = 0 ;Init GUI hwnd var
Global $bGWCA_INTERNAL = False ;Is set to True when inside a Cmd() or CmdCB() call
; FUNCTIONS
Func _IntToFloat($iInt)
Local $tFloat, $tInt
$tInt = DllStructCreate("int")
$tFloat = DllStructCreate("float", DllStructGetPtr($tInt))
DllStructSetData($tInt, 1, $iInt)
Return DllStructGetData($tFloat, 1)
EndFunc
Func _FloatToInt($fFloat)
Local $tFloat, $tInt
$tFloat = DllStructCreate("float")
$tInt = DllStructCreate("int", DllStructGetPtr($tFloat))
DllStructSetData($tFloat, 1, $fFloat)
Return DllStructGetData($tInt, 1)
EndFunc
Func WndCallback($hwnd, $msg, $wparam, $lparam)
Switch($cbType)
Case "float"
$wparam = _IntToFloat($wparam)
$lparam = _IntToFloat($lparam)
Case "int"
$wparam = Number($wparam)
$lparam = Number($lparam)
Case "hex" ;Do nothing
EndSwitch
$cbVar[0] = $wparam
$cbVar[1] = $lparam
EndFunc
Func Cmd($uMsg, $wparam = 0, $lparam = 0)
$bGWCA_INTERNAL = True
$cbVar[0] = ""
$cbVar[1] = ""
DllCall("user32.dll", "lparam", "PostMessage", "hwnd", WinGetHandle($sGW), "int", $uMsg, "wparam", $wparam, "lparam", $lparam)
$bGWCA_INTERNAL = False
EndFunc
Func CmdCB($uMsg, $wparam = 0)
$bGWCA_INTERNAL = True
$cbVar[0] = ""
$cbVar[1] = ""
DllCall("user32.dll", "lparam", "SendMessage", "hwnd", WinGetHandle($sGW), "int", $uMsg, "wparam", $wparam, "lparam", $cGUI)
If $cbVar[0] = "" AND $cbVar[1] = "" Then SetError(-1)
$bGWCA_INTERNAL = False
Return $cbVar
EndFunc
Func CmdCBEx($uMsg, $wParam = 0, $msTimeout = 60)
CmdCB($uMsg, $wParam)
$tEscape = TimerInit()
Do
Sleep(0)
Until TimerDiff($tEscape) > $msTimeout OR $cbVar[0] <> ""
EndFunc
Func MoveEx($x, $y, $random = 50)
local $x_random = $x+Random(-$random,$random)
local $y_random = $y+Random(-$random,$random)
Cmd($CA_MOVE, _FloatToInt($x_random), _FloatToInt($y_random))
local $return[2] = [$x_random,$y_random]
Return $return
EndFunc
Func GetNearestAgentToCoords($x, $y)
$oldCbType = $cbType
$cbType = "int"
Cmd($CA_GETNEARESTAGENTTOCOORDS, _FloatToInt($x), _FloatToInt($y))
Sleep(50)
CmdCB($CA_GETVARS)
$cbType = $oldCbType
Return $cbVar[1]
EndFunc
Func GetNearestNPCToCoords($x, $y)
$oldCbType = $cbType
$cbType = "int"
Cmd($CA_GETNEARESTNPCTOCOORDS, _FloatToInt($x), _FloatToInt($y))
Sleep(50)
CmdCB($CA_GETVARS)
$cbType = $oldCbType
Return $cbVar[1]
EndFunc
Func TravelTo($iMapId)
$tMap = TimerInit()
Cmd($CA_ZONEMAP, $iMapId)
Do
Sleep(200)
$aLoad = CmdCB($CA_GETMAPLOADING)
If TimerDiff($tMap) > 20000 AND $aLoad[0] <> 2 Then Cmd($CA_ZONEMAP, $iMapId)
$aTmpMap = CmdCB($CA_GETMAPID)
Until $aLoad[0] = 0 AND $aTmpMap[0] = $iMapId
EndFunc
Func MoveItem($itemBag, $itemSlot, $newBag, $newSlot)
Cmd($CA_PREPAREMOVEITEM, $itemBag, $itemSlot)
Sleep(20)
Cmd($CA_MOVEITEM, $newBag, $newSlot)
EndFunc
Func MoveItemById($itemId, $newBag, $newSlot)
Cmd($CA_PREPAREMOVEITEM, $itemId)
Sleep(20)
Cmd($CA_MOVEITEM, $newBag, $newSlot)
EndFunc
Func PickupItems($iItems = -1, $fMaxDistance = 1012)
Local $iItemsPicked = 0
$oldCbType = $cbType
$cbType = "int"
$tDeadlock = TimerInit()
Do
$aItem = CmdCB($CA_GETNEARESTITEMTOAGENTEX, -2)
If $aItem[0] = 0 OR _IntToFloat($aItem[1]) > $fMaxDistance OR TimerDiff($tDeadlock) > 30000 Then ExitLoop
Cmd($CA_PICKUPITEM, $aItem[0])
$tDeadlock = TimerInit()
Do
Sleep(500)
CmdCB($CA_GETAGENTEXIST, $aItem[0])
If TimerDiff($tDeadlock) > 5000 Then ContinueLoop 2
Until $cbVar[0] = 0
$iItemsPicked += 1
Until $iItemsPicked = $iItems
$cbType = $oldCbType
EndFunc
Func GetItemId($iBag, $iSlot)
$oldCbType = $cbType
$cbType = "int"
CmdCB($CA_SetBag, $iBag)
CmdCB($CA_GetItemId, $iSlot)
$cbType = $oldCbType
Return $cbVar
EndFunc
Func GetItemInfo($iBag, $iSlot)
$oldCbType = $cbType
$cbType = "int"
CmdCB($CA_SetBag, $iBag)
CmdCB($CA_GetItemInfo, $iSlot)
$cbType = $oldCbType
Return $cbVar
EndFunc
Func GetItemLastModifier($iBag, $iSlot)
$oldCbType = $cbType
$cbType = "int"
CmdCB($CA_SetBag, $iBag)
CmdCB($CA_GetItemLastModifier, $iSlot)
$cbType = $oldCbType
Return $cbVar
EndFunc
; END OF FILE
func check_Area($posx,$posy,$x,$y,$offset = 0)
If ($x > $posx -$offset And $x < $posx +$offset) And ($y > $posy -$offset And $y < $posy +$offset) Then
Return True
EndIf
Return False
EndFunc
func RndSleep($time,$rnd = 100)
local $random = Random($time-$rnd,$time+$rnd,1)
Sleep($random)
Return $random
EndFunc
|
|
|
12/07/2009, 22:47
|
#13
|
elite*gold: 0
Join Date: Feb 2008
Posts: 191
Received Thanks: 135
|
I think that NANAAA got that issue because he copy-pasted the GWCAConstants.au3 you link to in your post. Please note that it's NOT the raw file and therefore may cause complications!
To get the raw file, which works, use this link (and I suggest you update your post to use that instead!):
EDIT: I have, even though I don't work on GWCA anymore xD, published a new revision. 114 to be exact. Maybe you just want to link to the download page for easy-ness and have people download the Featured one.
|
|
|
12/28/2009, 19:07
|
#14
|
elite*gold: 2
Join Date: Mar 2008
Posts: 1,778
Received Thanks: 1,222
|
Ich hätte auch eine Frage:
Ich weiß nicht genau wann ich Cmd und wann ich CmdCB benutzen muss.
Ich habe mal ein Testscript gemacht, was den Casey Carpenter im Auge des Nordens ansprechen soll:
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include "GWCAConstants.au3"
#Region ### START Koda GUI section ### Form=
$cGUI = GUICreate("ZTest!", 307, 152, 464, 290)
GUICtrlSetFont(-1, 15, 400, 0, "Arial")
$Button1 = GUICtrlCreateButton("Start", 96, 88, 113, 41, $WS_GROUP)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
GUIRegisterMsg(0x500, "WndCallback")
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Button1
_test()
EndSwitch
WEnd
Func _test()
CmdCB($CA_GetCurrentTarget, 16)
Cmd($CA_GoNpc, $cbVar[0])
EndFunc
Nur leider funktioniert das nicht richtig. Den Anfangsteil des Guides verstehe ich schon nicht ganz. Vllt kann sich ja einer per PM melden und mir über ICQ helfen.
MfG
|
|
|
12/28/2009, 19:41
|
#15
|
elite*gold: 100
Join Date: Oct 2007
Posts: 738
Received Thanks: 485
|
Cmd ( Command ) benutzt du wenn nichts zurück gegeben wird
CmdCb (Command Callback?) benutzt du wenn etwas zurück gegeben wird
Code:
$NPC = CmdCB($CA_GetCurrentTarget)
Cmd($CA_GoNpc, $NPC[0])
Les es dir am besten nochmal durch
|
|
|
 |
|
Similar Threads
|
Tutorial-Farben-Bot [GWCA]
04/12/2012 - GW Exploits, Hacks, Bots, Tools & Macros - 69 Replies
Nun ja, was gibt es noch groß dazu zu sagen. Er farmt die Banditen vor dem Aschfurt-Abtei.
!!! Version 3.0 - EndProdukt !!!!
Was ihr müsst:
- Die Quest Banditenüberfall von Baron Egan aktiv haben
Was der Bot macht:
- DLL wird automatisch injectet
- Wie gesagt, tötet er die Banditen (4-6 pro Run)
|
[GWCA] Tutorial-Level-Bot
05/20/2010 - GW Exploits, Hacks, Bots, Tools & Macros - 23 Replies
Nun ja, es ist ein Bot welcher die Quest Charr vor dem Tor fast kommplett durchführt. Es werden KEINE Skills gebraucht.
1 Run ca 1min
Was ihr müsst:
- DLL injecten
- min Stufe 2 sein (sonst kann man Quests nicht annehmen)
- Die Quest aktiv haben
Was der Bot macht:
|
[GWCA] - Tutorial Bot Package
05/16/2010 - GW Exploits, Hacks, Bots, Tools & Macros - 73 Replies
Soo, alles nochmal überarbeitet und funktioniert nun auch mit der neuen Rev.
http://s5.directupload.net/images/100419/temp/eth q5avo.jpg
:
Stadt: Aschfurt Abtei
Klasse: E/Mö bzw. Mö/E
Stufe: mind. 4
Benötigte Quests: Banditenüberfall und Schutzgebete
Skills: 1. Feuersturm ; 2. Schützende Hände ; 3. Symbol des Zorns
|
GWCA help?
02/20/2010 - GW Bots - 3 Replies
I'm trying to find place numbers for the maps etc.
Like Rata Sum is 640...
I need to know what I would set my ToPK value to.
It's for this...
Global $MAP_TOPK = ???
|
All times are GMT +1. The time now is 20:52.
|
|