Register for your free account! | Forgot your password?

Go Back   elitepvpers > MMORPGs > Guild Wars > GW Bots
You last visited: Today at 20:52

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



[Tutorial] GWCA

Discussion on [Tutorial] GWCA within the GW Bots forum part of the Guild Wars category.

Reply
 
Old   #1
 
Xereon's Avatar
 
elite*gold: 0
Join Date: Apr 2009
Posts: 793
Received Thanks: 366
Post [Tutorial] GWCA

GWCA Tutorial




Inhaltsverzeichniss:
  1. Vorwort
  2. Download + Injection
  3. Einführung: Die Basics
  4. Extended: Der SkillLog
  5. 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):

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
Xereon is offline  
Thanks
35 Users
Old 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
Jonas_93 is offline  
Old 12/06/2009, 16:51   #3
 
Syc0n's Avatar
 
elite*gold: 20
Join Date: Oct 2008
Posts: 1,835
Received Thanks: 1,638
Falsche Sektion...

edit: Guides <> Tutorials or what?
Syc0n is offline  
Old 12/06/2009, 21:58   #4


 
buFFy!'s Avatar
 
elite*gold: 1826
Join Date: Mar 2009
Posts: 4,310
Received Thanks: 6,287
Sektion stimmt.

GJ.

#sticked
buFFy! is offline  
Old 12/07/2009, 09:51   #5
 
NANAAA's Avatar
 
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
NANAAA is offline  
Old 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
SuneC is offline  
Old 12/07/2009, 18:30   #7
 
NANAAA's Avatar
 
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 ?
NANAAA is offline  
Old 12/07/2009, 18:38   #8
 
Xereon's Avatar
 
elite*gold: 0
Join Date: Apr 2009
Posts: 793
Received Thanks: 366
Quote:
Originally Posted by NANAAA View Post
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?
Xereon is offline  
Old 12/07/2009, 18:46   #9
 
NANAAA's Avatar
 
elite*gold: 0
Join Date: Jan 2008
Posts: 293
Received Thanks: 40
ja klar

NANAAA is offline  
Old 12/07/2009, 18:54   #10
 
Xereon's Avatar
 
elite*gold: 0
Join Date: Apr 2009
Posts: 793
Received Thanks: 366
Wahrscheinlich hast du hinter der letzten Variable ein Komma
Xereon is offline  
Old 12/07/2009, 19:00   #11
 
NANAAA's Avatar
 
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 ?
NANAAA is offline  
Old 12/07/2009, 19:04   #12
 
Xereon's Avatar
 
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
Xereon is offline  
Thanks
1 User
Old 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.
SuneC is offline  
Thanks
1 User
Old 12/28/2009, 19:07   #14
 
PenGuin :O's Avatar
 
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:


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
PenGuin :O is offline  
Old 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
ddl is offline  
Reply

Tags
anleitung, guide, gwca, tutorial


Similar Threads 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.


Powered by vBulletin®
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2026 elitepvpers All Rights Reserved.