From 6e94fc45a61d1cc4ee315b2a77976740dab5aa7c Mon Sep 17 00:00:00 2001 From: Ralle1976 Date: Fri, 12 Oct 2018 23:22:46 +0200 Subject: [PATCH] Headers Updated Update gwapi -Only the function OpenStorage does not work (but is not absolutely necessary) -Trade.au3 is not updated -the inventory process has been redesigned for a demo project --- gwApi/GUI.au3 | 23 +- gwApi/MoveToSafeSpot.au3 | 195 +- gwApi/PacketHeaders.au3 | 145 + gwApi/UpdateWorld.au3 | 531 +- gwApi/agents.au3 | 2707 ++++---- gwApi/array_questnames.au3 | 2861 ++++---- gwApi/array_skill_small.au3 | 2649 ++++---- gwApi/array_skillnames.au3 | 5975 +++++++++-------- gwApi/array_skills_big.au3 | 2649 ++++---- gwApi/array_skills_pvp.au3 | 271 +- gwApi/characterinfo.au3 | 379 +- gwApi/chat.au3 | 251 +- gwApi/client_interface.au3 | 719 +- gwApi/constants.au3 | 5971 ++++++++-------- gwApi/emoting.au3 | 108 +- gwApi/faction.au3 | 121 +- gwApi/gwAPI_basics.au3 | 5702 ++++++++-------- gwApi/gwAPI_integrate.au3 | 2181 +++--- gwApi/gwAPI_integrate_BackUp.au3 | 1091 +++ gwApi/h_h.au3 | 421 +- gwApi/inventory.au3 | 2921 ++++---- gwApi/items.au3 | 2726 ++++---- gwApi/map.au3 | 507 +- gwApi/memreads.au3 | 399 +- gwApi/movement.au3 | 1319 ++-- gwApi/party.au3 | 204 +- gwApi/plugin.au3 | 297 +- gwApi/plugins/Archiv/CollectItem.gwplasm | 24 + gwApi/plugins/Archiv/CraftItemEx.gwplasm | 39 + gwApi/plugins/Archiv/DialogLogEx.gwplasm | 77 + gwApi/plugins/Archiv/DrunkState.gwplasm | 27 + gwApi/plugins/Archiv/MakeAgentArrayEx.gwplasm | 37 + gwApi/plugins/Archiv/Upgrade.gwplasm | 20 + gwApi/plugins/CollectItem.gwplasm | 46 +- gwApi/plugins/CraftItemEx.gwplasm | 76 +- gwApi/plugins/DialogLogEx.gwplasm | 152 +- gwApi/plugins/DrunkState.gwplasm | 52 +- gwApi/plugins/MakeAgentArrayEx.gwplasm | 74 +- gwApi/plugins/Upgrade.gwplasm | 38 +- gwApi/plugins/pluginfunctions.au3 | 604 +- gwApi/quest.au3 | 95 +- gwApi/skills.au3 | 3059 ++++----- gwApi/smartcast.au3 | 937 +-- gwApi/trade.au3 | 113 +- gwApi/utilities/GUI.au3 | 23 +- gwApi/utilities/GetAllGHPasses.au3 | 297 +- gwApi/utilities/MoveToSafeSpot.au3 | 199 +- gwApi/utilities/emoting.au3 | 109 +- gwApi/utilities/inventory_Edit_by_Ralle.au3 | 4032 +++++------ gwApi/utilities/memreads.au3 | 399 +- gwApi/utilities/tempstorage.au3 | 522 +- gwApi/utilities/trade.au3 | 105 +- 52 files changed, 28124 insertions(+), 26355 deletions(-) create mode 100644 gwApi/PacketHeaders.au3 create mode 100644 gwApi/gwAPI_integrate_BackUp.au3 create mode 100644 gwApi/plugins/Archiv/CollectItem.gwplasm create mode 100644 gwApi/plugins/Archiv/CraftItemEx.gwplasm create mode 100644 gwApi/plugins/Archiv/DialogLogEx.gwplasm create mode 100644 gwApi/plugins/Archiv/DrunkState.gwplasm create mode 100644 gwApi/plugins/Archiv/MakeAgentArrayEx.gwplasm create mode 100644 gwApi/plugins/Archiv/Upgrade.gwplasm diff --git a/gwApi/GUI.au3 b/gwApi/GUI.au3 index efe3d1b..3cd924c 100644 --- a/gwApi/GUI.au3 +++ b/gwApi/GUI.au3 @@ -1,11 +1,12 @@ -#include-once - -;~ Description: Gregs pretty GUIs. -Func _GuiRoundCorners($h_win, $iSize) - Local $XS_pos, $XS_ret - $XS_pos = WinGetPos($h_win) - $XS_ret = DllCall("gdi32.dll", "long", "CreateRoundRectRgn", "long", 0, "long", 0, "long", $XS_pos[2] + 1, "long", $XS_pos[3] + 1, "long", $iSize, "long", $iSize) - If $XS_ret[0] Then - DllCall("user32.dll", "long", "SetWindowRgn", "hwnd", $h_win, "long", $XS_ret[0], "int", 1) - EndIf -EndFunc ;==>_GuiRoundCorners \ No newline at end of file + +#include-once + +;~ Description: Gregs pretty GUIs. +Func _GuiRoundCorners($h_win, $iSize) + Local $XS_pos, $XS_ret + $XS_pos = WinGetPos($h_win) + $XS_ret = DllCall("gdi32.dll", "long", "CreateRoundRectRgn", "long", 0, "long", 0, "long", $XS_pos[2] + 1, "long", $XS_pos[3] + 1, "long", $iSize, "long", $iSize) + If $XS_ret[0] Then + DllCall("user32.dll", "long", "SetWindowRgn", "hwnd", $h_win, "long", $XS_ret[0], "int", 1) + EndIf +EndFunc ;==>_GuiRoundCorners diff --git a/gwApi/MoveToSafeSpot.au3 b/gwApi/MoveToSafeSpot.au3 index eaf99bc..e00bd5f 100644 --- a/gwApi/MoveToSafeSpot.au3 +++ b/gwApi/MoveToSafeSpot.au3 @@ -1,97 +1,98 @@ -#include-once - -Global $ClostestX[1] -Global $ClostestY[1] -Global $SpiritAverageXLocation = 0 -Global $SpiritAverageYLocation = 0 -Global $EnemyAverageXLocation = 0 - -;~ Description: Gregs circle trig. Returns Array for X,Y location of closest safe point. -Func GetClosestSafeZone($aX, $aY, $radius = 300, $aMe = GetAgentPtr(-2)) - Local $d2r = 3.141592653589 / 180 - Local $coords[2] - Local $MyLocation = XandYLocation($aMe) - Local $theta = 0, $TempX, $TempY, $ClostestLocation = 5000 - For $i = 0 To 17 - $theta += 20 - $TempX = ($radius * Cos($theta * $d2r)) + $aX - $TempY = ($radius * Sin($theta * $d2r)) + $aY - If ComputeDistance($TempX, $TempY, $MyLocation[0], $MyLocation[1]) < $ClostestLocation Then - $ClostestLocation = ComputeDistance($TempX, $TempY, $MyLocation[0], $MyLocation[1]) - $coords[0] = $TempX - $coords[1] = $TempY - EndIf - Next - Return $coords -EndFunc ;==>GetClosestSafeZone - -;~ Description: Gregs circle trig. -Func GetClosestCoordAroundAgent($Agent, $radius = 1000) - Local $d2r = 3.141592653589 / 180 - Local $coords[2] - Local $aX = XLocation($Agent) - Local $aY = YLocation($Agent) - Local $MyaX = XLocation() - Local $MyaY = YLocation() - Local $theta = 0, $TempX, $TempY, $ClostestLocation = 500 - Dim $ClostestX[1] = [0] - Dim $ClostestY[1] = [0] - For $i = 0 To 99 - $theta += 3.6 - $TempX = (($radius - UBound($mEnemyCorpesSpellRange) * 50) * Cos($theta * $d2r)) + $aX - $TempY = (($radius - UBound($mEnemyCorpesSpellRange) * 50) * Sin($theta * $d2r)) + $aY - If ComputeDistance($TempX, $TempY, $MyaX, $MyaY) > $ClostestLocation Then - $ClostestLocation = ComputeDistance($TempX, $TempY, $MyaX, $MyaY) - $ClostestX[0] += 1 - ReDim $ClostestX[$ClostestX[0] + 1] - $ClostestX[$ClostestX[0]] = $TempX - $ClostestY[0] += 1 - ReDim $ClostestY[$ClostestY[0] + 1] - $ClostestY[$ClostestY[0]] = $TempY - EndIf - Next -EndFunc ;==>GetClosestCoordAroundAgent - -;~ Description: Gregs circle trig. -Func GetAttackPositionAroundAgent($Agent, $radius = 700) - Local $d2r = 3.141592653589 / 180 - Local $coords[2] - Local $EnemyLocation = XandYLocation($Agent) - Local $LeaderLocation = XandYLocation($SavedLeaderID) - Local $MyLocation = XandYLocation() - Local $theta = 0, $TempX, $TempY, $ClostestLocation = 5000 - Local $PlayerNum = MemoryRead(GetAgentPtr(-2) + 244, 'word') - For $i = 0 To 17 - $theta += 20 - $PlayerTheta = $theta - 20 + $PlayerNum * 20 - $TempX = ($radius * Cos($PlayerTheta * $d2r)) + $EnemyLocation[0] - $TempY = ($radius * Sin($PlayerTheta * $d2r)) + $EnemyLocation[1] - If ComputeDistance($TempX, $TempY, $LeaderLocation[0], $LeaderLocation[1]) < $ClostestLocation Then - $ClostestLocation = ComputeDistance($TempX, $TempY, $LeaderLocation[0], $LeaderLocation[1]) - $coords[0] = $TempX - $coords[1] = $TempY - EndIf - Next - Return $coords -EndFunc ;==>GetAttackPositionAroundAgent - -;~ Description: Calculates a safe spot and moves to it. -Func MoveToSafeSpot($radius = 100) - If $EnemyAverageXLocation = 0 Or $SpiritAverageXLocation = 0 Then Return - Local $d2r = 3.141592653589 / 180 - Local $coords[2], $TestDistance - Local $theta = 0, $TempX, $TempY, $SafeDistance = 0 - Local $SafeX, $SafeY - For $i = 0 To 99 - $theta += 3.6 - $TempX = ($radius * Cos($theta * $d2r)) + $SpiritAverageXLocation - $TempY = ($radius * Sin($theta * $d2r)) + $SpiritAverageYLocation - $TestDistance = ComputeDistance($TempX, $TempY, $EnemyAverageXLocation, $EnemyAverageYLocation) - If $TestDistance > $SafeDistance Then - $SafeDistance = $TestDistance - $SafeX = $TempX - $SafeY = $TempY - EndIf - Next - Move($SafeX, $SafeY) -EndFunc ;==>MoveToSafeSpot \ No newline at end of file + +#include-once + +Global $ClostestX[1] +Global $ClostestY[1] +Global $SpiritAverageXLocation = 0 +Global $SpiritAverageYLocation = 0 +Global $EnemyAverageXLocation = 0 + +;~ Description: Gregs circle trig. Returns Array for X,Y location of closest safe point. +Func GetClosestSafeZone($aX, $aY, $radius = 300, $aMe = GetAgentPtr(-2)) + Local $d2r = 3.141592653589 / 180 + Local $coords[2] + Local $MyLocation = XandYLocation($aMe) + Local $theta = 0, $TempX, $TempY, $ClostestLocation = 5000 + For $i = 0 To 17 + $theta += 20 + $TempX = ($radius * Cos($theta * $d2r)) + $aX + $TempY = ($radius * Sin($theta * $d2r)) + $aY + If ComputeDistance($TempX, $TempY, $MyLocation[0], $MyLocation[1]) < $ClostestLocation Then + $ClostestLocation = ComputeDistance($TempX, $TempY, $MyLocation[0], $MyLocation[1]) + $coords[0] = $TempX + $coords[1] = $TempY + EndIf + Next + Return $coords +EndFunc ;==>GetClosestSafeZone + +;~ Description: Gregs circle trig. +Func GetClosestCoordAroundAgent($Agent, $radius = 1000) + Local $d2r = 3.141592653589 / 180 + Local $coords[2] + Local $aX = XLocation($Agent) + Local $aY = YLocation($Agent) + Local $MyaX = XLocation() + Local $MyaY = YLocation() + Local $theta = 0, $TempX, $TempY, $ClostestLocation = 500 + Dim $ClostestX[1] = [0] + Dim $ClostestY[1] = [0] + For $i = 0 To 99 + $theta += 3.6 + $TempX = (($radius - UBound($mEnemyCorpesSpellRange) * 50) * Cos($theta * $d2r)) + $aX + $TempY = (($radius - UBound($mEnemyCorpesSpellRange) * 50) * Sin($theta * $d2r)) + $aY + If ComputeDistance($TempX, $TempY, $MyaX, $MyaY) > $ClostestLocation Then + $ClostestLocation = ComputeDistance($TempX, $TempY, $MyaX, $MyaY) + $ClostestX[0] += 1 + ReDim $ClostestX[$ClostestX[0] + 1] + $ClostestX[$ClostestX[0]] = $TempX + $ClostestY[0] += 1 + ReDim $ClostestY[$ClostestY[0] + 1] + $ClostestY[$ClostestY[0]] = $TempY + EndIf + Next +EndFunc ;==>GetClosestCoordAroundAgent + +;~ Description: Gregs circle trig. +Func GetAttackPositionAroundAgent($Agent, $radius = 700) + Local $d2r = 3.141592653589 / 180 + Local $coords[2] + Local $EnemyLocation = XandYLocation($Agent) + Local $LeaderLocation = XandYLocation($SavedLeaderID) + Local $MyLocation = XandYLocation() + Local $theta = 0, $TempX, $TempY, $ClostestLocation = 5000 + Local $PlayerNum = MemoryRead(GetAgentPtr(-2) + 244, 'word') + For $i = 0 To 17 + $theta += 20 + $PlayerTheta = $theta - 20 + $PlayerNum * 20 + $TempX = ($radius * Cos($PlayerTheta * $d2r)) + $EnemyLocation[0] + $TempY = ($radius * Sin($PlayerTheta * $d2r)) + $EnemyLocation[1] + If ComputeDistance($TempX, $TempY, $LeaderLocation[0], $LeaderLocation[1]) < $ClostestLocation Then + $ClostestLocation = ComputeDistance($TempX, $TempY, $LeaderLocation[0], $LeaderLocation[1]) + $coords[0] = $TempX + $coords[1] = $TempY + EndIf + Next + Return $coords +EndFunc ;==>GetAttackPositionAroundAgent + +;~ Description: Calculates a safe spot and moves to it. +Func MoveToSafeSpot($radius = 100) + If $EnemyAverageXLocation = 0 Or $SpiritAverageXLocation = 0 Then Return + Local $d2r = 3.141592653589 / 180 + Local $coords[2], $TestDistance + Local $theta = 0, $TempX, $TempY, $SafeDistance = 0 + Local $SafeX, $SafeY + For $i = 0 To 99 + $theta += 3.6 + $TempX = ($radius * Cos($theta * $d2r)) + $SpiritAverageXLocation + $TempY = ($radius * Sin($theta * $d2r)) + $SpiritAverageYLocation + $TestDistance = ComputeDistance($TempX, $TempY, $EnemyAverageXLocation, $EnemyAverageYLocation) + If $TestDistance > $SafeDistance Then + $SafeDistance = $TestDistance + $SafeX = $TempX + $SafeY = $TempY + EndIf + Next + Move($SafeX, $SafeY) +EndFunc ;==>MoveToSafeSpot diff --git a/gwApi/PacketHeaders.au3 b/gwApi/PacketHeaders.au3 new file mode 100644 index 0000000..672bd06 --- /dev/null +++ b/gwApi/PacketHeaders.au3 @@ -0,0 +1,145 @@ +#include-once + +Local const $CtoGS_MSG_Disconnect = 0x9; +Local const $CtoGS_MSG_RequestItems = 0x97; +Local const $CtoGS_MSG_RequestSpawn = 0x8D; +Local const $CtoGS_MSG_RequestAgents = 0x96; + +Local const $CtoGS_MSG_CallTarget = 0x28; X +Local const $CtoGS_MSG_GoNPC = 0x3F; X +Local const $CtoGS_MSG_GoGadget = 0x57; X +Local const $CtoGS_MSG_GoPlayer = 0x39; X + +Local const $CtoGS_MSG_PickUpItem = 0x45; + +Local const $CtoGS_MSG_Attack = 0x2C; X +Local const $CtoGS_MSG_CancelAction = 0x2E; X + +Local const $CtoGS_MSG_OpenChest = 0x59; + +Local const $CtoGS_MSG_DropBuff = 0x2F; X +Local const $CtoGS_MSG_DropItem = 0x32; X + +Local const $CtoGS_MSG_DropGold = 0x35; + +Local const $CtoGS_MSG_EquipItem = 0x36; X + +Local const $CtoGS_MSG_DonateFaction = 0x3B; X +Local const $CtoGS_MSG_Dialog = 0x41; +Local const $CtoGS_MSG_MouseMove = 0x44; +Local const $CtoGS_MSG_UseSkill = 0x4C; +Local const $CtoGS_MSG_CallSkill = 0x2A; + +Local const $CtoGS_MSG_SetSkillbarSkill = 0x61; X + +Local const $CtoGS_MSG_ChangeSecondary = 0x47; +Local const $CtoGS_MSG_SetAttributes = 0x10; + +Local const $CtoGS_MSG_LoadSkillbar = 0x62; X + +Local const $CtoGS_MSG_RequestQuote = 0x52; +Local const $CtoGS_MSG_TransactItem = 0x53; +Local const $CtoGS_MSG_TransactTrade = 0x50; + + +;~ Size: 0x10 Header: 0x7C +;~ 7C 00 00 00 2E 00 00 00 15 01 00 00 D2 00 00 00 +;~ --------------------------------- +;~ 0x00 Header => 124 +;~ 0x04 Integer => 46 float => 0.000000 +;~ 0x08 Integer => 277 float => 0.000000 +;~ 0x0C Integer => 210 float => 0.000000 +Local const $CtoGS_MSG_StartSalvage = 0x7C; X + + +;~ Size: 0x4 Header: 0x7F +;~ 7F 00 00 00 +;~ --------------------------------- +;~ 0x00 Header => 127 + +;~ --------------------------------- +Local const $CtoGS_MSG_SalvageMaterials = 0x7F; X + +;~ Size: 0x4 Header: 0x7E +;~ 7E 00 00 00 +;~ --------------------------------- +;~ 0x00 Header => 126 + +;~ --------------------------------- +Local const $CtoGS_MSG_FinishSalvageMaterials = 0x7E; X + +Local const $CtoGS_MSG_SalvageMod = 0x80; X + +Local const $CtoGS_MSG_IdentifyItem = 0x71; X + + + +Local const $CtoGS_MSG_SplitStack = 0x7A; X + +Local const $CtoGS_MSG_MoveItem = 0x77; X + + + +Local const $CtoGS_MSG_AcceptAllItems = 0x78; X +Local const $CtoGS_MSG_UseItem = 0x83; X + +Local const $CtoGS_MSG_StartTrade = 0x4F; X + +Local const $CtoGS_MSG_AcknowledgeTrade = 0x0; + +Local const $CtoGS_MSG_AcceptTrade = 0x7; X + +Local const $CtoGS_MSG_CancelTrade = 0x1; +Local const $CtoGS_MSG_AddItemTrade = 0x2; +Local const $CtoGS_MSG_RemoveItemTrade = 0x5; + +Local const $CtoGS_MSG_ChangeOffer = 0x6; X +Local const $CtoGS_MSG_SubmitOffer = 0x3; X + +Local const $CtoGS_MSG_AddNpc = 0xA5; X +Local const $CtoGS_MSG_KickNpc = 0xAE; X + +Local const $CtoGS_MSG_InvitePlayer = 0xA6; X + +Local const $CtoGS_MSG_InvitePlayerByName = 0xA7; +Local const $CtoGS_MSG_KickPlayer = 0xAF; +Local const $CtoGS_MSG_AcceptPartyRequest = 0xA4; +Local const $CtoGS_MSG_DenyPartyRequest = 0xA2; + +Local const $CtoGS_MSG_EnterChallenge = 0xAB; X +Local const $CtoGS_MSG_ReturnToOutpost = 0xAD; X + +Local const $CtoGS_MSG_AbandonQuest = 0x12; +Local const $CtoGS_MSG_ActivateQuest = 0x13; +Local const $CtoGS_MSG_RequestQuest = 0x16; + +Local const $CtoGS_MSG_SetHeroAggression = 0x17; X +Local const $CtoGS_MSG_LockHeroTarget = 0x18; X +Local const $CtoGS_MSG_ChangeHeroSkillSlotState = 0x1C; X +Local const $CtoGS_MSG_CommandHero = 0x1E; X +Local const $CtoGS_MSG_CommandAll = 0x1F; X +Local const $CtoGS_MSG_AddHero = 0x23; X +Local const $CtoGS_MSG_KickHero = 0x24; X +Local const $CtoGS_MSG_TravelGH = 0xB6; X +Local const $CtoGS_MSG_LeaveGH = 0xB8; X +Local const $CtoGS_MSG_TravelTo = 0xB7; X + +Local const $CtoGS_MSG_SendChat = 0x69; + +Local const $CtoGS_MSG_SetDisplayedTitle = 0x5D; X +Local const $CtoGS_MSG_RemoveDisplayedTitle = 0x5E; X +Local const $CtoGS_MSG_SkipCinematic = 0x68; X + +Local const $CtoGS_MSG_UnlockSkillByTome = 0x72; + +Local const $CtoGS_MSG_DeleteItem = 0x6E; X + + +Local const $CtoGS_MSG_ChangeGold = 0x81; + +Local const $CtoGS_MSG_SwitchMode = 0xA1; X +Local const $CtoGS_MSG_LeaveParty = 0xA8; X + +Local const $CtoGS_MSG_SwapWeapon = 0x38; +Local const $CtoGS_MSG_Tick = 0xB5; +Local const $CtoGS_MSG_DrawMap = 0x31; \ No newline at end of file diff --git a/gwApi/UpdateWorld.au3 b/gwApi/UpdateWorld.au3 index 37401f8..f1bfb4c 100644 --- a/gwApi/UpdateWorld.au3 +++ b/gwApi/UpdateWorld.au3 @@ -1,265 +1,266 @@ -#include-once - -;~ Description: Updates all the information you need for combat. -;~ Required functions: GetMyID, GetAgentPtr, GetIsDead, GetMapLoading, MemoryReadStruct, MemoryRead, -;~ UpdateAgentPosPtr, MemoryReadAgentPtrStruct, GetHasHex, GetHasCondition, GetNumberOfFoesInRangeOfAgent_, -;~ GetIsBoss, GetIsHealer, GetIsEnchanted -Func UpdateWorld(ByRef $aAgentArray, $aRange = 1350, $aMyID = GetMyID(), $aMe = GetAgentPtr($aMyID)) - Local $lX, $lY, $lHP, $lDistance, $lCountAOE = 1, $TeamCount = 1 - $aRange = $aRange ^ 2 - If $MyID = 0 Then $MyID = $aMyID - If $MyPtr = 0 Then $MyPtr = $aMe - If GetIsDead($MyPtr) Then Return False - If GetMapLoading() <> 1 Then Return True ; not explorable - Local $lEnergyStruct = MemoryReadStruct($MyPtr + 284,'float EnergyPercent;long MaxEnergy') - $mEnergy = DllStructGetData($lEnergyStruct, 'EnergyPercent') * DllStructGetData($lEnergyStruct, 'MaxEnergy') - $mEffects = GetEffectsPtr() - $mDazed = False - $mBlind = False - $mSkillHardCounter = False - $mSkillSoftCounter = 0 - $mAttackHardCounter = False - $mAttackSoftCounter = 0 - $mAllySpellHardCounter = False - $mEnemySpellHardCounter = False - $mSpellSoftCounter = 0 - $mBlocking = False - If IsArray($mEffects) <> 0 Then - For $i = 1 To $mEffects[0] - Switch MemoryRead($mEffects[$i], 'long') ; SkillID - Case 485 ; Dazed - $mDazed = True - Case 479 ; Blind - $mBlind = True - Case 30, 764 ; Diversion, Wail of Doom - $mSkillHardCounter = True - Case 51, 127 ; Shame, Mark of Subversion - $mAllySpellHardCounter = True - Case 46, 979, 3191 ; Guilt, Mistrust - $mEnemySpellHardCounter = True - Case 878, 3234 ; Visions of Regret - $mSkillSoftCounter += 1 - $mSpellSoftCounter += 1 - $mAttackSoftCounter += 1 - Case 28, 128 ; Backfire, Soul Leech - $mSpellSoftCounter += 1 - Case 47, 43, 1004, 2056, 3195 ; Ineptitude, Clumsiness, Yuletide, Wandering Eye - $mAttackHardCounter = True - Case 123, 26, 3151, 121, 103, 66 ; Insidious Parasite, Empathy, Spiteful Spirit, Price of Failure, Spirit Shackles - $mAttackSoftCounter += 1 - ; Auspicious Parry, Bonetti's Defense, Deadly Riposte, Defensive Stance, Deflect Arrows, - ; Disciplined Stance, Frenzied Defense, Gladiator's Defense, Riposte, Shield Bash, Shield Stance, - ; Soldier's Stance, Wary Stance, Dodge, Dryder's Defenses, Escape, Lightning Reflexes - Case 905,380,388,345,373,376,1700,372,387,363,378,1698,377,425,452,448,453 - $mBlocking = True - ; Critical Defenses, Flashing Blades, Weapon of Warding, Burning Shield, Attacker's Insight, - ; Shield of Force, Mental Block, Protector's Defense, Ward Against Melee, Mirage Cloak, Natural Stride - ; Whirling Defense, Zojun's Haste, Distortion, Magnetic Aura, Sliver Armor, Swirling Aura, - Case 1027,1042,793,2208,1764,2201,2417,810,176,1500,1727,450,1196,11,168,1084,233 - $mBlocking = True - EndSwitch - Next - EndIf - Local $lTeamSize = GetPartySize() - If $mTeam[0] <> $lTeamSize Then - $mTeam[0] = $lTeamSize - ReDim $mTeam[$lTeamSize + 1] - EndIf - Dim $mTeamOthers[1] = [0] - Dim $mTeamDead[1] = [0] - Dim $mSpirits[1] = [0] - Dim $mMinions[1] = [0] - $mHighestAlly = $MyPtr - $mHighestAllyHP = 2 - $mLowestAlly = $MyPtr - $mLowestAllyHP = 2 - $mLowestOtherAlly = 0 - $mLowestOtherAllyHP = 2 - $mLowestEnemy = 0 - $mLowestEnemyHP = 2 - $mClosestEnemyDist = $aRange - $mAverageTeamHP = 0 - $BestAOETarget = 0 - $HexedAlly = 0 - $ConditionedAlly = 0 - $EnemyHexed = 0 - $EnemyNonHexed = 0 - $EnemyConditioned = 0 - $EnemyNonConditioned = 0 - $EnemyNonEnchanted = 0 - $EnemyEnchanted = 0 - $EnemyHealer = 0 - $LowHPEnemy = 0 - $NumberOfFoesInAttackRange = 0 - $NumberOfFoesInSpellRange = 0 - UpdateAgentPosByPtr($MyPtr, $lX, $lY) - Local $lAgentEffects, $lAgentX, $lAgentY, $lAllegiance - For $i = 1 To $aAgentArray[0] - UpdateAgentPosByPtr($aAgentArray[$i], $lAgentX, $lAgentY) - $lHP = MemoryRead($aAgentArray[$i] + 304, 'float') ; HP - $lAgentEffects = MemoryRead($aAgentArray[$i] + 312, 'long') ; Effects - $lDistance = ($lX - $lAgentX) ^ 2 + ($lY - $lAgentY) ^ 2 - $lAllegiance = MemoryRead($aAgentArray[$i] + 433, 'byte') - Switch $lAllegiance ; Allegiance - Case 1, 6 ;Allies - If $lAllegiance = 1 Then - $mTeam[$TeamCount] = $aAgentArray[$i] - $TeamCount += 1 - EndIf - If IsSummonedCreature($aAgentArray[$i]) Then ContinueLoop ; necessary? - If Not BitAND($lAgentEffects, 0x0010) Then ; alive - $mAverageTeamHP += $lHP - If $lHP < $mLowestAllyHP Then ; Lowest Ally - $mLowestAlly = $aAgentArray[$i] - $mLowestAllyHP = $lHP - ElseIf $lHP = $mLowestAllyHP Then - If $lDistance < ($lX - MemoryRead($mLowestAlly + 116, 'float')) ^ 2 + ($lY - MemoryRead($mLowestAlly + 120, 'float')) ^ 2 Then - $mLowestAlly = $aAgentArray[$i] - $mLowestAllyHP = $lHP - EndIf - ElseIf $lHP > $mHighestAllyHP Then ; Highest Ally - $mHighestAlly = $aAgentArray[$i] - $mHighestAllyHP = $lHP - EndIf - If GetHasHex($aAgentArray[$i]) Then $HexedAlly = $aAgentArray[$i] - If GetHasCondition($aAgentArray[$i]) Then $ConditionedAlly = $aAgentArray[$i] - If $aAgentArray[$i] <> $MyPtr Then ; Other Allies - $mTeamOthers[0] += 1 - ReDim $mTeamOthers[$mTeamOthers[0] + 1] - $mTeamOthers[$mTeamOthers[0]] = $aAgentArray[$i] - If $lHP < $mLowestOtherAllyHP Then ; Lowest Other Ally - $mLowestOtherAlly = $aAgentArray[$i] - $mLowestOtherAllyHP = $lHP - ElseIf $lHP = $mLowestOtherAllyHP Then - If $lDistance < ($lX - MemoryRead($mLowestOtherAlly + 116, 'float')) ^ 2 + ($lY - MemoryRead($mLowestOtherAlly + 120, 'float')) ^ 2 Then - $mLowestOtherAlly = $aAgentArray[$i] - $mLowestOtherAllyHP = $lHP - EndIf - EndIf - EndIf - Else ; Dead Allies - $mTeamDead[0] += 1 - ReDim $mTeamDead[$mTeamDead[0] + 1] - $mTeamDead[$mTeamDead[0]] = $aAgentArray[$i] - EndIf - Case 3 ;Enemies - If BitAND($lAgentEffects, 0x0010) Then ContinueLoop ; Living Enemies only - If Blacklisted(MemoryRead($aAgentArray[$i] + 244, 'word')) Then ContinueLoop ; ignore blacklisted enemies - If $lDistance <= $aRange Then ; Enemies in waypoint range - $NumberOfFoesInAttackRange += 1 - If $lHP < $mLowestEnemyHP Then ; Lowest Enemy - $mLowestEnemy = $aAgentArray[$i] - $mLowestEnemyHP = $lHP - ElseIf $lHP = $mLowestEnemyHP Then - If $lDistance < ($lX - MemoryRead($mLowestEnemy + 116, 'float')) ^ 2 + ($lY - MemoryRead($mLowestEnemy + 120, 'float')) ^ 2 Then - $mLowestEnemy = $aAgentArray[$i] - $mLowestEnemyHP = $lHP - EndIf - EndIf - If GetNumberOfFoesInRangeOfAgent_($aAgentArray, $aAgentArray[$i], 256) > $lCountAOE Then - $BestAOETarget = $aAgentArray[$i] - $lCountAOE += 1 - EndIf - If GetIsBoss($aAgentArray[$i]) Then - $BestAOETarget = $aAgentArray[$i] - $lCountAOE += 5 - EndIf - If GetHasHex($aAgentArray[$i]) Then - $EnemyHexed = $aAgentArray[$i] - Else - $EnemyNonHexed = $aAgentArray[$i] - EndIf - If GetHasCondition($aAgentArray[$i]) Then - $EnemyConditioned = $aAgentArray[$i] - Else - $EnemyNonConditioned = $aAgentArray[$i] - EndIf - If GetIsHealer($aAgentArray[$i]) Then $EnemyHealer = $aAgentArray[$i] - If GetIsEnchanted($aAgentArray[$i]) Then - $EnemyNonEnchanted = $aAgentArray[$i] - Else - $EnemyEnchanted = $aAgentArray[$i] - EndIf - EndIf - If $lDistance <= 1440000 Then ; Enemies in spell range - 1200 - $NumberOfFoesInSpellRange += 1 - If MemoryRead($aAgentArray[$i] + 304, 'float') * MemoryRead($aAgentArray[$i] + 308, 'long') < 0.5 Then - $LowHPEnemy = $aAgentArray[$i] - EndIf - EndIf - If $lDistance < $mClosestEnemyDist Then - $mClosestEnemyDist = $lDistance - $mClosestEnemy = $aAgentArray[$i] - EndIf - Case 4 ; Allied Pets/Spirits - If BitAND($lAgentEffects, 0x0010) Then ContinueLoop - $mSpirits[0] += 1 - ReDim $mSpirits[$mSpirits[0] + 1] - $mSpirits[$mSpirits[0]] = $aAgentArray[$i] - Case 5 ; Allied Minions - If BitAND($lAgentEffects, 0x0010) Then ContinueLoop - $mMinions[0] += 1 - ReDim $mMinions[$mMinions[0] + 1] - $mMinions[$mMinions[0]] = $aAgentArray[$i] - EndSwitch - Next - $mClosestEnemyDist = Sqrt($mClosestEnemyDist) - $mAverageTeamHP /= $mTeamOthers[0] + 1 - If $NumberOfFoesInSpellRange <= 0 Then - $EnemyAttacker = 0 - Else - $EnemyAttacker = $NumberOfFoesInSpellRange - EndIf -EndFunc ;==>UpdateWorld - -;~ Description: Blacklist for UpdateWorld(), internal use. -Func Blacklisted($aPlayernumber) - Switch $aPlayernumber - Case 4116 ; Shiro Tagachi - Return True - Case 1383 ; elder wolf - Return True - Case 2226 to 2228 ; bone minions - Return True - Case 2870 to 2878 ; spirits - Return True - Case 2881 to 2884 ; spirits - Return True - Case 3962, 3963, 4205, 4206 ; corrupted scale, corrupted spore, flesh golem, vampiric horror - Return True - Case 4209 to 4228 ; spirits - Return True - Case 4230 to 4235 ; spirits - Return True - Case 5709, 5710 ; shambling horror, jagged horror - Return True - Case 5711 to 5719 ; spirits - Return True - Case 5848 to 5850 ; EVA, spirits - Return True - Case Else - Return False - EndSwitch -EndFunc ;==>Blacklisted - -;~ Description: Checks number of enemies in range, can check specific Enemies with ModelID, modified to re-use agentarray. -Func GetNumberOfFoesInRangeOfAgent_(ByRef $aAgentArray, $aAgent = GetAgentPtr(-2), $aMaxDistance = 4000, $ModelID = 0) - If IsPtr($aAgent) <> 0 Then - Local $lAgentPtr = $aAgent - ElseIf IsDllStruct($aAgent) <> 0 Then - Local $lAgentID = DllStructGetData($aAgent, 'ID') - Local $lAgentPtr = GetAgentPtr($lAgentID) - Else - Local $lAgentID = $aAgent - Local $lAgentPtr = GetAgentPtr($lAgentID) - EndIf - Local $lDistance, $lCount = 0 - For $i = 1 To $aAgentArray[0] - If $ModelID <> 0 And MemoryRead($aAgentArray[$i] + 244, 'word') <> $ModelID Then ContinueLoop - $lDistance = GetDistance($aAgentArray[$i], $lAgentPtr) - If $lDistance < $aMaxDistance Then - $lCount += 1 - EndIf - Next - Return $lCount -EndFunc ;==>GetNumberOfFoesInRangeOfAgent_ \ No newline at end of file + +#include-once + +;~ Description: Updates all the information you need for combat. +;~ Required functions: GetMyID, GetAgentPtr, GetIsDead, GetMapLoading, MemoryReadStruct, MemoryRead, +;~ UpdateAgentPosPtr, MemoryReadAgentPtrStruct, GetHasHex, GetHasCondition, GetNumberOfFoesInRangeOfAgent_, +;~ GetIsBoss, GetIsHealer, GetIsEnchanted +Func UpdateWorld(ByRef $aAgentArray, $aRange = 1350, $aMyID = GetMyID(), $aMe = GetAgentPtr($aMyID)) + Local $lX, $lY, $lHP, $lDistance, $lCountAOE = 1, $TeamCount = 1 + $aRange = $aRange ^ 2 + If $MyID = 0 Then $MyID = $aMyID + If $MyPtr = 0 Then $MyPtr = $aMe + If GetIsDead($MyPtr) Then Return False + If GetMapLoading() <> 1 Then Return True ; not explorable + Local $lEnergyStruct = MemoryReadStruct($MyPtr + 284,'float EnergyPercent;long MaxEnergy') + $mEnergy = DllStructGetData($lEnergyStruct, 'EnergyPercent') * DllStructGetData($lEnergyStruct, 'MaxEnergy') + $mEffects = GetEffectsPtr() + $mDazed = False + $mBlind = False + $mSkillHardCounter = False + $mSkillSoftCounter = 0 + $mAttackHardCounter = False + $mAttackSoftCounter = 0 + $mAllySpellHardCounter = False + $mEnemySpellHardCounter = False + $mSpellSoftCounter = 0 + $mBlocking = False + If IsArray($mEffects) <> 0 Then + For $i = 1 To $mEffects[0] + Switch MemoryRead($mEffects[$i], 'long') ; SkillID + Case 485 ; Dazed + $mDazed = True + Case 479 ; Blind + $mBlind = True + Case 30, 764 ; Diversion, Wail of Doom + $mSkillHardCounter = True + Case 51, 127 ; Shame, Mark of Subversion + $mAllySpellHardCounter = True + Case 46, 979, 3191 ; Guilt, Mistrust + $mEnemySpellHardCounter = True + Case 878, 3234 ; Visions of Regret + $mSkillSoftCounter += 1 + $mSpellSoftCounter += 1 + $mAttackSoftCounter += 1 + Case 28, 128 ; Backfire, Soul Leech + $mSpellSoftCounter += 1 + Case 47, 43, 1004, 2056, 3195 ; Ineptitude, Clumsiness, Yuletide, Wandering Eye + $mAttackHardCounter = True + Case 123, 26, 3151, 121, 103, 66 ; Insidious Parasite, Empathy, Spiteful Spirit, Price of Failure, Spirit Shackles + $mAttackSoftCounter += 1 + ; Auspicious Parry, Bonetti's Defense, Deadly Riposte, Defensive Stance, Deflect Arrows, + ; Disciplined Stance, Frenzied Defense, Gladiator's Defense, Riposte, Shield Bash, Shield Stance, + ; Soldier's Stance, Wary Stance, Dodge, Dryder's Defenses, Escape, Lightning Reflexes + Case 905,380,388,345,373,376,1700,372,387,363,378,1698,377,425,452,448,453 + $mBlocking = True + ; Critical Defenses, Flashing Blades, Weapon of Warding, Burning Shield, Attacker's Insight, + ; Shield of Force, Mental Block, Protector's Defense, Ward Against Melee, Mirage Cloak, Natural Stride + ; Whirling Defense, Zojun's Haste, Distortion, Magnetic Aura, Sliver Armor, Swirling Aura, + Case 1027,1042,793,2208,1764,2201,2417,810,176,1500,1727,450,1196,11,168,1084,233 + $mBlocking = True + EndSwitch + Next + EndIf + Local $lTeamSize = GetPartySize() + If $mTeam[0] <> $lTeamSize Then + $mTeam[0] = $lTeamSize + ReDim $mTeam[$lTeamSize + 1] + EndIf + Dim $mTeamOthers[1] = [0] + Dim $mTeamDead[1] = [0] + Dim $mSpirits[1] = [0] + Dim $mMinions[1] = [0] + $mHighestAlly = $MyPtr + $mHighestAllyHP = 2 + $mLowestAlly = $MyPtr + $mLowestAllyHP = 2 + $mLowestOtherAlly = 0 + $mLowestOtherAllyHP = 2 + $mLowestEnemy = 0 + $mLowestEnemyHP = 2 + $mClosestEnemyDist = $aRange + $mAverageTeamHP = 0 + $BestAOETarget = 0 + $HexedAlly = 0 + $ConditionedAlly = 0 + $EnemyHexed = 0 + $EnemyNonHexed = 0 + $EnemyConditioned = 0 + $EnemyNonConditioned = 0 + $EnemyNonEnchanted = 0 + $EnemyEnchanted = 0 + $EnemyHealer = 0 + $LowHPEnemy = 0 + $NumberOfFoesInAttackRange = 0 + $NumberOfFoesInSpellRange = 0 + UpdateAgentPosByPtr($MyPtr, $lX, $lY) + Local $lAgentEffects, $lAgentX, $lAgentY, $lAllegiance + For $i = 1 To $aAgentArray[0] + UpdateAgentPosByPtr($aAgentArray[$i], $lAgentX, $lAgentY) + $lHP = MemoryRead($aAgentArray[$i] + 304, 'float') ; HP + $lAgentEffects = MemoryRead($aAgentArray[$i] + 312, 'long') ; Effects + $lDistance = ($lX - $lAgentX) ^ 2 + ($lY - $lAgentY) ^ 2 + $lAllegiance = MemoryRead($aAgentArray[$i] + 433, 'byte') + Switch $lAllegiance ; Allegiance + Case 1, 6 ;Allies + If $lAllegiance = 1 Then + $mTeam[$TeamCount] = $aAgentArray[$i] + $TeamCount += 1 + EndIf + If IsSummonedCreature($aAgentArray[$i]) Then ContinueLoop ; necessary? + If Not BitAND($lAgentEffects, 0x0010) Then ; alive + $mAverageTeamHP += $lHP + If $lHP < $mLowestAllyHP Then ; Lowest Ally + $mLowestAlly = $aAgentArray[$i] + $mLowestAllyHP = $lHP + ElseIf $lHP = $mLowestAllyHP Then + If $lDistance < ($lX - MemoryRead($mLowestAlly + 116, 'float')) ^ 2 + ($lY - MemoryRead($mLowestAlly + 120, 'float')) ^ 2 Then + $mLowestAlly = $aAgentArray[$i] + $mLowestAllyHP = $lHP + EndIf + ElseIf $lHP > $mHighestAllyHP Then ; Highest Ally + $mHighestAlly = $aAgentArray[$i] + $mHighestAllyHP = $lHP + EndIf + If GetHasHex($aAgentArray[$i]) Then $HexedAlly = $aAgentArray[$i] + If GetHasCondition($aAgentArray[$i]) Then $ConditionedAlly = $aAgentArray[$i] + If $aAgentArray[$i] <> $MyPtr Then ; Other Allies + $mTeamOthers[0] += 1 + ReDim $mTeamOthers[$mTeamOthers[0] + 1] + $mTeamOthers[$mTeamOthers[0]] = $aAgentArray[$i] + If $lHP < $mLowestOtherAllyHP Then ; Lowest Other Ally + $mLowestOtherAlly = $aAgentArray[$i] + $mLowestOtherAllyHP = $lHP + ElseIf $lHP = $mLowestOtherAllyHP Then + If $lDistance < ($lX - MemoryRead($mLowestOtherAlly + 116, 'float')) ^ 2 + ($lY - MemoryRead($mLowestOtherAlly + 120, 'float')) ^ 2 Then + $mLowestOtherAlly = $aAgentArray[$i] + $mLowestOtherAllyHP = $lHP + EndIf + EndIf + EndIf + Else ; Dead Allies + $mTeamDead[0] += 1 + ReDim $mTeamDead[$mTeamDead[0] + 1] + $mTeamDead[$mTeamDead[0]] = $aAgentArray[$i] + EndIf + Case 3 ;Enemies + If BitAND($lAgentEffects, 0x0010) Then ContinueLoop ; Living Enemies only + If Blacklisted(MemoryRead($aAgentArray[$i] + 244, 'word')) Then ContinueLoop ; ignore blacklisted enemies + If $lDistance <= $aRange Then ; Enemies in waypoint range + $NumberOfFoesInAttackRange += 1 + If $lHP < $mLowestEnemyHP Then ; Lowest Enemy + $mLowestEnemy = $aAgentArray[$i] + $mLowestEnemyHP = $lHP + ElseIf $lHP = $mLowestEnemyHP Then + If $lDistance < ($lX - MemoryRead($mLowestEnemy + 116, 'float')) ^ 2 + ($lY - MemoryRead($mLowestEnemy + 120, 'float')) ^ 2 Then + $mLowestEnemy = $aAgentArray[$i] + $mLowestEnemyHP = $lHP + EndIf + EndIf + If GetNumberOfFoesInRangeOfAgent_($aAgentArray, $aAgentArray[$i], 256) > $lCountAOE Then + $BestAOETarget = $aAgentArray[$i] + $lCountAOE += 1 + EndIf + If GetIsBoss($aAgentArray[$i]) Then + $BestAOETarget = $aAgentArray[$i] + $lCountAOE += 5 + EndIf + If GetHasHex($aAgentArray[$i]) Then + $EnemyHexed = $aAgentArray[$i] + Else + $EnemyNonHexed = $aAgentArray[$i] + EndIf + If GetHasCondition($aAgentArray[$i]) Then + $EnemyConditioned = $aAgentArray[$i] + Else + $EnemyNonConditioned = $aAgentArray[$i] + EndIf + If GetIsHealer($aAgentArray[$i]) Then $EnemyHealer = $aAgentArray[$i] + If GetIsEnchanted($aAgentArray[$i]) Then + $EnemyNonEnchanted = $aAgentArray[$i] + Else + $EnemyEnchanted = $aAgentArray[$i] + EndIf + EndIf + If $lDistance <= 1440000 Then ; Enemies in spell range - 1200 + $NumberOfFoesInSpellRange += 1 + If MemoryRead($aAgentArray[$i] + 304, 'float') * MemoryRead($aAgentArray[$i] + 308, 'long') < 0.5 Then + $LowHPEnemy = $aAgentArray[$i] + EndIf + EndIf + If $lDistance < $mClosestEnemyDist Then + $mClosestEnemyDist = $lDistance + $mClosestEnemy = $aAgentArray[$i] + EndIf + Case 4 ; Allied Pets/Spirits + If BitAND($lAgentEffects, 0x0010) Then ContinueLoop + $mSpirits[0] += 1 + ReDim $mSpirits[$mSpirits[0] + 1] + $mSpirits[$mSpirits[0]] = $aAgentArray[$i] + Case 5 ; Allied Minions + If BitAND($lAgentEffects, 0x0010) Then ContinueLoop + $mMinions[0] += 1 + ReDim $mMinions[$mMinions[0] + 1] + $mMinions[$mMinions[0]] = $aAgentArray[$i] + EndSwitch + Next + $mClosestEnemyDist = Sqrt($mClosestEnemyDist) + $mAverageTeamHP /= $mTeamOthers[0] + 1 + If $NumberOfFoesInSpellRange <= 0 Then + $EnemyAttacker = 0 + Else + $EnemyAttacker = $NumberOfFoesInSpellRange + EndIf +EndFunc ;==>UpdateWorld + +;~ Description: Blacklist for UpdateWorld(), internal use. +Func Blacklisted($aPlayernumber) + Switch $aPlayernumber + Case 4116 ; Shiro Tagachi + Return True + Case 1383 ; elder wolf + Return True + Case 2226 to 2228 ; bone minions + Return True + Case 2870 to 2878 ; spirits + Return True + Case 2881 to 2884 ; spirits + Return True + Case 3962, 3963, 4205, 4206 ; corrupted scale, corrupted spore, flesh golem, vampiric horror + Return True + Case 4209 to 4228 ; spirits + Return True + Case 4230 to 4235 ; spirits + Return True + Case 5709, 5710 ; shambling horror, jagged horror + Return True + Case 5711 to 5719 ; spirits + Return True + Case 5848 to 5850 ; EVA, spirits + Return True + Case Else + Return False + EndSwitch +EndFunc ;==>Blacklisted + +;~ Description: Checks number of enemies in range, can check specific Enemies with ModelID, modified to re-use agentarray. +Func GetNumberOfFoesInRangeOfAgent_(ByRef $aAgentArray, $aAgent = GetAgentPtr(-2), $aMaxDistance = 4000, $ModelID = 0) + If IsPtr($aAgent) <> 0 Then + Local $lAgentPtr = $aAgent + ElseIf IsDllStruct($aAgent) <> 0 Then + Local $lAgentID = DllStructGetData($aAgent, 'ID') + Local $lAgentPtr = GetAgentPtr($lAgentID) + Else + Local $lAgentID = $aAgent + Local $lAgentPtr = GetAgentPtr($lAgentID) + EndIf + Local $lDistance, $lCount = 0 + For $i = 1 To $aAgentArray[0] + If $ModelID <> 0 And MemoryRead($aAgentArray[$i] + 244, 'word') <> $ModelID Then ContinueLoop + $lDistance = GetDistance($aAgentArray[$i], $lAgentPtr) + If $lDistance < $aMaxDistance Then + $lCount += 1 + EndIf + Next + Return $lCount +EndFunc ;==>GetNumberOfFoesInRangeOfAgent_ diff --git a/gwApi/agents.au3 b/gwApi/agents.au3 index f569d0c..98b9039 100644 --- a/gwApi/agents.au3 +++ b/gwApi/agents.au3 @@ -1,1353 +1,1354 @@ -#include-once - -#Region Ptr -;~ Description: Returns Agent ptr by AgentID. -Func GetAgentPtr($aAgentID = GetMyID()) - Return MemoryRead(MemoryRead($mAgentBase, 'ptr') + 4 * ConvertID($aAgentID), 'ptr') -EndFunc ;==>GetAgentPtr - -;~ Description: Returns agentptr by playernumber. -Func GetPlayerPtrByPlayerNumber($aPlayerNumber) - Local $lAgentArray = GetAgentPtrArray(1) - For $i = 1 to $lAgentArray[0] - If MemoryRead($lAgentArray[$i] + 244, 'word') = $aPlayerNumber Then Return $lAgentArray[$i] - Next -EndFunc ;==>GetPlayerPtrByPlayerNumber - -#Region AgentPtrArray -;~ Description: Pulls only ptrs instead of whole struct from memory, doesnt use ASM. -;~ Author: Tecka. -Func GetAgentPtrArray($aMode = 0, $aType = 0xDB, $aAllegiance = 3, $aDead = False) - If $aMode = Default Then $aMode = 0 - If $aType = Default Then $aType = 0xDB - If $aAllegiance = Default Then $aAllegiance = 3 - If $aDead = Default Then $aDead = False - Local $lMaxAgents = MemoryRead($mMaxAgents) - Local $lAgentPtrStruct = DllStructCreate("ptr[" & $lMaxAgents & "]") - DllCall($mKernelHandle, "bool", "ReadProcessMemory", "handle", $mGWProcHandle, "ptr", MemoryRead($mAgentBase), "struct*", $lAgentPtrStruct, "ulong_ptr", $lMaxAgents * 4, "ulong_ptr*", 0) - Local $lTemp - Local $lAgentArray[$lMaxAgents + 1] - $lAgentArray[0] = 0 - Switch $aMode - Case 0 - For $i = 1 To $lMaxAgents - $lTemp = DllStructGetData($lAgentPtrStruct, 1, $i) - If $lTemp = 0 Then ContinueLoop - $lAgentArray[0] += 1 - $lAgentArray[$lAgentArray[0]] = $lTemp - Next - Case 1 - For $i = 1 To $lMaxAgents - $lTemp = DllStructGetData($lAgentPtrStruct, 1, $i) - If $lTemp = 0 Then ContinueLoop - If MemoryRead($lTemp + 156, 'long') <> $aType Then ContinueLoop - $lAgentArray[0] += 1 - $lAgentArray[$lAgentArray[0]] = $lTemp - Next - Case 2 - For $i = 1 To $lMaxAgents - $lTemp = DllStructGetData($lAgentPtrStruct, 1, $i) - If $lTemp = 0 Then ContinueLoop - If MemoryRead($lTemp + 156, 'long') <> $aType Then ContinueLoop - If MemoryRead($lTemp + 433, 'byte') <> $aAllegiance Then ContinueLoop - $lAgentArray[0] += 1 - $lAgentArray[$lAgentArray[0]] = $lTemp - Next - Case 3 - For $i = 1 To $lMaxAgents - $lTemp = DllStructGetData($lAgentPtrStruct, 1, $i) - If $lTemp = 0 Then ContinueLoop - If MemoryRead($lTemp + 156, 'long') <> $aType Then ContinueLoop - If MemoryRead($lTemp + 433, 'byte') <> $aAllegiance Then ContinueLoop - If MemoryRead($lTemp + 304, 'float') <= 0 Then ContinueLoop - $lAgentArray[0] += 1 - $lAgentArray[$lAgentArray[0]] = $lTemp - Next - EndSwitch - ReDim $lAgentArray[$lAgentArray[0] + 1] - Return $lAgentArray -EndFunc ;==>GetAgentPtrArray -#EndRegion AgentPtrArray - -#Region Nearest/FarthestToAgent -;~ Description: Returns the nearest agent to an agent. -Func GetNearestAgentPtrToAgent($aAgent = -1) - Local $lAgentX, $lAgentY, $lArrayX, $lArrayY - If IsPtr($aAgent) <> 0 Then - Local $lPtr = $aAgent - UpdateAgentPosByPtr($aAgent, $lAgentX, $lAgentY) - ElseIf IsDllStruct($aAgent) <> 0 Then - Local $lPtr = GetAgentPtr(DllStructGetData($aAgent, 'ID')) - $lAgentX = DllStructGetData($aAgent, 'X') - $lAgentY = DllStructGetData($aAgent, 'Y') - Else - Local $lPtr = GetAgentPtr($aAgent) - UpdateAgentPosByPtr($lPtr, $lAgentX, $lAgentY) - EndIf - Local $lNearestAgent, $lDistance, $lNearestDistance = 25000000 - Local $lAgentArray = GetAgentPtrArray() - For $i = 1 To $lAgentArray[0] - If $lAgentArray[$i] = $lPtr Then ContinueLoop - UpdateAgentPosByPtr($lAgentArray[$i], $lArrayX, $lArrayY) - $lDistance = ($lAgentX - $lArrayX) ^2 + ($lAgentY - $lArrayY) ^2 - If $lDistance < $lNearestDistance Then - $lNearestAgent = $lAgentArray[$i] - $lNearestDistance = $lDistance - EndIf - Next - Return SetExtended(Sqrt($lNearestDistance), $lNearestAgent) -EndFunc ;==>GetNearestAgentPtrToAgent - -;~ Description: Returns the nearest NPC to an agent. -Func GetNearestNPCPtrToAgent($aAgent = -2) - Local $lAgentX, $lAgentY, $lArrayX, $lArrayY - If IsPtr($aAgent) <> 0 Then - Local $lPtr = $aAgent - UpdateAgentPosByPtr($aAgent, $lAgentX, $lAgentY) - ElseIf IsDllStruct($aAgent) <> 0 Then - Local $lPtr = GetAgentPtr(DllStructGetData($aAgent, 'ID')) - $lAgentX = DllStructGetData($aAgent, 'X') - $lAgentY = DllStructGetData($aAgent, 'Y') - Else - Local $lPtr = GetAgentPtr($aAgent) - UpdateAgentPosByPtr($lPtr, $lAgentX, $lAgentY) - EndIf - Local $lNearestAgent, $lDistance, $lNearestDistance = 100000000 - Local $lAgentArray = GetAgentPtrArray(3, 0xDB, 6) - For $i = 1 To $lAgentArray[0] - If $lAgentArray[$i] = $lPtr Then ContinueLoop - UpdateAgentPosByPtr($lAgentArray[$i], $lArrayX, $lArrayY) - $lDistance = ($lAgentX - $lArrayX) ^2 + ($lAgentY - $lArrayY) ^2 - If $lDistance < $lNearestDistance Then - $lNearestAgent = $lAgentArray[$i] - $lNearestDistance = $lDistance - EndIf - Next - Return SetExtended(Sqrt($lNearestDistance), $lNearestAgent) -EndFunc ;==>GetNearestNPCPtrToAgent - -;~ Description: Returns the nearest enemy to an agent. -Func GetNearestEnemyPtrToAgent($aAgent = -2) - Local $lAgentX, $lAgentY, $lArrayX, $lArrayY - If IsPtr($aAgent) <> 0 Then - Local $lPtr = $aAgent - UpdateAgentPosByPtr($aAgent, $lAgentX, $lAgentY) - ElseIf IsDllStruct($aAgent) <> 0 Then - Local $lPtr = GetAgentPtr(DllStructGetData($aAgent, 'ID')) - $lAgentX = DllStructGetData($aAgent, 'X') - $lAgentY = DllStructGetData($aAgent, 'Y') - Else - Local $lPtr = GetAgentPtr($aAgent) - UpdateAgentPosByPtr($lPtr, $lAgentX, $lAgentY) - EndIf - Local $lNearestAgent, $lDistance, $lNearestDistance = 25000000 - Local $lAgentArray = GetAgentPtrArray(3) - For $i = 1 To $lAgentArray[0] - If $lAgentArray[$i] = $lPtr Then ContinueLoop - UpdateAgentPosByPtr($lAgentArray[$i], $lArrayX, $lArrayY) - $lDistance = ($lAgentX - $lArrayX) ^2 + ($lAgentY - $lArrayY) ^2 - If $lDistance < $lNearestDistance Then - $lNearestAgent = $lAgentArray[$i] - $lNearestDistance = $lDistance - EndIf - Next - Return SetExtended(Sqrt($lNearestDistance), $lNearestAgent) -EndFunc ;==>GetNearestEnemyPtrToAgent - -;~ Description: Returns the enemy farthest away from an agent within given max distance. -Func GetFarthestEnemyPtrToAgent($aMaxDistance = 1400, $aAgent = -2) - Local $lAgentX, $lAgentY, $lArrayX, $lArrayY - If IsPtr($aAgent) <> 0 Then - Local $lPtr = $aAgent - UpdateAgentPosByPtr($aAgent, $lAgentX, $lAgentY) - ElseIf IsDllStruct($aAgent) <> 0 Then - Local $lPtr = GetAgentPtr(DllStructGetData($aAgent, 'ID')) - $lAgentX = DllStructGetData($aAgent, 'X') - $lAgentY = DllStructGetData($aAgent, 'Y') - Else - Local $lPtr = GetAgentPtr($aAgent) - UpdateAgentPosByPtr($lPtr, $lAgentX, $lAgentY) - EndIf - Local $lFarthestAgent, $lDistance, $lFarthestDistance = 1 - Local $lMaxDistance = $aMaxDistance ^2 - Local $lAgentArray = GetAgentPtrArray(3) - For $i = 1 To $lAgentArray[0] - If $lAgentArray[$i] = $lPtr Then ContinueLoop - UpdateAgentPosByPtr($lAgentArray[$i], $lArrayX, $lArrayY) - $lDistance = ($lAgentX - $lArrayX) ^2 + ($lAgentY - $lArrayY) ^2 - If $lDistance > $lFarthestDistance And $lDistance < $lMaxDistance Then - $lFarthestAgent = $lAgentArray[$i] - $lFarthestDistance = $lDistance - EndIf - Next - Return SetExtended(Sqrt($lFarthestDistance), $lFarthestAgent) -EndFunc ;==>GetFarthestEnemyPtrToAgent - -;~ Description: Returns the nearest signpost to an agent. -Func GetNearestSignpostPtrToAgent($aAgent = -2) - Local $lAgentX, $lAgentY, $lArrayX, $lArrayY - If IsPtr($aAgent) <> 0 Then - Local $lPtr = $aAgent - UpdateAgentPosByPtr($aAgent, $lAgentX, $lAgentY) - ElseIf IsDllStruct($aAgent) <> 0 Then - Local $lPtr = GetAgentPtr(DllStructGetData($aAgent, 'ID')) - $lAgentX = DllStructGetData($aAgent, 'X') - $lAgentY = DllStructGetData($aAgent, 'Y') - Else - Local $lPtr = GetAgentPtr($aAgent) - UpdateAgentPosByPtr($lPtr, $lAgentX, $lAgentY) - EndIf - Local $lNearestAgent, $lDistance, $lNearestDistance = 100000000 - Local $lAgentArray = GetAgentPtrArray(1, 0x200) - For $i = 1 To $lAgentArray[0] - If $lAgentArray[$i] = $lPtr Then ContinueLoop - UpdateAgentPosByPtr($lAgentArray[$i], $lArrayX, $lArrayY) - $lDistance = ($lAgentX - $lArrayX) ^2 + ($lAgentY - $lArrayY) ^2 - If $lDistance < $lNearestDistance Then - $lNearestAgent = $lAgentArray[$i] - $lNearestDistance = $lDistance - EndIf - Next - Return SetExtended(Sqrt($lNearestDistance), $lNearestAgent) -EndFunc ;==>GetNearestSignpostPtrToAgent - -;~ Description: Returns the nearest item to an agent. -Func GetNearestItemPtrToAgent($aAgent = -2, $aCanPickUp = True) - Local $lAgentX, $lAgentY, $lArrayX, $lArrayY - If IsPtr($aAgent) <> 0 Then - Local $lPtr = $aAgent - UpdateAgentPosByPtr($aAgent, $lAgentX, $lAgentY) - ElseIf IsDllStruct($aAgent) <> 0 Then - Local $lPtr = GetAgentPtr(DllStructGetData($aAgent, 'ID')) - $lAgentX = DllStructGetData($aAgent, 'X') - $lAgentY = DllStructGetData($aAgent, 'Y') - Else - Local $lPtr = GetAgentPtr($aAgent) - UpdateAgentPosByPtr($lPtr, $lAgentX, $lAgentY) - EndIf - Local $lNearestAgent, $lDistance, $lNearestDistance = 100000000 - Local $lAgentArray = GetAgentPtrArray(1, 0x400) - For $i = 1 To $lAgentArray[0] - If $aCanPickUp And Not GetAssignedToMe($lAgentArray[$i]) Then ContinueLoop - If $lAgentArray[$i] = $lPtr Then ContinueLoop - UpdateAgentPosByPtr($lAgentArray[$i], $lArrayX, $lArrayY) - $lDistance = ($lAgentX - $lArrayX) ^2 + ($lAgentY - $lArrayY) ^2 - If $lDistance < $lNearestDistance Then - $lNearestAgent = $lAgentArray[$i] - $lNearestDistance = $lDistance - EndIf - Next - Return SetExtended(Sqrt($lNearestDistance), $lNearestAgent) -EndFunc ;==>GetNearestItemPtrToAgent -#EndRegion Nearest/FarthestToAgent - -#Region Near(est)ToCoords -;~ Description: Returns the nearest agent to a set of coordinates. -Func GetNearestAgentPtrToCoords($aX, $aY) - Local $lNearestAgent, $lNearestDistance = 100000000 - Local $lDistance, $lArrayX, $lArrayY - Local $lAgentArray = GetAgentPtrArray() - For $i = 1 To $lAgentArray[0] - UpdateAgentPosByPtr($lAgentArray[$i], $lArrayX, $lArrayY) - $lDistance = ($aX - $lArrayX) ^2 + ($aY - $lArrayY) ^2 - If $lDistance < $lNearestDistance Then - $lNearestAgent = $lAgentArray[$i] - $lNearestDistance = $lDistance - EndIf - Next - Return SetExtended(Sqrt($lNearestDistance), $lNearestAgent) -EndFunc ;==>GetNearestAgentPtrToCoords - -;~ Description: Returns the nearest NPC to a set of coordinates. -Func GetNearestNPCPtrToCoords($aX, $aY) - Local $lNearestAgent, $lNearestDistance = 100000000 - Local $lDistance, $lArrayX, $lArrayY - Local $lAgentArray = GetAgentPtrArray(3, 0xDB, 6) - For $i = 1 To $lAgentArray[0] - UpdateAgentPosByPtr($lAgentArray[$i], $lArrayX, $lArrayY) - $lDistance = ($aX - $lArrayX) ^2 + ($aY - $lArrayY) ^2 - If $lDistance < $lNearestDistance Then - $lNearestAgent = $lAgentArray[$i] - $lNearestDistance = $lDistance - EndIf - Next - Return SetExtended(Sqrt($lNearestDistance), $lNearestAgent) -EndFunc ;==>GetNearestNPCPtrToCoords - -;~ Description: Returns the nearest NPC to a set of coordinates. -Func GetNearestEnemyPtrToCoords($aX, $aY) - Local $lNearestAgent, $lNearestDistance = 100000000 - Local $lDistance, $lArrayX, $lArrayY - Local $lAgentArray = GetAgentPtrArray(3, 0xDB, 3) - For $i = 1 To $lAgentArray[0] - UpdateAgentPosByPtr($lAgentArray[$i], $lArrayX, $lArrayY) - $lDistance = ($aX - $lArrayX) ^2 + ($aY - $lArrayY) ^2 - If $lDistance < $lNearestDistance Then - $lNearestAgent = $lAgentArray[$i] - $lNearestDistance = $lDistance - EndIf - Next - Return SetExtended(Sqrt($lNearestDistance), $lNearestAgent) -EndFunc ;==>GetNearestEnemyPtrToCoords - -;~ Description: Returns a ptr to an enemy agent in range of coordinates. If there is no agent in range, returns 0. -Func GetEnemyPtrNearCoords($aX, $aY, $aRange = 1000) - $aRange = $aRange ^2 - Local $lDistance, $lArrayX, $lArrayY - Local $lAgentArray = GetAgentPtrArray(3, 0xDB, 3) - For $i = 1 To $lAgentArray[0] - UpdateAgentPosByPtr($lAgentArray[$i], $lArrayX, $lArrayY) - $lDistance = ($aX - $lArrayX) ^2 + ($aY - $lArrayY) ^2 - If $lDistance < $aRange Then - Return SetExtended(Sqrt($lDistance), $lAgentArray[$i]) - EndIf - Next -EndFunc ;==>GetEnemyPtrNearCoords - -;~ Description: Returns the nearest signpost to a set of coordinates. -Func GetNearestSignpostPtrToCoords($aX, $aY) - Local $lNearestAgent = 0 - Local $lNearestDistance = 100000000 - Local $lDistance, $lArrayX, $lArrayY - Local $lAgentArray = GetAgentPtrArray(1, 0x200) - For $i = 1 To $lAgentArray[0] - UpdateAgentPosByPtr($lAgentArray[$i], $lArrayX, $lArrayY) - $lDistance = ($aX - $lArrayX) ^2 + ($aY - $lArrayY) ^2 - If $lDistance < $lNearestDistance Then - $lNearestAgent = $lAgentArray[$i] - $lNearestDistance = $lDistance - EndIf - Next - Return SetExtended(Sqrt($lNearestDistance), $lNearestAgent) -EndFunc ;==>GetNearestSignpostPtrToCoords - -;~ Description: Returns nearest item to coordinates. -Func GetNearestItemPtrToCoords($aX, $aY) - Local $lNearestAgent, $lNearestDistance = 100000000 - Local $lDistance, $lArrayX, $lArrayY - Local $lAgentArray = GetAgentPtrArray(1, 0x400) - For $i = 1 To $lAgentArray[0] - UpdateAgentPosByPtr($lAgentArray[$i], $lArrayX, $lArrayY) - $lDistance = ($aX - $lArrayX) ^2 + ($aY - $lArrayY) ^2 - If $lDistance < $lNearestDistance Then - $lNearestAgent = $lAgentArray[$i] - $lNearestDistance = $lDistance - EndIf - Next - Return SetExtended(Sqrt($lNearestDistance), $lNearestAgent) -EndFunc -#EndRegion Near(est)ToCoords -#EndRegion Ptr - -#Region Interaction -;~ Description: Attack an agent. -Func Attack($aAgent, $aCallTarget = False) - If IsPtr($aAgent) <> 0 Then - Local $lAgentID = MemoryRead($aAgent + 44, 'long') - ElseIf IsDllStruct($aAgent) <> 0 Then - Local $lAgentID = DllStructGetData($aAgent, 'ID') - Else - Local $lAgentID = ConvertID($aAgent) - EndIf - Return SendPacket(0xC, 0x20, $lAgentID, $aCallTarget) -EndFunc ;==>Attack - -;~ Description: Use switch/boss lock/etc, waits till in range. -Func UseSignpost($aX, $aY, $aMe = GetAgentPtr(-2)) - Return GoToSignpost(GetNearestSignpostPtrToCoords($aX, $aY), $aMe) -EndFunc ;==>UseSignpost - -;~ Description: Turn character to the left. -Func TurnLeft($aTurn) - If $aTurn Then - Return PerformAction(0xA2, 0x18) - Else - Return PerformAction(0xA2, 0x1A) - EndIf -EndFunc ;==>TurnLeft - -;~ Description: Turn character to the right. -Func TurnRight($aTurn) - If $aTurn Then - Return PerformAction(0xA3, 0x18) - Else - Return PerformAction(0xA3, 0x1A) - EndIf -EndFunc ;==>TurnRight - -;~ Description: Move backwards. -Func MoveBackward($aMove) - If $aMove Then - Return PerformAction(0xAC, 0x18) - Else - Return PerformAction(0xAC, 0x1A) - EndIf -EndFunc ;==>MoveBackward - -;~ Description: Run forwards. -Func MoveForward($aMove) - If $aMove Then - Return PerformAction(0xAD, 0x18) - Else - Return PerformAction(0xAD, 0x1A) - EndIf -EndFunc ;==>MoveForward - -;~ Description: Strafe to the left. -Func StrafeLeft($aStrafe) - If $aStrafe Then - Return PerformAction(0x91, 0x18) - Else - Return PerformAction(0x91, 0x1A) - EndIf -EndFunc ;==>StrafeLeft - -;~ Description: Strafe to the right. -Func StrafeRight($aStrafe) - If $aStrafe Then - Return PerformAction(0x92, 0x18) - Else - Return PerformAction(0x92, 0x1A) - EndIf -EndFunc ;==>StrafeRight - -;~ Description: Auto-run. -Func ToggleAutoRun() - Return PerformAction(0xB7, 0x18) -EndFunc ;==>ToggleAutoRun - -;~ Description: Turn around. -Func ReverseDirection() - Return PerformAction(0xB1, 0x18) -EndFunc ;==>ReverseDirection - -;~ Description: Cancel current action. -Func CancelAction() - Return SendPacket(0x4, 0x22) -EndFunc ;==>CancelAction - -;~ Description: Same as hitting spacebar. -Func ActionInteract() - Return PerformAction(0x80, 0x18) -EndFunc ;==>ActionInteract - -;~ Description: Follow a player. -Func ActionFollow() - Return PerformAction(0xCC, 0x18) -EndFunc ;==>ActionFollow - -;~ Description: Drop environment object. -Func DropBundle() - Return PerformAction(0xCD, 0x18) -EndFunc ;==>DropBundle - -;~ Description: Suppress action. -Func SuppressAction($aSuppress) - If $aSuppress Then - Return PerformAction(0xD0, 0x18) - Else - Return PerformAction(0xD0, 0x1A) - EndIf -EndFunc ;==>SuppressAction - -;~ Description: Open a chest. -Func OpenChest() - Return SendPacket(0x8, 0x4D, 2) -EndFunc ;==>OpenChest - -;~ Description: Change weapon sets. -Func ChangeWeaponSet($aSet) - Return PerformAction(0x80 + $aSet, 0x18) -EndFunc ;==>ChangeWeaponSet - -;~ Description: Open a dialog. -Func Dialog($aDialogID) - Return SendPacket(0x8, 0x35, $aDialogID) -EndFunc ;==>Dialog -#EndRegion - -#Region Targeting -;~ Description: Returns current target ptr. -Func GetCurrentTargetPtr() - Local $lCurrentTargetID = MemoryRead($mCurrentTarget) - If $lCurrentTargetID = 0 Then Return - $AgentBasePtr = MemoryRead($mAgentBase, 'ptr') - Return MemoryRead($AgentBasePtr + 4 * $lCurrentTargetID, 'ptr') -EndFunc ;==>GetCurrentTarget - -;~ Description: Returns current target ID. -Func GetCurrentTargetID() - Return MemoryRead($mCurrentTarget) -EndFunc ;==>GetCurrentTargetID - -;~ Description: Target an agent. -Func ChangeTarget($aAgent) - If IsPtr($aAgent) <> 0 Then - Local $lAgentID = MemoryRead($aAgent + 44, 'long') - ElseIf IsDllStruct($aAgent) <> 0 Then - Local $lAgentID = DllStructGetData($aAgent, 'ID') - Else - Local $lAgentID = ConvertID($aAgent) - EndIf - DllStructSetData($mChangeTarget, 2, $lAgentID) - Return Enqueue($mChangeTargetPtr, 8) -EndFunc ;==>ChangeTarget - -;~ Description: Call target. -Func CallTarget($aTarget) - If IsPtr($aTarget) <> 0 Then - Local $lTargetID = MemoryRead($aTarget + 44, 'long') - ElseIf IsDllStruct($aTarget) <> 0 Then - Local $lTargetID = DllStructGetData($aTarget, 'ID') - Else - Local $lTargetID = ConvertID($aTarget) - EndIf - Return SendPacket(0xC, 0x1C, 0xA, $lTargetID) -EndFunc ;==>CallTarget - -;~ Description: Clear current target. -Func ClearTarget() - Return PerformAction(0xE3, 0x18) -EndFunc ;==>ClearTarget - -;~ Description: Target the nearest enemy. -Func TargetNearestEnemy() - Return PerformAction(0x93, 0x18) -EndFunc ;==>TargetNearestEnemy - -;~ Description: Target the next enemy. -Func TargetNextEnemy() - Return PerformAction(0x95, 0x18) -EndFunc ;==>TargetNextEnemy - -;~ Description: Target the next party member. -Func TargetPartyMember($aNumber) - If $aNumber > 0 And $aNumber < 13 Then Return PerformAction(0x95 + $aNumber, 0x18) -EndFunc ;==>TargetPartyMember - -;~ Description: Target the previous enemy. -Func TargetPreviousEnemy() - Return PerformAction(0x9E, 0x18) -EndFunc ;==>TargetPreviousEnemy - -;~ Description: Target the called target. -Func TargetCalledTarget() - Return PerformAction(0x9F, 0x18) -EndFunc ;==>TargetCalledTarget - -;~ Description: Target yourself. -Func TargetSelf() - Return PerformAction(0xA0, 0x18) -EndFunc ;==>TargetSelf - -;~ Description: Target the nearest ally. -Func TargetNearestAlly() - Return PerformAction(0xBC, 0x18) -EndFunc ;==>TargetNearestAlly - -;~ Description: Target the nearest item. -Func TargetNearestItem() - Return PerformAction(0xC3, 0x18) -EndFunc ;==>TargetNearestItem - -;~ Description: Target the next item. -Func TargetNextItem() - Return PerformAction(0xC4, 0x18) -EndFunc ;==>TargetNextItem - -;~ Description: Target the previous item. -Func TargetPreviousItem() - Return PerformAction(0xC5, 0x18) -EndFunc ;==>TargetPreviousItem - -;~ Description: Target the next party member. -Func TargetNextPartyMember() - Return PerformAction(0xCA, 0x18) -EndFunc ;==>TargetNextPartyMember - -;~ Description: Target the previous party member. -Func TargetPreviousPartyMember() - Return PerformAction(0xCB, 0x18) -EndFunc ;==>TargetPreviousPartyMember -#EndRegion Targeting - -#Region Information -;~ Description: Internal use for handing -1 and -2 agent IDs. -Func ConvertID($aID) - Switch $aID - Case -2 - Return MemoryRead($mMyID) - Case -1 - Return MemoryRead($mCurrentTarget) - Case Else - Return $aID - EndSwitch -EndFunc ;==>ConvertID - -;~ Description: Returns the ID of an agent. -Func GetAgentID($aAgent) - If IsPtr($aAgent) <> 0 Then - Local $lAgentID = MemoryRead($aAgent + 44, 'long') - ElseIf IsDllStruct($aAgent) <> 0 Then - Local $lAgentID = DllStructGetData($aAgent, 'ID') - Else - Local $lAgentID = ConvertID($aAgent) - EndIf - If $lAgentID = 0 Then Return '' - Return $lAgentID -EndFunc ;==>GetAgentID - -;~ Description: Returns your agent ID. -Func GetMyID() - Return MemoryRead($mMyID) -EndFunc ;==>GetMyID - -;~ Description: Updates X and Y variables with current x and y coordinate values. -;~ Author: 4D1. -Func UpdateAgentPosByPtr($aAgentPtr, ByRef $aX, ByRef $aY) - Local $lStruct = MemoryReadStruct($aAgentPtr + 116,'float X;float Y') - $aX = DllStructGetData($lStruct,'X') - $aY = DllStructGetData($lStruct,'Y') -EndFunc ;==>UpdateAgentPosByPtr - -;~ Description: Updates MoveX and MoveY variables with current values. -Func UpdateAgentMoveByPtr($aAgentPtr, ByRef $aMoveX, ByRef $aMoveY) - Local $lStruct = MemoryReadStruct($aAgentPtr + 160,'float MoveX;float MoveY') - $aMoveX = DllStructGetData($lStruct,'MoveX') - $aMoveY = DllStructGetData($lStruct,'MoveY') -EndFunc ;==>UpdateAgentPosByPtr - -;~ Description: Returns number of agents currently loaded. -Func GetMaxAgents() - Return MemoryRead($mMaxAgents) -EndFunc ;==>GetMaxAgents - -;~ Description: Test if an agent exists. -Func GetAgentExists($aAgentID) - If $aAgentID = -2 Then Return MemoryRead($mLoggedIn) - If IsPtr($aAgentID) <> 0 Then - Return $aAgentID <> 0 And MemoryRead($aAgentID + 44, 'long') <= MemoryRead($mMaxAgents) - Else - Return GetAgentPtr($aAgentID) > 0 And $aAgentID <= MemoryRead($mMaxAgents) - EndIf -EndFunc ;==>GetAgentExists - -;~ Description: Returns the target of an agent. -Func GetTarget($aAgent) - If IsPtr($aAgent) <> 0 Then - Local $lAgentID = MemoryRead($aAgent + 44, 'long') - ElseIf IsDllStruct($aAgent) <> 0 Then - Local $lAgentID = DllStructGetData($aAgent, 'ID') - Else - Local $lAgentID = ConvertID($aAgent) - EndIf - Return MemoryRead(GetValue('TargetLogBase') + 4 * $lAgentID) -EndFunc ;==>GetTarget - -;~ Description: Returns agent by name. -Func GetAgentIDByName($aName) - If $mUseStringLog = False Then Return - Local $lName, $lAddress - For $i = 1 To MemoryRead($mMaxAgents) - $lAddress = $mStringLogBase + 256 * $i - $lName = MemoryRead($lAddress, 'wchar [128]') - If $lName = '' Then ContinueLoop - $lName = StringRegExpReplace($lName, '[<]{1}([^>]+)[>]{1}', '') - If StringInStr($lName, $aName) <> 0 Then Return $i - Next - DisplayAll(True) - Sleep(100) - DisplayAll(False) - DisplayAll(True) - Sleep(100) - DisplayAll(False) - For $i = 1 To MemoryRead($mMaxAgents) - $lAddress = $mStringLogBase + 256 * $i - $lName = MemoryRead($lAddress, 'wchar [128]') - If $lName = '' Then ContinueLoop - $lName = StringRegExpReplace($lName, '[<]{1}([^>]+)[>]{1}', '') - If StringInStr($lName, $aName) <> 0 Then Return $i - Next -EndFunc ;==>GetAgentIDByName - -;~ Description: Checks number of enemies in range, can check specific Enemies with Playernumber. -Func GetNumberOfFoesInRangeOfAgent($aAgent = GetAgentPtr(-2), $aMaxDistance = 4000, $aPlayerNum = 0) - Local $lMaxDistance = $aMaxDistance ^2 - If IsPtr($aAgent) <> 0 Then - Local $lAgentPtr = $aAgent - ElseIf IsDllStruct($aAgent) <> 0 Then - Local $lAgentPtr = GetAgentPtr(DllStructGetData($aAgent, 'ID')) - Else - Local $lAgentPtr = GetAgentPtr($aAgent) - EndIf - Local $lDistance, $lCount = 0 - Local $lTargetTypeArray = GetAgentPtrArray(3) - For $i = 1 To $lTargetTypeArray[0] - If $aPlayerNum <> 0 And MemoryRead($lTargetTypeArray[$i] + 244, 'word') <> $aPlayerNum Then ContinueLoop - $lDistance = GetPseudoDistance($lTargetTypeArray[$i], $lAgentPtr) - If $lDistance < $lMaxDistance Then - $lCount += 1 - EndIf - Next - Return $lCount -EndFunc ;==>GetNumberOfFoesInRangeOfAgent - -;~ Description: Checks number of allies in range, can check specific allies with ModelID. -Func GetNumberOfAlliesInRangeOfAgent($aAgent = GetAgentPtr(-2), $aMaxDistance = 4000, $aPlayerNum = 0) - Local $lMaxDistance = $aMaxDistance ^2 - If IsPtr($aAgent) <> 0 Then - Local $lAgentPtr = $aAgent - ElseIf IsDllStruct($aAgent) <> 0 Then - Local $lAgentPtr = GetAgentPtr(DllStructGetData($aAgent, 'ID')) - Else - Local $lAgentPtr = GetAgentPtr($aAgent) - EndIf - Local $lDistance, $lCount = 0 - Local $lTargetTypeArray = GetAgentPtrArray(2, 0xDB, 1) - For $i = 1 To $lTargetTypeArray[0] - If $aPlayerNum <> 0 And MemoryRead($lTargetTypeArray[$i] + 244, 'word') <> $aPlayerNum Then ContinueLoop - $lDistance = GetPseudoDistance($lTargetTypeArray[$i], $lAgentPtr) - If $lDistance < $lMaxDistance Then - $lCount += 1 - EndIf - Next - Return $lCount -EndFunc ;==>GetNumberOfAlliesInRangeOfAgent - -;~ Description: Returns player with most enemies around them within range $aMaxDistance. -Func GetVIP($aMaxDistance = 1350) - Local $lAgentArray = GetAgentPtrArray() - Return GetVIP_($lAgentArray, $aMaxDistance) -EndFunc ;==>GetVIP - -;~ Description: Returns player with most enemies around them within range $aMaxDistance. -Func GetVIP_(ByRef $aAgentArray, $aMaxDistance = 1350) - If $aAgentArray[0] = 0 Then Return - Local $lVIPPtr, $lAllegiance, $lCount = 0 - Local $lEnemyArray[$aAgentArray[0] + 1][3] - $lEnemyArray[0][0] = 0 - Local $lAllyArray[$aAgentArray[0] + 1][3] - $lAllyArray[0][0] = 0 - For $i = 1 To $aAgentArray[0] - $lAllegiance = MemoryRead($aAgentArray[$i] + 433, 'byte') - Switch $lAllegiance - Case 1, 6 - $lAllyArray[0][0] = $lAllyArray[0][0] + 1 - $lAllyArray[$lAllyArray[0][0]][0] = $aAgentArray[$i] - $lAllyArray[$lAllyArray[0][0]][1] = MemoryRead($aAgentArray[$i] + 116, 'float') - $lAllyArray[$lAllyArray[0][0]][2] = MemoryRead($aAgentArray[$i] + 120, 'float') - Case 3 - $lEnemyArray[0][0] = $lEnemyArray[0][0] + 1 - $lEnemyArray[$lEnemyArray[0][0]][0] = $aAgentArray[$i] - $lEnemyArray[$lEnemyArray[0][0]][1] = MemoryRead($aAgentArray[$i] + 116, 'float') - $lEnemyArray[$lEnemyArray[0][0]][2] = MemoryRead($aAgentArray[$i] + 120, 'float') - EndSwitch - Next - For $i = 1 To $lAllyArray[0][0] - 1 - Local $lEnemies = 0 - Local $lMin = $lAllyArray[$i][1] - $aMaxDistance - Local $lMax = $lAllyArray[$i][1] + $aMaxDistance - For $j = 1 To $lEnemyArray[0][0] - 1 - If $lEnemyArray[$j][1] <= $lMax And $lEnemyArray[$j][1] > $lMin Then - If ComputeDistance($lAllyArray[$i][1], $lAllyArray[$i][2], $lEnemyArray[$j][1], $lEnemyArray[$j][2]) <= $aMaxDistance Then $lEnemies += 1 - EndIf - Next - If $lEnemies > $lCount Then - $lVIPPtr = $lAllyArray[$i][0] - $lCount = $lEnemies - EndIf - Next - Return $lVIPPtr -EndFunc ;==>GetVIP_ - -;~ Description: Returns amount of players in outpost that are loaded into client memory. -;~ Includes oneself. -Func GetNumberOfPlayersInOutpost() - Local $lCount = 0 - Local $lAgentArray = GetAgentPtrArray(2, 0xDB, 1) - For $i = 0 To $lAgentArray[0] - If MemoryRead($lAgentArray[$i] + 384, 'long') <> 0 Then $lCount += 1 - Next - Return $lCount -EndFunc ;==>GetNumberOfPlayersInOutpost - -#Region Type -;~ Description: Tests if an agent is living. -Func GetIsLiving($aAgent) - If IsPtr($aAgent) <> 0 Then - Return MemoryRead($aAgent + 156, 'long') = 0xDB - ElseIf IsDllStruct($aAgent) <> 0 Then - Return DllStructGetData($aAgent, 'Type') = 0xDB - Else - Return MemoryRead(GetAgentPtr($aAgent) + 156, 'long') = 0xDB - EndIf -EndFunc ;==>GetIsLiving - -;~ Description: Tests if an agent is a signpost/chest/etc. -Func GetIsStatic($aAgent) - If IsPtr($aAgent) <> 0 Then - Return MemoryRead($aAgent + 156, 'long') = 0x200 - ElseIf IsDllStruct($aAgent) <> 0 Then - Return DllStructGetData($aAgent, 'Type') = 0x200 - Else - Return MemoryRead(GetAgentPtr($aAgent) + 156, 'long') = 0x200 - EndIf -EndFunc ;==>GetIsStatic - -;~ Description: Tests if an agent is an item. -Func GetIsMovable($aAgent) - If IsPtr($aAgent) <> 0 Then - Return MemoryRead($aAgent + 156, 'long') = 0x400 - ElseIf IsDllStruct($aAgent) <> 0 Then - Return DllStructGetData($aAgent, 'Type') = 0x400 - Else - Return MemoryRead(GetAgentPtr($aAgent) + 156, 'long') = 0x400 - EndIf -EndFunc ;==>GetIsMovable - -;~ Description: Checks if agentID is summoned. -Func IsSummonedCreature($aAgentID) - If IsPtr($aAgentID) <> 0 Then - Local $lAgentMID = MemoryRead($aAgentID + 244, 'word') - Else - Local $lAgentMID = MemoryRead(GetAgentPtr($aAgentID) + 244, 'word') - EndIf - Switch $lAgentMID - Case 1377 ; Pet-Elder Wolf - Return True - Case 2226 to 2228 ; bone horror, fiend, minion - Return True - Case 2870 to 2878 ; ranger spirits part 1 - Return True - Case 2881 to 2884 ; ranger spirits part 2 - Return True - Case 3962, 3963 ; corrupted scales and spores - Return True - Case 4205, 4206 ; flesh golem, vampiric horror - Return True - Case 4209 to 4228 ; ritualist spirits part 1 and one ranger spirit - Return True - Case 4230 to 4235 ; ranger spirits part 3 - Return True - Case 5709 to 5719 ; necro, ranger and ritualist spirits - Return True - Case 5848 to 5850 ; EVA, ritualist spirits - Return True - Case Else - Return False - EndSwitch -EndFunc - -;~ Description: Returns true if agent is a minion. -Func IsMinion($aAgentID) - If IsPtr($aAgentID) <> 0 Then - Local $lAgentMID = MemoryRead($aAgentID + 244, 'word') - Else - Local $lAgentMID = MemoryRead(GetAgentPtr($aAgentID) + 244, 'word') - EndIf - Switch $lAgentMID - Case 2226, 2227, 2228 ; bone horror, fiend, minion - Return True - Case 4205, 4206 ; flesh golem, vampiric horror - Return True - Case 5709, 5710 ; shambling horror, jagged horror - Return True - Case Else - Return False - EndSwitch -EndFunc -#EndRegion - -#Region hp, energy, coordinates -;~ Description: Agents X Location -Func XLocation($aAgent = GetAgentPtr(-2)) - If IsPtr($aAgent) <> 0 Then - Return MemoryRead($aAgent + 116, 'float') - ElseIf IsDllStruct($aAgent) <> 0 Then - Return DllStructGetData($aAgent, 'X') - Else - Return MemoryRead(GetAgentPtr($aAgent) + 116, 'float') - EndIf -EndFunc ;==>XLocation - -;~ Description: Agents Y Location -Func YLocation($aAgent = GetAgentPtr(-2)) - If IsPtr($aAgent) <> 0 Then - Return MemoryRead($aAgent + 120, 'float') - ElseIf IsDllStruct($aAgent) <> 0 Then - Return DllStructGetData($aAgent, 'Y') - Else - Return MemoryRead(GetAgentPtr($aAgent) + 120, 'float') - EndIf -EndFunc ;==>YLocation - -;~ Description: Agents X and Y Location -Func XandYLocation($aAgent = GetAgentPtr(-2)) - Local $lLocation[2] - If IsPtr($aAgent) <> 0 Then - UpdateAgentPosByPtr($aAgent, $lLocation[0], $lLocation[1]) - ElseIf IsDllStruct($aAgent) <> 0 Then - $lLocation[0] = DllStructGetData($aAgent, 'X') - $lLocation[1] = DllStructGetData($aAgent, 'Y') - Else - UpdateAgentPosByPtr(GetAgentPtr($aAgent), $lLocation[0], $lLocation[1]) - EndIf - Return $lLocation -EndFunc ;==>XandYLocation - -;~ Description: Returns energy of an agent. (Only self/heroes) -Func GetEnergy($aAgent = GetAgentPtr(-2)) - If IsPtr($aAgent) <> 0 Then - Local $lStruct = MemoryReadStruct($aAgent + 284, 'float EnergyPercent;long MaxEnergy') - Return DllStructGetData($lStruct, 'EnergyPercent') * DllStructGetData($lStruct, 'MaxEnergy') - ElseIf IsDllStruct($aAgent) <> 0 Then - Return DllStructGetData($aAgent, 'EnergyPercent') * DllStructGetData($aAgent, 'MaxEnergy') - Else - Local $lPtr = GetAgentPtr($aAgent) - Local $lStruct = MemoryReadStruct($lPtr + 284, 'float EnergyPercent;long MaxEnergy') - Return DllStructGetData($lStruct, 'EnergyPercent') * DllStructGetData($lStruct, 'MaxEnergy') - EndIf -EndFunc ;==>GetEnergy - -;~ Description: Returns health of an agent. (Must have caused numerical change in health) -Func GetHealth($aAgent = GetAgentPtr(-2)) - If IsPtr($aAgent) <> 0 Then - Local $lStruct = MemoryReadStruct($aAgent + 304, 'float HP;long MaxHP') - Return DllStructGetData($lStruct, 'HP') * DllStructGetData($lStruct, 'MaxHP') - ElseIf IsDllStruct($aAgent) <> 0 Then - Return DllStructGetData($aAgent, 'HP') * DllStructGetData($aAgent, 'MaxHP') - Else - Local $lStruct = MemoryReadStruct(GetAgentPtr($aAgent) + 304, 'float HP;long MaxHP') - Return DllStructGetData($lStruct, 'HP') * DllStructGetData($lStruct, 'MaxHP') - EndIf -EndFunc ;==>GetHealth - -;~ Description: Returns moving from agent movement struct. -Func GetMoving($aAgentID) - Local $lAgentID = ConvertID($aAgentID) - Local Static $lPtr = MemoryRead($mAgentMovement + 4 * $lAgentID) - If MemoryRead($lPtr + 16, 'long') <> $aAgentID Then - $mAgentMovement = GetAgentMovementPtr() - $lPtr = MemoryRead($mAgentMovement + 4 * $lAgentID) - EndIf - Return MemoryRead($lPtr + 60, 'long') -EndFunc - -;~ Description: Checks if GetMoving stays 0 for a period of time. -Func GetIsRubberbanding($aAgentID, $aTime, $aPtr = GetAgentPtr($aAgentID)) - Local $lAgentID = ConvertID($aAgentID) - Local Static $lPtr = MemoryRead($mAgentMovement + 4 * $lAgentID) - If MemoryRead($lPtr + 16, 'long') <> $aAgentID Then - $mAgentMovement = GetAgentMovementPtr() - $lPtr = MemoryRead($mAgentMovement + 4 * $lAgentID) - EndIf - Local $lMoveX, $lMoveY - Local $lTimer = TimerInit() - Do - UpdateAgentMoveByPtr($aPtr, $lMoveX, $lMoveY) - If $lMoveX = 0 And $lMoveY = 0 Then Return False ; standing still... not actually rubberbanding - If MemoryRead($lPtr + 60, 'long') <> 0 Then Return False ; moving - Sleep(50) - Until TimerDiff($lTimer) > $aTime - Return True -EndFunc - -;~ Description: Tests if an agent is moving. Uses agent struct data. -Func GetIsMoving($aAgent = GetAgentPtr(-2), $aTimer = 0) - If IsPtr($aAgent) <> 0 Then - Local $lPtr = $aAgent - ElseIf IsDllStruct($aAgent) <> 0 Then - If DllStructGetData($aAgent, 'MoveX') <> 0 Or DllStructGetData($aAgent, 'MoveY') <> 0 Then Return True - Else - Local $lPtr = GetAgentPtr($aAgent) - EndIf - Local $lMoveX, $lMoveY - Local $lTimer = TimerInit() - If $aTimer <> 0 Then - Do - UpdateAgentMoveByPtr($lPtr, $lMoveX, $lMoveY) - If $lMoveX <> 0 Or $lMoveY <> 0 Then Return True - Sleep(50) - Until TimerDiff($lTimer) > $aTimer - Else - UpdateAgentMoveByPtr($lPtr, $lMoveX, $lMoveY) - If $lMoveX <> 0 Or $lMoveY <> 0 Then Return True - EndIf -EndFunc ;==>GetIsMoving -#EndRegion - -#Region State -;~ Description: Tests if an agent is knocked down. -Func GetIsKnocked($aAgent = GetAgentPtr(-2)) - If IsPtr($aAgent) <> 0 Then - Return MemoryRead($aAgent + 340, 'long') = 0x450 - ElseIf IsDllStruct($aAgent) <> 0 Then - Return DllStructGetData($aAgent, 'ModelState') = 0x450 - Else - Return MemoryRead(GetAgentPtr($aAgent) + 340, 'long') = 0x450 - EndIf -EndFunc ;==>GetIsKnocked - -;~ Description: Tests if an agent is attacking. -Func GetIsAttacking($aAgent = GetAgentPtr(-2)) - Local $lModelState - If IsPtr($aAgent) <> 0 Then - $lModelState = MemoryRead($aAgent + 340, 'long') - ElseIf IsDllStruct($aAgent) <> 0 Then - $lModelState = DllStructGetData($aAgent, 'ModelState') - Else - $lModelState = MemoryRead(GetAgentPtr($aAgent) + 340, 'long') - EndIf - Switch $lModelState - Case 0x60 ; Is Attacking - Return True - Case 0x440 ; Is Attacking - Return True - Case 0x460 ; Is Attacking - Return True - EndSwitch -EndFunc ;==>GetIsAttacking - -;~ Description: Tests if an agent is casting. -Func GetIsCasting($aAgent = GetAgentPtr(-2)) - If IsPtr($aAgent) <> 0 Then - Return MemoryRead($aAgent + 436, 'word') <> 0 - ElseIf IsDllStruct($aAgent) <> 0 Then - Return DllStructGetData($aAgent, 'Skill') <> 0 - Else - Return MemoryRead(GetAgentPtr($aAgent) + 436, 'word') <> 0 - EndIf -EndFunc ;==>GetIsCasting -#EndRegion - -#Region Effects -;~ Description: Tests if an agent is bleeding. -Func GetIsBleeding($aAgent) - If IsPtr($aAgent) <> 0 Then - Return BitAND(MemoryRead($aAgent + 312, 'long'), 0x0001) > 0 - ElseIf IsDllStruct($aAgent) <> 0 Then - Return BitAND(DllStructGetData($aAgent, 'Effects'), 0x0001) > 0 - Else - Return BitAND(MemoryRead(GetAgentPtr($aAgent) + 312, 'long'), 0x0001) > 0 - EndIf -EndFunc ;==>GetIsBleeding - -;~ Description: Tests if an agent has a condition. -Func GetHasCondition($aAgent) - If IsPtr($aAgent) <> 0 Then - Return BitAND(MemoryRead($aAgent + 312, 'long'), 0x0002) > 0 - ElseIf IsDllStruct($aAgent) <> 0 Then - Return BitAND(DllStructGetData($aAgent, 'Effects'), 0x0002) > 0 - Else - Return BitAND(MemoryRead(GetAgentPtr($aAgent) + 312, 'long'), 0x0002) > 0 - EndIf -EndFunc ;==>GetHasCondition - -;~ Description: Tests if an agent is dead. -Func GetIsDead($aAgent = GetAgentPtr(-2)) - If IsPtr($aAgent) <> 0 Then - Return BitAND(MemoryRead($aAgent + 312, 'long'), 0x0010) > 0 - ElseIf IsDllStruct($aAgent) <> 0 Then - Return BitAND(DllStructGetData($aAgent, 'Effects'), 0x0010) > 0 - Else - Return BitAND(MemoryRead(GetAgentPtr($aAgent) + 312, 'long'), 0x0010) > 0 - EndIf -EndFunc ;==>GetIsDead - -;~ Description: Tests if an agent has a deep wound. -Func GetHasDeepWound($aAgent) - If IsPtr($aAgent) <> 0 Then - Return BitAND(MemoryRead($aAgent + 312, 'long'), 0x0020) > 0 - ElseIf IsDllStruct($aAgent) <> 0 Then - Return BitAND(DllStructGetData($aAgent, 'Effects'), 0x0020) > 0 - Else - Return BitAND(MemoryRead(GetAgentPtr($aAgent) + 312, 'long'), 0x0020) > 0 - EndIf -EndFunc ;==>GetHasDeepWound - -;~ Description: Tests if an agent is poisoned. -Func GetIsPoisoned($aAgent) - If IsPtr($aAgent) <> 0 Then - Return BitAND(MemoryRead($aAgent + 312, 'long'), 0x0040) > 0 - ElseIf IsDllStruct($aAgent) <> 0 Then - Return BitAND(DllStructGetData($aAgent, 'Effects'), 0x0040) > 0 - Else - Return BitAND(MemoryRead(GetAgentPtr($aAgent) + 312, 'long'), 0x0040) > 0 - EndIf -EndFunc ;==>GetIsPoisoned - -;~ Description: Tests if an agent is enchanted. -Func GetIsEnchanted($aAgent) - If IsPtr($aAgent) <> 0 Then - Return BitAND(MemoryRead($aAgent + 312, 'long'), 0x0080) > 0 - ElseIf IsDllStruct($aAgent) <> 0 Then - Return BitAND(DllStructGetData($aAgent, 'Effects'), 0x0080) > 0 - Else - Return BitAND(MemoryRead(GetAgentPtr($aAgent) + 312, 'long'), 0x0080) > 0 - EndIf -EndFunc ;==>GetIsEnchanted - -;~ Description: Tests if an agent has a degen hex. -Func GetHasDegenHex($aAgent) - If IsPtr($aAgent) <> 0 Then - Return BitAND(MemoryRead($aAgent + 312, 'long'), 0x0400) > 0 - ElseIf IsDllStruct($aAgent) <> 0 Then - Return BitAND(DllStructGetData($aAgent, 'Effects'), 0x0400) > 0 - Else - Return BitAND(MemoryRead(GetAgentPtr($aAgent) + 312, 'long'), 0x0400) > 0 - EndIf -EndFunc ;==>GetHasDegenHex - -;~ Description: Tests if an agent is hexed. -Func GetHasHex($aAgent) - If IsPtr($aAgent) <> 0 Then - Return BitAND(MemoryRead($aAgent + 312, 'long'), 0x0800) > 0 - ElseIf IsDllStruct($aAgent) <> 0 Then - Return BitAND(DllStructGetData($aAgent, 'Effects'), 0x0800) > 0 - Else - Return BitAND(MemoryRead(GetAgentPtr($aAgent) + 312, 'long'), 0x0800) > 0 - EndIf -EndFunc ;==>GetHasHex - -;~ Description: Tests if an agent has a weapon spell. -Func GetHasWeaponSpell($aAgent) - If IsPtr($aAgent) <> 0 Then - Return BitAND(MemoryRead($aAgent + 312, 'long'), 0x8000) > 0 - ElseIf IsDllStruct($aAgent) <> 0 Then - Return BitAND(DllStructGetData($aAgent, 'Effects'), 0x8000) > 0 - Else - Return BitAND(MemoryRead(GetAgentPtr($aAgent) + 312, 'long'), 0x8000) > 0 - EndIf -EndFunc ;==>GetHasWeaponSpell -#EndRegion - -#Region TypeMap -;~ Description: Tests if an agent is a boss. -Func GetIsBoss($aAgent) - If IsPtr($aAgent) <> 0 Then - Return BitAND(MemoryRead($aAgent + 344, 'long'), 1024) > 0 - ElseIf IsDllStruct($aAgent) <> 0 Then - Return BitAND(DllStructGetData($aAgent, 'TypeMap'), 1024) > 0 - Else - Return BitAND(MemoryRead( GetAgentPtr($aAgent) + 344, 'long'), 1024) > 0 - EndIf -EndFunc ;==>GetIsBoss -#EndRegion - -#Region X and Y Calcs -;~ Description: Returns the distance between target and oneself. -Func GetDistanceToE($aAgent1 = GetCurrentTargetPtr(), $aMe = GetAgentPtr(-2)) - Local $lAgent1X, $lAgent1Y, $lAgent2X, $lAgent2Y - If IsPtr($aAgent1) <> 0 Then - UpdateAgentPosByPtr($aAgent1, $lAgent1X, $lAgent1Y) - ElseIf IsDllStruct($aAgent1) <> 0 Then - $lAgent1X = DllStructGetData($aAgent1, 'X') - $lAgent1Y = DllStructGetData($aAgent1, 'Y') - Else - UpdateAgentPosByPtr(GetAgentPtr($aAgent1), $lAgent1X, $lAgent1Y) - EndIf - UpdateAgentPosByPtr($aMe, $lAgent2X, $lAgent2Y) - Return Sqrt(($lAgent1X - $lAgent2X) ^2 + ($lAgent1Y - $lAgent2Y) ^2) -EndFunc ;==>GetDistanceToE - -;~ Description: Returns the distance between two agents. -Func GetDistance($aAgent1 = GetCurrentTargetPtr(), $aAgent2 = GetAgentPtr(-2)) - Local $lAgent1X, $lAgent1Y, $lAgent2X, $lAgent2Y - UpdateAgentPosByPtr( ((IsPtr($aAgent1)) ? ($aAgent1) : (GetAgentPtr($aAgent1))) , $lAgent1X, $lAgent1Y ) - UpdateAgentPosByPtr( ((IsPtr($aAgent2)) ? ($aAgent2) : (GetAgentPtr($aAgent2))) , $lAgent2X, $lAgent2Y ) - Return Sqrt(($lAgent1X - $lAgent2X) ^2 + ($lAgent1Y - $lAgent2Y) ^2) -EndFunc ;==>GetDistance - -;~ Description: Same as GetDistance(), but without Sqrt. Only accepts pointers as arguments. -Func GetPseudoDistance($aAgentPtr1, $aAgentPtr2) - Local $lAgent1X, $lAgent2X, $lAgent1Y, $lAgent2Y - UpdateAgentPosByPtr($aAgentPtr1, $lAgent1X, $lAgent1Y) - UpdateAgentPosByPtr($aAgentPtr2, $lAgent2X, $lAgent2Y) - Return ($lAgent1X - $lAgent2X) ^2 + ($lAgent1Y - $lAgent2Y) ^2 -EndFunc - -;~ Description: Checks if a point is within a polygon defined by an array. -Func GetIsPointInPolygon($aAreaCoords, $aPosX = 0, $aPosY = 0) - Local $lPosition, $lPosX, $lPosY, $j - Local $lEdges = UBound($aAreaCoords) - Local $lOddNodes = False - If $lEdges < 3 Then Return False - If $aPosX = 0 Then - Local $lAgent = GetAgentPtr(-2) - UpdateAgentPosByPtr($lAgent, $lPosX, $lPosY) - Else - $lPosX = $aPosX - $lPosY = $aPosY - EndIf - $j = $lEdges - 1 - For $i = 0 To $lEdges - 1 - If (($aAreaCoords[$i][1] < $aPosY And $aAreaCoords[$j][1] >= $aPosY) _ - Or ($aAreaCoords[$j][1] < $aPosY And $aAreaCoords[$i][1] >= $aPosY)) _ - And ($aAreaCoords[$i][0] <= $aPosX Or $aAreaCoords[$j][0] <= $aPosX) Then - If ($aAreaCoords[$i][0] + ($aPosY - $aAreaCoords[$i][1]) / ($aAreaCoords[$j][1] - $aAreaCoords[$i][1]) * ($aAreaCoords[$j][0] - $aAreaCoords[$i][0]) < $aPosX) Then - $lOddNodes = Not $lOddNodes - EndIf - EndIf - $j = $i - Next - Return $lOddNodes -EndFunc ;==>GetIsPointInPolygon -#EndRegion - -#Region Agentname -;~ Description: Returns the name of an agent.edit by Ralle1976 -Func GetAgentName($aAgent) - If $mUseStringLog = False Then Return - If (IsPtr($aAgent) <> 0) Then - Local $lAgentID = MemoryRead($aAgent + 44, 'long') - ElseIf (IsDllStruct($aAgent) <> 0) Then - Local $lAgentID = DllStructGetData($aAgent, 'ID') - Else - Local $lAgentID = ConvertID($aAgent) - EndIf - Local Static $PlayerID = ConvertID(-2), $Charname = GetCharname() - If ($lAgentID = $PlayerID) Then Return $Charname - local $lAdresse = 0, $lName = '' - $lAdresse = $mStringLogBase + 256 * $lAgentID - $lName = MemoryRead($lAdresse, 'wchar [128]') - If $lName = '' Then - DisplayAll(True) - Sleep(100) - DisplayAll(False) - EndIf - $lName = MemoryRead($lAdresse, 'wchar [128]') - Return StringRegExpReplace($lName, '[<]{1}([^>]+)[>]{1}', '') -EndFunc ;==>GetAgentName -#EndRegion - -#Region Profession -;~ Description: Agents Primary Profession -Func GetProfessionPrimary($aAgent = GetAgentPtr(-2)) - Return GetAgentPrimaryProfession($aAgent) -EndFunc ;==>GetProfessionPrimary - -;~ Description: Agents Secondary Profession -Func GetProfessionSecondary($aAgent = GetAgentPtr(-2)) - Return GetAgentSecondaryProfession($aAgent) -EndFunc ;==>GetProfessionSecondary - -;~ Description: Returns agent primary profession. -Func GetAgentPrimaryProfession($aAgent = GetAgentPtr(-2)) - If IsPtr($aAgent) <> 0 Then - Return MemoryRead($aAgent + 266, 'byte') - ElseIf IsDllStruct($aAgent) <> 0 Then - Return DllStructGetData($aAgent, 'Primary') - Else - Return MemoryRead(GetAgentPtr($aAgent) + 266, 'byte') - EndIf -EndFunc ;==>GetAgentPrimaryProfession - -;~ Description: Returns agent secondary profession. -Func GetAgentSecondaryProfession($aAgent = GetAgentPtr(-2)) - If IsPtr($aAgent) <> 0 Then - Return MemoryRead($aAgent + 267, 'byte') - ElseIf IsDllStruct($aAgent) <> 0 Then - Return DllStructGetData($aAgent, 'Secondary') - Else - Return MemoryRead(GetAgentPtr($aAgent) + 267, 'byte') - EndIf -EndFunc ;==>GetAgentSecondaryProfession - -;~ Description: Returns primary/secondary as string. -Func GetAgentProfessionsName($aAgent = GetAgentPtr(-2)) - Return GetProfessionName(GetAgentPrimaryProfession($aAgent)) & "/" & GetProfessionName(GetAgentSecondaryProfession($aAgent)) -EndFunc ;==>GetAgentProfessionsName - -;~ Description: Returns profession's abbreviation. -Func GetProfessionName($aProf) - Switch $aProf - Case 0 ; $PROFESSION_None - Return "x" - Case 1 ; $PROFESSION_Warrior - Return "W" - Case 2 ; $PROFESSION_Ranger - Return "R" - Case 3 ; $PROFESSION_Monk - Return "Mo" - Case 4 ; $PROFESSION_Necromancer - Return "N" - Case 5 ; $PROFESSION_Mesmer - Return "Me" - Case 6 ; $PROFESSION_Elementalist - Return "E" - Case 7 ; $PROFESSION_Assassin - Return "A" - Case 8 ; $PROFESSION_Ritualist - Return "Rt" - Case 9 ; $PROFESSION_Paragon - Return "P" - Case 10 ; $PROFESSION_Dervish - Return "D" - EndSwitch -EndFunc ;==>GetProfessionName - -;~ Description: Returns profession's fullname. -Func GetProfessionFullName($aProf) - Switch $aProf - Case 0 ; $PROFESSION_None - Return "x" - Case 1 ; $PROFESSION_Warrior - Return "Warrior" - Case 2 ; $PROFESSION_Ranger - Return "Ranger" - Case 3 ; $PROFESSION_Monk - Return "Monk" - Case 4 ; $PROFESSION_Necromancer - Return "Necromancer" - Case 5 ; $PROFESSION_Mesmer - Return "Mesmer" - Case 6 ; $PROFESSION_Elementalist - Return "Elementalist" - Case 7 ; $PROFESSION_Assassin - Return "Assassin" - Case 8 ; $PROFESSION_Ritualist - Return "Ritualist" - Case 9 ; $PROFESSION_Paragon - Return "Paragon" - Case 10 ; $PROFESSION_Dervish - Return "Dervish" - EndSwitch -EndFunc ;==>GetProfessionFullName - -;~ Description: Returns true if agent is main healing profession. -Func GetIsHealer($aAgent = GetAgentPtr(-2)) - Local $lPrimary = GetAgentPrimaryProfession($aAgent) - If $lPrimary = 3 Or $lPrimary = 8 Then Return True ; $PROFESSION_Monk, $PROFESSION_Ritualist - Local $lSecondary = GetAgentSecondaryProfession($aAgent) - If $lSecondary = 3 Or $lSecondary = 8 Then Return True ; $PROFESSION_Monk, $PROFESSION_Ritualist -EndFunc ;==>GetIsHealer - -;~ Description: Returns true if agent is monk. -Func IsMonk($aAgent = GetAgentPtr(-2)) - Return GetAgentPrimaryProfession($aAgent) = 3 Or GetAgentSecondaryProfession($aAgent) = 3 ; $PROFESSION_Monk -EndFunc ;==>IsMonk - -;~ Description: Returns true if agent is E/Mo. -Func IsEMo($aAgent = GetAgentPtr(-2)) - Return GetAgentPrimaryProfession($aAgent) = 6 And GetAgentSecondaryProfession($aAgent) = 3 ; $PROFESSION_Elementalist, $PROFESSION_Monk -EndFunc ;==>IsEMo - -;~ Description: Returns true if agent uses a martial weapon -Func GetIsMartial($aAgent = GetAgentPtr(-2)) - Local $lAgentWeaponType - If IsPtr($aAgent) <> 0 Then - $lAgentWeaponType = MemoryRead($aAgent + 434, 'word') - ElseIf IsDllStruct($aAgent) <> 0 Then - $lAgentWeaponType = DllStructGetData($aAgent, 'WeaponType') - Else - $lAgentWeaponType = MemoryRead(GetAgentPtr($aAgent) + 434, 'word') - EndIf - Switch $lAgentWeaponType - Case 1 To 7 - Return True - Case Else - Return False - EndSwitch -EndFunc ;==>GetIsMartial -#EndRegion -#EndRegion Information \ No newline at end of file + +#include-once + +#Region Ptr +;~ Description: Returns Agent ptr by AgentID. +Func GetAgentPtr($aAgentID = GetMyID()) + Return MemoryRead(MemoryRead($mAgentBase, 'ptr') + 4 * ConvertID($aAgentID), 'ptr') +EndFunc ;==>GetAgentPtr + +;~ Description: Returns agentptr by playernumber. +Func GetPlayerPtrByPlayerNumber($aPlayerNumber) + Local $lAgentArray = GetAgentPtrArray(1) + For $i = 1 to $lAgentArray[0] + If MemoryRead($lAgentArray[$i] + 244, 'word') = $aPlayerNumber Then Return $lAgentArray[$i] + Next +EndFunc ;==>GetPlayerPtrByPlayerNumber + +#Region AgentPtrArray +;~ Description: Pulls only ptrs instead of whole struct from memory, doesnt use ASM. +;~ Author: Tecka. +Func GetAgentPtrArray($aMode = 0, $aType = 0xDB, $aAllegiance = 3, $aDead = False) + If $aMode = Default Then $aMode = 0 + If $aType = Default Then $aType = 0xDB + If $aAllegiance = Default Then $aAllegiance = 3 + If $aDead = Default Then $aDead = False + Local $lMaxAgents = MemoryRead($mMaxAgents) + Local $lAgentPtrStruct = DllStructCreate("ptr[" & $lMaxAgents & "]") + DllCall($mKernelHandle, "bool", "ReadProcessMemory", "handle", $mGWProcHandle, "ptr", MemoryRead($mAgentBase), "struct*", $lAgentPtrStruct, "ulong_ptr", $lMaxAgents * 4, "ulong_ptr*", 0) + Local $lTemp + Local $lAgentArray[$lMaxAgents + 1] + $lAgentArray[0] = 0 + Switch $aMode + Case 0 + For $i = 1 To $lMaxAgents + $lTemp = DllStructGetData($lAgentPtrStruct, 1, $i) + If $lTemp = 0 Then ContinueLoop + $lAgentArray[0] += 1 + $lAgentArray[$lAgentArray[0]] = $lTemp + Next + Case 1 + For $i = 1 To $lMaxAgents + $lTemp = DllStructGetData($lAgentPtrStruct, 1, $i) + If $lTemp = 0 Then ContinueLoop + If MemoryRead($lTemp + 156, 'long') <> $aType Then ContinueLoop + $lAgentArray[0] += 1 + $lAgentArray[$lAgentArray[0]] = $lTemp + Next + Case 2 + For $i = 1 To $lMaxAgents + $lTemp = DllStructGetData($lAgentPtrStruct, 1, $i) + If $lTemp = 0 Then ContinueLoop + If MemoryRead($lTemp + 156, 'long') <> $aType Then ContinueLoop + If MemoryRead($lTemp + 433, 'byte') <> $aAllegiance Then ContinueLoop + $lAgentArray[0] += 1 + $lAgentArray[$lAgentArray[0]] = $lTemp + Next + Case 3 + For $i = 1 To $lMaxAgents + $lTemp = DllStructGetData($lAgentPtrStruct, 1, $i) + If $lTemp = 0 Then ContinueLoop + If MemoryRead($lTemp + 156, 'long') <> $aType Then ContinueLoop + If MemoryRead($lTemp + 433, 'byte') <> $aAllegiance Then ContinueLoop + If MemoryRead($lTemp + 304, 'float') <= 0 Then ContinueLoop + $lAgentArray[0] += 1 + $lAgentArray[$lAgentArray[0]] = $lTemp + Next + EndSwitch + ReDim $lAgentArray[$lAgentArray[0] + 1] + Return $lAgentArray +EndFunc ;==>GetAgentPtrArray +#EndRegion AgentPtrArray + +#Region Nearest/FarthestToAgent +;~ Description: Returns the nearest agent to an agent. +Func GetNearestAgentPtrToAgent($aAgent = -1) + Local $lAgentX, $lAgentY, $lArrayX, $lArrayY + If IsPtr($aAgent) <> 0 Then + Local $lPtr = $aAgent + UpdateAgentPosByPtr($aAgent, $lAgentX, $lAgentY) + ElseIf IsDllStruct($aAgent) <> 0 Then + Local $lPtr = GetAgentPtr(DllStructGetData($aAgent, 'ID')) + $lAgentX = DllStructGetData($aAgent, 'X') + $lAgentY = DllStructGetData($aAgent, 'Y') + Else + Local $lPtr = GetAgentPtr($aAgent) + UpdateAgentPosByPtr($lPtr, $lAgentX, $lAgentY) + EndIf + Local $lNearestAgent, $lDistance, $lNearestDistance = 25000000 + Local $lAgentArray = GetAgentPtrArray() + For $i = 1 To $lAgentArray[0] + If $lAgentArray[$i] = $lPtr Then ContinueLoop + UpdateAgentPosByPtr($lAgentArray[$i], $lArrayX, $lArrayY) + $lDistance = ($lAgentX - $lArrayX) ^2 + ($lAgentY - $lArrayY) ^2 + If $lDistance < $lNearestDistance Then + $lNearestAgent = $lAgentArray[$i] + $lNearestDistance = $lDistance + EndIf + Next + Return SetExtended(Sqrt($lNearestDistance), $lNearestAgent) +EndFunc ;==>GetNearestAgentPtrToAgent + +;~ Description: Returns the nearest NPC to an agent. +Func GetNearestNPCPtrToAgent($aAgent = -2) + Local $lAgentX, $lAgentY, $lArrayX, $lArrayY + If IsPtr($aAgent) <> 0 Then + Local $lPtr = $aAgent + UpdateAgentPosByPtr($aAgent, $lAgentX, $lAgentY) + ElseIf IsDllStruct($aAgent) <> 0 Then + Local $lPtr = GetAgentPtr(DllStructGetData($aAgent, 'ID')) + $lAgentX = DllStructGetData($aAgent, 'X') + $lAgentY = DllStructGetData($aAgent, 'Y') + Else + Local $lPtr = GetAgentPtr($aAgent) + UpdateAgentPosByPtr($lPtr, $lAgentX, $lAgentY) + EndIf + Local $lNearestAgent, $lDistance, $lNearestDistance = 100000000 + Local $lAgentArray = GetAgentPtrArray(3, 0xDB, 6) + For $i = 1 To $lAgentArray[0] + If $lAgentArray[$i] = $lPtr Then ContinueLoop + UpdateAgentPosByPtr($lAgentArray[$i], $lArrayX, $lArrayY) + $lDistance = ($lAgentX - $lArrayX) ^2 + ($lAgentY - $lArrayY) ^2 + If $lDistance < $lNearestDistance Then + $lNearestAgent = $lAgentArray[$i] + $lNearestDistance = $lDistance + EndIf + Next + Return SetExtended(Sqrt($lNearestDistance), $lNearestAgent) +EndFunc ;==>GetNearestNPCPtrToAgent + +;~ Description: Returns the nearest enemy to an agent. +Func GetNearestEnemyPtrToAgent($aAgent = -2) + Local $lAgentX, $lAgentY, $lArrayX, $lArrayY + If IsPtr($aAgent) <> 0 Then + Local $lPtr = $aAgent + UpdateAgentPosByPtr($aAgent, $lAgentX, $lAgentY) + ElseIf IsDllStruct($aAgent) <> 0 Then + Local $lPtr = GetAgentPtr(DllStructGetData($aAgent, 'ID')) + $lAgentX = DllStructGetData($aAgent, 'X') + $lAgentY = DllStructGetData($aAgent, 'Y') + Else + Local $lPtr = GetAgentPtr($aAgent) + UpdateAgentPosByPtr($lPtr, $lAgentX, $lAgentY) + EndIf + Local $lNearestAgent, $lDistance, $lNearestDistance = 25000000 + Local $lAgentArray = GetAgentPtrArray(3) + For $i = 1 To $lAgentArray[0] + If $lAgentArray[$i] = $lPtr Then ContinueLoop + UpdateAgentPosByPtr($lAgentArray[$i], $lArrayX, $lArrayY) + $lDistance = ($lAgentX - $lArrayX) ^2 + ($lAgentY - $lArrayY) ^2 + If $lDistance < $lNearestDistance Then + $lNearestAgent = $lAgentArray[$i] + $lNearestDistance = $lDistance + EndIf + Next + Return SetExtended(Sqrt($lNearestDistance), $lNearestAgent) +EndFunc ;==>GetNearestEnemyPtrToAgent + +;~ Description: Returns the enemy farthest away from an agent within given max distance. +Func GetFarthestEnemyPtrToAgent($aMaxDistance = 1400, $aAgent = -2) + Local $lAgentX, $lAgentY, $lArrayX, $lArrayY + If IsPtr($aAgent) <> 0 Then + Local $lPtr = $aAgent + UpdateAgentPosByPtr($aAgent, $lAgentX, $lAgentY) + ElseIf IsDllStruct($aAgent) <> 0 Then + Local $lPtr = GetAgentPtr(DllStructGetData($aAgent, 'ID')) + $lAgentX = DllStructGetData($aAgent, 'X') + $lAgentY = DllStructGetData($aAgent, 'Y') + Else + Local $lPtr = GetAgentPtr($aAgent) + UpdateAgentPosByPtr($lPtr, $lAgentX, $lAgentY) + EndIf + Local $lFarthestAgent, $lDistance, $lFarthestDistance = 1 + Local $lMaxDistance = $aMaxDistance ^2 + Local $lAgentArray = GetAgentPtrArray(3) + For $i = 1 To $lAgentArray[0] + If $lAgentArray[$i] = $lPtr Then ContinueLoop + UpdateAgentPosByPtr($lAgentArray[$i], $lArrayX, $lArrayY) + $lDistance = ($lAgentX - $lArrayX) ^2 + ($lAgentY - $lArrayY) ^2 + If $lDistance > $lFarthestDistance And $lDistance < $lMaxDistance Then + $lFarthestAgent = $lAgentArray[$i] + $lFarthestDistance = $lDistance + EndIf + Next + Return SetExtended(Sqrt($lFarthestDistance), $lFarthestAgent) +EndFunc ;==>GetFarthestEnemyPtrToAgent + +;~ Description: Returns the nearest signpost to an agent. +Func GetNearestSignpostPtrToAgent($aAgent = -2) + Local $lAgentX, $lAgentY, $lArrayX, $lArrayY + If IsPtr($aAgent) <> 0 Then + Local $lPtr = $aAgent + UpdateAgentPosByPtr($aAgent, $lAgentX, $lAgentY) + ElseIf IsDllStruct($aAgent) <> 0 Then + Local $lPtr = GetAgentPtr(DllStructGetData($aAgent, 'ID')) + $lAgentX = DllStructGetData($aAgent, 'X') + $lAgentY = DllStructGetData($aAgent, 'Y') + Else + Local $lPtr = GetAgentPtr($aAgent) + UpdateAgentPosByPtr($lPtr, $lAgentX, $lAgentY) + EndIf + Local $lNearestAgent, $lDistance, $lNearestDistance = 100000000 + Local $lAgentArray = GetAgentPtrArray(1, 0x200) + For $i = 1 To $lAgentArray[0] + If $lAgentArray[$i] = $lPtr Then ContinueLoop + UpdateAgentPosByPtr($lAgentArray[$i], $lArrayX, $lArrayY) + $lDistance = ($lAgentX - $lArrayX) ^2 + ($lAgentY - $lArrayY) ^2 + If $lDistance < $lNearestDistance Then + $lNearestAgent = $lAgentArray[$i] + $lNearestDistance = $lDistance + EndIf + Next + Return SetExtended(Sqrt($lNearestDistance), $lNearestAgent) +EndFunc ;==>GetNearestSignpostPtrToAgent + +;~ Description: Returns the nearest item to an agent. +Func GetNearestItemPtrToAgent($aAgent = -2, $aCanPickUp = True) + Local $lAgentX, $lAgentY, $lArrayX, $lArrayY + If IsPtr($aAgent) <> 0 Then + Local $lPtr = $aAgent + UpdateAgentPosByPtr($aAgent, $lAgentX, $lAgentY) + ElseIf IsDllStruct($aAgent) <> 0 Then + Local $lPtr = GetAgentPtr(DllStructGetData($aAgent, 'ID')) + $lAgentX = DllStructGetData($aAgent, 'X') + $lAgentY = DllStructGetData($aAgent, 'Y') + Else + Local $lPtr = GetAgentPtr($aAgent) + UpdateAgentPosByPtr($lPtr, $lAgentX, $lAgentY) + EndIf + Local $lNearestAgent, $lDistance, $lNearestDistance = 100000000 + Local $lAgentArray = GetAgentPtrArray(1, 0x400) + For $i = 1 To $lAgentArray[0] + If $aCanPickUp And Not GetAssignedToMe($lAgentArray[$i]) Then ContinueLoop + If $lAgentArray[$i] = $lPtr Then ContinueLoop + UpdateAgentPosByPtr($lAgentArray[$i], $lArrayX, $lArrayY) + $lDistance = ($lAgentX - $lArrayX) ^2 + ($lAgentY - $lArrayY) ^2 + If $lDistance < $lNearestDistance Then + $lNearestAgent = $lAgentArray[$i] + $lNearestDistance = $lDistance + EndIf + Next + Return SetExtended(Sqrt($lNearestDistance), $lNearestAgent) +EndFunc ;==>GetNearestItemPtrToAgent +#EndRegion Nearest/FarthestToAgent + +#Region Near(est)ToCoords +;~ Description: Returns the nearest agent to a set of coordinates. +Func GetNearestAgentPtrToCoords($aX, $aY) + Local $lNearestAgent, $lNearestDistance = 100000000 + Local $lDistance, $lArrayX, $lArrayY + Local $lAgentArray = GetAgentPtrArray() + For $i = 1 To $lAgentArray[0] + UpdateAgentPosByPtr($lAgentArray[$i], $lArrayX, $lArrayY) + $lDistance = ($aX - $lArrayX) ^2 + ($aY - $lArrayY) ^2 + If $lDistance < $lNearestDistance Then + $lNearestAgent = $lAgentArray[$i] + $lNearestDistance = $lDistance + EndIf + Next + Return SetExtended(Sqrt($lNearestDistance), $lNearestAgent) +EndFunc ;==>GetNearestAgentPtrToCoords + +;~ Description: Returns the nearest NPC to a set of coordinates. +Func GetNearestNPCPtrToCoords($aX, $aY) + Local $lNearestAgent, $lNearestDistance = 100000000 + Local $lDistance, $lArrayX, $lArrayY + Local $lAgentArray = GetAgentPtrArray(3, 0xDB, 6) + For $i = 1 To $lAgentArray[0] + UpdateAgentPosByPtr($lAgentArray[$i], $lArrayX, $lArrayY) + $lDistance = ($aX - $lArrayX) ^2 + ($aY - $lArrayY) ^2 + If $lDistance < $lNearestDistance Then + $lNearestAgent = $lAgentArray[$i] + $lNearestDistance = $lDistance + EndIf + Next + Return SetExtended(Sqrt($lNearestDistance), $lNearestAgent) +EndFunc ;==>GetNearestNPCPtrToCoords + +;~ Description: Returns the nearest NPC to a set of coordinates. +Func GetNearestEnemyPtrToCoords($aX, $aY) + Local $lNearestAgent, $lNearestDistance = 100000000 + Local $lDistance, $lArrayX, $lArrayY + Local $lAgentArray = GetAgentPtrArray(3, 0xDB, 3) + For $i = 1 To $lAgentArray[0] + UpdateAgentPosByPtr($lAgentArray[$i], $lArrayX, $lArrayY) + $lDistance = ($aX - $lArrayX) ^2 + ($aY - $lArrayY) ^2 + If $lDistance < $lNearestDistance Then + $lNearestAgent = $lAgentArray[$i] + $lNearestDistance = $lDistance + EndIf + Next + Return SetExtended(Sqrt($lNearestDistance), $lNearestAgent) +EndFunc ;==>GetNearestEnemyPtrToCoords + +;~ Description: Returns a ptr to an enemy agent in range of coordinates. If there is no agent in range, returns 0. +Func GetEnemyPtrNearCoords($aX, $aY, $aRange = 1000) + $aRange = $aRange ^2 + Local $lDistance, $lArrayX, $lArrayY + Local $lAgentArray = GetAgentPtrArray(3, 0xDB, 3) + For $i = 1 To $lAgentArray[0] + UpdateAgentPosByPtr($lAgentArray[$i], $lArrayX, $lArrayY) + $lDistance = ($aX - $lArrayX) ^2 + ($aY - $lArrayY) ^2 + If $lDistance < $aRange Then + Return SetExtended(Sqrt($lDistance), $lAgentArray[$i]) + EndIf + Next +EndFunc ;==>GetEnemyPtrNearCoords + +;~ Description: Returns the nearest signpost to a set of coordinates. +Func GetNearestSignpostPtrToCoords($aX, $aY) + Local $lNearestAgent = 0 + Local $lNearestDistance = 100000000 + Local $lDistance, $lArrayX, $lArrayY + Local $lAgentArray = GetAgentPtrArray(1, 0x200) + For $i = 1 To $lAgentArray[0] + UpdateAgentPosByPtr($lAgentArray[$i], $lArrayX, $lArrayY) + $lDistance = ($aX - $lArrayX) ^2 + ($aY - $lArrayY) ^2 + If $lDistance < $lNearestDistance Then + $lNearestAgent = $lAgentArray[$i] + $lNearestDistance = $lDistance + EndIf + Next + Return SetExtended(Sqrt($lNearestDistance), $lNearestAgent) +EndFunc ;==>GetNearestSignpostPtrToCoords + +;~ Description: Returns nearest item to coordinates. +Func GetNearestItemPtrToCoords($aX, $aY) + Local $lNearestAgent, $lNearestDistance = 100000000 + Local $lDistance, $lArrayX, $lArrayY + Local $lAgentArray = GetAgentPtrArray(1, 0x400) + For $i = 1 To $lAgentArray[0] + UpdateAgentPosByPtr($lAgentArray[$i], $lArrayX, $lArrayY) + $lDistance = ($aX - $lArrayX) ^2 + ($aY - $lArrayY) ^2 + If $lDistance < $lNearestDistance Then + $lNearestAgent = $lAgentArray[$i] + $lNearestDistance = $lDistance + EndIf + Next + Return SetExtended(Sqrt($lNearestDistance), $lNearestAgent) +EndFunc +#EndRegion Near(est)ToCoords +#EndRegion Ptr + +#Region Interaction +;~ Description: Attack an agent. +Func Attack($aAgent, $aCallTarget = False) + If IsPtr($aAgent) <> 0 Then + Local $lAgentID = MemoryRead($aAgent + 44, 'long') + ElseIf IsDllStruct($aAgent) <> 0 Then + Local $lAgentID = DllStructGetData($aAgent, 'ID') + Else + Local $lAgentID = ConvertID($aAgent) + EndIf + Return SendPacket(0xC, $CtoGS_MSG_Attack, $lAgentID, $aCallTarget) +EndFunc ;==>Attack + +;~ Description: Use switch/boss lock/etc, waits till in range. +Func UseSignpost($aX, $aY, $aMe = GetAgentPtr(-2)) + Return GoToSignpost(GetNearestSignpostPtrToCoords($aX, $aY), $aMe) +EndFunc ;==>UseSignpost + +;~ Description: Turn character to the left. +Func TurnLeft($aTurn) + If $aTurn Then + Return PerformAction(0xA2, 0x18) + Else + Return PerformAction(0xA2, 0x1A) + EndIf +EndFunc ;==>TurnLeft + +;~ Description: Turn character to the right. +Func TurnRight($aTurn) + If $aTurn Then + Return PerformAction(0xA3, 0x18) + Else + Return PerformAction(0xA3, 0x1A) + EndIf +EndFunc ;==>TurnRight + +;~ Description: Move backwards. +Func MoveBackward($aMove) + If $aMove Then + Return PerformAction(0xAC, 0x18) + Else + Return PerformAction(0xAC, 0x1A) + EndIf +EndFunc ;==>MoveBackward + +;~ Description: Run forwards. +Func MoveForward($aMove) + If $aMove Then + Return PerformAction(0xAD, 0x18) + Else + Return PerformAction(0xAD, 0x1A) + EndIf +EndFunc ;==>MoveForward + +;~ Description: Strafe to the left. +Func StrafeLeft($aStrafe) + If $aStrafe Then + Return PerformAction(0x91, 0x18) + Else + Return PerformAction(0x91, 0x1A) + EndIf +EndFunc ;==>StrafeLeft + +;~ Description: Strafe to the right. +Func StrafeRight($aStrafe) + If $aStrafe Then + Return PerformAction(0x92, 0x18) + Else + Return PerformAction(0x92, 0x1A) + EndIf +EndFunc ;==>StrafeRight + +;~ Description: Auto-run. +Func ToggleAutoRun() + Return PerformAction(0xB7, 0x18) +EndFunc ;==>ToggleAutoRun + +;~ Description: Turn around. +Func ReverseDirection() + Return PerformAction(0xB1, 0x18) +EndFunc ;==>ReverseDirection + +;~ Description: Cancel current action. +Func CancelAction() + Return SendPacket(0x4, $CtoGS_MSG_CancelAction) +EndFunc ;==>CancelAction + +;~ Description: Same as hitting spacebar. +Func ActionInteract() + Return PerformAction(0x80, 0x18) +EndFunc ;==>ActionInteract + +;~ Description: Follow a player. +Func ActionFollow() + Return PerformAction(0xCC, 0x18) +EndFunc ;==>ActionFollow + +;~ Description: Drop environment object. +Func DropBundle() + Return PerformAction(0xCD, 0x18) +EndFunc ;==>DropBundle + +;~ Description: Suppress action. +Func SuppressAction($aSuppress) + If $aSuppress Then + Return PerformAction(0xD0, 0x18) + Else + Return PerformAction(0xD0, 0x1A) + EndIf +EndFunc ;==>SuppressAction + +;~ Description: Open a chest. +Func OpenChest() + Return SendPacket(0x8, $CtoGS_MSG_OpenChest, 2) +EndFunc ;==>OpenChest + +;~ Description: Change weapon sets. +Func ChangeWeaponSet($aSet) + Return PerformAction(0x80 + $aSet, 0x18) +EndFunc ;==>ChangeWeaponSet + +;~ Description: Open a dialog. +Func Dialog($aDialogID) + Return SendPacket(0x8, $CtoGS_MSG_Dialog, $aDialogID) +EndFunc ;==>Dialog +#EndRegion + +#Region Targeting +;~ Description: Returns current target ptr. +Func GetCurrentTargetPtr() + Local $lCurrentTargetID = MemoryRead($mCurrentTarget) + If $lCurrentTargetID = 0 Then Return + $AgentBasePtr = MemoryRead($mAgentBase, 'ptr') + Return MemoryRead($AgentBasePtr + 4 * $lCurrentTargetID, 'ptr') +EndFunc ;==>GetCurrentTarget + +;~ Description: Returns current target ID. +Func GetCurrentTargetID() + Return MemoryRead($mCurrentTarget) +EndFunc ;==>GetCurrentTargetID + +;~ Description: Target an agent. +Func ChangeTarget($aAgent) + If IsPtr($aAgent) <> 0 Then + Local $lAgentID = MemoryRead($aAgent + 44, 'long') + ElseIf IsDllStruct($aAgent) <> 0 Then + Local $lAgentID = DllStructGetData($aAgent, 'ID') + Else + Local $lAgentID = ConvertID($aAgent) + EndIf + DllStructSetData($mChangeTarget, 2, $lAgentID) + Return Enqueue($mChangeTargetPtr, 8) +EndFunc ;==>ChangeTarget + +;~ Description: Call target. +Func CallTarget($aTarget) + If IsPtr($aTarget) <> 0 Then + Local $lTargetID = MemoryRead($aTarget + 44, 'long') + ElseIf IsDllStruct($aTarget) <> 0 Then + Local $lTargetID = DllStructGetData($aTarget, 'ID') + Else + Local $lTargetID = ConvertID($aTarget) + EndIf + Return SendPacket(0xC, $CtoGS_MSG_CallTarget, 0xA, $lTargetID) +EndFunc ;==>CallTarget + +;~ Description: Clear current target. +Func ClearTarget() + Return PerformAction(0xE3, 0x18) +EndFunc ;==>ClearTarget + +;~ Description: Target the nearest enemy. +Func TargetNearestEnemy() + Return PerformAction(0x93, 0x18) +EndFunc ;==>TargetNearestEnemy + +;~ Description: Target the next enemy. +Func TargetNextEnemy() + Return PerformAction(0x95, 0x18) +EndFunc ;==>TargetNextEnemy + +;~ Description: Target the next party member. +Func TargetPartyMember($aNumber) + If $aNumber > 0 And $aNumber < 13 Then Return PerformAction(0x95 + $aNumber, 0x18) +EndFunc ;==>TargetPartyMember + +;~ Description: Target the previous enemy. +Func TargetPreviousEnemy() + Return PerformAction(0x9E, 0x18) +EndFunc ;==>TargetPreviousEnemy + +;~ Description: Target the called target. +Func TargetCalledTarget() + Return PerformAction(0x9F, 0x18) +EndFunc ;==>TargetCalledTarget + +;~ Description: Target yourself. +Func TargetSelf() + Return PerformAction(0xA0, 0x18) +EndFunc ;==>TargetSelf + +;~ Description: Target the nearest ally. +Func TargetNearestAlly() + Return PerformAction(0xBC, 0x18) +EndFunc ;==>TargetNearestAlly + +;~ Description: Target the nearest item. +Func TargetNearestItem() + Return PerformAction(0xC3, 0x18) +EndFunc ;==>TargetNearestItem + +;~ Description: Target the next item. +Func TargetNextItem() + Return PerformAction(0xC4, 0x18) +EndFunc ;==>TargetNextItem + +;~ Description: Target the previous item. +Func TargetPreviousItem() + Return PerformAction(0xC5, 0x18) +EndFunc ;==>TargetPreviousItem + +;~ Description: Target the next party member. +Func TargetNextPartyMember() + Return PerformAction(0xCA, 0x18) +EndFunc ;==>TargetNextPartyMember + +;~ Description: Target the previous party member. +Func TargetPreviousPartyMember() + Return PerformAction(0xCB, 0x18) +EndFunc ;==>TargetPreviousPartyMember +#EndRegion Targeting + +#Region Information +;~ Description: Internal use for handing -1 and -2 agent IDs. +Func ConvertID($aID) + Switch $aID + Case -2 + Return MemoryRead($mMyID) + Case -1 + Return MemoryRead($mCurrentTarget) + Case Else + Return $aID + EndSwitch +EndFunc ;==>ConvertID + +;~ Description: Returns the ID of an agent. +Func GetAgentID($aAgent) + If IsPtr($aAgent) <> 0 Then + Local $lAgentID = MemoryRead($aAgent + 44, 'long') + ElseIf IsDllStruct($aAgent) <> 0 Then + Local $lAgentID = DllStructGetData($aAgent, 'ID') + Else + Local $lAgentID = ConvertID($aAgent) + EndIf + If $lAgentID = 0 Then Return '' + Return $lAgentID +EndFunc ;==>GetAgentID + +;~ Description: Returns your agent ID. +Func GetMyID() + Return MemoryRead($mMyID) +EndFunc ;==>GetMyID + +;~ Description: Updates X and Y variables with current x and y coordinate values. +;~ Author: 4D1. +Func UpdateAgentPosByPtr($aAgentPtr, ByRef $aX, ByRef $aY) + Local $lStruct = MemoryReadStruct($aAgentPtr + 116,'float X;float Y') + $aX = DllStructGetData($lStruct,'X') + $aY = DllStructGetData($lStruct,'Y') +EndFunc ;==>UpdateAgentPosByPtr + +;~ Description: Updates MoveX and MoveY variables with current values. +Func UpdateAgentMoveByPtr($aAgentPtr, ByRef $aMoveX, ByRef $aMoveY) + Local $lStruct = MemoryReadStruct($aAgentPtr + 160,'float MoveX;float MoveY') + $aMoveX = DllStructGetData($lStruct,'MoveX') + $aMoveY = DllStructGetData($lStruct,'MoveY') +EndFunc ;==>UpdateAgentPosByPtr + +;~ Description: Returns number of agents currently loaded. +Func GetMaxAgents() + Return MemoryRead($mMaxAgents) +EndFunc ;==>GetMaxAgents + +;~ Description: Test if an agent exists. +Func GetAgentExists($aAgentID) + If $aAgentID = -2 Then Return MemoryRead($mLoggedIn) + If IsPtr($aAgentID) <> 0 Then + Return $aAgentID <> 0 And MemoryRead($aAgentID + 44, 'long') <= MemoryRead($mMaxAgents) + Else + Return GetAgentPtr($aAgentID) > 0 And $aAgentID <= MemoryRead($mMaxAgents) + EndIf +EndFunc ;==>GetAgentExists + +;~ Description: Returns the target of an agent. +Func GetTarget($aAgent) + If IsPtr($aAgent) <> 0 Then + Local $lAgentID = MemoryRead($aAgent + 44, 'long') + ElseIf IsDllStruct($aAgent) <> 0 Then + Local $lAgentID = DllStructGetData($aAgent, 'ID') + Else + Local $lAgentID = ConvertID($aAgent) + EndIf + Return MemoryRead(GetValue('TargetLogBase') + 4 * $lAgentID) +EndFunc ;==>GetTarget + +;~ Description: Returns agent by name. +Func GetAgentIDByName($aName) + If $mUseStringLog = False Then Return + Local $lName, $lAddress + For $i = 1 To MemoryRead($mMaxAgents) + $lAddress = $mStringLogBase + 256 * $i + $lName = MemoryRead($lAddress, 'wchar [128]') + If $lName = '' Then ContinueLoop + $lName = StringRegExpReplace($lName, '[<]{1}([^>]+)[>]{1}', '') + If StringInStr($lName, $aName) <> 0 Then Return $i + Next + DisplayAll(True) + Sleep(100) + DisplayAll(False) + DisplayAll(True) + Sleep(100) + DisplayAll(False) + For $i = 1 To MemoryRead($mMaxAgents) + $lAddress = $mStringLogBase + 256 * $i + $lName = MemoryRead($lAddress, 'wchar [128]') + If $lName = '' Then ContinueLoop + $lName = StringRegExpReplace($lName, '[<]{1}([^>]+)[>]{1}', '') + If StringInStr($lName, $aName) <> 0 Then Return $i + Next +EndFunc ;==>GetAgentIDByName + +;~ Description: Checks number of enemies in range, can check specific Enemies with Playernumber. +Func GetNumberOfFoesInRangeOfAgent($aAgent = GetAgentPtr(-2), $aMaxDistance = 4000, $aPlayerNum = 0) + Local $lMaxDistance = $aMaxDistance ^2 + If IsPtr($aAgent) <> 0 Then + Local $lAgentPtr = $aAgent + ElseIf IsDllStruct($aAgent) <> 0 Then + Local $lAgentPtr = GetAgentPtr(DllStructGetData($aAgent, 'ID')) + Else + Local $lAgentPtr = GetAgentPtr($aAgent) + EndIf + Local $lDistance, $lCount = 0 + Local $lTargetTypeArray = GetAgentPtrArray(3) + For $i = 1 To $lTargetTypeArray[0] + If $aPlayerNum <> 0 And MemoryRead($lTargetTypeArray[$i] + 244, 'word') <> $aPlayerNum Then ContinueLoop + $lDistance = GetPseudoDistance($lTargetTypeArray[$i], $lAgentPtr) + If $lDistance < $lMaxDistance Then + $lCount += 1 + EndIf + Next + Return $lCount +EndFunc ;==>GetNumberOfFoesInRangeOfAgent + +;~ Description: Checks number of allies in range, can check specific allies with ModelID. +Func GetNumberOfAlliesInRangeOfAgent($aAgent = GetAgentPtr(-2), $aMaxDistance = 4000, $aPlayerNum = 0) + Local $lMaxDistance = $aMaxDistance ^2 + If IsPtr($aAgent) <> 0 Then + Local $lAgentPtr = $aAgent + ElseIf IsDllStruct($aAgent) <> 0 Then + Local $lAgentPtr = GetAgentPtr(DllStructGetData($aAgent, 'ID')) + Else + Local $lAgentPtr = GetAgentPtr($aAgent) + EndIf + Local $lDistance, $lCount = 0 + Local $lTargetTypeArray = GetAgentPtrArray(2, 0xDB, 1) + For $i = 1 To $lTargetTypeArray[0] + If $aPlayerNum <> 0 And MemoryRead($lTargetTypeArray[$i] + 244, 'word') <> $aPlayerNum Then ContinueLoop + $lDistance = GetPseudoDistance($lTargetTypeArray[$i], $lAgentPtr) + If $lDistance < $lMaxDistance Then + $lCount += 1 + EndIf + Next + Return $lCount +EndFunc ;==>GetNumberOfAlliesInRangeOfAgent + +;~ Description: Returns player with most enemies around them within range $aMaxDistance. +Func GetVIP($aMaxDistance = 1350) + Local $lAgentArray = GetAgentPtrArray() + Return GetVIP_($lAgentArray, $aMaxDistance) +EndFunc ;==>GetVIP + +;~ Description: Returns player with most enemies around them within range $aMaxDistance. +Func GetVIP_(ByRef $aAgentArray, $aMaxDistance = 1350) + If $aAgentArray[0] = 0 Then Return + Local $lVIPPtr, $lAllegiance, $lCount = 0 + Local $lEnemyArray[$aAgentArray[0] + 1][3] + $lEnemyArray[0][0] = 0 + Local $lAllyArray[$aAgentArray[0] + 1][3] + $lAllyArray[0][0] = 0 + For $i = 1 To $aAgentArray[0] + $lAllegiance = MemoryRead($aAgentArray[$i] + 433, 'byte') + Switch $lAllegiance + Case 1, 6 + $lAllyArray[0][0] = $lAllyArray[0][0] + 1 + $lAllyArray[$lAllyArray[0][0]][0] = $aAgentArray[$i] + $lAllyArray[$lAllyArray[0][0]][1] = MemoryRead($aAgentArray[$i] + 116, 'float') + $lAllyArray[$lAllyArray[0][0]][2] = MemoryRead($aAgentArray[$i] + 120, 'float') + Case 3 + $lEnemyArray[0][0] = $lEnemyArray[0][0] + 1 + $lEnemyArray[$lEnemyArray[0][0]][0] = $aAgentArray[$i] + $lEnemyArray[$lEnemyArray[0][0]][1] = MemoryRead($aAgentArray[$i] + 116, 'float') + $lEnemyArray[$lEnemyArray[0][0]][2] = MemoryRead($aAgentArray[$i] + 120, 'float') + EndSwitch + Next + For $i = 1 To $lAllyArray[0][0] - 1 + Local $lEnemies = 0 + Local $lMin = $lAllyArray[$i][1] - $aMaxDistance + Local $lMax = $lAllyArray[$i][1] + $aMaxDistance + For $j = 1 To $lEnemyArray[0][0] - 1 + If $lEnemyArray[$j][1] <= $lMax And $lEnemyArray[$j][1] > $lMin Then + If ComputeDistance($lAllyArray[$i][1], $lAllyArray[$i][2], $lEnemyArray[$j][1], $lEnemyArray[$j][2]) <= $aMaxDistance Then $lEnemies += 1 + EndIf + Next + If $lEnemies > $lCount Then + $lVIPPtr = $lAllyArray[$i][0] + $lCount = $lEnemies + EndIf + Next + Return $lVIPPtr +EndFunc ;==>GetVIP_ + +;~ Description: Returns amount of players in outpost that are loaded into client memory. +;~ Includes oneself. +Func GetNumberOfPlayersInOutpost() + Local $lCount = 0 + Local $lAgentArray = GetAgentPtrArray(2, 0xDB, 1) + For $i = 0 To $lAgentArray[0] + If MemoryRead($lAgentArray[$i] + 384, 'long') <> 0 Then $lCount += 1 + Next + Return $lCount +EndFunc ;==>GetNumberOfPlayersInOutpost + +#Region Type +;~ Description: Tests if an agent is living. +Func GetIsLiving($aAgent) + If IsPtr($aAgent) <> 0 Then + Return MemoryRead($aAgent + 156, 'long') = 0xDB + ElseIf IsDllStruct($aAgent) <> 0 Then + Return DllStructGetData($aAgent, 'Type') = 0xDB + Else + Return MemoryRead(GetAgentPtr($aAgent) + 156, 'long') = 0xDB + EndIf +EndFunc ;==>GetIsLiving + +;~ Description: Tests if an agent is a signpost/chest/etc. +Func GetIsStatic($aAgent) + If IsPtr($aAgent) <> 0 Then + Return MemoryRead($aAgent + 156, 'long') = 0x200 + ElseIf IsDllStruct($aAgent) <> 0 Then + Return DllStructGetData($aAgent, 'Type') = 0x200 + Else + Return MemoryRead(GetAgentPtr($aAgent) + 156, 'long') = 0x200 + EndIf +EndFunc ;==>GetIsStatic + +;~ Description: Tests if an agent is an item. +Func GetIsMovable($aAgent) + If IsPtr($aAgent) <> 0 Then + Return MemoryRead($aAgent + 156, 'long') = 0x400 + ElseIf IsDllStruct($aAgent) <> 0 Then + Return DllStructGetData($aAgent, 'Type') = 0x400 + Else + Return MemoryRead(GetAgentPtr($aAgent) + 156, 'long') = 0x400 + EndIf +EndFunc ;==>GetIsMovable + +;~ Description: Checks if agentID is summoned. +Func IsSummonedCreature($aAgentID) + If IsPtr($aAgentID) <> 0 Then + Local $lAgentMID = MemoryRead($aAgentID + 244, 'word') + Else + Local $lAgentMID = MemoryRead(GetAgentPtr($aAgentID) + 244, 'word') + EndIf + Switch $lAgentMID + Case 1377 ; Pet-Elder Wolf + Return True + Case 2226 to 2228 ; bone horror, fiend, minion + Return True + Case 2870 to 2878 ; ranger spirits part 1 + Return True + Case 2881 to 2884 ; ranger spirits part 2 + Return True + Case 3962, 3963 ; corrupted scales and spores + Return True + Case 4205, 4206 ; flesh golem, vampiric horror + Return True + Case 4209 to 4228 ; ritualist spirits part 1 and one ranger spirit + Return True + Case 4230 to 4235 ; ranger spirits part 3 + Return True + Case 5709 to 5719 ; necro, ranger and ritualist spirits + Return True + Case 5848 to 5850 ; EVA, ritualist spirits + Return True + Case Else + Return False + EndSwitch +EndFunc + +;~ Description: Returns true if agent is a minion. +Func IsMinion($aAgentID) + If IsPtr($aAgentID) <> 0 Then + Local $lAgentMID = MemoryRead($aAgentID + 244, 'word') + Else + Local $lAgentMID = MemoryRead(GetAgentPtr($aAgentID) + 244, 'word') + EndIf + Switch $lAgentMID + Case 2226, 2227, 2228 ; bone horror, fiend, minion + Return True + Case 4205, 4206 ; flesh golem, vampiric horror + Return True + Case 5709, 5710 ; shambling horror, jagged horror + Return True + Case Else + Return False + EndSwitch +EndFunc +#EndRegion + +#Region hp, energy, coordinates +;~ Description: Agents X Location +Func XLocation($aAgent = GetAgentPtr(-2)) + If IsPtr($aAgent) <> 0 Then + Return MemoryRead($aAgent + 116, 'float') + ElseIf IsDllStruct($aAgent) <> 0 Then + Return DllStructGetData($aAgent, 'X') + Else + Return MemoryRead(GetAgentPtr($aAgent) + 116, 'float') + EndIf +EndFunc ;==>XLocation + +;~ Description: Agents Y Location +Func YLocation($aAgent = GetAgentPtr(-2)) + If IsPtr($aAgent) <> 0 Then + Return MemoryRead($aAgent + 120, 'float') + ElseIf IsDllStruct($aAgent) <> 0 Then + Return DllStructGetData($aAgent, 'Y') + Else + Return MemoryRead(GetAgentPtr($aAgent) + 120, 'float') + EndIf +EndFunc ;==>YLocation + +;~ Description: Agents X and Y Location +Func XandYLocation($aAgent = GetAgentPtr(-2)) + Local $lLocation[2] + If IsPtr($aAgent) <> 0 Then + UpdateAgentPosByPtr($aAgent, $lLocation[0], $lLocation[1]) + ElseIf IsDllStruct($aAgent) <> 0 Then + $lLocation[0] = DllStructGetData($aAgent, 'X') + $lLocation[1] = DllStructGetData($aAgent, 'Y') + Else + UpdateAgentPosByPtr(GetAgentPtr($aAgent), $lLocation[0], $lLocation[1]) + EndIf + Return $lLocation +EndFunc ;==>XandYLocation + +;~ Description: Returns energy of an agent. (Only self/heroes) +Func GetEnergy($aAgent = GetAgentPtr(-2)) + If IsPtr($aAgent) <> 0 Then + Local $lStruct = MemoryReadStruct($aAgent + 284, 'float EnergyPercent;long MaxEnergy') + Return DllStructGetData($lStruct, 'EnergyPercent') * DllStructGetData($lStruct, 'MaxEnergy') + ElseIf IsDllStruct($aAgent) <> 0 Then + Return DllStructGetData($aAgent, 'EnergyPercent') * DllStructGetData($aAgent, 'MaxEnergy') + Else + Local $lPtr = GetAgentPtr($aAgent) + Local $lStruct = MemoryReadStruct($lPtr + 284, 'float EnergyPercent;long MaxEnergy') + Return DllStructGetData($lStruct, 'EnergyPercent') * DllStructGetData($lStruct, 'MaxEnergy') + EndIf +EndFunc ;==>GetEnergy + +;~ Description: Returns health of an agent. (Must have caused numerical change in health) +Func GetHealth($aAgent = GetAgentPtr(-2)) + If IsPtr($aAgent) <> 0 Then + Local $lStruct = MemoryReadStruct($aAgent + 304, 'float HP;long MaxHP') + Return DllStructGetData($lStruct, 'HP') * DllStructGetData($lStruct, 'MaxHP') + ElseIf IsDllStruct($aAgent) <> 0 Then + Return DllStructGetData($aAgent, 'HP') * DllStructGetData($aAgent, 'MaxHP') + Else + Local $lStruct = MemoryReadStruct(GetAgentPtr($aAgent) + 304, 'float HP;long MaxHP') + Return DllStructGetData($lStruct, 'HP') * DllStructGetData($lStruct, 'MaxHP') + EndIf +EndFunc ;==>GetHealth + +;~ Description: Returns moving from agent movement struct. +Func GetMoving($aAgentID) + Local $lAgentID = ConvertID($aAgentID) + Local Static $lPtr = MemoryRead($mAgentMovement + 4 * $lAgentID) + If MemoryRead($lPtr + 16, 'long') <> $aAgentID Then + $mAgentMovement = GetAgentMovementPtr() + $lPtr = MemoryRead($mAgentMovement + 4 * $lAgentID) + EndIf + Return MemoryRead($lPtr + 60, 'long') +EndFunc + +;~ Description: Checks if GetMoving stays 0 for a period of time. +Func GetIsRubberbanding($aAgentID, $aTime, $aPtr = GetAgentPtr($aAgentID)) + Local $lAgentID = ConvertID($aAgentID) + Local Static $lPtr = MemoryRead($mAgentMovement + 4 * $lAgentID) + If MemoryRead($lPtr + 16, 'long') <> $aAgentID Then + $mAgentMovement = GetAgentMovementPtr() + $lPtr = MemoryRead($mAgentMovement + 4 * $lAgentID) + EndIf + Local $lMoveX, $lMoveY + Local $lTimer = TimerInit() + Do + UpdateAgentMoveByPtr($aPtr, $lMoveX, $lMoveY) + If $lMoveX = 0 And $lMoveY = 0 Then Return False ; standing still... not actually rubberbanding + If MemoryRead($lPtr + 60, 'long') <> 0 Then Return False ; moving + Sleep(50) + Until TimerDiff($lTimer) > $aTime + Return True +EndFunc + +;~ Description: Tests if an agent is moving. Uses agent struct data. +Func GetIsMoving($aAgent = GetAgentPtr(-2), $aTimer = 0) + If IsPtr($aAgent) <> 0 Then + Local $lPtr = $aAgent + ElseIf IsDllStruct($aAgent) <> 0 Then + If DllStructGetData($aAgent, 'MoveX') <> 0 Or DllStructGetData($aAgent, 'MoveY') <> 0 Then Return True + Else + Local $lPtr = GetAgentPtr($aAgent) + EndIf + Local $lMoveX, $lMoveY + Local $lTimer = TimerInit() + If $aTimer <> 0 Then + Do + UpdateAgentMoveByPtr($lPtr, $lMoveX, $lMoveY) + If $lMoveX <> 0 Or $lMoveY <> 0 Then Return True + Sleep(50) + Until TimerDiff($lTimer) > $aTimer + Else + UpdateAgentMoveByPtr($lPtr, $lMoveX, $lMoveY) + If $lMoveX <> 0 Or $lMoveY <> 0 Then Return True + EndIf +EndFunc ;==>GetIsMoving +#EndRegion + +#Region State +;~ Description: Tests if an agent is knocked down. +Func GetIsKnocked($aAgent = GetAgentPtr(-2)) + If IsPtr($aAgent) <> 0 Then + Return MemoryRead($aAgent + 340, 'long') = 0x450 + ElseIf IsDllStruct($aAgent) <> 0 Then + Return DllStructGetData($aAgent, 'ModelState') = 0x450 + Else + Return MemoryRead(GetAgentPtr($aAgent) + 340, 'long') = 0x450 + EndIf +EndFunc ;==>GetIsKnocked + +;~ Description: Tests if an agent is attacking. +Func GetIsAttacking($aAgent = GetAgentPtr(-2)) + Local $lModelState + If IsPtr($aAgent) <> 0 Then + $lModelState = MemoryRead($aAgent + 340, 'long') + ElseIf IsDllStruct($aAgent) <> 0 Then + $lModelState = DllStructGetData($aAgent, 'ModelState') + Else + $lModelState = MemoryRead(GetAgentPtr($aAgent) + 340, 'long') + EndIf + Switch $lModelState + Case 0x60 ; Is Attacking + Return True + Case 0x440 ; Is Attacking + Return True + Case 0x460 ; Is Attacking + Return True + EndSwitch +EndFunc ;==>GetIsAttacking + +;~ Description: Tests if an agent is casting. +Func GetIsCasting($aAgent = GetAgentPtr(-2)) + If IsPtr($aAgent) <> 0 Then + Return MemoryRead($aAgent + 436, 'word') <> 0 + ElseIf IsDllStruct($aAgent) <> 0 Then + Return DllStructGetData($aAgent, 'Skill') <> 0 + Else + Return MemoryRead(GetAgentPtr($aAgent) + 436, 'word') <> 0 + EndIf +EndFunc ;==>GetIsCasting +#EndRegion + +#Region Effects +;~ Description: Tests if an agent is bleeding. +Func GetIsBleeding($aAgent) + If IsPtr($aAgent) <> 0 Then + Return BitAND(MemoryRead($aAgent + 312, 'long'), 0x0001) > 0 + ElseIf IsDllStruct($aAgent) <> 0 Then + Return BitAND(DllStructGetData($aAgent, 'Effects'), 0x0001) > 0 + Else + Return BitAND(MemoryRead(GetAgentPtr($aAgent) + 312, 'long'), 0x0001) > 0 + EndIf +EndFunc ;==>GetIsBleeding + +;~ Description: Tests if an agent has a condition. +Func GetHasCondition($aAgent) + If IsPtr($aAgent) <> 0 Then + Return BitAND(MemoryRead($aAgent + 312, 'long'), 0x0002) > 0 + ElseIf IsDllStruct($aAgent) <> 0 Then + Return BitAND(DllStructGetData($aAgent, 'Effects'), 0x0002) > 0 + Else + Return BitAND(MemoryRead(GetAgentPtr($aAgent) + 312, 'long'), 0x0002) > 0 + EndIf +EndFunc ;==>GetHasCondition + +;~ Description: Tests if an agent is dead. +Func GetIsDead($aAgent = GetAgentPtr(-2)) + If IsPtr($aAgent) <> 0 Then + Return BitAND(MemoryRead($aAgent + 312, 'long'), 0x0010) > 0 + ElseIf IsDllStruct($aAgent) <> 0 Then + Return BitAND(DllStructGetData($aAgent, 'Effects'), 0x0010) > 0 + Else + Return BitAND(MemoryRead(GetAgentPtr($aAgent) + 312, 'long'), 0x0010) > 0 + EndIf +EndFunc ;==>GetIsDead + +;~ Description: Tests if an agent has a deep wound. +Func GetHasDeepWound($aAgent) + If IsPtr($aAgent) <> 0 Then + Return BitAND(MemoryRead($aAgent + 312, 'long'), 0x0020) > 0 + ElseIf IsDllStruct($aAgent) <> 0 Then + Return BitAND(DllStructGetData($aAgent, 'Effects'), 0x0020) > 0 + Else + Return BitAND(MemoryRead(GetAgentPtr($aAgent) + 312, 'long'), 0x0020) > 0 + EndIf +EndFunc ;==>GetHasDeepWound + +;~ Description: Tests if an agent is poisoned. +Func GetIsPoisoned($aAgent) + If IsPtr($aAgent) <> 0 Then + Return BitAND(MemoryRead($aAgent + 312, 'long'), 0x0040) > 0 + ElseIf IsDllStruct($aAgent) <> 0 Then + Return BitAND(DllStructGetData($aAgent, 'Effects'), 0x0040) > 0 + Else + Return BitAND(MemoryRead(GetAgentPtr($aAgent) + 312, 'long'), 0x0040) > 0 + EndIf +EndFunc ;==>GetIsPoisoned + +;~ Description: Tests if an agent is enchanted. +Func GetIsEnchanted($aAgent) + If IsPtr($aAgent) <> 0 Then + Return BitAND(MemoryRead($aAgent + 312, 'long'), 0x0080) > 0 + ElseIf IsDllStruct($aAgent) <> 0 Then + Return BitAND(DllStructGetData($aAgent, 'Effects'), 0x0080) > 0 + Else + Return BitAND(MemoryRead(GetAgentPtr($aAgent) + 312, 'long'), 0x0080) > 0 + EndIf +EndFunc ;==>GetIsEnchanted + +;~ Description: Tests if an agent has a degen hex. +Func GetHasDegenHex($aAgent) + If IsPtr($aAgent) <> 0 Then + Return BitAND(MemoryRead($aAgent + 312, 'long'), 0x0400) > 0 + ElseIf IsDllStruct($aAgent) <> 0 Then + Return BitAND(DllStructGetData($aAgent, 'Effects'), 0x0400) > 0 + Else + Return BitAND(MemoryRead(GetAgentPtr($aAgent) + 312, 'long'), 0x0400) > 0 + EndIf +EndFunc ;==>GetHasDegenHex + +;~ Description: Tests if an agent is hexed. +Func GetHasHex($aAgent) + If IsPtr($aAgent) <> 0 Then + Return BitAND(MemoryRead($aAgent + 312, 'long'), 0x0800) > 0 + ElseIf IsDllStruct($aAgent) <> 0 Then + Return BitAND(DllStructGetData($aAgent, 'Effects'), 0x0800) > 0 + Else + Return BitAND(MemoryRead(GetAgentPtr($aAgent) + 312, 'long'), 0x0800) > 0 + EndIf +EndFunc ;==>GetHasHex + +;~ Description: Tests if an agent has a weapon spell. +Func GetHasWeaponSpell($aAgent) + If IsPtr($aAgent) <> 0 Then + Return BitAND(MemoryRead($aAgent + 312, 'long'), 0x8000) > 0 + ElseIf IsDllStruct($aAgent) <> 0 Then + Return BitAND(DllStructGetData($aAgent, 'Effects'), 0x8000) > 0 + Else + Return BitAND(MemoryRead(GetAgentPtr($aAgent) + 312, 'long'), 0x8000) > 0 + EndIf +EndFunc ;==>GetHasWeaponSpell +#EndRegion + +#Region TypeMap +;~ Description: Tests if an agent is a boss. +Func GetIsBoss($aAgent) + If IsPtr($aAgent) <> 0 Then + Return BitAND(MemoryRead($aAgent + 344, 'long'), 1024) > 0 + ElseIf IsDllStruct($aAgent) <> 0 Then + Return BitAND(DllStructGetData($aAgent, 'TypeMap'), 1024) > 0 + Else + Return BitAND(MemoryRead( GetAgentPtr($aAgent) + 344, 'long'), 1024) > 0 + EndIf +EndFunc ;==>GetIsBoss +#EndRegion + +#Region X and Y Calcs +;~ Description: Returns the distance between target and oneself. +Func GetDistanceToE($aAgent1 = GetCurrentTargetPtr(), $aMe = GetAgentPtr(-2)) + Local $lAgent1X, $lAgent1Y, $lAgent2X, $lAgent2Y + If IsPtr($aAgent1) <> 0 Then + UpdateAgentPosByPtr($aAgent1, $lAgent1X, $lAgent1Y) + ElseIf IsDllStruct($aAgent1) <> 0 Then + $lAgent1X = DllStructGetData($aAgent1, 'X') + $lAgent1Y = DllStructGetData($aAgent1, 'Y') + Else + UpdateAgentPosByPtr(GetAgentPtr($aAgent1), $lAgent1X, $lAgent1Y) + EndIf + UpdateAgentPosByPtr($aMe, $lAgent2X, $lAgent2Y) + Return Sqrt(($lAgent1X - $lAgent2X) ^2 + ($lAgent1Y - $lAgent2Y) ^2) +EndFunc ;==>GetDistanceToE + +;~ Description: Returns the distance between two agents. +Func GetDistance($aAgent1 = GetCurrentTargetPtr(), $aAgent2 = GetAgentPtr(-2)) + Local $lAgent1X, $lAgent1Y, $lAgent2X, $lAgent2Y + UpdateAgentPosByPtr( ((IsPtr($aAgent1)) ? ($aAgent1) : (GetAgentPtr($aAgent1))) , $lAgent1X, $lAgent1Y ) + UpdateAgentPosByPtr( ((IsPtr($aAgent2)) ? ($aAgent2) : (GetAgentPtr($aAgent2))) , $lAgent2X, $lAgent2Y ) + Return Sqrt(($lAgent1X - $lAgent2X) ^2 + ($lAgent1Y - $lAgent2Y) ^2) +EndFunc ;==>GetDistance + +;~ Description: Same as GetDistance(), but without Sqrt. Only accepts pointers as arguments. +Func GetPseudoDistance($aAgentPtr1, $aAgentPtr2) + Local $lAgent1X, $lAgent2X, $lAgent1Y, $lAgent2Y + UpdateAgentPosByPtr($aAgentPtr1, $lAgent1X, $lAgent1Y) + UpdateAgentPosByPtr($aAgentPtr2, $lAgent2X, $lAgent2Y) + Return ($lAgent1X - $lAgent2X) ^2 + ($lAgent1Y - $lAgent2Y) ^2 +EndFunc + +;~ Description: Checks if a point is within a polygon defined by an array. +Func GetIsPointInPolygon($aAreaCoords, $aPosX = 0, $aPosY = 0) + Local $lPosition, $lPosX, $lPosY, $j + Local $lEdges = UBound($aAreaCoords) + Local $lOddNodes = False + If $lEdges < 3 Then Return False + If $aPosX = 0 Then + Local $lAgent = GetAgentPtr(-2) + UpdateAgentPosByPtr($lAgent, $lPosX, $lPosY) + Else + $lPosX = $aPosX + $lPosY = $aPosY + EndIf + $j = $lEdges - 1 + For $i = 0 To $lEdges - 1 + If (($aAreaCoords[$i][1] < $aPosY And $aAreaCoords[$j][1] >= $aPosY) _ + Or ($aAreaCoords[$j][1] < $aPosY And $aAreaCoords[$i][1] >= $aPosY)) _ + And ($aAreaCoords[$i][0] <= $aPosX Or $aAreaCoords[$j][0] <= $aPosX) Then + If ($aAreaCoords[$i][0] + ($aPosY - $aAreaCoords[$i][1]) / ($aAreaCoords[$j][1] - $aAreaCoords[$i][1]) * ($aAreaCoords[$j][0] - $aAreaCoords[$i][0]) < $aPosX) Then + $lOddNodes = Not $lOddNodes + EndIf + EndIf + $j = $i + Next + Return $lOddNodes +EndFunc ;==>GetIsPointInPolygon +#EndRegion + +#Region Agentname +;~ Description: Returns the name of an agent.edit by Ralle1976 +Func GetAgentName($aAgent) + If $mUseStringLog = False Then Return + If (IsPtr($aAgent) <> 0) Then + Local $lAgentID = MemoryRead($aAgent + 44, 'long') + ElseIf (IsDllStruct($aAgent) <> 0) Then + Local $lAgentID = DllStructGetData($aAgent, 'ID') + Else + Local $lAgentID = ConvertID($aAgent) + EndIf + Local Static $PlayerID = ConvertID(-2), $Charname = GetCharname() + If ($lAgentID = $PlayerID) Then Return $Charname + local $lAdresse = 0, $lName = '' + $lAdresse = $mStringLogBase + 256 * $lAgentID + $lName = MemoryRead($lAdresse, 'wchar [128]') + If $lName = '' Then + DisplayAll(True) + Sleep(100) + DisplayAll(False) + EndIf + $lName = MemoryRead($lAdresse, 'wchar [128]') + Return StringRegExpReplace($lName, '[<]{1}([^>]+)[>]{1}', '') +EndFunc ;==>GetAgentName +#EndRegion + +#Region Profession +;~ Description: Agents Primary Profession +Func GetProfessionPrimary($aAgent = GetAgentPtr(-2)) + Return GetAgentPrimaryProfession($aAgent) +EndFunc ;==>GetProfessionPrimary + +;~ Description: Agents Secondary Profession +Func GetProfessionSecondary($aAgent = GetAgentPtr(-2)) + Return GetAgentSecondaryProfession($aAgent) +EndFunc ;==>GetProfessionSecondary + +;~ Description: Returns agent primary profession. +Func GetAgentPrimaryProfession($aAgent = GetAgentPtr(-2)) + If IsPtr($aAgent) <> 0 Then + Return MemoryRead($aAgent + 266, 'byte') + ElseIf IsDllStruct($aAgent) <> 0 Then + Return DllStructGetData($aAgent, 'Primary') + Else + Return MemoryRead(GetAgentPtr($aAgent) + 266, 'byte') + EndIf +EndFunc ;==>GetAgentPrimaryProfession + +;~ Description: Returns agent secondary profession. +Func GetAgentSecondaryProfession($aAgent = GetAgentPtr(-2)) + If IsPtr($aAgent) <> 0 Then + Return MemoryRead($aAgent + 267, 'byte') + ElseIf IsDllStruct($aAgent) <> 0 Then + Return DllStructGetData($aAgent, 'Secondary') + Else + Return MemoryRead(GetAgentPtr($aAgent) + 267, 'byte') + EndIf +EndFunc ;==>GetAgentSecondaryProfession + +;~ Description: Returns primary/secondary as string. +Func GetAgentProfessionsName($aAgent = GetAgentPtr(-2)) + Return GetProfessionName(GetAgentPrimaryProfession($aAgent)) & "/" & GetProfessionName(GetAgentSecondaryProfession($aAgent)) +EndFunc ;==>GetAgentProfessionsName + +;~ Description: Returns profession's abbreviation. +Func GetProfessionName($aProf) + Switch $aProf + Case 0 ; $PROFESSION_None + Return "x" + Case 1 ; $PROFESSION_Warrior + Return "W" + Case 2 ; $PROFESSION_Ranger + Return "R" + Case 3 ; $PROFESSION_Monk + Return "Mo" + Case 4 ; $PROFESSION_Necromancer + Return "N" + Case 5 ; $PROFESSION_Mesmer + Return "Me" + Case 6 ; $PROFESSION_Elementalist + Return "E" + Case 7 ; $PROFESSION_Assassin + Return "A" + Case 8 ; $PROFESSION_Ritualist + Return "Rt" + Case 9 ; $PROFESSION_Paragon + Return "P" + Case 10 ; $PROFESSION_Dervish + Return "D" + EndSwitch +EndFunc ;==>GetProfessionName + +;~ Description: Returns profession's fullname. +Func GetProfessionFullName($aProf) + Switch $aProf + Case 0 ; $PROFESSION_None + Return "x" + Case 1 ; $PROFESSION_Warrior + Return "Warrior" + Case 2 ; $PROFESSION_Ranger + Return "Ranger" + Case 3 ; $PROFESSION_Monk + Return "Monk" + Case 4 ; $PROFESSION_Necromancer + Return "Necromancer" + Case 5 ; $PROFESSION_Mesmer + Return "Mesmer" + Case 6 ; $PROFESSION_Elementalist + Return "Elementalist" + Case 7 ; $PROFESSION_Assassin + Return "Assassin" + Case 8 ; $PROFESSION_Ritualist + Return "Ritualist" + Case 9 ; $PROFESSION_Paragon + Return "Paragon" + Case 10 ; $PROFESSION_Dervish + Return "Dervish" + EndSwitch +EndFunc ;==>GetProfessionFullName + +;~ Description: Returns true if agent is main healing profession. +Func GetIsHealer($aAgent = GetAgentPtr(-2)) + Local $lPrimary = GetAgentPrimaryProfession($aAgent) + If $lPrimary = 3 Or $lPrimary = 8 Then Return True ; $PROFESSION_Monk, $PROFESSION_Ritualist + Local $lSecondary = GetAgentSecondaryProfession($aAgent) + If $lSecondary = 3 Or $lSecondary = 8 Then Return True ; $PROFESSION_Monk, $PROFESSION_Ritualist +EndFunc ;==>GetIsHealer + +;~ Description: Returns true if agent is monk. +Func IsMonk($aAgent = GetAgentPtr(-2)) + Return GetAgentPrimaryProfession($aAgent) = 3 Or GetAgentSecondaryProfession($aAgent) = 3 ; $PROFESSION_Monk +EndFunc ;==>IsMonk + +;~ Description: Returns true if agent is E/Mo. +Func IsEMo($aAgent = GetAgentPtr(-2)) + Return GetAgentPrimaryProfession($aAgent) = 6 And GetAgentSecondaryProfession($aAgent) = 3 ; $PROFESSION_Elementalist, $PROFESSION_Monk +EndFunc ;==>IsEMo + +;~ Description: Returns true if agent uses a martial weapon +Func GetIsMartial($aAgent = GetAgentPtr(-2)) + Local $lAgentWeaponType + If IsPtr($aAgent) <> 0 Then + $lAgentWeaponType = MemoryRead($aAgent + 434, 'word') + ElseIf IsDllStruct($aAgent) <> 0 Then + $lAgentWeaponType = DllStructGetData($aAgent, 'WeaponType') + Else + $lAgentWeaponType = MemoryRead(GetAgentPtr($aAgent) + 434, 'word') + EndIf + Switch $lAgentWeaponType + Case 1 To 7 + Return True + Case Else + Return False + EndSwitch +EndFunc ;==>GetIsMartial +#EndRegion +#EndRegion Information diff --git a/gwApi/array_questnames.au3 b/gwApi/array_questnames.au3 index 608e52d..0bfedd3 100644 --- a/gwApi/array_questnames.au3 +++ b/gwApi/array_questnames.au3 @@ -1,1430 +1,1431 @@ -#include-once - -#Region Quest Names -Global $Quest[1500] -$Quest[0] = "The Ascalon Settlement" -$Quest[1] = "The Villainy of Galrath" -$Quest[2] = "Bandit Trouble" -$Quest[3] = "A Gift for Jalis Ironhammer" -$Quest[4] = "To Kryta: Journey's End" -$Quest[5] = "Graven Images" -$Quest[6] = "The Hot Springs Murders" -$Quest[7] = "The Last Hog" -$Quest[8] = "The Lost Princess" -$Quest[9] = "Duties of a Lionguard" -$Quest[10] = "The Royal Papers" -$Quest[11] = "A Journey of Redemption" -$Quest[12] = "Blankets for the Settlers" -$Quest[13] = "Orrian Excavation" -$Quest[14] = "Malaquire's Test" -$Quest[15] = "Reversing the Skales" -$Quest[16] = "The Undead Hordes" -$Quest[17] = "Lagaan's Ordeal" -$Quest[18] = "Lagaan's Gratitude" -$Quest[19] = "Report to the White Mantle" -$Quest[20] = "Merchant's Plea" -$Quest[21] = "A Belated Betrothal" -$Quest[22] = "Ancient Secrets" -$Quest[23] = "The Forgotten Ones" -$Quest[24] = "Forgotten Wisdom" -$Quest[25] = "Ghostly Vengeance" -$Quest[26] = "Into the Unknown" -$Quest[27] = "The Misplaced Sword" -$Quest[28] = "Sands Of Souls" -$Quest[29] = "The Mesmer's Path" -$Quest[30] = "The Necromancer's Path" -$Quest[31] = "The Elementalist's Path" -$Quest[32] = "The Monk's Path" -$Quest[33] = "The Warrior's Path" -$Quest[34] = "The Ranger's Path" -$Quest[35] = "War Preparations" -$Quest[36] = "The Hunter's Horn" -$Quest[37] = "The Supremacy of Air" -$Quest[38] = "Rites of Remembrance" -$Quest[39] = "Little Thom's Big Cloak" -$Quest[40] = "The Vineyard Problem" -$Quest[41] = "Bandit Raid" -$Quest[42] = "A Test of Marksmanship" -$Quest[43] = "The Power of Blood" -$Quest[44] = "The Rogue's Replacement" -$Quest[45] = "Charr in the Catacombs" -$Quest[46] = "Charr at the Gate" -$Quest[47] = "The Accursed Path" -$Quest[48] = "The Poison Devourer" -$Quest[49] = "Domination Magic (quest)" -$Quest[50] = "The True King" -$Quest[51] = "The Egg Hunter" -$Quest[52] = "The Worm Problem" -$Quest[53] = "The Prize Moa Bird" -$Quest[54] = "Further Adventures" -$Quest[55] = "The Wayward Wizard" -$Quest[56] = "Adventure with an Ally" -$Quest[57] = "The Orchard" -$Quest[58] = "A Gift for Althea" -$Quest[59] = "Gwen's Flute (quest)" -$Quest[60] = "Warrior's Challenge" -$Quest[61] = "Tithe for Ashford Abbey" -$Quest[62] = "Unsettling Rumors" -$Quest[63] = "A New Mesmer Trainer" -$Quest[64] = "A New Necromancer Trainer" -$Quest[65] = "A New Elementalist Trainer" -$Quest[66] = "A New Monk Trainer" -$Quest[67] = "A New Warrior Trainer" -$Quest[68] = "A New Ranger Trainer" -$Quest[69] = "Across the Wall" -$Quest[70] = "Poor Tenant" -$Quest[71] = "A Mesmer's Burden" -$Quest[72] = "The Necromancer's Novice" -$Quest[73] = "The Elementalist Experiment" -$Quest[74] = "A Monk's Mission" -$Quest[75] = "Grawl Invasion" -$Quest[76] = "The Ranger's Companion" -$Quest[77] = "Protection Prayers (quest)" -$Quest[78] = "Opposition to the King" -$Quest[79] = "A Second Profession" -$Quest[80] = "Message from a Friend" -$Quest[81] = "Mesmer Test" -$Quest[82] = "Necromancer Test" -$Quest[83] = "Elementalist Test" -$Quest[84] = "Monk Test" -$Quest[85] = "Warrior Test" -$Quest[86] = "Ranger Test" -$Quest[87] = "The Blessings of Balthazar" -$Quest[88] = "Unnatural Growths" -$Quest[89] = "The Path to Glory" -$Quest[90] = "Trouble in the Woods" -$Quest[91] = "White Mantle Wrath: A Helping Hand" -$Quest[92] = "Urgent Warning" -$Quest[93] = "Blood And Smoke" -$Quest[94] = "Dropping Eaves" -$Quest[95] = "A Brother's Fury" -$Quest[96] = "Eye For Profit" -$Quest[97] = "Mysterious Message (Prophecies quest)" -$Quest[98] = "The Price of Steel" -$Quest[99] = "White Mantle Wrath: Demagogue's Vanguard" -$Quest[100] = "Passage Through The Dark River" -$Quest[101] = "Clear the Chamber" -$Quest[102] = "Servants of Grenth" -$Quest[103] = "Unwanted Guests" -$Quest[104] = "Demon Assassin" -$Quest[105] = "Imprisoned Spirits" -$Quest[106] = "The Four Horsemen" -$Quest[107] = "Terrorweb Queen" -$Quest[108] = "Escort of Souls" -$Quest[109] = "Restoring Grenth's Monuments" -$Quest[110] = "Wrathful Spirits" -$Quest[111] = "Charr Reinforcements" -$Quest[112] = "Symon's History of Ascalon" -$Quest[113] = "Experimental Elixir" -$Quest[114] = "Trying Times" -$Quest[115] = "Unnatural Creatures" -$Quest[116] = "The Charr Patrol" -$Quest[117] = "The Charr Staging Area" -$Quest[118] = "A Cure for Ralena" -$Quest[119] = "Casualty Report" -$Quest[120] = "Death in the Ruins" -$Quest[121] = "Fallen Soldiers" -$Quest[122] = "Oberan's Rage" -$Quest[123] = "Althea's Ashes" -$Quest[124] = "Hammer and Anvil" -$Quest[125] = "The Geomancer's Test" -$Quest[126] = "The Way of the Geomancer" -$Quest[127] = "Shalev's Task" -$Quest[128] = "Elemental Knowledge" -$Quest[129] = "The Duke's Daughter" -$Quest[130] = "Barradin's Advance" -$Quest[131] = "Fires in the East" -$Quest[132] = "Fires in the North" -$Quest[133] = "Frontier Gate Fugitives" -$Quest[134] = "Bounty for Chieftain Murg" -$Quest[135] = "Helping the People of Ascalon" -$Quest[136] = "Cities of Ascalon" -$Quest[137] = "Counting the Fallen" -$Quest[138] = "Scavengers in Old Ascalon" -$Quest[139] = "Garfazz Bloodfang (quest)" -$Quest[140] = "The King's Message" -$Quest[141] = "In Memory of Paulus" -$Quest[142] = "Protecting Ascalon" -$Quest[143] = "The Lost Master" -$Quest[144] = "The Ambassador's Quandary" -$Quest[145] = "Rastin's Ritual" -$Quest[146] = "A Mission of Peace" -$Quest[147] = "The Troublesome Artifact" -$Quest[148] = "Barradin's Stand" -$Quest[149] = "Army Life" -$Quest[150] = "Into the Breach" -$Quest[151] = "Military Matters" -$Quest[152] = "The Red-Cloaked Deserter" -$Quest[153] = "The Siege of Piken Square" -$Quest[154] = "Replacement Healers" -$Quest[155] = "Rogenn's Duel" -$Quest[156] = "Regent Valley Defense" -$Quest[157] = "Mesmerizing the Enemy" -$Quest[158] = "The Stolen Artifact" -$Quest[159] = "Scorched Earth (Prophecies quest)" -$Quest[160] = "Sowing Seeds" -$Quest[161] = "Gargoyle Trouble" -$Quest[162] = "Endangered Species" -$Quest[163] = "The Missing Melandru Relic" -$Quest[164] = "Supplies for the Duke" -$Quest[165] = "Ruins of Surmia (quest)" -$Quest[166] = "Vanguard Equipment" -$Quest[167] = "Deliver a Message to My Wife" -$Quest[168] = "Recruits for Hollis" -$Quest[169] = "The Krytan Ambassador" -$Quest[170] = "Collect Charr Armor Set" -$Quest[171] = "Defend the Wall" -$Quest[172] = "Slay Rotscale" -$Quest[173] = "Slay Stank Reekfoul" -$Quest[174] = "Repel Charr" -$Quest[175] = "Scout Charr" -$Quest[176] = "Collect Gargoyle Fangs" -$Quest[177] = "Defend Droknar's Forge" -$Quest[178] = "The Road to Borlis Pass" -$Quest[179] = "To Kryta: The Ice Cave" -$Quest[180] = "The Stone Summit Champion" -$Quest[181] = "Renegade Necromancer" -$Quest[182] = "The Deserters" -$Quest[183] = "A Heart of Ice" -$Quest[184] = "The Missing Artisan" -$Quest[185] = "Helping the Dwarves" -$Quest[186] = "Hungry Devourer" -$Quest[187] = "Oswalt's Epitaph" -$Quest[188] = "Securing the Vale" -$Quest[189] = "Minaar's Trouble" -$Quest[190] = "Iron Horse War Machine" -$Quest[191] = "Minaar's Worry" -$Quest[192] = "Stone Summit Beastmasters" -$Quest[193] = "Slay Frostbite" -$Quest[194] = "The Hero's Journey" -$Quest[195] = "The Hero's Challenge" -$Quest[196] = "Seeking The Seer" -$Quest[197] = "Shiverpeak Stragglers" -$Quest[198] = "The Way is Blocked" -$Quest[199] = "To Kryta: Refugees" -$Quest[200] = "The Wayward Monk" -$Quest[201] = "Into the Breach" -$Quest[202] = "Defend the Temple of War" -$Quest[203] = "Army of Darkness" -$Quest[204] = "The Wailing Lord" -$Quest[205] = "A Gift of Griffons" -$Quest[206] = "Slaves of Menzies" -$Quest[207] = "Restore the Temple of War" -$Quest[208] = "The Hunt" -$Quest[209] = "The Eternal Forgemaster" -$Quest[210] = "Champions of Orr" -$Quest[211] = "Tower of Strength" -$Quest[212] = "Tower of Courage" -$Quest[213] = "Final Blow" -$Quest[214] = "Wisdom of the Druids" -$Quest[215] = "Family Ties (Prophecies quest)" -$Quest[216] = "The Weaver of Nebo" -$Quest[217] = "War Preparations" -$Quest[218] = "War Preparations" -$Quest[219] = "War Preparations" -$Quest[220] = "War Preparations" -$Quest[221] = "War Preparations" -$Quest[222] = "War Preparations" -$Quest[223] = "The False Gods" -$Quest[224] = "Khobay the Betrayer" -$Quest[225] = "Caravan in Trouble" -$Quest[226] = "Defend North Kryta Province" -$Quest[227] = "Defend Denravi" -$Quest[228] = "The Last Day Dawns" -$Quest[229] = "The Titan Source" -$Quest[230] = "Cold One" -$Quest[231] = "The Forge Heart" -$Quest[232] = "Wrenches In The Gears" -$Quest[233] = "Unspeakable, Unknowable" -$Quest[234] = "To Sorrow's Furnace" -$Quest[235] = "Noble Intentions" -$Quest[236] = "Noble Intentions Plan B" -$Quest[237] = "Kilroy Stonekin (quest)" -$Quest[238] = "Summit Slaves" -$Quest[239] = "Gathering Resources" -$Quest[240] = "Unruly Slaves" -$Quest[241] = "Fire in the Hole" -$Quest[242] = "Tasca's Reprise" -$Quest[243] = "Subversive Ideas" -$Quest[244] = "Political Ramifications" -$Quest[245] = "The Final Assault" -$Quest[246] = "Seek Out Headmaster Lee" -$Quest[247] = "Seek Out Headmaster Kaa" -$Quest[248] = "Seek Out Headmaster Kuju" -$Quest[249] = "Seek Out Headmaster Vhang" -$Quest[250] = "Seek Out Headmaster Zhan" -$Quest[251] = "Seek Out Headmaster Amara" -$Quest[252] = "Seek Out Headmaster Greico" -$Quest[253] = "Seek Out Headmaster Quin" -$Quest[254] = "Locate Jinzo" -$Quest[255] = "Locate Mei Ling" -$Quest[256] = "Locate Reng Ku" -$Quest[257] = "Locate Ronsu" -$Quest[258] = "Locate Sister Tai" -$Quest[259] = "Locate Talon Silverwing" -$Quest[260] = "Locate Sujun" -$Quest[261] = "Locate Professor Gai" -$Quest[262] = "Track Down Panaku" -$Quest[263] = "Track Down Lo Sha" -$Quest[264] = "Track Down Su" -$Quest[265] = "Track Down Kai Ying" -$Quest[266] = "Track Down Brother Pe Wan" -$Quest[267] = "Track Down Weng Gha" -$Quest[268] = "Track Down Zho" -$Quest[269] = "Track Down Ang the Ephemeral" -$Quest[270] = "Opening Strike" -$Quest[271] = "Cleansing the Shrine" -$Quest[272] = "Little Creatures" -$Quest[273] = "Spark of Interest" -$Quest[274] = "Stale Mate" -$Quest[275] = "Talon's Duel" -$Quest[276] = "Free the Fur" -$Quest[277] = "Minions Gone Wild" -$Quest[278] = "Dual Strike" -$Quest[279] = "Lo Sha's Gift" -$Quest[280] = "Reaping the Naga" -$Quest[281] = "Sparring Elements" -$Quest[282] = "Seeking a Cure" -$Quest[283] = "The Crop Thieves" -$Quest[284] = "The Yeti Hunt" -$Quest[285] = "Shackled Spirits" -$Quest[286] = "An Audience with Master Togo (assassin)" -$Quest[287] = "An Audience with Master Togo (mesmer)" -$Quest[288] = "An Audience with Master Togo (necromancer)" -$Quest[289] = "An Audience with Master Togo (elementalist)" -$Quest[290] = "An Audience with Master Togo (monk)" -$Quest[291] = "An Audience with Master Togo (warrior)" -$Quest[292] = "An Audience with Master Togo (ranger)" -$Quest[293] = "An Audience with Master Togo (ritualist)" -$Quest[294] = "Speak with Headmaster Lee (Assassin)" -$Quest[295] = "Speak with Headmaster Kaa (Mesmer)" -$Quest[296] = "Speak with Headmaster Kuju (Necromancer)" -$Quest[297] = "Speak with Headmaster Vhang (Elementalist)" -$Quest[298] = "Speak with Headmaster Amara (Monk)" -$Quest[299] = "Speak with Headmaster Zhan (Warrior)" -$Quest[300] = "Speak with Headmaster Greico (Ranger)" -$Quest[301] = "Speak with Headmaster Quin (Ritualist)" -$Quest[302] = "Defense Against Hexes" -$Quest[303] = "Disruption" -$Quest[304] = "Skill Chaining" -$Quest[305] = "Snaring Course" -$Quest[306] = "Disenchantment Course" -$Quest[307] = "Condition Removal" -$Quest[308] = "Advanced Defense Techniques" -$Quest[309] = "Elementalist Insignia" -$Quest[310] = "Warrior Insignia" -$Quest[311] = "Mesmer Insignia" -$Quest[312] = "Monk Insignia" -$Quest[313] = "Necromancer Insignia" -$Quest[314] = "Ranger Insignia" -$Quest[315] = "Ritualist Insignia" -$Quest[316] = "Assassin Insignia" -$Quest[317] = "Choose Your Secondary Profession (Factions quest)" -$Quest[318] = "A Formal Introduction" -$Quest[319] = "The Sickened Village" -$Quest[320] = "The Red Frog" -$Quest[321] = "The Kaguchi Brothers" -$Quest[322] = "The Box of Illusions" -$Quest[323] = "Old Friends, Dark Times" -$Quest[324] = "Power Surge" -$Quest[325] = "Cleansing the Steel" -$Quest[326] = "The Stone of the Elements" -$Quest[327] = "Assassination Attempt" -$Quest[328] = "Little Lost Bear" -$Quest[329] = "Imperial Assistance" -$Quest[330] = "Medical Emergency" -$Quest[331] = "Red Tape" -$Quest[332] = "Assist the Guards" -$Quest[333] = "Straight to the Top" -$Quest[334] = "Drink from the Chalice of Corruption" -$Quest[335] = "Refuse to Drink" -$Quest[336] = "The Search for a Cure" -$Quest[337] = "Seek out Brother Tosai" -$Quest[338] = "An End to Suffering" -$Quest[339] = "Warning the Tengu" -$Quest[340] = "The Threat Grows" -$Quest[341] = "Journey to the Master" -$Quest[342] = "The Road Less Traveled" -$Quest[343] = "Looking For Trouble" -$Quest[344] = "To the Rescue (Factions quest)" -$Quest[345] = "To Zen Daijun" -$Quest[346] = "Lost Treasure" -$Quest[347] = "Mantid Hatchlings" -$Quest[348] = "An Unwelcome Guest" -$Quest[349] = "A Master's Burden" -$Quest[350] = "To Tahnnakai Temple" -$Quest[351] = "Into the Whirlpool" -$Quest[352] = "Journey to House zu Heltzer" -$Quest[353] = "Journey to Cavalon" -$Quest[354] = "Naga Oil" -$Quest[355] = "Street Justice" -$Quest[356] = "Finding The Oracle" -$Quest[357] = "Closer to the Stars" -$Quest[358] = "Appearance of the Naga" -$Quest[359] = "The Rite of Valor" -$Quest[360] = "Death with Honor" -$Quest[361] = "The Nameless Masters" -$Quest[362] = "The Path of the Zaishen Elite" -$Quest[363] = "The Team Trials" -$Quest[364] = "Kurzick Supply Lines" -$Quest[365] = "Scouting Ferndale" -$Quest[366] = "Scout the Coast" -$Quest[367] = "Securing Echovald Forest" -$Quest[368] = "Duel of the Houses" -$Quest[369] = "The Jade Arena" -$Quest[370] = "In the Army (Luxon)" -$Quest[371] = "Scouting Maishang Hills" -$Quest[372] = "Luxon Supply Lines" -$Quest[373] = "In the Army Now (Kurzick)" -$Quest[374] = "Befriending the Kurzicks" -$Quest[375] = "Befriending the Luxons" -$Quest[376] = "Mayhem in the Market" -$Quest[377] = "Welcome to Cantha" -$Quest[378] = "The Defenders of the Forest" -$Quest[379] = "A Meeting With the Emperor" -$Quest[380] = "The Count's Daughter" -$Quest[381] = "Stolen Eggs" -$Quest[382] = "The Convocation" -$Quest[383] = "Journey to the Whirlpool" -$Quest[384] = "Taking Back the Palace" -$Quest[385] = "Quimang's Last Stand" -$Quest[386] = "The Siege at Tsumei Village" -$Quest[387] = "Togo's Ultimatum" -$Quest[388] = "Revenge of the Yeti" -$Quest[389] = "The Agriculturist" -$Quest[390] = "The Captured Son" -$Quest[391] = "The Naga Source" -$Quest[392] = "Sentimental Treasures" -$Quest[393] = "Skin the Snake" -$Quest[394] = "Pest Control" -$Quest[395] = "The Thieving Nanny" -$Quest[396] = "City Under Attack" -$Quest[397] = "Battle in the Sewers" -$Quest[398] = "The Ancient Forest" -$Quest[399] = "Wicked Wardens" -$Quest[400] = "Song and Stone" -$Quest[401] = "A New Escort" -$Quest[402] = "The Experimental Weaponsmith" -$Quest[403] = "Melodic Gaki Flute" -$Quest[404] = "Discord Wallow Lyre" -$Quest[405] = "Rhythm Drinker Drum" -$Quest[406] = "Envoy of the Dredge" -$Quest[407] = "Temple of the Dredge" -$Quest[408] = "Revolt of the Dredge" -$Quest[409] = "The Halcyon Job" -$Quest[410] = "Attack the Kurzicks!" -$Quest[411] = "Protect the Halcyon" -$Quest[412] = "Outcasts in the Quarry" -$Quest[413] = "Challenge of Strength" -$Quest[414] = "Artistic Endeavors" -$Quest[415] = "The Beak of Darkness" -$Quest[416] = "Wardens On the March" -$Quest[417] = "Invoking the Saints" -$Quest[418] = "If It Weren't for Bad Luck...." -$Quest[419] = "Night Raiders" -$Quest[420] = "Message on a Dragon Scale" -$Quest[421] = "Messages, Messages Everywhere" -$Quest[422] = "The Zenos Squad" -$Quest[423] = "The Impossible Sea Monster" -$Quest[424] = "Minister's Test" -$Quest[425] = "Capturing the Orrian Tome" -$Quest[426] = "A Tasty Morsel" -$Quest[427] = "Wayward Guide" -$Quest[428] = "A New Guide" -$Quest[429] = "Getting Even" -$Quest[430] = "Sticks and Stones" -$Quest[431] = "Forgotten Retribution" -$Quest[432] = "Defend Fort Aspenwood" -$Quest[433] = "The Jade Quarry (Kurzick quest)" -$Quest[434] = "Fort Aspenwood (quest)" -$Quest[435] = "The Jade Quarry (Luxon quest)" -$Quest[436] = "Mhenlo's Request" -$Quest[437] = "The Bog Beast of Bokku" -$Quest[438] = "A Belt Pouch" -$Quest[439] = "Cash Crops" -$Quest[440] = "Forming a Party" -$Quest[441] = "Study Buddy" -$Quest[442] = "The Dragon Hunter" -$Quest[443] = "More Cowbell" -$Quest[444] = "A Letter Home" -$Quest[445] = "Return of the Yeti" -$Quest[446] = "The Challenge" -$Quest[447] = "Captured" -$Quest[448] = "The Emperor in Peril" -$Quest[449] = "The Plot Thickens" -$Quest[450] = "It Ends Here" -$Quest[451] = "Masters of Corruption" -$Quest[452] = "The Drunken Master" -$Quest[453] = "Eliminate the Am Fah" -$Quest[454] = "Eliminate the Jade Brotherhood" -$Quest[455] = "Problem Salving" -$Quest[456] = "Going Home" -$Quest[457] = "Missing Daughter" -$Quest[458] = "Too High a Price" -$Quest[459] = "The Xunlai Agent" -$Quest[460] = "Luxury Goods" -$Quest[461] = "Charting the Forests" -$Quest[462] = "Charting the Jade Sea" -$Quest[463] = "Stemming the Tide" -$Quest[464] = "The Missing Corpses" -$Quest[465] = "The Missing Link" -$Quest[466] = "The Afflicted Guard" -$Quest[467] = "Seeking Shelter" -$Quest[468] = "Housing for Refugees" -$Quest[469] = "A Monstrous Revelation" -$Quest[470] = "The Shadow Blades" -$Quest[471] = "Lambs to the Slaughter" -$Quest[472] = "Sea of Green, Canopy of Stone" -$Quest[473] = "Feed the Hungry" -$Quest[474] = "Passing the Buck" -$Quest[475] = "Raze the Roost" -$Quest[476] = "Last of the Breed" -$Quest[477] = "Refuse the King" -$Quest[478] = "The Growing Threat" -$Quest[479] = "Chaos in Kryta" -$Quest[480] = "Vanishing Spirits" -$Quest[481] = "Pilgrimage" -$Quest[482] = "Requiem for a Brain" -$Quest[483] = "Under New Management" -$Quest[484] = "Destroy the Ungrateful Slaves" -$Quest[485] = "A Show of Force" -$Quest[486] = "Temple of the Monoliths" -$Quest[487] = "Return of the Undead King" -$Quest[488] = "Strange Bedfellows" -$Quest[489] = "She Hungers" -$Quest[490] = "The Council is Called" -$Quest[491] = "Desperate Measures" -$Quest[492] = "The Search for Survivors" -$Quest[493] = "A Sound of Ancient Horns" -$Quest[494] = "Garden Chores" -$Quest[495] = "Which Way Did He Go?" -$Quest[496] = "One Man's Dream" -$Quest[497] = "Puzzling Parchment" -$Quest[498] = "A Brief Introduction" -$Quest[499] = "Plague of Frogs" -$Quest[500] = "Between a Rock..." -$Quest[501] = "Botanical Research" -$Quest[502] = "Rally The Princes" -$Quest[503] = "All's Well That Ends Well" -$Quest[504] = "Warning Kehanni" -$Quest[505] = "Calling the Order" -$Quest[506] = "Greed and Regret" -$Quest[507] = "Pledge of the Merchant Princes" -$Quest[508] = "An Old Man's Past" -$Quest[509] = "An Old Man's Shame" -$Quest[510] = "To the Rescue (Nightfall quest)" -$Quest[511] = "Coffer of Joko" -$Quest[512] = "Data Mining" -$Quest[513] = "The Madness of Prophecy" -$Quest[514] = "Protect the Learned" -$Quest[515] = "Reclaiming the Temple" -$Quest[516] = "The Search for Enlightenment" -$Quest[517] = "Summertime for Bokka" -$Quest[518] = "In Defense of Theatre" -$Quest[519] = "Worst. Performance. Ever." -$Quest[520] = "The Show Must Go On" -$Quest[521] = "Valley of the Rifts" -$Quest[522] = "Population Control" -$Quest[523] = "Destroy the Harpies" -$Quest[524] = "Guard Rescue" -$Quest[525] = "Gift of the Djinn" -$Quest[526] = "Interception" -$Quest[527] = "Old Friends" -$Quest[528] = "For Your Ears Only" -$Quest[529] = "The Scourge of Vabbi" -$Quest[530] = "The Hanging Gardener" -$Quest[531] = "Scorched Earth (Nightfall quest)" -$Quest[532] = "Extinction" -$Quest[533] = "Insatiable Appetite" -$Quest[534] = "Building the Base: Prisoners of War" -$Quest[535] = "Building the Base: The Interrogation" -$Quest[536] = "Building the Base: The Meeting" -$Quest[537] = "The Tools of War" -$Quest[538] = "Feeding Frenzy" -$Quest[539] = "You Can Run..." -$Quest[540] = "Centaur Concerns" -$Quest[541] = "Mirza's Last Stand" -$Quest[542] = "Battle of Turai's Procession" -$Quest[543] = "A Question of Morality" -$Quest[544] = "A Bushel of Trouble" -$Quest[545] = "The Great Zehtuka (quest)" -$Quest[546] = "Eavesdropping" -$Quest[547] = "A Little Recon" -$Quest[548] = "Hunted!" -$Quest[549] = "The Great Escape" -$Quest[550] = "And a Hero Shall Lead Them" -$Quest[551] = "To Vabbi!" -$Quest[552] = "Centaur Blackmail" -$Quest[553] = "Mysterious Message (Nightfall quest)" -$Quest[554] = "Secrets in the Shadow" -$Quest[555] = "To Kill a Demon" -$Quest[556] = "For a Price" -$Quest[557] = "No Me, No Kormir" -$Quest[558] = "A Thorn in Varesh's Side" -$Quest[559] = "Tendering an Offer" -$Quest[560] = "Estate Planning" -$Quest[561] = "Family Ties (Nightfall quest)" -$Quest[562] = "A Message for Janeera" -$Quest[563] = "Strange Allies" -$Quest[564] = "The Foolhardy Father" -$Quest[565] = "The Young Lady Vanishes" -$Quest[566] = "Old Woman River" -$Quest[567] = "A Fool's Luck" -$Quest[568] = "Herds to the Slaughter" -$Quest[569] = "Koss's Elixir" -$Quest[570] = "Drake in a Cage" -$Quest[571] = "Troubled Lands" -$Quest[572] = "Ancestral Anguish" -$Quest[573] = "Total Corruption" -$Quest[574] = "Fish in a Barrel" -$Quest[575] = "Melonni's Meditations" -$Quest[576] = "Weird Waters" -$Quest[577] = "A Prescription for Conscription" -$Quest[578] = "Undead Defenders" -$Quest[579] = "The Cold Touch of the Past" -$Quest[580] = "Raising an Army" -$Quest[581] = "Heart or Mind: Garden in Danger" -$Quest[582] = "The Hallowed Point" -$Quest[583] = "A Deal's a Deal" -$Quest[584] = "Horde of Darkness" -$Quest[585] = "Family Soul" -$Quest[586] = "Heart or Mind: Ronjok in Danger" -$Quest[587] = "Assault on Beknur Harbor" -$Quest[588] = "Moa'vu'Kaal, Awakened" -$Quest[589] = "The Cyclone Palace" -$Quest[590] = "Down on the Bayou" -$Quest[591] = "Double Dog Dare" -$Quest[592] = "A Message Home" -$Quest[593] = "One Good Turn Deserves Another" -$Quest[594] = "What Do You Do with a Drunken Shauben?" -$Quest[595] = "Secret Passage" -$Quest[596] = "Choose Your Secondary Profession (Nightfall quest)" -$Quest[597] = "Corsair Vengeance" -$Quest[598] = "Defender's Choice" -$Quest[599] = "The Lone Raider" -$Quest[600] = "Primary Training" -$Quest[601] = "Secondary Training" -$Quest[602] = "A Hidden Threat" -$Quest[603] = "Wandered Off Again" -$Quest[604] = "Anger of the Stone Face" -$Quest[605] = "The Cult of the Stone Face" -$Quest[606] = "Stone-Faced Orders" -$Quest[607] = "Armored Transport" -$Quest[608] = "Quality Steel" -$Quest[609] = "Material Girl" -$Quest[610] = "Suwash the Pirate" -$Quest[611] = "Catch of the Day" -$Quest[612] = "Flamingo-ing... going... gone." -$Quest[613] = "A Leap of Faith" -$Quest[614] = "Zaishen Elite (quest)" -$Quest[615] = "Student Jin" -$Quest[616] = "Student Sousuke" -$Quest[617] = "Feast of Bokka" -$Quest[618] = "A Ghostly Request" -$Quest[619] = "Ghosts in the Graveyard" -$Quest[620] = "Skree Hatchling Season" -$Quest[621] = "A Friend in Need" -$Quest[622] = "A Father's Fate" -$Quest[623] = "Second Born" -$Quest[624] = "First Born" -$Quest[625] = "Third Born" -$Quest[626] = "Identity Theft" -$Quest[627] = "Need More Stuff" -$Quest[628] = "To Dye For" -$Quest[629] = "Missing Shipment" -$Quest[630] = "Blow Out Sale!" -$Quest[631] = "Scholarly Affairs" -$Quest[632] = "Leaving a Legacy" -$Quest[633] = "The Honorable General" -$Quest[634] = "Signs and Portents" -$Quest[635] = "Isle of the Dead (quest)" -$Quest[636] = "Bad Tide Rising" -$Quest[637] = "Special Delivery" -$Quest[638] = "Big News, Small Package" -$Quest[639] = "Following the Trail" -$Quest[640] = "The Iron Truth" -$Quest[641] = "Trial by Fire" -$Quest[642] = "War Preparations (Recruit Training)" -$Quest[643] = "War Preparations (Wind and Water)" -$Quest[644] = "War Preparations (Ghost Reconnaissance)" -$Quest[645] = "The Time is Nigh" -$Quest[646] = "A Loose Cannon" -$Quest[647] = "Diamond in the Rough" -$Quest[648] = "Map-Travel Inventor" -$Quest[649] = "Honing your Skills" -$Quest[650] = "Voices in the Night" -$Quest[651] = "Corsair Invasion" -$Quest[652] = "A Peaceful Solution" -$Quest[653] = "Hog Hunt" -$Quest[654] = "A Delayed Delivery" -$Quest[655] = "A Troubling Theory" -$Quest[656] = "A Mysterious Missive" -$Quest[657] = "A Perplexing Plague" -$Quest[658] = "A Stolen Spore" -$Quest[659] = "Proof of Courage" -$Quest[660] = "Quarry Quandry" -$Quest[661] = "Queen of the Quarry" -$Quest[662] = "A Sticky Operation" -$Quest[663] = "Rising Suns" -$Quest[664] = "Re-enlist Rojis" -$Quest[665] = "Skale and Magic Compass" -$Quest[666] = "To See the Sights" -$Quest[667] = "To Ask For More" -$Quest[668] = "Money on the Side" -$Quest[669] = "Fury of a Grieving Heart" -$Quest[670] = "Crypt-ology" -$Quest[671] = "Stolen Supplies" -$Quest[672] = "Loyal 'til the End" -$Quest[673] = "A Personal Vault" -$Quest[674] = "Trade Relations" -$Quest[675] = "Rally the Recruits (Tutorial)" -$Quest[676] = "Into Chahbek Village" -$Quest[677] = "Take the Shortcut (Skip Tutorial)" -$Quest[678] = "A Decayed Monument" -$Quest[679] = "Goren's Stuff: Part 1" -$Quest[680] = "Attack at the Kodash" -$Quest[681] = "Crossing the Desolation [if acquired from Zerai the Learner]" -$Quest[682] = "Melonni Goes Recruiting" -$Quest[683] = "Securing Champion's Dawn" -$Quest[684] = "Crossing the Desolation [if acquired from Lonai]" -$Quest[685] = "The Apostate" -$Quest[686] = "Breaking the Broken" -$Quest[687] = "A Flickering Flame" -$Quest[688] = "Dismember the Titans" -$Quest[689] = "Cover Your Tracks" -$Quest[690] = "Dark Gateway" -$Quest[691] = "They Only Come Out at Night" -$Quest[692] = "Invasion From Within" -$Quest[693] = "Drink of the Gods" -$Quest[694] = "The Troubled Keeper" -$Quest[695] = "Open Season" -$Quest[696] = "Good Demon Hunting" -$Quest[697] = "Holding the Line" -$Quest[698] = "A Fleshy Operation" -$Quest[699] = "Bad Fortune" -$Quest[700] = "Know Thine Enemy" -$Quest[701] = "Uncharted Territory" -$Quest[702] = "Kormir's Crusade" -$Quest[703] = "All Alone in the Darkness" -$Quest[704] = "Passing the Luck" -$Quest[705] = "Blueprint of the Fall" -$Quest[706] = "Escape from the Torment" -$Quest[707] = "Faded Memory" -$Quest[708] = "A History of Violence" -$Quest[709] = "Quiz the Recruits" -$Quest[710] = "Koss Goes Recruiting" -$Quest[711] = "Never Fight Alone" -$Quest[712] = "Command Training" -$Quest[713] = "Goren's Stuff: Part 2" -$Quest[714] = "The Toy's Story" -$Quest[715] = "Rising in the Ranks: Master Sergeant" -$Quest[716] = "Rising in the Ranks: First Spear" -$Quest[717] = "Misela, the Middle Child" -$Quest[718] = "Mutu, the Oldest Child" -$Quest[719] = "Jedur, the Youngest Child" -$Quest[720] = "Norgu's Nightfall" -$Quest[721] = "The Role of a Lifetime" -$Quest[722] = "Brains or Brawn" -$Quest[723] = "Sunspears in Kryta" -$Quest[724] = "Sunspears in Cantha" -$Quest[725] = "Terror in Tyria" -$Quest[726] = "Plague in Cantha" -$Quest[727] = "The Command Post" -$Quest[728] = "The Dejarin Estate" -$Quest[729] = "Gain Norgu" -$Quest[730] = "Gain Goren" -$Quest[731] = "Gain Margrid" -$Quest[732] = "Gain Master of Whispers" -$Quest[733] = "Gain Jin" -$Quest[734] = "Gain Sousuke" -$Quest[735] = "Gain Olias" -$Quest[736] = "Gain Zenmai" -$Quest[737] = "Battle Preparations" -$Quest[738] = "The Time is Nigh" -$Quest[739] = "Drakes on the Plain" -$Quest[740] = "Capturing the Signet of Capture" -$Quest[741] = "A Land of Heroes" -$Quest[742] = "Breaching the Stygian Veil" -$Quest[743] = "Foundry Breakout" -$Quest[744] = "The Foundry of Failed Creations (quest)" -$Quest[745] = "The Oddbodies (quest)" -$Quest[746] = "The Last Patrol" -$Quest[747] = "The Missing Patrol" -$Quest[748] = "Into the Fire" -$Quest[749] = "Deathbringer Company" -$Quest[750] = "Finding a Purpose" -$Quest[751] = "The City of Torc'qua" -$Quest[752] = "The Rifts Between Us" -$Quest[753] = "To the Rescue!" -$Quest[754] = "Mallyx the Unyielding (quest)" -$Quest[755] = "Brood Wars" -$Quest[756] = "How the Grentches Stole Wintersday" -$Quest[757] = "Spreading the Wintersday Spirit" -$Quest[758] = "White Mist" -$Quest[759] = "The Gift of Giving" -$Quest[760] = "Save the Reindeer" -$Quest[761] = "Find the Stolen Presents" -$Quest[762] = "A Very Grentchie Wintersday" -$Quest[763] = "The Greatest Snowman Ever Made" -$Quest[764] = "You're a Mean One, Mr. Grenth" -$Quest[765] = "In Grenth's Defense" -$Quest[766] = "Army Wife" -$Quest[767] = "Impressing the Girl" -$Quest[768] = "Tossing the Bouquet" -$Quest[769] = "Making Friends" -$Quest[770] = "Missing Suitor" -$Quest[771] = "Avad on the Run" -$Quest[772] = "The Eternal Debate" -$Quest[773] = "The Contest" -$Quest[774] = "Consolation" -$Quest[775] = "A Burning Desire" -$Quest[776] = "The Big Bang" -$Quest[777] = "Douse Your Enthusiasm" -$Quest[778] = "Hopeless Romantic" -$Quest[779] = "Fire in the Sky" -$Quest[780] = "The Knights Who Say Nian" -$Quest[781] = "Just My Luck" -$Quest[782] = "All for One and One for Justice" -$Quest[783] = "Chasing Zenmai" -$Quest[784] = "Out of Kourna" -$Quest[785] = "Counting the Fallen" -$Quest[786] = "Commissioning a Memorial" -$Quest[787] = "Ancient History" -$Quest[788] = "Finding a Purpose" -$Quest[789] = "Money Back Guarantee" -$Quest[790] = "Against the Charr" -$Quest[791] = "Warband of Brothers" -$Quest[792] = "Search for the Ebon Vanguard" -$Quest[793] = "The Missing Vanguard" -$Quest[794] = "Scrambled Reinforcements" -$Quest[795] = "The Rampaging Yetis" -$Quest[796] = "The Shrine of Maat" -$Quest[797] = "A Strange Request" -$Quest[798] = "Darkness at Kaitan" -$Quest[799] = "unused" -$Quest[800] = "Flames of the Bear Spirit" -$Quest[801] = "Temple of the Damned" -$Quest[802] = "Giriff's War" -$Quest[803] = "Veiled Threat" -$Quest[804] = "Lost Souls" -$Quest[805] = "Kathandrax's Crusher" -$Quest[806] = "Curse of the Nornbear" -$Quest[807] = "The Elusive Golemancer" -$Quest[808] = "Tracking the Nornbear" -$Quest[809] = "The Anvil of Dragrimmar" -$Quest[810] = "Cold Vengeance" -$Quest[811] = "The Misanthropic Jotun Principle" -$Quest[812] = "Lab Space" -$Quest[813] = "A Gate Too Far" -$Quest[814] = "Vision of the Raven Spirit" -$Quest[815] = "Genius Operated Living Enchanted Manifestation" -$Quest[816] = "Destruction's Depths" -$Quest[817] = "Heart of the Shiverpeaks (quest)" -$Quest[818] = "Finding the Bloodstone" -$Quest[819] = "Finding Gadd" -$Quest[820] = "A Little Help" -$Quest[821] = "I Feel the Earth Move Under Cantha's Feet" -$Quest[822] = "Hole of Istan" -$Quest[823] = "What Lies Beneath" -$Quest[824] = "The Beginning of the End" -$Quest[825] = "Tekks's War" -$Quest[826] = "Worthy Deeds (Done Dirt Cheap)" -$Quest[827] = "Little Workshop of Horrors" -$Quest[828] = "Dredging the Depths" -$Quest[829] = "Watch it Jiggle" -$Quest[830] = "Anything You Can Do" -$Quest[831] = "Krak's Cavalry" -$Quest[832] = "Crystal Method" -$Quest[833] = "The Blade's Essence" -$Quest[834] = "The Arrow's Point" -$Quest[835] = "Defending the Breach" -$Quest[836] = "Cold as Ice" -$Quest[837] = "In the Service of Revenge" -$Quest[838] = "Truthseeker" -$Quest[839] = "A Hunter's Pride" -$Quest[840] = "Shadows in the Night" -$Quest[841] = "Leader of the Pack" -$Quest[842] = "Round 1: Fight!" -$Quest[843] = "Round 2: Fight!" -$Quest[844] = "Round 3: Fight!" -$Quest[845] = "Round 4: Fight!" -$Quest[846] = "Round 5: Fight!" -$Quest[847] = "Final Round: Fight!" -$Quest[848] = "Hero Tutorial" -$Quest[849] = "Bear Club for Women" -$Quest[850] = "The Great Norn Alemoot" -$Quest[851] = "The Great Norn Alemoot" -$Quest[852] = "Prenuptial Disagreement (female)" -$Quest[853] = "Prenuptial Disagreement (male)" -$Quest[854] = "Charr Invaders" -$Quest[855] = "Bear Club for Men" -$Quest[856] = "Kilroy Stonekin's Punch-Out Extravaganza!" -$Quest[857] = "The Throwdown in a Norn Town" -$Quest[858] = "Punch the Clown" -$Quest[859] = "Destructive Research" -$Quest[860] = "The Destroyer Challenge" -$Quest[861] = "Falling Out" -$Quest[862] = "Forgotten Relics" -$Quest[863] = "unused" -$Quest[864] = "The Smell of Titan in the Morning" -$Quest[865] = "Be Very, Very Quiet..." -$Quest[866] = "Plan A" -$Quest[867] = "Final Round, Championship Edition: Fight!" -$Quest[868] = "Mano a Norn-o" -$Quest[869] = "A Time for Heroes" -$Quest[870] = "The Assassin's Revenge" -$Quest[871] = "The Imploding Past" -$Quest[872] = "Failure to Communicate" -$Quest[873] = "Service: In Defense of the Eye" -$Quest[874] = "Service: Practice, Dummy" -$Quest[875] = "Polymock: Defeat Plurgg" -$Quest[876] = "Polymock: Defeat Fonk" -$Quest[877] = "Polymock: Defeat Dune Teardrinker" -$Quest[878] = "Polymock: Defeat Grulhammer Silverfist" -$Quest[879] = "Polymock: Defeat Necromancer Volumandus" -$Quest[880] = "Polymock: Defeat Master Hoff" -$Quest[881] = "Polymock: Defeat Blarp" -$Quest[882] = "Polymock: Defeat Yulma" -$Quest[883] = "Single Ugly Grawl Seeks Same for Mindless Destruction in Ascalon" -$Quest[884] = "The Hunting of the Charr" -$Quest[885] = "Frogstomp" -$Quest[886] = "Give Peace a Chance" -$Quest[887] = "The Cipher of Balthazar" -$Quest[888] = "The Cipher of Dwayna" -$Quest[889] = "The Cipher of Grenth" -$Quest[890] = "The Cipher of Kormir" -$Quest[891] = "The Cipher of Lyssa" -$Quest[892] = "The Cipher of Melandru" -$Quest[893] = "The Path to Revelations" -$Quest[894] = "The Big Unfriendly Jotun" -$Quest[895] = "Forbidden Fruit" -$Quest[896] = "unused" -$Quest[897] = "O Brave New World" -$Quest[898] = "Lost Treasure of King Hundar" -$Quest[899] = "Deeprunner's Map" -$Quest[900] = "Attack on Jalis's Camp" -$Quest[901] = "The Asura Trap" -$Quest[902] = "Moths to a Flame" -$Quest[903] = "Insidious Remnants" -$Quest[904] = "Turning the Page" -$Quest[905] = "Northern Allies" -$Quest[906] = "Assault on the Stronghold" -$Quest[907] = "Blood Washes Blood" -$Quest[908] = "The Dawn of Rebellion" -$Quest[909] = "What Must Be Done" -$Quest[910] = "Nornhood" -$Quest[911] = "The Justiciar's End" -$Quest[912] = "Haunted" -$Quest[913] = "Against the Destroyers" -$Quest[914] = "Fire and Pain" -$Quest[915] = "The Knowledgeable Asura" -$Quest[916] = "Then and Now, Here and There" -$Quest[917] = "The Last Hierophant" -$Quest[918] = "Kilroy's Punchout Tournament" -$Quest[919] = "Special Ops: Dragon's Gullet" -$Quest[920] = "Special Ops: Flame Temple Corridor" -$Quest[921] = "Special Ops: Grendich Courthouse" -$Quest[922] = "The Tengu Accords" -$Quest[923] = "The Battle of Jahai" -$Quest[924] = "The Flight North" -$Quest[925] = "The Rise of the White Mantle" -$Quest[926] = "Straight to the Heart" -$Quest[927] = "The Strength of Snow" -$Quest[928] = "Deactivating P.O.X." -$Quest[929] = "Deactivating N.O.X." -$Quest[930] = "Deactivating R.O.X." -$Quest[931] = "Zinn's Task" -$Quest[932] = "The Three Wise Norn" -$Quest[933] = "Charr-broiled Plans" -$Quest[934] = "Snowball Dominance" -$Quest[935] = "Wintersday Cheer" -$Quest[936] = "The Great Northern Wall (Zaishen quest)" -$Quest[937] = "Fort Ranik (Zaishen quest)" -$Quest[938] = "Ruins of Surmia (Zaishen quest)" -$Quest[939] = "Nolani Academy (Zaishen quest)" -$Quest[940] = "Borlis Pass (Zaishen quest)" -$Quest[941] = "The Frost Gate (Zaishen quest)" -$Quest[942] = "Gates of Kryta (Zaishen quest)" -$Quest[943] = "D'Alessio Seaboard (Zaishen quest)" -$Quest[944] = "Divinity Coast (Zaishen quest)" -$Quest[945] = "The Wilds (Zaishen quest)" -$Quest[946] = "Bloodstone Fen (Zaishen quest)" -$Quest[947] = "Aurora Glade (Zaishen quest)" -$Quest[948] = "Riverside Province (Zaishen quest)" -$Quest[949] = "Sanctum Cay (Zaishen quest)" -$Quest[950] = "Dunes of Despair (Zaishen quest)" -$Quest[951] = "Thirsty River (Zaishen quest)" -$Quest[952] = "Elona Reach (Zaishen quest)" -$Quest[953] = "Augury Rock (Zaishen quest)" -$Quest[954] = "The Dragon's Lair (Zaishen quest)" -$Quest[955] = "Ice Caves of Sorrow (Zaishen quest)" -$Quest[956] = "Iron Mines of Moladune (Zaishen quest)" -$Quest[957] = "Thunderhead Keep (Zaishen quest)" -$Quest[958] = "Ring of Fire (Zaishen quest)" -$Quest[959] = "Abaddon's Mouth (Zaishen quest)" -$Quest[960] = "Hell's Precipice (Zaishen quest)" -$Quest[961] = "Zen Daijun (Zaishen quest)" -$Quest[962] = "Vizunah Square (Zaishen quest)" -$Quest[963] = "Nahpui Quarter (Zaishen quest)" -$Quest[964] = "Tahnnakai Temple (Zaishen quest)" -$Quest[965] = "Arborstone (Zaishen quest)" -$Quest[966] = "Boreas Seabed (Zaishen quest)" -$Quest[967] = "Sunjiang District (Zaishen quest)" -$Quest[968] = "The Eternal Grove (Zaishen quest)" -$Quest[969] = "Unwaking Waters (Zaishen quest)" -$Quest[970] = "Gyala Hatchery (Zaishen quest)" -$Quest[971] = "Raisu Palace (Zaishen quest)" -$Quest[972] = "Imperial Sanctum (Zaishen quest)" -$Quest[973] = "unused" -$Quest[974] = "unused" -$Quest[975] = "unused" -$Quest[976] = "unused" -$Quest[977] = "unused" -$Quest[978] = "Chahbek Village (Zaishen quest)" -$Quest[979] = "Jokanur Diggings (Zaishen quest)" -$Quest[980] = "Blacktide Den (Zaishen quest)" -$Quest[981] = "Consulate Docks (Zaishen quest)" -$Quest[982] = "Venta Cemetery (Zaishen quest)" -$Quest[983] = "Kodonur Crossroads (Zaishen quest)" -$Quest[984] = "Rilohn Refuge (Zaishen quest)" -$Quest[985] = "Moddok Crevice (Zaishen quest)" -$Quest[986] = "Tihark Orchard (Zaishen quest)" -$Quest[987] = "Dzagonur Bastion (Zaishen quest)" -$Quest[988] = "Dasha Vestibule (Zaishen quest)" -$Quest[989] = "Grand Court of Sebelkeh (Zaishen quest)" -$Quest[990] = "Jennur's Horde (Zaishen quest)" -$Quest[991] = "Nundu Bay (Zaishen quest)" -$Quest[992] = "Gate of Desolation (Zaishen quest)" -$Quest[993] = "Ruins of Morah (Zaishen quest)" -$Quest[994] = "Gate of Pain (Zaishen quest)" -$Quest[995] = "Gate of Madness (Zaishen quest)" -$Quest[996] = "Abaddon's Gate (Zaishen quest)" -$Quest[997] = "unused" -$Quest[998] = "unused" -$Quest[999] = "unused" -$Quest[1000] = "Finding the Bloodstone (Zaishen quest)" -$Quest[1001] = "The Elusive Golemancer (Zaishen quest)" -$Quest[1002] = "G.O.L.E.M. (Zaishen quest)" -$Quest[1003] = "Against the Charr (Zaishen quest)" -$Quest[1004] = "Warband of Brothers (Zaishen quest)" -$Quest[1005] = "Assault on the Stronghold (Zaishen quest)" -$Quest[1006] = "Curse of the Nornbear (Zaishen quest)" -$Quest[1007] = "Blood Washes Blood (Zaishen quest)" -$Quest[1008] = "A Gate Too Far (Zaishen quest)" -$Quest[1009] = "Destruction's Depths (Zaishen quest)" -$Quest[1010] = "A Time for Heroes (Zaishen quest)" -$Quest[1011] = "unused" -$Quest[1012] = "unused" -$Quest[1013] = "unused" -$Quest[1014] = "unused" -$Quest[1015] = "unused" -$Quest[1016] = "Verata (Zaishen quest)" -$Quest[1017] = "Rotscale (Zaishen quest)" -$Quest[1018] = "unused" -$Quest[1019] = "The Iron Forgeman (Zaishen quest)" -$Quest[1020] = "The Darknesses (Zaishen quest)" -$Quest[1021] = "Kepkhet Marrowfeast (Zaishen quest)" -$Quest[1022] = "Harn and Maxine Coldstone (Zaishen quest)" -$Quest[1023] = "unused" -$Quest[1024] = "Kanaxai (Zaishen quest)" -$Quest[1025] = "Urgoz (Zaishen quest)" -$Quest[1026] = "Chung, the Attuned (Zaishen quest)" -$Quest[1027] = "Royen Beastkeeper (Zaishen quest)" -$Quest[1028] = "Kunvie Firewing (Zaishen quest)" -$Quest[1029] = "Mungri Magicbox (Zaishen quest)" -$Quest[1030] = "Arbor Earthcall (Zaishen quest)" -$Quest[1031] = "Mohby Windbeak (Zaishen quest)" -$Quest[1032] = "Ssuns, Blessed of Dwayna (Zaishen quest)" -$Quest[1033] = "Ghial the Bone Dancer (Zaishen quest)" -$Quest[1034] = "Quansong Spiritspeak (Zaishen quest)" -$Quest[1035] = "Baubao Wavewrath (Zaishen quest)" -$Quest[1036] = "Jarimiya the Unmerciful (Zaishen quest)" -$Quest[1037] = "Commander Wahli (Zaishen quest)" -$Quest[1038] = "Droajam, Mage of the Sands (Zaishen quest)" -$Quest[1039] = "Jedeh the Mighty (Zaishen quest)" -$Quest[1040] = "Korshek the Immolated (Zaishen quest)" -$Quest[1041] = "Admiral Kantoh (Zaishen quest)" -$Quest[1042] = "unused" -$Quest[1043] = "The Black Beast of Arrgh (Zaishen quest)" -$Quest[1044] = "Lord Jadoth (Zaishen quest)" -$Quest[1045] = "The Stygian Underlords (Zaishen quest)" -$Quest[1046] = "The Stygian Lords (Zaishen quest)" -$Quest[1047] = "The Greater Darkness (Zaishen quest)" -$Quest[1048] = "Ilsundur, Lord of Fire (Zaishen quest)" -$Quest[1049] = "Rragar Maneater (Zaishen quest)" -$Quest[1050] = "Murakai, Lady of the Night (Zaishen quest)" -$Quest[1051] = "Prismatic Ooze (Zaishen quest)" -$Quest[1052] = "Havok Soulwail (Zaishen quest)" -$Quest[1053] = "Frostmaw the Kinslayer (Zaishen quest)" -$Quest[1054] = "Remnant of Antiquities (Zaishen quest)" -$Quest[1055] = "Plague of Destruction (Zaishen quest)" -$Quest[1056] = "Zoldark the Unholy (Zaishen quest)" -$Quest[1057] = "Khabuus (Zaishen quest)" -$Quest[1058] = "Z'him Monns (Zaishen quest)" -$Quest[1059] = "Eldritch Ettin (Zaishen quest)" -$Quest[1060] = "Fendi Nin (Zaishen quest)" -$Quest[1061] = "TPS Regulator Golem (Zaishen quest)" -$Quest[1062] = "Arachni (Zaishen quest)" -$Quest[1063] = "Forgewight (Zaishen quest)" -$Quest[1064] = "Selvetarm (Zaishen quest)" -$Quest[1065] = "Justiciar Thommis (Zaishen quest)" -$Quest[1066] = "Rand Stormweaver (Zaishen quest)" -$Quest[1067] = "Duncan the Black (Zaishen quest)" -$Quest[1068] = "Fronis Irontoe (Zaishen quest)" -$Quest[1069] = "unused" -$Quest[1070] = "Magmus (Zaishen quest)" -$Quest[1071] = "Molotov Rocktail (Zaishen quest)" -$Quest[1072] = "Nulfastu, Earthbound (Zaishen quest)" -$Quest[1073] = "unused" -$Quest[1074] = "Pywatt the Swift (Zaishen quest)" -$Quest[1075] = "Joffs the Mitigator (Zaishen quest)" -$Quest[1076] = "Mobrin, Lord of the Marsh (Zaishen quest)" -$Quest[1077] = "Borrguus Blisterbark (Zaishen quest)" -$Quest[1078] = "Fozzy Yeoryios (Zaishen quest)" -$Quest[1079] = "Myish, Lady of the Lake (Zaishen quest)" -$Quest[1080] = "Fenrir (Zaishen quest)" -$Quest[1081] = "Vengeful Aatxe (Zaishen quest)" -$Quest[1082] = "The Four Horsemen (Zaishen quest)" -$Quest[1083] = "Charged Blackness (Zaishen quest)" -$Quest[1084] = "Dragon Lich (Zaishen quest)" -$Quest[1085] = "Priest of Menzies (Zaishen quest)" -$Quest[1086] = "Lord Khobay (Zaishen quest)" -$Quest[1087] = "Random Arena (Zaishen quest)" -$Quest[1088] = "unused" -$Quest[1089] = "Hero Battles (Zaishen quest)" -$Quest[1090] = "Fort Aspenwood (Zaishen quest)" -$Quest[1091] = "Jade Quarry (Zaishen quest)" -$Quest[1092] = "Alliance Battles (Zaishen quest)" -$Quest[1093] = "Guild Versus Guild (Zaishen quest)" -$Quest[1094] = "Heroes' Ascent (Zaishen quest)" -$Quest[1095] = "Random Arena (Zaishen quest)" -$Quest[1096] = "unused" -$Quest[1097] = "Hero Battles" -$Quest[1098] = "Fort Aspenwood (Zaishen quest)" -$Quest[1099] = "The Jade Quarry" -$Quest[1100] = "Alliance Battles (Zaishen quest)" -$Quest[1101] = "Guild Versus Guild (Zaishen quest)" -$Quest[1102] = "Heroes' Ascent (Zaishen quest)" -$Quest[1103] = "Random Arena (Zaishen quest)" -$Quest[1104] = "unused" -$Quest[1105] = "unused" -$Quest[1106] = "Fort Aspenwood (Zaishen quest)" -$Quest[1107] = "Jade Quarry (Zaishen quest)" -$Quest[1108] = "unused" -$Quest[1109] = "Guild Versus Guild (Zaishen quest)" -$Quest[1110] = "unused" -$Quest[1111] = "Random Arena (Zaishen quest)" -$Quest[1112] = "Team Arena (Zaishen quest)" -$Quest[1113] = "Hero Battles (Zaishen quest)" -$Quest[1114] = "unused" -$Quest[1115] = "Jade Quarry (Zaishen quest)" -$Quest[1116] = "Alliance Battles (Zaishen quest)" -$Quest[1117] = "Guild Versus Guild (Zaishen quest)" -$Quest[1118] = "Heroes' Ascent (Zaishen quest)" -$Quest[1119] = "Minister Cho's Estate (Zaishen quest)" -$Quest[1120] = "Something Wicked This Way Comes" -$Quest[1121] = "Don't Fear the Reapers" -$Quest[1122] = "Stemming the Skeletal Tide" -$Quest[1123] = "Every Bit Helps" -$Quest[1124] = "The Waiting Game" -$Quest[1125] = "Codex Arena (Zaishen quest)" -$Quest[1126] = "Codex Arena (Zaishen quest)" -$Quest[1127] = "unused" -$Quest[1128] = "Codex Arena (Zaishen quest)" -$Quest[1129] = "The Nightman Cometh" -$Quest[1130] = "Wanted: Inquisitor Lashona" -$Quest[1131] = "Wanted: Inquisitor Lovisa" -$Quest[1132] = "Wanted: Inquisitor Bauer" -$Quest[1133] = "Wanted: Justiciar Kasandra" -$Quest[1134] = "Wanted: Justiciar Amilyn" -$Quest[1135] = "Wanted: Justiciar Sevaan" -$Quest[1136] = "Wanted: Valis the Rampant" -$Quest[1137] = "Wanted: Maximilian the Meticulous" -$Quest[1138] = "Wanted: Sarnia the Red-Handed" -$Quest[1139] = "Wanted: Destor the Truth Seeker" -$Quest[1140] = "Wanted: Selenas the Blunt" -$Quest[1141] = "Wanted: Barthimus the Provident" -$Quest[1142] = "Wanted: Cerris" -$Quest[1143] = "Wanted: Carnak the Hungry" -$Quest[1144] = "Wanted: Insatiable Vakar" -$Quest[1145] = "Wanted: Amalek the Unmerciful" -$Quest[1146] = "Wanted: Joh the Hostile" -$Quest[1147] = "Wanted: Greves the Overbearing" -$Quest[1148] = "Wanted: Calamitous" -$Quest[1149] = "Wanted: Lev the Condemned" -$Quest[1150] = "Wanted: Vess the Disputant" -$Quest[1151] = "Wanted: Justiciar Kimii" -$Quest[1152] = "Wanted: Zaln the Jaded" -$Quest[1153] = "Wanted: Justiciar Marron" -$Quest[1154] = "Riverside Assassination" -$Quest[1155] = "A Little Help From Above" -$Quest[1156] = "Temple of the Intolerable" -$Quest[1157] = "Mustering a Response" -$Quest[1158] = "The Battle for Lion's Arch" -$Quest[1159] = "Heirlooms of the Mad King" -$Quest[1160] = "Commandeering a Mortal Vessel" -$Quest[1161] = "An Ingenious Plan" -$Quest[1162] = "Til Death Do Us Part..." -$Quest[1163] = "Open the Flood Gates of Death" -$Quest[1164] = "The Killing Joke" -$Quest[1165] = "Norn Catering" -$Quest[1166] = "The Arrowhead" -$Quest[1167] = "The Tarnished Emblem" -$Quest[1168] = "The Broken Sword" -$Quest[1169] = "The Mantle's Guise" -$Quest[1170] = "Auspicious Beginnings" -$Quest[1171] = "A Vengeance of Blades" -$Quest[1172] = "Shadows in the Jungle" -$Quest[1173] = "Rise" -$Quest[1174] = "Reunion" -$Quest[1175] = "The Wedding" -$Quest[1176] = "The War in Kryta" -$Quest[1177] = "Asuran Allies" -$Quest[1178] = "Ebon Vanguard Allies" -$Quest[1179] = "Operation: Crush Spirits" -$Quest[1180] = "Fighting in a Winter Wonderland" -$Quest[1182] = "Vanguard Bounty: Blazefiend Griefblade" -$Quest[1184] = "Vanguard Bounty: Utini Wupwup" -$Quest[1187] = "Vanguard Rescue: Save the Ascalonian Noble" -$Quest[1189] = "Vanguard Annihilation: Bandits" -$Quest[1190] = "Vanguard Annihilation: Undead" -$Quest[1191] = "Anvil Rock (Zaishen vanquish)" -$Quest[1192] = "Arborstone (Zaishen vanquish)" -$Quest[1193] = "Witman's Folly (Zaishen vanquish)" -$Quest[1194] = "Arkjok Ward (Zaishen vanquish)" -$Quest[1195] = "Ascalon Foothills (Zaishen vanquish)" -$Quest[1196] = "Bahdok Caverns (Zaishen vanquish)" -$Quest[1197] = "Cursed Lands (Zaishen vanquish)" -$Quest[1198] = "Alcazia Tangle (Zaishen vanquish)" -$Quest[1199] = "Archipelagos (Zaishen vanquish)" -$Quest[1200] = "Eastern Frontier (Zaishen vanquish)" -$Quest[1201] = "Dejarin Estate (Zaishen vanquish)" -$Quest[1202] = "Watchtower Coast (Zaishen vanquish)" -$Quest[1203] = "Arbor Bay (Zaishen vanquish)" -$Quest[1204] = "Barbarous Shore (Zaishen vanquish)" -$Quest[1205] = "Deldrimor Bowl (Zaishen vanquish)" -$Quest[1206] = "Boreas Seabed (Zaishen vanquish)" -$Quest[1207] = "Cliffs of Dohjok (Zaishen vanquish)" -$Quest[1208] = "Diessa Lowlands (Zaishen vanquish)" -$Quest[1209] = "Bukdek Byway (Zaishen vanquish)" -$Quest[1210] = "Bjora Marches (Zaishen vanquish)" -$Quest[1211] = "Crystal Overlook (Zaishen vanquish)" -$Quest[1212] = "Diviner's Ascent (Zaishen vanquish)" -$Quest[1213] = "Dalada Uplands (Zaishen vanquish)" -$Quest[1214] = "Drazach Thicket (Zaishen vanquish)" -$Quest[1215] = "Fahranur, the First City (Zaishen vanquish)" -$Quest[1216] = "Dragon's Gullet (Zaishen vanquish)" -$Quest[1217] = "Ferndale (Zaishen vanquish)" -$Quest[1218] = "Forum Highlands (Zaishen vanquish)" -$Quest[1219] = "Dreadnought's Drift (Zaishen vanquish)" -$Quest[1220] = "Drakkar Lake (Zaishen vanquish)" -$Quest[1221] = "Dry Top (Zaishen vanquish)" -$Quest[1222] = "Tears of the Fallen (Zaishen vanquish)" -$Quest[1223] = "Gyala Hatchery (Zaishen vanquish)" -$Quest[1224] = "Ettin's Back (Zaishen vanquish)" -$Quest[1225] = "Gandara, the Moon Fortress (Zaishen vanquish)" -$Quest[1226] = "Grothmar Wardowns (Zaishen vanquish)" -$Quest[1227] = "Flame Temple Corridor (Zaishen vanquish)" -$Quest[1228] = "Haiju Lagoon (Zaishen vanquish)" -$Quest[1229] = "Frozen Forest (Zaishen vanquish)" -$Quest[1230] = "Garden of Seborhin (Zaishen vanquish)" -$Quest[1231] = "Grenth's Footprint (Zaishen vanquish)" -$Quest[1232] = "Jaya Bluffs (Zaishen vanquish)" -$Quest[1233] = "Holdings of Chokhin (Zaishen vanquish)" -$Quest[1234] = "Ice Cliff Chasms (Zaishen vanquish)" -$Quest[1235] = "Griffon's Mouth (Zaishen vanquish)" -$Quest[1236] = "Kinya Province (Zaishen vanquish)" -$Quest[1237] = "Issnur Isles (Zaishen vanquish)" -$Quest[1238] = "Jaga Moraine (Zaishen vanquish)" -$Quest[1239] = "Ice Floe (Zaishen vanquish)" -$Quest[1240] = "Maishang Hills (Zaishen vanquish)" -$Quest[1241] = "Jahai Bluffs (Zaishen vanquish)" -$Quest[1242] = "Riven Earth (Zaishen vanquish)" -$Quest[1243] = "Icedome (Zaishen vanquish)" -$Quest[1244] = "Minister Cho's Estate (Zaishen vanquish)" -$Quest[1245] = "Mehtani Keys (Zaishen vanquish)" -$Quest[1246] = "Sacnoth Valley (Zaishen vanquish)" -$Quest[1247] = "Iron Horse Mine (Zaishen vanquish)" -$Quest[1248] = "Morostav Trail (Zaishen vanquish)" -$Quest[1249] = "Plains of Jarin (Zaishen vanquish)" -$Quest[1250] = "Sparkfly Swamp (Zaishen vanquish)" -$Quest[1251] = "Kessex Peak (Zaishen vanquish)" -$Quest[1252] = "Mourning Veil Falls (Zaishen vanquish)" -$Quest[1253] = "The Alkali Pan (Zaishen vanquish)" -$Quest[1254] = "Varajar Fells (Zaishen vanquish)" -$Quest[1255] = "Lornar's Pass (Zaishen vanquish)" -$Quest[1256] = "Pongmei Valley (Zaishen vanquish)" -$Quest[1257] = "The Floodplain of Mahnkelon (Zaishen vanquish)" -$Quest[1258] = "Verdant Cascades (Zaishen vanquish)" -$Quest[1259] = "Majesty's Rest (Zaishen vanquish)" -$Quest[1260] = "Raisu Palace (Zaishen vanquish)" -$Quest[1261] = "The Hidden City of Ahdashim (Zaishen vanquish)" -$Quest[1262] = "Rhea's Crater (Zaishen vanquish)" -$Quest[1263] = "Mamnoon Lagoon (Zaishen vanquish)" -$Quest[1264] = "Shadow's Passage (Zaishen vanquish)" -$Quest[1265] = "The Mirror of Lyss (Zaishen vanquish)" -$Quest[1266] = "Saoshang Trail (Zaishen vanquish)" -$Quest[1267] = "Nebo Terrace (Zaishen vanquish)" -$Quest[1268] = "Shenzun Tunnels (Zaishen vanquish)" -$Quest[1269] = "The Ruptured Heart (Zaishen vanquish)" -$Quest[1270] = "Salt Flats (Zaishen vanquish)" -$Quest[1271] = "North Kryta Province (Zaishen vanquish)" -$Quest[1272] = "Silent Surf (Zaishen vanquish)" -$Quest[1273] = "The Shattered Ravines (Zaishen vanquish)" -$Quest[1274] = "Scoundrel's Rise (Zaishen vanquish)" -$Quest[1275] = "Old Ascalon (Zaishen vanquish)" -$Quest[1276] = "Sunjiang District (Zaishen vanquish)" -$Quest[1277] = "The Sulfurous Wastes (Zaishen vanquish)" -$Quest[1278] = "Magus Stones (Zaishen vanquish)" -$Quest[1279] = "Perdition Rock (Zaishen vanquish)" -$Quest[1280] = "Sunqua Vale (Zaishen vanquish)" -$Quest[1281] = "Turai's Procession (Zaishen vanquish)" -$Quest[1282] = "Norrhart Domains (Zaishen vanquish)" -$Quest[1283] = "Pockmark Flats (Zaishen vanquish)" -$Quest[1284] = "Tahnnakai Temple (Zaishen vanquish)" -$Quest[1285] = "Vehjin Mines (Zaishen vanquish)" -$Quest[1286] = "Poisoned Outcrops (Zaishen vanquish)" -$Quest[1287] = "Prophet's Path (Zaishen vanquish)" -$Quest[1288] = "The Eternal Grove (Zaishen vanquish)" -$Quest[1289] = "Tasca's Demise (Zaishen vanquish)" -$Quest[1290] = "Resplendent Makuun (Zaishen vanquish)" -$Quest[1291] = "Reed Bog (Zaishen vanquish)" -$Quest[1292] = "Unwaking Waters (Zaishen vanquish)" -$Quest[1293] = "Stingray Strand (Zaishen vanquish)" -$Quest[1294] = "Sunward Marches (Zaishen vanquish)" -$Quest[1295] = "Regent Valley (Zaishen vanquish)" -$Quest[1296] = "Wajjun Bazaar (Zaishen vanquish)" -$Quest[1297] = "Yatendi Canyons (Zaishen vanquish)" -$Quest[1298] = "Twin Serpent Lakes (Zaishen vanquish)" -$Quest[1299] = "Sage Lands (Zaishen vanquish)" -$Quest[1300] = "Xaquang Skyway (Zaishen vanquish)" -$Quest[1301] = "Zehlon Reach (Zaishen vanquish)" -$Quest[1302] = "Tangle Root (Zaishen vanquish)" -$Quest[1303] = "Silverwood (Zaishen vanquish)" -$Quest[1304] = "Zen Daijun (Zaishen vanquish)" -$Quest[1305] = "The Arid Sea (Zaishen vanquish)" -$Quest[1306] = "Nahpui Quarter (Zaishen vanquish)" -$Quest[1307] = "Skyward Reach (Zaishen vanquish)" -$Quest[1308] = "The Scar (Zaishen vanquish)" -$Quest[1309] = "The Black Curtain (Zaishen vanquish)" -$Quest[1310] = "Panjiang Peninsula (Zaishen vanquish)" -$Quest[1311] = "Snake Dance (Zaishen vanquish)" -$Quest[1312] = "Traveler's Vale (Zaishen vanquish)" -$Quest[1313] = "The Breach (Zaishen vanquish)" -$Quest[1314] = "Lahtenda Bog (Zaishen vanquish)" -$Quest[1315] = "Spearhead Peak (Zaishen vanquish)" -$Quest[1316] = "Mount Qinkai (Zaishen vanquish)" -$Quest[1317] = "Marga Coast (Zaishen vanquish)" -$Quest[1318] = "Melandru's Hope (Zaishen vanquish)" -$Quest[1319] = "The Falls (Zaishen vanquish)" -$Quest[1320] = "Joko's Domain (Zaishen vanquish)" -$Quest[1321] = "Vulture Drifts (Zaishen vanquish)" -$Quest[1322] = "Wilderness of Bahdza (Zaishen vanquish)" -$Quest[1323] = "Talmark Wilderness (Zaishen vanquish)" -$Quest[1324] = "Vehtendi Valley (Zaishen vanquish)" -$Quest[1325] = "Talus Chute (Zaishen vanquish)" -$Quest[1326] = "Mineral Springs (Zaishen vanquish)" -$Quest[1329] = "The Path to Combat: Random Arenas" -$Quest[1330] = "The Path to Victory: Random Arenas" -$Quest[1331] = "The Path to Combat: Codex Arena" -$Quest[1332] = "The Path to Victory: Codex Arena" -$Quest[1333] = "The Path to Combat: Guild Battles" -$Quest[1334] = "The Path to Victory: Guild Battles" -$Quest[1335] = "The Path to Combat: Heroes' Ascent" -$Quest[1336] = "The Path to Victory: Heroes' Ascent (suspected)" -$Quest[1342] = "Cleansing Bukdek Byway" -$Quest[1343] = "Cleansing Bukdek Byway (Hard mode)" -$Quest[1344] = "Cleansing Shadow's Passage" -$Quest[1345] = "Cleansing Shadow's Passage (Hard mode)" -$Quest[1346] = "Cleansing Shenzun Tunnels" -$Quest[1347] = "Cleansing Shenzun Tunnels (Hard mode)" -$Quest[1348] = "Cleansing the Undercity" -$Quest[1349] = "Cleansing the Undercity (Hard mode)" -$Quest[1350] = "Cleansing the Sunjiang District" -$Quest[1351] = "Cleansing the Sunjiang District (Hard mode)" -$Quest[1352] = "Cleansing Pongmei Valley" -$Quest[1353] = "Cleansing Pongmei Valley (Hard mode)" -$Quest[1354] = "Rescue at Minister Cho's Estate" -$Quest[1355] = "Rescue at Minister Cho's Estate (Hard mode)" -$Quest[1356] = "Cleansing Haiju Lagoon" -$Quest[1357] = "Cleansing Haiju Lagoon (Hard mode)" -$Quest[1358] = "Cleansing Zen Daijun" -$Quest[1359] = "Cleansing Zen Daijun (Hard mode)" -$Quest[1360] = "Cleansing Rhea's Crater" -$Quest[1361] = "Cleansing Rhea's Crater (Hard mode)" -$Quest[1362] = "Cleansing the Silent Surf" -$Quest[1363] = "Cleansing the Silent Surf (Hard mode)" -$Quest[1364] = "Cleansing Morostav Trail" -$Quest[1365] = "Cleansing Morostav Trail (Hard mode)" -$Quest[1366] = "Intercepting the Am Fah" -$Quest[1367] = "Intercepting the Am Fah (Hard mode)" -$Quest[1368] = "Tracking the Corruption" -$Quest[1369] = "Tracking the Corruption (Hard mode)" -$Quest[1370] = "Architect of Corruption" -$Quest[1371] = "Architect of Corruption (Hard mode)" -$Quest[1372] = "The Gangs of Kaineng" -$Quest[1373] = "The Gangs of Kaineng (Hard mode)" -$Quest[1374] = "What Waits in Shadow" -$Quest[1375] = "What Waits in Shadow (Hard mode)" -$Quest[1376] = "A Chance Encounter" -$Quest[1377] = "A Chance Encounter (Hard mode)" -$Quest[1378] = "Cantha Courier Crisis" -$Quest[1379] = "Cantha Courier Crisis (Hard mode)" -$Quest[1380] = "Light My Fire" -$Quest[1381] = "Light My Fire (Hard mode)" -$Quest[1382] = "When Kappa Attack" -$Quest[1383] = "When Kappa Attack (Hard mode)" -$Quest[1384] = "A Favor Returned" -$Quest[1385] = "Deadly Cargo" -$Quest[1386] = "Trading Blows" -$Quest[1387] = "Ever Closer to the Edge" -$Quest[1388] = "Violence in the Streets" -$Quest[1389] = "A Favor Returned (Hard mode)" -$Quest[1390] = "Deadly Cargo (Hard mode)" -$Quest[1391] = "Trading Blows (Hard mode)" -$Quest[1392] = "Ever Closer to the Edge (Hard mode)" -$Quest[1393] = "Violence in the Streets (Hard mode)" -$Quest[1394] = "The Rescue Attempt" -$Quest[1395] = "The Rescue Attempt (Hard mode)" -$Quest[1396] = "Warning the Angchu" -$Quest[1397] = "Free Birds" -$Quest[1398] = "Honorable Combat" -$Quest[1399] = "A Treaty's a Treaty" -$Quest[1400] = "Warning the Angchu (Hard mode)?" -$Quest[1401] = "Free Birds (Hard mode)" -$Quest[1402] = "Honorable Combat (Hard mode)" -$Quest[1403] = "A Treaty's a Treaty (Hard mode)" -$Quest[1404] = "Family Matters" -$Quest[1405] = "Family Matters (Hard mode)" -$Quest[1406] = "Evil Residents" -$Quest[1407] = "Evil Residents Code: Harmonica" -$Quest[1408] = "Finding Jinnai" -$Quest[1409] = "Finding Jinnai (Hard mode)" -$Quest[1410] = "Calling All Thugs" -$Quest[1411] = "Raid on Kaineng Center" -$Quest[1412] = "There Goes the Neighborhood" -$Quest[1413] = "Ministry of Oppression" -$Quest[1414] = "Calling All Thugs (Hard mode)" -$Quest[1415] = "Raid on Kaineng Center (Hard mode)" -$Quest[1416] = "There Goes the Neighborhood (Hard mode)" -$Quest[1417] = "Ministry of Oppression (Hard mode)" -$Quest[1418] = "Raid on Shing Jea Monastery" -$Quest[1419] = "Raid on Shing Jea Monastery (Hard mode)" -$Quest[1420] = "The Final Confrontation" -$Quest[1421] = "The Final Confrontation (Hard mode)" -$Quest[1422] = "Memories of Purity" -$Quest[1423] = "Vassal States" -$Quest[1424] = "Vassal States (Hard mode)" -$Quest[1425] = "Redemption for the Lost" -$Quest[1426] = "Redemption for the Lost (Hard mode)" -$Quest[1429] = "Wayfarer's Reverie: Tyria" -$Quest[1430] = "Wayfarer's Reverie: Cantha" -$Quest[1431] = "Wayfarer's Reverie: Elona" -$Quest[1432] = "Wayfarer's Reverie: The Far North" -$Quest[1433] = "Mad Little Pony" -$Quest[1434] = "Better You Than Me" -$Quest[1435] = "Double Your Pleasure and RUN!" -$Quest[1436] = "A Humbling Gift" -$Quest[1437] = "The Polar Depressed" -$Quest[1438] = "Take My Sister, Please" -#EndRegion Quest Names +1430 +#include-once + +#Region Quest Names +Global $Quest[1500] +$Quest[0] = "The Ascalon Settlement" +$Quest[1] = "The Villainy of Galrath" +$Quest[2] = "Bandit Trouble" +$Quest[3] = "A Gift for Jalis Ironhammer" +$Quest[4] = "To Kryta: Journey's End" +$Quest[5] = "Graven Images" +$Quest[6] = "The Hot Springs Murders" +$Quest[7] = "The Last Hog" +$Quest[8] = "The Lost Princess" +$Quest[9] = "Duties of a Lionguard" +$Quest[10] = "The Royal Papers" +$Quest[11] = "A Journey of Redemption" +$Quest[12] = "Blankets for the Settlers" +$Quest[13] = "Orrian Excavation" +$Quest[14] = "Malaquire's Test" +$Quest[15] = "Reversing the Skales" +$Quest[16] = "The Undead Hordes" +$Quest[17] = "Lagaan's Ordeal" +$Quest[18] = "Lagaan's Gratitude" +$Quest[19] = "Report to the White Mantle" +$Quest[20] = "Merchant's Plea" +$Quest[21] = "A Belated Betrothal" +$Quest[22] = "Ancient Secrets" +$Quest[23] = "The Forgotten Ones" +$Quest[24] = "Forgotten Wisdom" +$Quest[25] = "Ghostly Vengeance" +$Quest[26] = "Into the Unknown" +$Quest[27] = "The Misplaced Sword" +$Quest[28] = "Sands Of Souls" +$Quest[29] = "The Mesmer's Path" +$Quest[30] = "The Necromancer's Path" +$Quest[31] = "The Elementalist's Path" +$Quest[32] = "The Monk's Path" +$Quest[33] = "The Warrior's Path" +$Quest[34] = "The Ranger's Path" +$Quest[35] = "War Preparations" +$Quest[36] = "The Hunter's Horn" +$Quest[37] = "The Supremacy of Air" +$Quest[38] = "Rites of Remembrance" +$Quest[39] = "Little Thom's Big Cloak" +$Quest[40] = "The Vineyard Problem" +$Quest[41] = "Bandit Raid" +$Quest[42] = "A Test of Marksmanship" +$Quest[43] = "The Power of Blood" +$Quest[44] = "The Rogue's Replacement" +$Quest[45] = "Charr in the Catacombs" +$Quest[46] = "Charr at the Gate" +$Quest[47] = "The Accursed Path" +$Quest[48] = "The Poison Devourer" +$Quest[49] = "Domination Magic (quest)" +$Quest[50] = "The True King" +$Quest[51] = "The Egg Hunter" +$Quest[52] = "The Worm Problem" +$Quest[53] = "The Prize Moa Bird" +$Quest[54] = "Further Adventures" +$Quest[55] = "The Wayward Wizard" +$Quest[56] = "Adventure with an Ally" +$Quest[57] = "The Orchard" +$Quest[58] = "A Gift for Althea" +$Quest[59] = "Gwen's Flute (quest)" +$Quest[60] = "Warrior's Challenge" +$Quest[61] = "Tithe for Ashford Abbey" +$Quest[62] = "Unsettling Rumors" +$Quest[63] = "A New Mesmer Trainer" +$Quest[64] = "A New Necromancer Trainer" +$Quest[65] = "A New Elementalist Trainer" +$Quest[66] = "A New Monk Trainer" +$Quest[67] = "A New Warrior Trainer" +$Quest[68] = "A New Ranger Trainer" +$Quest[69] = "Across the Wall" +$Quest[70] = "Poor Tenant" +$Quest[71] = "A Mesmer's Burden" +$Quest[72] = "The Necromancer's Novice" +$Quest[73] = "The Elementalist Experiment" +$Quest[74] = "A Monk's Mission" +$Quest[75] = "Grawl Invasion" +$Quest[76] = "The Ranger's Companion" +$Quest[77] = "Protection Prayers (quest)" +$Quest[78] = "Opposition to the King" +$Quest[79] = "A Second Profession" +$Quest[80] = "Message from a Friend" +$Quest[81] = "Mesmer Test" +$Quest[82] = "Necromancer Test" +$Quest[83] = "Elementalist Test" +$Quest[84] = "Monk Test" +$Quest[85] = "Warrior Test" +$Quest[86] = "Ranger Test" +$Quest[87] = "The Blessings of Balthazar" +$Quest[88] = "Unnatural Growths" +$Quest[89] = "The Path to Glory" +$Quest[90] = "Trouble in the Woods" +$Quest[91] = "White Mantle Wrath: A Helping Hand" +$Quest[92] = "Urgent Warning" +$Quest[93] = "Blood And Smoke" +$Quest[94] = "Dropping Eaves" +$Quest[95] = "A Brother's Fury" +$Quest[96] = "Eye For Profit" +$Quest[97] = "Mysterious Message (Prophecies quest)" +$Quest[98] = "The Price of Steel" +$Quest[99] = "White Mantle Wrath: Demagogue's Vanguard" +$Quest[100] = "Passage Through The Dark River" +$Quest[101] = "Clear the Chamber" +$Quest[102] = "Servants of Grenth" +$Quest[103] = "Unwanted Guests" +$Quest[104] = "Demon Assassin" +$Quest[105] = "Imprisoned Spirits" +$Quest[106] = "The Four Horsemen" +$Quest[107] = "Terrorweb Queen" +$Quest[108] = "Escort of Souls" +$Quest[109] = "Restoring Grenth's Monuments" +$Quest[110] = "Wrathful Spirits" +$Quest[111] = "Charr Reinforcements" +$Quest[112] = "Symon's History of Ascalon" +$Quest[113] = "Experimental Elixir" +$Quest[114] = "Trying Times" +$Quest[115] = "Unnatural Creatures" +$Quest[116] = "The Charr Patrol" +$Quest[117] = "The Charr Staging Area" +$Quest[118] = "A Cure for Ralena" +$Quest[119] = "Casualty Report" +$Quest[120] = "Death in the Ruins" +$Quest[121] = "Fallen Soldiers" +$Quest[122] = "Oberan's Rage" +$Quest[123] = "Althea's Ashes" +$Quest[124] = "Hammer and Anvil" +$Quest[125] = "The Geomancer's Test" +$Quest[126] = "The Way of the Geomancer" +$Quest[127] = "Shalev's Task" +$Quest[128] = "Elemental Knowledge" +$Quest[129] = "The Duke's Daughter" +$Quest[130] = "Barradin's Advance" +$Quest[131] = "Fires in the East" +$Quest[132] = "Fires in the North" +$Quest[133] = "Frontier Gate Fugitives" +$Quest[134] = "Bounty for Chieftain Murg" +$Quest[135] = "Helping the People of Ascalon" +$Quest[136] = "Cities of Ascalon" +$Quest[137] = "Counting the Fallen" +$Quest[138] = "Scavengers in Old Ascalon" +$Quest[139] = "Garfazz Bloodfang (quest)" +$Quest[140] = "The King's Message" +$Quest[141] = "In Memory of Paulus" +$Quest[142] = "Protecting Ascalon" +$Quest[143] = "The Lost Master" +$Quest[144] = "The Ambassador's Quandary" +$Quest[145] = "Rastin's Ritual" +$Quest[146] = "A Mission of Peace" +$Quest[147] = "The Troublesome Artifact" +$Quest[148] = "Barradin's Stand" +$Quest[149] = "Army Life" +$Quest[150] = "Into the Breach" +$Quest[151] = "Military Matters" +$Quest[152] = "The Red-Cloaked Deserter" +$Quest[153] = "The Siege of Piken Square" +$Quest[154] = "Replacement Healers" +$Quest[155] = "Rogenn's Duel" +$Quest[156] = "Regent Valley Defense" +$Quest[157] = "Mesmerizing the Enemy" +$Quest[158] = "The Stolen Artifact" +$Quest[159] = "Scorched Earth (Prophecies quest)" +$Quest[160] = "Sowing Seeds" +$Quest[161] = "Gargoyle Trouble" +$Quest[162] = "Endangered Species" +$Quest[163] = "The Missing Melandru Relic" +$Quest[164] = "Supplies for the Duke" +$Quest[165] = "Ruins of Surmia (quest)" +$Quest[166] = "Vanguard Equipment" +$Quest[167] = "Deliver a Message to My Wife" +$Quest[168] = "Recruits for Hollis" +$Quest[169] = "The Krytan Ambassador" +$Quest[170] = "Collect Charr Armor Set" +$Quest[171] = "Defend the Wall" +$Quest[172] = "Slay Rotscale" +$Quest[173] = "Slay Stank Reekfoul" +$Quest[174] = "Repel Charr" +$Quest[175] = "Scout Charr" +$Quest[176] = "Collect Gargoyle Fangs" +$Quest[177] = "Defend Droknar's Forge" +$Quest[178] = "The Road to Borlis Pass" +$Quest[179] = "To Kryta: The Ice Cave" +$Quest[180] = "The Stone Summit Champion" +$Quest[181] = "Renegade Necromancer" +$Quest[182] = "The Deserters" +$Quest[183] = "A Heart of Ice" +$Quest[184] = "The Missing Artisan" +$Quest[185] = "Helping the Dwarves" +$Quest[186] = "Hungry Devourer" +$Quest[187] = "Oswalt's Epitaph" +$Quest[188] = "Securing the Vale" +$Quest[189] = "Minaar's Trouble" +$Quest[190] = "Iron Horse War Machine" +$Quest[191] = "Minaar's Worry" +$Quest[192] = "Stone Summit Beastmasters" +$Quest[193] = "Slay Frostbite" +$Quest[194] = "The Hero's Journey" +$Quest[195] = "The Hero's Challenge" +$Quest[196] = "Seeking The Seer" +$Quest[197] = "Shiverpeak Stragglers" +$Quest[198] = "The Way is Blocked" +$Quest[199] = "To Kryta: Refugees" +$Quest[200] = "The Wayward Monk" +$Quest[201] = "Into the Breach" +$Quest[202] = "Defend the Temple of War" +$Quest[203] = "Army of Darkness" +$Quest[204] = "The Wailing Lord" +$Quest[205] = "A Gift of Griffons" +$Quest[206] = "Slaves of Menzies" +$Quest[207] = "Restore the Temple of War" +$Quest[208] = "The Hunt" +$Quest[209] = "The Eternal Forgemaster" +$Quest[210] = "Champions of Orr" +$Quest[211] = "Tower of Strength" +$Quest[212] = "Tower of Courage" +$Quest[213] = "Final Blow" +$Quest[214] = "Wisdom of the Druids" +$Quest[215] = "Family Ties (Prophecies quest)" +$Quest[216] = "The Weaver of Nebo" +$Quest[217] = "War Preparations" +$Quest[218] = "War Preparations" +$Quest[219] = "War Preparations" +$Quest[220] = "War Preparations" +$Quest[221] = "War Preparations" +$Quest[222] = "War Preparations" +$Quest[223] = "The False Gods" +$Quest[224] = "Khobay the Betrayer" +$Quest[225] = "Caravan in Trouble" +$Quest[226] = "Defend North Kryta Province" +$Quest[227] = "Defend Denravi" +$Quest[228] = "The Last Day Dawns" +$Quest[229] = "The Titan Source" +$Quest[230] = "Cold One" +$Quest[231] = "The Forge Heart" +$Quest[232] = "Wrenches In The Gears" +$Quest[233] = "Unspeakable, Unknowable" +$Quest[234] = "To Sorrow's Furnace" +$Quest[235] = "Noble Intentions" +$Quest[236] = "Noble Intentions Plan B" +$Quest[237] = "Kilroy Stonekin (quest)" +$Quest[238] = "Summit Slaves" +$Quest[239] = "Gathering Resources" +$Quest[240] = "Unruly Slaves" +$Quest[241] = "Fire in the Hole" +$Quest[242] = "Tasca's Reprise" +$Quest[243] = "Subversive Ideas" +$Quest[244] = "Political Ramifications" +$Quest[245] = "The Final Assault" +$Quest[246] = "Seek Out Headmaster Lee" +$Quest[247] = "Seek Out Headmaster Kaa" +$Quest[248] = "Seek Out Headmaster Kuju" +$Quest[249] = "Seek Out Headmaster Vhang" +$Quest[250] = "Seek Out Headmaster Zhan" +$Quest[251] = "Seek Out Headmaster Amara" +$Quest[252] = "Seek Out Headmaster Greico" +$Quest[253] = "Seek Out Headmaster Quin" +$Quest[254] = "Locate Jinzo" +$Quest[255] = "Locate Mei Ling" +$Quest[256] = "Locate Reng Ku" +$Quest[257] = "Locate Ronsu" +$Quest[258] = "Locate Sister Tai" +$Quest[259] = "Locate Talon Silverwing" +$Quest[260] = "Locate Sujun" +$Quest[261] = "Locate Professor Gai" +$Quest[262] = "Track Down Panaku" +$Quest[263] = "Track Down Lo Sha" +$Quest[264] = "Track Down Su" +$Quest[265] = "Track Down Kai Ying" +$Quest[266] = "Track Down Brother Pe Wan" +$Quest[267] = "Track Down Weng Gha" +$Quest[268] = "Track Down Zho" +$Quest[269] = "Track Down Ang the Ephemeral" +$Quest[270] = "Opening Strike" +$Quest[271] = "Cleansing the Shrine" +$Quest[272] = "Little Creatures" +$Quest[273] = "Spark of Interest" +$Quest[274] = "Stale Mate" +$Quest[275] = "Talon's Duel" +$Quest[276] = "Free the Fur" +$Quest[277] = "Minions Gone Wild" +$Quest[278] = "Dual Strike" +$Quest[279] = "Lo Sha's Gift" +$Quest[280] = "Reaping the Naga" +$Quest[281] = "Sparring Elements" +$Quest[282] = "Seeking a Cure" +$Quest[283] = "The Crop Thieves" +$Quest[284] = "The Yeti Hunt" +$Quest[285] = "Shackled Spirits" +$Quest[286] = "An Audience with Master Togo (assassin)" +$Quest[287] = "An Audience with Master Togo (mesmer)" +$Quest[288] = "An Audience with Master Togo (necromancer)" +$Quest[289] = "An Audience with Master Togo (elementalist)" +$Quest[290] = "An Audience with Master Togo (monk)" +$Quest[291] = "An Audience with Master Togo (warrior)" +$Quest[292] = "An Audience with Master Togo (ranger)" +$Quest[293] = "An Audience with Master Togo (ritualist)" +$Quest[294] = "Speak with Headmaster Lee (Assassin)" +$Quest[295] = "Speak with Headmaster Kaa (Mesmer)" +$Quest[296] = "Speak with Headmaster Kuju (Necromancer)" +$Quest[297] = "Speak with Headmaster Vhang (Elementalist)" +$Quest[298] = "Speak with Headmaster Amara (Monk)" +$Quest[299] = "Speak with Headmaster Zhan (Warrior)" +$Quest[300] = "Speak with Headmaster Greico (Ranger)" +$Quest[301] = "Speak with Headmaster Quin (Ritualist)" +$Quest[302] = "Defense Against Hexes" +$Quest[303] = "Disruption" +$Quest[304] = "Skill Chaining" +$Quest[305] = "Snaring Course" +$Quest[306] = "Disenchantment Course" +$Quest[307] = "Condition Removal" +$Quest[308] = "Advanced Defense Techniques" +$Quest[309] = "Elementalist Insignia" +$Quest[310] = "Warrior Insignia" +$Quest[311] = "Mesmer Insignia" +$Quest[312] = "Monk Insignia" +$Quest[313] = "Necromancer Insignia" +$Quest[314] = "Ranger Insignia" +$Quest[315] = "Ritualist Insignia" +$Quest[316] = "Assassin Insignia" +$Quest[317] = "Choose Your Secondary Profession (Factions quest)" +$Quest[318] = "A Formal Introduction" +$Quest[319] = "The Sickened Village" +$Quest[320] = "The Red Frog" +$Quest[321] = "The Kaguchi Brothers" +$Quest[322] = "The Box of Illusions" +$Quest[323] = "Old Friends, Dark Times" +$Quest[324] = "Power Surge" +$Quest[325] = "Cleansing the Steel" +$Quest[326] = "The Stone of the Elements" +$Quest[327] = "Assassination Attempt" +$Quest[328] = "Little Lost Bear" +$Quest[329] = "Imperial Assistance" +$Quest[330] = "Medical Emergency" +$Quest[331] = "Red Tape" +$Quest[332] = "Assist the Guards" +$Quest[333] = "Straight to the Top" +$Quest[334] = "Drink from the Chalice of Corruption" +$Quest[335] = "Refuse to Drink" +$Quest[336] = "The Search for a Cure" +$Quest[337] = "Seek out Brother Tosai" +$Quest[338] = "An End to Suffering" +$Quest[339] = "Warning the Tengu" +$Quest[340] = "The Threat Grows" +$Quest[341] = "Journey to the Master" +$Quest[342] = "The Road Less Traveled" +$Quest[343] = "Looking For Trouble" +$Quest[344] = "To the Rescue (Factions quest)" +$Quest[345] = "To Zen Daijun" +$Quest[346] = "Lost Treasure" +$Quest[347] = "Mantid Hatchlings" +$Quest[348] = "An Unwelcome Guest" +$Quest[349] = "A Master's Burden" +$Quest[350] = "To Tahnnakai Temple" +$Quest[351] = "Into the Whirlpool" +$Quest[352] = "Journey to House zu Heltzer" +$Quest[353] = "Journey to Cavalon" +$Quest[354] = "Naga Oil" +$Quest[355] = "Street Justice" +$Quest[356] = "Finding The Oracle" +$Quest[357] = "Closer to the Stars" +$Quest[358] = "Appearance of the Naga" +$Quest[359] = "The Rite of Valor" +$Quest[360] = "Death with Honor" +$Quest[361] = "The Nameless Masters" +$Quest[362] = "The Path of the Zaishen Elite" +$Quest[363] = "The Team Trials" +$Quest[364] = "Kurzick Supply Lines" +$Quest[365] = "Scouting Ferndale" +$Quest[366] = "Scout the Coast" +$Quest[367] = "Securing Echovald Forest" +$Quest[368] = "Duel of the Houses" +$Quest[369] = "The Jade Arena" +$Quest[370] = "In the Army (Luxon)" +$Quest[371] = "Scouting Maishang Hills" +$Quest[372] = "Luxon Supply Lines" +$Quest[373] = "In the Army Now (Kurzick)" +$Quest[374] = "Befriending the Kurzicks" +$Quest[375] = "Befriending the Luxons" +$Quest[376] = "Mayhem in the Market" +$Quest[377] = "Welcome to Cantha" +$Quest[378] = "The Defenders of the Forest" +$Quest[379] = "A Meeting With the Emperor" +$Quest[380] = "The Count's Daughter" +$Quest[381] = "Stolen Eggs" +$Quest[382] = "The Convocation" +$Quest[383] = "Journey to the Whirlpool" +$Quest[384] = "Taking Back the Palace" +$Quest[385] = "Quimang's Last Stand" +$Quest[386] = "The Siege at Tsumei Village" +$Quest[387] = "Togo's Ultimatum" +$Quest[388] = "Revenge of the Yeti" +$Quest[389] = "The Agriculturist" +$Quest[390] = "The Captured Son" +$Quest[391] = "The Naga Source" +$Quest[392] = "Sentimental Treasures" +$Quest[393] = "Skin the Snake" +$Quest[394] = "Pest Control" +$Quest[395] = "The Thieving Nanny" +$Quest[396] = "City Under Attack" +$Quest[397] = "Battle in the Sewers" +$Quest[398] = "The Ancient Forest" +$Quest[399] = "Wicked Wardens" +$Quest[400] = "Song and Stone" +$Quest[401] = "A New Escort" +$Quest[402] = "The Experimental Weaponsmith" +$Quest[403] = "Melodic Gaki Flute" +$Quest[404] = "Discord Wallow Lyre" +$Quest[405] = "Rhythm Drinker Drum" +$Quest[406] = "Envoy of the Dredge" +$Quest[407] = "Temple of the Dredge" +$Quest[408] = "Revolt of the Dredge" +$Quest[409] = "The Halcyon Job" +$Quest[410] = "Attack the Kurzicks!" +$Quest[411] = "Protect the Halcyon" +$Quest[412] = "Outcasts in the Quarry" +$Quest[413] = "Challenge of Strength" +$Quest[414] = "Artistic Endeavors" +$Quest[415] = "The Beak of Darkness" +$Quest[416] = "Wardens On the March" +$Quest[417] = "Invoking the Saints" +$Quest[418] = "If It Weren't for Bad Luck...." +$Quest[419] = "Night Raiders" +$Quest[420] = "Message on a Dragon Scale" +$Quest[421] = "Messages, Messages Everywhere" +$Quest[422] = "The Zenos Squad" +$Quest[423] = "The Impossible Sea Monster" +$Quest[424] = "Minister's Test" +$Quest[425] = "Capturing the Orrian Tome" +$Quest[426] = "A Tasty Morsel" +$Quest[427] = "Wayward Guide" +$Quest[428] = "A New Guide" +$Quest[429] = "Getting Even" +$Quest[430] = "Sticks and Stones" +$Quest[431] = "Forgotten Retribution" +$Quest[432] = "Defend Fort Aspenwood" +$Quest[433] = "The Jade Quarry (Kurzick quest)" +$Quest[434] = "Fort Aspenwood (quest)" +$Quest[435] = "The Jade Quarry (Luxon quest)" +$Quest[436] = "Mhenlo's Request" +$Quest[437] = "The Bog Beast of Bokku" +$Quest[438] = "A Belt Pouch" +$Quest[439] = "Cash Crops" +$Quest[440] = "Forming a Party" +$Quest[441] = "Study Buddy" +$Quest[442] = "The Dragon Hunter" +$Quest[443] = "More Cowbell" +$Quest[444] = "A Letter Home" +$Quest[445] = "Return of the Yeti" +$Quest[446] = "The Challenge" +$Quest[447] = "Captured" +$Quest[448] = "The Emperor in Peril" +$Quest[449] = "The Plot Thickens" +$Quest[450] = "It Ends Here" +$Quest[451] = "Masters of Corruption" +$Quest[452] = "The Drunken Master" +$Quest[453] = "Eliminate the Am Fah" +$Quest[454] = "Eliminate the Jade Brotherhood" +$Quest[455] = "Problem Salving" +$Quest[456] = "Going Home" +$Quest[457] = "Missing Daughter" +$Quest[458] = "Too High a Price" +$Quest[459] = "The Xunlai Agent" +$Quest[460] = "Luxury Goods" +$Quest[461] = "Charting the Forests" +$Quest[462] = "Charting the Jade Sea" +$Quest[463] = "Stemming the Tide" +$Quest[464] = "The Missing Corpses" +$Quest[465] = "The Missing Link" +$Quest[466] = "The Afflicted Guard" +$Quest[467] = "Seeking Shelter" +$Quest[468] = "Housing for Refugees" +$Quest[469] = "A Monstrous Revelation" +$Quest[470] = "The Shadow Blades" +$Quest[471] = "Lambs to the Slaughter" +$Quest[472] = "Sea of Green, Canopy of Stone" +$Quest[473] = "Feed the Hungry" +$Quest[474] = "Passing the Buck" +$Quest[475] = "Raze the Roost" +$Quest[476] = "Last of the Breed" +$Quest[477] = "Refuse the King" +$Quest[478] = "The Growing Threat" +$Quest[479] = "Chaos in Kryta" +$Quest[480] = "Vanishing Spirits" +$Quest[481] = "Pilgrimage" +$Quest[482] = "Requiem for a Brain" +$Quest[483] = "Under New Management" +$Quest[484] = "Destroy the Ungrateful Slaves" +$Quest[485] = "A Show of Force" +$Quest[486] = "Temple of the Monoliths" +$Quest[487] = "Return of the Undead King" +$Quest[488] = "Strange Bedfellows" +$Quest[489] = "She Hungers" +$Quest[490] = "The Council is Called" +$Quest[491] = "Desperate Measures" +$Quest[492] = "The Search for Survivors" +$Quest[493] = "A Sound of Ancient Horns" +$Quest[494] = "Garden Chores" +$Quest[495] = "Which Way Did He Go?" +$Quest[496] = "One Man's Dream" +$Quest[497] = "Puzzling Parchment" +$Quest[498] = "A Brief Introduction" +$Quest[499] = "Plague of Frogs" +$Quest[500] = "Between a Rock..." +$Quest[501] = "Botanical Research" +$Quest[502] = "Rally The Princes" +$Quest[503] = "All's Well That Ends Well" +$Quest[504] = "Warning Kehanni" +$Quest[505] = "Calling the Order" +$Quest[506] = "Greed and Regret" +$Quest[507] = "Pledge of the Merchant Princes" +$Quest[508] = "An Old Man's Past" +$Quest[509] = "An Old Man's Shame" +$Quest[510] = "To the Rescue (Nightfall quest)" +$Quest[511] = "Coffer of Joko" +$Quest[512] = "Data Mining" +$Quest[513] = "The Madness of Prophecy" +$Quest[514] = "Protect the Learned" +$Quest[515] = "Reclaiming the Temple" +$Quest[516] = "The Search for Enlightenment" +$Quest[517] = "Summertime for Bokka" +$Quest[518] = "In Defense of Theatre" +$Quest[519] = "Worst. Performance. Ever." +$Quest[520] = "The Show Must Go On" +$Quest[521] = "Valley of the Rifts" +$Quest[522] = "Population Control" +$Quest[523] = "Destroy the Harpies" +$Quest[524] = "Guard Rescue" +$Quest[525] = "Gift of the Djinn" +$Quest[526] = "Interception" +$Quest[527] = "Old Friends" +$Quest[528] = "For Your Ears Only" +$Quest[529] = "The Scourge of Vabbi" +$Quest[530] = "The Hanging Gardener" +$Quest[531] = "Scorched Earth (Nightfall quest)" +$Quest[532] = "Extinction" +$Quest[533] = "Insatiable Appetite" +$Quest[534] = "Building the Base: Prisoners of War" +$Quest[535] = "Building the Base: The Interrogation" +$Quest[536] = "Building the Base: The Meeting" +$Quest[537] = "The Tools of War" +$Quest[538] = "Feeding Frenzy" +$Quest[539] = "You Can Run..." +$Quest[540] = "Centaur Concerns" +$Quest[541] = "Mirza's Last Stand" +$Quest[542] = "Battle of Turai's Procession" +$Quest[543] = "A Question of Morality" +$Quest[544] = "A Bushel of Trouble" +$Quest[545] = "The Great Zehtuka (quest)" +$Quest[546] = "Eavesdropping" +$Quest[547] = "A Little Recon" +$Quest[548] = "Hunted!" +$Quest[549] = "The Great Escape" +$Quest[550] = "And a Hero Shall Lead Them" +$Quest[551] = "To Vabbi!" +$Quest[552] = "Centaur Blackmail" +$Quest[553] = "Mysterious Message (Nightfall quest)" +$Quest[554] = "Secrets in the Shadow" +$Quest[555] = "To Kill a Demon" +$Quest[556] = "For a Price" +$Quest[557] = "No Me, No Kormir" +$Quest[558] = "A Thorn in Varesh's Side" +$Quest[559] = "Tendering an Offer" +$Quest[560] = "Estate Planning" +$Quest[561] = "Family Ties (Nightfall quest)" +$Quest[562] = "A Message for Janeera" +$Quest[563] = "Strange Allies" +$Quest[564] = "The Foolhardy Father" +$Quest[565] = "The Young Lady Vanishes" +$Quest[566] = "Old Woman River" +$Quest[567] = "A Fool's Luck" +$Quest[568] = "Herds to the Slaughter" +$Quest[569] = "Koss's Elixir" +$Quest[570] = "Drake in a Cage" +$Quest[571] = "Troubled Lands" +$Quest[572] = "Ancestral Anguish" +$Quest[573] = "Total Corruption" +$Quest[574] = "Fish in a Barrel" +$Quest[575] = "Melonni's Meditations" +$Quest[576] = "Weird Waters" +$Quest[577] = "A Prescription for Conscription" +$Quest[578] = "Undead Defenders" +$Quest[579] = "The Cold Touch of the Past" +$Quest[580] = "Raising an Army" +$Quest[581] = "Heart or Mind: Garden in Danger" +$Quest[582] = "The Hallowed Point" +$Quest[583] = "A Deal's a Deal" +$Quest[584] = "Horde of Darkness" +$Quest[585] = "Family Soul" +$Quest[586] = "Heart or Mind: Ronjok in Danger" +$Quest[587] = "Assault on Beknur Harbor" +$Quest[588] = "Moa'vu'Kaal, Awakened" +$Quest[589] = "The Cyclone Palace" +$Quest[590] = "Down on the Bayou" +$Quest[591] = "Double Dog Dare" +$Quest[592] = "A Message Home" +$Quest[593] = "One Good Turn Deserves Another" +$Quest[594] = "What Do You Do with a Drunken Shauben?" +$Quest[595] = "Secret Passage" +$Quest[596] = "Choose Your Secondary Profession (Nightfall quest)" +$Quest[597] = "Corsair Vengeance" +$Quest[598] = "Defender's Choice" +$Quest[599] = "The Lone Raider" +$Quest[600] = "Primary Training" +$Quest[601] = "Secondary Training" +$Quest[602] = "A Hidden Threat" +$Quest[603] = "Wandered Off Again" +$Quest[604] = "Anger of the Stone Face" +$Quest[605] = "The Cult of the Stone Face" +$Quest[606] = "Stone-Faced Orders" +$Quest[607] = "Armored Transport" +$Quest[608] = "Quality Steel" +$Quest[609] = "Material Girl" +$Quest[610] = "Suwash the Pirate" +$Quest[611] = "Catch of the Day" +$Quest[612] = "Flamingo-ing... going... gone." +$Quest[613] = "A Leap of Faith" +$Quest[614] = "Zaishen Elite (quest)" +$Quest[615] = "Student Jin" +$Quest[616] = "Student Sousuke" +$Quest[617] = "Feast of Bokka" +$Quest[618] = "A Ghostly Request" +$Quest[619] = "Ghosts in the Graveyard" +$Quest[620] = "Skree Hatchling Season" +$Quest[621] = "A Friend in Need" +$Quest[622] = "A Father's Fate" +$Quest[623] = "Second Born" +$Quest[624] = "First Born" +$Quest[625] = "Third Born" +$Quest[626] = "Identity Theft" +$Quest[627] = "Need More Stuff" +$Quest[628] = "To Dye For" +$Quest[629] = "Missing Shipment" +$Quest[630] = "Blow Out Sale!" +$Quest[631] = "Scholarly Affairs" +$Quest[632] = "Leaving a Legacy" +$Quest[633] = "The Honorable General" +$Quest[634] = "Signs and Portents" +$Quest[635] = "Isle of the Dead (quest)" +$Quest[636] = "Bad Tide Rising" +$Quest[637] = "Special Delivery" +$Quest[638] = "Big News, Small Package" +$Quest[639] = "Following the Trail" +$Quest[640] = "The Iron Truth" +$Quest[641] = "Trial by Fire" +$Quest[642] = "War Preparations (Recruit Training)" +$Quest[643] = "War Preparations (Wind and Water)" +$Quest[644] = "War Preparations (Ghost Reconnaissance)" +$Quest[645] = "The Time is Nigh" +$Quest[646] = "A Loose Cannon" +$Quest[647] = "Diamond in the Rough" +$Quest[648] = "Map-Travel Inventor" +$Quest[649] = "Honing your Skills" +$Quest[650] = "Voices in the Night" +$Quest[651] = "Corsair Invasion" +$Quest[652] = "A Peaceful Solution" +$Quest[653] = "Hog Hunt" +$Quest[654] = "A Delayed Delivery" +$Quest[655] = "A Troubling Theory" +$Quest[656] = "A Mysterious Missive" +$Quest[657] = "A Perplexing Plague" +$Quest[658] = "A Stolen Spore" +$Quest[659] = "Proof of Courage" +$Quest[660] = "Quarry Quandry" +$Quest[661] = "Queen of the Quarry" +$Quest[662] = "A Sticky Operation" +$Quest[663] = "Rising Suns" +$Quest[664] = "Re-enlist Rojis" +$Quest[665] = "Skale and Magic Compass" +$Quest[666] = "To See the Sights" +$Quest[667] = "To Ask For More" +$Quest[668] = "Money on the Side" +$Quest[669] = "Fury of a Grieving Heart" +$Quest[670] = "Crypt-ology" +$Quest[671] = "Stolen Supplies" +$Quest[672] = "Loyal 'til the End" +$Quest[673] = "A Personal Vault" +$Quest[674] = "Trade Relations" +$Quest[675] = "Rally the Recruits (Tutorial)" +$Quest[676] = "Into Chahbek Village" +$Quest[677] = "Take the Shortcut (Skip Tutorial)" +$Quest[678] = "A Decayed Monument" +$Quest[679] = "Goren's Stuff: Part 1" +$Quest[680] = "Attack at the Kodash" +$Quest[681] = "Crossing the Desolation [if acquired from Zerai the Learner]" +$Quest[682] = "Melonni Goes Recruiting" +$Quest[683] = "Securing Champion's Dawn" +$Quest[684] = "Crossing the Desolation [if acquired from Lonai]" +$Quest[685] = "The Apostate" +$Quest[686] = "Breaking the Broken" +$Quest[687] = "A Flickering Flame" +$Quest[688] = "Dismember the Titans" +$Quest[689] = "Cover Your Tracks" +$Quest[690] = "Dark Gateway" +$Quest[691] = "They Only Come Out at Night" +$Quest[692] = "Invasion From Within" +$Quest[693] = "Drink of the Gods" +$Quest[694] = "The Troubled Keeper" +$Quest[695] = "Open Season" +$Quest[696] = "Good Demon Hunting" +$Quest[697] = "Holding the Line" +$Quest[698] = "A Fleshy Operation" +$Quest[699] = "Bad Fortune" +$Quest[700] = "Know Thine Enemy" +$Quest[701] = "Uncharted Territory" +$Quest[702] = "Kormir's Crusade" +$Quest[703] = "All Alone in the Darkness" +$Quest[704] = "Passing the Luck" +$Quest[705] = "Blueprint of the Fall" +$Quest[706] = "Escape from the Torment" +$Quest[707] = "Faded Memory" +$Quest[708] = "A History of Violence" +$Quest[709] = "Quiz the Recruits" +$Quest[710] = "Koss Goes Recruiting" +$Quest[711] = "Never Fight Alone" +$Quest[712] = "Command Training" +$Quest[713] = "Goren's Stuff: Part 2" +$Quest[714] = "The Toy's Story" +$Quest[715] = "Rising in the Ranks: Master Sergeant" +$Quest[716] = "Rising in the Ranks: First Spear" +$Quest[717] = "Misela, the Middle Child" +$Quest[718] = "Mutu, the Oldest Child" +$Quest[719] = "Jedur, the Youngest Child" +$Quest[720] = "Norgu's Nightfall" +$Quest[721] = "The Role of a Lifetime" +$Quest[722] = "Brains or Brawn" +$Quest[723] = "Sunspears in Kryta" +$Quest[724] = "Sunspears in Cantha" +$Quest[725] = "Terror in Tyria" +$Quest[726] = "Plague in Cantha" +$Quest[727] = "The Command Post" +$Quest[728] = "The Dejarin Estate" +$Quest[729] = "Gain Norgu" +$Quest[730] = "Gain Goren" +$Quest[731] = "Gain Margrid" +$Quest[732] = "Gain Master of Whispers" +$Quest[733] = "Gain Jin" +$Quest[734] = "Gain Sousuke" +$Quest[735] = "Gain Olias" +$Quest[736] = "Gain Zenmai" +$Quest[737] = "Battle Preparations" +$Quest[738] = "The Time is Nigh" +$Quest[739] = "Drakes on the Plain" +$Quest[740] = "Capturing the Signet of Capture" +$Quest[741] = "A Land of Heroes" +$Quest[742] = "Breaching the Stygian Veil" +$Quest[743] = "Foundry Breakout" +$Quest[744] = "The Foundry of Failed Creations (quest)" +$Quest[745] = "The Oddbodies (quest)" +$Quest[746] = "The Last Patrol" +$Quest[747] = "The Missing Patrol" +$Quest[748] = "Into the Fire" +$Quest[749] = "Deathbringer Company" +$Quest[750] = "Finding a Purpose" +$Quest[751] = "The City of Torc'qua" +$Quest[752] = "The Rifts Between Us" +$Quest[753] = "To the Rescue!" +$Quest[754] = "Mallyx the Unyielding (quest)" +$Quest[755] = "Brood Wars" +$Quest[756] = "How the Grentches Stole Wintersday" +$Quest[757] = "Spreading the Wintersday Spirit" +$Quest[758] = "White Mist" +$Quest[759] = "The Gift of Giving" +$Quest[760] = "Save the Reindeer" +$Quest[761] = "Find the Stolen Presents" +$Quest[762] = "A Very Grentchie Wintersday" +$Quest[763] = "The Greatest Snowman Ever Made" +$Quest[764] = "You're a Mean One, Mr. Grenth" +$Quest[765] = "In Grenth's Defense" +$Quest[766] = "Army Wife" +$Quest[767] = "Impressing the Girl" +$Quest[768] = "Tossing the Bouquet" +$Quest[769] = "Making Friends" +$Quest[770] = "Missing Suitor" +$Quest[771] = "Avad on the Run" +$Quest[772] = "The Eternal Debate" +$Quest[773] = "The Contest" +$Quest[774] = "Consolation" +$Quest[775] = "A Burning Desire" +$Quest[776] = "The Big Bang" +$Quest[777] = "Douse Your Enthusiasm" +$Quest[778] = "Hopeless Romantic" +$Quest[779] = "Fire in the Sky" +$Quest[780] = "The Knights Who Say Nian" +$Quest[781] = "Just My Luck" +$Quest[782] = "All for One and One for Justice" +$Quest[783] = "Chasing Zenmai" +$Quest[784] = "Out of Kourna" +$Quest[785] = "Counting the Fallen" +$Quest[786] = "Commissioning a Memorial" +$Quest[787] = "Ancient History" +$Quest[788] = "Finding a Purpose" +$Quest[789] = "Money Back Guarantee" +$Quest[790] = "Against the Charr" +$Quest[791] = "Warband of Brothers" +$Quest[792] = "Search for the Ebon Vanguard" +$Quest[793] = "The Missing Vanguard" +$Quest[794] = "Scrambled Reinforcements" +$Quest[795] = "The Rampaging Yetis" +$Quest[796] = "The Shrine of Maat" +$Quest[797] = "A Strange Request" +$Quest[798] = "Darkness at Kaitan" +$Quest[799] = "unused" +$Quest[800] = "Flames of the Bear Spirit" +$Quest[801] = "Temple of the Damned" +$Quest[802] = "Giriff's War" +$Quest[803] = "Veiled Threat" +$Quest[804] = "Lost Souls" +$Quest[805] = "Kathandrax's Crusher" +$Quest[806] = "Curse of the Nornbear" +$Quest[807] = "The Elusive Golemancer" +$Quest[808] = "Tracking the Nornbear" +$Quest[809] = "The Anvil of Dragrimmar" +$Quest[810] = "Cold Vengeance" +$Quest[811] = "The Misanthropic Jotun Principle" +$Quest[812] = "Lab Space" +$Quest[813] = "A Gate Too Far" +$Quest[814] = "Vision of the Raven Spirit" +$Quest[815] = "Genius Operated Living Enchanted Manifestation" +$Quest[816] = "Destruction's Depths" +$Quest[817] = "Heart of the Shiverpeaks (quest)" +$Quest[818] = "Finding the Bloodstone" +$Quest[819] = "Finding Gadd" +$Quest[820] = "A Little Help" +$Quest[821] = "I Feel the Earth Move Under Cantha's Feet" +$Quest[822] = "Hole of Istan" +$Quest[823] = "What Lies Beneath" +$Quest[824] = "The Beginning of the End" +$Quest[825] = "Tekks's War" +$Quest[826] = "Worthy Deeds (Done Dirt Cheap)" +$Quest[827] = "Little Workshop of Horrors" +$Quest[828] = "Dredging the Depths" +$Quest[829] = "Watch it Jiggle" +$Quest[830] = "Anything You Can Do" +$Quest[831] = "Krak's Cavalry" +$Quest[832] = "Crystal Method" +$Quest[833] = "The Blade's Essence" +$Quest[834] = "The Arrow's Point" +$Quest[835] = "Defending the Breach" +$Quest[836] = "Cold as Ice" +$Quest[837] = "In the Service of Revenge" +$Quest[838] = "Truthseeker" +$Quest[839] = "A Hunter's Pride" +$Quest[840] = "Shadows in the Night" +$Quest[841] = "Leader of the Pack" +$Quest[842] = "Round 1: Fight!" +$Quest[843] = "Round 2: Fight!" +$Quest[844] = "Round 3: Fight!" +$Quest[845] = "Round 4: Fight!" +$Quest[846] = "Round 5: Fight!" +$Quest[847] = "Final Round: Fight!" +$Quest[848] = "Hero Tutorial" +$Quest[849] = "Bear Club for Women" +$Quest[850] = "The Great Norn Alemoot" +$Quest[851] = "The Great Norn Alemoot" +$Quest[852] = "Prenuptial Disagreement (female)" +$Quest[853] = "Prenuptial Disagreement (male)" +$Quest[854] = "Charr Invaders" +$Quest[855] = "Bear Club for Men" +$Quest[856] = "Kilroy Stonekin's Punch-Out Extravaganza!" +$Quest[857] = "The Throwdown in a Norn Town" +$Quest[858] = "Punch the Clown" +$Quest[859] = "Destructive Research" +$Quest[860] = "The Destroyer Challenge" +$Quest[861] = "Falling Out" +$Quest[862] = "Forgotten Relics" +$Quest[863] = "unused" +$Quest[864] = "The Smell of Titan in the Morning" +$Quest[865] = "Be Very, Very Quiet..." +$Quest[866] = "Plan A" +$Quest[867] = "Final Round, Championship Edition: Fight!" +$Quest[868] = "Mano a Norn-o" +$Quest[869] = "A Time for Heroes" +$Quest[870] = "The Assassin's Revenge" +$Quest[871] = "The Imploding Past" +$Quest[872] = "Failure to Communicate" +$Quest[873] = "Service: In Defense of the Eye" +$Quest[874] = "Service: Practice, Dummy" +$Quest[875] = "Polymock: Defeat Plurgg" +$Quest[876] = "Polymock: Defeat Fonk" +$Quest[877] = "Polymock: Defeat Dune Teardrinker" +$Quest[878] = "Polymock: Defeat Grulhammer Silverfist" +$Quest[879] = "Polymock: Defeat Necromancer Volumandus" +$Quest[880] = "Polymock: Defeat Master Hoff" +$Quest[881] = "Polymock: Defeat Blarp" +$Quest[882] = "Polymock: Defeat Yulma" +$Quest[883] = "Single Ugly Grawl Seeks Same for Mindless Destruction in Ascalon" +$Quest[884] = "The Hunting of the Charr" +$Quest[885] = "Frogstomp" +$Quest[886] = "Give Peace a Chance" +$Quest[887] = "The Cipher of Balthazar" +$Quest[888] = "The Cipher of Dwayna" +$Quest[889] = "The Cipher of Grenth" +$Quest[890] = "The Cipher of Kormir" +$Quest[891] = "The Cipher of Lyssa" +$Quest[892] = "The Cipher of Melandru" +$Quest[893] = "The Path to Revelations" +$Quest[894] = "The Big Unfriendly Jotun" +$Quest[895] = "Forbidden Fruit" +$Quest[896] = "unused" +$Quest[897] = "O Brave New World" +$Quest[898] = "Lost Treasure of King Hundar" +$Quest[899] = "Deeprunner's Map" +$Quest[900] = "Attack on Jalis's Camp" +$Quest[901] = "The Asura Trap" +$Quest[902] = "Moths to a Flame" +$Quest[903] = "Insidious Remnants" +$Quest[904] = "Turning the Page" +$Quest[905] = "Northern Allies" +$Quest[906] = "Assault on the Stronghold" +$Quest[907] = "Blood Washes Blood" +$Quest[908] = "The Dawn of Rebellion" +$Quest[909] = "What Must Be Done" +$Quest[910] = "Nornhood" +$Quest[911] = "The Justiciar's End" +$Quest[912] = "Haunted" +$Quest[913] = "Against the Destroyers" +$Quest[914] = "Fire and Pain" +$Quest[915] = "The Knowledgeable Asura" +$Quest[916] = "Then and Now, Here and There" +$Quest[917] = "The Last Hierophant" +$Quest[918] = "Kilroy's Punchout Tournament" +$Quest[919] = "Special Ops: Dragon's Gullet" +$Quest[920] = "Special Ops: Flame Temple Corridor" +$Quest[921] = "Special Ops: Grendich Courthouse" +$Quest[922] = "The Tengu Accords" +$Quest[923] = "The Battle of Jahai" +$Quest[924] = "The Flight North" +$Quest[925] = "The Rise of the White Mantle" +$Quest[926] = "Straight to the Heart" +$Quest[927] = "The Strength of Snow" +$Quest[928] = "Deactivating P.O.X." +$Quest[929] = "Deactivating N.O.X." +$Quest[930] = "Deactivating R.O.X." +$Quest[931] = "Zinn's Task" +$Quest[932] = "The Three Wise Norn" +$Quest[933] = "Charr-broiled Plans" +$Quest[934] = "Snowball Dominance" +$Quest[935] = "Wintersday Cheer" +$Quest[936] = "The Great Northern Wall (Zaishen quest)" +$Quest[937] = "Fort Ranik (Zaishen quest)" +$Quest[938] = "Ruins of Surmia (Zaishen quest)" +$Quest[939] = "Nolani Academy (Zaishen quest)" +$Quest[940] = "Borlis Pass (Zaishen quest)" +$Quest[941] = "The Frost Gate (Zaishen quest)" +$Quest[942] = "Gates of Kryta (Zaishen quest)" +$Quest[943] = "D'Alessio Seaboard (Zaishen quest)" +$Quest[944] = "Divinity Coast (Zaishen quest)" +$Quest[945] = "The Wilds (Zaishen quest)" +$Quest[946] = "Bloodstone Fen (Zaishen quest)" +$Quest[947] = "Aurora Glade (Zaishen quest)" +$Quest[948] = "Riverside Province (Zaishen quest)" +$Quest[949] = "Sanctum Cay (Zaishen quest)" +$Quest[950] = "Dunes of Despair (Zaishen quest)" +$Quest[951] = "Thirsty River (Zaishen quest)" +$Quest[952] = "Elona Reach (Zaishen quest)" +$Quest[953] = "Augury Rock (Zaishen quest)" +$Quest[954] = "The Dragon's Lair (Zaishen quest)" +$Quest[955] = "Ice Caves of Sorrow (Zaishen quest)" +$Quest[956] = "Iron Mines of Moladune (Zaishen quest)" +$Quest[957] = "Thunderhead Keep (Zaishen quest)" +$Quest[958] = "Ring of Fire (Zaishen quest)" +$Quest[959] = "Abaddon's Mouth (Zaishen quest)" +$Quest[960] = "Hell's Precipice (Zaishen quest)" +$Quest[961] = "Zen Daijun (Zaishen quest)" +$Quest[962] = "Vizunah Square (Zaishen quest)" +$Quest[963] = "Nahpui Quarter (Zaishen quest)" +$Quest[964] = "Tahnnakai Temple (Zaishen quest)" +$Quest[965] = "Arborstone (Zaishen quest)" +$Quest[966] = "Boreas Seabed (Zaishen quest)" +$Quest[967] = "Sunjiang District (Zaishen quest)" +$Quest[968] = "The Eternal Grove (Zaishen quest)" +$Quest[969] = "Unwaking Waters (Zaishen quest)" +$Quest[970] = "Gyala Hatchery (Zaishen quest)" +$Quest[971] = "Raisu Palace (Zaishen quest)" +$Quest[972] = "Imperial Sanctum (Zaishen quest)" +$Quest[973] = "unused" +$Quest[974] = "unused" +$Quest[975] = "unused" +$Quest[976] = "unused" +$Quest[977] = "unused" +$Quest[978] = "Chahbek Village (Zaishen quest)" +$Quest[979] = "Jokanur Diggings (Zaishen quest)" +$Quest[980] = "Blacktide Den (Zaishen quest)" +$Quest[981] = "Consulate Docks (Zaishen quest)" +$Quest[982] = "Venta Cemetery (Zaishen quest)" +$Quest[983] = "Kodonur Crossroads (Zaishen quest)" +$Quest[984] = "Rilohn Refuge (Zaishen quest)" +$Quest[985] = "Moddok Crevice (Zaishen quest)" +$Quest[986] = "Tihark Orchard (Zaishen quest)" +$Quest[987] = "Dzagonur Bastion (Zaishen quest)" +$Quest[988] = "Dasha Vestibule (Zaishen quest)" +$Quest[989] = "Grand Court of Sebelkeh (Zaishen quest)" +$Quest[990] = "Jennur's Horde (Zaishen quest)" +$Quest[991] = "Nundu Bay (Zaishen quest)" +$Quest[992] = "Gate of Desolation (Zaishen quest)" +$Quest[993] = "Ruins of Morah (Zaishen quest)" +$Quest[994] = "Gate of Pain (Zaishen quest)" +$Quest[995] = "Gate of Madness (Zaishen quest)" +$Quest[996] = "Abaddon's Gate (Zaishen quest)" +$Quest[997] = "unused" +$Quest[998] = "unused" +$Quest[999] = "unused" +$Quest[1000] = "Finding the Bloodstone (Zaishen quest)" +$Quest[1001] = "The Elusive Golemancer (Zaishen quest)" +$Quest[1002] = "G.O.L.E.M. (Zaishen quest)" +$Quest[1003] = "Against the Charr (Zaishen quest)" +$Quest[1004] = "Warband of Brothers (Zaishen quest)" +$Quest[1005] = "Assault on the Stronghold (Zaishen quest)" +$Quest[1006] = "Curse of the Nornbear (Zaishen quest)" +$Quest[1007] = "Blood Washes Blood (Zaishen quest)" +$Quest[1008] = "A Gate Too Far (Zaishen quest)" +$Quest[1009] = "Destruction's Depths (Zaishen quest)" +$Quest[1010] = "A Time for Heroes (Zaishen quest)" +$Quest[1011] = "unused" +$Quest[1012] = "unused" +$Quest[1013] = "unused" +$Quest[1014] = "unused" +$Quest[1015] = "unused" +$Quest[1016] = "Verata (Zaishen quest)" +$Quest[1017] = "Rotscale (Zaishen quest)" +$Quest[1018] = "unused" +$Quest[1019] = "The Iron Forgeman (Zaishen quest)" +$Quest[1020] = "The Darknesses (Zaishen quest)" +$Quest[1021] = "Kepkhet Marrowfeast (Zaishen quest)" +$Quest[1022] = "Harn and Maxine Coldstone (Zaishen quest)" +$Quest[1023] = "unused" +$Quest[1024] = "Kanaxai (Zaishen quest)" +$Quest[1025] = "Urgoz (Zaishen quest)" +$Quest[1026] = "Chung, the Attuned (Zaishen quest)" +$Quest[1027] = "Royen Beastkeeper (Zaishen quest)" +$Quest[1028] = "Kunvie Firewing (Zaishen quest)" +$Quest[1029] = "Mungri Magicbox (Zaishen quest)" +$Quest[1030] = "Arbor Earthcall (Zaishen quest)" +$Quest[1031] = "Mohby Windbeak (Zaishen quest)" +$Quest[1032] = "Ssuns, Blessed of Dwayna (Zaishen quest)" +$Quest[1033] = "Ghial the Bone Dancer (Zaishen quest)" +$Quest[1034] = "Quansong Spiritspeak (Zaishen quest)" +$Quest[1035] = "Baubao Wavewrath (Zaishen quest)" +$Quest[1036] = "Jarimiya the Unmerciful (Zaishen quest)" +$Quest[1037] = "Commander Wahli (Zaishen quest)" +$Quest[1038] = "Droajam, Mage of the Sands (Zaishen quest)" +$Quest[1039] = "Jedeh the Mighty (Zaishen quest)" +$Quest[1040] = "Korshek the Immolated (Zaishen quest)" +$Quest[1041] = "Admiral Kantoh (Zaishen quest)" +$Quest[1042] = "unused" +$Quest[1043] = "The Black Beast of Arrgh (Zaishen quest)" +$Quest[1044] = "Lord Jadoth (Zaishen quest)" +$Quest[1045] = "The Stygian Underlords (Zaishen quest)" +$Quest[1046] = "The Stygian Lords (Zaishen quest)" +$Quest[1047] = "The Greater Darkness (Zaishen quest)" +$Quest[1048] = "Ilsundur, Lord of Fire (Zaishen quest)" +$Quest[1049] = "Rragar Maneater (Zaishen quest)" +$Quest[1050] = "Murakai, Lady of the Night (Zaishen quest)" +$Quest[1051] = "Prismatic Ooze (Zaishen quest)" +$Quest[1052] = "Havok Soulwail (Zaishen quest)" +$Quest[1053] = "Frostmaw the Kinslayer (Zaishen quest)" +$Quest[1054] = "Remnant of Antiquities (Zaishen quest)" +$Quest[1055] = "Plague of Destruction (Zaishen quest)" +$Quest[1056] = "Zoldark the Unholy (Zaishen quest)" +$Quest[1057] = "Khabuus (Zaishen quest)" +$Quest[1058] = "Z'him Monns (Zaishen quest)" +$Quest[1059] = "Eldritch Ettin (Zaishen quest)" +$Quest[1060] = "Fendi Nin (Zaishen quest)" +$Quest[1061] = "TPS Regulator Golem (Zaishen quest)" +$Quest[1062] = "Arachni (Zaishen quest)" +$Quest[1063] = "Forgewight (Zaishen quest)" +$Quest[1064] = "Selvetarm (Zaishen quest)" +$Quest[1065] = "Justiciar Thommis (Zaishen quest)" +$Quest[1066] = "Rand Stormweaver (Zaishen quest)" +$Quest[1067] = "Duncan the Black (Zaishen quest)" +$Quest[1068] = "Fronis Irontoe (Zaishen quest)" +$Quest[1069] = "unused" +$Quest[1070] = "Magmus (Zaishen quest)" +$Quest[1071] = "Molotov Rocktail (Zaishen quest)" +$Quest[1072] = "Nulfastu, Earthbound (Zaishen quest)" +$Quest[1073] = "unused" +$Quest[1074] = "Pywatt the Swift (Zaishen quest)" +$Quest[1075] = "Joffs the Mitigator (Zaishen quest)" +$Quest[1076] = "Mobrin, Lord of the Marsh (Zaishen quest)" +$Quest[1077] = "Borrguus Blisterbark (Zaishen quest)" +$Quest[1078] = "Fozzy Yeoryios (Zaishen quest)" +$Quest[1079] = "Myish, Lady of the Lake (Zaishen quest)" +$Quest[1080] = "Fenrir (Zaishen quest)" +$Quest[1081] = "Vengeful Aatxe (Zaishen quest)" +$Quest[1082] = "The Four Horsemen (Zaishen quest)" +$Quest[1083] = "Charged Blackness (Zaishen quest)" +$Quest[1084] = "Dragon Lich (Zaishen quest)" +$Quest[1085] = "Priest of Menzies (Zaishen quest)" +$Quest[1086] = "Lord Khobay (Zaishen quest)" +$Quest[1087] = "Random Arena (Zaishen quest)" +$Quest[1088] = "unused" +$Quest[1089] = "Hero Battles (Zaishen quest)" +$Quest[1090] = "Fort Aspenwood (Zaishen quest)" +$Quest[1091] = "Jade Quarry (Zaishen quest)" +$Quest[1092] = "Alliance Battles (Zaishen quest)" +$Quest[1093] = "Guild Versus Guild (Zaishen quest)" +$Quest[1094] = "Heroes' Ascent (Zaishen quest)" +$Quest[1095] = "Random Arena (Zaishen quest)" +$Quest[1096] = "unused" +$Quest[1097] = "Hero Battles" +$Quest[1098] = "Fort Aspenwood (Zaishen quest)" +$Quest[1099] = "The Jade Quarry" +$Quest[1100] = "Alliance Battles (Zaishen quest)" +$Quest[1101] = "Guild Versus Guild (Zaishen quest)" +$Quest[1102] = "Heroes' Ascent (Zaishen quest)" +$Quest[1103] = "Random Arena (Zaishen quest)" +$Quest[1104] = "unused" +$Quest[1105] = "unused" +$Quest[1106] = "Fort Aspenwood (Zaishen quest)" +$Quest[1107] = "Jade Quarry (Zaishen quest)" +$Quest[1108] = "unused" +$Quest[1109] = "Guild Versus Guild (Zaishen quest)" +$Quest[1110] = "unused" +$Quest[1111] = "Random Arena (Zaishen quest)" +$Quest[1112] = "Team Arena (Zaishen quest)" +$Quest[1113] = "Hero Battles (Zaishen quest)" +$Quest[1114] = "unused" +$Quest[1115] = "Jade Quarry (Zaishen quest)" +$Quest[1116] = "Alliance Battles (Zaishen quest)" +$Quest[1117] = "Guild Versus Guild (Zaishen quest)" +$Quest[1118] = "Heroes' Ascent (Zaishen quest)" +$Quest[1119] = "Minister Cho's Estate (Zaishen quest)" +$Quest[1120] = "Something Wicked This Way Comes" +$Quest[1121] = "Don't Fear the Reapers" +$Quest[1122] = "Stemming the Skeletal Tide" +$Quest[1123] = "Every Bit Helps" +$Quest[1124] = "The Waiting Game" +$Quest[1125] = "Codex Arena (Zaishen quest)" +$Quest[1126] = "Codex Arena (Zaishen quest)" +$Quest[1127] = "unused" +$Quest[1128] = "Codex Arena (Zaishen quest)" +$Quest[1129] = "The Nightman Cometh" +$Quest[1130] = "Wanted: Inquisitor Lashona" +$Quest[1131] = "Wanted: Inquisitor Lovisa" +$Quest[1132] = "Wanted: Inquisitor Bauer" +$Quest[1133] = "Wanted: Justiciar Kasandra" +$Quest[1134] = "Wanted: Justiciar Amilyn" +$Quest[1135] = "Wanted: Justiciar Sevaan" +$Quest[1136] = "Wanted: Valis the Rampant" +$Quest[1137] = "Wanted: Maximilian the Meticulous" +$Quest[1138] = "Wanted: Sarnia the Red-Handed" +$Quest[1139] = "Wanted: Destor the Truth Seeker" +$Quest[1140] = "Wanted: Selenas the Blunt" +$Quest[1141] = "Wanted: Barthimus the Provident" +$Quest[1142] = "Wanted: Cerris" +$Quest[1143] = "Wanted: Carnak the Hungry" +$Quest[1144] = "Wanted: Insatiable Vakar" +$Quest[1145] = "Wanted: Amalek the Unmerciful" +$Quest[1146] = "Wanted: Joh the Hostile" +$Quest[1147] = "Wanted: Greves the Overbearing" +$Quest[1148] = "Wanted: Calamitous" +$Quest[1149] = "Wanted: Lev the Condemned" +$Quest[1150] = "Wanted: Vess the Disputant" +$Quest[1151] = "Wanted: Justiciar Kimii" +$Quest[1152] = "Wanted: Zaln the Jaded" +$Quest[1153] = "Wanted: Justiciar Marron" +$Quest[1154] = "Riverside Assassination" +$Quest[1155] = "A Little Help From Above" +$Quest[1156] = "Temple of the Intolerable" +$Quest[1157] = "Mustering a Response" +$Quest[1158] = "The Battle for Lion's Arch" +$Quest[1159] = "Heirlooms of the Mad King" +$Quest[1160] = "Commandeering a Mortal Vessel" +$Quest[1161] = "An Ingenious Plan" +$Quest[1162] = "Til Death Do Us Part..." +$Quest[1163] = "Open the Flood Gates of Death" +$Quest[1164] = "The Killing Joke" +$Quest[1165] = "Norn Catering" +$Quest[1166] = "The Arrowhead" +$Quest[1167] = "The Tarnished Emblem" +$Quest[1168] = "The Broken Sword" +$Quest[1169] = "The Mantle's Guise" +$Quest[1170] = "Auspicious Beginnings" +$Quest[1171] = "A Vengeance of Blades" +$Quest[1172] = "Shadows in the Jungle" +$Quest[1173] = "Rise" +$Quest[1174] = "Reunion" +$Quest[1175] = "The Wedding" +$Quest[1176] = "The War in Kryta" +$Quest[1177] = "Asuran Allies" +$Quest[1178] = "Ebon Vanguard Allies" +$Quest[1179] = "Operation: Crush Spirits" +$Quest[1180] = "Fighting in a Winter Wonderland" +$Quest[1182] = "Vanguard Bounty: Blazefiend Griefblade" +$Quest[1184] = "Vanguard Bounty: Utini Wupwup" +$Quest[1187] = "Vanguard Rescue: Save the Ascalonian Noble" +$Quest[1189] = "Vanguard Annihilation: Bandits" +$Quest[1190] = "Vanguard Annihilation: Undead" +$Quest[1191] = "Anvil Rock (Zaishen vanquish)" +$Quest[1192] = "Arborstone (Zaishen vanquish)" +$Quest[1193] = "Witman's Folly (Zaishen vanquish)" +$Quest[1194] = "Arkjok Ward (Zaishen vanquish)" +$Quest[1195] = "Ascalon Foothills (Zaishen vanquish)" +$Quest[1196] = "Bahdok Caverns (Zaishen vanquish)" +$Quest[1197] = "Cursed Lands (Zaishen vanquish)" +$Quest[1198] = "Alcazia Tangle (Zaishen vanquish)" +$Quest[1199] = "Archipelagos (Zaishen vanquish)" +$Quest[1200] = "Eastern Frontier (Zaishen vanquish)" +$Quest[1201] = "Dejarin Estate (Zaishen vanquish)" +$Quest[1202] = "Watchtower Coast (Zaishen vanquish)" +$Quest[1203] = "Arbor Bay (Zaishen vanquish)" +$Quest[1204] = "Barbarous Shore (Zaishen vanquish)" +$Quest[1205] = "Deldrimor Bowl (Zaishen vanquish)" +$Quest[1206] = "Boreas Seabed (Zaishen vanquish)" +$Quest[1207] = "Cliffs of Dohjok (Zaishen vanquish)" +$Quest[1208] = "Diessa Lowlands (Zaishen vanquish)" +$Quest[1209] = "Bukdek Byway (Zaishen vanquish)" +$Quest[1210] = "Bjora Marches (Zaishen vanquish)" +$Quest[1211] = "Crystal Overlook (Zaishen vanquish)" +$Quest[1212] = "Diviner's Ascent (Zaishen vanquish)" +$Quest[1213] = "Dalada Uplands (Zaishen vanquish)" +$Quest[1214] = "Drazach Thicket (Zaishen vanquish)" +$Quest[1215] = "Fahranur, the First City (Zaishen vanquish)" +$Quest[1216] = "Dragon's Gullet (Zaishen vanquish)" +$Quest[1217] = "Ferndale (Zaishen vanquish)" +$Quest[1218] = "Forum Highlands (Zaishen vanquish)" +$Quest[1219] = "Dreadnought's Drift (Zaishen vanquish)" +$Quest[1220] = "Drakkar Lake (Zaishen vanquish)" +$Quest[1221] = "Dry Top (Zaishen vanquish)" +$Quest[1222] = "Tears of the Fallen (Zaishen vanquish)" +$Quest[1223] = "Gyala Hatchery (Zaishen vanquish)" +$Quest[1224] = "Ettin's Back (Zaishen vanquish)" +$Quest[1225] = "Gandara, the Moon Fortress (Zaishen vanquish)" +$Quest[1226] = "Grothmar Wardowns (Zaishen vanquish)" +$Quest[1227] = "Flame Temple Corridor (Zaishen vanquish)" +$Quest[1228] = "Haiju Lagoon (Zaishen vanquish)" +$Quest[1229] = "Frozen Forest (Zaishen vanquish)" +$Quest[1230] = "Garden of Seborhin (Zaishen vanquish)" +$Quest[1231] = "Grenth's Footprint (Zaishen vanquish)" +$Quest[1232] = "Jaya Bluffs (Zaishen vanquish)" +$Quest[1233] = "Holdings of Chokhin (Zaishen vanquish)" +$Quest[1234] = "Ice Cliff Chasms (Zaishen vanquish)" +$Quest[1235] = "Griffon's Mouth (Zaishen vanquish)" +$Quest[1236] = "Kinya Province (Zaishen vanquish)" +$Quest[1237] = "Issnur Isles (Zaishen vanquish)" +$Quest[1238] = "Jaga Moraine (Zaishen vanquish)" +$Quest[1239] = "Ice Floe (Zaishen vanquish)" +$Quest[1240] = "Maishang Hills (Zaishen vanquish)" +$Quest[1241] = "Jahai Bluffs (Zaishen vanquish)" +$Quest[1242] = "Riven Earth (Zaishen vanquish)" +$Quest[1243] = "Icedome (Zaishen vanquish)" +$Quest[1244] = "Minister Cho's Estate (Zaishen vanquish)" +$Quest[1245] = "Mehtani Keys (Zaishen vanquish)" +$Quest[1246] = "Sacnoth Valley (Zaishen vanquish)" +$Quest[1247] = "Iron Horse Mine (Zaishen vanquish)" +$Quest[1248] = "Morostav Trail (Zaishen vanquish)" +$Quest[1249] = "Plains of Jarin (Zaishen vanquish)" +$Quest[1250] = "Sparkfly Swamp (Zaishen vanquish)" +$Quest[1251] = "Kessex Peak (Zaishen vanquish)" +$Quest[1252] = "Mourning Veil Falls (Zaishen vanquish)" +$Quest[1253] = "The Alkali Pan (Zaishen vanquish)" +$Quest[1254] = "Varajar Fells (Zaishen vanquish)" +$Quest[1255] = "Lornar's Pass (Zaishen vanquish)" +$Quest[1256] = "Pongmei Valley (Zaishen vanquish)" +$Quest[1257] = "The Floodplain of Mahnkelon (Zaishen vanquish)" +$Quest[1258] = "Verdant Cascades (Zaishen vanquish)" +$Quest[1259] = "Majesty's Rest (Zaishen vanquish)" +$Quest[1260] = "Raisu Palace (Zaishen vanquish)" +$Quest[1261] = "The Hidden City of Ahdashim (Zaishen vanquish)" +$Quest[1262] = "Rhea's Crater (Zaishen vanquish)" +$Quest[1263] = "Mamnoon Lagoon (Zaishen vanquish)" +$Quest[1264] = "Shadow's Passage (Zaishen vanquish)" +$Quest[1265] = "The Mirror of Lyss (Zaishen vanquish)" +$Quest[1266] = "Saoshang Trail (Zaishen vanquish)" +$Quest[1267] = "Nebo Terrace (Zaishen vanquish)" +$Quest[1268] = "Shenzun Tunnels (Zaishen vanquish)" +$Quest[1269] = "The Ruptured Heart (Zaishen vanquish)" +$Quest[1270] = "Salt Flats (Zaishen vanquish)" +$Quest[1271] = "North Kryta Province (Zaishen vanquish)" +$Quest[1272] = "Silent Surf (Zaishen vanquish)" +$Quest[1273] = "The Shattered Ravines (Zaishen vanquish)" +$Quest[1274] = "Scoundrel's Rise (Zaishen vanquish)" +$Quest[1275] = "Old Ascalon (Zaishen vanquish)" +$Quest[1276] = "Sunjiang District (Zaishen vanquish)" +$Quest[1277] = "The Sulfurous Wastes (Zaishen vanquish)" +$Quest[1278] = "Magus Stones (Zaishen vanquish)" +$Quest[1279] = "Perdition Rock (Zaishen vanquish)" +$Quest[1280] = "Sunqua Vale (Zaishen vanquish)" +$Quest[1281] = "Turai's Procession (Zaishen vanquish)" +$Quest[1282] = "Norrhart Domains (Zaishen vanquish)" +$Quest[1283] = "Pockmark Flats (Zaishen vanquish)" +$Quest[1284] = "Tahnnakai Temple (Zaishen vanquish)" +$Quest[1285] = "Vehjin Mines (Zaishen vanquish)" +$Quest[1286] = "Poisoned Outcrops (Zaishen vanquish)" +$Quest[1287] = "Prophet's Path (Zaishen vanquish)" +$Quest[1288] = "The Eternal Grove (Zaishen vanquish)" +$Quest[1289] = "Tasca's Demise (Zaishen vanquish)" +$Quest[1290] = "Resplendent Makuun (Zaishen vanquish)" +$Quest[1291] = "Reed Bog (Zaishen vanquish)" +$Quest[1292] = "Unwaking Waters (Zaishen vanquish)" +$Quest[1293] = "Stingray Strand (Zaishen vanquish)" +$Quest[1294] = "Sunward Marches (Zaishen vanquish)" +$Quest[1295] = "Regent Valley (Zaishen vanquish)" +$Quest[1296] = "Wajjun Bazaar (Zaishen vanquish)" +$Quest[1297] = "Yatendi Canyons (Zaishen vanquish)" +$Quest[1298] = "Twin Serpent Lakes (Zaishen vanquish)" +$Quest[1299] = "Sage Lands (Zaishen vanquish)" +$Quest[1300] = "Xaquang Skyway (Zaishen vanquish)" +$Quest[1301] = "Zehlon Reach (Zaishen vanquish)" +$Quest[1302] = "Tangle Root (Zaishen vanquish)" +$Quest[1303] = "Silverwood (Zaishen vanquish)" +$Quest[1304] = "Zen Daijun (Zaishen vanquish)" +$Quest[1305] = "The Arid Sea (Zaishen vanquish)" +$Quest[1306] = "Nahpui Quarter (Zaishen vanquish)" +$Quest[1307] = "Skyward Reach (Zaishen vanquish)" +$Quest[1308] = "The Scar (Zaishen vanquish)" +$Quest[1309] = "The Black Curtain (Zaishen vanquish)" +$Quest[1310] = "Panjiang Peninsula (Zaishen vanquish)" +$Quest[1311] = "Snake Dance (Zaishen vanquish)" +$Quest[1312] = "Traveler's Vale (Zaishen vanquish)" +$Quest[1313] = "The Breach (Zaishen vanquish)" +$Quest[1314] = "Lahtenda Bog (Zaishen vanquish)" +$Quest[1315] = "Spearhead Peak (Zaishen vanquish)" +$Quest[1316] = "Mount Qinkai (Zaishen vanquish)" +$Quest[1317] = "Marga Coast (Zaishen vanquish)" +$Quest[1318] = "Melandru's Hope (Zaishen vanquish)" +$Quest[1319] = "The Falls (Zaishen vanquish)" +$Quest[1320] = "Joko's Domain (Zaishen vanquish)" +$Quest[1321] = "Vulture Drifts (Zaishen vanquish)" +$Quest[1322] = "Wilderness of Bahdza (Zaishen vanquish)" +$Quest[1323] = "Talmark Wilderness (Zaishen vanquish)" +$Quest[1324] = "Vehtendi Valley (Zaishen vanquish)" +$Quest[1325] = "Talus Chute (Zaishen vanquish)" +$Quest[1326] = "Mineral Springs (Zaishen vanquish)" +$Quest[1329] = "The Path to Combat: Random Arenas" +$Quest[1330] = "The Path to Victory: Random Arenas" +$Quest[1331] = "The Path to Combat: Codex Arena" +$Quest[1332] = "The Path to Victory: Codex Arena" +$Quest[1333] = "The Path to Combat: Guild Battles" +$Quest[1334] = "The Path to Victory: Guild Battles" +$Quest[1335] = "The Path to Combat: Heroes' Ascent" +$Quest[1336] = "The Path to Victory: Heroes' Ascent (suspected)" +$Quest[1342] = "Cleansing Bukdek Byway" +$Quest[1343] = "Cleansing Bukdek Byway (Hard mode)" +$Quest[1344] = "Cleansing Shadow's Passage" +$Quest[1345] = "Cleansing Shadow's Passage (Hard mode)" +$Quest[1346] = "Cleansing Shenzun Tunnels" +$Quest[1347] = "Cleansing Shenzun Tunnels (Hard mode)" +$Quest[1348] = "Cleansing the Undercity" +$Quest[1349] = "Cleansing the Undercity (Hard mode)" +$Quest[1350] = "Cleansing the Sunjiang District" +$Quest[1351] = "Cleansing the Sunjiang District (Hard mode)" +$Quest[1352] = "Cleansing Pongmei Valley" +$Quest[1353] = "Cleansing Pongmei Valley (Hard mode)" +$Quest[1354] = "Rescue at Minister Cho's Estate" +$Quest[1355] = "Rescue at Minister Cho's Estate (Hard mode)" +$Quest[1356] = "Cleansing Haiju Lagoon" +$Quest[1357] = "Cleansing Haiju Lagoon (Hard mode)" +$Quest[1358] = "Cleansing Zen Daijun" +$Quest[1359] = "Cleansing Zen Daijun (Hard mode)" +$Quest[1360] = "Cleansing Rhea's Crater" +$Quest[1361] = "Cleansing Rhea's Crater (Hard mode)" +$Quest[1362] = "Cleansing the Silent Surf" +$Quest[1363] = "Cleansing the Silent Surf (Hard mode)" +$Quest[1364] = "Cleansing Morostav Trail" +$Quest[1365] = "Cleansing Morostav Trail (Hard mode)" +$Quest[1366] = "Intercepting the Am Fah" +$Quest[1367] = "Intercepting the Am Fah (Hard mode)" +$Quest[1368] = "Tracking the Corruption" +$Quest[1369] = "Tracking the Corruption (Hard mode)" +$Quest[1370] = "Architect of Corruption" +$Quest[1371] = "Architect of Corruption (Hard mode)" +$Quest[1372] = "The Gangs of Kaineng" +$Quest[1373] = "The Gangs of Kaineng (Hard mode)" +$Quest[1374] = "What Waits in Shadow" +$Quest[1375] = "What Waits in Shadow (Hard mode)" +$Quest[1376] = "A Chance Encounter" +$Quest[1377] = "A Chance Encounter (Hard mode)" +$Quest[1378] = "Cantha Courier Crisis" +$Quest[1379] = "Cantha Courier Crisis (Hard mode)" +$Quest[1380] = "Light My Fire" +$Quest[1381] = "Light My Fire (Hard mode)" +$Quest[1382] = "When Kappa Attack" +$Quest[1383] = "When Kappa Attack (Hard mode)" +$Quest[1384] = "A Favor Returned" +$Quest[1385] = "Deadly Cargo" +$Quest[1386] = "Trading Blows" +$Quest[1387] = "Ever Closer to the Edge" +$Quest[1388] = "Violence in the Streets" +$Quest[1389] = "A Favor Returned (Hard mode)" +$Quest[1390] = "Deadly Cargo (Hard mode)" +$Quest[1391] = "Trading Blows (Hard mode)" +$Quest[1392] = "Ever Closer to the Edge (Hard mode)" +$Quest[1393] = "Violence in the Streets (Hard mode)" +$Quest[1394] = "The Rescue Attempt" +$Quest[1395] = "The Rescue Attempt (Hard mode)" +$Quest[1396] = "Warning the Angchu" +$Quest[1397] = "Free Birds" +$Quest[1398] = "Honorable Combat" +$Quest[1399] = "A Treaty's a Treaty" +$Quest[1400] = "Warning the Angchu (Hard mode)?" +$Quest[1401] = "Free Birds (Hard mode)" +$Quest[1402] = "Honorable Combat (Hard mode)" +$Quest[1403] = "A Treaty's a Treaty (Hard mode)" +$Quest[1404] = "Family Matters" +$Quest[1405] = "Family Matters (Hard mode)" +$Quest[1406] = "Evil Residents" +$Quest[1407] = "Evil Residents Code: Harmonica" +$Quest[1408] = "Finding Jinnai" +$Quest[1409] = "Finding Jinnai (Hard mode)" +$Quest[1410] = "Calling All Thugs" +$Quest[1411] = "Raid on Kaineng Center" +$Quest[1412] = "There Goes the Neighborhood" +$Quest[1413] = "Ministry of Oppression" +$Quest[1414] = "Calling All Thugs (Hard mode)" +$Quest[1415] = "Raid on Kaineng Center (Hard mode)" +$Quest[1416] = "There Goes the Neighborhood (Hard mode)" +$Quest[1417] = "Ministry of Oppression (Hard mode)" +$Quest[1418] = "Raid on Shing Jea Monastery" +$Quest[1419] = "Raid on Shing Jea Monastery (Hard mode)" +$Quest[1420] = "The Final Confrontation" +$Quest[1421] = "The Final Confrontation (Hard mode)" +$Quest[1422] = "Memories of Purity" +$Quest[1423] = "Vassal States" +$Quest[1424] = "Vassal States (Hard mode)" +$Quest[1425] = "Redemption for the Lost" +$Quest[1426] = "Redemption for the Lost (Hard mode)" +$Quest[1429] = "Wayfarer's Reverie: Tyria" +$Quest[1430] = "Wayfarer's Reverie: Cantha" +$Quest[1431] = "Wayfarer's Reverie: Elona" +$Quest[1432] = "Wayfarer's Reverie: The Far North" +$Quest[1433] = "Mad Little Pony" +$Quest[1434] = "Better You Than Me" +$Quest[1435] = "Double Your Pleasure and RUN!" +$Quest[1436] = "A Humbling Gift" +$Quest[1437] = "The Polar Depressed" +$Quest[1438] = "Take My Sister, Please" +#EndRegion Quest Names diff --git a/gwApi/array_skill_small.au3 b/gwApi/array_skill_small.au3 index f8bb029..36379e4 100644 --- a/gwApi/array_skill_small.au3 +++ b/gwApi/array_skill_small.au3 @@ -1,1324 +1,1325 @@ -#include-once - -Global $aArray_Of_Skill_Names[3000][3] = [ _ - [0, 'No_Skill', 'Kein_Skill'], _ - [1, 'Healing_Signet', 'Siegel_der_Heilung'], _ - [2, 'Resurrection_Signet', 'Siegel_der_Wiederbelebung'], _ - [3, 'Signet_of_Capture', 'Siegel_der_Erbeutung'], _ - [5, 'Power_Block', 'Kraftblock'], _ - [6, 'Mantra_of_Earth', 'Mantra_der_Erde'], _ - [7, 'Mantra_of_Flame', 'Mantra_des_Feuers'], _ - [8, 'Mantra_of_Frost', 'Mantra_des_Frosts'], _ - [9, 'Mantra_of_Lightning', 'Mantra_des_Blitzes'], _ - [10, 'Hex_Breaker', 'Gebrochene_Verhexung'], _ - [11, 'Distortion', 'Verzerrung'], _ - [13, 'Mantra_of_Recovery', 'Mantra_der_Erholung'], _ - [14, 'Mantra_of_Persistence', 'Mantra_des_Bestehens'], _ - [15, 'Mantra_of_Inscriptions', 'Mantra_der_Inschriften'], _ - [16, 'Mantra_of_Concentration', 'Mantra_der_Konzentration'], _ - [17, 'Mantra_of_Resolve', 'Mantra_des_Abschlusses'], _ - [18, 'Mantra_of_Signets', 'Mantra_der_Siegel'], _ - [19, 'Fragility', 'Zerbrechlichkeit'], _ - [21, 'Inspired_Enchantment', 'Inspirierte_Verzauberung'], _ - [22, 'Inspired_Hex', 'Inspirierte_Verhexung'], _ - [23, 'Power_Spike', 'Kraftdorn'], _ - [24, 'Power_Leak', 'Kraftleck'], _ - [25, 'Power_Drain', 'Kraftentzug'], _ - [26, 'Empathy', 'Empathie'], _ - [27, 'Shatter_Delusions', 'Täuschungen_brechen'], _ - [28, 'Backfire', 'Rückschlag'], _ - [29, 'Blackout', 'Blackout'], _ - [30, 'Diversion', 'Ablenkung'], _ - [31, 'Conjure_Phantasm', 'Trugbild_beschwören'], _ - [32, 'Illusion_of_Weakness', 'Illusion_der_Schwäche'], _ - [33, 'Illusionary_Weaponry', 'Illusion_der_Waffen'], _ - [34, 'Sympathetic_Visage', 'Sympathisches_Gesicht'], _ - [35, 'Ignorance', 'Ignoranz'], _ - [36, 'Arcane_Conundrum', 'Arkanes_Rätsel'], _ - [37, 'Illusion_of_Haste', 'Illusion_der_Eile'], _ - [38, 'Channeling', 'Kanalisieren'], _ - [39, 'Energy_Surge', 'Energiewelle'], _ - [40, 'Ether_Feast', 'Ätherschmaus'], _ - [41, 'Ether_Lord', 'Herr_über_den_Äther'], _ - [42, 'Energy_Burn', 'Energiebrand'], _ - [43, 'Clumsiness', 'Ungeschick'], _ - [44, 'Phantom_Pain', 'Phantomschmerz'], _ - [45, 'Ethereal_Burden', 'Ätherische_Bürde'], _ - [46, 'Guilt', 'Schuld'], _ - [47, 'Ineptitude', 'Unbeholfenheit'], _ - [48, 'Spirit_of_Failure', 'Geist_des_Versagens'], _ - [49, 'Mind_Wrack', 'Geistiges_Wrack'], _ - [50, 'Wastrels_Worry', 'Verschwendung'], _ - [51, 'Shame', 'Schande'], _ - [52, 'Panic', 'Panik'], _ - [53, 'Migraine', 'Migräne'], _ - [54, 'Crippling_Anguish', 'Verkrüppelnde_Qual'], _ - [55, 'Fevered_Dreams', 'Fieberträume'], _ - [56, 'Soothing_Images', 'Beruhigende_Bilder'], _ - [57, 'Cry_of_Frustration', 'Schrei_der_Frustration'], _ - [58, 'Signet_of_Midnight', 'Siegel_der_Mitternacht'], _ - [59, 'Signet_of_Weariness', 'Siegel_der_Müdigkeit'], _ - [61, 'Leech_Signet', 'Blutsauger_Siegel'], _ - [62, 'Signet_of_Humility', 'Siegel_der_Demut'], _ - [63, 'Keystone_Signet', 'Schlussstein_Siegel'], _ - [65, 'Arcane_Mimicry', 'Arkane_Mimikry'], _ - [66, 'Spirit_Shackles', 'Geistfesseln'], _ - [67, 'Shatter_Hex', 'Verhexung_brechen'], _ - [68, 'Drain_Enchantment', 'Verzauberung_entziehen'], _ - [69, 'Shatter_Enchantment', 'Verzauberung_brechen'], _ - [72, 'Elemental_Resistance', 'Elementarwiderstand'], _ - [73, 'Physical_Resistance', 'Körperlicher_Widerstand'], _ - [74, 'Echo', 'Echo'], _ - [75, 'Arcane_Echo', 'Arkanes_Echo'], _ - [76, 'Imagined_Burden', 'Eingebildete_Bürde'], _ - [77, 'Chaos_Storm', 'Chaossturm'], _ - [78, 'Epidemic', 'Epidemie'], _ - [79, 'Energy_Drain', 'Energieentzug'], _ - [80, 'Energy_Tap', 'Energie_abzapfen'], _ - [81, 'Arcane_Thievery', 'Arkaner_Diebstahl'], _ - [82, 'Mantra_of_Recall', 'Mantra_der_Zurückrufung'], _ - [83, 'Animate_Bone_Horror', 'Knochenschreck_beleben'], _ - [84, 'Animate_Bone_Fiend', 'Knochenteufel_beleben'], _ - [85, 'Animate_Bone_Minions', 'Knochendiener_beleben'], _ - [86, 'Grenths_Balance', 'Grenths_Ausgleich'], _ - [87, 'Veratas_Gaze', 'Veratas_Starren'], _ - [88, 'Veratas_Aura', 'Veratas_Aura'], _ - [89, 'Deathly_Chill', 'Tödliche_Kühlung'], _ - [90, 'Veratas_Sacrifice', 'Veratas_Opfer'], _ - [91, 'Well_of_Power', 'Brunnen_der_Kraft'], _ - [92, 'Well_of_Blood', 'Brunnen_des_Blutes'], _ - [93, 'Well_of_Suffering', 'Brunnen_des_Leidens'], _ - [94, 'Well_of_the_Profane', 'Gottloser_Brunnen'], _ - [95, 'Putrid_Explosion', 'Explosion_der_Verwesung'], _ - [96, 'Soul_Feast', 'Seelenschmaus'], _ - [97, 'Necrotic_Traversal', 'Nekrotische_Verwechslung'], _ - [98, 'Consume_Corpse', 'Kadaver_verzehren'], _ - [99, 'Parasitic_Bond', 'Parasitäre_Fesseln'], _ - [100, 'Soul_Barbs', 'Seelenwiderhaken'], _ - [101, 'Barbs', 'Widerhaken'], _ - [102, 'Shadow_Strike', 'Schattenschlag'], _ - [103, 'Price_of_Failure', 'Preis_des_Versagens'], _ - [104, 'Death_Nova', 'Todesnova'], _ - [105, 'Deathly_Swarm', 'Tödlicher_Schwarm'], _ - [106, 'Rotting_Flesh', 'Verrottendes_Fleisch'], _ - [107, 'Virulence', 'Ansteckung'], _ - [108, 'Suffering', 'Leiden'], _ - [109, 'Life_Siphon', 'Leben_abzapfen'], _ - [110, 'Unholy_Feast', 'Unheiliger_Schmaus'], _ - [111, 'Awaken_the_Blood', 'Das_Blut_erwecken'], _ - [112, 'Desecrate_Enchantments', 'Verzauberungsschändung'], _ - [113, 'Tainted_Flesh', 'Verdorbenes_Fleisch'], _ - [114, 'Aura_of_the_Lich', 'Aura_des_Lich'], _ - [115, 'Blood_Renewal', 'Bluterneuerung'], _ - [116, 'Dark_Aura', 'Dunkle_Aura'], _ - [117, 'Enfeeble', 'Schwächen'], _ - [118, 'Enfeebling_Blood', 'Schwächendes_Blut'], _ - [119, 'Blood_is_Power', 'Blut_ist_Kraft'], _ - [120, 'Blood_of_the_Master', 'Blut_des_Meisters'], _ - [121, 'Spiteful_Spirit', 'Boshafter_Geist'], _ - [122, 'Malign_Intervention', 'Unheilvoller_Eingriff'], _ - [123, 'Insidious_Parasite', 'Heimtückischer_Parasit'], _ - [124, 'Spinal_Shivers', 'Rückenschauer'], _ - [125, 'Wither', 'Verwelken'], _ - [126, 'Life_Transfer', 'Lebensübertragung'], _ - [127, 'Mark_of_Subversion', 'Zeichen_der_Subversion'], _ - [128, 'Soul_Leech', 'Seelenfresser'], _ - [129, 'Defile_Flesh', 'Fleisch_schänden'], _ - [130, 'Demonic_Flesh', 'Dämonenfleisch'], _ - [131, 'Barbed_Signet', 'Siegel_der_Widerhaken'], _ - [132, 'Plague_Signet', 'Pest_Siegel'], _ - [133, 'Dark_Pact', 'Dunkler_Pakt'], _ - [134, 'Order_of_Pain', 'Orden_der_Schmerzen'], _ - [135, 'Faintheartedness', 'Mutlosigkeit'], _ - [136, 'Shadow_of_Fear', 'Schatten_der_Angst'], _ - [137, 'Rigor_Mortis', 'Totenstarre'], _ - [138, 'Dark_Bond', 'Dunkles_Band'], _ - [139, 'Infuse_Condition', 'Zustand_einflößen'], _ - [140, 'Malaise', 'Unwohlsein'], _ - [141, 'Rend_Enchantments', 'Verzauberungen_entreißen'], _ - [142, 'Lingering_Curse', 'Bleibender_Fluch'], _ - [143, 'Strip_Enchantment', 'Verzauberung_rauben'], _ - [144, 'Chilblains', 'Frostbeulen'], _ - [145, 'Signet_of_Agony', 'Siegel_der_Qual'], _ - [146, 'Offering_of_Blood', 'Blutopfer'], _ - [147, 'Dark_Fury', 'Dunkle_Wut'], _ - [148, 'Order_of_the_Vampire', 'Orden_des_Vampirs'], _ - [149, 'Plague_Sending', 'Pest_aussenden'], _ - [150, 'Mark_of_Pain', 'Zeichen_des_Schmerzes'], _ - [151, 'Feast_of_Corruption', 'Schmaus_der_Verdorbenheit'], _ - [152, 'Taste_of_Death', 'Geschmack_des_Todes'], _ - [153, 'Vampiric_Gaze', 'Vampir_Starren'], _ - [154, 'Plague_Touch', 'Pest_Berührung'], _ - [155, 'Vile_Touch', 'Abscheuliche_Berührung'], _ - [156, 'Vampiric_Touch', 'Vampir_Berührung'], _ - [157, 'Blood_Ritual', 'Blutritual'], _ - [158, 'Touch_of_Agony', 'Berührung_der_Qual'], _ - [159, 'Weaken_Armor', 'Rüstung_schwächen'], _ - [160, 'Windborne_Speed', 'Windgeschwindigkeit'], _ - [162, 'Gale', 'Orkan'], _ - [163, 'Whirlwind', 'Wirbelsturm'], _ - [164, 'Elemental_Attunement', 'Elementareinstimmung'], _ - [165, 'Armor_of_Earth', 'Erdrüstung'], _ - [166, 'Kinetic_Armor', 'Kinetik_Rüstung'], _ - [167, 'Eruption', 'Eruption'], _ - [168, 'Magnetic_Aura', 'Magnet_Aura'], _ - [169, 'Earth_Attunement', 'Erdeinstimmung'], _ - [170, 'Earthquake', 'Erdbeben'], _ - [171, 'Stoning', 'Steinigung'], _ - [172, 'Stone_Daggers', 'Steindolche'], _ - [173, 'Grasping_Earth', 'Zupackende_Erde'], _ - [174, 'Aftershock', 'Nachbeben'], _ - [175, 'Ward_Against_Elements', 'Abwehr_gegen_Elemente'], _ - [176, 'Ward_Against_Melee', 'Abwehr_gegen_Nahkampf'], _ - [177, 'Ward_Against_Foes', 'Abwehr_gegen_Feinde'], _ - [178, 'Ether_Prodigy', 'Ätherwunder'], _ - [179, 'Incendiary_Bonds', 'Brandbänder'], _ - [180, 'Aura_of_Restoration', 'Wiederherstellungs_Aura'], _ - [181, 'Ether_Renewal', 'Äthererneuerung'], _ - [182, 'Conjure_Flame', 'Flammenbeschwörung'], _ - [183, 'Inferno', 'Inferno'], _ - [184, 'Fire_Attunement', 'Feuereinstimmung'], _ - [185, 'Mind_Burn', 'Geistige_Verbrennung'], _ - [186, 'Fireball', 'Feuerball'], _ - [187, 'Meteor', 'Meteor'], _ - [188, 'Flame_Burst', 'Flammenstoß'], _ - [189, 'Rodgort_s_Invocation', 'Anrufung_von_Rodgort'], _ - [190, 'Mark_of_Rodgort', 'Zeichen_des_Rodgort'], _ - [191, 'Immolate', 'Feueropfer'], _ - [192, 'Meteor_Shower', 'Meteorschauer'], _ - [193, 'Phoenix', 'Phönix'], _ - [194, 'Flare', 'Feuergeschoss'], _ - [195, 'Lava_Font', 'Lavabecken'], _ - [196, 'Searing_Heat', 'Sengende_Hitze'], _ - [197, 'Fire_Storm', 'Feuersturm'], _ - [198, 'Glyph_of_Elemental_Power', 'Glyphe_der_Elementarkraft'], _ - [199, 'Glyph_of_Energy', 'Glyphe_der_Energie'], _ - [200, 'Glyph_of_Lesser_Energy', 'Glyphe_der_geringeren_Energie'], _ - [201, 'Glyph_of_Concentration', 'Glyphe_der_Konzentration'], _ - [202, 'Glyph_of_Sacrifice', 'Glyphe_der_Opferung'], _ - [203, 'Glyph_of_Renewal', 'Glyphe_der_Erneuerung'], _ - [204, 'Rust', 'Rost'], _ - [205, 'Lightning_Surge', 'Blitzwelle'], _ - [206, 'Armor_of_Frost', 'Frostrüstung'], _ - [207, 'Conjure_Frost', 'Frost_beschwören'], _ - [208, 'Water_Attunement', 'Wassereinstimmung'], _ - [209, 'Mind_Freeze', 'Geistige_Erfrierung'], _ - [210, 'Ice_Prison', 'Eisgefängnis'], _ - [211, 'Ice_Spikes', 'Eisdornen'], _ - [212, 'Frozen_Burst', 'Frostexplosion'], _ - [213, 'Shard_Storm', 'Scherbensturm'], _ - [214, 'Ice_Spear', 'Eisspeer'], _ - [215, 'Maelstrom', 'Strudel'], _ - [216, 'Iron_Mist', 'Eisenbeschlag'], _ - [217, 'Crystal_Wave', 'Kristallwelle'], _ - [218, 'Obsidian_Flesh', 'Obsidianfleisch'], _ - [219, 'Obsidian_Flame', 'Obsidianflamme'], _ - [220, 'Blinding_Flash', 'Blitzblendung'], _ - [221, 'Conjure_Lightning', 'Blitzbeschwörung'], _ - [222, 'Lightning_Strike', 'Blitzschlag'], _ - [223, 'Chain_Lightning', 'Kettenblitz'], _ - [224, 'Enervating_Charge', 'Schwächende_Aufladung'], _ - [225, 'Air_Attunement', 'Lufteinstimmung'], _ - [226, 'Mind_Shock', 'Geistiger_Schock'], _ - [227, 'Glimmering_Mark', 'Schimmerndes_Zeichen'], _ - [228, 'Thunderclap', 'Donnerschlag'], _ - [229, 'Lightning_Orb', 'Kugelblitz'], _ - [230, 'Lightning_Javelin', 'Blitzspeer'], _ - [231, 'Shock', 'Schock'], _ - [232, 'Lightning_Touch', 'Blitz_Berührung'], _ - [233, 'Swirling_Aura', 'Wirbelnde_Aura'], _ - [234, 'Deep_Freeze', 'Tiefgefrieren'], _ - [235, 'Blurred_Vision', 'Verschwommene_Sicht'], _ - [236, 'Mist_Form', 'Nebelform'], _ - [237, 'Water_Trident', 'Wasserdreizack'], _ - [238, 'Armor_of_Mist', 'Nebelrüstung'], _ - [239, 'Ward_Against_Harm', 'Abwehr_gegen_Schaden'], _ - [240, 'Smite', 'Peinigung'], _ - [241, 'Life_Bond', 'Lebensbindung'], _ - [242, 'Balthazars_Spirit', 'Balthasars_Geist'], _ - [243, 'Strength_of_Honor', 'Stärke_der_Ehre'], _ - [244, 'Life_Attunement', 'Lebenseinstimmung'], _ - [245, 'Protective_Spirit', 'Schutzgeist'], _ - [246, 'Divine_Intervention', 'Göttliche_Intervention'], _ - [247, 'Symbol_of_Wrath', 'Symbol_des_Zorns'], _ - [248, 'Retribution', 'Vergeltung'], _ - [249, 'Holy_Wrath', 'Heiliger_Zorn'], _ - [250, 'Essence_Bond', 'Essenzbindung'], _ - [251, 'Scourge_Healing', 'Geißelheilung'], _ - [252, 'Banish', 'Verbannung'], _ - [253, 'Scourge_Sacrifice', 'Geißelopfer'], _ - [254, 'Vigorous_Spirit', 'Energischer_Geist'], _ - [255, 'Watchful_Spirit', 'Wachsamer_Geist'], _ - [256, 'Blessed_Aura', 'Gesegnete_Aura'], _ - [257, 'Aegis', 'Aegis'], _ - [258, 'Guardian', 'Wächter'], _ - [259, 'Shield_of_Deflection', 'Ablenkungsschild'], _ - [260, 'Aura_of_Faith', 'Glaubensaura'], _ - [261, 'Shield_of_Regeneration', 'Schild_der_Regeneration'], _ - [262, 'Shield_of_Judgment', 'Schild_des_Urteils'], _ - [263, 'Protective_Bond', 'Band_des_Schutzes'], _ - [264, 'Pacifism', 'Pazifismus'], _ - [265, 'Amity', 'Freundschaft'], _ - [266, 'Peace_and_Harmony', 'Frieden_und_Harmonie'], _ - [267, 'Judges_Insight', 'Einblick_des_Richters'], _ - [268, 'Unyielding_Aura', 'Unnachgiebige_Aura'], _ - [269, 'Mark_of_Protection', 'Schutzzeichen'], _ - [270, 'Life_Barrier', 'Lebenssperre'], _ - [271, 'Zealots_Fire', 'Eifererfeuer'], _ - [272, 'Balthazars_Aura', 'Balthasars_Aura'], _ - [273, 'Spell_Breaker', 'Zauberbrecher'], _ - [274, 'Healing_Seed', 'Heilender_Samen'], _ - [275, 'Mend_Condition', 'Zustand_bessern'], _ - [276, 'Restore_Condition', 'Zustand_wiederherstellen'], _ - [277, 'Mend_Ailment', 'Leiden_heilen'], _ - [278, 'Purge_Conditions', 'Zustände_reinigen'], _ - [279, 'Divine_Healing', 'Göttliche_Heilung'], _ - [280, 'Heal_Area', 'Gebiet_heilen'], _ - [281, 'Orison_of_Healing', 'Fürbitte_der_Heilung'], _ - [282, 'Word_of_Healing', 'Wort_der_Heilung'], _ - [283, 'Dwaynas_Kiss', 'Dwaynas_Kuss'], _ - [284, 'Divine_Boon', 'Göttlicher_Segen'], _ - [285, 'Healing_Hands', 'Heilende_Hände'], _ - [286, 'Heal_Other', 'Anderen_heilen'], _ - [287, 'Heal_Party', 'Gruppe_heilen'], _ - [288, 'Healing_Breeze', 'Heilender_Hauch'], _ - [289, 'Vital_Blessing', 'Lebendige_Segnung'], _ - [290, 'Mending', 'Genesung'], _ - [291, 'Live_Vicariously', 'Ersatzleben'], _ - [292, 'Infuse_Health', 'Leben_einflößen'], _ - [293, 'Signet_of_Devotion', 'Siegel_der_Hingabe'], _ - [294, 'Signet_of_Judgment', 'Siegel_des_Urteils'], _ - [295, 'Purge_Signet', 'Siegel_der_Reinigung'], _ - [296, 'Bane_Signet', 'Siegel_des_Ruins'], _ - [297, 'Blessed_Signet', 'Gesegnetes_Siegel'], _ - [298, 'Martyr', 'Märtyrer'], _ - [299, 'Shielding_Hands', 'Schützende_Hände'], _ - [300, 'Contemplation_of_Purity', 'Gebot_der_Reinheit'], _ - [301, 'Remove_Hex', 'Verhexung_entfernen'], _ - [302, 'Smite_Hex', 'Verhexung_zerschlagen'], _ - [303, 'Convert_Hexes', 'Verhexungen_umwandeln'], _ - [304, 'Light_of_Dwayna', 'Licht_von_Dwayna'], _ - [305, 'Resurrect', 'Wiederbeleben'], _ - [306, 'Rebirth', 'Wiedergeburt'], _ - [307, 'Reversal_of_Fortune', 'Umkehrung_des_Schicksals'], _ - [308, 'Succor', 'Beistand'], _ - [309, 'Holy_Veil', 'Heiliger_Schleier'], _ - [310, 'Divine_Spirit', 'Göttlicher_Geist'], _ - [311, 'Draw_Conditions', 'Zustände_entziehen'], _ - [312, 'Holy_Strike', 'Heiliger_Schlag'], _ - [313, 'Healing_Touch', 'Heilende_Berührung'], _ - [314, 'Restore_Life', 'Leben_erneuern'], _ - [315, 'Vengeance', 'Rache'], _ - [316, 'To_the_Limit', 'Bis_ans_Limit'], _ - [317, 'Battle_Rage', 'Kampfwut'], _ - [318, 'Defy_Pain', 'Schmerz_trotzen'], _ - [319, 'Rush', 'Ansturm'], _ - [320, 'Hamstring', 'Lähmung'], _ - [321, 'Wild_Blow', 'Rundumschlag'], _ - [322, 'Power_Attack', 'Kraftangriff'], _ - [323, 'Desperation_Blow', 'Verzweiflungsschlag'], _ - [324, 'Thrill_of_Victory', 'Rausch_des_Sieges'], _ - [325, 'Distracting_Blow', 'Ablenkungsschlag'], _ - [326, 'Protectors_Strike', 'Schlag_des_Beschützers'], _ - [327, 'Griffons_Sweep', 'Greifenschlag'], _ - [328, 'Pure_Strike', 'Reiner_Schlag'], _ - [329, 'Skull_Crack', 'Schädel_spalten'], _ - [330, 'Cyclone_Axe', 'Zyklonaxt'], _ - [331, 'Hammer_Bash', 'Hammerstreich'], _ - [332, 'Bulls_Strike', 'Bullenstoß'], _ - [333, 'I_Will_Avenge_You', 'Ich_werde_Euch_rächen'], _ - [334, 'Axe_Rake', 'Harkenaxt'], _ - [335, 'Cleave', 'Spalten'], _ - [336, 'Executioners_Strike', 'Henkerschlag'], _ - [337, 'Dismember', 'Zerstückeln'], _ - [338, 'Eviscerate', 'Ausweiden'], _ - [339, 'Penetrating_Blow', 'Durchdringender_Schlag'], _ - [340, 'Disrupting_Chop', 'Unterbrechender_Hieb'], _ - [341, 'Swift_Chop', 'Schneller_Hieb'], _ - [342, 'Axe_Twist', 'Axtdrehung'], _ - [343, 'For_Great_Justice', 'Für_höhere_Gerechtigkeit'], _ - [344, 'Flurry', 'Schauer'], _ - [345, 'Defensive_Stance', 'Verteidigungshaltung'], _ - [346, 'Frenzy', 'Raserei'], _ - [347, 'Endure_Pain', 'Schmerz_ertragen'], _ - [348, 'Watch_Yourself', 'Passt_auf_Euch_auf'], _ - [349, 'Sprint', 'Sprinten'], _ - [350, 'Belly_Smash', 'Bauchklatscher'], _ - [351, 'Mighty_Blow', 'Mächtiger_Schlag'], _ - [352, 'Crushing_Blow', 'Vernichtender_Schlag'], _ - [353, 'Crude_Swing', 'Grober_Schwung'], _ - [354, 'Earth_Shaker', 'Erdrüttler'], _ - [355, 'Devastating_Hammer', 'Verheerender_Hammer'], _ - [356, 'Irresistible_Blow', 'Brutaler_Schlag'], _ - [357, 'Counter_Blow', 'Gegenschlag'], _ - [358, 'Backbreaker', 'Rückenbrecher'], _ - [359, 'Heavy_Blow', 'Heftiger_Schlag'], _ - [360, 'Staggering_Blow', 'Umwerfender_Schlag'], _ - [361, 'Dolyak_Signet', 'Dolyak_Siegel'], _ - [362, 'Warriors_Cunning', 'Verschlagenheit_des_Kriegers'], _ - [363, 'Shield_Bash', 'Heftiger_Schildschlag'], _ - [364, 'Charge', 'Angriff'], _ - [365, 'Victory_Is_Mine', 'Der_Sieg_ist_mein'], _ - [366, 'Fear_Me', 'Fürchtet_mich'], _ - [367, 'Shields_Up', 'Schilde_hoch'], _ - [368, 'I_Will_Survive', 'Ich_überlebe'], _ - [370, 'Berserker_Stance', 'Berserkerhaltung'], _ - [371, 'Balanced_Stance', 'Ausgeglichene_Haltung'], _ - [372, 'Gladiators_Defense', 'Gladiatoren_Verteidigung'], _ - [373, 'Deflect_Arrows', 'Pfeilablenkung'], _ - [374, 'Warriors_Endurance', 'Ausdauer_des_Kriegers'], _ - [375, 'Dwarven_Battle_Stance', 'Zwergen_Kampfhaltung'], _ - [376, 'Disciplined_Stance', 'Disziplinierte_Haltung'], _ - [377, 'Wary_Stance', 'Wachsame_Haltung'], _ - [378, 'Shield_Stance', 'Schildhaltung'], _ - [379, 'Bulls_Charge', 'Angriff_des_Bullen'], _ - [380, 'Bonettis_Defense', 'Bonettis_Verteidigung'], _ - [381, 'Hundred_Blades', 'Hundert_Klingen'], _ - [382, 'Sever_Artery', 'Arterienabtrennung'], _ - [383, 'Galrath_Slash', 'Galrath_Hieb'], _ - [384, 'Gash', 'Schnittwunde'], _ - [385, 'Final_Thrust', 'Endstoß'], _ - [386, 'Seeking_Blade', 'Suchende_Klinge'], _ - [387, 'Riposte', 'Entgegnung'], _ - [388, 'Deadly_Riposte', 'Tödliche_Entgegnung'], _ - [389, 'Flourish', 'Blütezeit'], _ - [390, 'Savage_Slash', 'Wilder_Hieb'], _ - [391, 'Hunters_Shot', 'Jägerschuss'], _ - [392, 'Pin_Down', 'Festnageln'], _ - [393, 'Crippling_Shot', 'Verkrüppelungs_Schuss'], _ - [394, 'Power_Shot', 'Kraftschuss'], _ - [395, 'Barrage', 'Sperrfeuer'], _ - [396, 'Dual_Shot', 'Doppelschuss'], _ - [397, 'Quick_Shot', 'Schnellschuss'], _ - [398, 'Penetrating_Attack', 'Durchbohr_Angriff'], _ - [399, 'Distracting_Shot', 'Ablenk_Schuss'], _ - [400, 'Precision_Shot', 'Präzisionsschuss'], _ - [402, 'Determined_Shot', 'Entschlossener_Schuss'], _ - [403, 'Called_Shot', 'Ankündigungs_Schuss'], _ - [404, 'Poison_Arrow', 'Giftpfeil'], _ - [405, 'Oath_Shot', 'Eidschuss'], _ - [406, 'Debilitating_Shot', 'Entkräftungs_Schuss'], _ - [407, 'Point_Blank_Shot', 'Kurzdistanzschuss'], _ - [408, 'Concussion_Shot', 'Erschütterungsschuss'], _ - [409, 'Punishing_Shot', 'Bestrafungs_Schuss'], _ - [411, 'Charm_Animal', 'Tier_zähmen'], _ - [412, 'Call_of_Protection', 'Ruf_des_Schutzes'], _ - [415, 'Call_of_Haste', 'Ruf_der_Eile'], _ - [422, 'Revive_Animal', 'Tier_wiederbeleben'], _ - [423, 'Symbiotic_Bond', 'Symbiotisches_Band'], _ - [424, 'Throw_Dirt', 'Dreck_werfen'], _ - [425, 'Dodge', 'Abducken'], _ - [426, 'Savage_Shot', 'Wilder_Schuss'], _ - [427, 'Antidote_Signet', 'Gegengift_Siegel'], _ - [428, 'Incendiary_Arrows', 'Flammenpfeile'], _ - [429, 'Melandrus_Arrows', 'Melandrus_Pfeile'], _ - [430, 'Marksmans_Wager', 'Schützenwette'], _ - [431, 'Ignite_Arrows', 'Brandpfeile'], _ - [432, 'Read_the_Wind', 'Wind_lesen'], _ - [433, 'Kindle_Arrows', 'Zündelpfeile'], _ - [434, 'Choking_Gas', 'Würgegas'], _ - [435, 'Apply_Poison', 'Gift_auftragen'], _ - [436, 'Comfort_Animal', 'Tier_erquicken'], _ - [437, 'Bestial_Pounce', 'Bestiensprung'], _ - [438, 'Maiming_Strike', 'Verkrüppelungs_Schlag'], _ - [439, 'Feral_Lunge', 'Wilder_Ausfall'], _ - [440, 'Scavenger_Strike', 'Aasfresser_Schlag'], _ - [441, 'Melandrus_Assault', 'Melandrus_Angriff'], _ - [442, 'Ferocious_Strike', 'Wilder_Schlag'], _ - [443, 'Predators_Pounce', 'Raubtier_Sprung'], _ - [444, 'Brutal_Strike', 'Schonungsloser_Schlag'], _ - [445, 'Disrupting_Lunge', 'Unterbrechender_Ausfall'], _ - [446, 'Troll_Unguent', 'Trollsalbe'], _ - [447, 'Otyughs_Cry', 'Otyughs_Schrei'], _ - [448, 'Escape', 'Flucht'], _ - [449, 'Practiced_Stance', 'Geübte_Haltung'], _ - [450, 'Whirling_Defense', 'Wirbelverteidigung'], _ - [451, 'Melandrus_Resilience', 'Melandrus_Belastbarkeit'], _ - [452, 'Dryders_Defenses', 'Dryders_Verteidigungen'], _ - [453, 'Lightning_Reflexes', 'Blitzreflexe'], _ - [454, 'Tigers_Fury', 'Wut_des_Tigers'], _ - [455, 'Storm_Chaser', 'Sturmjäger'], _ - [456, 'Serpents_Quickness', 'Schlangen_Schnelligkeit'], _ - [457, 'Dust_Trap', 'Staubfalle'], _ - [458, 'Barbed_Trap', 'Stachelfalle'], _ - [459, 'Flame_Trap', 'Flammenfalle'], _ - [460, 'Healing_Spring', 'Heilquelle'], _ - [461, 'Spike_Trap', 'Dornenfalle'], _ - [462, 'Winter', 'Winter'], _ - [463, 'Winnowing', 'Trennung'], _ - [464, 'Edge_of_Extinction', 'Rand_der_Auslöschung'], _ - [465, 'Greater_Conflagration', 'Großflächenbrand'], _ - [466, 'Conflagration', 'Feuersbrunst'], _ - [467, 'Fertile_Season', 'Fruchtbare_Jahreszeit'], _ - [468, 'Symbiosis', 'Symbiose'], _ - [469, 'Primal_Echoes', 'Urechos'], _ - [470, 'Predatory_Season', 'Jagdsaison'], _ - [471, 'Frozen_Soil', 'Eisboden'], _ - [472, 'Favorable_Winds', 'Günstige_Winde'], _ - [474, 'Energizing_Wind', 'Treibwind'], _ - [475, 'Quickening_Zephyr', 'Beschleunigender_Zephyr'], _ - [476, 'Natures_Renewal', 'Erneuerung_der_Natur'], _ - [477, 'Muddy_Terrain', 'Schlammiges_Terrain'], _ - [570, 'Mark_of_Insecurity', 'Zeichen_der_Unsicherheit'], _ - [571, 'Disrupting_Dagger', 'Unterbrechender_Dolch'], _ - [572, 'Deadly_Paradox', 'Tödliches_Paradoxon'], _ - [763, 'Jaundiced_Gaze', 'Neidvoller_Blick'], _ - [764, 'Wail_of_Doom', 'Schicksalsklage'], _ - [766, 'Gaze_of_Contempt', 'Verächtlicher_Blick'], _ - [769, 'Vipers_Defense', 'Verteidigung_der_Viper'], _ - [770, 'Return', 'Rückkehr'], _ - [771, 'Aura_of_Displacement', 'Aura_der_Verschiebung'], _ - [772, 'Generous_Was_Tsungrai', 'Großzügig_war_Tsungrai'], _ - [773, 'Mighty_Was_Vorizun', 'Mächtig_war_Vorizun'], _ - [775, 'Death_Blossom', 'Todesblüte'], _ - [776, 'Twisting_Fangs', 'Schlangenzähne'], _ - [777, 'Horns_of_the_Ox', 'Hörner_des_Ochsen'], _ - [778, 'Falling_Spider', 'Fallende_Spinne'], _ - [779, 'Black_Lotus_Strike', 'Schwarzer_Lotus_Stoß'], _ - [780, 'Fox_Fangs', 'Reißzähne_des_Fuchses'], _ - [781, 'Moebius_Strike', 'Möbiusstoß'], _ - [782, 'Jagged_Strike', 'Gezackter_Stoß'], _ - [783, 'Unsuspecting_Strike', 'Unvermuteter_Stoß'], _ - [784, 'Entangling_Asp', 'Schlingnatter'], _ - [785, 'Mark_of_Death', 'Zeichen_des_Todes'], _ - [786, 'Iron_Palm', 'Eiserne_Handfläche'], _ - [787, 'Resilient_Weapon', 'Unverwüstliche_Waffe'], _ - [788, 'Blind_Was_Mingson', 'Blind_war_Mingson'], _ - [789, 'Grasping_Was_Kuurong', 'Erfassend_war_Kuurong'], _ - [790, 'Vengeful_Was_Khanhei', 'Nachtragend_war_Khanhei'], _ - [791, 'Flesh_of_My_Flesh', 'Fleisch_von_meinem_Fleisch'], _ - [792, 'Splinter_Weapon', 'Splitterwaffe'], _ - [793, 'Weapon_of_Warding', 'Waffe_der_Abwehr'], _ - [794, 'Wailing_Weapon', 'Klagende_Waffe'], _ - [795, 'Nightmare_Weapon', 'Alptraumwaffe'], _ - [799, 'Beguiling_Haze', 'Verführerischer_Dunst'], _ - [800, 'Enduring_Toxin', 'Dauerhaftes_Toxin'], _ - [801, 'Shroud_of_Silence', 'Schleier_des_Schweigens'], _ - [802, 'Expose_Defenses', 'Verteidigungen_aufdecken'], _ - [803, 'Power_Leech', 'Kraftfresser'], _ - [804, 'Arcane_Languor', 'Arkane_Schwäche'], _ - [805, 'Animate_Vampiric_Horror', 'Vampirschreck_beleben'], _ - [806, 'Cultists_Fervor', 'Eifer_des_Sektierers'], _ - [808, 'Reapers_Mark', 'Zeichen_des_Schnitters'], _ - [809, 'Shatterstone', 'Trümmerstein'], _ - [810, 'Protectors_Defense', 'Verteidigung_des_Beschützers'], _ - [811, 'Run_as_One', 'Gemeinsam_rennen'], _ - [812, 'Defiant_Was_Xinrae', 'Trotzig_war_Xinrae'], _ - [813, 'Lyssas_Aura', 'Lyssas_Aura'], _ - [814, 'Shadow_Refuge', 'Schattenzuflucht'], _ - [815, 'Scorpion_Wire', 'Skorpiondraht'], _ - [816, 'Mirrored_Stance', 'Gespiegelte_Haltung'], _ - [817, 'Discord', 'Zwietracht'], _ - [818, 'Well_of_Weariness', 'Brunnen_der_Müdigkeit'], _ - [819, 'Vampiric_Spirit', 'Vampirgeist'], _ - [820, 'Depravity', 'Verderbtheit'], _ - [821, 'Icy_Veins', 'Eisadern'], _ - [822, 'Weaken_Knees', 'Weiche_Knie'], _ - [823, 'Burning_Speed', 'Brennende_Eile'], _ - [824, 'Lava_Arrows', 'Lavapfeile'], _ - [825, 'Bed_of_Coals', 'Kohlenbett'], _ - [826, 'Shadow_Form', 'Schattenform'], _ - [827, 'Siphon_Strength', 'Kraft_abzapfen'], _ - [828, 'Vile_Miasma', 'Fauler_Gestank'], _ - [830, 'Ray_of_Judgment', 'Strahl_des_Urteils'], _ - [831, 'Primal_Rage', 'Urzorn'], _ - [832, 'Animate_Flesh_Golem', 'Fleischgolem_beleben'], _ - [834, 'Reckless_Haste', 'Rücksichtslose_Hast'], _ - [835, 'Blood_Bond', 'Blutsbande'], _ - [836, 'Ride_the_Lightning', 'Den_Blitz_reiten'], _ - [837, 'Energy_Boon', 'Energiesegen'], _ - [838, 'Dwaynas_Sorrow', 'Dwaynas_Leid'], _ - [839, 'Retreat', 'Rückzug'], _ - [840, 'Poisoned_Heart', 'Vergiftetes_Herz'], _ - [841, 'Fetid_Ground', 'Stinkender_Boden'], _ - [842, 'Arc_Lightning', 'Blitzbogen'], _ - [843, 'Gust', 'Böe'], _ - [844, 'Churning_Earth', 'Aufgeworfene_Erde'], _ - [845, 'Liquid_Flame', 'Flüssige_Flamme'], _ - [846, 'Steam', 'Dampf'], _ - [847, 'Boon_Signet', 'Siegel_des_Segens'], _ - [848, 'Reverse_Hex', 'Verhexung_umkehren'], _ - [849, 'Lacerating_Chop', 'Zerfetzender_Hieb'], _ - [850, 'Fierce_Blow', 'Erbitterter_Schlag'], _ - [851, 'Sun_and_Moon_Slash', 'Sonne_Mond_Hieb'], _ - [852, 'Splinter_Shot', 'Splitterschuss'], _ - [853, 'Melandrus_Shot', 'Melandrus_Schuss'], _ - [854, 'Snare', 'Schlinge'], _ - [858, 'Dancing_Daggers', 'Tanzende_Dolche'], _ - [859, 'Conjure_Nightmare', 'Alptraum_beschwören'], _ - [860, 'Signet_of_Disruption', 'Siegel_der_Unterbrechung'], _ - [862, 'Ravenous_Gaze', 'Heißhungriger_Blick'], _ - [863, 'Order_of_Apostasy', 'Orden_der_Abtrünnigkeit'], _ - [864, 'Oppressive_Gaze', 'Repressiver_Blick'], _ - [865, 'Lightning_Hammer', 'Blitzhammer'], _ - [866, 'Vapor_Blade', 'Dunstklinge'], _ - [867, 'Healing_Light', 'Heilendes_Licht'], _ - [869, 'Coward', 'Feigling'], _ - [870, 'Pestilence', 'Pestilenz'], _ - [871, 'Shadowsong', 'Schattengesang'], _ - [876, 'Signet_of_Shadows', 'Siegel_der_Schatten'], _ - [877, 'Lyssas_Balance', 'Lyssas_Ausgleich'], _ - [878, 'Visions_of_Regret', 'Visionen_des_Bedauerns'], _ - [879, 'Illusion_of_Pain', 'Illusion_der_Schmerzen'], _ - [880, 'Stolen_Speed', 'Gestohlene_Eile'], _ - [881, 'Ether_Signet', 'Äther_Siegel'], _ - [882, 'Signet_of_Disenchantment', 'Siegel_der_Entzauberung'], _ - [883, 'Vocal_Minority', 'Stimmminderheit'], _ - [884, 'Searing_Flames', 'Versengende_Flammen'], _ - [885, 'Shield_Guardian', 'Schildwächter'], _ - [886, 'Restful_Breeze', 'Beruhigender_Hauch'], _ - [887, 'Signet_of_Rejuvenation', 'Siegel_der_Verjüngung'], _ - [888, 'Whirling_Axe', 'Wirbelnde_Axt'], _ - [889, 'Forceful_Blow', 'Energischer_Schlag'], _ - [891, 'None_Shall_Pass', 'Niemand_darf_vorbei'], _ - [892, 'Quivering_Blade', 'Zitternde_Klinge'], _ - [893, 'Seeking_Arrows', 'Suchende_Pfeile'], _ - [898, 'Overload', 'Überlastung'], _ - [899, 'Images_of_Remorse', 'Bilder_der_Reue'], _ - [900, 'Shared_Burden', 'Geteilte_Bürde'], _ - [901, 'Soul_Bind', 'Seelenfessel'], _ - [902, 'Blood_of_the_Aggressor', 'Blut_des_Aggressoren'], _ - [903, 'Icy_Prism', 'Eisprisma'], _ - [904, 'Furious_Axe', 'Zornige_Axt'], _ - [905, 'Auspicious_Blow', 'Günstiger_Schlag'], _ - [906, 'On_Your_Knees', 'Auf_Eure_Knie'], _ - [907, 'Dragon_Slash', 'Drachenhieb'], _ - [908, 'Marauders_Shot', 'Plünderer_Schuss'], _ - [909, 'Focused_Shot', 'Scharfschuss'], _ - [910, 'Spirit_Rift', 'Geisterriss'], _ - [911, 'Union', 'Vereinigung'], _ - [913, 'Tranquil_Was_Tanasen', 'Ruhig_war_Tanasen'], _ - [914, 'Consume_Soul', 'Seele_verzehren'], _ - [915, 'Spirit_Light', 'Geisterlicht'], _ - [916, 'Lamentation', 'Wehklage'], _ - [917, 'Rupture_Soul', 'Seele_zerreißen'], _ - [918, 'Spirit_to_Flesh', 'Geist_zu_Fleisch'], _ - [919, 'Spirit_Burn', 'Geisterbrand'], _ - [920, 'Destruction', 'Vernichtung'], _ - [921, 'Dissonance', 'Missklang'], _ - [923, 'Disenchantment', 'Entzauberung'], _ - [925, 'Recall', 'Rückruf'], _ - [926, 'Sharpen_Daggers', 'Dolche_wetzen'], _ - [927, 'Shameful_Fear', 'Schändliche_Angst'], _ - [928, 'Shadow_Shroud', 'Schattenschleier'], _ - [929, 'Shadow_of_Haste', 'Schatten_der_Eile'], _ - [930, 'Auspicious_Incantation', 'Günstige_Beschwörung'], _ - [931, 'Power_Return', 'Kraftrevanche'], _ - [932, 'Complicate', 'Erschweren'], _ - [933, 'Shatter_Storm', 'Sturm_zerschlagen'], _ - [934, 'Unnatural_Signet', 'Unnatürliches_Siegel'], _ - [935, 'Rising_Bile', 'Hochkommende_Galle'], _ - [936, 'Envenom_Enchantments', 'Verzauberungen_vergiften'], _ - [937, 'Shockwave', 'Stoßwelle'], _ - [938, 'Ward_of_Stability', 'Kreis_der_Stabilität'], _ - [939, 'Icy_Shackles', 'Eisfesseln'], _ - [941, 'Blessed_Light', 'Gesegnetes_Licht'], _ - [942, 'Withdraw_Hexes', 'Verhexungen_zurücknehmen'], _ - [943, 'Extinguish', 'Löschen'], _ - [944, 'Signet_of_Strength', 'Siegel_der_Stärke'], _ - [946, 'Trappers_Focus', 'Fokus_des_Fallenstellers'], _ - [947, 'Brambles', 'Dornenranken'], _ - [948, 'Desperate_Strike', 'Verzweifelter_Stoß'], _ - [949, 'Way_of_the_Fox', 'Weg_des_Fuchses'], _ - [950, 'Shadowy_Burden', 'Schattenbürde'], _ - [951, 'Siphon_Speed', 'Geschwindigkeit_abzapfen'], _ - [952, 'Deaths_Charge', 'Angriff_des_Todes'], _ - [953, 'Power_Flux', 'Kraftfluss'], _ - [954, 'Expel_Hexes', 'Verhexungen_vertreiben'], _ - [955, 'Rip_Enchantment', 'Verzauberung_zerreißen'], _ - [957, 'Spell_Shield', 'Zauberschild'], _ - [958, 'Healing_Whisper', 'Heilendes_Geflüster'], _ - [959, 'Ethereal_Light', 'Ätherisches_Licht'], _ - [960, 'Release_Enchantments', 'Verzauberungen_freisetzen'], _ - [961, 'Lacerate', 'Zerfetzen'], _ - [962, 'Spirit_Transfer', 'Geistübertragung'], _ - [963, 'Restoration', 'Wiederherstellung'], _ - [964, 'Vengeful_Weapon', 'Rachsüchtige_Waffe'], _ - [973, 'Blinding_Powder', 'Blendpulver'], _ - [974, 'Mantis_Touch', 'Berührung_der_Mantis'], _ - [975, 'Exhausting_Assault', 'Ermüdender_Angriff'], _ - [976, 'Repeating_Strike', 'Wiederholender_Schlag'], _ - [977, 'Way_of_the_Lotus', 'Weg_des_Lotus'], _ - [978, 'Mark_of_Instability', 'Zeichen_der_Unbeständigkeit'], _ - [979, 'Mistrust', 'Argwohn'], _ - [980, 'Feast_of_Souls', 'Schmaus_der_Seelen'], _ - [981, 'Recuperation', 'Erholung'], _ - [982, 'Shelter', 'Unterschlupf'], _ - [983, 'Weapon_of_Shadow', 'Schattenwaffe'], _ - [985, 'Caltrops', 'Trittnägel'], _ - [986, 'Nine_Tail_Strike', 'Neunschwänziger_Stoß'], _ - [987, 'Way_of_the_Empty_Palm', 'Weg_der_leeren_Handfläche'], _ - [988, 'Temple_Strike', 'Schläfenstoß'], _ - [989, 'Golden_Phoenix_Strike', 'Goldener_Phönix_Stoß'], _ - [990, 'Expunge_Enchantments', 'Verzauberungen_ausmerzen'], _ - [991, 'Deny_Hexes', 'Verhexungen_zurückweisen'], _ - [992, 'Triple_Chop', 'Dreifachhieb'], _ - [993, 'Enraged_Smash', 'Erzürnter_Schlag'], _ - [994, 'Renewing_Smash', 'Erneuernder_Schlag'], _ - [995, 'Tiger_Stance', 'Tigerhaltung'], _ - [996, 'Standing_Slash', 'Stehender_Hieb'], _ - [997, 'Famine', 'Hungersnot'], _ - [1018, 'Critical_Eye', 'Kritisches_Auge'], _ - [1019, 'Critical_Strike', 'Kritischer_Stoß'], _ - [1020, 'Blades_of_Steel', 'Stahlklingen'], _ - [1021, 'Jungle_Strike', 'Dschungelschlag'], _ - [1022, 'Wild_Strike', 'Wilder_Stoß'], _ - [1023, 'Leaping_Mantis_Sting', 'Stich_der_springenden_Mantis'], _ - [1024, 'Black_Mantis_Thrust', 'Stoß_der_schwarzen_Mantis'], _ - [1025, 'Disrupting_Stab', 'Unterbrechender_Dolchstoß'], _ - [1026, 'Golden_Lotus_Strike', 'Goldener_Lotus_Stoß'], _ - [1027, 'Critical_Defenses', 'Kritische_Verteidigungen'], _ - [1028, 'Way_of_Perfection', 'Weg_der_Perfektion'], _ - [1029, 'Dark_Apostasy', 'Dunkle_Abtrünnigkeit'], _ - [1030, 'Locusts_Fury', 'Wut_der_Heuschrecke'], _ - [1031, 'Shroud_of_Distress', 'Schleier_des_Kummers'], _ - [1032, 'Heart_of_Shadow', 'Herz_der_Schatten'], _ - [1033, 'Impale', 'Aufspießen'], _ - [1034, 'Seeping_Wound', 'Eiternde_Wunde'], _ - [1035, 'Assassins_Promise', 'Versprechen_des_Assassinen'], _ - [1036, 'Signet_of_Malice', 'Siegel_der_Bosheit'], _ - [1037, 'Dark_Escape', 'Dunkle_Flucht'], _ - [1038, 'Crippling_Dagger', 'Verkrüppelnder_Dolch'], _ - [1040, 'Spirit_Walk', 'Geistermarsch'], _ - [1041, 'Unseen_Fury', 'Unsichtbare_Wut'], _ - [1042, 'Flashing_Blades', 'Blitzende_Klingen'], _ - [1043, 'Dash', 'Preschen'], _ - [1044, 'Dark_Prison', 'Dunkles_Gefängnis'], _ - [1045, 'Palm_Strike', 'Handflächenschlag'], _ - [1048, 'Revealed_Enchantment', 'Enthüllte_Verzauberung'], _ - [1049, 'Revealed_Hex', 'Enthüllte_Verhexung'], _ - [1052, 'Accumulated_Pain', 'Angehäufter_Schmerz'], _ - [1053, 'Psychic_Distraction', 'Übernatürliche_Ablenkung'], _ - [1054, 'Ancestors_Visage', 'Antlitz_des_Ahnen'], _ - [1055, 'Recurring_Insecurity', 'Wiederkehrende_Unsicherheit'], _ - [1056, 'Kitahs_Burden', 'Kitahs_Bürde'], _ - [1057, 'Psychic_Instability', 'Übernatürliche_Labilität'], _ - [1059, 'Hex_Eater_Signet', 'Verhexungsfresser_Siegel'], _ - [1061, 'Feedback', 'Reaktion'], _ - [1062, 'Arcane_Larceny', 'Arkane_Entwendung'], _ - [1066, 'Spoil_Victor', 'Sieger_plündern'], _ - [1067, 'Lifebane_Strike', 'Lebensfluchstoß'], _ - [1068, 'Bitter_Chill', 'Bitterkalt'], _ - [1069, 'Taste_of_Pain', 'Geschmack_der_Schmerzen'], _ - [1070, 'Defile_Enchantments', 'Verzauberungen_schänden'], _ - [1071, 'Shivers_of_Dread', 'Angstschauer'], _ - [1075, 'Vampiric_Swarm', 'Vampirschwarm'], _ - [1076, 'Blood_Drinker', 'Bluttrinker'], _ - [1077, 'Vampiric_Bite', 'Vampirbiss'], _ - [1078, 'Wallows_Bite', 'Wälzerbiss'], _ - [1079, 'Enfeebling_Touch', 'Schwächende_Berührung'], _ - [1081, 'Teinais_Wind', 'Teinais_Wind'], _ - [1082, 'Shock_Arrow', 'Schockpfeil'], _ - [1083, 'Unsteady_Ground', 'Schwankender_Boden'], _ - [1084, 'Sliver_Armor', 'Splitter_Rüstung'], _ - [1085, 'Ash_Blast', 'Aschenexplosion'], _ - [1086, 'Dragon_s_Stomp', 'Drachenstampfer'], _ - [1088, 'Second_Wind', 'Zweite_Chance'], _ - [1090, 'Smoldering_Embers', 'Glühende_Kohle'], _ - [1091, 'Double_Dragon', 'Doppeldrache'], _ - [1093, 'Teinais_Heat', 'Teinais_Hitze'], _ - [1094, 'Breath_of_Fire', 'Feueratem'], _ - [1095, 'Star_Burst', 'Sternenexplosion'], _ - [1096, 'Glyph_of_Essence', 'Glyphe_der_Essenz'], _ - [1097, 'Teinais_Prison', 'Teinais_Gefängnis'], _ - [1098, 'Mirror_of_Ice', 'Eisspiegel'], _ - [1099, 'Teinais_Crystals', 'Teinais_Kristalle'], _ - [1113, 'Kirins_Wrath', 'Kirins_Zorn'], _ - [1114, 'Spirit_Bond', 'Geisterbindung'], _ - [1115, 'Air_of_Enchantment', 'Flair_der_Verzauberung'], _ - [1117, 'Heavens_Delight', 'Himmlische_Wonne'], _ - [1118, 'Healing_Burst', 'Heilsalve'], _ - [1119, 'Kareis_Healing_Circle', 'Kareis_Heilkreis'], _ - [1120, 'Jameis_Gaze', 'Jameis_Starren'], _ - [1121, 'Gift_of_Health', 'Geschenk_des_Lebens'], _ - [1123, 'Life_Sheath', 'Lebensmantel'], _ - [1126, 'Empathic_Removal', 'Ausdrückliche_Entfernung'], _ - [1128, 'Resurrection_Chant', 'Gesang_der_Wiederbelebung'], _ - [1129, 'Word_of_Censure', 'Wort_des_Tadels'], _ - [1130, 'Spear_of_Light', 'Speer_des_Lichts'], _ - [1131, 'Stonesoul_Strike', 'Steinseelenschlag'], _ - [1133, 'Drunken_Blow', 'Betrunkener_Schlag'], _ - [1134, 'Leviathans_Sweep', 'Leviathanschlag'], _ - [1135, 'Jaizhenju_Strike', 'Jaizhenjuschlag'], _ - [1136, 'Penetrating_Chop', 'Durchdringender_Hieb'], _ - [1137, 'Yeti_Smash', 'Yetischlag'], _ - [1141, 'You_Will_Die', 'Ihr_werdet_sterben'], _ - [1142, 'Auspicious_Parry', 'Günstige_Abwehr'], _ - [1144, 'Silverwing_Slash', 'Silberflügel_Hieb'], _ - [1146, 'Shove', 'Schubs'], _ - [1191, 'Sundering_Attack', 'Trennender_Angriff'], _ - [1192, 'Zojuns_Shot', 'Zojuns_Schuss'], _ - [1194, 'Predatory_Bond', 'Raubtierverbindung'], _ - [1195, 'Heal_as_One', 'Gemeinsame_Heilung'], _ - [1196, 'Zojuns_Haste', 'Zojuns_Eile'], _ - [1197, 'Needling_Shot', 'Nadelschuss'], _ - [1198, 'Broad_Head_Arrow', 'Stahlspitzenpfeil'], _ - [1199, 'Glass_Arrows', 'Glaspfeile'], _ - [1200, 'Archers_Signet', 'Siegel_des_Bogenschützen'], _ - [1201, 'Savage_Pounce', 'Wilder_Sprung'], _ - [1202, 'Enraged_Lunge', 'Erzürnter_Ausfall'], _ - [1203, 'Bestial_Mauling', 'Bestienattacke'], _ - [1205, 'Poisonous_Bite', 'Giftbiss'], _ - [1206, 'Pounce', 'Sprung'], _ - [1209, 'Bestial_Fury', 'Bestienwut'], _ - [1211, 'Vipers_Nest', 'Vipernnest'], _ - [1212, 'Equinox', 'Tagundnachtgleiche'], _ - [1213, 'Tranquility', 'Ruhe'], _ - [1215, 'Clamor_of_Souls', 'Gezeter_der_Seelen'], _ - [1217, 'Ritual_Lord', 'Herr_der_Rituale'], _ - [1218, 'Cruel_Was_Daoshen', 'Grausam_war_Daoshen'], _ - [1219, 'Protective_Was_Kaolai', 'Schützend_war_Kaolai'], _ - [1220, 'Attuned_Was_Songkai', 'Eingestimmt_war_Songkai'], _ - [1221, 'Resilient_Was_Xiko', 'Unverwüstlich_war_Xiko'], _ - [1222, 'Lively_Was_Naomei', 'Lebhaft_war_Naomei'], _ - [1223, 'Anguished_Was_Lingwah', 'Gequält_war_Lingwah'], _ - [1224, 'Draw_Spirit', 'Geist_entziehen'], _ - [1225, 'Channeled_Strike', 'Gelenkter_Schlag'], _ - [1226, 'Spirit_Boon_Strike', 'Geistersegenstoß'], _ - [1227, 'Essence_Strike', 'Essenzschlag'], _ - [1228, 'Spirit_Siphon', 'Geist_abzapfen'], _ - [1229, 'Explosive_Growth', 'Explosives_Wachstum'], _ - [1230, 'Boon_of_Creation', 'Segen_der_Schöpfung'], _ - [1231, 'Spirit_Channeling', 'Geisterlenkung'], _ - [1232, 'Armor_of_Unfeeling', 'Rüstung_der_Gefühllosigkeit'], _ - [1233, 'Soothing_Memories', 'Beruhigende_Erinnerungen'], _ - [1234, 'Mend_Body_and_Soul', 'Körper_und_Seele_heilen'], _ - [1235, 'Dulled_Weapon', 'Stumpfe_Waffe'], _ - [1236, 'Binding_Chains', 'Fesselnde_Ketten'], _ - [1237, 'Painful_Bond', 'Schmerzhafte_Bindung'], _ - [1238, 'Signet_of_Creation', 'Siegel_der_Schöpfung'], _ - [1239, 'Signet_of_Spirits', 'Siegel_der_Geister'], _ - [1240, 'Soul_Twisting', 'Seelenverflechtung'], _ - [1244, 'Ghostly_Haste', 'Geisterhafte_Eile'], _ - [1245, 'Gaze_from_Beyond', 'Blick_aus_dem_Jenseits'], _ - [1246, 'Ancestors_Rage', 'Wut_der_Vorfahren'], _ - [1247, 'Pain', 'Schmerzen'], _ - [1249, 'Displacement', 'Verschiebung'], _ - [1250, 'Preservation', 'Erhaltung'], _ - [1251, 'Life', 'Leben'], _ - [1252, 'Earthbind', 'Erdbindung'], _ - [1253, 'Bloodsong', 'Blutgesang'], _ - [1255, 'Wanderlust', 'Fernweh'], _ - [1257, 'Spirit_Light_Weapon', 'Geisterlichtwaffe'], _ - [1258, 'Brutal_Weapon', 'Grausame_Waffe'], _ - [1259, 'Guided_Weapon', 'Gelenkte_Waffe'], _ - [1260, 'Meekness', 'Sanftmut'], _ - [1261, 'Frigid_Armor', 'Kalte_Rüstung'], _ - [1262, 'Healing_Ring', 'Heilring'], _ - [1263, 'Renew_Life', 'Leben_verlängern'], _ - [1264, 'Doom', 'Untergang'], _ - [1265, 'Wielders_Boon', 'Segen_des_Ausübers'], _ - [1266, 'Soothing', 'Beruhigung'], _ - [1267, 'Vital_Weapon', 'Wesentliche_Waffe'], _ - [1268, 'Weapon_of_Quickening', 'Waffe_der_Beschleunigung'], _ - [1269, 'Signet_of_Rage', 'Siegel_der_Wut'], _ - [1333, 'Extend_Conditions', 'Zustände_ausweiten'], _ - [1334, 'Hypochondria', 'Hypochondrie'], _ - [1335, 'Wastrels_Demise', 'Ableben_des_Verschwenders'], _ - [1336, 'Spiritual_Pain', 'Geisterschmerz'], _ - [1337, 'Drain_Delusions', 'Täuschungen_entziehen'], _ - [1338, 'Persistence_of_Memory', 'Beharrliche_Erinnerungen'], _ - [1339, 'Symbols_of_Inspiration', 'Symbole_der_Inspiration'], _ - [1340, 'Symbolic_Celerity', 'Symbolische_Schnelligkeit'], _ - [1341, 'Frustration', 'Frustration'], _ - [1342, 'Tease', 'Reizen'], _ - [1343, 'Ether_Phantom', 'Äther_Phantom'], _ - [1344, 'Web_of_Disruption', 'Netz_der_Störung'], _ - [1345, 'Enchanters_Conundrum', 'Rätsel_des_Verzauberers'], _ - [1346, 'Signet_of_Illusions', 'Siegel_der_Illusionen'], _ - [1347, 'Discharge_Enchantment', 'Verzauberung_entlassen'], _ - [1348, 'Hex_Eater_Vortex', 'Verhexungsfresser_Strudel'], _ - [1349, 'Mirror_of_Disenchantment', 'Spiegel_der_Entzauberung'], _ - [1350, 'Simple_Thievery', 'Simpler_Diebstahl'], _ - [1351, 'Animate_Shambling_Horror', 'Schlurfschreck_beleben'], _ - [1352, 'Order_of_Undeath', 'Orden_der_Untoten'], _ - [1353, 'Putrid_Flesh', 'Verwesendes_Fleisch'], _ - [1354, 'Feast_for_the_Dead', 'Fest_für_die_Toten'], _ - [1355, 'Jagged_Bones', 'Versplitterte_Knochen'], _ - [1356, 'Contagion', 'Erkrankung'], _ - [1358, 'Ulcerous_Lungs', 'Geschwürige_Lungen'], _ - [1359, 'Pain_of_Disenchantment', 'Schmerz_der_Entzauberung'], _ - [1360, 'Mark_of_Fury', 'Zeichen_der_Wut'], _ - [1362, 'Corrupt_Enchantment', 'Verzauberung_verderben'], _ - [1363, 'Signet_of_Sorrow', 'Siegel_des_Kummers'], _ - [1364, 'Signet_of_Suffering', 'Siegel_des_Leidens'], _ - [1365, 'Signet_of_Lost_Souls', 'Siegel_der_verlorenen_Seelen'], _ - [1366, 'Well_of_Darkness', 'Brunnen_der_Dunkelheit'], _ - [1367, 'Blinding_Surge', 'Blendende_Welle'], _ - [1368, 'Chilling_Winds', 'Kühle_Winde'], _ - [1369, 'Lightning_Bolt', 'Blitzstrahl'], _ - [1370, 'Storm_Djinns_Haste', 'Eile_des_Sturm_Dschinn'], _ - [1371, 'Stone_Striker', 'Steinschläger'], _ - [1372, 'Sandstorm', 'Sandsturm'], _ - [1373, 'Stone_Sheath', 'Steinmantel'], _ - [1374, 'Ebon_Hawk', 'Ebonfalke'], _ - [1375, 'Stoneflesh_Aura', 'Steinfleisch_Aura'], _ - [1376, 'Glyph_of_Restoration', 'Glyphe_der_Wiederherstellung'], _ - [1377, 'Ether_Prism', 'Ätherprisma'], _ - [1378, 'Master_of_Magic', 'Meister_der_Magie'], _ - [1379, 'Glowing_Gaze', 'Glühender_Blick'], _ - [1380, 'Savannah_Heat', 'Hitze_der_Savanne'], _ - [1381, 'Flame_Djinns_Haste', 'Eile_des_Flammen_Dschinn'], _ - [1382, 'Freezing_Gust', 'Gefrierende_Böe'], _ - [1390, 'Judges_Intervention', 'Intervention_des_Richters'], _ - [1391, 'Supportive_Spirit', 'Unterstützender_Geist'], _ - [1392, 'Watchful_Healing', 'Wachsame_Heilung'], _ - [1393, 'Healers_Boon', 'Segen_des_Heilers'], _ - [1394, 'Healers_Covenant', 'Verpflichtung_des_Heilers'], _ - [1395, 'Balthazars_Pendulum', 'Balthasars_Pendel'], _ - [1396, 'Words_of_Comfort', 'Tröstende_Worte'], _ - [1397, 'Light_of_Deliverance', 'Licht_der_Erlösung'], _ - [1398, 'Scourge_Enchantment', 'Geißelverzauberung'], _ - [1399, 'Shield_of_Absorption', 'Schild_der_Absorption'], _ - [1400, 'Reversal_of_Damage', 'Umkehrung_des_Schadens'], _ - [1401, 'Mending_Touch', 'Genesungsberührung'], _ - [1402, 'Critical_Chop', 'Kritischer_Hieb'], _ - [1403, 'Agonizing_Chop', 'Qualvoller_Hieb'], _ - [1404, 'Flail', 'Dreschen'], _ - [1405, 'Charging_Strike', 'Angreifender_Schlag'], _ - [1406, 'Headbutt', 'Kopfstoß'], _ - [1407, 'Lions_Comfort', 'Trost_des_Löwen'], _ - [1408, 'Rage_of_the_Ntouka', 'Wut_des_Ntouka'], _ - [1409, 'Mokele_Smash', 'Mokele_Schlag'], _ - [1410, 'Overbearing_Smash', 'Anmaßender_Schlag'], _ - [1411, 'Signet_of_Stamina', 'Siegel_der_Ausdauer'], _ - [1412, 'Youre_All_Alone', 'Ihr_seid_ganz_allein'], _ - [1413, 'Burst_of_Aggression', 'Aggressiver_Ausbruch'], _ - [1414, 'Enraging_Charge', 'Wütender_Angriff'], _ - [1415, 'Crippling_Slash', 'Verkrüppelnder_Hieb'], _ - [1416, 'Barbarous_Slice', 'Barbarischer_Schnitt'], _ - [1465, 'Prepared_Shot', 'Vorbereiteter_Schuss'], _ - [1466, 'Burning_Arrow', 'Brennender_Pfeil'], _ - [1467, 'Arcing_Shot', 'Bogenschuss'], _ - [1468, 'Strike_as_One', 'Gemeinsam_zuschlagen'], _ - [1469, 'Crossfire', 'Kreuzfeuer'], _ - [1470, 'Barbed_Arrows', 'Stachelpfeile'], _ - [1471, 'Scavengers_Focus', 'Fokus_des_Plünderers'], _ - [1472, 'Toxicity', 'Giftigkeit'], _ - [1473, 'Quicksand', 'Treibsand'], _ - [1474, 'Storms_Embrace', 'Umarmung_des_Sturms'], _ - [1475, 'Trappers_Speed', 'Geschwindigkeit_des_Fallenstellers'], _ - [1476, 'Tripwire', 'Stolperdraht'], _ - [1478, 'Renewing_Surge', 'Erneuernde_Welle'], _ - [1479, 'Offering_of_Spirit', 'Opfer_des_Geistes'], _ - [1480, 'Spirits_Gift', 'Geschenk_des_Geistes'], _ - [1481, 'Death_Pact_Signet', 'Todespakt_Siegel'], _ - [1482, 'Reclaim_Essence', 'Essenz_zurückfordern'], _ - [1483, 'Banishing_Strike', 'Bannstoß'], _ - [1484, 'Mystic_Sweep', 'Mystischer_Schwung'], _ - [1485, 'Eremites_Attack', 'Angriff_des_Eremiten'], _ - [1486, 'Reap_Impurities', 'Unreinheiten_ausnutzen'], _ - [1487, 'Twin_Moon_Sweep', 'Doppelter_Mondschwung'], _ - [1488, 'Victorious_Sweep', 'Siegreicher_Schwung'], _ - [1489, 'Irresistible_Sweep', 'Unwiderstehlicher_Schwung'], _ - [1490, 'Pious_Assault', 'Frommer_Angriff'], _ - [1491, 'Mystic_Twister', 'Mystischer_Wirbelsturm'], _ - [1493, 'Grenths_Fingers', 'Grenths_Finger'], _ - [1495, 'Aura_of_Thorns', 'Dornenaura'], _ - [1496, 'Balthazars_Rage', 'Balthasars_Wut'], _ - [1497, 'Dust_Cloak', 'Staubdecke'], _ - [1498, 'Staggering_Force', 'Umwerfende_Gewalt'], _ - [1499, 'Pious_Renewal', 'Fromme_Erneuerung'], _ - [1500, 'Mirage_Cloak', 'Trugbild_Umhang'], _ - [1502, 'Arcane_Zeal', 'Arkaner_Eifer'], _ - [1503, 'Mystic_Vigor', 'Mystische_Vitalität'], _ - [1504, 'Watchful_Intervention', 'Wachsame_Intervention'], _ - [1505, 'Vow_of_Piety', 'Gelübde_der_Frömmigkeit'], _ - [1506, 'Vital_Boon', 'Wesentliche_Wohltat'], _ - [1507, 'Heart_of_Holy_Flame', 'Herz_der_heiligen_Flamme'], _ - [1508, 'Extend_Enchantments', 'Verzauberungen_ausweiten'], _ - [1509, 'Faithful_Intervention', 'Vertrauensvolle_Intervention'], _ - [1510, 'Sand_Shards', 'Sandscherben'], _ - [1512, 'Lyssas_Haste', 'Lyssas_Eile'], _ - [1513, 'Guiding_Hands', 'Lenkende_Hände'], _ - [1514, 'Fleeting_Stability', 'Flüchtige_Stabilität'], _ - [1515, 'Armor_of_Sanctity', 'Rüstung_der_Heiligkeit'], _ - [1516, 'Mystic_Regeneration', 'Mystische_Regeneration'], _ - [1517, 'Vow_of_Silence', 'Schweigegelübde'], _ - [1518, 'Avatar_of_Balthazar', 'Balthasars_Avatar'], _ - [1519, 'Avatar_of_Dwayna', 'Dwaynas_Avatar'], _ - [1520, 'Avatar_of_Grenth', 'Grenths_Avatar'], _ - [1521, 'Avatar_of_Lyssa', 'Lyssas_Avatar'], _ - [1522, 'Avatar_of_Melandru', 'Melandrus_Avatar'], _ - [1523, 'Meditation', 'Meditation'], _ - [1524, 'Eremites_Zeal', 'Eifer_des_Eremiten'], _ - [1525, 'Natural_Healing', 'Natürliche_Heilung'], _ - [1526, 'Imbue_Health', 'Mit_Leben_durchdringen'], _ - [1527, 'Mystic_Healing', 'Mystische_Heilung'], _ - [1528, 'Dwaynas_Touch', 'Dwaynas_Berührung'], _ - [1529, 'Pious_Restoration', 'Fromme_Wiederherstellung'], _ - [1530, 'Signet_of_Pious_Light', 'Siegel_des_frommen_Lichts'], _ - [1531, 'Intimidating_Aura', 'Einschüchternde_Aura'], _ - [1532, 'Mystic_Sandstorm', 'Mystischer_Sandsturm'], _ - [1533, 'Winds_of_Disenchantment', 'Wind_der_Entzauberung'], _ - [1534, 'Rending_Touch', 'Zerreißende_Berührung'], _ - [1535, 'Crippling_Sweep', 'Verkrüppelnder_Schwung'], _ - [1536, 'Wounding_Strike', 'Verwundender_Schlag'], _ - [1537, 'Wearying_Strike', 'Ermüdender_Schlag'], _ - [1538, 'Lyssas_Assault', 'Lyssas_Angriff'], _ - [1539, 'Chilling_Victory', 'Kühler_Sieg'], _ - [1540, 'Conviction', 'Überzeugung'], _ - [1541, 'Enchanted_Haste', 'Verzauberte_Eile'], _ - [1542, 'Pious_Concentration', 'Fromme_Konzentration'], _ - [1543, 'Pious_Haste', 'Fromme_Eile'], _ - [1544, 'Whirling_Charge', 'Wirbelangriff'], _ - [1545, 'Test_of_Faith', 'Glaubensprüfung'], _ - [1546, 'Blazing_Spear', 'Lodernder_Speer'], _ - [1547, 'Mighty_Throw', 'Mächtiger_Wurf'], _ - [1548, 'Cruel_Spear', 'Grausamer_Speer'], _ - [1549, 'Harriers_Toss', 'Wurf_des_Läufers'], _ - [1550, 'Unblockable_Throw', 'Unblockbarer_Wurf'], _ - [1551, 'Spear_of_Lightning', 'Speer_des_Blitzes'], _ - [1552, 'Wearying_Spear', 'Ermüdender_Speer'], _ - [1553, 'Anthem_of_Fury', 'Hymne_der_Wut'], _ - [1554, 'Crippling_Anthem', 'Verkrüppelungs_Hymne'], _ - [1555, 'Defensive_Anthem', 'Verteidigungshymne'], _ - [1556, 'Godspeed', 'Gute_Reise'], _ - [1557, 'Anthem_of_Flame', 'Hymne_der_Flamme'], _ - [1558, 'Go_for_the_Eyes', 'Zielt_auf_die_Augen'], _ - [1559, 'Anthem_of_Envy', 'Hymne_des_Neids'], _ - [1560, 'Song_of_Power', 'Machtgesang'], _ - [1561, 'Zealous_Anthem', 'Eifrige_Hymne'], _ - [1562, 'Aria_of_Zeal', 'Arie_des_Eifers'], _ - [1563, 'Lyric_of_Zeal', 'Lyrik_des_Eifers'], _ - [1564, 'Ballad_of_Restoration', 'Ballade_der_Wiederherstellung'], _ - [1565, 'Chorus_of_Restoration', 'Chor_der_Wiederherstellung'], _ - [1566, 'Aria_of_Restoration', 'Arie_der_Wiederherstellung'], _ - [1567, 'Song_of_Concentration', 'Lied_der_Konzentration'], _ - [1568, 'Anthem_of_Guidance', 'Hymne_der_Führung'], _ - [1569, 'Energizing_Chorus', 'Energie_bringender_Chor'], _ - [1570, 'Song_of_Purification', 'Lied_der_Läuterung'], _ - [1571, 'Hexbreaker_Aria', 'Verhexungsbrech_Arie'], _ - [1572, 'Brace_Yourself', 'Seid_vorbereitet'], _ - [1573, 'Awe', 'Ehrfurcht'], _ - [1574, 'Enduring_Harmony', 'Dauerhafte_Harmonie'], _ - [1575, 'Blazing_Finale', 'Loderndes_Finale'], _ - [1576, 'Burning_Refrain', 'Brennender_Refrain'], _ - [1577, 'Finale_of_Restoration', 'Finale_der_Wiederherstellung'], _ - [1578, 'Mending_Refrain', 'Genesungsrefrain'], _ - [1579, 'Purifying_Finale', 'Reinigendes_Finale'], _ - [1580, 'Bladeturn_Refrain', 'Klingenumkehr_Refrain'], _ - [1581, 'Glowing_Signet', 'Glühendes_Siegel'], _ - [1583, 'Leaders_Zeal', 'Eifer_des_Anführers'], _ - [1584, 'Leaders_Comfort', 'Trost_des_Anführers'], _ - [1585, 'Signet_of_Synergy', 'Siegel_der_Synergie'], _ - [1586, 'Angelic_Protection', 'Engelsschutz'], _ - [1587, 'Angelic_Bond', 'Engelsbindung'], _ - [1588, 'Cautery_Signet', 'Siegel_der_Verätzung'], _ - [1589, 'Stand_Your_Ground', 'Haltet_Eure_Stellung'], _ - [1590, 'Lead_the_Way', 'Geht_voran'], _ - [1591, 'Make_Haste', 'Beeilt_Euch'], _ - [1592, 'We_Shall_Return', 'Wir_werden_wiederkommen'], _ - [1593, 'Never_Give_Up', 'Gebt_nicht_auf'], _ - [1594, 'Help_Me', 'Helft_mir'], _ - [1595, 'Fall_Back', 'Zieht_Euch_zurück'], _ - [1596, 'Incoming', 'Schon_unterwegs'], _ - [1597, 'Theyre_on_Fire', 'Sie_brennen'], _ - [1598, 'Never_Surrender', 'Ergebt_Euch_nicht'], _ - [1599, 'Its_Just_a_Flesh_Wound', 'Es_ist_nur_eine_Fleischwunde'], _ - [1600, 'Barbed_Spear', 'Stachelspeer'], _ - [1601, 'Vicious_Attack', 'Bösartiger_Angriff'], _ - [1602, 'Stunning_Strike', 'Betäubender_Schlag'], _ - [1603, 'Merciless_Spear', 'Unbarmherziger_Speer'], _ - [1604, 'Disrupting_Throw', 'Unterbrechender_Wurf'], _ - [1605, 'Wild_Throw', 'Wilder_Wurf'], _ - [1633, 'Malicious_Strike', 'Böswilliger_Stoß'], _ - [1634, 'Shattering_Assault', 'Vernichtender_Angriff'], _ - [1635, 'Golden_Skull_Strike', 'Goldener_Schädel_Stoß'], _ - [1636, 'Black_Spider_Strike', 'Schwarzer_Spinnen_Stoß'], _ - [1637, 'Golden_Fox_Strike', 'Goldener_Fuchs_Stoß'], _ - [1638, 'Deadly_Haste', 'Tödliche_Eile'], _ - [1639, 'Assassins_Remedy', 'Mittel_des_Assassinen'], _ - [1640, 'Foxs_Promise', 'Versprechen_des_Fuchses'], _ - [1641, 'Feigned_Neutrality', 'Vorgetäuschte_Neutralität'], _ - [1642, 'Hidden_Caltrops', 'Versteckte_Trittnägel'], _ - [1643, 'Assault_Enchantments', 'Verzauberungen_angreifen'], _ - [1644, 'Wastrels_Collapse', 'Verfall_des_Verschwenders'], _ - [1645, 'Lift_Enchantment', 'Verzauberung_lösen'], _ - [1646, 'Augury_of_Death', 'Todesomen'], _ - [1647, 'Signet_of_Toxic_Shock', 'Siegel_des_toxischen_Schocks'], _ - [1648, 'Signet_of_Twilight', 'Siegel_des_Zwielichts'], _ - [1649, 'Way_of_the_Assassin', 'Weg_des_Assassinen'], _ - [1650, 'Shadow_Walk', 'Schattenmarsch'], _ - [1651, 'Deaths_Retreat', 'Rückzug_des_Todes'], _ - [1652, 'Shadow_Prison', 'Schattengefängnis'], _ - [1653, 'Swap', 'Tauschen'], _ - [1654, 'Shadow_Meld', 'Schattenverschmelzung'], _ - [1655, 'Price_of_Pride', 'Preis_des_Stolzes'], _ - [1656, 'Air_of_Disenchantment', 'Flair_der_Entzauberung'], _ - [1657, 'Signet_of_Clumsiness', 'Siegel_der_Unbeholfenheit'], _ - [1658, 'Symbolic_Posture', 'Symbolische_Haltung'], _ - [1659, 'Toxic_Chill', 'Toxische_Kälte'], _ - [1660, 'Well_of_Silence', 'Brunnen_der_Stille'], _ - [1661, 'Glowstone', 'Leuchtstein'], _ - [1662, 'Mind_Blast', 'Geistige_Explosion'], _ - [1663, 'Elemental_Flame', 'Elementare_Flamme'], _ - [1664, 'Invoke_Lightning', 'Blitz_herbeirufen'], _ - [1683, 'Pensive_Guardian', 'Nachdenklicher_Wächter'], _ - [1684, 'Scribes_Insight', 'Einblick_des_Schreibers'], _ - [1685, 'Holy_Haste', 'Heilige_Eile'], _ - [1686, 'Glimmer_of_Light', 'Lichtschimmer'], _ - [1687, 'Zealous_Benediction', 'Eifrige_Segnung'], _ - [1688, 'Defenders_Zeal', 'Eifer_des_Verteidigers'], _ - [1689, 'Signet_of_Mystic_Wrath', 'Siegel_des_mystischen_Zorns'], _ - [1690, 'Signet_of_Removal', 'Siegel_der_Entfernung'], _ - [1691, 'Dismiss_Condition', 'Zustand_aufheben'], _ - [1692, 'Divert_Hexes', 'Verhexungen_umleiten'], _ - [1693, 'Counterattack', 'Gegenangriff'], _ - [1694, 'Magehunter_Strike', 'Magierschlag'], _ - [1695, 'Soldiers_Strike', 'Soldatenstoß'], _ - [1696, 'Decapitate', 'Köpfen'], _ - [1697, 'Magehunters_Smash', 'Magiejägerschmetterer'], _ - [1698, 'Soldiers_Stance', 'Soldaten_Haltung'], _ - [1699, 'Soldiers_Defense', 'Soldaten_Verteidigung'], _ - [1700, 'Frenzied_Defense', 'Fieberhafte_Verteidigung'], _ - [1701, 'Steady_Stance', 'Ruhige_Haltung'], _ - [1702, 'Steelfang_Slash', 'Hieb_des_stählernen_Fangzahns'], _ - [1719, 'Screaming_Shot', 'Schreischuss'], _ - [1720, 'Keen_Arrow', 'Scharfer_Pfeil'], _ - [1721, 'Rampage_as_One', 'Gemeinsam_toben'], _ - [1722, 'Forked_Arrow', 'Gegabelter_Pfeil'], _ - [1723, 'Disrupting_Accuracy', 'Unterbrechende_Genauigkeit'], _ - [1724, 'Experts_Dexterity', 'Gewandtheit_des_Profis'], _ - [1725, 'Roaring_Winds', 'Tosender_Wind'], _ - [1726, 'Magebane_Shot', 'Verderben_des_Magiers_Schuss'], _ - [1727, 'Natural_Stride', 'Natürlicher_Schwung'], _ - [1728, 'Hekets_Rampage', 'Heket_Toben'], _ - [1729, 'Smoke_Trap', 'Rauchfalle'], _ - [1730, 'Infuriating_Heat', 'Irritierende_Hitze'], _ - [1731, 'Vocal_Was_Sogolon', 'Lautstark_war_Sogolon'], _ - [1732, 'Destructive_Was_Glaive', 'Vernichtend_war_Glaive'], _ - [1733, 'Wielders_Strike', 'Stoß_des_Ausübers'], _ - [1734, 'Gaze_of_Fury', 'Wütendes_Starren'], _ - [1736, 'Spirits_Strength', 'Geistesstärke'], _ - [1737, 'Wielders_Zeal', 'Eifer_des_Ausübers'], _ - [1738, 'Sight_Beyond_Sight', 'Sicht_jenseits_der_Sicht'], _ - [1739, 'Renewing_Memories', 'Erneuernde_Erinnerungen'], _ - [1740, 'Wielders_Remedy', 'Mittel_des_Ausübers'], _ - [1741, 'Ghostmirror_Light', 'Geisterspiegel_Licht'], _ - [1742, 'Signet_of_Ghostly_Might', 'Siegel_der_Macht_der_Geister'], _ - [1743, 'Signet_of_Binding', 'Siegel_der_Bindung'], _ - [1744, 'Caretakers_Charge', 'Angriff_des_Verwalters'], _ - [1745, 'Anguish', 'Qual'], _ - [1747, 'Empowerment', 'Ermächtigung'], _ - [1748, 'Recovery', 'Gesundung'], _ - [1749, 'Weapon_of_Fury', 'Waffe_der_Wut'], _ - [1750, 'Xinraes_Weapon', 'Xinraes_Waffe'], _ - [1751, 'Warmongers_Weapon', 'Waffe_des_Kriegshetzers'], _ - [1752, 'Weapon_of_Remedy', 'Waffe_der_Behebung'], _ - [1753, 'Rending_Sweep', 'Zerreißender_Schwung'], _ - [1754, 'Onslaught', 'Attacke'], _ - [1755, 'Mystic_Corruption', 'Mystische_Verdorbenheit'], _ - [1756, 'Grenths_Grasp', 'Grenths_Griff'], _ - [1757, 'Veil_of_Thorns', 'Dornenschleier'], _ - [1758, 'Harriers_Grasp', 'Griff_des_Läufers'], _ - [1759, 'Vow_of_Strength', 'Gelübde_der_Stärke'], _ - [1760, 'Ebon_Dust_Aura', 'Ebon_Staubaura'], _ - [1761, 'Zealous_Vow', 'Eifriges_Gelübde'], _ - [1762, 'Heart_of_Fury', 'Herz_der_Wut'], _ - [1763, 'Zealous_Renewal', 'Eifrige_Erneuerung'], _ - [1764, 'Attackers_Insight', 'Einblick_des_Angreifers'], _ - [1765, 'Rending_Aura', 'Zerreißende_Aura'], _ - [1766, 'Featherfoot_Grace', 'Anmut_des_Federfußes'], _ - [1767, 'Reapers_Sweep', 'Schwung_des_Schnitters'], _ - [1768, 'Harriers_Haste', 'Eile_des_Läufers'], _ - [1769, 'Focused_Anger', 'Konzentrierter_Zorn'], _ - [1770, 'Natural_Temper', 'Natürliche_Laune'], _ - [1771, 'Song_of_Restoration', 'Gesang_der_Wiederherstellung'], _ - [1772, 'Lyric_of_Purification', 'Lyrik_der_Läuterung'], _ - [1773, 'Soldiers_Fury', 'Wut_des_Soldaten'], _ - [1774, 'Aggressive_Refrain', 'Aggressiver_Refrain'], _ - [1775, 'Energizing_Finale', 'Energie_bringendes_Finale'], _ - [1776, 'Signet_of_Aggression', 'Siegel_der_Aggression'], _ - [1777, 'Remedy_Signet', 'Heilmittel_Siegel'], _ - [1778, 'Signet_of_Return', 'Siegel_der_Wiederkehr'], _ - [1779, 'Make_Your_Time', 'Nehmt_Euch_Zeit'], _ - [1780, 'Cant_Touch_This', 'Cant_touch_this'], _ - [1781, 'Find_Their_Weakness', 'Findet_ihren_Schwachpunkt'], _ - [1782, 'The_Power_Is_Yours', 'Die_Macht_ist_Euer'], _ - [1783, 'Slayers_Spear', 'Speer_des_Würgers'], _ - [1784, 'Swift_Javelin', 'Schneller_Speer'], _ - [1814, 'Lightbringers_Gaze', 'Blick_des_Lichtbringers'], _ - [1815, 'Lightbringer_Signet', 'Lichtbringer_Siegel'], _ - [1816, 'Sunspear_Rebirth_Signet', 'Sonnenspeer_Wiedergeburtssiegel'], _ - [1948, 'Shadow_Sanctuary_Luxon', 'Schattenzuflucht_Luxon'], _ - [1949, 'Ether_Nightmare_Luxon', 'Äther_Alptraum_Luxon'], _ - [1950, 'Signet_of_Corruption_Luxon', 'Siegel_der_Verdorbenheit_Luxon'], _ - [1951, 'Elemental_Lord_Luxon', 'Elementarlord_Luxon'], _ - [1952, 'Selfless_Spirit_Luxon', 'Selbstloser_Geist_Luxon'], _ - [1953, 'Triple_Shot_Luxon', 'Dreifachschuss_Luxon'], _ - [1954, 'Save_Yourselves_Luxon', 'Rettet_Euch_selbst_Luxon'], _ - [1955, 'Aura_of_Holy_Might_Luxon', 'Aura_der_Heiligen_Macht_Luxon'], _ - [1957, 'Spear_of_Fury_Luxon', 'Speer_der_Wut_Luxon'], _ - [1986, 'Vampiric_Assault', 'Vampirangriff'], _ - [1987, 'Lotus_Strike', 'Lotus_Stoß'], _ - [1988, 'Golden_Fang_Strike', 'Goldfangstoß'], _ - [1990, 'Falling_Lotus_Strike', 'Fallender_Lotus_Stoß'], _ - [1991, 'Sadists_Signet', 'Siegel_des_Sadisten'], _ - [1992, 'Signet_of_Distraction', 'Siegel_der_Ablenkung'], _ - [1993, 'Signet_of_Recall', 'Siegel_der_Zurückrufung'], _ - [1994, 'Power_Lock', 'Kraftsperre'], _ - [1995, 'Waste_Not', 'Spare_in_der_Zeit_'], _ - [1996, 'Sum_of_All_Fears', 'Summe_aller_Ängste'], _ - [1997, 'Withering_Aura', 'Verkümmernde_Aura'], _ - [1998, 'Cacophony', 'Kakophonie'], _ - [1999, 'Winters_Embrace', 'Umarmung_des_Winters'], _ - [2000, 'Earthen_Shackles', 'Irdene_Fesseln'], _ - [2001, 'Ward_of_Weakness', 'Kreis_der_Schwäche'], _ - [2002, 'Glyph_of_Swiftness', 'Glyphe_der_Schnelligkeit'], _ - [2003, 'Cure_Hex', 'Verhexung_heilen'], _ - [2004, 'Smite_Condition', 'Zustand_zerschlagen'], _ - [2005, 'Smiters_Boon', 'Segen_des_Peinigers'], _ - [2006, 'Castigation_Signet', 'Geißelungs_Siegel'], _ - [2007, 'Purifying_Veil', 'Reinigender_Schleier'], _ - [2008, 'Pulverizing_Smash', 'Zermalmender_Schlag'], _ - [2009, 'Keen_Chop', 'Verwegener_Hieb'], _ - [2010, 'Knee_Cutter', 'Knieschneider'], _ - [2011, 'Grapple', 'Raufen'], _ - [2012, 'Radiant_Scythe', 'Strahlende_Sense'], _ - [2013, 'Grenths_Aura', 'Grenths_Aura'], _ - [2014, 'Signet_of_Pious_Restraint', 'Siegel_der_frommen_Zurückhaltung'], _ - [2015, 'Farmers_Scythe', 'Sense_des_Bauern'], _ - [2016, 'Energetic_Was_Lee_Sa', 'Energisch_war_Lee_Sa'], _ - [2017, 'Anthem_of_Weariness', 'Hymne_der_Müdigkeit'], _ - [2018, 'Anthem_of_Disruption', 'Hymne_der_Störung'], _ - [2051, 'Summon_Spirits_Luxon', 'Geister_herbeirufen_Luxon'], _ - [2052, 'Shadow_Fang', 'Schattenfangzahn'], _ - [2053, 'Calculated_Risk', 'Kalkuliertes_Risiko'], _ - [2054, 'Shrinking_Armor', 'Schrumpfende_Rüstung'], _ - [2055, 'Aneurysm', 'Aneurysma'], _ - [2056, 'Wandering_Eye', 'Wanderndes_Auge'], _ - [2057, 'Foul_Feast', 'Widerliches_Gelage'], _ - [2058, 'Putrid_Bile', 'Verwesende_Galle'], _ - [2059, 'Shell_Shock', 'Kriegsneurose'], _ - [2060, 'Glyph_of_Immolation', 'Glyphe_der_Aufopferung'], _ - [2061, 'Patient_Spirit', 'Geduldiger_Geist'], _ - [2062, 'Healing_Ribbon', 'Heilendes_Band'], _ - [2063, 'Aura_of_Stability', 'Aura_der_Stabilität'], _ - [2064, 'Spotless_Mind', 'Makelloser_Verstand'], _ - [2065, 'Spotless_Soul', 'Makellose_Seele'], _ - [2066, 'Disarm', 'Entwaffnen'], _ - [2067, 'I_Meant_to_Do_That', 'Das_war_Absicht'], _ - [2068, 'Rapid_Fire', 'Schnellfeuer'], _ - [2069, 'Sloth_Hunters_Shot', 'Schuss_des_Faultierjägers'], _ - [2070, 'Aura_Slicer', 'Auraschneider'], _ - [2071, 'Zealous_Sweep', 'Eifriger_Schwung'], _ - [2072, 'Pure_Was_Li_Ming', 'Rein_war_Li_Ming'], _ - [2073, 'Weapon_of_Aggression', 'Waffe_der_Aggression'], _ - [2074, 'Chest_Thumper', 'Brusttrommler'], _ - [2075, 'Hasty_Refrain', 'Hastiger_Refrain'], _ - [2091, 'Shadow_Sanctuary_Kurzick', 'Schattenzuflucht_Kurzick'], _ - [2092, 'Ether_Nightmare_Kurzick', 'Äther_Alptraum_Kurzick'], _ - [2093, 'Signet_of_Corruption_Kurzick', 'Siegel_der_Verdorbenheit_Kurzick'], _ - [2094, 'Elemental_Lord_Kurzick', 'Elementarlord_Kurzick'], _ - [2095, 'Selfless_Spirit_Kurzick', 'Selbstloser_Geist_Kurzick'], _ - [2096, 'Triple_Shot_Kurzick', 'Dreifachschuss_Kurzick'], _ - [2097, 'Save_Yourselves_Kurzick', 'Rettet_Euch_selbst_Kurzick'], _ - [2098, 'Aura_of_Holy_Might_Kurzick', 'Aura_der_Heiligen_Macht_Kurzick'], _ - [2099, 'Spear_of_Fury_Kurzick', 'Speer_der_Wut_Kurzick'], _ - [2100, 'Summon_Spirits_Kurzick', 'Geister_herbeirufen_Kurzick'], _ - [2101, 'Critical_Agility', 'Kritische_Beweglichkeit'], _ - [2102, 'Cry_of_Pain', 'Schmerzensschrei'], _ - [2103, 'Necrosis', 'Nekrose'], _ - [2104, 'Intensity', 'Intensität'], _ - [2105, 'Seed_of_Life', 'Lebenssaat'], _ - [2107, 'Whirlwind_Attack', 'Wirbelsturmangriff'], _ - [2108, 'Never_Rampage_Alone', 'Tobt_niemals_allein'], _ - [2109, 'Eternal_Aura', 'Ewige_Aura'], _ - [2110, 'Vampirism', 'Vampirismus'], _ - [2112, 'Theres_Nothing_to_Fear', 'Es_gibt_nichts_zu_befürchten'], _ - [2116, 'Sneak_Attack', 'Überraschungsangriff'], _ - [2135, 'Trampling_Ox', 'Trampelnder_Ochse'], _ - [2136, 'Smoke_Powder_Defense', 'Rauchpulver_Verteidigung'], _ - [2137, 'Confusing_Images', 'Verwirrende_Bilder'], _ - [2138, 'Hexers_Vigor', 'Lebenskraft_des_Verhexers'], _ - [2139, 'Masochism', 'Masochismus'], _ - [2140, 'Piercing_Trap', 'Durchbohrende_Falle'], _ - [2141, 'Companionship', 'Kameradschaft'], _ - [2142, 'Feral_Aggression', 'Wilde_Aggression'], _ - [2143, 'Disrupting_Shot', 'Unterbrechender_Schuss'], _ - [2144, 'Volley', 'Salve'], _ - [2145, 'Expert_Focus', 'Expertenfokus'], _ - [2146, 'Pious_Fury', 'Frommer_Zorn'], _ - [2147, 'Crippling_Victory', 'Verkrüppelnder_Sieg'], _ - [2148, 'Sundering_Weapon', 'Trennende_Waffe'], _ - [2149, 'Weapon_of_Renewal', 'Waffe_der_Erneuerung'], _ - [2150, 'Maiming_Spear', 'Verkrüppelungs_Speer'], _ - [2186, 'Signet_of_Deadly_Corruption', 'Siegel_der_tödlichen_Verdorbenheit'], _ - [2187, 'Way_of_the_Master', 'Weg_des_Meisters'], _ - [2188, 'Defile_Defenses', 'Verteidigung_entweihen'], _ - [2189, 'Angorodons_Gaze', 'Angorodons_Starren'], _ - [2190, 'Magnetic_Surge', 'Magnetschub'], _ - [2191, 'Slippery_Ground', 'Rutschiger_Boden'], _ - [2192, 'Glowing_Ice', 'Leuchtendes_Eis'], _ - [2193, 'Energy_Blast', 'Energieexplosion'], _ - [2194, 'Distracting_Strike', 'Ablenkender_Stoß'], _ - [2195, 'Symbolic_Strike', 'Symbolischer_Schlag'], _ - [2196, 'Soldiers_Speed', 'Geschwindigkeit_des_Soldaten'], _ - [2197, 'Body_Blow', 'Körperschlag'], _ - [2198, 'Body_Shot', 'Körperschuss'], _ - [2199, 'Poison_Tip_Signet', 'Giftspitzen_Siegel'], _ - [2200, 'Signet_of_Mystic_Speed', 'Siegel_der_mystischen_Geschwindigkeit'], _ - [2201, 'Shield_of_Force', 'Kraftschild'], _ - [2202, 'Mending_Grip', 'Genesungsgriff'], _ - [2203, 'Spiritleech_Aura', 'Geistsauger_Aura'], _ - [2204, 'Rejuvenation', 'Verjüngung'], _ - [2205, 'Agony', 'Todesqual'], _ - [2206, 'Ghostly_Weapon', 'Geisterwaffe'], _ - [2207, 'Inspirational_Speech', 'Inspirative_Rede'], _ - [2208, 'Burning_Shield', 'Brennender_Schild'], _ - [2209, 'Holy_Spear', 'Heiliger_Speer'], _ - [2210, 'Spear_Swipe', 'Speerschlag'], _ - [2211, 'Alkars_Alchemical_Acid', 'Alkars_Alchemiesäure'], _ - [2212, 'Light_of_Deldrimor', 'Licht_von_Deldrimor'], _ - [2213, 'Ear_Bite', 'Ohrenbiss'], _ - [2214, 'Low_Blow', 'Unter_der_Gürtellinie'], _ - [2215, 'Brawling_Headbutt', 'Rauf_Kopfstoß'], _ - [2216, 'Dont_Trip', 'Stolpert_nicht'], _ - [2217, 'By_Urals_Hammer', 'Bei_Urals_Hammer'], _ - [2218, 'Drunken_Master', 'Betrunkener_Meister'], _ - [2219, 'Great_Dwarf_Weapon', 'Waffe_des_Großen_Zwergs'], _ - [2220, 'Great_Dwarf_Armor', 'Rüstung_des_Großen_Zwergs'], _ - [2221, 'Breath_of_the_Great_Dwarf', 'Atem_des_Großen_Zwergs'], _ - [2222, 'Snow_Storm', 'Schneesturm'], _ - [2223, 'Black_Powder_Mine', 'Schwarzpulvermine'], _ - [2224, 'Summon_Mursaat', 'Mursaat_herbeirufen'], _ - [2225, 'Summon_Ruby_Djinn', 'Rubin_Dschinn_herbeirufen'], _ - [2226, 'Summon_Ice_Imp', 'Eis_Kobold_herbeirufen'], _ - [2227, 'Summon_Naga_Shaman', 'Naga_Schamanen_herbeirufen'], _ - [2228, 'Deft_Strike', 'Geschickter_Schlag'], _ - [2229, 'Signet_of_Infection', 'Siegel_der_Infektion'], _ - [2230, 'Tryptophan_Signet', 'Tryptophan_Siegel'], _ - [2231, 'Ebon_Battle_Standard_of_Courage', 'Ebon_Kampfstandarte_des_Mutes'], _ - [2232, 'Ebon_Battle_Standard_of_Wisdom', 'Ebon_Kampfstandarte_der_Weisheit'], _ - [2233, 'Ebon_Battle_Standard_of_Honor', 'Ebon_Kampfstandarte_der_Ehre'], _ - [2234, 'Ebon_Vanguard_Sniper_Support', 'Ebon_Vorhut_Heckenschützen_Unterstützung'], _ - [2235, 'Ebon_Vanguard_Assassin_Support', 'Ebon_Vorhut_Assassinen_Unterstützung'], _ - [2236, 'Well_of_Ruin', 'Brunnen_des_Ruins'], _ - [2237, 'Atrophy', 'Schwund'], _ - [2238, 'Spear_of_Redemption', 'Speer_der_Erlösung'], _ - [2353, 'Finish_Him', 'Erledigt_ihn'], _ - [2354, 'Dodge_This', 'Weicht_aus'], _ - [2355, 'I_Am_the_Strongest', 'Ich_bin_am_stärksten'], _ - [2356, 'I_Am_Unstoppable', 'Ich_bin_unaufhaltbar'], _ - [2357, 'A_Touch_of_Guile', 'Ein_Funken_Arglist'], _ - [2358, 'You_Move_Like_a_Dwarf', 'Ihr_bewegt_Euch_wie_ein_Zwerg'], _ - [2359, 'You_Are_All_Weaklings', 'Ihr_seid_alle_Schwächlinge'], _ - [2360, 'Feel_No_Pain', 'Den_Schmerz_nicht_spüren'], _ - [2361, 'Club_of_a_Thousand_Bears', 'Tausend_Bären_Prügel'], _ - [2374, 'Ursan_Blessing', 'Segen_der_Bärin'], _ - [2379, 'Volfen_Blessing', 'Segen_des_Wolfes'], _ - [2384, 'Raven_Blessing', 'Segen_des_Raben'], _ - [2411, 'Mindbender', 'Geistbrecher'], _ - [2412, 'Smooth_Criminal', 'Durchtriebener_Krimineller'], _ - [2413, 'Technobabble', 'Technobabbel'], _ - [2414, 'Radiation_Field', 'Strahlungsfeld'], _ - [2415, 'Asuran_Scan', 'Asurischer_Scan'], _ - [2416, 'Air_of_Superiority', 'Hochnäsigkeit'], _ - [2417, 'Mental_Block', 'Geistige_Sperre'], _ - [2418, 'Pain_Inverter', 'Schmerztauscher'], _ - [2420, 'Ebon_Escape', 'Ebon_Flucht'], _ - [2421, 'Weakness_Trap', 'Schwäche_Falle'], _ - [2422, 'Winds', 'Winde'], _ - [2423, 'Dwarven_Stability', 'Zwergenstabilität'], _ - [2551, 'Veteran Norn Hunting Party', 'none']] \ No newline at end of file +1324 +#include-once + +Global $aArray_Of_Skill_Names[3000][3] = [ _ + [0, 'No_Skill', 'Kein_Skill'], _ + [1, 'Healing_Signet', 'Siegel_der_Heilung'], _ + [2, 'Resurrection_Signet', 'Siegel_der_Wiederbelebung'], _ + [3, 'Signet_of_Capture', 'Siegel_der_Erbeutung'], _ + [5, 'Power_Block', 'Kraftblock'], _ + [6, 'Mantra_of_Earth', 'Mantra_der_Erde'], _ + [7, 'Mantra_of_Flame', 'Mantra_des_Feuers'], _ + [8, 'Mantra_of_Frost', 'Mantra_des_Frosts'], _ + [9, 'Mantra_of_Lightning', 'Mantra_des_Blitzes'], _ + [10, 'Hex_Breaker', 'Gebrochene_Verhexung'], _ + [11, 'Distortion', 'Verzerrung'], _ + [13, 'Mantra_of_Recovery', 'Mantra_der_Erholung'], _ + [14, 'Mantra_of_Persistence', 'Mantra_des_Bestehens'], _ + [15, 'Mantra_of_Inscriptions', 'Mantra_der_Inschriften'], _ + [16, 'Mantra_of_Concentration', 'Mantra_der_Konzentration'], _ + [17, 'Mantra_of_Resolve', 'Mantra_des_Abschlusses'], _ + [18, 'Mantra_of_Signets', 'Mantra_der_Siegel'], _ + [19, 'Fragility', 'Zerbrechlichkeit'], _ + [21, 'Inspired_Enchantment', 'Inspirierte_Verzauberung'], _ + [22, 'Inspired_Hex', 'Inspirierte_Verhexung'], _ + [23, 'Power_Spike', 'Kraftdorn'], _ + [24, 'Power_Leak', 'Kraftleck'], _ + [25, 'Power_Drain', 'Kraftentzug'], _ + [26, 'Empathy', 'Empathie'], _ + [27, 'Shatter_Delusions', 'Täuschungen_brechen'], _ + [28, 'Backfire', 'Rückschlag'], _ + [29, 'Blackout', 'Blackout'], _ + [30, 'Diversion', 'Ablenkung'], _ + [31, 'Conjure_Phantasm', 'Trugbild_beschwören'], _ + [32, 'Illusion_of_Weakness', 'Illusion_der_Schwäche'], _ + [33, 'Illusionary_Weaponry', 'Illusion_der_Waffen'], _ + [34, 'Sympathetic_Visage', 'Sympathisches_Gesicht'], _ + [35, 'Ignorance', 'Ignoranz'], _ + [36, 'Arcane_Conundrum', 'Arkanes_Rätsel'], _ + [37, 'Illusion_of_Haste', 'Illusion_der_Eile'], _ + [38, 'Channeling', 'Kanalisieren'], _ + [39, 'Energy_Surge', 'Energiewelle'], _ + [40, 'Ether_Feast', 'Ätherschmaus'], _ + [41, 'Ether_Lord', 'Herr_über_den_Äther'], _ + [42, 'Energy_Burn', 'Energiebrand'], _ + [43, 'Clumsiness', 'Ungeschick'], _ + [44, 'Phantom_Pain', 'Phantomschmerz'], _ + [45, 'Ethereal_Burden', 'Ätherische_Bürde'], _ + [46, 'Guilt', 'Schuld'], _ + [47, 'Ineptitude', 'Unbeholfenheit'], _ + [48, 'Spirit_of_Failure', 'Geist_des_Versagens'], _ + [49, 'Mind_Wrack', 'Geistiges_Wrack'], _ + [50, 'Wastrels_Worry', 'Verschwendung'], _ + [51, 'Shame', 'Schande'], _ + [52, 'Panic', 'Panik'], _ + [53, 'Migraine', 'Migräne'], _ + [54, 'Crippling_Anguish', 'Verkrüppelnde_Qual'], _ + [55, 'Fevered_Dreams', 'Fieberträume'], _ + [56, 'Soothing_Images', 'Beruhigende_Bilder'], _ + [57, 'Cry_of_Frustration', 'Schrei_der_Frustration'], _ + [58, 'Signet_of_Midnight', 'Siegel_der_Mitternacht'], _ + [59, 'Signet_of_Weariness', 'Siegel_der_Müdigkeit'], _ + [61, 'Leech_Signet', 'Blutsauger_Siegel'], _ + [62, 'Signet_of_Humility', 'Siegel_der_Demut'], _ + [63, 'Keystone_Signet', 'Schlussstein_Siegel'], _ + [65, 'Arcane_Mimicry', 'Arkane_Mimikry'], _ + [66, 'Spirit_Shackles', 'Geistfesseln'], _ + [67, 'Shatter_Hex', 'Verhexung_brechen'], _ + [68, 'Drain_Enchantment', 'Verzauberung_entziehen'], _ + [69, 'Shatter_Enchantment', 'Verzauberung_brechen'], _ + [72, 'Elemental_Resistance', 'Elementarwiderstand'], _ + [73, 'Physical_Resistance', 'Körperlicher_Widerstand'], _ + [74, 'Echo', 'Echo'], _ + [75, 'Arcane_Echo', 'Arkanes_Echo'], _ + [76, 'Imagined_Burden', 'Eingebildete_Bürde'], _ + [77, 'Chaos_Storm', 'Chaossturm'], _ + [78, 'Epidemic', 'Epidemie'], _ + [79, 'Energy_Drain', 'Energieentzug'], _ + [80, 'Energy_Tap', 'Energie_abzapfen'], _ + [81, 'Arcane_Thievery', 'Arkaner_Diebstahl'], _ + [82, 'Mantra_of_Recall', 'Mantra_der_Zurückrufung'], _ + [83, 'Animate_Bone_Horror', 'Knochenschreck_beleben'], _ + [84, 'Animate_Bone_Fiend', 'Knochenteufel_beleben'], _ + [85, 'Animate_Bone_Minions', 'Knochendiener_beleben'], _ + [86, 'Grenths_Balance', 'Grenths_Ausgleich'], _ + [87, 'Veratas_Gaze', 'Veratas_Starren'], _ + [88, 'Veratas_Aura', 'Veratas_Aura'], _ + [89, 'Deathly_Chill', 'Tödliche_Kühlung'], _ + [90, 'Veratas_Sacrifice', 'Veratas_Opfer'], _ + [91, 'Well_of_Power', 'Brunnen_der_Kraft'], _ + [92, 'Well_of_Blood', 'Brunnen_des_Blutes'], _ + [93, 'Well_of_Suffering', 'Brunnen_des_Leidens'], _ + [94, 'Well_of_the_Profane', 'Gottloser_Brunnen'], _ + [95, 'Putrid_Explosion', 'Explosion_der_Verwesung'], _ + [96, 'Soul_Feast', 'Seelenschmaus'], _ + [97, 'Necrotic_Traversal', 'Nekrotische_Verwechslung'], _ + [98, 'Consume_Corpse', 'Kadaver_verzehren'], _ + [99, 'Parasitic_Bond', 'Parasitäre_Fesseln'], _ + [100, 'Soul_Barbs', 'Seelenwiderhaken'], _ + [101, 'Barbs', 'Widerhaken'], _ + [102, 'Shadow_Strike', 'Schattenschlag'], _ + [103, 'Price_of_Failure', 'Preis_des_Versagens'], _ + [104, 'Death_Nova', 'Todesnova'], _ + [105, 'Deathly_Swarm', 'Tödlicher_Schwarm'], _ + [106, 'Rotting_Flesh', 'Verrottendes_Fleisch'], _ + [107, 'Virulence', 'Ansteckung'], _ + [108, 'Suffering', 'Leiden'], _ + [109, 'Life_Siphon', 'Leben_abzapfen'], _ + [110, 'Unholy_Feast', 'Unheiliger_Schmaus'], _ + [111, 'Awaken_the_Blood', 'Das_Blut_erwecken'], _ + [112, 'Desecrate_Enchantments', 'Verzauberungsschändung'], _ + [113, 'Tainted_Flesh', 'Verdorbenes_Fleisch'], _ + [114, 'Aura_of_the_Lich', 'Aura_des_Lich'], _ + [115, 'Blood_Renewal', 'Bluterneuerung'], _ + [116, 'Dark_Aura', 'Dunkle_Aura'], _ + [117, 'Enfeeble', 'Schwächen'], _ + [118, 'Enfeebling_Blood', 'Schwächendes_Blut'], _ + [119, 'Blood_is_Power', 'Blut_ist_Kraft'], _ + [120, 'Blood_of_the_Master', 'Blut_des_Meisters'], _ + [121, 'Spiteful_Spirit', 'Boshafter_Geist'], _ + [122, 'Malign_Intervention', 'Unheilvoller_Eingriff'], _ + [123, 'Insidious_Parasite', 'Heimtückischer_Parasit'], _ + [124, 'Spinal_Shivers', 'Rückenschauer'], _ + [125, 'Wither', 'Verwelken'], _ + [126, 'Life_Transfer', 'Lebensübertragung'], _ + [127, 'Mark_of_Subversion', 'Zeichen_der_Subversion'], _ + [128, 'Soul_Leech', 'Seelenfresser'], _ + [129, 'Defile_Flesh', 'Fleisch_schänden'], _ + [130, 'Demonic_Flesh', 'Dämonenfleisch'], _ + [131, 'Barbed_Signet', 'Siegel_der_Widerhaken'], _ + [132, 'Plague_Signet', 'Pest_Siegel'], _ + [133, 'Dark_Pact', 'Dunkler_Pakt'], _ + [134, 'Order_of_Pain', 'Orden_der_Schmerzen'], _ + [135, 'Faintheartedness', 'Mutlosigkeit'], _ + [136, 'Shadow_of_Fear', 'Schatten_der_Angst'], _ + [137, 'Rigor_Mortis', 'Totenstarre'], _ + [138, 'Dark_Bond', 'Dunkles_Band'], _ + [139, 'Infuse_Condition', 'Zustand_einflößen'], _ + [140, 'Malaise', 'Unwohlsein'], _ + [141, 'Rend_Enchantments', 'Verzauberungen_entreißen'], _ + [142, 'Lingering_Curse', 'Bleibender_Fluch'], _ + [143, 'Strip_Enchantment', 'Verzauberung_rauben'], _ + [144, 'Chilblains', 'Frostbeulen'], _ + [145, 'Signet_of_Agony', 'Siegel_der_Qual'], _ + [146, 'Offering_of_Blood', 'Blutopfer'], _ + [147, 'Dark_Fury', 'Dunkle_Wut'], _ + [148, 'Order_of_the_Vampire', 'Orden_des_Vampirs'], _ + [149, 'Plague_Sending', 'Pest_aussenden'], _ + [150, 'Mark_of_Pain', 'Zeichen_des_Schmerzes'], _ + [151, 'Feast_of_Corruption', 'Schmaus_der_Verdorbenheit'], _ + [152, 'Taste_of_Death', 'Geschmack_des_Todes'], _ + [153, 'Vampiric_Gaze', 'Vampir_Starren'], _ + [154, 'Plague_Touch', 'Pest_Berührung'], _ + [155, 'Vile_Touch', 'Abscheuliche_Berührung'], _ + [156, 'Vampiric_Touch', 'Vampir_Berührung'], _ + [157, 'Blood_Ritual', 'Blutritual'], _ + [158, 'Touch_of_Agony', 'Berührung_der_Qual'], _ + [159, 'Weaken_Armor', 'Rüstung_schwächen'], _ + [160, 'Windborne_Speed', 'Windgeschwindigkeit'], _ + [162, 'Gale', 'Orkan'], _ + [163, 'Whirlwind', 'Wirbelsturm'], _ + [164, 'Elemental_Attunement', 'Elementareinstimmung'], _ + [165, 'Armor_of_Earth', 'Erdrüstung'], _ + [166, 'Kinetic_Armor', 'Kinetik_Rüstung'], _ + [167, 'Eruption', 'Eruption'], _ + [168, 'Magnetic_Aura', 'Magnet_Aura'], _ + [169, 'Earth_Attunement', 'Erdeinstimmung'], _ + [170, 'Earthquake', 'Erdbeben'], _ + [171, 'Stoning', 'Steinigung'], _ + [172, 'Stone_Daggers', 'Steindolche'], _ + [173, 'Grasping_Earth', 'Zupackende_Erde'], _ + [174, 'Aftershock', 'Nachbeben'], _ + [175, 'Ward_Against_Elements', 'Abwehr_gegen_Elemente'], _ + [176, 'Ward_Against_Melee', 'Abwehr_gegen_Nahkampf'], _ + [177, 'Ward_Against_Foes', 'Abwehr_gegen_Feinde'], _ + [178, 'Ether_Prodigy', 'Ätherwunder'], _ + [179, 'Incendiary_Bonds', 'Brandbänder'], _ + [180, 'Aura_of_Restoration', 'Wiederherstellungs_Aura'], _ + [181, 'Ether_Renewal', 'Äthererneuerung'], _ + [182, 'Conjure_Flame', 'Flammenbeschwörung'], _ + [183, 'Inferno', 'Inferno'], _ + [184, 'Fire_Attunement', 'Feuereinstimmung'], _ + [185, 'Mind_Burn', 'Geistige_Verbrennung'], _ + [186, 'Fireball', 'Feuerball'], _ + [187, 'Meteor', 'Meteor'], _ + [188, 'Flame_Burst', 'Flammenstoß'], _ + [189, 'Rodgort_s_Invocation', 'Anrufung_von_Rodgort'], _ + [190, 'Mark_of_Rodgort', 'Zeichen_des_Rodgort'], _ + [191, 'Immolate', 'Feueropfer'], _ + [192, 'Meteor_Shower', 'Meteorschauer'], _ + [193, 'Phoenix', 'Phönix'], _ + [194, 'Flare', 'Feuergeschoss'], _ + [195, 'Lava_Font', 'Lavabecken'], _ + [196, 'Searing_Heat', 'Sengende_Hitze'], _ + [197, 'Fire_Storm', 'Feuersturm'], _ + [198, 'Glyph_of_Elemental_Power', 'Glyphe_der_Elementarkraft'], _ + [199, 'Glyph_of_Energy', 'Glyphe_der_Energie'], _ + [200, 'Glyph_of_Lesser_Energy', 'Glyphe_der_geringeren_Energie'], _ + [201, 'Glyph_of_Concentration', 'Glyphe_der_Konzentration'], _ + [202, 'Glyph_of_Sacrifice', 'Glyphe_der_Opferung'], _ + [203, 'Glyph_of_Renewal', 'Glyphe_der_Erneuerung'], _ + [204, 'Rust', 'Rost'], _ + [205, 'Lightning_Surge', 'Blitzwelle'], _ + [206, 'Armor_of_Frost', 'Frostrüstung'], _ + [207, 'Conjure_Frost', 'Frost_beschwören'], _ + [208, 'Water_Attunement', 'Wassereinstimmung'], _ + [209, 'Mind_Freeze', 'Geistige_Erfrierung'], _ + [210, 'Ice_Prison', 'Eisgefängnis'], _ + [211, 'Ice_Spikes', 'Eisdornen'], _ + [212, 'Frozen_Burst', 'Frostexplosion'], _ + [213, 'Shard_Storm', 'Scherbensturm'], _ + [214, 'Ice_Spear', 'Eisspeer'], _ + [215, 'Maelstrom', 'Strudel'], _ + [216, 'Iron_Mist', 'Eisenbeschlag'], _ + [217, 'Crystal_Wave', 'Kristallwelle'], _ + [218, 'Obsidian_Flesh', 'Obsidianfleisch'], _ + [219, 'Obsidian_Flame', 'Obsidianflamme'], _ + [220, 'Blinding_Flash', 'Blitzblendung'], _ + [221, 'Conjure_Lightning', 'Blitzbeschwörung'], _ + [222, 'Lightning_Strike', 'Blitzschlag'], _ + [223, 'Chain_Lightning', 'Kettenblitz'], _ + [224, 'Enervating_Charge', 'Schwächende_Aufladung'], _ + [225, 'Air_Attunement', 'Lufteinstimmung'], _ + [226, 'Mind_Shock', 'Geistiger_Schock'], _ + [227, 'Glimmering_Mark', 'Schimmerndes_Zeichen'], _ + [228, 'Thunderclap', 'Donnerschlag'], _ + [229, 'Lightning_Orb', 'Kugelblitz'], _ + [230, 'Lightning_Javelin', 'Blitzspeer'], _ + [231, 'Shock', 'Schock'], _ + [232, 'Lightning_Touch', 'Blitz_Berührung'], _ + [233, 'Swirling_Aura', 'Wirbelnde_Aura'], _ + [234, 'Deep_Freeze', 'Tiefgefrieren'], _ + [235, 'Blurred_Vision', 'Verschwommene_Sicht'], _ + [236, 'Mist_Form', 'Nebelform'], _ + [237, 'Water_Trident', 'Wasserdreizack'], _ + [238, 'Armor_of_Mist', 'Nebelrüstung'], _ + [239, 'Ward_Against_Harm', 'Abwehr_gegen_Schaden'], _ + [240, 'Smite', 'Peinigung'], _ + [241, 'Life_Bond', 'Lebensbindung'], _ + [242, 'Balthazars_Spirit', 'Balthasars_Geist'], _ + [243, 'Strength_of_Honor', 'Stärke_der_Ehre'], _ + [244, 'Life_Attunement', 'Lebenseinstimmung'], _ + [245, 'Protective_Spirit', 'Schutzgeist'], _ + [246, 'Divine_Intervention', 'Göttliche_Intervention'], _ + [247, 'Symbol_of_Wrath', 'Symbol_des_Zorns'], _ + [248, 'Retribution', 'Vergeltung'], _ + [249, 'Holy_Wrath', 'Heiliger_Zorn'], _ + [250, 'Essence_Bond', 'Essenzbindung'], _ + [251, 'Scourge_Healing', 'Geißelheilung'], _ + [252, 'Banish', 'Verbannung'], _ + [253, 'Scourge_Sacrifice', 'Geißelopfer'], _ + [254, 'Vigorous_Spirit', 'Energischer_Geist'], _ + [255, 'Watchful_Spirit', 'Wachsamer_Geist'], _ + [256, 'Blessed_Aura', 'Gesegnete_Aura'], _ + [257, 'Aegis', 'Aegis'], _ + [258, 'Guardian', 'Wächter'], _ + [259, 'Shield_of_Deflection', 'Ablenkungsschild'], _ + [260, 'Aura_of_Faith', 'Glaubensaura'], _ + [261, 'Shield_of_Regeneration', 'Schild_der_Regeneration'], _ + [262, 'Shield_of_Judgment', 'Schild_des_Urteils'], _ + [263, 'Protective_Bond', 'Band_des_Schutzes'], _ + [264, 'Pacifism', 'Pazifismus'], _ + [265, 'Amity', 'Freundschaft'], _ + [266, 'Peace_and_Harmony', 'Frieden_und_Harmonie'], _ + [267, 'Judges_Insight', 'Einblick_des_Richters'], _ + [268, 'Unyielding_Aura', 'Unnachgiebige_Aura'], _ + [269, 'Mark_of_Protection', 'Schutzzeichen'], _ + [270, 'Life_Barrier', 'Lebenssperre'], _ + [271, 'Zealots_Fire', 'Eifererfeuer'], _ + [272, 'Balthazars_Aura', 'Balthasars_Aura'], _ + [273, 'Spell_Breaker', 'Zauberbrecher'], _ + [274, 'Healing_Seed', 'Heilender_Samen'], _ + [275, 'Mend_Condition', 'Zustand_bessern'], _ + [276, 'Restore_Condition', 'Zustand_wiederherstellen'], _ + [277, 'Mend_Ailment', 'Leiden_heilen'], _ + [278, 'Purge_Conditions', 'Zustände_reinigen'], _ + [279, 'Divine_Healing', 'Göttliche_Heilung'], _ + [280, 'Heal_Area', 'Gebiet_heilen'], _ + [281, 'Orison_of_Healing', 'Fürbitte_der_Heilung'], _ + [282, 'Word_of_Healing', 'Wort_der_Heilung'], _ + [283, 'Dwaynas_Kiss', 'Dwaynas_Kuss'], _ + [284, 'Divine_Boon', 'Göttlicher_Segen'], _ + [285, 'Healing_Hands', 'Heilende_Hände'], _ + [286, 'Heal_Other', 'Anderen_heilen'], _ + [287, 'Heal_Party', 'Gruppe_heilen'], _ + [288, 'Healing_Breeze', 'Heilender_Hauch'], _ + [289, 'Vital_Blessing', 'Lebendige_Segnung'], _ + [290, 'Mending', 'Genesung'], _ + [291, 'Live_Vicariously', 'Ersatzleben'], _ + [292, 'Infuse_Health', 'Leben_einflößen'], _ + [293, 'Signet_of_Devotion', 'Siegel_der_Hingabe'], _ + [294, 'Signet_of_Judgment', 'Siegel_des_Urteils'], _ + [295, 'Purge_Signet', 'Siegel_der_Reinigung'], _ + [296, 'Bane_Signet', 'Siegel_des_Ruins'], _ + [297, 'Blessed_Signet', 'Gesegnetes_Siegel'], _ + [298, 'Martyr', 'Märtyrer'], _ + [299, 'Shielding_Hands', 'Schützende_Hände'], _ + [300, 'Contemplation_of_Purity', 'Gebot_der_Reinheit'], _ + [301, 'Remove_Hex', 'Verhexung_entfernen'], _ + [302, 'Smite_Hex', 'Verhexung_zerschlagen'], _ + [303, 'Convert_Hexes', 'Verhexungen_umwandeln'], _ + [304, 'Light_of_Dwayna', 'Licht_von_Dwayna'], _ + [305, 'Resurrect', 'Wiederbeleben'], _ + [306, 'Rebirth', 'Wiedergeburt'], _ + [307, 'Reversal_of_Fortune', 'Umkehrung_des_Schicksals'], _ + [308, 'Succor', 'Beistand'], _ + [309, 'Holy_Veil', 'Heiliger_Schleier'], _ + [310, 'Divine_Spirit', 'Göttlicher_Geist'], _ + [311, 'Draw_Conditions', 'Zustände_entziehen'], _ + [312, 'Holy_Strike', 'Heiliger_Schlag'], _ + [313, 'Healing_Touch', 'Heilende_Berührung'], _ + [314, 'Restore_Life', 'Leben_erneuern'], _ + [315, 'Vengeance', 'Rache'], _ + [316, 'To_the_Limit', 'Bis_ans_Limit'], _ + [317, 'Battle_Rage', 'Kampfwut'], _ + [318, 'Defy_Pain', 'Schmerz_trotzen'], _ + [319, 'Rush', 'Ansturm'], _ + [320, 'Hamstring', 'Lähmung'], _ + [321, 'Wild_Blow', 'Rundumschlag'], _ + [322, 'Power_Attack', 'Kraftangriff'], _ + [323, 'Desperation_Blow', 'Verzweiflungsschlag'], _ + [324, 'Thrill_of_Victory', 'Rausch_des_Sieges'], _ + [325, 'Distracting_Blow', 'Ablenkungsschlag'], _ + [326, 'Protectors_Strike', 'Schlag_des_Beschützers'], _ + [327, 'Griffons_Sweep', 'Greifenschlag'], _ + [328, 'Pure_Strike', 'Reiner_Schlag'], _ + [329, 'Skull_Crack', 'Schädel_spalten'], _ + [330, 'Cyclone_Axe', 'Zyklonaxt'], _ + [331, 'Hammer_Bash', 'Hammerstreich'], _ + [332, 'Bulls_Strike', 'Bullenstoß'], _ + [333, 'I_Will_Avenge_You', 'Ich_werde_Euch_rächen'], _ + [334, 'Axe_Rake', 'Harkenaxt'], _ + [335, 'Cleave', 'Spalten'], _ + [336, 'Executioners_Strike', 'Henkerschlag'], _ + [337, 'Dismember', 'Zerstückeln'], _ + [338, 'Eviscerate', 'Ausweiden'], _ + [339, 'Penetrating_Blow', 'Durchdringender_Schlag'], _ + [340, 'Disrupting_Chop', 'Unterbrechender_Hieb'], _ + [341, 'Swift_Chop', 'Schneller_Hieb'], _ + [342, 'Axe_Twist', 'Axtdrehung'], _ + [343, 'For_Great_Justice', 'Für_höhere_Gerechtigkeit'], _ + [344, 'Flurry', 'Schauer'], _ + [345, 'Defensive_Stance', 'Verteidigungshaltung'], _ + [346, 'Frenzy', 'Raserei'], _ + [347, 'Endure_Pain', 'Schmerz_ertragen'], _ + [348, 'Watch_Yourself', 'Passt_auf_Euch_auf'], _ + [349, 'Sprint', 'Sprinten'], _ + [350, 'Belly_Smash', 'Bauchklatscher'], _ + [351, 'Mighty_Blow', 'Mächtiger_Schlag'], _ + [352, 'Crushing_Blow', 'Vernichtender_Schlag'], _ + [353, 'Crude_Swing', 'Grober_Schwung'], _ + [354, 'Earth_Shaker', 'Erdrüttler'], _ + [355, 'Devastating_Hammer', 'Verheerender_Hammer'], _ + [356, 'Irresistible_Blow', 'Brutaler_Schlag'], _ + [357, 'Counter_Blow', 'Gegenschlag'], _ + [358, 'Backbreaker', 'Rückenbrecher'], _ + [359, 'Heavy_Blow', 'Heftiger_Schlag'], _ + [360, 'Staggering_Blow', 'Umwerfender_Schlag'], _ + [361, 'Dolyak_Signet', 'Dolyak_Siegel'], _ + [362, 'Warriors_Cunning', 'Verschlagenheit_des_Kriegers'], _ + [363, 'Shield_Bash', 'Heftiger_Schildschlag'], _ + [364, 'Charge', 'Angriff'], _ + [365, 'Victory_Is_Mine', 'Der_Sieg_ist_mein'], _ + [366, 'Fear_Me', 'Fürchtet_mich'], _ + [367, 'Shields_Up', 'Schilde_hoch'], _ + [368, 'I_Will_Survive', 'Ich_überlebe'], _ + [370, 'Berserker_Stance', 'Berserkerhaltung'], _ + [371, 'Balanced_Stance', 'Ausgeglichene_Haltung'], _ + [372, 'Gladiators_Defense', 'Gladiatoren_Verteidigung'], _ + [373, 'Deflect_Arrows', 'Pfeilablenkung'], _ + [374, 'Warriors_Endurance', 'Ausdauer_des_Kriegers'], _ + [375, 'Dwarven_Battle_Stance', 'Zwergen_Kampfhaltung'], _ + [376, 'Disciplined_Stance', 'Disziplinierte_Haltung'], _ + [377, 'Wary_Stance', 'Wachsame_Haltung'], _ + [378, 'Shield_Stance', 'Schildhaltung'], _ + [379, 'Bulls_Charge', 'Angriff_des_Bullen'], _ + [380, 'Bonettis_Defense', 'Bonettis_Verteidigung'], _ + [381, 'Hundred_Blades', 'Hundert_Klingen'], _ + [382, 'Sever_Artery', 'Arterienabtrennung'], _ + [383, 'Galrath_Slash', 'Galrath_Hieb'], _ + [384, 'Gash', 'Schnittwunde'], _ + [385, 'Final_Thrust', 'Endstoß'], _ + [386, 'Seeking_Blade', 'Suchende_Klinge'], _ + [387, 'Riposte', 'Entgegnung'], _ + [388, 'Deadly_Riposte', 'Tödliche_Entgegnung'], _ + [389, 'Flourish', 'Blütezeit'], _ + [390, 'Savage_Slash', 'Wilder_Hieb'], _ + [391, 'Hunters_Shot', 'Jägerschuss'], _ + [392, 'Pin_Down', 'Festnageln'], _ + [393, 'Crippling_Shot', 'Verkrüppelungs_Schuss'], _ + [394, 'Power_Shot', 'Kraftschuss'], _ + [395, 'Barrage', 'Sperrfeuer'], _ + [396, 'Dual_Shot', 'Doppelschuss'], _ + [397, 'Quick_Shot', 'Schnellschuss'], _ + [398, 'Penetrating_Attack', 'Durchbohr_Angriff'], _ + [399, 'Distracting_Shot', 'Ablenk_Schuss'], _ + [400, 'Precision_Shot', 'Präzisionsschuss'], _ + [402, 'Determined_Shot', 'Entschlossener_Schuss'], _ + [403, 'Called_Shot', 'Ankündigungs_Schuss'], _ + [404, 'Poison_Arrow', 'Giftpfeil'], _ + [405, 'Oath_Shot', 'Eidschuss'], _ + [406, 'Debilitating_Shot', 'Entkräftungs_Schuss'], _ + [407, 'Point_Blank_Shot', 'Kurzdistanzschuss'], _ + [408, 'Concussion_Shot', 'Erschütterungsschuss'], _ + [409, 'Punishing_Shot', 'Bestrafungs_Schuss'], _ + [411, 'Charm_Animal', 'Tier_zähmen'], _ + [412, 'Call_of_Protection', 'Ruf_des_Schutzes'], _ + [415, 'Call_of_Haste', 'Ruf_der_Eile'], _ + [422, 'Revive_Animal', 'Tier_wiederbeleben'], _ + [423, 'Symbiotic_Bond', 'Symbiotisches_Band'], _ + [424, 'Throw_Dirt', 'Dreck_werfen'], _ + [425, 'Dodge', 'Abducken'], _ + [426, 'Savage_Shot', 'Wilder_Schuss'], _ + [427, 'Antidote_Signet', 'Gegengift_Siegel'], _ + [428, 'Incendiary_Arrows', 'Flammenpfeile'], _ + [429, 'Melandrus_Arrows', 'Melandrus_Pfeile'], _ + [430, 'Marksmans_Wager', 'Schützenwette'], _ + [431, 'Ignite_Arrows', 'Brandpfeile'], _ + [432, 'Read_the_Wind', 'Wind_lesen'], _ + [433, 'Kindle_Arrows', 'Zündelpfeile'], _ + [434, 'Choking_Gas', 'Würgegas'], _ + [435, 'Apply_Poison', 'Gift_auftragen'], _ + [436, 'Comfort_Animal', 'Tier_erquicken'], _ + [437, 'Bestial_Pounce', 'Bestiensprung'], _ + [438, 'Maiming_Strike', 'Verkrüppelungs_Schlag'], _ + [439, 'Feral_Lunge', 'Wilder_Ausfall'], _ + [440, 'Scavenger_Strike', 'Aasfresser_Schlag'], _ + [441, 'Melandrus_Assault', 'Melandrus_Angriff'], _ + [442, 'Ferocious_Strike', 'Wilder_Schlag'], _ + [443, 'Predators_Pounce', 'Raubtier_Sprung'], _ + [444, 'Brutal_Strike', 'Schonungsloser_Schlag'], _ + [445, 'Disrupting_Lunge', 'Unterbrechender_Ausfall'], _ + [446, 'Troll_Unguent', 'Trollsalbe'], _ + [447, 'Otyughs_Cry', 'Otyughs_Schrei'], _ + [448, 'Escape', 'Flucht'], _ + [449, 'Practiced_Stance', 'Geübte_Haltung'], _ + [450, 'Whirling_Defense', 'Wirbelverteidigung'], _ + [451, 'Melandrus_Resilience', 'Melandrus_Belastbarkeit'], _ + [452, 'Dryders_Defenses', 'Dryders_Verteidigungen'], _ + [453, 'Lightning_Reflexes', 'Blitzreflexe'], _ + [454, 'Tigers_Fury', 'Wut_des_Tigers'], _ + [455, 'Storm_Chaser', 'Sturmjäger'], _ + [456, 'Serpents_Quickness', 'Schlangen_Schnelligkeit'], _ + [457, 'Dust_Trap', 'Staubfalle'], _ + [458, 'Barbed_Trap', 'Stachelfalle'], _ + [459, 'Flame_Trap', 'Flammenfalle'], _ + [460, 'Healing_Spring', 'Heilquelle'], _ + [461, 'Spike_Trap', 'Dornenfalle'], _ + [462, 'Winter', 'Winter'], _ + [463, 'Winnowing', 'Trennung'], _ + [464, 'Edge_of_Extinction', 'Rand_der_Auslöschung'], _ + [465, 'Greater_Conflagration', 'Großflächenbrand'], _ + [466, 'Conflagration', 'Feuersbrunst'], _ + [467, 'Fertile_Season', 'Fruchtbare_Jahreszeit'], _ + [468, 'Symbiosis', 'Symbiose'], _ + [469, 'Primal_Echoes', 'Urechos'], _ + [470, 'Predatory_Season', 'Jagdsaison'], _ + [471, 'Frozen_Soil', 'Eisboden'], _ + [472, 'Favorable_Winds', 'Günstige_Winde'], _ + [474, 'Energizing_Wind', 'Treibwind'], _ + [475, 'Quickening_Zephyr', 'Beschleunigender_Zephyr'], _ + [476, 'Natures_Renewal', 'Erneuerung_der_Natur'], _ + [477, 'Muddy_Terrain', 'Schlammiges_Terrain'], _ + [570, 'Mark_of_Insecurity', 'Zeichen_der_Unsicherheit'], _ + [571, 'Disrupting_Dagger', 'Unterbrechender_Dolch'], _ + [572, 'Deadly_Paradox', 'Tödliches_Paradoxon'], _ + [763, 'Jaundiced_Gaze', 'Neidvoller_Blick'], _ + [764, 'Wail_of_Doom', 'Schicksalsklage'], _ + [766, 'Gaze_of_Contempt', 'Verächtlicher_Blick'], _ + [769, 'Vipers_Defense', 'Verteidigung_der_Viper'], _ + [770, 'Return', 'Rückkehr'], _ + [771, 'Aura_of_Displacement', 'Aura_der_Verschiebung'], _ + [772, 'Generous_Was_Tsungrai', 'Großzügig_war_Tsungrai'], _ + [773, 'Mighty_Was_Vorizun', 'Mächtig_war_Vorizun'], _ + [775, 'Death_Blossom', 'Todesblüte'], _ + [776, 'Twisting_Fangs', 'Schlangenzähne'], _ + [777, 'Horns_of_the_Ox', 'Hörner_des_Ochsen'], _ + [778, 'Falling_Spider', 'Fallende_Spinne'], _ + [779, 'Black_Lotus_Strike', 'Schwarzer_Lotus_Stoß'], _ + [780, 'Fox_Fangs', 'Reißzähne_des_Fuchses'], _ + [781, 'Moebius_Strike', 'Möbiusstoß'], _ + [782, 'Jagged_Strike', 'Gezackter_Stoß'], _ + [783, 'Unsuspecting_Strike', 'Unvermuteter_Stoß'], _ + [784, 'Entangling_Asp', 'Schlingnatter'], _ + [785, 'Mark_of_Death', 'Zeichen_des_Todes'], _ + [786, 'Iron_Palm', 'Eiserne_Handfläche'], _ + [787, 'Resilient_Weapon', 'Unverwüstliche_Waffe'], _ + [788, 'Blind_Was_Mingson', 'Blind_war_Mingson'], _ + [789, 'Grasping_Was_Kuurong', 'Erfassend_war_Kuurong'], _ + [790, 'Vengeful_Was_Khanhei', 'Nachtragend_war_Khanhei'], _ + [791, 'Flesh_of_My_Flesh', 'Fleisch_von_meinem_Fleisch'], _ + [792, 'Splinter_Weapon', 'Splitterwaffe'], _ + [793, 'Weapon_of_Warding', 'Waffe_der_Abwehr'], _ + [794, 'Wailing_Weapon', 'Klagende_Waffe'], _ + [795, 'Nightmare_Weapon', 'Alptraumwaffe'], _ + [799, 'Beguiling_Haze', 'Verführerischer_Dunst'], _ + [800, 'Enduring_Toxin', 'Dauerhaftes_Toxin'], _ + [801, 'Shroud_of_Silence', 'Schleier_des_Schweigens'], _ + [802, 'Expose_Defenses', 'Verteidigungen_aufdecken'], _ + [803, 'Power_Leech', 'Kraftfresser'], _ + [804, 'Arcane_Languor', 'Arkane_Schwäche'], _ + [805, 'Animate_Vampiric_Horror', 'Vampirschreck_beleben'], _ + [806, 'Cultists_Fervor', 'Eifer_des_Sektierers'], _ + [808, 'Reapers_Mark', 'Zeichen_des_Schnitters'], _ + [809, 'Shatterstone', 'Trümmerstein'], _ + [810, 'Protectors_Defense', 'Verteidigung_des_Beschützers'], _ + [811, 'Run_as_One', 'Gemeinsam_rennen'], _ + [812, 'Defiant_Was_Xinrae', 'Trotzig_war_Xinrae'], _ + [813, 'Lyssas_Aura', 'Lyssas_Aura'], _ + [814, 'Shadow_Refuge', 'Schattenzuflucht'], _ + [815, 'Scorpion_Wire', 'Skorpiondraht'], _ + [816, 'Mirrored_Stance', 'Gespiegelte_Haltung'], _ + [817, 'Discord', 'Zwietracht'], _ + [818, 'Well_of_Weariness', 'Brunnen_der_Müdigkeit'], _ + [819, 'Vampiric_Spirit', 'Vampirgeist'], _ + [820, 'Depravity', 'Verderbtheit'], _ + [821, 'Icy_Veins', 'Eisadern'], _ + [822, 'Weaken_Knees', 'Weiche_Knie'], _ + [823, 'Burning_Speed', 'Brennende_Eile'], _ + [824, 'Lava_Arrows', 'Lavapfeile'], _ + [825, 'Bed_of_Coals', 'Kohlenbett'], _ + [826, 'Shadow_Form', 'Schattenform'], _ + [827, 'Siphon_Strength', 'Kraft_abzapfen'], _ + [828, 'Vile_Miasma', 'Fauler_Gestank'], _ + [830, 'Ray_of_Judgment', 'Strahl_des_Urteils'], _ + [831, 'Primal_Rage', 'Urzorn'], _ + [832, 'Animate_Flesh_Golem', 'Fleischgolem_beleben'], _ + [834, 'Reckless_Haste', 'Rücksichtslose_Hast'], _ + [835, 'Blood_Bond', 'Blutsbande'], _ + [836, 'Ride_the_Lightning', 'Den_Blitz_reiten'], _ + [837, 'Energy_Boon', 'Energiesegen'], _ + [838, 'Dwaynas_Sorrow', 'Dwaynas_Leid'], _ + [839, 'Retreat', 'Rückzug'], _ + [840, 'Poisoned_Heart', 'Vergiftetes_Herz'], _ + [841, 'Fetid_Ground', 'Stinkender_Boden'], _ + [842, 'Arc_Lightning', 'Blitzbogen'], _ + [843, 'Gust', 'Böe'], _ + [844, 'Churning_Earth', 'Aufgeworfene_Erde'], _ + [845, 'Liquid_Flame', 'Flüssige_Flamme'], _ + [846, 'Steam', 'Dampf'], _ + [847, 'Boon_Signet', 'Siegel_des_Segens'], _ + [848, 'Reverse_Hex', 'Verhexung_umkehren'], _ + [849, 'Lacerating_Chop', 'Zerfetzender_Hieb'], _ + [850, 'Fierce_Blow', 'Erbitterter_Schlag'], _ + [851, 'Sun_and_Moon_Slash', 'Sonne_Mond_Hieb'], _ + [852, 'Splinter_Shot', 'Splitterschuss'], _ + [853, 'Melandrus_Shot', 'Melandrus_Schuss'], _ + [854, 'Snare', 'Schlinge'], _ + [858, 'Dancing_Daggers', 'Tanzende_Dolche'], _ + [859, 'Conjure_Nightmare', 'Alptraum_beschwören'], _ + [860, 'Signet_of_Disruption', 'Siegel_der_Unterbrechung'], _ + [862, 'Ravenous_Gaze', 'Heißhungriger_Blick'], _ + [863, 'Order_of_Apostasy', 'Orden_der_Abtrünnigkeit'], _ + [864, 'Oppressive_Gaze', 'Repressiver_Blick'], _ + [865, 'Lightning_Hammer', 'Blitzhammer'], _ + [866, 'Vapor_Blade', 'Dunstklinge'], _ + [867, 'Healing_Light', 'Heilendes_Licht'], _ + [869, 'Coward', 'Feigling'], _ + [870, 'Pestilence', 'Pestilenz'], _ + [871, 'Shadowsong', 'Schattengesang'], _ + [876, 'Signet_of_Shadows', 'Siegel_der_Schatten'], _ + [877, 'Lyssas_Balance', 'Lyssas_Ausgleich'], _ + [878, 'Visions_of_Regret', 'Visionen_des_Bedauerns'], _ + [879, 'Illusion_of_Pain', 'Illusion_der_Schmerzen'], _ + [880, 'Stolen_Speed', 'Gestohlene_Eile'], _ + [881, 'Ether_Signet', 'Äther_Siegel'], _ + [882, 'Signet_of_Disenchantment', 'Siegel_der_Entzauberung'], _ + [883, 'Vocal_Minority', 'Stimmminderheit'], _ + [884, 'Searing_Flames', 'Versengende_Flammen'], _ + [885, 'Shield_Guardian', 'Schildwächter'], _ + [886, 'Restful_Breeze', 'Beruhigender_Hauch'], _ + [887, 'Signet_of_Rejuvenation', 'Siegel_der_Verjüngung'], _ + [888, 'Whirling_Axe', 'Wirbelnde_Axt'], _ + [889, 'Forceful_Blow', 'Energischer_Schlag'], _ + [891, 'None_Shall_Pass', 'Niemand_darf_vorbei'], _ + [892, 'Quivering_Blade', 'Zitternde_Klinge'], _ + [893, 'Seeking_Arrows', 'Suchende_Pfeile'], _ + [898, 'Overload', 'Überlastung'], _ + [899, 'Images_of_Remorse', 'Bilder_der_Reue'], _ + [900, 'Shared_Burden', 'Geteilte_Bürde'], _ + [901, 'Soul_Bind', 'Seelenfessel'], _ + [902, 'Blood_of_the_Aggressor', 'Blut_des_Aggressoren'], _ + [903, 'Icy_Prism', 'Eisprisma'], _ + [904, 'Furious_Axe', 'Zornige_Axt'], _ + [905, 'Auspicious_Blow', 'Günstiger_Schlag'], _ + [906, 'On_Your_Knees', 'Auf_Eure_Knie'], _ + [907, 'Dragon_Slash', 'Drachenhieb'], _ + [908, 'Marauders_Shot', 'Plünderer_Schuss'], _ + [909, 'Focused_Shot', 'Scharfschuss'], _ + [910, 'Spirit_Rift', 'Geisterriss'], _ + [911, 'Union', 'Vereinigung'], _ + [913, 'Tranquil_Was_Tanasen', 'Ruhig_war_Tanasen'], _ + [914, 'Consume_Soul', 'Seele_verzehren'], _ + [915, 'Spirit_Light', 'Geisterlicht'], _ + [916, 'Lamentation', 'Wehklage'], _ + [917, 'Rupture_Soul', 'Seele_zerreißen'], _ + [918, 'Spirit_to_Flesh', 'Geist_zu_Fleisch'], _ + [919, 'Spirit_Burn', 'Geisterbrand'], _ + [920, 'Destruction', 'Vernichtung'], _ + [921, 'Dissonance', 'Missklang'], _ + [923, 'Disenchantment', 'Entzauberung'], _ + [925, 'Recall', 'Rückruf'], _ + [926, 'Sharpen_Daggers', 'Dolche_wetzen'], _ + [927, 'Shameful_Fear', 'Schändliche_Angst'], _ + [928, 'Shadow_Shroud', 'Schattenschleier'], _ + [929, 'Shadow_of_Haste', 'Schatten_der_Eile'], _ + [930, 'Auspicious_Incantation', 'Günstige_Beschwörung'], _ + [931, 'Power_Return', 'Kraftrevanche'], _ + [932, 'Complicate', 'Erschweren'], _ + [933, 'Shatter_Storm', 'Sturm_zerschlagen'], _ + [934, 'Unnatural_Signet', 'Unnatürliches_Siegel'], _ + [935, 'Rising_Bile', 'Hochkommende_Galle'], _ + [936, 'Envenom_Enchantments', 'Verzauberungen_vergiften'], _ + [937, 'Shockwave', 'Stoßwelle'], _ + [938, 'Ward_of_Stability', 'Kreis_der_Stabilität'], _ + [939, 'Icy_Shackles', 'Eisfesseln'], _ + [941, 'Blessed_Light', 'Gesegnetes_Licht'], _ + [942, 'Withdraw_Hexes', 'Verhexungen_zurücknehmen'], _ + [943, 'Extinguish', 'Löschen'], _ + [944, 'Signet_of_Strength', 'Siegel_der_Stärke'], _ + [946, 'Trappers_Focus', 'Fokus_des_Fallenstellers'], _ + [947, 'Brambles', 'Dornenranken'], _ + [948, 'Desperate_Strike', 'Verzweifelter_Stoß'], _ + [949, 'Way_of_the_Fox', 'Weg_des_Fuchses'], _ + [950, 'Shadowy_Burden', 'Schattenbürde'], _ + [951, 'Siphon_Speed', 'Geschwindigkeit_abzapfen'], _ + [952, 'Deaths_Charge', 'Angriff_des_Todes'], _ + [953, 'Power_Flux', 'Kraftfluss'], _ + [954, 'Expel_Hexes', 'Verhexungen_vertreiben'], _ + [955, 'Rip_Enchantment', 'Verzauberung_zerreißen'], _ + [957, 'Spell_Shield', 'Zauberschild'], _ + [958, 'Healing_Whisper', 'Heilendes_Geflüster'], _ + [959, 'Ethereal_Light', 'Ätherisches_Licht'], _ + [960, 'Release_Enchantments', 'Verzauberungen_freisetzen'], _ + [961, 'Lacerate', 'Zerfetzen'], _ + [962, 'Spirit_Transfer', 'Geistübertragung'], _ + [963, 'Restoration', 'Wiederherstellung'], _ + [964, 'Vengeful_Weapon', 'Rachsüchtige_Waffe'], _ + [973, 'Blinding_Powder', 'Blendpulver'], _ + [974, 'Mantis_Touch', 'Berührung_der_Mantis'], _ + [975, 'Exhausting_Assault', 'Ermüdender_Angriff'], _ + [976, 'Repeating_Strike', 'Wiederholender_Schlag'], _ + [977, 'Way_of_the_Lotus', 'Weg_des_Lotus'], _ + [978, 'Mark_of_Instability', 'Zeichen_der_Unbeständigkeit'], _ + [979, 'Mistrust', 'Argwohn'], _ + [980, 'Feast_of_Souls', 'Schmaus_der_Seelen'], _ + [981, 'Recuperation', 'Erholung'], _ + [982, 'Shelter', 'Unterschlupf'], _ + [983, 'Weapon_of_Shadow', 'Schattenwaffe'], _ + [985, 'Caltrops', 'Trittnägel'], _ + [986, 'Nine_Tail_Strike', 'Neunschwänziger_Stoß'], _ + [987, 'Way_of_the_Empty_Palm', 'Weg_der_leeren_Handfläche'], _ + [988, 'Temple_Strike', 'Schläfenstoß'], _ + [989, 'Golden_Phoenix_Strike', 'Goldener_Phönix_Stoß'], _ + [990, 'Expunge_Enchantments', 'Verzauberungen_ausmerzen'], _ + [991, 'Deny_Hexes', 'Verhexungen_zurückweisen'], _ + [992, 'Triple_Chop', 'Dreifachhieb'], _ + [993, 'Enraged_Smash', 'Erzürnter_Schlag'], _ + [994, 'Renewing_Smash', 'Erneuernder_Schlag'], _ + [995, 'Tiger_Stance', 'Tigerhaltung'], _ + [996, 'Standing_Slash', 'Stehender_Hieb'], _ + [997, 'Famine', 'Hungersnot'], _ + [1018, 'Critical_Eye', 'Kritisches_Auge'], _ + [1019, 'Critical_Strike', 'Kritischer_Stoß'], _ + [1020, 'Blades_of_Steel', 'Stahlklingen'], _ + [1021, 'Jungle_Strike', 'Dschungelschlag'], _ + [1022, 'Wild_Strike', 'Wilder_Stoß'], _ + [1023, 'Leaping_Mantis_Sting', 'Stich_der_springenden_Mantis'], _ + [1024, 'Black_Mantis_Thrust', 'Stoß_der_schwarzen_Mantis'], _ + [1025, 'Disrupting_Stab', 'Unterbrechender_Dolchstoß'], _ + [1026, 'Golden_Lotus_Strike', 'Goldener_Lotus_Stoß'], _ + [1027, 'Critical_Defenses', 'Kritische_Verteidigungen'], _ + [1028, 'Way_of_Perfection', 'Weg_der_Perfektion'], _ + [1029, 'Dark_Apostasy', 'Dunkle_Abtrünnigkeit'], _ + [1030, 'Locusts_Fury', 'Wut_der_Heuschrecke'], _ + [1031, 'Shroud_of_Distress', 'Schleier_des_Kummers'], _ + [1032, 'Heart_of_Shadow', 'Herz_der_Schatten'], _ + [1033, 'Impale', 'Aufspießen'], _ + [1034, 'Seeping_Wound', 'Eiternde_Wunde'], _ + [1035, 'Assassins_Promise', 'Versprechen_des_Assassinen'], _ + [1036, 'Signet_of_Malice', 'Siegel_der_Bosheit'], _ + [1037, 'Dark_Escape', 'Dunkle_Flucht'], _ + [1038, 'Crippling_Dagger', 'Verkrüppelnder_Dolch'], _ + [1040, 'Spirit_Walk', 'Geistermarsch'], _ + [1041, 'Unseen_Fury', 'Unsichtbare_Wut'], _ + [1042, 'Flashing_Blades', 'Blitzende_Klingen'], _ + [1043, 'Dash', 'Preschen'], _ + [1044, 'Dark_Prison', 'Dunkles_Gefängnis'], _ + [1045, 'Palm_Strike', 'Handflächenschlag'], _ + [1048, 'Revealed_Enchantment', 'Enthüllte_Verzauberung'], _ + [1049, 'Revealed_Hex', 'Enthüllte_Verhexung'], _ + [1052, 'Accumulated_Pain', 'Angehäufter_Schmerz'], _ + [1053, 'Psychic_Distraction', 'Übernatürliche_Ablenkung'], _ + [1054, 'Ancestors_Visage', 'Antlitz_des_Ahnen'], _ + [1055, 'Recurring_Insecurity', 'Wiederkehrende_Unsicherheit'], _ + [1056, 'Kitahs_Burden', 'Kitahs_Bürde'], _ + [1057, 'Psychic_Instability', 'Übernatürliche_Labilität'], _ + [1059, 'Hex_Eater_Signet', 'Verhexungsfresser_Siegel'], _ + [1061, 'Feedback', 'Reaktion'], _ + [1062, 'Arcane_Larceny', 'Arkane_Entwendung'], _ + [1066, 'Spoil_Victor', 'Sieger_plündern'], _ + [1067, 'Lifebane_Strike', 'Lebensfluchstoß'], _ + [1068, 'Bitter_Chill', 'Bitterkalt'], _ + [1069, 'Taste_of_Pain', 'Geschmack_der_Schmerzen'], _ + [1070, 'Defile_Enchantments', 'Verzauberungen_schänden'], _ + [1071, 'Shivers_of_Dread', 'Angstschauer'], _ + [1075, 'Vampiric_Swarm', 'Vampirschwarm'], _ + [1076, 'Blood_Drinker', 'Bluttrinker'], _ + [1077, 'Vampiric_Bite', 'Vampirbiss'], _ + [1078, 'Wallows_Bite', 'Wälzerbiss'], _ + [1079, 'Enfeebling_Touch', 'Schwächende_Berührung'], _ + [1081, 'Teinais_Wind', 'Teinais_Wind'], _ + [1082, 'Shock_Arrow', 'Schockpfeil'], _ + [1083, 'Unsteady_Ground', 'Schwankender_Boden'], _ + [1084, 'Sliver_Armor', 'Splitter_Rüstung'], _ + [1085, 'Ash_Blast', 'Aschenexplosion'], _ + [1086, 'Dragon_s_Stomp', 'Drachenstampfer'], _ + [1088, 'Second_Wind', 'Zweite_Chance'], _ + [1090, 'Smoldering_Embers', 'Glühende_Kohle'], _ + [1091, 'Double_Dragon', 'Doppeldrache'], _ + [1093, 'Teinais_Heat', 'Teinais_Hitze'], _ + [1094, 'Breath_of_Fire', 'Feueratem'], _ + [1095, 'Star_Burst', 'Sternenexplosion'], _ + [1096, 'Glyph_of_Essence', 'Glyphe_der_Essenz'], _ + [1097, 'Teinais_Prison', 'Teinais_Gefängnis'], _ + [1098, 'Mirror_of_Ice', 'Eisspiegel'], _ + [1099, 'Teinais_Crystals', 'Teinais_Kristalle'], _ + [1113, 'Kirins_Wrath', 'Kirins_Zorn'], _ + [1114, 'Spirit_Bond', 'Geisterbindung'], _ + [1115, 'Air_of_Enchantment', 'Flair_der_Verzauberung'], _ + [1117, 'Heavens_Delight', 'Himmlische_Wonne'], _ + [1118, 'Healing_Burst', 'Heilsalve'], _ + [1119, 'Kareis_Healing_Circle', 'Kareis_Heilkreis'], _ + [1120, 'Jameis_Gaze', 'Jameis_Starren'], _ + [1121, 'Gift_of_Health', 'Geschenk_des_Lebens'], _ + [1123, 'Life_Sheath', 'Lebensmantel'], _ + [1126, 'Empathic_Removal', 'Ausdrückliche_Entfernung'], _ + [1128, 'Resurrection_Chant', 'Gesang_der_Wiederbelebung'], _ + [1129, 'Word_of_Censure', 'Wort_des_Tadels'], _ + [1130, 'Spear_of_Light', 'Speer_des_Lichts'], _ + [1131, 'Stonesoul_Strike', 'Steinseelenschlag'], _ + [1133, 'Drunken_Blow', 'Betrunkener_Schlag'], _ + [1134, 'Leviathans_Sweep', 'Leviathanschlag'], _ + [1135, 'Jaizhenju_Strike', 'Jaizhenjuschlag'], _ + [1136, 'Penetrating_Chop', 'Durchdringender_Hieb'], _ + [1137, 'Yeti_Smash', 'Yetischlag'], _ + [1141, 'You_Will_Die', 'Ihr_werdet_sterben'], _ + [1142, 'Auspicious_Parry', 'Günstige_Abwehr'], _ + [1144, 'Silverwing_Slash', 'Silberflügel_Hieb'], _ + [1146, 'Shove', 'Schubs'], _ + [1191, 'Sundering_Attack', 'Trennender_Angriff'], _ + [1192, 'Zojuns_Shot', 'Zojuns_Schuss'], _ + [1194, 'Predatory_Bond', 'Raubtierverbindung'], _ + [1195, 'Heal_as_One', 'Gemeinsame_Heilung'], _ + [1196, 'Zojuns_Haste', 'Zojuns_Eile'], _ + [1197, 'Needling_Shot', 'Nadelschuss'], _ + [1198, 'Broad_Head_Arrow', 'Stahlspitzenpfeil'], _ + [1199, 'Glass_Arrows', 'Glaspfeile'], _ + [1200, 'Archers_Signet', 'Siegel_des_Bogenschützen'], _ + [1201, 'Savage_Pounce', 'Wilder_Sprung'], _ + [1202, 'Enraged_Lunge', 'Erzürnter_Ausfall'], _ + [1203, 'Bestial_Mauling', 'Bestienattacke'], _ + [1205, 'Poisonous_Bite', 'Giftbiss'], _ + [1206, 'Pounce', 'Sprung'], _ + [1209, 'Bestial_Fury', 'Bestienwut'], _ + [1211, 'Vipers_Nest', 'Vipernnest'], _ + [1212, 'Equinox', 'Tagundnachtgleiche'], _ + [1213, 'Tranquility', 'Ruhe'], _ + [1215, 'Clamor_of_Souls', 'Gezeter_der_Seelen'], _ + [1217, 'Ritual_Lord', 'Herr_der_Rituale'], _ + [1218, 'Cruel_Was_Daoshen', 'Grausam_war_Daoshen'], _ + [1219, 'Protective_Was_Kaolai', 'Schützend_war_Kaolai'], _ + [1220, 'Attuned_Was_Songkai', 'Eingestimmt_war_Songkai'], _ + [1221, 'Resilient_Was_Xiko', 'Unverwüstlich_war_Xiko'], _ + [1222, 'Lively_Was_Naomei', 'Lebhaft_war_Naomei'], _ + [1223, 'Anguished_Was_Lingwah', 'Gequält_war_Lingwah'], _ + [1224, 'Draw_Spirit', 'Geist_entziehen'], _ + [1225, 'Channeled_Strike', 'Gelenkter_Schlag'], _ + [1226, 'Spirit_Boon_Strike', 'Geistersegenstoß'], _ + [1227, 'Essence_Strike', 'Essenzschlag'], _ + [1228, 'Spirit_Siphon', 'Geist_abzapfen'], _ + [1229, 'Explosive_Growth', 'Explosives_Wachstum'], _ + [1230, 'Boon_of_Creation', 'Segen_der_Schöpfung'], _ + [1231, 'Spirit_Channeling', 'Geisterlenkung'], _ + [1232, 'Armor_of_Unfeeling', 'Rüstung_der_Gefühllosigkeit'], _ + [1233, 'Soothing_Memories', 'Beruhigende_Erinnerungen'], _ + [1234, 'Mend_Body_and_Soul', 'Körper_und_Seele_heilen'], _ + [1235, 'Dulled_Weapon', 'Stumpfe_Waffe'], _ + [1236, 'Binding_Chains', 'Fesselnde_Ketten'], _ + [1237, 'Painful_Bond', 'Schmerzhafte_Bindung'], _ + [1238, 'Signet_of_Creation', 'Siegel_der_Schöpfung'], _ + [1239, 'Signet_of_Spirits', 'Siegel_der_Geister'], _ + [1240, 'Soul_Twisting', 'Seelenverflechtung'], _ + [1244, 'Ghostly_Haste', 'Geisterhafte_Eile'], _ + [1245, 'Gaze_from_Beyond', 'Blick_aus_dem_Jenseits'], _ + [1246, 'Ancestors_Rage', 'Wut_der_Vorfahren'], _ + [1247, 'Pain', 'Schmerzen'], _ + [1249, 'Displacement', 'Verschiebung'], _ + [1250, 'Preservation', 'Erhaltung'], _ + [1251, 'Life', 'Leben'], _ + [1252, 'Earthbind', 'Erdbindung'], _ + [1253, 'Bloodsong', 'Blutgesang'], _ + [1255, 'Wanderlust', 'Fernweh'], _ + [1257, 'Spirit_Light_Weapon', 'Geisterlichtwaffe'], _ + [1258, 'Brutal_Weapon', 'Grausame_Waffe'], _ + [1259, 'Guided_Weapon', 'Gelenkte_Waffe'], _ + [1260, 'Meekness', 'Sanftmut'], _ + [1261, 'Frigid_Armor', 'Kalte_Rüstung'], _ + [1262, 'Healing_Ring', 'Heilring'], _ + [1263, 'Renew_Life', 'Leben_verlängern'], _ + [1264, 'Doom', 'Untergang'], _ + [1265, 'Wielders_Boon', 'Segen_des_Ausübers'], _ + [1266, 'Soothing', 'Beruhigung'], _ + [1267, 'Vital_Weapon', 'Wesentliche_Waffe'], _ + [1268, 'Weapon_of_Quickening', 'Waffe_der_Beschleunigung'], _ + [1269, 'Signet_of_Rage', 'Siegel_der_Wut'], _ + [1333, 'Extend_Conditions', 'Zustände_ausweiten'], _ + [1334, 'Hypochondria', 'Hypochondrie'], _ + [1335, 'Wastrels_Demise', 'Ableben_des_Verschwenders'], _ + [1336, 'Spiritual_Pain', 'Geisterschmerz'], _ + [1337, 'Drain_Delusions', 'Täuschungen_entziehen'], _ + [1338, 'Persistence_of_Memory', 'Beharrliche_Erinnerungen'], _ + [1339, 'Symbols_of_Inspiration', 'Symbole_der_Inspiration'], _ + [1340, 'Symbolic_Celerity', 'Symbolische_Schnelligkeit'], _ + [1341, 'Frustration', 'Frustration'], _ + [1342, 'Tease', 'Reizen'], _ + [1343, 'Ether_Phantom', 'Äther_Phantom'], _ + [1344, 'Web_of_Disruption', 'Netz_der_Störung'], _ + [1345, 'Enchanters_Conundrum', 'Rätsel_des_Verzauberers'], _ + [1346, 'Signet_of_Illusions', 'Siegel_der_Illusionen'], _ + [1347, 'Discharge_Enchantment', 'Verzauberung_entlassen'], _ + [1348, 'Hex_Eater_Vortex', 'Verhexungsfresser_Strudel'], _ + [1349, 'Mirror_of_Disenchantment', 'Spiegel_der_Entzauberung'], _ + [1350, 'Simple_Thievery', 'Simpler_Diebstahl'], _ + [1351, 'Animate_Shambling_Horror', 'Schlurfschreck_beleben'], _ + [1352, 'Order_of_Undeath', 'Orden_der_Untoten'], _ + [1353, 'Putrid_Flesh', 'Verwesendes_Fleisch'], _ + [1354, 'Feast_for_the_Dead', 'Fest_für_die_Toten'], _ + [1355, 'Jagged_Bones', 'Versplitterte_Knochen'], _ + [1356, 'Contagion', 'Erkrankung'], _ + [1358, 'Ulcerous_Lungs', 'Geschwürige_Lungen'], _ + [1359, 'Pain_of_Disenchantment', 'Schmerz_der_Entzauberung'], _ + [1360, 'Mark_of_Fury', 'Zeichen_der_Wut'], _ + [1362, 'Corrupt_Enchantment', 'Verzauberung_verderben'], _ + [1363, 'Signet_of_Sorrow', 'Siegel_des_Kummers'], _ + [1364, 'Signet_of_Suffering', 'Siegel_des_Leidens'], _ + [1365, 'Signet_of_Lost_Souls', 'Siegel_der_verlorenen_Seelen'], _ + [1366, 'Well_of_Darkness', 'Brunnen_der_Dunkelheit'], _ + [1367, 'Blinding_Surge', 'Blendende_Welle'], _ + [1368, 'Chilling_Winds', 'Kühle_Winde'], _ + [1369, 'Lightning_Bolt', 'Blitzstrahl'], _ + [1370, 'Storm_Djinns_Haste', 'Eile_des_Sturm_Dschinn'], _ + [1371, 'Stone_Striker', 'Steinschläger'], _ + [1372, 'Sandstorm', 'Sandsturm'], _ + [1373, 'Stone_Sheath', 'Steinmantel'], _ + [1374, 'Ebon_Hawk', 'Ebonfalke'], _ + [1375, 'Stoneflesh_Aura', 'Steinfleisch_Aura'], _ + [1376, 'Glyph_of_Restoration', 'Glyphe_der_Wiederherstellung'], _ + [1377, 'Ether_Prism', 'Ätherprisma'], _ + [1378, 'Master_of_Magic', 'Meister_der_Magie'], _ + [1379, 'Glowing_Gaze', 'Glühender_Blick'], _ + [1380, 'Savannah_Heat', 'Hitze_der_Savanne'], _ + [1381, 'Flame_Djinns_Haste', 'Eile_des_Flammen_Dschinn'], _ + [1382, 'Freezing_Gust', 'Gefrierende_Böe'], _ + [1390, 'Judges_Intervention', 'Intervention_des_Richters'], _ + [1391, 'Supportive_Spirit', 'Unterstützender_Geist'], _ + [1392, 'Watchful_Healing', 'Wachsame_Heilung'], _ + [1393, 'Healers_Boon', 'Segen_des_Heilers'], _ + [1394, 'Healers_Covenant', 'Verpflichtung_des_Heilers'], _ + [1395, 'Balthazars_Pendulum', 'Balthasars_Pendel'], _ + [1396, 'Words_of_Comfort', 'Tröstende_Worte'], _ + [1397, 'Light_of_Deliverance', 'Licht_der_Erlösung'], _ + [1398, 'Scourge_Enchantment', 'Geißelverzauberung'], _ + [1399, 'Shield_of_Absorption', 'Schild_der_Absorption'], _ + [1400, 'Reversal_of_Damage', 'Umkehrung_des_Schadens'], _ + [1401, 'Mending_Touch', 'Genesungsberührung'], _ + [1402, 'Critical_Chop', 'Kritischer_Hieb'], _ + [1403, 'Agonizing_Chop', 'Qualvoller_Hieb'], _ + [1404, 'Flail', 'Dreschen'], _ + [1405, 'Charging_Strike', 'Angreifender_Schlag'], _ + [1406, 'Headbutt', 'Kopfstoß'], _ + [1407, 'Lions_Comfort', 'Trost_des_Löwen'], _ + [1408, 'Rage_of_the_Ntouka', 'Wut_des_Ntouka'], _ + [1409, 'Mokele_Smash', 'Mokele_Schlag'], _ + [1410, 'Overbearing_Smash', 'Anmaßender_Schlag'], _ + [1411, 'Signet_of_Stamina', 'Siegel_der_Ausdauer'], _ + [1412, 'Youre_All_Alone', 'Ihr_seid_ganz_allein'], _ + [1413, 'Burst_of_Aggression', 'Aggressiver_Ausbruch'], _ + [1414, 'Enraging_Charge', 'Wütender_Angriff'], _ + [1415, 'Crippling_Slash', 'Verkrüppelnder_Hieb'], _ + [1416, 'Barbarous_Slice', 'Barbarischer_Schnitt'], _ + [1465, 'Prepared_Shot', 'Vorbereiteter_Schuss'], _ + [1466, 'Burning_Arrow', 'Brennender_Pfeil'], _ + [1467, 'Arcing_Shot', 'Bogenschuss'], _ + [1468, 'Strike_as_One', 'Gemeinsam_zuschlagen'], _ + [1469, 'Crossfire', 'Kreuzfeuer'], _ + [1470, 'Barbed_Arrows', 'Stachelpfeile'], _ + [1471, 'Scavengers_Focus', 'Fokus_des_Plünderers'], _ + [1472, 'Toxicity', 'Giftigkeit'], _ + [1473, 'Quicksand', 'Treibsand'], _ + [1474, 'Storms_Embrace', 'Umarmung_des_Sturms'], _ + [1475, 'Trappers_Speed', 'Geschwindigkeit_des_Fallenstellers'], _ + [1476, 'Tripwire', 'Stolperdraht'], _ + [1478, 'Renewing_Surge', 'Erneuernde_Welle'], _ + [1479, 'Offering_of_Spirit', 'Opfer_des_Geistes'], _ + [1480, 'Spirits_Gift', 'Geschenk_des_Geistes'], _ + [1481, 'Death_Pact_Signet', 'Todespakt_Siegel'], _ + [1482, 'Reclaim_Essence', 'Essenz_zurückfordern'], _ + [1483, 'Banishing_Strike', 'Bannstoß'], _ + [1484, 'Mystic_Sweep', 'Mystischer_Schwung'], _ + [1485, 'Eremites_Attack', 'Angriff_des_Eremiten'], _ + [1486, 'Reap_Impurities', 'Unreinheiten_ausnutzen'], _ + [1487, 'Twin_Moon_Sweep', 'Doppelter_Mondschwung'], _ + [1488, 'Victorious_Sweep', 'Siegreicher_Schwung'], _ + [1489, 'Irresistible_Sweep', 'Unwiderstehlicher_Schwung'], _ + [1490, 'Pious_Assault', 'Frommer_Angriff'], _ + [1491, 'Mystic_Twister', 'Mystischer_Wirbelsturm'], _ + [1493, 'Grenths_Fingers', 'Grenths_Finger'], _ + [1495, 'Aura_of_Thorns', 'Dornenaura'], _ + [1496, 'Balthazars_Rage', 'Balthasars_Wut'], _ + [1497, 'Dust_Cloak', 'Staubdecke'], _ + [1498, 'Staggering_Force', 'Umwerfende_Gewalt'], _ + [1499, 'Pious_Renewal', 'Fromme_Erneuerung'], _ + [1500, 'Mirage_Cloak', 'Trugbild_Umhang'], _ + [1502, 'Arcane_Zeal', 'Arkaner_Eifer'], _ + [1503, 'Mystic_Vigor', 'Mystische_Vitalität'], _ + [1504, 'Watchful_Intervention', 'Wachsame_Intervention'], _ + [1505, 'Vow_of_Piety', 'Gelübde_der_Frömmigkeit'], _ + [1506, 'Vital_Boon', 'Wesentliche_Wohltat'], _ + [1507, 'Heart_of_Holy_Flame', 'Herz_der_heiligen_Flamme'], _ + [1508, 'Extend_Enchantments', 'Verzauberungen_ausweiten'], _ + [1509, 'Faithful_Intervention', 'Vertrauensvolle_Intervention'], _ + [1510, 'Sand_Shards', 'Sandscherben'], _ + [1512, 'Lyssas_Haste', 'Lyssas_Eile'], _ + [1513, 'Guiding_Hands', 'Lenkende_Hände'], _ + [1514, 'Fleeting_Stability', 'Flüchtige_Stabilität'], _ + [1515, 'Armor_of_Sanctity', 'Rüstung_der_Heiligkeit'], _ + [1516, 'Mystic_Regeneration', 'Mystische_Regeneration'], _ + [1517, 'Vow_of_Silence', 'Schweigegelübde'], _ + [1518, 'Avatar_of_Balthazar', 'Balthasars_Avatar'], _ + [1519, 'Avatar_of_Dwayna', 'Dwaynas_Avatar'], _ + [1520, 'Avatar_of_Grenth', 'Grenths_Avatar'], _ + [1521, 'Avatar_of_Lyssa', 'Lyssas_Avatar'], _ + [1522, 'Avatar_of_Melandru', 'Melandrus_Avatar'], _ + [1523, 'Meditation', 'Meditation'], _ + [1524, 'Eremites_Zeal', 'Eifer_des_Eremiten'], _ + [1525, 'Natural_Healing', 'Natürliche_Heilung'], _ + [1526, 'Imbue_Health', 'Mit_Leben_durchdringen'], _ + [1527, 'Mystic_Healing', 'Mystische_Heilung'], _ + [1528, 'Dwaynas_Touch', 'Dwaynas_Berührung'], _ + [1529, 'Pious_Restoration', 'Fromme_Wiederherstellung'], _ + [1530, 'Signet_of_Pious_Light', 'Siegel_des_frommen_Lichts'], _ + [1531, 'Intimidating_Aura', 'Einschüchternde_Aura'], _ + [1532, 'Mystic_Sandstorm', 'Mystischer_Sandsturm'], _ + [1533, 'Winds_of_Disenchantment', 'Wind_der_Entzauberung'], _ + [1534, 'Rending_Touch', 'Zerreißende_Berührung'], _ + [1535, 'Crippling_Sweep', 'Verkrüppelnder_Schwung'], _ + [1536, 'Wounding_Strike', 'Verwundender_Schlag'], _ + [1537, 'Wearying_Strike', 'Ermüdender_Schlag'], _ + [1538, 'Lyssas_Assault', 'Lyssas_Angriff'], _ + [1539, 'Chilling_Victory', 'Kühler_Sieg'], _ + [1540, 'Conviction', 'Überzeugung'], _ + [1541, 'Enchanted_Haste', 'Verzauberte_Eile'], _ + [1542, 'Pious_Concentration', 'Fromme_Konzentration'], _ + [1543, 'Pious_Haste', 'Fromme_Eile'], _ + [1544, 'Whirling_Charge', 'Wirbelangriff'], _ + [1545, 'Test_of_Faith', 'Glaubensprüfung'], _ + [1546, 'Blazing_Spear', 'Lodernder_Speer'], _ + [1547, 'Mighty_Throw', 'Mächtiger_Wurf'], _ + [1548, 'Cruel_Spear', 'Grausamer_Speer'], _ + [1549, 'Harriers_Toss', 'Wurf_des_Läufers'], _ + [1550, 'Unblockable_Throw', 'Unblockbarer_Wurf'], _ + [1551, 'Spear_of_Lightning', 'Speer_des_Blitzes'], _ + [1552, 'Wearying_Spear', 'Ermüdender_Speer'], _ + [1553, 'Anthem_of_Fury', 'Hymne_der_Wut'], _ + [1554, 'Crippling_Anthem', 'Verkrüppelungs_Hymne'], _ + [1555, 'Defensive_Anthem', 'Verteidigungshymne'], _ + [1556, 'Godspeed', 'Gute_Reise'], _ + [1557, 'Anthem_of_Flame', 'Hymne_der_Flamme'], _ + [1558, 'Go_for_the_Eyes', 'Zielt_auf_die_Augen'], _ + [1559, 'Anthem_of_Envy', 'Hymne_des_Neids'], _ + [1560, 'Song_of_Power', 'Machtgesang'], _ + [1561, 'Zealous_Anthem', 'Eifrige_Hymne'], _ + [1562, 'Aria_of_Zeal', 'Arie_des_Eifers'], _ + [1563, 'Lyric_of_Zeal', 'Lyrik_des_Eifers'], _ + [1564, 'Ballad_of_Restoration', 'Ballade_der_Wiederherstellung'], _ + [1565, 'Chorus_of_Restoration', 'Chor_der_Wiederherstellung'], _ + [1566, 'Aria_of_Restoration', 'Arie_der_Wiederherstellung'], _ + [1567, 'Song_of_Concentration', 'Lied_der_Konzentration'], _ + [1568, 'Anthem_of_Guidance', 'Hymne_der_Führung'], _ + [1569, 'Energizing_Chorus', 'Energie_bringender_Chor'], _ + [1570, 'Song_of_Purification', 'Lied_der_Läuterung'], _ + [1571, 'Hexbreaker_Aria', 'Verhexungsbrech_Arie'], _ + [1572, 'Brace_Yourself', 'Seid_vorbereitet'], _ + [1573, 'Awe', 'Ehrfurcht'], _ + [1574, 'Enduring_Harmony', 'Dauerhafte_Harmonie'], _ + [1575, 'Blazing_Finale', 'Loderndes_Finale'], _ + [1576, 'Burning_Refrain', 'Brennender_Refrain'], _ + [1577, 'Finale_of_Restoration', 'Finale_der_Wiederherstellung'], _ + [1578, 'Mending_Refrain', 'Genesungsrefrain'], _ + [1579, 'Purifying_Finale', 'Reinigendes_Finale'], _ + [1580, 'Bladeturn_Refrain', 'Klingenumkehr_Refrain'], _ + [1581, 'Glowing_Signet', 'Glühendes_Siegel'], _ + [1583, 'Leaders_Zeal', 'Eifer_des_Anführers'], _ + [1584, 'Leaders_Comfort', 'Trost_des_Anführers'], _ + [1585, 'Signet_of_Synergy', 'Siegel_der_Synergie'], _ + [1586, 'Angelic_Protection', 'Engelsschutz'], _ + [1587, 'Angelic_Bond', 'Engelsbindung'], _ + [1588, 'Cautery_Signet', 'Siegel_der_Verätzung'], _ + [1589, 'Stand_Your_Ground', 'Haltet_Eure_Stellung'], _ + [1590, 'Lead_the_Way', 'Geht_voran'], _ + [1591, 'Make_Haste', 'Beeilt_Euch'], _ + [1592, 'We_Shall_Return', 'Wir_werden_wiederkommen'], _ + [1593, 'Never_Give_Up', 'Gebt_nicht_auf'], _ + [1594, 'Help_Me', 'Helft_mir'], _ + [1595, 'Fall_Back', 'Zieht_Euch_zurück'], _ + [1596, 'Incoming', 'Schon_unterwegs'], _ + [1597, 'Theyre_on_Fire', 'Sie_brennen'], _ + [1598, 'Never_Surrender', 'Ergebt_Euch_nicht'], _ + [1599, 'Its_Just_a_Flesh_Wound', 'Es_ist_nur_eine_Fleischwunde'], _ + [1600, 'Barbed_Spear', 'Stachelspeer'], _ + [1601, 'Vicious_Attack', 'Bösartiger_Angriff'], _ + [1602, 'Stunning_Strike', 'Betäubender_Schlag'], _ + [1603, 'Merciless_Spear', 'Unbarmherziger_Speer'], _ + [1604, 'Disrupting_Throw', 'Unterbrechender_Wurf'], _ + [1605, 'Wild_Throw', 'Wilder_Wurf'], _ + [1633, 'Malicious_Strike', 'Böswilliger_Stoß'], _ + [1634, 'Shattering_Assault', 'Vernichtender_Angriff'], _ + [1635, 'Golden_Skull_Strike', 'Goldener_Schädel_Stoß'], _ + [1636, 'Black_Spider_Strike', 'Schwarzer_Spinnen_Stoß'], _ + [1637, 'Golden_Fox_Strike', 'Goldener_Fuchs_Stoß'], _ + [1638, 'Deadly_Haste', 'Tödliche_Eile'], _ + [1639, 'Assassins_Remedy', 'Mittel_des_Assassinen'], _ + [1640, 'Foxs_Promise', 'Versprechen_des_Fuchses'], _ + [1641, 'Feigned_Neutrality', 'Vorgetäuschte_Neutralität'], _ + [1642, 'Hidden_Caltrops', 'Versteckte_Trittnägel'], _ + [1643, 'Assault_Enchantments', 'Verzauberungen_angreifen'], _ + [1644, 'Wastrels_Collapse', 'Verfall_des_Verschwenders'], _ + [1645, 'Lift_Enchantment', 'Verzauberung_lösen'], _ + [1646, 'Augury_of_Death', 'Todesomen'], _ + [1647, 'Signet_of_Toxic_Shock', 'Siegel_des_toxischen_Schocks'], _ + [1648, 'Signet_of_Twilight', 'Siegel_des_Zwielichts'], _ + [1649, 'Way_of_the_Assassin', 'Weg_des_Assassinen'], _ + [1650, 'Shadow_Walk', 'Schattenmarsch'], _ + [1651, 'Deaths_Retreat', 'Rückzug_des_Todes'], _ + [1652, 'Shadow_Prison', 'Schattengefängnis'], _ + [1653, 'Swap', 'Tauschen'], _ + [1654, 'Shadow_Meld', 'Schattenverschmelzung'], _ + [1655, 'Price_of_Pride', 'Preis_des_Stolzes'], _ + [1656, 'Air_of_Disenchantment', 'Flair_der_Entzauberung'], _ + [1657, 'Signet_of_Clumsiness', 'Siegel_der_Unbeholfenheit'], _ + [1658, 'Symbolic_Posture', 'Symbolische_Haltung'], _ + [1659, 'Toxic_Chill', 'Toxische_Kälte'], _ + [1660, 'Well_of_Silence', 'Brunnen_der_Stille'], _ + [1661, 'Glowstone', 'Leuchtstein'], _ + [1662, 'Mind_Blast', 'Geistige_Explosion'], _ + [1663, 'Elemental_Flame', 'Elementare_Flamme'], _ + [1664, 'Invoke_Lightning', 'Blitz_herbeirufen'], _ + [1683, 'Pensive_Guardian', 'Nachdenklicher_Wächter'], _ + [1684, 'Scribes_Insight', 'Einblick_des_Schreibers'], _ + [1685, 'Holy_Haste', 'Heilige_Eile'], _ + [1686, 'Glimmer_of_Light', 'Lichtschimmer'], _ + [1687, 'Zealous_Benediction', 'Eifrige_Segnung'], _ + [1688, 'Defenders_Zeal', 'Eifer_des_Verteidigers'], _ + [1689, 'Signet_of_Mystic_Wrath', 'Siegel_des_mystischen_Zorns'], _ + [1690, 'Signet_of_Removal', 'Siegel_der_Entfernung'], _ + [1691, 'Dismiss_Condition', 'Zustand_aufheben'], _ + [1692, 'Divert_Hexes', 'Verhexungen_umleiten'], _ + [1693, 'Counterattack', 'Gegenangriff'], _ + [1694, 'Magehunter_Strike', 'Magierschlag'], _ + [1695, 'Soldiers_Strike', 'Soldatenstoß'], _ + [1696, 'Decapitate', 'Köpfen'], _ + [1697, 'Magehunters_Smash', 'Magiejägerschmetterer'], _ + [1698, 'Soldiers_Stance', 'Soldaten_Haltung'], _ + [1699, 'Soldiers_Defense', 'Soldaten_Verteidigung'], _ + [1700, 'Frenzied_Defense', 'Fieberhafte_Verteidigung'], _ + [1701, 'Steady_Stance', 'Ruhige_Haltung'], _ + [1702, 'Steelfang_Slash', 'Hieb_des_stählernen_Fangzahns'], _ + [1719, 'Screaming_Shot', 'Schreischuss'], _ + [1720, 'Keen_Arrow', 'Scharfer_Pfeil'], _ + [1721, 'Rampage_as_One', 'Gemeinsam_toben'], _ + [1722, 'Forked_Arrow', 'Gegabelter_Pfeil'], _ + [1723, 'Disrupting_Accuracy', 'Unterbrechende_Genauigkeit'], _ + [1724, 'Experts_Dexterity', 'Gewandtheit_des_Profis'], _ + [1725, 'Roaring_Winds', 'Tosender_Wind'], _ + [1726, 'Magebane_Shot', 'Verderben_des_Magiers_Schuss'], _ + [1727, 'Natural_Stride', 'Natürlicher_Schwung'], _ + [1728, 'Hekets_Rampage', 'Heket_Toben'], _ + [1729, 'Smoke_Trap', 'Rauchfalle'], _ + [1730, 'Infuriating_Heat', 'Irritierende_Hitze'], _ + [1731, 'Vocal_Was_Sogolon', 'Lautstark_war_Sogolon'], _ + [1732, 'Destructive_Was_Glaive', 'Vernichtend_war_Glaive'], _ + [1733, 'Wielders_Strike', 'Stoß_des_Ausübers'], _ + [1734, 'Gaze_of_Fury', 'Wütendes_Starren'], _ + [1736, 'Spirits_Strength', 'Geistesstärke'], _ + [1737, 'Wielders_Zeal', 'Eifer_des_Ausübers'], _ + [1738, 'Sight_Beyond_Sight', 'Sicht_jenseits_der_Sicht'], _ + [1739, 'Renewing_Memories', 'Erneuernde_Erinnerungen'], _ + [1740, 'Wielders_Remedy', 'Mittel_des_Ausübers'], _ + [1741, 'Ghostmirror_Light', 'Geisterspiegel_Licht'], _ + [1742, 'Signet_of_Ghostly_Might', 'Siegel_der_Macht_der_Geister'], _ + [1743, 'Signet_of_Binding', 'Siegel_der_Bindung'], _ + [1744, 'Caretakers_Charge', 'Angriff_des_Verwalters'], _ + [1745, 'Anguish', 'Qual'], _ + [1747, 'Empowerment', 'Ermächtigung'], _ + [1748, 'Recovery', 'Gesundung'], _ + [1749, 'Weapon_of_Fury', 'Waffe_der_Wut'], _ + [1750, 'Xinraes_Weapon', 'Xinraes_Waffe'], _ + [1751, 'Warmongers_Weapon', 'Waffe_des_Kriegshetzers'], _ + [1752, 'Weapon_of_Remedy', 'Waffe_der_Behebung'], _ + [1753, 'Rending_Sweep', 'Zerreißender_Schwung'], _ + [1754, 'Onslaught', 'Attacke'], _ + [1755, 'Mystic_Corruption', 'Mystische_Verdorbenheit'], _ + [1756, 'Grenths_Grasp', 'Grenths_Griff'], _ + [1757, 'Veil_of_Thorns', 'Dornenschleier'], _ + [1758, 'Harriers_Grasp', 'Griff_des_Läufers'], _ + [1759, 'Vow_of_Strength', 'Gelübde_der_Stärke'], _ + [1760, 'Ebon_Dust_Aura', 'Ebon_Staubaura'], _ + [1761, 'Zealous_Vow', 'Eifriges_Gelübde'], _ + [1762, 'Heart_of_Fury', 'Herz_der_Wut'], _ + [1763, 'Zealous_Renewal', 'Eifrige_Erneuerung'], _ + [1764, 'Attackers_Insight', 'Einblick_des_Angreifers'], _ + [1765, 'Rending_Aura', 'Zerreißende_Aura'], _ + [1766, 'Featherfoot_Grace', 'Anmut_des_Federfußes'], _ + [1767, 'Reapers_Sweep', 'Schwung_des_Schnitters'], _ + [1768, 'Harriers_Haste', 'Eile_des_Läufers'], _ + [1769, 'Focused_Anger', 'Konzentrierter_Zorn'], _ + [1770, 'Natural_Temper', 'Natürliche_Laune'], _ + [1771, 'Song_of_Restoration', 'Gesang_der_Wiederherstellung'], _ + [1772, 'Lyric_of_Purification', 'Lyrik_der_Läuterung'], _ + [1773, 'Soldiers_Fury', 'Wut_des_Soldaten'], _ + [1774, 'Aggressive_Refrain', 'Aggressiver_Refrain'], _ + [1775, 'Energizing_Finale', 'Energie_bringendes_Finale'], _ + [1776, 'Signet_of_Aggression', 'Siegel_der_Aggression'], _ + [1777, 'Remedy_Signet', 'Heilmittel_Siegel'], _ + [1778, 'Signet_of_Return', 'Siegel_der_Wiederkehr'], _ + [1779, 'Make_Your_Time', 'Nehmt_Euch_Zeit'], _ + [1780, 'Cant_Touch_This', 'Cant_touch_this'], _ + [1781, 'Find_Their_Weakness', 'Findet_ihren_Schwachpunkt'], _ + [1782, 'The_Power_Is_Yours', 'Die_Macht_ist_Euer'], _ + [1783, 'Slayers_Spear', 'Speer_des_Würgers'], _ + [1784, 'Swift_Javelin', 'Schneller_Speer'], _ + [1814, 'Lightbringers_Gaze', 'Blick_des_Lichtbringers'], _ + [1815, 'Lightbringer_Signet', 'Lichtbringer_Siegel'], _ + [1816, 'Sunspear_Rebirth_Signet', 'Sonnenspeer_Wiedergeburtssiegel'], _ + [1948, 'Shadow_Sanctuary_Luxon', 'Schattenzuflucht_Luxon'], _ + [1949, 'Ether_Nightmare_Luxon', 'Äther_Alptraum_Luxon'], _ + [1950, 'Signet_of_Corruption_Luxon', 'Siegel_der_Verdorbenheit_Luxon'], _ + [1951, 'Elemental_Lord_Luxon', 'Elementarlord_Luxon'], _ + [1952, 'Selfless_Spirit_Luxon', 'Selbstloser_Geist_Luxon'], _ + [1953, 'Triple_Shot_Luxon', 'Dreifachschuss_Luxon'], _ + [1954, 'Save_Yourselves_Luxon', 'Rettet_Euch_selbst_Luxon'], _ + [1955, 'Aura_of_Holy_Might_Luxon', 'Aura_der_Heiligen_Macht_Luxon'], _ + [1957, 'Spear_of_Fury_Luxon', 'Speer_der_Wut_Luxon'], _ + [1986, 'Vampiric_Assault', 'Vampirangriff'], _ + [1987, 'Lotus_Strike', 'Lotus_Stoß'], _ + [1988, 'Golden_Fang_Strike', 'Goldfangstoß'], _ + [1990, 'Falling_Lotus_Strike', 'Fallender_Lotus_Stoß'], _ + [1991, 'Sadists_Signet', 'Siegel_des_Sadisten'], _ + [1992, 'Signet_of_Distraction', 'Siegel_der_Ablenkung'], _ + [1993, 'Signet_of_Recall', 'Siegel_der_Zurückrufung'], _ + [1994, 'Power_Lock', 'Kraftsperre'], _ + [1995, 'Waste_Not', 'Spare_in_der_Zeit_'], _ + [1996, 'Sum_of_All_Fears', 'Summe_aller_Ängste'], _ + [1997, 'Withering_Aura', 'Verkümmernde_Aura'], _ + [1998, 'Cacophony', 'Kakophonie'], _ + [1999, 'Winters_Embrace', 'Umarmung_des_Winters'], _ + [2000, 'Earthen_Shackles', 'Irdene_Fesseln'], _ + [2001, 'Ward_of_Weakness', 'Kreis_der_Schwäche'], _ + [2002, 'Glyph_of_Swiftness', 'Glyphe_der_Schnelligkeit'], _ + [2003, 'Cure_Hex', 'Verhexung_heilen'], _ + [2004, 'Smite_Condition', 'Zustand_zerschlagen'], _ + [2005, 'Smiters_Boon', 'Segen_des_Peinigers'], _ + [2006, 'Castigation_Signet', 'Geißelungs_Siegel'], _ + [2007, 'Purifying_Veil', 'Reinigender_Schleier'], _ + [2008, 'Pulverizing_Smash', 'Zermalmender_Schlag'], _ + [2009, 'Keen_Chop', 'Verwegener_Hieb'], _ + [2010, 'Knee_Cutter', 'Knieschneider'], _ + [2011, 'Grapple', 'Raufen'], _ + [2012, 'Radiant_Scythe', 'Strahlende_Sense'], _ + [2013, 'Grenths_Aura', 'Grenths_Aura'], _ + [2014, 'Signet_of_Pious_Restraint', 'Siegel_der_frommen_Zurückhaltung'], _ + [2015, 'Farmers_Scythe', 'Sense_des_Bauern'], _ + [2016, 'Energetic_Was_Lee_Sa', 'Energisch_war_Lee_Sa'], _ + [2017, 'Anthem_of_Weariness', 'Hymne_der_Müdigkeit'], _ + [2018, 'Anthem_of_Disruption', 'Hymne_der_Störung'], _ + [2051, 'Summon_Spirits_Luxon', 'Geister_herbeirufen_Luxon'], _ + [2052, 'Shadow_Fang', 'Schattenfangzahn'], _ + [2053, 'Calculated_Risk', 'Kalkuliertes_Risiko'], _ + [2054, 'Shrinking_Armor', 'Schrumpfende_Rüstung'], _ + [2055, 'Aneurysm', 'Aneurysma'], _ + [2056, 'Wandering_Eye', 'Wanderndes_Auge'], _ + [2057, 'Foul_Feast', 'Widerliches_Gelage'], _ + [2058, 'Putrid_Bile', 'Verwesende_Galle'], _ + [2059, 'Shell_Shock', 'Kriegsneurose'], _ + [2060, 'Glyph_of_Immolation', 'Glyphe_der_Aufopferung'], _ + [2061, 'Patient_Spirit', 'Geduldiger_Geist'], _ + [2062, 'Healing_Ribbon', 'Heilendes_Band'], _ + [2063, 'Aura_of_Stability', 'Aura_der_Stabilität'], _ + [2064, 'Spotless_Mind', 'Makelloser_Verstand'], _ + [2065, 'Spotless_Soul', 'Makellose_Seele'], _ + [2066, 'Disarm', 'Entwaffnen'], _ + [2067, 'I_Meant_to_Do_That', 'Das_war_Absicht'], _ + [2068, 'Rapid_Fire', 'Schnellfeuer'], _ + [2069, 'Sloth_Hunters_Shot', 'Schuss_des_Faultierjägers'], _ + [2070, 'Aura_Slicer', 'Auraschneider'], _ + [2071, 'Zealous_Sweep', 'Eifriger_Schwung'], _ + [2072, 'Pure_Was_Li_Ming', 'Rein_war_Li_Ming'], _ + [2073, 'Weapon_of_Aggression', 'Waffe_der_Aggression'], _ + [2074, 'Chest_Thumper', 'Brusttrommler'], _ + [2075, 'Hasty_Refrain', 'Hastiger_Refrain'], _ + [2091, 'Shadow_Sanctuary_Kurzick', 'Schattenzuflucht_Kurzick'], _ + [2092, 'Ether_Nightmare_Kurzick', 'Äther_Alptraum_Kurzick'], _ + [2093, 'Signet_of_Corruption_Kurzick', 'Siegel_der_Verdorbenheit_Kurzick'], _ + [2094, 'Elemental_Lord_Kurzick', 'Elementarlord_Kurzick'], _ + [2095, 'Selfless_Spirit_Kurzick', 'Selbstloser_Geist_Kurzick'], _ + [2096, 'Triple_Shot_Kurzick', 'Dreifachschuss_Kurzick'], _ + [2097, 'Save_Yourselves_Kurzick', 'Rettet_Euch_selbst_Kurzick'], _ + [2098, 'Aura_of_Holy_Might_Kurzick', 'Aura_der_Heiligen_Macht_Kurzick'], _ + [2099, 'Spear_of_Fury_Kurzick', 'Speer_der_Wut_Kurzick'], _ + [2100, 'Summon_Spirits_Kurzick', 'Geister_herbeirufen_Kurzick'], _ + [2101, 'Critical_Agility', 'Kritische_Beweglichkeit'], _ + [2102, 'Cry_of_Pain', 'Schmerzensschrei'], _ + [2103, 'Necrosis', 'Nekrose'], _ + [2104, 'Intensity', 'Intensität'], _ + [2105, 'Seed_of_Life', 'Lebenssaat'], _ + [2107, 'Whirlwind_Attack', 'Wirbelsturmangriff'], _ + [2108, 'Never_Rampage_Alone', 'Tobt_niemals_allein'], _ + [2109, 'Eternal_Aura', 'Ewige_Aura'], _ + [2110, 'Vampirism', 'Vampirismus'], _ + [2112, 'Theres_Nothing_to_Fear', 'Es_gibt_nichts_zu_befürchten'], _ + [2116, 'Sneak_Attack', 'Überraschungsangriff'], _ + [2135, 'Trampling_Ox', 'Trampelnder_Ochse'], _ + [2136, 'Smoke_Powder_Defense', 'Rauchpulver_Verteidigung'], _ + [2137, 'Confusing_Images', 'Verwirrende_Bilder'], _ + [2138, 'Hexers_Vigor', 'Lebenskraft_des_Verhexers'], _ + [2139, 'Masochism', 'Masochismus'], _ + [2140, 'Piercing_Trap', 'Durchbohrende_Falle'], _ + [2141, 'Companionship', 'Kameradschaft'], _ + [2142, 'Feral_Aggression', 'Wilde_Aggression'], _ + [2143, 'Disrupting_Shot', 'Unterbrechender_Schuss'], _ + [2144, 'Volley', 'Salve'], _ + [2145, 'Expert_Focus', 'Expertenfokus'], _ + [2146, 'Pious_Fury', 'Frommer_Zorn'], _ + [2147, 'Crippling_Victory', 'Verkrüppelnder_Sieg'], _ + [2148, 'Sundering_Weapon', 'Trennende_Waffe'], _ + [2149, 'Weapon_of_Renewal', 'Waffe_der_Erneuerung'], _ + [2150, 'Maiming_Spear', 'Verkrüppelungs_Speer'], _ + [2186, 'Signet_of_Deadly_Corruption', 'Siegel_der_tödlichen_Verdorbenheit'], _ + [2187, 'Way_of_the_Master', 'Weg_des_Meisters'], _ + [2188, 'Defile_Defenses', 'Verteidigung_entweihen'], _ + [2189, 'Angorodons_Gaze', 'Angorodons_Starren'], _ + [2190, 'Magnetic_Surge', 'Magnetschub'], _ + [2191, 'Slippery_Ground', 'Rutschiger_Boden'], _ + [2192, 'Glowing_Ice', 'Leuchtendes_Eis'], _ + [2193, 'Energy_Blast', 'Energieexplosion'], _ + [2194, 'Distracting_Strike', 'Ablenkender_Stoß'], _ + [2195, 'Symbolic_Strike', 'Symbolischer_Schlag'], _ + [2196, 'Soldiers_Speed', 'Geschwindigkeit_des_Soldaten'], _ + [2197, 'Body_Blow', 'Körperschlag'], _ + [2198, 'Body_Shot', 'Körperschuss'], _ + [2199, 'Poison_Tip_Signet', 'Giftspitzen_Siegel'], _ + [2200, 'Signet_of_Mystic_Speed', 'Siegel_der_mystischen_Geschwindigkeit'], _ + [2201, 'Shield_of_Force', 'Kraftschild'], _ + [2202, 'Mending_Grip', 'Genesungsgriff'], _ + [2203, 'Spiritleech_Aura', 'Geistsauger_Aura'], _ + [2204, 'Rejuvenation', 'Verjüngung'], _ + [2205, 'Agony', 'Todesqual'], _ + [2206, 'Ghostly_Weapon', 'Geisterwaffe'], _ + [2207, 'Inspirational_Speech', 'Inspirative_Rede'], _ + [2208, 'Burning_Shield', 'Brennender_Schild'], _ + [2209, 'Holy_Spear', 'Heiliger_Speer'], _ + [2210, 'Spear_Swipe', 'Speerschlag'], _ + [2211, 'Alkars_Alchemical_Acid', 'Alkars_Alchemiesäure'], _ + [2212, 'Light_of_Deldrimor', 'Licht_von_Deldrimor'], _ + [2213, 'Ear_Bite', 'Ohrenbiss'], _ + [2214, 'Low_Blow', 'Unter_der_Gürtellinie'], _ + [2215, 'Brawling_Headbutt', 'Rauf_Kopfstoß'], _ + [2216, 'Dont_Trip', 'Stolpert_nicht'], _ + [2217, 'By_Urals_Hammer', 'Bei_Urals_Hammer'], _ + [2218, 'Drunken_Master', 'Betrunkener_Meister'], _ + [2219, 'Great_Dwarf_Weapon', 'Waffe_des_Großen_Zwergs'], _ + [2220, 'Great_Dwarf_Armor', 'Rüstung_des_Großen_Zwergs'], _ + [2221, 'Breath_of_the_Great_Dwarf', 'Atem_des_Großen_Zwergs'], _ + [2222, 'Snow_Storm', 'Schneesturm'], _ + [2223, 'Black_Powder_Mine', 'Schwarzpulvermine'], _ + [2224, 'Summon_Mursaat', 'Mursaat_herbeirufen'], _ + [2225, 'Summon_Ruby_Djinn', 'Rubin_Dschinn_herbeirufen'], _ + [2226, 'Summon_Ice_Imp', 'Eis_Kobold_herbeirufen'], _ + [2227, 'Summon_Naga_Shaman', 'Naga_Schamanen_herbeirufen'], _ + [2228, 'Deft_Strike', 'Geschickter_Schlag'], _ + [2229, 'Signet_of_Infection', 'Siegel_der_Infektion'], _ + [2230, 'Tryptophan_Signet', 'Tryptophan_Siegel'], _ + [2231, 'Ebon_Battle_Standard_of_Courage', 'Ebon_Kampfstandarte_des_Mutes'], _ + [2232, 'Ebon_Battle_Standard_of_Wisdom', 'Ebon_Kampfstandarte_der_Weisheit'], _ + [2233, 'Ebon_Battle_Standard_of_Honor', 'Ebon_Kampfstandarte_der_Ehre'], _ + [2234, 'Ebon_Vanguard_Sniper_Support', 'Ebon_Vorhut_Heckenschützen_Unterstützung'], _ + [2235, 'Ebon_Vanguard_Assassin_Support', 'Ebon_Vorhut_Assassinen_Unterstützung'], _ + [2236, 'Well_of_Ruin', 'Brunnen_des_Ruins'], _ + [2237, 'Atrophy', 'Schwund'], _ + [2238, 'Spear_of_Redemption', 'Speer_der_Erlösung'], _ + [2353, 'Finish_Him', 'Erledigt_ihn'], _ + [2354, 'Dodge_This', 'Weicht_aus'], _ + [2355, 'I_Am_the_Strongest', 'Ich_bin_am_stärksten'], _ + [2356, 'I_Am_Unstoppable', 'Ich_bin_unaufhaltbar'], _ + [2357, 'A_Touch_of_Guile', 'Ein_Funken_Arglist'], _ + [2358, 'You_Move_Like_a_Dwarf', 'Ihr_bewegt_Euch_wie_ein_Zwerg'], _ + [2359, 'You_Are_All_Weaklings', 'Ihr_seid_alle_Schwächlinge'], _ + [2360, 'Feel_No_Pain', 'Den_Schmerz_nicht_spüren'], _ + [2361, 'Club_of_a_Thousand_Bears', 'Tausend_Bären_Prügel'], _ + [2374, 'Ursan_Blessing', 'Segen_der_Bärin'], _ + [2379, 'Volfen_Blessing', 'Segen_des_Wolfes'], _ + [2384, 'Raven_Blessing', 'Segen_des_Raben'], _ + [2411, 'Mindbender', 'Geistbrecher'], _ + [2412, 'Smooth_Criminal', 'Durchtriebener_Krimineller'], _ + [2413, 'Technobabble', 'Technobabbel'], _ + [2414, 'Radiation_Field', 'Strahlungsfeld'], _ + [2415, 'Asuran_Scan', 'Asurischer_Scan'], _ + [2416, 'Air_of_Superiority', 'Hochnäsigkeit'], _ + [2417, 'Mental_Block', 'Geistige_Sperre'], _ + [2418, 'Pain_Inverter', 'Schmerztauscher'], _ + [2420, 'Ebon_Escape', 'Ebon_Flucht'], _ + [2421, 'Weakness_Trap', 'Schwäche_Falle'], _ + [2422, 'Winds', 'Winde'], _ + [2423, 'Dwarven_Stability', 'Zwergenstabilität'], _ + [2551, 'Veteran Norn Hunting Party', 'none']] diff --git a/gwApi/array_skillnames.au3 b/gwApi/array_skillnames.au3 index 097a4cf..ce12604 100644 --- a/gwApi/array_skillnames.au3 +++ b/gwApi/array_skillnames.au3 @@ -1,2987 +1,2988 @@ -#include-once - -Global $aArray_Of_Skill_Names[3407][2] = [ _ - [1, "Healing Signet"], _ - [2, "Resurrection Signet"], _ - [3, "Signet of Capture"], _ - [4, "BAMPH"], _ - [5, "Power Block"], _ - [6, "Mantra of Earth"], _ - [7, "Mantra of Flame"], _ - [8, "Mantra of Frost"], _ - [9, "Mantra of Lightning"], _ - [10, "Hex Breaker"], _ - [11, "Distortion"], _ - [12, "Mantra of Celerity"], _ - [13, "Mantra of Recovery"], _ - [14, "Mantra of Persistence"], _ - [15, "Mantra of Inscriptions"], _ - [16, "Mantra of Concentration"], _ - [17, "Mantra of Resolve"], _ - [18, "Mantra of Signets"], _ - [19, "Fragility"], _ - [20, "Confusion"], _ - [21, "Inspired Enchantment"], _ - [22, "Inspired Hex"], _ - [23, "Power Spike"], _ - [24, "Power Leak"], _ - [25, "Power Drain"], _ - [26, "Empathy"], _ - [27, "Shatter Delusions"], _ - [28, "Backfire"], _ - [29, "Blackout"], _ - [30, "Diversion"], _ - [31, "Conjure Phantasm"], _ - [32, "Illusion of Weakness"], _ - [33, "Illusionary Weaponry"], _ - [34, "Sympathetic Visage"], _ - [35, "Ignorance"], _ - [36, "Arcane Conundrum"], _ - [37, "Illusion of Haste"], _ - [38, "Channeling"], _ - [39, "Energy Surge"], _ - [40, "Ether Feast"], _ - [41, "Ether Lord"], _ - [42, "Energy Burn"], _ - [43, "Clumsiness"], _ - [44, "Phantom Pain"], _ - [45, "Ethereal Burden"], _ - [46, "Guilt"], _ - [47, "Ineptitude"], _ - [48, "Spirit of Failure"], _ - [49, "Mind Wrack"], _ - [50, "Wastrels Worry"], _ - [51, "Shame"], _ - [52, "Panic"], _ - [53, "Migraine"], _ - [54, "Crippling Anguish"], _ - [55, "Fevered Dreams"], _ - [56, "Soothing Images"], _ - [57, "Cry of Frustration"], _ - [58, "Signet of Midnight"], _ - [59, "Signet of Weariness"], _ - [60, "Signet of Illusions (beta version)"], _ - [61, "Leech Signet"], _ - [62, "Signet of Humility"], _ - [63, "Keystone Signet"], _ - [64, "Mimic"], _ - [65, "Arcane Mimicry"], _ - [66, "Spirit Shackles"], _ - [67, "Shatter Hex"], _ - [68, "Drain Enchantment"], _ - [69, "Shatter Enchantment"], _ - [70, "Disappear"], _ - [71, "Unnatural Signet (alpha version)"], _ - [72, "Elemental Resistance"], _ - [73, "Physical Resistance"], _ - [74, "Echo"], _ - [75, "Arcane Echo"], _ - [76, "Imagined Burden"], _ - [77, "Chaos Storm"], _ - [78, "Epidemic"], _ - [79, "Energy Drain"], _ - [80, "Energy Tap"], _ - [81, "Arcane Thievery"], _ - [82, "Mantra of Recall"], _ - [83, "Animate Bone Horror"], _ - [84, "Animate Bone Fiend"], _ - [85, "Animate Bone Minions"], _ - [86, "Grenths Balance"], _ - [87, "Veratas Gaze"], _ - [88, "Veratas Aura"], _ - [89, "Deathly Chill"], _ - [90, "Veratas Sacrifice"], _ - [91, "Well of Power"], _ - [92, "Well of Blood"], _ - [93, "Well of Suffering"], _ - [94, "Well of the Profane"], _ - [95, "Putrid Explosion"], _ - [96, "Soul Feast"], _ - [97, "Necrotic Traversal"], _ - [98, "Consume Corpse"], _ - [99, "Parasitic Bond"], _ - [100, "Soul Barbs"], _ - [101, "Barbs"], _ - [102, "Shadow Strike"], _ - [103, "Price of Failure"], _ - [104, "Death Nova"], _ - [105, "Deathly Swarm"], _ - [106, "Rotting Flesh"], _ - [107, "Virulence"], _ - [108, "Suffering"], _ - [109, "Life Siphon"], _ - [110, "Unholy Feast"], _ - [111, "Awaken the Blood"], _ - [112, "Desecrate Enchantments"], _ - [113, "Tainted Flesh"], _ - [114, "Aura of the Lich"], _ - [115, "Blood Renewal"], _ - [116, "Dark Aura"], _ - [117, "Enfeeble"], _ - [118, "Enfeebling Blood"], _ - [119, "Blood is Power"], _ - [120, "Blood of the Master"], _ - [121, "Spiteful Spirit"], _ - [122, "Malign Intervention"], _ - [123, "Insidious Parasite"], _ - [124, "Spinal Shivers"], _ - [125, "Wither"], _ - [126, "Life Transfer"], _ - [127, "Mark of Subversion"], _ - [128, "Soul Leech"], _ - [129, "Defile Flesh"], _ - [130, "Demonic Flesh"], _ - [131, "Barbed Signet"], _ - [132, "Plague Signet"], _ - [133, "Dark Pact"], _ - [134, "Order of Pain"], _ - [135, "Faintheartedness"], _ - [136, "Shadow of Fear"], _ - [137, "Rigor Mortis"], _ - [138, "Dark Bond"], _ - [139, "Infuse Condition"], _ - [140, "Malaise"], _ - [141, "Rend Enchantments"], _ - [142, "Lingering Curse"], _ - [143, "Strip Enchantment"], _ - [144, "Chilblains"], _ - [145, "Signet of Agony"], _ - [146, "Offering of Blood"], _ - [147, "Dark Fury"], _ - [148, "Order of the Vampire"], _ - [149, "Plague Sending"], _ - [150, "Mark of Pain"], _ - [151, "Feast of Corruption"], _ - [152, "Taste of Death"], _ - [153, "Vampiric Gaze"], _ - [154, "Plague Touch"], _ - [155, "Vile Touch"], _ - [156, "Vampiric Touch"], _ - [157, "Blood Ritual"], _ - [158, "Touch of Agony"], _ - [159, "Weaken Armor"], _ - [160, "Windborne Speed"], _ - [161, "Lightning Storm"], _ - [162, "Gale"], _ - [163, "Whirlwind"], _ - [164, "Elemental Attunement"], _ - [165, "Armor of Earth"], _ - [166, "Kinetic Armor"], _ - [167, "Eruption"], _ - [168, "Magnetic Aura"], _ - [169, "Earth Attunement"], _ - [170, "Earthquake"], _ - [171, "Stoning"], _ - [172, "Stone Daggers"], _ - [173, "Grasping Earth"], _ - [174, "Aftershock"], _ - [175, "Ward Against Elements"], _ - [176, "Ward Against Melee"], _ - [177, "Ward Against Foes"], _ - [178, "Ether Prodigy"], _ - [179, "Incendiary Bonds"], _ - [180, "Aura of Restoration"], _ - [181, "Ether Renewal"], _ - [182, "Conjure Flame"], _ - [183, "Inferno"], _ - [184, "Fire Attunement"], _ - [185, "Mind Burn"], _ - [186, "Fireball"], _ - [187, "Meteor"], _ - [188, "Flame Burst"], _ - [189, "Rodgorts Invocation"], _ - [190, "Mark of Rodgort"], _ - [191, "Immolate"], _ - [192, "Meteor Shower"], _ - [193, "Phoenix"], _ - [194, "Flare"], _ - [195, "Lava Font"], _ - [196, "Searing Heat"], _ - [197, "Fire Storm"], _ - [198, "Glyph of Elemental Power"], _ - [199, "Glyph of Energy"], _ - [200, "Glyph of Lesser Energy"], _ - [201, "Glyph of Concentration"], _ - [202, "Glyph of Sacrifice"], _ - [203, "Glyph of Renewal"], _ - [204, "Rust"], _ - [205, "Lightning Surge"], _ - [206, "Armor of Frost"], _ - [207, "Conjure Frost"], _ - [208, "Water Attunement"], _ - [209, "Mind Freeze"], _ - [210, "Ice Prison"], _ - [211, "Ice Spikes"], _ - [212, "Frozen Burst"], _ - [213, "Shard Storm"], _ - [214, "Ice Spear"], _ - [215, "Maelstrom"], _ - [216, "Iron Mist"], _ - [217, "Crystal Wave"], _ - [218, "Obsidian Flesh"], _ - [219, "Obsidian Flame"], _ - [220, "Blinding Flash"], _ - [221, "Conjure Lightning"], _ - [222, "Lightning Strike"], _ - [223, "Chain Lightning"], _ - [224, "Enervating Charge"], _ - [225, "Air Attunement"], _ - [226, "Mind Shock"], _ - [227, "Glimmering Mark"], _ - [228, "Thunderclap"], _ - [229, "Lightning Orb"], _ - [230, "Lightning Javelin"], _ - [231, "Shock"], _ - [232, "Lightning Touch"], _ - [233, "Swirling Aura"], _ - [234, "Deep Freeze"], _ - [235, "Blurred Vision"], _ - [236, "Mist Form"], _ - [237, "Water Trident"], _ - [238, "Armor of Mist"], _ - [239, "Ward Against Harm"], _ - [240, "Smite"], _ - [241, "Life Bond"], _ - [242, "Balthazars Spirit"], _ - [243, "Strength of Honor"], _ - [244, "Life Attunement"], _ - [245, "Protective Spirit"], _ - [246, "Divine Intervention"], _ - [247, "Symbol of Wrath"], _ - [248, "Retribution"], _ - [249, "Holy Wrath"], _ - [250, "Essence Bond"], _ - [251, "Scourge Healing"], _ - [252, "Banish"], _ - [253, "Scourge Sacrifice"], _ - [254, "Vigorous Spirit"], _ - [255, "Watchful Spirit"], _ - [256, "Blessed Aura"], _ - [257, "Aegis"], _ - [258, "Guardian"], _ - [259, "Shield of Deflection"], _ - [260, "Aura of Faith"], _ - [261, "Shield of Regeneration"], _ - [262, "Shield of Judgment"], _ - [263, "Protective Bond"], _ - [264, "Pacifism"], _ - [265, "Amity"], _ - [266, "Peace and Harmony"], _ - [267, "Judges Insight"], _ - [268, "Unyielding Aura"], _ - [269, "Mark of Protection"], _ - [270, "Life Barrier"], _ - [271, "Zealots Fire"], _ - [272, "Balthazars Aura"], _ - [273, "Spell Breaker"], _ - [274, "Healing Seed"], _ - [275, "Mend Condition"], _ - [276, "Restore Condition"], _ - [277, "Mend Ailment"], _ - [278, "Purge Conditions"], _ - [279, "Divine Healing"], _ - [280, "Heal Area"], _ - [281, "Orison of Healing"], _ - [282, "Word of Healing"], _ - [283, "Dwaynas Kiss"], _ - [284, "Divine Boon"], _ - [285, "Healing Hands"], _ - [286, "Heal Other"], _ - [287, "Heal Party"], _ - [288, "Healing Breeze"], _ - [289, "Vital Blessing"], _ - [290, "Mending"], _ - [291, "Live Vicariously"], _ - [292, "Infuse Health"], _ - [293, "Signet of Devotion"], _ - [294, "Signet of Judgment"], _ - [295, "Purge Signet"], _ - [296, "Bane Signet"], _ - [297, "Blessed Signet"], _ - [298, "Martyr"], _ - [299, "Shielding Hands"], _ - [300, "Contemplation of Purity"], _ - [301, "Remove Hex"], _ - [302, "Smite Hex"], _ - [303, "Convert Hexes"], _ - [304, "Light of Dwayna"], _ - [305, "Resurrect"], _ - [306, "Rebirth"], _ - [307, "Reversal of Fortune"], _ - [308, "Succor"], _ - [309, "Holy Veil"], _ - [310, "Divine Spirit"], _ - [311, "Draw Conditions"], _ - [312, "Holy Strike"], _ - [313, "Healing Touch"], _ - [314, "Restore Life"], _ - [315, "Vengeance"], _ - [316, "To the Limit"], _ - [317, "Battle Rage"], _ - [318, "Defy Pain"], _ - [319, "Rush"], _ - [320, "Hamstring"], _ - [321, "Wild Blow"], _ - [322, "Power Attack"], _ - [323, "Desperation Blow"], _ - [324, "Thrill of Victory"], _ - [325, "Distracting Blow"], _ - [326, "Protectors Strike"], _ - [327, "Griffons Sweep"], _ - [328, "Pure Strike"], _ - [329, "Skull Crack"], _ - [330, "Cyclone Axe"], _ - [331, "Hammer Bash"], _ - [332, "Bulls Strike"], _ - [333, "I Will Avenge You"], _ - [334, "Axe Rake"], _ - [335, "Cleave"], _ - [336, "Executioners Strike"], _ - [337, "Dismember"], _ - [338, "Eviscerate"], _ - [339, "Penetrating Blow"], _ - [340, "Disrupting Chop"], _ - [341, "Swift Chop"], _ - [342, "Axe Twist"], _ - [343, "For Great Justice"], _ - [344, "Flurry"], _ - [345, "Defensive Stance"], _ - [346, "Frenzy"], _ - [347, "Endure Pain"], _ - [348, "Watch Yourself"], _ - [349, "Sprint"], _ - [350, "Belly Smash"], _ - [351, "Mighty Blow"], _ - [352, "Crushing Blow"], _ - [353, "Crude Swing"], _ - [354, "Earth Shaker"], _ - [355, "Devastating Hammer"], _ - [356, "Irresistible Blow"], _ - [357, "Counter Blow"], _ - [358, "Backbreaker"], _ - [359, "Heavy Blow"], _ - [360, "Staggering Blow"], _ - [361, "Dolyak Signet"], _ - [362, "Warriors Cunning"], _ - [363, "Shield Bash"], _ - [364, "Charge"], _ - [365, "Victory Is Mine"], _ - [366, "Fear Me"], _ - [367, "Shields Up"], _ - [368, "I Will Survive"], _ - [369, "Dont Believe Their Lies"], _ - [370, "Berserker Stance"], _ - [371, "Balanced Stance"], _ - [372, "Gladiators Defense"], _ - [373, "Deflect Arrows"], _ - [374, "Warriors Endurance"], _ - [375, "Dwarven Battle Stance"], _ - [376, "Disciplined Stance"], _ - [377, "Wary Stance"], _ - [378, "Shield Stance"], _ - [379, "Bulls Charge"], _ - [380, "Bonettis Defense"], _ - [381, "Hundred Blades"], _ - [382, "Sever Artery"], _ - [383, "Galrath Slash"], _ - [384, "Gash"], _ - [385, "Final Thrust"], _ - [386, "Seeking Blade"], _ - [387, "Riposte"], _ - [388, "Deadly Riposte"], _ - [389, "Flourish"], _ - [390, "Savage Slash"], _ - [391, "Hunters Shot"], _ - [392, "Pin Down"], _ - [393, "Crippling Shot"], _ - [394, "Power Shot"], _ - [395, "Barrage"], _ - [396, "Dual Shot"], _ - [397, "Quick Shot"], _ - [398, "Penetrating Attack"], _ - [399, "Distracting Shot"], _ - [400, "Precision Shot"], _ - [401, "Splinter Shot (monster skill)"], _ - [402, "Determined Shot"], _ - [403, "Called Shot"], _ - [404, "Poison Arrow"], _ - [405, "Oath Shot"], _ - [406, "Debilitating Shot"], _ - [407, "Point Blank Shot"], _ - [408, "Concussion Shot"], _ - [409, "Punishing Shot"], _ - [410, "Call of Ferocity"], _ - [411, "Charm Animal"], _ - [412, "Call of Protection"], _ - [413, "Call of Elemental Protection"], _ - [414, "Call of Vitality"], _ - [415, "Call of Haste"], _ - [416, "Call of Healing"], _ - [417, "Call of Resilience"], _ - [418, "Call of Feeding"], _ - [419, "Call of the Hunter"], _ - [420, "Call of Brutality"], _ - [421, "Call of Disruption"], _ - [422, "Revive Animal"], _ - [423, "Symbiotic Bond"], _ - [424, "Throw Dirt"], _ - [425, "Dodge"], _ - [426, "Savage Shot"], _ - [427, "Antidote Signet"], _ - [428, "Incendiary Arrows"], _ - [429, "Melandrus Arrows"], _ - [430, "Marksmans Wager"], _ - [431, "Ignite Arrows"], _ - [432, "Read the Wind"], _ - [433, "Kindle Arrows"], _ - [434, "Choking Gas"], _ - [435, "Apply Poison"], _ - [436, "Comfort Animal"], _ - [437, "Bestial Pounce"], _ - [438, "Maiming Strike"], _ - [439, "Feral Lunge"], _ - [440, "Scavenger Strike"], _ - [441, "Melandrus Assault"], _ - [442, "Ferocious Strike"], _ - [443, "Predators Pounce"], _ - [444, "Brutal Strike"], _ - [445, "Disrupting Lunge"], _ - [446, "Troll Unguent"], _ - [447, "Otyughs Cry"], _ - [448, "Escape"], _ - [449, "Practiced Stance"], _ - [450, "Whirling Defense"], _ - [451, "Melandrus Resilience"], _ - [452, "Dryders Defenses"], _ - [453, "Lightning Reflexes"], _ - [454, "Tigers Fury"], _ - [455, "Storm Chaser"], _ - [456, "Serpents Quickness"], _ - [457, "Dust Trap"], _ - [458, "Barbed Trap"], _ - [459, "Flame Trap"], _ - [460, "Healing Spring"], _ - [461, "Spike Trap"], _ - [462, "Winter"], _ - [463, "Winnowing"], _ - [464, "Edge of Extinction"], _ - [465, "Greater Conflagration"], _ - [466, "Conflagration"], _ - [467, "Fertile Season"], _ - [468, "Symbiosis"], _ - [469, "Primal Echoes"], _ - [470, "Predatory Season"], _ - [471, "Frozen Soil"], _ - [472, "Favorable Winds"], _ - [473, "High Winds"], _ - [474, "Energizing Wind"], _ - [475, "Quickening Zephyr"], _ - [476, "Natures Renewal"], _ - [477, "Muddy Terrain"], _ - [478, "Bleeding"], _ - [479, "Blind"], _ - [480, "Burning"], _ - [481, "Crippled"], _ - [482, "Deep Wound"], _ - [483, "Disease"], _ - [484, "Poison"], _ - [485, "Dazed"], _ - [486, "Weakness"], _ - [487, "Cleansed"], _ - [488, "Eruption (environment)"], _ - [489, "Fire Storm (environment)"], _ - [490, "Vital Blessing (monster skill)"], _ - [491, "Fount Of Maguuma"], _ - [492, "Healing Fountain"], _ - [493, "Icy Ground"], _ - [494, "Maelstrom (environment)"], _ - [495, "Mursaat Tower (skill)"], _ - [496, "Quicksand (environment effect)"], _ - [497, "Curse of the Bloodstone"], _ - [498, "Chain Lightning (environment)"], _ - [499, "Obelisk Lightning"], _ - [500, "Tar"], _ - [501, "Siege Attack"], _ - [502, "Resurrect Party"], _ - [503, "Scepter of Orrs Aura"], _ - [504, "Scepter of Orrs Power"], _ - [505, "Burden Totem"], _ - [506, "Splinter Mine (skill)"], _ - [507, "Entanglement"], _ - [508, "Dwarven Powder Keg"], _ - [509, "Seed of Resurrection"], _ - [510, "Deafening Roar"], _ - [511, "Brutal Mauling"], _ - [512, "Crippling Attack"], _ - [513, "Charm Animal (monster skill)"], _ - [514, "Breaking Charm"], _ - [515, "Charr Buff"], _ - [516, "Claim Resource"], _ - [517, "Claim Resource"], _ - [518, "Claim Resource"], _ - [519, "Claim Resource"], _ - [520, "Claim Resource"], _ - [521, "Claim Resource"], _ - [522, "Claim Resource"], _ - [523, "Claim Resource"], _ - [524, "Dozen Shot"], _ - [525, "Nibble"], _ - [526, "Claim Resource"], _ - [527, "Claim Resource"], _ - [528, "Reflection"], _ - [530, "Giant Stomp"], _ - [531, "Agnars Rage"], _ - [532, "Healing Breeze (Agnars Rage)"], _ - [533, "Crystal Haze"], _ - [534, "Crystal Bonds"], _ - [535, "Jagged Crystal Skin"], _ - [536, "Crystal Hibernation"], _ - [537, "Stun Immunity"], _ - [538, "Invulnerability"], _ - [539, "Hunger of the Lich"], _ - [540, "Embrace the Pain"], _ - [541, "Life Vortex"], _ - [542, "Oracle Link"], _ - [543, "Guardian Pacify"], _ - [544, "Soul Vortex"], _ - [546, "Spectral Agony"], _ - [547, "Natural Resistance"], _ - [548, "Natural Resistance"], _ - [549, "Guild Lord Aura"], _ - [550, "Critical Hit Probability"], _ - [551, "Stun on Critical Hit"], _ - [552, "Blood Splattering"], _ - [553, "Inanimate Object"], _ - [554, "Undead sensitivity to Light"], _ - [555, "Energy Boost"], _ - [556, "Health Drain"], _ - [557, "Immunity to Critical Hits"], _ - [558, "Titans get plus Health regen and set enemies on fire each time he is hit."], _ - [559, "Undying"], _ - [560, "Resurrect (Gargoyle)"], _ - [561, "Seal Regen"], _ - [562, "Lightning Orb"], _ - [563, "Wurm Siege (Dunes of Despair)"], _ - [564, "Wurm Siege"], _ - [565, "Claim Resource"], _ - [566, "Shiver Touch"], _ - [567, "Spontaneous Combustion"], _ - [568, "Vanish"], _ - [569, "Victory or Death"], _ - [570, "Mark of Insecurity"], _ - [571, "Disrupting Dagger"], _ - [572, "Deadly Paradox"], _ - [573, "Teleport Players"], _ - [574, "Quest [for Coastal Exam."], _ - [575, "Holy Blessing"], _ - [576, "Statues Blessing"], _ - [577, "Siege Attack"], _ - [578, "Siege Attack"], _ - [579, "Domain of [Damage"], _ - [580, "Domain of Energy Draining"], _ - [581, "Domain of Elements"], _ - [582, "Domain of Health Draining"], _ - [583, "Domain of Slow"], _ - [584, "Divine Fire"], _ - [585, "Swamp Water"], _ - [586, "Janthirs Gaze"], _ - [587, "Fake Spell"], _ - [588, "Charm Animal (monster)"], _ - [589, "Stormcaller (skill)"], _ - [590, "Knock"], _ - [591, "Quest ["], _ - [592, "Rurik Must Live"], _ - [593, "Blessing of the Kurzicks"], _ - [594, "Lichs Phylactery"], _ - [595, "Restore Life (monster skill)"], _ - [596, "Chimera of Intensity"], _ - [657, "Life Draining"], _ - [763, "Jaundiced Gaze"], _ - [764, "Wail of Doom"], _ - [765, "Heros Insight"], _ - [766, "Gaze of Contempt"], _ - [767, "Berserkers Insight"], _ - [768, "Slayers Insight"], _ - [769, "Vipers Defense"], _ - [770, "Return"], _ - [771, "Aura of Displacement"], _ - [772, "Generous Was Tsungrai"], _ - [773, "Mighty Was Vorizun"], _ - [774, "To the Death"], _ - [775, "Death Blossom"], _ - [776, "Twisting Fangs"], _ - [777, "Horns of the Ox"], _ - [778, "Falling Spider"], _ - [779, "Black Lotus Strike"], _ - [780, "Fox Fangs"], _ - [781, "Moebius Strike"], _ - [782, "Jagged Strike"], _ - [783, "Unsuspecting Strike"], _ - [784, "Entangling Asp"], _ - [785, "Mark of Death"], _ - [786, "Iron Palm"], _ - [787, "Resilient Weapon"], _ - [788, "Blind Was Mingson"], _ - [789, "Grasping Was Kuurong"], _ - [790, "Vengeful Was Khanhei"], _ - [791, "Flesh of My Flesh"], _ - [792, "Splinter Weapon"], _ - [793, "Weapon of Warding"], _ - [794, "Wailing Weapon"], _ - [795, "Nightmare Weapon"], _ - [796, "Sorrows Flame"], _ - [797, "Sorrows Fist"], _ - [798, "Blast Furnace"], _ - [799, "Beguiling Haze"], _ - [800, "Enduring Toxin"], _ - [801, "Shroud of Silence"], _ - [802, "Expose Defenses"], _ - [803, "Power Leech"], _ - [804, "Arcane Languor"], _ - [805, "Animate Vampiric Horror"], _ - [806, "Cultists Fervor"], _ - [808, "Reapers Mark"], _ - [809, "Shatterstone"], _ - [810, "Protectors Defense"], _ - [811, "Run as One"], _ - [812, "Defiant Was Xinrae"], _ - [813, "Lyssas Aura"], _ - [814, "Shadow Refuge"], _ - [815, "Scorpion Wire"], _ - [816, "Mirrored Stance"], _ - [817, "Discord"], _ - [818, "Well of Weariness"], _ - [819, "Vampiric Spirit"], _ - [820, "Depravity"], _ - [821, "Icy Veins"], _ - [822, "Weaken Knees"], _ - [823, "Burning Speed"], _ - [824, "Lava Arrows"], _ - [825, "Bed of Coals"], _ - [826, "Shadow Form"], _ - [827, "Siphon Strength"], _ - [828, "Vile Miasma"], _ - [829, "Veratas Promise"], _ - [830, "Ray of Judgment"], _ - [831, "Primal Rage"], _ - [832, "Animate Flesh Golem"], _ - [833, "Borrowed Energy"], _ - [834, "Reckless Haste"], _ - [835, "Blood Bond"], _ - [836, "Ride the Lightning"], _ - [837, "Energy Boon"], _ - [838, "Dwaynas Sorrow"], _ - [839, "Retreat"], _ - [840, "Poisoned Heart"], _ - [841, "Fetid Ground"], _ - [842, "Arc Lightning"], _ - [843, "Gust"], _ - [844, "Churning Earth"], _ - [845, "Liquid Flame"], _ - [846, "Steam"], _ - [847, "Boon Signet"], _ - [848, "Reverse Hex"], _ - [849, "Lacerating Chop"], _ - [850, "Fierce Blow"], _ - [851, "Sun and Moon Slash"], _ - [852, "Splinter Shot"], _ - [853, "Melandrus Shot"], _ - [854, "Snare"], _ - [855, "Chomper"], _ - [856, "Kilroy Stonekin"], _ - [857, "Adventurers Insight"], _ - [858, "Dancing Daggers"], _ - [859, "Conjure Nightmare"], _ - [860, "Signet of Disruption"], _ - [861, "Dissipation"], _ - [862, "Ravenous Gaze"], _ - [863, "Order of Apostasy"], _ - [864, "Oppressive Gaze"], _ - [865, "Lightning Hammer"], _ - [866, "Vapor Blade"], _ - [867, "Healing Light"], _ - [868, "Aim True"], _ - [869, "Coward"], _ - [870, "Pestilence"], _ - [871, "Shadowsong"], _ - [872, "Shadowsong (attack)"], _ - [873, "Resurrect (monster skill)"], _ - [874, "Consuming Flames"], _ - [875, "Chains of Enslavement"], _ - [876, "Signet of Shadows"], _ - [877, "Lyssas Balance"], _ - [878, "Visions of Regret"], _ - [879, "Illusion of Pain"], _ - [880, "Stolen Speed"], _ - [881, "Ether Signet"], _ - [882, "Signet of Disenchantment"], _ - [883, "Vocal Minority"], _ - [884, "Searing Flames"], _ - [885, "Shield Guardian"], _ - [886, "Restful Breeze"], _ - [887, "Signet of Rejuvenation"], _ - [888, "Whirling Axe"], _ - [889, "Forceful Blow"], _ - [890, "Headshot"], _ - [891, "None Shall Pass"], _ - [892, "Quivering Blade"], _ - [893, "Seeking Arrows"], _ - [894, "Rampagers Insight"], _ - [895, "Hunters Insight"], _ - [896, "Amulet of Protection"], _ - [897, "Oath of Healing"], _ - [898, "Overload"], _ - [899, "Images of Remorse"], _ - [900, "Shared Burden"], _ - [901, "Soul Bind"], _ - [902, "Blood of the Aggressor"], _ - [903, "Icy Prism"], _ - [904, "Furious Axe"], _ - [905, "Auspicious Blow"], _ - [906, "On Your Knees"], _ - [907, "Dragon Slash"], _ - [908, "Marauders Shot"], _ - [909, "Focused Shot"], _ - [910, "Spirit Rift"], _ - [911, "Union"], _ - [912, "Blessing of the Kurzicks"], _ - [913, "Tranquil Was Tanasen"], _ - [914, "Consume Soul"], _ - [915, "Spirit Light"], _ - [916, "Lamentation"], _ - [917, "Rupture Soul"], _ - [918, "Spirit to Flesh"], _ - [919, "Spirit Burn"], _ - [920, "Destruction"], _ - [921, "Dissonance"], _ - [922, "Dissonance (attack)"], _ - [923, "Disenchantment"], _ - [924, "Disenchantment (attack)"], _ - [925, "Recall"], _ - [926, "Sharpen Daggers"], _ - [927, "Shameful Fear"], _ - [928, "Shadow Shroud"], _ - [929, "Shadow of Haste"], _ - [930, "Auspicious Incantation"], _ - [931, "Power Return"], _ - [932, "Complicate"], _ - [933, "Shatter Storm"], _ - [934, "Unnatural Signet"], _ - [935, "Rising Bile"], _ - [936, "Envenom Enchantments"], _ - [937, "Shockwave"], _ - [938, "Ward of Stability"], _ - [939, "Icy Shackles"], _ - [940, "Cry of Lament"], _ - [941, "Blessed Light"], _ - [942, "Withdraw Hexes"], _ - [943, "Extinguish"], _ - [944, "Signet of Strength"], _ - [945, "REMOVE (With Haste)"], _ - [946, "Trappers Focus"], _ - [947, "Brambles"], _ - [948, "Desperate Strike"], _ - [949, "Way of the Fox"], _ - [950, "Shadowy Burden"], _ - [951, "Siphon Speed"], _ - [952, "Deaths Charge"], _ - [953, "Power Flux"], _ - [954, "Expel Hexes"], _ - [955, "Rip Enchantment"], _ - [956, "Energy Font"], _ - [957, "Spell Shield"], _ - [958, "Healing Whisper"], _ - [959, "Ethereal Light"], _ - [960, "Release Enchantments"], _ - [961, "Lacerate"], _ - [962, "Spirit Transfer"], _ - [963, "Restoration"], _ - [964, "Vengeful Weapon"], _ - [965, "Archemorus Strike"], _ - [966, "Spear of Archemorus: Level 1"], _ - [967, "Spear of Archemorus: Level 2"], _ - [968, "Spear of Archemorus: Level 3"], _ - [969, "Spear of Archemorus: Level 4"], _ - [970, "Spear of Archemorus: Level 5"], _ - [971, "Argos Cry"], _ - [972, "Jade Fury"], _ - [973, "Blinding Powder"], _ - [974, "Mantis Touch"], _ - [975, "Exhausting Assault"], _ - [976, "Repeating Strike"], _ - [977, "Way of the Lotus"], _ - [978, "Mark of Instability"], _ - [979, "Mistrust"], _ - [980, "Feast of Souls"], _ - [981, "Recuperation"], _ - [982, "Shelter"], _ - [983, "Weapon of Shadow"], _ - [984, "Torch Enchantment"], _ - [985, "Caltrops"], _ - [986, "Nine Tail Strike"], _ - [987, "Way of the Empty Palm"], _ - [988, "Temple Strike"], _ - [989, "Golden Phoenix Strike"], _ - [990, "Expunge Enchantments"], _ - [991, "Deny Hexes"], _ - [992, "Triple Chop"], _ - [993, "Enraged Smash"], _ - [994, "Renewing Smash"], _ - [995, "Tiger Stance"], _ - [996, "Standing Slash"], _ - [997, "Famine"], _ - [998, "Torch Hex"], _ - [999, "Torch Degeneration Hex"], _ - [1000, "Blinding Snow"], _ - [1001, "Avalanche (skill)"], _ - [1002, "Snowball"], _ - [1003, "Mega Snowball"], _ - [1004, "Yuletide"], _ - [1005, "Ice Skates"], _ - [1006, "Ice Fort"], _ - [1007, "Yellow Snow"], _ - [1008, "Hidden Rock"], _ - [1009, "Snow Down the Shirt"], _ - [1010, "Mmmm. Snowcone"], _ - [1011, "Holiday Blues"], _ - [1012, "Icicles"], _ - [1013, "Ice Breaker"], _ - [1014, "Lets Get Em"], _ - [1015, "Flurry of Ice"], _ - [1016, "Snowball (NPC)"], _ - [1017, "Undying"], _ - [1018, "Critical Eye"], _ - [1019, "Critical Strike"], _ - [1020, "Blades of Steel"], _ - [1021, "Jungle Strike"], _ - [1022, "Wild Strike"], _ - [1023, "Leaping Mantis Sting"], _ - [1024, "Black Mantis Thrust"], _ - [1025, "Disrupting Stab"], _ - [1026, "Golden Lotus Strike"], _ - [1027, "Critical Defenses"], _ - [1028, "Way of Perfection"], _ - [1029, "Dark Apostasy"], _ - [1030, "Locusts Fury"], _ - [1031, "Shroud of Distress"], _ - [1032, "Heart of Shadow"], _ - [1033, "Impale"], _ - [1034, "Seeping Wound"], _ - [1035, "Assassins Promise"], _ - [1036, "Signet of Malice"], _ - [1037, "Dark Escape"], _ - [1038, "Crippling Dagger"], _ - [1039, "Star Strike"], _ - [1040, "Spirit Walk"], _ - [1041, "Unseen Fury"], _ - [1042, "Flashing Blades"], _ - [1043, "Dash"], _ - [1044, "Dark Prison"], _ - [1045, "Palm Strike"], _ - [1046, "Assassin of Lyssa"], _ - [1047, "Mesmer of Lyssa"], _ - [1048, "Revealed Enchantment"], _ - [1049, "Revealed Hex"], _ - [1050, "Disciple of Energy"], _ - [1051, "Empathy (Koro)"], _ - [1052, "Accumulated Pain"], _ - [1053, "Psychic Distraction"], _ - [1054, "Ancestors Visage"], _ - [1055, "Recurring Insecurity"], _ - [1056, "Kitahs Burden"], _ - [1057, "Psychic Instability"], _ - [1058, "Chaotic Power"], _ - [1059, "Hex Eater Signet"], _ - [1060, "Celestial Haste"], _ - [1061, "Feedback"], _ - [1062, "Arcane Larceny"], _ - [1063, "Chaotic Ward"], _ - [1064, "Favor of the Gods"], _ - [1065, "Dark Aura (blessing)"], _ - [1066, "Spoil Victor"], _ - [1067, "Lifebane Strike"], _ - [1068, "Bitter Chill"], _ - [1069, "Taste of Pain"], _ - [1070, "Defile Enchantments"], _ - [1071, "Shivers of Dread"], _ - [1072, "Star Servant"], _ - [1073, "Necromancer of Grenth"], _ - [1074, "Ritualist of Grenth"], _ - [1075, "Vampiric Swarm"], _ - [1076, "Blood Drinker"], _ - [1077, "Vampiric Bite"], _ - [1078, "Wallows Bite"], _ - [1079, "Enfeebling Touch"], _ - [1080, "Disciple of Ice"], _ - [1081, "Teinais Wind"], _ - [1082, "Shock Arrow"], _ - [1083, "Unsteady Ground"], _ - [1084, "Sliver Armor"], _ - [1085, "Ash Blast"], _ - [1086, "Dragons Stomp"], _ - [1087, "Unnatural Resistance"], _ - [1088, "Second Wind"], _ - [1089, "Cloak of Faith"], _ - [1090, "Smoldering Embers"], _ - [1091, "Double Dragon"], _ - [1092, "Disciple of the Air"], _ - [1093, "Teinais Heat"], _ - [1094, "Breath of Fire"], _ - [1095, "Star Burst"], _ - [1096, "Glyph of Essence"], _ - [1097, "Teinais Prison"], _ - [1098, "Mirror of Ice"], _ - [1099, "Teinais Crystals"], _ - [1100, "Celestial Storm"], _ - [1101, "Monk of Dwayna"], _ - [1102, "Aura of the Grove"], _ - [1103, "Cathedral Collapse"], _ - [1104, "Miasma"], _ - [1105, "Acid Trap"], _ - [1106, "Shield of Saint Viktor"], _ - [1107, "Urn of Saint Viktor: Level 1"], _ - [1108, "Urn of Saint Viktor: Level 2"], _ - [1109, "Urn of Saint Viktor: Level 3"], _ - [1110, "Urn of Saint Viktor: Level 4"], _ - [1111, "Urn of Saint Viktor: Level 5"], _ - [1112, "Aura of Light"], _ - [1113, "Kirins Wrath"], _ - [1114, "Spirit Bond"], _ - [1115, "Air of Enchantment"], _ - [1116, "Warriors Might"], _ - [1117, "Heavens Delight"], _ - [1118, "Healing Burst"], _ - [1119, "Kareis Healing Circle"], _ - [1120, "Jameis Gaze"], _ - [1121, "Gift of Health"], _ - [1122, "Battle Fervor"], _ - [1123, "Life Sheath"], _ - [1124, "Star Shine"], _ - [1125, "Disciple of Fire"], _ - [1126, "Empathic Removal"], _ - [1127, "Warrior of Balthazar"], _ - [1128, "Resurrection Chant"], _ - [1129, "Word of Censure"], _ - [1130, "Spear of Light"], _ - [1131, "Stonesoul Strike"], _ - [1132, "Shielding Branches"], _ - [1133, "Drunken Blow"], _ - [1134, "Leviathans Sweep"], _ - [1135, "Jaizhenju Strike"], _ - [1136, "Penetrating Chop"], _ - [1137, "Yeti Smash"], _ - [1138, "Disciple of the Earth"], _ - [1139, "Ranger of Melandru"], _ - [1140, "Storm of Swords"], _ - [1141, "You Will Die"], _ - [1142, "Auspicious Parry"], _ - [1143, "Strength of the Oak"], _ - [1144, "Silverwing Slash"], _ - [1145, "Destroy Enchantment"], _ - [1146, "Shove"], _ - [1147, "Base Defense"], _ - [1148, "Carrier Defense"], _ - [1149, "The Chalice of Corruption"], _ - [1151, "Song of the Mists"], _ - [1152, "Demonic Agility"], _ - [1153, "Blessing of the Kirin"], _ - [1154, "Emperor Degen"], _ - [1155, "Juggernaut Toss"], _ - [1156, "Aura of the Juggernaut"], _ - [1157, "Star Shards"], _ - [1172, "Turtle Shell"], _ - [1173, "Exposed Underbelly"], _ - [1174, "Cathedral Collapse"], _ - [1175, "Blood of zu Heltzer"], _ - [1176, "Afflicted Soul Explosion"], _ - [1177, "Invincibility"], _ - [1178, "Last Stand"], _ - [1179, "Dark Chain Lightning"], _ - [1180, "Seadragon Health Trigger"], _ - [1181, "Corrupted Breath"], _ - [1182, "Renewing Corruption"], _ - [1183, "Corrupted Dragon Spores"], _ - [1184, "Corrupted Dragon Scales"], _ - [1185, "Construct Possession"], _ - [1186, "Siege Turtle Attack (The Eternal Grove)"], _ - [1187, "Siege Turtle Attack (Fort Aspenwood)"], _ - [1188, "Siege Turtle Attack (Gyala Hatchery)"], _ - [1189, "Of Royal Blood"], _ - [1190, "Passage to Tahnnakai"], _ - [1191, "Sundering Attack"], _ - [1192, "Zojuns Shot"], _ - [1193, "Consume Spirit"], _ - [1194, "Predatory Bond"], _ - [1195, "Heal as One"], _ - [1196, "Zojuns Haste"], _ - [1197, "Needling Shot"], _ - [1198, "Broad Head Arrow"], _ - [1199, "Glass Arrows"], _ - [1200, "Archers Signet"], _ - [1201, "Savage Pounce"], _ - [1202, "Enraged Lunge"], _ - [1203, "Bestial Mauling"], _ - [1204, "Energy Drain (effect)"], _ - [1205, "Poisonous Bite"], _ - [1206, "Pounce"], _ - [1207, "Celestial Stance"], _ - [1208, "Sheer Exhaustion"], _ - [1209, "Bestial Fury"], _ - [1210, "Life Drain"], _ - [1211, "Vipers Nest"], _ - [1212, "Equinox"], _ - [1213, "Tranquility"], _ - [1214, "Acute Weakness"], _ - [1215, "Clamor of Souls"], _ - [1217, "Ritual Lord"], _ - [1218, "Cruel Was Daoshen"], _ - [1219, "Protective Was Kaolai"], _ - [1220, "Attuned Was Songkai"], _ - [1221, "Resilient Was Xiko"], _ - [1222, "Lively Was Naomei"], _ - [1223, "Anguished Was Lingwah"], _ - [1224, "Draw Spirit"], _ - [1225, "Channeled Strike"], _ - [1226, "Spirit Boon Strike"], _ - [1227, "Essence Strike"], _ - [1228, "Spirit Siphon"], _ - [1229, "Explosive Growth"], _ - [1230, "Boon of Creation"], _ - [1231, "Spirit Channeling"], _ - [1232, "Armor of Unfeeling"], _ - [1233, "Soothing Memories"], _ - [1234, "Mend Body and Soul"], _ - [1235, "Dulled Weapon"], _ - [1236, "Binding Chains"], _ - [1237, "Painful Bond"], _ - [1238, "Signet of Creation"], _ - [1239, "Signet of Spirits"], _ - [1240, "Soul Twisting"], _ - [1241, "Celestial Summoning"], _ - [1242, "Archemorus Strike (Celestial Summoning)"], _ - [1243, "Shield of Saint Viktor (Celestial Summoning)"], _ - [1244, "Ghostly Haste"], _ - [1245, "Gaze from Beyond"], _ - [1246, "Ancestors Rage"], _ - [1247, "Pain"], _ - [1248, "Pain (attack)"], _ - [1249, "Displacement"], _ - [1250, "Preservation"], _ - [1251, "Life"], _ - [1252, "Earthbind"], _ - [1253, "Bloodsong"], _ - [1254, "Bloodsong (attack)"], _ - [1255, "Wanderlust"], _ - [1256, "Wanderlust (attack)"], _ - [1257, "Spirit Light Weapon"], _ - [1258, "Brutal Weapon"], _ - [1259, "Guided Weapon"], _ - [1260, "Meekness"], _ - [1261, "Frigid Armor"], _ - [1262, "Healing Ring"], _ - [1263, "Renew Life"], _ - [1264, "Doom"], _ - [1265, "Wielders Boon"], _ - [1266, "Soothing"], _ - [1267, "Vital Weapon"], _ - [1268, "Weapon of Quickening"], _ - [1269, "Signet of Rage"], _ - [1270, "Fingers of Chaos"], _ - [1271, "Echoing Banishment"], _ - [1272, "Suicidal Impulse"], _ - [1273, "Impossible Odds"], _ - [1274, "Battle Scars"], _ - [1275, "Riposting Shadows"], _ - [1276, "Meditation of the Reaper"], _ - [1277, "Battle Cry"], _ - [1278, "Elemental Defense Zone"], _ - [1279, "Melee Defense Zone"], _ - [1280, "Blessed Water"], _ - [1281, "Defiled Water"], _ - [1282, "Stone Spores"], _ - [1283, "Turret Arrow"], _ - [1284, "Blood Flower (skill)"], _ - [1285, "Fire Flower (skill)"], _ - [1286, "Poison Arrow (flower)"], _ - [1287, "Haiju Lagoon Water"], _ - [1288, "Aspect of Exhaustion"], _ - [1289, "Aspect of Exposure"], _ - [1290, "Aspect of Surrender"], _ - [1291, "Aspect of Death"], _ - [1292, "Aspect of Soothing"], _ - [1293, "Aspect of Pain"], _ - [1294, "Aspect of Lethargy"], _ - [1295, "Aspect of Depletion (energy loss)"], _ - [1296, "Aspect of Failure"], _ - [1297, "Aspect of Shadows"], _ - [1298, "Scorpion Aspect"], _ - [1299, "Aspect of Fear"], _ - [1300, "Aspect of Depletion (energy depletion damage)"], _ - [1301, "Aspect of Decay"], _ - [1302, "Aspect of Torment"], _ - [1303, "Nightmare Aspect"], _ - [1304, "Spiked Coral"], _ - [1305, "Shielding Urn (skill)"], _ - [1306, "Extensive Plague Exposure"], _ - [1307, "Forests Binding"], _ - [1308, "Exploding Spores"], _ - [1309, "Suicide Energy"], _ - [1310, "Suicide Health"], _ - [1311, "Nightmare Refuge"], _ - [1312, "Oni Health Lock"], _ - [1313, "Oni Shadow Health Lock"], _ - [1314, "Signet of Attainment"], _ - [1315, "Rage of the Sea"], _ - [1316, "Meditation of the Reaper"], _ - [1318, "Fireball (obelisk)"], _ - [1319, "Final Thrust"], _ - [1323, "Sugar Rush (medium)"], _ - [1324, "Torment Slash"], _ - [1325, "Spirit of the Festival"], _ - [1326, "Trade Winds"], _ - [1327, "Dragon Blast"], _ - [1328, "Imperial Majesty"], _ - [1329, "Monster doesnt get death penalty"], _ - [1330, "Twisted Spikes"], _ - [1331, "Marble Trap"], _ - [1332, "Shadow Tripwire"], _ - [1333, "Extend Conditions"], _ - [1334, "Hypochondria"], _ - [1335, "Wastrels Demise"], _ - [1336, "Spiritual Pain"], _ - [1337, "Drain Delusions"], _ - [1338, "Persistence of Memory"], _ - [1339, "Symbols of Inspiration"], _ - [1340, "Symbolic Celerity"], _ - [1341, "Frustration"], _ - [1342, "Tease"], _ - [1343, "Ether Phantom"], _ - [1344, "Web of Disruption"], _ - [1345, "Enchanters Conundrum"], _ - [1346, "Signet of Illusions"], _ - [1347, "Discharge Enchantment"], _ - [1348, "Hex Eater Vortex"], _ - [1349, "Mirror of Disenchantment"], _ - [1350, "Simple Thievery"], _ - [1351, "Animate Shambling Horror"], _ - [1352, "Order of Undeath"], _ - [1353, "Putrid Flesh"], _ - [1354, "Feast for the Dead"], _ - [1355, "Jagged Bones"], _ - [1356, "Contagion"], _ - [1357, "Bloodletting"], _ - [1358, "Ulcerous Lungs"], _ - [1359, "Pain of Disenchantment"], _ - [1360, "Mark of Fury"], _ - [1361, "Recurring Scourge"], _ - [1362, "Corrupt Enchantment"], _ - [1363, "Signet of Sorrow"], _ - [1364, "Signet of Suffering"], _ - [1365, "Signet of Lost Souls"], _ - [1366, "Well of Darkness"], _ - [1367, "Blinding Surge"], _ - [1368, "Chilling Winds"], _ - [1369, "Lightning Bolt"], _ - [1370, "Storm Djinns Haste"], _ - [1371, "Stone Striker"], _ - [1372, "Sandstorm"], _ - [1373, "Stone Sheath"], _ - [1374, "Ebon Hawk"], _ - [1375, "Stoneflesh Aura"], _ - [1376, "Glyph of Restoration"], _ - [1377, "Ether Prism"], _ - [1378, "Master of Magic"], _ - [1379, "Glowing Gaze"], _ - [1380, "Savannah Heat"], _ - [1381, "Flame Djinns Haste"], _ - [1382, "Freezing Gust"], _ - [1383, "Rocky Ground"], _ - [1384, "Sulfurous Haze"], _ - [1385, "Siege Attack"], _ - [1386, "Sentry Trap (skill)"], _ - [1387, "Caltrops (monster)"], _ - [1388, "Sacred Branch"], _ - [1389, "Light of Seborhin"], _ - [1390, "Judges Intervention"], _ - [1391, "Supportive Spirit"], _ - [1392, "Watchful Healing"], _ - [1393, "Healers Boon"], _ - [1394, "Healers Covenant"], _ - [1395, "Balthazars Pendulum"], _ - [1396, "Words of Comfort"], _ - [1397, "Light of Deliverance"], _ - [1398, "Scourge Enchantment"], _ - [1399, "Shield of Absorption"], _ - [1400, "Reversal of Damage"], _ - [1401, "Mending Touch"], _ - [1402, "Critical Chop"], _ - [1403, "Agonizing Chop"], _ - [1404, "Flail"], _ - [1405, "Charging Strike"], _ - [1406, "Headbutt"], _ - [1407, "Lions Comfort"], _ - [1408, "Rage of the Ntouka"], _ - [1409, "Mokele Smash"], _ - [1410, "Overbearing Smash"], _ - [1411, "Signet of Stamina"], _ - [1412, "Youre All Alone"], _ - [1413, "Burst of Aggression"], _ - [1414, "Enraging Charge"], _ - [1415, "Crippling Slash"], _ - [1416, "Barbarous Slice"], _ - [1417, "Vial of Purified Water"], _ - [1418, "Disarm Trap"], _ - [1419, "Feeding Frenzy (skill)"], _ - [1420, "Quake Of Ahdashim"], _ - [1421, "Shield of Madness"], _ - [1422, "Create Light of Seborhin"], _ - [1423, "Unlock Cell"], _ - [1424, "Stop Pump"], _ - [1426, "Shield of Madness"], _ - [1427, "Shield of Ether"], _ - [1428, "Shield of Iron"], _ - [1429, "Shield of Strength"], _ - [1430, "Wave of Torment"], _ - [1433, "Corsairs Net"], _ - [1434, "Corrupted Healing"], _ - [1435, "Corrupted Roots"], _ - [1436, "Corrupted Strength"], _ - [1437, "Desert Wurm (disguise)"], _ - [1438, "Junundu Feast"], _ - [1439, "Junundu Strike"], _ - [1440, "Junundu Smash"], _ - [1441, "Junundu Siege"], _ - [1442, "Junundu Tunnel"], _ - [1443, "Leave Junundu"], _ - [1444, "Summon Torment"], _ - [1445, "Signal Flare"], _ - [1446, "The Elixir of Strength"], _ - [1447, "Ehzah from Above"], _ - [1449, "Last Rites of Torment"], _ - [1450, "Abaddons Conspiracy"], _ - [1451, "Hungers Bite"], _ - [1452, "From Hell"], _ - [1453, "Pains Embrace"], _ - [1454, "Call to the Torment"], _ - [1455, "Command of Torment"], _ - [1456, "Abaddons Favor"], _ - [1457, "Abaddons Chosen"], _ - [1458, "Enchantment Collapse"], _ - [1459, "Call of Sacrifice"], _ - [1460, "Enemies Must Die"], _ - [1461, "Earth Vortex"], _ - [1462, "Frost Vortex"], _ - [1463, "Rough Current"], _ - [1464, "Turbulent Flow"], _ - [1465, "Prepared Shot"], _ - [1466, "Burning Arrow"], _ - [1467, "Arcing Shot"], _ - [1468, "Strike as One"], _ - [1469, "Crossfire"], _ - [1470, "Barbed Arrows"], _ - [1471, "Scavengers Focus"], _ - [1472, "Toxicity"], _ - [1473, "Quicksand"], _ - [1474, "Storms Embrace"], _ - [1475, "Trappers Speed"], _ - [1476, "Tripwire"], _ - [1477, "Kournan Guardsman"], _ - [1478, "Renewing Surge"], _ - [1479, "Offering of Spirit"], _ - [1480, "Spirits Gift"], _ - [1481, "Death Pact Signet"], _ - [1482, "Reclaim Essence"], _ - [1483, "Banishing Strike"], _ - [1484, "Mystic Sweep"], _ - [1485, "Eremites Attack"], _ - [1486, "Reap Impurities"], _ - [1487, "Twin Moon Sweep"], _ - [1488, "Victorious Sweep"], _ - [1489, "Irresistible Sweep"], _ - [1490, "Pious Assault"], _ - [1491, "Mystic Twister"], _ - [1492, "REMOVE (Wind Prayers skill)"], _ - [1493, "Grenths Fingers"], _ - [1494, "REMOVE (Boon of the Gods)"], _ - [1495, "Aura of Thorns"], _ - [1496, "Balthazars Rage"], _ - [1497, "Dust Cloak"], _ - [1498, "Staggering Force"], _ - [1499, "Pious Renewal"], _ - [1500, "Mirage Cloak"], _ - [1501, "REMOVE (Balthazars Rage)"], _ - [1502, "Arcane Zeal"], _ - [1503, "Mystic Vigor"], _ - [1504, "Watchful Intervention"], _ - [1505, "Vow of Piety"], _ - [1506, "Vital Boon"], _ - [1507, "Heart of Holy Flame"], _ - [1508, "Extend Enchantments"], _ - [1509, "Faithful Intervention"], _ - [1510, "Sand Shards"], _ - [1511, "Intimidating Aura (beta version)"], _ - [1512, "Lyssas Haste"], _ - [1513, "Guiding Hands"], _ - [1514, "Fleeting Stability"], _ - [1515, "Armor of Sanctity"], _ - [1516, "Mystic Regeneration"], _ - [1517, "Vow of Silence"], _ - [1518, "Avatar of Balthazar"], _ - [1519, "Avatar of Dwayna"], _ - [1520, "Avatar of Grenth"], _ - [1521, "Avatar of Lyssa"], _ - [1522, "Avatar of Melandru"], _ - [1523, "Meditation"], _ - [1524, "Eremites Zeal"], _ - [1525, "Natural Healing"], _ - [1526, "Imbue Health"], _ - [1527, "Mystic Healing"], _ - [1528, "Dwaynas Touch"], _ - [1529, "Pious Restoration"], _ - [1530, "Signet of Pious Light"], _ - [1531, "Intimidating Aura"], _ - [1532, "Mystic Sandstorm"], _ - [1533, "Winds of Disenchantment"], _ - [1534, "Rending Touch"], _ - [1535, "Crippling Sweep"], _ - [1536, "Wounding Strike"], _ - [1537, "Wearying Strike"], _ - [1538, "Lyssas Assault"], _ - [1539, "Chilling Victory"], _ - [1540, "Conviction"], _ - [1541, "Enchanted Haste"], _ - [1542, "Pious Concentration"], _ - [1543, "Pious Haste"], _ - [1544, "Whirling Charge"], _ - [1545, "Test of Faith"], _ - [1546, "Blazing Spear"], _ - [1547, "Mighty Throw"], _ - [1548, "Cruel Spear"], _ - [1549, "Harriers Toss"], _ - [1550, "Unblockable Throw"], _ - [1551, "Spear of Lightning"], _ - [1552, "Wearying Spear"], _ - [1553, "Anthem of Fury"], _ - [1554, "Crippling Anthem"], _ - [1555, "Defensive Anthem"], _ - [1556, "Godspeed"], _ - [1557, "Anthem of Flame"], _ - [1558, "Go for the Eyes"], _ - [1559, "Anthem of Envy"], _ - [1560, "Song of Power"], _ - [1561, "Zealous Anthem"], _ - [1562, "Aria of Zeal"], _ - [1563, "Lyric of Zeal"], _ - [1564, "Ballad of Restoration"], _ - [1565, "Chorus of Restoration"], _ - [1566, "Aria of Restoration"], _ - [1567, "Song of Concentration"], _ - [1568, "Anthem of Guidance"], _ - [1569, "Energizing Chorus"], _ - [1570, "Song of Purification"], _ - [1571, "Hexbreaker Aria"], _ - [1572, "Brace Yourself"], _ - [1573, "Awe"], _ - [1574, "Enduring Harmony"], _ - [1575, "Blazing Finale"], _ - [1576, "Burning Refrain"], _ - [1577, "Finale of Restoration"], _ - [1578, "Mending Refrain"], _ - [1579, "Purifying Finale"], _ - [1580, "Bladeturn Refrain"], _ - [1581, "Glowing Signet"], _ - [1582, "REMOVE (Leadership skill)"], _ - [1583, "Leaders Zeal"], _ - [1584, "Leaders Comfort"], _ - [1585, "Signet of Synergy"], _ - [1586, "Angelic Protection"], _ - [1587, "Angelic Bond"], _ - [1588, "Cautery Signet"], _ - [1589, "Stand Your Ground"], _ - [1590, "Lead the Way"], _ - [1591, "Make Haste"], _ - [1592, "We Shall Return"], _ - [1593, "Never Give Up"], _ - [1594, "Help Me"], _ - [1595, "Fall Back"], _ - [1596, "Incoming"], _ - [1597, "Theyre on Fire"], _ - [1598, "Never Surrender"], _ - [1599, "Its Just a Flesh Wound."], _ - [1600, "Barbed Spear"], _ - [1601, "Vicious Attack"], _ - [1602, "Stunning Strike"], _ - [1603, "Merciless Spear"], _ - [1604, "Disrupting Throw"], _ - [1605, "Wild Throw"], _ - [1606, "Curse of the Staff of the Mists"], _ - [1607, "Aura of the Staff of the Mists"], _ - [1608, "Power of the Staff of the Mists"], _ - [1609, "Scepter of Ether"], _ - [1610, "Summoning of the Scepter"], _ - [1611, "Rise From Your Grave"], _ - [1612, "Sugar Rush (long)"], _ - [1613, "Corsair (disguise)"], _ - [1614, "REMOVE (Queen Wail)"], _ - [1614, "REMOVE (Queen Armor)"], _ - [1616, "Queen Heal"], _ - [1617, "Queen Wail"], _ - [1618, "Queen Armor"], _ - [1619, "Queen Bite"], _ - [1620, "Queen Thump"], _ - [1621, "Queen Siege"], _ - [1622, "Junundu Tunnel (monster skill)"], _ - [1623, "Skin of Stone"], _ - [1624, "Dervish of the Mystic"], _ - [1625, "Dervish of the Wind"], _ - [1626, "Paragon of Leadership"], _ - [1627, "Paragon of Motivation"], _ - [1628, "Dervish of the Blade"], _ - [1629, "Paragon of Command"], _ - [1630, "Paragon of the Spear"], _ - [1631, "Dervish of the Earth"], _ - [1632, "Master of DPS"], _ - [1633, "Malicious Strike"], _ - [1634, "Shattering Assault"], _ - [1635, "Golden Skull Strike"], _ - [1636, "Black Spider Strike"], _ - [1637, "Golden Fox Strike"], _ - [1638, "Deadly Haste"], _ - [1639, "Assassins Remedy"], _ - [1640, "Foxs Promise"], _ - [1641, "Feigned Neutrality"], _ - [1642, "Hidden Caltrops"], _ - [1643, "Assault Enchantments"], _ - [1644, "Wastrels Collapse"], _ - [1645, "Lift Enchantment"], _ - [1646, "Augury of Death"], _ - [1647, "Signet of Toxic Shock"], _ - [1648, "Signet of Twilight"], _ - [1649, "Way of the Assassin"], _ - [1650, "Shadow Walk"], _ - [1651, "Deaths Retreat"], _ - [1652, "Shadow Prison"], _ - [1653, "Swap"], _ - [1654, "Shadow Meld"], _ - [1655, "Price of Pride"], _ - [1656, "Air of Disenchantment"], _ - [1657, "Signet of Clumsiness"], _ - [1658, "Symbolic Posture"], _ - [1659, "Toxic Chill"], _ - [1660, "Well of Silence"], _ - [1661, "Glowstone"], _ - [1662, "Mind Blast"], _ - [1663, "Elemental Flame"], _ - [1664, "Invoke Lightning"], _ - [1665, "Battle Cry"], _ - [1666, "Mending Shrine Bonus"], _ - [1667, "Energy Shrine Bonus"], _ - [1668, "Northern Health Shrine Bonus"], _ - [1669, "Southern Health Shrine Bonus"], _ - [1670, "Siege Attack (Bombardment)"], _ - [1671, "Curse of Silence"], _ - [1672, "To the Pain (Hero Battles)"], _ - [1673, "Edge of Reason"], _ - [1674, "Depths of Madness (environment effect)"], _ - [1675, "Cower in Fear"], _ - [1676, "Dreadful Pain"], _ - [1677, "Veiled Nightmare"], _ - [1678, "Base Protection"], _ - [1679, "Kournan Siege Flame"], _ - [1680, "Drake Skin"], _ - [1681, "Skale Vigor"], _ - [1682, "Pahnai Salad (item effect)"], _ - [1683, "Pensive Guardian"], _ - [1684, "Scribes Insight"], _ - [1685, "Holy Haste"], _ - [1686, "Glimmer of Light"], _ - [1687, "Zealous Benediction"], _ - [1688, "Defenders Zeal"], _ - [1689, "Signet of Mystic Wrath"], _ - [1690, "Signet of Removal"], _ - [1691, "Dismiss Condition"], _ - [1692, "Divert Hexes"], _ - [1693, "Counterattack"], _ - [1694, "Magehunter Strike"], _ - [1695, "Soldiers Strike"], _ - [1696, "Decapitate"], _ - [1697, "Magehunters Smash"], _ - [1698, "Soldiers Stance"], _ - [1699, "Soldiers Defense"], _ - [1700, "Frenzied Defense"], _ - [1701, "Steady Stance"], _ - [1702, "Steelfang Slash"], _ - [1703, "Sunspear Battle Call"], _ - [1704, "Untouchable"], _ - [1705, "Earth Shattering Blow"], _ - [1706, "Corrupt Power"], _ - [1707, "Words of Madness (Qwytzylkak)"], _ - [1708, "Gaze of MoavuKaal"], _ - [1709, "Presence of the Skale Lord"], _ - [1710, "Madness Dart"], _ - [1711, "The Apocrypha is changing to another form"], _ - [1715, "Reform Carvings"], _ - [1717, "Sunspear Siege"], _ - [1718, "Soul Torture"], _ - [1719, "Screaming Shot"], _ - [1720, "Keen Arrow"], _ - [1721, "Rampage as One"], _ - [1722, "Forked Arrow"], _ - [1723, "Disrupting Accuracy"], _ - [1724, "Experts Dexterity"], _ - [1725, "Roaring Winds"], _ - [1726, "Magebane Shot"], _ - [1727, "Natural Stride"], _ - [1728, "Hekets Rampage"], _ - [1729, "Smoke Trap"], _ - [1730, "Infuriating Heat"], _ - [1731, "Vocal Was Sogolon"], _ - [1732, "Destructive Was Glaive"], _ - [1733, "Wielders Strike"], _ - [1734, "Gaze of Fury"], _ - [1735, "Gaze of Fury (attack)"], _ - [1736, "Spirits Strength"], _ - [1737, "Wielders Zeal"], _ - [1738, "Sight Beyond Sight"], _ - [1739, "Renewing Memories"], _ - [1740, "Wielders Remedy"], _ - [1741, "Ghostmirror Light"], _ - [1742, "Signet of Ghostly Might"], _ - [1743, "Signet of Binding"], _ - [1744, "Caretakers Charge"], _ - [1745, "Anguish"], _ - [1746, "Anguish (attack)"], _ - [1747, "Empowerment"], _ - [1748, "Recovery"], _ - [1749, "Weapon of Fury"], _ - [1750, "Xinraes Weapon"], _ - [1751, "Warmongers Weapon"], _ - [1752, "Weapon of Remedy"], _ - [1753, "Rending Sweep"], _ - [1754, "Onslaught"], _ - [1755, "Mystic Corruption"], _ - [1756, "Grenths Grasp"], _ - [1757, "Veil of Thorns"], _ - [1758, "Harriers Grasp"], _ - [1759, "Vow of Strength"], _ - [1760, "Ebon Dust Aura"], _ - [1761, "Zealous Vow"], _ - [1762, "Heart of Fury"], _ - [1763, "Zealous Renewal"], _ - [1764, "Attackers Insight"], _ - [1765, "Rending Aura"], _ - [1766, "Featherfoot Grace"], _ - [1767, "Reapers Sweep"], _ - [1768, "Harriers Haste"], _ - [1769, "Focused Anger"], _ - [1770, "Natural Temper"], _ - [1771, "Song of Restoration"], _ - [1772, "Lyric of Purification"], _ - [1773, "Soldiers Fury"], _ - [1774, "Aggressive Refrain"], _ - [1775, "Energizing Finale"], _ - [1776, "Signet of Aggression"], _ - [1777, "Remedy Signet"], _ - [1778, "Signet of Return"], _ - [1779, "Make Your Time"], _ - [1780, "Cant Touch This"], _ - [1781, "Find Their Weakness"], _ - [1782, "The Power Is Yours"], _ - [1783, "Slayers Spear"], _ - [1784, "Swift Javelin"], _ - [1785, "Natures Speed"], _ - [1786, "Weapon of Mastery"], _ - [1787, "Accelerated Growth"], _ - [1788, "Forge the Way"], _ - [1789, "Anthem of Aggression"], _ - [1790, "Skale Hunt"], _ - [1791, "Mandragor Hunt"], _ - [1792, "Skree Battle"], _ - [1793, "Insect Hunt"], _ - [1794, "Corsair Bounty"], _ - [1795, "Plant Hunt"], _ - [1796, "Undead Hunt"], _ - [1797, "Eternal Suffering"], _ - [1798, "Eternal Suffering"], _ - [1799, "Eternal Suffering"], _ - [1800, "Eternal Languor"], _ - [1801, "Eternal Languor"], _ - [1802, "Eternal Languor"], _ - [1803, "Eternal Lethargy"], _ - [1804, "Eternal Lethargy"], _ - [1805, "Eternal Lethargy"], _ - [1808, "Thirst of the Drought"], _ - [1809, "Thirst of the Drought"], _ - [1810, "Thirst of the Drought"], _ - [1811, "Thirst of the Drought"], _ - [1812, "Thirst of the Drought"], _ - [1813, "Lightbringer"], _ - [1814, "Lightbringers Gaze"], _ - [1815, "Lightbringer Signet"], _ - [1816, "Sunspear Rebirth Signet"], _ - [1817, "Wisdom"], _ - [1818, "Maddened Strike"], _ - [1819, "Maddened Stance"], _ - [1820, "Spirit Form (Remains of Sahlahja)"], _ - [1821, "Gods Blessing"], _ - [1822, "Monster Hunt"], _ - [1823, "Monster Hunt"], _ - [1824, "Monster Hunt"], _ - [1825, "Monster Hunt"], _ - [1826, "Elemental Hunt"], _ - [1827, "Elemental Hunt"], _ - [1828, "Skree Battle"], _ - [1829, "Insect Hunt"], _ - [1830, "Insect Hunt"], _ - [1831, "Demon Hunt"], _ - [1832, "Minotaur Hunt"], _ - [1833, "Plant Hunt"], _ - [1834, "Plant Hunt"], _ - [1835, "Skale Hunt"], _ - [1836, "Skale Hunt"], _ - [1837, "Heket Hunt"], _ - [1838, "Heket Hunt"], _ - [1839, "Kournan Bounty"], _ - [1840, "Mandragor Hunt"], _ - [1841, "Mandragor Hunt"], _ - [1842, "Corsair Bounty"], _ - [1843, "Kournan Bounty"], _ - [1844, "Dhuum Battle"], _ - [1845, "Menzies Battle"], _ - [1846, "Elemental Hunt"], _ - [1847, "Monolith Hunt"], _ - [1848, "Monolith Hunt"], _ - [1849, "Margonite Battle"], _ - [1850, "Monster Hunt"], _ - [1851, "Titan Hunt"], _ - [1852, "Mandragor Hunt"], _ - [1853, "Giant Hunt"], _ - [1854, "Undead Hunt"], _ - [1855, "Kournan Siege"], _ - [1856, "Lose your Head"], _ - [1857, "Wandering Mind"], _ - [1859, "Altar Buff"], _ - [1860, "Sugar Rush (short)"], _ - [1861, "Choking Breath"], _ - [1862, "Junundu Bite"], _ - [1863, "Blinding Breath"], _ - [1864, "Burning Breath"], _ - [1865, "Junundu Wail"], _ - [1866, "Capture Point"], _ - [1867, "Approaching the Vortex"], _ - [1871, "Avatar of Sweetness"], _ - [1873, "Corrupted Lands"], _ - [1875, "Words of Madness"], _ - [1876, "Unknown Junundu Ability"], _ - [1880, "Torment Slash (Smothering Tendrils)"], _ - [1881, "Bonds of Torment"], _ - [1882, "Shadow Smash"], _ - [1883, "Bonds of Torment (effect)"], _ - [1884, "Consume Torment"], _ - [1885, "Banish Enchantment"], _ - [1886, "Summoning Shadows"], _ - [1887, "Lightbringers Insight"], _ - [1889, "Repressive Energy"], _ - [1890, "Enduring Torment"], _ - [1891, "Shroud of Darkness"], _ - [1892, "Demonic Miasma"], _ - [1893, "Enraged"], _ - [1894, "Touch of Aaaaarrrrrrggghhh"], _ - [1895, "Wild Smash"], _ - [1896, "Unyielding Anguish"], _ - [1897, "Jadoths Storm of Judgment"], _ - [1898, "Anguish Hunt"], _ - [1899, "Avatar of Holiday Cheer"], _ - [1900, "Side Step"], _ - [1901, "Jack Frost"], _ - [1902, "Avatar of Grenth (snow fighting skill)"], _ - [1903, "Avatar of Dwayna (snow fighting skill)"], _ - [1904, "Steady Aim"], _ - [1905, "Rudis Red Nose"], _ - [1910, "Charm Animal (White Mantle)"], _ - [1911, "Volatile Charr Crystal"], _ - [1912, "Hard mode"], _ - [1913, "Claim Resource (Heroes Ascent)"], _ - [1914, "Hard mode"], _ - [1915, "Hard Mode NPC Buff"], _ - [1916, "Sugar Jolt (short)"], _ - [1917, "Rollerbeetle Racer"], _ - [1918, "Ram"], _ - [1919, "Harden Shell"], _ - [1920, "Rollerbeetle Dash"], _ - [1921, "Super Rollerbeetle"], _ - [1922, "Rollerbeetle Echo"], _ - [1923, "Distracting Lunge"], _ - [1924, "Rollerbeetle Blast"], _ - [1925, "Spit Rocks"], _ - [1926, "Lunar Blessing"], _ - [1927, "Lucky Aura"], _ - [1928, "Spiritual Possession"], _ - [1929, "Water"], _ - [1930, "Pig Form"], _ - [1931, "Beetle Metamorphosis"], _ - [1933, "Sugar Jolt (long)"], _ - [1934, "Golden Egg (skill)"], _ - [1935, "Torturous Embers"], _ - [1936, "Test Buff"], _ - [1937, "Infernal Rage"], _ - [1938, "Putrid Flames"], _ - [1939, "Shroud of Ash"], _ - [1940, "Flame Call"], _ - [1941, "Torturers Inferno"], _ - [1942, "Whirling Fires"], _ - [1943, "Charr Siege Attack (What Must Be Done)"], _ - [1944, "Charr Siege Attack (Against the Charr)"], _ - [1945, "Birthday Cupcake (skill)"], _ - [1947, "Blessing of the Luxons"], _ - [1948, "Shadow Sanctuary"], _ - [1949, "Ether Nightmare"], _ - [1950, "Signet of Corruption"], _ - [1951, "Elemental Lord"], _ - [1952, "Selfless Spirit"], _ - [1953, "Triple Shot"], _ - [1954, "Save Yourselves"], _ - [1955, "Aura of Holy Might"], _ - [1957, "Spear of Fury"], _ - [1958, "Attribute Balance"], _ - [1959, "Monster Hunt"], _ - [1960, "Monster Hunt"], _ - [1961, "Mandragor Hunt"], _ - [1962, "Mandragor Hunt"], _ - [1963, "Giant Hunt"], _ - [1964, "Giant Hunt"], _ - [1965, "Skree Battle"], _ - [1966, "Skree Battle"], _ - [1967, "Insect Hunt"], _ - [1968, "Insect Hunt"], _ - [1969, "Minotaur Hunt"], _ - [1970, "Minotaur Hunt"], _ - [1971, "Corsair Bounty"], _ - [1972, "Corsair Bounty"], _ - [1973, "Plant Hunt"], _ - [1974, "Plant Hunt"], _ - [1975, "Skale Hunt"], _ - [1976, "Skale Hunt"], _ - [1977, "Heket Hunt"], _ - [1978, "Heket Hunt"], _ - [1979, "Kournan Bounty"], _ - [1980, "Kournan Bounty"], _ - [1981, "Undead Hunt"], _ - [1982, "Undead Hunt"], _ - [1983, "Fire Dart"], _ - [1984, "Ice Dart"], _ - [1985, "Poison Dart"], _ - [1986, "Vampiric Assault"], _ - [1987, "Lotus Strike"], _ - [1988, "Golden Fang Strike"], _ - [1989, "Way of the Mantis"], _ - [1990, "Falling Lotus Strike"], _ - [1991, "Sadists Signet"], _ - [1992, "Signet of Distraction"], _ - [1993, "Signet of Recall"], _ - [1994, "Power Lock"], _ - [1995, "Waste Not, Want Not"], _ - [1996, "Sum of All Fears"], _ - [1997, "Withering Aura"], _ - [1998, "Cacophony"], _ - [1999, "Winters Embrace"], _ - [2000, "Earthen Shackles"], _ - [2001, "Ward of Weakness"], _ - [2002, "Glyph of Swiftness"], _ - [2003, "Cure Hex"], _ - [2004, "Smite Condition"], _ - [2005, "Smiters Boon"], _ - [2006, "Castigation Signet"], _ - [2007, "Purifying Veil"], _ - [2008, "Pulverizing Smash"], _ - [2009, "Keen Chop"], _ - [2010, "Knee Cutter"], _ - [2011, "Grapple"], _ - [2012, "Radiant Scythe"], _ - [2013, "Grenths Aura"], _ - [2014, "Signet of Pious Restraint"], _ - [2015, "Farmers Scythe"], _ - [2016, "Energetic Was Lee Sa"], _ - [2017, "Anthem of Weariness"], _ - [2018, "Anthem of Disruption"], _ - [2019, "Burning Ground"], _ - [2020, "Freezing Ground"], _ - [2021, "Poison Ground"], _ - [2022, "Fire Jet"], _ - [2023, "Ice Jet"], _ - [2024, "Poison Jet"], _ - [2025, "Lava Pool"], _ - [2026, "Water Pool"], _ - [2027, "Fire Spout"], _ - [2028, "Ice Spout"], _ - [2029, "Poison Spout"], _ - [2030, "Dhuum Battle"], _ - [2031, "Dhuum Battle"], _ - [2032, "Elemental Hunt"], _ - [2033, "Elemental Hunt"], _ - [2034, "Monolith Hunt"], _ - [2035, "Monolith Hunt"], _ - [2036, "Margonite Battle"], _ - [2037, "Margonite Battle"], _ - [2038, "Menzies Battle"], _ - [2039, "Menzies Battle"], _ - [2040, "Anguish Hunt"], _ - [2041, "Titan Hunt"], _ - [2042, "Titan Hunt"], _ - [2043, "Monster Hunt"], _ - [2044, "Monster Hunt"], _ - [2045, "Sarcophagus Spores"], _ - [2046, "Exploding Barrel"], _ - [2047, "Greater Hard Mode NPC Buff"], _ - [2048, "Fire Boulder"], _ - [2049, "Dire Snowball"], _ - [2050, "Boulder"], _ - [2051, "Summon Spirits"], _ - [2052, "Shadow Fang"], _ - [2053, "Calculated Risk"], _ - [2054, "Shrinking Armor"], _ - [2055, "Aneurysm"], _ - [2056, "Wandering Eye"], _ - [2057, "Foul Feast"], _ - [2058, "Putrid Bile"], _ - [2059, "Shell Shock"], _ - [2060, "Glyph of Immolation"], _ - [2061, "Patient Spirit"], _ - [2062, "Healing Ribbon"], _ - [2063, "Aura of Stability"], _ - [2064, "Spotless Mind"], _ - [2065, "Spotless Soul"], _ - [2066, "Disarm"], _ - [2067, "I Meant to Do That"], _ - [2068, "Rapid Fire"], _ - [2069, "Sloth Hunters Shot"], _ - [2070, "Aura Slicer"], _ - [2071, "Zealous Sweep"], _ - [2072, "Pure Was Li Ming"], _ - [2073, "Weapon of Aggression"], _ - [2074, "Chest Thumper"], _ - [2075, "Hasty Refrain"], _ - [2076, "Drain Minion"], _ - [2077, "Cracked Armor"], _ - [2078, "Berserk"], _ - [2079, "Fleshreavers Escape"], _ - [2080, "Chomp"], _ - [2081, "Twisting Jaws"], _ - [2082, "Burning Immunity"], _ - [2083, "Mandragors Charge"], _ - [2084, "Rock Slide"], _ - [2085, "Avalanche (effect)"], _ - [2086, "Snaring Web"], _ - [2087, "Ceiling Collapse"], _ - [2088, "Trample"], _ - [2089, "Wurm Bile"], _ - [2090, "Ground Cover"], _ - [2091, "Shadow Sanctuary"], _ - [2092, "Ether Nightmare"], _ - [2093, "Signet of Corruption"], _ - [2094, "Elemental Lord"], _ - [2095, "Selfless Spirit"], _ - [2096, "Triple Shot"], _ - [2097, "Save Yourselves"], _ - [2098, "Aura of Holy Might"], _ - [2099, "Spear of Fury"], _ - [2100, "Summon Spirits"], _ - [2101, "Critical Agility"], _ - [2102, "Cry of Pain"], _ - [2103, "Necrosis"], _ - [2104, "Intensity"], _ - [2105, "Seed of Life"], _ - [2106, "Call of the Eye"], _ - [2107, "Whirlwind Attack"], _ - [2108, "Never Rampage Alone"], _ - [2109, "Eternal Aura"], _ - [2110, "Vampirism"], _ - [2111, "Vampirism (attack)"], _ - [2112, "Theres Nothing to Fear"], _ - [2113, "Ursan Rage (Blood Washes Blood)"], _ - [2114, "Ursan Strike (Blood Washes Blood)"], _ - [2116, "Sneak Attack"], _ - [2117, "Firebomb Explosion"], _ - [2118, "Firebomb"], _ - [2119, "Shield of Fire"], _ - [2120, "Respawn"], _ - [2121, "Marked For Death"], _ - [2122, "Spirit World Retreat"], _ - [2123, "Long Claws"], _ - [2124, "Shattered Spirit"], _ - [2125, "Spirit Roar"], _ - [2126, "Spirit Senses"], _ - [2127, "Unseen Aggression"], _ - [2128, "Volfen Pounce (Curse of the Nornbear)"], _ - [2129, "Volfen Claw (Curse of the Nornbear)"], _ - [2131, "Volfen Bloodlust (Curse of the Nornbear)"], _ - [2132, "Volfen Agility (Curse of the Nornbear)"], _ - [2133, "Volfen Blessing (Curse of the Nornbear)"], _ - [2134, "Charging Spirit"], _ - [2135, "Trampling Ox"], _ - [2136, "Smoke Powder Defense"], _ - [2137, "Confusing Images"], _ - [2138, "Hexers Vigor"], _ - [2139, "Masochism"], _ - [2140, "Piercing Trap"], _ - [2141, "Companionship"], _ - [2142, "Feral Aggression"], _ - [2143, "Disrupting Shot"], _ - [2144, "Volley"], _ - [2145, "Expert Focus"], _ - [2146, "Pious Fury"], _ - [2147, "Crippling Victory"], _ - [2148, "Sundering Weapon"], _ - [2149, "Weapon of Renewal"], _ - [2150, "Maiming Spear"], _ - [2151, "Temporal Sheen"], _ - [2152, "Flux Overload"], _ - [2153, "A pool of water."], _ - [2154, "Phase Shield (effect)"], _ - [2155, "Phase Shield (monster skill)"], _ - [2156, "Vitality Transfer"], _ - [2157, "Golem Strike"], _ - [2158, "Bloodstone Slash"], _ - [2159, "Energy Blast (golem)"], _ - [2160, "Chaotic Energy"], _ - [2161, "Golem Fire Shield"], _ - [2162, "The Way of Duty"], _ - [2163, "The Way of Kinship"], _ - [2164, "Diamondshard Mist (environment effect)"], _ - [2165, "Diamondshard Grave"], _ - [2166, "The Way of Strength"], _ - [2167, "Diamondshard Mist"], _ - [2168, "Raven Blessing (A Gate Too Far)"], _ - [2170, "Raven Flight (A Gate Too Far)"], _ - [2171, "Raven Shriek (A Gate Too Far)"], _ - [2172, "Raven Swoop (A Gate Too Far)"], _ - [2173, "Raven Talons (A Gate Too Far)"], _ - [2174, "Aspect of Oak"], _ - [2175, "Long Claws"], _ - [2176, "Tremor"], _ - [2177, "Rage of the Jotun"], _ - [2178, "Thundering Roar"], _ - [2179, "Sundering Soulcrush"], _ - [2180, "Pyroclastic Shot"], _ - [2181, "Explosive Force"], _ - [2184, "Rolling Shift"], _ - [2185, "Powder Keg Explosion"], _ - [2186, "Signet of Deadly Corruption"], _ - [2187, "Way of the Master"], _ - [2188, "Defile Defenses"], _ - [2189, "Angorodons Gaze"], _ - [2190, "Magnetic Surge"], _ - [2191, "Slippery Ground"], _ - [2192, "Glowing Ice"], _ - [2193, "Energy Blast"], _ - [2194, "Distracting Strike"], _ - [2195, "Symbolic Strike"], _ - [2196, "Soldiers Speed"], _ - [2197, "Body Blow"], _ - [2198, "Body Shot"], _ - [2199, "Poison Tip Signet"], _ - [2200, "Signet of Mystic Speed"], _ - [2201, "Shield of Force"], _ - [2202, "Mending Grip"], _ - [2203, "Spiritleech Aura"], _ - [2204, "Rejuvenation"], _ - [2205, "Agony"], _ - [2206, "Ghostly Weapon"], _ - [2207, "Inspirational Speech"], _ - [2208, "Burning Shield"], _ - [2209, "Holy Spear"], _ - [2210, "Spear Swipe"], _ - [2211, "Alkars Alchemical Acid"], _ - [2212, "Light of Deldrimor"], _ - [2213, "Ear Bite"], _ - [2214, "Low Blow"], _ - [2215, "Brawling Headbutt"], _ - [2216, "Dont Trip"], _ - [2217, "By Urals Hammer"], _ - [2218, "Drunken Master"], _ - [2219, "Great Dwarf Weapon"], _ - [2220, "Great Dwarf Armor"], _ - [2221, "Breath of the Great Dwarf"], _ - [2222, "Snow Storm"], _ - [2223, "Black Powder Mine"], _ - [2224, "Summon Mursaat"], _ - [2225, "Summon Ruby Djinn"], _ - [2226, "Summon Ice Imp"], _ - [2227, "Summon Naga Shaman"], _ - [2228, "Deft Strike"], _ - [2229, "Signet of Infection"], _ - [2230, "Tryptophan Signet"], _ - [2231, "Ebon Battle Standard of Courage"], _ - [2232, "Ebon Battle Standard of Wisdom"], _ - [2233, "Ebon Battle Standard of Honor"], _ - [2234, "Ebon Vanguard Sniper Support"], _ - [2235, "Ebon Vanguard Assassin Support"], _ - [2236, "Well of Ruin"], _ - [2237, "Atrophy"], _ - [2238, "Spear of Redemption"], _ - [2240, "Gelatinous Material Explosion"], _ - [2241, "Gelatinous Corpse Consumption"], _ - [2242, "Gelatinous Mutation"], _ - [2243, "Gelatinous Absorption"], _ - [2244, "Unstable Ooze Explosion"], _ - [2245, "Golem Shrapnel"], _ - [2246, "Unstable Aura"], _ - [2247, "Unstable Pulse"], _ - [2248, "Polymock Power Drain"], _ - [2249, "Polymock Block"], _ - [2250, "Polymock Glyph of Concentration"], _ - [2251, "Polymock Ether Signet"], _ - [2252, "Polymock Glyph of Power"], _ - [2253, "Polymock Overload"], _ - [2254, "Polymock Glyph Destabilization"], _ - [2255, "Polymock Mind Wreck"], _ - [2256, "Order of Unholy Vigor"], _ - [2257, "Order of the Lich"], _ - [2258, "Master of Necromancy"], _ - [2259, "Animate Undead"], _ - [2260, "Polymock Deathly Chill"], _ - [2261, "Polymock Rising Bile"], _ - [2262, "Polymock Rotting Flesh"], _ - [2263, "Polymock Lightning Strike"], _ - [2264, "Polymock Lightning Orb"], _ - [2265, "Polymock Lightning Djinns Haste"], _ - [2266, "Polymock Flare"], _ - [2267, "Polymock Immolate"], _ - [2268, "Polymock Meteor"], _ - [2269, "Polymock Ice Spear"], _ - [2270, "Polymock Icy Prison"], _ - [2271, "Polymock Mind Freeze"], _ - [2272, "Polymock Ice Shard Storm"], _ - [2273, "Polymock Frozen Trident"], _ - [2274, "Polymock Smite"], _ - [2275, "Polymock Smite Hex"], _ - [2276, "Polymock Bane Signet"], _ - [2277, "Polymock Stone Daggers"], _ - [2278, "Polymock Obsidian Flame"], _ - [2279, "Polymock Earthquake"], _ - [2280, "Polymock Frozen Armor"], _ - [2281, "Polymock Glyph Freeze"], _ - [2282, "Polymock Fireball"], _ - [2283, "Polymock Rodgorts Invocation"], _ - [2284, "Polymock Calculated Risk"], _ - [2285, "Polymock Recurring Insecurity"], _ - [2286, "Polymock Backfire"], _ - [2287, "Polymock Guilt"], _ - [2288, "Polymock Lamentation"], _ - [2289, "Polymock Spirit Rift"], _ - [2290, "Polymock Painful Bond"], _ - [2291, "Polymock Signet of Clumsiness"], _ - [2292, "Polymock Migraine"], _ - [2293, "Polymock Glowing Gaze"], _ - [2294, "Polymock Searing Flames"], _ - [2295, "Polymock Signet of Revenge"], _ - [2296, "Polymock Signet of Smiting"], _ - [2297, "Polymock Stoning"], _ - [2298, "Polymock Eruption"], _ - [2299, "Polymock Shock Arrow"], _ - [2300, "Polymock Mind Shock"], _ - [2301, "Polymock Piercing Light Spear"], _ - [2302, "Polymock Mind Blast"], _ - [2303, "Polymock Savannah Heat"], _ - [2304, "Polymock Diversion"], _ - [2305, "Polymock Lightning Blast"], _ - [2306, "Polymock Poisoned Ground"], _ - [2307, "Polymock Icy Bonds"], _ - [2308, "Polymock Sandstorm"], _ - [2309, "Polymock Banish"], _ - [2310, "Mergoyle Form"], _ - [2311, "Skale Form"], _ - [2312, "Gargoyle Form"], _ - [2313, "Ice Imp Form"], _ - [2314, "Fire Imp Form"], _ - [2315, "Kappa Form"], _ - [2316, "Aloe Seed Form"], _ - [2317, "Earth Elemental Form"], _ - [2318, "Fire Elemental Form"], _ - [2319, "Ice Elemental Form"], _ - [2320, "Mirage Iboga Form"], _ - [2321, "Wind Rider Form"], _ - [2322, "Naga Shaman Form"], _ - [2323, "Mantis Dreamweaver Form"], _ - [2324, "Ruby Djinn Form"], _ - [2325, "Gaki Form"], _ - [2326, "Stone Rain Form"], _ - [2327, "Mursaat Elementalist Form"], _ - [2328, "Crystal Shield"], _ - [2329, "Crystal Snare"], _ - [2330, "Paranoid Indignation"], _ - [2331, "Searing Breath"], _ - [2332, "Kraks Charge"], _ - [2333, "Brawling"], _ - [2334, "Brawling Block"], _ - [2335, "Brawling Jab"], _ - [2336, "Brawling Jab"], _ - [2337, "Brawling Straight Right"], _ - [2338, "Brawling Hook"], _ - [2339, "Brawling Hook"], _ - [2340, "Brawling Uppercut"], _ - [2341, "Brawling Combo Punch"], _ - [2342, "Brawling Headbutt (Brawling skill)"], _ - [2343, "STAND UP"], _ - [2344, "Call of Destruction"], _ - [2345, "Flame Jet"], _ - [2346, "Lava Ground"], _ - [2347, "Lava Wave"], _ - [2349, "Spirit Shield"], _ - [2350, "Summoning Lord"], _ - [2351, "Charm Animal (Ashlyn Spiderfriend)"], _ - [2352, "Charr Siege Attack (Assault on the Stronghold)"], _ - [2353, "Finish Him"], _ - [2354, "Dodge This"], _ - [2355, "I Am the Strongest"], _ - [2356, "I Am Unstoppable"], _ - [2357, "A Touch of Guile"], _ - [2358, "You Move Like a Dwarf"], _ - [2359, "You Are All Weaklings"], _ - [2360, "Feel No Pain"], _ - [2361, "Club of a Thousand Bears"], _ - [2363, "Talon Strike"], _ - [2364, "Lava Blast"], _ - [2365, "Thunderfist Strike"], _ - [2367, "Alkars Concoction"], _ - [2368, "Murakais Consumption"], _ - [2369, "Murakais Censure"], _ - [2370, "Murakais Calamity"], _ - [2371, "Murakais Storm of Souls"], _ - [2372, "Edification"], _ - [2373, "Heart of the Norn"], _ - [2374, "Ursan Blessing"], _ - [2375, "Ursan Strike"], _ - [2376, "Ursan Rage"], _ - [2377, "Ursan Roar"], _ - [2378, "Ursan Force"], _ - [2379, "Volfen Blessing"], _ - [2380, "Volfen Claw"], _ - [2381, "Volfen Pounce"], _ - [2382, "Volfen Bloodlust"], _ - [2383, "Volfen Agility"], _ - [2384, "Raven Blessing"], _ - [2385, "Raven Talons"], _ - [2386, "Raven Swoop"], _ - [2387, "Raven Shriek"], _ - [2388, "Raven Flight"], _ - [2389, "Totem of Man"], _ - [2390, "Filthy Explosion"], _ - [2391, "Murakais Call"], _ - [2392, "Spawn Pods"], _ - [2393, "Enraged Blast"], _ - [2394, "Spawn Hatchling"], _ - [2395, "Ursan Roar (Blood Washes Blood)"], _ - [2396, "Ursan Force (Blood Washes Blood)"], _ - [2397, "Ursan Aura"], _ - [2398, "Consume Flames"], _ - [2399, "Aura of the Great Destroyer"], _ - [2400, "Destroy the Humans"], _ - [2401, "Charr Flame Keeper Form"], _ - [2402, "Titan Form"], _ - [2403, "Skeletal Mage Form"], _ - [2404, "Smoke Wraith Form"], _ - [2405, "Bone Dragon Form"], _ - [2407, "Dwarven Arcanist Form"], _ - [2408, "Dolyak Rider Form"], _ - [2409, "Extract Inscription"], _ - [2410, "Charr Shaman Form"], _ - [2411, "Mindbender"], _ - [2412, "Smooth Criminal"], _ - [2413, "Technobabble"], _ - [2414, "Radiation Field"], _ - [2415, "Asuran Scan"], _ - [2416, "Air of Superiority"], _ - [2417, "Mental Block"], _ - [2418, "Pain Inverter"], _ - [2419, "Healing Salve"], _ - [2420, "Ebon Escape"], _ - [2421, "Weakness Trap"], _ - [2422, "Winds"], _ - [2423, "Dwarven Stability"], _ - [2424, "Stout-Hearted"], _ - [2425, "Inscribed Ettin Aura"], _ - [2426, "Decipher Inscriptions"], _ - [2427, "Rebel Yell"], _ - [2429, "Asuran Flame Staff"], _ - [2430, "Aura of the Bloodstone"], _ - [2431, "Aura of the Bloodstone"], _ - [2432, "Aura of the Bloodstone"], _ - [2433, "Haunted Ground"], _ - [2434, "Asuran Bodyguard"], _ - [2435, "Asuran Bodyguard"], _ - [2436, "Asuran Bodyguard"], _ - [2437, "Energy Channel"], _ - [2438, "Hunt Rampage"], _ - [2440, "Boss Bounty"], _ - [2441, "Hunt Point Bonus"], _ - [2442, "Hunt Point Bonus"], _ - [2443, "Hunt Point Bonus"], _ - [2444, "Time Attack"], _ - [2445, "Dwarven Raider"], _ - [2446, "Dwarven Raider"], _ - [2447, "Dwarven Raider"], _ - [2448, "Dwarven Raider"], _ - [2449, "Great Dwarfs Blessing"], _ - [2450, "Hunt Rampage"], _ - [2452, "Boss Bounty"], _ - [2453, "Hunt Point Bonus"], _ - [2454, "Hunt Point Bonus"], _ - [2456, "Time Attack"], _ - [2457, "Vanguard Patrol"], _ - [2458, "Vanguard Patrol"], _ - [2459, "Vanguard Patrol"], _ - [2460, "Vanguard Patrol"], _ - [2461, "Vanguard Commendation"], _ - [2462, "Hunt Rampage"], _ - [2464, "Boss Bounty"], _ - [2469, "Norn Hunting Party"], _ - [2470, "Norn Hunting Party"], _ - [2471, "Norn Hunting Party"], _ - [2472, "Norn Hunting Party"], _ - [2473, "Strength of the Norn"], _ - [2474, "Hunt Rampage"], _ - [2481, "Asuran Bodyguard"], _ - [2482, "Desperate Howl"], _ - [2483, "Gloat"], _ - [2484, "Metamorphosis"], _ - [2485, "Inner Fire"], _ - [2486, "Elemental Shift"], _ - [2487, "Dryders Feast"], _ - [2488, "Fungal Explosion"], _ - [2489, "Blood Rage"], _ - [2490, "Parasitic Bite"], _ - [2491, "False Death"], _ - [2492, "Ooze Combination"], _ - [2493, "Ooze Division"], _ - [2494, "Bear Form"], _ - [2495, "Sweeping Strikes"], _ - [2496, "Spore Explosion"], _ - [2497, "Dormant Husk"], _ - [2498, "Monkey See, Monkey Do"], _ - [2499, "Feeding Frenzy"], _ - [2500, "Tengus Mimicry"], _ - [2501, "Tongue Lash"], _ - [2502, "Soulrending Shriek"], _ - [2503, "Unreliable"], _ - [2504, "Siege Devourer"], _ - [2505, "Siege Devourer Feast"], _ - [2506, "Devourer Bite"], _ - [2507, "Siege Devourer Swipe"], _ - [2508, "Devourer Siege"], _ - [2509, "HYAHHHHH"], _ - [2510, "HYAHHHHH"], _ - [2511, "HYAHHHHH"], _ - [2512, "HYAHHHHH"], _ - [2513, "Dismount Siege Devourer"], _ - [2514, "The Masters Mark"], _ - [2515, "The Snipers Spear"], _ - [2516, "Mount"], _ - [2517, "Reverse Polarity Fire Shield"], _ - [2518, "Tengus Gaze"], _ - [2519, "Fix Monster Attributes"], _ - [2520, "Armor of Salvation (item effect)"], _ - [2521, "Grail of Might (item effect)"], _ - [2522, "Essence of Celerity (item effect)"], _ - [2523, "Stone Dwarf Transformation"], _ - [2524, "Forgewights Blessing"], _ - [2525, "Selvetarms Blessing"], _ - [2526, "Thommiss Blessing"], _ - [2527, "Duncans Defense"], _ - [2529, "Rands Attack"], _ - [2530, "Selvetarms Attack"], _ - [2531, "Thommiss Attack"], _ - [2532, "Create Spore"], _ - [2536, "Invigorating Mist"], _ - [2537, "Courageous Was Saidra"], _ - [2538, "Animate Undead (Palawa Joko)"], _ - [2539, "Order of Unholy Vigor (Palawa Joko)"], _ - [2540, "Order of the Lich (Palawa Joko)"], _ - [2541, "Golem Boosters"], _ - [2542, "Charm Animal (monster)"], _ - [2543, "Wurm Siege (Eye of the North)"], _ - [2544, "Tongue Whip"], _ - [2545, "Lit Torch"], _ - [2546, "Dishonorable"], _ - [2547, "Hard Mode Dungeon Boss"], _ - [2548, "Veteran Asuran Bodyguard"], _ - [2549, "Veteran Dwarven Raider"], _ - [2550, "Veteran Vanguard Patrol"], _ - [2551, "Veteran Norn Hunting Party"], _ - [2565, "Dwarven Raider"], _ - [2566, "Dwarven Raider"], _ - [2567, "Dwarven Raider"], _ - [2568, "Dwarven Raider"], _ - [2570, "Great Dwarfs Blessing"], _ - [2571, "Boss Bounty"], _ - [2574, "Hunt Point Bonus"], _ - [2575, "Hunt Point Bonus"], _ - [2576, "Hunt Rampage"], _ - [2577, "Time Attack"], _ - [2578, "Vanguard Patrol"], _ - [2583, "Boss Bounty"], _ - [2585, "Hunt Point Bonus"], _ - [2589, "Vanguard Commendation"], _ - [2591, "Norn Hunting Party"], _ - [2592, "Norn Hunting Party"], _ - [2593, "Norn Hunting Party"], _ - [2594, "Norn Hunting Party"], _ - [2596, "Boss Bounty"], _ - [2598, "Strength of the Norn"], _ - [2599, "Hunt Point Bonus"], _ - [2601, "Hunt Point Bonus"], _ - [2602, "Hunt Rampage"], _ - [2603, "Time Attack"], _ - [2604, "Candy Corn (skill)"], _ - [2605, "Candy Apple (skill)"], _ - [2606, "Anton (Costume Brawl disguise)"], _ - [2607, "Erys Vasburg (Costume Brawl disguise)"], _ - [2608, "Olias (Costume Brawl disguise)"], _ - [2609, "Argo (Costume Brawl disguise)"], _ - [2610, "Mhenlo (Costume Brawl disguise)"], _ - [2611, "Lukas (Costume Brawl disguise)"], _ - [2612, "Aidan (Costume Brawl disguise)"], _ - [2613, "Kahmu (Costume Brawl disguise)"], _ - [2614, "Razah (Costume Brawl disguise)"], _ - [2615, "Morgahn (Costume Brawl disguise)"], _ - [2616, "Nika (Costume Brawl disguise)"], _ - [2617, "Seaguard Hala (Costume Brawl disguise)"], _ - [2618, "Livia (Costume Brawl disguise)"], _ - [2619, "Cynn (Costume Brawl disguise)"], _ - [2620, "Tahlkora (Costume Brawl disguise)"], _ - [2621, "Devona (Costume Brawl disguise)"], _ - [2622, "Zho (Costume Brawl disguise)"], _ - [2623, "Melonni (Costume Brawl disguise)"], _ - [2624, "Xandra (Costume Brawl disguise)"], _ - [2625, "Hayda (Costume Brawl disguise)"], _ - [2626, "Complicate"], _ - [2627, "Reapers Mark"], _ - [2628, "Enfeeble"], _ - [2630, "Signet of Lost Souls"], _ - [2632, "Searing Flames"], _ - [2633, "Glowing Gaze"], _ - [2634, "Steam"], _ - [2635, "Flame Djinns Haste"], _ - [2636, "Liquid Flame"], _ - [2639, "Smite Condition"], _ - [2640, "Crippling Slash"], _ - [2641, "Sun and Moon Slash"], _ - [2642, "Enraging Charge"], _ - [2643, "Tiger Stance"], _ - [2644, "Burning Arrow"], _ - [2645, "Natural Stride"], _ - [2646, "Falling Lotus Strike"], _ - [2647, "Anthem of Weariness"], _ - [2648, "Pious Fury"], _ - [2649, "Pie Induced Ecstasy"], _ - [2650, "Charm Animal (Charr Demolisher)"], _ - [2651, "Togo (disguise)"], _ - [2652, "Turai Ossa (disguise)"], _ - [2653, "Gwen (disguise)"], _ - [2654, "Saul DAlessio (disguise)"], _ - [2655, "Dragon Empire Rage"], _ - [2656, "Call to the Spirit Realm"], _ - [2657, "Call of Haste (PvP)"], _ - [2658, "Hide"], _ - [2659, "Feign Death"], _ - [2660, "Flee"], _ - [2661, "Throw Rock"], _ - [2662, "Nightmarish Aura"], _ - [2663, "Siege Strike"], _ - [2664, "Spike Trap (spell)"], _ - [2665, "Barbed Bomb"], _ - [2666, "Fire and Brimstone"], _ - [2667, "Balm Bomb"], _ - [2668, "Explosives"], _ - [2669, "Rations"], _ - [2670, "Form Up and Advance"], _ - [2671, "Advance"], _ - [2672, "Spectral Agony (Saul DAlessio)"], _ - [2673, "Stun Bomb"], _ - [2674, "Banner of the Unseen"], _ - [2675, "Signet of the Unseen"], _ - [2676, "For Elona"], _ - [2677, "Giant Stomp (Turai Ossa)"], _ - [2678, "Whirlwind Attack (Turai Ossa)"], _ - [2679, "Junundu Siege"], _ - [2680, "Distortion (Gwen)"], _ - [2681, "Shared Burden (Gwen)"], _ - [2682, "Sum of All Fears (Gwen)"], _ - [2683, "Castigation Signet (Saul DAlessio)"], _ - [2684, "Unnatural Signet (Saul DAlessio)"], _ - [2685, "Dragon Slash (Turai Ossa)"], _ - [2686, "Essence Strike (Togo)"], _ - [2687, "Spirit Burn (Togo)"], _ - [2688, "Spirit Rift (Togo)"], _ - [2689, "Mend Body and Soul (Togo)"], _ - [2690, "Offering of Spirit (Togo)"], _ - [2691, "Disenchantment (Togo)"], _ - [2692, "Fire Dart"], _ - [2698, "Corrupted Haiju Lagoon Water"], _ - [2699, "Journey to the North"], _ - [2701, "Rat Form"], _ - [2702, "Ox Form"], _ - [2703, "Tiger Form"], _ - [2704, "Rabbit Form"], _ - [2705, "Dragon Form"], _ - [2706, "Snake Form"], _ - [2707, "Horse Form"], _ - [2708, "Sheep Form"], _ - [2709, "Monkey Form"], _ - [2710, "Rooster Form"], _ - [2711, "Dog Form"], _ - [2712, "Party Time"], _ - [2713, "Victory is Ours"], _ - [2714, "Dark Soul Explosion"], _ - [2715, "Chaotic Soul Explosion"], _ - [2716, "Fiery Soul Explosion"], _ - [2717, "Rejuvenating Soul Explosion"], _ - [2718, "Plague Spring"], _ - [2719, "Unbalancing Soul Explosion"], _ - [2720, "Shadowy Soul Explosion"], _ - [2721, "Ethereal Soul Explosion"], _ - [2722, "Redemption of Purity"], _ - [2723, "Purify Energy"], _ - [2724, "Purifying Flame"], _ - [2725, "Purifying Prayer"], _ - [2726, "Strength of Purity"], _ - [2727, "Spring of Purity"], _ - [2728, "Way of the Pure"], _ - [2729, "Purify Soul"], _ - [2730, "Aura of Purity"], _ - [2731, "Anthem of Purity"], _ - [2732, "Falkens Fire Fist"], _ - [2733, "Falken Quick"], _ - [2734, "Mind Wrack (PvP)"], _ - [2735, "Quickening Terrain"], _ - [2736, "Massive Damage"], _ - [2737, "Minion Apocalypse"], _ - [2739, "Combat Costume (Assassin)"], _ - [2740, "Combat Costume (Mesmer)"], _ - [2741, "Combat Costume (Necromancer)"], _ - [2742, "Combat Costume (Elementalist)"], _ - [2743, "Combat Costume (Monk)"], _ - [2744, "Combat Costume (Warrior)"], _ - [2745, "Combat Costume (Ranger)"], _ - [2746, "Combat Costume (Dervish)"], _ - [2747, "Combat Costume (Ritualist)"], _ - [2748, "Combat Costume (Paragon)"], _ - [2755, "Jade Brotherhood Bomb"], _ - [2756, "Mad Kings Fan"], _ - [2758, "Candy Corn Strike"], _ - [2759, "Rocket-Propelled Gobstopper"], _ - [2760, "Rain of Terror (spell)"], _ - [2761, "Cry of Madness"], _ - [2762, "Sugar Infusion"], _ - [2763, "Feast of Vengeance"], _ - [2764, "Animate Candy Minions"], _ - [2765, "Taste of Undeath"], _ - [2766, "Scourge of Candy"], _ - [2767, "Motivating Insults"], _ - [2768, "Mad King Pony Support"], _ - [2769, "Its Good to Be King"], _ - [2770, "Maddening Laughter"], _ - [2771, "Mad Kings Influence"], _ - [2792, "Hidden Talent"], _ - [2793, "Couriers Haste"], _ - [2794, "Xinraes Revenge"], _ - [2810, "Meek Shall Inherit"], _ - [2813, "Inverse Ninja Law"], _ - [2839, "Abyssal Form"], _ - [2840, "Asura Form"], _ - [2841, "Awakened Head Form"], _ - [2842, "Spider Form"], _ - [2843, "Charr Form"], _ - [2844, "Golem Form"], _ - [2845, "Hellhound Form"], _ - [2846, "Norn Form"], _ - [2847, "Ooze Form"], _ - [2848, "Rift Warden Form"], _ - [2850, "Yeti Form"], _ - [2851, "Snowman Form"], _ - [2852, "Energy Drain (PvP)"], _ - [2853, "Energy Tap (PvP)"], _ - [2854, "PvP (effect)"], _ - [2855, "Ward Against Melee (PvP)"], _ - [2856, "Lightning Orb (PvP)"], _ - [2857, "Aegis (PvP)"], _ - [2858, "Watch Yourself (PvP)"], _ - [2859, "Enfeeble (PvP)"], _ - [2860, "Ether Renewal (PvP)"], _ - [2861, "Penetrating Attack (PvP)"], _ - [2862, "Shadow Form (PvP)"], _ - [2863, "Discord (PvP)"], _ - [2864, "Sundering Attack (PvP)"], _ - [2865, "Ritual Lord (PvP)"], _ - [2866, "Flesh of My Flesh (PvP)"], _ - [2867, "Ancestors Rage (PvP)"], _ - [2868, "Splinter Weapon (PvP)"], _ - [2869, "Assassins Remedy (PvP)"], _ - [2870, "Blinding Surge (PvP)"], _ - [2871, "Light of Deliverance (PvP)"], _ - [2872, "Death Pact Signet (PvP)"], _ - [2873, "Mystic Sweep (PvP)"], _ - [2874, "Eremites Attack (PvP)"], _ - [2875, "Harriers Toss (PvP)"], _ - [2876, "Defensive Anthem (PvP)"], _ - [2877, "Ballad of Restoration (PvP)"], _ - [2878, "Song of Restoration (PvP)"], _ - [2879, "Incoming (PvP)"], _ - [2880, "Never Surrender (PvP)"], _ - [2882, "Mantra of Inscriptions (PvP)"], _ - [2883, "For Great Justice (PvP)"], _ - [2884, "Mystic Regeneration (PvP)"], _ - [2885, "Enfeebling Blood (PvP)"], _ - [2886, "Summoning Sickness"], _ - [2887, "Signet of Judgment (PvP)"], _ - [2888, "Chilling Victory (PvP)"], _ - [2891, "Unyielding Aura (PvP)"], _ - [2892, "Spirit Bond (PvP)"], _ - [2893, "Weapon of Warding (PvP)"], _ - [2894, "Bamph-Lite"], _ - [2895, "Smiters Boon (PvP)"], _ - [2896, "Battle Fervor (Deactivating R.O.X.)"], _ - [2897, "Cloak of Faith (Deactivating R.O.X.)"], _ - [2898, "Dark Aura (Deactivating R.O.X.)"], _ - [2899, "Chaotic Power (Deactivating R.O.X.)"], _ - [2900, "Strength of the Oak (Deactivating R.O.X.)"], _ - [2901, "Sinister Golem Form"], _ - [2902, "Reactor Blast"], _ - [2903, "Reactor Blast Timer"], _ - [2904, "Jade Brotherhood Disguise"], _ - [2905, "Internal Power Engaged"], _ - [2906, "Target Acquisition"], _ - [2907, "N.O.X. Beam"], _ - [2908, "N.O.X. Field Dash"], _ - [2909, "N.O.X.ion Buster"], _ - [2910, "Countdown"], _ - [2911, "Bit Golem Breaker"], _ - [2912, "Bit Golem Rectifier"], _ - [2913, "Bit Golem Crash"], _ - [2914, "Bit Golem Force"], _ - [2916, "N.O.X. Phantom"], _ - [2917, "N.O.X. Thunder"], _ - [2918, "N.O.X. Lock On"], _ - [2919, "N.O.X. Driver"], _ - [2920, "N.O.X. Fire"], _ - [2921, "N.O.X. Knuckle"], _ - [2922, "N.O.X. Divider Drive"], _ - [2923, "Yo Ho Ho and a Bottle of Grog"], _ - [2924, "Oath of Protection"], _ - [2925, "Sloth Hunters Shot (PvP)"], _ - [2926, "Bamph Lifesteal"], _ - [2927, "Shrine Backlash"], _ - [2928, "Amulet of Protection"], _ - [2957, "Western Health Shrine Bonus"], _ - [2958, "Eastern Health Shrine Bonus"], _ - [2959, "Experts Dexterity (PvP)"], _ - [2961, "Delayed Blast BAMPH"], _ - [2962, "Grentch Form"], _ - [2964, "Snowball"], _ - [2965, "Signet of Spirits (PvP)"], _ - [2966, "Signet of Ghostly Might (PvP)"], _ - [2967, "Avatar of Grenth (PvP)"], _ - [2968, "Oversized Tonic Warning"], _ - [2969, "Read the Wind (PvP)"], _ - [2970, "Mursaat Form"], _ - [2971, "Blue Rock Candy Rush"], _ - [2972, "Green Rock Candy Rush"], _ - [2973, "Red Rock Candy Rush"], _ - [2974, "Archer Form"], _ - [2975, "Avatar of Balthazar Form"], _ - [2976, "Champion of Balthazar Form"], _ - [2977, "Priest of Balthazar Form"], _ - [2978, "The Black Beast of Arrgh Form"], _ - [2979, "Crystal Guardian Form"], _ - [2980, "Crystal Spider Form"], _ - [2981, "Bone Dragon Form"], _ - [2982, "Saltspray Dragon Form"], _ - [2983, "Eye of Janthir Form"], _ - [2984, "Footman Form"], _ - [2985, "Ghostly Hero Form"], _ - [2986, "Guild Lord Form"], _ - [2987, "Gwen Doll Form"], _ - [2988, "Black Moa Form"], _ - [2989, "Black Moa Chick Form"], _ - [2990, "Moa Bird Form"], _ - [2991, "White Moa Form"], _ - [2992, "Rainbow Phoenix Form"], _ - [2993, "Brown Rabbit Form"], _ - [2994, "White Rabbit Form"], _ - [2995, "Seer Form"], _ - [2996, "Swarm of Bees Form"], _ - [2997, "Seed of Resurrection"], _ - [2998, "Fragility (PvP)"], _ - [2999, "Strength of Honor (PvP)"], _ - [3000, "Gunthers Gaze"], _ - [3002, "Warriors Endurance (PvP)"], _ - [3003, "Armor of Unfeeling (PvP)"], _ - [3004, "Signet of Creation (PvP)"], _ - [3005, "Union (PvP)"], _ - [3006, "Shadowsong (PvP)"], _ - [3007, "Pain (PvP)"], _ - [3008, "Destruction (PvP)"], _ - [3009, "Soothing (PvP)"], _ - [3010, "Displacement (PvP)"], _ - [3011, "Preservation (PvP)"], _ - [3012, "Life (PvP)"], _ - [3013, "Recuperation (PvP)"], _ - [3014, "Dissonance (PvP)"], _ - [3015, "Earthbind (PvP)"], _ - [3016, "Shelter (PvP)"], _ - [3017, "Disenchantment (PvP)"], _ - [3018, "Restoration (PvP)"], _ - [3019, "Bloodsong (PvP)"], _ - [3020, "Wanderlust (PvP)"], _ - [3021, "Savannah Heat (PvP)"], _ - [3022, "Gaze of Fury (PvP)"], _ - [3023, "Anguish (PvP)"], _ - [3024, "Empowerment (PvP)"], _ - [3025, "Recovery (PvP)"], _ - [3026, "Go for the Eyes (PvP)"], _ - [3027, "Brace Yourself (PvP)"], _ - [3028, "Blazing Finale (PvP)"], _ - [3029, "Bladeturn Refrain (PvP)"], _ - [3030, "Signet of Return (PvP)"], _ - [3031, "Cant Touch This (PvP)"], _ - [3032, "Stand Your Ground (PvP)"], _ - [3033, "We Shall Return (PvP)"], _ - [3034, "Find Their Weakness (PvP)"], _ - [3035, "Never Give Up (PvP)"], _ - [3036, "Help Me (PvP)"], _ - [3037, "Fall Back (PvP)"], _ - [3038, "Agony (PvP)"], _ - [3039, "Rejuvenation (PvP)"], _ - [3040, "Anthem of Disruption (PvP)"], _ - [3041, "Shadowsong (Master Riyo)"], _ - [3042, "Pain"], _ - [3043, "Wanderlust"], _ - [3044, "Spirit Siphon (Master Riyo)"], _ - [3045, "Comfort Animal (PvP)"], _ - [3047, "Melandrus Assault (PvP)"], _ - [3048, "Shroud of Distress (PvP)"], _ - [3049, "Unseen Fury (PvP)"], _ - [3050, "Predatory Bond (PvP)"], _ - [3051, "Enraged Lunge (PvP)"], _ - [3052, "Conviction (PvP)"], _ - [3053, "Signet of Deadly Corruption (PvP)"], _ - [3054, "Masochism (PvP)"], _ - [3055, "Pain (attack) (Togo)"], _ - [3056, "Pain (attack) (Togo)"], _ - [3057, "Pain (attack) (Togo)"], _ - [3058, "Unholy Feast (PvP)"], _ - [3059, "Signet of Agony (PvP)"], _ - [3060, "Escape (PvP)"], _ - [3061, "Death Blossom (PvP)"], _ - [3062, "Finale of Restoration (PvP)"], _ - [3063, "Mantra of Resolve (PvP)"], _ - [3064, "Lesser Hard Mode NPC Buff"], _ - [3065, "Charm Animal"], _ - [3066, "Charm Animal"], _ - [3067, "Henchman"], _ - [3068, "Charm Animal (Codex)"], _ - [3069, "Agent of the Mad King"], _ - [3070, "Sugar Rush (Agent of the Mad King)"], _ - [3071, "Sticky Ground"], _ - [3072, "Sugar Shock"], _ - [3073, "The Mad Kings Influence"], _ - [3074, "Bone Spike"], _ - [3075, "Flurry of Splinters"], _ - [3076, "Everlasting Mobstopper (skill)"], _ - [3077, "Weakened by Dhuum"], _ - [3078, "Curse of Dhuum"], _ - [3079, "Dhuums Rest (Reaper skill)"], _ - [3080, "Dhuum (skill)"], _ - [3081, "Summon Champion"], _ - [3082, "Summon Minions"], _ - [3083, "Touch of Dhuum"], _ - [3084, "Reaping of Dhuum"], _ - [3085, "Judgment of Dhuum"], _ - [3086, "Weight of Dhuum (hex)"], _ - [3087, "Dhuums Rest"], _ - [3088, "Spiritual Healing"], _ - [3089, "Encase Skeletal"], _ - [3090, "Reversal of Death"], _ - [3091, "Ghostly Fury"], _ - [3092, "Henchman Form Pudash"], _ - [3093, "Henchman Form Dahlia"], _ - [3094, "Henchman Form Disenmaedel"], _ - [3095, "Henchman Form Errol Hyl"], _ - [3096, "Henchman Form Lulu Xan"], _ - [3097, "Henchman Form Tannaros"], _ - [3098, "Henchman Form Cassie Santi"], _ - [3099, "Henchman Form Redemptor Frohs"], _ - [3100, "Henchman Form Julyia"], _ - [3101, "Henchman Form Bellicus"], _ - [3102, "Henchman Form Dirk Shadowrise"], _ - [3103, "Henchman Form Vincent Evan"], _ - [3104, "Henchman Form Luzy Fiera"], _ - [3105, "Henchman Form Motoko Kai"], _ - [3106, "Henchman Form Hinata"], _ - [3107, "Henchman Form Kah Xan"], _ - [3108, "Henchman Form Narcissia"], _ - [3109, "Henchman Form Zen Siert"], _ - [3110, "Henchman Form Blenkeh"], _ - [3111, "Henchman Form Aurora Allesandra"], _ - [3112, "Henchman Form Teena the Raptor"], _ - [3113, "Henchman Form Lora Lanaya"], _ - [3114, "Henchman Form Adepte"], _ - [3115, "Henchman Form Haldibarn Earendul"], _ - [3116, "Henchman Form Daky"], _ - [3117, "Henchman Form Syn Spellstrike"], _ - [3118, "Henchman Form Divinus Tutela"], _ - [3119, "Henchman Form Blahks"], _ - [3120, "Henchman Form Erick"], _ - [3121, "Henchman Form Ghavin"], _ - [3122, "Henchman Form Hobba Inaste"], _ - [3123, "Henchman Form Bacchi Coi"], _ - [3124, "Henchman Form Suzu"], _ - [3125, "Henchman Form Rollo Lowlo"], _ - [3126, "Henchman Form Fuu Rin"], _ - [3127, "Henchman Form Nuno"], _ - [3128, "Henchman Form Alsacien"], _ - [3129, "Henchman Form Uto Wrotki"], _ - [3130, "Henchman Form Khai Kemnebi"], _ - [3131, "Henchman Form Cole"], _ - [3133, "Weight of Dhuum"], _ - [3134, "Spirit Form (disguise)"], _ - [3135, "Spiritual Healing (Reaper skill)"], _ - [3136, "Ghostly Fury (Reaper skill)"], _ - [3137, "Reindeer Form"], _ - [3138, "Reindeer Form"], _ - [3139, "Reindeer Form"], _ - [3140, "Staggering Blow (PvP)"], _ - [3141, "Lightning Reflexes (PvP)"], _ - [3142, "Fierce Blow (PvP)"], _ - [3143, "Renewing Smash (PvP)"], _ - [3144, "Heal as One (PvP)"], _ - [3145, "Glass Arrows (PvP)"], _ - [3146, "Protective Was Kaolai (PvP)"], _ - [3147, "Keen Arrow (PvP)"], _ - [3148, "Anthem of Envy (PvP)"], _ - [3149, "Mending Refrain (PvP)"], _ - [3150, "Lesser Flame Sentinel Resistance"], _ - [3151, "Empathy (PvP)"], _ - [3152, "Crippling Anguish (PvP)"], _ - [3153, "Pain (attack) (Signet of Spirits)"], _ - [3154, "Pain (attack) (Signet of Spirits)"], _ - [3155, "Pain (attack) (Signet of Spirits)"], _ - [3156, "Soldiers Stance (PvP)"], _ - [3157, "Destructive Was Glaive (PvP)"], _ - [3159, "Charm Drake"], _ - [3162, "Theres not enough time"], _ - [3163, "Keirans Sniper Shot"], _ - [3164, "Falken Punch"], _ - [3165, "Golem Pilebunker"], _ - [3166, "Drunken Stumbling"], _ - [3170, "Koros Gaze"], _ - [3171, "Ebon Vanguard Assassin Support (NPC)"], _ - [3172, "Ebon Vanguard Battle Standard of Power"], _ - [3173, "Loose Magic"], _ - [3174, "Well-Supplied"], _ - [3175, "Guild Monument Protected"], _ - [3176, "Strong Natural Resistance"], _ - [3177, "Elite Regeneration"], _ - [3178, "Elite Regeneration"], _ - [3179, "Mantra of Signets (PvP)"], _ - [3180, "Shatter Delusions (PvP)"], _ - [3181, "Illusionary Weaponry (PvP)"], _ - [3182, "Panic (PvP)"], _ - [3183, "Migraine (PvP)"], _ - [3184, "Accumulated Pain (PvP)"], _ - [3185, "Psychic Instability (PvP)"], _ - [3186, "Shared Burden (PvP)"], _ - [3187, "Stolen Speed (PvP)"], _ - [3188, "Unnatural Signet (PvP)"], _ - [3189, "Spiritual Pain (PvP)"], _ - [3190, "Frustration (PvP)"], _ - [3191, "Mistrust (PvP)"], _ - [3192, "Enchanters Conundrum (PvP)"], _ - [3193, "Signet of Clumsiness (PvP)"], _ - [3194, "Mirror of Disenchantment (PvP)"], _ - [3195, "Wandering Eye (PvP)"], _ - [3196, "Calculated Risk (PvP)"], _ - [3197, "Adoration"], _ - [3198, "Impending Dhuum"], _ - [3199, "Sacrifice Pawn"], _ - [3200, "Isaiahs Balance"], _ - [3201, "Toriimos Burning Fury"], _ - [3202, "Oath of Protection"], _ - [3204, "Defy Pain (PvP)"], _ - [3205, "Entourage"], _ - [3206, "Spectral Infusion"], _ - [3207, "Entourage (Buffer)"], _ - [3208, "Wastrels Demise (PvP)"], _ - [3210, "Shiro Tagachi (Costume Brawl disguise)"], _ - [3211, "Dunham (Costume Brawl disguise)"], _ - [3212, "Palawa Joko (Costume Brawl disguise)"], _ - [3213, "Lawrence Crafton (Costume Brawl disguise)"], _ - [3214, "Saul DAlessio (Costume Brawl disguise)"], _ - [3215, "Turai Ossa (Costume Brawl disguise)"], _ - [3216, "Lieutenant Thackeray (Costume Brawl disguise)"], _ - [3217, "Gehraz (Costume Brawl disguise)"], _ - [3218, "Master Togo (Costume Brawl disguise)"], _ - [3219, "Egil Fireteller (Costume Brawl disguise)"], _ - [3220, "Mysterious Assassin (Costume Brawl disguise)"], _ - [3221, "Gwen (Costume Brawl disguise)"], _ - [3222, "Eve (Costume Brawl disguise)"], _ - [3223, "Elementalist Aziure (Costume Brawl disguise)"], _ - [3224, "Jamei (Costume Brawl disguise)"], _ - [3225, "Jora (Costume Brawl disguise)"], _ - [3226, "Margrid the Sly (Costume Brawl disguise)"], _ - [3227, "Varesh Ossa (Costume Brawl disguise)"], _ - [3228, "Headmaster Quin (Costume Brawl disguise)"], _ - [3229, "Kormir (Costume Brawl disguise)"], _ - [3231, "Barbed Signet (PvP)"], _ - [3232, "Heal Party (PvP)"], _ - [3233, "Spoil Victor (PvP)"], _ - [3234, "Visions of Regret (PvP)"], _ - [3235, "Keirans Sniper Shot (Hearts of the North)"], _ - [3236, "Gravestone Marker"], _ - [3237, "Terminal Velocity"], _ - [3238, "Relentless Assault"], _ - [3239, "Natures Blessing"], _ - [3240, "Find Their Weakness (Thackeray)"], _ - [3241, "Theres Nothing to Fear (Thackeray)"], _ - [3242, "Coming of Spring"], _ - [3243, "Promise of Death"], _ - [3244, "Withering Blade"], _ - [3245, "Deaths Embrace"], _ - [3246, "Venom Fang"], _ - [3247, "Survivors Will"], _ - [3248, "Keiran Thackeray (disguise)"], _ - [3249, "Rain of Arrows"], _ - [3251, "Fox Fangs (PvP)"], _ - [3252, "Wild Strike (PvP)"], _ - [3253, "Ultra Snowball"], _ - [3254, "Blizzard"], _ - [3259, "Ultra Snowball"], _ - [3260, "Ultra Snowball"], _ - [3261, "Ultra Snowball"], _ - [3262, "Ultra Snowball"], _ - [3263, "Banishing Strike (PvP)"], _ - [3264, "Twin Moon Sweep (PvP)"], _ - [3265, "Irresistible Sweep (PvP)"], _ - [3266, "Pious Assault (PvP)"], _ - [3267, "Ebon Dust Aura (PvP)"], _ - [3268, "Heart of Holy Flame (PvP)"], _ - [3269, "Guiding Hands (PvP)"], _ - [3270, "Avatar of Dwayna (PvP)"], _ - [3271, "Avatar of Melandru (PvP)"], _ - [3272, "Mystic Healing (PvP)"], _ - [3273, "Signet of Pious Restraint (PvP)"], _ - [3274, "Vanguard Initiate"], _ - [3282, "Victorious Renewal"], _ - [3283, "A Dying Curse"], _ - [3288, "Rage of the Djinn"], _ - [3289, "Fevered Dreams (PvP)"], _ - [3290, "Stun Grenade"], _ - [3291, "Fragmentation Grenade"], _ - [3292, "Tear Gas"], _ - [3293, "Land Mine"], _ - [3294, "Riot Shield"], _ - [3295, "Club Strike"], _ - [3296, "Bludgeon"], _ - [3297, "Tango Down"], _ - [3298, "Ill Be Back"], _ - [3299, "Phased Plasma Burst"], _ - [3300, "Plasma Shot"], _ - [3301, "Annihilator Bash"], _ - [3302, "Sky Net"], _ - [3303, "Damage Assessment"], _ - [3304, "Going Commando"], _ - [3306, "Koss Form"], _ - [3307, "Dunkoro Form"], _ - [3308, "Melonni Form"], _ - [3309, "Acolyte Jin Form"], _ - [3310, "Acolyte Sousuke Form"], _ - [3311, "Tahlkora Form"], _ - [3312, "Zhed Shadowhoof Form"], _ - [3313, "Margrid the Sly Form"], _ - [3314, "Master of Whispers Form"], _ - [3315, "Goren Form"], _ - [3316, "Norgu Form"], _ - [3317, "Morgahn Form"], _ - [3318, "Razah Form"], _ - [3319, "Olias Form"], _ - [3320, "Zenmai Form"], _ - [3321, "Ogden Form"], _ - [3322, "Vekk Form"], _ - [3323, "Gwen Form"], _ - [3324, "Xandra Form"], _ - [3325, "Kahmu Form"], _ - [3326, "Jora Form"], _ - [3327, "Pyre Fierceshot Form"], _ - [3328, "Anton Form"], _ - [3329, "Hayda Form"], _ - [3330, "Livia Form"], _ - [3331, "Keiran Thackeray Form"], _ - [3332, "Miku Form"], _ - [3333, "M.O.X. Form"], _ - [3334, "Shiro Tagachi Form"], _ - [3336, "Prince Rurik Form"], _ - [3337, "Margonite Form"], _ - [3338, "Destroyer Form"], _ - [3339, "Queen Salma Form"], _ - [3340, "Slightly Mad King Thorn Form"], _ - [3341, "Kuunavang Form"], _ - [3342, "Lone Wolf"], _ - [3343, "Stand Together"], _ - [3344, "Unyielding Spirit"], _ - [3345, "Reckless Advance"], _ - [3346, "Aura of Thorns (PvP)"], _ - [3347, "Dust Cloak (PvP)"], _ - [3348, "Lyssas Haste (PvP)"], _ - [3349, "Knight Form"], _ - [3350, "Lord Archer Form"], _ - [3351, "Bodyguard Form"], _ - [3352, "Guild Thief Form"], _ - [3353, "Ghostly Priest Form"], _ - [3354, "Flame Sentinel Form"], _ - [3356, "Solidarity"], _ - [3357, "There Can Be Only One"], _ - [3358, "Fight Against Despair"], _ - [3359, "Deaths Succor"], _ - [3360, "Battle of Attrition"], _ - [3361, "Fight or Flight"], _ - [3362, "Renewing Escape"], _ - [3363, "Battle Frenzy"], _ - [3364, "The Way of One"], _ - [3365, "Onslaught (PvP)"], _ - [3366, "Heart of Fury (PvP)"], _ - [3367, "Wounding Strike (PvP)"], _ - [3368, "Pious Fury (PvP)"], _ - [3369, "Party Mode"], _ - [3370, "Smash of the Titans"], _ - [3371, "Mirror Shatter"], _ - [3373, "Illusion of Haste (PvP)"], _ - [3374, "Illusion of Pain (PvP)"], _ - [3375, "Aura of Restoration (PvP)"], _ - [3376, "Shapeshift"], _ - [3377, "G.O.L.E.M. (disguise)"], _ - [3378, "Phase Shield"], _ - [3379, "Reactor Burst"], _ - [3380, "Ill Be Back"], _ - [3381, "Annihilator Strike"], _ - [3382, "Annihilator Beam"], _ - [3383, "Annihilator Knuckle"], _ - [3384, "Annihilator Toss"], _ - [3386, "Web of Disruption (PvP)"], _ - [3387, "Chain Combo"], _ - [3390, "All In"], _ - [3391, "Jack of All Trades"], _ - [3392, ""], _ - [3393, "Odrans Razor"], _ - [3394, "Like a Boss"], _ - [3395, "The Boss"], _ - [3396, "Lightning Hammer (PvP)"], _ - [3397, "Elemental Flame (PvP)"], _ - [3398, "Slippery Ground (PvP)"], _ - [3399, "Everlastung tonic Disguised"], _ - [3400, "Non-everlasting Disguised"], _ - [3401, "Disguised"], _ - [3402, "Tonic Tipsiness"], _ - [3403, "Parting Gift"], _ - [3404, "Gift of Battle"], _ - [3405, "Rolling Start"], _ - [3406, "Everlasting Legionnaire Tonic"]] \ No newline at end of file +2987 +#include-once + +Global $aArray_Of_Skill_Names[3407][2] = [ _ + [1, "Healing Signet"], _ + [2, "Resurrection Signet"], _ + [3, "Signet of Capture"], _ + [4, "BAMPH"], _ + [5, "Power Block"], _ + [6, "Mantra of Earth"], _ + [7, "Mantra of Flame"], _ + [8, "Mantra of Frost"], _ + [9, "Mantra of Lightning"], _ + [10, "Hex Breaker"], _ + [11, "Distortion"], _ + [12, "Mantra of Celerity"], _ + [13, "Mantra of Recovery"], _ + [14, "Mantra of Persistence"], _ + [15, "Mantra of Inscriptions"], _ + [16, "Mantra of Concentration"], _ + [17, "Mantra of Resolve"], _ + [18, "Mantra of Signets"], _ + [19, "Fragility"], _ + [20, "Confusion"], _ + [21, "Inspired Enchantment"], _ + [22, "Inspired Hex"], _ + [23, "Power Spike"], _ + [24, "Power Leak"], _ + [25, "Power Drain"], _ + [26, "Empathy"], _ + [27, "Shatter Delusions"], _ + [28, "Backfire"], _ + [29, "Blackout"], _ + [30, "Diversion"], _ + [31, "Conjure Phantasm"], _ + [32, "Illusion of Weakness"], _ + [33, "Illusionary Weaponry"], _ + [34, "Sympathetic Visage"], _ + [35, "Ignorance"], _ + [36, "Arcane Conundrum"], _ + [37, "Illusion of Haste"], _ + [38, "Channeling"], _ + [39, "Energy Surge"], _ + [40, "Ether Feast"], _ + [41, "Ether Lord"], _ + [42, "Energy Burn"], _ + [43, "Clumsiness"], _ + [44, "Phantom Pain"], _ + [45, "Ethereal Burden"], _ + [46, "Guilt"], _ + [47, "Ineptitude"], _ + [48, "Spirit of Failure"], _ + [49, "Mind Wrack"], _ + [50, "Wastrels Worry"], _ + [51, "Shame"], _ + [52, "Panic"], _ + [53, "Migraine"], _ + [54, "Crippling Anguish"], _ + [55, "Fevered Dreams"], _ + [56, "Soothing Images"], _ + [57, "Cry of Frustration"], _ + [58, "Signet of Midnight"], _ + [59, "Signet of Weariness"], _ + [60, "Signet of Illusions (beta version)"], _ + [61, "Leech Signet"], _ + [62, "Signet of Humility"], _ + [63, "Keystone Signet"], _ + [64, "Mimic"], _ + [65, "Arcane Mimicry"], _ + [66, "Spirit Shackles"], _ + [67, "Shatter Hex"], _ + [68, "Drain Enchantment"], _ + [69, "Shatter Enchantment"], _ + [70, "Disappear"], _ + [71, "Unnatural Signet (alpha version)"], _ + [72, "Elemental Resistance"], _ + [73, "Physical Resistance"], _ + [74, "Echo"], _ + [75, "Arcane Echo"], _ + [76, "Imagined Burden"], _ + [77, "Chaos Storm"], _ + [78, "Epidemic"], _ + [79, "Energy Drain"], _ + [80, "Energy Tap"], _ + [81, "Arcane Thievery"], _ + [82, "Mantra of Recall"], _ + [83, "Animate Bone Horror"], _ + [84, "Animate Bone Fiend"], _ + [85, "Animate Bone Minions"], _ + [86, "Grenths Balance"], _ + [87, "Veratas Gaze"], _ + [88, "Veratas Aura"], _ + [89, "Deathly Chill"], _ + [90, "Veratas Sacrifice"], _ + [91, "Well of Power"], _ + [92, "Well of Blood"], _ + [93, "Well of Suffering"], _ + [94, "Well of the Profane"], _ + [95, "Putrid Explosion"], _ + [96, "Soul Feast"], _ + [97, "Necrotic Traversal"], _ + [98, "Consume Corpse"], _ + [99, "Parasitic Bond"], _ + [100, "Soul Barbs"], _ + [101, "Barbs"], _ + [102, "Shadow Strike"], _ + [103, "Price of Failure"], _ + [104, "Death Nova"], _ + [105, "Deathly Swarm"], _ + [106, "Rotting Flesh"], _ + [107, "Virulence"], _ + [108, "Suffering"], _ + [109, "Life Siphon"], _ + [110, "Unholy Feast"], _ + [111, "Awaken the Blood"], _ + [112, "Desecrate Enchantments"], _ + [113, "Tainted Flesh"], _ + [114, "Aura of the Lich"], _ + [115, "Blood Renewal"], _ + [116, "Dark Aura"], _ + [117, "Enfeeble"], _ + [118, "Enfeebling Blood"], _ + [119, "Blood is Power"], _ + [120, "Blood of the Master"], _ + [121, "Spiteful Spirit"], _ + [122, "Malign Intervention"], _ + [123, "Insidious Parasite"], _ + [124, "Spinal Shivers"], _ + [125, "Wither"], _ + [126, "Life Transfer"], _ + [127, "Mark of Subversion"], _ + [128, "Soul Leech"], _ + [129, "Defile Flesh"], _ + [130, "Demonic Flesh"], _ + [131, "Barbed Signet"], _ + [132, "Plague Signet"], _ + [133, "Dark Pact"], _ + [134, "Order of Pain"], _ + [135, "Faintheartedness"], _ + [136, "Shadow of Fear"], _ + [137, "Rigor Mortis"], _ + [138, "Dark Bond"], _ + [139, "Infuse Condition"], _ + [140, "Malaise"], _ + [141, "Rend Enchantments"], _ + [142, "Lingering Curse"], _ + [143, "Strip Enchantment"], _ + [144, "Chilblains"], _ + [145, "Signet of Agony"], _ + [146, "Offering of Blood"], _ + [147, "Dark Fury"], _ + [148, "Order of the Vampire"], _ + [149, "Plague Sending"], _ + [150, "Mark of Pain"], _ + [151, "Feast of Corruption"], _ + [152, "Taste of Death"], _ + [153, "Vampiric Gaze"], _ + [154, "Plague Touch"], _ + [155, "Vile Touch"], _ + [156, "Vampiric Touch"], _ + [157, "Blood Ritual"], _ + [158, "Touch of Agony"], _ + [159, "Weaken Armor"], _ + [160, "Windborne Speed"], _ + [161, "Lightning Storm"], _ + [162, "Gale"], _ + [163, "Whirlwind"], _ + [164, "Elemental Attunement"], _ + [165, "Armor of Earth"], _ + [166, "Kinetic Armor"], _ + [167, "Eruption"], _ + [168, "Magnetic Aura"], _ + [169, "Earth Attunement"], _ + [170, "Earthquake"], _ + [171, "Stoning"], _ + [172, "Stone Daggers"], _ + [173, "Grasping Earth"], _ + [174, "Aftershock"], _ + [175, "Ward Against Elements"], _ + [176, "Ward Against Melee"], _ + [177, "Ward Against Foes"], _ + [178, "Ether Prodigy"], _ + [179, "Incendiary Bonds"], _ + [180, "Aura of Restoration"], _ + [181, "Ether Renewal"], _ + [182, "Conjure Flame"], _ + [183, "Inferno"], _ + [184, "Fire Attunement"], _ + [185, "Mind Burn"], _ + [186, "Fireball"], _ + [187, "Meteor"], _ + [188, "Flame Burst"], _ + [189, "Rodgorts Invocation"], _ + [190, "Mark of Rodgort"], _ + [191, "Immolate"], _ + [192, "Meteor Shower"], _ + [193, "Phoenix"], _ + [194, "Flare"], _ + [195, "Lava Font"], _ + [196, "Searing Heat"], _ + [197, "Fire Storm"], _ + [198, "Glyph of Elemental Power"], _ + [199, "Glyph of Energy"], _ + [200, "Glyph of Lesser Energy"], _ + [201, "Glyph of Concentration"], _ + [202, "Glyph of Sacrifice"], _ + [203, "Glyph of Renewal"], _ + [204, "Rust"], _ + [205, "Lightning Surge"], _ + [206, "Armor of Frost"], _ + [207, "Conjure Frost"], _ + [208, "Water Attunement"], _ + [209, "Mind Freeze"], _ + [210, "Ice Prison"], _ + [211, "Ice Spikes"], _ + [212, "Frozen Burst"], _ + [213, "Shard Storm"], _ + [214, "Ice Spear"], _ + [215, "Maelstrom"], _ + [216, "Iron Mist"], _ + [217, "Crystal Wave"], _ + [218, "Obsidian Flesh"], _ + [219, "Obsidian Flame"], _ + [220, "Blinding Flash"], _ + [221, "Conjure Lightning"], _ + [222, "Lightning Strike"], _ + [223, "Chain Lightning"], _ + [224, "Enervating Charge"], _ + [225, "Air Attunement"], _ + [226, "Mind Shock"], _ + [227, "Glimmering Mark"], _ + [228, "Thunderclap"], _ + [229, "Lightning Orb"], _ + [230, "Lightning Javelin"], _ + [231, "Shock"], _ + [232, "Lightning Touch"], _ + [233, "Swirling Aura"], _ + [234, "Deep Freeze"], _ + [235, "Blurred Vision"], _ + [236, "Mist Form"], _ + [237, "Water Trident"], _ + [238, "Armor of Mist"], _ + [239, "Ward Against Harm"], _ + [240, "Smite"], _ + [241, "Life Bond"], _ + [242, "Balthazars Spirit"], _ + [243, "Strength of Honor"], _ + [244, "Life Attunement"], _ + [245, "Protective Spirit"], _ + [246, "Divine Intervention"], _ + [247, "Symbol of Wrath"], _ + [248, "Retribution"], _ + [249, "Holy Wrath"], _ + [250, "Essence Bond"], _ + [251, "Scourge Healing"], _ + [252, "Banish"], _ + [253, "Scourge Sacrifice"], _ + [254, "Vigorous Spirit"], _ + [255, "Watchful Spirit"], _ + [256, "Blessed Aura"], _ + [257, "Aegis"], _ + [258, "Guardian"], _ + [259, "Shield of Deflection"], _ + [260, "Aura of Faith"], _ + [261, "Shield of Regeneration"], _ + [262, "Shield of Judgment"], _ + [263, "Protective Bond"], _ + [264, "Pacifism"], _ + [265, "Amity"], _ + [266, "Peace and Harmony"], _ + [267, "Judges Insight"], _ + [268, "Unyielding Aura"], _ + [269, "Mark of Protection"], _ + [270, "Life Barrier"], _ + [271, "Zealots Fire"], _ + [272, "Balthazars Aura"], _ + [273, "Spell Breaker"], _ + [274, "Healing Seed"], _ + [275, "Mend Condition"], _ + [276, "Restore Condition"], _ + [277, "Mend Ailment"], _ + [278, "Purge Conditions"], _ + [279, "Divine Healing"], _ + [280, "Heal Area"], _ + [281, "Orison of Healing"], _ + [282, "Word of Healing"], _ + [283, "Dwaynas Kiss"], _ + [284, "Divine Boon"], _ + [285, "Healing Hands"], _ + [286, "Heal Other"], _ + [287, "Heal Party"], _ + [288, "Healing Breeze"], _ + [289, "Vital Blessing"], _ + [290, "Mending"], _ + [291, "Live Vicariously"], _ + [292, "Infuse Health"], _ + [293, "Signet of Devotion"], _ + [294, "Signet of Judgment"], _ + [295, "Purge Signet"], _ + [296, "Bane Signet"], _ + [297, "Blessed Signet"], _ + [298, "Martyr"], _ + [299, "Shielding Hands"], _ + [300, "Contemplation of Purity"], _ + [301, "Remove Hex"], _ + [302, "Smite Hex"], _ + [303, "Convert Hexes"], _ + [304, "Light of Dwayna"], _ + [305, "Resurrect"], _ + [306, "Rebirth"], _ + [307, "Reversal of Fortune"], _ + [308, "Succor"], _ + [309, "Holy Veil"], _ + [310, "Divine Spirit"], _ + [311, "Draw Conditions"], _ + [312, "Holy Strike"], _ + [313, "Healing Touch"], _ + [314, "Restore Life"], _ + [315, "Vengeance"], _ + [316, "To the Limit"], _ + [317, "Battle Rage"], _ + [318, "Defy Pain"], _ + [319, "Rush"], _ + [320, "Hamstring"], _ + [321, "Wild Blow"], _ + [322, "Power Attack"], _ + [323, "Desperation Blow"], _ + [324, "Thrill of Victory"], _ + [325, "Distracting Blow"], _ + [326, "Protectors Strike"], _ + [327, "Griffons Sweep"], _ + [328, "Pure Strike"], _ + [329, "Skull Crack"], _ + [330, "Cyclone Axe"], _ + [331, "Hammer Bash"], _ + [332, "Bulls Strike"], _ + [333, "I Will Avenge You"], _ + [334, "Axe Rake"], _ + [335, "Cleave"], _ + [336, "Executioners Strike"], _ + [337, "Dismember"], _ + [338, "Eviscerate"], _ + [339, "Penetrating Blow"], _ + [340, "Disrupting Chop"], _ + [341, "Swift Chop"], _ + [342, "Axe Twist"], _ + [343, "For Great Justice"], _ + [344, "Flurry"], _ + [345, "Defensive Stance"], _ + [346, "Frenzy"], _ + [347, "Endure Pain"], _ + [348, "Watch Yourself"], _ + [349, "Sprint"], _ + [350, "Belly Smash"], _ + [351, "Mighty Blow"], _ + [352, "Crushing Blow"], _ + [353, "Crude Swing"], _ + [354, "Earth Shaker"], _ + [355, "Devastating Hammer"], _ + [356, "Irresistible Blow"], _ + [357, "Counter Blow"], _ + [358, "Backbreaker"], _ + [359, "Heavy Blow"], _ + [360, "Staggering Blow"], _ + [361, "Dolyak Signet"], _ + [362, "Warriors Cunning"], _ + [363, "Shield Bash"], _ + [364, "Charge"], _ + [365, "Victory Is Mine"], _ + [366, "Fear Me"], _ + [367, "Shields Up"], _ + [368, "I Will Survive"], _ + [369, "Dont Believe Their Lies"], _ + [370, "Berserker Stance"], _ + [371, "Balanced Stance"], _ + [372, "Gladiators Defense"], _ + [373, "Deflect Arrows"], _ + [374, "Warriors Endurance"], _ + [375, "Dwarven Battle Stance"], _ + [376, "Disciplined Stance"], _ + [377, "Wary Stance"], _ + [378, "Shield Stance"], _ + [379, "Bulls Charge"], _ + [380, "Bonettis Defense"], _ + [381, "Hundred Blades"], _ + [382, "Sever Artery"], _ + [383, "Galrath Slash"], _ + [384, "Gash"], _ + [385, "Final Thrust"], _ + [386, "Seeking Blade"], _ + [387, "Riposte"], _ + [388, "Deadly Riposte"], _ + [389, "Flourish"], _ + [390, "Savage Slash"], _ + [391, "Hunters Shot"], _ + [392, "Pin Down"], _ + [393, "Crippling Shot"], _ + [394, "Power Shot"], _ + [395, "Barrage"], _ + [396, "Dual Shot"], _ + [397, "Quick Shot"], _ + [398, "Penetrating Attack"], _ + [399, "Distracting Shot"], _ + [400, "Precision Shot"], _ + [401, "Splinter Shot (monster skill)"], _ + [402, "Determined Shot"], _ + [403, "Called Shot"], _ + [404, "Poison Arrow"], _ + [405, "Oath Shot"], _ + [406, "Debilitating Shot"], _ + [407, "Point Blank Shot"], _ + [408, "Concussion Shot"], _ + [409, "Punishing Shot"], _ + [410, "Call of Ferocity"], _ + [411, "Charm Animal"], _ + [412, "Call of Protection"], _ + [413, "Call of Elemental Protection"], _ + [414, "Call of Vitality"], _ + [415, "Call of Haste"], _ + [416, "Call of Healing"], _ + [417, "Call of Resilience"], _ + [418, "Call of Feeding"], _ + [419, "Call of the Hunter"], _ + [420, "Call of Brutality"], _ + [421, "Call of Disruption"], _ + [422, "Revive Animal"], _ + [423, "Symbiotic Bond"], _ + [424, "Throw Dirt"], _ + [425, "Dodge"], _ + [426, "Savage Shot"], _ + [427, "Antidote Signet"], _ + [428, "Incendiary Arrows"], _ + [429, "Melandrus Arrows"], _ + [430, "Marksmans Wager"], _ + [431, "Ignite Arrows"], _ + [432, "Read the Wind"], _ + [433, "Kindle Arrows"], _ + [434, "Choking Gas"], _ + [435, "Apply Poison"], _ + [436, "Comfort Animal"], _ + [437, "Bestial Pounce"], _ + [438, "Maiming Strike"], _ + [439, "Feral Lunge"], _ + [440, "Scavenger Strike"], _ + [441, "Melandrus Assault"], _ + [442, "Ferocious Strike"], _ + [443, "Predators Pounce"], _ + [444, "Brutal Strike"], _ + [445, "Disrupting Lunge"], _ + [446, "Troll Unguent"], _ + [447, "Otyughs Cry"], _ + [448, "Escape"], _ + [449, "Practiced Stance"], _ + [450, "Whirling Defense"], _ + [451, "Melandrus Resilience"], _ + [452, "Dryders Defenses"], _ + [453, "Lightning Reflexes"], _ + [454, "Tigers Fury"], _ + [455, "Storm Chaser"], _ + [456, "Serpents Quickness"], _ + [457, "Dust Trap"], _ + [458, "Barbed Trap"], _ + [459, "Flame Trap"], _ + [460, "Healing Spring"], _ + [461, "Spike Trap"], _ + [462, "Winter"], _ + [463, "Winnowing"], _ + [464, "Edge of Extinction"], _ + [465, "Greater Conflagration"], _ + [466, "Conflagration"], _ + [467, "Fertile Season"], _ + [468, "Symbiosis"], _ + [469, "Primal Echoes"], _ + [470, "Predatory Season"], _ + [471, "Frozen Soil"], _ + [472, "Favorable Winds"], _ + [473, "High Winds"], _ + [474, "Energizing Wind"], _ + [475, "Quickening Zephyr"], _ + [476, "Natures Renewal"], _ + [477, "Muddy Terrain"], _ + [478, "Bleeding"], _ + [479, "Blind"], _ + [480, "Burning"], _ + [481, "Crippled"], _ + [482, "Deep Wound"], _ + [483, "Disease"], _ + [484, "Poison"], _ + [485, "Dazed"], _ + [486, "Weakness"], _ + [487, "Cleansed"], _ + [488, "Eruption (environment)"], _ + [489, "Fire Storm (environment)"], _ + [490, "Vital Blessing (monster skill)"], _ + [491, "Fount Of Maguuma"], _ + [492, "Healing Fountain"], _ + [493, "Icy Ground"], _ + [494, "Maelstrom (environment)"], _ + [495, "Mursaat Tower (skill)"], _ + [496, "Quicksand (environment effect)"], _ + [497, "Curse of the Bloodstone"], _ + [498, "Chain Lightning (environment)"], _ + [499, "Obelisk Lightning"], _ + [500, "Tar"], _ + [501, "Siege Attack"], _ + [502, "Resurrect Party"], _ + [503, "Scepter of Orrs Aura"], _ + [504, "Scepter of Orrs Power"], _ + [505, "Burden Totem"], _ + [506, "Splinter Mine (skill)"], _ + [507, "Entanglement"], _ + [508, "Dwarven Powder Keg"], _ + [509, "Seed of Resurrection"], _ + [510, "Deafening Roar"], _ + [511, "Brutal Mauling"], _ + [512, "Crippling Attack"], _ + [513, "Charm Animal (monster skill)"], _ + [514, "Breaking Charm"], _ + [515, "Charr Buff"], _ + [516, "Claim Resource"], _ + [517, "Claim Resource"], _ + [518, "Claim Resource"], _ + [519, "Claim Resource"], _ + [520, "Claim Resource"], _ + [521, "Claim Resource"], _ + [522, "Claim Resource"], _ + [523, "Claim Resource"], _ + [524, "Dozen Shot"], _ + [525, "Nibble"], _ + [526, "Claim Resource"], _ + [527, "Claim Resource"], _ + [528, "Reflection"], _ + [530, "Giant Stomp"], _ + [531, "Agnars Rage"], _ + [532, "Healing Breeze (Agnars Rage)"], _ + [533, "Crystal Haze"], _ + [534, "Crystal Bonds"], _ + [535, "Jagged Crystal Skin"], _ + [536, "Crystal Hibernation"], _ + [537, "Stun Immunity"], _ + [538, "Invulnerability"], _ + [539, "Hunger of the Lich"], _ + [540, "Embrace the Pain"], _ + [541, "Life Vortex"], _ + [542, "Oracle Link"], _ + [543, "Guardian Pacify"], _ + [544, "Soul Vortex"], _ + [546, "Spectral Agony"], _ + [547, "Natural Resistance"], _ + [548, "Natural Resistance"], _ + [549, "Guild Lord Aura"], _ + [550, "Critical Hit Probability"], _ + [551, "Stun on Critical Hit"], _ + [552, "Blood Splattering"], _ + [553, "Inanimate Object"], _ + [554, "Undead sensitivity to Light"], _ + [555, "Energy Boost"], _ + [556, "Health Drain"], _ + [557, "Immunity to Critical Hits"], _ + [558, "Titans get plus Health regen and set enemies on fire each time he is hit."], _ + [559, "Undying"], _ + [560, "Resurrect (Gargoyle)"], _ + [561, "Seal Regen"], _ + [562, "Lightning Orb"], _ + [563, "Wurm Siege (Dunes of Despair)"], _ + [564, "Wurm Siege"], _ + [565, "Claim Resource"], _ + [566, "Shiver Touch"], _ + [567, "Spontaneous Combustion"], _ + [568, "Vanish"], _ + [569, "Victory or Death"], _ + [570, "Mark of Insecurity"], _ + [571, "Disrupting Dagger"], _ + [572, "Deadly Paradox"], _ + [573, "Teleport Players"], _ + [574, "Quest [for Coastal Exam."], _ + [575, "Holy Blessing"], _ + [576, "Statues Blessing"], _ + [577, "Siege Attack"], _ + [578, "Siege Attack"], _ + [579, "Domain of [Damage"], _ + [580, "Domain of Energy Draining"], _ + [581, "Domain of Elements"], _ + [582, "Domain of Health Draining"], _ + [583, "Domain of Slow"], _ + [584, "Divine Fire"], _ + [585, "Swamp Water"], _ + [586, "Janthirs Gaze"], _ + [587, "Fake Spell"], _ + [588, "Charm Animal (monster)"], _ + [589, "Stormcaller (skill)"], _ + [590, "Knock"], _ + [591, "Quest ["], _ + [592, "Rurik Must Live"], _ + [593, "Blessing of the Kurzicks"], _ + [594, "Lichs Phylactery"], _ + [595, "Restore Life (monster skill)"], _ + [596, "Chimera of Intensity"], _ + [657, "Life Draining"], _ + [763, "Jaundiced Gaze"], _ + [764, "Wail of Doom"], _ + [765, "Heros Insight"], _ + [766, "Gaze of Contempt"], _ + [767, "Berserkers Insight"], _ + [768, "Slayers Insight"], _ + [769, "Vipers Defense"], _ + [770, "Return"], _ + [771, "Aura of Displacement"], _ + [772, "Generous Was Tsungrai"], _ + [773, "Mighty Was Vorizun"], _ + [774, "To the Death"], _ + [775, "Death Blossom"], _ + [776, "Twisting Fangs"], _ + [777, "Horns of the Ox"], _ + [778, "Falling Spider"], _ + [779, "Black Lotus Strike"], _ + [780, "Fox Fangs"], _ + [781, "Moebius Strike"], _ + [782, "Jagged Strike"], _ + [783, "Unsuspecting Strike"], _ + [784, "Entangling Asp"], _ + [785, "Mark of Death"], _ + [786, "Iron Palm"], _ + [787, "Resilient Weapon"], _ + [788, "Blind Was Mingson"], _ + [789, "Grasping Was Kuurong"], _ + [790, "Vengeful Was Khanhei"], _ + [791, "Flesh of My Flesh"], _ + [792, "Splinter Weapon"], _ + [793, "Weapon of Warding"], _ + [794, "Wailing Weapon"], _ + [795, "Nightmare Weapon"], _ + [796, "Sorrows Flame"], _ + [797, "Sorrows Fist"], _ + [798, "Blast Furnace"], _ + [799, "Beguiling Haze"], _ + [800, "Enduring Toxin"], _ + [801, "Shroud of Silence"], _ + [802, "Expose Defenses"], _ + [803, "Power Leech"], _ + [804, "Arcane Languor"], _ + [805, "Animate Vampiric Horror"], _ + [806, "Cultists Fervor"], _ + [808, "Reapers Mark"], _ + [809, "Shatterstone"], _ + [810, "Protectors Defense"], _ + [811, "Run as One"], _ + [812, "Defiant Was Xinrae"], _ + [813, "Lyssas Aura"], _ + [814, "Shadow Refuge"], _ + [815, "Scorpion Wire"], _ + [816, "Mirrored Stance"], _ + [817, "Discord"], _ + [818, "Well of Weariness"], _ + [819, "Vampiric Spirit"], _ + [820, "Depravity"], _ + [821, "Icy Veins"], _ + [822, "Weaken Knees"], _ + [823, "Burning Speed"], _ + [824, "Lava Arrows"], _ + [825, "Bed of Coals"], _ + [826, "Shadow Form"], _ + [827, "Siphon Strength"], _ + [828, "Vile Miasma"], _ + [829, "Veratas Promise"], _ + [830, "Ray of Judgment"], _ + [831, "Primal Rage"], _ + [832, "Animate Flesh Golem"], _ + [833, "Borrowed Energy"], _ + [834, "Reckless Haste"], _ + [835, "Blood Bond"], _ + [836, "Ride the Lightning"], _ + [837, "Energy Boon"], _ + [838, "Dwaynas Sorrow"], _ + [839, "Retreat"], _ + [840, "Poisoned Heart"], _ + [841, "Fetid Ground"], _ + [842, "Arc Lightning"], _ + [843, "Gust"], _ + [844, "Churning Earth"], _ + [845, "Liquid Flame"], _ + [846, "Steam"], _ + [847, "Boon Signet"], _ + [848, "Reverse Hex"], _ + [849, "Lacerating Chop"], _ + [850, "Fierce Blow"], _ + [851, "Sun and Moon Slash"], _ + [852, "Splinter Shot"], _ + [853, "Melandrus Shot"], _ + [854, "Snare"], _ + [855, "Chomper"], _ + [856, "Kilroy Stonekin"], _ + [857, "Adventurers Insight"], _ + [858, "Dancing Daggers"], _ + [859, "Conjure Nightmare"], _ + [860, "Signet of Disruption"], _ + [861, "Dissipation"], _ + [862, "Ravenous Gaze"], _ + [863, "Order of Apostasy"], _ + [864, "Oppressive Gaze"], _ + [865, "Lightning Hammer"], _ + [866, "Vapor Blade"], _ + [867, "Healing Light"], _ + [868, "Aim True"], _ + [869, "Coward"], _ + [870, "Pestilence"], _ + [871, "Shadowsong"], _ + [872, "Shadowsong (attack)"], _ + [873, "Resurrect (monster skill)"], _ + [874, "Consuming Flames"], _ + [875, "Chains of Enslavement"], _ + [876, "Signet of Shadows"], _ + [877, "Lyssas Balance"], _ + [878, "Visions of Regret"], _ + [879, "Illusion of Pain"], _ + [880, "Stolen Speed"], _ + [881, "Ether Signet"], _ + [882, "Signet of Disenchantment"], _ + [883, "Vocal Minority"], _ + [884, "Searing Flames"], _ + [885, "Shield Guardian"], _ + [886, "Restful Breeze"], _ + [887, "Signet of Rejuvenation"], _ + [888, "Whirling Axe"], _ + [889, "Forceful Blow"], _ + [890, "Headshot"], _ + [891, "None Shall Pass"], _ + [892, "Quivering Blade"], _ + [893, "Seeking Arrows"], _ + [894, "Rampagers Insight"], _ + [895, "Hunters Insight"], _ + [896, "Amulet of Protection"], _ + [897, "Oath of Healing"], _ + [898, "Overload"], _ + [899, "Images of Remorse"], _ + [900, "Shared Burden"], _ + [901, "Soul Bind"], _ + [902, "Blood of the Aggressor"], _ + [903, "Icy Prism"], _ + [904, "Furious Axe"], _ + [905, "Auspicious Blow"], _ + [906, "On Your Knees"], _ + [907, "Dragon Slash"], _ + [908, "Marauders Shot"], _ + [909, "Focused Shot"], _ + [910, "Spirit Rift"], _ + [911, "Union"], _ + [912, "Blessing of the Kurzicks"], _ + [913, "Tranquil Was Tanasen"], _ + [914, "Consume Soul"], _ + [915, "Spirit Light"], _ + [916, "Lamentation"], _ + [917, "Rupture Soul"], _ + [918, "Spirit to Flesh"], _ + [919, "Spirit Burn"], _ + [920, "Destruction"], _ + [921, "Dissonance"], _ + [922, "Dissonance (attack)"], _ + [923, "Disenchantment"], _ + [924, "Disenchantment (attack)"], _ + [925, "Recall"], _ + [926, "Sharpen Daggers"], _ + [927, "Shameful Fear"], _ + [928, "Shadow Shroud"], _ + [929, "Shadow of Haste"], _ + [930, "Auspicious Incantation"], _ + [931, "Power Return"], _ + [932, "Complicate"], _ + [933, "Shatter Storm"], _ + [934, "Unnatural Signet"], _ + [935, "Rising Bile"], _ + [936, "Envenom Enchantments"], _ + [937, "Shockwave"], _ + [938, "Ward of Stability"], _ + [939, "Icy Shackles"], _ + [940, "Cry of Lament"], _ + [941, "Blessed Light"], _ + [942, "Withdraw Hexes"], _ + [943, "Extinguish"], _ + [944, "Signet of Strength"], _ + [945, "REMOVE (With Haste)"], _ + [946, "Trappers Focus"], _ + [947, "Brambles"], _ + [948, "Desperate Strike"], _ + [949, "Way of the Fox"], _ + [950, "Shadowy Burden"], _ + [951, "Siphon Speed"], _ + [952, "Deaths Charge"], _ + [953, "Power Flux"], _ + [954, "Expel Hexes"], _ + [955, "Rip Enchantment"], _ + [956, "Energy Font"], _ + [957, "Spell Shield"], _ + [958, "Healing Whisper"], _ + [959, "Ethereal Light"], _ + [960, "Release Enchantments"], _ + [961, "Lacerate"], _ + [962, "Spirit Transfer"], _ + [963, "Restoration"], _ + [964, "Vengeful Weapon"], _ + [965, "Archemorus Strike"], _ + [966, "Spear of Archemorus: Level 1"], _ + [967, "Spear of Archemorus: Level 2"], _ + [968, "Spear of Archemorus: Level 3"], _ + [969, "Spear of Archemorus: Level 4"], _ + [970, "Spear of Archemorus: Level 5"], _ + [971, "Argos Cry"], _ + [972, "Jade Fury"], _ + [973, "Blinding Powder"], _ + [974, "Mantis Touch"], _ + [975, "Exhausting Assault"], _ + [976, "Repeating Strike"], _ + [977, "Way of the Lotus"], _ + [978, "Mark of Instability"], _ + [979, "Mistrust"], _ + [980, "Feast of Souls"], _ + [981, "Recuperation"], _ + [982, "Shelter"], _ + [983, "Weapon of Shadow"], _ + [984, "Torch Enchantment"], _ + [985, "Caltrops"], _ + [986, "Nine Tail Strike"], _ + [987, "Way of the Empty Palm"], _ + [988, "Temple Strike"], _ + [989, "Golden Phoenix Strike"], _ + [990, "Expunge Enchantments"], _ + [991, "Deny Hexes"], _ + [992, "Triple Chop"], _ + [993, "Enraged Smash"], _ + [994, "Renewing Smash"], _ + [995, "Tiger Stance"], _ + [996, "Standing Slash"], _ + [997, "Famine"], _ + [998, "Torch Hex"], _ + [999, "Torch Degeneration Hex"], _ + [1000, "Blinding Snow"], _ + [1001, "Avalanche (skill)"], _ + [1002, "Snowball"], _ + [1003, "Mega Snowball"], _ + [1004, "Yuletide"], _ + [1005, "Ice Skates"], _ + [1006, "Ice Fort"], _ + [1007, "Yellow Snow"], _ + [1008, "Hidden Rock"], _ + [1009, "Snow Down the Shirt"], _ + [1010, "Mmmm. Snowcone"], _ + [1011, "Holiday Blues"], _ + [1012, "Icicles"], _ + [1013, "Ice Breaker"], _ + [1014, "Lets Get Em"], _ + [1015, "Flurry of Ice"], _ + [1016, "Snowball (NPC)"], _ + [1017, "Undying"], _ + [1018, "Critical Eye"], _ + [1019, "Critical Strike"], _ + [1020, "Blades of Steel"], _ + [1021, "Jungle Strike"], _ + [1022, "Wild Strike"], _ + [1023, "Leaping Mantis Sting"], _ + [1024, "Black Mantis Thrust"], _ + [1025, "Disrupting Stab"], _ + [1026, "Golden Lotus Strike"], _ + [1027, "Critical Defenses"], _ + [1028, "Way of Perfection"], _ + [1029, "Dark Apostasy"], _ + [1030, "Locusts Fury"], _ + [1031, "Shroud of Distress"], _ + [1032, "Heart of Shadow"], _ + [1033, "Impale"], _ + [1034, "Seeping Wound"], _ + [1035, "Assassins Promise"], _ + [1036, "Signet of Malice"], _ + [1037, "Dark Escape"], _ + [1038, "Crippling Dagger"], _ + [1039, "Star Strike"], _ + [1040, "Spirit Walk"], _ + [1041, "Unseen Fury"], _ + [1042, "Flashing Blades"], _ + [1043, "Dash"], _ + [1044, "Dark Prison"], _ + [1045, "Palm Strike"], _ + [1046, "Assassin of Lyssa"], _ + [1047, "Mesmer of Lyssa"], _ + [1048, "Revealed Enchantment"], _ + [1049, "Revealed Hex"], _ + [1050, "Disciple of Energy"], _ + [1051, "Empathy (Koro)"], _ + [1052, "Accumulated Pain"], _ + [1053, "Psychic Distraction"], _ + [1054, "Ancestors Visage"], _ + [1055, "Recurring Insecurity"], _ + [1056, "Kitahs Burden"], _ + [1057, "Psychic Instability"], _ + [1058, "Chaotic Power"], _ + [1059, "Hex Eater Signet"], _ + [1060, "Celestial Haste"], _ + [1061, "Feedback"], _ + [1062, "Arcane Larceny"], _ + [1063, "Chaotic Ward"], _ + [1064, "Favor of the Gods"], _ + [1065, "Dark Aura (blessing)"], _ + [1066, "Spoil Victor"], _ + [1067, "Lifebane Strike"], _ + [1068, "Bitter Chill"], _ + [1069, "Taste of Pain"], _ + [1070, "Defile Enchantments"], _ + [1071, "Shivers of Dread"], _ + [1072, "Star Servant"], _ + [1073, "Necromancer of Grenth"], _ + [1074, "Ritualist of Grenth"], _ + [1075, "Vampiric Swarm"], _ + [1076, "Blood Drinker"], _ + [1077, "Vampiric Bite"], _ + [1078, "Wallows Bite"], _ + [1079, "Enfeebling Touch"], _ + [1080, "Disciple of Ice"], _ + [1081, "Teinais Wind"], _ + [1082, "Shock Arrow"], _ + [1083, "Unsteady Ground"], _ + [1084, "Sliver Armor"], _ + [1085, "Ash Blast"], _ + [1086, "Dragons Stomp"], _ + [1087, "Unnatural Resistance"], _ + [1088, "Second Wind"], _ + [1089, "Cloak of Faith"], _ + [1090, "Smoldering Embers"], _ + [1091, "Double Dragon"], _ + [1092, "Disciple of the Air"], _ + [1093, "Teinais Heat"], _ + [1094, "Breath of Fire"], _ + [1095, "Star Burst"], _ + [1096, "Glyph of Essence"], _ + [1097, "Teinais Prison"], _ + [1098, "Mirror of Ice"], _ + [1099, "Teinais Crystals"], _ + [1100, "Celestial Storm"], _ + [1101, "Monk of Dwayna"], _ + [1102, "Aura of the Grove"], _ + [1103, "Cathedral Collapse"], _ + [1104, "Miasma"], _ + [1105, "Acid Trap"], _ + [1106, "Shield of Saint Viktor"], _ + [1107, "Urn of Saint Viktor: Level 1"], _ + [1108, "Urn of Saint Viktor: Level 2"], _ + [1109, "Urn of Saint Viktor: Level 3"], _ + [1110, "Urn of Saint Viktor: Level 4"], _ + [1111, "Urn of Saint Viktor: Level 5"], _ + [1112, "Aura of Light"], _ + [1113, "Kirins Wrath"], _ + [1114, "Spirit Bond"], _ + [1115, "Air of Enchantment"], _ + [1116, "Warriors Might"], _ + [1117, "Heavens Delight"], _ + [1118, "Healing Burst"], _ + [1119, "Kareis Healing Circle"], _ + [1120, "Jameis Gaze"], _ + [1121, "Gift of Health"], _ + [1122, "Battle Fervor"], _ + [1123, "Life Sheath"], _ + [1124, "Star Shine"], _ + [1125, "Disciple of Fire"], _ + [1126, "Empathic Removal"], _ + [1127, "Warrior of Balthazar"], _ + [1128, "Resurrection Chant"], _ + [1129, "Word of Censure"], _ + [1130, "Spear of Light"], _ + [1131, "Stonesoul Strike"], _ + [1132, "Shielding Branches"], _ + [1133, "Drunken Blow"], _ + [1134, "Leviathans Sweep"], _ + [1135, "Jaizhenju Strike"], _ + [1136, "Penetrating Chop"], _ + [1137, "Yeti Smash"], _ + [1138, "Disciple of the Earth"], _ + [1139, "Ranger of Melandru"], _ + [1140, "Storm of Swords"], _ + [1141, "You Will Die"], _ + [1142, "Auspicious Parry"], _ + [1143, "Strength of the Oak"], _ + [1144, "Silverwing Slash"], _ + [1145, "Destroy Enchantment"], _ + [1146, "Shove"], _ + [1147, "Base Defense"], _ + [1148, "Carrier Defense"], _ + [1149, "The Chalice of Corruption"], _ + [1151, "Song of the Mists"], _ + [1152, "Demonic Agility"], _ + [1153, "Blessing of the Kirin"], _ + [1154, "Emperor Degen"], _ + [1155, "Juggernaut Toss"], _ + [1156, "Aura of the Juggernaut"], _ + [1157, "Star Shards"], _ + [1172, "Turtle Shell"], _ + [1173, "Exposed Underbelly"], _ + [1174, "Cathedral Collapse"], _ + [1175, "Blood of zu Heltzer"], _ + [1176, "Afflicted Soul Explosion"], _ + [1177, "Invincibility"], _ + [1178, "Last Stand"], _ + [1179, "Dark Chain Lightning"], _ + [1180, "Seadragon Health Trigger"], _ + [1181, "Corrupted Breath"], _ + [1182, "Renewing Corruption"], _ + [1183, "Corrupted Dragon Spores"], _ + [1184, "Corrupted Dragon Scales"], _ + [1185, "Construct Possession"], _ + [1186, "Siege Turtle Attack (The Eternal Grove)"], _ + [1187, "Siege Turtle Attack (Fort Aspenwood)"], _ + [1188, "Siege Turtle Attack (Gyala Hatchery)"], _ + [1189, "Of Royal Blood"], _ + [1190, "Passage to Tahnnakai"], _ + [1191, "Sundering Attack"], _ + [1192, "Zojuns Shot"], _ + [1193, "Consume Spirit"], _ + [1194, "Predatory Bond"], _ + [1195, "Heal as One"], _ + [1196, "Zojuns Haste"], _ + [1197, "Needling Shot"], _ + [1198, "Broad Head Arrow"], _ + [1199, "Glass Arrows"], _ + [1200, "Archers Signet"], _ + [1201, "Savage Pounce"], _ + [1202, "Enraged Lunge"], _ + [1203, "Bestial Mauling"], _ + [1204, "Energy Drain (effect)"], _ + [1205, "Poisonous Bite"], _ + [1206, "Pounce"], _ + [1207, "Celestial Stance"], _ + [1208, "Sheer Exhaustion"], _ + [1209, "Bestial Fury"], _ + [1210, "Life Drain"], _ + [1211, "Vipers Nest"], _ + [1212, "Equinox"], _ + [1213, "Tranquility"], _ + [1214, "Acute Weakness"], _ + [1215, "Clamor of Souls"], _ + [1217, "Ritual Lord"], _ + [1218, "Cruel Was Daoshen"], _ + [1219, "Protective Was Kaolai"], _ + [1220, "Attuned Was Songkai"], _ + [1221, "Resilient Was Xiko"], _ + [1222, "Lively Was Naomei"], _ + [1223, "Anguished Was Lingwah"], _ + [1224, "Draw Spirit"], _ + [1225, "Channeled Strike"], _ + [1226, "Spirit Boon Strike"], _ + [1227, "Essence Strike"], _ + [1228, "Spirit Siphon"], _ + [1229, "Explosive Growth"], _ + [1230, "Boon of Creation"], _ + [1231, "Spirit Channeling"], _ + [1232, "Armor of Unfeeling"], _ + [1233, "Soothing Memories"], _ + [1234, "Mend Body and Soul"], _ + [1235, "Dulled Weapon"], _ + [1236, "Binding Chains"], _ + [1237, "Painful Bond"], _ + [1238, "Signet of Creation"], _ + [1239, "Signet of Spirits"], _ + [1240, "Soul Twisting"], _ + [1241, "Celestial Summoning"], _ + [1242, "Archemorus Strike (Celestial Summoning)"], _ + [1243, "Shield of Saint Viktor (Celestial Summoning)"], _ + [1244, "Ghostly Haste"], _ + [1245, "Gaze from Beyond"], _ + [1246, "Ancestors Rage"], _ + [1247, "Pain"], _ + [1248, "Pain (attack)"], _ + [1249, "Displacement"], _ + [1250, "Preservation"], _ + [1251, "Life"], _ + [1252, "Earthbind"], _ + [1253, "Bloodsong"], _ + [1254, "Bloodsong (attack)"], _ + [1255, "Wanderlust"], _ + [1256, "Wanderlust (attack)"], _ + [1257, "Spirit Light Weapon"], _ + [1258, "Brutal Weapon"], _ + [1259, "Guided Weapon"], _ + [1260, "Meekness"], _ + [1261, "Frigid Armor"], _ + [1262, "Healing Ring"], _ + [1263, "Renew Life"], _ + [1264, "Doom"], _ + [1265, "Wielders Boon"], _ + [1266, "Soothing"], _ + [1267, "Vital Weapon"], _ + [1268, "Weapon of Quickening"], _ + [1269, "Signet of Rage"], _ + [1270, "Fingers of Chaos"], _ + [1271, "Echoing Banishment"], _ + [1272, "Suicidal Impulse"], _ + [1273, "Impossible Odds"], _ + [1274, "Battle Scars"], _ + [1275, "Riposting Shadows"], _ + [1276, "Meditation of the Reaper"], _ + [1277, "Battle Cry"], _ + [1278, "Elemental Defense Zone"], _ + [1279, "Melee Defense Zone"], _ + [1280, "Blessed Water"], _ + [1281, "Defiled Water"], _ + [1282, "Stone Spores"], _ + [1283, "Turret Arrow"], _ + [1284, "Blood Flower (skill)"], _ + [1285, "Fire Flower (skill)"], _ + [1286, "Poison Arrow (flower)"], _ + [1287, "Haiju Lagoon Water"], _ + [1288, "Aspect of Exhaustion"], _ + [1289, "Aspect of Exposure"], _ + [1290, "Aspect of Surrender"], _ + [1291, "Aspect of Death"], _ + [1292, "Aspect of Soothing"], _ + [1293, "Aspect of Pain"], _ + [1294, "Aspect of Lethargy"], _ + [1295, "Aspect of Depletion (energy loss)"], _ + [1296, "Aspect of Failure"], _ + [1297, "Aspect of Shadows"], _ + [1298, "Scorpion Aspect"], _ + [1299, "Aspect of Fear"], _ + [1300, "Aspect of Depletion (energy depletion damage)"], _ + [1301, "Aspect of Decay"], _ + [1302, "Aspect of Torment"], _ + [1303, "Nightmare Aspect"], _ + [1304, "Spiked Coral"], _ + [1305, "Shielding Urn (skill)"], _ + [1306, "Extensive Plague Exposure"], _ + [1307, "Forests Binding"], _ + [1308, "Exploding Spores"], _ + [1309, "Suicide Energy"], _ + [1310, "Suicide Health"], _ + [1311, "Nightmare Refuge"], _ + [1312, "Oni Health Lock"], _ + [1313, "Oni Shadow Health Lock"], _ + [1314, "Signet of Attainment"], _ + [1315, "Rage of the Sea"], _ + [1316, "Meditation of the Reaper"], _ + [1318, "Fireball (obelisk)"], _ + [1319, "Final Thrust"], _ + [1323, "Sugar Rush (medium)"], _ + [1324, "Torment Slash"], _ + [1325, "Spirit of the Festival"], _ + [1326, "Trade Winds"], _ + [1327, "Dragon Blast"], _ + [1328, "Imperial Majesty"], _ + [1329, "Monster doesnt get death penalty"], _ + [1330, "Twisted Spikes"], _ + [1331, "Marble Trap"], _ + [1332, "Shadow Tripwire"], _ + [1333, "Extend Conditions"], _ + [1334, "Hypochondria"], _ + [1335, "Wastrels Demise"], _ + [1336, "Spiritual Pain"], _ + [1337, "Drain Delusions"], _ + [1338, "Persistence of Memory"], _ + [1339, "Symbols of Inspiration"], _ + [1340, "Symbolic Celerity"], _ + [1341, "Frustration"], _ + [1342, "Tease"], _ + [1343, "Ether Phantom"], _ + [1344, "Web of Disruption"], _ + [1345, "Enchanters Conundrum"], _ + [1346, "Signet of Illusions"], _ + [1347, "Discharge Enchantment"], _ + [1348, "Hex Eater Vortex"], _ + [1349, "Mirror of Disenchantment"], _ + [1350, "Simple Thievery"], _ + [1351, "Animate Shambling Horror"], _ + [1352, "Order of Undeath"], _ + [1353, "Putrid Flesh"], _ + [1354, "Feast for the Dead"], _ + [1355, "Jagged Bones"], _ + [1356, "Contagion"], _ + [1357, "Bloodletting"], _ + [1358, "Ulcerous Lungs"], _ + [1359, "Pain of Disenchantment"], _ + [1360, "Mark of Fury"], _ + [1361, "Recurring Scourge"], _ + [1362, "Corrupt Enchantment"], _ + [1363, "Signet of Sorrow"], _ + [1364, "Signet of Suffering"], _ + [1365, "Signet of Lost Souls"], _ + [1366, "Well of Darkness"], _ + [1367, "Blinding Surge"], _ + [1368, "Chilling Winds"], _ + [1369, "Lightning Bolt"], _ + [1370, "Storm Djinns Haste"], _ + [1371, "Stone Striker"], _ + [1372, "Sandstorm"], _ + [1373, "Stone Sheath"], _ + [1374, "Ebon Hawk"], _ + [1375, "Stoneflesh Aura"], _ + [1376, "Glyph of Restoration"], _ + [1377, "Ether Prism"], _ + [1378, "Master of Magic"], _ + [1379, "Glowing Gaze"], _ + [1380, "Savannah Heat"], _ + [1381, "Flame Djinns Haste"], _ + [1382, "Freezing Gust"], _ + [1383, "Rocky Ground"], _ + [1384, "Sulfurous Haze"], _ + [1385, "Siege Attack"], _ + [1386, "Sentry Trap (skill)"], _ + [1387, "Caltrops (monster)"], _ + [1388, "Sacred Branch"], _ + [1389, "Light of Seborhin"], _ + [1390, "Judges Intervention"], _ + [1391, "Supportive Spirit"], _ + [1392, "Watchful Healing"], _ + [1393, "Healers Boon"], _ + [1394, "Healers Covenant"], _ + [1395, "Balthazars Pendulum"], _ + [1396, "Words of Comfort"], _ + [1397, "Light of Deliverance"], _ + [1398, "Scourge Enchantment"], _ + [1399, "Shield of Absorption"], _ + [1400, "Reversal of Damage"], _ + [1401, "Mending Touch"], _ + [1402, "Critical Chop"], _ + [1403, "Agonizing Chop"], _ + [1404, "Flail"], _ + [1405, "Charging Strike"], _ + [1406, "Headbutt"], _ + [1407, "Lions Comfort"], _ + [1408, "Rage of the Ntouka"], _ + [1409, "Mokele Smash"], _ + [1410, "Overbearing Smash"], _ + [1411, "Signet of Stamina"], _ + [1412, "Youre All Alone"], _ + [1413, "Burst of Aggression"], _ + [1414, "Enraging Charge"], _ + [1415, "Crippling Slash"], _ + [1416, "Barbarous Slice"], _ + [1417, "Vial of Purified Water"], _ + [1418, "Disarm Trap"], _ + [1419, "Feeding Frenzy (skill)"], _ + [1420, "Quake Of Ahdashim"], _ + [1421, "Shield of Madness"], _ + [1422, "Create Light of Seborhin"], _ + [1423, "Unlock Cell"], _ + [1424, "Stop Pump"], _ + [1426, "Shield of Madness"], _ + [1427, "Shield of Ether"], _ + [1428, "Shield of Iron"], _ + [1429, "Shield of Strength"], _ + [1430, "Wave of Torment"], _ + [1433, "Corsairs Net"], _ + [1434, "Corrupted Healing"], _ + [1435, "Corrupted Roots"], _ + [1436, "Corrupted Strength"], _ + [1437, "Desert Wurm (disguise)"], _ + [1438, "Junundu Feast"], _ + [1439, "Junundu Strike"], _ + [1440, "Junundu Smash"], _ + [1441, "Junundu Siege"], _ + [1442, "Junundu Tunnel"], _ + [1443, "Leave Junundu"], _ + [1444, "Summon Torment"], _ + [1445, "Signal Flare"], _ + [1446, "The Elixir of Strength"], _ + [1447, "Ehzah from Above"], _ + [1449, "Last Rites of Torment"], _ + [1450, "Abaddons Conspiracy"], _ + [1451, "Hungers Bite"], _ + [1452, "From Hell"], _ + [1453, "Pains Embrace"], _ + [1454, "Call to the Torment"], _ + [1455, "Command of Torment"], _ + [1456, "Abaddons Favor"], _ + [1457, "Abaddons Chosen"], _ + [1458, "Enchantment Collapse"], _ + [1459, "Call of Sacrifice"], _ + [1460, "Enemies Must Die"], _ + [1461, "Earth Vortex"], _ + [1462, "Frost Vortex"], _ + [1463, "Rough Current"], _ + [1464, "Turbulent Flow"], _ + [1465, "Prepared Shot"], _ + [1466, "Burning Arrow"], _ + [1467, "Arcing Shot"], _ + [1468, "Strike as One"], _ + [1469, "Crossfire"], _ + [1470, "Barbed Arrows"], _ + [1471, "Scavengers Focus"], _ + [1472, "Toxicity"], _ + [1473, "Quicksand"], _ + [1474, "Storms Embrace"], _ + [1475, "Trappers Speed"], _ + [1476, "Tripwire"], _ + [1477, "Kournan Guardsman"], _ + [1478, "Renewing Surge"], _ + [1479, "Offering of Spirit"], _ + [1480, "Spirits Gift"], _ + [1481, "Death Pact Signet"], _ + [1482, "Reclaim Essence"], _ + [1483, "Banishing Strike"], _ + [1484, "Mystic Sweep"], _ + [1485, "Eremites Attack"], _ + [1486, "Reap Impurities"], _ + [1487, "Twin Moon Sweep"], _ + [1488, "Victorious Sweep"], _ + [1489, "Irresistible Sweep"], _ + [1490, "Pious Assault"], _ + [1491, "Mystic Twister"], _ + [1492, "REMOVE (Wind Prayers skill)"], _ + [1493, "Grenths Fingers"], _ + [1494, "REMOVE (Boon of the Gods)"], _ + [1495, "Aura of Thorns"], _ + [1496, "Balthazars Rage"], _ + [1497, "Dust Cloak"], _ + [1498, "Staggering Force"], _ + [1499, "Pious Renewal"], _ + [1500, "Mirage Cloak"], _ + [1501, "REMOVE (Balthazars Rage)"], _ + [1502, "Arcane Zeal"], _ + [1503, "Mystic Vigor"], _ + [1504, "Watchful Intervention"], _ + [1505, "Vow of Piety"], _ + [1506, "Vital Boon"], _ + [1507, "Heart of Holy Flame"], _ + [1508, "Extend Enchantments"], _ + [1509, "Faithful Intervention"], _ + [1510, "Sand Shards"], _ + [1511, "Intimidating Aura (beta version)"], _ + [1512, "Lyssas Haste"], _ + [1513, "Guiding Hands"], _ + [1514, "Fleeting Stability"], _ + [1515, "Armor of Sanctity"], _ + [1516, "Mystic Regeneration"], _ + [1517, "Vow of Silence"], _ + [1518, "Avatar of Balthazar"], _ + [1519, "Avatar of Dwayna"], _ + [1520, "Avatar of Grenth"], _ + [1521, "Avatar of Lyssa"], _ + [1522, "Avatar of Melandru"], _ + [1523, "Meditation"], _ + [1524, "Eremites Zeal"], _ + [1525, "Natural Healing"], _ + [1526, "Imbue Health"], _ + [1527, "Mystic Healing"], _ + [1528, "Dwaynas Touch"], _ + [1529, "Pious Restoration"], _ + [1530, "Signet of Pious Light"], _ + [1531, "Intimidating Aura"], _ + [1532, "Mystic Sandstorm"], _ + [1533, "Winds of Disenchantment"], _ + [1534, "Rending Touch"], _ + [1535, "Crippling Sweep"], _ + [1536, "Wounding Strike"], _ + [1537, "Wearying Strike"], _ + [1538, "Lyssas Assault"], _ + [1539, "Chilling Victory"], _ + [1540, "Conviction"], _ + [1541, "Enchanted Haste"], _ + [1542, "Pious Concentration"], _ + [1543, "Pious Haste"], _ + [1544, "Whirling Charge"], _ + [1545, "Test of Faith"], _ + [1546, "Blazing Spear"], _ + [1547, "Mighty Throw"], _ + [1548, "Cruel Spear"], _ + [1549, "Harriers Toss"], _ + [1550, "Unblockable Throw"], _ + [1551, "Spear of Lightning"], _ + [1552, "Wearying Spear"], _ + [1553, "Anthem of Fury"], _ + [1554, "Crippling Anthem"], _ + [1555, "Defensive Anthem"], _ + [1556, "Godspeed"], _ + [1557, "Anthem of Flame"], _ + [1558, "Go for the Eyes"], _ + [1559, "Anthem of Envy"], _ + [1560, "Song of Power"], _ + [1561, "Zealous Anthem"], _ + [1562, "Aria of Zeal"], _ + [1563, "Lyric of Zeal"], _ + [1564, "Ballad of Restoration"], _ + [1565, "Chorus of Restoration"], _ + [1566, "Aria of Restoration"], _ + [1567, "Song of Concentration"], _ + [1568, "Anthem of Guidance"], _ + [1569, "Energizing Chorus"], _ + [1570, "Song of Purification"], _ + [1571, "Hexbreaker Aria"], _ + [1572, "Brace Yourself"], _ + [1573, "Awe"], _ + [1574, "Enduring Harmony"], _ + [1575, "Blazing Finale"], _ + [1576, "Burning Refrain"], _ + [1577, "Finale of Restoration"], _ + [1578, "Mending Refrain"], _ + [1579, "Purifying Finale"], _ + [1580, "Bladeturn Refrain"], _ + [1581, "Glowing Signet"], _ + [1582, "REMOVE (Leadership skill)"], _ + [1583, "Leaders Zeal"], _ + [1584, "Leaders Comfort"], _ + [1585, "Signet of Synergy"], _ + [1586, "Angelic Protection"], _ + [1587, "Angelic Bond"], _ + [1588, "Cautery Signet"], _ + [1589, "Stand Your Ground"], _ + [1590, "Lead the Way"], _ + [1591, "Make Haste"], _ + [1592, "We Shall Return"], _ + [1593, "Never Give Up"], _ + [1594, "Help Me"], _ + [1595, "Fall Back"], _ + [1596, "Incoming"], _ + [1597, "Theyre on Fire"], _ + [1598, "Never Surrender"], _ + [1599, "Its Just a Flesh Wound."], _ + [1600, "Barbed Spear"], _ + [1601, "Vicious Attack"], _ + [1602, "Stunning Strike"], _ + [1603, "Merciless Spear"], _ + [1604, "Disrupting Throw"], _ + [1605, "Wild Throw"], _ + [1606, "Curse of the Staff of the Mists"], _ + [1607, "Aura of the Staff of the Mists"], _ + [1608, "Power of the Staff of the Mists"], _ + [1609, "Scepter of Ether"], _ + [1610, "Summoning of the Scepter"], _ + [1611, "Rise From Your Grave"], _ + [1612, "Sugar Rush (long)"], _ + [1613, "Corsair (disguise)"], _ + [1614, "REMOVE (Queen Wail)"], _ + [1614, "REMOVE (Queen Armor)"], _ + [1616, "Queen Heal"], _ + [1617, "Queen Wail"], _ + [1618, "Queen Armor"], _ + [1619, "Queen Bite"], _ + [1620, "Queen Thump"], _ + [1621, "Queen Siege"], _ + [1622, "Junundu Tunnel (monster skill)"], _ + [1623, "Skin of Stone"], _ + [1624, "Dervish of the Mystic"], _ + [1625, "Dervish of the Wind"], _ + [1626, "Paragon of Leadership"], _ + [1627, "Paragon of Motivation"], _ + [1628, "Dervish of the Blade"], _ + [1629, "Paragon of Command"], _ + [1630, "Paragon of the Spear"], _ + [1631, "Dervish of the Earth"], _ + [1632, "Master of DPS"], _ + [1633, "Malicious Strike"], _ + [1634, "Shattering Assault"], _ + [1635, "Golden Skull Strike"], _ + [1636, "Black Spider Strike"], _ + [1637, "Golden Fox Strike"], _ + [1638, "Deadly Haste"], _ + [1639, "Assassins Remedy"], _ + [1640, "Foxs Promise"], _ + [1641, "Feigned Neutrality"], _ + [1642, "Hidden Caltrops"], _ + [1643, "Assault Enchantments"], _ + [1644, "Wastrels Collapse"], _ + [1645, "Lift Enchantment"], _ + [1646, "Augury of Death"], _ + [1647, "Signet of Toxic Shock"], _ + [1648, "Signet of Twilight"], _ + [1649, "Way of the Assassin"], _ + [1650, "Shadow Walk"], _ + [1651, "Deaths Retreat"], _ + [1652, "Shadow Prison"], _ + [1653, "Swap"], _ + [1654, "Shadow Meld"], _ + [1655, "Price of Pride"], _ + [1656, "Air of Disenchantment"], _ + [1657, "Signet of Clumsiness"], _ + [1658, "Symbolic Posture"], _ + [1659, "Toxic Chill"], _ + [1660, "Well of Silence"], _ + [1661, "Glowstone"], _ + [1662, "Mind Blast"], _ + [1663, "Elemental Flame"], _ + [1664, "Invoke Lightning"], _ + [1665, "Battle Cry"], _ + [1666, "Mending Shrine Bonus"], _ + [1667, "Energy Shrine Bonus"], _ + [1668, "Northern Health Shrine Bonus"], _ + [1669, "Southern Health Shrine Bonus"], _ + [1670, "Siege Attack (Bombardment)"], _ + [1671, "Curse of Silence"], _ + [1672, "To the Pain (Hero Battles)"], _ + [1673, "Edge of Reason"], _ + [1674, "Depths of Madness (environment effect)"], _ + [1675, "Cower in Fear"], _ + [1676, "Dreadful Pain"], _ + [1677, "Veiled Nightmare"], _ + [1678, "Base Protection"], _ + [1679, "Kournan Siege Flame"], _ + [1680, "Drake Skin"], _ + [1681, "Skale Vigor"], _ + [1682, "Pahnai Salad (item effect)"], _ + [1683, "Pensive Guardian"], _ + [1684, "Scribes Insight"], _ + [1685, "Holy Haste"], _ + [1686, "Glimmer of Light"], _ + [1687, "Zealous Benediction"], _ + [1688, "Defenders Zeal"], _ + [1689, "Signet of Mystic Wrath"], _ + [1690, "Signet of Removal"], _ + [1691, "Dismiss Condition"], _ + [1692, "Divert Hexes"], _ + [1693, "Counterattack"], _ + [1694, "Magehunter Strike"], _ + [1695, "Soldiers Strike"], _ + [1696, "Decapitate"], _ + [1697, "Magehunters Smash"], _ + [1698, "Soldiers Stance"], _ + [1699, "Soldiers Defense"], _ + [1700, "Frenzied Defense"], _ + [1701, "Steady Stance"], _ + [1702, "Steelfang Slash"], _ + [1703, "Sunspear Battle Call"], _ + [1704, "Untouchable"], _ + [1705, "Earth Shattering Blow"], _ + [1706, "Corrupt Power"], _ + [1707, "Words of Madness (Qwytzylkak)"], _ + [1708, "Gaze of MoavuKaal"], _ + [1709, "Presence of the Skale Lord"], _ + [1710, "Madness Dart"], _ + [1711, "The Apocrypha is changing to another form"], _ + [1715, "Reform Carvings"], _ + [1717, "Sunspear Siege"], _ + [1718, "Soul Torture"], _ + [1719, "Screaming Shot"], _ + [1720, "Keen Arrow"], _ + [1721, "Rampage as One"], _ + [1722, "Forked Arrow"], _ + [1723, "Disrupting Accuracy"], _ + [1724, "Experts Dexterity"], _ + [1725, "Roaring Winds"], _ + [1726, "Magebane Shot"], _ + [1727, "Natural Stride"], _ + [1728, "Hekets Rampage"], _ + [1729, "Smoke Trap"], _ + [1730, "Infuriating Heat"], _ + [1731, "Vocal Was Sogolon"], _ + [1732, "Destructive Was Glaive"], _ + [1733, "Wielders Strike"], _ + [1734, "Gaze of Fury"], _ + [1735, "Gaze of Fury (attack)"], _ + [1736, "Spirits Strength"], _ + [1737, "Wielders Zeal"], _ + [1738, "Sight Beyond Sight"], _ + [1739, "Renewing Memories"], _ + [1740, "Wielders Remedy"], _ + [1741, "Ghostmirror Light"], _ + [1742, "Signet of Ghostly Might"], _ + [1743, "Signet of Binding"], _ + [1744, "Caretakers Charge"], _ + [1745, "Anguish"], _ + [1746, "Anguish (attack)"], _ + [1747, "Empowerment"], _ + [1748, "Recovery"], _ + [1749, "Weapon of Fury"], _ + [1750, "Xinraes Weapon"], _ + [1751, "Warmongers Weapon"], _ + [1752, "Weapon of Remedy"], _ + [1753, "Rending Sweep"], _ + [1754, "Onslaught"], _ + [1755, "Mystic Corruption"], _ + [1756, "Grenths Grasp"], _ + [1757, "Veil of Thorns"], _ + [1758, "Harriers Grasp"], _ + [1759, "Vow of Strength"], _ + [1760, "Ebon Dust Aura"], _ + [1761, "Zealous Vow"], _ + [1762, "Heart of Fury"], _ + [1763, "Zealous Renewal"], _ + [1764, "Attackers Insight"], _ + [1765, "Rending Aura"], _ + [1766, "Featherfoot Grace"], _ + [1767, "Reapers Sweep"], _ + [1768, "Harriers Haste"], _ + [1769, "Focused Anger"], _ + [1770, "Natural Temper"], _ + [1771, "Song of Restoration"], _ + [1772, "Lyric of Purification"], _ + [1773, "Soldiers Fury"], _ + [1774, "Aggressive Refrain"], _ + [1775, "Energizing Finale"], _ + [1776, "Signet of Aggression"], _ + [1777, "Remedy Signet"], _ + [1778, "Signet of Return"], _ + [1779, "Make Your Time"], _ + [1780, "Cant Touch This"], _ + [1781, "Find Their Weakness"], _ + [1782, "The Power Is Yours"], _ + [1783, "Slayers Spear"], _ + [1784, "Swift Javelin"], _ + [1785, "Natures Speed"], _ + [1786, "Weapon of Mastery"], _ + [1787, "Accelerated Growth"], _ + [1788, "Forge the Way"], _ + [1789, "Anthem of Aggression"], _ + [1790, "Skale Hunt"], _ + [1791, "Mandragor Hunt"], _ + [1792, "Skree Battle"], _ + [1793, "Insect Hunt"], _ + [1794, "Corsair Bounty"], _ + [1795, "Plant Hunt"], _ + [1796, "Undead Hunt"], _ + [1797, "Eternal Suffering"], _ + [1798, "Eternal Suffering"], _ + [1799, "Eternal Suffering"], _ + [1800, "Eternal Languor"], _ + [1801, "Eternal Languor"], _ + [1802, "Eternal Languor"], _ + [1803, "Eternal Lethargy"], _ + [1804, "Eternal Lethargy"], _ + [1805, "Eternal Lethargy"], _ + [1808, "Thirst of the Drought"], _ + [1809, "Thirst of the Drought"], _ + [1810, "Thirst of the Drought"], _ + [1811, "Thirst of the Drought"], _ + [1812, "Thirst of the Drought"], _ + [1813, "Lightbringer"], _ + [1814, "Lightbringers Gaze"], _ + [1815, "Lightbringer Signet"], _ + [1816, "Sunspear Rebirth Signet"], _ + [1817, "Wisdom"], _ + [1818, "Maddened Strike"], _ + [1819, "Maddened Stance"], _ + [1820, "Spirit Form (Remains of Sahlahja)"], _ + [1821, "Gods Blessing"], _ + [1822, "Monster Hunt"], _ + [1823, "Monster Hunt"], _ + [1824, "Monster Hunt"], _ + [1825, "Monster Hunt"], _ + [1826, "Elemental Hunt"], _ + [1827, "Elemental Hunt"], _ + [1828, "Skree Battle"], _ + [1829, "Insect Hunt"], _ + [1830, "Insect Hunt"], _ + [1831, "Demon Hunt"], _ + [1832, "Minotaur Hunt"], _ + [1833, "Plant Hunt"], _ + [1834, "Plant Hunt"], _ + [1835, "Skale Hunt"], _ + [1836, "Skale Hunt"], _ + [1837, "Heket Hunt"], _ + [1838, "Heket Hunt"], _ + [1839, "Kournan Bounty"], _ + [1840, "Mandragor Hunt"], _ + [1841, "Mandragor Hunt"], _ + [1842, "Corsair Bounty"], _ + [1843, "Kournan Bounty"], _ + [1844, "Dhuum Battle"], _ + [1845, "Menzies Battle"], _ + [1846, "Elemental Hunt"], _ + [1847, "Monolith Hunt"], _ + [1848, "Monolith Hunt"], _ + [1849, "Margonite Battle"], _ + [1850, "Monster Hunt"], _ + [1851, "Titan Hunt"], _ + [1852, "Mandragor Hunt"], _ + [1853, "Giant Hunt"], _ + [1854, "Undead Hunt"], _ + [1855, "Kournan Siege"], _ + [1856, "Lose your Head"], _ + [1857, "Wandering Mind"], _ + [1859, "Altar Buff"], _ + [1860, "Sugar Rush (short)"], _ + [1861, "Choking Breath"], _ + [1862, "Junundu Bite"], _ + [1863, "Blinding Breath"], _ + [1864, "Burning Breath"], _ + [1865, "Junundu Wail"], _ + [1866, "Capture Point"], _ + [1867, "Approaching the Vortex"], _ + [1871, "Avatar of Sweetness"], _ + [1873, "Corrupted Lands"], _ + [1875, "Words of Madness"], _ + [1876, "Unknown Junundu Ability"], _ + [1880, "Torment Slash (Smothering Tendrils)"], _ + [1881, "Bonds of Torment"], _ + [1882, "Shadow Smash"], _ + [1883, "Bonds of Torment (effect)"], _ + [1884, "Consume Torment"], _ + [1885, "Banish Enchantment"], _ + [1886, "Summoning Shadows"], _ + [1887, "Lightbringers Insight"], _ + [1889, "Repressive Energy"], _ + [1890, "Enduring Torment"], _ + [1891, "Shroud of Darkness"], _ + [1892, "Demonic Miasma"], _ + [1893, "Enraged"], _ + [1894, "Touch of Aaaaarrrrrrggghhh"], _ + [1895, "Wild Smash"], _ + [1896, "Unyielding Anguish"], _ + [1897, "Jadoths Storm of Judgment"], _ + [1898, "Anguish Hunt"], _ + [1899, "Avatar of Holiday Cheer"], _ + [1900, "Side Step"], _ + [1901, "Jack Frost"], _ + [1902, "Avatar of Grenth (snow fighting skill)"], _ + [1903, "Avatar of Dwayna (snow fighting skill)"], _ + [1904, "Steady Aim"], _ + [1905, "Rudis Red Nose"], _ + [1910, "Charm Animal (White Mantle)"], _ + [1911, "Volatile Charr Crystal"], _ + [1912, "Hard mode"], _ + [1913, "Claim Resource (Heroes Ascent)"], _ + [1914, "Hard mode"], _ + [1915, "Hard Mode NPC Buff"], _ + [1916, "Sugar Jolt (short)"], _ + [1917, "Rollerbeetle Racer"], _ + [1918, "Ram"], _ + [1919, "Harden Shell"], _ + [1920, "Rollerbeetle Dash"], _ + [1921, "Super Rollerbeetle"], _ + [1922, "Rollerbeetle Echo"], _ + [1923, "Distracting Lunge"], _ + [1924, "Rollerbeetle Blast"], _ + [1925, "Spit Rocks"], _ + [1926, "Lunar Blessing"], _ + [1927, "Lucky Aura"], _ + [1928, "Spiritual Possession"], _ + [1929, "Water"], _ + [1930, "Pig Form"], _ + [1931, "Beetle Metamorphosis"], _ + [1933, "Sugar Jolt (long)"], _ + [1934, "Golden Egg (skill)"], _ + [1935, "Torturous Embers"], _ + [1936, "Test Buff"], _ + [1937, "Infernal Rage"], _ + [1938, "Putrid Flames"], _ + [1939, "Shroud of Ash"], _ + [1940, "Flame Call"], _ + [1941, "Torturers Inferno"], _ + [1942, "Whirling Fires"], _ + [1943, "Charr Siege Attack (What Must Be Done)"], _ + [1944, "Charr Siege Attack (Against the Charr)"], _ + [1945, "Birthday Cupcake (skill)"], _ + [1947, "Blessing of the Luxons"], _ + [1948, "Shadow Sanctuary"], _ + [1949, "Ether Nightmare"], _ + [1950, "Signet of Corruption"], _ + [1951, "Elemental Lord"], _ + [1952, "Selfless Spirit"], _ + [1953, "Triple Shot"], _ + [1954, "Save Yourselves"], _ + [1955, "Aura of Holy Might"], _ + [1957, "Spear of Fury"], _ + [1958, "Attribute Balance"], _ + [1959, "Monster Hunt"], _ + [1960, "Monster Hunt"], _ + [1961, "Mandragor Hunt"], _ + [1962, "Mandragor Hunt"], _ + [1963, "Giant Hunt"], _ + [1964, "Giant Hunt"], _ + [1965, "Skree Battle"], _ + [1966, "Skree Battle"], _ + [1967, "Insect Hunt"], _ + [1968, "Insect Hunt"], _ + [1969, "Minotaur Hunt"], _ + [1970, "Minotaur Hunt"], _ + [1971, "Corsair Bounty"], _ + [1972, "Corsair Bounty"], _ + [1973, "Plant Hunt"], _ + [1974, "Plant Hunt"], _ + [1975, "Skale Hunt"], _ + [1976, "Skale Hunt"], _ + [1977, "Heket Hunt"], _ + [1978, "Heket Hunt"], _ + [1979, "Kournan Bounty"], _ + [1980, "Kournan Bounty"], _ + [1981, "Undead Hunt"], _ + [1982, "Undead Hunt"], _ + [1983, "Fire Dart"], _ + [1984, "Ice Dart"], _ + [1985, "Poison Dart"], _ + [1986, "Vampiric Assault"], _ + [1987, "Lotus Strike"], _ + [1988, "Golden Fang Strike"], _ + [1989, "Way of the Mantis"], _ + [1990, "Falling Lotus Strike"], _ + [1991, "Sadists Signet"], _ + [1992, "Signet of Distraction"], _ + [1993, "Signet of Recall"], _ + [1994, "Power Lock"], _ + [1995, "Waste Not, Want Not"], _ + [1996, "Sum of All Fears"], _ + [1997, "Withering Aura"], _ + [1998, "Cacophony"], _ + [1999, "Winters Embrace"], _ + [2000, "Earthen Shackles"], _ + [2001, "Ward of Weakness"], _ + [2002, "Glyph of Swiftness"], _ + [2003, "Cure Hex"], _ + [2004, "Smite Condition"], _ + [2005, "Smiters Boon"], _ + [2006, "Castigation Signet"], _ + [2007, "Purifying Veil"], _ + [2008, "Pulverizing Smash"], _ + [2009, "Keen Chop"], _ + [2010, "Knee Cutter"], _ + [2011, "Grapple"], _ + [2012, "Radiant Scythe"], _ + [2013, "Grenths Aura"], _ + [2014, "Signet of Pious Restraint"], _ + [2015, "Farmers Scythe"], _ + [2016, "Energetic Was Lee Sa"], _ + [2017, "Anthem of Weariness"], _ + [2018, "Anthem of Disruption"], _ + [2019, "Burning Ground"], _ + [2020, "Freezing Ground"], _ + [2021, "Poison Ground"], _ + [2022, "Fire Jet"], _ + [2023, "Ice Jet"], _ + [2024, "Poison Jet"], _ + [2025, "Lava Pool"], _ + [2026, "Water Pool"], _ + [2027, "Fire Spout"], _ + [2028, "Ice Spout"], _ + [2029, "Poison Spout"], _ + [2030, "Dhuum Battle"], _ + [2031, "Dhuum Battle"], _ + [2032, "Elemental Hunt"], _ + [2033, "Elemental Hunt"], _ + [2034, "Monolith Hunt"], _ + [2035, "Monolith Hunt"], _ + [2036, "Margonite Battle"], _ + [2037, "Margonite Battle"], _ + [2038, "Menzies Battle"], _ + [2039, "Menzies Battle"], _ + [2040, "Anguish Hunt"], _ + [2041, "Titan Hunt"], _ + [2042, "Titan Hunt"], _ + [2043, "Monster Hunt"], _ + [2044, "Monster Hunt"], _ + [2045, "Sarcophagus Spores"], _ + [2046, "Exploding Barrel"], _ + [2047, "Greater Hard Mode NPC Buff"], _ + [2048, "Fire Boulder"], _ + [2049, "Dire Snowball"], _ + [2050, "Boulder"], _ + [2051, "Summon Spirits"], _ + [2052, "Shadow Fang"], _ + [2053, "Calculated Risk"], _ + [2054, "Shrinking Armor"], _ + [2055, "Aneurysm"], _ + [2056, "Wandering Eye"], _ + [2057, "Foul Feast"], _ + [2058, "Putrid Bile"], _ + [2059, "Shell Shock"], _ + [2060, "Glyph of Immolation"], _ + [2061, "Patient Spirit"], _ + [2062, "Healing Ribbon"], _ + [2063, "Aura of Stability"], _ + [2064, "Spotless Mind"], _ + [2065, "Spotless Soul"], _ + [2066, "Disarm"], _ + [2067, "I Meant to Do That"], _ + [2068, "Rapid Fire"], _ + [2069, "Sloth Hunters Shot"], _ + [2070, "Aura Slicer"], _ + [2071, "Zealous Sweep"], _ + [2072, "Pure Was Li Ming"], _ + [2073, "Weapon of Aggression"], _ + [2074, "Chest Thumper"], _ + [2075, "Hasty Refrain"], _ + [2076, "Drain Minion"], _ + [2077, "Cracked Armor"], _ + [2078, "Berserk"], _ + [2079, "Fleshreavers Escape"], _ + [2080, "Chomp"], _ + [2081, "Twisting Jaws"], _ + [2082, "Burning Immunity"], _ + [2083, "Mandragors Charge"], _ + [2084, "Rock Slide"], _ + [2085, "Avalanche (effect)"], _ + [2086, "Snaring Web"], _ + [2087, "Ceiling Collapse"], _ + [2088, "Trample"], _ + [2089, "Wurm Bile"], _ + [2090, "Ground Cover"], _ + [2091, "Shadow Sanctuary"], _ + [2092, "Ether Nightmare"], _ + [2093, "Signet of Corruption"], _ + [2094, "Elemental Lord"], _ + [2095, "Selfless Spirit"], _ + [2096, "Triple Shot"], _ + [2097, "Save Yourselves"], _ + [2098, "Aura of Holy Might"], _ + [2099, "Spear of Fury"], _ + [2100, "Summon Spirits"], _ + [2101, "Critical Agility"], _ + [2102, "Cry of Pain"], _ + [2103, "Necrosis"], _ + [2104, "Intensity"], _ + [2105, "Seed of Life"], _ + [2106, "Call of the Eye"], _ + [2107, "Whirlwind Attack"], _ + [2108, "Never Rampage Alone"], _ + [2109, "Eternal Aura"], _ + [2110, "Vampirism"], _ + [2111, "Vampirism (attack)"], _ + [2112, "Theres Nothing to Fear"], _ + [2113, "Ursan Rage (Blood Washes Blood)"], _ + [2114, "Ursan Strike (Blood Washes Blood)"], _ + [2116, "Sneak Attack"], _ + [2117, "Firebomb Explosion"], _ + [2118, "Firebomb"], _ + [2119, "Shield of Fire"], _ + [2120, "Respawn"], _ + [2121, "Marked For Death"], _ + [2122, "Spirit World Retreat"], _ + [2123, "Long Claws"], _ + [2124, "Shattered Spirit"], _ + [2125, "Spirit Roar"], _ + [2126, "Spirit Senses"], _ + [2127, "Unseen Aggression"], _ + [2128, "Volfen Pounce (Curse of the Nornbear)"], _ + [2129, "Volfen Claw (Curse of the Nornbear)"], _ + [2131, "Volfen Bloodlust (Curse of the Nornbear)"], _ + [2132, "Volfen Agility (Curse of the Nornbear)"], _ + [2133, "Volfen Blessing (Curse of the Nornbear)"], _ + [2134, "Charging Spirit"], _ + [2135, "Trampling Ox"], _ + [2136, "Smoke Powder Defense"], _ + [2137, "Confusing Images"], _ + [2138, "Hexers Vigor"], _ + [2139, "Masochism"], _ + [2140, "Piercing Trap"], _ + [2141, "Companionship"], _ + [2142, "Feral Aggression"], _ + [2143, "Disrupting Shot"], _ + [2144, "Volley"], _ + [2145, "Expert Focus"], _ + [2146, "Pious Fury"], _ + [2147, "Crippling Victory"], _ + [2148, "Sundering Weapon"], _ + [2149, "Weapon of Renewal"], _ + [2150, "Maiming Spear"], _ + [2151, "Temporal Sheen"], _ + [2152, "Flux Overload"], _ + [2153, "A pool of water."], _ + [2154, "Phase Shield (effect)"], _ + [2155, "Phase Shield (monster skill)"], _ + [2156, "Vitality Transfer"], _ + [2157, "Golem Strike"], _ + [2158, "Bloodstone Slash"], _ + [2159, "Energy Blast (golem)"], _ + [2160, "Chaotic Energy"], _ + [2161, "Golem Fire Shield"], _ + [2162, "The Way of Duty"], _ + [2163, "The Way of Kinship"], _ + [2164, "Diamondshard Mist (environment effect)"], _ + [2165, "Diamondshard Grave"], _ + [2166, "The Way of Strength"], _ + [2167, "Diamondshard Mist"], _ + [2168, "Raven Blessing (A Gate Too Far)"], _ + [2170, "Raven Flight (A Gate Too Far)"], _ + [2171, "Raven Shriek (A Gate Too Far)"], _ + [2172, "Raven Swoop (A Gate Too Far)"], _ + [2173, "Raven Talons (A Gate Too Far)"], _ + [2174, "Aspect of Oak"], _ + [2175, "Long Claws"], _ + [2176, "Tremor"], _ + [2177, "Rage of the Jotun"], _ + [2178, "Thundering Roar"], _ + [2179, "Sundering Soulcrush"], _ + [2180, "Pyroclastic Shot"], _ + [2181, "Explosive Force"], _ + [2184, "Rolling Shift"], _ + [2185, "Powder Keg Explosion"], _ + [2186, "Signet of Deadly Corruption"], _ + [2187, "Way of the Master"], _ + [2188, "Defile Defenses"], _ + [2189, "Angorodons Gaze"], _ + [2190, "Magnetic Surge"], _ + [2191, "Slippery Ground"], _ + [2192, "Glowing Ice"], _ + [2193, "Energy Blast"], _ + [2194, "Distracting Strike"], _ + [2195, "Symbolic Strike"], _ + [2196, "Soldiers Speed"], _ + [2197, "Body Blow"], _ + [2198, "Body Shot"], _ + [2199, "Poison Tip Signet"], _ + [2200, "Signet of Mystic Speed"], _ + [2201, "Shield of Force"], _ + [2202, "Mending Grip"], _ + [2203, "Spiritleech Aura"], _ + [2204, "Rejuvenation"], _ + [2205, "Agony"], _ + [2206, "Ghostly Weapon"], _ + [2207, "Inspirational Speech"], _ + [2208, "Burning Shield"], _ + [2209, "Holy Spear"], _ + [2210, "Spear Swipe"], _ + [2211, "Alkars Alchemical Acid"], _ + [2212, "Light of Deldrimor"], _ + [2213, "Ear Bite"], _ + [2214, "Low Blow"], _ + [2215, "Brawling Headbutt"], _ + [2216, "Dont Trip"], _ + [2217, "By Urals Hammer"], _ + [2218, "Drunken Master"], _ + [2219, "Great Dwarf Weapon"], _ + [2220, "Great Dwarf Armor"], _ + [2221, "Breath of the Great Dwarf"], _ + [2222, "Snow Storm"], _ + [2223, "Black Powder Mine"], _ + [2224, "Summon Mursaat"], _ + [2225, "Summon Ruby Djinn"], _ + [2226, "Summon Ice Imp"], _ + [2227, "Summon Naga Shaman"], _ + [2228, "Deft Strike"], _ + [2229, "Signet of Infection"], _ + [2230, "Tryptophan Signet"], _ + [2231, "Ebon Battle Standard of Courage"], _ + [2232, "Ebon Battle Standard of Wisdom"], _ + [2233, "Ebon Battle Standard of Honor"], _ + [2234, "Ebon Vanguard Sniper Support"], _ + [2235, "Ebon Vanguard Assassin Support"], _ + [2236, "Well of Ruin"], _ + [2237, "Atrophy"], _ + [2238, "Spear of Redemption"], _ + [2240, "Gelatinous Material Explosion"], _ + [2241, "Gelatinous Corpse Consumption"], _ + [2242, "Gelatinous Mutation"], _ + [2243, "Gelatinous Absorption"], _ + [2244, "Unstable Ooze Explosion"], _ + [2245, "Golem Shrapnel"], _ + [2246, "Unstable Aura"], _ + [2247, "Unstable Pulse"], _ + [2248, "Polymock Power Drain"], _ + [2249, "Polymock Block"], _ + [2250, "Polymock Glyph of Concentration"], _ + [2251, "Polymock Ether Signet"], _ + [2252, "Polymock Glyph of Power"], _ + [2253, "Polymock Overload"], _ + [2254, "Polymock Glyph Destabilization"], _ + [2255, "Polymock Mind Wreck"], _ + [2256, "Order of Unholy Vigor"], _ + [2257, "Order of the Lich"], _ + [2258, "Master of Necromancy"], _ + [2259, "Animate Undead"], _ + [2260, "Polymock Deathly Chill"], _ + [2261, "Polymock Rising Bile"], _ + [2262, "Polymock Rotting Flesh"], _ + [2263, "Polymock Lightning Strike"], _ + [2264, "Polymock Lightning Orb"], _ + [2265, "Polymock Lightning Djinns Haste"], _ + [2266, "Polymock Flare"], _ + [2267, "Polymock Immolate"], _ + [2268, "Polymock Meteor"], _ + [2269, "Polymock Ice Spear"], _ + [2270, "Polymock Icy Prison"], _ + [2271, "Polymock Mind Freeze"], _ + [2272, "Polymock Ice Shard Storm"], _ + [2273, "Polymock Frozen Trident"], _ + [2274, "Polymock Smite"], _ + [2275, "Polymock Smite Hex"], _ + [2276, "Polymock Bane Signet"], _ + [2277, "Polymock Stone Daggers"], _ + [2278, "Polymock Obsidian Flame"], _ + [2279, "Polymock Earthquake"], _ + [2280, "Polymock Frozen Armor"], _ + [2281, "Polymock Glyph Freeze"], _ + [2282, "Polymock Fireball"], _ + [2283, "Polymock Rodgorts Invocation"], _ + [2284, "Polymock Calculated Risk"], _ + [2285, "Polymock Recurring Insecurity"], _ + [2286, "Polymock Backfire"], _ + [2287, "Polymock Guilt"], _ + [2288, "Polymock Lamentation"], _ + [2289, "Polymock Spirit Rift"], _ + [2290, "Polymock Painful Bond"], _ + [2291, "Polymock Signet of Clumsiness"], _ + [2292, "Polymock Migraine"], _ + [2293, "Polymock Glowing Gaze"], _ + [2294, "Polymock Searing Flames"], _ + [2295, "Polymock Signet of Revenge"], _ + [2296, "Polymock Signet of Smiting"], _ + [2297, "Polymock Stoning"], _ + [2298, "Polymock Eruption"], _ + [2299, "Polymock Shock Arrow"], _ + [2300, "Polymock Mind Shock"], _ + [2301, "Polymock Piercing Light Spear"], _ + [2302, "Polymock Mind Blast"], _ + [2303, "Polymock Savannah Heat"], _ + [2304, "Polymock Diversion"], _ + [2305, "Polymock Lightning Blast"], _ + [2306, "Polymock Poisoned Ground"], _ + [2307, "Polymock Icy Bonds"], _ + [2308, "Polymock Sandstorm"], _ + [2309, "Polymock Banish"], _ + [2310, "Mergoyle Form"], _ + [2311, "Skale Form"], _ + [2312, "Gargoyle Form"], _ + [2313, "Ice Imp Form"], _ + [2314, "Fire Imp Form"], _ + [2315, "Kappa Form"], _ + [2316, "Aloe Seed Form"], _ + [2317, "Earth Elemental Form"], _ + [2318, "Fire Elemental Form"], _ + [2319, "Ice Elemental Form"], _ + [2320, "Mirage Iboga Form"], _ + [2321, "Wind Rider Form"], _ + [2322, "Naga Shaman Form"], _ + [2323, "Mantis Dreamweaver Form"], _ + [2324, "Ruby Djinn Form"], _ + [2325, "Gaki Form"], _ + [2326, "Stone Rain Form"], _ + [2327, "Mursaat Elementalist Form"], _ + [2328, "Crystal Shield"], _ + [2329, "Crystal Snare"], _ + [2330, "Paranoid Indignation"], _ + [2331, "Searing Breath"], _ + [2332, "Kraks Charge"], _ + [2333, "Brawling"], _ + [2334, "Brawling Block"], _ + [2335, "Brawling Jab"], _ + [2336, "Brawling Jab"], _ + [2337, "Brawling Straight Right"], _ + [2338, "Brawling Hook"], _ + [2339, "Brawling Hook"], _ + [2340, "Brawling Uppercut"], _ + [2341, "Brawling Combo Punch"], _ + [2342, "Brawling Headbutt (Brawling skill)"], _ + [2343, "STAND UP"], _ + [2344, "Call of Destruction"], _ + [2345, "Flame Jet"], _ + [2346, "Lava Ground"], _ + [2347, "Lava Wave"], _ + [2349, "Spirit Shield"], _ + [2350, "Summoning Lord"], _ + [2351, "Charm Animal (Ashlyn Spiderfriend)"], _ + [2352, "Charr Siege Attack (Assault on the Stronghold)"], _ + [2353, "Finish Him"], _ + [2354, "Dodge This"], _ + [2355, "I Am the Strongest"], _ + [2356, "I Am Unstoppable"], _ + [2357, "A Touch of Guile"], _ + [2358, "You Move Like a Dwarf"], _ + [2359, "You Are All Weaklings"], _ + [2360, "Feel No Pain"], _ + [2361, "Club of a Thousand Bears"], _ + [2363, "Talon Strike"], _ + [2364, "Lava Blast"], _ + [2365, "Thunderfist Strike"], _ + [2367, "Alkars Concoction"], _ + [2368, "Murakais Consumption"], _ + [2369, "Murakais Censure"], _ + [2370, "Murakais Calamity"], _ + [2371, "Murakais Storm of Souls"], _ + [2372, "Edification"], _ + [2373, "Heart of the Norn"], _ + [2374, "Ursan Blessing"], _ + [2375, "Ursan Strike"], _ + [2376, "Ursan Rage"], _ + [2377, "Ursan Roar"], _ + [2378, "Ursan Force"], _ + [2379, "Volfen Blessing"], _ + [2380, "Volfen Claw"], _ + [2381, "Volfen Pounce"], _ + [2382, "Volfen Bloodlust"], _ + [2383, "Volfen Agility"], _ + [2384, "Raven Blessing"], _ + [2385, "Raven Talons"], _ + [2386, "Raven Swoop"], _ + [2387, "Raven Shriek"], _ + [2388, "Raven Flight"], _ + [2389, "Totem of Man"], _ + [2390, "Filthy Explosion"], _ + [2391, "Murakais Call"], _ + [2392, "Spawn Pods"], _ + [2393, "Enraged Blast"], _ + [2394, "Spawn Hatchling"], _ + [2395, "Ursan Roar (Blood Washes Blood)"], _ + [2396, "Ursan Force (Blood Washes Blood)"], _ + [2397, "Ursan Aura"], _ + [2398, "Consume Flames"], _ + [2399, "Aura of the Great Destroyer"], _ + [2400, "Destroy the Humans"], _ + [2401, "Charr Flame Keeper Form"], _ + [2402, "Titan Form"], _ + [2403, "Skeletal Mage Form"], _ + [2404, "Smoke Wraith Form"], _ + [2405, "Bone Dragon Form"], _ + [2407, "Dwarven Arcanist Form"], _ + [2408, "Dolyak Rider Form"], _ + [2409, "Extract Inscription"], _ + [2410, "Charr Shaman Form"], _ + [2411, "Mindbender"], _ + [2412, "Smooth Criminal"], _ + [2413, "Technobabble"], _ + [2414, "Radiation Field"], _ + [2415, "Asuran Scan"], _ + [2416, "Air of Superiority"], _ + [2417, "Mental Block"], _ + [2418, "Pain Inverter"], _ + [2419, "Healing Salve"], _ + [2420, "Ebon Escape"], _ + [2421, "Weakness Trap"], _ + [2422, "Winds"], _ + [2423, "Dwarven Stability"], _ + [2424, "Stout-Hearted"], _ + [2425, "Inscribed Ettin Aura"], _ + [2426, "Decipher Inscriptions"], _ + [2427, "Rebel Yell"], _ + [2429, "Asuran Flame Staff"], _ + [2430, "Aura of the Bloodstone"], _ + [2431, "Aura of the Bloodstone"], _ + [2432, "Aura of the Bloodstone"], _ + [2433, "Haunted Ground"], _ + [2434, "Asuran Bodyguard"], _ + [2435, "Asuran Bodyguard"], _ + [2436, "Asuran Bodyguard"], _ + [2437, "Energy Channel"], _ + [2438, "Hunt Rampage"], _ + [2440, "Boss Bounty"], _ + [2441, "Hunt Point Bonus"], _ + [2442, "Hunt Point Bonus"], _ + [2443, "Hunt Point Bonus"], _ + [2444, "Time Attack"], _ + [2445, "Dwarven Raider"], _ + [2446, "Dwarven Raider"], _ + [2447, "Dwarven Raider"], _ + [2448, "Dwarven Raider"], _ + [2449, "Great Dwarfs Blessing"], _ + [2450, "Hunt Rampage"], _ + [2452, "Boss Bounty"], _ + [2453, "Hunt Point Bonus"], _ + [2454, "Hunt Point Bonus"], _ + [2456, "Time Attack"], _ + [2457, "Vanguard Patrol"], _ + [2458, "Vanguard Patrol"], _ + [2459, "Vanguard Patrol"], _ + [2460, "Vanguard Patrol"], _ + [2461, "Vanguard Commendation"], _ + [2462, "Hunt Rampage"], _ + [2464, "Boss Bounty"], _ + [2469, "Norn Hunting Party"], _ + [2470, "Norn Hunting Party"], _ + [2471, "Norn Hunting Party"], _ + [2472, "Norn Hunting Party"], _ + [2473, "Strength of the Norn"], _ + [2474, "Hunt Rampage"], _ + [2481, "Asuran Bodyguard"], _ + [2482, "Desperate Howl"], _ + [2483, "Gloat"], _ + [2484, "Metamorphosis"], _ + [2485, "Inner Fire"], _ + [2486, "Elemental Shift"], _ + [2487, "Dryders Feast"], _ + [2488, "Fungal Explosion"], _ + [2489, "Blood Rage"], _ + [2490, "Parasitic Bite"], _ + [2491, "False Death"], _ + [2492, "Ooze Combination"], _ + [2493, "Ooze Division"], _ + [2494, "Bear Form"], _ + [2495, "Sweeping Strikes"], _ + [2496, "Spore Explosion"], _ + [2497, "Dormant Husk"], _ + [2498, "Monkey See, Monkey Do"], _ + [2499, "Feeding Frenzy"], _ + [2500, "Tengus Mimicry"], _ + [2501, "Tongue Lash"], _ + [2502, "Soulrending Shriek"], _ + [2503, "Unreliable"], _ + [2504, "Siege Devourer"], _ + [2505, "Siege Devourer Feast"], _ + [2506, "Devourer Bite"], _ + [2507, "Siege Devourer Swipe"], _ + [2508, "Devourer Siege"], _ + [2509, "HYAHHHHH"], _ + [2510, "HYAHHHHH"], _ + [2511, "HYAHHHHH"], _ + [2512, "HYAHHHHH"], _ + [2513, "Dismount Siege Devourer"], _ + [2514, "The Masters Mark"], _ + [2515, "The Snipers Spear"], _ + [2516, "Mount"], _ + [2517, "Reverse Polarity Fire Shield"], _ + [2518, "Tengus Gaze"], _ + [2519, "Fix Monster Attributes"], _ + [2520, "Armor of Salvation (item effect)"], _ + [2521, "Grail of Might (item effect)"], _ + [2522, "Essence of Celerity (item effect)"], _ + [2523, "Stone Dwarf Transformation"], _ + [2524, "Forgewights Blessing"], _ + [2525, "Selvetarms Blessing"], _ + [2526, "Thommiss Blessing"], _ + [2527, "Duncans Defense"], _ + [2529, "Rands Attack"], _ + [2530, "Selvetarms Attack"], _ + [2531, "Thommiss Attack"], _ + [2532, "Create Spore"], _ + [2536, "Invigorating Mist"], _ + [2537, "Courageous Was Saidra"], _ + [2538, "Animate Undead (Palawa Joko)"], _ + [2539, "Order of Unholy Vigor (Palawa Joko)"], _ + [2540, "Order of the Lich (Palawa Joko)"], _ + [2541, "Golem Boosters"], _ + [2542, "Charm Animal (monster)"], _ + [2543, "Wurm Siege (Eye of the North)"], _ + [2544, "Tongue Whip"], _ + [2545, "Lit Torch"], _ + [2546, "Dishonorable"], _ + [2547, "Hard Mode Dungeon Boss"], _ + [2548, "Veteran Asuran Bodyguard"], _ + [2549, "Veteran Dwarven Raider"], _ + [2550, "Veteran Vanguard Patrol"], _ + [2551, "Veteran Norn Hunting Party"], _ + [2565, "Dwarven Raider"], _ + [2566, "Dwarven Raider"], _ + [2567, "Dwarven Raider"], _ + [2568, "Dwarven Raider"], _ + [2570, "Great Dwarfs Blessing"], _ + [2571, "Boss Bounty"], _ + [2574, "Hunt Point Bonus"], _ + [2575, "Hunt Point Bonus"], _ + [2576, "Hunt Rampage"], _ + [2577, "Time Attack"], _ + [2578, "Vanguard Patrol"], _ + [2583, "Boss Bounty"], _ + [2585, "Hunt Point Bonus"], _ + [2589, "Vanguard Commendation"], _ + [2591, "Norn Hunting Party"], _ + [2592, "Norn Hunting Party"], _ + [2593, "Norn Hunting Party"], _ + [2594, "Norn Hunting Party"], _ + [2596, "Boss Bounty"], _ + [2598, "Strength of the Norn"], _ + [2599, "Hunt Point Bonus"], _ + [2601, "Hunt Point Bonus"], _ + [2602, "Hunt Rampage"], _ + [2603, "Time Attack"], _ + [2604, "Candy Corn (skill)"], _ + [2605, "Candy Apple (skill)"], _ + [2606, "Anton (Costume Brawl disguise)"], _ + [2607, "Erys Vasburg (Costume Brawl disguise)"], _ + [2608, "Olias (Costume Brawl disguise)"], _ + [2609, "Argo (Costume Brawl disguise)"], _ + [2610, "Mhenlo (Costume Brawl disguise)"], _ + [2611, "Lukas (Costume Brawl disguise)"], _ + [2612, "Aidan (Costume Brawl disguise)"], _ + [2613, "Kahmu (Costume Brawl disguise)"], _ + [2614, "Razah (Costume Brawl disguise)"], _ + [2615, "Morgahn (Costume Brawl disguise)"], _ + [2616, "Nika (Costume Brawl disguise)"], _ + [2617, "Seaguard Hala (Costume Brawl disguise)"], _ + [2618, "Livia (Costume Brawl disguise)"], _ + [2619, "Cynn (Costume Brawl disguise)"], _ + [2620, "Tahlkora (Costume Brawl disguise)"], _ + [2621, "Devona (Costume Brawl disguise)"], _ + [2622, "Zho (Costume Brawl disguise)"], _ + [2623, "Melonni (Costume Brawl disguise)"], _ + [2624, "Xandra (Costume Brawl disguise)"], _ + [2625, "Hayda (Costume Brawl disguise)"], _ + [2626, "Complicate"], _ + [2627, "Reapers Mark"], _ + [2628, "Enfeeble"], _ + [2630, "Signet of Lost Souls"], _ + [2632, "Searing Flames"], _ + [2633, "Glowing Gaze"], _ + [2634, "Steam"], _ + [2635, "Flame Djinns Haste"], _ + [2636, "Liquid Flame"], _ + [2639, "Smite Condition"], _ + [2640, "Crippling Slash"], _ + [2641, "Sun and Moon Slash"], _ + [2642, "Enraging Charge"], _ + [2643, "Tiger Stance"], _ + [2644, "Burning Arrow"], _ + [2645, "Natural Stride"], _ + [2646, "Falling Lotus Strike"], _ + [2647, "Anthem of Weariness"], _ + [2648, "Pious Fury"], _ + [2649, "Pie Induced Ecstasy"], _ + [2650, "Charm Animal (Charr Demolisher)"], _ + [2651, "Togo (disguise)"], _ + [2652, "Turai Ossa (disguise)"], _ + [2653, "Gwen (disguise)"], _ + [2654, "Saul DAlessio (disguise)"], _ + [2655, "Dragon Empire Rage"], _ + [2656, "Call to the Spirit Realm"], _ + [2657, "Call of Haste (PvP)"], _ + [2658, "Hide"], _ + [2659, "Feign Death"], _ + [2660, "Flee"], _ + [2661, "Throw Rock"], _ + [2662, "Nightmarish Aura"], _ + [2663, "Siege Strike"], _ + [2664, "Spike Trap (spell)"], _ + [2665, "Barbed Bomb"], _ + [2666, "Fire and Brimstone"], _ + [2667, "Balm Bomb"], _ + [2668, "Explosives"], _ + [2669, "Rations"], _ + [2670, "Form Up and Advance"], _ + [2671, "Advance"], _ + [2672, "Spectral Agony (Saul DAlessio)"], _ + [2673, "Stun Bomb"], _ + [2674, "Banner of the Unseen"], _ + [2675, "Signet of the Unseen"], _ + [2676, "For Elona"], _ + [2677, "Giant Stomp (Turai Ossa)"], _ + [2678, "Whirlwind Attack (Turai Ossa)"], _ + [2679, "Junundu Siege"], _ + [2680, "Distortion (Gwen)"], _ + [2681, "Shared Burden (Gwen)"], _ + [2682, "Sum of All Fears (Gwen)"], _ + [2683, "Castigation Signet (Saul DAlessio)"], _ + [2684, "Unnatural Signet (Saul DAlessio)"], _ + [2685, "Dragon Slash (Turai Ossa)"], _ + [2686, "Essence Strike (Togo)"], _ + [2687, "Spirit Burn (Togo)"], _ + [2688, "Spirit Rift (Togo)"], _ + [2689, "Mend Body and Soul (Togo)"], _ + [2690, "Offering of Spirit (Togo)"], _ + [2691, "Disenchantment (Togo)"], _ + [2692, "Fire Dart"], _ + [2698, "Corrupted Haiju Lagoon Water"], _ + [2699, "Journey to the North"], _ + [2701, "Rat Form"], _ + [2702, "Ox Form"], _ + [2703, "Tiger Form"], _ + [2704, "Rabbit Form"], _ + [2705, "Dragon Form"], _ + [2706, "Snake Form"], _ + [2707, "Horse Form"], _ + [2708, "Sheep Form"], _ + [2709, "Monkey Form"], _ + [2710, "Rooster Form"], _ + [2711, "Dog Form"], _ + [2712, "Party Time"], _ + [2713, "Victory is Ours"], _ + [2714, "Dark Soul Explosion"], _ + [2715, "Chaotic Soul Explosion"], _ + [2716, "Fiery Soul Explosion"], _ + [2717, "Rejuvenating Soul Explosion"], _ + [2718, "Plague Spring"], _ + [2719, "Unbalancing Soul Explosion"], _ + [2720, "Shadowy Soul Explosion"], _ + [2721, "Ethereal Soul Explosion"], _ + [2722, "Redemption of Purity"], _ + [2723, "Purify Energy"], _ + [2724, "Purifying Flame"], _ + [2725, "Purifying Prayer"], _ + [2726, "Strength of Purity"], _ + [2727, "Spring of Purity"], _ + [2728, "Way of the Pure"], _ + [2729, "Purify Soul"], _ + [2730, "Aura of Purity"], _ + [2731, "Anthem of Purity"], _ + [2732, "Falkens Fire Fist"], _ + [2733, "Falken Quick"], _ + [2734, "Mind Wrack (PvP)"], _ + [2735, "Quickening Terrain"], _ + [2736, "Massive Damage"], _ + [2737, "Minion Apocalypse"], _ + [2739, "Combat Costume (Assassin)"], _ + [2740, "Combat Costume (Mesmer)"], _ + [2741, "Combat Costume (Necromancer)"], _ + [2742, "Combat Costume (Elementalist)"], _ + [2743, "Combat Costume (Monk)"], _ + [2744, "Combat Costume (Warrior)"], _ + [2745, "Combat Costume (Ranger)"], _ + [2746, "Combat Costume (Dervish)"], _ + [2747, "Combat Costume (Ritualist)"], _ + [2748, "Combat Costume (Paragon)"], _ + [2755, "Jade Brotherhood Bomb"], _ + [2756, "Mad Kings Fan"], _ + [2758, "Candy Corn Strike"], _ + [2759, "Rocket-Propelled Gobstopper"], _ + [2760, "Rain of Terror (spell)"], _ + [2761, "Cry of Madness"], _ + [2762, "Sugar Infusion"], _ + [2763, "Feast of Vengeance"], _ + [2764, "Animate Candy Minions"], _ + [2765, "Taste of Undeath"], _ + [2766, "Scourge of Candy"], _ + [2767, "Motivating Insults"], _ + [2768, "Mad King Pony Support"], _ + [2769, "Its Good to Be King"], _ + [2770, "Maddening Laughter"], _ + [2771, "Mad Kings Influence"], _ + [2792, "Hidden Talent"], _ + [2793, "Couriers Haste"], _ + [2794, "Xinraes Revenge"], _ + [2810, "Meek Shall Inherit"], _ + [2813, "Inverse Ninja Law"], _ + [2839, "Abyssal Form"], _ + [2840, "Asura Form"], _ + [2841, "Awakened Head Form"], _ + [2842, "Spider Form"], _ + [2843, "Charr Form"], _ + [2844, "Golem Form"], _ + [2845, "Hellhound Form"], _ + [2846, "Norn Form"], _ + [2847, "Ooze Form"], _ + [2848, "Rift Warden Form"], _ + [2850, "Yeti Form"], _ + [2851, "Snowman Form"], _ + [2852, "Energy Drain (PvP)"], _ + [2853, "Energy Tap (PvP)"], _ + [2854, "PvP (effect)"], _ + [2855, "Ward Against Melee (PvP)"], _ + [2856, "Lightning Orb (PvP)"], _ + [2857, "Aegis (PvP)"], _ + [2858, "Watch Yourself (PvP)"], _ + [2859, "Enfeeble (PvP)"], _ + [2860, "Ether Renewal (PvP)"], _ + [2861, "Penetrating Attack (PvP)"], _ + [2862, "Shadow Form (PvP)"], _ + [2863, "Discord (PvP)"], _ + [2864, "Sundering Attack (PvP)"], _ + [2865, "Ritual Lord (PvP)"], _ + [2866, "Flesh of My Flesh (PvP)"], _ + [2867, "Ancestors Rage (PvP)"], _ + [2868, "Splinter Weapon (PvP)"], _ + [2869, "Assassins Remedy (PvP)"], _ + [2870, "Blinding Surge (PvP)"], _ + [2871, "Light of Deliverance (PvP)"], _ + [2872, "Death Pact Signet (PvP)"], _ + [2873, "Mystic Sweep (PvP)"], _ + [2874, "Eremites Attack (PvP)"], _ + [2875, "Harriers Toss (PvP)"], _ + [2876, "Defensive Anthem (PvP)"], _ + [2877, "Ballad of Restoration (PvP)"], _ + [2878, "Song of Restoration (PvP)"], _ + [2879, "Incoming (PvP)"], _ + [2880, "Never Surrender (PvP)"], _ + [2882, "Mantra of Inscriptions (PvP)"], _ + [2883, "For Great Justice (PvP)"], _ + [2884, "Mystic Regeneration (PvP)"], _ + [2885, "Enfeebling Blood (PvP)"], _ + [2886, "Summoning Sickness"], _ + [2887, "Signet of Judgment (PvP)"], _ + [2888, "Chilling Victory (PvP)"], _ + [2891, "Unyielding Aura (PvP)"], _ + [2892, "Spirit Bond (PvP)"], _ + [2893, "Weapon of Warding (PvP)"], _ + [2894, "Bamph-Lite"], _ + [2895, "Smiters Boon (PvP)"], _ + [2896, "Battle Fervor (Deactivating R.O.X.)"], _ + [2897, "Cloak of Faith (Deactivating R.O.X.)"], _ + [2898, "Dark Aura (Deactivating R.O.X.)"], _ + [2899, "Chaotic Power (Deactivating R.O.X.)"], _ + [2900, "Strength of the Oak (Deactivating R.O.X.)"], _ + [2901, "Sinister Golem Form"], _ + [2902, "Reactor Blast"], _ + [2903, "Reactor Blast Timer"], _ + [2904, "Jade Brotherhood Disguise"], _ + [2905, "Internal Power Engaged"], _ + [2906, "Target Acquisition"], _ + [2907, "N.O.X. Beam"], _ + [2908, "N.O.X. Field Dash"], _ + [2909, "N.O.X.ion Buster"], _ + [2910, "Countdown"], _ + [2911, "Bit Golem Breaker"], _ + [2912, "Bit Golem Rectifier"], _ + [2913, "Bit Golem Crash"], _ + [2914, "Bit Golem Force"], _ + [2916, "N.O.X. Phantom"], _ + [2917, "N.O.X. Thunder"], _ + [2918, "N.O.X. Lock On"], _ + [2919, "N.O.X. Driver"], _ + [2920, "N.O.X. Fire"], _ + [2921, "N.O.X. Knuckle"], _ + [2922, "N.O.X. Divider Drive"], _ + [2923, "Yo Ho Ho and a Bottle of Grog"], _ + [2924, "Oath of Protection"], _ + [2925, "Sloth Hunters Shot (PvP)"], _ + [2926, "Bamph Lifesteal"], _ + [2927, "Shrine Backlash"], _ + [2928, "Amulet of Protection"], _ + [2957, "Western Health Shrine Bonus"], _ + [2958, "Eastern Health Shrine Bonus"], _ + [2959, "Experts Dexterity (PvP)"], _ + [2961, "Delayed Blast BAMPH"], _ + [2962, "Grentch Form"], _ + [2964, "Snowball"], _ + [2965, "Signet of Spirits (PvP)"], _ + [2966, "Signet of Ghostly Might (PvP)"], _ + [2967, "Avatar of Grenth (PvP)"], _ + [2968, "Oversized Tonic Warning"], _ + [2969, "Read the Wind (PvP)"], _ + [2970, "Mursaat Form"], _ + [2971, "Blue Rock Candy Rush"], _ + [2972, "Green Rock Candy Rush"], _ + [2973, "Red Rock Candy Rush"], _ + [2974, "Archer Form"], _ + [2975, "Avatar of Balthazar Form"], _ + [2976, "Champion of Balthazar Form"], _ + [2977, "Priest of Balthazar Form"], _ + [2978, "The Black Beast of Arrgh Form"], _ + [2979, "Crystal Guardian Form"], _ + [2980, "Crystal Spider Form"], _ + [2981, "Bone Dragon Form"], _ + [2982, "Saltspray Dragon Form"], _ + [2983, "Eye of Janthir Form"], _ + [2984, "Footman Form"], _ + [2985, "Ghostly Hero Form"], _ + [2986, "Guild Lord Form"], _ + [2987, "Gwen Doll Form"], _ + [2988, "Black Moa Form"], _ + [2989, "Black Moa Chick Form"], _ + [2990, "Moa Bird Form"], _ + [2991, "White Moa Form"], _ + [2992, "Rainbow Phoenix Form"], _ + [2993, "Brown Rabbit Form"], _ + [2994, "White Rabbit Form"], _ + [2995, "Seer Form"], _ + [2996, "Swarm of Bees Form"], _ + [2997, "Seed of Resurrection"], _ + [2998, "Fragility (PvP)"], _ + [2999, "Strength of Honor (PvP)"], _ + [3000, "Gunthers Gaze"], _ + [3002, "Warriors Endurance (PvP)"], _ + [3003, "Armor of Unfeeling (PvP)"], _ + [3004, "Signet of Creation (PvP)"], _ + [3005, "Union (PvP)"], _ + [3006, "Shadowsong (PvP)"], _ + [3007, "Pain (PvP)"], _ + [3008, "Destruction (PvP)"], _ + [3009, "Soothing (PvP)"], _ + [3010, "Displacement (PvP)"], _ + [3011, "Preservation (PvP)"], _ + [3012, "Life (PvP)"], _ + [3013, "Recuperation (PvP)"], _ + [3014, "Dissonance (PvP)"], _ + [3015, "Earthbind (PvP)"], _ + [3016, "Shelter (PvP)"], _ + [3017, "Disenchantment (PvP)"], _ + [3018, "Restoration (PvP)"], _ + [3019, "Bloodsong (PvP)"], _ + [3020, "Wanderlust (PvP)"], _ + [3021, "Savannah Heat (PvP)"], _ + [3022, "Gaze of Fury (PvP)"], _ + [3023, "Anguish (PvP)"], _ + [3024, "Empowerment (PvP)"], _ + [3025, "Recovery (PvP)"], _ + [3026, "Go for the Eyes (PvP)"], _ + [3027, "Brace Yourself (PvP)"], _ + [3028, "Blazing Finale (PvP)"], _ + [3029, "Bladeturn Refrain (PvP)"], _ + [3030, "Signet of Return (PvP)"], _ + [3031, "Cant Touch This (PvP)"], _ + [3032, "Stand Your Ground (PvP)"], _ + [3033, "We Shall Return (PvP)"], _ + [3034, "Find Their Weakness (PvP)"], _ + [3035, "Never Give Up (PvP)"], _ + [3036, "Help Me (PvP)"], _ + [3037, "Fall Back (PvP)"], _ + [3038, "Agony (PvP)"], _ + [3039, "Rejuvenation (PvP)"], _ + [3040, "Anthem of Disruption (PvP)"], _ + [3041, "Shadowsong (Master Riyo)"], _ + [3042, "Pain"], _ + [3043, "Wanderlust"], _ + [3044, "Spirit Siphon (Master Riyo)"], _ + [3045, "Comfort Animal (PvP)"], _ + [3047, "Melandrus Assault (PvP)"], _ + [3048, "Shroud of Distress (PvP)"], _ + [3049, "Unseen Fury (PvP)"], _ + [3050, "Predatory Bond (PvP)"], _ + [3051, "Enraged Lunge (PvP)"], _ + [3052, "Conviction (PvP)"], _ + [3053, "Signet of Deadly Corruption (PvP)"], _ + [3054, "Masochism (PvP)"], _ + [3055, "Pain (attack) (Togo)"], _ + [3056, "Pain (attack) (Togo)"], _ + [3057, "Pain (attack) (Togo)"], _ + [3058, "Unholy Feast (PvP)"], _ + [3059, "Signet of Agony (PvP)"], _ + [3060, "Escape (PvP)"], _ + [3061, "Death Blossom (PvP)"], _ + [3062, "Finale of Restoration (PvP)"], _ + [3063, "Mantra of Resolve (PvP)"], _ + [3064, "Lesser Hard Mode NPC Buff"], _ + [3065, "Charm Animal"], _ + [3066, "Charm Animal"], _ + [3067, "Henchman"], _ + [3068, "Charm Animal (Codex)"], _ + [3069, "Agent of the Mad King"], _ + [3070, "Sugar Rush (Agent of the Mad King)"], _ + [3071, "Sticky Ground"], _ + [3072, "Sugar Shock"], _ + [3073, "The Mad Kings Influence"], _ + [3074, "Bone Spike"], _ + [3075, "Flurry of Splinters"], _ + [3076, "Everlasting Mobstopper (skill)"], _ + [3077, "Weakened by Dhuum"], _ + [3078, "Curse of Dhuum"], _ + [3079, "Dhuums Rest (Reaper skill)"], _ + [3080, "Dhuum (skill)"], _ + [3081, "Summon Champion"], _ + [3082, "Summon Minions"], _ + [3083, "Touch of Dhuum"], _ + [3084, "Reaping of Dhuum"], _ + [3085, "Judgment of Dhuum"], _ + [3086, "Weight of Dhuum (hex)"], _ + [3087, "Dhuums Rest"], _ + [3088, "Spiritual Healing"], _ + [3089, "Encase Skeletal"], _ + [3090, "Reversal of Death"], _ + [3091, "Ghostly Fury"], _ + [3092, "Henchman Form Pudash"], _ + [3093, "Henchman Form Dahlia"], _ + [3094, "Henchman Form Disenmaedel"], _ + [3095, "Henchman Form Errol Hyl"], _ + [3096, "Henchman Form Lulu Xan"], _ + [3097, "Henchman Form Tannaros"], _ + [3098, "Henchman Form Cassie Santi"], _ + [3099, "Henchman Form Redemptor Frohs"], _ + [3100, "Henchman Form Julyia"], _ + [3101, "Henchman Form Bellicus"], _ + [3102, "Henchman Form Dirk Shadowrise"], _ + [3103, "Henchman Form Vincent Evan"], _ + [3104, "Henchman Form Luzy Fiera"], _ + [3105, "Henchman Form Motoko Kai"], _ + [3106, "Henchman Form Hinata"], _ + [3107, "Henchman Form Kah Xan"], _ + [3108, "Henchman Form Narcissia"], _ + [3109, "Henchman Form Zen Siert"], _ + [3110, "Henchman Form Blenkeh"], _ + [3111, "Henchman Form Aurora Allesandra"], _ + [3112, "Henchman Form Teena the Raptor"], _ + [3113, "Henchman Form Lora Lanaya"], _ + [3114, "Henchman Form Adepte"], _ + [3115, "Henchman Form Haldibarn Earendul"], _ + [3116, "Henchman Form Daky"], _ + [3117, "Henchman Form Syn Spellstrike"], _ + [3118, "Henchman Form Divinus Tutela"], _ + [3119, "Henchman Form Blahks"], _ + [3120, "Henchman Form Erick"], _ + [3121, "Henchman Form Ghavin"], _ + [3122, "Henchman Form Hobba Inaste"], _ + [3123, "Henchman Form Bacchi Coi"], _ + [3124, "Henchman Form Suzu"], _ + [3125, "Henchman Form Rollo Lowlo"], _ + [3126, "Henchman Form Fuu Rin"], _ + [3127, "Henchman Form Nuno"], _ + [3128, "Henchman Form Alsacien"], _ + [3129, "Henchman Form Uto Wrotki"], _ + [3130, "Henchman Form Khai Kemnebi"], _ + [3131, "Henchman Form Cole"], _ + [3133, "Weight of Dhuum"], _ + [3134, "Spirit Form (disguise)"], _ + [3135, "Spiritual Healing (Reaper skill)"], _ + [3136, "Ghostly Fury (Reaper skill)"], _ + [3137, "Reindeer Form"], _ + [3138, "Reindeer Form"], _ + [3139, "Reindeer Form"], _ + [3140, "Staggering Blow (PvP)"], _ + [3141, "Lightning Reflexes (PvP)"], _ + [3142, "Fierce Blow (PvP)"], _ + [3143, "Renewing Smash (PvP)"], _ + [3144, "Heal as One (PvP)"], _ + [3145, "Glass Arrows (PvP)"], _ + [3146, "Protective Was Kaolai (PvP)"], _ + [3147, "Keen Arrow (PvP)"], _ + [3148, "Anthem of Envy (PvP)"], _ + [3149, "Mending Refrain (PvP)"], _ + [3150, "Lesser Flame Sentinel Resistance"], _ + [3151, "Empathy (PvP)"], _ + [3152, "Crippling Anguish (PvP)"], _ + [3153, "Pain (attack) (Signet of Spirits)"], _ + [3154, "Pain (attack) (Signet of Spirits)"], _ + [3155, "Pain (attack) (Signet of Spirits)"], _ + [3156, "Soldiers Stance (PvP)"], _ + [3157, "Destructive Was Glaive (PvP)"], _ + [3159, "Charm Drake"], _ + [3162, "Theres not enough time"], _ + [3163, "Keirans Sniper Shot"], _ + [3164, "Falken Punch"], _ + [3165, "Golem Pilebunker"], _ + [3166, "Drunken Stumbling"], _ + [3170, "Koros Gaze"], _ + [3171, "Ebon Vanguard Assassin Support (NPC)"], _ + [3172, "Ebon Vanguard Battle Standard of Power"], _ + [3173, "Loose Magic"], _ + [3174, "Well-Supplied"], _ + [3175, "Guild Monument Protected"], _ + [3176, "Strong Natural Resistance"], _ + [3177, "Elite Regeneration"], _ + [3178, "Elite Regeneration"], _ + [3179, "Mantra of Signets (PvP)"], _ + [3180, "Shatter Delusions (PvP)"], _ + [3181, "Illusionary Weaponry (PvP)"], _ + [3182, "Panic (PvP)"], _ + [3183, "Migraine (PvP)"], _ + [3184, "Accumulated Pain (PvP)"], _ + [3185, "Psychic Instability (PvP)"], _ + [3186, "Shared Burden (PvP)"], _ + [3187, "Stolen Speed (PvP)"], _ + [3188, "Unnatural Signet (PvP)"], _ + [3189, "Spiritual Pain (PvP)"], _ + [3190, "Frustration (PvP)"], _ + [3191, "Mistrust (PvP)"], _ + [3192, "Enchanters Conundrum (PvP)"], _ + [3193, "Signet of Clumsiness (PvP)"], _ + [3194, "Mirror of Disenchantment (PvP)"], _ + [3195, "Wandering Eye (PvP)"], _ + [3196, "Calculated Risk (PvP)"], _ + [3197, "Adoration"], _ + [3198, "Impending Dhuum"], _ + [3199, "Sacrifice Pawn"], _ + [3200, "Isaiahs Balance"], _ + [3201, "Toriimos Burning Fury"], _ + [3202, "Oath of Protection"], _ + [3204, "Defy Pain (PvP)"], _ + [3205, "Entourage"], _ + [3206, "Spectral Infusion"], _ + [3207, "Entourage (Buffer)"], _ + [3208, "Wastrels Demise (PvP)"], _ + [3210, "Shiro Tagachi (Costume Brawl disguise)"], _ + [3211, "Dunham (Costume Brawl disguise)"], _ + [3212, "Palawa Joko (Costume Brawl disguise)"], _ + [3213, "Lawrence Crafton (Costume Brawl disguise)"], _ + [3214, "Saul DAlessio (Costume Brawl disguise)"], _ + [3215, "Turai Ossa (Costume Brawl disguise)"], _ + [3216, "Lieutenant Thackeray (Costume Brawl disguise)"], _ + [3217, "Gehraz (Costume Brawl disguise)"], _ + [3218, "Master Togo (Costume Brawl disguise)"], _ + [3219, "Egil Fireteller (Costume Brawl disguise)"], _ + [3220, "Mysterious Assassin (Costume Brawl disguise)"], _ + [3221, "Gwen (Costume Brawl disguise)"], _ + [3222, "Eve (Costume Brawl disguise)"], _ + [3223, "Elementalist Aziure (Costume Brawl disguise)"], _ + [3224, "Jamei (Costume Brawl disguise)"], _ + [3225, "Jora (Costume Brawl disguise)"], _ + [3226, "Margrid the Sly (Costume Brawl disguise)"], _ + [3227, "Varesh Ossa (Costume Brawl disguise)"], _ + [3228, "Headmaster Quin (Costume Brawl disguise)"], _ + [3229, "Kormir (Costume Brawl disguise)"], _ + [3231, "Barbed Signet (PvP)"], _ + [3232, "Heal Party (PvP)"], _ + [3233, "Spoil Victor (PvP)"], _ + [3234, "Visions of Regret (PvP)"], _ + [3235, "Keirans Sniper Shot (Hearts of the North)"], _ + [3236, "Gravestone Marker"], _ + [3237, "Terminal Velocity"], _ + [3238, "Relentless Assault"], _ + [3239, "Natures Blessing"], _ + [3240, "Find Their Weakness (Thackeray)"], _ + [3241, "Theres Nothing to Fear (Thackeray)"], _ + [3242, "Coming of Spring"], _ + [3243, "Promise of Death"], _ + [3244, "Withering Blade"], _ + [3245, "Deaths Embrace"], _ + [3246, "Venom Fang"], _ + [3247, "Survivors Will"], _ + [3248, "Keiran Thackeray (disguise)"], _ + [3249, "Rain of Arrows"], _ + [3251, "Fox Fangs (PvP)"], _ + [3252, "Wild Strike (PvP)"], _ + [3253, "Ultra Snowball"], _ + [3254, "Blizzard"], _ + [3259, "Ultra Snowball"], _ + [3260, "Ultra Snowball"], _ + [3261, "Ultra Snowball"], _ + [3262, "Ultra Snowball"], _ + [3263, "Banishing Strike (PvP)"], _ + [3264, "Twin Moon Sweep (PvP)"], _ + [3265, "Irresistible Sweep (PvP)"], _ + [3266, "Pious Assault (PvP)"], _ + [3267, "Ebon Dust Aura (PvP)"], _ + [3268, "Heart of Holy Flame (PvP)"], _ + [3269, "Guiding Hands (PvP)"], _ + [3270, "Avatar of Dwayna (PvP)"], _ + [3271, "Avatar of Melandru (PvP)"], _ + [3272, "Mystic Healing (PvP)"], _ + [3273, "Signet of Pious Restraint (PvP)"], _ + [3274, "Vanguard Initiate"], _ + [3282, "Victorious Renewal"], _ + [3283, "A Dying Curse"], _ + [3288, "Rage of the Djinn"], _ + [3289, "Fevered Dreams (PvP)"], _ + [3290, "Stun Grenade"], _ + [3291, "Fragmentation Grenade"], _ + [3292, "Tear Gas"], _ + [3293, "Land Mine"], _ + [3294, "Riot Shield"], _ + [3295, "Club Strike"], _ + [3296, "Bludgeon"], _ + [3297, "Tango Down"], _ + [3298, "Ill Be Back"], _ + [3299, "Phased Plasma Burst"], _ + [3300, "Plasma Shot"], _ + [3301, "Annihilator Bash"], _ + [3302, "Sky Net"], _ + [3303, "Damage Assessment"], _ + [3304, "Going Commando"], _ + [3306, "Koss Form"], _ + [3307, "Dunkoro Form"], _ + [3308, "Melonni Form"], _ + [3309, "Acolyte Jin Form"], _ + [3310, "Acolyte Sousuke Form"], _ + [3311, "Tahlkora Form"], _ + [3312, "Zhed Shadowhoof Form"], _ + [3313, "Margrid the Sly Form"], _ + [3314, "Master of Whispers Form"], _ + [3315, "Goren Form"], _ + [3316, "Norgu Form"], _ + [3317, "Morgahn Form"], _ + [3318, "Razah Form"], _ + [3319, "Olias Form"], _ + [3320, "Zenmai Form"], _ + [3321, "Ogden Form"], _ + [3322, "Vekk Form"], _ + [3323, "Gwen Form"], _ + [3324, "Xandra Form"], _ + [3325, "Kahmu Form"], _ + [3326, "Jora Form"], _ + [3327, "Pyre Fierceshot Form"], _ + [3328, "Anton Form"], _ + [3329, "Hayda Form"], _ + [3330, "Livia Form"], _ + [3331, "Keiran Thackeray Form"], _ + [3332, "Miku Form"], _ + [3333, "M.O.X. Form"], _ + [3334, "Shiro Tagachi Form"], _ + [3336, "Prince Rurik Form"], _ + [3337, "Margonite Form"], _ + [3338, "Destroyer Form"], _ + [3339, "Queen Salma Form"], _ + [3340, "Slightly Mad King Thorn Form"], _ + [3341, "Kuunavang Form"], _ + [3342, "Lone Wolf"], _ + [3343, "Stand Together"], _ + [3344, "Unyielding Spirit"], _ + [3345, "Reckless Advance"], _ + [3346, "Aura of Thorns (PvP)"], _ + [3347, "Dust Cloak (PvP)"], _ + [3348, "Lyssas Haste (PvP)"], _ + [3349, "Knight Form"], _ + [3350, "Lord Archer Form"], _ + [3351, "Bodyguard Form"], _ + [3352, "Guild Thief Form"], _ + [3353, "Ghostly Priest Form"], _ + [3354, "Flame Sentinel Form"], _ + [3356, "Solidarity"], _ + [3357, "There Can Be Only One"], _ + [3358, "Fight Against Despair"], _ + [3359, "Deaths Succor"], _ + [3360, "Battle of Attrition"], _ + [3361, "Fight or Flight"], _ + [3362, "Renewing Escape"], _ + [3363, "Battle Frenzy"], _ + [3364, "The Way of One"], _ + [3365, "Onslaught (PvP)"], _ + [3366, "Heart of Fury (PvP)"], _ + [3367, "Wounding Strike (PvP)"], _ + [3368, "Pious Fury (PvP)"], _ + [3369, "Party Mode"], _ + [3370, "Smash of the Titans"], _ + [3371, "Mirror Shatter"], _ + [3373, "Illusion of Haste (PvP)"], _ + [3374, "Illusion of Pain (PvP)"], _ + [3375, "Aura of Restoration (PvP)"], _ + [3376, "Shapeshift"], _ + [3377, "G.O.L.E.M. (disguise)"], _ + [3378, "Phase Shield"], _ + [3379, "Reactor Burst"], _ + [3380, "Ill Be Back"], _ + [3381, "Annihilator Strike"], _ + [3382, "Annihilator Beam"], _ + [3383, "Annihilator Knuckle"], _ + [3384, "Annihilator Toss"], _ + [3386, "Web of Disruption (PvP)"], _ + [3387, "Chain Combo"], _ + [3390, "All In"], _ + [3391, "Jack of All Trades"], _ + [3392, ""], _ + [3393, "Odrans Razor"], _ + [3394, "Like a Boss"], _ + [3395, "The Boss"], _ + [3396, "Lightning Hammer (PvP)"], _ + [3397, "Elemental Flame (PvP)"], _ + [3398, "Slippery Ground (PvP)"], _ + [3399, "Everlastung tonic Disguised"], _ + [3400, "Non-everlasting Disguised"], _ + [3401, "Disguised"], _ + [3402, "Tonic Tipsiness"], _ + [3403, "Parting Gift"], _ + [3404, "Gift of Battle"], _ + [3405, "Rolling Start"], _ + [3406, "Everlasting Legionnaire Tonic"]] diff --git a/gwApi/array_skills_big.au3 b/gwApi/array_skills_big.au3 index 64414cf..000f2aa 100644 --- a/gwApi/array_skills_big.au3 +++ b/gwApi/array_skills_big.au3 @@ -1,1324 +1,1325 @@ -#include-once - -Global $aArray_Of_Skill_Data[3000][27] = [ _ - [0, 'No_Skill', 'Kein_Skill', 0, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], _ - [1, 'Healing_Signet', 'Siegel_der_Heilung', 0, 0, 1, 21, 0, 7, 82, 172, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0.75, 128, 0, 4, 0, 4, 0], _ - [2, 'Resurrection_Signet', 'Siegel_der_Wiederbelebung', 0, 0, 0, 46, 0, 7, 100, 100, 25, 25, 0, 0, 0, 0, 6, 1, 3, 0, 2048, 0, 16, 0, 0, 0], _ - [3, 'Signet_of_Capture', 'Siegel_der_Erbeutung', 0, 0, 0, 46, 0, 7, 0, 0, 0, 0, 2000, 0, 0, 0, 0, 1, 2, 0.25, 524304, 0, 0, 0, 2, 0], _ - [5, 'Power_Block', 'Kraftblock', 15, 19.5, 5, 2, 0, 5, 1, 12, 0, 0, 0, 0, 0, 0, 5, 1, 0.25, 0.75, 4, 0, 1, 0, 20, 0], _ - [6, 'Mantra_of_Earth', 'Mantra_der_Erde', 10, 13, 5, 3, 0, 3, 26, 50, 2, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 20, 0], _ - [7, 'Mantra_of_Flame', 'Mantra_des_Feuers', 10, 13, 5, 3, 0, 3, 26, 50, 2, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 20, 0], _ - [8, 'Mantra_of_Frost', 'Mantra_des_Frosts', 10, 13, 5, 3, 0, 3, 26, 50, 2, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 20, 0], _ - [9, 'Mantra_of_Lightning', 'Mantra_des_Blitzes', 10, 13, 5, 3, 0, 3, 26, 50, 2, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 20, 0], _ - [10, 'Hex_Breaker', 'Gebrochene_Verhexung', 5, 6.5, 5, 2, 0, 3, 10, 46, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 15, 0], _ - [11, 'Distortion', 'Verzerrung', 5, 6.5, 5, 1, 0, 3, 75, 75, 2, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 128, 0, 8, 0], _ - [13, 'Mantra_of_Recovery', 'Mantra_der_Erholung', 5, 6.5, 5, 0, 0, 3, 33, 33, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 15, 0], _ - [14, 'Mantra_of_Persistence', 'Mantra_des_Bestehens', 5, 6.5, 5, 3, 0, 3, 10, 40, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 15, 0], _ - [15, 'Mantra_of_Inscriptions', 'Mantra_der_Inschriften', 10, 13, 5, 3, 0, 3, 10, 40, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 20, 0], _ - [16, 'Mantra_of_Concentration', 'Mantra_der_Konzentration', 5, 6.5, 5, 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 30, 0], _ - [17, 'Mantra_of_Resolve', 'Mantra_des_Abschlusses', 10, 13, 5, 3, 0, 3, 10, 4, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 20, 0], _ - [18, 'Mantra_of_Signets', 'Mantra_der_Siegel', 5, 6.5, 5, 3, 0, 3, 3, 3, 5, 60, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 20, 0], _ - [19, 'Fragility', 'Zerbrechlichkeit', 5, 6.5, 5, 1, 0, 4, 5, 20, 0, 0, 156, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 5, 0], _ - [21, 'Inspired_Enchantment', 'Inspirierte_Verzauberung', 10, 13, 5, 3, 0, 5, 3, 15, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 256, 0, 0, 0], _ - [22, 'Inspired_Hex', 'Inspirierte_Verhexung', 5, 6.5, 5, 3, 0, 5, 4, 10, 0, 0, 0, 0, 0, 0, 3, 1, 1, 0.75, 0, 0, 2304, 0, 0, 0], _ - [23, 'Power_Spike', 'Kraftdorn', 5, 6.5, 5, 2, 0, 5, 30, 120, 0, 0, 0, 0, 0, 0, 5, 1, 0.25, 0.75, 0, 0, 1, 0, 12, 0], _ - [24, 'Power_Leak', 'Kraftleck', 10, 13, 5, 2, 0, 5, 3, 17, 0, 0, 0, 0, 0, 0, 5, 1, 0.25, 0.75, 0, 0, 1, 0, 20, 0], _ - [25, 'Power_Drain', 'Kraftentzug', 5, 6.5, 5, 3, 0, 5, 1, 31, 0, 0, 0, 0, 0, 0, 5, 1, 0.25, 0.75, 0, 0, 257, 0, 20, 0], _ - [26, 'Empathy', 'Empathie', 10, 13, 5, 2, 0, 4, 10, 55, 1, 15, 0, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 0, 0, 10, 0], _ - [27, 'Shatter_Delusions', 'Täuschungen_brechen', 5, 6.5, 5, 2, 0, 5, 15, 75, 0, 0, 156, 0, 0, 0, 5, 1, 0.25, 0.75, 0, 0, 0, 0, 6, 0], _ - [28, 'Backfire', 'Rückschlag', 15, 19.5, 5, 2, 0, 4, 35, 140, 0, 0, 0, 0, 0, 0, 5, 1, 3, 0.75, 0, 0, 0, 0, 20, 0], _ - [29, 'Blackout', 'Blackout', 10, 13, 5, 2, 0, 10, 2, 6, 5, 5, 0, 0, 0, 0, 5, 1, 1, 0.75, 2, 0, 512, 0, 12, 0], _ - [30, 'Diversion', 'Ablenkung', 10, 13, 5, 2, 0, 4, 10, 56, 0, 0, 0, 0, 0, 0, 5, 1, 3, 0.75, 0, 0, 0, 0, 12, 0], _ - [31, 'Conjure_Phantasm', 'Trugbild_beschwören', 10, 13, 5, 1, 0, 4, 5, 5, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 512, 0, 0, 0, 5, 0], _ - [32, 'Illusion_of_Weakness', 'Illusion_der_Schwäche', 10, 13, 5, 1, 0, 6, 50, 240, 25, 25, 0, 0, 0, 0, 0, 1, 2, 0.75, 0, 0, 0, 0, 30, 0], _ - [33, 'Illusionary_Weaponry', 'Illusion_der_Waffen', 5, 6.5, 5, 1, 0, 6, 8, 40, 5, 5, 0, 0, 0, 0, 0, 1, 1, 0.75, 4, 0, 512, 0, 25, 0], _ - [34, 'Sympathetic_Visage', 'Sympathisches_Gesicht', 10, 13, 5, 1, 0, 6, 3, 3, 0, 0, 156, 0, 0, 0, 3, 1, 1, 0.75, 0, 0, 0, 0, 20, 0], _ - [35, 'Ignorance', 'Ignoranz', 15, 19.5, 5, 2, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 10, 0], _ - [36, 'Arcane_Conundrum', 'Arkanes_Rätsel', 10, 13, 5, 1, 0, 4, 200, 200, 1, 7, 156, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 0, 0, 20, 0], _ - [37, 'Illusion_of_Haste', 'Illusion_der_Eile', 5, 6.5, 5, 1, 0, 6, 33, 33, 3, 3, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 5, 0], _ - [38, 'Channeling', 'Kanalisieren', 5, 6.5, 5, 3, 0, 6, 1, 1, 0, 0, 312, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 256, 0, 15, 0], _ - [39, 'Energy_Surge', 'Energiewelle', 5, 6.5, 5, 2, 0, 5, 1, 10, 9, 9, 240, 0, 0, 0, 5, 1, 2, 0.75, 4, 0, 0, 0, 15, 0], _ - [40, 'Ether_Feast', 'Ätherschmaus', 5, 6.5, 5, 3, 0, 5, 3, 3, 20, 65, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 4, 0, 8, 0], _ - [41, 'Ether_Lord', 'Herr_über_den_Äther', 5, 6.5, 5, 3, 0, 4, 1, 3, 0, 0, 0, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 0, 0, 20, 0], _ - [42, 'Energy_Burn', 'Energiebrand', 10, 13, 5, 2, 0, 5, 1, 10, 9, 9, 0, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 0, 0, 20, 0], _ - [43, 'Clumsiness', 'Ungeschick', 10, 13, 5, 1, 0, 4, 10, 92, 0, 0, 156, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 0, 0, 8, 0], _ - [44, 'Phantom_Pain', 'Phantomschmerz', 5, 6.5, 5, 1, 0, 4, 1, 4, 5, 20, 0, 0, 0, 0, 5, 1, 2, 0.75, 512, 16, 0, 0, 15, 0], _ - [45, 'Ethereal_Burden', 'Ätherische_Bürde', 15, 19.5, 5, 1, 0, 4, 50, 50, 10, 18, 0, 0, 0, 0, 5, 1, 1.5, 0.75, 0, 0, 0, 0, 30, 0], _ - [46, 'Guilt', 'Schuld', 5, 6.5, 5, 2, 0, 4, 5, 14, 0, 0, 0, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 1, 0, 25, 0], _ - [47, 'Ineptitude', 'Unbeholfenheit', 10, 13, 5, 1, 0, 4, 30, 135, 0, 0, 156, 0, 0, 0, 5, 1, 1, 0.75, 4, 2, 0, 0, 15, 0], _ - [48, 'Spirit_of_Failure', 'Geist_des_Versagens', 15, 19.5, 5, 3, 0, 4, 25, 25, 1, 3, 0, 0, 0, 0, 5, 1, 3, 0.75, 0, 0, 0, 0, 20, 0], _ - [49, 'Mind_Wrack', 'Geistiges_Wrack', 5, 6.5, 5, 2, 0, 4, 15, 100, 5, 25, 0, 1, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 7, 0], _ - [50, 'Wastrels_Worry', 'Verschwendung', 5, 6.5, 5, 2, 0, 4, 20, 100, 0, 0, 156, 0, 0, 0, 5, 1, 0.25, 0.75, 0, 0, 0, 0, 1, 0], _ - [51, 'Shame', 'Schande', 10, 13, 5, 2, 0, 4, 5, 14, 0, 0, 0, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 1, 0, 30, 0], _ - [52, 'Panic', 'Panik', 10, 13, 5, 2, 0, 4, 2, 2, 10, 82, 240, 240, 0, 0, 16, 1, 1, 0.75, 4, 0, 0, 0, 15, 0], _ - [53, 'Migraine', 'Migräne', 10, 13, 5, 1, 0, 4, 1, 8, 200, 200, 0, 0, 0, 0, 5, 1, 2, 0.75, 516, 0, 0, 0, 12, 0], _ - [54, 'Crippling_Anguish', 'Verkrüppelnde_Qual', 5, 6.5, 5, 1, 0, 4, 1, 8, 50, 50, 0, 50, 0, 0, 5, 1, 1, 0.75, 516, 0, 0, 0, 12, 0], _ - [55, 'Fevered_Dreams', 'Fieberträume', 10, 13, 5, 1, 0, 4, 0, 0, 1, 3, 312, 0, 0, 0, 5, 1, 2, 0.75, 4, 0, 0, 0, 10, 0], _ - [56, 'Soothing_Images', 'Beruhigende_Bilder', 15, 19.5, 5, 1, 0, 4, 0, 0, 0, 0, 156, 0, 0, 0, 16, 1, 2, 0.75, 0, 0, 0, 0, 8, 0], _ - [57, 'Cry_of_Frustration', 'Schrei_der_Frustration', 10, 13, 5, 2, 0, 5, 15, 75, 0, 0, 312, 0, 0, 0, 5, 1, 0.25, 0.75, 0, 0, 1, 0, 15, 0], _ - [58, 'Signet_of_Midnight', 'Siegel_der_Mitternacht', 0, 0, 5, 46, 0, 7, 0, 0, 15, 15, 0, 0, 0, 0, 5, 1, 2, 0.75, 6, 2, 0, 0, 10, 0], _ - [59, 'Signet_of_Weariness', 'Siegel_der_Müdigkeit', 0, 0, 5, 2, 0, 7, 3, 8, 1, 12, 240, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 0, 0, 30, 0], _ - [61, 'Leech_Signet', 'Blutsauger_Siegel', 0, 0, 5, 3, 0, 7, 3, 15, 0, 0, 0, 0, 0, 0, 5, 1, 0.25, 0.75, 0, 0, 1, 0, 30, 0], _ - [62, 'Signet_of_Humility', 'Siegel_der_Demut', 0, 0, 5, 3, 0, 7, 1, 16, 10, 10, 0, 0, 0, 0, 5, 1, 3, 0.75, 0, 0, 0, 0, 20, 0], _ - [63, 'Keystone_Signet', 'Schlussstein_Siegel', 0, 0, 5, 0, 0, 7, 15, 60, 0, 6, 156, 0, 0, 0, 0, 1, 1, 0.75, 4, 0, 0, 0, 15, 0], _ - [65, 'Arcane_Mimicry', 'Arkane_Mimikry', 15, 19.5, 5, 46, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 2, 0.75, 0, 0, 0, 0, 60, 0], _ - [66, 'Spirit_Shackles', 'Geistfesseln', 10, 13, 5, 3, 0, 4, 5, 5, 0, 0, 0, 0, 0, 0, 5, 1, 3, 0.75, 0, 0, 0, 0, 8, 0], _ - [67, 'Shatter_Hex', 'Verhexung_brechen', 10, 13, 5, 2, 0, 5, 30, 120, 0, 0, 240, 0, 0, 0, 3, 1, 1, 0.75, 0, 0, 2048, 0, 10, 0], _ - [68, 'Drain_Enchantment', 'Verzauberung_entziehen', 5, 6.5, 5, 3, 0, 5, 8, 17, 40, 120, 0, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 256, 0, 20, 0], _ - [69, 'Shatter_Enchantment', 'Verzauberung_brechen', 10, 13, 5, 2, 0, 5, 14, 100, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 20, 0], _ - [72, 'Elemental_Resistance', 'Elementarwiderstand', 10, 13, 5, 3, 0, 3, 40, 40, 24, 12, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 20, 0], _ - [73, 'Physical_Resistance', 'Körperlicher_Widerstand', 10, 13, 5, 3, 0, 3, 40, 40, 24, 12, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 20, 0], _ - [74, 'Echo', 'Echo', 5, 6.5, 5, 46, 0, 6, 30, 30, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0.75, 4, 0, 0, 0, 10, 0], _ - [75, 'Arcane_Echo', 'Arkanes_Echo', 15, 19.5, 5, 46, 0, 6, 20, 20, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0.75, 0, 0, 0, 0, 20, 0], _ - [76, 'Imagined_Burden', 'Eingebildete_Bürde', 15, 19.5, 5, 1, 0, 4, 50, 50, 0, 0, 156, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 30, 0], _ - [77, 'Chaos_Storm', 'Chaossturm', 5, 6.5, 5, 2, 0, 5, 5, 25, 0, 2, 156, 0, 0, 0, 16, 1, 2, 0.75, 0, 0, 0, 0, 30, 0], _ - [78, 'Epidemic', 'Epidemie', 5, 6.5, 5, 46, 0, 5, 0, 0, 0, 0, 156, 0, 0, 0, 5, 1, 0.25, 0.75, 0, 0, 0, 0, 5, 0], _ - [79, 'Energy_Drain', 'Energieentzug', 5, 6.5, 5, 3, 0, 5, 2, 9, 3, 3, 0, 0, 0, 0, 5, 1, 1, 0.75, 4, 0, 320, 0, 30, 0], _ - [80, 'Energy_Tap', 'Energie_abzapfen', 5, 6.5, 5, 3, 0, 5, 4, 7, 2, 2, 0, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 320, 0, 30, 0], _ - [81, 'Arcane_Thievery', 'Arkaner_Diebstahl', 10, 13, 5, 2, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 0, 0], _ - [82, 'Mantra_of_Recall', 'Mantra_der_Zurückrufung', 10, 13, 5, 3, 0, 6, 10, 25, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0.75, 4, 0, 256, 0, 30, 0], _ - [83, 'Animate_Bone_Horror', 'Knochenschreck_beleben', 10, 13, 4, 5, 0, 5, 1, 17, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0.75, 262144, 0, 0, 0, 5, 0], _ - [84, 'Animate_Bone_Fiend', 'Knochenteufel_beleben', 25, 32.5, 4, 5, 0, 5, 1, 17, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0.75, 262144, 0, 0, 0, 5, 0], _ - [85, 'Animate_Bone_Minions', 'Knochendiener_beleben', 15, 19.5, 4, 5, 0, 5, 0, 12, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0.75, 262144, 0, 0, 0, 5, 0], _ - [86, 'Grenths_Balance', 'Grenths_Ausgleich', 10, 13, 4, 46, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 0.25, 0.75, 4, 0, 4, 0, 10, 0], _ - [87, 'Veratas_Gaze', 'Veratas_Starren', 5, 6.5, 4, 5, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 64, 0, 32, 0, 5, 0], _ - [88, 'Veratas_Aura', 'Veratas_Aura', 15, 19.5, 4, 5, 0, 6, 33, 33, 0, 0, 312, 0, 0, 0, 0, 1, 0.75, 0.75, 64, 0, 32, 0, 30, 0], _ - [89, 'Deathly_Chill', 'Tödliche_Kühlung', 10, 13, 4, 5, 0, 5, 5, 50, 5, 50, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 5, 0], _ - [90, 'Veratas_Sacrifice', 'Veratas_Opfer', 10, 13, 4, 5, 0, 5, 10, 10, 15, 15, 5000, 3, 0, 0, 0, 1, 2, 0.75, 0, 0, 32, 0, 60, 0], _ - [91, 'Well_of_Power', 'Brunnen_der_Kraft', 5, 6.5, 4, 4, 0, 9, 1, 6, 2, 2, 312, 33, 0, 0, 0, 1, 1, 0.75, 262148, 0, 0, 0, 15, 0], _ - [92, 'Well_of_Blood', 'Brunnen_des_Blutes', 10, 13, 4, 4, 0, 9, 1, 6, 33, 33, 312, 0, 0, 0, 0, 1, 1, 0.75, 262144, 0, 0, 0, 2, 0], _ - [93, 'Well_of_Suffering', 'Brunnen_des_Leidens', 10, 13, 4, 5, 0, 9, 1, 6, 0, 0, 312, 0, 0, 0, 0, 1, 1, 0.75, 262656, 0, 0, 0, 10, 0], _ - [94, 'Well_of_the_Profane', 'Gottloser_Brunnen', 25, 32.5, 4, 5, 0, 9, 40, 40, 0, 0, 312, 0, 0, 0, 0, 1, 3, 0.75, 262208, 0, 0, 0, 10, 0], _ - [95, 'Putrid_Explosion', 'Explosion_der_Verwesung', 10, 13, 4, 5, 0, 5, 24, 120, 0, 0, 240, 0, 0, 0, 1, 1, 1, 0.75, 262144, 0, 0, 0, 5, 0], _ - [96, 'Soul_Feast', 'Seelenschmaus', 10, 13, 4, 5, 0, 5, 50, 280, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0.75, 262144, 0, 4, 0, 0, 0], _ - [97, 'Necrotic_Traversal', 'Nekrotische_Verwechslung', 5, 6.5, 4, 5, 0, 5, 5, 20, 0, 0, 240, 0, 0, 0, 0, 1, 0.75, 0.75, 262144, 0, 0, 0, 0, 0], _ - [98, 'Consume_Corpse', 'Kadaver_verzehren', 10, 13, 4, 5, 0, 5, 25, 100, 5, 20, 0, 0, 0, 0, 0, 1, 1, 0.75, 262144, 0, 288, 0, 0, 0], _ - [99, 'Parasitic_Bond', 'Parasitäre_Fesseln', 5, 6.5, 4, 7, 0, 4, 1, 1, 30, 120, 0, 0, 0, 0, 5, 1, 1, 0.75, 512, 0, 0, 0, 2, 0], _ - [100, 'Soul_Barbs', 'Seelenwiderhaken', 10, 13, 4, 7, 0, 4, 15, 30, 0, 0, 0, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 0, 0, 20, 0], _ - [101, 'Barbs', 'Widerhaken', 10, 13, 4, 7, 0, 4, 1, 15, 0, 0, 0, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 0, 0, 5, 0], _ - [102, 'Shadow_Strike', 'Schattenschlag', 10, 13, 4, 4, 0, 5, 12, 48, 12, 48, 0, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 0, 0, 15, 0], _ - [103, 'Price_of_Failure', 'Preis_des_Versagens', 15, 19.5, 4, 7, 0, 4, 1, 46, 25, 25, 0, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 0, 0, 20, 0], _ - [104, 'Death_Nova', 'Todesnova', 5, 6.5, 4, 5, 0, 6, 26, 100, 15, 15, 156, 90, 0, 0, 3, 1, 2, 0.75, 0, 0, 0, 0, 0, 0], _ - [105, 'Deathly_Swarm', 'Tödlicher_Schwarm', 10, 13, 4, 5, 0, 5, 30, 90, 0, 0, 312, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 0, 0, 6, 0], _ - [106, 'Rotting_Flesh', 'Verrottendes_Fleisch', 15, 19.5, 4, 5, 0, 5, 0, 0, 10, 25, 0, 0, 0, 0, 5, 1, 3, 0.75, 0, 32, 0, 0, 3, 0], _ - [107, 'Virulence', 'Ansteckung', 5, 6.5, 4, 5, 0, 5, 0, 0, 3, 15, 0, 0, 0, 0, 5, 1, 1, 0.75, 4, 32, 0, 0, 15, 0], _ - [108, 'Suffering', 'Leiden', 15, 19.5, 4, 7, 0, 4, 0, 3, 0, 0, 240, 0, 0, 0, 16, 1, 1, 0.75, 512, 0, 0, 0, 10, 0], _ - [109, 'Life_Siphon', 'Leben_abzapfen', 10, 13, 4, 4, 0, 4, 1, 3, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 512, 0, 0, 0, 5, 0], _ - [110, 'Unholy_Feast', 'Unheiliger_Schmaus', 15, 19.5, 4, 4, 0, 5, 10, 65, 1, 4, 312, 0, 0, 0, 0, 1, 0.75, 0.75, 0, 0, 516, 0, 8, 0], _ - [111, 'Awaken_the_Blood', 'Das_Blut_erwecken', 10, 13, 4, 4, 0, 6, 2, 2, 50, 50, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 45, 0], _ - [112, 'Desecrate_Enchantments', 'Verzauberungsschändung', 10, 13, 4, 7, 0, 5, 6, 60, 4, 20, 240, 0, 0, 0, 16, 1, 2, 0.75, 0, 0, 0, 0, 15, 0], _ - [113, 'Tainted_Flesh', 'Verdorbenes_Fleisch', 5, 6.5, 4, 5, 0, 6, 0, 0, 3, 15, 0, 0, 0, 0, 3, 1, 1, 0.75, 4, 32, 0, 0, 0, 0], _ - [114, 'Aura_of_the_Lich', 'Aura_des_Lich', 15, 19.5, 4, 5, 0, 6, 1, 17, 1, 1, 0, 0, 0, 0, 0, 1, 2, 0.75, 4, 0, 0, 0, 45, 0], _ - [115, 'Blood_Renewal', 'Bluterneuerung', 1, 1.3, 4, 4, 0, 6, 3, 6, 40, 190, 25, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 36, 0, 7, 0], _ - [116, 'Dark_Aura', 'Dunkle_Aura', 10, 13, 4, 5, 0, 6, 5, 50, 5, 20, 156, 0, 0, 0, 3, 1, 1, 0.75, 0, 0, 0, 0, 10, 0], _ - [117, 'Enfeeble', 'Schwächen', 5, 6.5, 4, 7, 0, 5, 0, 0, 10, 30, 0, 0, 0, 0, 5, 1, 0.25, 0.75, 0, 1024, 0, 0, 5, 0], _ - [118, 'Enfeebling_Blood', 'Schwächendes_Blut', 1, 1.3, 4, 7, 0, 5, 10, 10, 5, 20, 240, 0, 0, 0, 16, 1, 1, 0.75, 0, 1024, 32, 0, 8, 0], _ - [119, 'Blood_is_Power', 'Blut_ist_Kraft', 1, 1.3, 4, 4, 0, 6, 33, 33, 3, 6, 0, 0, 0, 0, 4, 1, 0.25, 0.75, 4, 0, 32, 0, 0, 0], _ - [120, 'Blood_of_the_Master', 'Blut_des_Meisters', 5, 6.5, 4, 5, 0, 5, 30, 116, 5, 5, 5000, 2, 0, 0, 0, 1, 1, 0.75, 0, 0, 32, 0, 2, 0], _ - [121, 'Spiteful_Spirit', 'Boshafter_Geist', 15, 19.5, 4, 7, 0, 4, 5, 35, 0, 0, 156, 0, 0, 0, 5, 1, 2, 0.75, 4, 0, 0, 0, 10, 0], _ - [122, 'Malign_Intervention', 'Unheilvoller_Eingriff', 10, 13, 4, 5, 0, 4, 1, 17, 80, 80, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 5, 0], _ - [123, 'Insidious_Parasite', 'Heimtückischer_Parasit', 15, 19.5, 4, 7, 0, 4, 15, 45, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 12, 0], _ - [124, 'Spinal_Shivers', 'Rückenschauer', 10, 13, 4, 7, 0, 4, 10, 5, 0, 0, 0, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 0, 0, 15, 0], _ - [125, 'Wither', 'Verwelken', 10, 13, 4, 7, 0, 4, 2, 4, 15, 75, 1, 0, 0, 0, 5, 1, 2, 0.75, 516, 0, 0, 0, 10, 0], _ - [126, 'Life_Transfer', 'Lebensübertragung', 5, 6.5, 4, 4, 0, 4, 3, 8, 0, 0, 156, 0, 0, 0, 5, 1, 1, 0.75, 516, 0, 4, 0, 20, 0], _ - [127, 'Mark_of_Subversion', 'Zeichen_der_Subversion', 10, 13, 4, 4, 0, 4, 10, 92, 0, 0, 0, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 0, 0, 30, 0], _ - [128, 'Soul_Leech', 'Seelenfresser', 10, 13, 4, 4, 0, 4, 16, 80, 0, 0, 0, 0, 0, 0, 5, 1, 2, 0.75, 4, 0, 0, 0, 15, 0], _ - [129, 'Defile_Flesh', 'Fleisch_schänden', 10, 13, 4, 7, 0, 4, 10, 10, 66, 66, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 32, 0, 10, 0], _ - [130, 'Demonic_Flesh', 'Dämonenfleisch', 5, 6.5, 4, 4, 0, 6, 5, 20, 80, 200, 156, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 32, 0, 30, 0], _ - [131, 'Barbed_Signet', 'Siegel_der_Widerhaken', 0, 0, 4, 4, 0, 7, 3, 15, 8, 8, 156, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 32, 0, 10, 0], _ - [132, 'Plague_Signet', 'Pest_Siegel', 0, 0, 4, 7, 0, 7, 100, 200, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 68, 0, 4096, 0, 4, 0], _ - [133, 'Dark_Pact', 'Dunkler_Pakt', 1, 1.3, 4, 4, 0, 5, 10, 10, 10, 48, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 32, 0, 2, 0], _ - [134, 'Order_of_Pain', 'Orden_der_Schmerzen', 10, 13, 4, 4, 0, 6, 17, 17, 3, 16, 5000, 0, 0, 0, 0, 1, 2, 0.75, 0, 0, 32, 0, 0, 0], _ - [135, 'Faintheartedness', 'Mutlosigkeit', 10, 13, 4, 7, 0, 4, 50, 50, 0, 3, 0, 0, 0, 0, 5, 1, 1, 0.75, 512, 0, 0, 0, 8, 0], _ - [136, 'Shadow_of_Fear', 'Schatten_der_Angst', 10, 13, 4, 7, 0, 4, 50, 50, 0, 0, 156, 0, 0, 0, 16, 1, 2, 0.75, 0, 0, 0, 0, 5, 0], _ - [137, 'Rigor_Mortis', 'Totenstarre', 10, 13, 4, 7, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 20, 0], _ - [138, 'Dark_Bond', 'Dunkles_Band', 5, 6.5, 4, 4, 0, 6, 75, 75, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0.75, 0, 0, 0, 0, 20, 0], _ - [139, 'Infuse_Condition', 'Zustand_einflößen', 5, 6.5, 4, 5, 0, 6, 75, 75, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 20, 0], _ - [140, 'Malaise', 'Unwohlsein', 5, 6.5, 4, 7, 0, 4, 1, 1, 5, 50, 0, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 0, 0, 2, 0], _ - [141, 'Rend_Enchantments', 'Verzauberungen_entreißen', 5, 6.5, 4, 7, 0, 5, 55, 25, 5, 9, 0, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 0, 0, 20, 0], _ - [142, 'Lingering_Curse', 'Bleibender_Fluch', 15, 19.5, 4, 7, 0, 4, 0, 3, 20, 20, 240, 0, 0, 0, 5, 1, 1, 0.75, 516, 0, 0, 0, 10, 0], _ - [143, 'Strip_Enchantment', 'Verzauberung_rauben', 10, 13, 4, 4, 0, 5, 0, 2, 5, 65, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 20, 0], _ - [144, 'Chilblains', 'Frostbeulen', 25, 32.5, 4, 7, 0, 5, 10, 44, 1, 2, 312, 10, 0, 0, 5, 1, 2, 0.75, 0, 32, 32, 0, 8, 0], _ - [145, 'Signet_of_Agony', 'Siegel_der_Qual', 0, 0, 4, 4, 0, 7, 10, 70, 10, 10, 240, 0, 0, 0, 0, 1, 0.75, 0.75, 0, 0, 32, 0, 8, 0], _ - [146, 'Offering_of_Blood', 'Blutopfer', 1, 1.3, 4, 4, 0, 5, 20, 20, 8, 20, 0, 0, 0, 0, 0, 1, 0.25, 0.75, 4, 0, 288, 0, 15, 0], _ - [147, 'Dark_Fury', 'Dunkle_Wut', 10, 13, 4, 4, 0, 6, 17, 17, 25, 25, 5000, 0, 0, 0, 0, 1, 0.75, 0.75, 64, 0, 32, 0, 5, 0], _ - [148, 'Order_of_the_Vampire', 'Orden_des_Vampirs', 5, 6.5, 4, 4, 0, 6, 3, 16, 17, 17, 5000, 0, 0, 0, 0, 1, 2, 0.75, 4, 0, 32, 0, 5, 0], _ - [149, 'Plague_Sending', 'Pest_aussenden', 1, 1.3, 4, 7, 0, 5, 10, 10, 1, 3, 156, 0, 0, 0, 16, 1, 1, 0.75, 0, 0, 32, 0, 5, 0], _ - [150, 'Mark_of_Pain', 'Zeichen_des_Schmerzes', 10, 13, 4, 7, 0, 4, 10, 40, 0, 0, 156, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 20, 0], _ - [151, 'Feast_of_Corruption', 'Schmaus_der_Verdorbenheit', 15, 19.5, 4, 7, 0, 5, 16, 80, 8, 40, 156, 0, 0, 0, 16, 1, 2, 0.75, 4, 0, 0, 0, 20, 0], _ - [152, 'Taste_of_Death', 'Geschmack_des_Todes', 5, 6.5, 4, 5, 0, 5, 100, 400, 0, 0, 0, 0, 0, 0, 14, 1, 0.25, 0.75, 0, 0, 0, 0, 0, 0], _ - [153, 'Vampiric_Gaze', 'Vampir_Starren', 10, 13, 4, 4, 0, 5, 18, 60, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 8, 0], _ - [154, 'Plague_Touch', 'Pest_Berührung', 5, 6.5, 4, 7, 0, 10, 1, 3, 0, 0, 0, 0, 0, 0, 5, 1, 0.75, 0.75, 2, 0, 4608, 0, 0, 0], _ - [155, 'Vile_Touch', 'Abscheuliche_Berührung', 10, 13, 4, 5, 0, 10, 20, 65, 0, 0, 0, 0, 0, 0, 5, 1, 0.75, 0.75, 2, 0, 512, 0, 2, 0], _ - [156, 'Vampiric_Touch', 'Vampir_Berührung', 15, 19.5, 4, 4, 0, 10, 29, 74, 0, 0, 0, 0, 0, 0, 5, 1, 0.75, 0.75, 2, 0, 544, 0, 2, 0], _ - [157, 'Blood_Ritual', 'Blutritual', 5, 6.5, 4, 4, 0, 6, 17, 17, 3, 3, 0, 0, 0, 0, 4, 1, 2, 0.75, 2, 0, 32, 0, 2, 0], _ - [158, 'Touch_of_Agony', 'Berührung_der_Qual', 1, 1.3, 4, 4, 0, 10, 10, 10, 20, 58, 0, 0, 0, 0, 5, 1, 0.75, 0.75, 2, 0, 544, 0, 3, 0], _ - [159, 'Weaken_Armor', 'Rüstung_schwächen', 5, 6.5, 4, 7, 0, 5, 0, 0, 0, 0, 156, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 5, 0], _ - [160, 'Windborne_Speed', 'Windgeschwindigkeit', 10, 13, 6, 8, 0, 6, 33, 33, 0, 0, 0, 0, 0, 0, 3, 1, 0.75, 0.75, 0, 0, 32768, 0, 5, 0], _ - [162, 'Gale', 'Orkan', 10, 13, 6, 8, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 65, 128, 0, 0, 5, 0], _ - [163, 'Whirlwind', 'Wirbelsturm', 5, 6.5, 6, 8, 0, 5, 15, 75, 0, 0, 156, 240, 0, 0, 0, 1, 0.75, 0.75, 0, 128, 512, 0, 8, 0], _ - [164, 'Elemental_Attunement', 'Elementareinstimmung', 10, 13, 6, 12, 0, 6, 50, 50, 1, 2, 0, 0, 0, 0, 0, 1, 1, 0.75, 4, 0, 131072, 0, 20, 0], _ - [165, 'Armor_of_Earth', 'Erdrüstung', 10, 13, 6, 9, 0, 6, 24, 60, 50, 14, 0, 0, 0, 0, 0, 1, 0.75, 0.75, 0, 0, 0, 0, 15, 0], _ - [166, 'Kinetic_Armor', 'Kinetik_Rüstung', 15, 19.5, 6, 9, 0, 6, 20, 80, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0.75, 0, 0, 0, 0, 60, 0], _ - [167, 'Eruption', 'Eruption', 25, 32.5, 6, 9, 0, 5, 10, 40, 10, 10, 240, 0, 0, 0, 16, 1, 2, 0.75, 0, 0, 0, 0, 30, 0], _ - [168, 'Magnetic_Aura', 'Magnet_Aura', 5, 6.5, 6, 9, 0, 6, 100, 100, 10, 50, 1000, 312, 0, 0, 0, 1, 1, 0.75, 0, 0, 128, 0, 12, 0], _ - [169, 'Earth_Attunement', 'Erdeinstimmung', 10, 13, 6, 9, 0, 6, 30, 30, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 131072, 0, 30, 0], _ - [170, 'Earthquake', 'Erdbeben', 25, 32.5, 6, 9, 0, 5, 26, 100, 0, 0, 240, 0, 0, 0, 16, 1, 3, 0.75, 1, 128, 0, 0, 15, 0], _ - [171, 'Stoning', 'Steinigung', 15, 19.5, 6, 9, 0, 5, 45, 105, 1800, 1800, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 5, 0], _ - [172, 'Stone_Daggers', 'Steindolche', 5, 6.5, 6, 9, 0, 5, 8, 33, 1800, 1800, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 0, 0], _ - [173, 'Grasping_Earth', 'Zupackende_Erde', 5, 6.5, 6, 9, 0, 4, 0, 0, 50, 50, 240, 0, 0, 0, 0, 1, 0.75, 0.75, 0, 64, 0, 0, 12, 0], _ - [174, 'Aftershock', 'Nachbeben', 10, 13, 6, 9, 128, 5, 26, 100, 10, 68, 240, 0, 0, 0, 0, 1, 0.75, 0.75, 0, 0, 512, 0, 10, 0], _ - [175, 'Ward_Against_Elements', 'Abwehr_gegen_Elemente', 15, 19.5, 6, 9, 0, 11, 24, 24, 0, 0, 312, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 20, 0], _ - [176, 'Ward_Against_Melee', 'Abwehr_gegen_Nahkampf', 15, 19.5, 6, 9, 0, 11, 50, 50, 0, 0, 312, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 128, 0, 30, 0], _ - [177, 'Ward_Against_Foes', 'Abwehr_gegen_Feinde', 15, 19.5, 6, 9, 0, 11, 50, 50, 0, 0, 312, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 20, 0], _ - [178, 'Ether_Prodigy', 'Ätherwunder', 5, 6.5, 6, 12, 0, 6, 6, 6, 2, 2, 0, 0, 0, 0, 0, 1, 1, 0.75, 5, 0, 8448, 0, 5, 0], _ - [179, 'Incendiary_Bonds', 'Brandbänder', 15, 19.5, 6, 10, 0, 4, 20, 80, 1, 3, 240, 0, 0, 0, 5, 1, 1, 0.75, 1, 4, 0, 0, 7, 0], _ - [180, 'Aura_of_Restoration', 'Wiederherstellungs_Aura', 5, 6.5, 6, 12, 0, 6, 200, 500, 0, 1, 0, 0, 0, 0, 0, 1, 0.25, 0.75, 0, 0, 0, 0, 20, 0], _ - [181, 'Ether_Renewal', 'Äthererneuerung', 10, 13, 6, 12, 0, 6, 1, 4, 5, 20, 0, 0, 0, 0, 0, 1, 1, 0.75, 4, 0, 256, 0, 30, 0], _ - [182, 'Conjure_Flame', 'Flammenbeschwörung', 10, 13, 6, 10, 0, 6, 5, 20, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 45, 0], _ - [183, 'Inferno', 'Inferno', 10, 13, 6, 10, 0, 5, 30, 135, 0, 0, 156, 0, 0, 0, 0, 1, 0.75, 0.75, 0, 0, 512, 0, 10, 0], _ - [184, 'Fire_Attunement', 'Feuereinstimmung', 10, 13, 6, 10, 0, 6, 30, 30, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 131072, 0, 30, 0], _ - [185, 'Mind_Burn', 'Geistige_Verbrennung', 5, 6.5, 6, 10, 0, 5, 15, 60, 1, 10, 156, 0, 0, 0, 5, 1, 1, 0.75, 5, 4, 0, 0, 5, 0], _ - [186, 'Fireball', 'Feuerball', 10, 13, 6, 10, 0, 5, 7, 112, 1800, 1800, 156, 0, 0, 0, 16, 1, 1.5, 0.75, 0, 0, 0, 0, 7, 0], _ - [187, 'Meteor', 'Meteor', 5, 6.5, 6, 10, 0, 5, 7, 112, 0, 0, 156, 0, 0, 0, 16, 1, 2, 0.75, 1, 0, 0, 0, 30, 0], _ - [188, 'Flame_Burst', 'Flammenstoß', 15, 19.5, 6, 10, 0, 5, 15, 120, 0, 0, 240, 0, 0, 0, 0, 1, 0.75, 0.75, 0, 0, 512, 0, 5, 0], _ - [189, 'Rodgort_s_Invocation', 'Anrufung_von_Rodgort', 25, 32.5, 6, 10, 0, 5, 15, 120, 1, 3, 240, 0, 0, 0, 16, 1, 2, 0.75, 0, 4, 0, 0, 8, 0], _ - [190, 'Mark_of_Rodgort', 'Zeichen_des_Rodgort', 15, 19.5, 6, 10, 0, 4, 0, 0, 1, 4, 240, 0, 0, 0, 5, 1, 1, 0.75, 0, 4, 0, 0, 15, 0], _ - [191, 'Immolate', 'Feueropfer', 10, 13, 6, 10, 0, 5, 20, 75, 1, 3, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 4, 0, 0, 5, 0], _ - [192, 'Meteor_Shower', 'Meteorschauer', 25, 32.5, 6, 10, 0, 5, 7, 112, 3, 3, 156, 0, 0, 0, 16, 1, 5, 0.75, 1, 128, 0, 0, 60, 0], _ - [193, 'Phoenix', 'Phönix', 15, 19.5, 6, 10, 0, 5, 20, 80, 10, 60, 240, 240, 0, 0, 16, 1, 1.5, 0.75, 0, 0, 0, 0, 7, 0], _ - [194, 'Flare', 'Feuergeschoss', 5, 6.5, 6, 10, 0, 5, 20, 65, 1800, 1800, 156, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 0, 0], _ - [195, 'Lava_Font', 'Lavabecken', 10, 13, 6, 10, 0, 5, 5, 50, 0, 0, 156, 240, 0, 0, 0, 1, 1.5, 0.75, 0, 0, 512, 0, 4, 0], _ - [196, 'Searing_Heat', 'Sengende_Hitze', 15, 19.5, 6, 10, 0, 5, 10, 40, 0, 0, 240, 0, 0, 0, 16, 1, 2, 0.75, 0, 4, 0, 0, 25, 0], _ - [197, 'Fire_Storm', 'Feuersturm', 10, 13, 6, 10, 0, 5, 5, 35, 33, 33, 156, 0, 0, 0, 16, 1, 2, 0.75, 0, 0, 0, 0, 20, 0], _ - [198, 'Glyph_of_Elemental_Power', 'Glyphe_der_Elementarkraft', 5, 6.5, 6, 46, 0, 12, 0, 0, 10, 10, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 5, 0], _ - [199, 'Glyph_of_Energy', 'Glyphe_der_Energie', 5, 6.5, 6, 12, 0, 12, 10, 25, 1, 2, 3, 0, 0, 0, 0, 1, 1, 0.75, 4, 0, 256, 0, 25, 0], _ - [200, 'Glyph_of_Lesser_Energy', 'Glyphe_der_geringeren_Energie', 5, 6.5, 6, 12, 0, 12, 10, 18, 2, 2, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 256, 0, 30, 0], _ - [201, 'Glyph_of_Concentration', 'Glyphe_der_Konzentration', 5, 6.5, 6, 46, 0, 12, 50, 50, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 10, 0], _ - [202, 'Glyph_of_Sacrifice', 'Glyphe_der_Opferung', 5, 6.5, 6, 46, 0, 12, 30, 30, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 15, 0], _ - [203, 'Glyph_of_Renewal', 'Glyphe_der_Erneuerung', 5, 6.5, 6, 46, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0.75, 4, 0, 0, 0, 10, 0], _ - [204, 'Rust', 'Rost', 10, 13, 6, 11, 0, 4, 1, 10, 10, 70, 156, 200, 0, 0, 16, 1, 1, 0.75, 0, 2048, 0, 0, 8, 0], _ - [205, 'Lightning_Surge', 'Blitzwelle', 15, 19.5, 6, 8, 0, 4, 14, 100, 5, 20, 0, 25, 0, 0, 5, 1, 1, 0.75, 4, 128, 0, 0, 10, 0], _ - [206, 'Armor_of_Frost', 'Frostrüstung', 5, 6.5, 6, 11, 0, 6, 40, 40, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 20, 0], _ - [207, 'Conjure_Frost', 'Frost_beschwören', 10, 13, 6, 11, 0, 6, 5, 20, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 45, 0], _ - [208, 'Water_Attunement', 'Wassereinstimmung', 10, 13, 6, 11, 0, 6, 30, 30, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 131072, 0, 30, 0], _ - [209, 'Mind_Freeze', 'Geistige_Erfrierung', 5, 6.5, 6, 11, 0, 4, 10, 60, 90, 90, 0, 0, 0, 0, 5, 1, 1, 0.75, 5, 2048, 0, 0, 5, 0], _ - [210, 'Ice_Prison', 'Eisgefängnis', 10, 13, 6, 11, 0, 4, 66, 66, 0, 0, 0, 0, 0, 0, 5, 1, 2, 0.75, 0, 2048, 0, 0, 30, 0], _ - [211, 'Ice_Spikes', 'Eisdornen', 15, 19.5, 6, 11, 0, 4, 20, 80, 66, 66, 156, 0, 0, 0, 16, 1, 1.5, 0.75, 0, 2048, 0, 0, 10, 0], _ - [212, 'Frozen_Burst', 'Frostexplosion', 15, 19.5, 6, 11, 0, 4, 10, 85, 66, 66, 240, 0, 0, 0, 0, 1, 0.75, 0.75, 0, 2048, 512, 0, 8, 0], _ - [213, 'Shard_Storm', 'Scherbensturm', 10, 13, 6, 11, 0, 4, 10, 85, 66, 66, 1800, 0, 0, 0, 5, 1, 1, 0.75, 0, 2048, 0, 0, 10, 0], _ - [214, 'Ice_Spear', 'Eisspeer', 5, 6.5, 6, 11, 0, 6, 10, 60, 1, 4, 240, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 0, 0], _ - [215, 'Maelstrom', 'Strudel', 25, 32.5, 6, 11, 0, 5, 10, 25, 0, 0, 156, 0, 0, 0, 16, 1, 2, 0.75, 1, 0, 0, 0, 30, 0], _ - [216, 'Iron_Mist', 'Eisenbeschlag', 10, 13, 6, 9, 0, 6, 25, 25, 15, 15, 0, 3, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 20, 0], _ - [217, 'Crystal_Wave', 'Kristallwelle', 15, 19.5, 6, 9, 0, 5, 10, 70, 5, 15, 156, 0, 0, 0, 0, 1, 0.75, 0.75, 0, 0, 512, 0, 15, 0], _ - [218, 'Obsidian_Flesh', 'Obsidianfleisch', 25, 32.5, 6, 9, 0, 6, 20, 20, 50, 50, 2, 0, 0, 0, 0, 1, 1, 0.75, 4, 0, 0, 0, 30, 0], _ - [219, 'Obsidian_Flame', 'Obsidianflamme', 5, 6.5, 6, 9, 0, 5, 22, 112, 0, 0, 0, 0, 0, 0, 5, 1, 1.5, 0.75, 1, 0, 0, 0, 5, 0], _ - [220, 'Blinding_Flash', 'Blitzblendung', 15, 19.5, 6, 8, 0, 5, 0, 0, 3, 8, 0, 0, 0, 0, 5, 1, 0.75, 0.75, 0, 2, 0, 0, 8, 0], _ - [221, 'Conjure_Lightning', 'Blitzbeschwörung', 10, 13, 6, 8, 0, 6, 5, 20, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 45, 0], _ - [222, 'Lightning_Strike', 'Blitzschlag', 5, 6.5, 6, 8, 0, 4, 5, 50, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 5, 0], _ - [223, 'Chain_Lightning', 'Kettenblitz', 10, 13, 6, 8, 0, 5, 10, 85, 0, 0, 240, 0, 0, 0, 5, 1, 2, 0.75, 1, 0, 0, 0, 6, 0], _ - [224, 'Enervating_Charge', 'Schwächende_Aufladung', 10, 13, 6, 8, 0, 5, 25, 50, 5, 20, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 1024, 0, 0, 8, 0], _ - [225, 'Air_Attunement', 'Lufteinstimmung', 10, 13, 6, 8, 0, 6, 30, 30, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 131072, 0, 30, 0], _ - [226, 'Mind_Shock', 'Geistiger_Schock', 5, 6.5, 6, 8, 0, 5, 10, 50, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 5, 128, 0, 0, 8, 0], _ - [227, 'Glimmering_Mark', 'Schimmerndes_Zeichen', 10, 13, 6, 8, 0, 4, 5, 25, 3, 3, 156, 0, 0, 0, 5, 1, 1, 0.75, 4, 0, 0, 0, 15, 0], _ - [228, 'Thunderclap', 'Donnerschlag', 10, 13, 6, 8, 0, 5, 10, 50, 5, 20, 156, 25, 0, 0, 5, 1, 1, 0.75, 4, 0, 0, 0, 8, 0], _ - [229, 'Lightning_Orb', 'Kugelblitz', 15, 19.5, 6, 8, 0, 5, 10, 100, 1800, 1800, 0, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 0, 0, 5, 0], _ - [230, 'Lightning_Javelin', 'Blitzspeer', 5, 6.5, 6, 8, 0, 5, 15, 50, 1, 10, 100, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 5, 0], _ - [231, 'Shock', 'Schock', 5, 6.5, 6, 8, 0, 10, 10, 60, 0, 0, 0, 0, 0, 0, 5, 1, 0.75, 0.75, 3, 128, 512, 0, 10, 0], _ - [232, 'Lightning_Touch', 'Blitz_Berührung', 5, 6.5, 6, 8, 2048, 10, 10, 60, 1, 4, 156, 0, 0, 0, 5, 1, 0.75, 0.75, 2, 0, 0, 0, 10, 0], _ - [233, 'Swirling_Aura', 'Wirbelnde_Aura', 10, 13, 6, 11, 0, 6, 1, 6, 50, 50, 1000, 312, 0, 0, 0, 1, 1, 0.75, 0, 0, 128, 0, 15, 0], _ - [234, 'Deep_Freeze', 'Tiefgefrieren', 25, 32.5, 6, 11, 0, 4, 10, 85, 66, 66, 312, 0, 0, 0, 16, 1, 2, 0.75, 0, 2048, 0, 0, 15, 0], _ - [235, 'Blurred_Vision', 'Verschwommene_Sicht', 10, 13, 6, 11, 0, 4, 50, 50, 0, 0, 156, 0, 0, 0, 5, 1, 1, 0.75, 0, 2048, 0, 0, 12, 0], _ - [236, 'Mist_Form', 'Nebelform', 10, 13, 6, 11, 0, 6, 33, 33, 50, 250, 1000, 105, 0, 0, 0, 1, 1, 0.75, 4, 0, 0, 0, 20, 0], _ - [237, 'Water_Trident', 'Wasserdreizack', 5, 6.5, 6, 11, 0, 5, 10, 90, 0, 0, 2400, 156, 0, 0, 5, 1, 1, 0.75, 4, 128, 0, 0, 3, 0], _ - [238, 'Armor_of_Mist', 'Nebelrüstung', 10, 13, 6, 11, 0, 6, 10, 40, 33, 33, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 30, 0], _ - [239, 'Ward_Against_Harm', 'Abwehr_gegen_Schaden', 15, 19.5, 6, 11, 0, 11, 12, 24, 1, 3, 312, 20, 0, 0, 0, 1, 1, 0.75, 4, 0, 0, 0, 20, 0], _ - [240, 'Smite', 'Peinigung', 10, 13, 3, 14, 0, 5, 10, 55, 10, 35, 156, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 10, 0], _ - [241, 'Life_Bond', 'Lebensbindung', 10, 13, 3, 15, 0, 6, 3, 30, 0, 0, 0, 0, 0, 0, 4, 1, 2, 0.75, 0, 0, 0, 0, 0, 0], _ - [242, 'Balthazars_Spirit', 'Balthasars_Geist', 10, 13, 3, 14, 0, 6, 1, 1, 2, 5, 0, 0, 0, 0, 3, 1, 2, 0.75, 0, 0, 0, 0, 0, 0], _ - [243, 'Strength_of_Honor', 'Stärke_der_Ehre', 10, 13, 3, 14, 0, 6, 5, 25, 0, 0, 0, 0, 0, 0, 3, 1, 2, 0.75, 0, 0, 0, 0, 15, 0], _ - [244, 'Life_Attunement', 'Lebenseinstimmung', 10, 13, 3, 15, 0, 6, 14, 50, 0, 0, 0, 0, 0, 0, 3, 1, 2, 0.75, 0, 0, 0, 0, 0, 0], _ - [245, 'Protective_Spirit', 'Schutzgeist', 10, 13, 3, 15, 0, 6, 10, 10, 0, 0, 0, 0, 0, 0, 3, 1, 0.25, 0.75, 0, 0, 0, 0, 5, 0], _ - [246, 'Divine_Intervention', 'Göttliche_Intervention', 5, 6.5, 3, 16, 0, 6, 26, 240, 0, 0, 0, 0, 0, 0, 3, 1, 0.25, 0.75, 0, 0, 16384, 0, 30, 0], _ - [247, 'Symbol_of_Wrath', 'Symbol_des_Zorns', 5, 6.5, 3, 14, 0, 5, 8, 32, 0, 0, 156, 0, 0, 0, 0, 1, 2, 0.75, 0, 0, 512, 0, 30, 0], _ - [248, 'Retribution', 'Vergeltung', 10, 13, 3, 14, 0, 6, 33, 33, 5, 20, 0, 0, 0, 0, 3, 1, 2, 0.75, 0, 0, 0, 0, 0, 0], _ - [249, 'Holy_Wrath', 'Heiliger_Zorn', 10, 13, 3, 14, 0, 6, 1, 10, 5, 50, 66, 0, 0, 0, 4, 1, 1, 0.75, 0, 0, 16384, 0, 10, 0], _ - [250, 'Essence_Bond', 'Essenzbindung', 10, 13, 3, 46, 0, 6, 1, 1, 0, 0, 0, 0, 0, 0, 3, 1, 2, 0.75, 0, 0, 0, 0, 0, 0], _ - [251, 'Scourge_Healing', 'Geißelheilung', 10, 13, 3, 14, 0, 4, 15, 80, 0, 0, 0, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 0, 0, 5, 0], _ - [252, 'Banish', 'Verbannung', 5, 6.5, 3, 14, 0, 5, 20, 56, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 10, 0], _ - [253, 'Scourge_Sacrifice', 'Geißelopfer', 10, 13, 3, 14, 0, 4, 100, 100, 0, 0, 156, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 5, 0], _ - [254, 'Vigorous_Spirit', 'Energischer_Geist', 5, 6.5, 3, 13, 0, 6, 5, 20, 0, 0, 0, 0, 0, 0, 3, 1, 0.25, 0.75, 0, 4096, 0, 0, 4, 0], _ - [255, 'Watchful_Spirit', 'Wachsamer_Geist', 15, 19.5, 3, 16, 0, 6, 2, 2, 30, 180, 0, 0, 0, 0, 3, 1, 1, 0.75, 0, 4096, 6, 0, 5, 0], _ - [256, 'Blessed_Aura', 'Gesegnete_Aura', 10, 13, 3, 16, 0, 6, 10, 35, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0.75, 0, 0, 0, 0, 2, 0], _ - [257, 'Aegis', 'Aegis', 10, 13, 3, 15, 0, 6, 50, 50, 0, 0, 1000, 0, 0, 0, 0, 1, 2, 0.75, 0, 0, 128, 0, 30, 0], _ - [258, 'Guardian', 'Wächter', 5, 6.5, 3, 15, 0, 6, 50, 50, 0, 0, 0, 0, 0, 0, 3, 1, 1, 0.75, 0, 0, 128, 0, 4, 0], _ - [259, 'Shield_of_Deflection', 'Ablenkungsschild', 10, 13, 3, 15, 0, 6, 75, 75, 15, 30, 0, 0, 0, 0, 3, 1, 0.25, 0.75, 4, 0, 128, 0, 10, 0], _ - [260, 'Aura_of_Faith', 'Glaubensaura', 5, 6.5, 3, 15, 0, 6, 50, 100, 5, 50, 0, 0, 0, 0, 3, 1, 0.25, 0.75, 4, 0, 0, 0, 8, 0], _ - [261, 'Shield_of_Regeneration', 'Schild_der_Regeneration', 15, 19.5, 3, 15, 0, 6, 3, 10, 40, 40, 0, 0, 0, 0, 3, 1, 0.25, 0.75, 4, 0, 6, 0, 8, 0], _ - [262, 'Shield_of_Judgment', 'Schild_des_Urteils', 15, 19.5, 3, 14, 0, 6, 5, 50, 0, 0, 0, 0, 0, 0, 3, 1, 1, 0.75, 4, 0, 16384, 0, 45, 0], _ - [263, 'Protective_Bond', 'Band_des_Schutzes', 10, 13, 3, 15, 0, 6, 5, 5, 6, 3, 0, 0, 0, 0, 3, 1, 2, 0.75, 0, 0, 0, 0, 0, 0], _ - [264, 'Pacifism', 'Pazifismus', 10, 13, 3, 15, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 0, 0, 30, 0], _ - [265, 'Amity', 'Freundschaft', 5, 6.5, 3, 15, 0, 4, 0, 0, 0, 0, 156, 0, 0, 0, 0, 1, 0.25, 0.75, 4, 0, 0, 0, 45, 0], _ - [266, 'Peace_and_Harmony', 'Frieden_und_Harmonie', 5, 6.5, 3, 16, 0, 6, 0, 9, 90, 90, 20, 0, 0, 0, 3, 1, 0.25, 0.75, 4, 0, 0, 0, 10, 0], _ - [267, 'Judges_Insight', 'Einblick_des_Richters', 10, 13, 3, 14, 0, 6, 20, 20, 0, 0, 0, 0, 0, 0, 3, 1, 2, 0.75, 0, 0, 0, 0, 10, 0], _ - [268, 'Unyielding_Aura', 'Unnachgiebige_Aura', 5, 6.5, 3, 16, 0, 6, 15, 60, 0, 0, 0, 0, 0, 0, 0, 1, 0.25, 0.75, 2052, 0, 8, 0, 10, 0], _ - [269, 'Mark_of_Protection', 'Schutzzeichen', 10, 13, 3, 15, 0, 6, 6, 60, 5, 5, 0, 0, 0, 0, 3, 1, 1, 0.75, 4, 4096, 0, 0, 45, 0], _ - [270, 'Life_Barrier', 'Lebenssperre', 15, 19.5, 3, 15, 0, 6, 50, 50, 20, 50, 0, 0, 0, 0, 4, 1, 2, 0.75, 4, 0, 0, 0, 5, 0], _ - [271, 'Zealots_Fire', 'Eifererfeuer', 10, 13, 3, 14, 0, 6, 5, 35, 1, 1, 156, 0, 0, 0, 0, 1, 0.25, 0.75, 0, 0, 0, 0, 30, 0], _ - [272, 'Balthazars_Aura', 'Balthasars_Aura', 25, 32.5, 3, 14, 0, 6, 10, 25, 1, 1, 156, 0, 0, 0, 3, 1, 2, 0.75, 0, 0, 1024, 0, 25, 0], _ - [273, 'Spell_Breaker', 'Zauberbrecher', 15, 19.5, 3, 16, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 1, 0.75, 4, 0, 0, 0, 45, 0], _ - [274, 'Healing_Seed', 'Heilender_Samen', 10, 13, 3, 13, 0, 6, 3, 30, 0, 0, 156, 0, 0, 0, 4, 1, 2, 0.75, 0, 4096, 0, 0, 25, 0], _ - [275, 'Mend_Condition', 'Zustand_bessern', 5, 6.5, 3, 15, 0, 5, 5, 70, 0, 0, 0, 0, 0, 0, 4, 1, 0.75, 0.75, 0, 4096, 4096, 0, 2, 0], _ - [276, 'Restore_Condition', 'Zustand_wiederherstellen', 5, 6.5, 3, 15, 0, 5, 10, 70, 0, 0, 0, 0, 0, 0, 4, 1, 0.75, 0.75, 4, 4096, 4096, 0, 2, 0], _ - [277, 'Mend_Ailment', 'Leiden_heilen', 5, 6.5, 3, 15, 0, 5, 5, 70, 0, 0, 0, 0, 0, 0, 3, 1, 0.75, 0.75, 0, 4096, 4096, 0, 5, 0], _ - [278, 'Purge_Conditions', 'Zustände_reinigen', 5, 6.5, 3, 46, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 0.25, 0.75, 0, 0, 4096, 0, 20, 0], _ - [279, 'Divine_Healing', 'Göttliche_Heilung', 5, 6.5, 3, 16, 0, 5, 15, 60, 0, 0, 1000, 0, 0, 0, 0, 1, 1, 0.75, 0, 4096, 6, 0, 12, 0], _ - [280, 'Heal_Area', 'Gebiet_heilen', 10, 13, 3, 13, 0, 5, 30, 180, 0, 0, 156, 0, 0, 0, 0, 1, 1, 0.75, 0, 4096, 6, 0, 5, 0], _ - [281, 'Orison_of_Healing', 'Fürbitte_der_Heilung', 5, 6.5, 3, 13, 0, 5, 20, 70, 0, 0, 0, 0, 0, 0, 3, 1, 1, 0.75, 0, 4096, 6, 0, 2, 0], _ - [282, 'Word_of_Healing', 'Wort_der_Heilung', 5, 6.5, 3, 13, 0, 5, 5, 100, 30, 115, 0, 0, 0, 0, 3, 1, 0.75, 0.75, 4, 4096, 6, 0, 3, 0], _ - [283, 'Dwaynas_Kiss', 'Dwaynas_Kuss', 5, 6.5, 3, 13, 0, 5, 15, 60, 10, 35, 0, 0, 0, 0, 4, 1, 1, 0.75, 0, 4096, 2, 0, 3, 0], _ - [284, 'Divine_Boon', 'Göttlicher_Segen', 5, 6.5, 3, 16, 0, 6, 15, 60, 1, 1, 0, 0, 0, 0, 0, 1, 0.25, 0.75, 0, 0, 0, 0, 10, 0], _ - [285, 'Healing_Hands', 'Heilende_Hände', 5, 6.5, 3, 13, 0, 6, 5, 35, 0, 0, 0, 0, 0, 0, 3, 1, 0.25, 0.75, 4, 4096, 0, 0, 25, 0], _ - [286, 'Heal_Other', 'Anderen_heilen', 10, 13, 3, 13, 0, 5, 35, 180, 0, 0, 0, 0, 0, 0, 4, 1, 0.75, 0.75, 0, 4096, 2, 0, 3, 0], _ - [287, 'Heal_Party', 'Gruppe_heilen', 15, 19.5, 3, 13, 0, 5, 30, 75, 0, 0, 5000, 0, 0, 0, 0, 1, 2, 0.75, 0, 4096, 6, 0, 2, 0], _ - [288, 'Healing_Breeze', 'Heilender_Hauch', 10, 13, 3, 13, 0, 6, 4, 9, 0, 0, 0, 0, 0, 0, 3, 1, 1, 0.75, 0, 4096, 6, 0, 5, 0], _ - [289, 'Vital_Blessing', 'Lebendige_Segnung', 10, 13, 3, 15, 0, 6, 40, 200, 0, 0, 0, 0, 0, 0, 3, 1, 0.75, 0.75, 0, 0, 0, 0, 2, 0], _ - [290, 'Mending', 'Genesung', 10, 13, 3, 13, 0, 6, 1, 4, 0, 0, 0, 0, 0, 0, 3, 1, 2, 0.75, 0, 4096, 0, 0, 0, 0], _ - [291, 'Live_Vicariously', 'Ersatzleben', 5, 6.5, 3, 13, 0, 6, 2, 17, 0, 0, 0, 0, 0, 0, 3, 1, 2, 0.75, 0, 0, 0, 0, 0, 0], _ - [292, 'Infuse_Health', 'Leben_einflößen', 10, 13, 3, 13, 0, 5, 100, 136, 0, 0, 0, 0, 0, 0, 4, 1, 0.25, 0.75, 0, 4096, 6, 0, 0, 0], _ - [293, 'Signet_of_Devotion', 'Siegel_der_Hingabe', 0, 0, 3, 16, 0, 7, 14, 100, 0, 0, 0, 0, 0, 0, 3, 1, 2, 0.75, 0, 4096, 6, 0, 5, 0], _ - [294, 'Signet_of_Judgment', 'Siegel_des_Urteils', 0, 0, 3, 14, 0, 7, 15, 75, 0, 0, 156, 0, 0, 0, 5, 1, 1, 0.75, 4, 128, 0, 0, 20, 0], _ - [295, 'Purge_Signet', 'Siegel_der_Reinigung', 0, 0, 3, 46, 0, 7, 10, 10, 0, 0, 0, 0, 0, 0, 3, 1, 2, 0.75, 0, 0, 6144, 0, 20, 0], _ - [296, 'Bane_Signet', 'Siegel_des_Ruins', 0, 0, 3, 14, 0, 7, 26, 56, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 20, 0], _ - [297, 'Blessed_Signet', 'Gesegnetes_Siegel', 0, 0, 3, 16, 0, 7, 3, 24, 3, 3, 0, 0, 0, 0, 0, 1, 2, 0.75, 0, 0, 0, 0, 10, 0], _ - [298, 'Martyr', 'Märtyrer', 5, 6.5, 3, 46, 0, 5, 0, 0, 0, 0, 5000, 0, 0, 0, 0, 1, 1, 0.75, 4, 0, 0, 0, 10, 0], _ - [299, 'Shielding_Hands', 'Schützende_Hände', 5, 6.5, 3, 15, 0, 6, 3, 18, 5, 50, 0, 0, 0, 0, 3, 1, 0.25, 0.75, 0, 0, 0, 0, 15, 0], _ - [300, 'Contemplation_of_Purity', 'Gebot_der_Reinheit', 5, 6.5, 3, 16, 0, 10, 0, 80, 1, 8, 0, 0, 0, 0, 0, 1, 0.25, 0.75, 0, 4096, 14336, 0, 10, 0], _ - [301, 'Remove_Hex', 'Verhexung_entfernen', 5, 6.5, 3, 46, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 1, 0.75, 0, 0, 2048, 0, 8, 0], _ - [302, 'Smite_Hex', 'Verhexung_zerschlagen', 5, 6.5, 3, 14, 0, 5, 10, 85, 0, 0, 312, 0, 0, 0, 3, 1, 1, 0.75, 0, 0, 2048, 0, 12, 0], _ - [303, 'Convert_Hexes', 'Verhexungen_umwandeln', 15, 19.5, 3, 15, 0, 5, 10, 10, 0, 0, 0, 0, 0, 0, 4, 1, 1, 0.75, 0, 0, 2048, 0, 12, 0], _ - [304, 'Light_of_Dwayna', 'Licht_von_Dwayna', 25, 32.5, 3, 46, 0, 5, 0, 0, 0, 0, 312, 0, 0, 0, 0, 1, 4, 0.75, 2048, 0, 8, 0, 20, 0], _ - [305, 'Resurrect', 'Wiederbeleben', 10, 13, 3, 46, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 6, 1, 5, 0.75, 2048, 0, 8, 0, 8, 0], _ - [306, 'Rebirth', 'Wiedergeburt', 10, 13, 3, 15, 0, 5, 10, 3, 0, 0, 0, 0, 0, 0, 6, 1, 5, 0.75, 2048, 0, 8, 0, 0, 0], _ - [307, 'Reversal_of_Fortune', 'Umkehrung_des_Schicksals', 5, 6.5, 3, 15, 0, 6, 15, 80, 0, 0, 0, 0, 0, 0, 3, 1, 0.25, 0.75, 0, 4096, 6, 0, 2, 0], _ - [308, 'Succor', 'Beistand', 5, 6.5, 3, 46, 0, 6, 1, 1, 1, 1, 0, 0, 0, 0, 4, 1, 1, 0.75, 0, 0, 0, 0, 10, 0], _ - [309, 'Holy_Veil', 'Heiliger_Schleier', 5, 6.5, 3, 46, 0, 6, 200, 200, 0, 0, 0, 0, 0, 0, 3, 1, 1, 0.75, 0, 0, 2048, 0, 12, 0], _ - [310, 'Divine_Spirit', 'Göttlicher_Geist', 10, 13, 3, 16, 0, 6, 5, 5, 1, 1, 0, 0, 0, 0, 0, 1, 0.25, 0.75, 0, 0, 0, 0, 60, 0], _ - [311, 'Draw_Conditions', 'Zustände_entziehen', 5, 6.5, 3, 15, 0, 5, 6, 26, 0, 0, 0, 0, 0, 0, 4, 1, 0.25, 0.75, 0, 0, 4096, 0, 4, 0], _ - [312, 'Holy_Strike', 'Heiliger_Schlag', 5, 6.5, 3, 14, 0, 10, 10, 55, 10, 55, 0, 0, 0, 0, 5, 1, 0.75, 0.75, 2, 0, 0, 0, 8, 0], _ - [313, 'Healing_Touch', 'Heilende_Berührung', 5, 6.5, 3, 13, 0, 5, 16, 60, 2, 2, 0, 0, 0, 0, 3, 1, 0.75, 0.75, 2, 4096, 6, 0, 5, 0], _ - [314, 'Restore_Life', 'Leben_erneuern', 10, 13, 3, 13, 0, 5, 20, 65, 42, 90, 0, 0, 0, 0, 6, 1, 4, 0.75, 2050, 0, 8, 0, 8, 0], _ - [315, 'Vengeance', 'Rache', 10, 13, 3, 46, 0, 6, 25, 25, 0, 0, 0, 0, 0, 0, 6, 1, 4, 0.75, 2048, 0, 0, 0, 30, 0], _ - [316, 'To_the_Limit', 'Bis_ans_Limit', 5, 6.5, 1, 21, 0, 15, 10, 60, 1, 6, 1000, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 15, 0], _ - [317, 'Battle_Rage', 'Kampfwut', 0, 0, 1, 17, 0, 3, 33, 33, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 0, 80], _ - [318, 'Defy_Pain', 'Schmerz_trotzen', 0, 0, 1, 17, 0, 16, 90, 300, 1, 10, 20, 0, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 0, 120], _ - [319, 'Rush', 'Ansturm', 0, 0, 1, 17, 0, 3, 25, 25, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 32768, 0, 0, 80], _ - [320, 'Hamstring', 'Lähmung', 10, 13, 1, 20, 0, 14, 0, 0, 3, 15, 0, 0, 0, 0, 5, 1, 0, 0, 0, 8, 0, 128, 15, 0], _ - [321, 'Wild_Blow', 'Rundumschlag', 5, 6.5, 1, 46, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 185, 8, 0], _ - [322, 'Power_Attack', 'Kraftangriff', 5, 6.5, 1, 17, 0, 14, 10, 40, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 185, 3, 0], _ - [323, 'Desperation_Blow', 'Verzweiflungsschlag', 5, 6.5, 1, 21, 0, 14, 10, 40, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 0, 25, 65536, 185, 7, 0], _ - [324, 'Thrill_of_Victory', 'Rausch_des_Sieges', 5, 6.5, 1, 21, 0, 14, 20, 40, 1, 2, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 185, 8, 0], _ - [325, 'Distracting_Blow', 'Ablenkungsschlag', 5, 6.5, 1, 46, 0, 14, 0, 0, 0, 0, 72, 0, 0, 0, 5, 1, 0.5, 0, 0, 0, 1, 185, 10, 0], _ - [326, 'Protectors_Strike', 'Schlag_des_Beschützers', 5, 6.5, 1, 17, 0, 14, 10, 40, 0, 0, 0, 0, 0, 0, 5, 1, 0.5, 0, 0, 0, 0, 185, 3, 0], _ - [327, 'Griffons_Sweep', 'Greifenschlag', 5, 6.5, 1, 17, 0, 14, 5, 20, 10, 34, 0, 0, 0, 0, 5, 1, 0, 0, 0, 128, 0, 185, 8, 0], _ - [328, 'Pure_Strike', 'Reiner_Schlag', 5, 6.5, 1, 20, 0, 14, 1, 30, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 128, 8, 0], _ - [329, 'Skull_Crack', 'Schädel_spalten', 0, 0, 1, 46, 0, 14, 0, 0, 15, 15, 0, 0, 0, 0, 5, 1, 0.5, 0, 4, 512, 1, 185, 0, 220], _ - [330, 'Cyclone_Axe', 'Zyklonaxt', 5, 6.5, 1, 18, 0, 14, 4, 12, 0, 0, 156, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 1, 4, 0], _ - [331, 'Hammer_Bash', 'Hammerstreich', 0, 0, 1, 19, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 0, 128, 0, 16, 0, 130], _ - [332, 'Bulls_Strike', 'Bullenstoß', 5, 6.5, 1, 17, 0, 14, 5, 30, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 0, 128, 0, 185, 10, 0], _ - [333, 'I_Will_Avenge_You', 'Ich_werde_Euch_rächen', 5, 6.5, 1, 17, 0, 15, 3, 7, 25, 25, 5000, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 45, 0], _ - [334, 'Axe_Rake', 'Harkenaxt', 0, 0, 1, 18, 16, 14, 1, 10, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 0, 8, 0, 1, 0, 120], _ - [335, 'Cleave', 'Spalten', 0, 0, 1, 18, 0, 14, 10, 30, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 4, 0, 0, 1, 0, 80], _ - [336, 'Executioners_Strike', 'Henkerschlag', 0, 0, 1, 18, 0, 14, 10, 40, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 1, 0, 200], _ - [337, 'Dismember', 'Zerstückeln', 0, 0, 1, 18, 0, 14, 0, 0, 5, 20, 0, 0, 0, 0, 5, 1, 0, 0, 0, 16, 0, 1, 0, 120], _ - [338, 'Eviscerate', 'Ausweiden', 0, 0, 1, 18, 0, 14, 1, 31, 5, 20, 0, 0, 0, 0, 5, 1, 0, 0, 4, 16, 0, 1, 0, 200], _ - [339, 'Penetrating_Blow', 'Durchdringender_Schlag', 0, 0, 1, 18, 0, 14, 5, 20, 20, 20, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 1, 0, 120], _ - [340, 'Disrupting_Chop', 'Unterbrechender_Hieb', 0, 0, 1, 18, 0, 14, 20, 20, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 1, 1, 0, 150], _ - [341, 'Swift_Chop', 'Schneller_Hieb', 5, 6.5, 1, 18, 0, 14, 1, 20, 1, 20, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 1, 4, 0], _ - [342, 'Axe_Twist', 'Axtdrehung', 0, 0, 1, 18, 16, 14, 1, 20, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 0, 1024, 0, 1, 0, 120], _ - [343, 'For_Great_Justice', 'Für_höhere_Gerechtigkeit', 5, 6.5, 1, 46, 0, 15, 100, 100, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 45, 0], _ - [344, 'Flurry', 'Schauer', 5, 6.5, 1, 46, 0, 3, 16, 16, 33, 33, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 32768, 0, 5, 0], _ - [345, 'Defensive_Stance', 'Verteidigungshaltung', 0, 0, 1, 21, 0, 3, 75, 75, 0, 4, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 128, 0, 8, 120], _ - [346, 'Frenzy', 'Raserei', 5, 6.5, 1, 46, 0, 3, 33, 33, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 32768, 0, 4, 0], _ - [347, 'Endure_Pain', 'Schmerz_ertragen', 5, 6.5, 1, 17, 0, 16, 90, 300, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 30, 0], _ - [348, 'Watch_Yourself', 'Passt_auf_Euch_auf', 0, 0, 1, 21, 0, 15, 5, 25, 10, 10, 1000, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 4, 80], _ - [349, 'Sprint', 'Sprinten', 5, 6.5, 1, 17, 0, 3, 25, 25, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 32768, 0, 15, 0], _ - [350, 'Belly_Smash', 'Bauchklatscher', 5, 6.5, 1, 19, 128, 14, 0, 0, 3, 7, 156, 0, 0, 0, 5, 1, 1, 0, 0, 2, 0, 16, 10, 0], _ - [351, 'Mighty_Blow', 'Mächtiger_Schlag', 0, 0, 1, 19, 0, 14, 10, 40, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 16, 0, 160], _ - [352, 'Crushing_Blow', 'Vernichtender_Schlag', 5, 6.5, 1, 19, 128, 14, 1, 20, 5, 20, 0, 0, 0, 0, 5, 1, 0, 0, 0, 16, 0, 16, 10, 0], _ - [353, 'Crude_Swing', 'Grober_Schwung', 5, 6.5, 1, 19, 0, 14, 1, 20, 0, 0, 156, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 16, 5, 0], _ - [354, 'Earth_Shaker', 'Erdrüttler', 0, 0, 1, 19, 0, 14, 0, 0, 0, 0, 156, 0, 0, 0, 5, 1, 0, 0, 68, 128, 0, 16, 0, 200], _ - [355, 'Devastating_Hammer', 'Verheerender_Hammer', 0, 0, 1, 19, 0, 14, 0, 0, 5, 20, 0, 0, 0, 0, 5, 1, 0, 0, 4, 1152, 0, 16, 0, 160], _ - [356, 'Irresistible_Blow', 'Brutaler_Schlag', 5, 6.5, 1, 19, 0, 14, 5, 20, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 16, 6, 0], _ - [357, 'Counter_Blow', 'Gegenschlag', 0, 0, 1, 19, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 0, 128, 0, 16, 0, 100], _ - [358, 'Backbreaker', 'Rückenbrecher', 0, 0, 1, 19, 0, 14, 1, 20, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 4, 128, 0, 16, 0, 220], _ - [359, 'Heavy_Blow', 'Heftiger_Schlag', 0, 0, 1, 19, 1024, 14, 1, 30, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 0, 128, 0, 16, 0, 120], _ - [360, 'Staggering_Blow', 'Umwerfender_Schlag', 0, 0, 1, 19, 0, 14, 0, 0, 5, 20, 0, 0, 0, 0, 5, 1, 1, 0, 0, 1024, 0, 16, 0, 80], _ - [361, 'Dolyak_Signet', 'Dolyak_Siegel', 0, 0, 1, 17, 0, 7, 10, 40, 75, 75, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 20, 0], _ - [362, 'Warriors_Cunning', 'Verschlagenheit_des_Kriegers', 10, 13, 1, 17, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 60, 0], _ - [363, 'Shield_Bash', 'Heftiger_Schildschlag', 5, 6.5, 1, 17, 0, 16, 15, 15, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 128, 128, 0, 20, 0], _ - [364, 'Charge', 'Angriff', 5, 6.5, 1, 21, 0, 15, 33, 33, 0, 0, 1000, 0, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 20, 0], _ - [365, 'Victory_Is_Mine', 'Der_Sieg_ist_mein', 5, 6.5, 1, 21, 0, 15, 10, 68, 3, 7, 312, 0, 0, 0, 5, 1, 0, 0, 4, 0, 4, 0, 15, 0], _ - [366, 'Fear_Me', 'Fürchtet_mich', 0, 0, 1, 21, 0, 15, 1, 4, 5, 30, 240, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 6, 80], _ - [367, 'Shields_Up', 'Schilde_hoch', 10, 13, 1, 21, 0, 15, 60, 60, 0, 0, 1000, 0, 0, 0, 0, 1, 0, 0, 0, 0, 128, 0, 30, 0], _ - [368, 'I_Will_Survive', 'Ich_überlebe', 5, 6.5, 1, 17, 0, 15, 3, 3, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 30, 0], _ - [370, 'Berserker_Stance', 'Berserkerhaltung', 5, 6.5, 1, 17, 0, 3, 33, 33, 50, 50, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 20, 0], _ - [371, 'Balanced_Stance', 'Ausgeglichene_Haltung', 5, 6.5, 1, 21, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 30, 0], _ - [372, 'Gladiators_Defense', 'Gladiatoren_Verteidigung', 5, 6.5, 1, 21, 0, 3, 75, 75, 5, 35, 0, 0, 0, 0, 0, 1, 0, 0, 4, 0, 128, 0, 30, 0], _ - [373, 'Deflect_Arrows', 'Pfeilablenkung', 0, 0, 1, 21, 0, 3, 75, 75, 5, 15, 156, 0, 0, 0, 0, 1, 0, 0, 0, 0, 128, 0, 12, 120], _ - [374, 'Warriors_Endurance', 'Ausdauer_des_Kriegers', 5, 6.5, 1, 17, 0, 16, 3, 3, 10, 25, 0, 0, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 30, 0], _ - [375, 'Dwarven_Battle_Stance', 'Zwergen_Kampfhaltung', 5, 6.5, 1, 17, 0, 3, 33, 33, 40, 40, 0, 0, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 20, 0], _ - [376, 'Disciplined_Stance', 'Disziplinierte_Haltung', 5, 6.5, 1, 21, 0, 3, 75, 75, 10, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 128, 0, 15, 0], _ - [377, 'Wary_Stance', 'Wachsame_Haltung', 10, 13, 1, 21, 0, 3, 5, 5, 35, 35, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 128, 0, 10, 0], _ - [378, 'Shield_Stance', 'Schildhaltung', 5, 6.5, 1, 21, 0, 3, 75, 75, 15, 15, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 128, 0, 15, 0], _ - [379, 'Bulls_Charge', 'Angriff_des_Bullen', 5, 6.5, 1, 17, 0, 3, 33, 33, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 20, 0], _ - [380, 'Bonettis_Defense', 'Bonettis_Verteidigung', 0, 0, 1, 21, 0, 3, 75, 75, 5, 5, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 128, 0, 0, 200], _ - [381, 'Hundred_Blades', 'Hundert_Klingen', 5, 6.5, 1, 20, 0, 16, 10, 25, 0, 0, 156, 0, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 25, 0], _ - [382, 'Sever_Artery', 'Arterienabtrennung', 0, 0, 1, 20, 0, 14, 0, 0, 5, 25, 0, 0, 0, 0, 5, 1, 0, 0, 0, 1, 0, 128, 0, 100], _ - [383, 'Galrath_Slash', 'Galrath_Hieb', 0, 0, 1, 20, 0, 14, 1, 40, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 128, 0, 200], _ - [384, 'Gash', 'Schnittwunde', 0, 0, 1, 20, 1, 14, 5, 20, 5, 20, 0, 0, 0, 0, 5, 1, 0, 0, 0, 16, 0, 128, 0, 140], _ - [385, 'Final_Thrust', 'Endstoß', 0, 0, 1, 20, 0, 14, 1, 40, 50, 50, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 128, 0, 240], _ - [386, 'Seeking_Blade', 'Suchende_Klinge', 5, 6.5, 1, 20, 0, 14, 1, 20, 1, 20, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 128, 4, 0], _ - [387, 'Riposte', 'Entgegnung', 0, 0, 1, 21, 0, 16, 20, 80, 1, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 128, 128, 0, 80], _ - [388, 'Deadly_Riposte', 'Tödliche_Entgegnung', 5, 6.5, 1, 21, 0, 16, 15, 90, 3, 25, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 128, 128, 10, 0], _ - [389, 'Flourish', 'Blütezeit', 5, 6.5, 1, 17, 0, 10, 2, 7, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0.75, 4, 0, 0, 0, 8, 0], _ - [390, 'Savage_Slash', 'Wilder_Hieb', 5, 6.5, 1, 20, 0, 14, 1, 40, 0, 0, 0, 0, 0, 0, 5, 1, 0.5, 0, 0, 0, 1, 128, 15, 0], _ - [391, 'Hunters_Shot', 'Jägerschuss', 5, 6.5, 2, 25, 128, 14, 3, 25, 0, 0, 0, 0, 0, 0, 5, 1, 1, 1, 0, 1, 0, 2, 10, 0], _ - [392, 'Pin_Down', 'Festnageln', 15, 19.5, 2, 25, 0, 14, 0, 0, 3, 15, 0, 0, 0, 0, 5, 1, 0, 0, 0, 8, 0, 2, 8, 0], _ - [393, 'Crippling_Shot', 'Verkrüppelungs_Schuss', 10, 13, 2, 25, 0, 14, 0, 0, 1, 11, 0, 0, 0, 0, 5, 1, 0, 0, 4, 8, 0, 2, 4, 0], _ - [394, 'Power_Shot', 'Kraftschuss', 10, 13, 2, 25, 0, 14, 25, 50, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 2, 3, 0], _ - [395, 'Barrage', 'Sperrfeuer', 5, 6.5, 2, 25, 0, 14, 5, 5, 5, 20, 156, 0, 0, 0, 5, 1, 0, 0, 4, 0, 0, 2, 1, 0], _ - [396, 'Dual_Shot', 'Doppelschuss', 10, 13, 2, 46, 0, 14, 16, 16, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 2, 10, 0], _ - [397, 'Quick_Shot', 'Schnellschuss', 5, 6.5, 2, 46, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 1, 1, 4, 0, 0, 2, 1, 0], _ - [398, 'Penetrating_Attack', 'Durchbohr_Angriff', 10, 13, 2, 25, 0, 14, 5, 25, 10, 10, 0, 0, 0, 0, 5, 1, 0.75, 0.600000023841858, 0, 0, 0, 2, 4, 0], _ - [399, 'Distracting_Shot', 'Ablenk_Schuss', 5, 6.5, 2, 23, 0, 14, 1, 16, 20, 20, 0, 0, 0, 0, 5, 1, 0.5, 1.5, 0, 0, 1, 2, 10, 0], _ - [400, 'Precision_Shot', 'Präzisionsschuss', 10, 13, 2, 25, 0, 14, 3, 10, 0, 0, 0, 0, 0, 0, 5, 1, 1, 1, 32, 0, 0, 2, 6, 0], _ - [402, 'Determined_Shot', 'Entschlossener_Schuss', 5, 6.5, 2, 25, 0, 14, 5, 20, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 2, 10, 0], _ - [403, 'Called_Shot', 'Ankündigungs_Schuss', 5, 6.5, 2, 46, 0, 14, 4800, 4800, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 2, 3, 0], _ - [404, 'Poison_Arrow', 'Giftpfeil', 5, 6.5, 2, 24, 0, 14, 0, 0, 5, 20, 0, 0, 0, 0, 5, 1, 0, 0, 4, 256, 0, 2, 1, 0], _ - [405, 'Oath_Shot', 'Eidschuss', 10, 13, 2, 23, 0, 14, 10, 4, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 4100, 0, 0, 2, 25, 0], _ - [406, 'Debilitating_Shot', 'Entkräftungs_Schuss', 10, 13, 2, 25, 0, 14, 1, 10, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 2, 10, 0], _ - [407, 'Point_Blank_Shot', 'Kurzdistanzschuss', 5, 6.5, 2, 23, 0, 14, 10, 40, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 8, 0, 0, 2, 3, 0], _ - [408, 'Concussion_Shot', 'Erschütterungsschuss', 25, 32.5, 2, 25, 0, 14, 1, 16, 5, 20, 0, 0, 0, 0, 5, 1, 0.5, 1.5, 0, 512, 0, 2, 5, 0], _ - [409, 'Punishing_Shot', 'Bestrafungs_Schuss', 10, 13, 2, 25, 0, 14, 10, 20, 0, 0, 0, 0, 0, 0, 5, 1, 0.5, 1.5, 4, 0, 1, 2, 5, 0], _ - [411, 'Charm_Animal', 'Tier_zähmen', 10, 13, 2, 22, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 10, 0.75, 0, 0, 0, 0, 0, 0], _ - [412, 'Call_of_Protection', 'Ruf_des_Schutzes', 5, 6.5, 2, 22, 0, 15, 5, 20, 0, 0, 5000, 0, 0, 0, 0, 1, 0, 0.75, 0, 0, 0, 0, 90, 0], _ - [415, 'Call_of_Haste', 'Ruf_der_Eile', 10, 13, 2, 22, 0, 15, 33, 33, 33, 33, 5000, 0, 0, 0, 0, 1, 0, 0.75, 0, 0, 32768, 0, 25, 0], _ - [422, 'Revive_Animal', 'Tier_wiederbeleben', 5, 6.5, 2, 22, 0, 10, 10, 94, 0, 0, 240, 0, 0, 0, 0, 1, 6, 0.75, 0, 0, 0, 0, 20, 0], _ - [423, 'Symbiotic_Bond', 'Symbiotisches_Band', 10, 13, 2, 22, 0, 15, 1, 3, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 55, 0], _ - [424, 'Throw_Dirt', 'Dreck_werfen', 5, 6.5, 2, 23, 0, 10, 0, 0, 3, 15, 72, 0, 0, 0, 5, 1, 1, 0.75, 2, 2, 0, 0, 30, 0], _ - [425, 'Dodge', 'Abducken', 5, 6.5, 2, 23, 0, 3, 27, 75, 33, 33, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 128, 0, 30, 0], _ - [426, 'Savage_Shot', 'Wilder_Schuss', 10, 13, 2, 25, 0, 14, 13, 28, 0, 0, 0, 0, 0, 0, 5, 1, 0.5, 1.5, 0, 0, 1, 2, 5, 0], _ - [427, 'Antidote_Signet', 'Gegengift_Siegel', 0, 0, 2, 46, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 4, 0], _ - [428, 'Incendiary_Arrows', 'Flammenpfeile', 5, 6.5, 2, 24, 0, 14, 2, 2, 1, 3, 240, 0, 0, 0, 5, 1, 0, 0, 4, 4, 0, 2, 5, 0], _ - [429, 'Melandrus_Arrows', 'Melandrus_Pfeile', 5, 6.5, 2, 24, 0, 19, 8, 28, 3, 25, 0, 0, 0, 0, 0, 1, 2, 0, 260, 1, 0, 0, 12, 0], _ - [430, 'Marksmans_Wager', 'Schützenwette', 5, 6.5, 2, 23, 0, 19, 5, 10, 10, 10, 0, 0, 0, 0, 0, 1, 2, 0, 260, 0, 0, 0, 24, 0], _ - [431, 'Ignite_Arrows', 'Brandpfeile', 10, 13, 2, 24, 0, 19, 3, 18, 0, 0, 156, 0, 0, 0, 0, 1, 2, 0, 256, 0, 0, 0, 12, 0], _ - [432, 'Read_the_Wind', 'Wind_lesen', 5, 6.5, 2, 25, 0, 19, 4800, 4800, 3, 10, 0, 0, 0, 0, 0, 1, 2, 0, 256, 0, 0, 0, 12, 0], _ - [433, 'Kindle_Arrows', 'Zündelpfeile', 5, 6.5, 2, 24, 0, 19, 3, 24, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 256, 0, 0, 0, 12, 0], _ - [434, 'Choking_Gas', 'Würgegas', 15, 19.5, 2, 24, 0, 19, 1, 8, 0, 0, 156, 0, 0, 0, 0, 1, 2, 0, 256, 0, 0, 0, 24, 0], _ - [435, 'Apply_Poison', 'Gift_auftragen', 15, 19.5, 2, 24, 0, 19, 0, 0, 3, 15, 0, 0, 0, 0, 0, 1, 2, 0, 256, 256, 0, 0, 12, 0], _ - [436, 'Comfort_Animal', 'Tier_erquicken', 5, 6.5, 2, 22, 0, 10, 20, 104, 10, 58, 5000, 8, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 1, 0], _ - [437, 'Bestial_Pounce', 'Bestiensprung', 5, 6.5, 2, 22, 0, 20, 5, 20, 0, 0, 5000, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 10, 0], _ - [438, 'Maiming_Strike', 'Verkrüppelungs_Schlag', 10, 13, 2, 22, 0, 20, 5, 20, 3, 15, 5000, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 5, 0], _ - [439, 'Feral_Lunge', 'Wilder_Ausfall', 5, 6.5, 2, 22, 0, 20, 5, 35, 5, 25, 5000, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 10, 0], _ - [440, 'Scavenger_Strike', 'Aasfresser_Schlag', 5, 6.5, 2, 22, 0, 20, 10, 25, 3, 15, 5000, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 10, 0], _ - [441, 'Melandrus_Assault', 'Melandrus_Angriff', 10, 13, 2, 22, 0, 20, 5, 20, 0, 0, 5000, 240, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 5, 0], _ - [442, 'Ferocious_Strike', 'Wilder_Schlag', 5, 6.5, 2, 22, 0, 20, 13, 28, 3, 10, 5000, 25, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 8, 0], _ - [443, 'Predators_Pounce', 'Raubtier_Sprung', 5, 6.5, 2, 22, 0, 20, 5, 35, 5, 50, 5000, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 5, 0], _ - [444, 'Brutal_Strike', 'Schonungsloser_Schlag', 10, 13, 2, 22, 0, 20, 5, 35, 5, 35, 5000, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 5, 0], _ - [445, 'Disrupting_Lunge', 'Unterbrechender_Ausfall', 5, 6.5, 2, 22, 0, 20, 1, 12, 20, 20, 5000, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 20, 0], _ - [446, 'Troll_Unguent', 'Trollsalbe', 5, 6.5, 2, 24, 0, 10, 3, 10, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0.75, 0, 0, 4, 0, 10, 0], _ - [447, 'Otyughs_Cry', 'Otyughs_Schrei', 5, 6.5, 2, 22, 0, 15, 24, 24, 0, 0, 5000, 0, 0, 0, 0, 1, 0, 0.75, 0, 0, 0, 0, 30, 0], _ - [448, 'Escape', 'Flucht', 5, 6.5, 2, 23, 0, 3, 33, 33, 75, 75, 0, 0, 0, 0, 0, 1, 0, 0, 4, 0, 128, 0, 12, 0], _ - [449, 'Practiced_Stance', 'Geübte_Haltung', 5, 6.5, 2, 23, 0, 3, 50, 50, 30, 150, 0, 0, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 15, 0], _ - [450, 'Whirling_Defense', 'Wirbelverteidigung', 10, 13, 2, 23, 0, 3, 75, 75, 5, 11, 156, 0, 0, 0, 0, 1, 0, 0, 0, 0, 128, 0, 60, 0], _ - [451, 'Melandrus_Resilience', 'Melandrus_Belastbarkeit', 5, 6.5, 2, 24, 0, 3, 4, 4, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 15, 0], _ - [452, 'Dryders_Defenses', 'Dryders_Verteidigungen', 5, 6.5, 2, 24, 0, 3, 34, 60, 75, 75, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 128, 0, 60, 0], _ - [453, 'Lightning_Reflexes', 'Blitzreflexe', 10, 13, 2, 23, 0, 3, 75, 75, 33, 33, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 128, 0, 30, 0], _ - [454, 'Tigers_Fury', 'Wut_des_Tigers', 10, 13, 2, 22, 0, 3, 25, 25, 5, 5, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 32768, 0, 10, 0], _ - [455, 'Storm_Chaser', 'Sturmjäger', 10, 13, 2, 24, 0, 3, 1, 5, 25, 25, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 20, 0], _ - [456, 'Serpents_Quickness', 'Schlangen_Schnelligkeit', 5, 6.5, 2, 24, 0, 3, 33, 33, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 45, 0], _ - [457, 'Dust_Trap', 'Staubfalle', 25, 32.5, 2, 24, 0, 21, 10, 25, 3, 8, 156, 240, 0, 0, 0, 1, 2, 0.75, 256, 2, 0, 0, 30, 0], _ - [458, 'Barbed_Trap', 'Stachelfalle', 15, 19.5, 2, 24, 0, 21, 7, 23, 3, 25, 156, 240, 0, 0, 0, 1, 2, 0.75, 256, 9, 0, 0, 20, 0], _ - [459, 'Flame_Trap', 'Flammenfalle', 10, 13, 2, 24, 0, 21, 5, 20, 1, 3, 156, 240, 0, 0, 0, 1, 2, 0.75, 256, 4, 0, 0, 20, 0], _ - [460, 'Healing_Spring', 'Heilquelle', 10, 13, 2, 24, 0, 21, 15, 60, 0, 0, 156, 240, 0, 0, 0, 1, 2, 0.75, 256, 0, 0, 0, 20, 0], _ - [461, 'Spike_Trap', 'Dornenfalle', 10, 13, 2, 24, 0, 21, 10, 40, 3, 25, 156, 240, 0, 0, 0, 1, 2, 0.75, 260, 136, 0, 0, 20, 0], _ - [462, 'Winter', 'Winter', 5, 6.5, 2, 24, 0, 22, 1, 10, 1, 16, 2500, 0, 0, 0, 0, 1, 3, 0.75, 256, 0, 0, 0, 60, 0], _ - [463, 'Winnowing', 'Trennung', 5, 6.5, 2, 24, 0, 22, 1, 10, 4, 4, 2500, 0, 0, 0, 0, 1, 5, 0.75, 256, 0, 0, 0, 60, 0], _ - [464, 'Edge_of_Extinction', 'Rand_der_Auslöschung', 5, 6.5, 2, 22, 0, 22, 1, 10, 14, 50, 2500, 0, 0, 0, 0, 1, 5, 0.75, 256, 0, 0, 0, 60, 0], _ - [465, 'Greater_Conflagration', 'Großflächenbrand', 5, 6.5, 2, 24, 0, 22, 1, 10, 0, 0, 2500, 0, 0, 0, 0, 1, 3, 0.75, 260, 0, 0, 0, 15, 0], _ - [466, 'Conflagration', 'Feuersbrunst', 5, 6.5, 2, 24, 0, 22, 1, 10, 0, 0, 2500, 0, 0, 0, 0, 1, 5, 0.75, 256, 0, 0, 0, 60, 0], _ - [467, 'Fertile_Season', 'Fruchtbare_Jahreszeit', 15, 19.5, 2, 22, 0, 22, 1, 10, 50, 150, 2500, 8, 0, 0, 0, 1, 5, 0.75, 256, 0, 0, 0, 60, 0], _ - [468, 'Symbiosis', 'Symbiose', 5, 6.5, 2, 22, 0, 22, 1, 10, 27, 150, 2500, 0, 0, 0, 0, 1, 5, 0.75, 256, 0, 0, 0, 60, 0], _ - [469, 'Primal_Echoes', 'Urechos', 5, 6.5, 2, 22, 0, 22, 1, 10, 10, 10, 2500, 0, 0, 0, 0, 1, 5, 0.75, 256, 0, 0, 0, 60, 0], _ - [470, 'Predatory_Season', 'Jagdsaison', 5, 6.5, 2, 22, 0, 22, 1, 10, 80, 80, 2500, 5, 0, 0, 0, 1, 5, 0.75, 256, 0, 0, 0, 60, 0], _ - [471, 'Frozen_Soil', 'Eisboden', 10, 13, 2, 24, 0, 22, 1, 10, 0, 0, 2500, 0, 0, 0, 0, 1, 5, 0.75, 256, 0, 0, 0, 30, 0], _ - [472, 'Favorable_Winds', 'Günstige_Winde', 5, 6.5, 2, 25, 0, 22, 1, 10, 6, 6, 2500, 0, 0, 0, 0, 1, 5, 0.75, 256, 0, 0, 0, 60, 0], _ - [474, 'Energizing_Wind', 'Treibwind', 15, 19.5, 2, 22, 0, 22, 1, 6, 15, 15, 2500, 10, 0, 0, 0, 1, 5, 0.75, 256, 0, 0, 0, 60, 0], _ - [475, 'Quickening_Zephyr', 'Beschleunigender_Zephyr', 25, 32.5, 2, 24, 0, 22, 1, 10, 30, 30, 2500, 0, 0, 0, 0, 1, 5, 0.75, 256, 0, 0, 0, 60, 0], _ - [476, 'Natures_Renewal', 'Erneuerung_der_Natur', 5, 6.5, 2, 24, 0, 22, 1, 10, 200, 200, 2500, 0, 0, 0, 0, 1, 5, 0.75, 256, 0, 0, 0, 60, 0], _ - [477, 'Muddy_Terrain', 'Schlammiges_Terrain', 5, 6.5, 2, 24, 0, 22, 1, 10, 10, 10, 2500, 0, 0, 0, 0, 1, 5, 0.75, 256, 0, 0, 0, 30, 0], _ - [570, 'Mark_of_Insecurity', 'Zeichen_der_Unsicherheit', 5, 6.5, 7, 30, 0, 4, 1, 3, 30, 80, 10, 0, 0, 0, 5, 1, 1, 0.75, 516, 0, 0, 0, 10, 0], _ - [571, 'Disrupting_Dagger', 'Unterbrechender_Dolch', 5, 6.5, 7, 30, 0, 5, 10, 35, 0, 0, 0, 0, 0, 0, 5, 1, 0.25, 0.75, 8, 0, 1, 0, 10, 0], _ - [572, 'Deadly_Paradox', 'Tödliches_Paradoxon', 15, 19.5, 7, 30, 0, 3, 33, 33, 10, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 10, 0], _ - [763, 'Jaundiced_Gaze', 'Neidvoller_Blick', 10, 13, 4, 4, 0, 6, 0, 1, 1, 10, 10, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 32, 0, 15, 0], _ - [764, 'Wail_of_Doom', 'Schicksalsklage', 1, 1.3, 4, 6, 0, 4, 10, 10, 0, 0, 0, 0, 0, 0, 5, 1, 0.25, 0.75, 4, 0, 32, 0, 15, 0], _ - [766, 'Gaze_of_Contempt', 'Verächtlicher_Blick', 10, 13, 4, 46, 0, 5, 50, 50, 0, 0, 0, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 0, 0, 15, 0], _ - [769, 'Vipers_Defense', 'Verteidigung_der_Viper', 5, 6.5, 7, 31, 0, 5, 5, 20, 156, 156, 312, 800, 0, 0, 1, 1, 0.25, 0, 0, 0, 0, 0, 10, 0], _ - [770, 'Return', 'Rückkehr', 5, 6.5, 7, 31, 0, 5, 3, 8, 0, 0, 156, 0, 0, 0, 4, 1, 0.25, 0, 0, 0, 0, 0, 15, 0], _ - [771, 'Aura_of_Displacement', 'Aura_der_Verschiebung', 10, 13, 7, 46, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 0.25, 0.75, 4, 0, 0, 0, 20, 0], _ - [772, 'Generous_Was_Tsungrai', 'Großzügig_war_Tsungrai', 5, 6.5, 8, 33, 0, 24, 50, 140, 100, 280, 10, 10, 0, 0, 0, 1, 1, 0.75, 0, 0, 36, 0, 15, 0], _ - [773, 'Mighty_Was_Vorizun', 'Mächtig_war_Vorizun', 5, 6.5, 8, 32, 0, 24, 15, 15, 30, 30, 0, 0, 0, 0, 0, 1, 2, 0.75, 0, 0, 0, 0, 30, 0], _ - [775, 'Death_Blossom', 'Todesblüte', 5, 6.5, 7, 29, 0, 14, 20, 45, 0, 0, 156, 0, 3, 4, 5, 1, 0, 0, 32768, 0, 0, 8, 2, 0], _ - [776, 'Twisting_Fangs', 'Schlangenzähne', 10, 13, 7, 35, 0, 14, 10, 20, 5, 20, 0, 0, 3, 4, 5, 1, 0, 0, 32768, 0, 0, 8, 15, 0], _ - [777, 'Horns_of_the_Ox', 'Hörner_des_Ochsen', 5, 6.5, 7, 29, 0, 14, 1, 11, 0, 0, 156, 0, 3, 4, 5, 1, 0, 0, 32768, 0, 0, 8, 12, 0], _ - [778, 'Falling_Spider', 'Fallende_Spinne', 5, 6.5, 7, 29, 0, 14, 15, 35, 5, 20, 0, 0, 2, 0, 5, 1, 0, 0, 0, 0, 0, 8, 8, 0], _ - [779, 'Black_Lotus_Strike', 'Schwarzer_Lotus_Stoß', 10, 13, 7, 35, 0, 14, 10, 31, 5, 13, 0, 0, 1, 0, 5, 1, 0, 0, 0, 0, 0, 8, 6, 0], _ - [780, 'Fox_Fangs', 'Reißzähne_des_Fuchses', 5, 6.5, 7, 29, 0, 14, 10, 35, 0, 0, 0, 0, 2, 2, 5, 1, 0.5, 0, 0, 0, 0, 8, 3, 0], _ - [781, 'Moebius_Strike', 'Möbiusstoß', 5, 6.5, 7, 29, 0, 14, 10, 35, 0, 0, 0, 0, 2, 1, 5, 1, 0, 0, 4, 0, 0, 8, 2, 0], _ - [782, 'Jagged_Strike', 'Gezackter_Stoß', 5, 6.5, 7, 29, 0, 14, 5, 20, 0, 0, 0, 0, 1, 0, 5, 1, 0.5, 0, 0, 0, 0, 8, 1, 0], _ - [783, 'Unsuspecting_Strike', 'Unvermuteter_Stoß', 10, 13, 7, 35, 0, 14, 19, 31, 15, 75, 0, 0, 1, 0, 5, 1, 0, 0, 0, 0, 0, 8, 2, 0], _ - [784, 'Entangling_Asp', 'Schlingnatter', 10, 13, 7, 30, 0, 5, 5, 20, 0, 0, 0, 0, 0, 2, 5, 1, 1, 0.75, 0, 0, 0, 0, 20, 0], _ - [785, 'Mark_of_Death', 'Zeichen_des_Todes', 10, 13, 7, 30, 0, 4, 33, 33, 0, 0, 0, 0, 0, 0, 5, 1, 0.25, 0.75, 0, 0, 0, 0, 20, 0], _ - [786, 'Iron_Palm', 'Eiserne_Handfläche', 5, 6.5, 7, 30, 0, 10, 5, 50, 0, 0, 0, 0, 1, 0, 5, 1, 0.75, 0.75, 2, 0, 512, 0, 20, 0], _ - [787, 'Resilient_Weapon', 'Unverwüstliche_Waffe', 10, 13, 8, 33, 0, 25, 1, 6, 24, 24, 0, 0, 0, 0, 3, 1, 1, 0.75, 0, 0, 0, 0, 6, 0], _ - [788, 'Blind_Was_Mingson', 'Blind_war_Mingson', 5, 6.5, 8, 33, 0, 24, 3, 8, 0, 0, 240, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 512, 0, 20, 0], _ - [789, 'Grasping_Was_Kuurong', 'Erfassend_war_Kuurong', 15, 19.5, 8, 34, 0, 24, 15, 75, 0, 0, 240, 0, 0, 0, 0, 1, 1, 0.75, 4, 128, 512, 0, 20, 0], _ - [790, 'Vengeful_Was_Khanhei', 'Nachtragend_war_Khanhei', 5, 6.5, 8, 33, 0, 24, 5, 35, 0, 0, 0, 0, 0, 0, 0, 1, 0.75, 0.75, 4, 0, 16384, 0, 20, 0], _ - [791, 'Flesh_of_My_Flesh', 'Fleisch_von_meinem_Fleisch', 5, 6.5, 8, 33, 0, 5, 5, 20, 0, 0, 0, 0, 0, 0, 6, 1, 4, 0.75, 2048, 0, 8, 0, 0, 0], _ - [792, 'Splinter_Weapon', 'Splitterwaffe', 5, 6.5, 8, 34, 0, 25, 5, 50, 1, 5, 156, 3, 0, 0, 3, 1, 1, 0.75, 0, 0, 0, 0, 5, 0], _ - [793, 'Weapon_of_Warding', 'Waffe_der_Abwehr', 10, 13, 8, 33, 0, 25, 50, 50, 2, 4, 0, 0, 0, 0, 3, 1, 1, 0.75, 0, 0, 128, 0, 5, 0], _ - [794, 'Wailing_Weapon', 'Klagende_Waffe', 5, 6.5, 8, 34, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 1, 0.75, 0, 0, 0, 0, 25, 0], _ - [795, 'Nightmare_Weapon', 'Alptraumwaffe', 5, 6.5, 8, 34, 0, 25, 10, 50, 3, 3, 0, 0, 0, 0, 3, 1, 1, 0.75, 0, 0, 0, 0, 10, 0], _ - [799, 'Beguiling_Haze', 'Verführerischer_Dunst', 15, 19.5, 7, 31, 0, 5, 3, 9, 0, 0, 0, 0, 0, 0, 5, 1, 0.25, 0.75, 4, 0, 0, 0, 20, 0], _ - [800, 'Enduring_Toxin', 'Dauerhaftes_Toxin', 5, 6.5, 7, 30, 0, 4, 1, 5, 0, 0, 0, 0, 0, 0, 5, 1, 0.25, 0.75, 512, 0, 0, 0, 10, 0], _ - [801, 'Shroud_of_Silence', 'Schleier_des_Schweigens', 10, 13, 7, 30, 0, 4, 15, 15, 0, 0, 0, 0, 0, 0, 5, 1, 0.75, 0.75, 6, 0, 0, 0, 30, 0], _ - [802, 'Expose_Defenses', 'Verteidigungen_aufdecken', 10, 13, 7, 30, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 25, 0], _ - [803, 'Power_Leech', 'Kraftfresser', 5, 6.5, 5, 3, 0, 4, 5, 15, 0, 0, 0, 0, 0, 0, 5, 1, 0.25, 0.75, 4, 0, 1, 0, 20, 0], _ - [804, 'Arcane_Languor', 'Arkane_Schwäche', 10, 13, 5, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 2, 0.75, 4, 0, 0, 0, 15, 0], _ - [805, 'Animate_Vampiric_Horror', 'Vampirschreck_beleben', 15, 19.5, 4, 5, 0, 5, 1, 17, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0.75, 262144, 0, 0, 0, 15, 0], _ - [806, 'Cultists_Fervor', 'Eifer_des_Sektierers', 5, 6.5, 4, 4, 0, 6, 1, 6, 10, 10, 3, 0, 0, 0, 0, 1, 1, 0.75, 4, 0, 0, 0, 25, 0], _ - [808, 'Reapers_Mark', 'Zeichen_des_Schnitters', 5, 6.5, 4, 6, 0, 4, 1, 5, 5, 15, 0, 0, 0, 0, 5, 1, 1, 0.75, 516, 0, 0, 0, 15, 0], _ - [809, 'Shatterstone', 'Trümmerstein', 15, 19.5, 6, 11, 0, 4, 25, 100, 25, 100, 240, 0, 0, 0, 5, 1, 2, 0.75, 4, 2048, 0, 0, 8, 0], _ - [810, 'Protectors_Defense', 'Verteidigung_des_Beschützers', 5, 6.5, 1, 21, 0, 10, 75, 75, 0, 0, 156, 0, 0, 0, 0, 1, 0, 0, 0, 0, 128, 0, 30, 0], _ - [811, 'Run_as_One', 'Gemeinsam_rennen', 5, 6.5, 2, 22, 0, 3, 25, 25, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 32768, 0, 15, 0], _ - [812, 'Defiant_Was_Xinrae', 'Trotzig_war_Xinrae', 5, 6.5, 8, 33, 0, 24, 20, 20, 5, 50, 240, 0, 0, 0, 0, 1, 1, 0.75, 4, 0, 0, 0, 20, 0], _ - [813, 'Lyssas_Aura', 'Lyssas_Aura', 5, 6.5, 5, 3, 0, 6, 0, 5, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0.75, 4, 0, 0, 0, 30, 0], _ - [814, 'Shadow_Refuge', 'Schattenzuflucht', 5, 6.5, 7, 31, 0, 6, 40, 100, 5, 10, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 4, 0, 8, 0], _ - [815, 'Scorpion_Wire', 'Skorpiondraht', 5, 6.5, 7, 30, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 8, 0, 0, 0, 10, 0], _ - [816, 'Mirrored_Stance', 'Gespiegelte_Haltung', 5, 6.5, 7, 31, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 0.25, 0.75, 0, 0, 0, 0, 15, 0], _ - [817, 'Discord', 'Zwietracht', 5, 6.5, 4, 5, 0, 5, 30, 110, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 4, 0, 0, 0, 2, 0], _ - [818, 'Well_of_Weariness', 'Brunnen_der_Müdigkeit', 5, 6.5, 4, 7, 0, 9, 1, 1, 20, 20, 312, 0, 0, 0, 0, 1, 1, 0.75, 262144, 0, 0, 0, 5, 0], _ - [819, 'Vampiric_Spirit', 'Vampirgeist', 5, 6.5, 4, 4, 0, 6, 5, 50, 5, 10, 240, 0, 0, 0, 5, 1, 2, 0.75, 4, 0, 0, 0, 8, 0], _ - [820, 'Depravity', 'Verderbtheit', 10, 13, 4, 7, 0, 4, 1, 5, 0, 0, 240, 0, 0, 0, 5, 1, 2, 0.75, 4, 0, 0, 0, 15, 0], _ - [821, 'Icy_Veins', 'Eisadern', 10, 13, 4, 6, 0, 4, 10, 90, 20, 110, 240, 0, 0, 0, 5, 1, 1, 0.75, 4, 0, 0, 0, 5, 0], _ - [822, 'Weaken_Knees', 'Weiche_Knie', 5, 6.5, 4, 7, 0, 4, 1, 4, 5, 10, 0, 0, 0, 0, 5, 1, 1, 0.75, 516, 0, 0, 0, 10, 0], _ - [823, 'Burning_Speed', 'Brennende_Eile', 10, 13, 6, 10, 0, 6, 30, 45, 3, 9, 156, 0, 0, 0, 0, 1, 0.25, 0.75, 0, 0, 0, 0, 0, 0], _ - [824, 'Lava_Arrows', 'Lavapfeile', 5, 6.5, 6, 10, 0, 5, 20, 65, 3, 3, 240, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 2, 0], _ - [825, 'Bed_of_Coals', 'Kohlenbett', 10, 13, 6, 10, 0, 5, 5, 29, 3, 7, 156, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 15, 0], _ - [826, 'Shadow_Form', 'Schattenform', 5, 6.5, 7, 31, 0, 6, 5, 25, 5, 5, 1, 0, 0, 0, 0, 1, 1, 0.75, 4, 0, 128, 0, 30, 0], _ - [827, 'Siphon_Strength', 'Kraft_abzapfen', 10, 13, 7, 30, 0, 4, 5, 50, 33, 33, 0, 0, 0, 0, 5, 1, 1, 0.75, 4, 0, 0, 0, 10, 0], _ - [828, 'Vile_Miasma', 'Fauler_Gestank', 10, 13, 4, 5, 0, 4, 10, 65, 1, 5, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 15, 0], _ - [830, 'Ray_of_Judgment', 'Strahl_des_Urteils', 10, 13, 3, 14, 0, 5, 5, 45, 1, 3, 156, 0, 0, 0, 16, 1, 2, 0.75, 4, 0, 0, 0, 20, 0], _ - [831, 'Primal_Rage', 'Urzorn', 0, 0, 1, 17, 0, 3, 33, 33, 25, 25, 0, 0, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 10, 80], _ - [832, 'Animate_Flesh_Golem', 'Fleischgolem_beleben', 10, 13, 4, 5, 0, 5, 3, 25, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0.75, 262148, 0, 0, 0, 30, 0], _ - [834, 'Reckless_Haste', 'Rücksichtslose_Hast', 15, 19.5, 4, 7, 0, 4, 50, 50, 25, 25, 156, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 12, 0], _ - [835, 'Blood_Bond', 'Blutsbande', 5, 6.5, 4, 4, 0, 4, 5, 20, 20, 100, 156, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 2, 0, 8, 0], _ - [836, 'Ride_the_Lightning', 'Den_Blitz_reiten', 10, 13, 6, 8, 0, 5, 10, 70, 1, 5, 156, 0, 0, 0, 1, 1, 1, 0.75, 5, 0, 0, 0, 5, 0], _ - [837, 'Energy_Boon', 'Energiesegen', 5, 6.5, 6, 12, 0, 6, 1, 12, 1, 3, 2, 2, 0, 0, 3, 1, 1, 0.75, 4, 0, 256, 0, 20, 0], _ - [838, 'Dwaynas_Sorrow', 'Dwaynas_Leid', 5, 6.5, 3, 13, 0, 6, 5, 50, 0, 0, 5000, 240, 0, 0, 3, 1, 1, 0.75, 0, 0, 0, 0, 5, 0], _ - [839, 'Retreat', 'Rückzug', 5, 6.5, 1, 21, 0, 15, 33, 33, 0, 0, 1000, 5000, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 20, 0], _ - [840, 'Poisoned_Heart', 'Vergiftetes_Herz', 5, 6.5, 4, 7, 0, 5, 5, 15, 0, 0, 156, 0, 0, 0, 0, 1, 0.25, 0.75, 0, 256, 0, 0, 12, 0], _ - [841, 'Fetid_Ground', 'Stinkender_Boden', 5, 6.5, 4, 5, 128, 5, 15, 65, 5, 20, 0, 0, 0, 0, 5, 1, 0.75, 0.75, 0, 0, 0, 0, 10, 0], _ - [842, 'Arc_Lightning', 'Blitzbogen', 5, 6.5, 6, 8, 2048, 5, 5, 40, 15, 85, 240, 2, 0, 0, 5, 1, 1.5, 0.75, 0, 0, 0, 0, 8, 0], _ - [843, 'Gust', 'Böe', 5, 6.5, 6, 8, 0, 6, 15, 70, 33, 33, 240, 0, 0, 0, 1, 1, 0.75, 0.75, 4, 128, 0, 0, 10, 0], _ - [844, 'Churning_Earth', 'Aufgeworfene_Erde', 15, 19.5, 6, 9, 0, 5, 10, 40, 10, 10, 240, 0, 0, 0, 16, 1, 2, 0.75, 0, 0, 0, 0, 30, 0], _ - [845, 'Liquid_Flame', 'Flüssige_Flamme', 10, 13, 6, 10, 0, 5, 7, 112, 0, 0, 240, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 15, 0], _ - [846, 'Steam', 'Dampf', 5, 6.5, 6, 11, 4, 5, 20, 60, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 2, 0, 0, 8, 0], _ - [847, 'Boon_Signet', 'Siegel_des_Segens', 0, 0, 3, 16, 0, 7, 20, 80, 20, 80, 0, 0, 0, 0, 3, 1, 1, 0.75, 4, 4096, 0, 0, 8, 0], _ - [848, 'Reverse_Hex', 'Verhexung_umkehren', 10, 13, 3, 15, 0, 6, 5, 50, 0, 0, 0, 0, 0, 0, 3, 1, 0.25, 0.75, 0, 0, 2048, 0, 10, 0], _ - [849, 'Lacerating_Chop', 'Zerfetzender_Hieb', 0, 0, 1, 18, 1, 14, 5, 20, 5, 20, 0, 0, 0, 0, 5, 1, 0, 0, 0, 128, 0, 1, 0, 120], _ - [850, 'Fierce_Blow', 'Erbitterter_Schlag', 0, 0, 1, 19, 1024, 14, 5, 20, 1, 8, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 16, 0, 140], _ - [851, 'Sun_and_Moon_Slash', 'Sonne_Mond_Hieb', 0, 0, 1, 20, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 128, 0, 200], _ - [852, 'Splinter_Shot', 'Splitterschuss', 10, 13, 2, 25, 0, 14, 3, 15, 5, 65, 156, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 2, 5, 0], _ - [853, 'Melandrus_Shot', 'Melandrus_Schuss', 5, 6.5, 2, 25, 0, 14, 10, 25, 5, 25, 0, 0, 0, 0, 5, 1, 1, 1, 4, 0, 0, 2, 8, 0], _ - [854, 'Snare', 'Schlinge', 5, 6.5, 2, 24, 0, 21, 3, 15, 0, 0, 156, 240, 0, 0, 0, 1, 2, 0.75, 288, 8, 0, 0, 20, 0], _ - [858, 'Dancing_Daggers', 'Tanzende_Dolche', 5, 6.5, 7, 30, 0, 5, 5, 35, 1800, 1800, 0, 0, 1, 0, 5, 1, 1, 0.75, 8, 0, 0, 0, 5, 0], _ - [859, 'Conjure_Nightmare', 'Alptraum_beschwören', 15, 19.5, 5, 1, 0, 4, 8, 8, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 512, 0, 0, 0, 5, 0], _ - [860, 'Signet_of_Disruption', 'Siegel_der_Unterbrechung', 0, 0, 5, 2, 0, 7, 10, 51, 50, 50, 0, 0, 0, 0, 5, 1, 0.25, 0.75, 0, 0, 1, 0, 15, 0], _ - [862, 'Ravenous_Gaze', 'Heißhungriger_Blick', 1, 1.3, 4, 4, 0, 5, 15, 30, 15, 30, 240, 0, 0, 0, 16, 1, 1, 0.75, 4, 0, 0, 0, 10, 0], _ - [863, 'Order_of_Apostasy', 'Orden_der_Abtrünnigkeit', 25, 32.5, 4, 7, 0, 6, 25, 15, 0, 0, 5000, 0, 0, 0, 0, 1, 2, 0.75, 4, 0, 0, 0, 0, 0], _ - [864, 'Oppressive_Gaze', 'Repressiver_Blick', 10, 13, 4, 4, 1024, 5, 10, 30, 3, 12, 156, 50, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 10, 0], _ - [865, 'Lightning_Hammer', 'Blitzhammer', 25, 32.5, 6, 8, 0, 5, 10, 100, 25, 25, 0, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 0, 0, 4, 0], _ - [866, 'Vapor_Blade', 'Dunstklinge', 15, 19.5, 6, 11, 0, 5, 15, 135, 0, 0, 0, 0, 0, 0, 5, 1, 1.5, 0.75, 1, 0, 0, 0, 7, 0], _ - [867, 'Healing_Light', 'Heilendes_Licht', 5, 6.5, 3, 13, 0, 5, 40, 100, 1, 3, 0, 0, 0, 0, 3, 1, 1, 0.75, 4, 4096, 6, 0, 4, 0], _ - [869, 'Coward', 'Feigling', 0, 0, 1, 46, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 4, 128, 0, 0, 2, 100], _ - [870, 'Pestilence', 'Pestilenz', 5, 6.5, 2, 24, 0, 22, 1, 10, 0, 0, 2500, 312, 0, 0, 0, 1, 5, 0.75, 0, 0, 0, 0, 60, 0], _ - [871, 'Shadowsong', 'Schattengesang', 15, 19.5, 8, 32, 0, 22, 1, 10, 5, 20, 2500, 30, 0, 0, 0, 1, 1, 0.75, 256, 0, 0, 0, 30, 0], _ - [876, 'Signet_of_Shadows', 'Siegel_der_Schatten', 0, 0, 7, 30, 0, 7, 5, 35, 15, 60, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 30, 0], _ - [877, 'Lyssas_Balance', 'Lyssas_Ausgleich', 5, 6.5, 5, 46, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 15, 0], _ - [878, 'Visions_of_Regret', 'Visionen_des_Bedauerns', 10, 13, 5, 2, 0, 4, 15, 45, 5, 50, 156, 0, 0, 0, 5, 1, 2, 0.75, 4, 0, 0, 0, 20, 0], _ - [879, 'Illusion_of_Pain', 'Illusion_der_Schmerzen', 10, 13, 5, 1, 0, 4, 3, 10, 36, 120, 0, 0, 0, 0, 5, 1, 2, 0.75, 512, 0, 0, 0, 5, 0], _ - [880, 'Stolen_Speed', 'Gestohlene_Eile', 5, 6.5, 5, 0, 0, 4, 200, 200, 50, 50, 156, 0, 0, 0, 5, 1, 1, 0.75, 4, 0, 0, 0, 12, 0], _ - [881, 'Ether_Signet', 'Äther_Siegel', 0, 0, 5, 3, 0, 7, 5, 10, 10, 20, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 45, 0], _ - [882, 'Signet_of_Disenchantment', 'Siegel_der_Entzauberung', 0, 0, 5, 46, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 15, 0], _ - [883, 'Vocal_Minority', 'Stimmminderheit', 10, 13, 4, 7, 0, 4, 0, 0, 0, 0, 240, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 20, 0], _ - [884, 'Searing_Flames', 'Versengende_Flammen', 15, 19.5, 6, 10, 0, 5, 10, 100, 1, 7, 240, 0, 0, 0, 16, 1, 1, 0.75, 4, 0, 0, 0, 2, 0], _ - [885, 'Shield_Guardian', 'Schildwächter', 10, 13, 3, 15, 0, 6, 10, 40, 75, 75, 1000, 10, 0, 0, 0, 1, 1.5, 0.75, 0, 0, 128, 0, 20, 0], _ - [886, 'Restful_Breeze', 'Beruhigender_Hauch', 5, 6.5, 3, 13, 0, 6, 10, 10, 0, 0, 0, 0, 0, 0, 3, 1, 1, 0.75, 0, 0, 0, 0, 8, 0], _ - [887, 'Signet_of_Rejuvenation', 'Siegel_der_Verjüngung', 0, 0, 3, 13, 0, 7, 15, 75, 15, 75, 0, 0, 0, 0, 3, 1, 1, 0.75, 0, 4096, 0, 0, 8, 0], _ - [888, 'Whirling_Axe', 'Wirbelnde_Axt', 0, 0, 1, 18, 0, 14, 5, 20, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 4, 0, 0, 1, 0, 100], _ - [889, 'Forceful_Blow', 'Energischer_Schlag', 0, 0, 1, 19, 0, 14, 10, 30, 5, 20, 0, 0, 0, 0, 5, 1, 0, 0, 4, 0, 0, 16, 0, 120], _ - [891, 'None_Shall_Pass', 'Niemand_darf_vorbei', 5, 6.5, 1, 21, 0, 15, 1, 8, 25, 25, 240, 0, 0, 0, 0, 1, 0, 0, 0, 128, 0, 0, 45, 0], _ - [892, 'Quivering_Blade', 'Zitternde_Klinge', 0, 0, 1, 20, 0, 14, 10, 40, 5, 5, 0, 0, 0, 0, 5, 1, 0, 0, 4, 0, 0, 128, 0, 120], _ - [893, 'Seeking_Arrows', 'Suchende_Pfeile', 15, 19.5, 2, 25, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0.75, 256, 0, 0, 0, 20, 0], _ - [898, 'Overload', 'Überlastung', 5, 6.5, 5, 2, 0, 4, 1, 3, 15, 75, 156, 0, 0, 0, 5, 1, 0.25, 0.75, 512, 0, 0, 0, 5, 0], _ - [899, 'Images_of_Remorse', 'Bilder_der_Reue', 5, 6.5, 5, 1, 0, 4, 1, 3, 10, 52, 0, 0, 0, 0, 5, 1, 2, 0.75, 512, 0, 0, 0, 5, 0], _ - [900, 'Shared_Burden', 'Geteilte_Bürde', 5, 6.5, 5, 1, 0, 4, 50, 50, 0, 0, 240, 0, 0, 0, 5, 1, 2, 0.75, 4, 0, 0, 0, 15, 0], _ - [901, 'Soul_Bind', 'Seelenfessel', 10, 13, 4, 7, 0, 4, 20, 80, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 4, 128, 0, 0, 5, 0], _ - [902, 'Blood_of_the_Aggressor', 'Blut_des_Aggressoren', 5, 6.5, 4, 4, 0, 5, 5, 45, 3, 12, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 32, 0, 5, 0], _ - [903, 'Icy_Prism', 'Eisprisma', 10, 13, 6, 11, 0, 5, 15, 75, 15, 75, 240, 0, 0, 0, 5, 1, 1, 0.75, 1, 0, 0, 0, 5, 0], _ - [904, 'Furious_Axe', 'Zornige_Axt', 5, 6.5, 1, 18, 0, 14, 5, 35, 75, 75, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 1, 6, 0], _ - [905, 'Auspicious_Blow', 'Günstiger_Schlag', 0, 0, 1, 19, 1024, 14, 5, 20, 3, 8, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 16, 0, 120], _ - [906, 'On_Your_Knees', 'Auf_Eure_Knie', 0, 0, 1, 46, 0, 15, 0, 0, 0, 0, 156, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 150], _ - [907, 'Dragon_Slash', 'Drachenhieb', 0, 0, 1, 20, 0, 14, 10, 40, 1, 5, 0, 0, 0, 0, 5, 1, 0, 0, 4, 0, 0, 128, 0, 240], _ - [908, 'Marauders_Shot', 'Plünderer_Schuss', 10, 13, 2, 25, 0, 14, 10, 35, 10, 10, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 2, 6, 0], _ - [909, 'Focused_Shot', 'Scharfschuss', 5, 6.5, 2, 25, 0, 14, 10, 25, 5, 3, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 2, 2, 0], _ - [910, 'Spirit_Rift', 'Geisterriss', 10, 13, 8, 34, 0, 5, 25, 125, 1, 20, 156, 0, 0, 0, 16, 1, 2, 0.75, 0, 0, 0, 0, 5, 0], _ - [911, 'Union', 'Vereinigung', 15, 19.5, 8, 32, 0, 22, 1, 12, 15, 15, 2500, 0, 0, 0, 0, 1, 0.75, 0.75, 256, 0, 0, 0, 45, 0], _ - [913, 'Tranquil_Was_Tanasen', 'Ruhig_war_Tanasen', 10, 13, 8, 33, 0, 24, 10, 25, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0.75, 4, 0, 0, 0, 20, 0], _ - [914, 'Consume_Soul', 'Seele_verzehren', 5, 6.5, 8, 36, 0, 5, 5, 60, 25, 125, 312, 0, 0, 0, 5, 1, 1, 0.75, 4, 0, 0, 0, 5, 0], _ - [915, 'Spirit_Light', 'Geisterlicht', 5, 6.5, 8, 33, 0, 5, 60, 180, 0, 0, 17, 1000, 0, 0, 3, 1, 1, 0.75, 0, 4096, 38, 0, 4, 0], _ - [916, 'Lamentation', 'Wehklage', 10, 13, 8, 34, 0, 4, 0, 3, 10, 50, 240, 0, 0, 0, 5, 1, 1, 0.75, 512, 0, 0, 0, 15, 0], _ - [917, 'Rupture_Soul', 'Seele_zerreißen', 10, 13, 8, 36, 0, 5, 50, 140, 3, 12, 240, 0, 0, 0, 1, 1, 0.75, 0.75, 0, 2, 0, 0, 5, 0], _ - [918, 'Spirit_to_Flesh', 'Geist_zu_Fleisch', 10, 13, 8, 36, 0, 5, 30, 240, 0, 0, 240, 0, 0, 0, 1, 1, 0.75, 0.75, 2, 0, 0, 0, 15, 0], _ - [919, 'Spirit_Burn', 'Geisterbrand', 5, 6.5, 8, 34, 0, 5, 5, 50, 1, 5, 1000, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 6, 0], _ - [920, 'Destruction', 'Vernichtung', 10, 13, 8, 34, 0, 22, 1, 14, 5, 25, 312, 150, 0, 0, 0, 1, 0.75, 0.75, 256, 0, 0, 0, 20, 0], _ - [921, 'Dissonance', 'Missklang', 25, 32.5, 8, 32, 0, 22, 1, 12, 5, 20, 2500, 0, 0, 0, 0, 1, 1, 0.75, 256, 0, 0, 0, 45, 0], _ - [923, 'Disenchantment', 'Entzauberung', 15, 19.5, 8, 32, 0, 22, 1, 12, 5, 20, 2500, 0, 0, 0, 0, 1, 1, 0.75, 256, 0, 0, 0, 30, 0], _ - [925, 'Recall', 'Rückruf', 15, 19.5, 7, 46, 0, 6, 10, 10, 0, 0, 0, 0, 0, 0, 4, 1, 1, 0.75, 0, 0, 0, 0, 10, 0], _ - [926, 'Sharpen_Daggers', 'Dolche_wetzen', 5, 6.5, 7, 35, 0, 6, 5, 15, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 20, 0], _ - [927, 'Shameful_Fear', 'Schändliche_Angst', 10, 13, 7, 30, 0, 4, 10, 10, 5, 20, 0, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 0, 0, 10, 0], _ - [928, 'Shadow_Shroud', 'Schattenschleier', 10, 13, 7, 31, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 4, 0, 0, 0, 20, 0], _ - [929, 'Shadow_of_Haste', 'Schatten_der_Eile', 5, 6.5, 7, 31, 0, 3, 15, 15, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 45, 0], _ - [930, 'Auspicious_Incantation', 'Günstige_Beschwörung', 5, 6.5, 5, 3, 0, 6, 10, 5, 110, 200, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 25, 0], _ - [931, 'Power_Return', 'Kraftrevanche', 5, 6.5, 5, 0, 0, 5, 10, 5, 50, 50, 0, 0, 0, 0, 5, 1, 0.25, 0.75, 0, 0, 1, 0, 7, 0], _ - [932, 'Complicate', 'Erschweren', 10, 13, 5, 2, 0, 5, 8, 8, 5, 12, 312, 0, 0, 0, 5, 1, 0.25, 0.75, 0, 0, 1, 0, 20, 0], _ - [933, 'Shatter_Storm', 'Sturm_zerschlagen', 10, 13, 5, 46, 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 4, 0, 0, 0, 0, 0], _ - [934, 'Unnatural_Signet', 'Unnatürliches_Siegel', 0, 0, 5, 2, 0, 7, 15, 75, 5, 50, 156, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 10, 0], _ - [935, 'Rising_Bile', 'Hochkommende_Galle', 10, 13, 4, 5, 0, 4, 1, 6, 0, 0, 312, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 20, 0], _ - [936, 'Envenom_Enchantments', 'Verzauberungen_vergiften', 5, 6.5, 4, 7, 0, 5, 3, 10, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 20, 0], _ - [937, 'Shockwave', 'Stoßwelle', 10, 13, 6, 9, 0, 5, 15, 60, 156, 156, 240, 312, 0, 0, 0, 1, 1, 0.75, 4, 0, 512, 0, 15, 0], _ - [938, 'Ward_of_Stability', 'Kreis_der_Stabilität', 10, 13, 6, 9, 0, 11, 0, 0, 0, 0, 312, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 30, 0], _ - [939, 'Icy_Shackles', 'Eisfesseln', 10, 13, 6, 11, 0, 4, 66, 66, 90, 90, 0, 0, 0, 0, 5, 1, 1, 0.75, 4, 2048, 0, 0, 12, 0], _ - [941, 'Blessed_Light', 'Gesegnetes_Licht', 10, 13, 3, 16, 0, 5, 10, 140, 0, 0, 0, 0, 0, 0, 3, 1, 0.75, 0.75, 4, 4096, 6150, 0, 3, 0], _ - [942, 'Withdraw_Hexes', 'Verhexungen_zurücknehmen', 15, 19.5, 3, 16, 0, 5, 20, 5, 0, 0, 156, 0, 0, 0, 3, 1, 1, 0.75, 4, 0, 2048, 0, 5, 0], _ - [943, 'Extinguish', 'Löschen', 15, 19.5, 3, 15, 0, 5, 10, 100, 0, 0, 5000, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 4096, 0, 12, 0], _ - [944, 'Signet_of_Strength', 'Siegel_der_Stärke', 0, 0, 1, 17, 0, 7, 1, 16, 5, 5, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 45, 0], _ - [946, 'Trappers_Focus', 'Fokus_des_Fallenstellers', 5, 6.5, 2, 23, 0, 19, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0.75, 260, 0, 0, 0, 12, 0], _ - [947, 'Brambles', 'Dornenranken', 10, 13, 2, 24, 0, 22, 1, 10, 5, 20, 5, 0, 0, 0, 0, 1, 5, 0.75, 256, 0, 0, 0, 60, 0], _ - [948, 'Desperate_Strike', 'Verzweifelter_Stoß', 5, 6.5, 7, 29, 0, 14, 50, 80, 15, 60, 0, 0, 1, 0, 5, 1, 0, 0, 0, 0, 0, 8, 6, 0], _ - [949, 'Way_of_the_Fox', 'Weg_des_Fuchses', 5, 6.5, 7, 31, 0, 6, 1, 6, 0, 0, 0, 0, 0, 0, 0, 1, 0.25, 0.75, 0, 0, 0, 0, 45, 0], _ - [950, 'Shadowy_Burden', 'Schattenbürde', 10, 13, 7, 31, 0, 4, 25, 25, 20, 20, 0, 0, 0, 0, 5, 1, 0.25, 0.75, 0, 0, 0, 0, 15, 0], _ - [951, 'Siphon_Speed', 'Geschwindigkeit_abzapfen', 5, 6.5, 7, 30, 0, 4, 33, 33, 50, 50, 0, 0, 0, 0, 5, 1, 1, 0.75, 8, 0, 0, 0, 30, 0], _ - [952, 'Deaths_Charge', 'Angriff_des_Todes', 5, 6.5, 7, 31, 0, 5, 65, 200, 0, 0, 0, 0, 0, 0, 5, 1, 0.25, 0.75, 0, 0, 0, 0, 30, 0], _ - [953, 'Power_Flux', 'Kraftfluss', 10, 13, 5, 2, 0, 4, 2, 2, 0, 0, 0, 0, 0, 0, 5, 1, 0.25, 0.75, 4, 0, 1, 0, 10, 0], _ - [954, 'Expel_Hexes', 'Verhexungen_vertreiben', 5, 6.5, 5, 46, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 1, 0.75, 4, 0, 2048, 0, 8, 0], _ - [955, 'Rip_Enchantment', 'Verzauberung_zerreißen', 5, 6.5, 4, 7, 0, 5, 1, 1, 5, 25, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 32, 0, 15, 0], _ - [957, 'Spell_Shield', 'Zauberschild', 10, 13, 3, 16, 0, 6, 10, 5, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0.75, 0, 0, 0, 0, 30, 0], _ - [958, 'Healing_Whisper', 'Heilendes_Geflüster', 5, 6.5, 3, 13, 0, 5, 40, 100, 0, 0, 0, 0, 0, 0, 4, 1, 1, 0.75, 8, 4096, 6, 0, 1, 0], _ - [959, 'Ethereal_Light', 'Ätherisches_Licht', 5, 6.5, 3, 13, 0, 5, 25, 100, 0, 0, 0, 0, 0, 0, 3, 1, 1, 0.75, 32, 4096, 6, 0, 5, 0], _ - [960, 'Release_Enchantments', 'Verzauberungen_freisetzen', 5, 6.5, 3, 16, 0, 5, 5, 35, 0, 0, 5000, 0, 0, 0, 0, 1, 1, 0.75, 0, 4096, 8192, 0, 5, 0], _ - [961, 'Lacerate', 'Zerfetzen', 10, 13, 2, 22, 0, 22, 1, 10, 5, 25, 2, 90, 0, 0, 0, 1, 3, 0.75, 260, 0, 0, 0, 15, 0], _ - [962, 'Spirit_Transfer', 'Geistübertragung', 10, 13, 8, 33, 0, 5, 5, 50, 5, 5, 1000, 0, 0, 0, 3, 1, 0.25, 0.75, 0, 0, 0, 0, 5, 0], _ - [963, 'Restoration', 'Wiederherstellung', 10, 13, 8, 32, 0, 22, 1, 14, 5, 50, 312, 0, 0, 0, 0, 1, 1, 0.75, 2304, 0, 8, 0, 30, 0], _ - [964, 'Vengeful_Weapon', 'Rachsüchtige_Waffe', 5, 6.5, 8, 33, 0, 25, 15, 60, 0, 0, 0, 0, 0, 0, 3, 1, 0.25, 0.75, 0, 0, 6, 0, 3, 0], _ - [973, 'Blinding_Powder', 'Blendpulver', 5, 6.5, 7, 31, 0, 5, 3, 15, 0, 0, 156, 0, 0, 4, 5, 1, 0.25, 0.75, 0, 0, 0, 0, 20, 0], _ - [974, 'Mantis_Touch', 'Berührung_der_Mantis', 5, 6.5, 7, 30, 0, 5, 5, 20, 0, 0, 0, 0, 2, 2, 5, 1, 0.75, 0.75, 0, 0, 512, 0, 15, 0], _ - [975, 'Exhausting_Assault', 'Ermüdender_Angriff', 5, 6.5, 7, 29, 0, 14, 0, 0, 0, 0, 0, 0, 3, 2, 5, 1, 0.5, 0, 32768, 0, 0, 8, 8, 0], _ - [976, 'Repeating_Strike', 'Wiederholender_Schlag', 5, 6.5, 7, 29, 0, 14, 10, 30, 15, 15, 0, 0, 2, 4, 5, 1, 0, 0, 0, 0, 0, 8, 0, 0], _ - [977, 'Way_of_the_Lotus', 'Weg_des_Lotus', 5, 6.5, 7, 31, 0, 6, 5, 20, 0, 0, 0, 0, 0, 0, 0, 1, 0.25, 0.75, 0, 0, 0, 0, 20, 0], _ - [978, 'Mark_of_Instability', 'Zeichen_der_Unbeständigkeit', 10, 13, 7, 46, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 0.25, 0.75, 0, 0, 0, 0, 20, 0], _ - [979, 'Mistrust', 'Argwohn', 10, 13, 5, 2, 0, 4, 10, 100, 0, 0, 240, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 0, 0, 12, 0], _ - [980, 'Feast_of_Souls', 'Schmaus_der_Seelen', 10, 13, 8, 36, 0, 5, 50, 100, 0, 0, 240, 0, 0, 0, 0, 1, 0.25, 0.75, 0, 0, 0, 0, 10, 0], _ - [981, 'Recuperation', 'Erholung', 25, 32.5, 8, 33, 0, 22, 1, 14, 1, 3, 2500, 0, 0, 0, 0, 1, 0.75, 0.75, 256, 0, 0, 0, 45, 0], _ - [982, 'Shelter', 'Unterschlupf', 25, 32.5, 8, 32, 0, 22, 1, 12, 75, 45, 10, 0, 0, 0, 0, 1, 1, 0.75, 256, 0, 0, 0, 45, 0], _ - [983, 'Weapon_of_Shadow', 'Schattenwaffe', 10, 13, 8, 33, 0, 25, 5, 5, 1, 3, 0, 0, 0, 0, 3, 1, 1, 0.75, 0, 0, 0, 0, 20, 0], _ - [985, 'Caltrops', 'Trittnägel', 10, 13, 7, 31, 0, 5, 5, 15, 0, 0, 156, 0, 0, 0, 5, 1, 0.25, 0.75, 8, 0, 0, 0, 10, 0], _ - [986, 'Nine_Tail_Strike', 'Neunschwänziger_Stoß', 5, 6.5, 7, 29, 0, 14, 15, 40, 0, 0, 0, 0, 3, 4, 5, 1, 0, 0, 32768, 0, 0, 8, 8, 0], _ - [987, 'Way_of_the_Empty_Palm', 'Weg_der_leeren_Handfläche', 5, 6.5, 7, 30, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0.25, 0.75, 4, 0, 0, 0, 10, 0], _ - [988, 'Temple_Strike', 'Schläfenstoß', 15, 19.5, 7, 29, 0, 14, 0, 0, 0, 0, 0, 0, 2, 2, 5, 1, 0, 0, 4, 514, 0, 8, 20, 0], _ - [989, 'Golden_Phoenix_Strike', 'Goldener_Phönix_Stoß', 5, 6.5, 7, 29, 0, 14, 10, 30, 10, 30, 156, 0, 2, 0, 5, 1, 0, 0, 0, 0, 0, 8, 8, 0], _ - [990, 'Expunge_Enchantments', 'Verzauberungen_ausmerzen', 10, 13, 7, 30, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 0.75, 0.75, 2, 0, 0, 0, 30, 0], _ - [991, 'Deny_Hexes', 'Verhexungen_zurückweisen', 5, 6.5, 3, 16, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 1, 0.75, 0, 0, 2048, 0, 12, 0], _ - [992, 'Triple_Chop', 'Dreifachhieb', 5, 6.5, 1, 18, 0, 14, 10, 40, 0, 0, 156, 0, 0, 0, 5, 1, 0, 0, 4, 0, 0, 1, 10, 0], _ - [993, 'Enraged_Smash', 'Erzürnter_Schlag', 5, 6.5, 1, 19, 0, 14, 1, 4, 10, 40, 0, 0, 0, 0, 5, 1, 0, 0, 4, 0, 0, 16, 5, 0], _ - [994, 'Renewing_Smash', 'Erneuernder_Schlag', 5, 6.5, 1, 19, 0, 14, 10, 40, 3, 3, 0, 0, 0, 0, 5, 1, 1, 0, 0, 0, 0, 16, 30, 0], _ - [995, 'Tiger_Stance', 'Tigerhaltung', 5, 6.5, 1, 17, 0, 3, 33, 33, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 32768, 0, 20, 0], _ - [996, 'Standing_Slash', 'Stehender_Hieb', 0, 0, 1, 20, 0, 14, 5, 20, 5, 20, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 128, 0, 140], _ - [997, 'Famine', 'Hungersnot', 10, 13, 2, 24, 0, 22, 1, 10, 10, 35, 5, 0, 0, 0, 0, 1, 3, 0.75, 260, 0, 0, 0, 15, 0], _ - [1018, 'Critical_Eye', 'Kritisches_Auge', 5, 6.5, 7, 35, 0, 16, 3, 15, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0.75, 0, 0, 0, 0, 30, 0], _ - [1019, 'Critical_Strike', 'Kritischer_Stoß', 5, 6.5, 7, 35, 0, 14, 10, 30, 1, 3, 0, 0, 3, 4, 5, 1, 0, 0, 32768, 0, 0, 8, 6, 0], _ - [1020, 'Blades_of_Steel', 'Stahlklingen', 5, 6.5, 7, 29, 0, 14, 5, 16, 60, 60, 0, 0, 3, 4, 5, 1, 0, 0, 32768, 0, 0, 8, 8, 0], _ - [1021, 'Jungle_Strike', 'Dschungelschlag', 5, 6.5, 7, 29, 0, 14, 10, 25, 1, 31, 156, 0, 2, 2, 5, 1, 0.5, 0, 0, 0, 0, 8, 10, 0], _ - [1022, 'Wild_Strike', 'Wilder_Stoß', 5, 6.5, 7, 29, 0, 14, 10, 35, 0, 0, 0, 0, 2, 2, 5, 1, 0, 0, 0, 0, 0, 8, 4, 0], _ - [1023, 'Leaping_Mantis_Sting', 'Stich_der_springenden_Mantis', 5, 6.5, 7, 29, 0, 14, 5, 15, 3, 15, 0, 0, 1, 0, 5, 1, 0.5, 0, 0, 0, 0, 8, 8, 0], _ - [1024, 'Black_Mantis_Thrust', 'Stoß_der_schwarzen_Mantis', 5, 6.5, 7, 29, 0, 14, 8, 20, 3, 15, 0, 0, 1, 0, 5, 1, 1, 0, 0, 8, 0, 8, 6, 0], _ - [1025, 'Disrupting_Stab', 'Unterbrechender_Dolchstoß', 5, 6.5, 7, 29, 0, 14, 3, 10, 0, 0, 0, 0, 1, 0, 5, 1, 0, 0, 0, 0, 1, 8, 10, 0], _ - [1026, 'Golden_Lotus_Strike', 'Goldener_Lotus_Stoß', 5, 6.5, 7, 29, 0, 14, 5, 20, 5, 8, 0, 0, 1, 0, 5, 1, 0, 0, 0, 0, 0, 8, 5, 0], _ - [1027, 'Critical_Defenses', 'Kritische_Verteidigungen', 10, 13, 7, 35, 0, 6, 75, 75, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 128, 0, 30, 0], _ - [1028, 'Way_of_Perfection', 'Weg_der_Perfektion', 5, 6.5, 7, 31, 0, 6, 10, 40, 0, 0, 0, 0, 0, 0, 0, 1, 0.25, 0.75, 0, 0, 0, 0, 30, 0], _ - [1029, 'Dark_Apostasy', 'Dunkle_Abtrünnigkeit', 10, 13, 7, 35, 0, 6, 10, 4, 0, 0, 0, 0, 0, 0, 0, 1, 0.25, 0.75, 4, 0, 0, 0, 15, 0], _ - [1030, 'Locusts_Fury', 'Wut_der_Heuschrecke', 10, 13, 7, 35, 0, 6, 50, 50, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0.75, 4, 0, 0, 0, 10, 0], _ - [1031, 'Shroud_of_Distress', 'Schleier_des_Kummers', 10, 13, 7, 31, 0, 6, 3, 8, 75, 75, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 45, 0], _ - [1032, 'Heart_of_Shadow', 'Herz_der_Schatten', 5, 6.5, 7, 31, 0, 5, 30, 150, 0, 0, 312, 800, 0, 0, 1, 1, 0.25, 0, 0, 0, 0, 0, 15, 0], _ - [1033, 'Impale', 'Aufspießen', 5, 6.5, 7, 30, 0, 10, 25, 100, 5, 20, 0, 0, 0, 1, 5, 1, 1, 0.75, 0, 0, 0, 0, 15, 0], _ - [1034, 'Seeping_Wound', 'Eiternde_Wunde', 15, 19.5, 7, 35, 0, 4, 33, 33, 5, 25, 0, 0, 0, 0, 5, 1, 0.25, 0.75, 12, 0, 0, 0, 12, 0], _ - [1035, 'Assassins_Promise', 'Versprechen_des_Assassinen', 5, 6.5, 7, 30, 0, 4, 5, 20, 0, 0, 0, 0, 0, 0, 5, 1, 0.75, 0.75, 4, 0, 0, 0, 45, 0], _ - [1036, 'Signet_of_Malice', 'Siegel_der_Bosheit', 0, 0, 7, 46, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 0.25, 0.75, 0, 0, 4096, 0, 5, 0], _ - [1037, 'Dark_Escape', 'Dunkle_Flucht', 5, 6.5, 7, 31, 0, 3, 25, 25, 50, 50, 0, 0, 0, 0, 0, 1, 0, 0.75, 0, 0, 0, 0, 30, 0], _ - [1038, 'Crippling_Dagger', 'Verkrüppelnder_Dolch', 5, 6.5, 7, 30, 0, 5, 15, 60, 3, 15, 0, 0, 0, 0, 5, 1, 1, 0.75, 8, 0, 0, 0, 5, 0], _ - [1040, 'Spirit_Walk', 'Geistermarsch', 5, 6.5, 7, 46, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0.25, 0, 0, 0, 0, 0, 8, 0], _ - [1041, 'Unseen_Fury', 'Unsichtbare_Wut', 5, 6.5, 7, 31, 0, 3, 0, 0, 3, 10, 156, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 20, 0], _ - [1042, 'Flashing_Blades', 'Blitzende_Klingen', 10, 13, 7, 29, 0, 3, 75, 75, 5, 20, 0, 0, 0, 0, 0, 1, 0, 0, 4, 0, 128, 0, 30, 0], _ - [1043, 'Dash', 'Preschen', 5, 6.5, 7, 46, 0, 3, 50, 50, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 8, 0], _ - [1044, 'Dark_Prison', 'Dunkles_Gefängnis', 10, 13, 7, 30, 0, 4, 33, 33, 0, 0, 0, 0, 0, 0, 5, 1, 0.25, 0.75, 0, 0, 0, 0, 30, 0], _ - [1045, 'Palm_Strike', 'Handflächenschlag', 5, 6.5, 7, 35, 0, 10, 10, 65, 1, 5, 0, 0, 2, 0, 5, 1, 0.75, 0.75, 6, 0, 512, 0, 7, 0], _ - [1048, 'Revealed_Enchantment', 'Enthüllte_Verzauberung', 10, 13, 5, 3, 0, 5, 3, 15, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 256, 0, 0, 0], _ - [1049, 'Revealed_Hex', 'Enthüllte_Verhexung', 5, 6.5, 5, 3, 0, 5, 4, 10, 0, 0, 0, 0, 0, 0, 3, 1, 1, 0.75, 0, 0, 2304, 0, 0, 0], _ - [1052, 'Accumulated_Pain', 'Angehäufter_Schmerz', 5, 6.5, 5, 1, 0, 5, 15, 75, 2, 2, 0, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 0, 0, 12, 0], _ - [1053, 'Psychic_Distraction', 'Übernatürliche_Ablenkung', 10, 13, 5, 2, 0, 5, 8, 8, 5, 12, 312, 0, 0, 0, 5, 1, 0.25, 0.75, 4, 0, 1, 0, 2, 0], _ - [1054, 'Ancestors_Visage', 'Antlitz_des_Ahnen', 10, 13, 5, 1, 0, 6, 3, 3, 0, 0, 156, 0, 0, 0, 3, 1, 1, 0.75, 0, 0, 0, 0, 20, 0], _ - [1055, 'Recurring_Insecurity', 'Wiederkehrende_Unsicherheit', 10, 13, 5, 1, 0, 4, 1, 5, 0, 0, 240, 0, 0, 0, 5, 1, 1, 0.75, 516, 0, 0, 0, 10, 0], _ - [1056, 'Kitahs_Burden', 'Kitahs_Bürde', 15, 19.5, 5, 1, 0, 4, 50, 50, 10, 18, 0, 0, 0, 0, 5, 1, 1.5, 0.75, 0, 0, 0, 0, 30, 0], _ - [1057, 'Psychic_Instability', 'Übernatürliche_Labilität', 5, 6.5, 5, 0, 0, 5, 2, 4, 0, 0, 240, 0, 0, 0, 5, 1, 0.25, 0.75, 68, 0, 0, 0, 12, 0], _ - [1059, 'Hex_Eater_Signet', 'Verhexungsfresser_Siegel', 0, 0, 5, 3, 0, 7, 2, 5, 1, 4, 156, 0, 0, 0, 3, 1, 1, 0.75, 2, 0, 2048, 0, 25, 0], _ - [1061, 'Feedback', 'Reaktion', 10, 13, 5, 3, 0, 5, 4, 10, 0, 0, 0, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 0, 0, 30, 0], _ - [1062, 'Arcane_Larceny', 'Arkane_Entwendung', 10, 13, 5, 2, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 0, 0], _ - [1066, 'Spoil_Victor', 'Sieger_plündern', 10, 13, 4, 4, 0, 4, 25, 100, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 4, 0, 0, 0, 10, 0], _ - [1067, 'Lifebane_Strike', 'Lebensfluchstoß', 10, 13, 4, 4, 0, 5, 12, 48, 12, 48, 0, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 0, 0, 15, 0], _ - [1068, 'Bitter_Chill', 'Bitterkalt', 5, 6.5, 4, 5, 0, 5, 15, 60, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 10, 0], _ - [1069, 'Taste_of_Pain', 'Geschmack_der_Schmerzen', 5, 6.5, 4, 5, 0, 5, 50, 50, 30, 150, 0, 0, 0, 0, 5, 1, 0.25, 0.75, 0, 0, 0, 0, 10, 0], _ - [1070, 'Defile_Enchantments', 'Verzauberungen_schänden', 10, 13, 4, 7, 0, 5, 6, 60, 4, 20, 240, 0, 0, 0, 16, 1, 2, 0.75, 0, 0, 0, 0, 15, 0], _ - [1071, 'Shivers_of_Dread', 'Angstschauer', 10, 13, 4, 7, 0, 4, 10, 5, 0, 0, 0, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 0, 0, 15, 0], _ - [1075, 'Vampiric_Swarm', 'Vampirschwarm', 15, 19.5, 4, 4, 0, 5, 15, 60, 0, 0, 312, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 0, 0, 8, 0], _ - [1076, 'Blood_Drinker', 'Bluttrinker', 5, 6.5, 4, 4, 0, 5, 20, 65, 50, 50, 0, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 0, 0, 8, 0], _ - [1077, 'Vampiric_Bite', 'Vampirbiss', 15, 19.5, 4, 4, 0, 10, 29, 74, 0, 0, 0, 0, 0, 0, 5, 1, 0.75, 0.75, 2, 0, 4, 0, 2, 0], _ - [1078, 'Wallows_Bite', 'Wälzerbiss', 1, 1.3, 4, 4, 0, 10, 10, 10, 20, 58, 0, 0, 0, 0, 5, 1, 0.75, 0.75, 2, 0, 544, 0, 3, 0], _ - [1079, 'Enfeebling_Touch', 'Schwächende_Berührung', 5, 6.5, 4, 7, 0, 10, 5, 50, 5, 20, 0, 0, 0, 0, 5, 1, 0.75, 0.75, 2, 0, 512, 0, 5, 0], _ - [1081, 'Teinais_Wind', 'Teinais_Wind', 5, 6.5, 6, 8, 0, 5, 10, 40, 40, 80, 156, 0, 0, 0, 5, 1, 1, 0.75, 0, 128, 0, 0, 8, 0], _ - [1082, 'Shock_Arrow', 'Schockpfeil', 5, 6.5, 6, 8, 0, 5, 5, 50, 5, 5, 2400, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 8, 0], _ - [1083, 'Unsteady_Ground', 'Schwankender_Boden', 10, 13, 6, 9, 0, 5, 10, 40, 0, 0, 240, 0, 0, 0, 16, 1, 2, 0.75, 4, 128, 0, 0, 15, 0], _ - [1084, 'Sliver_Armor', 'Splitter_Rüstung', 10, 13, 6, 9, 0, 6, 25, 50, 5, 35, 240, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 128, 0, 30, 0], _ - [1085, 'Ash_Blast', 'Aschenexplosion', 5, 6.5, 6, 9, 0, 4, 35, 65, 20, 75, 156, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 15, 0], _ - [1086, 'Dragon_s_Stomp', 'Drachenstampfer', 25, 32.5, 6, 9, 0, 5, 26, 100, 0, 0, 240, 0, 0, 0, 16, 1, 3, 0.75, 1, 128, 0, 0, 15, 0], _ - [1088, 'Second_Wind', 'Zweite_Chance', 5, 6.5, 6, 46, 0, 5, 1, 1, 5, 5, 0, 0, 0, 0, 0, 1, 1, 0.75, 5, 0, 256, 0, 5, 0], _ - [1090, 'Smoldering_Embers', 'Glühende_Kohle', 10, 13, 6, 10, 0, 4, 10, 70, 5, 25, 156, 0, 0, 0, 5, 1, 1.5, 0.75, 0, 0, 0, 0, 7, 0], _ - [1091, 'Double_Dragon', 'Doppeldrache', 5, 6.5, 6, 10, 0, 6, 0, 3, 5, 30, 240, 156, 0, 0, 1, 1, 1, 0.75, 4, 0, 0, 0, 20, 0], _ - [1093, 'Teinais_Heat', 'Teinais_Hitze', 15, 19.5, 6, 10, 0, 11, 2, 5, 33, 33, 312, 0, 0, 0, 0, 1, 1, 0.75, 0, 4, 0, 0, 20, 0], _ - [1094, 'Breath_of_Fire', 'Feueratem', 5, 6.5, 6, 10, 0, 5, 10, 40, 0, 0, 156, 0, 0, 0, 16, 1, 2, 0.75, 1, 0, 0, 0, 10, 0], _ - [1095, 'Star_Burst', 'Sternenexplosion', 5, 6.5, 6, 10, 0, 5, 7, 112, 1, 4, 312, 2, 0, 0, 5, 1, 0.75, 0.75, 6, 0, 0, 0, 7, 0], _ - [1096, 'Glyph_of_Essence', 'Glyphe_der_Essenz', 5, 6.5, 6, 46, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 20, 0], _ - [1097, 'Teinais_Prison', 'Teinais_Gefängnis', 10, 13, 6, 11, 0, 4, 66, 66, 5, 9, 0, 0, 0, 0, 5, 1, 1, 0.75, 512, 2048, 0, 0, 15, 0], _ - [1098, 'Mirror_of_Ice', 'Eisspiegel', 15, 19.5, 6, 11, 0, 4, 15, 70, 66, 66, 240, 50, 0, 0, 1, 1, 0.75, 0.75, 4, 0, 0, 0, 15, 0], _ - [1099, 'Teinais_Crystals', 'Teinais_Kristalle', 15, 19.5, 6, 9, 0, 5, 20, 40, 20, 40, 240, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 512, 0, 8, 0], _ - [1113, 'Kirins_Wrath', 'Kirins_Zorn', 5, 6.5, 3, 14, 0, 5, 8, 32, 0, 0, 156, 0, 0, 0, 0, 1, 2, 0.75, 0, 0, 512, 0, 30, 0], _ - [1114, 'Spirit_Bond', 'Geisterbindung', 10, 13, 3, 15, 0, 6, 50, 50, 30, 90, 10, 0, 0, 0, 3, 1, 0.25, 0.75, 0, 0, 0, 0, 2, 0], _ - [1115, 'Air_of_Enchantment', 'Flair_der_Verzauberung', 5, 6.5, 3, 15, 0, 6, 5, 5, 1, 1, 0, 0, 0, 0, 4, 1, 0.25, 0.75, 4, 0, 0, 0, 8, 0], _ - [1117, 'Heavens_Delight', 'Himmlische_Wonne', 5, 6.5, 3, 16, 0, 5, 15, 60, 0, 0, 1000, 0, 0, 0, 0, 1, 1, 0.75, 0, 4096, 6, 0, 12, 0], _ - [1118, 'Healing_Burst', 'Heilsalve', 5, 6.5, 3, 13, 0, 5, 10, 160, 0, 0, 1000, 0, 0, 0, 3, 1, 0.75, 0.75, 4, 4096, 6, 0, 4, 0], _ - [1119, 'Kareis_Healing_Circle', 'Kareis_Heilkreis', 10, 13, 3, 13, 0, 5, 30, 180, 0, 0, 156, 0, 0, 0, 0, 1, 1, 0.75, 0, 4096, 6, 0, 5, 0], _ - [1120, 'Jameis_Gaze', 'Jameis_Starren', 10, 13, 3, 13, 0, 5, 35, 180, 0, 0, 0, 0, 0, 0, 4, 1, 0.75, 0.75, 0, 4096, 2, 0, 3, 0], _ - [1121, 'Gift_of_Health', 'Geschenk_des_Lebens', 5, 6.5, 3, 13, 0, 5, 15, 150, 10, 5, 0, 0, 0, 0, 4, 1, 0.75, 0.75, 0, 4096, 2, 0, 5, 0], _ - [1123, 'Life_Sheath', 'Lebensmantel', 5, 6.5, 3, 15, 0, 6, 0, 2, 20, 100, 0, 0, 0, 0, 3, 1, 0.25, 0.75, 4, 0, 0, 0, 2, 0], _ - [1126, 'Empathic_Removal', 'Ausdrückliche_Entfernung', 5, 6.5, 3, 46, 0, 5, 50, 50, 0, 0, 0, 0, 0, 0, 4, 1, 1, 0.75, 4, 0, 6144, 0, 7, 0], _ - [1128, 'Resurrection_Chant', 'Gesang_der_Wiederbelebung', 10, 13, 3, 13, 0, 5, 5, 35, 0, 0, 0, 0, 0, 0, 6, 1, 6, 0.75, 2056, 0, 8, 0, 15, 0], _ - [1129, 'Word_of_Censure', 'Wort_des_Tadels', 10, 13, 3, 14, 0, 5, 15, 75, 20, 20, 33, 0, 0, 0, 5, 1, 1, 0.75, 4, 0, 0, 0, 2, 0], _ - [1130, 'Spear_of_Light', 'Speer_des_Lichts', 5, 6.5, 3, 14, 0, 5, 26, 56, 15, 60, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 15, 0], _ - [1131, 'Stonesoul_Strike', 'Steinseelenschlag', 5, 6.5, 3, 14, 0, 10, 10, 55, 10, 55, 0, 0, 0, 0, 5, 1, 0.75, 0.75, 2, 0, 0, 0, 8, 0], _ - [1133, 'Drunken_Blow', 'Betrunkener_Schlag', 5, 6.5, 1, 21, 0, 14, 10, 40, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 0, 25, 65536, 185, 7, 0], _ - [1134, 'Leviathans_Sweep', 'Leviathanschlag', 5, 6.5, 1, 17, 0, 14, 5, 20, 10, 34, 0, 0, 0, 0, 5, 1, 0, 0, 0, 128, 0, 185, 8, 0], _ - [1135, 'Jaizhenju_Strike', 'Jaizhenjuschlag', 5, 6.5, 1, 20, 0, 14, 1, 30, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 128, 8, 0], _ - [1136, 'Penetrating_Chop', 'Durchdringender_Hieb', 0, 0, 1, 18, 0, 14, 5, 20, 20, 20, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 1, 0, 120], _ - [1137, 'Yeti_Smash', 'Yetischlag', 0, 0, 1, 19, 0, 14, 5, 20, 5, 50, 156, 0, 0, 0, 5, 1, 0, 0, 64, 0, 0, 16, 0, 150], _ - [1141, 'You_Will_Die', 'Ihr_werdet_sterben', 5, 6.5, 1, 17, 0, 15, 50, 50, 1, 3, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 0, 15, 0], _ - [1142, 'Auspicious_Parry', 'Günstige_Abwehr', 0, 0, 1, 21, 0, 3, 1, 4, 50, 50, 0, 0, 0, 0, 0, 1, 0, 0, 4, 0, 128, 0, 2, 25], _ - [1144, 'Silverwing_Slash', 'Silberflügel_Hieb', 0, 0, 1, 20, 0, 14, 1, 40, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 128, 0, 200], _ - [1146, 'Shove', 'Schubs', 5, 6.5, 1, 21, 0, 10, 15, 75, 0, 0, 0, 0, 0, 0, 5, 1, 0.75, 0, 6, 0, 0, 0, 15, 0], _ - [1191, 'Sundering_Attack', 'Trennender_Angriff', 10, 13, 2, 25, 0, 14, 5, 25, 10, 10, 0, 0, 0, 0, 5, 1, 0.75, 0.600000023841858, 0, 0, 0, 2, 4, 0], _ - [1192, 'Zojuns_Shot', 'Zojuns_Schuss', 5, 6.5, 2, 23, 0, 14, 10, 40, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 8, 0, 0, 2, 3, 0], _ - [1194, 'Predatory_Bond', 'Raubtierverbindung', 10, 13, 2, 22, 0, 15, 1, 31, 25, 25, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 30, 0], _ - [1195, 'Heal_as_One', 'Gemeinsame_Heilung', 5, 6.5, 2, 22, 0, 10, 1, 20, 20, 104, 50, 0, 0, 0, 0, 1, 1, 0, 4, 0, 4, 0, 5, 0], _ - [1196, 'Zojuns_Haste', 'Zojuns_Eile', 5, 6.5, 2, 23, 0, 3, 27, 75, 33, 33, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 30, 0], _ - [1197, 'Needling_Shot', 'Nadelschuss', 5, 6.5, 2, 25, 0, 14, 50, 50, 10, 30, 4800, 0, 0, 0, 5, 1, 0.75, 0.600000023841858, 0, 0, 0, 2, 4, 0], _ - [1198, 'Broad_Head_Arrow', 'Stahlspitzenpfeil', 15, 19.5, 2, 25, 0, 14, 1800, 1800, 0, 0, 800, 0, 0, 0, 5, 1, 0, 0, 4, 0, 0, 2, 15, 0], _ - [1199, 'Glass_Arrows', 'Glaspfeile', 5, 6.5, 2, 23, 0, 19, 5, 20, 10, 20, 0, 0, 0, 0, 0, 1, 2, 0.75, 260, 0, 0, 0, 12, 0], _ - [1200, 'Archers_Signet', 'Siegel_des_Bogenschützen', 0, 0, 2, 23, 0, 7, 100, 100, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0.75, 4, 0, 0, 0, 12, 0], _ - [1201, 'Savage_Pounce', 'Wilder_Sprung', 5, 6.5, 2, 22, 0, 20, 5, 20, 0, 0, 5000, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 10, 0], _ - [1202, 'Enraged_Lunge', 'Erzürnter_Ausfall', 5, 6.5, 2, 22, 0, 20, 10, 50, 0, 0, 5000, 0, 0, 0, 0, 1, 0, 0.75, 4, 0, 0, 0, 5, 0], _ - [1203, 'Bestial_Mauling', 'Bestienattacke', 5, 6.5, 2, 22, 0, 20, 5, 20, 0, 0, 5000, 0, 0, 0, 0, 1, 0, 0.75, 0, 0, 0, 0, 20, 0], _ - [1205, 'Poisonous_Bite', 'Giftbiss', 5, 6.5, 2, 22, 0, 20, 0, 0, 0, 0, 5000, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 7, 0], _ - [1206, 'Pounce', 'Sprung', 5, 6.5, 2, 22, 0, 20, 5, 20, 0, 0, 5000, 0, 0, 0, 0, 1, 0, 0.75, 0, 0, 0, 0, 20, 0], _ - [1209, 'Bestial_Fury', 'Bestienwut', 10, 13, 2, 22, 0, 3, 25, 25, 5, 5, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 32768, 0, 10, 0], _ - [1211, 'Vipers_Nest', 'Vipernnest', 10, 13, 2, 22, 0, 21, 5, 35, 5, 20, 156, 240, 0, 0, 0, 1, 2, 0.75, 288, 256, 0, 0, 20, 0], _ - [1212, 'Equinox', 'Tagundnachtgleiche', 10, 13, 2, 24, 0, 22, 1, 10, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0.75, 260, 0, 0, 0, 15, 0], _ - [1213, 'Tranquility', 'Ruhe', 15, 19.5, 2, 24, 0, 22, 1, 10, 20, 50, 2500, 0, 0, 0, 0, 1, 5, 0.75, 256, 0, 0, 0, 60, 0], _ - [1215, 'Clamor_of_Souls', 'Gezeter_der_Seelen', 10, 13, 8, 34, 0, 5, 10, 65, 10, 10, 240, 1000, 0, 0, 5, 1, 1, 0.75, 4, 0, 0, 0, 8, 0], _ - [1217, 'Ritual_Lord', 'Herr_der_Rituale', 0, 0, 8, 36, 0, 16, 10, 60, 2, 4, 0, 0, 0, 0, 0, 1, 0, 0.75, 4, 0, 0, 0, 45, 0], _ - [1218, 'Cruel_Was_Daoshen', 'Grausam_war_Daoshen', 15, 19.5, 8, 34, 0, 24, 15, 85, 10, 10, 240, 10, 0, 0, 0, 1, 2, 0.75, 0, 0, 512, 0, 30, 0], _ - [1219, 'Protective_Was_Kaolai', 'Schützend_war_Kaolai', 10, 13, 8, 33, 0, 24, 10, 10, 10, 85, 5000, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 25, 0], _ - [1220, 'Attuned_Was_Songkai', 'Eingestimmt_war_Songkai', 10, 13, 8, 36, 0, 24, 5, 50, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0.75, 4, 0, 0, 0, 60, 0], _ - [1221, 'Resilient_Was_Xiko', 'Unverwüstlich_war_Xiko', 5, 6.5, 8, 33, 0, 24, 3, 3, 1, 4, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 10, 0], _ - [1222, 'Lively_Was_Naomei', 'Lebhaft_war_Naomei', 15, 19.5, 8, 33, 0, 24, 15, 75, 0, 0, 312, 0, 0, 0, 0, 1, 6, 0.75, 2048, 0, 8, 0, 20, 0], _ - [1223, 'Anguished_Was_Lingwah', 'Gequält_war_Lingwah', 5, 6.5, 8, 36, 0, 24, 1, 5, 33, 33, 0, 0, 0, 0, 0, 1, 2, 0.75, 0, 0, 0, 0, 30, 0], _ - [1224, 'Draw_Spirit', 'Geist_entziehen', 5, 6.5, 8, 46, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0.25, 0.75, 0, 0, 0, 0, 5, 0], _ - [1225, 'Channeled_Strike', 'Gelenkter_Schlag', 10, 13, 8, 34, 0, 5, 5, 95, 5, 35, 0, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 0, 0, 4, 0], _ - [1226, 'Spirit_Boon_Strike', 'Geistersegenstoß', 5, 6.5, 8, 34, 0, 5, 20, 65, 20, 65, 1000, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 3, 0], _ - [1227, 'Essence_Strike', 'Essenzschlag', 5, 6.5, 8, 34, 0, 5, 15, 60, 1, 9, 1000, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 256, 0, 8, 0], _ - [1228, 'Spirit_Siphon', 'Geist_abzapfen', 5, 6.5, 8, 34, 0, 5, 15, 50, 0, 0, 0, 0, 0, 0, 0, 1, 0.25, 0.75, 0, 0, 0, 0, 3, 0], _ - [1229, 'Explosive_Growth', 'Explosives_Wachstum', 5, 6.5, 8, 36, 0, 6, 20, 65, 5, 5, 240, 0, 0, 0, 0, 1, 2, 0.75, 0, 0, 0, 0, 45, 0], _ - [1230, 'Boon_of_Creation', 'Segen_der_Schöpfung', 10, 13, 8, 36, 0, 6, 5, 50, 1, 6, 0, 0, 0, 0, 0, 1, 2, 0.75, 0, 0, 0, 0, 45, 0], _ - [1231, 'Spirit_Channeling', 'Geisterlenkung', 5, 6.5, 8, 36, 0, 6, 1, 6, 3, 12, 1000, 5, 0, 0, 0, 1, 1, 0.75, 4, 0, 256, 0, 30, 0], _ - [1232, 'Armor_of_Unfeeling', 'Rüstung_der_Gefühllosigkeit', 5, 6.5, 8, 32, 0, 10, 50, 50, 0, 0, 1000, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 20, 0], _ - [1233, 'Soothing_Memories', 'Beruhigende_Erinnerungen', 5, 6.5, 8, 33, 0, 5, 10, 100, 3, 3, 0, 0, 0, 0, 3, 1, 0.75, 0.75, 0, 4096, 6, 0, 4, 0], _ - [1234, 'Mend_Body_and_Soul', 'Körper_und_Seele_heilen', 5, 6.5, 8, 33, 0, 5, 20, 115, 0, 0, 1000, 0, 0, 0, 3, 1, 0.75, 0.75, 0, 4096, 4102, 0, 3, 0], _ - [1235, 'Dulled_Weapon', 'Stumpfe_Waffe', 15, 19.5, 8, 32, 0, 4, 1, 15, 0, 0, 156, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 20, 0], _ - [1236, 'Binding_Chains', 'Fesselnde_Ketten', 10, 13, 8, 32, 0, 4, 90, 90, 1, 30, 240, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 15, 0], _ - [1237, 'Painful_Bond', 'Schmerzhafte_Bindung', 15, 19.5, 8, 34, 0, 4, 8, 20, 0, 0, 240, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 12, 0], _ - [1238, 'Signet_of_Creation', 'Siegel_der_Schöpfung', 0, 0, 8, 36, 0, 7, 4, 4, 3, 12, 1000, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 20, 0], _ - [1239, 'Signet_of_Spirits', 'Siegel_der_Geister', 0, 0, 8, 34, 0, 7, 1, 12, 5, 20, 1000, 0, 0, 0, 0, 1, 1, 0.75, 4, 0, 0, 0, 30, 0], _ - [1240, 'Soul_Twisting', 'Seelenverflechtung', 5, 6.5, 8, 36, 0, 16, 15, 15, 1, 3, 10, 0, 0, 0, 0, 1, 0, 0.75, 4, 0, 0, 0, 15, 0], _ - [1244, 'Ghostly_Haste', 'Geisterhafte_Eile', 10, 13, 8, 36, 0, 6, 25, 25, 0, 0, 1000, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 20, 0], _ - [1245, 'Gaze_from_Beyond', 'Blick_aus_dem_Jenseits', 5, 6.5, 8, 34, 0, 5, 20, 65, 2, 6, 1000, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 10, 0], _ - [1246, 'Ancestors_Rage', 'Wut_der_Vorfahren', 5, 6.5, 8, 34, 0, 10, 5, 110, 0, 0, 156, 0, 0, 0, 3, 1, 0.25, 0.75, 0, 0, 0, 0, 10, 0], _ - [1247, 'Pain', 'Schmerzen', 5, 6.5, 8, 32, 0, 22, 1, 12, 5, 30, 0, 0, 0, 0, 0, 1, 0.75, 0.75, 256, 0, 0, 0, 30, 0], _ - [1249, 'Displacement', 'Verschiebung', 15, 19.5, 8, 32, 0, 22, 1, 14, 60, 60, 75, 0, 0, 0, 0, 1, 0.75, 0.75, 256, 0, 128, 0, 45, 0], _ - [1250, 'Preservation', 'Erhaltung', 5, 6.5, 8, 33, 0, 22, 1, 14, 10, 115, 312, 0, 0, 0, 0, 1, 0.75, 0.75, 260, 0, 0, 0, 20, 0], _ - [1251, 'Life', 'Leben', 10, 13, 8, 33, 0, 22, 1, 14, 1, 7, 2500, 0, 0, 0, 0, 1, 0.75, 0.75, 256, 0, 0, 0, 20, 0], _ - [1252, 'Earthbind', 'Erdbindung', 15, 19.5, 8, 32, 0, 22, 1, 14, 50, 25, 2500, 3, 0, 0, 0, 1, 1, 0.75, 256, 0, 0, 0, 30, 0], _ - [1253, 'Bloodsong', 'Blutgesang', 5, 6.5, 8, 34, 0, 22, 1, 12, 5, 25, 0, 0, 0, 0, 0, 1, 0.75, 0.75, 256, 0, 0, 0, 30, 0], _ - [1255, 'Wanderlust', 'Fernweh', 10, 13, 8, 32, 0, 22, 1, 12, 70, 50, 0, 0, 0, 0, 0, 1, 1, 0.75, 260, 0, 0, 0, 45, 0], _ - [1257, 'Spirit_Light_Weapon', 'Geisterlichtwaffe', 5, 6.5, 8, 33, 0, 25, 1, 15, 1, 15, 1000, 0, 0, 0, 3, 1, 1, 0.75, 4, 0, 6, 0, 5, 0], _ - [1258, 'Brutal_Weapon', 'Grausame_Waffe', 10, 13, 8, 32, 0, 25, 5, 15, 0, 0, 0, 0, 0, 0, 3, 1, 1, 0.75, 0, 0, 0, 0, 15, 0], _ - [1259, 'Guided_Weapon', 'Gelenkte_Waffe', 15, 19.5, 8, 32, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 2, 0.75, 0, 0, 0, 0, 5, 0], _ - [1260, 'Meekness', 'Sanftmut', 15, 19.5, 4, 7, 0, 4, 17, 17, 50, 50, 312, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 32, 0, 15, 0], _ - [1261, 'Frigid_Armor', 'Kalte_Rüstung', 5, 6.5, 6, 11, 0, 6, 10, 40, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 20, 0], _ - [1262, 'Healing_Ring', 'Heilring', 5, 6.5, 3, 13, 0, 5, 30, 180, 0, 0, 156, 0, 0, 0, 0, 1, 1, 0.75, 0, 4096, 0, 0, 10, 0], _ - [1263, 'Renew_Life', 'Leben_verlängern', 15, 19.5, 3, 13, 0, 5, 5, 20, 55, 130, 50, 1000, 0, 0, 6, 1, 4, 0.75, 2050, 0, 8, 0, 5, 0], _ - [1264, 'Doom', 'Untergang', 10, 13, 8, 36, 0, 5, 10, 40, 135, 135, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 8, 0], _ - [1265, 'Wielders_Boon', 'Segen_des_Ausübers', 5, 6.5, 8, 33, 0, 5, 15, 60, 15, 75, 0, 0, 0, 0, 3, 1, 0.25, 0.75, 0, 4096, 6, 0, 4, 0], _ - [1266, 'Soothing', 'Beruhigung', 15, 19.5, 8, 32, 0, 22, 1, 12, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0.75, 256, 0, 0, 0, 45, 0], _ - [1267, 'Vital_Weapon', 'Wesentliche_Waffe', 5, 6.5, 8, 32, 0, 25, 40, 175, 0, 0, 0, 0, 0, 0, 3, 1, 1, 0.75, 0, 0, 0, 0, 2, 0], _ - [1268, 'Weapon_of_Quickening', 'Waffe_der_Beschleunigung', 10, 13, 8, 32, 0, 25, 33, 33, 0, 0, 0, 0, 0, 0, 3, 1, 2, 0.75, 4, 0, 0, 0, 5, 0], _ - [1269, 'Signet_of_Rage', 'Siegel_der_Wut', 0, 0, 3, 14, 0, 7, 5, 50, 5, 10, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 20, 0], _ - [1333, 'Extend_Conditions', 'Zustände_ausweiten', 5, 6.5, 5, 3, 0, 5, 5, 100, 30, 30, 240, 0, 0, 0, 5, 1, 0.25, 0.75, 4, 0, 0, 0, 5, 0], _ - [1334, 'Hypochondria', 'Hypochondrie', 5, 6.5, 5, 46, 0, 5, 0, 0, 0, 0, 312, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 7, 0], _ - [1335, 'Wastrels_Demise', 'Ableben_des_Verschwenders', 5, 6.5, 5, 2, 0, 4, 1, 10, 1, 3, 156, 0, 0, 0, 5, 1, 0.25, 0.75, 0, 0, 0, 0, 3, 0], _ - [1336, 'Spiritual_Pain', 'Geisterschmerz', 5, 6.5, 5, 2, 0, 5, 15, 75, 25, 125, 312, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 7, 0], _ - [1337, 'Drain_Delusions', 'Täuschungen_entziehen', 5, 6.5, 5, 3, 0, 5, 1, 5, 4, 4, 0, 0, 0, 0, 5, 1, 0.25, 0.75, 0, 0, 256, 0, 12, 0], _ - [1338, 'Persistence_of_Memory', 'Beharrliche_Erinnerungen', 10, 13, 5, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 20, 0], _ - [1339, 'Symbols_of_Inspiration', 'Symbole_der_Inspiration', 5, 6.5, 5, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 4, 0, 0, 0, 15, 0], _ - [1340, 'Symbolic_Celerity', 'Symbolische_Schnelligkeit', 15, 19.5, 5, 0, 0, 6, 25, 50, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 30, 0], _ - [1341, 'Frustration', 'Frustration', 10, 13, 5, 1, 0, 4, 50, 50, 5, 50, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 7, 0], _ - [1342, 'Tease', 'Reizen', 5, 6.5, 5, 3, 0, 5, 0, 5, 0, 0, 312, 0, 0, 0, 5, 1, 0.25, 0.75, 4, 0, 0, 0, 15, 0], _ - [1343, 'Ether_Phantom', 'Äther_Phantom', 5, 6.5, 5, 3, 0, 4, 1, 5, 1, 1, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 10, 0], _ - [1344, 'Web_of_Disruption', 'Netz_der_Störung', 5, 6.5, 5, 46, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 0.25, 0.75, 0, 0, 1, 0, 15, 0], _ - [1345, 'Enchanters_Conundrum', 'Rätsel_des_Verzauberers', 10, 13, 5, 2, 0, 4, 10, 100, 100, 200, 156, 0, 0, 0, 5, 1, 2, 0.75, 4, 0, 0, 0, 10, 0], _ - [1346, 'Signet_of_Illusions', 'Siegel_der_Illusionen', 0, 0, 5, 1, 0, 7, 1, 3, 1, 3, 0, 0, 0, 0, 0, 1, 2, 0.75, 4, 0, 0, 0, 5, 0], _ - [1347, 'Discharge_Enchantment', 'Verzauberung_entlassen', 10, 13, 5, 3, 0, 5, 20, 50, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 15, 0], _ - [1348, 'Hex_Eater_Vortex', 'Verhexungsfresser_Strudel', 10, 13, 5, 2, 0, 5, 30, 90, 0, 0, 240, 0, 0, 0, 3, 1, 1, 0.75, 4, 0, 2048, 0, 15, 0], _ - [1349, 'Mirror_of_Disenchantment', 'Spiegel_der_Entzauberung', 5, 6.5, 5, 46, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 15, 0], _ - [1350, 'Simple_Thievery', 'Simpler_Diebstahl', 10, 13, 5, 2, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 0.25, 0.75, 4, 0, 0, 0, 10, 0], _ - [1351, 'Animate_Shambling_Horror', 'Schlurfschreck_beleben', 15, 19.5, 4, 5, 0, 5, 1, 17, 0, 15, 0, 0, 0, 0, 0, 1, 3, 0.75, 262144, 0, 0, 0, 25, 0], _ - [1352, 'Order_of_Undeath', 'Orden_der_Untoten', 10, 13, 4, 5, 0, 5, 3, 16, 2, 2, 5000, 2, 0, 0, 0, 1, 1, 0.75, 4, 0, 32, 0, 5, 0], _ - [1353, 'Putrid_Flesh', 'Verwesendes_Fleisch', 10, 13, 4, 5, 0, 5, 0, 0, 0, 0, 240, 0, 0, 0, 1, 1, 0.25, 0.75, 0, 0, 0, 0, 0, 0], _ - [1354, 'Feast_for_the_Dead', 'Fest_für_die_Toten', 5, 6.5, 4, 5, 0, 5, 10, 100, 0, 0, 5000, 0, 0, 0, 1, 1, 0.25, 0.75, 0, 0, 0, 0, 10, 0], _ - [1355, 'Jagged_Bones', 'Versplitterte_Knochen', 5, 6.5, 4, 5, 0, 6, 0, 15, 0, 0, 0, 0, 0, 0, 14, 1, 1, 0.75, 4, 0, 0, 0, 15, 0], _ - [1356, 'Contagion', 'Erkrankung', 5, 6.5, 4, 5, 0, 6, 10, 5, 0, 0, 312, 0, 0, 0, 0, 1, 1, 0.75, 4, 0, 0, 0, 20, 0], _ - [1358, 'Ulcerous_Lungs', 'Geschwürige_Lungen', 15, 19.5, 4, 7, 0, 4, 4, 4, 3, 15, 240, 0, 0, 0, 5, 1, 2, 0.75, 512, 1, 0, 0, 10, 0], _ - [1359, 'Pain_of_Disenchantment', 'Schmerz_der_Entzauberung', 10, 13, 4, 7, 0, 5, 1, 3, 10, 100, 156, 0, 0, 0, 5, 1, 1, 0.75, 4, 0, 0, 0, 15, 0], _ - [1360, 'Mark_of_Fury', 'Zeichen_der_Wut', 5, 6.5, 4, 4, 0, 4, 0, 2, 1, 15, 0, 0, 0, 0, 5, 1, 0.75, 0.75, 0, 0, 0, 0, 10, 0], _ - [1362, 'Corrupt_Enchantment', 'Verzauberung_verderben', 5, 6.5, 4, 7, 0, 4, 1, 8, 0, 0, 0, 0, 0, 0, 5, 1, 0.75, 0.75, 516, 0, 0, 0, 10, 0], _ - [1363, 'Signet_of_Sorrow', 'Siegel_des_Kummers', 0, 0, 4, 6, 0, 7, 15, 75, 0, 0, 240, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 30, 0], _ - [1364, 'Signet_of_Suffering', 'Siegel_des_Leidens', 0, 0, 4, 4, 0, 7, 2, 16, 6, 6, 0, 0, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 4, 0], _ - [1365, 'Signet_of_Lost_Souls', 'Siegel_der_verlorenen_Seelen', 0, 0, 4, 6, 0, 7, 10, 100, 1, 10, 0, 0, 0, 0, 5, 1, 0.25, 0.75, 0, 0, 0, 0, 8, 0], _ - [1366, 'Well_of_Darkness', 'Brunnen_der_Dunkelheit', 10, 13, 4, 7, 0, 9, 50, 50, 30, 30, 312, 0, 0, 0, 0, 1, 1, 0.75, 262144, 0, 0, 0, 20, 0], _ - [1367, 'Blinding_Surge', 'Blendende_Welle', 10, 13, 6, 8, 0, 5, 5, 50, 3, 8, 156, 0, 0, 0, 5, 1, 0.75, 0.75, 4, 0, 0, 0, 6, 0], _ - [1368, 'Chilling_Winds', 'Kühle_Winde', 5, 6.5, 6, 8, 0, 4, 30, 60, 25, 100, 156, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 8, 0], _ - [1369, 'Lightning_Bolt', 'Blitzstrahl', 5, 6.5, 6, 8, 0, 5, 5, 50, 5, 50, 2400, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 8, 0], _ - [1370, 'Storm_Djinns_Haste', 'Eile_des_Sturm_Dschinn', 5, 6.5, 6, 8, 0, 6, 25, 25, 1, 1, 0, 0, 0, 0, 0, 1, 0.25, 0.75, 0, 0, 32768, 0, 10, 0], _ - [1371, 'Stone_Striker', 'Steinschläger', 5, 6.5, 6, 9, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0.25, 0.75, 0, 0, 0, 0, 20, 0], _ - [1372, 'Sandstorm', 'Sandsturm', 15, 19.5, 6, 9, 0, 5, 10, 30, 10, 30, 240, 0, 0, 0, 16, 1, 2, 0.75, 4, 0, 0, 0, 25, 0], _ - [1373, 'Stone_Sheath', 'Steinmantel', 5, 6.5, 6, 9, 0, 6, 15, 70, 1, 30, 240, 24, 0, 0, 1, 1, 1, 0.75, 4, 0, 0, 0, 15, 0], _ - [1374, 'Ebon_Hawk', 'Ebonfalke', 10, 13, 6, 9, 0, 5, 10, 85, 5, 15, 1800, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 5, 0], _ - [1375, 'Stoneflesh_Aura', 'Steinfleisch_Aura', 10, 13, 6, 9, 0, 6, 1, 31, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0.75, 0, 0, 0, 0, 15, 0], _ - [1376, 'Glyph_of_Restoration', 'Glyphe_der_Wiederherstellung', 5, 6.5, 6, 12, 0, 12, 30, 105, 150, 400, 2, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 4, 0, 8, 0], _ - [1377, 'Ether_Prism', 'Ätherprisma', 5, 6.5, 6, 12, 0, 16, 75, 75, 5, 20, 0, 0, 0, 0, 0, 1, 0, 0.75, 4, 0, 256, 0, 25, 0], _ - [1378, 'Master_of_Magic', 'Meister_der_Magie', 5, 6.5, 6, 12, 0, 6, 8, 14, 0, 0, 30, 0, 0, 0, 0, 1, 1, 0.75, 4, 0, 256, 0, 10, 0], _ - [1379, 'Glowing_Gaze', 'Glühender_Blick', 5, 6.5, 6, 10, 0, 5, 5, 50, 5, 5, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 256, 0, 8, 0], _ - [1380, 'Savannah_Heat', 'Hitze_der_Savanne', 5, 6.5, 6, 10, 0, 5, 5, 20, 5, 20, 240, 0, 0, 0, 16, 1, 2, 0.75, 4, 0, 0, 0, 25, 0], _ - [1381, 'Flame_Djinns_Haste', 'Eile_des_Flammen_Dschinn', 10, 13, 6, 10, 0, 6, 15, 120, 25, 25, 156, 50, 0, 0, 0, 1, 0.75, 0.75, 0, 0, 512, 0, 20, 0], _ - [1382, 'Freezing_Gust', 'Gefrierende_Böe', 10, 13, 6, 11, 0, 4, 20, 80, 66, 66, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 2048, 0, 0, 8, 0], _ - [1390, 'Judges_Intervention', 'Intervention_des_Richters', 5, 6.5, 3, 14, 0, 6, 30, 180, 1, 3, 240, 0, 0, 0, 3, 1, 0.25, 0.75, 0, 0, 0, 0, 8, 0], _ - [1391, 'Supportive_Spirit', 'Unterstützender_Geist', 10, 13, 3, 13, 0, 6, 5, 35, 0, 0, 0, 0, 0, 0, 3, 1, 0.75, 0.75, 0, 0, 0, 0, 8, 0], _ - [1392, 'Watchful_Healing', 'Wachsame_Heilung', 5, 6.5, 3, 16, 0, 6, 1, 4, 30, 120, 0, 0, 0, 0, 3, 1, 1, 0.75, 0, 0, 6, 0, 10, 0], _ - [1393, 'Healers_Boon', 'Segen_des_Heilers', 5, 6.5, 3, 16, 0, 6, 50, 50, 9999, 9999, 0, 0, 0, 0, 0, 1, 0.25, 0.75, 4, 0, 0, 0, 10, 0], _ - [1394, 'Healers_Covenant', 'Verpflichtung_des_Heilers', 5, 6.5, 3, 13, 0, 6, 25, 25, 1, 3, 0, 0, 0, 0, 0, 1, 0.25, 0.75, 4, 0, 0, 0, 5, 0], _ - [1395, 'Balthazars_Pendulum', 'Balthasars_Pendel', 5, 6.5, 3, 14, 0, 6, 5, 75, 0, 0, 0, 0, 0, 0, 3, 1, 0.25, 0.75, 4, 0, 0, 0, 5, 0], _ - [1396, 'Words_of_Comfort', 'Tröstende_Worte', 5, 6.5, 3, 13, 0, 5, 15, 60, 15, 45, 0, 0, 0, 0, 3, 1, 1, 0.75, 0, 4096, 0, 0, 4, 0], _ - [1397, 'Light_of_Deliverance', 'Licht_der_Erlösung', 5, 6.5, 3, 13, 0, 5, 101, 101, 5, 70, 5000, 0, 0, 0, 0, 1, 1, 0.75, 4, 4096, 6, 0, 6, 0], _ - [1398, 'Scourge_Enchantment', 'Geißelverzauberung', 10, 13, 3, 14, 0, 4, 15, 75, 0, 0, 0, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 0, 0, 5, 0], _ - [1399, 'Shield_of_Absorption', 'Schild_der_Absorption', 5, 6.5, 3, 15, 0, 6, 5, 5, 0, 0, 0, 0, 0, 0, 3, 1, 1, 0.75, 0, 0, 0, 0, 10, 0], _ - [1400, 'Reversal_of_Damage', 'Umkehrung_des_Schadens', 5, 6.5, 3, 14, 0, 6, 5, 75, 0, 0, 0, 0, 0, 0, 3, 1, 0.25, 0.75, 0, 0, 0, 0, 3, 0], _ - [1401, 'Mending_Touch', 'Genesungsberührung', 5, 6.5, 3, 15, 0, 5, 15, 60, 0, 0, 0, 0, 0, 0, 3, 1, 0.75, 0.75, 2, 4096, 4096, 0, 6, 0], _ - [1402, 'Critical_Chop', 'Kritischer_Hieb', 5, 6.5, 1, 18, 0, 14, 5, 20, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0, 0, 0, 0, 1, 15, 0], _ - [1403, 'Agonizing_Chop', 'Qualvoller_Hieb', 0, 0, 1, 18, 0, 14, 5, 20, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0, 0, 0, 0, 1, 0, 150], _ - [1404, 'Flail', 'Dreschen', 0, 0, 1, 17, 0, 3, 33, 33, 33, 33, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 32768, 0, 0, 100], _ - [1405, 'Charging_Strike', 'Angreifender_Schlag', 5, 6.5, 1, 17, 0, 3, 33, 33, 10, 40, 0, 0, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 5, 0], _ - [1406, 'Headbutt', 'Kopfstoß', 15, 19.5, 1, 17, 0, 10, 40, 100, 5, 20, 0, 0, 0, 0, 5, 1, 0.75, 0.75, 6, 0, 0, 0, 20, 0], _ - [1407, 'Lions_Comfort', 'Trost_des_Löwen', 0, 0, 1, 17, 0, 10, 50, 110, 0, 3, 12, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 4, 0, 1, 80], _ - [1408, 'Rage_of_the_Ntouka', 'Wut_des_Ntouka', 5, 6.5, 1, 17, 0, 16, 1, 7, 5, 5, 0, 0, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 15, 0], _ - [1409, 'Mokele_Smash', 'Mokele_Schlag', 5, 6.5, 1, 19, 0, 14, 5, 20, 2, 2, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 16, 12, 0], _ - [1410, 'Overbearing_Smash', 'Anmaßender_Schlag', 5, 6.5, 1, 19, 0, 14, 1, 20, 1, 8, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 16, 20, 0], _ - [1411, 'Signet_of_Stamina', 'Siegel_der_Ausdauer', 0, 0, 1, 17, 0, 7, 50, 300, 0, 0, 0, 0, 0, 0, 0, 1, 0.25, 0.75, 0, 0, 0, 0, 20, 0], _ - [1412, 'Youre_All_Alone', 'Ihr_seid_ganz_allein', 5, 6.5, 1, 46, 0, 15, 8, 8, 8, 8, 0, 240, 0, 0, 5, 1, 0, 0, 4, 0, 0, 0, 10, 0], _ - [1413, 'Burst_of_Aggression', 'Aggressiver_Ausbruch', 5, 6.5, 1, 17, 0, 3, 33, 33, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 32768, 0, 12, 0], _ - [1414, 'Enraging_Charge', 'Wütender_Angriff', 5, 6.5, 1, 17, 0, 3, 25, 25, 0, 3, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 20, 0], _ - [1415, 'Crippling_Slash', 'Verkrüppelnder_Hieb', 0, 0, 1, 20, 0, 14, 5, 15, 10, 25, 0, 0, 0, 0, 5, 1, 0, 0, 4, 0, 0, 128, 0, 130], _ - [1416, 'Barbarous_Slice', 'Barbarischer_Schnitt', 0, 0, 1, 20, 0, 14, 5, 30, 5, 15, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 128, 0, 150], _ - [1465, 'Prepared_Shot', 'Vorbereiteter_Schuss', 5, 6.5, 2, 25, 0, 14, 10, 25, 1, 9, 0, 0, 0, 0, 5, 1, 0, 0, 4, 0, 0, 2, 6, 0], _ - [1466, 'Burning_Arrow', 'Brennender_Pfeil', 10, 13, 2, 25, 0, 14, 10, 30, 1, 7, 0, 0, 0, 0, 5, 1, 0, 0, 4, 0, 0, 2, 5, 0], _ - [1467, 'Arcing_Shot', 'Bogenschuss', 5, 6.5, 2, 25, 0, 14, 10, 25, 50, 50, 1600, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 2, 6, 0], _ - [1468, 'Strike_as_One', 'Gemeinsam_zuschlagen', 5, 6.5, 2, 22, 0, 15, 5, 15, 5, 15, 0, 0, 0, 0, 1, 1, 0, 0, 4, 0, 0, 0, 10, 0], _ - [1469, 'Crossfire', 'Kreuzfeuer', 5, 6.5, 2, 25, 0, 14, 5, 20, 0, 0, 240, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 2, 4, 0], _ - [1470, 'Barbed_Arrows', 'Stachelpfeile', 10, 13, 2, 24, 0, 19, 3, 15, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0.75, 384, 0, 0, 0, 12, 0], _ - [1471, 'Scavengers_Focus', 'Fokus_des_Plünderers', 5, 6.5, 2, 24, 0, 10, 3, 12, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 20, 0], _ - [1472, 'Toxicity', 'Giftigkeit', 15, 19.5, 2, 22, 0, 22, 1, 10, 2, 2, 2500, 0, 0, 0, 0, 1, 5, 0.75, 0, 0, 0, 0, 60, 0], _ - [1473, 'Quicksand', 'Treibsand', 10, 13, 2, 24, 0, 22, 1, 10, 1, 1, 2500, 0, 0, 0, 0, 1, 5, 0.75, 4, 0, 0, 0, 30, 0], _ - [1474, 'Storms_Embrace', 'Umarmung_des_Sturms', 5, 6.5, 2, 46, 0, 3, 25, 25, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0.75, 0, 0, 0, 0, 30, 0], _ - [1475, 'Trappers_Speed', 'Geschwindigkeit_des_Fallenstellers', 5, 6.5, 2, 23, 0, 3, 25, 25, 25, 25, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 20, 0], _ - [1476, 'Tripwire', 'Stolperdraht', 10, 13, 2, 24, 0, 21, 5, 20, 0, 0, 156, 240, 0, 0, 0, 1, 2, 0.75, 288, 0, 0, 0, 30, 0], _ - [1478, 'Renewing_Surge', 'Erneuernde_Welle', 5, 6.5, 8, 34, 0, 4, 2, 12, 1, 8, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 15, 0], _ - [1479, 'Offering_of_Spirit', 'Opfer_des_Geistes', 5, 6.5, 8, 34, 0, 5, 17, 17, 8, 17, 1000, 0, 0, 0, 0, 1, 0.25, 0.75, 4, 0, 256, 0, 15, 0], _ - [1480, 'Spirits_Gift', 'Geschenk_des_Geistes', 10, 13, 8, 36, 0, 6, 5, 50, 0, 0, 240, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 45, 0], _ - [1481, 'Death_Pact_Signet', 'Todespakt_Siegel', 0, 0, 8, 33, 0, 7, 0, 0, 15, 100, 0, 0, 0, 0, 6, 1, 3, 0.75, 2048, 0, 8, 0, 12, 0], _ - [1482, 'Reclaim_Essence', 'Essenz_zurückfordern', 5, 6.5, 8, 36, 0, 5, 5, 20, 0, 0, 5000, 0, 0, 0, 0, 1, 1, 0.75, 4, 0, 0, 0, 30, 0], _ - [1483, 'Banishing_Strike', 'Bannstoß', 5, 6.5, 10, 44, 0, 14, 0, 0, 10, 60, 240, 0, 0, 0, 5, 1, 1, 0, 0, 0, 0, 185, 3, 0], _ - [1484, 'Mystic_Sweep', 'Mystischer_Schwung', 5, 6.5, 10, 44, 0, 14, 3, 12, 3, 12, 0, 0, 0, 0, 5, 1, 1, 0, 0, 0, 0, 185, 6, 0], _ - [1485, 'Eremites_Attack', 'Angriff_des_Eremiten', 5, 6.5, 10, 41, 0, 14, 1, 10, 1, 10, 156, 0, 0, 0, 5, 1, 0, 0, 0, 0, 8192, 32, 6, 0], _ - [1486, 'Reap_Impurities', 'Unreinheiten_ausnutzen', 0, 0, 10, 41, 0, 14, 3, 15, 10, 40, 156, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 185, 0, 120], _ - [1487, 'Twin_Moon_Sweep', 'Doppelter_Mondschwung', 0, 0, 10, 41, 0, 14, 10, 50, 10, 70, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 8192, 185, 0, 160], _ - [1488, 'Victorious_Sweep', 'Siegreicher_Schwung', 5, 6.5, 10, 41, 0, 14, 5, 25, 30, 80, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 185, 4, 0], _ - [1489, 'Irresistible_Sweep', 'Unwiderstehlicher_Schwung', 5, 6.5, 10, 41, 0, 14, 3, 15, 3, 15, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 8192, 32, 6, 0], _ - [1490, 'Pious_Assault', 'Frommer_Angriff', 5, 6.5, 10, 41, 0, 14, 10, 20, 10, 30, 156, 75, 0, 0, 5, 1, 0, 0, 0, 0, 8192, 185, 12, 0], _ - [1491, 'Mystic_Twister', 'Mystischer_Wirbelsturm', 0, 0, 10, 42, 0, 5, 10, 60, 10, 60, 240, 240, 0, 0, 0, 1, 1, 0.75, 0, 0, 512, 0, 8, 120], _ - [1493, 'Grenths_Fingers', 'Grenths_Finger', 5, 6.5, 10, 42, 0, 6, 10, 40, 1, 2, 240, 0, 0, 0, 0, 1, 0, 0, 8388608, 0, 512, 0, 10, 0], _ - [1495, 'Aura_of_Thorns', 'Dornenaura', 5, 6.5, 10, 43, 0, 6, 3, 8, 5, 15, 240, 0, 0, 0, 0, 1, 0, 0, 8388608, 9, 512, 0, 10, 0], _ - [1496, 'Balthazars_Rage', 'Balthasars_Wut', 10, 13, 10, 44, 0, 6, 1, 2, 1, 3, 240, 1000, 0, 0, 0, 1, 0, 0, 8388608, 0, 512, 0, 10, 0], _ - [1497, 'Dust_Cloak', 'Staubdecke', 10, 13, 10, 43, 0, 6, 10, 40, 1, 4, 240, 0, 0, 0, 0, 1, 0, 0, 8388608, 2, 512, 0, 6, 0], _ - [1498, 'Staggering_Force', 'Umwerfende_Gewalt', 10, 13, 10, 43, 0, 6, 10, 40, 1, 10, 240, 0, 0, 0, 0, 1, 0, 0, 8388608, 1024, 512, 0, 6, 0], _ - [1499, 'Pious_Renewal', 'Fromme_Erneuerung', 5, 6.5, 10, 44, 0, 6, 0, 5, 0, 30, 0, 0, 0, 0, 0, 1, 0, 0, 8388612, 0, 0, 0, 8, 0], _ - [1500, 'Mirage_Cloak', 'Trugbild_Umhang', 10, 13, 10, 43, 0, 6, 40, 80, 10, 40, 240, 0, 0, 0, 0, 1, 0, 0, 8388608, 0, 128, 0, 10, 0], _ - [1502, 'Arcane_Zeal', 'Arkaner_Eifer', 10, 13, 10, 44, 0, 6, 1, 1, 1, 7, 0, 1, 0, 0, 0, 1, 1, 0.75, 4, 0, 0, 0, 5, 0], _ - [1503, 'Mystic_Vigor', 'Mystische_Vitalität', 5, 6.5, 10, 44, 0, 6, 3, 15, 25, 25, 0, 0, 0, 0, 0, 1, 0.25, 0.75, 0, 0, 0, 0, 15, 0], _ - [1504, 'Watchful_Intervention', 'Wachsame_Intervention', 10, 13, 10, 44, 0, 6, 25, 25, 50, 200, 0, 0, 0, 0, 3, 1, 1, 0.75, 0, 0, 0, 0, 15, 0], _ - [1505, 'Vow_of_Piety', 'Gelübde_der_Frömmigkeit', 15, 19.5, 10, 42, 0, 6, 1, 4, 24, 24, 0, 0, 0, 0, 0, 1, 0.25, 0.75, 0, 0, 0, 0, 45, 0], _ - [1506, 'Vital_Boon', 'Wesentliche_Wohltat', 5, 6.5, 10, 43, 0, 6, 75, 200, 40, 100, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 4, 0, 8, 0], _ - [1507, 'Heart_of_Holy_Flame', 'Herz_der_heiligen_Flamme', 10, 13, 10, 44, 0, 6, 5, 30, 2, 5, 240, 0, 0, 0, 0, 1, 0, 0, 8388608, 4, 512, 0, 10, 0], _ - [1508, 'Extend_Enchantments', 'Verzauberungen_ausweiten', 5, 6.5, 10, 44, 0, 16, 10, 150, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 10, 0], _ - [1509, 'Faithful_Intervention', 'Vertrauensvolle_Intervention', 5, 6.5, 10, 44, 0, 6, 30, 150, 50, 50, 0, 0, 0, 0, 0, 1, 2, 0.75, 0, 0, 0, 0, 20, 0], _ - [1510, 'Sand_Shards', 'Sandscherben', 10, 13, 10, 43, 0, 6, 10, 60, 1, 5, 156, 0, 0, 0, 0, 1, 0, 0, 8388608, 0, 0, 0, 10, 0], _ - [1512, 'Lyssas_Haste', 'Lyssas_Eile', 10, 13, 10, 42, 0, 6, 33, 33, 0, 0, 156, 0, 0, 0, 0, 1, 0, 0, 8388672, 0, 512, 0, 15, 0], _ - [1513, 'Guiding_Hands', 'Lenkende_Hände', 10, 13, 10, 42, 0, 6, 0, 3, 0, 0, 0, 0, 0, 0, 0, 1, 0.25, 0.75, 0, 0, 0, 0, 10, 0], _ - [1514, 'Fleeting_Stability', 'Flüchtige_Stabilität', 5, 6.5, 10, 43, 0, 6, 25, 25, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 8388608, 0, 0, 0, 10, 0], _ - [1515, 'Armor_of_Sanctity', 'Rüstung_der_Heiligkeit', 5, 6.5, 10, 43, 0, 6, 5, 20, 5, 15, 156, 0, 0, 0, 0, 1, 0.25, 0.75, 0, 1024, 512, 0, 15, 0], _ - [1516, 'Mystic_Regeneration', 'Mystische_Regeneration', 10, 13, 10, 43, 0, 6, 1, 4, 0, 0, 8, 0, 0, 0, 0, 1, 0.25, 0.75, 0, 0, 0, 0, 10, 0], _ - [1517, 'Vow_of_Silence', 'Schweigegelübde', 5, 6.5, 10, 44, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0.25, 0.75, 4, 0, 0, 0, 10, 0], _ - [1518, 'Avatar_of_Balthazar', 'Balthasars_Avatar', 5, 6.5, 10, 44, 0, 26, 1, 3, 25, 25, 240, 20, 0, 0, 0, 1, 2, 0.75, 4, 0, 0, 0, 20, 0], _ - [1519, 'Avatar_of_Dwayna', 'Dwaynas_Avatar', 5, 6.5, 10, 44, 0, 26, 0, 0, 5, 50, 1000, 0, 0, 0, 0, 1, 2, 0.75, 4, 0, 0, 0, 20, 0], _ - [1520, 'Avatar_of_Grenth', 'Grenths_Avatar', 5, 6.5, 10, 44, 0, 26, 0, 12, 3, 3, 156, 0, 0, 0, 0, 1, 2, 0.75, 4, 0, 0, 0, 20, 0], _ - [1521, 'Avatar_of_Lyssa', 'Lyssas_Avatar', 5, 6.5, 10, 44, 0, 26, 1, 1, 50, 50, 240, 0, 0, 0, 0, 1, 2, 0.75, 4, 0, 0, 0, 20, 0], _ - [1522, 'Avatar_of_Melandru', 'Melandrus_Avatar', 5, 6.5, 10, 44, 0, 26, 150, 150, 30, 30, 1000, 1, 0, 0, 0, 1, 2, 0.75, 4, 0, 0, 0, 20, 0], _ - [1523, 'Meditation', 'Meditation', 10, 13, 10, 44, 0, 6, 1, 4, 0, 0, 0, 0, 0, 0, 0, 1, 0.25, 0.75, 0, 0, 256, 0, 20, 0], _ - [1524, 'Eremites_Zeal', 'Eifer_des_Eremiten', 5, 6.5, 10, 44, 0, 6, 1, 3, 8, 8, 1000, 0, 0, 0, 0, 1, 0.25, 0.75, 0, 0, 256, 0, 15, 0], _ - [1525, 'Natural_Healing', 'Natürliche_Heilung', 5, 6.5, 10, 42, 0, 5, 50, 170, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0.75, 0, 0, 4, 0, 6, 0], _ - [1526, 'Imbue_Health', 'Mit_Leben_durchdringen', 10, 13, 10, 44, 0, 5, 5, 50, 300, 300, 0, 0, 0, 0, 4, 1, 0.25, 0.75, 0, 0, 0, 0, 10, 0], _ - [1527, 'Mystic_Healing', 'Mystische_Heilung', 5, 6.5, 10, 42, 0, 5, 5, 65, 5, 65, 5000, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 4, 0], _ - [1528, 'Dwaynas_Touch', 'Dwaynas_Berührung', 5, 6.5, 10, 42, 0, 5, 15, 60, 150, 150, 0, 0, 0, 0, 3, 1, 0.75, 0.75, 2, 0, 6, 0, 5, 0], _ - [1529, 'Pious_Restoration', 'Fromme_Wiederherstellung', 5, 6.5, 10, 42, 0, 5, 80, 150, 1, 2, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 8196, 0, 8, 0], _ - [1530, 'Signet_of_Pious_Light', 'Siegel_des_frommen_Lichts', 0, 0, 10, 43, 0, 7, 30, 150, 75, 75, 0, 0, 0, 0, 3, 1, 1, 0.75, 0, 0, 8198, 0, 20, 0], _ - [1531, 'Intimidating_Aura', 'Einschüchternde_Aura', 10, 13, 10, 44, 0, 6, 40, 100, 1, 10, 0, 0, 0, 0, 0, 1, 0.75, 0.75, 0, 0, 0, 0, 20, 0], _ - [1532, 'Mystic_Sandstorm', 'Mystischer_Sandsturm', 0, 0, 10, 43, 0, 5, 10, 20, 10, 20, 240, 5, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 8, 120], _ - [1533, 'Winds_of_Disenchantment', 'Wind_der_Entzauberung', 10, 13, 10, 42, 0, 5, 20, 80, 1, 1, 240, 0, 0, 0, 0, 1, 0.75, 0.75, 0, 0, 8192, 0, 15, 0], _ - [1534, 'Rending_Touch', 'Zerreißende_Berührung', 5, 6.5, 10, 44, 0, 5, 1, 1, 15, 65, 0, 0, 0, 0, 5, 1, 0.75, 0.75, 2, 0, 8192, 0, 12, 0], _ - [1535, 'Crippling_Sweep', 'Verkrüppelnder_Schwung', 5, 6.5, 10, 41, 0, 14, 3, 12, 3, 15, 0, 0, 0, 0, 5, 1, 0, 0, 0, 8, 0, 32, 6, 0], _ - [1536, 'Wounding_Strike', 'Verwundender_Schlag', 5, 6.5, 10, 41, 0, 14, 5, 20, 5, 20, 0, 0, 0, 0, 5, 1, 0, 0, 4, 17, 8192, 32, 3, 0], _ - [1537, 'Wearying_Strike', 'Ermüdender_Schlag', 0, 0, 10, 41, 0, 14, 0, 0, 3, 10, 10, 0, 0, 0, 5, 1, 0, 0, 0, 16, 8192, 32, 0, 150], _ - [1538, 'Lyssas_Assault', 'Lyssas_Angriff', 5, 6.5, 10, 41, 0, 14, 1, 10, 50, 50, 0, 0, 0, 0, 5, 1, 0.5, 0, 0, 0, 0, 32, 15, 0], _ - [1539, 'Chilling_Victory', 'Kühler_Sieg', 0, 0, 10, 41, 0, 14, 3, 15, 10, 30, 156, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 32, 0, 150], _ - [1540, 'Conviction', 'Überzeugung', 5, 6.5, 10, 43, 0, 6, 1, 3, 1, 2, 0, 10, 0, 0, 0, 1, 0, 0, 8388608, 0, 0, 0, 10, 0], _ - [1541, 'Enchanted_Haste', 'Verzauberte_Eile', 10, 13, 10, 46, 0, 6, 25, 25, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 8388608, 0, 0, 0, 15, 0], _ - [1542, 'Pious_Concentration', 'Fromme_Konzentration', 10, 13, 10, 43, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 8192, 0, 10, 0], _ - [1543, 'Pious_Haste', 'Fromme_Eile', 5, 6.5, 10, 44, 0, 3, 25, 25, 50, 50, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 8192, 0, 12, 0], _ - [1544, 'Whirling_Charge', 'Wirbelangriff', 10, 13, 10, 42, 0, 6, 33, 33, 10, 60, 240, 75, 0, 0, 0, 1, 0, 0, 8388608, 0, 0, 0, 6, 0], _ - [1545, 'Test_of_Faith', 'Glaubensprüfung', 0, 0, 10, 42, 0, 5, 15, 65, 1, 4, 0, 0, 0, 0, 5, 1, 0.75, 0.75, 2, 512, 0, 0, 5, 160], _ - [1546, 'Blazing_Spear', 'Lodernder_Speer', 0, 0, 9, 37, 0, 14, 5, 25, 1, 3, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 64, 0, 150], _ - [1547, 'Mighty_Throw', 'Mächtiger_Wurf', 0, 0, 9, 37, 0, 14, 10, 40, 0, 0, 4800, 0, 0, 0, 5, 1, 3, 0, 0, 0, 0, 64, 0, 50], _ - [1548, 'Cruel_Spear', 'Grausamer_Speer', 0, 0, 9, 37, 0, 14, 1, 31, 5, 20, 0, 0, 0, 0, 5, 1, 0, 0, 4, 16, 0, 64, 0, 175], _ - [1549, 'Harriers_Toss', 'Wurf_des_Läufers', 10, 13, 9, 37, 0, 14, 5, 20, 5, 30, 0, 0, 0, 0, 5, 1, 0.5, 1, 0, 0, 0, 64, 10, 0], _ - [1550, 'Unblockable_Throw', 'Unblockbarer_Wurf', 0, 0, 9, 37, 0, 14, 10, 40, 0, 0, 0, 0, 0, 0, 5, 1, 3, 0, 0, 0, 0, 64, 0, 175], _ - [1551, 'Spear_of_Lightning', 'Speer_des_Blitzes', 5, 6.5, 9, 37, 0, 14, 8, 20, 25, 25, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 64, 6, 0], _ - [1552, 'Wearying_Spear', 'Ermüdender_Speer', 0, 0, 9, 37, 0, 14, 10, 40, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 64, 0, 75], _ - [1553, 'Anthem_of_Fury', 'Hymne_der_Wut', 5, 6.5, 9, 40, 0, 27, 1, 4, 0, 0, 1000, 0, 0, 0, 0, 1, 1, 0.75, 4, 0, 0, 0, 10, 0], _ - [1554, 'Crippling_Anthem', 'Verkrüppelungs_Hymne', 0, 0, 9, 38, 0, 27, 0, 0, 5, 15, 1000, 0, 0, 0, 0, 1, 1, 0.75, 4, 8, 0, 0, 0, 100], _ - [1555, 'Defensive_Anthem', 'Verteidigungshymne', 10, 13, 9, 40, 0, 27, 50, 50, 0, 0, 1000, 0, 0, 0, 0, 1, 1, 0.75, 4, 0, 128, 0, 25, 0], _ - [1556, 'Godspeed', 'Gute_Reise', 10, 13, 9, 38, 0, 15, 25, 25, 0, 0, 1000, 0, 0, 0, 0, 1, 0, 0.75, 0, 4, 32768, 0, 30, 0], _ - [1557, 'Anthem_of_Flame', 'Hymne_der_Flamme', 5, 6.5, 9, 40, 0, 27, 1, 3, 0, 0, 1000, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 10, 0], _ - [1558, 'Go_for_the_Eyes', 'Zielt_auf_die_Augen', 0, 0, 9, 38, 0, 15, 30, 100, 0, 0, 1000, 0, 0, 0, 0, 1, 0, 0.75, 0, 0, 0, 0, 0, 100], _ - [1559, 'Anthem_of_Envy', 'Hymne_des_Neids', 0, 0, 9, 38, 0, 27, 10, 25, 0, 0, 1000, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 0, 150], _ - [1560, 'Song_of_Power', 'Machtgesang', 25, 32.5, 9, 39, 0, 27, 4, 4, 0, 0, 1000, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 30, 0], _ - [1561, 'Zealous_Anthem', 'Eifrige_Hymne', 10, 13, 9, 39, 0, 27, 1, 8, 0, 0, 1000, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 20, 0], _ - [1562, 'Aria_of_Zeal', 'Arie_des_Eifers', 10, 13, 9, 39, 0, 27, 1, 6, 0, 0, 1000, 0, 0, 0, 0, 1, 2, 0.75, 0, 0, 0, 0, 20, 0], _ - [1563, 'Lyric_of_Zeal', 'Lyrik_des_Eifers', 0, 0, 9, 39, 0, 27, 1, 8, 0, 0, 1000, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 5, 150], _ - [1564, 'Ballad_of_Restoration', 'Ballade_der_Wiederherstellung', 10, 13, 9, 39, 0, 27, 15, 75, 0, 0, 1000, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 6, 0, 20, 0], _ - [1565, 'Chorus_of_Restoration', 'Chor_der_Wiederherstellung', 0, 0, 9, 39, 0, 27, 30, 90, 0, 0, 1000, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 6, 0, 5, 100], _ - [1566, 'Aria_of_Restoration', 'Arie_der_Wiederherstellung', 10, 13, 9, 39, 0, 27, 30, 90, 0, 0, 1000, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 6, 0, 20, 0], _ - [1567, 'Song_of_Concentration', 'Lied_der_Konzentration', 0, 0, 9, 46, 0, 27, 0, 0, 0, 0, 1000, 0, 0, 0, 0, 1, 2, 0.75, 0, 0, 0, 0, 5, 200], _ - [1568, 'Anthem_of_Guidance', 'Hymne_der_Führung', 0, 0, 9, 38, 0, 27, 0, 0, 0, 0, 1000, 0, 0, 0, 0, 1, 1, 0.75, 4, 0, 0, 0, 0, 100], _ - [1569, 'Energizing_Chorus', 'Energie_bringender_Chor', 0, 0, 9, 39, 0, 27, 3, 7, 0, 0, 1000, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 0, 100], _ - [1570, 'Song_of_Purification', 'Lied_der_Läuterung', 0, 0, 9, 39, 0, 27, 1, 3, 0, 0, 1000, 0, 0, 0, 0, 1, 2, 0.75, 4, 0, 4096, 0, 0, 125], _ - [1571, 'Hexbreaker_Aria', 'Verhexungsbrech_Arie', 0, 0, 9, 46, 0, 27, 50, 100, 0, 0, 1000, 0, 0, 0, 0, 1, 2, 0.75, 0, 0, 0, 0, 0, 200], _ - [1572, 'Brace_Yourself', 'Seid_vorbereitet', 5, 6.5, 9, 38, 0, 15, 15, 75, 0, 0, 240, 0, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 4, 0], _ - [1573, 'Awe', 'Ehrfurcht', 10, 13, 9, 40, 0, 10, 5, 15, 0, 0, 0, 0, 0, 0, 5, 1, 0.75, 0.75, 8, 512, 0, 0, 10, 0], _ - [1574, 'Enduring_Harmony', 'Dauerhafte_Harmonie', 5, 6.5, 9, 40, 0, 28, 50, 50, 0, 0, 0, 0, 0, 0, 3, 1, 1, 0.75, 0, 0, 0, 0, 10, 0], _ - [1575, 'Blazing_Finale', 'Loderndes_Finale', 5, 6.5, 9, 40, 0, 28, 1, 7, 0, 0, 156, 0, 0, 0, 3, 1, 1, 0.75, 0, 4, 0, 0, 8, 0], _ - [1576, 'Burning_Refrain', 'Brennender_Refrain', 10, 13, 9, 40, 0, 28, 1, 3, 0, 0, 0, 0, 0, 0, 3, 1, 1, 0.75, 0, 4, 0, 0, 10, 0], _ - [1577, 'Finale_of_Restoration', 'Finale_der_Wiederherstellung', 5, 6.5, 9, 39, 0, 28, 15, 75, 0, 0, 0, 0, 0, 0, 3, 1, 1, 0.75, 0, 0, 6, 0, 10, 0], _ - [1578, 'Mending_Refrain', 'Genesungsrefrain', 10, 13, 9, 39, 0, 28, 2, 3, 0, 0, 0, 0, 0, 0, 3, 1, 1, 0.75, 0, 0, 6, 0, 8, 0], _ - [1579, 'Purifying_Finale', 'Reinigendes_Finale', 5, 6.5, 9, 39, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 1, 0.75, 0, 0, 4096, 0, 10, 0], _ - [1580, 'Bladeturn_Refrain', 'Klingenumkehr_Refrain', 5, 6.5, 9, 38, 0, 28, 5, 20, 0, 0, 0, 0, 0, 0, 3, 1, 1, 0.75, 0, 0, 0, 0, 8, 0], _ - [1581, 'Glowing_Signet', 'Glühendes_Siegel', 0, 0, 9, 40, 0, 7, 5, 15, 0, 0, 0, 0, 0, 0, 5, 1, 0.25, 0.75, 0, 0, 256, 0, 20, 0], _ - [1583, 'Leaders_Zeal', 'Eifer_des_Anführers', 5, 6.5, 9, 39, 0, 10, 2, 2, 8, 12, 240, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 12, 0], _ - [1584, 'Leaders_Comfort', 'Trost_des_Anführers', 5, 6.5, 9, 40, 0, 10, 30, 75, 10, 20, 140, 1000, 0, 0, 0, 1, 2, 0.75, 0, 0, 4, 0, 8, 0], _ - [1585, 'Signet_of_Synergy', 'Siegel_der_Synergie', 0, 0, 9, 39, 0, 7, 40, 100, 0, 0, 0, 0, 0, 0, 4, 1, 1, 0.75, 0, 0, 2, 0, 10, 0], _ - [1586, 'Angelic_Protection', 'Engelsschutz', 5, 6.5, 9, 40, 0, 10, 250, 100, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0.75, 0, 0, 0, 0, 30, 0], _ - [1587, 'Angelic_Bond', 'Engelsbindung', 5, 6.5, 9, 40, 0, 10, 20, 200, 0, 0, 1000, 0, 0, 0, 0, 1, 1, 0.75, 4, 0, 0, 0, 30, 0], _ - [1588, 'Cautery_Signet', 'Siegel_der_Verätzung', 0, 0, 9, 46, 0, 7, 1, 1, 0, 0, 5000, 0, 0, 0, 0, 1, 2, 0.75, 4, 0, 4096, 0, 15, 0], _ - [1589, 'Stand_Your_Ground', 'Haltet_Eure_Stellung', 10, 13, 9, 38, 0, 15, 24, 24, 0, 0, 1000, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 20, 0], _ - [1590, 'Lead_the_Way', 'Geht_voran', 10, 13, 9, 40, 0, 15, 20, 20, 25, 25, 1000, 0, 0, 0, 3, 1, 0, 0, 0, 0, 32768, 0, 8, 0], _ - [1591, 'Make_Haste', 'Beeilt_Euch', 5, 6.5, 9, 38, 0, 15, 33, 33, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 0, 0, 32768, 0, 10, 0], _ - [1592, 'We_Shall_Return', 'Wir_werden_wiederkommen', 25, 32.5, 9, 38, 0, 15, 25, 50, 5, 20, 1000, 0, 0, 0, 0, 1, 0, 0, 2048, 0, 8, 0, 30, 0], _ - [1593, 'Never_Give_Up', 'Gebt_nicht_auf', 5, 6.5, 9, 38, 0, 15, 75, 75, 1, 10, 1000, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 15, 0], _ - [1594, 'Help_Me', 'Helft_mir', 5, 6.5, 9, 38, 0, 15, 50, 50, 15, 90, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 10, 0], _ - [1595, 'Fall_Back', 'Zieht_Euch_zurück', 10, 13, 9, 38, 0, 15, 33, 33, 5, 15, 1000, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 20, 0], _ - [1596, 'Incoming', 'Schon_unterwegs', 5, 6.5, 9, 38, 0, 15, 33, 33, 5, 15, 1000, 0, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 20, 0], _ - [1597, 'Theyre_on_Fire', 'Sie_brennen', 10, 13, 9, 40, 0, 15, 5, 35, 0, 0, 1000, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 10, 0], _ - [1598, 'Never_Surrender', 'Ergebt_Euch_nicht', 5, 6.5, 9, 38, 0, 15, 75, 75, 1, 5, 1000, 0, 0, 0, 0, 1, 0, 0, 0, 0, 6, 0, 15, 0], _ - [1599, 'Its_Just_a_Flesh_Wound', 'Es_ist_nur_eine_Fleischwunde', 5, 6.5, 9, 39, 0, 15, 0, 0, 25, 25, 0, 0, 0, 0, 4, 1, 0, 0, 4, 0, 4096, 0, 2, 0], _ - [1600, 'Barbed_Spear', 'Stachelspeer', 0, 0, 9, 37, 0, 14, 0, 0, 5, 20, 0, 0, 0, 0, 5, 1, 0, 0, 0, 1, 0, 64, 0, 50], _ - [1601, 'Vicious_Attack', 'Bösartiger_Angriff', 5, 6.5, 9, 37, 0, 14, 5, 20, 5, 15, 0, 0, 0, 0, 5, 1, 0, 0, 0, 16, 0, 64, 8, 0], _ - [1602, 'Stunning_Strike', 'Betäubender_Schlag', 0, 0, 9, 37, 0, 14, 5, 30, 4, 10, 0, 0, 0, 0, 5, 1, 0, 0, 4, 512, 0, 64, 0, 250], _ - [1603, 'Merciless_Spear', 'Unbarmherziger_Speer', 0, 0, 9, 37, 0, 14, 50, 50, 5, 20, 0, 0, 0, 0, 5, 1, 0, 0, 0, 16, 0, 64, 0, 150], _ - [1604, 'Disrupting_Throw', 'Unterbrechender_Wurf', 5, 6.5, 9, 37, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 0.5, 1, 0, 0, 0, 64, 10, 0], _ - [1605, 'Wild_Throw', 'Wilder_Wurf', 0, 0, 9, 37, 0, 14, 5, 20, 3, 3, 3, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 64, 0, 175], _ - [1633, 'Malicious_Strike', 'Böswilliger_Stoß', 5, 6.5, 7, 35, 0, 14, 10, 30, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 185, 6, 0], _ - [1634, 'Shattering_Assault', 'Vernichtender_Angriff', 10, 13, 7, 35, 0, 14, 5, 50, 0, 0, 0, 0, 3, 4, 5, 1, 0, 0, 32772, 0, 0, 8, 6, 0], _ - [1635, 'Golden_Skull_Strike', 'Goldener_Schädel_Stoß', 10, 13, 7, 29, 0, 14, 0, 0, 0, 0, 0, 0, 2, 0, 5, 1, 0, 0, 4, 0, 0, 8, 15, 0], _ - [1636, 'Black_Spider_Strike', 'Schwarzer_Spinnen_Stoß', 10, 13, 7, 29, 0, 14, 5, 20, 5, 20, 0, 0, 2, 16, 5, 1, 0, 0, 0, 0, 0, 8, 12, 0], _ - [1637, 'Golden_Fox_Strike', 'Goldener_Fuchs_Stoß', 5, 6.5, 7, 29, 0, 14, 10, 30, 0, 0, 0, 0, 1, 0, 5, 1, 0, 0, 0, 0, 0, 8, 4, 0], _ - [1638, 'Deadly_Haste', 'Tödliche_Eile', 10, 13, 7, 35, 0, 6, 5, 50, 5, 50, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 20, 0], _ - [1639, 'Assassins_Remedy', 'Mittel_des_Assassinen', 5, 6.5, 7, 35, 0, 6, 1, 10, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 20, 0], _ - [1640, 'Foxs_Promise', 'Versprechen_des_Fuchses', 10, 13, 7, 29, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0.75, 4, 0, 0, 0, 20, 0], _ - [1641, 'Feigned_Neutrality', 'Vorgetäuschte_Neutralität', 5, 6.5, 7, 31, 0, 6, 7, 7, 80, 80, 0, 0, 0, 0, 0, 1, 0.25, 0.75, 0, 0, 4, 0, 25, 0], _ - [1642, 'Hidden_Caltrops', 'Versteckte_Trittnägel', 5, 6.5, 7, 31, 0, 4, 1, 15, 50, 50, 10, 0, 0, 0, 5, 1, 1, 0.75, 4, 0, 0, 0, 12, 0], _ - [1643, 'Assault_Enchantments', 'Verzauberungen_angreifen', 5, 6.5, 7, 46, 0, 10, 0, 0, 0, 0, 0, 0, 0, 1, 5, 1, 0.25, 0.75, 4, 0, 0, 0, 8, 0], _ - [1644, 'Wastrels_Collapse', 'Verfall_des_Verschwenders', 5, 6.5, 7, 46, 0, 10, 10, 10, 0, 0, 0, 0, 0, 0, 5, 1, 0.25, 0.75, 4, 0, 0, 0, 20, 0], _ - [1645, 'Lift_Enchantment', 'Verzauberung_lösen', 5, 6.5, 7, 46, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 0.25, 0.75, 2, 0, 0, 0, 10, 0], _ - [1646, 'Augury_of_Death', 'Todesomen', 5, 6.5, 7, 30, 0, 4, 50, 50, 5, 20, 0, 0, 0, 0, 5, 1, 1, 0.75, 8, 0, 0, 0, 20, 0], _ - [1647, 'Signet_of_Toxic_Shock', 'Siegel_des_toxischen_Schocks', 0, 0, 7, 30, 0, 7, 10, 100, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 15, 0], _ - [1648, 'Signet_of_Twilight', 'Siegel_des_Zwielichts', 0, 0, 7, 46, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 0, 0, 20, 0], _ - [1649, 'Way_of_the_Assassin', 'Weg_des_Assassinen', 5, 6.5, 7, 35, 0, 3, 5, 20, 5, 35, 0, 0, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 12, 0], _ - [1650, 'Shadow_Walk', 'Schattenmarsch', 5, 6.5, 7, 46, 0, 3, 1, 1, 10, 10, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 0, 30, 0], _ - [1651, 'Deaths_Retreat', 'Rückzug_des_Todes', 5, 6.5, 7, 31, 0, 5, 40, 130, 0, 0, 0, 0, 0, 0, 4, 1, 0.25, 0, 0, 0, 0, 0, 20, 0], _ - [1652, 'Shadow_Prison', 'Schattengefängnis', 10, 13, 7, 30, 0, 4, 66, 66, 0, 0, 0, 0, 0, 0, 5, 1, 0.25, 0.75, 4, 0, 0, 0, 25, 0], _ - [1653, 'Swap', 'Tauschen', 5, 6.5, 7, 46, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0.25, 0, 0, 0, 0, 0, 10, 0], _ - [1654, 'Shadow_Meld', 'Schattenverschmelzung', 10, 13, 7, 46, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0.25, 0, 4, 0, 0, 0, 20, 0], _ - [1655, 'Price_of_Pride', 'Preis_des_Stolzes', 5, 6.5, 5, 2, 0, 4, 1, 7, 0, 0, 0, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 0, 0, 8, 0], _ - [1656, 'Air_of_Disenchantment', 'Flair_der_Entzauberung', 10, 13, 5, 1, 0, 4, 150, 300, 0, 0, 240, 0, 0, 0, 5, 1, 1, 0.75, 4, 0, 0, 0, 10, 0], _ - [1657, 'Signet_of_Clumsiness', 'Siegel_der_Unbeholfenheit', 0, 0, 5, 1, 0, 7, 15, 60, 0, 0, 156, 0, 0, 0, 5, 1, 0.25, 0.75, 0, 0, 0, 0, 8, 0], _ - [1658, 'Symbolic_Posture', 'Symbolische_Haltung', 10, 13, 5, 0, 0, 3, 20, 80, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 20, 0], _ - [1659, 'Toxic_Chill', 'Toxische_Kälte', 5, 6.5, 4, 5, 0, 5, 15, 75, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 4, 0, 0, 0, 5, 0], _ - [1660, 'Well_of_Silence', 'Brunnen_der_Stille', 10, 13, 4, 7, 0, 9, 1, 4, 20, 20, 312, 0, 0, 0, 0, 1, 1, 0.75, 262656, 0, 0, 0, 20, 0], _ - [1661, 'Glowstone', 'Leuchtstein', 5, 6.5, 6, 9, 0, 5, 5, 50, 5, 5, 0, 0, 0, 0, 5, 1, 0.75, 0.75, 0, 0, 256, 0, 7, 0], _ - [1662, 'Mind_Blast', 'Geistige_Explosion', 5, 6.5, 6, 10, 0, 5, 15, 60, 1, 8, 0, 0, 0, 0, 5, 1, 1, 0.75, 4, 0, 0, 0, 2, 0], _ - [1663, 'Elemental_Flame', 'Elementare_Flamme', 5, 6.5, 6, 10, 0, 6, 1, 5, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 30, 0], _ - [1664, 'Invoke_Lightning', 'Blitz_herbeirufen', 10, 13, 6, 8, 0, 5, 10, 90, 25, 25, 240, 0, 0, 0, 5, 1, 1, 0.75, 5, 0, 0, 0, 6, 0], _ - [1683, 'Pensive_Guardian', 'Nachdenklicher_Wächter', 5, 6.5, 3, 15, 0, 6, 50, 50, 0, 0, 0, 0, 0, 0, 3, 1, 1, 0.75, 0, 0, 0, 0, 5, 0], _ - [1684, 'Scribes_Insight', 'Einblick_des_Schreibers', 5, 6.5, 3, 16, 0, 6, 3, 3, 0, 0, 0, 0, 0, 0, 0, 1, 0.25, 0.75, 4, 0, 256, 0, 20, 0], _ - [1685, 'Holy_Haste', 'Heilige_Eile', 10, 13, 3, 16, 0, 6, 50, 50, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 10, 0], _ - [1686, 'Glimmer_of_Light', 'Lichtschimmer', 5, 6.5, 3, 13, 0, 5, 10, 115, 0, 0, 0, 0, 0, 0, 3, 1, 0.25, 0.75, 4, 4096, 6, 0, 1, 0], _ - [1687, 'Zealous_Benediction', 'Eifrige_Segnung', 10, 13, 3, 15, 0, 5, 30, 180, 7, 7, 0, 0, 0, 0, 3, 1, 0.75, 0.75, 4, 4096, 6, 0, 4, 0], _ - [1688, 'Defenders_Zeal', 'Eifer_des_Verteidigers', 5, 6.5, 3, 14, 0, 4, 2, 2, 1, 4, 0, 0, 0, 0, 5, 1, 1, 0.75, 4, 0, 0, 0, 5, 0], _ - [1689, 'Signet_of_Mystic_Wrath', 'Siegel_des_mystischen_Zorns', 0, 0, 3, 14, 0, 7, 5, 35, 100, 100, 0, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 0, 0, 20, 0], _ - [1690, 'Signet_of_Removal', 'Siegel_der_Entfernung', 0, 0, 3, 46, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 1, 0.75, 4, 0, 0, 0, 5, 0], _ - [1691, 'Dismiss_Condition', 'Zustand_aufheben', 5, 6.5, 3, 15, 0, 5, 15, 75, 0, 0, 0, 0, 0, 0, 3, 1, 0.75, 0.75, 0, 0, 0, 0, 3, 0], _ - [1692, 'Divert_Hexes', 'Verhexungen_umleiten', 10, 13, 3, 15, 0, 5, 1, 3, 15, 75, 0, 0, 0, 0, 3, 1, 1, 0.75, 4, 4096, 2048, 0, 5, 0], _ - [1693, 'Counterattack', 'Gegenangriff', 5, 6.5, 1, 17, 0, 14, 5, 35, 2, 6, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 185, 6, 0], _ - [1694, 'Magehunter_Strike', 'Magierschlag', 5, 6.5, 1, 17, 0, 14, 5, 20, 0, 0, 0, 0, 0, 0, 5, 1, 0.5, 0, 4, 0, 0, 185, 3, 0], _ - [1695, 'Soldiers_Strike', 'Soldatenstoß', 5, 6.5, 1, 21, 0, 14, 10, 40, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 185, 4, 0], _ - [1696, 'Decapitate', 'Köpfen', 0, 0, 1, 18, 0, 14, 5, 50, 5, 20, 0, 0, 0, 0, 5, 1, 0, 0, 4, 0, 0, 1, 0, 200], _ - [1697, 'Magehunters_Smash', 'Magiejägerschmetterer', 0, 0, 1, 19, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 4, 0, 0, 16, 0, 200], _ - [1698, 'Soldiers_Stance', 'Soldaten_Haltung', 5, 6.5, 1, 21, 0, 3, 33, 33, 75, 75, 0, 0, 0, 0, 0, 1, 0, 0, 4, 0, 32768, 0, 15, 0], _ - [1699, 'Soldiers_Defense', 'Soldaten_Verteidigung', 5, 6.5, 1, 21, 0, 3, 75, 75, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 15, 0], _ - [1700, 'Frenzied_Defense', 'Fieberhafte_Verteidigung', 5, 6.5, 1, 46, 0, 3, 75, 75, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 128, 0, 10, 0], _ - [1701, 'Steady_Stance', 'Ruhige_Haltung', 5, 6.5, 1, 21, 0, 3, 1, 3, 1, 7, 0, 0, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 6, 0], _ - [1702, 'Steelfang_Slash', 'Hieb_des_stählernen_Fangzahns', 0, 0, 1, 20, 0, 14, 1, 31, 1, 5, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 128, 1, 200], _ - [1719, 'Screaming_Shot', 'Schreischuss', 10, 13, 2, 25, 0, 14, 10, 25, 5, 20, 1000, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 2, 8, 0], _ - [1720, 'Keen_Arrow', 'Scharfer_Pfeil', 5, 6.5, 2, 25, 0, 14, 5, 20, 5, 25, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 2, 6, 0], _ - [1721, 'Rampage_as_One', 'Gemeinsam_toben', 25, 32.5, 2, 22, 0, 16, 33, 33, 25, 25, 0, 0, 0, 0, 0, 1, 0, 0, 4, 0, 32768, 0, 10, 0], _ - [1722, 'Forked_Arrow', 'Gegabelter_Pfeil', 10, 13, 2, 46, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 2, 5, 0], _ - [1723, 'Disrupting_Accuracy', 'Unterbrechende_Genauigkeit', 5, 6.5, 2, 25, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0.75, 0, 0, 0, 0, 12, 0], _ - [1724, 'Experts_Dexterity', 'Gewandtheit_des_Profis', 5, 6.5, 2, 23, 0, 3, 33, 33, 2, 2, 0, 0, 0, 0, 0, 1, 0, 0.75, 4, 0, 0, 0, 20, 0], _ - [1725, 'Roaring_Winds', 'Tosender_Wind', 10, 13, 2, 24, 0, 22, 1, 10, 1, 5, 0, 0, 0, 0, 0, 1, 5, 0.75, 0, 0, 0, 0, 60, 0], _ - [1726, 'Magebane_Shot', 'Verderben_des_Magiers_Schuss', 10, 13, 2, 46, 0, 14, 10, 10, 0, 0, 0, 0, 0, 0, 5, 1, 0.5, 1.5, 4, 0, 0, 2, 5, 0], _ - [1727, 'Natural_Stride', 'Natürlicher_Schwung', 5, 6.5, 2, 24, 0, 3, 33, 33, 50, 50, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 128, 0, 12, 0], _ - [1728, 'Hekets_Rampage', 'Heket_Toben', 5, 6.5, 2, 22, 0, 3, 33, 33, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 32768, 0, 10, 0], _ - [1729, 'Smoke_Trap', 'Rauchfalle', 10, 13, 2, 24, 0, 21, 0, 0, 5, 10, 156, 240, 0, 0, 0, 1, 2, 0.75, 292, 0, 0, 0, 20, 0], _ - [1730, 'Infuriating_Heat', 'Irritierende_Hitze', 5, 6.5, 2, 23, 0, 22, 1, 10, 0, 0, 2500, 0, 0, 0, 0, 1, 3, 0.75, 4, 0, 0, 0, 15, 0], _ - [1731, 'Vocal_Was_Sogolon', 'Lautstark_war_Sogolon', 10, 13, 8, 33, 0, 24, 20, 50, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 30, 0], _ - [1732, 'Destructive_Was_Glaive', 'Vernichtend_war_Glaive', 5, 6.5, 8, 34, 0, 24, 15, 85, 20, 20, 312, 20, 0, 0, 0, 1, 0.75, 0.75, 4, 0, 8192, 0, 5, 0], _ - [1733, 'Wielders_Strike', 'Stoß_des_Ausübers', 5, 6.5, 8, 34, 0, 5, 5, 50, 10, 40, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 6, 0], _ - [1734, 'Gaze_of_Fury', 'Wütendes_Starren', 10, 13, 8, 34, 0, 22, 1, 14, 5, 20, 0, 0, 0, 0, 1, 1, 0.75, 0.75, 256, 0, 0, 0, 20, 0], _ - [1736, 'Spirits_Strength', 'Geistesstärke', 5, 6.5, 8, 36, 0, 6, 5, 35, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0.75, 4, 0, 0, 0, 30, 0], _ - [1737, 'Wielders_Zeal', 'Eifer_des_Ausübers', 10, 13, 8, 36, 0, 6, 1, 5, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0.75, 4, 0, 0, 0, 10, 0], _ - [1738, 'Sight_Beyond_Sight', 'Sicht_jenseits_der_Sicht', 5, 6.5, 8, 36, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0.25, 0.75, 0, 0, 0, 0, 15, 0], _ - [1739, 'Renewing_Memories', 'Erneuernde_Erinnerungen', 5, 6.5, 8, 36, 0, 6, 5, 35, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 20, 0], _ - [1740, 'Wielders_Remedy', 'Mittel_des_Ausübers', 5, 6.5, 8, 36, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 10, 0], _ - [1741, 'Ghostmirror_Light', 'Geisterspiegel_Licht', 5, 6.5, 8, 33, 0, 5, 15, 90, 0, 0, 1000, 0, 0, 0, 4, 1, 1, 0.75, 0, 0, 0, 0, 3, 0], _ - [1742, 'Signet_of_Ghostly_Might', 'Siegel_der_Macht_der_Geister', 0, 0, 8, 32, 0, 7, 33, 33, 5, 10, 1000, 0, 0, 0, 0, 1, 1, 0.75, 4, 0, 0, 0, 15, 0], _ - [1743, 'Signet_of_Binding', 'Siegel_der_Bindung', 0, 0, 8, 36, 0, 7, 200, 50, 0, 0, 0, 0, 0, 0, 1, 1, 2, 0.75, 64, 0, 0, 0, 15, 0], _ - [1744, 'Caretakers_Charge', 'Angriff_des_Verwalters', 5, 6.5, 8, 34, 0, 5, 20, 75, 5, 50, 5, 0, 0, 0, 5, 1, 1, 0.75, 4, 0, 0, 0, 4, 0], _ - [1745, 'Anguish', 'Qual', 15, 19.5, 8, 32, 0, 22, 1, 11, 5, 20, 2500, 0, 0, 0, 0, 1, 0.75, 0.75, 256, 0, 0, 0, 45, 0], _ - [1747, 'Empowerment', 'Ermächtigung', 5, 6.5, 8, 36, 0, 22, 1, 14, 15, 45, 2500, 10, 0, 0, 0, 1, 0.75, 0.75, 256, 0, 0, 0, 30, 0], _ - [1748, 'Recovery', 'Gesundung', 15, 19.5, 8, 33, 0, 22, 1, 14, 20, 50, 0, 0, 0, 0, 0, 1, 0.75, 0.75, 256, 0, 0, 0, 30, 0], _ - [1749, 'Weapon_of_Fury', 'Waffe_der_Wut', 5, 6.5, 8, 34, 0, 25, 5, 50, 1, 1, 0, 0, 0, 0, 3, 1, 1, 0.75, 4, 0, 0, 0, 8, 0], _ - [1750, 'Xinraes_Weapon', 'Xinraes_Waffe', 5, 6.5, 8, 33, 0, 25, 5, 5, 20, 80, 0, 0, 0, 0, 3, 1, 0.25, 0.75, 4, 0, 0, 0, 3, 0], _ - [1751, 'Warmongers_Weapon', 'Waffe_des_Kriegshetzers', 10, 13, 8, 34, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 1, 0.75, 0, 0, 0, 0, 30, 0], _ - [1752, 'Weapon_of_Remedy', 'Waffe_der_Behebung', 5, 6.5, 8, 33, 0, 25, 15, 75, 0, 0, 0, 0, 0, 0, 3, 1, 0.25, 0.75, 4, 0, 4102, 0, 3, 0], _ - [1753, 'Rending_Sweep', 'Zerreißender_Schwung', 0, 0, 10, 41, 0, 14, 5, 20, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 8192, 32, 0, 150], _ - [1754, 'Onslaught', 'Attacke', 10, 13, 10, 42, 0, 6, 25, 25, 25, 25, 0, 25, 0, 0, 0, 1, 0, 0, 8388612, 0, 0, 0, 10, 0], _ - [1755, 'Mystic_Corruption', 'Mystische_Verdorbenheit', 10, 13, 10, 44, 0, 6, 1, 2, 0, 0, 156, 1000, 0, 0, 0, 1, 0, 0, 8388608, 32, 512, 0, 10, 0], _ - [1756, 'Grenths_Grasp', 'Grenths_Griff', 5, 6.5, 10, 42, 0, 6, 1, 1, 1, 11, 156, 0, 0, 0, 0, 1, 0, 0, 8388612, 8, 0, 0, 10, 0], _ - [1757, 'Veil_of_Thorns', 'Dornenschleier', 10, 13, 10, 43, 0, 6, 5, 50, 5, 35, 240, 0, 0, 0, 0, 1, 0, 0, 8388608, 0, 512, 0, 15, 0], _ - [1758, 'Harriers_Grasp', 'Griff_des_Läufers', 10, 13, 10, 42, 0, 6, 1, 3, 2, 9, 0, 0, 0, 0, 0, 1, 0, 0, 8388608, 8, 0, 0, 15, 0], _ - [1759, 'Vow_of_Strength', 'Gelübde_der_Stärke', 5, 6.5, 10, 43, 0, 6, 10, 25, 0, 0, 156, 0, 0, 0, 0, 1, 0.25, 0.75, 4, 0, 0, 0, 20, 0], _ - [1760, 'Ebon_Dust_Aura', 'Ebon_Staubaura', 10, 13, 10, 43, 0, 6, 3, 15, 1, 7, 240, 0, 0, 0, 0, 1, 0, 0, 8388612, 2, 0, 0, 20, 0], _ - [1761, 'Zealous_Vow', 'Eifriges_Gelübde', 5, 6.5, 10, 42, 0, 6, 3, 3, 1, 6, 0, 0, 0, 0, 0, 1, 0.25, 0.75, 4, 0, 256, 0, 12, 0], _ - [1762, 'Heart_of_Fury', 'Herz_der_Wut', 0, 0, 10, 44, 0, 3, 25, 25, 0, 0, 0, 25, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 80], _ - [1763, 'Zealous_Renewal', 'Eifrige_Erneuerung', 5, 6.5, 10, 44, 0, 6, 5, 30, 1, 5, 240, 0, 0, 0, 0, 1, 0, 0, 8388608, 0, 768, 0, 10, 0], _ - [1764, 'Attackers_Insight', 'Einblick_des_Angreifers', 10, 13, 10, 42, 0, 6, 50, 50, 3, 15, 156, 0, 0, 0, 0, 1, 0, 0, 8388608, 1024, 0, 0, 10, 0], _ - [1765, 'Rending_Aura', 'Zerreißende_Aura', 10, 13, 10, 42, 0, 6, 10, 40, 1, 10, 240, 0, 0, 0, 0, 1, 0, 0, 8388608, 0, 512, 0, 6, 0], _ - [1766, 'Featherfoot_Grace', 'Anmut_des_Federfußes', 10, 13, 10, 42, 0, 6, 25, 25, 25, 25, 0, 0, 0, 0, 0, 1, 0.25, 0.75, 0, 0, 0, 0, 15, 0], _ - [1767, 'Reapers_Sweep', 'Schwung_des_Schnitters', 0, 0, 10, 41, 0, 14, 2, 3, 3, 15, 0, 0, 0, 0, 5, 1, 0, 0, 4, 128, 8192, 32, 0, 200], _ - [1768, 'Harriers_Haste', 'Eile_des_Läufers', 10, 13, 10, 42, 0, 6, 25, 25, 3, 12, 0, 0, 0, 0, 0, 1, 0, 0, 8388608, 0, 0, 0, 10, 0], _ - [1769, 'Focused_Anger', 'Konzentrierter_Zorn', 10, 13, 9, 40, 0, 16, 0, 150, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 60, 0], _ - [1770, 'Natural_Temper', 'Natürliche_Laune', 0, 0, 9, 40, 0, 16, 33, 33, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 75], _ - [1771, 'Song_of_Restoration', 'Gesang_der_Wiederherstellung', 10, 13, 9, 39, 0, 27, 45, 110, 0, 0, 1000, 0, 0, 0, 0, 1, 1, 0.75, 4, 0, 6, 0, 20, 0], _ - [1772, 'Lyric_of_Purification', 'Lyrik_der_Läuterung', 5, 6.5, 9, 39, 0, 27, 0, 0, 0, 0, 1000, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 4096, 0, 20, 0], _ - [1773, 'Soldiers_Fury', 'Wut_des_Soldaten', 5, 6.5, 9, 40, 0, 28, 33, 33, 33, 33, 0, 0, 0, 0, 0, 1, 1, 0.75, 4, 0, 32768, 0, 5, 0], _ - [1774, 'Aggressive_Refrain', 'Aggressiver_Refrain', 25, 32.5, 9, 40, 0, 28, 25, 25, 20, 20, 0, 0, 0, 0, 0, 1, 2, 0.75, 0, 0, 32768, 0, 20, 0], _ - [1775, 'Energizing_Finale', 'Energie_bringendes_Finale', 10, 13, 9, 39, 0, 28, 1, 1, 0, 0, 0, 0, 0, 0, 3, 1, 1, 0.75, 0, 0, 0, 0, 5, 0], _ - [1776, 'Signet_of_Aggression', 'Siegel_der_Aggression', 0, 0, 9, 46, 0, 7, 2, 2, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 5, 0], _ - [1777, 'Remedy_Signet', 'Heilmittel_Siegel', 0, 0, 9, 46, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 4096, 0, 4, 0], _ - [1778, 'Signet_of_Return', 'Siegel_der_Wiederkehr', 0, 0, 9, 40, 0, 7, 5, 15, 1, 4, 1000, 0, 0, 0, 6, 1, 5, 0.75, 2048, 0, 8, 0, 5, 0], _ - [1779, 'Make_Your_Time', 'Nehmt_Euch_Zeit', 10, 13, 9, 40, 0, 15, 1, 5, 0, 0, 1000, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 30, 0], _ - [1780, 'Cant_Touch_This', 'Cant_touch_this', 5, 6.5, 9, 38, 0, 15, 1, 5, 0, 0, 1000, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 20, 0], _ - [1781, 'Find_Their_Weakness', 'Findet_ihren_Schwachpunkt', 10, 13, 9, 38, 0, 15, 5, 50, 5, 20, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 0, 0, 15, 0], _ - [1782, 'The_Power_Is_Yours', 'Die_Macht_ist_Euer', 0, 0, 9, 39, 0, 15, 0, 1, 0, 0, 1000, 0, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 0, 100], _ - [1783, 'Slayers_Spear', 'Speer_des_Würgers', 10, 13, 9, 37, 0, 14, 5, 25, 5, 20, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 64, 4, 0], _ - [1784, 'Swift_Javelin', 'Schneller_Speer', 5, 6.5, 9, 37, 0, 14, 5, 20, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 64, 10, 0], _ - [1814, 'Lightbringers_Gaze', 'Blick_des_Lichtbringers', 5, 6.5, 0, 46, 0, 10, 100, 100, 1, 1, 312, 0, 0, 0, 5, 1, 1, 0.75, 524288, 0, 0, 0, 15, 0], _ - [1815, 'Lightbringer_Signet', 'Lichtbringer_Siegel', 0, 0, 0, 46, 0, 7, 3, 5, 16, 24, 312, 0, 0, 0, 0, 1, 0.25, 0.75, 524288, 0, 0, 0, 25, 0], _ - [1816, 'Sunspear_Rebirth_Signet', 'Sonnenspeer_Wiedergeburtssiegel', 0, 0, 0, 46, 0, 7, 10, 10, 0, 0, 0, 0, 0, 0, 6, 1, 3, 0.75, 526336, 0, 16, 0, 0, 0], _ - [1948, 'Shadow_Sanctuary_Luxon', 'Schattenzuflucht_Luxon', 5, 6.5, 7, 46, 0, 6, 7, 10, 5, 5, 40, 0, 0, 0, 0, 1, 0.25, 0.75, 524288, 0, 0, 0, 30, 0], _ - [1949, 'Ether_Nightmare_Luxon', 'Äther_Alptraum_Luxon', 10, 13, 5, 46, 0, 4, 5, 8, 1, 1, 312, 0, 0, 0, 5, 1, 3, 0.75, 524800, 0, 0, 0, 25, 0], _ - [1950, 'Signet_of_Corruption_Luxon', 'Siegel_der_Verdorbenheit_Luxon', 0, 0, 4, 46, 0, 7, 20, 30, 2, 2, 240, 0, 0, 0, 5, 1, 1, 0.75, 524288, 0, 0, 0, 20, 0], _ - [1951, 'Elemental_Lord_Luxon', 'Elementarlord_Luxon', 5, 6.5, 6, 46, 0, 6, 100, 300, 1, 1, 1, 0, 0, 0, 0, 1, 0.25, 0.75, 524288, 0, 0, 0, 45, 0], _ - [1952, 'Selfless_Spirit_Luxon', 'Selbstloser_Geist_Luxon', 5, 6.5, 3, 46, 0, 6, 3, 3, 0, 0, 0, 0, 0, 0, 0, 1, 0.25, 0.75, 524288, 0, 0, 0, 45, 0], _ - [1953, 'Triple_Shot_Luxon', 'Dreifachschuss_Luxon', 10, 13, 2, 46, 0, 14, 40, 25, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 524288, 0, 0, 2, 10, 0], _ - [1954, 'Save_Yourselves_Luxon', 'Rettet_Euch_selbst_Luxon', 0, 0, 1, 46, 0, 15, 100, 100, 0, 0, 1000, 0, 0, 0, 0, 1, 0, 0, 524288, 0, 0, 0, 0, 200], _ - [1955, 'Aura_of_Holy_Might_Luxon', 'Aura_der_Heiligen_Macht_Luxon', 10, 13, 10, 46, 0, 6, 0, 0, 20, 25, 156, 0, 0, 0, 0, 1, 0.75, 0.75, 524288, 0, 0, 0, 30, 0], _ - [1957, 'Spear_of_Fury_Luxon', 'Speer_der_Wut_Luxon', 5, 6.5, 9, 46, 0, 14, 30, 40, 3, 6, 0, 0, 0, 0, 5, 1, 1, 0.75, 524288, 0, 0, 64, 8, 0], _ - [1986, 'Vampiric_Assault', 'Vampirangriff', 5, 6.5, 7, 30, 0, 14, 10, 40, 0, 0, 0, 0, 3, 4, 5, 1, 0, 0, 32768, 0, 0, 8, 8, 0], _ - [1987, 'Lotus_Strike', 'Lotus_Stoß', 10, 13, 7, 29, 0, 14, 10, 25, 5, 20, 0, 0, 2, 2, 5, 1, 0, 0, 0, 0, 0, 8, 12, 0], _ - [1988, 'Golden_Fang_Strike', 'Goldfangstoß', 5, 6.5, 7, 29, 0, 14, 0, 0, 0, 0, 0, 0, 2, 2, 5, 1, 0, 0, 0, 0, 0, 8, 4, 0], _ - [1990, 'Falling_Lotus_Strike', 'Fallender_Lotus_Stoß', 5, 6.5, 7, 29, 0, 14, 15, 35, 1, 12, 0, 0, 2, 0, 5, 1, 0, 0, 0, 0, 0, 8, 12, 0], _ - [1991, 'Sadists_Signet', 'Siegel_des_Sadisten', 0, 0, 7, 30, 0, 7, 10, 40, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 4, 0, 8, 0], _ - [1992, 'Signet_of_Distraction', 'Siegel_der_Ablenkung', 0, 0, 5, 2, 0, 7, 1, 5, 0, 0, 0, 0, 0, 0, 5, 1, 0.25, 0.75, 0, 0, 1, 0, 15, 0], _ - [1993, 'Signet_of_Recall', 'Siegel_der_Zurückrufung', 0, 0, 5, 3, 0, 7, 4, 4, 13, 20, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 20, 0], _ - [1994, 'Power_Lock', 'Kraftsperre', 5, 6.5, 5, 2, 0, 5, 5, 13, 0, 0, 0, 0, 0, 0, 5, 1, 0.25, 0.75, 0, 0, 1, 0, 12, 0], _ - [1995, 'Waste_Not', 'Spare_in_der_Zeit_', 5, 6.5, 5, 3, 0, 5, 8, 13, 0, 0, 0, 0, 0, 0, 5, 1, 0.25, 0.75, 0, 0, 256, 0, 15, 0], _ - [1996, 'Sum_of_All_Fears', 'Summe_aller_Ängste', 10, 13, 5, 1, 0, 4, 33, 33, 0, 0, 0, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 0, 0, 10, 0], _ - [1997, 'Withering_Aura', 'Verkümmernde_Aura', 5, 6.5, 4, 5, 0, 6, 5, 20, 0, 0, 0, 0, 0, 0, 3, 1, 1, 0.75, 0, 0, 0, 0, 3, 0], _ - [1998, 'Cacophony', 'Kakophonie', 10, 13, 4, 7, 0, 4, 30, 105, 0, 0, 0, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 0, 0, 15, 0], _ - [1999, 'Winters_Embrace', 'Umarmung_des_Winters', 10, 13, 6, 11, 0, 4, 66, 66, 5, 15, 0, 0, 0, 0, 5, 1, 0.75, 0.75, 0, 2048, 0, 0, 15, 0], _ - [2000, 'Earthen_Shackles', 'Irdene_Fesseln', 10, 13, 6, 9, 0, 4, 90, 90, 5, 20, 240, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 15, 0], _ - [2001, 'Ward_of_Weakness', 'Kreis_der_Schwäche', 10, 13, 6, 9, 0, 11, 5, 20, 0, 0, 312, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 128, 0, 20, 0], _ - [2002, 'Glyph_of_Swiftness', 'Glyphe_der_Schnelligkeit', 5, 6.5, 6, 8, 0, 12, 1, 5, 25, 25, 200, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 10, 0], _ - [2003, 'Cure_Hex', 'Verhexung_heilen', 5, 6.5, 3, 13, 0, 5, 30, 120, 0, 0, 0, 0, 0, 0, 3, 1, 1, 0.75, 0, 4096, 2054, 0, 12, 0], _ - [2004, 'Smite_Condition', 'Zustand_zerschlagen', 5, 6.5, 3, 14, 0, 5, 10, 60, 0, 0, 240, 0, 0, 0, 3, 1, 1, 0.75, 0, 0, 4096, 0, 7, 0], _ - [2005, 'Smiters_Boon', 'Segen_des_Peinigers', 5, 6.5, 3, 16, 0, 6, 1, 5, 10, 33, 5, 0, 0, 0, 0, 1, 0.25, 0.75, 0, 0, 0, 0, 10, 0], _ - [2006, 'Castigation_Signet', 'Geißelungs_Siegel', 0, 0, 3, 14, 0, 7, 26, 56, 1, 10, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 256, 0, 20, 0], _ - [2007, 'Purifying_Veil', 'Reinigender_Schleier', 5, 6.5, 3, 15, 0, 6, 5, 50, 0, 0, 0, 0, 0, 0, 3, 1, 1, 0.75, 0, 0, 4096, 0, 6, 0], _ - [2008, 'Pulverizing_Smash', 'Zermalmender_Schlag', 0, 0, 1, 19, 128, 14, 5, 20, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 0, 1040, 0, 16, 0, 80], _ - [2009, 'Keen_Chop', 'Verwegener_Hieb', 0, 0, 1, 18, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 1, 0, 75], _ - [2010, 'Knee_Cutter', 'Knieschneider', 0, 0, 1, 20, 8, 14, 2, 7, 1, 3, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 256, 128, 1, 120], _ - [2011, 'Grapple', 'Raufen', 5, 6.5, 1, 46, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 0.75, 0, 2, 128, 0, 0, 12, 0], _ - [2012, 'Radiant_Scythe', 'Strahlende_Sense', 0, 0, 10, 41, 0, 14, 1, 7, 5, 30, 1, 0, 0, 0, 5, 1, 0, 0, 0, 0, 256, 32, 0, 150], _ - [2013, 'Grenths_Aura', 'Grenths_Aura', 10, 13, 10, 42, 0, 6, 5, 25, 5, 25, 156, 0, 0, 0, 0, 1, 0, 0, 8388608, 0, 512, 0, 10, 0], _ - [2014, 'Signet_of_Pious_Restraint', 'Siegel_der_frommen_Zurückhaltung', 0, 0, 10, 42, 0, 7, 5, 15, 75, 75, 240, 0, 0, 0, 5, 1, 1, 0.75, 0, 8, 8192, 0, 20, 0], _ - [2015, 'Farmers_Scythe', 'Sense_des_Bauern', 5, 6.5, 10, 41, 0, 14, 5, 20, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 32, 12, 0], _ - [2016, 'Energetic_Was_Lee_Sa', 'Energisch_war_Lee_Sa', 10, 13, 8, 36, 0, 24, 2, 2, 1, 10, 0, 0, 0, 0, 0, 1, 2, 0.75, 0, 0, 256, 0, 20, 0], _ - [2017, 'Anthem_of_Weariness', 'Hymne_der_Müdigkeit', 5, 6.5, 9, 38, 0, 27, 1, 16, 0, 0, 1000, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 10, 0], _ - [2018, 'Anthem_of_Disruption', 'Hymne_der_Störung', 10, 13, 9, 38, 0, 27, 0, 0, 0, 0, 1000, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 15, 0], _ - [2051, 'Summon_Spirits_Luxon', 'Geister_herbeirufen_Luxon', 5, 6.5, 8, 46, 0, 5, 60, 100, 0, 0, 5000, 72, 0, 0, 0, 1, 0.25, 0.75, 524288, 0, 0, 0, 5, 0], _ - [2052, 'Shadow_Fang', 'Schattenfangzahn', 10, 13, 7, 30, 0, 4, 5, 20, 0, 0, 0, 0, 0, 0, 5, 1, 0.25, 0.75, 0, 16, 0, 0, 45, 0], _ - [2053, 'Calculated_Risk', 'Kalkuliertes_Risiko', 5, 6.5, 5, 1, 0, 4, 50, 50, 15, 100, 0, 10, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 7, 0], _ - [2054, 'Shrinking_Armor', 'Schrumpfende_Rüstung', 5, 6.5, 5, 1, 0, 4, 1, 4, 5, 20, 0, 0, 0, 0, 5, 1, 1, 0.75, 512, 0, 0, 0, 8, 0], _ - [2055, 'Aneurysm', 'Aneurysma', 5, 6.5, 5, 2, 0, 5, 1, 3, 1, 30, 156, 1, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 5, 0], _ - [2056, 'Wandering_Eye', 'Wanderndes_Auge', 5, 6.5, 5, 1, 0, 4, 30, 110, 0, 0, 240, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 0, 0, 12, 0], _ - [2057, 'Foul_Feast', 'Widerliches_Gelage', 5, 6.5, 4, 6, 0, 5, 0, 45, 0, 2, 0, 0, 0, 0, 4, 1, 0.25, 0.75, 0, 0, 0, 0, 4, 0], _ - [2058, 'Putrid_Bile', 'Verwesende_Galle', 10, 13, 4, 5, 0, 4, 1, 3, 25, 85, 240, 0, 0, 0, 5, 1, 1, 0.75, 512, 0, 0, 0, 12, 0], _ - [2059, 'Shell_Shock', 'Kriegsneurose', 5, 6.5, 6, 8, 0, 5, 10, 30, 5, 20, 156, 156, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 8, 0], _ - [2060, 'Glyph_of_Immolation', 'Glyphe_der_Aufopferung', 5, 6.5, 6, 10, 0, 12, 1, 4, 1, 4, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 10, 0], _ - [2061, 'Patient_Spirit', 'Geduldiger_Geist', 5, 6.5, 3, 13, 0, 6, 30, 120, 0, 0, 0, 0, 0, 0, 3, 1, 0.25, 0.75, 0, 4096, 6, 0, 4, 0], _ - [2062, 'Healing_Ribbon', 'Heilendes_Band', 10, 13, 3, 13, 0, 5, 20, 110, 10, 100, 240, 0, 0, 0, 4, 1, 1, 0.75, 0, 4096, 6, 0, 5, 0], _ - [2063, 'Aura_of_Stability', 'Aura_der_Stabilität', 5, 6.5, 3, 15, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0.25, 0.75, 0, 0, 0, 0, 12, 0], _ - [2064, 'Spotless_Mind', 'Makelloser_Verstand', 5, 6.5, 3, 13, 0, 6, 5, 5, 0, 0, 0, 0, 0, 0, 4, 1, 0.25, 0.75, 0, 0, 2048, 0, 12, 0], _ - [2065, 'Spotless_Soul', 'Makellose_Seele', 5, 6.5, 3, 13, 0, 6, 3, 3, 0, 0, 0, 0, 0, 0, 4, 1, 0.25, 0.75, 0, 0, 4096, 0, 12, 0], _ - [2066, 'Disarm', 'Entwaffnen', 5, 6.5, 1, 17, 0, 14, 0, 3, 0, 0, 0, 0, 0, 0, 5, 1, 0.5, 0, 0, 0, 0, 128, 20, 0], _ - [2067, 'I_Meant_to_Do_That', 'Das_war_Absicht', 5, 6.5, 1, 17, 128, 15, 1, 5, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 8, 0], _ - [2068, 'Rapid_Fire', 'Schnellfeuer', 5, 6.5, 2, 25, 0, 19, 33, 33, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0.75, 256, 0, 0, 0, 12, 0], _ - [2069, 'Sloth_Hunters_Shot', 'Schuss_des_Faultierjägers', 10, 13, 2, 25, 0, 14, 10, 25, 10, 35, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 2, 8, 0], _ - [2070, 'Aura_Slicer', 'Auraschneider', 0, 0, 10, 44, 0, 14, 1, 10, 5, 15, 0, 0, 0, 0, 5, 1, 0, 0, 0, 1, 0, 185, 0, 80], _ - [2071, 'Zealous_Sweep', 'Eifriger_Schwung', 5, 6.5, 10, 41, 0, 14, 3, 3, 5, 20, 0, 1, 0, 0, 5, 1, 0, 0, 0, 0, 256, 32, 10, 0], _ - [2072, 'Pure_Was_Li_Ming', 'Rein_war_Li_Ming', 10, 13, 8, 33, 0, 24, 10, 50, 1, 4, 1000, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 4096, 0, 20, 0], _ - [2073, 'Weapon_of_Aggression', 'Waffe_der_Aggression', 10, 13, 8, 34, 0, 25, 25, 25, 0, 0, 0, 0, 0, 0, 0, 1, 0.25, 0.75, 0, 0, 0, 0, 10, 0], _ - [2074, 'Chest_Thumper', 'Brusttrommler', 5, 6.5, 9, 37, 0, 14, 5, 20, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 0, 16, 0, 64, 5, 0], _ - [2075, 'Hasty_Refrain', 'Hastiger_Refrain', 5, 6.5, 9, 40, 0, 28, 25, 25, 0, 0, 0, 0, 0, 0, 3, 1, 1, 0.75, 0, 0, 0, 0, 10, 0], _ - [2091, 'Shadow_Sanctuary_Kurzick', 'Schattenzuflucht_Kurzick', 5, 6.5, 7, 46, 0, 6, 7, 10, 5, 5, 40, 0, 0, 0, 0, 1, 0.25, 0.75, 524288, 0, 0, 0, 30, 0], _ - [2092, 'Ether_Nightmare_Kurzick', 'Äther_Alptraum_Kurzick', 10, 13, 5, 46, 0, 4, 5, 8, 1, 1, 312, 0, 0, 0, 5, 1, 3, 0.75, 524800, 0, 0, 0, 25, 0], _ - [2093, 'Signet_of_Corruption_Kurzick', 'Siegel_der_Verdorbenheit_Kurzick', 0, 0, 4, 46, 0, 7, 20, 30, 2, 2, 240, 0, 0, 0, 5, 1, 1, 0.75, 524288, 0, 0, 0, 20, 0], _ - [2094, 'Elemental_Lord_Kurzick', 'Elementarlord_Kurzick', 5, 6.5, 6, 46, 0, 6, 100, 300, 1, 1, 1, 0, 0, 0, 0, 1, 0.25, 0.75, 524288, 0, 0, 0, 45, 0], _ - [2095, 'Selfless_Spirit_Kurzick', 'Selbstloser_Geist_Kurzick', 5, 6.5, 3, 46, 0, 6, 3, 3, 0, 0, 0, 0, 0, 0, 0, 1, 0.25, 0.75, 524288, 0, 0, 0, 45, 0], _ - [2096, 'Triple_Shot_Kurzick', 'Dreifachschuss_Kurzick', 10, 13, 2, 46, 0, 14, 40, 25, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 524288, 0, 0, 2, 10, 0], _ - [2097, 'Save_Yourselves_Kurzick', 'Rettet_Euch_selbst_Kurzick', 0, 0, 1, 46, 0, 15, 100, 100, 0, 0, 1000, 0, 0, 0, 0, 1, 0, 0, 524288, 0, 0, 0, 0, 200], _ - [2098, 'Aura_of_Holy_Might_Kurzick', 'Aura_der_Heiligen_Macht_Kurzick', 10, 13, 10, 46, 0, 6, 0, 0, 20, 25, 156, 0, 0, 0, 0, 1, 0.75, 0.75, 524288, 0, 0, 0, 30, 0], _ - [2099, 'Spear_of_Fury_Kurzick', 'Speer_der_Wut_Kurzick', 5, 6.5, 9, 46, 0, 14, 30, 40, 3, 6, 0, 0, 0, 0, 5, 1, 1, 0.75, 524288, 0, 0, 64, 8, 0], _ - [2100, 'Summon_Spirits_Kurzick', 'Geister_herbeirufen_Kurzick', 5, 6.5, 8, 46, 0, 5, 60, 100, 0, 0, 5000, 72, 0, 0, 0, 1, 0.25, 0.75, 524288, 0, 0, 0, 5, 0], _ - [2101, 'Critical_Agility', 'Kritische_Beweglichkeit', 5, 6.5, 7, 46, 0, 6, 33, 33, 15, 25, 0, 0, 0, 0, 0, 1, 1, 0.75, 524288, 0, 0, 0, 30, 0], _ - [2102, 'Cry_of_Pain', 'Schmerzensschrei', 10, 13, 5, 46, 0, 5, 25, 50, 3, 5, 312, 0, 0, 0, 5, 1, 0.25, 0.75, 524288, 0, 0, 0, 15, 0], _ - [2103, 'Necrosis', 'Nekrose', 5, 6.5, 4, 46, 0, 10, 60, 90, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 524288, 0, 0, 0, 2, 0], _ - [2104, 'Intensity', 'Intensität', 5, 6.5, 6, 46, 0, 16, 0, 0, 60, 70, 312, 0, 0, 0, 0, 1, 0, 0, 524288, 0, 0, 0, 10, 0], _ - [2105, 'Seed_of_Life', 'Lebenssaat', 5, 6.5, 3, 46, 0, 6, 2, 2, 0, 0, 5000, 0, 0, 0, 4, 1, 0.25, 0.75, 524288, 0, 0, 0, 20, 0], _ - [2107, 'Whirlwind_Attack', 'Wirbelsturmangriff', 0, 0, 1, 46, 0, 14, 13, 20, 0, 0, 156, 0, 0, 0, 5, 1, 0, 0, 524288, 0, 0, 185, 1, 130], _ - [2108, 'Never_Rampage_Alone', 'Tobt_niemals_allein', 15, 19.5, 2, 46, 0, 16, 25, 25, 1, 3, 0, 0, 0, 0, 0, 1, 0, 0.75, 524288, 0, 0, 0, 20, 0], _ - [2109, 'Eternal_Aura', 'Ewige_Aura', 15, 19.5, 10, 46, 0, 6, 40, 50, 20, 30, 312, 100, 0, 0, 0, 1, 4, 0.75, 524288, 0, 0, 0, 30, 0], _ - [2110, 'Vampirism', 'Vampirismus', 10, 13, 8, 46, 0, 22, 4, 14, 10, 20, 0, 0, 0, 0, 0, 1, 0.75, 0.75, 524544, 0, 0, 0, 30, 0], _ - [2112, 'Theres_Nothing_to_Fear', 'Es_gibt_nichts_zu_befürchten', 15, 19.5, 9, 46, 0, 15, 20, 35, 35, 60, 1000, 0, 0, 0, 0, 1, 0, 0.75, 524288, 0, 0, 0, 20, 0], _ - [2116, 'Sneak_Attack', 'Überraschungsangriff', 5, 6.5, 0, 46, 0, 14, 0, 0, 0, 0, 0, 0, 1, 0, 5, 1, 0, 0, 524288, 2, 0, 185, 5, 0], _ - [2135, 'Trampling_Ox', 'Trampelnder_Ochse', 5, 6.5, 7, 29, 0, 14, 5, 20, 0, 0, 0, 0, 3, 4, 5, 1, 0, 0, 32768, 0, 0, 8, 8, 0], _ - [2136, 'Smoke_Powder_Defense', 'Rauchpulver_Verteidigung', 5, 6.5, 7, 31, 0, 3, 2, 6, 0, 0, 156, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 20, 0], _ - [2137, 'Confusing_Images', 'Verwirrende_Bilder', 10, 13, 5, 1, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 0, 0, 20, 0], _ - [2138, 'Hexers_Vigor', 'Lebenskraft_des_Verhexers', 5, 6.5, 4, 6, 0, 6, 1, 8, 0, 0, 0, 0, 0, 0, 0, 1, 0.25, 0.75, 0, 0, 0, 0, 10, 0], _ - [2139, 'Masochism', 'Masochismus', 5, 6.5, 4, 6, 0, 6, 2, 2, 5, 3, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 20, 0], _ - [2140, 'Piercing_Trap', 'Durchbohrende_Falle', 10, 13, 2, 24, 0, 21, 5, 50, 15, 60, 156, 240, 0, 0, 0, 1, 2, 0.75, 288, 0, 0, 0, 30, 0], _ - [2141, 'Companionship', 'Kameradschaft', 5, 6.5, 2, 22, 0, 10, 30, 120, 30, 120, 0, 0, 0, 0, 0, 1, 2, 0.75, 0, 0, 0, 0, 10, 0], _ - [2142, 'Feral_Aggression', 'Wilde_Aggression', 15, 19.5, 2, 22, 0, 10, 33, 33, 3, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 20, 0], _ - [2143, 'Disrupting_Shot', 'Unterbrechender_Schuss', 10, 13, 2, 25, 0, 14, 10, 40, 0, 0, 0, 0, 0, 0, 5, 1, 0.5, 1.5, 0, 0, 0, 2, 15, 0], _ - [2144, 'Volley', 'Salve', 5, 6.5, 2, 25, 0, 14, 3, 3, 1, 10, 156, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 2, 2, 0], _ - [2145, 'Expert_Focus', 'Expertenfokus', 10, 13, 2, 23, 0, 19, 1, 2, 1, 10, 0, 0, 0, 0, 0, 1, 2, 0.75, 256, 0, 0, 0, 12, 0], _ - [2146, 'Pious_Fury', 'Frommer_Zorn', 5, 6.5, 10, 44, 0, 3, 25, 25, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 8192, 0, 10, 0], _ - [2147, 'Crippling_Victory', 'Verkrüppelnder_Sieg', 0, 0, 10, 41, 0, 14, 0, 0, 10, 30, 156, 0, 0, 0, 5, 1, 0, 0, 0, 8, 0, 32, 0, 150], _ - [2148, 'Sundering_Weapon', 'Trennende_Waffe', 5, 6.5, 8, 32, 0, 25, 5, 20, 10, 10, 3, 0, 0, 0, 3, 1, 1, 0.75, 0, 0, 0, 0, 10, 0], _ - [2149, 'Weapon_of_Renewal', 'Waffe_der_Erneuerung', 5, 6.5, 8, 36, 0, 25, 1, 7, 0, 0, 0, 0, 0, 0, 3, 1, 1, 0.75, 0, 0, 0, 0, 10, 0], _ - [2150, 'Maiming_Spear', 'Verkrüppelungs_Speer', 5, 6.5, 9, 37, 0, 14, 5, 20, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 0, 8, 0, 64, 5, 0], _ - [2186, 'Signet_of_Deadly_Corruption', 'Siegel_der_tödlichen_Verdorbenheit', 0, 0, 7, 30, 0, 7, 5, 35, 130, 130, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 12, 0], _ - [2187, 'Way_of_the_Master', 'Weg_des_Meisters', 5, 6.5, 7, 35, 0, 6, 3, 33, 0, 0, 0, 0, 0, 0, 0, 1, 0.25, 0.75, 0, 0, 0, 0, 30, 0], _ - [2188, 'Defile_Defenses', 'Verteidigung_entweihen', 5, 6.5, 4, 7, 0, 4, 30, 120, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 5, 0], _ - [2189, 'Angorodons_Gaze', 'Angorodons_Starren', 5, 6.5, 4, 6, 0, 5, 10, 50, 3, 12, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 10, 0], _ - [2190, 'Magnetic_Surge', 'Magnetschub', 10, 13, 6, 9, 0, 6, 15, 75, 5, 15, 1000, 0, 0, 0, 5, 1, 1.5, 0.75, 0, 0, 0, 0, 15, 0], _ - [2191, 'Slippery_Ground', 'Rutschiger_Boden', 5, 6.5, 6, 11, 0, 5, 0, 0, 0, 0, 156, 0, 0, 0, 5, 1, 1, 0.75, 64, 0, 0, 0, 10, 0], _ - [2192, 'Glowing_Ice', 'Leuchtendes_Eis', 5, 6.5, 6, 11, 0, 5, 5, 50, 5, 5, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 8, 0], _ - [2193, 'Energy_Blast', 'Energieexplosion', 10, 13, 6, 12, 0, 5, 1, 2, 130, 130, 0, 0, 0, 0, 5, 1, 1.5, 0.75, 0, 0, 0, 0, 20, 0], _ - [2194, 'Distracting_Strike', 'Ablenkender_Stoß', 5, 6.5, 1, 46, 0, 14, 20, 20, 0, 0, 0, 0, 0, 0, 5, 1, 0.5, 0, 0, 0, 0, 185, 15, 0], _ - [2195, 'Symbolic_Strike', 'Symbolischer_Schlag', 0, 0, 1, 46, 0, 14, 12, 12, 70, 70, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 185, 0, 80], _ - [2196, 'Soldiers_Speed', 'Geschwindigkeit_des_Soldaten', 5, 6.5, 1, 21, 0, 3, 15, 15, 15, 15, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 12, 0], _ - [2197, 'Body_Blow', 'Körperschlag', 0, 0, 1, 17, 0, 14, 10, 40, 0, 15, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 185, 0, 160], _ - [2198, 'Body_Shot', 'Körperschuss', 5, 6.5, 2, 25, 0, 14, 5, 20, 5, 10, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 2, 8, 0], _ - [2199, 'Poison_Tip_Signet', 'Giftspitzen_Siegel', 0, 0, 2, 24, 0, 7, 8, 15, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 6, 0], _ - [2200, 'Signet_of_Mystic_Speed', 'Siegel_der_mystischen_Geschwindigkeit', 0, 0, 10, 42, 0, 7, 1, 3, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 20, 0], _ - [2201, 'Shield_of_Force', 'Kraftschild', 10, 13, 10, 43, 0, 6, 5, 20, 1, 1, 156, 0, 0, 0, 0, 1, 0, 0, 8388608, 1152, 0, 0, 12, 0], _ - [2202, 'Mending_Grip', 'Genesungsgriff', 5, 6.5, 8, 33, 0, 5, 15, 75, 0, 0, 0, 0, 0, 0, 3, 1, 1, 0.75, 0, 0, 0, 0, 6, 0], _ - [2203, 'Spiritleech_Aura', 'Geistsauger_Aura', 5, 6.5, 8, 33, 0, 10, 5, 20, 5, 20, 1000, 0, 0, 0, 0, 1, 0.25, 0.75, 0, 0, 0, 0, 20, 0], _ - [2204, 'Rejuvenation', 'Verjüngung', 10, 13, 8, 33, 0, 22, 1, 20, 3, 10, 1000, 0, 0, 0, 0, 1, 0.75, 0.75, 256, 0, 0, 0, 30, 0], _ - [2205, 'Agony', 'Todesqual', 10, 13, 8, 34, 0, 22, 1, 12, 3, 10, 1000, 0, 0, 0, 0, 1, 0.75, 0.75, 256, 0, 0, 0, 30, 0], _ - [2206, 'Ghostly_Weapon', 'Geisterwaffe', 5, 6.5, 8, 32, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0.25, 0.75, 0, 0, 0, 0, 1, 0], _ - [2207, 'Inspirational_Speech', 'Inspirative_Rede', 5, 6.5, 9, 39, 0, 10, 1, 4, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 20, 0], _ - [2208, 'Burning_Shield', 'Brennender_Schild', 5, 6.5, 9, 40, 0, 16, 1, 6, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 20, 0], _ - [2209, 'Holy_Spear', 'Heiliger_Speer', 0, 0, 9, 37, 0, 14, 5, 20, 15, 90, 240, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 64, 0, 100], _ - [2210, 'Spear_Swipe', 'Speerschlag', 10, 13, 9, 40, 0, 14, 5, 20, 4, 10, 0, 0, 0, 0, 5, 1, 0, 0, 2, 0, 0, 64, 20, 0], _ - [2211, 'Alkars_Alchemical_Acid', 'Alkars_Alchemiesäure', 10, 13, 0, 46, 0, 5, 45, 70, 40, 50, 156, 0, 0, 0, 5, 1, 1, 0.75, 524288, 0, 0, 0, 10, 0], _ - [2212, 'Light_of_Deldrimor', 'Licht_von_Deldrimor', 5, 6.5, 0, 46, 0, 5, 55, 80, 50, 50, 312, 0, 0, 0, 0, 1, 0.75, 0.75, 524288, 0, 0, 0, 20, 0], _ - [2213, 'Ear_Bite', 'Ohrenbiss', 0, 0, 0, 46, 0, 10, 15, 25, 50, 70, 0, 0, 0, 0, 5, 1, 0.75, 0.75, 524290, 0, 0, 0, 0, 100], _ - [2214, 'Low_Blow', 'Unter_der_Gürtellinie', 0, 0, 0, 46, 0, 10, 45, 70, 30, 50, 0, 0, 0, 0, 5, 1, 0.75, 0, 524290, 0, 0, 0, 0, 150], _ - [2215, 'Brawling_Headbutt', 'Rauf_Kopfstoß', 0, 0, 0, 46, 0, 10, 45, 70, 0, 0, 0, 0, 0, 0, 5, 1, 0.75, 0, 524290, 0, 0, 0, 0, 175], _ - [2216, 'Dont_Trip', 'Stolpert_nicht', 5, 6.5, 0, 46, 0, 15, 0, 0, 0, 0, 1000, 0, 0, 0, 0, 1, 0, 0, 524288, 0, 0, 0, 20, 0], _ - [2217, 'By_Urals_Hammer', 'Bei_Urals_Hammer', 5, 6.5, 0, 46, 0, 15, 25, 33, 0, 0, 1000, 2, 0, 0, 0, 1, 0, 0, 524288, 0, 0, 0, 60, 0], _ - [2218, 'Drunken_Master', 'Betrunkener_Meister', 5, 6.5, 0, 46, 0, 3, 10, 15, 25, 33, 0, 0, 0, 0, 0, 1, 0, 0.75, 524288, 0, 0, 0, 60, 0], _ - [2219, 'Great_Dwarf_Weapon', 'Waffe_des_Großen_Zwergs', 10, 13, 0, 46, 0, 25, 15, 20, 28, 40, 0, 0, 0, 0, 4, 1, 1, 0.75, 524288, 0, 0, 0, 5, 0], _ - [2220, 'Great_Dwarf_Armor', 'Rüstung_des_Großen_Zwergs', 5, 6.5, 0, 46, 0, 6, 24, 24, 24, 24, 60, 0, 0, 0, 3, 1, 1, 0.75, 524288, 0, 0, 0, 10, 0], _ - [2221, 'Breath_of_the_Great_Dwarf', 'Atem_des_Großen_Zwergs', 10, 13, 0, 46, 0, 5, 50, 60, 0, 0, 5000, 0, 0, 0, 0, 1, 0.25, 0.75, 524288, 0, 0, 0, 15, 0], _ - [2222, 'Snow_Storm', 'Schneesturm', 10, 13, 0, 46, 0, 5, 30, 40, 0, 0, 156, 0, 0, 0, 16, 1, 1, 0.75, 524288, 0, 0, 0, 10, 0], _ - [2223, 'Black_Powder_Mine', 'Schwarzpulvermine', 10, 13, 0, 46, 0, 21, 20, 30, 7, 10, 156, 240, 0, 0, 0, 1, 2, 0.75, 524576, 0, 0, 0, 20, 0], _ - [2224, 'Summon_Mursaat', 'Mursaat_herbeirufen', 10, 13, 0, 46, 0, 5, 14, 20, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0.75, 524288, 0, 0, 0, 60, 0], _ - [2225, 'Summon_Ruby_Djinn', 'Rubin_Dschinn_herbeirufen', 10, 13, 0, 46, 0, 5, 14, 20, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0.75, 524288, 0, 0, 0, 60, 0], _ - [2226, 'Summon_Ice_Imp', 'Eis_Kobold_herbeirufen', 10, 13, 0, 46, 0, 5, 14, 20, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0.75, 524288, 0, 0, 0, 60, 0], _ - [2227, 'Summon_Naga_Shaman', 'Naga_Schamanen_herbeirufen', 10, 13, 0, 46, 0, 5, 14, 20, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0.75, 524288, 0, 0, 0, 60, 0], _ - [2228, 'Deft_Strike', 'Geschickter_Schlag', 5, 6.5, 0, 46, 0, 14, 0, 0, 18, 30, 0, 0, 0, 0, 5, 1, 0.5, 0, 524288, 0, 0, 70, 8, 0], _ - [2229, 'Signet_of_Infection', 'Siegel_der_Infektion', 0, 0, 0, 46, 0, 7, 13, 20, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 524288, 0, 0, 0, 10, 0], _ - [2230, 'Tryptophan_Signet', 'Tryptophan_Siegel', 0, 0, 0, 46, 0, 7, 23, 40, 0, 0, 156, 0, 0, 0, 5, 1, 1, 0.75, 524288, 0, 0, 0, 15, 0], _ - [2231, 'Ebon_Battle_Standard_of_Courage', 'Ebon_Kampfstandarte_des_Mutes', 10, 13, 0, 46, 0, 11, 24, 24, 24, 24, 312, 0, 0, 0, 0, 1, 1, 0.75, 524288, 0, 0, 0, 20, 0], _ - [2232, 'Ebon_Battle_Standard_of_Wisdom', 'Ebon_Kampfstandarte_der_Weisheit', 10, 13, 0, 46, 0, 11, 44, 60, 0, 0, 312, 0, 0, 0, 0, 1, 1, 0.75, 524288, 0, 0, 0, 20, 0], _ - [2233, 'Ebon_Battle_Standard_of_Honor', 'Ebon_Kampfstandarte_der_Ehre', 10, 13, 0, 46, 0, 11, 8, 15, 7, 10, 312, 0, 0, 0, 0, 1, 1, 0.75, 524288, 0, 0, 0, 20, 0], _ - [2234, 'Ebon_Vanguard_Sniper_Support', 'Ebon_Vorhut_Heckenschützen_Unterstützung', 10, 13, 0, 46, 0, 5, 54, 90, 540, 900, 10, 25, 0, 0, 5, 1, 1, 0.75, 524288, 0, 0, 0, 15, 0], _ - [2235, 'Ebon_Vanguard_Assassin_Support', 'Ebon_Vorhut_Assassinen_Unterstützung', 10, 13, 0, 46, 0, 5, 14, 20, 12, 15, 0, 0, 0, 0, 5, 1, 1, 0.75, 524288, 0, 0, 0, 30, 0], _ - [2236, 'Well_of_Ruin', 'Brunnen_des_Ruins', 10, 13, 4, 7, 0, 9, 5, 20, 20, 20, 312, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 20, 0], _ - [2237, 'Atrophy', 'Schwund', 10, 13, 4, 7, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 20, 0], _ - [2238, 'Spear_of_Redemption', 'Speer_der_Erlösung', 0, 0, 9, 37, 0, 14, 5, 20, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 64, 0, 75], _ - [2353, 'Finish_Him', 'Erledigt_ihn', 10, 13, 0, 46, 0, 15, 44, 80, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 524288, 0, 0, 0, 15, 0], _ - [2354, 'Dodge_This', 'Weicht_aus', 0, 0, 0, 46, 0, 15, 14, 20, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 524288, 0, 0, 0, 0, 100], _ - [2355, 'I_Am_the_Strongest', 'Ich_bin_am_stärksten', 5, 6.5, 0, 46, 0, 15, 5, 8, 14, 20, 0, 0, 0, 0, 0, 1, 0, 0, 524288, 0, 0, 0, 20, 0], _ - [2356, 'I_Am_Unstoppable', 'Ich_bin_unaufhaltbar', 5, 6.5, 0, 46, 0, 15, 24, 24, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 524288, 0, 0, 0, 30, 0], _ - [2357, 'A_Touch_of_Guile', 'Ein_Funken_Arglist', 5, 6.5, 0, 46, 0, 4, 44, 80, 0, 0, 0, 0, 0, 0, 5, 1, 0.75, 0.75, 524290, 0, 0, 0, 15, 0], _ - [2358, 'You_Move_Like_a_Dwarf', 'Ihr_bewegt_Euch_wie_ein_Zwerg', 10, 13, 0, 46, 0, 15, 44, 80, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 524288, 0, 0, 0, 10, 0], _ - [2359, 'You_Are_All_Weaklings', 'Ihr_seid_alle_Schwächlinge', 5, 6.5, 0, 46, 0, 15, 0, 0, 0, 0, 156, 0, 0, 0, 5, 1, 0, 0, 524288, 0, 0, 0, 12, 0], _ - [2360, 'Feel_No_Pain', 'Den_Schmerz_nicht_spüren', 5, 6.5, 0, 46, 0, 16, 2, 3, 200, 300, 0, 0, 0, 0, 0, 1, 0, 0, 524288, 0, 0, 0, 20, 0], _ - [2361, 'Club_of_a_Thousand_Bears', 'Tausend_Bären_Prügel', 5, 6.5, 0, 46, 0, 14, 6, 9, 60, 60, 156, 0, 0, 0, 5, 1, 0, 0, 524288, 0, 0, 185, 12, 0], _ - [2374, 'Ursan_Blessing', 'Segen_der_Bärin', 10, 13, 0, 46, 0, 26, 20, 20, 750, 800, 60, 60, 0, 0, 0, 1, 0, 0, 524292, 0, 0, 0, 60, 0], _ - [2379, 'Volfen_Blessing', 'Segen_des_Wolfes', 10, 13, 0, 46, 0, 26, 2, 4, 660, 700, 60, 60, 0, 0, 0, 1, 0, 0, 524292, 0, 0, 0, 60, 0], _ - [2384, 'Raven_Blessing', 'Segen_des_Raben', 10, 13, 0, 46, 0, 26, 20, 30, 660, 700, 60, 60, 0, 0, 0, 1, 0, 0, 524292, 0, 0, 0, 60, 0], _ - [2411, 'Mindbender', 'Geistbrecher', 5, 6.5, 0, 46, 0, 6, 20, 33, 20, 20, 0, 0, 0, 0, 0, 1, 1, 0.75, 524288, 0, 0, 0, 24, 0], _ - [2412, 'Smooth_Criminal', 'Durchtriebener_Krimineller', 5, 6.5, 0, 46, 0, 5, 5, 10, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 524288, 0, 0, 0, 20, 0], _ - [2413, 'Technobabble', 'Technobabbel', 10, 13, 0, 46, 0, 5, 30, 40, 0, 0, 156, 0, 0, 0, 5, 1, 1, 0.75, 524288, 0, 0, 0, 10, 0], _ - [2414, 'Radiation_Field', 'Strahlungsfeld', 15, 19.5, 0, 46, 0, 11, 4, 6, 5, 5, 312, 0, 0, 0, 0, 1, 2, 0.75, 524288, 0, 0, 0, 12, 0], _ - [2415, 'Asuran_Scan', 'Asurischer_Scan', 5, 6.5, 0, 46, 0, 4, 0, 0, 5, 5, 0, 0, 0, 0, 5, 1, 0, 0.75, 524288, 0, 0, 0, 5, 0], _ - [2416, 'Air_of_Superiority', 'Hochnäsigkeit', 5, 6.5, 0, 46, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0.75, 524288, 0, 0, 0, 20, 0], _ - [2417, 'Mental_Block', 'Geistige_Sperre', 10, 13, 0, 46, 0, 6, 50, 50, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0.75, 524288, 0, 0, 0, 15, 0], _ - [2418, 'Pain_Inverter', 'Schmerztauscher', 10, 13, 0, 46, 0, 4, 100, 140, 80, 80, 0, 0, 0, 0, 5, 1, 1, 0.75, 524288, 0, 0, 0, 20, 0], _ - [2420, 'Ebon_Escape', 'Ebon_Flucht', 5, 6.5, 0, 46, 0, 5, 70, 110, 0, 0, 0, 0, 0, 0, 4, 1, 0.25, 0, 524288, 0, 0, 0, 10, 0], _ - [2421, 'Weakness_Trap', 'Schwäche_Falle', 10, 13, 0, 46, 0, 21, 10, 20, 24, 50, 156, 240, 0, 0, 0, 1, 2, 0.75, 524576, 0, 0, 0, 30, 0], _ - [2422, 'Winds', 'Winde', 5, 6.5, 0, 46, 0, 22, 4, 10, 15, 15, 2500, 0, 0, 0, 0, 1, 5, 0.75, 524288, 0, 0, 0, 30, 0], _ - [2423, 'Dwarven_Stability', 'Zwergenstabilität', 5, 6.5, 0, 46, 0, 6, 55, 100, 0, 0, 0, 0, 0, 0, 0, 1, 0.25, 0, 524288, 0, 0, 0, 30, 0], _ - [2551, 'Veteran Norn Hunting Party', 'none', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]] \ No newline at end of file +1324 +#include-once + +Global $aArray_Of_Skill_Data[3000][27] = [ _ + [0, 'No_Skill', 'Kein_Skill', 0, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], _ + [1, 'Healing_Signet', 'Siegel_der_Heilung', 0, 0, 1, 21, 0, 7, 82, 172, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0.75, 128, 0, 4, 0, 4, 0], _ + [2, 'Resurrection_Signet', 'Siegel_der_Wiederbelebung', 0, 0, 0, 46, 0, 7, 100, 100, 25, 25, 0, 0, 0, 0, 6, 1, 3, 0, 2048, 0, 16, 0, 0, 0], _ + [3, 'Signet_of_Capture', 'Siegel_der_Erbeutung', 0, 0, 0, 46, 0, 7, 0, 0, 0, 0, 2000, 0, 0, 0, 0, 1, 2, 0.25, 524304, 0, 0, 0, 2, 0], _ + [5, 'Power_Block', 'Kraftblock', 15, 19.5, 5, 2, 0, 5, 1, 12, 0, 0, 0, 0, 0, 0, 5, 1, 0.25, 0.75, 4, 0, 1, 0, 20, 0], _ + [6, 'Mantra_of_Earth', 'Mantra_der_Erde', 10, 13, 5, 3, 0, 3, 26, 50, 2, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 20, 0], _ + [7, 'Mantra_of_Flame', 'Mantra_des_Feuers', 10, 13, 5, 3, 0, 3, 26, 50, 2, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 20, 0], _ + [8, 'Mantra_of_Frost', 'Mantra_des_Frosts', 10, 13, 5, 3, 0, 3, 26, 50, 2, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 20, 0], _ + [9, 'Mantra_of_Lightning', 'Mantra_des_Blitzes', 10, 13, 5, 3, 0, 3, 26, 50, 2, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 20, 0], _ + [10, 'Hex_Breaker', 'Gebrochene_Verhexung', 5, 6.5, 5, 2, 0, 3, 10, 46, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 15, 0], _ + [11, 'Distortion', 'Verzerrung', 5, 6.5, 5, 1, 0, 3, 75, 75, 2, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 128, 0, 8, 0], _ + [13, 'Mantra_of_Recovery', 'Mantra_der_Erholung', 5, 6.5, 5, 0, 0, 3, 33, 33, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 15, 0], _ + [14, 'Mantra_of_Persistence', 'Mantra_des_Bestehens', 5, 6.5, 5, 3, 0, 3, 10, 40, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 15, 0], _ + [15, 'Mantra_of_Inscriptions', 'Mantra_der_Inschriften', 10, 13, 5, 3, 0, 3, 10, 40, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 20, 0], _ + [16, 'Mantra_of_Concentration', 'Mantra_der_Konzentration', 5, 6.5, 5, 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 30, 0], _ + [17, 'Mantra_of_Resolve', 'Mantra_des_Abschlusses', 10, 13, 5, 3, 0, 3, 10, 4, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 20, 0], _ + [18, 'Mantra_of_Signets', 'Mantra_der_Siegel', 5, 6.5, 5, 3, 0, 3, 3, 3, 5, 60, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 20, 0], _ + [19, 'Fragility', 'Zerbrechlichkeit', 5, 6.5, 5, 1, 0, 4, 5, 20, 0, 0, 156, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 5, 0], _ + [21, 'Inspired_Enchantment', 'Inspirierte_Verzauberung', 10, 13, 5, 3, 0, 5, 3, 15, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 256, 0, 0, 0], _ + [22, 'Inspired_Hex', 'Inspirierte_Verhexung', 5, 6.5, 5, 3, 0, 5, 4, 10, 0, 0, 0, 0, 0, 0, 3, 1, 1, 0.75, 0, 0, 2304, 0, 0, 0], _ + [23, 'Power_Spike', 'Kraftdorn', 5, 6.5, 5, 2, 0, 5, 30, 120, 0, 0, 0, 0, 0, 0, 5, 1, 0.25, 0.75, 0, 0, 1, 0, 12, 0], _ + [24, 'Power_Leak', 'Kraftleck', 10, 13, 5, 2, 0, 5, 3, 17, 0, 0, 0, 0, 0, 0, 5, 1, 0.25, 0.75, 0, 0, 1, 0, 20, 0], _ + [25, 'Power_Drain', 'Kraftentzug', 5, 6.5, 5, 3, 0, 5, 1, 31, 0, 0, 0, 0, 0, 0, 5, 1, 0.25, 0.75, 0, 0, 257, 0, 20, 0], _ + [26, 'Empathy', 'Empathie', 10, 13, 5, 2, 0, 4, 10, 55, 1, 15, 0, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 0, 0, 10, 0], _ + [27, 'Shatter_Delusions', 'Täuschungen_brechen', 5, 6.5, 5, 2, 0, 5, 15, 75, 0, 0, 156, 0, 0, 0, 5, 1, 0.25, 0.75, 0, 0, 0, 0, 6, 0], _ + [28, 'Backfire', 'Rückschlag', 15, 19.5, 5, 2, 0, 4, 35, 140, 0, 0, 0, 0, 0, 0, 5, 1, 3, 0.75, 0, 0, 0, 0, 20, 0], _ + [29, 'Blackout', 'Blackout', 10, 13, 5, 2, 0, 10, 2, 6, 5, 5, 0, 0, 0, 0, 5, 1, 1, 0.75, 2, 0, 512, 0, 12, 0], _ + [30, 'Diversion', 'Ablenkung', 10, 13, 5, 2, 0, 4, 10, 56, 0, 0, 0, 0, 0, 0, 5, 1, 3, 0.75, 0, 0, 0, 0, 12, 0], _ + [31, 'Conjure_Phantasm', 'Trugbild_beschwören', 10, 13, 5, 1, 0, 4, 5, 5, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 512, 0, 0, 0, 5, 0], _ + [32, 'Illusion_of_Weakness', 'Illusion_der_Schwäche', 10, 13, 5, 1, 0, 6, 50, 240, 25, 25, 0, 0, 0, 0, 0, 1, 2, 0.75, 0, 0, 0, 0, 30, 0], _ + [33, 'Illusionary_Weaponry', 'Illusion_der_Waffen', 5, 6.5, 5, 1, 0, 6, 8, 40, 5, 5, 0, 0, 0, 0, 0, 1, 1, 0.75, 4, 0, 512, 0, 25, 0], _ + [34, 'Sympathetic_Visage', 'Sympathisches_Gesicht', 10, 13, 5, 1, 0, 6, 3, 3, 0, 0, 156, 0, 0, 0, 3, 1, 1, 0.75, 0, 0, 0, 0, 20, 0], _ + [35, 'Ignorance', 'Ignoranz', 15, 19.5, 5, 2, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 10, 0], _ + [36, 'Arcane_Conundrum', 'Arkanes_Rätsel', 10, 13, 5, 1, 0, 4, 200, 200, 1, 7, 156, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 0, 0, 20, 0], _ + [37, 'Illusion_of_Haste', 'Illusion_der_Eile', 5, 6.5, 5, 1, 0, 6, 33, 33, 3, 3, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 5, 0], _ + [38, 'Channeling', 'Kanalisieren', 5, 6.5, 5, 3, 0, 6, 1, 1, 0, 0, 312, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 256, 0, 15, 0], _ + [39, 'Energy_Surge', 'Energiewelle', 5, 6.5, 5, 2, 0, 5, 1, 10, 9, 9, 240, 0, 0, 0, 5, 1, 2, 0.75, 4, 0, 0, 0, 15, 0], _ + [40, 'Ether_Feast', 'Ätherschmaus', 5, 6.5, 5, 3, 0, 5, 3, 3, 20, 65, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 4, 0, 8, 0], _ + [41, 'Ether_Lord', 'Herr_über_den_Äther', 5, 6.5, 5, 3, 0, 4, 1, 3, 0, 0, 0, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 0, 0, 20, 0], _ + [42, 'Energy_Burn', 'Energiebrand', 10, 13, 5, 2, 0, 5, 1, 10, 9, 9, 0, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 0, 0, 20, 0], _ + [43, 'Clumsiness', 'Ungeschick', 10, 13, 5, 1, 0, 4, 10, 92, 0, 0, 156, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 0, 0, 8, 0], _ + [44, 'Phantom_Pain', 'Phantomschmerz', 5, 6.5, 5, 1, 0, 4, 1, 4, 5, 20, 0, 0, 0, 0, 5, 1, 2, 0.75, 512, 16, 0, 0, 15, 0], _ + [45, 'Ethereal_Burden', 'Ätherische_Bürde', 15, 19.5, 5, 1, 0, 4, 50, 50, 10, 18, 0, 0, 0, 0, 5, 1, 1.5, 0.75, 0, 0, 0, 0, 30, 0], _ + [46, 'Guilt', 'Schuld', 5, 6.5, 5, 2, 0, 4, 5, 14, 0, 0, 0, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 1, 0, 25, 0], _ + [47, 'Ineptitude', 'Unbeholfenheit', 10, 13, 5, 1, 0, 4, 30, 135, 0, 0, 156, 0, 0, 0, 5, 1, 1, 0.75, 4, 2, 0, 0, 15, 0], _ + [48, 'Spirit_of_Failure', 'Geist_des_Versagens', 15, 19.5, 5, 3, 0, 4, 25, 25, 1, 3, 0, 0, 0, 0, 5, 1, 3, 0.75, 0, 0, 0, 0, 20, 0], _ + [49, 'Mind_Wrack', 'Geistiges_Wrack', 5, 6.5, 5, 2, 0, 4, 15, 100, 5, 25, 0, 1, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 7, 0], _ + [50, 'Wastrels_Worry', 'Verschwendung', 5, 6.5, 5, 2, 0, 4, 20, 100, 0, 0, 156, 0, 0, 0, 5, 1, 0.25, 0.75, 0, 0, 0, 0, 1, 0], _ + [51, 'Shame', 'Schande', 10, 13, 5, 2, 0, 4, 5, 14, 0, 0, 0, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 1, 0, 30, 0], _ + [52, 'Panic', 'Panik', 10, 13, 5, 2, 0, 4, 2, 2, 10, 82, 240, 240, 0, 0, 16, 1, 1, 0.75, 4, 0, 0, 0, 15, 0], _ + [53, 'Migraine', 'Migräne', 10, 13, 5, 1, 0, 4, 1, 8, 200, 200, 0, 0, 0, 0, 5, 1, 2, 0.75, 516, 0, 0, 0, 12, 0], _ + [54, 'Crippling_Anguish', 'Verkrüppelnde_Qual', 5, 6.5, 5, 1, 0, 4, 1, 8, 50, 50, 0, 50, 0, 0, 5, 1, 1, 0.75, 516, 0, 0, 0, 12, 0], _ + [55, 'Fevered_Dreams', 'Fieberträume', 10, 13, 5, 1, 0, 4, 0, 0, 1, 3, 312, 0, 0, 0, 5, 1, 2, 0.75, 4, 0, 0, 0, 10, 0], _ + [56, 'Soothing_Images', 'Beruhigende_Bilder', 15, 19.5, 5, 1, 0, 4, 0, 0, 0, 0, 156, 0, 0, 0, 16, 1, 2, 0.75, 0, 0, 0, 0, 8, 0], _ + [57, 'Cry_of_Frustration', 'Schrei_der_Frustration', 10, 13, 5, 2, 0, 5, 15, 75, 0, 0, 312, 0, 0, 0, 5, 1, 0.25, 0.75, 0, 0, 1, 0, 15, 0], _ + [58, 'Signet_of_Midnight', 'Siegel_der_Mitternacht', 0, 0, 5, 46, 0, 7, 0, 0, 15, 15, 0, 0, 0, 0, 5, 1, 2, 0.75, 6, 2, 0, 0, 10, 0], _ + [59, 'Signet_of_Weariness', 'Siegel_der_Müdigkeit', 0, 0, 5, 2, 0, 7, 3, 8, 1, 12, 240, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 0, 0, 30, 0], _ + [61, 'Leech_Signet', 'Blutsauger_Siegel', 0, 0, 5, 3, 0, 7, 3, 15, 0, 0, 0, 0, 0, 0, 5, 1, 0.25, 0.75, 0, 0, 1, 0, 30, 0], _ + [62, 'Signet_of_Humility', 'Siegel_der_Demut', 0, 0, 5, 3, 0, 7, 1, 16, 10, 10, 0, 0, 0, 0, 5, 1, 3, 0.75, 0, 0, 0, 0, 20, 0], _ + [63, 'Keystone_Signet', 'Schlussstein_Siegel', 0, 0, 5, 0, 0, 7, 15, 60, 0, 6, 156, 0, 0, 0, 0, 1, 1, 0.75, 4, 0, 0, 0, 15, 0], _ + [65, 'Arcane_Mimicry', 'Arkane_Mimikry', 15, 19.5, 5, 46, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 2, 0.75, 0, 0, 0, 0, 60, 0], _ + [66, 'Spirit_Shackles', 'Geistfesseln', 10, 13, 5, 3, 0, 4, 5, 5, 0, 0, 0, 0, 0, 0, 5, 1, 3, 0.75, 0, 0, 0, 0, 8, 0], _ + [67, 'Shatter_Hex', 'Verhexung_brechen', 10, 13, 5, 2, 0, 5, 30, 120, 0, 0, 240, 0, 0, 0, 3, 1, 1, 0.75, 0, 0, 2048, 0, 10, 0], _ + [68, 'Drain_Enchantment', 'Verzauberung_entziehen', 5, 6.5, 5, 3, 0, 5, 8, 17, 40, 120, 0, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 256, 0, 20, 0], _ + [69, 'Shatter_Enchantment', 'Verzauberung_brechen', 10, 13, 5, 2, 0, 5, 14, 100, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 20, 0], _ + [72, 'Elemental_Resistance', 'Elementarwiderstand', 10, 13, 5, 3, 0, 3, 40, 40, 24, 12, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 20, 0], _ + [73, 'Physical_Resistance', 'Körperlicher_Widerstand', 10, 13, 5, 3, 0, 3, 40, 40, 24, 12, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 20, 0], _ + [74, 'Echo', 'Echo', 5, 6.5, 5, 46, 0, 6, 30, 30, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0.75, 4, 0, 0, 0, 10, 0], _ + [75, 'Arcane_Echo', 'Arkanes_Echo', 15, 19.5, 5, 46, 0, 6, 20, 20, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0.75, 0, 0, 0, 0, 20, 0], _ + [76, 'Imagined_Burden', 'Eingebildete_Bürde', 15, 19.5, 5, 1, 0, 4, 50, 50, 0, 0, 156, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 30, 0], _ + [77, 'Chaos_Storm', 'Chaossturm', 5, 6.5, 5, 2, 0, 5, 5, 25, 0, 2, 156, 0, 0, 0, 16, 1, 2, 0.75, 0, 0, 0, 0, 30, 0], _ + [78, 'Epidemic', 'Epidemie', 5, 6.5, 5, 46, 0, 5, 0, 0, 0, 0, 156, 0, 0, 0, 5, 1, 0.25, 0.75, 0, 0, 0, 0, 5, 0], _ + [79, 'Energy_Drain', 'Energieentzug', 5, 6.5, 5, 3, 0, 5, 2, 9, 3, 3, 0, 0, 0, 0, 5, 1, 1, 0.75, 4, 0, 320, 0, 30, 0], _ + [80, 'Energy_Tap', 'Energie_abzapfen', 5, 6.5, 5, 3, 0, 5, 4, 7, 2, 2, 0, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 320, 0, 30, 0], _ + [81, 'Arcane_Thievery', 'Arkaner_Diebstahl', 10, 13, 5, 2, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 0, 0], _ + [82, 'Mantra_of_Recall', 'Mantra_der_Zurückrufung', 10, 13, 5, 3, 0, 6, 10, 25, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0.75, 4, 0, 256, 0, 30, 0], _ + [83, 'Animate_Bone_Horror', 'Knochenschreck_beleben', 10, 13, 4, 5, 0, 5, 1, 17, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0.75, 262144, 0, 0, 0, 5, 0], _ + [84, 'Animate_Bone_Fiend', 'Knochenteufel_beleben', 25, 32.5, 4, 5, 0, 5, 1, 17, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0.75, 262144, 0, 0, 0, 5, 0], _ + [85, 'Animate_Bone_Minions', 'Knochendiener_beleben', 15, 19.5, 4, 5, 0, 5, 0, 12, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0.75, 262144, 0, 0, 0, 5, 0], _ + [86, 'Grenths_Balance', 'Grenths_Ausgleich', 10, 13, 4, 46, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 0.25, 0.75, 4, 0, 4, 0, 10, 0], _ + [87, 'Veratas_Gaze', 'Veratas_Starren', 5, 6.5, 4, 5, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 64, 0, 32, 0, 5, 0], _ + [88, 'Veratas_Aura', 'Veratas_Aura', 15, 19.5, 4, 5, 0, 6, 33, 33, 0, 0, 312, 0, 0, 0, 0, 1, 0.75, 0.75, 64, 0, 32, 0, 30, 0], _ + [89, 'Deathly_Chill', 'Tödliche_Kühlung', 10, 13, 4, 5, 0, 5, 5, 50, 5, 50, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 5, 0], _ + [90, 'Veratas_Sacrifice', 'Veratas_Opfer', 10, 13, 4, 5, 0, 5, 10, 10, 15, 15, 5000, 3, 0, 0, 0, 1, 2, 0.75, 0, 0, 32, 0, 60, 0], _ + [91, 'Well_of_Power', 'Brunnen_der_Kraft', 5, 6.5, 4, 4, 0, 9, 1, 6, 2, 2, 312, 33, 0, 0, 0, 1, 1, 0.75, 262148, 0, 0, 0, 15, 0], _ + [92, 'Well_of_Blood', 'Brunnen_des_Blutes', 10, 13, 4, 4, 0, 9, 1, 6, 33, 33, 312, 0, 0, 0, 0, 1, 1, 0.75, 262144, 0, 0, 0, 2, 0], _ + [93, 'Well_of_Suffering', 'Brunnen_des_Leidens', 10, 13, 4, 5, 0, 9, 1, 6, 0, 0, 312, 0, 0, 0, 0, 1, 1, 0.75, 262656, 0, 0, 0, 10, 0], _ + [94, 'Well_of_the_Profane', 'Gottloser_Brunnen', 25, 32.5, 4, 5, 0, 9, 40, 40, 0, 0, 312, 0, 0, 0, 0, 1, 3, 0.75, 262208, 0, 0, 0, 10, 0], _ + [95, 'Putrid_Explosion', 'Explosion_der_Verwesung', 10, 13, 4, 5, 0, 5, 24, 120, 0, 0, 240, 0, 0, 0, 1, 1, 1, 0.75, 262144, 0, 0, 0, 5, 0], _ + [96, 'Soul_Feast', 'Seelenschmaus', 10, 13, 4, 5, 0, 5, 50, 280, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0.75, 262144, 0, 4, 0, 0, 0], _ + [97, 'Necrotic_Traversal', 'Nekrotische_Verwechslung', 5, 6.5, 4, 5, 0, 5, 5, 20, 0, 0, 240, 0, 0, 0, 0, 1, 0.75, 0.75, 262144, 0, 0, 0, 0, 0], _ + [98, 'Consume_Corpse', 'Kadaver_verzehren', 10, 13, 4, 5, 0, 5, 25, 100, 5, 20, 0, 0, 0, 0, 0, 1, 1, 0.75, 262144, 0, 288, 0, 0, 0], _ + [99, 'Parasitic_Bond', 'Parasitäre_Fesseln', 5, 6.5, 4, 7, 0, 4, 1, 1, 30, 120, 0, 0, 0, 0, 5, 1, 1, 0.75, 512, 0, 0, 0, 2, 0], _ + [100, 'Soul_Barbs', 'Seelenwiderhaken', 10, 13, 4, 7, 0, 4, 15, 30, 0, 0, 0, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 0, 0, 20, 0], _ + [101, 'Barbs', 'Widerhaken', 10, 13, 4, 7, 0, 4, 1, 15, 0, 0, 0, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 0, 0, 5, 0], _ + [102, 'Shadow_Strike', 'Schattenschlag', 10, 13, 4, 4, 0, 5, 12, 48, 12, 48, 0, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 0, 0, 15, 0], _ + [103, 'Price_of_Failure', 'Preis_des_Versagens', 15, 19.5, 4, 7, 0, 4, 1, 46, 25, 25, 0, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 0, 0, 20, 0], _ + [104, 'Death_Nova', 'Todesnova', 5, 6.5, 4, 5, 0, 6, 26, 100, 15, 15, 156, 90, 0, 0, 3, 1, 2, 0.75, 0, 0, 0, 0, 0, 0], _ + [105, 'Deathly_Swarm', 'Tödlicher_Schwarm', 10, 13, 4, 5, 0, 5, 30, 90, 0, 0, 312, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 0, 0, 6, 0], _ + [106, 'Rotting_Flesh', 'Verrottendes_Fleisch', 15, 19.5, 4, 5, 0, 5, 0, 0, 10, 25, 0, 0, 0, 0, 5, 1, 3, 0.75, 0, 32, 0, 0, 3, 0], _ + [107, 'Virulence', 'Ansteckung', 5, 6.5, 4, 5, 0, 5, 0, 0, 3, 15, 0, 0, 0, 0, 5, 1, 1, 0.75, 4, 32, 0, 0, 15, 0], _ + [108, 'Suffering', 'Leiden', 15, 19.5, 4, 7, 0, 4, 0, 3, 0, 0, 240, 0, 0, 0, 16, 1, 1, 0.75, 512, 0, 0, 0, 10, 0], _ + [109, 'Life_Siphon', 'Leben_abzapfen', 10, 13, 4, 4, 0, 4, 1, 3, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 512, 0, 0, 0, 5, 0], _ + [110, 'Unholy_Feast', 'Unheiliger_Schmaus', 15, 19.5, 4, 4, 0, 5, 10, 65, 1, 4, 312, 0, 0, 0, 0, 1, 0.75, 0.75, 0, 0, 516, 0, 8, 0], _ + [111, 'Awaken_the_Blood', 'Das_Blut_erwecken', 10, 13, 4, 4, 0, 6, 2, 2, 50, 50, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 45, 0], _ + [112, 'Desecrate_Enchantments', 'Verzauberungsschändung', 10, 13, 4, 7, 0, 5, 6, 60, 4, 20, 240, 0, 0, 0, 16, 1, 2, 0.75, 0, 0, 0, 0, 15, 0], _ + [113, 'Tainted_Flesh', 'Verdorbenes_Fleisch', 5, 6.5, 4, 5, 0, 6, 0, 0, 3, 15, 0, 0, 0, 0, 3, 1, 1, 0.75, 4, 32, 0, 0, 0, 0], _ + [114, 'Aura_of_the_Lich', 'Aura_des_Lich', 15, 19.5, 4, 5, 0, 6, 1, 17, 1, 1, 0, 0, 0, 0, 0, 1, 2, 0.75, 4, 0, 0, 0, 45, 0], _ + [115, 'Blood_Renewal', 'Bluterneuerung', 1, 1.3, 4, 4, 0, 6, 3, 6, 40, 190, 25, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 36, 0, 7, 0], _ + [116, 'Dark_Aura', 'Dunkle_Aura', 10, 13, 4, 5, 0, 6, 5, 50, 5, 20, 156, 0, 0, 0, 3, 1, 1, 0.75, 0, 0, 0, 0, 10, 0], _ + [117, 'Enfeeble', 'Schwächen', 5, 6.5, 4, 7, 0, 5, 0, 0, 10, 30, 0, 0, 0, 0, 5, 1, 0.25, 0.75, 0, 1024, 0, 0, 5, 0], _ + [118, 'Enfeebling_Blood', 'Schwächendes_Blut', 1, 1.3, 4, 7, 0, 5, 10, 10, 5, 20, 240, 0, 0, 0, 16, 1, 1, 0.75, 0, 1024, 32, 0, 8, 0], _ + [119, 'Blood_is_Power', 'Blut_ist_Kraft', 1, 1.3, 4, 4, 0, 6, 33, 33, 3, 6, 0, 0, 0, 0, 4, 1, 0.25, 0.75, 4, 0, 32, 0, 0, 0], _ + [120, 'Blood_of_the_Master', 'Blut_des_Meisters', 5, 6.5, 4, 5, 0, 5, 30, 116, 5, 5, 5000, 2, 0, 0, 0, 1, 1, 0.75, 0, 0, 32, 0, 2, 0], _ + [121, 'Spiteful_Spirit', 'Boshafter_Geist', 15, 19.5, 4, 7, 0, 4, 5, 35, 0, 0, 156, 0, 0, 0, 5, 1, 2, 0.75, 4, 0, 0, 0, 10, 0], _ + [122, 'Malign_Intervention', 'Unheilvoller_Eingriff', 10, 13, 4, 5, 0, 4, 1, 17, 80, 80, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 5, 0], _ + [123, 'Insidious_Parasite', 'Heimtückischer_Parasit', 15, 19.5, 4, 7, 0, 4, 15, 45, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 12, 0], _ + [124, 'Spinal_Shivers', 'Rückenschauer', 10, 13, 4, 7, 0, 4, 10, 5, 0, 0, 0, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 0, 0, 15, 0], _ + [125, 'Wither', 'Verwelken', 10, 13, 4, 7, 0, 4, 2, 4, 15, 75, 1, 0, 0, 0, 5, 1, 2, 0.75, 516, 0, 0, 0, 10, 0], _ + [126, 'Life_Transfer', 'Lebensübertragung', 5, 6.5, 4, 4, 0, 4, 3, 8, 0, 0, 156, 0, 0, 0, 5, 1, 1, 0.75, 516, 0, 4, 0, 20, 0], _ + [127, 'Mark_of_Subversion', 'Zeichen_der_Subversion', 10, 13, 4, 4, 0, 4, 10, 92, 0, 0, 0, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 0, 0, 30, 0], _ + [128, 'Soul_Leech', 'Seelenfresser', 10, 13, 4, 4, 0, 4, 16, 80, 0, 0, 0, 0, 0, 0, 5, 1, 2, 0.75, 4, 0, 0, 0, 15, 0], _ + [129, 'Defile_Flesh', 'Fleisch_schänden', 10, 13, 4, 7, 0, 4, 10, 10, 66, 66, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 32, 0, 10, 0], _ + [130, 'Demonic_Flesh', 'Dämonenfleisch', 5, 6.5, 4, 4, 0, 6, 5, 20, 80, 200, 156, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 32, 0, 30, 0], _ + [131, 'Barbed_Signet', 'Siegel_der_Widerhaken', 0, 0, 4, 4, 0, 7, 3, 15, 8, 8, 156, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 32, 0, 10, 0], _ + [132, 'Plague_Signet', 'Pest_Siegel', 0, 0, 4, 7, 0, 7, 100, 200, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 68, 0, 4096, 0, 4, 0], _ + [133, 'Dark_Pact', 'Dunkler_Pakt', 1, 1.3, 4, 4, 0, 5, 10, 10, 10, 48, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 32, 0, 2, 0], _ + [134, 'Order_of_Pain', 'Orden_der_Schmerzen', 10, 13, 4, 4, 0, 6, 17, 17, 3, 16, 5000, 0, 0, 0, 0, 1, 2, 0.75, 0, 0, 32, 0, 0, 0], _ + [135, 'Faintheartedness', 'Mutlosigkeit', 10, 13, 4, 7, 0, 4, 50, 50, 0, 3, 0, 0, 0, 0, 5, 1, 1, 0.75, 512, 0, 0, 0, 8, 0], _ + [136, 'Shadow_of_Fear', 'Schatten_der_Angst', 10, 13, 4, 7, 0, 4, 50, 50, 0, 0, 156, 0, 0, 0, 16, 1, 2, 0.75, 0, 0, 0, 0, 5, 0], _ + [137, 'Rigor_Mortis', 'Totenstarre', 10, 13, 4, 7, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 20, 0], _ + [138, 'Dark_Bond', 'Dunkles_Band', 5, 6.5, 4, 4, 0, 6, 75, 75, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0.75, 0, 0, 0, 0, 20, 0], _ + [139, 'Infuse_Condition', 'Zustand_einflößen', 5, 6.5, 4, 5, 0, 6, 75, 75, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 20, 0], _ + [140, 'Malaise', 'Unwohlsein', 5, 6.5, 4, 7, 0, 4, 1, 1, 5, 50, 0, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 0, 0, 2, 0], _ + [141, 'Rend_Enchantments', 'Verzauberungen_entreißen', 5, 6.5, 4, 7, 0, 5, 55, 25, 5, 9, 0, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 0, 0, 20, 0], _ + [142, 'Lingering_Curse', 'Bleibender_Fluch', 15, 19.5, 4, 7, 0, 4, 0, 3, 20, 20, 240, 0, 0, 0, 5, 1, 1, 0.75, 516, 0, 0, 0, 10, 0], _ + [143, 'Strip_Enchantment', 'Verzauberung_rauben', 10, 13, 4, 4, 0, 5, 0, 2, 5, 65, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 20, 0], _ + [144, 'Chilblains', 'Frostbeulen', 25, 32.5, 4, 7, 0, 5, 10, 44, 1, 2, 312, 10, 0, 0, 5, 1, 2, 0.75, 0, 32, 32, 0, 8, 0], _ + [145, 'Signet_of_Agony', 'Siegel_der_Qual', 0, 0, 4, 4, 0, 7, 10, 70, 10, 10, 240, 0, 0, 0, 0, 1, 0.75, 0.75, 0, 0, 32, 0, 8, 0], _ + [146, 'Offering_of_Blood', 'Blutopfer', 1, 1.3, 4, 4, 0, 5, 20, 20, 8, 20, 0, 0, 0, 0, 0, 1, 0.25, 0.75, 4, 0, 288, 0, 15, 0], _ + [147, 'Dark_Fury', 'Dunkle_Wut', 10, 13, 4, 4, 0, 6, 17, 17, 25, 25, 5000, 0, 0, 0, 0, 1, 0.75, 0.75, 64, 0, 32, 0, 5, 0], _ + [148, 'Order_of_the_Vampire', 'Orden_des_Vampirs', 5, 6.5, 4, 4, 0, 6, 3, 16, 17, 17, 5000, 0, 0, 0, 0, 1, 2, 0.75, 4, 0, 32, 0, 5, 0], _ + [149, 'Plague_Sending', 'Pest_aussenden', 1, 1.3, 4, 7, 0, 5, 10, 10, 1, 3, 156, 0, 0, 0, 16, 1, 1, 0.75, 0, 0, 32, 0, 5, 0], _ + [150, 'Mark_of_Pain', 'Zeichen_des_Schmerzes', 10, 13, 4, 7, 0, 4, 10, 40, 0, 0, 156, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 20, 0], _ + [151, 'Feast_of_Corruption', 'Schmaus_der_Verdorbenheit', 15, 19.5, 4, 7, 0, 5, 16, 80, 8, 40, 156, 0, 0, 0, 16, 1, 2, 0.75, 4, 0, 0, 0, 20, 0], _ + [152, 'Taste_of_Death', 'Geschmack_des_Todes', 5, 6.5, 4, 5, 0, 5, 100, 400, 0, 0, 0, 0, 0, 0, 14, 1, 0.25, 0.75, 0, 0, 0, 0, 0, 0], _ + [153, 'Vampiric_Gaze', 'Vampir_Starren', 10, 13, 4, 4, 0, 5, 18, 60, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 8, 0], _ + [154, 'Plague_Touch', 'Pest_Berührung', 5, 6.5, 4, 7, 0, 10, 1, 3, 0, 0, 0, 0, 0, 0, 5, 1, 0.75, 0.75, 2, 0, 4608, 0, 0, 0], _ + [155, 'Vile_Touch', 'Abscheuliche_Berührung', 10, 13, 4, 5, 0, 10, 20, 65, 0, 0, 0, 0, 0, 0, 5, 1, 0.75, 0.75, 2, 0, 512, 0, 2, 0], _ + [156, 'Vampiric_Touch', 'Vampir_Berührung', 15, 19.5, 4, 4, 0, 10, 29, 74, 0, 0, 0, 0, 0, 0, 5, 1, 0.75, 0.75, 2, 0, 544, 0, 2, 0], _ + [157, 'Blood_Ritual', 'Blutritual', 5, 6.5, 4, 4, 0, 6, 17, 17, 3, 3, 0, 0, 0, 0, 4, 1, 2, 0.75, 2, 0, 32, 0, 2, 0], _ + [158, 'Touch_of_Agony', 'Berührung_der_Qual', 1, 1.3, 4, 4, 0, 10, 10, 10, 20, 58, 0, 0, 0, 0, 5, 1, 0.75, 0.75, 2, 0, 544, 0, 3, 0], _ + [159, 'Weaken_Armor', 'Rüstung_schwächen', 5, 6.5, 4, 7, 0, 5, 0, 0, 0, 0, 156, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 5, 0], _ + [160, 'Windborne_Speed', 'Windgeschwindigkeit', 10, 13, 6, 8, 0, 6, 33, 33, 0, 0, 0, 0, 0, 0, 3, 1, 0.75, 0.75, 0, 0, 32768, 0, 5, 0], _ + [162, 'Gale', 'Orkan', 10, 13, 6, 8, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 65, 128, 0, 0, 5, 0], _ + [163, 'Whirlwind', 'Wirbelsturm', 5, 6.5, 6, 8, 0, 5, 15, 75, 0, 0, 156, 240, 0, 0, 0, 1, 0.75, 0.75, 0, 128, 512, 0, 8, 0], _ + [164, 'Elemental_Attunement', 'Elementareinstimmung', 10, 13, 6, 12, 0, 6, 50, 50, 1, 2, 0, 0, 0, 0, 0, 1, 1, 0.75, 4, 0, 131072, 0, 20, 0], _ + [165, 'Armor_of_Earth', 'Erdrüstung', 10, 13, 6, 9, 0, 6, 24, 60, 50, 14, 0, 0, 0, 0, 0, 1, 0.75, 0.75, 0, 0, 0, 0, 15, 0], _ + [166, 'Kinetic_Armor', 'Kinetik_Rüstung', 15, 19.5, 6, 9, 0, 6, 20, 80, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0.75, 0, 0, 0, 0, 60, 0], _ + [167, 'Eruption', 'Eruption', 25, 32.5, 6, 9, 0, 5, 10, 40, 10, 10, 240, 0, 0, 0, 16, 1, 2, 0.75, 0, 0, 0, 0, 30, 0], _ + [168, 'Magnetic_Aura', 'Magnet_Aura', 5, 6.5, 6, 9, 0, 6, 100, 100, 10, 50, 1000, 312, 0, 0, 0, 1, 1, 0.75, 0, 0, 128, 0, 12, 0], _ + [169, 'Earth_Attunement', 'Erdeinstimmung', 10, 13, 6, 9, 0, 6, 30, 30, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 131072, 0, 30, 0], _ + [170, 'Earthquake', 'Erdbeben', 25, 32.5, 6, 9, 0, 5, 26, 100, 0, 0, 240, 0, 0, 0, 16, 1, 3, 0.75, 1, 128, 0, 0, 15, 0], _ + [171, 'Stoning', 'Steinigung', 15, 19.5, 6, 9, 0, 5, 45, 105, 1800, 1800, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 5, 0], _ + [172, 'Stone_Daggers', 'Steindolche', 5, 6.5, 6, 9, 0, 5, 8, 33, 1800, 1800, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 0, 0], _ + [173, 'Grasping_Earth', 'Zupackende_Erde', 5, 6.5, 6, 9, 0, 4, 0, 0, 50, 50, 240, 0, 0, 0, 0, 1, 0.75, 0.75, 0, 64, 0, 0, 12, 0], _ + [174, 'Aftershock', 'Nachbeben', 10, 13, 6, 9, 128, 5, 26, 100, 10, 68, 240, 0, 0, 0, 0, 1, 0.75, 0.75, 0, 0, 512, 0, 10, 0], _ + [175, 'Ward_Against_Elements', 'Abwehr_gegen_Elemente', 15, 19.5, 6, 9, 0, 11, 24, 24, 0, 0, 312, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 20, 0], _ + [176, 'Ward_Against_Melee', 'Abwehr_gegen_Nahkampf', 15, 19.5, 6, 9, 0, 11, 50, 50, 0, 0, 312, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 128, 0, 30, 0], _ + [177, 'Ward_Against_Foes', 'Abwehr_gegen_Feinde', 15, 19.5, 6, 9, 0, 11, 50, 50, 0, 0, 312, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 20, 0], _ + [178, 'Ether_Prodigy', 'Ätherwunder', 5, 6.5, 6, 12, 0, 6, 6, 6, 2, 2, 0, 0, 0, 0, 0, 1, 1, 0.75, 5, 0, 8448, 0, 5, 0], _ + [179, 'Incendiary_Bonds', 'Brandbänder', 15, 19.5, 6, 10, 0, 4, 20, 80, 1, 3, 240, 0, 0, 0, 5, 1, 1, 0.75, 1, 4, 0, 0, 7, 0], _ + [180, 'Aura_of_Restoration', 'Wiederherstellungs_Aura', 5, 6.5, 6, 12, 0, 6, 200, 500, 0, 1, 0, 0, 0, 0, 0, 1, 0.25, 0.75, 0, 0, 0, 0, 20, 0], _ + [181, 'Ether_Renewal', 'Äthererneuerung', 10, 13, 6, 12, 0, 6, 1, 4, 5, 20, 0, 0, 0, 0, 0, 1, 1, 0.75, 4, 0, 256, 0, 30, 0], _ + [182, 'Conjure_Flame', 'Flammenbeschwörung', 10, 13, 6, 10, 0, 6, 5, 20, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 45, 0], _ + [183, 'Inferno', 'Inferno', 10, 13, 6, 10, 0, 5, 30, 135, 0, 0, 156, 0, 0, 0, 0, 1, 0.75, 0.75, 0, 0, 512, 0, 10, 0], _ + [184, 'Fire_Attunement', 'Feuereinstimmung', 10, 13, 6, 10, 0, 6, 30, 30, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 131072, 0, 30, 0], _ + [185, 'Mind_Burn', 'Geistige_Verbrennung', 5, 6.5, 6, 10, 0, 5, 15, 60, 1, 10, 156, 0, 0, 0, 5, 1, 1, 0.75, 5, 4, 0, 0, 5, 0], _ + [186, 'Fireball', 'Feuerball', 10, 13, 6, 10, 0, 5, 7, 112, 1800, 1800, 156, 0, 0, 0, 16, 1, 1.5, 0.75, 0, 0, 0, 0, 7, 0], _ + [187, 'Meteor', 'Meteor', 5, 6.5, 6, 10, 0, 5, 7, 112, 0, 0, 156, 0, 0, 0, 16, 1, 2, 0.75, 1, 0, 0, 0, 30, 0], _ + [188, 'Flame_Burst', 'Flammenstoß', 15, 19.5, 6, 10, 0, 5, 15, 120, 0, 0, 240, 0, 0, 0, 0, 1, 0.75, 0.75, 0, 0, 512, 0, 5, 0], _ + [189, 'Rodgort_s_Invocation', 'Anrufung_von_Rodgort', 25, 32.5, 6, 10, 0, 5, 15, 120, 1, 3, 240, 0, 0, 0, 16, 1, 2, 0.75, 0, 4, 0, 0, 8, 0], _ + [190, 'Mark_of_Rodgort', 'Zeichen_des_Rodgort', 15, 19.5, 6, 10, 0, 4, 0, 0, 1, 4, 240, 0, 0, 0, 5, 1, 1, 0.75, 0, 4, 0, 0, 15, 0], _ + [191, 'Immolate', 'Feueropfer', 10, 13, 6, 10, 0, 5, 20, 75, 1, 3, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 4, 0, 0, 5, 0], _ + [192, 'Meteor_Shower', 'Meteorschauer', 25, 32.5, 6, 10, 0, 5, 7, 112, 3, 3, 156, 0, 0, 0, 16, 1, 5, 0.75, 1, 128, 0, 0, 60, 0], _ + [193, 'Phoenix', 'Phönix', 15, 19.5, 6, 10, 0, 5, 20, 80, 10, 60, 240, 240, 0, 0, 16, 1, 1.5, 0.75, 0, 0, 0, 0, 7, 0], _ + [194, 'Flare', 'Feuergeschoss', 5, 6.5, 6, 10, 0, 5, 20, 65, 1800, 1800, 156, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 0, 0], _ + [195, 'Lava_Font', 'Lavabecken', 10, 13, 6, 10, 0, 5, 5, 50, 0, 0, 156, 240, 0, 0, 0, 1, 1.5, 0.75, 0, 0, 512, 0, 4, 0], _ + [196, 'Searing_Heat', 'Sengende_Hitze', 15, 19.5, 6, 10, 0, 5, 10, 40, 0, 0, 240, 0, 0, 0, 16, 1, 2, 0.75, 0, 4, 0, 0, 25, 0], _ + [197, 'Fire_Storm', 'Feuersturm', 10, 13, 6, 10, 0, 5, 5, 35, 33, 33, 156, 0, 0, 0, 16, 1, 2, 0.75, 0, 0, 0, 0, 20, 0], _ + [198, 'Glyph_of_Elemental_Power', 'Glyphe_der_Elementarkraft', 5, 6.5, 6, 46, 0, 12, 0, 0, 10, 10, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 5, 0], _ + [199, 'Glyph_of_Energy', 'Glyphe_der_Energie', 5, 6.5, 6, 12, 0, 12, 10, 25, 1, 2, 3, 0, 0, 0, 0, 1, 1, 0.75, 4, 0, 256, 0, 25, 0], _ + [200, 'Glyph_of_Lesser_Energy', 'Glyphe_der_geringeren_Energie', 5, 6.5, 6, 12, 0, 12, 10, 18, 2, 2, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 256, 0, 30, 0], _ + [201, 'Glyph_of_Concentration', 'Glyphe_der_Konzentration', 5, 6.5, 6, 46, 0, 12, 50, 50, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 10, 0], _ + [202, 'Glyph_of_Sacrifice', 'Glyphe_der_Opferung', 5, 6.5, 6, 46, 0, 12, 30, 30, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 15, 0], _ + [203, 'Glyph_of_Renewal', 'Glyphe_der_Erneuerung', 5, 6.5, 6, 46, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0.75, 4, 0, 0, 0, 10, 0], _ + [204, 'Rust', 'Rost', 10, 13, 6, 11, 0, 4, 1, 10, 10, 70, 156, 200, 0, 0, 16, 1, 1, 0.75, 0, 2048, 0, 0, 8, 0], _ + [205, 'Lightning_Surge', 'Blitzwelle', 15, 19.5, 6, 8, 0, 4, 14, 100, 5, 20, 0, 25, 0, 0, 5, 1, 1, 0.75, 4, 128, 0, 0, 10, 0], _ + [206, 'Armor_of_Frost', 'Frostrüstung', 5, 6.5, 6, 11, 0, 6, 40, 40, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 20, 0], _ + [207, 'Conjure_Frost', 'Frost_beschwören', 10, 13, 6, 11, 0, 6, 5, 20, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 45, 0], _ + [208, 'Water_Attunement', 'Wassereinstimmung', 10, 13, 6, 11, 0, 6, 30, 30, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 131072, 0, 30, 0], _ + [209, 'Mind_Freeze', 'Geistige_Erfrierung', 5, 6.5, 6, 11, 0, 4, 10, 60, 90, 90, 0, 0, 0, 0, 5, 1, 1, 0.75, 5, 2048, 0, 0, 5, 0], _ + [210, 'Ice_Prison', 'Eisgefängnis', 10, 13, 6, 11, 0, 4, 66, 66, 0, 0, 0, 0, 0, 0, 5, 1, 2, 0.75, 0, 2048, 0, 0, 30, 0], _ + [211, 'Ice_Spikes', 'Eisdornen', 15, 19.5, 6, 11, 0, 4, 20, 80, 66, 66, 156, 0, 0, 0, 16, 1, 1.5, 0.75, 0, 2048, 0, 0, 10, 0], _ + [212, 'Frozen_Burst', 'Frostexplosion', 15, 19.5, 6, 11, 0, 4, 10, 85, 66, 66, 240, 0, 0, 0, 0, 1, 0.75, 0.75, 0, 2048, 512, 0, 8, 0], _ + [213, 'Shard_Storm', 'Scherbensturm', 10, 13, 6, 11, 0, 4, 10, 85, 66, 66, 1800, 0, 0, 0, 5, 1, 1, 0.75, 0, 2048, 0, 0, 10, 0], _ + [214, 'Ice_Spear', 'Eisspeer', 5, 6.5, 6, 11, 0, 6, 10, 60, 1, 4, 240, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 0, 0], _ + [215, 'Maelstrom', 'Strudel', 25, 32.5, 6, 11, 0, 5, 10, 25, 0, 0, 156, 0, 0, 0, 16, 1, 2, 0.75, 1, 0, 0, 0, 30, 0], _ + [216, 'Iron_Mist', 'Eisenbeschlag', 10, 13, 6, 9, 0, 6, 25, 25, 15, 15, 0, 3, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 20, 0], _ + [217, 'Crystal_Wave', 'Kristallwelle', 15, 19.5, 6, 9, 0, 5, 10, 70, 5, 15, 156, 0, 0, 0, 0, 1, 0.75, 0.75, 0, 0, 512, 0, 15, 0], _ + [218, 'Obsidian_Flesh', 'Obsidianfleisch', 25, 32.5, 6, 9, 0, 6, 20, 20, 50, 50, 2, 0, 0, 0, 0, 1, 1, 0.75, 4, 0, 0, 0, 30, 0], _ + [219, 'Obsidian_Flame', 'Obsidianflamme', 5, 6.5, 6, 9, 0, 5, 22, 112, 0, 0, 0, 0, 0, 0, 5, 1, 1.5, 0.75, 1, 0, 0, 0, 5, 0], _ + [220, 'Blinding_Flash', 'Blitzblendung', 15, 19.5, 6, 8, 0, 5, 0, 0, 3, 8, 0, 0, 0, 0, 5, 1, 0.75, 0.75, 0, 2, 0, 0, 8, 0], _ + [221, 'Conjure_Lightning', 'Blitzbeschwörung', 10, 13, 6, 8, 0, 6, 5, 20, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 45, 0], _ + [222, 'Lightning_Strike', 'Blitzschlag', 5, 6.5, 6, 8, 0, 4, 5, 50, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 5, 0], _ + [223, 'Chain_Lightning', 'Kettenblitz', 10, 13, 6, 8, 0, 5, 10, 85, 0, 0, 240, 0, 0, 0, 5, 1, 2, 0.75, 1, 0, 0, 0, 6, 0], _ + [224, 'Enervating_Charge', 'Schwächende_Aufladung', 10, 13, 6, 8, 0, 5, 25, 50, 5, 20, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 1024, 0, 0, 8, 0], _ + [225, 'Air_Attunement', 'Lufteinstimmung', 10, 13, 6, 8, 0, 6, 30, 30, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 131072, 0, 30, 0], _ + [226, 'Mind_Shock', 'Geistiger_Schock', 5, 6.5, 6, 8, 0, 5, 10, 50, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 5, 128, 0, 0, 8, 0], _ + [227, 'Glimmering_Mark', 'Schimmerndes_Zeichen', 10, 13, 6, 8, 0, 4, 5, 25, 3, 3, 156, 0, 0, 0, 5, 1, 1, 0.75, 4, 0, 0, 0, 15, 0], _ + [228, 'Thunderclap', 'Donnerschlag', 10, 13, 6, 8, 0, 5, 10, 50, 5, 20, 156, 25, 0, 0, 5, 1, 1, 0.75, 4, 0, 0, 0, 8, 0], _ + [229, 'Lightning_Orb', 'Kugelblitz', 15, 19.5, 6, 8, 0, 5, 10, 100, 1800, 1800, 0, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 0, 0, 5, 0], _ + [230, 'Lightning_Javelin', 'Blitzspeer', 5, 6.5, 6, 8, 0, 5, 15, 50, 1, 10, 100, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 5, 0], _ + [231, 'Shock', 'Schock', 5, 6.5, 6, 8, 0, 10, 10, 60, 0, 0, 0, 0, 0, 0, 5, 1, 0.75, 0.75, 3, 128, 512, 0, 10, 0], _ + [232, 'Lightning_Touch', 'Blitz_Berührung', 5, 6.5, 6, 8, 2048, 10, 10, 60, 1, 4, 156, 0, 0, 0, 5, 1, 0.75, 0.75, 2, 0, 0, 0, 10, 0], _ + [233, 'Swirling_Aura', 'Wirbelnde_Aura', 10, 13, 6, 11, 0, 6, 1, 6, 50, 50, 1000, 312, 0, 0, 0, 1, 1, 0.75, 0, 0, 128, 0, 15, 0], _ + [234, 'Deep_Freeze', 'Tiefgefrieren', 25, 32.5, 6, 11, 0, 4, 10, 85, 66, 66, 312, 0, 0, 0, 16, 1, 2, 0.75, 0, 2048, 0, 0, 15, 0], _ + [235, 'Blurred_Vision', 'Verschwommene_Sicht', 10, 13, 6, 11, 0, 4, 50, 50, 0, 0, 156, 0, 0, 0, 5, 1, 1, 0.75, 0, 2048, 0, 0, 12, 0], _ + [236, 'Mist_Form', 'Nebelform', 10, 13, 6, 11, 0, 6, 33, 33, 50, 250, 1000, 105, 0, 0, 0, 1, 1, 0.75, 4, 0, 0, 0, 20, 0], _ + [237, 'Water_Trident', 'Wasserdreizack', 5, 6.5, 6, 11, 0, 5, 10, 90, 0, 0, 2400, 156, 0, 0, 5, 1, 1, 0.75, 4, 128, 0, 0, 3, 0], _ + [238, 'Armor_of_Mist', 'Nebelrüstung', 10, 13, 6, 11, 0, 6, 10, 40, 33, 33, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 30, 0], _ + [239, 'Ward_Against_Harm', 'Abwehr_gegen_Schaden', 15, 19.5, 6, 11, 0, 11, 12, 24, 1, 3, 312, 20, 0, 0, 0, 1, 1, 0.75, 4, 0, 0, 0, 20, 0], _ + [240, 'Smite', 'Peinigung', 10, 13, 3, 14, 0, 5, 10, 55, 10, 35, 156, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 10, 0], _ + [241, 'Life_Bond', 'Lebensbindung', 10, 13, 3, 15, 0, 6, 3, 30, 0, 0, 0, 0, 0, 0, 4, 1, 2, 0.75, 0, 0, 0, 0, 0, 0], _ + [242, 'Balthazars_Spirit', 'Balthasars_Geist', 10, 13, 3, 14, 0, 6, 1, 1, 2, 5, 0, 0, 0, 0, 3, 1, 2, 0.75, 0, 0, 0, 0, 0, 0], _ + [243, 'Strength_of_Honor', 'Stärke_der_Ehre', 10, 13, 3, 14, 0, 6, 5, 25, 0, 0, 0, 0, 0, 0, 3, 1, 2, 0.75, 0, 0, 0, 0, 15, 0], _ + [244, 'Life_Attunement', 'Lebenseinstimmung', 10, 13, 3, 15, 0, 6, 14, 50, 0, 0, 0, 0, 0, 0, 3, 1, 2, 0.75, 0, 0, 0, 0, 0, 0], _ + [245, 'Protective_Spirit', 'Schutzgeist', 10, 13, 3, 15, 0, 6, 10, 10, 0, 0, 0, 0, 0, 0, 3, 1, 0.25, 0.75, 0, 0, 0, 0, 5, 0], _ + [246, 'Divine_Intervention', 'Göttliche_Intervention', 5, 6.5, 3, 16, 0, 6, 26, 240, 0, 0, 0, 0, 0, 0, 3, 1, 0.25, 0.75, 0, 0, 16384, 0, 30, 0], _ + [247, 'Symbol_of_Wrath', 'Symbol_des_Zorns', 5, 6.5, 3, 14, 0, 5, 8, 32, 0, 0, 156, 0, 0, 0, 0, 1, 2, 0.75, 0, 0, 512, 0, 30, 0], _ + [248, 'Retribution', 'Vergeltung', 10, 13, 3, 14, 0, 6, 33, 33, 5, 20, 0, 0, 0, 0, 3, 1, 2, 0.75, 0, 0, 0, 0, 0, 0], _ + [249, 'Holy_Wrath', 'Heiliger_Zorn', 10, 13, 3, 14, 0, 6, 1, 10, 5, 50, 66, 0, 0, 0, 4, 1, 1, 0.75, 0, 0, 16384, 0, 10, 0], _ + [250, 'Essence_Bond', 'Essenzbindung', 10, 13, 3, 46, 0, 6, 1, 1, 0, 0, 0, 0, 0, 0, 3, 1, 2, 0.75, 0, 0, 0, 0, 0, 0], _ + [251, 'Scourge_Healing', 'Geißelheilung', 10, 13, 3, 14, 0, 4, 15, 80, 0, 0, 0, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 0, 0, 5, 0], _ + [252, 'Banish', 'Verbannung', 5, 6.5, 3, 14, 0, 5, 20, 56, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 10, 0], _ + [253, 'Scourge_Sacrifice', 'Geißelopfer', 10, 13, 3, 14, 0, 4, 100, 100, 0, 0, 156, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 5, 0], _ + [254, 'Vigorous_Spirit', 'Energischer_Geist', 5, 6.5, 3, 13, 0, 6, 5, 20, 0, 0, 0, 0, 0, 0, 3, 1, 0.25, 0.75, 0, 4096, 0, 0, 4, 0], _ + [255, 'Watchful_Spirit', 'Wachsamer_Geist', 15, 19.5, 3, 16, 0, 6, 2, 2, 30, 180, 0, 0, 0, 0, 3, 1, 1, 0.75, 0, 4096, 6, 0, 5, 0], _ + [256, 'Blessed_Aura', 'Gesegnete_Aura', 10, 13, 3, 16, 0, 6, 10, 35, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0.75, 0, 0, 0, 0, 2, 0], _ + [257, 'Aegis', 'Aegis', 10, 13, 3, 15, 0, 6, 50, 50, 0, 0, 1000, 0, 0, 0, 0, 1, 2, 0.75, 0, 0, 128, 0, 30, 0], _ + [258, 'Guardian', 'Wächter', 5, 6.5, 3, 15, 0, 6, 50, 50, 0, 0, 0, 0, 0, 0, 3, 1, 1, 0.75, 0, 0, 128, 0, 4, 0], _ + [259, 'Shield_of_Deflection', 'Ablenkungsschild', 10, 13, 3, 15, 0, 6, 75, 75, 15, 30, 0, 0, 0, 0, 3, 1, 0.25, 0.75, 4, 0, 128, 0, 10, 0], _ + [260, 'Aura_of_Faith', 'Glaubensaura', 5, 6.5, 3, 15, 0, 6, 50, 100, 5, 50, 0, 0, 0, 0, 3, 1, 0.25, 0.75, 4, 0, 0, 0, 8, 0], _ + [261, 'Shield_of_Regeneration', 'Schild_der_Regeneration', 15, 19.5, 3, 15, 0, 6, 3, 10, 40, 40, 0, 0, 0, 0, 3, 1, 0.25, 0.75, 4, 0, 6, 0, 8, 0], _ + [262, 'Shield_of_Judgment', 'Schild_des_Urteils', 15, 19.5, 3, 14, 0, 6, 5, 50, 0, 0, 0, 0, 0, 0, 3, 1, 1, 0.75, 4, 0, 16384, 0, 45, 0], _ + [263, 'Protective_Bond', 'Band_des_Schutzes', 10, 13, 3, 15, 0, 6, 5, 5, 6, 3, 0, 0, 0, 0, 3, 1, 2, 0.75, 0, 0, 0, 0, 0, 0], _ + [264, 'Pacifism', 'Pazifismus', 10, 13, 3, 15, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 0, 0, 30, 0], _ + [265, 'Amity', 'Freundschaft', 5, 6.5, 3, 15, 0, 4, 0, 0, 0, 0, 156, 0, 0, 0, 0, 1, 0.25, 0.75, 4, 0, 0, 0, 45, 0], _ + [266, 'Peace_and_Harmony', 'Frieden_und_Harmonie', 5, 6.5, 3, 16, 0, 6, 0, 9, 90, 90, 20, 0, 0, 0, 3, 1, 0.25, 0.75, 4, 0, 0, 0, 10, 0], _ + [267, 'Judges_Insight', 'Einblick_des_Richters', 10, 13, 3, 14, 0, 6, 20, 20, 0, 0, 0, 0, 0, 0, 3, 1, 2, 0.75, 0, 0, 0, 0, 10, 0], _ + [268, 'Unyielding_Aura', 'Unnachgiebige_Aura', 5, 6.5, 3, 16, 0, 6, 15, 60, 0, 0, 0, 0, 0, 0, 0, 1, 0.25, 0.75, 2052, 0, 8, 0, 10, 0], _ + [269, 'Mark_of_Protection', 'Schutzzeichen', 10, 13, 3, 15, 0, 6, 6, 60, 5, 5, 0, 0, 0, 0, 3, 1, 1, 0.75, 4, 4096, 0, 0, 45, 0], _ + [270, 'Life_Barrier', 'Lebenssperre', 15, 19.5, 3, 15, 0, 6, 50, 50, 20, 50, 0, 0, 0, 0, 4, 1, 2, 0.75, 4, 0, 0, 0, 5, 0], _ + [271, 'Zealots_Fire', 'Eifererfeuer', 10, 13, 3, 14, 0, 6, 5, 35, 1, 1, 156, 0, 0, 0, 0, 1, 0.25, 0.75, 0, 0, 0, 0, 30, 0], _ + [272, 'Balthazars_Aura', 'Balthasars_Aura', 25, 32.5, 3, 14, 0, 6, 10, 25, 1, 1, 156, 0, 0, 0, 3, 1, 2, 0.75, 0, 0, 1024, 0, 25, 0], _ + [273, 'Spell_Breaker', 'Zauberbrecher', 15, 19.5, 3, 16, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 1, 0.75, 4, 0, 0, 0, 45, 0], _ + [274, 'Healing_Seed', 'Heilender_Samen', 10, 13, 3, 13, 0, 6, 3, 30, 0, 0, 156, 0, 0, 0, 4, 1, 2, 0.75, 0, 4096, 0, 0, 25, 0], _ + [275, 'Mend_Condition', 'Zustand_bessern', 5, 6.5, 3, 15, 0, 5, 5, 70, 0, 0, 0, 0, 0, 0, 4, 1, 0.75, 0.75, 0, 4096, 4096, 0, 2, 0], _ + [276, 'Restore_Condition', 'Zustand_wiederherstellen', 5, 6.5, 3, 15, 0, 5, 10, 70, 0, 0, 0, 0, 0, 0, 4, 1, 0.75, 0.75, 4, 4096, 4096, 0, 2, 0], _ + [277, 'Mend_Ailment', 'Leiden_heilen', 5, 6.5, 3, 15, 0, 5, 5, 70, 0, 0, 0, 0, 0, 0, 3, 1, 0.75, 0.75, 0, 4096, 4096, 0, 5, 0], _ + [278, 'Purge_Conditions', 'Zustände_reinigen', 5, 6.5, 3, 46, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 0.25, 0.75, 0, 0, 4096, 0, 20, 0], _ + [279, 'Divine_Healing', 'Göttliche_Heilung', 5, 6.5, 3, 16, 0, 5, 15, 60, 0, 0, 1000, 0, 0, 0, 0, 1, 1, 0.75, 0, 4096, 6, 0, 12, 0], _ + [280, 'Heal_Area', 'Gebiet_heilen', 10, 13, 3, 13, 0, 5, 30, 180, 0, 0, 156, 0, 0, 0, 0, 1, 1, 0.75, 0, 4096, 6, 0, 5, 0], _ + [281, 'Orison_of_Healing', 'Fürbitte_der_Heilung', 5, 6.5, 3, 13, 0, 5, 20, 70, 0, 0, 0, 0, 0, 0, 3, 1, 1, 0.75, 0, 4096, 6, 0, 2, 0], _ + [282, 'Word_of_Healing', 'Wort_der_Heilung', 5, 6.5, 3, 13, 0, 5, 5, 100, 30, 115, 0, 0, 0, 0, 3, 1, 0.75, 0.75, 4, 4096, 6, 0, 3, 0], _ + [283, 'Dwaynas_Kiss', 'Dwaynas_Kuss', 5, 6.5, 3, 13, 0, 5, 15, 60, 10, 35, 0, 0, 0, 0, 4, 1, 1, 0.75, 0, 4096, 2, 0, 3, 0], _ + [284, 'Divine_Boon', 'Göttlicher_Segen', 5, 6.5, 3, 16, 0, 6, 15, 60, 1, 1, 0, 0, 0, 0, 0, 1, 0.25, 0.75, 0, 0, 0, 0, 10, 0], _ + [285, 'Healing_Hands', 'Heilende_Hände', 5, 6.5, 3, 13, 0, 6, 5, 35, 0, 0, 0, 0, 0, 0, 3, 1, 0.25, 0.75, 4, 4096, 0, 0, 25, 0], _ + [286, 'Heal_Other', 'Anderen_heilen', 10, 13, 3, 13, 0, 5, 35, 180, 0, 0, 0, 0, 0, 0, 4, 1, 0.75, 0.75, 0, 4096, 2, 0, 3, 0], _ + [287, 'Heal_Party', 'Gruppe_heilen', 15, 19.5, 3, 13, 0, 5, 30, 75, 0, 0, 5000, 0, 0, 0, 0, 1, 2, 0.75, 0, 4096, 6, 0, 2, 0], _ + [288, 'Healing_Breeze', 'Heilender_Hauch', 10, 13, 3, 13, 0, 6, 4, 9, 0, 0, 0, 0, 0, 0, 3, 1, 1, 0.75, 0, 4096, 6, 0, 5, 0], _ + [289, 'Vital_Blessing', 'Lebendige_Segnung', 10, 13, 3, 15, 0, 6, 40, 200, 0, 0, 0, 0, 0, 0, 3, 1, 0.75, 0.75, 0, 0, 0, 0, 2, 0], _ + [290, 'Mending', 'Genesung', 10, 13, 3, 13, 0, 6, 1, 4, 0, 0, 0, 0, 0, 0, 3, 1, 2, 0.75, 0, 4096, 0, 0, 0, 0], _ + [291, 'Live_Vicariously', 'Ersatzleben', 5, 6.5, 3, 13, 0, 6, 2, 17, 0, 0, 0, 0, 0, 0, 3, 1, 2, 0.75, 0, 0, 0, 0, 0, 0], _ + [292, 'Infuse_Health', 'Leben_einflößen', 10, 13, 3, 13, 0, 5, 100, 136, 0, 0, 0, 0, 0, 0, 4, 1, 0.25, 0.75, 0, 4096, 6, 0, 0, 0], _ + [293, 'Signet_of_Devotion', 'Siegel_der_Hingabe', 0, 0, 3, 16, 0, 7, 14, 100, 0, 0, 0, 0, 0, 0, 3, 1, 2, 0.75, 0, 4096, 6, 0, 5, 0], _ + [294, 'Signet_of_Judgment', 'Siegel_des_Urteils', 0, 0, 3, 14, 0, 7, 15, 75, 0, 0, 156, 0, 0, 0, 5, 1, 1, 0.75, 4, 128, 0, 0, 20, 0], _ + [295, 'Purge_Signet', 'Siegel_der_Reinigung', 0, 0, 3, 46, 0, 7, 10, 10, 0, 0, 0, 0, 0, 0, 3, 1, 2, 0.75, 0, 0, 6144, 0, 20, 0], _ + [296, 'Bane_Signet', 'Siegel_des_Ruins', 0, 0, 3, 14, 0, 7, 26, 56, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 20, 0], _ + [297, 'Blessed_Signet', 'Gesegnetes_Siegel', 0, 0, 3, 16, 0, 7, 3, 24, 3, 3, 0, 0, 0, 0, 0, 1, 2, 0.75, 0, 0, 0, 0, 10, 0], _ + [298, 'Martyr', 'Märtyrer', 5, 6.5, 3, 46, 0, 5, 0, 0, 0, 0, 5000, 0, 0, 0, 0, 1, 1, 0.75, 4, 0, 0, 0, 10, 0], _ + [299, 'Shielding_Hands', 'Schützende_Hände', 5, 6.5, 3, 15, 0, 6, 3, 18, 5, 50, 0, 0, 0, 0, 3, 1, 0.25, 0.75, 0, 0, 0, 0, 15, 0], _ + [300, 'Contemplation_of_Purity', 'Gebot_der_Reinheit', 5, 6.5, 3, 16, 0, 10, 0, 80, 1, 8, 0, 0, 0, 0, 0, 1, 0.25, 0.75, 0, 4096, 14336, 0, 10, 0], _ + [301, 'Remove_Hex', 'Verhexung_entfernen', 5, 6.5, 3, 46, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 1, 0.75, 0, 0, 2048, 0, 8, 0], _ + [302, 'Smite_Hex', 'Verhexung_zerschlagen', 5, 6.5, 3, 14, 0, 5, 10, 85, 0, 0, 312, 0, 0, 0, 3, 1, 1, 0.75, 0, 0, 2048, 0, 12, 0], _ + [303, 'Convert_Hexes', 'Verhexungen_umwandeln', 15, 19.5, 3, 15, 0, 5, 10, 10, 0, 0, 0, 0, 0, 0, 4, 1, 1, 0.75, 0, 0, 2048, 0, 12, 0], _ + [304, 'Light_of_Dwayna', 'Licht_von_Dwayna', 25, 32.5, 3, 46, 0, 5, 0, 0, 0, 0, 312, 0, 0, 0, 0, 1, 4, 0.75, 2048, 0, 8, 0, 20, 0], _ + [305, 'Resurrect', 'Wiederbeleben', 10, 13, 3, 46, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 6, 1, 5, 0.75, 2048, 0, 8, 0, 8, 0], _ + [306, 'Rebirth', 'Wiedergeburt', 10, 13, 3, 15, 0, 5, 10, 3, 0, 0, 0, 0, 0, 0, 6, 1, 5, 0.75, 2048, 0, 8, 0, 0, 0], _ + [307, 'Reversal_of_Fortune', 'Umkehrung_des_Schicksals', 5, 6.5, 3, 15, 0, 6, 15, 80, 0, 0, 0, 0, 0, 0, 3, 1, 0.25, 0.75, 0, 4096, 6, 0, 2, 0], _ + [308, 'Succor', 'Beistand', 5, 6.5, 3, 46, 0, 6, 1, 1, 1, 1, 0, 0, 0, 0, 4, 1, 1, 0.75, 0, 0, 0, 0, 10, 0], _ + [309, 'Holy_Veil', 'Heiliger_Schleier', 5, 6.5, 3, 46, 0, 6, 200, 200, 0, 0, 0, 0, 0, 0, 3, 1, 1, 0.75, 0, 0, 2048, 0, 12, 0], _ + [310, 'Divine_Spirit', 'Göttlicher_Geist', 10, 13, 3, 16, 0, 6, 5, 5, 1, 1, 0, 0, 0, 0, 0, 1, 0.25, 0.75, 0, 0, 0, 0, 60, 0], _ + [311, 'Draw_Conditions', 'Zustände_entziehen', 5, 6.5, 3, 15, 0, 5, 6, 26, 0, 0, 0, 0, 0, 0, 4, 1, 0.25, 0.75, 0, 0, 4096, 0, 4, 0], _ + [312, 'Holy_Strike', 'Heiliger_Schlag', 5, 6.5, 3, 14, 0, 10, 10, 55, 10, 55, 0, 0, 0, 0, 5, 1, 0.75, 0.75, 2, 0, 0, 0, 8, 0], _ + [313, 'Healing_Touch', 'Heilende_Berührung', 5, 6.5, 3, 13, 0, 5, 16, 60, 2, 2, 0, 0, 0, 0, 3, 1, 0.75, 0.75, 2, 4096, 6, 0, 5, 0], _ + [314, 'Restore_Life', 'Leben_erneuern', 10, 13, 3, 13, 0, 5, 20, 65, 42, 90, 0, 0, 0, 0, 6, 1, 4, 0.75, 2050, 0, 8, 0, 8, 0], _ + [315, 'Vengeance', 'Rache', 10, 13, 3, 46, 0, 6, 25, 25, 0, 0, 0, 0, 0, 0, 6, 1, 4, 0.75, 2048, 0, 0, 0, 30, 0], _ + [316, 'To_the_Limit', 'Bis_ans_Limit', 5, 6.5, 1, 21, 0, 15, 10, 60, 1, 6, 1000, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 15, 0], _ + [317, 'Battle_Rage', 'Kampfwut', 0, 0, 1, 17, 0, 3, 33, 33, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 0, 80], _ + [318, 'Defy_Pain', 'Schmerz_trotzen', 0, 0, 1, 17, 0, 16, 90, 300, 1, 10, 20, 0, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 0, 120], _ + [319, 'Rush', 'Ansturm', 0, 0, 1, 17, 0, 3, 25, 25, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 32768, 0, 0, 80], _ + [320, 'Hamstring', 'Lähmung', 10, 13, 1, 20, 0, 14, 0, 0, 3, 15, 0, 0, 0, 0, 5, 1, 0, 0, 0, 8, 0, 128, 15, 0], _ + [321, 'Wild_Blow', 'Rundumschlag', 5, 6.5, 1, 46, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 185, 8, 0], _ + [322, 'Power_Attack', 'Kraftangriff', 5, 6.5, 1, 17, 0, 14, 10, 40, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 185, 3, 0], _ + [323, 'Desperation_Blow', 'Verzweiflungsschlag', 5, 6.5, 1, 21, 0, 14, 10, 40, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 0, 25, 65536, 185, 7, 0], _ + [324, 'Thrill_of_Victory', 'Rausch_des_Sieges', 5, 6.5, 1, 21, 0, 14, 20, 40, 1, 2, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 185, 8, 0], _ + [325, 'Distracting_Blow', 'Ablenkungsschlag', 5, 6.5, 1, 46, 0, 14, 0, 0, 0, 0, 72, 0, 0, 0, 5, 1, 0.5, 0, 0, 0, 1, 185, 10, 0], _ + [326, 'Protectors_Strike', 'Schlag_des_Beschützers', 5, 6.5, 1, 17, 0, 14, 10, 40, 0, 0, 0, 0, 0, 0, 5, 1, 0.5, 0, 0, 0, 0, 185, 3, 0], _ + [327, 'Griffons_Sweep', 'Greifenschlag', 5, 6.5, 1, 17, 0, 14, 5, 20, 10, 34, 0, 0, 0, 0, 5, 1, 0, 0, 0, 128, 0, 185, 8, 0], _ + [328, 'Pure_Strike', 'Reiner_Schlag', 5, 6.5, 1, 20, 0, 14, 1, 30, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 128, 8, 0], _ + [329, 'Skull_Crack', 'Schädel_spalten', 0, 0, 1, 46, 0, 14, 0, 0, 15, 15, 0, 0, 0, 0, 5, 1, 0.5, 0, 4, 512, 1, 185, 0, 220], _ + [330, 'Cyclone_Axe', 'Zyklonaxt', 5, 6.5, 1, 18, 0, 14, 4, 12, 0, 0, 156, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 1, 4, 0], _ + [331, 'Hammer_Bash', 'Hammerstreich', 0, 0, 1, 19, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 0, 128, 0, 16, 0, 130], _ + [332, 'Bulls_Strike', 'Bullenstoß', 5, 6.5, 1, 17, 0, 14, 5, 30, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 0, 128, 0, 185, 10, 0], _ + [333, 'I_Will_Avenge_You', 'Ich_werde_Euch_rächen', 5, 6.5, 1, 17, 0, 15, 3, 7, 25, 25, 5000, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 45, 0], _ + [334, 'Axe_Rake', 'Harkenaxt', 0, 0, 1, 18, 16, 14, 1, 10, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 0, 8, 0, 1, 0, 120], _ + [335, 'Cleave', 'Spalten', 0, 0, 1, 18, 0, 14, 10, 30, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 4, 0, 0, 1, 0, 80], _ + [336, 'Executioners_Strike', 'Henkerschlag', 0, 0, 1, 18, 0, 14, 10, 40, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 1, 0, 200], _ + [337, 'Dismember', 'Zerstückeln', 0, 0, 1, 18, 0, 14, 0, 0, 5, 20, 0, 0, 0, 0, 5, 1, 0, 0, 0, 16, 0, 1, 0, 120], _ + [338, 'Eviscerate', 'Ausweiden', 0, 0, 1, 18, 0, 14, 1, 31, 5, 20, 0, 0, 0, 0, 5, 1, 0, 0, 4, 16, 0, 1, 0, 200], _ + [339, 'Penetrating_Blow', 'Durchdringender_Schlag', 0, 0, 1, 18, 0, 14, 5, 20, 20, 20, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 1, 0, 120], _ + [340, 'Disrupting_Chop', 'Unterbrechender_Hieb', 0, 0, 1, 18, 0, 14, 20, 20, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 1, 1, 0, 150], _ + [341, 'Swift_Chop', 'Schneller_Hieb', 5, 6.5, 1, 18, 0, 14, 1, 20, 1, 20, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 1, 4, 0], _ + [342, 'Axe_Twist', 'Axtdrehung', 0, 0, 1, 18, 16, 14, 1, 20, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 0, 1024, 0, 1, 0, 120], _ + [343, 'For_Great_Justice', 'Für_höhere_Gerechtigkeit', 5, 6.5, 1, 46, 0, 15, 100, 100, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 45, 0], _ + [344, 'Flurry', 'Schauer', 5, 6.5, 1, 46, 0, 3, 16, 16, 33, 33, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 32768, 0, 5, 0], _ + [345, 'Defensive_Stance', 'Verteidigungshaltung', 0, 0, 1, 21, 0, 3, 75, 75, 0, 4, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 128, 0, 8, 120], _ + [346, 'Frenzy', 'Raserei', 5, 6.5, 1, 46, 0, 3, 33, 33, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 32768, 0, 4, 0], _ + [347, 'Endure_Pain', 'Schmerz_ertragen', 5, 6.5, 1, 17, 0, 16, 90, 300, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 30, 0], _ + [348, 'Watch_Yourself', 'Passt_auf_Euch_auf', 0, 0, 1, 21, 0, 15, 5, 25, 10, 10, 1000, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 4, 80], _ + [349, 'Sprint', 'Sprinten', 5, 6.5, 1, 17, 0, 3, 25, 25, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 32768, 0, 15, 0], _ + [350, 'Belly_Smash', 'Bauchklatscher', 5, 6.5, 1, 19, 128, 14, 0, 0, 3, 7, 156, 0, 0, 0, 5, 1, 1, 0, 0, 2, 0, 16, 10, 0], _ + [351, 'Mighty_Blow', 'Mächtiger_Schlag', 0, 0, 1, 19, 0, 14, 10, 40, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 16, 0, 160], _ + [352, 'Crushing_Blow', 'Vernichtender_Schlag', 5, 6.5, 1, 19, 128, 14, 1, 20, 5, 20, 0, 0, 0, 0, 5, 1, 0, 0, 0, 16, 0, 16, 10, 0], _ + [353, 'Crude_Swing', 'Grober_Schwung', 5, 6.5, 1, 19, 0, 14, 1, 20, 0, 0, 156, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 16, 5, 0], _ + [354, 'Earth_Shaker', 'Erdrüttler', 0, 0, 1, 19, 0, 14, 0, 0, 0, 0, 156, 0, 0, 0, 5, 1, 0, 0, 68, 128, 0, 16, 0, 200], _ + [355, 'Devastating_Hammer', 'Verheerender_Hammer', 0, 0, 1, 19, 0, 14, 0, 0, 5, 20, 0, 0, 0, 0, 5, 1, 0, 0, 4, 1152, 0, 16, 0, 160], _ + [356, 'Irresistible_Blow', 'Brutaler_Schlag', 5, 6.5, 1, 19, 0, 14, 5, 20, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 16, 6, 0], _ + [357, 'Counter_Blow', 'Gegenschlag', 0, 0, 1, 19, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 0, 128, 0, 16, 0, 100], _ + [358, 'Backbreaker', 'Rückenbrecher', 0, 0, 1, 19, 0, 14, 1, 20, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 4, 128, 0, 16, 0, 220], _ + [359, 'Heavy_Blow', 'Heftiger_Schlag', 0, 0, 1, 19, 1024, 14, 1, 30, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 0, 128, 0, 16, 0, 120], _ + [360, 'Staggering_Blow', 'Umwerfender_Schlag', 0, 0, 1, 19, 0, 14, 0, 0, 5, 20, 0, 0, 0, 0, 5, 1, 1, 0, 0, 1024, 0, 16, 0, 80], _ + [361, 'Dolyak_Signet', 'Dolyak_Siegel', 0, 0, 1, 17, 0, 7, 10, 40, 75, 75, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 20, 0], _ + [362, 'Warriors_Cunning', 'Verschlagenheit_des_Kriegers', 10, 13, 1, 17, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 60, 0], _ + [363, 'Shield_Bash', 'Heftiger_Schildschlag', 5, 6.5, 1, 17, 0, 16, 15, 15, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 128, 128, 0, 20, 0], _ + [364, 'Charge', 'Angriff', 5, 6.5, 1, 21, 0, 15, 33, 33, 0, 0, 1000, 0, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 20, 0], _ + [365, 'Victory_Is_Mine', 'Der_Sieg_ist_mein', 5, 6.5, 1, 21, 0, 15, 10, 68, 3, 7, 312, 0, 0, 0, 5, 1, 0, 0, 4, 0, 4, 0, 15, 0], _ + [366, 'Fear_Me', 'Fürchtet_mich', 0, 0, 1, 21, 0, 15, 1, 4, 5, 30, 240, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 6, 80], _ + [367, 'Shields_Up', 'Schilde_hoch', 10, 13, 1, 21, 0, 15, 60, 60, 0, 0, 1000, 0, 0, 0, 0, 1, 0, 0, 0, 0, 128, 0, 30, 0], _ + [368, 'I_Will_Survive', 'Ich_überlebe', 5, 6.5, 1, 17, 0, 15, 3, 3, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 30, 0], _ + [370, 'Berserker_Stance', 'Berserkerhaltung', 5, 6.5, 1, 17, 0, 3, 33, 33, 50, 50, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 20, 0], _ + [371, 'Balanced_Stance', 'Ausgeglichene_Haltung', 5, 6.5, 1, 21, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 30, 0], _ + [372, 'Gladiators_Defense', 'Gladiatoren_Verteidigung', 5, 6.5, 1, 21, 0, 3, 75, 75, 5, 35, 0, 0, 0, 0, 0, 1, 0, 0, 4, 0, 128, 0, 30, 0], _ + [373, 'Deflect_Arrows', 'Pfeilablenkung', 0, 0, 1, 21, 0, 3, 75, 75, 5, 15, 156, 0, 0, 0, 0, 1, 0, 0, 0, 0, 128, 0, 12, 120], _ + [374, 'Warriors_Endurance', 'Ausdauer_des_Kriegers', 5, 6.5, 1, 17, 0, 16, 3, 3, 10, 25, 0, 0, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 30, 0], _ + [375, 'Dwarven_Battle_Stance', 'Zwergen_Kampfhaltung', 5, 6.5, 1, 17, 0, 3, 33, 33, 40, 40, 0, 0, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 20, 0], _ + [376, 'Disciplined_Stance', 'Disziplinierte_Haltung', 5, 6.5, 1, 21, 0, 3, 75, 75, 10, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 128, 0, 15, 0], _ + [377, 'Wary_Stance', 'Wachsame_Haltung', 10, 13, 1, 21, 0, 3, 5, 5, 35, 35, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 128, 0, 10, 0], _ + [378, 'Shield_Stance', 'Schildhaltung', 5, 6.5, 1, 21, 0, 3, 75, 75, 15, 15, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 128, 0, 15, 0], _ + [379, 'Bulls_Charge', 'Angriff_des_Bullen', 5, 6.5, 1, 17, 0, 3, 33, 33, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 20, 0], _ + [380, 'Bonettis_Defense', 'Bonettis_Verteidigung', 0, 0, 1, 21, 0, 3, 75, 75, 5, 5, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 128, 0, 0, 200], _ + [381, 'Hundred_Blades', 'Hundert_Klingen', 5, 6.5, 1, 20, 0, 16, 10, 25, 0, 0, 156, 0, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 25, 0], _ + [382, 'Sever_Artery', 'Arterienabtrennung', 0, 0, 1, 20, 0, 14, 0, 0, 5, 25, 0, 0, 0, 0, 5, 1, 0, 0, 0, 1, 0, 128, 0, 100], _ + [383, 'Galrath_Slash', 'Galrath_Hieb', 0, 0, 1, 20, 0, 14, 1, 40, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 128, 0, 200], _ + [384, 'Gash', 'Schnittwunde', 0, 0, 1, 20, 1, 14, 5, 20, 5, 20, 0, 0, 0, 0, 5, 1, 0, 0, 0, 16, 0, 128, 0, 140], _ + [385, 'Final_Thrust', 'Endstoß', 0, 0, 1, 20, 0, 14, 1, 40, 50, 50, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 128, 0, 240], _ + [386, 'Seeking_Blade', 'Suchende_Klinge', 5, 6.5, 1, 20, 0, 14, 1, 20, 1, 20, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 128, 4, 0], _ + [387, 'Riposte', 'Entgegnung', 0, 0, 1, 21, 0, 16, 20, 80, 1, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 128, 128, 0, 80], _ + [388, 'Deadly_Riposte', 'Tödliche_Entgegnung', 5, 6.5, 1, 21, 0, 16, 15, 90, 3, 25, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 128, 128, 10, 0], _ + [389, 'Flourish', 'Blütezeit', 5, 6.5, 1, 17, 0, 10, 2, 7, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0.75, 4, 0, 0, 0, 8, 0], _ + [390, 'Savage_Slash', 'Wilder_Hieb', 5, 6.5, 1, 20, 0, 14, 1, 40, 0, 0, 0, 0, 0, 0, 5, 1, 0.5, 0, 0, 0, 1, 128, 15, 0], _ + [391, 'Hunters_Shot', 'Jägerschuss', 5, 6.5, 2, 25, 128, 14, 3, 25, 0, 0, 0, 0, 0, 0, 5, 1, 1, 1, 0, 1, 0, 2, 10, 0], _ + [392, 'Pin_Down', 'Festnageln', 15, 19.5, 2, 25, 0, 14, 0, 0, 3, 15, 0, 0, 0, 0, 5, 1, 0, 0, 0, 8, 0, 2, 8, 0], _ + [393, 'Crippling_Shot', 'Verkrüppelungs_Schuss', 10, 13, 2, 25, 0, 14, 0, 0, 1, 11, 0, 0, 0, 0, 5, 1, 0, 0, 4, 8, 0, 2, 4, 0], _ + [394, 'Power_Shot', 'Kraftschuss', 10, 13, 2, 25, 0, 14, 25, 50, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 2, 3, 0], _ + [395, 'Barrage', 'Sperrfeuer', 5, 6.5, 2, 25, 0, 14, 5, 5, 5, 20, 156, 0, 0, 0, 5, 1, 0, 0, 4, 0, 0, 2, 1, 0], _ + [396, 'Dual_Shot', 'Doppelschuss', 10, 13, 2, 46, 0, 14, 16, 16, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 2, 10, 0], _ + [397, 'Quick_Shot', 'Schnellschuss', 5, 6.5, 2, 46, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 1, 1, 4, 0, 0, 2, 1, 0], _ + [398, 'Penetrating_Attack', 'Durchbohr_Angriff', 10, 13, 2, 25, 0, 14, 5, 25, 10, 10, 0, 0, 0, 0, 5, 1, 0.75, 0.600000023841858, 0, 0, 0, 2, 4, 0], _ + [399, 'Distracting_Shot', 'Ablenk_Schuss', 5, 6.5, 2, 23, 0, 14, 1, 16, 20, 20, 0, 0, 0, 0, 5, 1, 0.5, 1.5, 0, 0, 1, 2, 10, 0], _ + [400, 'Precision_Shot', 'Präzisionsschuss', 10, 13, 2, 25, 0, 14, 3, 10, 0, 0, 0, 0, 0, 0, 5, 1, 1, 1, 32, 0, 0, 2, 6, 0], _ + [402, 'Determined_Shot', 'Entschlossener_Schuss', 5, 6.5, 2, 25, 0, 14, 5, 20, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 2, 10, 0], _ + [403, 'Called_Shot', 'Ankündigungs_Schuss', 5, 6.5, 2, 46, 0, 14, 4800, 4800, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 2, 3, 0], _ + [404, 'Poison_Arrow', 'Giftpfeil', 5, 6.5, 2, 24, 0, 14, 0, 0, 5, 20, 0, 0, 0, 0, 5, 1, 0, 0, 4, 256, 0, 2, 1, 0], _ + [405, 'Oath_Shot', 'Eidschuss', 10, 13, 2, 23, 0, 14, 10, 4, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 4100, 0, 0, 2, 25, 0], _ + [406, 'Debilitating_Shot', 'Entkräftungs_Schuss', 10, 13, 2, 25, 0, 14, 1, 10, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 2, 10, 0], _ + [407, 'Point_Blank_Shot', 'Kurzdistanzschuss', 5, 6.5, 2, 23, 0, 14, 10, 40, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 8, 0, 0, 2, 3, 0], _ + [408, 'Concussion_Shot', 'Erschütterungsschuss', 25, 32.5, 2, 25, 0, 14, 1, 16, 5, 20, 0, 0, 0, 0, 5, 1, 0.5, 1.5, 0, 512, 0, 2, 5, 0], _ + [409, 'Punishing_Shot', 'Bestrafungs_Schuss', 10, 13, 2, 25, 0, 14, 10, 20, 0, 0, 0, 0, 0, 0, 5, 1, 0.5, 1.5, 4, 0, 1, 2, 5, 0], _ + [411, 'Charm_Animal', 'Tier_zähmen', 10, 13, 2, 22, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 10, 0.75, 0, 0, 0, 0, 0, 0], _ + [412, 'Call_of_Protection', 'Ruf_des_Schutzes', 5, 6.5, 2, 22, 0, 15, 5, 20, 0, 0, 5000, 0, 0, 0, 0, 1, 0, 0.75, 0, 0, 0, 0, 90, 0], _ + [415, 'Call_of_Haste', 'Ruf_der_Eile', 10, 13, 2, 22, 0, 15, 33, 33, 33, 33, 5000, 0, 0, 0, 0, 1, 0, 0.75, 0, 0, 32768, 0, 25, 0], _ + [422, 'Revive_Animal', 'Tier_wiederbeleben', 5, 6.5, 2, 22, 0, 10, 10, 94, 0, 0, 240, 0, 0, 0, 0, 1, 6, 0.75, 0, 0, 0, 0, 20, 0], _ + [423, 'Symbiotic_Bond', 'Symbiotisches_Band', 10, 13, 2, 22, 0, 15, 1, 3, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 55, 0], _ + [424, 'Throw_Dirt', 'Dreck_werfen', 5, 6.5, 2, 23, 0, 10, 0, 0, 3, 15, 72, 0, 0, 0, 5, 1, 1, 0.75, 2, 2, 0, 0, 30, 0], _ + [425, 'Dodge', 'Abducken', 5, 6.5, 2, 23, 0, 3, 27, 75, 33, 33, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 128, 0, 30, 0], _ + [426, 'Savage_Shot', 'Wilder_Schuss', 10, 13, 2, 25, 0, 14, 13, 28, 0, 0, 0, 0, 0, 0, 5, 1, 0.5, 1.5, 0, 0, 1, 2, 5, 0], _ + [427, 'Antidote_Signet', 'Gegengift_Siegel', 0, 0, 2, 46, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 4, 0], _ + [428, 'Incendiary_Arrows', 'Flammenpfeile', 5, 6.5, 2, 24, 0, 14, 2, 2, 1, 3, 240, 0, 0, 0, 5, 1, 0, 0, 4, 4, 0, 2, 5, 0], _ + [429, 'Melandrus_Arrows', 'Melandrus_Pfeile', 5, 6.5, 2, 24, 0, 19, 8, 28, 3, 25, 0, 0, 0, 0, 0, 1, 2, 0, 260, 1, 0, 0, 12, 0], _ + [430, 'Marksmans_Wager', 'Schützenwette', 5, 6.5, 2, 23, 0, 19, 5, 10, 10, 10, 0, 0, 0, 0, 0, 1, 2, 0, 260, 0, 0, 0, 24, 0], _ + [431, 'Ignite_Arrows', 'Brandpfeile', 10, 13, 2, 24, 0, 19, 3, 18, 0, 0, 156, 0, 0, 0, 0, 1, 2, 0, 256, 0, 0, 0, 12, 0], _ + [432, 'Read_the_Wind', 'Wind_lesen', 5, 6.5, 2, 25, 0, 19, 4800, 4800, 3, 10, 0, 0, 0, 0, 0, 1, 2, 0, 256, 0, 0, 0, 12, 0], _ + [433, 'Kindle_Arrows', 'Zündelpfeile', 5, 6.5, 2, 24, 0, 19, 3, 24, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 256, 0, 0, 0, 12, 0], _ + [434, 'Choking_Gas', 'Würgegas', 15, 19.5, 2, 24, 0, 19, 1, 8, 0, 0, 156, 0, 0, 0, 0, 1, 2, 0, 256, 0, 0, 0, 24, 0], _ + [435, 'Apply_Poison', 'Gift_auftragen', 15, 19.5, 2, 24, 0, 19, 0, 0, 3, 15, 0, 0, 0, 0, 0, 1, 2, 0, 256, 256, 0, 0, 12, 0], _ + [436, 'Comfort_Animal', 'Tier_erquicken', 5, 6.5, 2, 22, 0, 10, 20, 104, 10, 58, 5000, 8, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 1, 0], _ + [437, 'Bestial_Pounce', 'Bestiensprung', 5, 6.5, 2, 22, 0, 20, 5, 20, 0, 0, 5000, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 10, 0], _ + [438, 'Maiming_Strike', 'Verkrüppelungs_Schlag', 10, 13, 2, 22, 0, 20, 5, 20, 3, 15, 5000, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 5, 0], _ + [439, 'Feral_Lunge', 'Wilder_Ausfall', 5, 6.5, 2, 22, 0, 20, 5, 35, 5, 25, 5000, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 10, 0], _ + [440, 'Scavenger_Strike', 'Aasfresser_Schlag', 5, 6.5, 2, 22, 0, 20, 10, 25, 3, 15, 5000, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 10, 0], _ + [441, 'Melandrus_Assault', 'Melandrus_Angriff', 10, 13, 2, 22, 0, 20, 5, 20, 0, 0, 5000, 240, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 5, 0], _ + [442, 'Ferocious_Strike', 'Wilder_Schlag', 5, 6.5, 2, 22, 0, 20, 13, 28, 3, 10, 5000, 25, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 8, 0], _ + [443, 'Predators_Pounce', 'Raubtier_Sprung', 5, 6.5, 2, 22, 0, 20, 5, 35, 5, 50, 5000, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 5, 0], _ + [444, 'Brutal_Strike', 'Schonungsloser_Schlag', 10, 13, 2, 22, 0, 20, 5, 35, 5, 35, 5000, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 5, 0], _ + [445, 'Disrupting_Lunge', 'Unterbrechender_Ausfall', 5, 6.5, 2, 22, 0, 20, 1, 12, 20, 20, 5000, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 20, 0], _ + [446, 'Troll_Unguent', 'Trollsalbe', 5, 6.5, 2, 24, 0, 10, 3, 10, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0.75, 0, 0, 4, 0, 10, 0], _ + [447, 'Otyughs_Cry', 'Otyughs_Schrei', 5, 6.5, 2, 22, 0, 15, 24, 24, 0, 0, 5000, 0, 0, 0, 0, 1, 0, 0.75, 0, 0, 0, 0, 30, 0], _ + [448, 'Escape', 'Flucht', 5, 6.5, 2, 23, 0, 3, 33, 33, 75, 75, 0, 0, 0, 0, 0, 1, 0, 0, 4, 0, 128, 0, 12, 0], _ + [449, 'Practiced_Stance', 'Geübte_Haltung', 5, 6.5, 2, 23, 0, 3, 50, 50, 30, 150, 0, 0, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 15, 0], _ + [450, 'Whirling_Defense', 'Wirbelverteidigung', 10, 13, 2, 23, 0, 3, 75, 75, 5, 11, 156, 0, 0, 0, 0, 1, 0, 0, 0, 0, 128, 0, 60, 0], _ + [451, 'Melandrus_Resilience', 'Melandrus_Belastbarkeit', 5, 6.5, 2, 24, 0, 3, 4, 4, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 15, 0], _ + [452, 'Dryders_Defenses', 'Dryders_Verteidigungen', 5, 6.5, 2, 24, 0, 3, 34, 60, 75, 75, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 128, 0, 60, 0], _ + [453, 'Lightning_Reflexes', 'Blitzreflexe', 10, 13, 2, 23, 0, 3, 75, 75, 33, 33, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 128, 0, 30, 0], _ + [454, 'Tigers_Fury', 'Wut_des_Tigers', 10, 13, 2, 22, 0, 3, 25, 25, 5, 5, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 32768, 0, 10, 0], _ + [455, 'Storm_Chaser', 'Sturmjäger', 10, 13, 2, 24, 0, 3, 1, 5, 25, 25, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 20, 0], _ + [456, 'Serpents_Quickness', 'Schlangen_Schnelligkeit', 5, 6.5, 2, 24, 0, 3, 33, 33, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 45, 0], _ + [457, 'Dust_Trap', 'Staubfalle', 25, 32.5, 2, 24, 0, 21, 10, 25, 3, 8, 156, 240, 0, 0, 0, 1, 2, 0.75, 256, 2, 0, 0, 30, 0], _ + [458, 'Barbed_Trap', 'Stachelfalle', 15, 19.5, 2, 24, 0, 21, 7, 23, 3, 25, 156, 240, 0, 0, 0, 1, 2, 0.75, 256, 9, 0, 0, 20, 0], _ + [459, 'Flame_Trap', 'Flammenfalle', 10, 13, 2, 24, 0, 21, 5, 20, 1, 3, 156, 240, 0, 0, 0, 1, 2, 0.75, 256, 4, 0, 0, 20, 0], _ + [460, 'Healing_Spring', 'Heilquelle', 10, 13, 2, 24, 0, 21, 15, 60, 0, 0, 156, 240, 0, 0, 0, 1, 2, 0.75, 256, 0, 0, 0, 20, 0], _ + [461, 'Spike_Trap', 'Dornenfalle', 10, 13, 2, 24, 0, 21, 10, 40, 3, 25, 156, 240, 0, 0, 0, 1, 2, 0.75, 260, 136, 0, 0, 20, 0], _ + [462, 'Winter', 'Winter', 5, 6.5, 2, 24, 0, 22, 1, 10, 1, 16, 2500, 0, 0, 0, 0, 1, 3, 0.75, 256, 0, 0, 0, 60, 0], _ + [463, 'Winnowing', 'Trennung', 5, 6.5, 2, 24, 0, 22, 1, 10, 4, 4, 2500, 0, 0, 0, 0, 1, 5, 0.75, 256, 0, 0, 0, 60, 0], _ + [464, 'Edge_of_Extinction', 'Rand_der_Auslöschung', 5, 6.5, 2, 22, 0, 22, 1, 10, 14, 50, 2500, 0, 0, 0, 0, 1, 5, 0.75, 256, 0, 0, 0, 60, 0], _ + [465, 'Greater_Conflagration', 'Großflächenbrand', 5, 6.5, 2, 24, 0, 22, 1, 10, 0, 0, 2500, 0, 0, 0, 0, 1, 3, 0.75, 260, 0, 0, 0, 15, 0], _ + [466, 'Conflagration', 'Feuersbrunst', 5, 6.5, 2, 24, 0, 22, 1, 10, 0, 0, 2500, 0, 0, 0, 0, 1, 5, 0.75, 256, 0, 0, 0, 60, 0], _ + [467, 'Fertile_Season', 'Fruchtbare_Jahreszeit', 15, 19.5, 2, 22, 0, 22, 1, 10, 50, 150, 2500, 8, 0, 0, 0, 1, 5, 0.75, 256, 0, 0, 0, 60, 0], _ + [468, 'Symbiosis', 'Symbiose', 5, 6.5, 2, 22, 0, 22, 1, 10, 27, 150, 2500, 0, 0, 0, 0, 1, 5, 0.75, 256, 0, 0, 0, 60, 0], _ + [469, 'Primal_Echoes', 'Urechos', 5, 6.5, 2, 22, 0, 22, 1, 10, 10, 10, 2500, 0, 0, 0, 0, 1, 5, 0.75, 256, 0, 0, 0, 60, 0], _ + [470, 'Predatory_Season', 'Jagdsaison', 5, 6.5, 2, 22, 0, 22, 1, 10, 80, 80, 2500, 5, 0, 0, 0, 1, 5, 0.75, 256, 0, 0, 0, 60, 0], _ + [471, 'Frozen_Soil', 'Eisboden', 10, 13, 2, 24, 0, 22, 1, 10, 0, 0, 2500, 0, 0, 0, 0, 1, 5, 0.75, 256, 0, 0, 0, 30, 0], _ + [472, 'Favorable_Winds', 'Günstige_Winde', 5, 6.5, 2, 25, 0, 22, 1, 10, 6, 6, 2500, 0, 0, 0, 0, 1, 5, 0.75, 256, 0, 0, 0, 60, 0], _ + [474, 'Energizing_Wind', 'Treibwind', 15, 19.5, 2, 22, 0, 22, 1, 6, 15, 15, 2500, 10, 0, 0, 0, 1, 5, 0.75, 256, 0, 0, 0, 60, 0], _ + [475, 'Quickening_Zephyr', 'Beschleunigender_Zephyr', 25, 32.5, 2, 24, 0, 22, 1, 10, 30, 30, 2500, 0, 0, 0, 0, 1, 5, 0.75, 256, 0, 0, 0, 60, 0], _ + [476, 'Natures_Renewal', 'Erneuerung_der_Natur', 5, 6.5, 2, 24, 0, 22, 1, 10, 200, 200, 2500, 0, 0, 0, 0, 1, 5, 0.75, 256, 0, 0, 0, 60, 0], _ + [477, 'Muddy_Terrain', 'Schlammiges_Terrain', 5, 6.5, 2, 24, 0, 22, 1, 10, 10, 10, 2500, 0, 0, 0, 0, 1, 5, 0.75, 256, 0, 0, 0, 30, 0], _ + [570, 'Mark_of_Insecurity', 'Zeichen_der_Unsicherheit', 5, 6.5, 7, 30, 0, 4, 1, 3, 30, 80, 10, 0, 0, 0, 5, 1, 1, 0.75, 516, 0, 0, 0, 10, 0], _ + [571, 'Disrupting_Dagger', 'Unterbrechender_Dolch', 5, 6.5, 7, 30, 0, 5, 10, 35, 0, 0, 0, 0, 0, 0, 5, 1, 0.25, 0.75, 8, 0, 1, 0, 10, 0], _ + [572, 'Deadly_Paradox', 'Tödliches_Paradoxon', 15, 19.5, 7, 30, 0, 3, 33, 33, 10, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 10, 0], _ + [763, 'Jaundiced_Gaze', 'Neidvoller_Blick', 10, 13, 4, 4, 0, 6, 0, 1, 1, 10, 10, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 32, 0, 15, 0], _ + [764, 'Wail_of_Doom', 'Schicksalsklage', 1, 1.3, 4, 6, 0, 4, 10, 10, 0, 0, 0, 0, 0, 0, 5, 1, 0.25, 0.75, 4, 0, 32, 0, 15, 0], _ + [766, 'Gaze_of_Contempt', 'Verächtlicher_Blick', 10, 13, 4, 46, 0, 5, 50, 50, 0, 0, 0, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 0, 0, 15, 0], _ + [769, 'Vipers_Defense', 'Verteidigung_der_Viper', 5, 6.5, 7, 31, 0, 5, 5, 20, 156, 156, 312, 800, 0, 0, 1, 1, 0.25, 0, 0, 0, 0, 0, 10, 0], _ + [770, 'Return', 'Rückkehr', 5, 6.5, 7, 31, 0, 5, 3, 8, 0, 0, 156, 0, 0, 0, 4, 1, 0.25, 0, 0, 0, 0, 0, 15, 0], _ + [771, 'Aura_of_Displacement', 'Aura_der_Verschiebung', 10, 13, 7, 46, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 0.25, 0.75, 4, 0, 0, 0, 20, 0], _ + [772, 'Generous_Was_Tsungrai', 'Großzügig_war_Tsungrai', 5, 6.5, 8, 33, 0, 24, 50, 140, 100, 280, 10, 10, 0, 0, 0, 1, 1, 0.75, 0, 0, 36, 0, 15, 0], _ + [773, 'Mighty_Was_Vorizun', 'Mächtig_war_Vorizun', 5, 6.5, 8, 32, 0, 24, 15, 15, 30, 30, 0, 0, 0, 0, 0, 1, 2, 0.75, 0, 0, 0, 0, 30, 0], _ + [775, 'Death_Blossom', 'Todesblüte', 5, 6.5, 7, 29, 0, 14, 20, 45, 0, 0, 156, 0, 3, 4, 5, 1, 0, 0, 32768, 0, 0, 8, 2, 0], _ + [776, 'Twisting_Fangs', 'Schlangenzähne', 10, 13, 7, 35, 0, 14, 10, 20, 5, 20, 0, 0, 3, 4, 5, 1, 0, 0, 32768, 0, 0, 8, 15, 0], _ + [777, 'Horns_of_the_Ox', 'Hörner_des_Ochsen', 5, 6.5, 7, 29, 0, 14, 1, 11, 0, 0, 156, 0, 3, 4, 5, 1, 0, 0, 32768, 0, 0, 8, 12, 0], _ + [778, 'Falling_Spider', 'Fallende_Spinne', 5, 6.5, 7, 29, 0, 14, 15, 35, 5, 20, 0, 0, 2, 0, 5, 1, 0, 0, 0, 0, 0, 8, 8, 0], _ + [779, 'Black_Lotus_Strike', 'Schwarzer_Lotus_Stoß', 10, 13, 7, 35, 0, 14, 10, 31, 5, 13, 0, 0, 1, 0, 5, 1, 0, 0, 0, 0, 0, 8, 6, 0], _ + [780, 'Fox_Fangs', 'Reißzähne_des_Fuchses', 5, 6.5, 7, 29, 0, 14, 10, 35, 0, 0, 0, 0, 2, 2, 5, 1, 0.5, 0, 0, 0, 0, 8, 3, 0], _ + [781, 'Moebius_Strike', 'Möbiusstoß', 5, 6.5, 7, 29, 0, 14, 10, 35, 0, 0, 0, 0, 2, 1, 5, 1, 0, 0, 4, 0, 0, 8, 2, 0], _ + [782, 'Jagged_Strike', 'Gezackter_Stoß', 5, 6.5, 7, 29, 0, 14, 5, 20, 0, 0, 0, 0, 1, 0, 5, 1, 0.5, 0, 0, 0, 0, 8, 1, 0], _ + [783, 'Unsuspecting_Strike', 'Unvermuteter_Stoß', 10, 13, 7, 35, 0, 14, 19, 31, 15, 75, 0, 0, 1, 0, 5, 1, 0, 0, 0, 0, 0, 8, 2, 0], _ + [784, 'Entangling_Asp', 'Schlingnatter', 10, 13, 7, 30, 0, 5, 5, 20, 0, 0, 0, 0, 0, 2, 5, 1, 1, 0.75, 0, 0, 0, 0, 20, 0], _ + [785, 'Mark_of_Death', 'Zeichen_des_Todes', 10, 13, 7, 30, 0, 4, 33, 33, 0, 0, 0, 0, 0, 0, 5, 1, 0.25, 0.75, 0, 0, 0, 0, 20, 0], _ + [786, 'Iron_Palm', 'Eiserne_Handfläche', 5, 6.5, 7, 30, 0, 10, 5, 50, 0, 0, 0, 0, 1, 0, 5, 1, 0.75, 0.75, 2, 0, 512, 0, 20, 0], _ + [787, 'Resilient_Weapon', 'Unverwüstliche_Waffe', 10, 13, 8, 33, 0, 25, 1, 6, 24, 24, 0, 0, 0, 0, 3, 1, 1, 0.75, 0, 0, 0, 0, 6, 0], _ + [788, 'Blind_Was_Mingson', 'Blind_war_Mingson', 5, 6.5, 8, 33, 0, 24, 3, 8, 0, 0, 240, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 512, 0, 20, 0], _ + [789, 'Grasping_Was_Kuurong', 'Erfassend_war_Kuurong', 15, 19.5, 8, 34, 0, 24, 15, 75, 0, 0, 240, 0, 0, 0, 0, 1, 1, 0.75, 4, 128, 512, 0, 20, 0], _ + [790, 'Vengeful_Was_Khanhei', 'Nachtragend_war_Khanhei', 5, 6.5, 8, 33, 0, 24, 5, 35, 0, 0, 0, 0, 0, 0, 0, 1, 0.75, 0.75, 4, 0, 16384, 0, 20, 0], _ + [791, 'Flesh_of_My_Flesh', 'Fleisch_von_meinem_Fleisch', 5, 6.5, 8, 33, 0, 5, 5, 20, 0, 0, 0, 0, 0, 0, 6, 1, 4, 0.75, 2048, 0, 8, 0, 0, 0], _ + [792, 'Splinter_Weapon', 'Splitterwaffe', 5, 6.5, 8, 34, 0, 25, 5, 50, 1, 5, 156, 3, 0, 0, 3, 1, 1, 0.75, 0, 0, 0, 0, 5, 0], _ + [793, 'Weapon_of_Warding', 'Waffe_der_Abwehr', 10, 13, 8, 33, 0, 25, 50, 50, 2, 4, 0, 0, 0, 0, 3, 1, 1, 0.75, 0, 0, 128, 0, 5, 0], _ + [794, 'Wailing_Weapon', 'Klagende_Waffe', 5, 6.5, 8, 34, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 1, 0.75, 0, 0, 0, 0, 25, 0], _ + [795, 'Nightmare_Weapon', 'Alptraumwaffe', 5, 6.5, 8, 34, 0, 25, 10, 50, 3, 3, 0, 0, 0, 0, 3, 1, 1, 0.75, 0, 0, 0, 0, 10, 0], _ + [799, 'Beguiling_Haze', 'Verführerischer_Dunst', 15, 19.5, 7, 31, 0, 5, 3, 9, 0, 0, 0, 0, 0, 0, 5, 1, 0.25, 0.75, 4, 0, 0, 0, 20, 0], _ + [800, 'Enduring_Toxin', 'Dauerhaftes_Toxin', 5, 6.5, 7, 30, 0, 4, 1, 5, 0, 0, 0, 0, 0, 0, 5, 1, 0.25, 0.75, 512, 0, 0, 0, 10, 0], _ + [801, 'Shroud_of_Silence', 'Schleier_des_Schweigens', 10, 13, 7, 30, 0, 4, 15, 15, 0, 0, 0, 0, 0, 0, 5, 1, 0.75, 0.75, 6, 0, 0, 0, 30, 0], _ + [802, 'Expose_Defenses', 'Verteidigungen_aufdecken', 10, 13, 7, 30, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 25, 0], _ + [803, 'Power_Leech', 'Kraftfresser', 5, 6.5, 5, 3, 0, 4, 5, 15, 0, 0, 0, 0, 0, 0, 5, 1, 0.25, 0.75, 4, 0, 1, 0, 20, 0], _ + [804, 'Arcane_Languor', 'Arkane_Schwäche', 10, 13, 5, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 2, 0.75, 4, 0, 0, 0, 15, 0], _ + [805, 'Animate_Vampiric_Horror', 'Vampirschreck_beleben', 15, 19.5, 4, 5, 0, 5, 1, 17, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0.75, 262144, 0, 0, 0, 15, 0], _ + [806, 'Cultists_Fervor', 'Eifer_des_Sektierers', 5, 6.5, 4, 4, 0, 6, 1, 6, 10, 10, 3, 0, 0, 0, 0, 1, 1, 0.75, 4, 0, 0, 0, 25, 0], _ + [808, 'Reapers_Mark', 'Zeichen_des_Schnitters', 5, 6.5, 4, 6, 0, 4, 1, 5, 5, 15, 0, 0, 0, 0, 5, 1, 1, 0.75, 516, 0, 0, 0, 15, 0], _ + [809, 'Shatterstone', 'Trümmerstein', 15, 19.5, 6, 11, 0, 4, 25, 100, 25, 100, 240, 0, 0, 0, 5, 1, 2, 0.75, 4, 2048, 0, 0, 8, 0], _ + [810, 'Protectors_Defense', 'Verteidigung_des_Beschützers', 5, 6.5, 1, 21, 0, 10, 75, 75, 0, 0, 156, 0, 0, 0, 0, 1, 0, 0, 0, 0, 128, 0, 30, 0], _ + [811, 'Run_as_One', 'Gemeinsam_rennen', 5, 6.5, 2, 22, 0, 3, 25, 25, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 32768, 0, 15, 0], _ + [812, 'Defiant_Was_Xinrae', 'Trotzig_war_Xinrae', 5, 6.5, 8, 33, 0, 24, 20, 20, 5, 50, 240, 0, 0, 0, 0, 1, 1, 0.75, 4, 0, 0, 0, 20, 0], _ + [813, 'Lyssas_Aura', 'Lyssas_Aura', 5, 6.5, 5, 3, 0, 6, 0, 5, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0.75, 4, 0, 0, 0, 30, 0], _ + [814, 'Shadow_Refuge', 'Schattenzuflucht', 5, 6.5, 7, 31, 0, 6, 40, 100, 5, 10, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 4, 0, 8, 0], _ + [815, 'Scorpion_Wire', 'Skorpiondraht', 5, 6.5, 7, 30, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 8, 0, 0, 0, 10, 0], _ + [816, 'Mirrored_Stance', 'Gespiegelte_Haltung', 5, 6.5, 7, 31, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 0.25, 0.75, 0, 0, 0, 0, 15, 0], _ + [817, 'Discord', 'Zwietracht', 5, 6.5, 4, 5, 0, 5, 30, 110, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 4, 0, 0, 0, 2, 0], _ + [818, 'Well_of_Weariness', 'Brunnen_der_Müdigkeit', 5, 6.5, 4, 7, 0, 9, 1, 1, 20, 20, 312, 0, 0, 0, 0, 1, 1, 0.75, 262144, 0, 0, 0, 5, 0], _ + [819, 'Vampiric_Spirit', 'Vampirgeist', 5, 6.5, 4, 4, 0, 6, 5, 50, 5, 10, 240, 0, 0, 0, 5, 1, 2, 0.75, 4, 0, 0, 0, 8, 0], _ + [820, 'Depravity', 'Verderbtheit', 10, 13, 4, 7, 0, 4, 1, 5, 0, 0, 240, 0, 0, 0, 5, 1, 2, 0.75, 4, 0, 0, 0, 15, 0], _ + [821, 'Icy_Veins', 'Eisadern', 10, 13, 4, 6, 0, 4, 10, 90, 20, 110, 240, 0, 0, 0, 5, 1, 1, 0.75, 4, 0, 0, 0, 5, 0], _ + [822, 'Weaken_Knees', 'Weiche_Knie', 5, 6.5, 4, 7, 0, 4, 1, 4, 5, 10, 0, 0, 0, 0, 5, 1, 1, 0.75, 516, 0, 0, 0, 10, 0], _ + [823, 'Burning_Speed', 'Brennende_Eile', 10, 13, 6, 10, 0, 6, 30, 45, 3, 9, 156, 0, 0, 0, 0, 1, 0.25, 0.75, 0, 0, 0, 0, 0, 0], _ + [824, 'Lava_Arrows', 'Lavapfeile', 5, 6.5, 6, 10, 0, 5, 20, 65, 3, 3, 240, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 2, 0], _ + [825, 'Bed_of_Coals', 'Kohlenbett', 10, 13, 6, 10, 0, 5, 5, 29, 3, 7, 156, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 15, 0], _ + [826, 'Shadow_Form', 'Schattenform', 5, 6.5, 7, 31, 0, 6, 5, 25, 5, 5, 1, 0, 0, 0, 0, 1, 1, 0.75, 4, 0, 128, 0, 30, 0], _ + [827, 'Siphon_Strength', 'Kraft_abzapfen', 10, 13, 7, 30, 0, 4, 5, 50, 33, 33, 0, 0, 0, 0, 5, 1, 1, 0.75, 4, 0, 0, 0, 10, 0], _ + [828, 'Vile_Miasma', 'Fauler_Gestank', 10, 13, 4, 5, 0, 4, 10, 65, 1, 5, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 15, 0], _ + [830, 'Ray_of_Judgment', 'Strahl_des_Urteils', 10, 13, 3, 14, 0, 5, 5, 45, 1, 3, 156, 0, 0, 0, 16, 1, 2, 0.75, 4, 0, 0, 0, 20, 0], _ + [831, 'Primal_Rage', 'Urzorn', 0, 0, 1, 17, 0, 3, 33, 33, 25, 25, 0, 0, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 10, 80], _ + [832, 'Animate_Flesh_Golem', 'Fleischgolem_beleben', 10, 13, 4, 5, 0, 5, 3, 25, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0.75, 262148, 0, 0, 0, 30, 0], _ + [834, 'Reckless_Haste', 'Rücksichtslose_Hast', 15, 19.5, 4, 7, 0, 4, 50, 50, 25, 25, 156, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 12, 0], _ + [835, 'Blood_Bond', 'Blutsbande', 5, 6.5, 4, 4, 0, 4, 5, 20, 20, 100, 156, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 2, 0, 8, 0], _ + [836, 'Ride_the_Lightning', 'Den_Blitz_reiten', 10, 13, 6, 8, 0, 5, 10, 70, 1, 5, 156, 0, 0, 0, 1, 1, 1, 0.75, 5, 0, 0, 0, 5, 0], _ + [837, 'Energy_Boon', 'Energiesegen', 5, 6.5, 6, 12, 0, 6, 1, 12, 1, 3, 2, 2, 0, 0, 3, 1, 1, 0.75, 4, 0, 256, 0, 20, 0], _ + [838, 'Dwaynas_Sorrow', 'Dwaynas_Leid', 5, 6.5, 3, 13, 0, 6, 5, 50, 0, 0, 5000, 240, 0, 0, 3, 1, 1, 0.75, 0, 0, 0, 0, 5, 0], _ + [839, 'Retreat', 'Rückzug', 5, 6.5, 1, 21, 0, 15, 33, 33, 0, 0, 1000, 5000, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 20, 0], _ + [840, 'Poisoned_Heart', 'Vergiftetes_Herz', 5, 6.5, 4, 7, 0, 5, 5, 15, 0, 0, 156, 0, 0, 0, 0, 1, 0.25, 0.75, 0, 256, 0, 0, 12, 0], _ + [841, 'Fetid_Ground', 'Stinkender_Boden', 5, 6.5, 4, 5, 128, 5, 15, 65, 5, 20, 0, 0, 0, 0, 5, 1, 0.75, 0.75, 0, 0, 0, 0, 10, 0], _ + [842, 'Arc_Lightning', 'Blitzbogen', 5, 6.5, 6, 8, 2048, 5, 5, 40, 15, 85, 240, 2, 0, 0, 5, 1, 1.5, 0.75, 0, 0, 0, 0, 8, 0], _ + [843, 'Gust', 'Böe', 5, 6.5, 6, 8, 0, 6, 15, 70, 33, 33, 240, 0, 0, 0, 1, 1, 0.75, 0.75, 4, 128, 0, 0, 10, 0], _ + [844, 'Churning_Earth', 'Aufgeworfene_Erde', 15, 19.5, 6, 9, 0, 5, 10, 40, 10, 10, 240, 0, 0, 0, 16, 1, 2, 0.75, 0, 0, 0, 0, 30, 0], _ + [845, 'Liquid_Flame', 'Flüssige_Flamme', 10, 13, 6, 10, 0, 5, 7, 112, 0, 0, 240, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 15, 0], _ + [846, 'Steam', 'Dampf', 5, 6.5, 6, 11, 4, 5, 20, 60, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 2, 0, 0, 8, 0], _ + [847, 'Boon_Signet', 'Siegel_des_Segens', 0, 0, 3, 16, 0, 7, 20, 80, 20, 80, 0, 0, 0, 0, 3, 1, 1, 0.75, 4, 4096, 0, 0, 8, 0], _ + [848, 'Reverse_Hex', 'Verhexung_umkehren', 10, 13, 3, 15, 0, 6, 5, 50, 0, 0, 0, 0, 0, 0, 3, 1, 0.25, 0.75, 0, 0, 2048, 0, 10, 0], _ + [849, 'Lacerating_Chop', 'Zerfetzender_Hieb', 0, 0, 1, 18, 1, 14, 5, 20, 5, 20, 0, 0, 0, 0, 5, 1, 0, 0, 0, 128, 0, 1, 0, 120], _ + [850, 'Fierce_Blow', 'Erbitterter_Schlag', 0, 0, 1, 19, 1024, 14, 5, 20, 1, 8, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 16, 0, 140], _ + [851, 'Sun_and_Moon_Slash', 'Sonne_Mond_Hieb', 0, 0, 1, 20, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 128, 0, 200], _ + [852, 'Splinter_Shot', 'Splitterschuss', 10, 13, 2, 25, 0, 14, 3, 15, 5, 65, 156, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 2, 5, 0], _ + [853, 'Melandrus_Shot', 'Melandrus_Schuss', 5, 6.5, 2, 25, 0, 14, 10, 25, 5, 25, 0, 0, 0, 0, 5, 1, 1, 1, 4, 0, 0, 2, 8, 0], _ + [854, 'Snare', 'Schlinge', 5, 6.5, 2, 24, 0, 21, 3, 15, 0, 0, 156, 240, 0, 0, 0, 1, 2, 0.75, 288, 8, 0, 0, 20, 0], _ + [858, 'Dancing_Daggers', 'Tanzende_Dolche', 5, 6.5, 7, 30, 0, 5, 5, 35, 1800, 1800, 0, 0, 1, 0, 5, 1, 1, 0.75, 8, 0, 0, 0, 5, 0], _ + [859, 'Conjure_Nightmare', 'Alptraum_beschwören', 15, 19.5, 5, 1, 0, 4, 8, 8, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 512, 0, 0, 0, 5, 0], _ + [860, 'Signet_of_Disruption', 'Siegel_der_Unterbrechung', 0, 0, 5, 2, 0, 7, 10, 51, 50, 50, 0, 0, 0, 0, 5, 1, 0.25, 0.75, 0, 0, 1, 0, 15, 0], _ + [862, 'Ravenous_Gaze', 'Heißhungriger_Blick', 1, 1.3, 4, 4, 0, 5, 15, 30, 15, 30, 240, 0, 0, 0, 16, 1, 1, 0.75, 4, 0, 0, 0, 10, 0], _ + [863, 'Order_of_Apostasy', 'Orden_der_Abtrünnigkeit', 25, 32.5, 4, 7, 0, 6, 25, 15, 0, 0, 5000, 0, 0, 0, 0, 1, 2, 0.75, 4, 0, 0, 0, 0, 0], _ + [864, 'Oppressive_Gaze', 'Repressiver_Blick', 10, 13, 4, 4, 1024, 5, 10, 30, 3, 12, 156, 50, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 10, 0], _ + [865, 'Lightning_Hammer', 'Blitzhammer', 25, 32.5, 6, 8, 0, 5, 10, 100, 25, 25, 0, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 0, 0, 4, 0], _ + [866, 'Vapor_Blade', 'Dunstklinge', 15, 19.5, 6, 11, 0, 5, 15, 135, 0, 0, 0, 0, 0, 0, 5, 1, 1.5, 0.75, 1, 0, 0, 0, 7, 0], _ + [867, 'Healing_Light', 'Heilendes_Licht', 5, 6.5, 3, 13, 0, 5, 40, 100, 1, 3, 0, 0, 0, 0, 3, 1, 1, 0.75, 4, 4096, 6, 0, 4, 0], _ + [869, 'Coward', 'Feigling', 0, 0, 1, 46, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 4, 128, 0, 0, 2, 100], _ + [870, 'Pestilence', 'Pestilenz', 5, 6.5, 2, 24, 0, 22, 1, 10, 0, 0, 2500, 312, 0, 0, 0, 1, 5, 0.75, 0, 0, 0, 0, 60, 0], _ + [871, 'Shadowsong', 'Schattengesang', 15, 19.5, 8, 32, 0, 22, 1, 10, 5, 20, 2500, 30, 0, 0, 0, 1, 1, 0.75, 256, 0, 0, 0, 30, 0], _ + [876, 'Signet_of_Shadows', 'Siegel_der_Schatten', 0, 0, 7, 30, 0, 7, 5, 35, 15, 60, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 30, 0], _ + [877, 'Lyssas_Balance', 'Lyssas_Ausgleich', 5, 6.5, 5, 46, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 15, 0], _ + [878, 'Visions_of_Regret', 'Visionen_des_Bedauerns', 10, 13, 5, 2, 0, 4, 15, 45, 5, 50, 156, 0, 0, 0, 5, 1, 2, 0.75, 4, 0, 0, 0, 20, 0], _ + [879, 'Illusion_of_Pain', 'Illusion_der_Schmerzen', 10, 13, 5, 1, 0, 4, 3, 10, 36, 120, 0, 0, 0, 0, 5, 1, 2, 0.75, 512, 0, 0, 0, 5, 0], _ + [880, 'Stolen_Speed', 'Gestohlene_Eile', 5, 6.5, 5, 0, 0, 4, 200, 200, 50, 50, 156, 0, 0, 0, 5, 1, 1, 0.75, 4, 0, 0, 0, 12, 0], _ + [881, 'Ether_Signet', 'Äther_Siegel', 0, 0, 5, 3, 0, 7, 5, 10, 10, 20, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 45, 0], _ + [882, 'Signet_of_Disenchantment', 'Siegel_der_Entzauberung', 0, 0, 5, 46, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 15, 0], _ + [883, 'Vocal_Minority', 'Stimmminderheit', 10, 13, 4, 7, 0, 4, 0, 0, 0, 0, 240, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 20, 0], _ + [884, 'Searing_Flames', 'Versengende_Flammen', 15, 19.5, 6, 10, 0, 5, 10, 100, 1, 7, 240, 0, 0, 0, 16, 1, 1, 0.75, 4, 0, 0, 0, 2, 0], _ + [885, 'Shield_Guardian', 'Schildwächter', 10, 13, 3, 15, 0, 6, 10, 40, 75, 75, 1000, 10, 0, 0, 0, 1, 1.5, 0.75, 0, 0, 128, 0, 20, 0], _ + [886, 'Restful_Breeze', 'Beruhigender_Hauch', 5, 6.5, 3, 13, 0, 6, 10, 10, 0, 0, 0, 0, 0, 0, 3, 1, 1, 0.75, 0, 0, 0, 0, 8, 0], _ + [887, 'Signet_of_Rejuvenation', 'Siegel_der_Verjüngung', 0, 0, 3, 13, 0, 7, 15, 75, 15, 75, 0, 0, 0, 0, 3, 1, 1, 0.75, 0, 4096, 0, 0, 8, 0], _ + [888, 'Whirling_Axe', 'Wirbelnde_Axt', 0, 0, 1, 18, 0, 14, 5, 20, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 4, 0, 0, 1, 0, 100], _ + [889, 'Forceful_Blow', 'Energischer_Schlag', 0, 0, 1, 19, 0, 14, 10, 30, 5, 20, 0, 0, 0, 0, 5, 1, 0, 0, 4, 0, 0, 16, 0, 120], _ + [891, 'None_Shall_Pass', 'Niemand_darf_vorbei', 5, 6.5, 1, 21, 0, 15, 1, 8, 25, 25, 240, 0, 0, 0, 0, 1, 0, 0, 0, 128, 0, 0, 45, 0], _ + [892, 'Quivering_Blade', 'Zitternde_Klinge', 0, 0, 1, 20, 0, 14, 10, 40, 5, 5, 0, 0, 0, 0, 5, 1, 0, 0, 4, 0, 0, 128, 0, 120], _ + [893, 'Seeking_Arrows', 'Suchende_Pfeile', 15, 19.5, 2, 25, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0.75, 256, 0, 0, 0, 20, 0], _ + [898, 'Overload', 'Überlastung', 5, 6.5, 5, 2, 0, 4, 1, 3, 15, 75, 156, 0, 0, 0, 5, 1, 0.25, 0.75, 512, 0, 0, 0, 5, 0], _ + [899, 'Images_of_Remorse', 'Bilder_der_Reue', 5, 6.5, 5, 1, 0, 4, 1, 3, 10, 52, 0, 0, 0, 0, 5, 1, 2, 0.75, 512, 0, 0, 0, 5, 0], _ + [900, 'Shared_Burden', 'Geteilte_Bürde', 5, 6.5, 5, 1, 0, 4, 50, 50, 0, 0, 240, 0, 0, 0, 5, 1, 2, 0.75, 4, 0, 0, 0, 15, 0], _ + [901, 'Soul_Bind', 'Seelenfessel', 10, 13, 4, 7, 0, 4, 20, 80, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 4, 128, 0, 0, 5, 0], _ + [902, 'Blood_of_the_Aggressor', 'Blut_des_Aggressoren', 5, 6.5, 4, 4, 0, 5, 5, 45, 3, 12, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 32, 0, 5, 0], _ + [903, 'Icy_Prism', 'Eisprisma', 10, 13, 6, 11, 0, 5, 15, 75, 15, 75, 240, 0, 0, 0, 5, 1, 1, 0.75, 1, 0, 0, 0, 5, 0], _ + [904, 'Furious_Axe', 'Zornige_Axt', 5, 6.5, 1, 18, 0, 14, 5, 35, 75, 75, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 1, 6, 0], _ + [905, 'Auspicious_Blow', 'Günstiger_Schlag', 0, 0, 1, 19, 1024, 14, 5, 20, 3, 8, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 16, 0, 120], _ + [906, 'On_Your_Knees', 'Auf_Eure_Knie', 0, 0, 1, 46, 0, 15, 0, 0, 0, 0, 156, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 150], _ + [907, 'Dragon_Slash', 'Drachenhieb', 0, 0, 1, 20, 0, 14, 10, 40, 1, 5, 0, 0, 0, 0, 5, 1, 0, 0, 4, 0, 0, 128, 0, 240], _ + [908, 'Marauders_Shot', 'Plünderer_Schuss', 10, 13, 2, 25, 0, 14, 10, 35, 10, 10, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 2, 6, 0], _ + [909, 'Focused_Shot', 'Scharfschuss', 5, 6.5, 2, 25, 0, 14, 10, 25, 5, 3, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 2, 2, 0], _ + [910, 'Spirit_Rift', 'Geisterriss', 10, 13, 8, 34, 0, 5, 25, 125, 1, 20, 156, 0, 0, 0, 16, 1, 2, 0.75, 0, 0, 0, 0, 5, 0], _ + [911, 'Union', 'Vereinigung', 15, 19.5, 8, 32, 0, 22, 1, 12, 15, 15, 2500, 0, 0, 0, 0, 1, 0.75, 0.75, 256, 0, 0, 0, 45, 0], _ + [913, 'Tranquil_Was_Tanasen', 'Ruhig_war_Tanasen', 10, 13, 8, 33, 0, 24, 10, 25, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0.75, 4, 0, 0, 0, 20, 0], _ + [914, 'Consume_Soul', 'Seele_verzehren', 5, 6.5, 8, 36, 0, 5, 5, 60, 25, 125, 312, 0, 0, 0, 5, 1, 1, 0.75, 4, 0, 0, 0, 5, 0], _ + [915, 'Spirit_Light', 'Geisterlicht', 5, 6.5, 8, 33, 0, 5, 60, 180, 0, 0, 17, 1000, 0, 0, 3, 1, 1, 0.75, 0, 4096, 38, 0, 4, 0], _ + [916, 'Lamentation', 'Wehklage', 10, 13, 8, 34, 0, 4, 0, 3, 10, 50, 240, 0, 0, 0, 5, 1, 1, 0.75, 512, 0, 0, 0, 15, 0], _ + [917, 'Rupture_Soul', 'Seele_zerreißen', 10, 13, 8, 36, 0, 5, 50, 140, 3, 12, 240, 0, 0, 0, 1, 1, 0.75, 0.75, 0, 2, 0, 0, 5, 0], _ + [918, 'Spirit_to_Flesh', 'Geist_zu_Fleisch', 10, 13, 8, 36, 0, 5, 30, 240, 0, 0, 240, 0, 0, 0, 1, 1, 0.75, 0.75, 2, 0, 0, 0, 15, 0], _ + [919, 'Spirit_Burn', 'Geisterbrand', 5, 6.5, 8, 34, 0, 5, 5, 50, 1, 5, 1000, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 6, 0], _ + [920, 'Destruction', 'Vernichtung', 10, 13, 8, 34, 0, 22, 1, 14, 5, 25, 312, 150, 0, 0, 0, 1, 0.75, 0.75, 256, 0, 0, 0, 20, 0], _ + [921, 'Dissonance', 'Missklang', 25, 32.5, 8, 32, 0, 22, 1, 12, 5, 20, 2500, 0, 0, 0, 0, 1, 1, 0.75, 256, 0, 0, 0, 45, 0], _ + [923, 'Disenchantment', 'Entzauberung', 15, 19.5, 8, 32, 0, 22, 1, 12, 5, 20, 2500, 0, 0, 0, 0, 1, 1, 0.75, 256, 0, 0, 0, 30, 0], _ + [925, 'Recall', 'Rückruf', 15, 19.5, 7, 46, 0, 6, 10, 10, 0, 0, 0, 0, 0, 0, 4, 1, 1, 0.75, 0, 0, 0, 0, 10, 0], _ + [926, 'Sharpen_Daggers', 'Dolche_wetzen', 5, 6.5, 7, 35, 0, 6, 5, 15, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 20, 0], _ + [927, 'Shameful_Fear', 'Schändliche_Angst', 10, 13, 7, 30, 0, 4, 10, 10, 5, 20, 0, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 0, 0, 10, 0], _ + [928, 'Shadow_Shroud', 'Schattenschleier', 10, 13, 7, 31, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 4, 0, 0, 0, 20, 0], _ + [929, 'Shadow_of_Haste', 'Schatten_der_Eile', 5, 6.5, 7, 31, 0, 3, 15, 15, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 45, 0], _ + [930, 'Auspicious_Incantation', 'Günstige_Beschwörung', 5, 6.5, 5, 3, 0, 6, 10, 5, 110, 200, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 25, 0], _ + [931, 'Power_Return', 'Kraftrevanche', 5, 6.5, 5, 0, 0, 5, 10, 5, 50, 50, 0, 0, 0, 0, 5, 1, 0.25, 0.75, 0, 0, 1, 0, 7, 0], _ + [932, 'Complicate', 'Erschweren', 10, 13, 5, 2, 0, 5, 8, 8, 5, 12, 312, 0, 0, 0, 5, 1, 0.25, 0.75, 0, 0, 1, 0, 20, 0], _ + [933, 'Shatter_Storm', 'Sturm_zerschlagen', 10, 13, 5, 46, 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 4, 0, 0, 0, 0, 0], _ + [934, 'Unnatural_Signet', 'Unnatürliches_Siegel', 0, 0, 5, 2, 0, 7, 15, 75, 5, 50, 156, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 10, 0], _ + [935, 'Rising_Bile', 'Hochkommende_Galle', 10, 13, 4, 5, 0, 4, 1, 6, 0, 0, 312, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 20, 0], _ + [936, 'Envenom_Enchantments', 'Verzauberungen_vergiften', 5, 6.5, 4, 7, 0, 5, 3, 10, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 20, 0], _ + [937, 'Shockwave', 'Stoßwelle', 10, 13, 6, 9, 0, 5, 15, 60, 156, 156, 240, 312, 0, 0, 0, 1, 1, 0.75, 4, 0, 512, 0, 15, 0], _ + [938, 'Ward_of_Stability', 'Kreis_der_Stabilität', 10, 13, 6, 9, 0, 11, 0, 0, 0, 0, 312, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 30, 0], _ + [939, 'Icy_Shackles', 'Eisfesseln', 10, 13, 6, 11, 0, 4, 66, 66, 90, 90, 0, 0, 0, 0, 5, 1, 1, 0.75, 4, 2048, 0, 0, 12, 0], _ + [941, 'Blessed_Light', 'Gesegnetes_Licht', 10, 13, 3, 16, 0, 5, 10, 140, 0, 0, 0, 0, 0, 0, 3, 1, 0.75, 0.75, 4, 4096, 6150, 0, 3, 0], _ + [942, 'Withdraw_Hexes', 'Verhexungen_zurücknehmen', 15, 19.5, 3, 16, 0, 5, 20, 5, 0, 0, 156, 0, 0, 0, 3, 1, 1, 0.75, 4, 0, 2048, 0, 5, 0], _ + [943, 'Extinguish', 'Löschen', 15, 19.5, 3, 15, 0, 5, 10, 100, 0, 0, 5000, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 4096, 0, 12, 0], _ + [944, 'Signet_of_Strength', 'Siegel_der_Stärke', 0, 0, 1, 17, 0, 7, 1, 16, 5, 5, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 45, 0], _ + [946, 'Trappers_Focus', 'Fokus_des_Fallenstellers', 5, 6.5, 2, 23, 0, 19, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0.75, 260, 0, 0, 0, 12, 0], _ + [947, 'Brambles', 'Dornenranken', 10, 13, 2, 24, 0, 22, 1, 10, 5, 20, 5, 0, 0, 0, 0, 1, 5, 0.75, 256, 0, 0, 0, 60, 0], _ + [948, 'Desperate_Strike', 'Verzweifelter_Stoß', 5, 6.5, 7, 29, 0, 14, 50, 80, 15, 60, 0, 0, 1, 0, 5, 1, 0, 0, 0, 0, 0, 8, 6, 0], _ + [949, 'Way_of_the_Fox', 'Weg_des_Fuchses', 5, 6.5, 7, 31, 0, 6, 1, 6, 0, 0, 0, 0, 0, 0, 0, 1, 0.25, 0.75, 0, 0, 0, 0, 45, 0], _ + [950, 'Shadowy_Burden', 'Schattenbürde', 10, 13, 7, 31, 0, 4, 25, 25, 20, 20, 0, 0, 0, 0, 5, 1, 0.25, 0.75, 0, 0, 0, 0, 15, 0], _ + [951, 'Siphon_Speed', 'Geschwindigkeit_abzapfen', 5, 6.5, 7, 30, 0, 4, 33, 33, 50, 50, 0, 0, 0, 0, 5, 1, 1, 0.75, 8, 0, 0, 0, 30, 0], _ + [952, 'Deaths_Charge', 'Angriff_des_Todes', 5, 6.5, 7, 31, 0, 5, 65, 200, 0, 0, 0, 0, 0, 0, 5, 1, 0.25, 0.75, 0, 0, 0, 0, 30, 0], _ + [953, 'Power_Flux', 'Kraftfluss', 10, 13, 5, 2, 0, 4, 2, 2, 0, 0, 0, 0, 0, 0, 5, 1, 0.25, 0.75, 4, 0, 1, 0, 10, 0], _ + [954, 'Expel_Hexes', 'Verhexungen_vertreiben', 5, 6.5, 5, 46, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 1, 0.75, 4, 0, 2048, 0, 8, 0], _ + [955, 'Rip_Enchantment', 'Verzauberung_zerreißen', 5, 6.5, 4, 7, 0, 5, 1, 1, 5, 25, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 32, 0, 15, 0], _ + [957, 'Spell_Shield', 'Zauberschild', 10, 13, 3, 16, 0, 6, 10, 5, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0.75, 0, 0, 0, 0, 30, 0], _ + [958, 'Healing_Whisper', 'Heilendes_Geflüster', 5, 6.5, 3, 13, 0, 5, 40, 100, 0, 0, 0, 0, 0, 0, 4, 1, 1, 0.75, 8, 4096, 6, 0, 1, 0], _ + [959, 'Ethereal_Light', 'Ätherisches_Licht', 5, 6.5, 3, 13, 0, 5, 25, 100, 0, 0, 0, 0, 0, 0, 3, 1, 1, 0.75, 32, 4096, 6, 0, 5, 0], _ + [960, 'Release_Enchantments', 'Verzauberungen_freisetzen', 5, 6.5, 3, 16, 0, 5, 5, 35, 0, 0, 5000, 0, 0, 0, 0, 1, 1, 0.75, 0, 4096, 8192, 0, 5, 0], _ + [961, 'Lacerate', 'Zerfetzen', 10, 13, 2, 22, 0, 22, 1, 10, 5, 25, 2, 90, 0, 0, 0, 1, 3, 0.75, 260, 0, 0, 0, 15, 0], _ + [962, 'Spirit_Transfer', 'Geistübertragung', 10, 13, 8, 33, 0, 5, 5, 50, 5, 5, 1000, 0, 0, 0, 3, 1, 0.25, 0.75, 0, 0, 0, 0, 5, 0], _ + [963, 'Restoration', 'Wiederherstellung', 10, 13, 8, 32, 0, 22, 1, 14, 5, 50, 312, 0, 0, 0, 0, 1, 1, 0.75, 2304, 0, 8, 0, 30, 0], _ + [964, 'Vengeful_Weapon', 'Rachsüchtige_Waffe', 5, 6.5, 8, 33, 0, 25, 15, 60, 0, 0, 0, 0, 0, 0, 3, 1, 0.25, 0.75, 0, 0, 6, 0, 3, 0], _ + [973, 'Blinding_Powder', 'Blendpulver', 5, 6.5, 7, 31, 0, 5, 3, 15, 0, 0, 156, 0, 0, 4, 5, 1, 0.25, 0.75, 0, 0, 0, 0, 20, 0], _ + [974, 'Mantis_Touch', 'Berührung_der_Mantis', 5, 6.5, 7, 30, 0, 5, 5, 20, 0, 0, 0, 0, 2, 2, 5, 1, 0.75, 0.75, 0, 0, 512, 0, 15, 0], _ + [975, 'Exhausting_Assault', 'Ermüdender_Angriff', 5, 6.5, 7, 29, 0, 14, 0, 0, 0, 0, 0, 0, 3, 2, 5, 1, 0.5, 0, 32768, 0, 0, 8, 8, 0], _ + [976, 'Repeating_Strike', 'Wiederholender_Schlag', 5, 6.5, 7, 29, 0, 14, 10, 30, 15, 15, 0, 0, 2, 4, 5, 1, 0, 0, 0, 0, 0, 8, 0, 0], _ + [977, 'Way_of_the_Lotus', 'Weg_des_Lotus', 5, 6.5, 7, 31, 0, 6, 5, 20, 0, 0, 0, 0, 0, 0, 0, 1, 0.25, 0.75, 0, 0, 0, 0, 20, 0], _ + [978, 'Mark_of_Instability', 'Zeichen_der_Unbeständigkeit', 10, 13, 7, 46, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 0.25, 0.75, 0, 0, 0, 0, 20, 0], _ + [979, 'Mistrust', 'Argwohn', 10, 13, 5, 2, 0, 4, 10, 100, 0, 0, 240, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 0, 0, 12, 0], _ + [980, 'Feast_of_Souls', 'Schmaus_der_Seelen', 10, 13, 8, 36, 0, 5, 50, 100, 0, 0, 240, 0, 0, 0, 0, 1, 0.25, 0.75, 0, 0, 0, 0, 10, 0], _ + [981, 'Recuperation', 'Erholung', 25, 32.5, 8, 33, 0, 22, 1, 14, 1, 3, 2500, 0, 0, 0, 0, 1, 0.75, 0.75, 256, 0, 0, 0, 45, 0], _ + [982, 'Shelter', 'Unterschlupf', 25, 32.5, 8, 32, 0, 22, 1, 12, 75, 45, 10, 0, 0, 0, 0, 1, 1, 0.75, 256, 0, 0, 0, 45, 0], _ + [983, 'Weapon_of_Shadow', 'Schattenwaffe', 10, 13, 8, 33, 0, 25, 5, 5, 1, 3, 0, 0, 0, 0, 3, 1, 1, 0.75, 0, 0, 0, 0, 20, 0], _ + [985, 'Caltrops', 'Trittnägel', 10, 13, 7, 31, 0, 5, 5, 15, 0, 0, 156, 0, 0, 0, 5, 1, 0.25, 0.75, 8, 0, 0, 0, 10, 0], _ + [986, 'Nine_Tail_Strike', 'Neunschwänziger_Stoß', 5, 6.5, 7, 29, 0, 14, 15, 40, 0, 0, 0, 0, 3, 4, 5, 1, 0, 0, 32768, 0, 0, 8, 8, 0], _ + [987, 'Way_of_the_Empty_Palm', 'Weg_der_leeren_Handfläche', 5, 6.5, 7, 30, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0.25, 0.75, 4, 0, 0, 0, 10, 0], _ + [988, 'Temple_Strike', 'Schläfenstoß', 15, 19.5, 7, 29, 0, 14, 0, 0, 0, 0, 0, 0, 2, 2, 5, 1, 0, 0, 4, 514, 0, 8, 20, 0], _ + [989, 'Golden_Phoenix_Strike', 'Goldener_Phönix_Stoß', 5, 6.5, 7, 29, 0, 14, 10, 30, 10, 30, 156, 0, 2, 0, 5, 1, 0, 0, 0, 0, 0, 8, 8, 0], _ + [990, 'Expunge_Enchantments', 'Verzauberungen_ausmerzen', 10, 13, 7, 30, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 0.75, 0.75, 2, 0, 0, 0, 30, 0], _ + [991, 'Deny_Hexes', 'Verhexungen_zurückweisen', 5, 6.5, 3, 16, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 1, 0.75, 0, 0, 2048, 0, 12, 0], _ + [992, 'Triple_Chop', 'Dreifachhieb', 5, 6.5, 1, 18, 0, 14, 10, 40, 0, 0, 156, 0, 0, 0, 5, 1, 0, 0, 4, 0, 0, 1, 10, 0], _ + [993, 'Enraged_Smash', 'Erzürnter_Schlag', 5, 6.5, 1, 19, 0, 14, 1, 4, 10, 40, 0, 0, 0, 0, 5, 1, 0, 0, 4, 0, 0, 16, 5, 0], _ + [994, 'Renewing_Smash', 'Erneuernder_Schlag', 5, 6.5, 1, 19, 0, 14, 10, 40, 3, 3, 0, 0, 0, 0, 5, 1, 1, 0, 0, 0, 0, 16, 30, 0], _ + [995, 'Tiger_Stance', 'Tigerhaltung', 5, 6.5, 1, 17, 0, 3, 33, 33, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 32768, 0, 20, 0], _ + [996, 'Standing_Slash', 'Stehender_Hieb', 0, 0, 1, 20, 0, 14, 5, 20, 5, 20, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 128, 0, 140], _ + [997, 'Famine', 'Hungersnot', 10, 13, 2, 24, 0, 22, 1, 10, 10, 35, 5, 0, 0, 0, 0, 1, 3, 0.75, 260, 0, 0, 0, 15, 0], _ + [1018, 'Critical_Eye', 'Kritisches_Auge', 5, 6.5, 7, 35, 0, 16, 3, 15, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0.75, 0, 0, 0, 0, 30, 0], _ + [1019, 'Critical_Strike', 'Kritischer_Stoß', 5, 6.5, 7, 35, 0, 14, 10, 30, 1, 3, 0, 0, 3, 4, 5, 1, 0, 0, 32768, 0, 0, 8, 6, 0], _ + [1020, 'Blades_of_Steel', 'Stahlklingen', 5, 6.5, 7, 29, 0, 14, 5, 16, 60, 60, 0, 0, 3, 4, 5, 1, 0, 0, 32768, 0, 0, 8, 8, 0], _ + [1021, 'Jungle_Strike', 'Dschungelschlag', 5, 6.5, 7, 29, 0, 14, 10, 25, 1, 31, 156, 0, 2, 2, 5, 1, 0.5, 0, 0, 0, 0, 8, 10, 0], _ + [1022, 'Wild_Strike', 'Wilder_Stoß', 5, 6.5, 7, 29, 0, 14, 10, 35, 0, 0, 0, 0, 2, 2, 5, 1, 0, 0, 0, 0, 0, 8, 4, 0], _ + [1023, 'Leaping_Mantis_Sting', 'Stich_der_springenden_Mantis', 5, 6.5, 7, 29, 0, 14, 5, 15, 3, 15, 0, 0, 1, 0, 5, 1, 0.5, 0, 0, 0, 0, 8, 8, 0], _ + [1024, 'Black_Mantis_Thrust', 'Stoß_der_schwarzen_Mantis', 5, 6.5, 7, 29, 0, 14, 8, 20, 3, 15, 0, 0, 1, 0, 5, 1, 1, 0, 0, 8, 0, 8, 6, 0], _ + [1025, 'Disrupting_Stab', 'Unterbrechender_Dolchstoß', 5, 6.5, 7, 29, 0, 14, 3, 10, 0, 0, 0, 0, 1, 0, 5, 1, 0, 0, 0, 0, 1, 8, 10, 0], _ + [1026, 'Golden_Lotus_Strike', 'Goldener_Lotus_Stoß', 5, 6.5, 7, 29, 0, 14, 5, 20, 5, 8, 0, 0, 1, 0, 5, 1, 0, 0, 0, 0, 0, 8, 5, 0], _ + [1027, 'Critical_Defenses', 'Kritische_Verteidigungen', 10, 13, 7, 35, 0, 6, 75, 75, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 128, 0, 30, 0], _ + [1028, 'Way_of_Perfection', 'Weg_der_Perfektion', 5, 6.5, 7, 31, 0, 6, 10, 40, 0, 0, 0, 0, 0, 0, 0, 1, 0.25, 0.75, 0, 0, 0, 0, 30, 0], _ + [1029, 'Dark_Apostasy', 'Dunkle_Abtrünnigkeit', 10, 13, 7, 35, 0, 6, 10, 4, 0, 0, 0, 0, 0, 0, 0, 1, 0.25, 0.75, 4, 0, 0, 0, 15, 0], _ + [1030, 'Locusts_Fury', 'Wut_der_Heuschrecke', 10, 13, 7, 35, 0, 6, 50, 50, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0.75, 4, 0, 0, 0, 10, 0], _ + [1031, 'Shroud_of_Distress', 'Schleier_des_Kummers', 10, 13, 7, 31, 0, 6, 3, 8, 75, 75, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 45, 0], _ + [1032, 'Heart_of_Shadow', 'Herz_der_Schatten', 5, 6.5, 7, 31, 0, 5, 30, 150, 0, 0, 312, 800, 0, 0, 1, 1, 0.25, 0, 0, 0, 0, 0, 15, 0], _ + [1033, 'Impale', 'Aufspießen', 5, 6.5, 7, 30, 0, 10, 25, 100, 5, 20, 0, 0, 0, 1, 5, 1, 1, 0.75, 0, 0, 0, 0, 15, 0], _ + [1034, 'Seeping_Wound', 'Eiternde_Wunde', 15, 19.5, 7, 35, 0, 4, 33, 33, 5, 25, 0, 0, 0, 0, 5, 1, 0.25, 0.75, 12, 0, 0, 0, 12, 0], _ + [1035, 'Assassins_Promise', 'Versprechen_des_Assassinen', 5, 6.5, 7, 30, 0, 4, 5, 20, 0, 0, 0, 0, 0, 0, 5, 1, 0.75, 0.75, 4, 0, 0, 0, 45, 0], _ + [1036, 'Signet_of_Malice', 'Siegel_der_Bosheit', 0, 0, 7, 46, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 0.25, 0.75, 0, 0, 4096, 0, 5, 0], _ + [1037, 'Dark_Escape', 'Dunkle_Flucht', 5, 6.5, 7, 31, 0, 3, 25, 25, 50, 50, 0, 0, 0, 0, 0, 1, 0, 0.75, 0, 0, 0, 0, 30, 0], _ + [1038, 'Crippling_Dagger', 'Verkrüppelnder_Dolch', 5, 6.5, 7, 30, 0, 5, 15, 60, 3, 15, 0, 0, 0, 0, 5, 1, 1, 0.75, 8, 0, 0, 0, 5, 0], _ + [1040, 'Spirit_Walk', 'Geistermarsch', 5, 6.5, 7, 46, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0.25, 0, 0, 0, 0, 0, 8, 0], _ + [1041, 'Unseen_Fury', 'Unsichtbare_Wut', 5, 6.5, 7, 31, 0, 3, 0, 0, 3, 10, 156, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 20, 0], _ + [1042, 'Flashing_Blades', 'Blitzende_Klingen', 10, 13, 7, 29, 0, 3, 75, 75, 5, 20, 0, 0, 0, 0, 0, 1, 0, 0, 4, 0, 128, 0, 30, 0], _ + [1043, 'Dash', 'Preschen', 5, 6.5, 7, 46, 0, 3, 50, 50, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 8, 0], _ + [1044, 'Dark_Prison', 'Dunkles_Gefängnis', 10, 13, 7, 30, 0, 4, 33, 33, 0, 0, 0, 0, 0, 0, 5, 1, 0.25, 0.75, 0, 0, 0, 0, 30, 0], _ + [1045, 'Palm_Strike', 'Handflächenschlag', 5, 6.5, 7, 35, 0, 10, 10, 65, 1, 5, 0, 0, 2, 0, 5, 1, 0.75, 0.75, 6, 0, 512, 0, 7, 0], _ + [1048, 'Revealed_Enchantment', 'Enthüllte_Verzauberung', 10, 13, 5, 3, 0, 5, 3, 15, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 256, 0, 0, 0], _ + [1049, 'Revealed_Hex', 'Enthüllte_Verhexung', 5, 6.5, 5, 3, 0, 5, 4, 10, 0, 0, 0, 0, 0, 0, 3, 1, 1, 0.75, 0, 0, 2304, 0, 0, 0], _ + [1052, 'Accumulated_Pain', 'Angehäufter_Schmerz', 5, 6.5, 5, 1, 0, 5, 15, 75, 2, 2, 0, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 0, 0, 12, 0], _ + [1053, 'Psychic_Distraction', 'Übernatürliche_Ablenkung', 10, 13, 5, 2, 0, 5, 8, 8, 5, 12, 312, 0, 0, 0, 5, 1, 0.25, 0.75, 4, 0, 1, 0, 2, 0], _ + [1054, 'Ancestors_Visage', 'Antlitz_des_Ahnen', 10, 13, 5, 1, 0, 6, 3, 3, 0, 0, 156, 0, 0, 0, 3, 1, 1, 0.75, 0, 0, 0, 0, 20, 0], _ + [1055, 'Recurring_Insecurity', 'Wiederkehrende_Unsicherheit', 10, 13, 5, 1, 0, 4, 1, 5, 0, 0, 240, 0, 0, 0, 5, 1, 1, 0.75, 516, 0, 0, 0, 10, 0], _ + [1056, 'Kitahs_Burden', 'Kitahs_Bürde', 15, 19.5, 5, 1, 0, 4, 50, 50, 10, 18, 0, 0, 0, 0, 5, 1, 1.5, 0.75, 0, 0, 0, 0, 30, 0], _ + [1057, 'Psychic_Instability', 'Übernatürliche_Labilität', 5, 6.5, 5, 0, 0, 5, 2, 4, 0, 0, 240, 0, 0, 0, 5, 1, 0.25, 0.75, 68, 0, 0, 0, 12, 0], _ + [1059, 'Hex_Eater_Signet', 'Verhexungsfresser_Siegel', 0, 0, 5, 3, 0, 7, 2, 5, 1, 4, 156, 0, 0, 0, 3, 1, 1, 0.75, 2, 0, 2048, 0, 25, 0], _ + [1061, 'Feedback', 'Reaktion', 10, 13, 5, 3, 0, 5, 4, 10, 0, 0, 0, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 0, 0, 30, 0], _ + [1062, 'Arcane_Larceny', 'Arkane_Entwendung', 10, 13, 5, 2, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 0, 0], _ + [1066, 'Spoil_Victor', 'Sieger_plündern', 10, 13, 4, 4, 0, 4, 25, 100, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 4, 0, 0, 0, 10, 0], _ + [1067, 'Lifebane_Strike', 'Lebensfluchstoß', 10, 13, 4, 4, 0, 5, 12, 48, 12, 48, 0, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 0, 0, 15, 0], _ + [1068, 'Bitter_Chill', 'Bitterkalt', 5, 6.5, 4, 5, 0, 5, 15, 60, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 10, 0], _ + [1069, 'Taste_of_Pain', 'Geschmack_der_Schmerzen', 5, 6.5, 4, 5, 0, 5, 50, 50, 30, 150, 0, 0, 0, 0, 5, 1, 0.25, 0.75, 0, 0, 0, 0, 10, 0], _ + [1070, 'Defile_Enchantments', 'Verzauberungen_schänden', 10, 13, 4, 7, 0, 5, 6, 60, 4, 20, 240, 0, 0, 0, 16, 1, 2, 0.75, 0, 0, 0, 0, 15, 0], _ + [1071, 'Shivers_of_Dread', 'Angstschauer', 10, 13, 4, 7, 0, 4, 10, 5, 0, 0, 0, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 0, 0, 15, 0], _ + [1075, 'Vampiric_Swarm', 'Vampirschwarm', 15, 19.5, 4, 4, 0, 5, 15, 60, 0, 0, 312, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 0, 0, 8, 0], _ + [1076, 'Blood_Drinker', 'Bluttrinker', 5, 6.5, 4, 4, 0, 5, 20, 65, 50, 50, 0, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 0, 0, 8, 0], _ + [1077, 'Vampiric_Bite', 'Vampirbiss', 15, 19.5, 4, 4, 0, 10, 29, 74, 0, 0, 0, 0, 0, 0, 5, 1, 0.75, 0.75, 2, 0, 4, 0, 2, 0], _ + [1078, 'Wallows_Bite', 'Wälzerbiss', 1, 1.3, 4, 4, 0, 10, 10, 10, 20, 58, 0, 0, 0, 0, 5, 1, 0.75, 0.75, 2, 0, 544, 0, 3, 0], _ + [1079, 'Enfeebling_Touch', 'Schwächende_Berührung', 5, 6.5, 4, 7, 0, 10, 5, 50, 5, 20, 0, 0, 0, 0, 5, 1, 0.75, 0.75, 2, 0, 512, 0, 5, 0], _ + [1081, 'Teinais_Wind', 'Teinais_Wind', 5, 6.5, 6, 8, 0, 5, 10, 40, 40, 80, 156, 0, 0, 0, 5, 1, 1, 0.75, 0, 128, 0, 0, 8, 0], _ + [1082, 'Shock_Arrow', 'Schockpfeil', 5, 6.5, 6, 8, 0, 5, 5, 50, 5, 5, 2400, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 8, 0], _ + [1083, 'Unsteady_Ground', 'Schwankender_Boden', 10, 13, 6, 9, 0, 5, 10, 40, 0, 0, 240, 0, 0, 0, 16, 1, 2, 0.75, 4, 128, 0, 0, 15, 0], _ + [1084, 'Sliver_Armor', 'Splitter_Rüstung', 10, 13, 6, 9, 0, 6, 25, 50, 5, 35, 240, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 128, 0, 30, 0], _ + [1085, 'Ash_Blast', 'Aschenexplosion', 5, 6.5, 6, 9, 0, 4, 35, 65, 20, 75, 156, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 15, 0], _ + [1086, 'Dragon_s_Stomp', 'Drachenstampfer', 25, 32.5, 6, 9, 0, 5, 26, 100, 0, 0, 240, 0, 0, 0, 16, 1, 3, 0.75, 1, 128, 0, 0, 15, 0], _ + [1088, 'Second_Wind', 'Zweite_Chance', 5, 6.5, 6, 46, 0, 5, 1, 1, 5, 5, 0, 0, 0, 0, 0, 1, 1, 0.75, 5, 0, 256, 0, 5, 0], _ + [1090, 'Smoldering_Embers', 'Glühende_Kohle', 10, 13, 6, 10, 0, 4, 10, 70, 5, 25, 156, 0, 0, 0, 5, 1, 1.5, 0.75, 0, 0, 0, 0, 7, 0], _ + [1091, 'Double_Dragon', 'Doppeldrache', 5, 6.5, 6, 10, 0, 6, 0, 3, 5, 30, 240, 156, 0, 0, 1, 1, 1, 0.75, 4, 0, 0, 0, 20, 0], _ + [1093, 'Teinais_Heat', 'Teinais_Hitze', 15, 19.5, 6, 10, 0, 11, 2, 5, 33, 33, 312, 0, 0, 0, 0, 1, 1, 0.75, 0, 4, 0, 0, 20, 0], _ + [1094, 'Breath_of_Fire', 'Feueratem', 5, 6.5, 6, 10, 0, 5, 10, 40, 0, 0, 156, 0, 0, 0, 16, 1, 2, 0.75, 1, 0, 0, 0, 10, 0], _ + [1095, 'Star_Burst', 'Sternenexplosion', 5, 6.5, 6, 10, 0, 5, 7, 112, 1, 4, 312, 2, 0, 0, 5, 1, 0.75, 0.75, 6, 0, 0, 0, 7, 0], _ + [1096, 'Glyph_of_Essence', 'Glyphe_der_Essenz', 5, 6.5, 6, 46, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 20, 0], _ + [1097, 'Teinais_Prison', 'Teinais_Gefängnis', 10, 13, 6, 11, 0, 4, 66, 66, 5, 9, 0, 0, 0, 0, 5, 1, 1, 0.75, 512, 2048, 0, 0, 15, 0], _ + [1098, 'Mirror_of_Ice', 'Eisspiegel', 15, 19.5, 6, 11, 0, 4, 15, 70, 66, 66, 240, 50, 0, 0, 1, 1, 0.75, 0.75, 4, 0, 0, 0, 15, 0], _ + [1099, 'Teinais_Crystals', 'Teinais_Kristalle', 15, 19.5, 6, 9, 0, 5, 20, 40, 20, 40, 240, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 512, 0, 8, 0], _ + [1113, 'Kirins_Wrath', 'Kirins_Zorn', 5, 6.5, 3, 14, 0, 5, 8, 32, 0, 0, 156, 0, 0, 0, 0, 1, 2, 0.75, 0, 0, 512, 0, 30, 0], _ + [1114, 'Spirit_Bond', 'Geisterbindung', 10, 13, 3, 15, 0, 6, 50, 50, 30, 90, 10, 0, 0, 0, 3, 1, 0.25, 0.75, 0, 0, 0, 0, 2, 0], _ + [1115, 'Air_of_Enchantment', 'Flair_der_Verzauberung', 5, 6.5, 3, 15, 0, 6, 5, 5, 1, 1, 0, 0, 0, 0, 4, 1, 0.25, 0.75, 4, 0, 0, 0, 8, 0], _ + [1117, 'Heavens_Delight', 'Himmlische_Wonne', 5, 6.5, 3, 16, 0, 5, 15, 60, 0, 0, 1000, 0, 0, 0, 0, 1, 1, 0.75, 0, 4096, 6, 0, 12, 0], _ + [1118, 'Healing_Burst', 'Heilsalve', 5, 6.5, 3, 13, 0, 5, 10, 160, 0, 0, 1000, 0, 0, 0, 3, 1, 0.75, 0.75, 4, 4096, 6, 0, 4, 0], _ + [1119, 'Kareis_Healing_Circle', 'Kareis_Heilkreis', 10, 13, 3, 13, 0, 5, 30, 180, 0, 0, 156, 0, 0, 0, 0, 1, 1, 0.75, 0, 4096, 6, 0, 5, 0], _ + [1120, 'Jameis_Gaze', 'Jameis_Starren', 10, 13, 3, 13, 0, 5, 35, 180, 0, 0, 0, 0, 0, 0, 4, 1, 0.75, 0.75, 0, 4096, 2, 0, 3, 0], _ + [1121, 'Gift_of_Health', 'Geschenk_des_Lebens', 5, 6.5, 3, 13, 0, 5, 15, 150, 10, 5, 0, 0, 0, 0, 4, 1, 0.75, 0.75, 0, 4096, 2, 0, 5, 0], _ + [1123, 'Life_Sheath', 'Lebensmantel', 5, 6.5, 3, 15, 0, 6, 0, 2, 20, 100, 0, 0, 0, 0, 3, 1, 0.25, 0.75, 4, 0, 0, 0, 2, 0], _ + [1126, 'Empathic_Removal', 'Ausdrückliche_Entfernung', 5, 6.5, 3, 46, 0, 5, 50, 50, 0, 0, 0, 0, 0, 0, 4, 1, 1, 0.75, 4, 0, 6144, 0, 7, 0], _ + [1128, 'Resurrection_Chant', 'Gesang_der_Wiederbelebung', 10, 13, 3, 13, 0, 5, 5, 35, 0, 0, 0, 0, 0, 0, 6, 1, 6, 0.75, 2056, 0, 8, 0, 15, 0], _ + [1129, 'Word_of_Censure', 'Wort_des_Tadels', 10, 13, 3, 14, 0, 5, 15, 75, 20, 20, 33, 0, 0, 0, 5, 1, 1, 0.75, 4, 0, 0, 0, 2, 0], _ + [1130, 'Spear_of_Light', 'Speer_des_Lichts', 5, 6.5, 3, 14, 0, 5, 26, 56, 15, 60, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 15, 0], _ + [1131, 'Stonesoul_Strike', 'Steinseelenschlag', 5, 6.5, 3, 14, 0, 10, 10, 55, 10, 55, 0, 0, 0, 0, 5, 1, 0.75, 0.75, 2, 0, 0, 0, 8, 0], _ + [1133, 'Drunken_Blow', 'Betrunkener_Schlag', 5, 6.5, 1, 21, 0, 14, 10, 40, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 0, 25, 65536, 185, 7, 0], _ + [1134, 'Leviathans_Sweep', 'Leviathanschlag', 5, 6.5, 1, 17, 0, 14, 5, 20, 10, 34, 0, 0, 0, 0, 5, 1, 0, 0, 0, 128, 0, 185, 8, 0], _ + [1135, 'Jaizhenju_Strike', 'Jaizhenjuschlag', 5, 6.5, 1, 20, 0, 14, 1, 30, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 128, 8, 0], _ + [1136, 'Penetrating_Chop', 'Durchdringender_Hieb', 0, 0, 1, 18, 0, 14, 5, 20, 20, 20, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 1, 0, 120], _ + [1137, 'Yeti_Smash', 'Yetischlag', 0, 0, 1, 19, 0, 14, 5, 20, 5, 50, 156, 0, 0, 0, 5, 1, 0, 0, 64, 0, 0, 16, 0, 150], _ + [1141, 'You_Will_Die', 'Ihr_werdet_sterben', 5, 6.5, 1, 17, 0, 15, 50, 50, 1, 3, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 0, 15, 0], _ + [1142, 'Auspicious_Parry', 'Günstige_Abwehr', 0, 0, 1, 21, 0, 3, 1, 4, 50, 50, 0, 0, 0, 0, 0, 1, 0, 0, 4, 0, 128, 0, 2, 25], _ + [1144, 'Silverwing_Slash', 'Silberflügel_Hieb', 0, 0, 1, 20, 0, 14, 1, 40, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 128, 0, 200], _ + [1146, 'Shove', 'Schubs', 5, 6.5, 1, 21, 0, 10, 15, 75, 0, 0, 0, 0, 0, 0, 5, 1, 0.75, 0, 6, 0, 0, 0, 15, 0], _ + [1191, 'Sundering_Attack', 'Trennender_Angriff', 10, 13, 2, 25, 0, 14, 5, 25, 10, 10, 0, 0, 0, 0, 5, 1, 0.75, 0.600000023841858, 0, 0, 0, 2, 4, 0], _ + [1192, 'Zojuns_Shot', 'Zojuns_Schuss', 5, 6.5, 2, 23, 0, 14, 10, 40, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 8, 0, 0, 2, 3, 0], _ + [1194, 'Predatory_Bond', 'Raubtierverbindung', 10, 13, 2, 22, 0, 15, 1, 31, 25, 25, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 30, 0], _ + [1195, 'Heal_as_One', 'Gemeinsame_Heilung', 5, 6.5, 2, 22, 0, 10, 1, 20, 20, 104, 50, 0, 0, 0, 0, 1, 1, 0, 4, 0, 4, 0, 5, 0], _ + [1196, 'Zojuns_Haste', 'Zojuns_Eile', 5, 6.5, 2, 23, 0, 3, 27, 75, 33, 33, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 30, 0], _ + [1197, 'Needling_Shot', 'Nadelschuss', 5, 6.5, 2, 25, 0, 14, 50, 50, 10, 30, 4800, 0, 0, 0, 5, 1, 0.75, 0.600000023841858, 0, 0, 0, 2, 4, 0], _ + [1198, 'Broad_Head_Arrow', 'Stahlspitzenpfeil', 15, 19.5, 2, 25, 0, 14, 1800, 1800, 0, 0, 800, 0, 0, 0, 5, 1, 0, 0, 4, 0, 0, 2, 15, 0], _ + [1199, 'Glass_Arrows', 'Glaspfeile', 5, 6.5, 2, 23, 0, 19, 5, 20, 10, 20, 0, 0, 0, 0, 0, 1, 2, 0.75, 260, 0, 0, 0, 12, 0], _ + [1200, 'Archers_Signet', 'Siegel_des_Bogenschützen', 0, 0, 2, 23, 0, 7, 100, 100, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0.75, 4, 0, 0, 0, 12, 0], _ + [1201, 'Savage_Pounce', 'Wilder_Sprung', 5, 6.5, 2, 22, 0, 20, 5, 20, 0, 0, 5000, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 10, 0], _ + [1202, 'Enraged_Lunge', 'Erzürnter_Ausfall', 5, 6.5, 2, 22, 0, 20, 10, 50, 0, 0, 5000, 0, 0, 0, 0, 1, 0, 0.75, 4, 0, 0, 0, 5, 0], _ + [1203, 'Bestial_Mauling', 'Bestienattacke', 5, 6.5, 2, 22, 0, 20, 5, 20, 0, 0, 5000, 0, 0, 0, 0, 1, 0, 0.75, 0, 0, 0, 0, 20, 0], _ + [1205, 'Poisonous_Bite', 'Giftbiss', 5, 6.5, 2, 22, 0, 20, 0, 0, 0, 0, 5000, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 7, 0], _ + [1206, 'Pounce', 'Sprung', 5, 6.5, 2, 22, 0, 20, 5, 20, 0, 0, 5000, 0, 0, 0, 0, 1, 0, 0.75, 0, 0, 0, 0, 20, 0], _ + [1209, 'Bestial_Fury', 'Bestienwut', 10, 13, 2, 22, 0, 3, 25, 25, 5, 5, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 32768, 0, 10, 0], _ + [1211, 'Vipers_Nest', 'Vipernnest', 10, 13, 2, 22, 0, 21, 5, 35, 5, 20, 156, 240, 0, 0, 0, 1, 2, 0.75, 288, 256, 0, 0, 20, 0], _ + [1212, 'Equinox', 'Tagundnachtgleiche', 10, 13, 2, 24, 0, 22, 1, 10, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0.75, 260, 0, 0, 0, 15, 0], _ + [1213, 'Tranquility', 'Ruhe', 15, 19.5, 2, 24, 0, 22, 1, 10, 20, 50, 2500, 0, 0, 0, 0, 1, 5, 0.75, 256, 0, 0, 0, 60, 0], _ + [1215, 'Clamor_of_Souls', 'Gezeter_der_Seelen', 10, 13, 8, 34, 0, 5, 10, 65, 10, 10, 240, 1000, 0, 0, 5, 1, 1, 0.75, 4, 0, 0, 0, 8, 0], _ + [1217, 'Ritual_Lord', 'Herr_der_Rituale', 0, 0, 8, 36, 0, 16, 10, 60, 2, 4, 0, 0, 0, 0, 0, 1, 0, 0.75, 4, 0, 0, 0, 45, 0], _ + [1218, 'Cruel_Was_Daoshen', 'Grausam_war_Daoshen', 15, 19.5, 8, 34, 0, 24, 15, 85, 10, 10, 240, 10, 0, 0, 0, 1, 2, 0.75, 0, 0, 512, 0, 30, 0], _ + [1219, 'Protective_Was_Kaolai', 'Schützend_war_Kaolai', 10, 13, 8, 33, 0, 24, 10, 10, 10, 85, 5000, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 25, 0], _ + [1220, 'Attuned_Was_Songkai', 'Eingestimmt_war_Songkai', 10, 13, 8, 36, 0, 24, 5, 50, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0.75, 4, 0, 0, 0, 60, 0], _ + [1221, 'Resilient_Was_Xiko', 'Unverwüstlich_war_Xiko', 5, 6.5, 8, 33, 0, 24, 3, 3, 1, 4, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 10, 0], _ + [1222, 'Lively_Was_Naomei', 'Lebhaft_war_Naomei', 15, 19.5, 8, 33, 0, 24, 15, 75, 0, 0, 312, 0, 0, 0, 0, 1, 6, 0.75, 2048, 0, 8, 0, 20, 0], _ + [1223, 'Anguished_Was_Lingwah', 'Gequält_war_Lingwah', 5, 6.5, 8, 36, 0, 24, 1, 5, 33, 33, 0, 0, 0, 0, 0, 1, 2, 0.75, 0, 0, 0, 0, 30, 0], _ + [1224, 'Draw_Spirit', 'Geist_entziehen', 5, 6.5, 8, 46, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0.25, 0.75, 0, 0, 0, 0, 5, 0], _ + [1225, 'Channeled_Strike', 'Gelenkter_Schlag', 10, 13, 8, 34, 0, 5, 5, 95, 5, 35, 0, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 0, 0, 4, 0], _ + [1226, 'Spirit_Boon_Strike', 'Geistersegenstoß', 5, 6.5, 8, 34, 0, 5, 20, 65, 20, 65, 1000, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 3, 0], _ + [1227, 'Essence_Strike', 'Essenzschlag', 5, 6.5, 8, 34, 0, 5, 15, 60, 1, 9, 1000, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 256, 0, 8, 0], _ + [1228, 'Spirit_Siphon', 'Geist_abzapfen', 5, 6.5, 8, 34, 0, 5, 15, 50, 0, 0, 0, 0, 0, 0, 0, 1, 0.25, 0.75, 0, 0, 0, 0, 3, 0], _ + [1229, 'Explosive_Growth', 'Explosives_Wachstum', 5, 6.5, 8, 36, 0, 6, 20, 65, 5, 5, 240, 0, 0, 0, 0, 1, 2, 0.75, 0, 0, 0, 0, 45, 0], _ + [1230, 'Boon_of_Creation', 'Segen_der_Schöpfung', 10, 13, 8, 36, 0, 6, 5, 50, 1, 6, 0, 0, 0, 0, 0, 1, 2, 0.75, 0, 0, 0, 0, 45, 0], _ + [1231, 'Spirit_Channeling', 'Geisterlenkung', 5, 6.5, 8, 36, 0, 6, 1, 6, 3, 12, 1000, 5, 0, 0, 0, 1, 1, 0.75, 4, 0, 256, 0, 30, 0], _ + [1232, 'Armor_of_Unfeeling', 'Rüstung_der_Gefühllosigkeit', 5, 6.5, 8, 32, 0, 10, 50, 50, 0, 0, 1000, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 20, 0], _ + [1233, 'Soothing_Memories', 'Beruhigende_Erinnerungen', 5, 6.5, 8, 33, 0, 5, 10, 100, 3, 3, 0, 0, 0, 0, 3, 1, 0.75, 0.75, 0, 4096, 6, 0, 4, 0], _ + [1234, 'Mend_Body_and_Soul', 'Körper_und_Seele_heilen', 5, 6.5, 8, 33, 0, 5, 20, 115, 0, 0, 1000, 0, 0, 0, 3, 1, 0.75, 0.75, 0, 4096, 4102, 0, 3, 0], _ + [1235, 'Dulled_Weapon', 'Stumpfe_Waffe', 15, 19.5, 8, 32, 0, 4, 1, 15, 0, 0, 156, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 20, 0], _ + [1236, 'Binding_Chains', 'Fesselnde_Ketten', 10, 13, 8, 32, 0, 4, 90, 90, 1, 30, 240, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 15, 0], _ + [1237, 'Painful_Bond', 'Schmerzhafte_Bindung', 15, 19.5, 8, 34, 0, 4, 8, 20, 0, 0, 240, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 12, 0], _ + [1238, 'Signet_of_Creation', 'Siegel_der_Schöpfung', 0, 0, 8, 36, 0, 7, 4, 4, 3, 12, 1000, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 20, 0], _ + [1239, 'Signet_of_Spirits', 'Siegel_der_Geister', 0, 0, 8, 34, 0, 7, 1, 12, 5, 20, 1000, 0, 0, 0, 0, 1, 1, 0.75, 4, 0, 0, 0, 30, 0], _ + [1240, 'Soul_Twisting', 'Seelenverflechtung', 5, 6.5, 8, 36, 0, 16, 15, 15, 1, 3, 10, 0, 0, 0, 0, 1, 0, 0.75, 4, 0, 0, 0, 15, 0], _ + [1244, 'Ghostly_Haste', 'Geisterhafte_Eile', 10, 13, 8, 36, 0, 6, 25, 25, 0, 0, 1000, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 20, 0], _ + [1245, 'Gaze_from_Beyond', 'Blick_aus_dem_Jenseits', 5, 6.5, 8, 34, 0, 5, 20, 65, 2, 6, 1000, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 10, 0], _ + [1246, 'Ancestors_Rage', 'Wut_der_Vorfahren', 5, 6.5, 8, 34, 0, 10, 5, 110, 0, 0, 156, 0, 0, 0, 3, 1, 0.25, 0.75, 0, 0, 0, 0, 10, 0], _ + [1247, 'Pain', 'Schmerzen', 5, 6.5, 8, 32, 0, 22, 1, 12, 5, 30, 0, 0, 0, 0, 0, 1, 0.75, 0.75, 256, 0, 0, 0, 30, 0], _ + [1249, 'Displacement', 'Verschiebung', 15, 19.5, 8, 32, 0, 22, 1, 14, 60, 60, 75, 0, 0, 0, 0, 1, 0.75, 0.75, 256, 0, 128, 0, 45, 0], _ + [1250, 'Preservation', 'Erhaltung', 5, 6.5, 8, 33, 0, 22, 1, 14, 10, 115, 312, 0, 0, 0, 0, 1, 0.75, 0.75, 260, 0, 0, 0, 20, 0], _ + [1251, 'Life', 'Leben', 10, 13, 8, 33, 0, 22, 1, 14, 1, 7, 2500, 0, 0, 0, 0, 1, 0.75, 0.75, 256, 0, 0, 0, 20, 0], _ + [1252, 'Earthbind', 'Erdbindung', 15, 19.5, 8, 32, 0, 22, 1, 14, 50, 25, 2500, 3, 0, 0, 0, 1, 1, 0.75, 256, 0, 0, 0, 30, 0], _ + [1253, 'Bloodsong', 'Blutgesang', 5, 6.5, 8, 34, 0, 22, 1, 12, 5, 25, 0, 0, 0, 0, 0, 1, 0.75, 0.75, 256, 0, 0, 0, 30, 0], _ + [1255, 'Wanderlust', 'Fernweh', 10, 13, 8, 32, 0, 22, 1, 12, 70, 50, 0, 0, 0, 0, 0, 1, 1, 0.75, 260, 0, 0, 0, 45, 0], _ + [1257, 'Spirit_Light_Weapon', 'Geisterlichtwaffe', 5, 6.5, 8, 33, 0, 25, 1, 15, 1, 15, 1000, 0, 0, 0, 3, 1, 1, 0.75, 4, 0, 6, 0, 5, 0], _ + [1258, 'Brutal_Weapon', 'Grausame_Waffe', 10, 13, 8, 32, 0, 25, 5, 15, 0, 0, 0, 0, 0, 0, 3, 1, 1, 0.75, 0, 0, 0, 0, 15, 0], _ + [1259, 'Guided_Weapon', 'Gelenkte_Waffe', 15, 19.5, 8, 32, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 2, 0.75, 0, 0, 0, 0, 5, 0], _ + [1260, 'Meekness', 'Sanftmut', 15, 19.5, 4, 7, 0, 4, 17, 17, 50, 50, 312, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 32, 0, 15, 0], _ + [1261, 'Frigid_Armor', 'Kalte_Rüstung', 5, 6.5, 6, 11, 0, 6, 10, 40, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 20, 0], _ + [1262, 'Healing_Ring', 'Heilring', 5, 6.5, 3, 13, 0, 5, 30, 180, 0, 0, 156, 0, 0, 0, 0, 1, 1, 0.75, 0, 4096, 0, 0, 10, 0], _ + [1263, 'Renew_Life', 'Leben_verlängern', 15, 19.5, 3, 13, 0, 5, 5, 20, 55, 130, 50, 1000, 0, 0, 6, 1, 4, 0.75, 2050, 0, 8, 0, 5, 0], _ + [1264, 'Doom', 'Untergang', 10, 13, 8, 36, 0, 5, 10, 40, 135, 135, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 8, 0], _ + [1265, 'Wielders_Boon', 'Segen_des_Ausübers', 5, 6.5, 8, 33, 0, 5, 15, 60, 15, 75, 0, 0, 0, 0, 3, 1, 0.25, 0.75, 0, 4096, 6, 0, 4, 0], _ + [1266, 'Soothing', 'Beruhigung', 15, 19.5, 8, 32, 0, 22, 1, 12, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0.75, 256, 0, 0, 0, 45, 0], _ + [1267, 'Vital_Weapon', 'Wesentliche_Waffe', 5, 6.5, 8, 32, 0, 25, 40, 175, 0, 0, 0, 0, 0, 0, 3, 1, 1, 0.75, 0, 0, 0, 0, 2, 0], _ + [1268, 'Weapon_of_Quickening', 'Waffe_der_Beschleunigung', 10, 13, 8, 32, 0, 25, 33, 33, 0, 0, 0, 0, 0, 0, 3, 1, 2, 0.75, 4, 0, 0, 0, 5, 0], _ + [1269, 'Signet_of_Rage', 'Siegel_der_Wut', 0, 0, 3, 14, 0, 7, 5, 50, 5, 10, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 20, 0], _ + [1333, 'Extend_Conditions', 'Zustände_ausweiten', 5, 6.5, 5, 3, 0, 5, 5, 100, 30, 30, 240, 0, 0, 0, 5, 1, 0.25, 0.75, 4, 0, 0, 0, 5, 0], _ + [1334, 'Hypochondria', 'Hypochondrie', 5, 6.5, 5, 46, 0, 5, 0, 0, 0, 0, 312, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 7, 0], _ + [1335, 'Wastrels_Demise', 'Ableben_des_Verschwenders', 5, 6.5, 5, 2, 0, 4, 1, 10, 1, 3, 156, 0, 0, 0, 5, 1, 0.25, 0.75, 0, 0, 0, 0, 3, 0], _ + [1336, 'Spiritual_Pain', 'Geisterschmerz', 5, 6.5, 5, 2, 0, 5, 15, 75, 25, 125, 312, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 7, 0], _ + [1337, 'Drain_Delusions', 'Täuschungen_entziehen', 5, 6.5, 5, 3, 0, 5, 1, 5, 4, 4, 0, 0, 0, 0, 5, 1, 0.25, 0.75, 0, 0, 256, 0, 12, 0], _ + [1338, 'Persistence_of_Memory', 'Beharrliche_Erinnerungen', 10, 13, 5, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 20, 0], _ + [1339, 'Symbols_of_Inspiration', 'Symbole_der_Inspiration', 5, 6.5, 5, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 4, 0, 0, 0, 15, 0], _ + [1340, 'Symbolic_Celerity', 'Symbolische_Schnelligkeit', 15, 19.5, 5, 0, 0, 6, 25, 50, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 30, 0], _ + [1341, 'Frustration', 'Frustration', 10, 13, 5, 1, 0, 4, 50, 50, 5, 50, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 7, 0], _ + [1342, 'Tease', 'Reizen', 5, 6.5, 5, 3, 0, 5, 0, 5, 0, 0, 312, 0, 0, 0, 5, 1, 0.25, 0.75, 4, 0, 0, 0, 15, 0], _ + [1343, 'Ether_Phantom', 'Äther_Phantom', 5, 6.5, 5, 3, 0, 4, 1, 5, 1, 1, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 10, 0], _ + [1344, 'Web_of_Disruption', 'Netz_der_Störung', 5, 6.5, 5, 46, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 0.25, 0.75, 0, 0, 1, 0, 15, 0], _ + [1345, 'Enchanters_Conundrum', 'Rätsel_des_Verzauberers', 10, 13, 5, 2, 0, 4, 10, 100, 100, 200, 156, 0, 0, 0, 5, 1, 2, 0.75, 4, 0, 0, 0, 10, 0], _ + [1346, 'Signet_of_Illusions', 'Siegel_der_Illusionen', 0, 0, 5, 1, 0, 7, 1, 3, 1, 3, 0, 0, 0, 0, 0, 1, 2, 0.75, 4, 0, 0, 0, 5, 0], _ + [1347, 'Discharge_Enchantment', 'Verzauberung_entlassen', 10, 13, 5, 3, 0, 5, 20, 50, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 15, 0], _ + [1348, 'Hex_Eater_Vortex', 'Verhexungsfresser_Strudel', 10, 13, 5, 2, 0, 5, 30, 90, 0, 0, 240, 0, 0, 0, 3, 1, 1, 0.75, 4, 0, 2048, 0, 15, 0], _ + [1349, 'Mirror_of_Disenchantment', 'Spiegel_der_Entzauberung', 5, 6.5, 5, 46, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 15, 0], _ + [1350, 'Simple_Thievery', 'Simpler_Diebstahl', 10, 13, 5, 2, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 0.25, 0.75, 4, 0, 0, 0, 10, 0], _ + [1351, 'Animate_Shambling_Horror', 'Schlurfschreck_beleben', 15, 19.5, 4, 5, 0, 5, 1, 17, 0, 15, 0, 0, 0, 0, 0, 1, 3, 0.75, 262144, 0, 0, 0, 25, 0], _ + [1352, 'Order_of_Undeath', 'Orden_der_Untoten', 10, 13, 4, 5, 0, 5, 3, 16, 2, 2, 5000, 2, 0, 0, 0, 1, 1, 0.75, 4, 0, 32, 0, 5, 0], _ + [1353, 'Putrid_Flesh', 'Verwesendes_Fleisch', 10, 13, 4, 5, 0, 5, 0, 0, 0, 0, 240, 0, 0, 0, 1, 1, 0.25, 0.75, 0, 0, 0, 0, 0, 0], _ + [1354, 'Feast_for_the_Dead', 'Fest_für_die_Toten', 5, 6.5, 4, 5, 0, 5, 10, 100, 0, 0, 5000, 0, 0, 0, 1, 1, 0.25, 0.75, 0, 0, 0, 0, 10, 0], _ + [1355, 'Jagged_Bones', 'Versplitterte_Knochen', 5, 6.5, 4, 5, 0, 6, 0, 15, 0, 0, 0, 0, 0, 0, 14, 1, 1, 0.75, 4, 0, 0, 0, 15, 0], _ + [1356, 'Contagion', 'Erkrankung', 5, 6.5, 4, 5, 0, 6, 10, 5, 0, 0, 312, 0, 0, 0, 0, 1, 1, 0.75, 4, 0, 0, 0, 20, 0], _ + [1358, 'Ulcerous_Lungs', 'Geschwürige_Lungen', 15, 19.5, 4, 7, 0, 4, 4, 4, 3, 15, 240, 0, 0, 0, 5, 1, 2, 0.75, 512, 1, 0, 0, 10, 0], _ + [1359, 'Pain_of_Disenchantment', 'Schmerz_der_Entzauberung', 10, 13, 4, 7, 0, 5, 1, 3, 10, 100, 156, 0, 0, 0, 5, 1, 1, 0.75, 4, 0, 0, 0, 15, 0], _ + [1360, 'Mark_of_Fury', 'Zeichen_der_Wut', 5, 6.5, 4, 4, 0, 4, 0, 2, 1, 15, 0, 0, 0, 0, 5, 1, 0.75, 0.75, 0, 0, 0, 0, 10, 0], _ + [1362, 'Corrupt_Enchantment', 'Verzauberung_verderben', 5, 6.5, 4, 7, 0, 4, 1, 8, 0, 0, 0, 0, 0, 0, 5, 1, 0.75, 0.75, 516, 0, 0, 0, 10, 0], _ + [1363, 'Signet_of_Sorrow', 'Siegel_des_Kummers', 0, 0, 4, 6, 0, 7, 15, 75, 0, 0, 240, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 30, 0], _ + [1364, 'Signet_of_Suffering', 'Siegel_des_Leidens', 0, 0, 4, 4, 0, 7, 2, 16, 6, 6, 0, 0, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 4, 0], _ + [1365, 'Signet_of_Lost_Souls', 'Siegel_der_verlorenen_Seelen', 0, 0, 4, 6, 0, 7, 10, 100, 1, 10, 0, 0, 0, 0, 5, 1, 0.25, 0.75, 0, 0, 0, 0, 8, 0], _ + [1366, 'Well_of_Darkness', 'Brunnen_der_Dunkelheit', 10, 13, 4, 7, 0, 9, 50, 50, 30, 30, 312, 0, 0, 0, 0, 1, 1, 0.75, 262144, 0, 0, 0, 20, 0], _ + [1367, 'Blinding_Surge', 'Blendende_Welle', 10, 13, 6, 8, 0, 5, 5, 50, 3, 8, 156, 0, 0, 0, 5, 1, 0.75, 0.75, 4, 0, 0, 0, 6, 0], _ + [1368, 'Chilling_Winds', 'Kühle_Winde', 5, 6.5, 6, 8, 0, 4, 30, 60, 25, 100, 156, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 8, 0], _ + [1369, 'Lightning_Bolt', 'Blitzstrahl', 5, 6.5, 6, 8, 0, 5, 5, 50, 5, 50, 2400, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 8, 0], _ + [1370, 'Storm_Djinns_Haste', 'Eile_des_Sturm_Dschinn', 5, 6.5, 6, 8, 0, 6, 25, 25, 1, 1, 0, 0, 0, 0, 0, 1, 0.25, 0.75, 0, 0, 32768, 0, 10, 0], _ + [1371, 'Stone_Striker', 'Steinschläger', 5, 6.5, 6, 9, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0.25, 0.75, 0, 0, 0, 0, 20, 0], _ + [1372, 'Sandstorm', 'Sandsturm', 15, 19.5, 6, 9, 0, 5, 10, 30, 10, 30, 240, 0, 0, 0, 16, 1, 2, 0.75, 4, 0, 0, 0, 25, 0], _ + [1373, 'Stone_Sheath', 'Steinmantel', 5, 6.5, 6, 9, 0, 6, 15, 70, 1, 30, 240, 24, 0, 0, 1, 1, 1, 0.75, 4, 0, 0, 0, 15, 0], _ + [1374, 'Ebon_Hawk', 'Ebonfalke', 10, 13, 6, 9, 0, 5, 10, 85, 5, 15, 1800, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 5, 0], _ + [1375, 'Stoneflesh_Aura', 'Steinfleisch_Aura', 10, 13, 6, 9, 0, 6, 1, 31, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0.75, 0, 0, 0, 0, 15, 0], _ + [1376, 'Glyph_of_Restoration', 'Glyphe_der_Wiederherstellung', 5, 6.5, 6, 12, 0, 12, 30, 105, 150, 400, 2, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 4, 0, 8, 0], _ + [1377, 'Ether_Prism', 'Ätherprisma', 5, 6.5, 6, 12, 0, 16, 75, 75, 5, 20, 0, 0, 0, 0, 0, 1, 0, 0.75, 4, 0, 256, 0, 25, 0], _ + [1378, 'Master_of_Magic', 'Meister_der_Magie', 5, 6.5, 6, 12, 0, 6, 8, 14, 0, 0, 30, 0, 0, 0, 0, 1, 1, 0.75, 4, 0, 256, 0, 10, 0], _ + [1379, 'Glowing_Gaze', 'Glühender_Blick', 5, 6.5, 6, 10, 0, 5, 5, 50, 5, 5, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 256, 0, 8, 0], _ + [1380, 'Savannah_Heat', 'Hitze_der_Savanne', 5, 6.5, 6, 10, 0, 5, 5, 20, 5, 20, 240, 0, 0, 0, 16, 1, 2, 0.75, 4, 0, 0, 0, 25, 0], _ + [1381, 'Flame_Djinns_Haste', 'Eile_des_Flammen_Dschinn', 10, 13, 6, 10, 0, 6, 15, 120, 25, 25, 156, 50, 0, 0, 0, 1, 0.75, 0.75, 0, 0, 512, 0, 20, 0], _ + [1382, 'Freezing_Gust', 'Gefrierende_Böe', 10, 13, 6, 11, 0, 4, 20, 80, 66, 66, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 2048, 0, 0, 8, 0], _ + [1390, 'Judges_Intervention', 'Intervention_des_Richters', 5, 6.5, 3, 14, 0, 6, 30, 180, 1, 3, 240, 0, 0, 0, 3, 1, 0.25, 0.75, 0, 0, 0, 0, 8, 0], _ + [1391, 'Supportive_Spirit', 'Unterstützender_Geist', 10, 13, 3, 13, 0, 6, 5, 35, 0, 0, 0, 0, 0, 0, 3, 1, 0.75, 0.75, 0, 0, 0, 0, 8, 0], _ + [1392, 'Watchful_Healing', 'Wachsame_Heilung', 5, 6.5, 3, 16, 0, 6, 1, 4, 30, 120, 0, 0, 0, 0, 3, 1, 1, 0.75, 0, 0, 6, 0, 10, 0], _ + [1393, 'Healers_Boon', 'Segen_des_Heilers', 5, 6.5, 3, 16, 0, 6, 50, 50, 9999, 9999, 0, 0, 0, 0, 0, 1, 0.25, 0.75, 4, 0, 0, 0, 10, 0], _ + [1394, 'Healers_Covenant', 'Verpflichtung_des_Heilers', 5, 6.5, 3, 13, 0, 6, 25, 25, 1, 3, 0, 0, 0, 0, 0, 1, 0.25, 0.75, 4, 0, 0, 0, 5, 0], _ + [1395, 'Balthazars_Pendulum', 'Balthasars_Pendel', 5, 6.5, 3, 14, 0, 6, 5, 75, 0, 0, 0, 0, 0, 0, 3, 1, 0.25, 0.75, 4, 0, 0, 0, 5, 0], _ + [1396, 'Words_of_Comfort', 'Tröstende_Worte', 5, 6.5, 3, 13, 0, 5, 15, 60, 15, 45, 0, 0, 0, 0, 3, 1, 1, 0.75, 0, 4096, 0, 0, 4, 0], _ + [1397, 'Light_of_Deliverance', 'Licht_der_Erlösung', 5, 6.5, 3, 13, 0, 5, 101, 101, 5, 70, 5000, 0, 0, 0, 0, 1, 1, 0.75, 4, 4096, 6, 0, 6, 0], _ + [1398, 'Scourge_Enchantment', 'Geißelverzauberung', 10, 13, 3, 14, 0, 4, 15, 75, 0, 0, 0, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 0, 0, 5, 0], _ + [1399, 'Shield_of_Absorption', 'Schild_der_Absorption', 5, 6.5, 3, 15, 0, 6, 5, 5, 0, 0, 0, 0, 0, 0, 3, 1, 1, 0.75, 0, 0, 0, 0, 10, 0], _ + [1400, 'Reversal_of_Damage', 'Umkehrung_des_Schadens', 5, 6.5, 3, 14, 0, 6, 5, 75, 0, 0, 0, 0, 0, 0, 3, 1, 0.25, 0.75, 0, 0, 0, 0, 3, 0], _ + [1401, 'Mending_Touch', 'Genesungsberührung', 5, 6.5, 3, 15, 0, 5, 15, 60, 0, 0, 0, 0, 0, 0, 3, 1, 0.75, 0.75, 2, 4096, 4096, 0, 6, 0], _ + [1402, 'Critical_Chop', 'Kritischer_Hieb', 5, 6.5, 1, 18, 0, 14, 5, 20, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0, 0, 0, 0, 1, 15, 0], _ + [1403, 'Agonizing_Chop', 'Qualvoller_Hieb', 0, 0, 1, 18, 0, 14, 5, 20, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0, 0, 0, 0, 1, 0, 150], _ + [1404, 'Flail', 'Dreschen', 0, 0, 1, 17, 0, 3, 33, 33, 33, 33, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 32768, 0, 0, 100], _ + [1405, 'Charging_Strike', 'Angreifender_Schlag', 5, 6.5, 1, 17, 0, 3, 33, 33, 10, 40, 0, 0, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 5, 0], _ + [1406, 'Headbutt', 'Kopfstoß', 15, 19.5, 1, 17, 0, 10, 40, 100, 5, 20, 0, 0, 0, 0, 5, 1, 0.75, 0.75, 6, 0, 0, 0, 20, 0], _ + [1407, 'Lions_Comfort', 'Trost_des_Löwen', 0, 0, 1, 17, 0, 10, 50, 110, 0, 3, 12, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 4, 0, 1, 80], _ + [1408, 'Rage_of_the_Ntouka', 'Wut_des_Ntouka', 5, 6.5, 1, 17, 0, 16, 1, 7, 5, 5, 0, 0, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 15, 0], _ + [1409, 'Mokele_Smash', 'Mokele_Schlag', 5, 6.5, 1, 19, 0, 14, 5, 20, 2, 2, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 16, 12, 0], _ + [1410, 'Overbearing_Smash', 'Anmaßender_Schlag', 5, 6.5, 1, 19, 0, 14, 1, 20, 1, 8, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 16, 20, 0], _ + [1411, 'Signet_of_Stamina', 'Siegel_der_Ausdauer', 0, 0, 1, 17, 0, 7, 50, 300, 0, 0, 0, 0, 0, 0, 0, 1, 0.25, 0.75, 0, 0, 0, 0, 20, 0], _ + [1412, 'Youre_All_Alone', 'Ihr_seid_ganz_allein', 5, 6.5, 1, 46, 0, 15, 8, 8, 8, 8, 0, 240, 0, 0, 5, 1, 0, 0, 4, 0, 0, 0, 10, 0], _ + [1413, 'Burst_of_Aggression', 'Aggressiver_Ausbruch', 5, 6.5, 1, 17, 0, 3, 33, 33, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 32768, 0, 12, 0], _ + [1414, 'Enraging_Charge', 'Wütender_Angriff', 5, 6.5, 1, 17, 0, 3, 25, 25, 0, 3, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 20, 0], _ + [1415, 'Crippling_Slash', 'Verkrüppelnder_Hieb', 0, 0, 1, 20, 0, 14, 5, 15, 10, 25, 0, 0, 0, 0, 5, 1, 0, 0, 4, 0, 0, 128, 0, 130], _ + [1416, 'Barbarous_Slice', 'Barbarischer_Schnitt', 0, 0, 1, 20, 0, 14, 5, 30, 5, 15, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 128, 0, 150], _ + [1465, 'Prepared_Shot', 'Vorbereiteter_Schuss', 5, 6.5, 2, 25, 0, 14, 10, 25, 1, 9, 0, 0, 0, 0, 5, 1, 0, 0, 4, 0, 0, 2, 6, 0], _ + [1466, 'Burning_Arrow', 'Brennender_Pfeil', 10, 13, 2, 25, 0, 14, 10, 30, 1, 7, 0, 0, 0, 0, 5, 1, 0, 0, 4, 0, 0, 2, 5, 0], _ + [1467, 'Arcing_Shot', 'Bogenschuss', 5, 6.5, 2, 25, 0, 14, 10, 25, 50, 50, 1600, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 2, 6, 0], _ + [1468, 'Strike_as_One', 'Gemeinsam_zuschlagen', 5, 6.5, 2, 22, 0, 15, 5, 15, 5, 15, 0, 0, 0, 0, 1, 1, 0, 0, 4, 0, 0, 0, 10, 0], _ + [1469, 'Crossfire', 'Kreuzfeuer', 5, 6.5, 2, 25, 0, 14, 5, 20, 0, 0, 240, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 2, 4, 0], _ + [1470, 'Barbed_Arrows', 'Stachelpfeile', 10, 13, 2, 24, 0, 19, 3, 15, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0.75, 384, 0, 0, 0, 12, 0], _ + [1471, 'Scavengers_Focus', 'Fokus_des_Plünderers', 5, 6.5, 2, 24, 0, 10, 3, 12, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 20, 0], _ + [1472, 'Toxicity', 'Giftigkeit', 15, 19.5, 2, 22, 0, 22, 1, 10, 2, 2, 2500, 0, 0, 0, 0, 1, 5, 0.75, 0, 0, 0, 0, 60, 0], _ + [1473, 'Quicksand', 'Treibsand', 10, 13, 2, 24, 0, 22, 1, 10, 1, 1, 2500, 0, 0, 0, 0, 1, 5, 0.75, 4, 0, 0, 0, 30, 0], _ + [1474, 'Storms_Embrace', 'Umarmung_des_Sturms', 5, 6.5, 2, 46, 0, 3, 25, 25, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0.75, 0, 0, 0, 0, 30, 0], _ + [1475, 'Trappers_Speed', 'Geschwindigkeit_des_Fallenstellers', 5, 6.5, 2, 23, 0, 3, 25, 25, 25, 25, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 20, 0], _ + [1476, 'Tripwire', 'Stolperdraht', 10, 13, 2, 24, 0, 21, 5, 20, 0, 0, 156, 240, 0, 0, 0, 1, 2, 0.75, 288, 0, 0, 0, 30, 0], _ + [1478, 'Renewing_Surge', 'Erneuernde_Welle', 5, 6.5, 8, 34, 0, 4, 2, 12, 1, 8, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 15, 0], _ + [1479, 'Offering_of_Spirit', 'Opfer_des_Geistes', 5, 6.5, 8, 34, 0, 5, 17, 17, 8, 17, 1000, 0, 0, 0, 0, 1, 0.25, 0.75, 4, 0, 256, 0, 15, 0], _ + [1480, 'Spirits_Gift', 'Geschenk_des_Geistes', 10, 13, 8, 36, 0, 6, 5, 50, 0, 0, 240, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 45, 0], _ + [1481, 'Death_Pact_Signet', 'Todespakt_Siegel', 0, 0, 8, 33, 0, 7, 0, 0, 15, 100, 0, 0, 0, 0, 6, 1, 3, 0.75, 2048, 0, 8, 0, 12, 0], _ + [1482, 'Reclaim_Essence', 'Essenz_zurückfordern', 5, 6.5, 8, 36, 0, 5, 5, 20, 0, 0, 5000, 0, 0, 0, 0, 1, 1, 0.75, 4, 0, 0, 0, 30, 0], _ + [1483, 'Banishing_Strike', 'Bannstoß', 5, 6.5, 10, 44, 0, 14, 0, 0, 10, 60, 240, 0, 0, 0, 5, 1, 1, 0, 0, 0, 0, 185, 3, 0], _ + [1484, 'Mystic_Sweep', 'Mystischer_Schwung', 5, 6.5, 10, 44, 0, 14, 3, 12, 3, 12, 0, 0, 0, 0, 5, 1, 1, 0, 0, 0, 0, 185, 6, 0], _ + [1485, 'Eremites_Attack', 'Angriff_des_Eremiten', 5, 6.5, 10, 41, 0, 14, 1, 10, 1, 10, 156, 0, 0, 0, 5, 1, 0, 0, 0, 0, 8192, 32, 6, 0], _ + [1486, 'Reap_Impurities', 'Unreinheiten_ausnutzen', 0, 0, 10, 41, 0, 14, 3, 15, 10, 40, 156, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 185, 0, 120], _ + [1487, 'Twin_Moon_Sweep', 'Doppelter_Mondschwung', 0, 0, 10, 41, 0, 14, 10, 50, 10, 70, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 8192, 185, 0, 160], _ + [1488, 'Victorious_Sweep', 'Siegreicher_Schwung', 5, 6.5, 10, 41, 0, 14, 5, 25, 30, 80, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 185, 4, 0], _ + [1489, 'Irresistible_Sweep', 'Unwiderstehlicher_Schwung', 5, 6.5, 10, 41, 0, 14, 3, 15, 3, 15, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 8192, 32, 6, 0], _ + [1490, 'Pious_Assault', 'Frommer_Angriff', 5, 6.5, 10, 41, 0, 14, 10, 20, 10, 30, 156, 75, 0, 0, 5, 1, 0, 0, 0, 0, 8192, 185, 12, 0], _ + [1491, 'Mystic_Twister', 'Mystischer_Wirbelsturm', 0, 0, 10, 42, 0, 5, 10, 60, 10, 60, 240, 240, 0, 0, 0, 1, 1, 0.75, 0, 0, 512, 0, 8, 120], _ + [1493, 'Grenths_Fingers', 'Grenths_Finger', 5, 6.5, 10, 42, 0, 6, 10, 40, 1, 2, 240, 0, 0, 0, 0, 1, 0, 0, 8388608, 0, 512, 0, 10, 0], _ + [1495, 'Aura_of_Thorns', 'Dornenaura', 5, 6.5, 10, 43, 0, 6, 3, 8, 5, 15, 240, 0, 0, 0, 0, 1, 0, 0, 8388608, 9, 512, 0, 10, 0], _ + [1496, 'Balthazars_Rage', 'Balthasars_Wut', 10, 13, 10, 44, 0, 6, 1, 2, 1, 3, 240, 1000, 0, 0, 0, 1, 0, 0, 8388608, 0, 512, 0, 10, 0], _ + [1497, 'Dust_Cloak', 'Staubdecke', 10, 13, 10, 43, 0, 6, 10, 40, 1, 4, 240, 0, 0, 0, 0, 1, 0, 0, 8388608, 2, 512, 0, 6, 0], _ + [1498, 'Staggering_Force', 'Umwerfende_Gewalt', 10, 13, 10, 43, 0, 6, 10, 40, 1, 10, 240, 0, 0, 0, 0, 1, 0, 0, 8388608, 1024, 512, 0, 6, 0], _ + [1499, 'Pious_Renewal', 'Fromme_Erneuerung', 5, 6.5, 10, 44, 0, 6, 0, 5, 0, 30, 0, 0, 0, 0, 0, 1, 0, 0, 8388612, 0, 0, 0, 8, 0], _ + [1500, 'Mirage_Cloak', 'Trugbild_Umhang', 10, 13, 10, 43, 0, 6, 40, 80, 10, 40, 240, 0, 0, 0, 0, 1, 0, 0, 8388608, 0, 128, 0, 10, 0], _ + [1502, 'Arcane_Zeal', 'Arkaner_Eifer', 10, 13, 10, 44, 0, 6, 1, 1, 1, 7, 0, 1, 0, 0, 0, 1, 1, 0.75, 4, 0, 0, 0, 5, 0], _ + [1503, 'Mystic_Vigor', 'Mystische_Vitalität', 5, 6.5, 10, 44, 0, 6, 3, 15, 25, 25, 0, 0, 0, 0, 0, 1, 0.25, 0.75, 0, 0, 0, 0, 15, 0], _ + [1504, 'Watchful_Intervention', 'Wachsame_Intervention', 10, 13, 10, 44, 0, 6, 25, 25, 50, 200, 0, 0, 0, 0, 3, 1, 1, 0.75, 0, 0, 0, 0, 15, 0], _ + [1505, 'Vow_of_Piety', 'Gelübde_der_Frömmigkeit', 15, 19.5, 10, 42, 0, 6, 1, 4, 24, 24, 0, 0, 0, 0, 0, 1, 0.25, 0.75, 0, 0, 0, 0, 45, 0], _ + [1506, 'Vital_Boon', 'Wesentliche_Wohltat', 5, 6.5, 10, 43, 0, 6, 75, 200, 40, 100, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 4, 0, 8, 0], _ + [1507, 'Heart_of_Holy_Flame', 'Herz_der_heiligen_Flamme', 10, 13, 10, 44, 0, 6, 5, 30, 2, 5, 240, 0, 0, 0, 0, 1, 0, 0, 8388608, 4, 512, 0, 10, 0], _ + [1508, 'Extend_Enchantments', 'Verzauberungen_ausweiten', 5, 6.5, 10, 44, 0, 16, 10, 150, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 10, 0], _ + [1509, 'Faithful_Intervention', 'Vertrauensvolle_Intervention', 5, 6.5, 10, 44, 0, 6, 30, 150, 50, 50, 0, 0, 0, 0, 0, 1, 2, 0.75, 0, 0, 0, 0, 20, 0], _ + [1510, 'Sand_Shards', 'Sandscherben', 10, 13, 10, 43, 0, 6, 10, 60, 1, 5, 156, 0, 0, 0, 0, 1, 0, 0, 8388608, 0, 0, 0, 10, 0], _ + [1512, 'Lyssas_Haste', 'Lyssas_Eile', 10, 13, 10, 42, 0, 6, 33, 33, 0, 0, 156, 0, 0, 0, 0, 1, 0, 0, 8388672, 0, 512, 0, 15, 0], _ + [1513, 'Guiding_Hands', 'Lenkende_Hände', 10, 13, 10, 42, 0, 6, 0, 3, 0, 0, 0, 0, 0, 0, 0, 1, 0.25, 0.75, 0, 0, 0, 0, 10, 0], _ + [1514, 'Fleeting_Stability', 'Flüchtige_Stabilität', 5, 6.5, 10, 43, 0, 6, 25, 25, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 8388608, 0, 0, 0, 10, 0], _ + [1515, 'Armor_of_Sanctity', 'Rüstung_der_Heiligkeit', 5, 6.5, 10, 43, 0, 6, 5, 20, 5, 15, 156, 0, 0, 0, 0, 1, 0.25, 0.75, 0, 1024, 512, 0, 15, 0], _ + [1516, 'Mystic_Regeneration', 'Mystische_Regeneration', 10, 13, 10, 43, 0, 6, 1, 4, 0, 0, 8, 0, 0, 0, 0, 1, 0.25, 0.75, 0, 0, 0, 0, 10, 0], _ + [1517, 'Vow_of_Silence', 'Schweigegelübde', 5, 6.5, 10, 44, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0.25, 0.75, 4, 0, 0, 0, 10, 0], _ + [1518, 'Avatar_of_Balthazar', 'Balthasars_Avatar', 5, 6.5, 10, 44, 0, 26, 1, 3, 25, 25, 240, 20, 0, 0, 0, 1, 2, 0.75, 4, 0, 0, 0, 20, 0], _ + [1519, 'Avatar_of_Dwayna', 'Dwaynas_Avatar', 5, 6.5, 10, 44, 0, 26, 0, 0, 5, 50, 1000, 0, 0, 0, 0, 1, 2, 0.75, 4, 0, 0, 0, 20, 0], _ + [1520, 'Avatar_of_Grenth', 'Grenths_Avatar', 5, 6.5, 10, 44, 0, 26, 0, 12, 3, 3, 156, 0, 0, 0, 0, 1, 2, 0.75, 4, 0, 0, 0, 20, 0], _ + [1521, 'Avatar_of_Lyssa', 'Lyssas_Avatar', 5, 6.5, 10, 44, 0, 26, 1, 1, 50, 50, 240, 0, 0, 0, 0, 1, 2, 0.75, 4, 0, 0, 0, 20, 0], _ + [1522, 'Avatar_of_Melandru', 'Melandrus_Avatar', 5, 6.5, 10, 44, 0, 26, 150, 150, 30, 30, 1000, 1, 0, 0, 0, 1, 2, 0.75, 4, 0, 0, 0, 20, 0], _ + [1523, 'Meditation', 'Meditation', 10, 13, 10, 44, 0, 6, 1, 4, 0, 0, 0, 0, 0, 0, 0, 1, 0.25, 0.75, 0, 0, 256, 0, 20, 0], _ + [1524, 'Eremites_Zeal', 'Eifer_des_Eremiten', 5, 6.5, 10, 44, 0, 6, 1, 3, 8, 8, 1000, 0, 0, 0, 0, 1, 0.25, 0.75, 0, 0, 256, 0, 15, 0], _ + [1525, 'Natural_Healing', 'Natürliche_Heilung', 5, 6.5, 10, 42, 0, 5, 50, 170, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0.75, 0, 0, 4, 0, 6, 0], _ + [1526, 'Imbue_Health', 'Mit_Leben_durchdringen', 10, 13, 10, 44, 0, 5, 5, 50, 300, 300, 0, 0, 0, 0, 4, 1, 0.25, 0.75, 0, 0, 0, 0, 10, 0], _ + [1527, 'Mystic_Healing', 'Mystische_Heilung', 5, 6.5, 10, 42, 0, 5, 5, 65, 5, 65, 5000, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 4, 0], _ + [1528, 'Dwaynas_Touch', 'Dwaynas_Berührung', 5, 6.5, 10, 42, 0, 5, 15, 60, 150, 150, 0, 0, 0, 0, 3, 1, 0.75, 0.75, 2, 0, 6, 0, 5, 0], _ + [1529, 'Pious_Restoration', 'Fromme_Wiederherstellung', 5, 6.5, 10, 42, 0, 5, 80, 150, 1, 2, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 8196, 0, 8, 0], _ + [1530, 'Signet_of_Pious_Light', 'Siegel_des_frommen_Lichts', 0, 0, 10, 43, 0, 7, 30, 150, 75, 75, 0, 0, 0, 0, 3, 1, 1, 0.75, 0, 0, 8198, 0, 20, 0], _ + [1531, 'Intimidating_Aura', 'Einschüchternde_Aura', 10, 13, 10, 44, 0, 6, 40, 100, 1, 10, 0, 0, 0, 0, 0, 1, 0.75, 0.75, 0, 0, 0, 0, 20, 0], _ + [1532, 'Mystic_Sandstorm', 'Mystischer_Sandsturm', 0, 0, 10, 43, 0, 5, 10, 20, 10, 20, 240, 5, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 8, 120], _ + [1533, 'Winds_of_Disenchantment', 'Wind_der_Entzauberung', 10, 13, 10, 42, 0, 5, 20, 80, 1, 1, 240, 0, 0, 0, 0, 1, 0.75, 0.75, 0, 0, 8192, 0, 15, 0], _ + [1534, 'Rending_Touch', 'Zerreißende_Berührung', 5, 6.5, 10, 44, 0, 5, 1, 1, 15, 65, 0, 0, 0, 0, 5, 1, 0.75, 0.75, 2, 0, 8192, 0, 12, 0], _ + [1535, 'Crippling_Sweep', 'Verkrüppelnder_Schwung', 5, 6.5, 10, 41, 0, 14, 3, 12, 3, 15, 0, 0, 0, 0, 5, 1, 0, 0, 0, 8, 0, 32, 6, 0], _ + [1536, 'Wounding_Strike', 'Verwundender_Schlag', 5, 6.5, 10, 41, 0, 14, 5, 20, 5, 20, 0, 0, 0, 0, 5, 1, 0, 0, 4, 17, 8192, 32, 3, 0], _ + [1537, 'Wearying_Strike', 'Ermüdender_Schlag', 0, 0, 10, 41, 0, 14, 0, 0, 3, 10, 10, 0, 0, 0, 5, 1, 0, 0, 0, 16, 8192, 32, 0, 150], _ + [1538, 'Lyssas_Assault', 'Lyssas_Angriff', 5, 6.5, 10, 41, 0, 14, 1, 10, 50, 50, 0, 0, 0, 0, 5, 1, 0.5, 0, 0, 0, 0, 32, 15, 0], _ + [1539, 'Chilling_Victory', 'Kühler_Sieg', 0, 0, 10, 41, 0, 14, 3, 15, 10, 30, 156, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 32, 0, 150], _ + [1540, 'Conviction', 'Überzeugung', 5, 6.5, 10, 43, 0, 6, 1, 3, 1, 2, 0, 10, 0, 0, 0, 1, 0, 0, 8388608, 0, 0, 0, 10, 0], _ + [1541, 'Enchanted_Haste', 'Verzauberte_Eile', 10, 13, 10, 46, 0, 6, 25, 25, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 8388608, 0, 0, 0, 15, 0], _ + [1542, 'Pious_Concentration', 'Fromme_Konzentration', 10, 13, 10, 43, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 8192, 0, 10, 0], _ + [1543, 'Pious_Haste', 'Fromme_Eile', 5, 6.5, 10, 44, 0, 3, 25, 25, 50, 50, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 8192, 0, 12, 0], _ + [1544, 'Whirling_Charge', 'Wirbelangriff', 10, 13, 10, 42, 0, 6, 33, 33, 10, 60, 240, 75, 0, 0, 0, 1, 0, 0, 8388608, 0, 0, 0, 6, 0], _ + [1545, 'Test_of_Faith', 'Glaubensprüfung', 0, 0, 10, 42, 0, 5, 15, 65, 1, 4, 0, 0, 0, 0, 5, 1, 0.75, 0.75, 2, 512, 0, 0, 5, 160], _ + [1546, 'Blazing_Spear', 'Lodernder_Speer', 0, 0, 9, 37, 0, 14, 5, 25, 1, 3, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 64, 0, 150], _ + [1547, 'Mighty_Throw', 'Mächtiger_Wurf', 0, 0, 9, 37, 0, 14, 10, 40, 0, 0, 4800, 0, 0, 0, 5, 1, 3, 0, 0, 0, 0, 64, 0, 50], _ + [1548, 'Cruel_Spear', 'Grausamer_Speer', 0, 0, 9, 37, 0, 14, 1, 31, 5, 20, 0, 0, 0, 0, 5, 1, 0, 0, 4, 16, 0, 64, 0, 175], _ + [1549, 'Harriers_Toss', 'Wurf_des_Läufers', 10, 13, 9, 37, 0, 14, 5, 20, 5, 30, 0, 0, 0, 0, 5, 1, 0.5, 1, 0, 0, 0, 64, 10, 0], _ + [1550, 'Unblockable_Throw', 'Unblockbarer_Wurf', 0, 0, 9, 37, 0, 14, 10, 40, 0, 0, 0, 0, 0, 0, 5, 1, 3, 0, 0, 0, 0, 64, 0, 175], _ + [1551, 'Spear_of_Lightning', 'Speer_des_Blitzes', 5, 6.5, 9, 37, 0, 14, 8, 20, 25, 25, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 64, 6, 0], _ + [1552, 'Wearying_Spear', 'Ermüdender_Speer', 0, 0, 9, 37, 0, 14, 10, 40, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 64, 0, 75], _ + [1553, 'Anthem_of_Fury', 'Hymne_der_Wut', 5, 6.5, 9, 40, 0, 27, 1, 4, 0, 0, 1000, 0, 0, 0, 0, 1, 1, 0.75, 4, 0, 0, 0, 10, 0], _ + [1554, 'Crippling_Anthem', 'Verkrüppelungs_Hymne', 0, 0, 9, 38, 0, 27, 0, 0, 5, 15, 1000, 0, 0, 0, 0, 1, 1, 0.75, 4, 8, 0, 0, 0, 100], _ + [1555, 'Defensive_Anthem', 'Verteidigungshymne', 10, 13, 9, 40, 0, 27, 50, 50, 0, 0, 1000, 0, 0, 0, 0, 1, 1, 0.75, 4, 0, 128, 0, 25, 0], _ + [1556, 'Godspeed', 'Gute_Reise', 10, 13, 9, 38, 0, 15, 25, 25, 0, 0, 1000, 0, 0, 0, 0, 1, 0, 0.75, 0, 4, 32768, 0, 30, 0], _ + [1557, 'Anthem_of_Flame', 'Hymne_der_Flamme', 5, 6.5, 9, 40, 0, 27, 1, 3, 0, 0, 1000, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 10, 0], _ + [1558, 'Go_for_the_Eyes', 'Zielt_auf_die_Augen', 0, 0, 9, 38, 0, 15, 30, 100, 0, 0, 1000, 0, 0, 0, 0, 1, 0, 0.75, 0, 0, 0, 0, 0, 100], _ + [1559, 'Anthem_of_Envy', 'Hymne_des_Neids', 0, 0, 9, 38, 0, 27, 10, 25, 0, 0, 1000, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 0, 150], _ + [1560, 'Song_of_Power', 'Machtgesang', 25, 32.5, 9, 39, 0, 27, 4, 4, 0, 0, 1000, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 30, 0], _ + [1561, 'Zealous_Anthem', 'Eifrige_Hymne', 10, 13, 9, 39, 0, 27, 1, 8, 0, 0, 1000, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 20, 0], _ + [1562, 'Aria_of_Zeal', 'Arie_des_Eifers', 10, 13, 9, 39, 0, 27, 1, 6, 0, 0, 1000, 0, 0, 0, 0, 1, 2, 0.75, 0, 0, 0, 0, 20, 0], _ + [1563, 'Lyric_of_Zeal', 'Lyrik_des_Eifers', 0, 0, 9, 39, 0, 27, 1, 8, 0, 0, 1000, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 5, 150], _ + [1564, 'Ballad_of_Restoration', 'Ballade_der_Wiederherstellung', 10, 13, 9, 39, 0, 27, 15, 75, 0, 0, 1000, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 6, 0, 20, 0], _ + [1565, 'Chorus_of_Restoration', 'Chor_der_Wiederherstellung', 0, 0, 9, 39, 0, 27, 30, 90, 0, 0, 1000, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 6, 0, 5, 100], _ + [1566, 'Aria_of_Restoration', 'Arie_der_Wiederherstellung', 10, 13, 9, 39, 0, 27, 30, 90, 0, 0, 1000, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 6, 0, 20, 0], _ + [1567, 'Song_of_Concentration', 'Lied_der_Konzentration', 0, 0, 9, 46, 0, 27, 0, 0, 0, 0, 1000, 0, 0, 0, 0, 1, 2, 0.75, 0, 0, 0, 0, 5, 200], _ + [1568, 'Anthem_of_Guidance', 'Hymne_der_Führung', 0, 0, 9, 38, 0, 27, 0, 0, 0, 0, 1000, 0, 0, 0, 0, 1, 1, 0.75, 4, 0, 0, 0, 0, 100], _ + [1569, 'Energizing_Chorus', 'Energie_bringender_Chor', 0, 0, 9, 39, 0, 27, 3, 7, 0, 0, 1000, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 0, 100], _ + [1570, 'Song_of_Purification', 'Lied_der_Läuterung', 0, 0, 9, 39, 0, 27, 1, 3, 0, 0, 1000, 0, 0, 0, 0, 1, 2, 0.75, 4, 0, 4096, 0, 0, 125], _ + [1571, 'Hexbreaker_Aria', 'Verhexungsbrech_Arie', 0, 0, 9, 46, 0, 27, 50, 100, 0, 0, 1000, 0, 0, 0, 0, 1, 2, 0.75, 0, 0, 0, 0, 0, 200], _ + [1572, 'Brace_Yourself', 'Seid_vorbereitet', 5, 6.5, 9, 38, 0, 15, 15, 75, 0, 0, 240, 0, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 4, 0], _ + [1573, 'Awe', 'Ehrfurcht', 10, 13, 9, 40, 0, 10, 5, 15, 0, 0, 0, 0, 0, 0, 5, 1, 0.75, 0.75, 8, 512, 0, 0, 10, 0], _ + [1574, 'Enduring_Harmony', 'Dauerhafte_Harmonie', 5, 6.5, 9, 40, 0, 28, 50, 50, 0, 0, 0, 0, 0, 0, 3, 1, 1, 0.75, 0, 0, 0, 0, 10, 0], _ + [1575, 'Blazing_Finale', 'Loderndes_Finale', 5, 6.5, 9, 40, 0, 28, 1, 7, 0, 0, 156, 0, 0, 0, 3, 1, 1, 0.75, 0, 4, 0, 0, 8, 0], _ + [1576, 'Burning_Refrain', 'Brennender_Refrain', 10, 13, 9, 40, 0, 28, 1, 3, 0, 0, 0, 0, 0, 0, 3, 1, 1, 0.75, 0, 4, 0, 0, 10, 0], _ + [1577, 'Finale_of_Restoration', 'Finale_der_Wiederherstellung', 5, 6.5, 9, 39, 0, 28, 15, 75, 0, 0, 0, 0, 0, 0, 3, 1, 1, 0.75, 0, 0, 6, 0, 10, 0], _ + [1578, 'Mending_Refrain', 'Genesungsrefrain', 10, 13, 9, 39, 0, 28, 2, 3, 0, 0, 0, 0, 0, 0, 3, 1, 1, 0.75, 0, 0, 6, 0, 8, 0], _ + [1579, 'Purifying_Finale', 'Reinigendes_Finale', 5, 6.5, 9, 39, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 1, 0.75, 0, 0, 4096, 0, 10, 0], _ + [1580, 'Bladeturn_Refrain', 'Klingenumkehr_Refrain', 5, 6.5, 9, 38, 0, 28, 5, 20, 0, 0, 0, 0, 0, 0, 3, 1, 1, 0.75, 0, 0, 0, 0, 8, 0], _ + [1581, 'Glowing_Signet', 'Glühendes_Siegel', 0, 0, 9, 40, 0, 7, 5, 15, 0, 0, 0, 0, 0, 0, 5, 1, 0.25, 0.75, 0, 0, 256, 0, 20, 0], _ + [1583, 'Leaders_Zeal', 'Eifer_des_Anführers', 5, 6.5, 9, 39, 0, 10, 2, 2, 8, 12, 240, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 12, 0], _ + [1584, 'Leaders_Comfort', 'Trost_des_Anführers', 5, 6.5, 9, 40, 0, 10, 30, 75, 10, 20, 140, 1000, 0, 0, 0, 1, 2, 0.75, 0, 0, 4, 0, 8, 0], _ + [1585, 'Signet_of_Synergy', 'Siegel_der_Synergie', 0, 0, 9, 39, 0, 7, 40, 100, 0, 0, 0, 0, 0, 0, 4, 1, 1, 0.75, 0, 0, 2, 0, 10, 0], _ + [1586, 'Angelic_Protection', 'Engelsschutz', 5, 6.5, 9, 40, 0, 10, 250, 100, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0.75, 0, 0, 0, 0, 30, 0], _ + [1587, 'Angelic_Bond', 'Engelsbindung', 5, 6.5, 9, 40, 0, 10, 20, 200, 0, 0, 1000, 0, 0, 0, 0, 1, 1, 0.75, 4, 0, 0, 0, 30, 0], _ + [1588, 'Cautery_Signet', 'Siegel_der_Verätzung', 0, 0, 9, 46, 0, 7, 1, 1, 0, 0, 5000, 0, 0, 0, 0, 1, 2, 0.75, 4, 0, 4096, 0, 15, 0], _ + [1589, 'Stand_Your_Ground', 'Haltet_Eure_Stellung', 10, 13, 9, 38, 0, 15, 24, 24, 0, 0, 1000, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 20, 0], _ + [1590, 'Lead_the_Way', 'Geht_voran', 10, 13, 9, 40, 0, 15, 20, 20, 25, 25, 1000, 0, 0, 0, 3, 1, 0, 0, 0, 0, 32768, 0, 8, 0], _ + [1591, 'Make_Haste', 'Beeilt_Euch', 5, 6.5, 9, 38, 0, 15, 33, 33, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 0, 0, 32768, 0, 10, 0], _ + [1592, 'We_Shall_Return', 'Wir_werden_wiederkommen', 25, 32.5, 9, 38, 0, 15, 25, 50, 5, 20, 1000, 0, 0, 0, 0, 1, 0, 0, 2048, 0, 8, 0, 30, 0], _ + [1593, 'Never_Give_Up', 'Gebt_nicht_auf', 5, 6.5, 9, 38, 0, 15, 75, 75, 1, 10, 1000, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 15, 0], _ + [1594, 'Help_Me', 'Helft_mir', 5, 6.5, 9, 38, 0, 15, 50, 50, 15, 90, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 10, 0], _ + [1595, 'Fall_Back', 'Zieht_Euch_zurück', 10, 13, 9, 38, 0, 15, 33, 33, 5, 15, 1000, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 20, 0], _ + [1596, 'Incoming', 'Schon_unterwegs', 5, 6.5, 9, 38, 0, 15, 33, 33, 5, 15, 1000, 0, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 20, 0], _ + [1597, 'Theyre_on_Fire', 'Sie_brennen', 10, 13, 9, 40, 0, 15, 5, 35, 0, 0, 1000, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 10, 0], _ + [1598, 'Never_Surrender', 'Ergebt_Euch_nicht', 5, 6.5, 9, 38, 0, 15, 75, 75, 1, 5, 1000, 0, 0, 0, 0, 1, 0, 0, 0, 0, 6, 0, 15, 0], _ + [1599, 'Its_Just_a_Flesh_Wound', 'Es_ist_nur_eine_Fleischwunde', 5, 6.5, 9, 39, 0, 15, 0, 0, 25, 25, 0, 0, 0, 0, 4, 1, 0, 0, 4, 0, 4096, 0, 2, 0], _ + [1600, 'Barbed_Spear', 'Stachelspeer', 0, 0, 9, 37, 0, 14, 0, 0, 5, 20, 0, 0, 0, 0, 5, 1, 0, 0, 0, 1, 0, 64, 0, 50], _ + [1601, 'Vicious_Attack', 'Bösartiger_Angriff', 5, 6.5, 9, 37, 0, 14, 5, 20, 5, 15, 0, 0, 0, 0, 5, 1, 0, 0, 0, 16, 0, 64, 8, 0], _ + [1602, 'Stunning_Strike', 'Betäubender_Schlag', 0, 0, 9, 37, 0, 14, 5, 30, 4, 10, 0, 0, 0, 0, 5, 1, 0, 0, 4, 512, 0, 64, 0, 250], _ + [1603, 'Merciless_Spear', 'Unbarmherziger_Speer', 0, 0, 9, 37, 0, 14, 50, 50, 5, 20, 0, 0, 0, 0, 5, 1, 0, 0, 0, 16, 0, 64, 0, 150], _ + [1604, 'Disrupting_Throw', 'Unterbrechender_Wurf', 5, 6.5, 9, 37, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 0.5, 1, 0, 0, 0, 64, 10, 0], _ + [1605, 'Wild_Throw', 'Wilder_Wurf', 0, 0, 9, 37, 0, 14, 5, 20, 3, 3, 3, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 64, 0, 175], _ + [1633, 'Malicious_Strike', 'Böswilliger_Stoß', 5, 6.5, 7, 35, 0, 14, 10, 30, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 185, 6, 0], _ + [1634, 'Shattering_Assault', 'Vernichtender_Angriff', 10, 13, 7, 35, 0, 14, 5, 50, 0, 0, 0, 0, 3, 4, 5, 1, 0, 0, 32772, 0, 0, 8, 6, 0], _ + [1635, 'Golden_Skull_Strike', 'Goldener_Schädel_Stoß', 10, 13, 7, 29, 0, 14, 0, 0, 0, 0, 0, 0, 2, 0, 5, 1, 0, 0, 4, 0, 0, 8, 15, 0], _ + [1636, 'Black_Spider_Strike', 'Schwarzer_Spinnen_Stoß', 10, 13, 7, 29, 0, 14, 5, 20, 5, 20, 0, 0, 2, 16, 5, 1, 0, 0, 0, 0, 0, 8, 12, 0], _ + [1637, 'Golden_Fox_Strike', 'Goldener_Fuchs_Stoß', 5, 6.5, 7, 29, 0, 14, 10, 30, 0, 0, 0, 0, 1, 0, 5, 1, 0, 0, 0, 0, 0, 8, 4, 0], _ + [1638, 'Deadly_Haste', 'Tödliche_Eile', 10, 13, 7, 35, 0, 6, 5, 50, 5, 50, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 20, 0], _ + [1639, 'Assassins_Remedy', 'Mittel_des_Assassinen', 5, 6.5, 7, 35, 0, 6, 1, 10, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 20, 0], _ + [1640, 'Foxs_Promise', 'Versprechen_des_Fuchses', 10, 13, 7, 29, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0.75, 4, 0, 0, 0, 20, 0], _ + [1641, 'Feigned_Neutrality', 'Vorgetäuschte_Neutralität', 5, 6.5, 7, 31, 0, 6, 7, 7, 80, 80, 0, 0, 0, 0, 0, 1, 0.25, 0.75, 0, 0, 4, 0, 25, 0], _ + [1642, 'Hidden_Caltrops', 'Versteckte_Trittnägel', 5, 6.5, 7, 31, 0, 4, 1, 15, 50, 50, 10, 0, 0, 0, 5, 1, 1, 0.75, 4, 0, 0, 0, 12, 0], _ + [1643, 'Assault_Enchantments', 'Verzauberungen_angreifen', 5, 6.5, 7, 46, 0, 10, 0, 0, 0, 0, 0, 0, 0, 1, 5, 1, 0.25, 0.75, 4, 0, 0, 0, 8, 0], _ + [1644, 'Wastrels_Collapse', 'Verfall_des_Verschwenders', 5, 6.5, 7, 46, 0, 10, 10, 10, 0, 0, 0, 0, 0, 0, 5, 1, 0.25, 0.75, 4, 0, 0, 0, 20, 0], _ + [1645, 'Lift_Enchantment', 'Verzauberung_lösen', 5, 6.5, 7, 46, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 0.25, 0.75, 2, 0, 0, 0, 10, 0], _ + [1646, 'Augury_of_Death', 'Todesomen', 5, 6.5, 7, 30, 0, 4, 50, 50, 5, 20, 0, 0, 0, 0, 5, 1, 1, 0.75, 8, 0, 0, 0, 20, 0], _ + [1647, 'Signet_of_Toxic_Shock', 'Siegel_des_toxischen_Schocks', 0, 0, 7, 30, 0, 7, 10, 100, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 15, 0], _ + [1648, 'Signet_of_Twilight', 'Siegel_des_Zwielichts', 0, 0, 7, 46, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 0, 0, 20, 0], _ + [1649, 'Way_of_the_Assassin', 'Weg_des_Assassinen', 5, 6.5, 7, 35, 0, 3, 5, 20, 5, 35, 0, 0, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 12, 0], _ + [1650, 'Shadow_Walk', 'Schattenmarsch', 5, 6.5, 7, 46, 0, 3, 1, 1, 10, 10, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 0, 30, 0], _ + [1651, 'Deaths_Retreat', 'Rückzug_des_Todes', 5, 6.5, 7, 31, 0, 5, 40, 130, 0, 0, 0, 0, 0, 0, 4, 1, 0.25, 0, 0, 0, 0, 0, 20, 0], _ + [1652, 'Shadow_Prison', 'Schattengefängnis', 10, 13, 7, 30, 0, 4, 66, 66, 0, 0, 0, 0, 0, 0, 5, 1, 0.25, 0.75, 4, 0, 0, 0, 25, 0], _ + [1653, 'Swap', 'Tauschen', 5, 6.5, 7, 46, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0.25, 0, 0, 0, 0, 0, 10, 0], _ + [1654, 'Shadow_Meld', 'Schattenverschmelzung', 10, 13, 7, 46, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0.25, 0, 4, 0, 0, 0, 20, 0], _ + [1655, 'Price_of_Pride', 'Preis_des_Stolzes', 5, 6.5, 5, 2, 0, 4, 1, 7, 0, 0, 0, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 0, 0, 8, 0], _ + [1656, 'Air_of_Disenchantment', 'Flair_der_Entzauberung', 10, 13, 5, 1, 0, 4, 150, 300, 0, 0, 240, 0, 0, 0, 5, 1, 1, 0.75, 4, 0, 0, 0, 10, 0], _ + [1657, 'Signet_of_Clumsiness', 'Siegel_der_Unbeholfenheit', 0, 0, 5, 1, 0, 7, 15, 60, 0, 0, 156, 0, 0, 0, 5, 1, 0.25, 0.75, 0, 0, 0, 0, 8, 0], _ + [1658, 'Symbolic_Posture', 'Symbolische_Haltung', 10, 13, 5, 0, 0, 3, 20, 80, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 20, 0], _ + [1659, 'Toxic_Chill', 'Toxische_Kälte', 5, 6.5, 4, 5, 0, 5, 15, 75, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 4, 0, 0, 0, 5, 0], _ + [1660, 'Well_of_Silence', 'Brunnen_der_Stille', 10, 13, 4, 7, 0, 9, 1, 4, 20, 20, 312, 0, 0, 0, 0, 1, 1, 0.75, 262656, 0, 0, 0, 20, 0], _ + [1661, 'Glowstone', 'Leuchtstein', 5, 6.5, 6, 9, 0, 5, 5, 50, 5, 5, 0, 0, 0, 0, 5, 1, 0.75, 0.75, 0, 0, 256, 0, 7, 0], _ + [1662, 'Mind_Blast', 'Geistige_Explosion', 5, 6.5, 6, 10, 0, 5, 15, 60, 1, 8, 0, 0, 0, 0, 5, 1, 1, 0.75, 4, 0, 0, 0, 2, 0], _ + [1663, 'Elemental_Flame', 'Elementare_Flamme', 5, 6.5, 6, 10, 0, 6, 1, 5, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 30, 0], _ + [1664, 'Invoke_Lightning', 'Blitz_herbeirufen', 10, 13, 6, 8, 0, 5, 10, 90, 25, 25, 240, 0, 0, 0, 5, 1, 1, 0.75, 5, 0, 0, 0, 6, 0], _ + [1683, 'Pensive_Guardian', 'Nachdenklicher_Wächter', 5, 6.5, 3, 15, 0, 6, 50, 50, 0, 0, 0, 0, 0, 0, 3, 1, 1, 0.75, 0, 0, 0, 0, 5, 0], _ + [1684, 'Scribes_Insight', 'Einblick_des_Schreibers', 5, 6.5, 3, 16, 0, 6, 3, 3, 0, 0, 0, 0, 0, 0, 0, 1, 0.25, 0.75, 4, 0, 256, 0, 20, 0], _ + [1685, 'Holy_Haste', 'Heilige_Eile', 10, 13, 3, 16, 0, 6, 50, 50, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 10, 0], _ + [1686, 'Glimmer_of_Light', 'Lichtschimmer', 5, 6.5, 3, 13, 0, 5, 10, 115, 0, 0, 0, 0, 0, 0, 3, 1, 0.25, 0.75, 4, 4096, 6, 0, 1, 0], _ + [1687, 'Zealous_Benediction', 'Eifrige_Segnung', 10, 13, 3, 15, 0, 5, 30, 180, 7, 7, 0, 0, 0, 0, 3, 1, 0.75, 0.75, 4, 4096, 6, 0, 4, 0], _ + [1688, 'Defenders_Zeal', 'Eifer_des_Verteidigers', 5, 6.5, 3, 14, 0, 4, 2, 2, 1, 4, 0, 0, 0, 0, 5, 1, 1, 0.75, 4, 0, 0, 0, 5, 0], _ + [1689, 'Signet_of_Mystic_Wrath', 'Siegel_des_mystischen_Zorns', 0, 0, 3, 14, 0, 7, 5, 35, 100, 100, 0, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 0, 0, 20, 0], _ + [1690, 'Signet_of_Removal', 'Siegel_der_Entfernung', 0, 0, 3, 46, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 1, 0.75, 4, 0, 0, 0, 5, 0], _ + [1691, 'Dismiss_Condition', 'Zustand_aufheben', 5, 6.5, 3, 15, 0, 5, 15, 75, 0, 0, 0, 0, 0, 0, 3, 1, 0.75, 0.75, 0, 0, 0, 0, 3, 0], _ + [1692, 'Divert_Hexes', 'Verhexungen_umleiten', 10, 13, 3, 15, 0, 5, 1, 3, 15, 75, 0, 0, 0, 0, 3, 1, 1, 0.75, 4, 4096, 2048, 0, 5, 0], _ + [1693, 'Counterattack', 'Gegenangriff', 5, 6.5, 1, 17, 0, 14, 5, 35, 2, 6, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 185, 6, 0], _ + [1694, 'Magehunter_Strike', 'Magierschlag', 5, 6.5, 1, 17, 0, 14, 5, 20, 0, 0, 0, 0, 0, 0, 5, 1, 0.5, 0, 4, 0, 0, 185, 3, 0], _ + [1695, 'Soldiers_Strike', 'Soldatenstoß', 5, 6.5, 1, 21, 0, 14, 10, 40, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 185, 4, 0], _ + [1696, 'Decapitate', 'Köpfen', 0, 0, 1, 18, 0, 14, 5, 50, 5, 20, 0, 0, 0, 0, 5, 1, 0, 0, 4, 0, 0, 1, 0, 200], _ + [1697, 'Magehunters_Smash', 'Magiejägerschmetterer', 0, 0, 1, 19, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 4, 0, 0, 16, 0, 200], _ + [1698, 'Soldiers_Stance', 'Soldaten_Haltung', 5, 6.5, 1, 21, 0, 3, 33, 33, 75, 75, 0, 0, 0, 0, 0, 1, 0, 0, 4, 0, 32768, 0, 15, 0], _ + [1699, 'Soldiers_Defense', 'Soldaten_Verteidigung', 5, 6.5, 1, 21, 0, 3, 75, 75, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 15, 0], _ + [1700, 'Frenzied_Defense', 'Fieberhafte_Verteidigung', 5, 6.5, 1, 46, 0, 3, 75, 75, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 128, 0, 10, 0], _ + [1701, 'Steady_Stance', 'Ruhige_Haltung', 5, 6.5, 1, 21, 0, 3, 1, 3, 1, 7, 0, 0, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 6, 0], _ + [1702, 'Steelfang_Slash', 'Hieb_des_stählernen_Fangzahns', 0, 0, 1, 20, 0, 14, 1, 31, 1, 5, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 128, 1, 200], _ + [1719, 'Screaming_Shot', 'Schreischuss', 10, 13, 2, 25, 0, 14, 10, 25, 5, 20, 1000, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 2, 8, 0], _ + [1720, 'Keen_Arrow', 'Scharfer_Pfeil', 5, 6.5, 2, 25, 0, 14, 5, 20, 5, 25, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 2, 6, 0], _ + [1721, 'Rampage_as_One', 'Gemeinsam_toben', 25, 32.5, 2, 22, 0, 16, 33, 33, 25, 25, 0, 0, 0, 0, 0, 1, 0, 0, 4, 0, 32768, 0, 10, 0], _ + [1722, 'Forked_Arrow', 'Gegabelter_Pfeil', 10, 13, 2, 46, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 2, 5, 0], _ + [1723, 'Disrupting_Accuracy', 'Unterbrechende_Genauigkeit', 5, 6.5, 2, 25, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0.75, 0, 0, 0, 0, 12, 0], _ + [1724, 'Experts_Dexterity', 'Gewandtheit_des_Profis', 5, 6.5, 2, 23, 0, 3, 33, 33, 2, 2, 0, 0, 0, 0, 0, 1, 0, 0.75, 4, 0, 0, 0, 20, 0], _ + [1725, 'Roaring_Winds', 'Tosender_Wind', 10, 13, 2, 24, 0, 22, 1, 10, 1, 5, 0, 0, 0, 0, 0, 1, 5, 0.75, 0, 0, 0, 0, 60, 0], _ + [1726, 'Magebane_Shot', 'Verderben_des_Magiers_Schuss', 10, 13, 2, 46, 0, 14, 10, 10, 0, 0, 0, 0, 0, 0, 5, 1, 0.5, 1.5, 4, 0, 0, 2, 5, 0], _ + [1727, 'Natural_Stride', 'Natürlicher_Schwung', 5, 6.5, 2, 24, 0, 3, 33, 33, 50, 50, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 128, 0, 12, 0], _ + [1728, 'Hekets_Rampage', 'Heket_Toben', 5, 6.5, 2, 22, 0, 3, 33, 33, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 32768, 0, 10, 0], _ + [1729, 'Smoke_Trap', 'Rauchfalle', 10, 13, 2, 24, 0, 21, 0, 0, 5, 10, 156, 240, 0, 0, 0, 1, 2, 0.75, 292, 0, 0, 0, 20, 0], _ + [1730, 'Infuriating_Heat', 'Irritierende_Hitze', 5, 6.5, 2, 23, 0, 22, 1, 10, 0, 0, 2500, 0, 0, 0, 0, 1, 3, 0.75, 4, 0, 0, 0, 15, 0], _ + [1731, 'Vocal_Was_Sogolon', 'Lautstark_war_Sogolon', 10, 13, 8, 33, 0, 24, 20, 50, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 30, 0], _ + [1732, 'Destructive_Was_Glaive', 'Vernichtend_war_Glaive', 5, 6.5, 8, 34, 0, 24, 15, 85, 20, 20, 312, 20, 0, 0, 0, 1, 0.75, 0.75, 4, 0, 8192, 0, 5, 0], _ + [1733, 'Wielders_Strike', 'Stoß_des_Ausübers', 5, 6.5, 8, 34, 0, 5, 5, 50, 10, 40, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 6, 0], _ + [1734, 'Gaze_of_Fury', 'Wütendes_Starren', 10, 13, 8, 34, 0, 22, 1, 14, 5, 20, 0, 0, 0, 0, 1, 1, 0.75, 0.75, 256, 0, 0, 0, 20, 0], _ + [1736, 'Spirits_Strength', 'Geistesstärke', 5, 6.5, 8, 36, 0, 6, 5, 35, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0.75, 4, 0, 0, 0, 30, 0], _ + [1737, 'Wielders_Zeal', 'Eifer_des_Ausübers', 10, 13, 8, 36, 0, 6, 1, 5, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0.75, 4, 0, 0, 0, 10, 0], _ + [1738, 'Sight_Beyond_Sight', 'Sicht_jenseits_der_Sicht', 5, 6.5, 8, 36, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0.25, 0.75, 0, 0, 0, 0, 15, 0], _ + [1739, 'Renewing_Memories', 'Erneuernde_Erinnerungen', 5, 6.5, 8, 36, 0, 6, 5, 35, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 20, 0], _ + [1740, 'Wielders_Remedy', 'Mittel_des_Ausübers', 5, 6.5, 8, 36, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 10, 0], _ + [1741, 'Ghostmirror_Light', 'Geisterspiegel_Licht', 5, 6.5, 8, 33, 0, 5, 15, 90, 0, 0, 1000, 0, 0, 0, 4, 1, 1, 0.75, 0, 0, 0, 0, 3, 0], _ + [1742, 'Signet_of_Ghostly_Might', 'Siegel_der_Macht_der_Geister', 0, 0, 8, 32, 0, 7, 33, 33, 5, 10, 1000, 0, 0, 0, 0, 1, 1, 0.75, 4, 0, 0, 0, 15, 0], _ + [1743, 'Signet_of_Binding', 'Siegel_der_Bindung', 0, 0, 8, 36, 0, 7, 200, 50, 0, 0, 0, 0, 0, 0, 1, 1, 2, 0.75, 64, 0, 0, 0, 15, 0], _ + [1744, 'Caretakers_Charge', 'Angriff_des_Verwalters', 5, 6.5, 8, 34, 0, 5, 20, 75, 5, 50, 5, 0, 0, 0, 5, 1, 1, 0.75, 4, 0, 0, 0, 4, 0], _ + [1745, 'Anguish', 'Qual', 15, 19.5, 8, 32, 0, 22, 1, 11, 5, 20, 2500, 0, 0, 0, 0, 1, 0.75, 0.75, 256, 0, 0, 0, 45, 0], _ + [1747, 'Empowerment', 'Ermächtigung', 5, 6.5, 8, 36, 0, 22, 1, 14, 15, 45, 2500, 10, 0, 0, 0, 1, 0.75, 0.75, 256, 0, 0, 0, 30, 0], _ + [1748, 'Recovery', 'Gesundung', 15, 19.5, 8, 33, 0, 22, 1, 14, 20, 50, 0, 0, 0, 0, 0, 1, 0.75, 0.75, 256, 0, 0, 0, 30, 0], _ + [1749, 'Weapon_of_Fury', 'Waffe_der_Wut', 5, 6.5, 8, 34, 0, 25, 5, 50, 1, 1, 0, 0, 0, 0, 3, 1, 1, 0.75, 4, 0, 0, 0, 8, 0], _ + [1750, 'Xinraes_Weapon', 'Xinraes_Waffe', 5, 6.5, 8, 33, 0, 25, 5, 5, 20, 80, 0, 0, 0, 0, 3, 1, 0.25, 0.75, 4, 0, 0, 0, 3, 0], _ + [1751, 'Warmongers_Weapon', 'Waffe_des_Kriegshetzers', 10, 13, 8, 34, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 1, 0.75, 0, 0, 0, 0, 30, 0], _ + [1752, 'Weapon_of_Remedy', 'Waffe_der_Behebung', 5, 6.5, 8, 33, 0, 25, 15, 75, 0, 0, 0, 0, 0, 0, 3, 1, 0.25, 0.75, 4, 0, 4102, 0, 3, 0], _ + [1753, 'Rending_Sweep', 'Zerreißender_Schwung', 0, 0, 10, 41, 0, 14, 5, 20, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 8192, 32, 0, 150], _ + [1754, 'Onslaught', 'Attacke', 10, 13, 10, 42, 0, 6, 25, 25, 25, 25, 0, 25, 0, 0, 0, 1, 0, 0, 8388612, 0, 0, 0, 10, 0], _ + [1755, 'Mystic_Corruption', 'Mystische_Verdorbenheit', 10, 13, 10, 44, 0, 6, 1, 2, 0, 0, 156, 1000, 0, 0, 0, 1, 0, 0, 8388608, 32, 512, 0, 10, 0], _ + [1756, 'Grenths_Grasp', 'Grenths_Griff', 5, 6.5, 10, 42, 0, 6, 1, 1, 1, 11, 156, 0, 0, 0, 0, 1, 0, 0, 8388612, 8, 0, 0, 10, 0], _ + [1757, 'Veil_of_Thorns', 'Dornenschleier', 10, 13, 10, 43, 0, 6, 5, 50, 5, 35, 240, 0, 0, 0, 0, 1, 0, 0, 8388608, 0, 512, 0, 15, 0], _ + [1758, 'Harriers_Grasp', 'Griff_des_Läufers', 10, 13, 10, 42, 0, 6, 1, 3, 2, 9, 0, 0, 0, 0, 0, 1, 0, 0, 8388608, 8, 0, 0, 15, 0], _ + [1759, 'Vow_of_Strength', 'Gelübde_der_Stärke', 5, 6.5, 10, 43, 0, 6, 10, 25, 0, 0, 156, 0, 0, 0, 0, 1, 0.25, 0.75, 4, 0, 0, 0, 20, 0], _ + [1760, 'Ebon_Dust_Aura', 'Ebon_Staubaura', 10, 13, 10, 43, 0, 6, 3, 15, 1, 7, 240, 0, 0, 0, 0, 1, 0, 0, 8388612, 2, 0, 0, 20, 0], _ + [1761, 'Zealous_Vow', 'Eifriges_Gelübde', 5, 6.5, 10, 42, 0, 6, 3, 3, 1, 6, 0, 0, 0, 0, 0, 1, 0.25, 0.75, 4, 0, 256, 0, 12, 0], _ + [1762, 'Heart_of_Fury', 'Herz_der_Wut', 0, 0, 10, 44, 0, 3, 25, 25, 0, 0, 0, 25, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 80], _ + [1763, 'Zealous_Renewal', 'Eifrige_Erneuerung', 5, 6.5, 10, 44, 0, 6, 5, 30, 1, 5, 240, 0, 0, 0, 0, 1, 0, 0, 8388608, 0, 768, 0, 10, 0], _ + [1764, 'Attackers_Insight', 'Einblick_des_Angreifers', 10, 13, 10, 42, 0, 6, 50, 50, 3, 15, 156, 0, 0, 0, 0, 1, 0, 0, 8388608, 1024, 0, 0, 10, 0], _ + [1765, 'Rending_Aura', 'Zerreißende_Aura', 10, 13, 10, 42, 0, 6, 10, 40, 1, 10, 240, 0, 0, 0, 0, 1, 0, 0, 8388608, 0, 512, 0, 6, 0], _ + [1766, 'Featherfoot_Grace', 'Anmut_des_Federfußes', 10, 13, 10, 42, 0, 6, 25, 25, 25, 25, 0, 0, 0, 0, 0, 1, 0.25, 0.75, 0, 0, 0, 0, 15, 0], _ + [1767, 'Reapers_Sweep', 'Schwung_des_Schnitters', 0, 0, 10, 41, 0, 14, 2, 3, 3, 15, 0, 0, 0, 0, 5, 1, 0, 0, 4, 128, 8192, 32, 0, 200], _ + [1768, 'Harriers_Haste', 'Eile_des_Läufers', 10, 13, 10, 42, 0, 6, 25, 25, 3, 12, 0, 0, 0, 0, 0, 1, 0, 0, 8388608, 0, 0, 0, 10, 0], _ + [1769, 'Focused_Anger', 'Konzentrierter_Zorn', 10, 13, 9, 40, 0, 16, 0, 150, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 60, 0], _ + [1770, 'Natural_Temper', 'Natürliche_Laune', 0, 0, 9, 40, 0, 16, 33, 33, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 75], _ + [1771, 'Song_of_Restoration', 'Gesang_der_Wiederherstellung', 10, 13, 9, 39, 0, 27, 45, 110, 0, 0, 1000, 0, 0, 0, 0, 1, 1, 0.75, 4, 0, 6, 0, 20, 0], _ + [1772, 'Lyric_of_Purification', 'Lyrik_der_Läuterung', 5, 6.5, 9, 39, 0, 27, 0, 0, 0, 0, 1000, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 4096, 0, 20, 0], _ + [1773, 'Soldiers_Fury', 'Wut_des_Soldaten', 5, 6.5, 9, 40, 0, 28, 33, 33, 33, 33, 0, 0, 0, 0, 0, 1, 1, 0.75, 4, 0, 32768, 0, 5, 0], _ + [1774, 'Aggressive_Refrain', 'Aggressiver_Refrain', 25, 32.5, 9, 40, 0, 28, 25, 25, 20, 20, 0, 0, 0, 0, 0, 1, 2, 0.75, 0, 0, 32768, 0, 20, 0], _ + [1775, 'Energizing_Finale', 'Energie_bringendes_Finale', 10, 13, 9, 39, 0, 28, 1, 1, 0, 0, 0, 0, 0, 0, 3, 1, 1, 0.75, 0, 0, 0, 0, 5, 0], _ + [1776, 'Signet_of_Aggression', 'Siegel_der_Aggression', 0, 0, 9, 46, 0, 7, 2, 2, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 5, 0], _ + [1777, 'Remedy_Signet', 'Heilmittel_Siegel', 0, 0, 9, 46, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 4096, 0, 4, 0], _ + [1778, 'Signet_of_Return', 'Siegel_der_Wiederkehr', 0, 0, 9, 40, 0, 7, 5, 15, 1, 4, 1000, 0, 0, 0, 6, 1, 5, 0.75, 2048, 0, 8, 0, 5, 0], _ + [1779, 'Make_Your_Time', 'Nehmt_Euch_Zeit', 10, 13, 9, 40, 0, 15, 1, 5, 0, 0, 1000, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 30, 0], _ + [1780, 'Cant_Touch_This', 'Cant_touch_this', 5, 6.5, 9, 38, 0, 15, 1, 5, 0, 0, 1000, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 20, 0], _ + [1781, 'Find_Their_Weakness', 'Findet_ihren_Schwachpunkt', 10, 13, 9, 38, 0, 15, 5, 50, 5, 20, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 0, 0, 15, 0], _ + [1782, 'The_Power_Is_Yours', 'Die_Macht_ist_Euer', 0, 0, 9, 39, 0, 15, 0, 1, 0, 0, 1000, 0, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 0, 100], _ + [1783, 'Slayers_Spear', 'Speer_des_Würgers', 10, 13, 9, 37, 0, 14, 5, 25, 5, 20, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 64, 4, 0], _ + [1784, 'Swift_Javelin', 'Schneller_Speer', 5, 6.5, 9, 37, 0, 14, 5, 20, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 64, 10, 0], _ + [1814, 'Lightbringers_Gaze', 'Blick_des_Lichtbringers', 5, 6.5, 0, 46, 0, 10, 100, 100, 1, 1, 312, 0, 0, 0, 5, 1, 1, 0.75, 524288, 0, 0, 0, 15, 0], _ + [1815, 'Lightbringer_Signet', 'Lichtbringer_Siegel', 0, 0, 0, 46, 0, 7, 3, 5, 16, 24, 312, 0, 0, 0, 0, 1, 0.25, 0.75, 524288, 0, 0, 0, 25, 0], _ + [1816, 'Sunspear_Rebirth_Signet', 'Sonnenspeer_Wiedergeburtssiegel', 0, 0, 0, 46, 0, 7, 10, 10, 0, 0, 0, 0, 0, 0, 6, 1, 3, 0.75, 526336, 0, 16, 0, 0, 0], _ + [1948, 'Shadow_Sanctuary_Luxon', 'Schattenzuflucht_Luxon', 5, 6.5, 7, 46, 0, 6, 7, 10, 5, 5, 40, 0, 0, 0, 0, 1, 0.25, 0.75, 524288, 0, 0, 0, 30, 0], _ + [1949, 'Ether_Nightmare_Luxon', 'Äther_Alptraum_Luxon', 10, 13, 5, 46, 0, 4, 5, 8, 1, 1, 312, 0, 0, 0, 5, 1, 3, 0.75, 524800, 0, 0, 0, 25, 0], _ + [1950, 'Signet_of_Corruption_Luxon', 'Siegel_der_Verdorbenheit_Luxon', 0, 0, 4, 46, 0, 7, 20, 30, 2, 2, 240, 0, 0, 0, 5, 1, 1, 0.75, 524288, 0, 0, 0, 20, 0], _ + [1951, 'Elemental_Lord_Luxon', 'Elementarlord_Luxon', 5, 6.5, 6, 46, 0, 6, 100, 300, 1, 1, 1, 0, 0, 0, 0, 1, 0.25, 0.75, 524288, 0, 0, 0, 45, 0], _ + [1952, 'Selfless_Spirit_Luxon', 'Selbstloser_Geist_Luxon', 5, 6.5, 3, 46, 0, 6, 3, 3, 0, 0, 0, 0, 0, 0, 0, 1, 0.25, 0.75, 524288, 0, 0, 0, 45, 0], _ + [1953, 'Triple_Shot_Luxon', 'Dreifachschuss_Luxon', 10, 13, 2, 46, 0, 14, 40, 25, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 524288, 0, 0, 2, 10, 0], _ + [1954, 'Save_Yourselves_Luxon', 'Rettet_Euch_selbst_Luxon', 0, 0, 1, 46, 0, 15, 100, 100, 0, 0, 1000, 0, 0, 0, 0, 1, 0, 0, 524288, 0, 0, 0, 0, 200], _ + [1955, 'Aura_of_Holy_Might_Luxon', 'Aura_der_Heiligen_Macht_Luxon', 10, 13, 10, 46, 0, 6, 0, 0, 20, 25, 156, 0, 0, 0, 0, 1, 0.75, 0.75, 524288, 0, 0, 0, 30, 0], _ + [1957, 'Spear_of_Fury_Luxon', 'Speer_der_Wut_Luxon', 5, 6.5, 9, 46, 0, 14, 30, 40, 3, 6, 0, 0, 0, 0, 5, 1, 1, 0.75, 524288, 0, 0, 64, 8, 0], _ + [1986, 'Vampiric_Assault', 'Vampirangriff', 5, 6.5, 7, 30, 0, 14, 10, 40, 0, 0, 0, 0, 3, 4, 5, 1, 0, 0, 32768, 0, 0, 8, 8, 0], _ + [1987, 'Lotus_Strike', 'Lotus_Stoß', 10, 13, 7, 29, 0, 14, 10, 25, 5, 20, 0, 0, 2, 2, 5, 1, 0, 0, 0, 0, 0, 8, 12, 0], _ + [1988, 'Golden_Fang_Strike', 'Goldfangstoß', 5, 6.5, 7, 29, 0, 14, 0, 0, 0, 0, 0, 0, 2, 2, 5, 1, 0, 0, 0, 0, 0, 8, 4, 0], _ + [1990, 'Falling_Lotus_Strike', 'Fallender_Lotus_Stoß', 5, 6.5, 7, 29, 0, 14, 15, 35, 1, 12, 0, 0, 2, 0, 5, 1, 0, 0, 0, 0, 0, 8, 12, 0], _ + [1991, 'Sadists_Signet', 'Siegel_des_Sadisten', 0, 0, 7, 30, 0, 7, 10, 40, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 4, 0, 8, 0], _ + [1992, 'Signet_of_Distraction', 'Siegel_der_Ablenkung', 0, 0, 5, 2, 0, 7, 1, 5, 0, 0, 0, 0, 0, 0, 5, 1, 0.25, 0.75, 0, 0, 1, 0, 15, 0], _ + [1993, 'Signet_of_Recall', 'Siegel_der_Zurückrufung', 0, 0, 5, 3, 0, 7, 4, 4, 13, 20, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 20, 0], _ + [1994, 'Power_Lock', 'Kraftsperre', 5, 6.5, 5, 2, 0, 5, 5, 13, 0, 0, 0, 0, 0, 0, 5, 1, 0.25, 0.75, 0, 0, 1, 0, 12, 0], _ + [1995, 'Waste_Not', 'Spare_in_der_Zeit_', 5, 6.5, 5, 3, 0, 5, 8, 13, 0, 0, 0, 0, 0, 0, 5, 1, 0.25, 0.75, 0, 0, 256, 0, 15, 0], _ + [1996, 'Sum_of_All_Fears', 'Summe_aller_Ängste', 10, 13, 5, 1, 0, 4, 33, 33, 0, 0, 0, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 0, 0, 10, 0], _ + [1997, 'Withering_Aura', 'Verkümmernde_Aura', 5, 6.5, 4, 5, 0, 6, 5, 20, 0, 0, 0, 0, 0, 0, 3, 1, 1, 0.75, 0, 0, 0, 0, 3, 0], _ + [1998, 'Cacophony', 'Kakophonie', 10, 13, 4, 7, 0, 4, 30, 105, 0, 0, 0, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 0, 0, 15, 0], _ + [1999, 'Winters_Embrace', 'Umarmung_des_Winters', 10, 13, 6, 11, 0, 4, 66, 66, 5, 15, 0, 0, 0, 0, 5, 1, 0.75, 0.75, 0, 2048, 0, 0, 15, 0], _ + [2000, 'Earthen_Shackles', 'Irdene_Fesseln', 10, 13, 6, 9, 0, 4, 90, 90, 5, 20, 240, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 15, 0], _ + [2001, 'Ward_of_Weakness', 'Kreis_der_Schwäche', 10, 13, 6, 9, 0, 11, 5, 20, 0, 0, 312, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 128, 0, 20, 0], _ + [2002, 'Glyph_of_Swiftness', 'Glyphe_der_Schnelligkeit', 5, 6.5, 6, 8, 0, 12, 1, 5, 25, 25, 200, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 10, 0], _ + [2003, 'Cure_Hex', 'Verhexung_heilen', 5, 6.5, 3, 13, 0, 5, 30, 120, 0, 0, 0, 0, 0, 0, 3, 1, 1, 0.75, 0, 4096, 2054, 0, 12, 0], _ + [2004, 'Smite_Condition', 'Zustand_zerschlagen', 5, 6.5, 3, 14, 0, 5, 10, 60, 0, 0, 240, 0, 0, 0, 3, 1, 1, 0.75, 0, 0, 4096, 0, 7, 0], _ + [2005, 'Smiters_Boon', 'Segen_des_Peinigers', 5, 6.5, 3, 16, 0, 6, 1, 5, 10, 33, 5, 0, 0, 0, 0, 1, 0.25, 0.75, 0, 0, 0, 0, 10, 0], _ + [2006, 'Castigation_Signet', 'Geißelungs_Siegel', 0, 0, 3, 14, 0, 7, 26, 56, 1, 10, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 256, 0, 20, 0], _ + [2007, 'Purifying_Veil', 'Reinigender_Schleier', 5, 6.5, 3, 15, 0, 6, 5, 50, 0, 0, 0, 0, 0, 0, 3, 1, 1, 0.75, 0, 0, 4096, 0, 6, 0], _ + [2008, 'Pulverizing_Smash', 'Zermalmender_Schlag', 0, 0, 1, 19, 128, 14, 5, 20, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 0, 1040, 0, 16, 0, 80], _ + [2009, 'Keen_Chop', 'Verwegener_Hieb', 0, 0, 1, 18, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 1, 0, 75], _ + [2010, 'Knee_Cutter', 'Knieschneider', 0, 0, 1, 20, 8, 14, 2, 7, 1, 3, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 256, 128, 1, 120], _ + [2011, 'Grapple', 'Raufen', 5, 6.5, 1, 46, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 0.75, 0, 2, 128, 0, 0, 12, 0], _ + [2012, 'Radiant_Scythe', 'Strahlende_Sense', 0, 0, 10, 41, 0, 14, 1, 7, 5, 30, 1, 0, 0, 0, 5, 1, 0, 0, 0, 0, 256, 32, 0, 150], _ + [2013, 'Grenths_Aura', 'Grenths_Aura', 10, 13, 10, 42, 0, 6, 5, 25, 5, 25, 156, 0, 0, 0, 0, 1, 0, 0, 8388608, 0, 512, 0, 10, 0], _ + [2014, 'Signet_of_Pious_Restraint', 'Siegel_der_frommen_Zurückhaltung', 0, 0, 10, 42, 0, 7, 5, 15, 75, 75, 240, 0, 0, 0, 5, 1, 1, 0.75, 0, 8, 8192, 0, 20, 0], _ + [2015, 'Farmers_Scythe', 'Sense_des_Bauern', 5, 6.5, 10, 41, 0, 14, 5, 20, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 32, 12, 0], _ + [2016, 'Energetic_Was_Lee_Sa', 'Energisch_war_Lee_Sa', 10, 13, 8, 36, 0, 24, 2, 2, 1, 10, 0, 0, 0, 0, 0, 1, 2, 0.75, 0, 0, 256, 0, 20, 0], _ + [2017, 'Anthem_of_Weariness', 'Hymne_der_Müdigkeit', 5, 6.5, 9, 38, 0, 27, 1, 16, 0, 0, 1000, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 10, 0], _ + [2018, 'Anthem_of_Disruption', 'Hymne_der_Störung', 10, 13, 9, 38, 0, 27, 0, 0, 0, 0, 1000, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 15, 0], _ + [2051, 'Summon_Spirits_Luxon', 'Geister_herbeirufen_Luxon', 5, 6.5, 8, 46, 0, 5, 60, 100, 0, 0, 5000, 72, 0, 0, 0, 1, 0.25, 0.75, 524288, 0, 0, 0, 5, 0], _ + [2052, 'Shadow_Fang', 'Schattenfangzahn', 10, 13, 7, 30, 0, 4, 5, 20, 0, 0, 0, 0, 0, 0, 5, 1, 0.25, 0.75, 0, 16, 0, 0, 45, 0], _ + [2053, 'Calculated_Risk', 'Kalkuliertes_Risiko', 5, 6.5, 5, 1, 0, 4, 50, 50, 15, 100, 0, 10, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 7, 0], _ + [2054, 'Shrinking_Armor', 'Schrumpfende_Rüstung', 5, 6.5, 5, 1, 0, 4, 1, 4, 5, 20, 0, 0, 0, 0, 5, 1, 1, 0.75, 512, 0, 0, 0, 8, 0], _ + [2055, 'Aneurysm', 'Aneurysma', 5, 6.5, 5, 2, 0, 5, 1, 3, 1, 30, 156, 1, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 5, 0], _ + [2056, 'Wandering_Eye', 'Wanderndes_Auge', 5, 6.5, 5, 1, 0, 4, 30, 110, 0, 0, 240, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 0, 0, 12, 0], _ + [2057, 'Foul_Feast', 'Widerliches_Gelage', 5, 6.5, 4, 6, 0, 5, 0, 45, 0, 2, 0, 0, 0, 0, 4, 1, 0.25, 0.75, 0, 0, 0, 0, 4, 0], _ + [2058, 'Putrid_Bile', 'Verwesende_Galle', 10, 13, 4, 5, 0, 4, 1, 3, 25, 85, 240, 0, 0, 0, 5, 1, 1, 0.75, 512, 0, 0, 0, 12, 0], _ + [2059, 'Shell_Shock', 'Kriegsneurose', 5, 6.5, 6, 8, 0, 5, 10, 30, 5, 20, 156, 156, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 8, 0], _ + [2060, 'Glyph_of_Immolation', 'Glyphe_der_Aufopferung', 5, 6.5, 6, 10, 0, 12, 1, 4, 1, 4, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 10, 0], _ + [2061, 'Patient_Spirit', 'Geduldiger_Geist', 5, 6.5, 3, 13, 0, 6, 30, 120, 0, 0, 0, 0, 0, 0, 3, 1, 0.25, 0.75, 0, 4096, 6, 0, 4, 0], _ + [2062, 'Healing_Ribbon', 'Heilendes_Band', 10, 13, 3, 13, 0, 5, 20, 110, 10, 100, 240, 0, 0, 0, 4, 1, 1, 0.75, 0, 4096, 6, 0, 5, 0], _ + [2063, 'Aura_of_Stability', 'Aura_der_Stabilität', 5, 6.5, 3, 15, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0.25, 0.75, 0, 0, 0, 0, 12, 0], _ + [2064, 'Spotless_Mind', 'Makelloser_Verstand', 5, 6.5, 3, 13, 0, 6, 5, 5, 0, 0, 0, 0, 0, 0, 4, 1, 0.25, 0.75, 0, 0, 2048, 0, 12, 0], _ + [2065, 'Spotless_Soul', 'Makellose_Seele', 5, 6.5, 3, 13, 0, 6, 3, 3, 0, 0, 0, 0, 0, 0, 4, 1, 0.25, 0.75, 0, 0, 4096, 0, 12, 0], _ + [2066, 'Disarm', 'Entwaffnen', 5, 6.5, 1, 17, 0, 14, 0, 3, 0, 0, 0, 0, 0, 0, 5, 1, 0.5, 0, 0, 0, 0, 128, 20, 0], _ + [2067, 'I_Meant_to_Do_That', 'Das_war_Absicht', 5, 6.5, 1, 17, 128, 15, 1, 5, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 8, 0], _ + [2068, 'Rapid_Fire', 'Schnellfeuer', 5, 6.5, 2, 25, 0, 19, 33, 33, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0.75, 256, 0, 0, 0, 12, 0], _ + [2069, 'Sloth_Hunters_Shot', 'Schuss_des_Faultierjägers', 10, 13, 2, 25, 0, 14, 10, 25, 10, 35, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 2, 8, 0], _ + [2070, 'Aura_Slicer', 'Auraschneider', 0, 0, 10, 44, 0, 14, 1, 10, 5, 15, 0, 0, 0, 0, 5, 1, 0, 0, 0, 1, 0, 185, 0, 80], _ + [2071, 'Zealous_Sweep', 'Eifriger_Schwung', 5, 6.5, 10, 41, 0, 14, 3, 3, 5, 20, 0, 1, 0, 0, 5, 1, 0, 0, 0, 0, 256, 32, 10, 0], _ + [2072, 'Pure_Was_Li_Ming', 'Rein_war_Li_Ming', 10, 13, 8, 33, 0, 24, 10, 50, 1, 4, 1000, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 4096, 0, 20, 0], _ + [2073, 'Weapon_of_Aggression', 'Waffe_der_Aggression', 10, 13, 8, 34, 0, 25, 25, 25, 0, 0, 0, 0, 0, 0, 0, 1, 0.25, 0.75, 0, 0, 0, 0, 10, 0], _ + [2074, 'Chest_Thumper', 'Brusttrommler', 5, 6.5, 9, 37, 0, 14, 5, 20, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 0, 16, 0, 64, 5, 0], _ + [2075, 'Hasty_Refrain', 'Hastiger_Refrain', 5, 6.5, 9, 40, 0, 28, 25, 25, 0, 0, 0, 0, 0, 0, 3, 1, 1, 0.75, 0, 0, 0, 0, 10, 0], _ + [2091, 'Shadow_Sanctuary_Kurzick', 'Schattenzuflucht_Kurzick', 5, 6.5, 7, 46, 0, 6, 7, 10, 5, 5, 40, 0, 0, 0, 0, 1, 0.25, 0.75, 524288, 0, 0, 0, 30, 0], _ + [2092, 'Ether_Nightmare_Kurzick', 'Äther_Alptraum_Kurzick', 10, 13, 5, 46, 0, 4, 5, 8, 1, 1, 312, 0, 0, 0, 5, 1, 3, 0.75, 524800, 0, 0, 0, 25, 0], _ + [2093, 'Signet_of_Corruption_Kurzick', 'Siegel_der_Verdorbenheit_Kurzick', 0, 0, 4, 46, 0, 7, 20, 30, 2, 2, 240, 0, 0, 0, 5, 1, 1, 0.75, 524288, 0, 0, 0, 20, 0], _ + [2094, 'Elemental_Lord_Kurzick', 'Elementarlord_Kurzick', 5, 6.5, 6, 46, 0, 6, 100, 300, 1, 1, 1, 0, 0, 0, 0, 1, 0.25, 0.75, 524288, 0, 0, 0, 45, 0], _ + [2095, 'Selfless_Spirit_Kurzick', 'Selbstloser_Geist_Kurzick', 5, 6.5, 3, 46, 0, 6, 3, 3, 0, 0, 0, 0, 0, 0, 0, 1, 0.25, 0.75, 524288, 0, 0, 0, 45, 0], _ + [2096, 'Triple_Shot_Kurzick', 'Dreifachschuss_Kurzick', 10, 13, 2, 46, 0, 14, 40, 25, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 524288, 0, 0, 2, 10, 0], _ + [2097, 'Save_Yourselves_Kurzick', 'Rettet_Euch_selbst_Kurzick', 0, 0, 1, 46, 0, 15, 100, 100, 0, 0, 1000, 0, 0, 0, 0, 1, 0, 0, 524288, 0, 0, 0, 0, 200], _ + [2098, 'Aura_of_Holy_Might_Kurzick', 'Aura_der_Heiligen_Macht_Kurzick', 10, 13, 10, 46, 0, 6, 0, 0, 20, 25, 156, 0, 0, 0, 0, 1, 0.75, 0.75, 524288, 0, 0, 0, 30, 0], _ + [2099, 'Spear_of_Fury_Kurzick', 'Speer_der_Wut_Kurzick', 5, 6.5, 9, 46, 0, 14, 30, 40, 3, 6, 0, 0, 0, 0, 5, 1, 1, 0.75, 524288, 0, 0, 64, 8, 0], _ + [2100, 'Summon_Spirits_Kurzick', 'Geister_herbeirufen_Kurzick', 5, 6.5, 8, 46, 0, 5, 60, 100, 0, 0, 5000, 72, 0, 0, 0, 1, 0.25, 0.75, 524288, 0, 0, 0, 5, 0], _ + [2101, 'Critical_Agility', 'Kritische_Beweglichkeit', 5, 6.5, 7, 46, 0, 6, 33, 33, 15, 25, 0, 0, 0, 0, 0, 1, 1, 0.75, 524288, 0, 0, 0, 30, 0], _ + [2102, 'Cry_of_Pain', 'Schmerzensschrei', 10, 13, 5, 46, 0, 5, 25, 50, 3, 5, 312, 0, 0, 0, 5, 1, 0.25, 0.75, 524288, 0, 0, 0, 15, 0], _ + [2103, 'Necrosis', 'Nekrose', 5, 6.5, 4, 46, 0, 10, 60, 90, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 524288, 0, 0, 0, 2, 0], _ + [2104, 'Intensity', 'Intensität', 5, 6.5, 6, 46, 0, 16, 0, 0, 60, 70, 312, 0, 0, 0, 0, 1, 0, 0, 524288, 0, 0, 0, 10, 0], _ + [2105, 'Seed_of_Life', 'Lebenssaat', 5, 6.5, 3, 46, 0, 6, 2, 2, 0, 0, 5000, 0, 0, 0, 4, 1, 0.25, 0.75, 524288, 0, 0, 0, 20, 0], _ + [2107, 'Whirlwind_Attack', 'Wirbelsturmangriff', 0, 0, 1, 46, 0, 14, 13, 20, 0, 0, 156, 0, 0, 0, 5, 1, 0, 0, 524288, 0, 0, 185, 1, 130], _ + [2108, 'Never_Rampage_Alone', 'Tobt_niemals_allein', 15, 19.5, 2, 46, 0, 16, 25, 25, 1, 3, 0, 0, 0, 0, 0, 1, 0, 0.75, 524288, 0, 0, 0, 20, 0], _ + [2109, 'Eternal_Aura', 'Ewige_Aura', 15, 19.5, 10, 46, 0, 6, 40, 50, 20, 30, 312, 100, 0, 0, 0, 1, 4, 0.75, 524288, 0, 0, 0, 30, 0], _ + [2110, 'Vampirism', 'Vampirismus', 10, 13, 8, 46, 0, 22, 4, 14, 10, 20, 0, 0, 0, 0, 0, 1, 0.75, 0.75, 524544, 0, 0, 0, 30, 0], _ + [2112, 'Theres_Nothing_to_Fear', 'Es_gibt_nichts_zu_befürchten', 15, 19.5, 9, 46, 0, 15, 20, 35, 35, 60, 1000, 0, 0, 0, 0, 1, 0, 0.75, 524288, 0, 0, 0, 20, 0], _ + [2116, 'Sneak_Attack', 'Überraschungsangriff', 5, 6.5, 0, 46, 0, 14, 0, 0, 0, 0, 0, 0, 1, 0, 5, 1, 0, 0, 524288, 2, 0, 185, 5, 0], _ + [2135, 'Trampling_Ox', 'Trampelnder_Ochse', 5, 6.5, 7, 29, 0, 14, 5, 20, 0, 0, 0, 0, 3, 4, 5, 1, 0, 0, 32768, 0, 0, 8, 8, 0], _ + [2136, 'Smoke_Powder_Defense', 'Rauchpulver_Verteidigung', 5, 6.5, 7, 31, 0, 3, 2, 6, 0, 0, 156, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 20, 0], _ + [2137, 'Confusing_Images', 'Verwirrende_Bilder', 10, 13, 5, 1, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 2, 0.75, 0, 0, 0, 0, 20, 0], _ + [2138, 'Hexers_Vigor', 'Lebenskraft_des_Verhexers', 5, 6.5, 4, 6, 0, 6, 1, 8, 0, 0, 0, 0, 0, 0, 0, 1, 0.25, 0.75, 0, 0, 0, 0, 10, 0], _ + [2139, 'Masochism', 'Masochismus', 5, 6.5, 4, 6, 0, 6, 2, 2, 5, 3, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 20, 0], _ + [2140, 'Piercing_Trap', 'Durchbohrende_Falle', 10, 13, 2, 24, 0, 21, 5, 50, 15, 60, 156, 240, 0, 0, 0, 1, 2, 0.75, 288, 0, 0, 0, 30, 0], _ + [2141, 'Companionship', 'Kameradschaft', 5, 6.5, 2, 22, 0, 10, 30, 120, 30, 120, 0, 0, 0, 0, 0, 1, 2, 0.75, 0, 0, 0, 0, 10, 0], _ + [2142, 'Feral_Aggression', 'Wilde_Aggression', 15, 19.5, 2, 22, 0, 10, 33, 33, 3, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 20, 0], _ + [2143, 'Disrupting_Shot', 'Unterbrechender_Schuss', 10, 13, 2, 25, 0, 14, 10, 40, 0, 0, 0, 0, 0, 0, 5, 1, 0.5, 1.5, 0, 0, 0, 2, 15, 0], _ + [2144, 'Volley', 'Salve', 5, 6.5, 2, 25, 0, 14, 3, 3, 1, 10, 156, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 2, 2, 0], _ + [2145, 'Expert_Focus', 'Expertenfokus', 10, 13, 2, 23, 0, 19, 1, 2, 1, 10, 0, 0, 0, 0, 0, 1, 2, 0.75, 256, 0, 0, 0, 12, 0], _ + [2146, 'Pious_Fury', 'Frommer_Zorn', 5, 6.5, 10, 44, 0, 3, 25, 25, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 8192, 0, 10, 0], _ + [2147, 'Crippling_Victory', 'Verkrüppelnder_Sieg', 0, 0, 10, 41, 0, 14, 0, 0, 10, 30, 156, 0, 0, 0, 5, 1, 0, 0, 0, 8, 0, 32, 0, 150], _ + [2148, 'Sundering_Weapon', 'Trennende_Waffe', 5, 6.5, 8, 32, 0, 25, 5, 20, 10, 10, 3, 0, 0, 0, 3, 1, 1, 0.75, 0, 0, 0, 0, 10, 0], _ + [2149, 'Weapon_of_Renewal', 'Waffe_der_Erneuerung', 5, 6.5, 8, 36, 0, 25, 1, 7, 0, 0, 0, 0, 0, 0, 3, 1, 1, 0.75, 0, 0, 0, 0, 10, 0], _ + [2150, 'Maiming_Spear', 'Verkrüppelungs_Speer', 5, 6.5, 9, 37, 0, 14, 5, 20, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 0, 8, 0, 64, 5, 0], _ + [2186, 'Signet_of_Deadly_Corruption', 'Siegel_der_tödlichen_Verdorbenheit', 0, 0, 7, 30, 0, 7, 5, 35, 130, 130, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 12, 0], _ + [2187, 'Way_of_the_Master', 'Weg_des_Meisters', 5, 6.5, 7, 35, 0, 6, 3, 33, 0, 0, 0, 0, 0, 0, 0, 1, 0.25, 0.75, 0, 0, 0, 0, 30, 0], _ + [2188, 'Defile_Defenses', 'Verteidigung_entweihen', 5, 6.5, 4, 7, 0, 4, 30, 120, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 5, 0], _ + [2189, 'Angorodons_Gaze', 'Angorodons_Starren', 5, 6.5, 4, 6, 0, 5, 10, 50, 3, 12, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 10, 0], _ + [2190, 'Magnetic_Surge', 'Magnetschub', 10, 13, 6, 9, 0, 6, 15, 75, 5, 15, 1000, 0, 0, 0, 5, 1, 1.5, 0.75, 0, 0, 0, 0, 15, 0], _ + [2191, 'Slippery_Ground', 'Rutschiger_Boden', 5, 6.5, 6, 11, 0, 5, 0, 0, 0, 0, 156, 0, 0, 0, 5, 1, 1, 0.75, 64, 0, 0, 0, 10, 0], _ + [2192, 'Glowing_Ice', 'Leuchtendes_Eis', 5, 6.5, 6, 11, 0, 5, 5, 50, 5, 5, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 8, 0], _ + [2193, 'Energy_Blast', 'Energieexplosion', 10, 13, 6, 12, 0, 5, 1, 2, 130, 130, 0, 0, 0, 0, 5, 1, 1.5, 0.75, 0, 0, 0, 0, 20, 0], _ + [2194, 'Distracting_Strike', 'Ablenkender_Stoß', 5, 6.5, 1, 46, 0, 14, 20, 20, 0, 0, 0, 0, 0, 0, 5, 1, 0.5, 0, 0, 0, 0, 185, 15, 0], _ + [2195, 'Symbolic_Strike', 'Symbolischer_Schlag', 0, 0, 1, 46, 0, 14, 12, 12, 70, 70, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 185, 0, 80], _ + [2196, 'Soldiers_Speed', 'Geschwindigkeit_des_Soldaten', 5, 6.5, 1, 21, 0, 3, 15, 15, 15, 15, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 12, 0], _ + [2197, 'Body_Blow', 'Körperschlag', 0, 0, 1, 17, 0, 14, 10, 40, 0, 15, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 185, 0, 160], _ + [2198, 'Body_Shot', 'Körperschuss', 5, 6.5, 2, 25, 0, 14, 5, 20, 5, 10, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 2, 8, 0], _ + [2199, 'Poison_Tip_Signet', 'Giftspitzen_Siegel', 0, 0, 2, 24, 0, 7, 8, 15, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 6, 0], _ + [2200, 'Signet_of_Mystic_Speed', 'Siegel_der_mystischen_Geschwindigkeit', 0, 0, 10, 42, 0, 7, 1, 3, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 20, 0], _ + [2201, 'Shield_of_Force', 'Kraftschild', 10, 13, 10, 43, 0, 6, 5, 20, 1, 1, 156, 0, 0, 0, 0, 1, 0, 0, 8388608, 1152, 0, 0, 12, 0], _ + [2202, 'Mending_Grip', 'Genesungsgriff', 5, 6.5, 8, 33, 0, 5, 15, 75, 0, 0, 0, 0, 0, 0, 3, 1, 1, 0.75, 0, 0, 0, 0, 6, 0], _ + [2203, 'Spiritleech_Aura', 'Geistsauger_Aura', 5, 6.5, 8, 33, 0, 10, 5, 20, 5, 20, 1000, 0, 0, 0, 0, 1, 0.25, 0.75, 0, 0, 0, 0, 20, 0], _ + [2204, 'Rejuvenation', 'Verjüngung', 10, 13, 8, 33, 0, 22, 1, 20, 3, 10, 1000, 0, 0, 0, 0, 1, 0.75, 0.75, 256, 0, 0, 0, 30, 0], _ + [2205, 'Agony', 'Todesqual', 10, 13, 8, 34, 0, 22, 1, 12, 3, 10, 1000, 0, 0, 0, 0, 1, 0.75, 0.75, 256, 0, 0, 0, 30, 0], _ + [2206, 'Ghostly_Weapon', 'Geisterwaffe', 5, 6.5, 8, 32, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0.25, 0.75, 0, 0, 0, 0, 1, 0], _ + [2207, 'Inspirational_Speech', 'Inspirative_Rede', 5, 6.5, 9, 39, 0, 10, 1, 4, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 20, 0], _ + [2208, 'Burning_Shield', 'Brennender_Schild', 5, 6.5, 9, 40, 0, 16, 1, 6, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 20, 0], _ + [2209, 'Holy_Spear', 'Heiliger_Speer', 0, 0, 9, 37, 0, 14, 5, 20, 15, 90, 240, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 64, 0, 100], _ + [2210, 'Spear_Swipe', 'Speerschlag', 10, 13, 9, 40, 0, 14, 5, 20, 4, 10, 0, 0, 0, 0, 5, 1, 0, 0, 2, 0, 0, 64, 20, 0], _ + [2211, 'Alkars_Alchemical_Acid', 'Alkars_Alchemiesäure', 10, 13, 0, 46, 0, 5, 45, 70, 40, 50, 156, 0, 0, 0, 5, 1, 1, 0.75, 524288, 0, 0, 0, 10, 0], _ + [2212, 'Light_of_Deldrimor', 'Licht_von_Deldrimor', 5, 6.5, 0, 46, 0, 5, 55, 80, 50, 50, 312, 0, 0, 0, 0, 1, 0.75, 0.75, 524288, 0, 0, 0, 20, 0], _ + [2213, 'Ear_Bite', 'Ohrenbiss', 0, 0, 0, 46, 0, 10, 15, 25, 50, 70, 0, 0, 0, 0, 5, 1, 0.75, 0.75, 524290, 0, 0, 0, 0, 100], _ + [2214, 'Low_Blow', 'Unter_der_Gürtellinie', 0, 0, 0, 46, 0, 10, 45, 70, 30, 50, 0, 0, 0, 0, 5, 1, 0.75, 0, 524290, 0, 0, 0, 0, 150], _ + [2215, 'Brawling_Headbutt', 'Rauf_Kopfstoß', 0, 0, 0, 46, 0, 10, 45, 70, 0, 0, 0, 0, 0, 0, 5, 1, 0.75, 0, 524290, 0, 0, 0, 0, 175], _ + [2216, 'Dont_Trip', 'Stolpert_nicht', 5, 6.5, 0, 46, 0, 15, 0, 0, 0, 0, 1000, 0, 0, 0, 0, 1, 0, 0, 524288, 0, 0, 0, 20, 0], _ + [2217, 'By_Urals_Hammer', 'Bei_Urals_Hammer', 5, 6.5, 0, 46, 0, 15, 25, 33, 0, 0, 1000, 2, 0, 0, 0, 1, 0, 0, 524288, 0, 0, 0, 60, 0], _ + [2218, 'Drunken_Master', 'Betrunkener_Meister', 5, 6.5, 0, 46, 0, 3, 10, 15, 25, 33, 0, 0, 0, 0, 0, 1, 0, 0.75, 524288, 0, 0, 0, 60, 0], _ + [2219, 'Great_Dwarf_Weapon', 'Waffe_des_Großen_Zwergs', 10, 13, 0, 46, 0, 25, 15, 20, 28, 40, 0, 0, 0, 0, 4, 1, 1, 0.75, 524288, 0, 0, 0, 5, 0], _ + [2220, 'Great_Dwarf_Armor', 'Rüstung_des_Großen_Zwergs', 5, 6.5, 0, 46, 0, 6, 24, 24, 24, 24, 60, 0, 0, 0, 3, 1, 1, 0.75, 524288, 0, 0, 0, 10, 0], _ + [2221, 'Breath_of_the_Great_Dwarf', 'Atem_des_Großen_Zwergs', 10, 13, 0, 46, 0, 5, 50, 60, 0, 0, 5000, 0, 0, 0, 0, 1, 0.25, 0.75, 524288, 0, 0, 0, 15, 0], _ + [2222, 'Snow_Storm', 'Schneesturm', 10, 13, 0, 46, 0, 5, 30, 40, 0, 0, 156, 0, 0, 0, 16, 1, 1, 0.75, 524288, 0, 0, 0, 10, 0], _ + [2223, 'Black_Powder_Mine', 'Schwarzpulvermine', 10, 13, 0, 46, 0, 21, 20, 30, 7, 10, 156, 240, 0, 0, 0, 1, 2, 0.75, 524576, 0, 0, 0, 20, 0], _ + [2224, 'Summon_Mursaat', 'Mursaat_herbeirufen', 10, 13, 0, 46, 0, 5, 14, 20, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0.75, 524288, 0, 0, 0, 60, 0], _ + [2225, 'Summon_Ruby_Djinn', 'Rubin_Dschinn_herbeirufen', 10, 13, 0, 46, 0, 5, 14, 20, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0.75, 524288, 0, 0, 0, 60, 0], _ + [2226, 'Summon_Ice_Imp', 'Eis_Kobold_herbeirufen', 10, 13, 0, 46, 0, 5, 14, 20, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0.75, 524288, 0, 0, 0, 60, 0], _ + [2227, 'Summon_Naga_Shaman', 'Naga_Schamanen_herbeirufen', 10, 13, 0, 46, 0, 5, 14, 20, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0.75, 524288, 0, 0, 0, 60, 0], _ + [2228, 'Deft_Strike', 'Geschickter_Schlag', 5, 6.5, 0, 46, 0, 14, 0, 0, 18, 30, 0, 0, 0, 0, 5, 1, 0.5, 0, 524288, 0, 0, 70, 8, 0], _ + [2229, 'Signet_of_Infection', 'Siegel_der_Infektion', 0, 0, 0, 46, 0, 7, 13, 20, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 524288, 0, 0, 0, 10, 0], _ + [2230, 'Tryptophan_Signet', 'Tryptophan_Siegel', 0, 0, 0, 46, 0, 7, 23, 40, 0, 0, 156, 0, 0, 0, 5, 1, 1, 0.75, 524288, 0, 0, 0, 15, 0], _ + [2231, 'Ebon_Battle_Standard_of_Courage', 'Ebon_Kampfstandarte_des_Mutes', 10, 13, 0, 46, 0, 11, 24, 24, 24, 24, 312, 0, 0, 0, 0, 1, 1, 0.75, 524288, 0, 0, 0, 20, 0], _ + [2232, 'Ebon_Battle_Standard_of_Wisdom', 'Ebon_Kampfstandarte_der_Weisheit', 10, 13, 0, 46, 0, 11, 44, 60, 0, 0, 312, 0, 0, 0, 0, 1, 1, 0.75, 524288, 0, 0, 0, 20, 0], _ + [2233, 'Ebon_Battle_Standard_of_Honor', 'Ebon_Kampfstandarte_der_Ehre', 10, 13, 0, 46, 0, 11, 8, 15, 7, 10, 312, 0, 0, 0, 0, 1, 1, 0.75, 524288, 0, 0, 0, 20, 0], _ + [2234, 'Ebon_Vanguard_Sniper_Support', 'Ebon_Vorhut_Heckenschützen_Unterstützung', 10, 13, 0, 46, 0, 5, 54, 90, 540, 900, 10, 25, 0, 0, 5, 1, 1, 0.75, 524288, 0, 0, 0, 15, 0], _ + [2235, 'Ebon_Vanguard_Assassin_Support', 'Ebon_Vorhut_Assassinen_Unterstützung', 10, 13, 0, 46, 0, 5, 14, 20, 12, 15, 0, 0, 0, 0, 5, 1, 1, 0.75, 524288, 0, 0, 0, 30, 0], _ + [2236, 'Well_of_Ruin', 'Brunnen_des_Ruins', 10, 13, 4, 7, 0, 9, 5, 20, 20, 20, 312, 0, 0, 0, 0, 1, 1, 0.75, 0, 0, 0, 0, 20, 0], _ + [2237, 'Atrophy', 'Schwund', 10, 13, 4, 7, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 0, 0, 0, 0, 20, 0], _ + [2238, 'Spear_of_Redemption', 'Speer_der_Erlösung', 0, 0, 9, 37, 0, 14, 5, 20, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 64, 0, 75], _ + [2353, 'Finish_Him', 'Erledigt_ihn', 10, 13, 0, 46, 0, 15, 44, 80, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 524288, 0, 0, 0, 15, 0], _ + [2354, 'Dodge_This', 'Weicht_aus', 0, 0, 0, 46, 0, 15, 14, 20, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 524288, 0, 0, 0, 0, 100], _ + [2355, 'I_Am_the_Strongest', 'Ich_bin_am_stärksten', 5, 6.5, 0, 46, 0, 15, 5, 8, 14, 20, 0, 0, 0, 0, 0, 1, 0, 0, 524288, 0, 0, 0, 20, 0], _ + [2356, 'I_Am_Unstoppable', 'Ich_bin_unaufhaltbar', 5, 6.5, 0, 46, 0, 15, 24, 24, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 524288, 0, 0, 0, 30, 0], _ + [2357, 'A_Touch_of_Guile', 'Ein_Funken_Arglist', 5, 6.5, 0, 46, 0, 4, 44, 80, 0, 0, 0, 0, 0, 0, 5, 1, 0.75, 0.75, 524290, 0, 0, 0, 15, 0], _ + [2358, 'You_Move_Like_a_Dwarf', 'Ihr_bewegt_Euch_wie_ein_Zwerg', 10, 13, 0, 46, 0, 15, 44, 80, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, 524288, 0, 0, 0, 10, 0], _ + [2359, 'You_Are_All_Weaklings', 'Ihr_seid_alle_Schwächlinge', 5, 6.5, 0, 46, 0, 15, 0, 0, 0, 0, 156, 0, 0, 0, 5, 1, 0, 0, 524288, 0, 0, 0, 12, 0], _ + [2360, 'Feel_No_Pain', 'Den_Schmerz_nicht_spüren', 5, 6.5, 0, 46, 0, 16, 2, 3, 200, 300, 0, 0, 0, 0, 0, 1, 0, 0, 524288, 0, 0, 0, 20, 0], _ + [2361, 'Club_of_a_Thousand_Bears', 'Tausend_Bären_Prügel', 5, 6.5, 0, 46, 0, 14, 6, 9, 60, 60, 156, 0, 0, 0, 5, 1, 0, 0, 524288, 0, 0, 185, 12, 0], _ + [2374, 'Ursan_Blessing', 'Segen_der_Bärin', 10, 13, 0, 46, 0, 26, 20, 20, 750, 800, 60, 60, 0, 0, 0, 1, 0, 0, 524292, 0, 0, 0, 60, 0], _ + [2379, 'Volfen_Blessing', 'Segen_des_Wolfes', 10, 13, 0, 46, 0, 26, 2, 4, 660, 700, 60, 60, 0, 0, 0, 1, 0, 0, 524292, 0, 0, 0, 60, 0], _ + [2384, 'Raven_Blessing', 'Segen_des_Raben', 10, 13, 0, 46, 0, 26, 20, 30, 660, 700, 60, 60, 0, 0, 0, 1, 0, 0, 524292, 0, 0, 0, 60, 0], _ + [2411, 'Mindbender', 'Geistbrecher', 5, 6.5, 0, 46, 0, 6, 20, 33, 20, 20, 0, 0, 0, 0, 0, 1, 1, 0.75, 524288, 0, 0, 0, 24, 0], _ + [2412, 'Smooth_Criminal', 'Durchtriebener_Krimineller', 5, 6.5, 0, 46, 0, 5, 5, 10, 0, 0, 0, 0, 0, 0, 5, 1, 1, 0.75, 524288, 0, 0, 0, 20, 0], _ + [2413, 'Technobabble', 'Technobabbel', 10, 13, 0, 46, 0, 5, 30, 40, 0, 0, 156, 0, 0, 0, 5, 1, 1, 0.75, 524288, 0, 0, 0, 10, 0], _ + [2414, 'Radiation_Field', 'Strahlungsfeld', 15, 19.5, 0, 46, 0, 11, 4, 6, 5, 5, 312, 0, 0, 0, 0, 1, 2, 0.75, 524288, 0, 0, 0, 12, 0], _ + [2415, 'Asuran_Scan', 'Asurischer_Scan', 5, 6.5, 0, 46, 0, 4, 0, 0, 5, 5, 0, 0, 0, 0, 5, 1, 0, 0.75, 524288, 0, 0, 0, 5, 0], _ + [2416, 'Air_of_Superiority', 'Hochnäsigkeit', 5, 6.5, 0, 46, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0.75, 524288, 0, 0, 0, 20, 0], _ + [2417, 'Mental_Block', 'Geistige_Sperre', 10, 13, 0, 46, 0, 6, 50, 50, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0.75, 524288, 0, 0, 0, 15, 0], _ + [2418, 'Pain_Inverter', 'Schmerztauscher', 10, 13, 0, 46, 0, 4, 100, 140, 80, 80, 0, 0, 0, 0, 5, 1, 1, 0.75, 524288, 0, 0, 0, 20, 0], _ + [2420, 'Ebon_Escape', 'Ebon_Flucht', 5, 6.5, 0, 46, 0, 5, 70, 110, 0, 0, 0, 0, 0, 0, 4, 1, 0.25, 0, 524288, 0, 0, 0, 10, 0], _ + [2421, 'Weakness_Trap', 'Schwäche_Falle', 10, 13, 0, 46, 0, 21, 10, 20, 24, 50, 156, 240, 0, 0, 0, 1, 2, 0.75, 524576, 0, 0, 0, 30, 0], _ + [2422, 'Winds', 'Winde', 5, 6.5, 0, 46, 0, 22, 4, 10, 15, 15, 2500, 0, 0, 0, 0, 1, 5, 0.75, 524288, 0, 0, 0, 30, 0], _ + [2423, 'Dwarven_Stability', 'Zwergenstabilität', 5, 6.5, 0, 46, 0, 6, 55, 100, 0, 0, 0, 0, 0, 0, 0, 1, 0.25, 0, 524288, 0, 0, 0, 30, 0], _ + [2551, 'Veteran Norn Hunting Party', 'none', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]] diff --git a/gwApi/array_skills_pvp.au3 b/gwApi/array_skills_pvp.au3 index 6209e34..15e3203 100644 --- a/gwApi/array_skills_pvp.au3 +++ b/gwApi/array_skills_pvp.au3 @@ -1,135 +1,136 @@ -#include-once - -Global $aArray_Of_Skill_PvPNames[132][2] = [ _ - [2852, 'Energy_Drain_PvP'], _ - [2853, 'Energy_Tap_PvP'], _ - [2854, 'PvP_effect'], _ - [2855, 'Ward_Against_Melee_PvP'], _ - [2856, 'Lightning_Orb_(PvP'], _ - [2857, 'Aegis_PvP'], _ - [2858, 'Watch_Yourself!_PvP'], _ - [2859, 'Enfeeble_PvP'], _ - [2860, 'Ether_Renewal_PvP'], _ - [2861, 'Penetrating_Attack_PvP'], _ - [2862, 'Shadow_Form_PvP'], _ - [2863, 'Discord_PvP'], _ - [2864, 'Sundering_Attack_PvP'], _ - [2865, 'Ritual_Lord_PvP'], _ - [2866, 'Flesh_of_My_Flesh_PvP'], _ - [2867, 'Ancestors_Rage_PvP'], _ - [2868, 'Splinter_Weapon_PvP'], _ - [2869, 'Assassins_Remedy_PvP'], _ - [2870, 'Blinding_Surge_PvP'], _ - [2871, 'Light_of_Deliverance_PvP'], _ - [2872, 'Death_Pact_Signet_PvP'], _ - [2873, 'Mystic_Sweep_PvP'], _ - [2874, 'Eremites_Attack_PvP'], _ - [2875, 'Harriers_Toss_PvP'], _ - [2876, 'Defensive_Anthem_PvP'], _ - [2877, 'Ballad_of_Restoration_PvP'], _ - [2878, 'Song_of_Restoration_PvP'], _ - [2879, 'Incoming!_PvP'], _ - [2880, 'Never_Surrender!_PvP'], _ - [2882, 'Mantra_of_Inscriptions_PvP'], _ - [2883, 'For_Great_Justice!_PvP'], _ - [2884, 'Mystic_Regeneration_PvP'], _ - [2885, 'Enfeebling_Blood_PvP'], _ - [2886, 'Summoning_Sickness'], _ - [2887, 'Signet_of_Judgment_PvP'], _ - [2888, 'Chilling_Victory_PvP'], _ - [2891, 'Unyielding_Aura_(PvP'], _ - [2892, 'Spirit_Bond_PvP'], _ - [2893, 'Weapon_of_Warding_PvP'], _ - [2895, 'Smiters_Boon_PvP'], _ - [2925, 'Sloth_Hunters_Shot_PvP'], _ - [2959, 'Experts_Dexterity_PVP'], _ - [2965, 'Signet_of_Spirits_PvP'], _ - [2966, 'Signet_of_Ghostly_Might_PvP'], _ - [2967, 'Avatar_of_Grenth_PvP'], _ - [2969, 'Read_the_Wind_PvP'], _ - [2998, 'Fragility_PvP'], _ - [2999, 'Strength_of_Honor_PvP'], _ - [3002, 'Warriors_Endurance_PvP'], _ - [3003, 'Armor_of_Unfeeling_PvP'], _ - [3004, 'Signet_of_Creation_PvP'], _ - [3005, 'Union_PvP'], _ - [3006, 'Shadowsong_PvP'], _ - [3007, 'Pain_PvP'], _ - [3008, 'Destruction_PvP'], _ - [3009, 'Soothing_PvP'], _ - [3010, 'Displacement_PvP'], _ - [3011, 'Preservation_PvP'], _ - [3012, 'Life_PvP'], _ - [3013, 'Recuperation_PvP'], _ - [3014, 'Dissonance_PvP'], _ - [3015, 'Earthbind_PvP'], _ - [3016, 'Shelter_PvP'], _ - [3017, 'Disenchantment_PvP'], _ - [3018, 'Restoration_PvP'], _ - [3019, 'Bloodsong_PvP'], _ - [3020, 'Wanderlust_PvP'], _ - [3021, 'Savannah_Heat_PvP'], _ - [3022, 'Gaze_of_Fury_PvP'], _ - [3023, 'Anguish_PvP'], _ - [3024, 'Empowerment_PvP'], _ - [3025, 'Recovery_PvP'], _ - [3026, 'Go_for_the_Eyes!_PvP'], _ - [3027, 'Brave_Yourself!_PvP'], _ - [3028, 'Blazing_Finale_PvP'], _ - [3029, 'Bladeturn_Refrain_PvP'], _ - [3030, 'Signet_of_Return_PvP'], _ - [3031, 'Cant_Touch_This!_PvP'], _ - [3032, 'Stand_Your_Ground!_PvP'], _ - [3033, 'We_Shall_Return!_PvP'], _ - [3034, 'Find_Their_Weakness!_PvP'], _ - [3035, 'Never_Give_Up!_PvP'], _ - [3036, 'Help_Me!_PvP'], _ - [3037, 'Fall_Back!_PvP'], _ - [3038, 'Agony_PvP'], _ - [3039, 'Rejuvenation_PvP'], _ - [3040, 'Anthem_of_Disruption_PvP'], _ - [3045, 'Comfort_Animal_PvP'], _ - [3047, 'Melandrus_Assault_PvP'], _ - [3048, 'Shroud_of_Distress_PvP'], _ - [3049, 'Unseen_Fury_PvP'], _ - [3050, 'Predatory_Bond_PvP'], _ - [3051, 'Enraged_Lunge_PvP'], _ - [3052, 'Conviction_PvP'], _ - [3053, 'Signet_of_Deadly_Corruption_PvP'], _ - [3054, 'Masochism_PvP'], _ - [3058, 'Unholy_Feast_PvP'], _ - [3059, 'Signet_of_Agony_PvP'], _ - [3060, 'Escape_PvP'], _ - [3061, 'Death_Blossom_PvP'], _ - [3062, 'Finale_of_Restoration_PvP'], _ - [3063, 'Mantra_of_Resolve_PvP'], _ - [3140, 'Staggering_Blow_PvP'], _ - [3141, 'Lightning_Reflexes_PvP'], _ - [3142, 'Fierce_Blow_PvP'], _ - [3143, 'Renewing_Smash_PvP'], _ - [3144, 'Heal_as_One_PvP'], _ - [3145, 'Glass_Arrows_PvP'], _ - [3146, 'Protective_Was_Kaolai_PvP'], _ - [3147, 'Keen_Arrow_PvP'], _ - [3148, 'Anthem_of_Envy_PvP'], _ - [3149, 'Mending_Refrain_PvP'], _ - [3156, 'Soldiers_Stance_PvP'], _ - [3157, 'Destructive_Was_Glaive_PvP'], _ - [3179, 'Mantra_of_Signets_PvP'], _ - [3180, 'Shatter_Delusions_PvP'], _ - [3181, 'Illusionary_Weaponry_PvP'], _ - [3182, 'Panic_PvP'], _ - [3183, 'Migraine_PvP'], _ - [3184, 'Accumulated_Pain_PvP'], _ - [3185, 'Psychic_Instability_PvP'], _ - [3186, 'Shared_Burden_PvP'], _ - [3187, 'Stolen_Speed_PvP'], _ - [3188, 'Unnatural_Signet_PvP'], _ - [3189, 'Spiritual_Pain_PvP'], _ - [3190, 'Frustration_PvP'], _ - [3191, 'Mistrust_PvP'], _ - [3192, 'Enchanters_Conundrum_PvP'], _ - [3193, 'Signet_of_Clumsiness_PvP'], _ - [3194, 'Mirror_of_Disenchantment_PvP'], _ - [3195, 'Wandering_Eye_PvP'], _ - [3196, 'Calculated_Risk_PvP']] \ No newline at end of file +135 +#include-once + +Global $aArray_Of_Skill_PvPNames[132][2] = [ _ + [2852, 'Energy_Drain_PvP'], _ + [2853, 'Energy_Tap_PvP'], _ + [2854, 'PvP_effect'], _ + [2855, 'Ward_Against_Melee_PvP'], _ + [2856, 'Lightning_Orb_(PvP'], _ + [2857, 'Aegis_PvP'], _ + [2858, 'Watch_Yourself!_PvP'], _ + [2859, 'Enfeeble_PvP'], _ + [2860, 'Ether_Renewal_PvP'], _ + [2861, 'Penetrating_Attack_PvP'], _ + [2862, 'Shadow_Form_PvP'], _ + [2863, 'Discord_PvP'], _ + [2864, 'Sundering_Attack_PvP'], _ + [2865, 'Ritual_Lord_PvP'], _ + [2866, 'Flesh_of_My_Flesh_PvP'], _ + [2867, 'Ancestors_Rage_PvP'], _ + [2868, 'Splinter_Weapon_PvP'], _ + [2869, 'Assassins_Remedy_PvP'], _ + [2870, 'Blinding_Surge_PvP'], _ + [2871, 'Light_of_Deliverance_PvP'], _ + [2872, 'Death_Pact_Signet_PvP'], _ + [2873, 'Mystic_Sweep_PvP'], _ + [2874, 'Eremites_Attack_PvP'], _ + [2875, 'Harriers_Toss_PvP'], _ + [2876, 'Defensive_Anthem_PvP'], _ + [2877, 'Ballad_of_Restoration_PvP'], _ + [2878, 'Song_of_Restoration_PvP'], _ + [2879, 'Incoming!_PvP'], _ + [2880, 'Never_Surrender!_PvP'], _ + [2882, 'Mantra_of_Inscriptions_PvP'], _ + [2883, 'For_Great_Justice!_PvP'], _ + [2884, 'Mystic_Regeneration_PvP'], _ + [2885, 'Enfeebling_Blood_PvP'], _ + [2886, 'Summoning_Sickness'], _ + [2887, 'Signet_of_Judgment_PvP'], _ + [2888, 'Chilling_Victory_PvP'], _ + [2891, 'Unyielding_Aura_(PvP'], _ + [2892, 'Spirit_Bond_PvP'], _ + [2893, 'Weapon_of_Warding_PvP'], _ + [2895, 'Smiters_Boon_PvP'], _ + [2925, 'Sloth_Hunters_Shot_PvP'], _ + [2959, 'Experts_Dexterity_PVP'], _ + [2965, 'Signet_of_Spirits_PvP'], _ + [2966, 'Signet_of_Ghostly_Might_PvP'], _ + [2967, 'Avatar_of_Grenth_PvP'], _ + [2969, 'Read_the_Wind_PvP'], _ + [2998, 'Fragility_PvP'], _ + [2999, 'Strength_of_Honor_PvP'], _ + [3002, 'Warriors_Endurance_PvP'], _ + [3003, 'Armor_of_Unfeeling_PvP'], _ + [3004, 'Signet_of_Creation_PvP'], _ + [3005, 'Union_PvP'], _ + [3006, 'Shadowsong_PvP'], _ + [3007, 'Pain_PvP'], _ + [3008, 'Destruction_PvP'], _ + [3009, 'Soothing_PvP'], _ + [3010, 'Displacement_PvP'], _ + [3011, 'Preservation_PvP'], _ + [3012, 'Life_PvP'], _ + [3013, 'Recuperation_PvP'], _ + [3014, 'Dissonance_PvP'], _ + [3015, 'Earthbind_PvP'], _ + [3016, 'Shelter_PvP'], _ + [3017, 'Disenchantment_PvP'], _ + [3018, 'Restoration_PvP'], _ + [3019, 'Bloodsong_PvP'], _ + [3020, 'Wanderlust_PvP'], _ + [3021, 'Savannah_Heat_PvP'], _ + [3022, 'Gaze_of_Fury_PvP'], _ + [3023, 'Anguish_PvP'], _ + [3024, 'Empowerment_PvP'], _ + [3025, 'Recovery_PvP'], _ + [3026, 'Go_for_the_Eyes!_PvP'], _ + [3027, 'Brave_Yourself!_PvP'], _ + [3028, 'Blazing_Finale_PvP'], _ + [3029, 'Bladeturn_Refrain_PvP'], _ + [3030, 'Signet_of_Return_PvP'], _ + [3031, 'Cant_Touch_This!_PvP'], _ + [3032, 'Stand_Your_Ground!_PvP'], _ + [3033, 'We_Shall_Return!_PvP'], _ + [3034, 'Find_Their_Weakness!_PvP'], _ + [3035, 'Never_Give_Up!_PvP'], _ + [3036, 'Help_Me!_PvP'], _ + [3037, 'Fall_Back!_PvP'], _ + [3038, 'Agony_PvP'], _ + [3039, 'Rejuvenation_PvP'], _ + [3040, 'Anthem_of_Disruption_PvP'], _ + [3045, 'Comfort_Animal_PvP'], _ + [3047, 'Melandrus_Assault_PvP'], _ + [3048, 'Shroud_of_Distress_PvP'], _ + [3049, 'Unseen_Fury_PvP'], _ + [3050, 'Predatory_Bond_PvP'], _ + [3051, 'Enraged_Lunge_PvP'], _ + [3052, 'Conviction_PvP'], _ + [3053, 'Signet_of_Deadly_Corruption_PvP'], _ + [3054, 'Masochism_PvP'], _ + [3058, 'Unholy_Feast_PvP'], _ + [3059, 'Signet_of_Agony_PvP'], _ + [3060, 'Escape_PvP'], _ + [3061, 'Death_Blossom_PvP'], _ + [3062, 'Finale_of_Restoration_PvP'], _ + [3063, 'Mantra_of_Resolve_PvP'], _ + [3140, 'Staggering_Blow_PvP'], _ + [3141, 'Lightning_Reflexes_PvP'], _ + [3142, 'Fierce_Blow_PvP'], _ + [3143, 'Renewing_Smash_PvP'], _ + [3144, 'Heal_as_One_PvP'], _ + [3145, 'Glass_Arrows_PvP'], _ + [3146, 'Protective_Was_Kaolai_PvP'], _ + [3147, 'Keen_Arrow_PvP'], _ + [3148, 'Anthem_of_Envy_PvP'], _ + [3149, 'Mending_Refrain_PvP'], _ + [3156, 'Soldiers_Stance_PvP'], _ + [3157, 'Destructive_Was_Glaive_PvP'], _ + [3179, 'Mantra_of_Signets_PvP'], _ + [3180, 'Shatter_Delusions_PvP'], _ + [3181, 'Illusionary_Weaponry_PvP'], _ + [3182, 'Panic_PvP'], _ + [3183, 'Migraine_PvP'], _ + [3184, 'Accumulated_Pain_PvP'], _ + [3185, 'Psychic_Instability_PvP'], _ + [3186, 'Shared_Burden_PvP'], _ + [3187, 'Stolen_Speed_PvP'], _ + [3188, 'Unnatural_Signet_PvP'], _ + [3189, 'Spiritual_Pain_PvP'], _ + [3190, 'Frustration_PvP'], _ + [3191, 'Mistrust_PvP'], _ + [3192, 'Enchanters_Conundrum_PvP'], _ + [3193, 'Signet_of_Clumsiness_PvP'], _ + [3194, 'Mirror_of_Disenchantment_PvP'], _ + [3195, 'Wandering_Eye_PvP'], _ + [3196, 'Calculated_Risk_PvP']] diff --git a/gwApi/characterinfo.au3 b/gwApi/characterinfo.au3 index 1db9dce..42f4b40 100644 --- a/gwApi/characterinfo.au3 +++ b/gwApi/characterinfo.au3 @@ -1,189 +1,190 @@ -#include-once - -#Region Titles -;~ Description: Returns Hero title progress. -Func GetHeroTitle() - If $TitlesPtr = 0 Then $TitlesPtr = MemoryRead($mBasePtr182C + 0x81C) - Return MemoryRead($TitlesPtr + 0x4) -EndFunc ;==>GetHeroTitle - -;~ Description: Returns Gladiator title progress. -Func GetGladiatorTitle() - If $TitlesPtr = 0 Then $TitlesPtr = MemoryRead($mBasePtr182C + 0x81C) - Return MemoryRead($TitlesPtr + 0x7C) -EndFunc ;==>GetGladiatorTitle - -;~ Description: Returns Kurzick title progress. -Func GetKurzickTitle() - If $TitlesPtr = 0 Then $TitlesPtr = MemoryRead($mBasePtr182C + 0x81C) - Return MemoryRead($TitlesPtr + 0xCC) -EndFunc ;==>GetKurzickTitle - -;~ Description: Returns Luxon title progress. -Func GetLuxonTitle() - If $TitlesPtr = 0 Then $TitlesPtr = MemoryRead($mBasePtr182C + 0x81C) - Return MemoryRead($TitlesPtr + 0xF4) -EndFunc ;==>GetLuxonTitle - -;~ Description: Returns drunkard title progress. -Func GetDrunkardTitle() - If $TitlesPtr = 0 Then $TitlesPtr = MemoryRead($mBasePtr182C + 0x81C) - Return MemoryRead($TitlesPtr + 0x11C) -EndFunc ;==>GetDrunkardTitle - -;~ Description: Returns survivor title progress. -Func GetSurvivorTitle() - If $TitlesPtr = 0 Then $TitlesPtr = MemoryRead($mBasePtr182C + 0x81C) - Return MemoryRead($TitlesPtr + 0x16C) -EndFunc ;==>GetSurvivorTitle - -;~ Description: Returns max titles -Func GetMaxTitles() - If $TitlesPtr = 0 Then $TitlesPtr = MemoryRead($mBasePtr182C + 0x81C) - Return MemoryRead($TitlesPtr + 0x194) -EndFunc ;==>GetMaxTitles - -;~ Description: Returns lucky title progress. -Func GetLuckyTitle() - If $TitlesPtr = 0 Then $TitlesPtr = MemoryRead($mBasePtr182C + 0x81C) - Return MemoryRead($TitlesPtr + 0x25C) -EndFunc ;==>GetLuckyTitle - -;~ Description: Returns unlucky title progress. -Func GetUnluckyTitle() - If $TitlesPtr = 0 Then $TitlesPtr = MemoryRead($mBasePtr182C + 0x81C) - Return MemoryRead($TitlesPtr + 0x284) -EndFunc ;==>GetUnluckyTitle - -;~ Description: Returns Sunspear title progress. -Func GetSunspearTitle() - If $TitlesPtr = 0 Then $TitlesPtr = MemoryRead($mBasePtr182C + 0x81C) - Return MemoryRead($TitlesPtr + 0x2AC) -EndFunc ;==>GetSunspearTitle - -;~ Description: Returns Lightbringer title progress. -Func GetLightbringerTitle() - If $TitlesPtr = 0 Then $TitlesPtr = MemoryRead($mBasePtr182C + 0x81C) - Return MemoryRead($TitlesPtr + 0x324) -EndFunc ;==>GetLightbringerTitle - -;~ Description: Returns Commander title progress. -Func GetCommanderTitle() - If $TitlesPtr = 0 Then $TitlesPtr = MemoryRead($mBasePtr182C + 0x81C) - Return MemoryRead($TitlesPtr + 0x374) -EndFunc ;==>GetCommanderTitle - -;~ Description: Returns Gamer title progress. -Func GetGamerTitle() - If $TitlesPtr = 0 Then $TitlesPtr = MemoryRead($mBasePtr182C + 0x81C) - Return MemoryRead($TitlesPtr + 0x39C) -EndFunc ;==>GetGamerTitle - -;~ Description: Returns Legendary Guardian title progress. -Func GetLegendaryGuardianTitle() - If $TitlesPtr = 0 Then $TitlesPtr = MemoryRead($mBasePtr182C + 0x81C) - Return MemoryRead($TitlesPtr + 0x4DC) -EndFunc ;==>GetLegendaryGuardianTitle - -;~ Description: Returns sweets title progress. -Func GetSweetTitle() - If $TitlesPtr = 0 Then $TitlesPtr = MemoryRead($mBasePtr182C + 0x81C) - Return MemoryRead($TitlesPtr + 0x554) -EndFunc ;==>GetSweetTitle - -;~ Description: Returns Asura title progress. -Func GetAsuraTitle() - If $TitlesPtr = 0 Then $TitlesPtr = MemoryRead($mBasePtr182C + 0x81C) - Return MemoryRead($TitlesPtr + 0x5F4) -EndFunc ;==>GetAsuraTitle - -;~ Description: Returns Deldrimor title progress. -Func GetDeldrimorTitle() - If $TitlesPtr = 0 Then $TitlesPtr = MemoryRead($mBasePtr182C + 0x81C) - Return MemoryRead($TitlesPtr + 0x61C) -EndFunc ;==>GetDeldrimorTitle - -;~ Description: Returns Vanguard title progress. -Func GetVanguardTitle() - If $TitlesPtr = 0 Then $TitlesPtr = MemoryRead($mBasePtr182C + 0x81C) - Return MemoryRead($TitlesPtr + 0x644) -EndFunc ;==>GetVanguardTitle - -;~ Description: Returns Norn title progress. -Func GetNornTitle() - If $TitlesPtr = 0 Then $TitlesPtr = MemoryRead($mBasePtr182C + 0x81C) - Return MemoryRead($TitlesPtr + 0x66C) -EndFunc ;==>GetNornTitle - -;~ Description: Returns mastery of the north title progress. -Func GetNorthMasteryTitle() - If $TitlesPtr = 0 Then $TitlesPtr = MemoryRead($mBasePtr182C + 0x81C) - Return MemoryRead($TitlesPtr + 0x694) -EndFunc ;==>GetNorthMasteryTitle - -;~ Description: Returns party title progress. -Func GetPartyTitle() - If $TitlesPtr = 0 Then $TitlesPtr = MemoryRead($mBasePtr182C + 0x81C) - Return MemoryRead($TitlesPtr + 0x6BC) -EndFunc ;==>GetPartyTitle - -;~ Description: Returns Zaishen title progress. -Func GetZaishenTitle() - If $TitlesPtr = 0 Then $TitlesPtr = MemoryRead($mBasePtr182C + 0x81C) - Return MemoryRead($TitlesPtr + 0x6E4) -EndFunc ;==>GetZaishenTitle - -;~ Description: Returns treasure hunter title progress. -Func GetTreasureTitle() - If $TitlesPtr = 0 Then $TitlesPtr = MemoryRead($mBasePtr182C + 0x81C) - Return MemoryRead($TitlesPtr + 0x70C) -EndFunc ;==>GetTreasureTitle - -;~ Description: Returns wisdom title progress. -Func GetWisdomTitle() - If $TitlesPtr = 0 Then $TitlesPtr = MemoryRead($mBasePtr182C + 0x81C) - Return MemoryRead($TitlesPtr + 0x734) -EndFunc ;==>GetWisdomTitle - -#Region SetTitle -;~ Description: Set the currently displayed title. -;~ Author: Skaldish -;~ No Title = 0x00 -;~ Spearmarshall = 0x11 -;~ Lightbringer = 0x14 -;~ Asuran = 0x26 -;~ Dwarven = 0x27 -;~ Ebon Vanguard = 0x28 -;~ Norn = 0x29 -Func SetDisplayedTitle($aTitle = 0) - If $aTitle Then - Return SendPacket(0x8, 0x51, $aTitle) - Else - Return SendPacket(0x4, 0x52) - EndIf -EndFunc ;==>SetDisplayedTitle -#EndRegion -#EndRegion Titles - -#Region Misc -;~ Description: Returns current amount of skillpoints. -Func GetSkillpoints() - Return MemoryRead($mBasePtr182C + 0x7A8) -EndFunc ;==>GetSkillpoints - -;~ Description: Returns amount of experience. -Func GetExperience() - Return MemoryRead($mBasePtr182C + 0x740) -EndFunc ;==>GetExperience - -;~ Description: Returns current morale. -Func GetMorale($aHeroNumber = 0, $aHeroID = GetHeroID($aHeroNumber)) - Static Local $lIndex = 0 - If $lIndex = 0 Then $lIndex = MemoryRead($mBasePtr182C + 0x638) - Static Local $lMoraleBasePtr = 0 - If $lMoraleBasePtr = 0 Then $lMoraleBasePtr = MemoryRead($mBasePtr182C + 0x62C) - Local $lTemp = MemoryRead($lMoraleBasePtr + 8 + 0xC * BitAND($aHeroID, $lIndex), 'ptr') - Return MemoryRead($lTemp + 0x18, 'long') - 100 -EndFunc ;==>GetMorale -#EndRegion - + +#include-once + +#Region Titles +;~ Description: Returns Hero title progress. +Func GetHeroTitle() + If $TitlesPtr = 0 Then $TitlesPtr = MemoryRead($mBasePtr182C + 0x81C) + Return MemoryRead($TitlesPtr + 0x4) +EndFunc ;==>GetHeroTitle + +;~ Description: Returns Gladiator title progress. +Func GetGladiatorTitle() + If $TitlesPtr = 0 Then $TitlesPtr = MemoryRead($mBasePtr182C + 0x81C) + Return MemoryRead($TitlesPtr + 0x7C) +EndFunc ;==>GetGladiatorTitle + +;~ Description: Returns Kurzick title progress. +Func GetKurzickTitle() + If $TitlesPtr = 0 Then $TitlesPtr = MemoryRead($mBasePtr182C + 0x81C) + Return MemoryRead($TitlesPtr + 0xCC) +EndFunc ;==>GetKurzickTitle + +;~ Description: Returns Luxon title progress. +Func GetLuxonTitle() + If $TitlesPtr = 0 Then $TitlesPtr = MemoryRead($mBasePtr182C + 0x81C) + Return MemoryRead($TitlesPtr + 0xF4) +EndFunc ;==>GetLuxonTitle + +;~ Description: Returns drunkard title progress. +Func GetDrunkardTitle() + If $TitlesPtr = 0 Then $TitlesPtr = MemoryRead($mBasePtr182C + 0x81C) + Return MemoryRead($TitlesPtr + 0x11C) +EndFunc ;==>GetDrunkardTitle + +;~ Description: Returns survivor title progress. +Func GetSurvivorTitle() + If $TitlesPtr = 0 Then $TitlesPtr = MemoryRead($mBasePtr182C + 0x81C) + Return MemoryRead($TitlesPtr + 0x16C) +EndFunc ;==>GetSurvivorTitle + +;~ Description: Returns max titles +Func GetMaxTitles() + If $TitlesPtr = 0 Then $TitlesPtr = MemoryRead($mBasePtr182C + 0x81C) + Return MemoryRead($TitlesPtr + 0x194) +EndFunc ;==>GetMaxTitles + +;~ Description: Returns lucky title progress. +Func GetLuckyTitle() + If $TitlesPtr = 0 Then $TitlesPtr = MemoryRead($mBasePtr182C + 0x81C) + Return MemoryRead($TitlesPtr + 0x25C) +EndFunc ;==>GetLuckyTitle + +;~ Description: Returns unlucky title progress. +Func GetUnluckyTitle() + If $TitlesPtr = 0 Then $TitlesPtr = MemoryRead($mBasePtr182C + 0x81C) + Return MemoryRead($TitlesPtr + 0x284) +EndFunc ;==>GetUnluckyTitle + +;~ Description: Returns Sunspear title progress. +Func GetSunspearTitle() + If $TitlesPtr = 0 Then $TitlesPtr = MemoryRead($mBasePtr182C + 0x81C) + Return MemoryRead($TitlesPtr + 0x2AC) +EndFunc ;==>GetSunspearTitle + +;~ Description: Returns Lightbringer title progress. +Func GetLightbringerTitle() + If $TitlesPtr = 0 Then $TitlesPtr = MemoryRead($mBasePtr182C + 0x81C) + Return MemoryRead($TitlesPtr + 0x324) +EndFunc ;==>GetLightbringerTitle + +;~ Description: Returns Commander title progress. +Func GetCommanderTitle() + If $TitlesPtr = 0 Then $TitlesPtr = MemoryRead($mBasePtr182C + 0x81C) + Return MemoryRead($TitlesPtr + 0x374) +EndFunc ;==>GetCommanderTitle + +;~ Description: Returns Gamer title progress. +Func GetGamerTitle() + If $TitlesPtr = 0 Then $TitlesPtr = MemoryRead($mBasePtr182C + 0x81C) + Return MemoryRead($TitlesPtr + 0x39C) +EndFunc ;==>GetGamerTitle + +;~ Description: Returns Legendary Guardian title progress. +Func GetLegendaryGuardianTitle() + If $TitlesPtr = 0 Then $TitlesPtr = MemoryRead($mBasePtr182C + 0x81C) + Return MemoryRead($TitlesPtr + 0x4DC) +EndFunc ;==>GetLegendaryGuardianTitle + +;~ Description: Returns sweets title progress. +Func GetSweetTitle() + If $TitlesPtr = 0 Then $TitlesPtr = MemoryRead($mBasePtr182C + 0x81C) + Return MemoryRead($TitlesPtr + 0x554) +EndFunc ;==>GetSweetTitle + +;~ Description: Returns Asura title progress. +Func GetAsuraTitle() + If $TitlesPtr = 0 Then $TitlesPtr = MemoryRead($mBasePtr182C + 0x81C) + Return MemoryRead($TitlesPtr + 0x5F4) +EndFunc ;==>GetAsuraTitle + +;~ Description: Returns Deldrimor title progress. +Func GetDeldrimorTitle() + If $TitlesPtr = 0 Then $TitlesPtr = MemoryRead($mBasePtr182C + 0x81C) + Return MemoryRead($TitlesPtr + 0x61C) +EndFunc ;==>GetDeldrimorTitle + +;~ Description: Returns Vanguard title progress. +Func GetVanguardTitle() + If $TitlesPtr = 0 Then $TitlesPtr = MemoryRead($mBasePtr182C + 0x81C) + Return MemoryRead($TitlesPtr + 0x644) +EndFunc ;==>GetVanguardTitle + +;~ Description: Returns Norn title progress. +Func GetNornTitle() + If $TitlesPtr = 0 Then $TitlesPtr = MemoryRead($mBasePtr182C + 0x81C) + Return MemoryRead($TitlesPtr + 0x66C) +EndFunc ;==>GetNornTitle + +;~ Description: Returns mastery of the north title progress. +Func GetNorthMasteryTitle() + If $TitlesPtr = 0 Then $TitlesPtr = MemoryRead($mBasePtr182C + 0x81C) + Return MemoryRead($TitlesPtr + 0x694) +EndFunc ;==>GetNorthMasteryTitle + +;~ Description: Returns party title progress. +Func GetPartyTitle() + If $TitlesPtr = 0 Then $TitlesPtr = MemoryRead($mBasePtr182C + 0x81C) + Return MemoryRead($TitlesPtr + 0x6BC) +EndFunc ;==>GetPartyTitle + +;~ Description: Returns Zaishen title progress. +Func GetZaishenTitle() + If $TitlesPtr = 0 Then $TitlesPtr = MemoryRead($mBasePtr182C + 0x81C) + Return MemoryRead($TitlesPtr + 0x6E4) +EndFunc ;==>GetZaishenTitle + +;~ Description: Returns treasure hunter title progress. +Func GetTreasureTitle() + If $TitlesPtr = 0 Then $TitlesPtr = MemoryRead($mBasePtr182C + 0x81C) + Return MemoryRead($TitlesPtr + 0x70C) +EndFunc ;==>GetTreasureTitle + +;~ Description: Returns wisdom title progress. +Func GetWisdomTitle() + If $TitlesPtr = 0 Then $TitlesPtr = MemoryRead($mBasePtr182C + 0x81C) + Return MemoryRead($TitlesPtr + 0x734) +EndFunc ;==>GetWisdomTitle + +#Region SetTitle +;~ Description: Set the currently displayed title. +;~ Author: Skaldish +;~ No Title = 0x00 +;~ Spearmarshall = 0x11 +;~ Lightbringer = 0x14 +;~ Asuran = 0x26 +;~ Dwarven = 0x27 +;~ Ebon Vanguard = 0x28 +;~ Norn = 0x29 +Func SetDisplayedTitle($aTitle = 0) + If $aTitle Then + Return SendPacket(0x8, $CtoGS_MSG_SetDisplayedTitle, $aTitle) ;~ old -> Return SendPacket(0x8, 0x51, $aTitle) + Else + Return SendPacket(0x4, $CtoGS_MSG_RemoveDisplayedTitle) ;~ old -> Return SendPacket(0x4, 0x52) + EndIf +EndFunc ;==>SetDisplayedTitle +#EndRegion +#EndRegion Titles + +#Region Misc +;~ Description: Returns current amount of skillpoints. +Func GetSkillpoints() + Return MemoryRead($mBasePtr182C + 0x7A8) +EndFunc ;==>GetSkillpoints + +;~ Description: Returns amount of experience. +Func GetExperience() + Return MemoryRead($mBasePtr182C + 0x740) +EndFunc ;==>GetExperience + +;~ Description: Returns current morale. +Func GetMorale($aHeroNumber = 0, $aHeroID = GetHeroID($aHeroNumber)) + Static Local $lIndex = 0 + If $lIndex = 0 Then $lIndex = MemoryRead($mBasePtr182C + 0x638) + Static Local $lMoraleBasePtr = 0 + If $lMoraleBasePtr = 0 Then $lMoraleBasePtr = MemoryRead($mBasePtr182C + 0x62C) + Local $lTemp = MemoryRead($lMoraleBasePtr + 8 + 0xC * BitAND($aHeroID, $lIndex), 'ptr') + Return MemoryRead($lTemp + 0x18, 'long') - 100 +EndFunc ;==>GetMorale +#EndRegion + diff --git a/gwApi/chat.au3 b/gwApi/chat.au3 index 43c604a..d5343ec 100644 --- a/gwApi/chat.au3 +++ b/gwApi/chat.au3 @@ -1,125 +1,126 @@ -#include-once - -#Region ChatControl -;~ Description: Write a message in chat (can only be seen by botter). -Func WriteChat($aMessage, $aSender = 'GWA²') - Local $lMessage, $lSender - Local $lAddress = 256 * $mQueueCounter + $mQueueBase - If $mQueueCounter = $mQueueSize Then - $mQueueCounter = 0 - Else - $mQueueCounter = $mQueueCounter + 1 - EndIf - If StringLen($aSender) > 19 Then - $lSender = StringLeft($aSender, 19) - Else - $lSender = $aSender - EndIf - MemoryWrite($lAddress + 4, $lSender, 'wchar[20]') - If StringLen($aMessage) > 100 Then - $lMessage = StringLeft($aMessage, 100) - Else - $lMessage = $aMessage - EndIf - MemoryWrite($lAddress + 44, $lMessage, 'wchar[101]') - Local $lRet = DllCall($mKernelHandle, 'int', 'WriteProcessMemory', 'handle', $mGWProcHandle, 'ptr', $lAddress, 'ptr', $mWriteChatPtr, 'ulong_ptr', 4, 'ulong_ptr*', 0) - If StringLen($aMessage) > 100 Then WriteChat(StringTrimLeft($aMessage, 100), $aSender) - Return SetExtended($lRet[5], $lRet <> 0) -EndFunc ;==>WriteChat - -;~ Description: Send a whisper to another player. -Func SendWhisper($aReceiver, $aMessage) - Local $lTotal = 'whisper ' & $aReceiver & ',' & $aMessage - If StringLen($lTotal) > 120 Then - Local $lMessage = StringLeft($lTotal, 120) - Else - Local $lMessage = $lTotal - EndIf - Local $lReturn = SendChat($lMessage, '/') - If StringLen($lTotal) > 120 Then SendWhisper($aReceiver, StringTrimLeft($lTotal, 120)) - Return $lReturn -EndFunc ;==>SendWhisper - -;~ Description: Send a message to chat. -Func SendChat($aMessage, $aChannel = '!') - Local $lMessage - Local $lAddress = 256 * $mQueueCounter + $mQueueBase - If $mQueueCounter = $mQueueSize Then - $mQueueCounter = 0 - Else - $mQueueCounter = $mQueueCounter + 1 - EndIf - If StringLen($aMessage) > 120 Then - $lMessage = StringLeft($aMessage, 120) - Else - $lMessage = $aMessage - EndIf - MemoryWrite($lAddress + 8, $aChannel & $lMessage, 'wchar[122]') - Local $lRet = DllCall($mKernelHandle, 'int', 'WriteProcessMemory', 'handle', $mGWProcHandle, 'ptr', $lAddress, 'ptr', $mSendChatPtr, 'ulong_ptr', 8, 'ulong_ptr*', 0) - If StringLen($aMessage) > 120 Then SendChat(StringTrimLeft($aMessage, 120), $aChannel) - Return SetExtended($lRet[5], $lRet <> 0) -EndFunc ;==>SendChat - -;~ Description: Writes text to chat. -Func Update($aText, $aFlag = '') - If $OldGuiText == $aText Then Return -;~ Out($aText) - $OldGuiText = $aText - If $WriteIGChat Then WriteChat($aText, $aFlag) -;~ ConsoleWrite($aText & @CRLF) -OUT($aText) -EndFunc ;==>Update -#EndRegion Chat - -#Region ChatSends -;~ Description: Kneel. -Func Kneel() - Update("Kneel") - Return SendChat('kneel', '/') -EndFunc ;==>Kneel - -;~ Description: Stuck. -Func Stuck() - Return SendChat('stuck', '/') -EndFunc ;==>Stuck - -;~ Description: Resign. -Func Resign() - Return SendChat('resign', '/') -EndFunc ;==>Resign - -;~ Description: Resigns and returns to main function. -Func ResignAndWaitForReturn($aTimeOut = 60000) - Local $lOldPartyValue = MemoryRead($mBasePtr184C + 0x14) - Sleep(3000) - Local $lDeadlock = TimerInit() - Update("Resigning") - Resign() - Do - If TimerDiff($lDeadlock) > $aTimeout Then Return - Sleep(1000) - Until MemoryRead($mBasePtr184C + 0x14) <> $lOldPartyValue - Sleep(1000) - Update("Returning To Outpost") - ReturnToOutpost() - Return WaitMapLoading() -EndFunc ;==>ResignAndReturn - -;~ Description: Resigns and returns to main function. -Func ResignAndWaitForReturn_($aTimeOut = 60000) - Sleep(3000) - For $i = 1 To 10 - Update("Resigning") - Resign() - Sleep(4000) - Update("Returning To Outpost") - ReturnToOutpost() - Sleep(1000) - If GetMapLoading() <> 1 Then ExitLoop - Next - For $i = 1 To 10 - Sleep(2000) - If GetMapLoading() = 0 Then Return SetPointers() - Next -EndFunc ;==>ResignAndReturn -#EndRegion \ No newline at end of file + +#include-once + +#Region ChatControl +;~ Description: Write a message in chat (can only be seen by botter). +Func WriteChat($aMessage, $aSender = 'GWA²') + Local $lMessage, $lSender + Local $lAddress = 256 * $mQueueCounter + $mQueueBase + If $mQueueCounter = $mQueueSize Then + $mQueueCounter = 0 + Else + $mQueueCounter = $mQueueCounter + 1 + EndIf + If StringLen($aSender) > 19 Then + $lSender = StringLeft($aSender, 19) + Else + $lSender = $aSender + EndIf + MemoryWrite($lAddress + 4, $lSender, 'wchar[20]') + If StringLen($aMessage) > 100 Then + $lMessage = StringLeft($aMessage, 100) + Else + $lMessage = $aMessage + EndIf + MemoryWrite($lAddress + 44, $lMessage, 'wchar[101]') + Local $lRet = DllCall($mKernelHandle, 'int', 'WriteProcessMemory', 'handle', $mGWProcHandle, 'ptr', $lAddress, 'ptr', $mWriteChatPtr, 'ulong_ptr', 4, 'ulong_ptr*', 0) + If StringLen($aMessage) > 100 Then WriteChat(StringTrimLeft($aMessage, 100), $aSender) + Return SetExtended($lRet[5], $lRet <> 0) +EndFunc ;==>WriteChat + +;~ Description: Send a whisper to another player. +Func SendWhisper($aReceiver, $aMessage) + Local $lTotal = 'whisper ' & $aReceiver & ',' & $aMessage + If StringLen($lTotal) > 120 Then + Local $lMessage = StringLeft($lTotal, 120) + Else + Local $lMessage = $lTotal + EndIf + Local $lReturn = SendChat($lMessage, '/') + If StringLen($lTotal) > 120 Then SendWhisper($aReceiver, StringTrimLeft($lTotal, 120)) + Return $lReturn +EndFunc ;==>SendWhisper + +;~ Description: Send a message to chat. +Func SendChat($aMessage, $aChannel = '!') + Local $lMessage + Local $lAddress = 256 * $mQueueCounter + $mQueueBase + If $mQueueCounter = $mQueueSize Then + $mQueueCounter = 0 + Else + $mQueueCounter = $mQueueCounter + 1 + EndIf + If StringLen($aMessage) > 120 Then + $lMessage = StringLeft($aMessage, 120) + Else + $lMessage = $aMessage + EndIf + MemoryWrite($lAddress + 8, $aChannel & $lMessage, 'wchar[122]') + Local $lRet = DllCall($mKernelHandle, 'int', 'WriteProcessMemory', 'handle', $mGWProcHandle, 'ptr', $lAddress, 'ptr', $mSendChatPtr, 'ulong_ptr', 8, 'ulong_ptr*', 0) + If StringLen($aMessage) > 120 Then SendChat(StringTrimLeft($aMessage, 120), $aChannel) + Return SetExtended($lRet[5], $lRet <> 0) +EndFunc ;==>SendChat + +;~ Description: Writes text to chat. +Func Update($aText, $aFlag = '') + If $OldGuiText == $aText Then Return +;~ Out($aText) + $OldGuiText = $aText + If $WriteIGChat Then WriteChat($aText, $aFlag) +;~ ConsoleWrite($aText & @CRLF) +OUT($aText) +EndFunc ;==>Update +#EndRegion Chat + +#Region ChatSends +;~ Description: Kneel. +Func Kneel() + Update("Kneel") + Return SendChat('kneel', '/') +EndFunc ;==>Kneel + +;~ Description: Stuck. +Func Stuck() + Return SendChat('stuck', '/') +EndFunc ;==>Stuck + +;~ Description: Resign. +Func Resign() + Return SendChat('resign', '/') +EndFunc ;==>Resign + +;~ Description: Resigns and returns to main function. +Func ResignAndWaitForReturn($aTimeOut = 60000) + Local $lOldPartyValue = MemoryRead($mBasePtr184C + 0x14) + Sleep(3000) + Local $lDeadlock = TimerInit() + Update("Resigning") + Resign() + Do + If TimerDiff($lDeadlock) > $aTimeout Then Return + Sleep(1000) + Until MemoryRead($mBasePtr184C + 0x14) <> $lOldPartyValue + Sleep(1000) + Update("Returning To Outpost") + ReturnToOutpost() + Return WaitMapLoading() +EndFunc ;==>ResignAndReturn + +;~ Description: Resigns and returns to main function. +Func ResignAndWaitForReturn_($aTimeOut = 60000) + Sleep(3000) + For $i = 1 To 10 + Update("Resigning") + Resign() + Sleep(4000) + Update("Returning To Outpost") + ReturnToOutpost() + Sleep(1000) + If GetMapLoading() <> 1 Then ExitLoop + Next + For $i = 1 To 10 + Sleep(2000) + If GetMapLoading() = 0 Then Return SetPointers() + Next +EndFunc ;==>ResignAndReturn +#EndRegion diff --git a/gwApi/client_interface.au3 b/gwApi/client_interface.au3 index 7d76f04..46709e4 100644 --- a/gwApi/client_interface.au3 +++ b/gwApi/client_interface.au3 @@ -1,362 +1,357 @@ -#include-once - -#Region Windows -;~ Description: Close all in-game windows. -Func CloseAllPanels() - Return PerformAction(0x85, 0x18) -EndFunc ;==>CloseAllPanels - -;~ Description: Toggle hero window. -Func ToggleHeroWindow() - Return PerformAction(0x8A, 0x18) -EndFunc ;==>ToggleHeroWindow - -;~ Description: Toggle inventory window. -Func ToggleInventory() - Return PerformAction(0x8B, 0x18) -EndFunc ;==>ToggleInventory - -;~ Description: Toggle all bags window. -Func ToggleAllBags() - Return PerformAction(0xB8, 0x18) -EndFunc ;==>ToggleAllBags - -;~ Description: Toggle world map. -Func ToggleWorldMap() - Return PerformAction(0x8C, 0x18) -EndFunc ;==>ToggleWorldMap - -;~ Description: Toggle options window. -Func ToggleOptions() - Return PerformAction(0x8D, 0x18) -EndFunc ;==>ToggleOptions - -;~ Description: Toggle quest window. -Func ToggleQuestWindow() - Return PerformAction(0x8E, 0x18) -EndFunc ;==>ToggleQuestWindow - -;~ Description: Toggle skills window. -Func ToggleSkillWindow() - Return PerformAction(0x8F, 0x18) -EndFunc ;==>ToggleSkillWindow - -;~ Description: Toggle mission map. -Func ToggleMissionMap() - Return PerformAction(0xB6, 0x18) -EndFunc ;==>ToggleMissionMap - -;~ Description: Toggle friends list window. -Func ToggleFriendList() - Return PerformAction(0xB9, 0x18) -EndFunc ;==>ToggleFriendList - -;~ Description: Toggle guild window. -Func ToggleGuildWindow() - Return PerformAction(0xBA, 0x18) -EndFunc ;==>ToggleGuildWindow - -;~ Description: Toggle party window. -Func TogglePartyWindow() - Return PerformAction(0xBF, 0x18) -EndFunc ;==>TogglePartyWindow - -;~ Description: Toggle score chart. -Func ToggleScoreChart() - Return PerformAction(0xBD, 0x18) -EndFunc ;==>ToggleScoreChart - -;~ Description: Toggle layout window. -Func ToggleLayoutWindow() - Return PerformAction(0xC1, 0x18) -EndFunc ;==>ToggleLayoutWindow - -;~ Description: Toggle minions window. -Func ToggleMinionList() - Return PerformAction(0xC2, 0x18) -EndFunc ;==>ToggleMinionList - -;~ Description: Toggle a hero panel. -Func ToggleHeroPanel($aHeroNumber) - If $aHeroNumber < 4 Then - Return PerformAction(0xDB + $aHeroNumber, 0x18) - ElseIf $aHeroNumber < 8 Then - Return PerformAction(0xFE + $aHeroNumber, 0x18) - EndIf -EndFunc ;==>ToggleHeroPanel - -;~ Description: Toggle hero's pet panel. -Func ToggleHeroPetPanel($aHeroNumber) - If $aHeroNumber < 4 Then - Return PerformAction(0xDF + $aHeroNumber, 0x18) - ElseIf $aHeroNumber < 8 Then - Return PerformAction(0xFA + $aHeroNumber, 0x18) - EndIf -EndFunc ;==>ToggleHeroPetPanel - -;~ Description: Toggle pet panel. -Func TogglePetPanel() - Return PerformAction(0xDF, 0x18) -EndFunc ;==>TogglePetPanel - -;~ Description: Toggle help window. -Func ToggleHelpWindow() - Return PerformAction(0xE4, 0x18) -EndFunc ;==>ToggleHelpWindow -#EndRegion Windows - -#Region Display -;~ Description: Display all names. -Func DisplayAll($aDisplay) - DisplayAllies($aDisplay) - Return DisplayEnemies($aDisplay) -EndFunc ;==>DisplayAll - -;~ Description: Display the names of allies. -Func DisplayAllies($aDisplay) - If $aDisplay Then - Return PerformAction(0x89, 0x18) - Else - Return PerformAction(0x89, 0x1A) - EndIf -EndFunc ;==>DisplayAllies - -;~ Description: Display the names of enemies. -Func DisplayEnemies($aDisplay) - If $aDisplay Then - Return PerformAction(0x94, 0x18) - Else - Return PerformAction(0x94, 0x1A) - EndIf -EndFunc ;==>DisplayEnemies -#EndRegion Display - -#Region Cinematic -;~ Description: Skip a cinematic. -Func SkipCinematic() - Return SendPacket(0x4, 0x5D) -EndFunc ;==>SkipCinematic - -;~ Description: Returns true if theres a cinematic played that can be skipped. -Func DetectCinematic() - If MemoryRead($mCinematic) <> 0 Then - Dim $Cinematic = True - Return True - Else - Dim $Cinematic = False - Return False - EndIf -EndFunc - -;~ Description: Sleeps until there is a cinematic to be skipped and skips then. -Func SecureSkipCinematic($aDeadlock = 60000) - Local $lDeadlock = TimerInit() - While Not DetectCinematic() - Sleep(1000) - If TimerDiff($lDeadlock) > $aDeadlock Then Return False ; no cinematic detected - WEnd - SkipCinematic() - Do - Sleep(1000) - Until Not DetectCinematic() - Return True -EndFunc - -;~ Descriptions: Waits for GetMapLoading() to return <> and then skips cinematic if detected. -Func WaitLoadingAndSkipCinematic($aDeadlock = 10000) - Local $lDeadlock = TimerInit() - Do - If TimerDiff($lDeadlock) > $aDeadlock Then Return False - Sleep(1000) - Until GetMapLoading() <> 2 - $lDeadlock = TimerInit() ; reset the clock - Do - If TimerDiff($lDeadlock) > $aDeadlock Then Return False - Sleep(1000) - Until DetectCinematic() - Return SkipCinematic() -EndFunc -#EndRegion Cinematic - -#Region Misc -;~ Description: Changes game language to english. -Func EnsureEnglish($aEnsure) - If $aEnsure Then - Return MemoryWrite($mEnsureEnglish, 1) - Else - Return MemoryWrite($mEnsureEnglish, 0) - EndIf -EndFunc ;==>EnsureEnglish - -;~ Description: Change game language. -Func ToggleLanguage() - DllStructSetData($mToggleLanguage, 2, 0x18) - Return Enqueue($mToggleLanguagePtr, 8) -EndFunc ;==>ToggleLanguage - -;~ Description: Take a screenshot. -Func MakeScreenshot() - Return PerformAction(0xAE, 0x18) -EndFunc ;==>MakeScreenshot - -;~ Description: Changes the maximum distance you can zoom out. -Func ChangeMaxZoom($aZoom = 750) - MemoryWrite($mZoomStill, $aZoom, "float") - Return MemoryWrite($mZoomMoving, $aZoom, "float") -EndFunc ;==>ChangeMaxZoom -#EndRegion Misc - - - -#Region NewRendering from Tecka/4d1 - -Global $g__NewRenderer_Function = Ptr(0x00618620) ; 53 8D 0C 40 A1 (-0x2B) -Global $g__NewRenderer_Return = Ptr($g__NewRenderer_Function + 0x3) -Global $g__NewRenderer_DetourBuffer -Global $g__NewRenderer_DetourASM - - - -;~ mov ebp,esp -;~ cmp dword ptr ds:[0xABABABAB],0 -;~ jnz 0xCDCDCDCD -;~ pop ebp -;~ pop eax -;~ push 0x32 -;~ push eax -;~ jmp dword ptr ds:[0xEFEFEFEF] - - - -Func _NewRenderer_Init() - - $g__NewRenderer_DetourBuffer = DllCall($mKernelHandle, 'ptr', 'VirtualAllocEx', 'handle', $mGWProcHandle, 'ptr', 0, 'ulong_ptr', 0x100, 'dword', 0x1000, 'dword', 0x40)[0] - ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $g__DetourNewRenderer_Buffer = ' & $g__NewRenderer_DetourBuffer & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console - $g__NewRenderer_DetourASM = Ptr($g__NewRenderer_DetourBuffer + 0x4) - Local $lASM = DllStructCreate('align 1;byte[4];ptr;byte[3];ptr;byte[7];ptr') - - DllStructSetData($lASM,1,'0x89E5833D') - DllStructSetData($lASM,2,$g__NewRenderer_DetourBuffer) - DllStructSetData($lASM,3,'0x000F84') - DllStructSetData($lASM,4,$g__NewRenderer_Return - ($g__NewRenderer_DetourASM + 15)) - DllStructSetData($lASM,5,'0x5D586A6450FF25') - - DllStructSetData($lASM,6,GetValue('Sleep')) - - - DllCall($mKernelHandle, 'int', 'WriteProcessMemory', 'int', $mGWProcHandle, 'int', $g__NewRenderer_DetourASM, 'struct*', $lASM, 'int', DllStructGetSize($lASM), 'int', '') - - Local $lDetour = DllStructCreate('align 1;byte;ptr;byte[4]') - DllStructSetData($lDetour,1,0x68) - DllStructSetData($lDetour,2,$g__NewRenderer_DetourASM) - - DllStructSetData($lDetour,3,'0xC355EBF7') - - DllCall($mKernelHandle, 'int', 'WriteProcessMemory', 'int', $mGWProcHandle, 'int', $g__NewRenderer_Function - 0x6, 'struct*', $lDetour, 'int', DllStructGetSize($lDetour), 'int', '') - -EndFunc - -Func _NewRenderer_SetHook($aValue) - Return MemoryWrite($g__NewRenderer_DetourBuffer,Int($aValue)) -EndFunc -#EndRegion NewRendering from Tecka/4d1 - - - - -#Region Rendering -;~ Description: Enable graphics rendering. -Func EnableRendering($aSetState = True) - If $aSetState Then WinSetState($mGWHwnd, "", @SW_SHOW) - $mRendering = True - Return _NewRenderer_SetHook($mRendering) -EndFunc ;==>EnableRendering - -;~ Description: Disable graphics rendering. -Func DisableRendering($aSetState = True) - If $aSetState Then WinSetState($mGWHwnd, "", @SW_HIDE) - $mRendering = False - Return _NewRenderer_SetHook($mRendering) -EndFunc ;==>DisableRendering - -;~ Description: Turns rendering On if Off, Off if On -;~ Func ToggleRendering() -;~ If $mRendering Then -;~ $mRendering = False -;~ _ToggleRenderingNew() -;~ Else -;~ $mRendering = True -;~ _ToggleRenderingNew() -;~ EndIf -;~ EndFunc ;==>ToggleRendering - - -;$mRendering = Not $mRendering -Func _ToggleRenderingNew() -$mRendering = Not $mRendering -WinSetState($mGWHwnd, '', $mRendering ? @SW_HIDE : @SW_SHOW) -Return MemoryWrite($g__NewRenderer_DetourBuffer,Int($mRendering)) -EndFunc ;==>_ToggleRendering - - - -#EndRegion Rendering - -#Region ClientMemorySize -;~ Description: Emptys client memory. -Func ClearMemory() - Return DllCall($mKernelHandle, 'int', 'SetProcessWorkingSetSize', 'handle', $mGWProcHandle, 'int', -1, 'int', -1) <> 0 -EndFunc ;==>ClearMemory - -;~ Description: Emptys client memory, if paged pool usage bigger than $aSize. -;~ $aSize in bytes -> 250mb = 262144000 bytes (250 * 1024 * 1024) -Func ClearMemoryEx($aSize = 262144000) - Local $lTemp = DllStructCreate('dword;dword;ulong_ptr;ulong_ptr;ulong_ptr;ulong_ptr;ulong_ptr;ulong_ptr;ulong_ptr;ulong_ptr;ulong_ptr') - DllCall('psapi.dll', 'bool', 'GetProcessMemoryInfo', 'handle', $mGWProcHandle, 'struct*', $lTemp, 'int', DllStructGetSize($lTemp)) - Return ((DllStructGetData($lTemp, 4) > $aSize) ? (DllCall($mKernelHandle, 'int', 'SetProcessWorkingSetSize', 'int', $mGWProcHandle, 'int', -1, 'int', -1) <> 0) :(-1)) -EndFunc - -;~ Description: Toggles rendering. -;~ If $aReduceSize >= 0 then client memory will be cleared with SetProcessWorkingSetSize. -Func _PurgeHook($aReduceSize = -1) - If Not $mRendering Then Return -1 - Update("Purging engine hook") - _ToggleRenderingNew() - Sleep(Random(4000, 5000)) - Local $lReturn = _ToggleRenderingNew() - If $aReduceSize = -1 Then ; dont reduce size - Return $lReturn - ElseIf $aReduceSize = 0 Then - Return ClearMemory() - ElseIf $aReduceSize > 0 Then - Return ClearMemoryEx($aReduceSize) - EndIf -EndFunc ;==>_PurgeHook - - - -;~ Func _PurgeHook($aSetState = True, $aReduceSize = -1) -;~ If $mRendering Then Return -1 -;~ Update("Purging engine hook") -;~ ToggleRendering($aSetState) -;~ Sleep(Random(4000, 5000)) -;~ Local $lReturn = ToggleRendering($aSetState) -;~ If $aReduceSize = -1 Then ; dont reduce size -;~ Return $lReturn -;~ ElseIf $aReduceSize = 0 Then -;~ Return ClearMemory() -;~ ElseIf $aReduceSize > 0 Then -;~ Return ClearMemoryEx($aReduceSize) -;~ EndIf -;~ EndFunc ;==>_PurgeHook - - - - - - -;~ Description: Changes the maximum memory client can use. -Func SetMaxMemory($aMemory = 15728640) - Return DllCall($mKernelHandle, 'int', 'SetProcessWorkingSetSizeEx', 'handle', $mGWProcHandle, 'int', 1, 'int', $aMemory, 'int', 6) <> 0 -EndFunc ;==>SetMaxMemory -#EndRegion ClientMemorySize \ No newline at end of file + +#include-once + +#Region Windows +;~ Description: Close all in-game windows. +Func CloseAllPanels() + Return PerformAction(0x85, 0x18) +EndFunc ;==>CloseAllPanels + +;~ Description: Toggle hero window. +Func ToggleHeroWindow() + Return PerformAction(0x8A, 0x18) +EndFunc ;==>ToggleHeroWindow + +;~ Description: Toggle inventory window. +Func ToggleInventory() + Return PerformAction(0x8B, 0x18) +EndFunc ;==>ToggleInventory + +;~ Description: Toggle all bags window. +Func ToggleAllBags() + Return PerformAction(0xB8, 0x18) +EndFunc ;==>ToggleAllBags + +;~ Description: Toggle world map. +Func ToggleWorldMap() + Return PerformAction(0x8C, 0x18) +EndFunc ;==>ToggleWorldMap + +;~ Description: Toggle options window. +Func ToggleOptions() + Return PerformAction(0x8D, 0x18) +EndFunc ;==>ToggleOptions + +;~ Description: Toggle quest window. +Func ToggleQuestWindow() + Return PerformAction(0x8E, 0x18) +EndFunc ;==>ToggleQuestWindow + +;~ Description: Toggle skills window. +Func ToggleSkillWindow() + Return PerformAction(0x8F, 0x18) +EndFunc ;==>ToggleSkillWindow + +;~ Description: Toggle mission map. +Func ToggleMissionMap() + Return PerformAction(0xB6, 0x18) +EndFunc ;==>ToggleMissionMap + +;~ Description: Toggle friends list window. +Func ToggleFriendList() + Return PerformAction(0xB9, 0x18) +EndFunc ;==>ToggleFriendList + +;~ Description: Toggle guild window. +Func ToggleGuildWindow() + Return PerformAction(0xBA, 0x18) +EndFunc ;==>ToggleGuildWindow + +;~ Description: Toggle party window. +Func TogglePartyWindow() + Return PerformAction(0xBF, 0x18) +EndFunc ;==>TogglePartyWindow + +;~ Description: Toggle score chart. +Func ToggleScoreChart() + Return PerformAction(0xBD, 0x18) +EndFunc ;==>ToggleScoreChart + +;~ Description: Toggle layout window. +Func ToggleLayoutWindow() + Return PerformAction(0xC1, 0x18) +EndFunc ;==>ToggleLayoutWindow + +;~ Description: Toggle minions window. +Func ToggleMinionList() + Return PerformAction(0xC2, 0x18) +EndFunc ;==>ToggleMinionList + +;~ Description: Toggle a hero panel. +Func ToggleHeroPanel($aHeroNumber) + If $aHeroNumber < 4 Then + Return PerformAction(0xDB + $aHeroNumber, 0x18) + ElseIf $aHeroNumber < 8 Then + Return PerformAction(0xFE + $aHeroNumber, 0x18) + EndIf +EndFunc ;==>ToggleHeroPanel + +;~ Description: Toggle hero's pet panel. +Func ToggleHeroPetPanel($aHeroNumber) + If $aHeroNumber < 4 Then + Return PerformAction(0xDF + $aHeroNumber, 0x18) + ElseIf $aHeroNumber < 8 Then + Return PerformAction(0xFA + $aHeroNumber, 0x18) + EndIf +EndFunc ;==>ToggleHeroPetPanel + +;~ Description: Toggle pet panel. +Func TogglePetPanel() + Return PerformAction(0xDF, 0x18) +EndFunc ;==>TogglePetPanel + +;~ Description: Toggle help window. +Func ToggleHelpWindow() + Return PerformAction(0xE4, 0x18) +EndFunc ;==>ToggleHelpWindow +#EndRegion Windows + +#Region Display +;~ Description: Display all names. +Func DisplayAll($aDisplay) + DisplayAllies($aDisplay) + Return DisplayEnemies($aDisplay) +EndFunc ;==>DisplayAll + +;~ Description: Display the names of allies. +Func DisplayAllies($aDisplay) + If $aDisplay Then + Return PerformAction(0x89, 0x18) + Else + Return PerformAction(0x89, 0x1A) + EndIf +EndFunc ;==>DisplayAllies + +;~ Description: Display the names of enemies. +Func DisplayEnemies($aDisplay) + If $aDisplay Then + Return PerformAction(0x94, 0x18) + Else + Return PerformAction(0x94, 0x1A) + EndIf +EndFunc ;==>DisplayEnemies +#EndRegion Display + +#Region Cinematic +;~ Description: Skip a cinematic. +Func SkipCinematic() + Return SendPacket(0x4, $CtoGS_MSG_SkipCinematic) +EndFunc ;==>SkipCinematic + +;~ Description: Returns true if theres a cinematic played that can be skipped. +Func DetectCinematic() + If MemoryRead($mCinematic) <> 0 Then + Dim $Cinematic = True + Return True + Else + Dim $Cinematic = False + Return False + EndIf +EndFunc + +;~ Description: Sleeps until there is a cinematic to be skipped and skips then. +Func SecureSkipCinematic($aDeadlock = 60000) + Local $lDeadlock = TimerInit() + While Not DetectCinematic() + Sleep(1000) + If TimerDiff($lDeadlock) > $aDeadlock Then Return False ; no cinematic detected + WEnd + SkipCinematic() + Do + Sleep(1000) + Until Not DetectCinematic() + Return True +EndFunc + +;~ Descriptions: Waits for GetMapLoading() to return <> and then skips cinematic if detected. +Func WaitLoadingAndSkipCinematic($aDeadlock = 10000) + Local $lDeadlock = TimerInit() + Do + If TimerDiff($lDeadlock) > $aDeadlock Then Return False + Sleep(1000) + Until GetMapLoading() <> 2 + $lDeadlock = TimerInit() ; reset the clock + Do + If TimerDiff($lDeadlock) > $aDeadlock Then Return False + Sleep(1000) + Until DetectCinematic() + Return SkipCinematic() +EndFunc +#EndRegion Cinematic + +#Region Misc +;~ Description: Changes game language to english. +Func EnsureEnglish($aEnsure) + If $aEnsure Then + Return MemoryWrite($mEnsureEnglish, 1) + Else + Return MemoryWrite($mEnsureEnglish, 0) + EndIf +EndFunc ;==>EnsureEnglish + +;~ Description: Change game language. +Func ToggleLanguage() + DllStructSetData($mToggleLanguage, 2, 0x18) + Return Enqueue($mToggleLanguagePtr, 8) +EndFunc ;==>ToggleLanguage + +;~ Description: Take a screenshot. +Func MakeScreenshot() + Return PerformAction(0xAE, 0x18) +EndFunc ;==>MakeScreenshot + +;~ Description: Changes the maximum distance you can zoom out. +Func ChangeMaxZoom($aZoom = 750) + MemoryWrite($mZoomStill, $aZoom, "float") + Return MemoryWrite($mZoomMoving, $aZoom, "float") +EndFunc ;==>ChangeMaxZoom +#EndRegion Misc + + + +#Region NewRendering from Tecka/4d1 +Global $g__NewRenderer_Function = Ptr(0x00619BB0) ; 53 8D 0C 40 A1 (-0x2B) +Global $g__NewRenderer_Return = Ptr($g__NewRenderer_Function + 0x3) +Global $g__NewRenderer_DetourBuffer +Global $g__NewRenderer_DetourASM + +#cs +mov ebp,esp +cmp dword ptr ds:[0xABABABAB],0 +jnz 0xCDCDCDCD +pop ebp +pop eax +push 0x32 +push eax +jmp dword ptr ds:[0xEFEFEFEF] +#ce + +Func _NewRenderer_Init() + + $g__NewRenderer_DetourBuffer = DllCall($mKernelHandle, 'ptr', 'VirtualAllocEx', 'handle', $mGWProcHandle, 'ptr', 0, 'ulong_ptr', 0x100, 'dword', 0x1000, 'dword', 0x40)[0] + ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $g__DetourNewRenderer_Buffer = ' & $g__NewRenderer_DetourBuffer & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console + $g__NewRenderer_DetourASM = Ptr($g__NewRenderer_DetourBuffer + 0x4) + Local $lASM = DllStructCreate('align 1;byte[4];ptr;byte[3];ptr;byte[7];ptr') + DllStructSetData($lASM,1,'0x89E5833D') + DllStructSetData($lASM,2,$g__NewRenderer_DetourBuffer) + DllStructSetData($lASM,3,'0x000F84') + DllStructSetData($lASM,4,$g__NewRenderer_Return - ($g__NewRenderer_DetourASM + 15)) + DllStructSetData($lASM,5,'0x5D586A6450FF25') + DllStructSetData($lASM,6,GetValue('Sleep')) + + DllCall($mKernelHandle, 'int', 'WriteProcessMemory', 'int', $mGWProcHandle, 'int', $g__NewRenderer_DetourASM, 'struct*', $lASM, 'int', DllStructGetSize($lASM), 'int', '') + + Local $lDetour = DllStructCreate('align 1;byte;ptr;byte[4]') + DllStructSetData($lDetour,1,0x68) + DllStructSetData($lDetour,2,$g__NewRenderer_DetourASM) + DllStructSetData($lDetour,3,'0xC355EBF7') + + DllCall($mKernelHandle, 'int', 'WriteProcessMemory', 'int', $mGWProcHandle, 'int', $g__NewRenderer_Function - 0x6, 'struct*', $lDetour, 'int', DllStructGetSize($lDetour), 'int', '') + +EndFunc + + +Func _NewRenderer_SetHook($aValue) + MemoryWrite($g__NewRenderer_DetourBuffer,Int($aValue)) +EndFunc +#EndRegion NewRendering from Tecka/4d1 + + + + +#Region Rendering +;~ Description: Enable graphics rendering. +Func EnableRendering($aSetState = True) + If $aSetState Then WinSetState($mGWHwnd, "", @SW_SHOW) + $mRendering = True + Return _NewRenderer_SetHook($mRendering) +EndFunc ;==>EnableRendering + +;~ Description: Disable graphics rendering. +Func DisableRendering($aSetState = True) + If $aSetState Then WinSetState($mGWHwnd, "", @SW_HIDE) + $mRendering = False + Return _NewRenderer_SetHook($mRendering) +EndFunc ;==>DisableRendering + +;~ Description: Turns rendering On if Off, Off if On +;~ Func ToggleRendering() +;~ If $mRendering Then +;~ $mRendering = False +;~ _ToggleRenderingNew() +;~ Else +;~ $mRendering = True +;~ _ToggleRenderingNew() +;~ EndIf +;~ EndFunc ;==>ToggleRendering + + +;$mRendering = Not $mRendering +Func _ToggleRenderingNew() +$mRendering = Not $mRendering +WinSetState($mGWHwnd, '', $mRendering ? @SW_HIDE : @SW_SHOW) +Return MemoryWrite($g__NewRenderer_DetourBuffer,Int($mRendering)) +EndFunc ;==>_ToggleRendering + + + +#EndRegion Rendering + +#Region ClientMemorySize +;~ Description: Emptys client memory. +Func ClearMemory() + Return DllCall($mKernelHandle, 'int', 'SetProcessWorkingSetSize', 'handle', $mGWProcHandle, 'int', -1, 'int', -1) <> 0 +EndFunc ;==>ClearMemory + +;~ Description: Emptys client memory, if paged pool usage bigger than $aSize. +;~ $aSize in bytes -> 250mb = 262144000 bytes (250 * 1024 * 1024) +Func ClearMemoryEx($aSize = 262144000) + Local $lTemp = DllStructCreate('dword;dword;ulong_ptr;ulong_ptr;ulong_ptr;ulong_ptr;ulong_ptr;ulong_ptr;ulong_ptr;ulong_ptr;ulong_ptr') + DllCall('psapi.dll', 'bool', 'GetProcessMemoryInfo', 'handle', $mGWProcHandle, 'struct*', $lTemp, 'int', DllStructGetSize($lTemp)) + Return ((DllStructGetData($lTemp, 4) > $aSize) ? (DllCall($mKernelHandle, 'int', 'SetProcessWorkingSetSize', 'int', $mGWProcHandle, 'int', -1, 'int', -1) <> 0) :(-1)) +EndFunc + +;~ Description: Toggles rendering. +;~ If $aReduceSize >= 0 then client memory will be cleared with SetProcessWorkingSetSize. +Func _PurgeHook($aReduceSize = -1) + If Not $mRendering Then Return -1 + Update("Purging engine hook") + _ToggleRenderingNew() + Sleep(Random(4000, 5000)) + Local $lReturn = _ToggleRenderingNew() + If $aReduceSize = -1 Then ; dont reduce size + Return $lReturn + ElseIf $aReduceSize = 0 Then + Return ClearMemory() + ElseIf $aReduceSize > 0 Then + Return ClearMemoryEx($aReduceSize) + EndIf +EndFunc ;==>_PurgeHook + + + +;~ Func _PurgeHook($aSetState = True, $aReduceSize = -1) +;~ If $mRendering Then Return -1 +;~ Update("Purging engine hook") +;~ ToggleRendering($aSetState) +;~ Sleep(Random(4000, 5000)) +;~ Local $lReturn = ToggleRendering($aSetState) +;~ If $aReduceSize = -1 Then ; dont reduce size +;~ Return $lReturn +;~ ElseIf $aReduceSize = 0 Then +;~ Return ClearMemory() +;~ ElseIf $aReduceSize > 0 Then +;~ Return ClearMemoryEx($aReduceSize) +;~ EndIf +;~ EndFunc ;==>_PurgeHook + + + + + + +;~ Description: Changes the maximum memory client can use. +Func SetMaxMemory($aMemory = 15728640) + Return DllCall($mKernelHandle, 'int', 'SetProcessWorkingSetSizeEx', 'handle', $mGWProcHandle, 'int', 1, 'int', $aMemory, 'int', 6) <> 0 +EndFunc ;==>SetMaxMemory +#EndRegion ClientMemorySize diff --git a/gwApi/constants.au3 b/gwApi/constants.au3 index 4445e7e..ce25216 100644 --- a/gwApi/constants.au3 +++ b/gwApi/constants.au3 @@ -1,2985 +1,2986 @@ -#include-once - -#cs ============================================================ - GWA2 Constants File - - Thanks to: - GWCA Constants Team - d8rken for Zraw API constants - Gigi for constants from GWToolbox - -#ce ============================================================ - -#Region Map and co. -; DIFFICULTY -Global Enum $DIFFICULTY_NORMAL, $DIFFICULTY_HARD - -; INSTANCETYPE -Global Enum $INSTANCETYPE_OUTPOST, $INSTANCETYPE_EXPLORABLE, $INSTANCETYPE_LOADING - -; REGIONS -Global Enum $REGION_International = -2, $REGION_America = 0, $REGION_Korea, $REGION_Europe, $REGION_China, $REGION_Japan - -; LANGUAGES -Global Enum $LANGUAGE_English = 0, $LANGUAGE_French = 2, $LANGUAGE_German, $LANGUAGE_Italian, $LANGUAGE_Spanish, $LANGUAGE_Polish = 9, $LANGUAGE_Russian -#EndRegion - -#Region Items and Inventory/Bags -; RARITY -Global Enum $RARITY_White = 0x3D, $RARITY_Blue = 0x3F, $RARITY_Purple = 0x42, $RARITY_Gold = 0x40, $RARITY_Green = 0x43 - -; BAGS -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 - -; DYE EXTRA ID's -Global Enum $DYE_Blue = 2, $DYE_Green, $DYE_Purple, $DYE_Red, $DYE_Yellow, $DYE_Brown, $DYE_Orange, $DYE_Silver, $DYE_Black, $DYE_Gray, $DYE_White, $DYE_Pink -Global $Pink = 9 - -; MOD STRUCT IDENTIFIERS -Global Const $MODSTRUCT_HEADPIECE_DOMINATION_MAGIC = "3F" -Global Const $MODSTRUCT_HEADPIECE_FAST_CASTING = "40" -Global Const $MODSTRUCT_HEADPIECE_ILLUSION_MAGIC = "41" -Global Const $MODSTRUCT_HEADPIECE_INSPIRATION_MAGIC = "42" - -Global Const $MODSTRUCT_HEADPIECE_BLOOD_MAGIC = "43" -Global Const $MODSTRUCT_HEADPIECE_CURSES = "44" -Global Const $MODSTRUCT_HEADPIECE_DEATH_MAGIC = "45" -Global Const $MODSTRUCT_HEADPIECE_SOUL_REAPING = "46" - -Global Const $MODSTRUCT_HEADPIECE_AIR_MAGIC = "47" -Global Const $MODSTRUCT_HEADPIECE_EARTH_MAGIC = "48" -Global Const $MODSTRUCT_HEADPIECE_ENERGY_STORAGE = "49" -Global Const $MODSTRUCT_HEADPIECE_FIRE_MAGIC = "4A" -Global Const $MODSTRUCT_HEADPIECE_WATER_MAGIC = "4B" - -Global Const $MODSTRUCT_HEADPIECE_DIVINE_FAVOR = "4C" -Global Const $MODSTRUCT_HEADPIECE_HEALING_PRAYERS = "4D" -Global Const $MODSTRUCT_HEADPIECE_PROTECTION_PRAYERS = "4E" -Global Const $MODSTRUCT_HEADPIECE_SMITING_PRAYERS = "4F" - -Global Const $MODSTRUCT_HEADPIECE_AXE_MASTERY = "50" -Global Const $MODSTRUCT_HEADPIECE_HAMMER_MASTERY = "51" -Global Const $MODSTRUCT_HEADPIECE_SWORDSMANSHIP = "53" -Global Const $MODSTRUCT_HEADPIECE_STRENGTH = "54" -Global Const $MODSTRUCT_HEADPIECE_TACTICS = "55" - -Global Const $MODSTRUCT_HEADPIECE_BEAST_MASTERY = "56" -Global Const $MODSTRUCT_HEADPIECE_MARKSMANSHIP = "57" -Global Const $MODSTRUCT_HEADPIECE_EXPERTISE = "58" -Global Const $MODSTRUCT_HEADPIECE_WILDERNESS_SURVIVAL = "59" - -#Region ItemModelIDs -Global Const $Ectoplasm = 930 -Global Const $ObsidianShards = 945 -Global Const $Ruby = 937 -Global Const $Sapphire = 938 -Global Const $DiessaChalice = 24353 -Global Const $GoldenRinRelics = 24354 -Global Const $Lockpicks = 22751 -Global Const $SuperbCharrCarving = 27052 -Global Const $DarkRemains = 522 -Global Const $UmbralSkeletalLimbs = 525 -Global Const $Scroll_Underworld = 3746 -Global Const $Scroll_FOW = 22280 -Global Const $MAT_Bone = 921 -Global Const $MAT_Dust = 929 -Global Const $MAT_Iron = 948 -Global Const $MAT_TannedHides = 940 -Global Const $MAT_Scales = 953 -Global Const $MAT_Chitin = 954 -Global Const $MAT_Cloth = 925 -Global Const $MAT_Wood = 946 -Global Const $MAT_Granite = 955 -Global Const $MAT_Fiber = 934 -Global Const $MAT_Feathers = 933 -Global Const $CON_EssenceOfCelerity = 24859 -Global Const $CON_GrailOfMight = 24861 -Global Const $CON_ArmorOfSalvation = 24860 -Global Const $grog = 30855 -Global Const $golds = 2511 -Global Const $gstones = 27047 -Global Const $tots = 28434 -#EndRegion ItemModelIDs -#EndRegion - -#Region Heroes -; HERO ID's -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_Hayda, $HERO_Kahmu, $HERO_Gwen, $HERO_Xandra, $HERO_Vekk, $HERO_Ogden - -; HERO MODES -Global Enum $HEROMODE_Fight, $HEROMODE_Guard, $HEROMODE_Avoid -#EndRegion - -#Region ProfessionStats -; PROFESSION ID's -Global Enum $PROFESSION_None,$PROFESSION_Warrior,$PROFESSION_Ranger,$PROFESSION_Monk,$PROFESSION_Necromancer,$PROFESSION_Mesmer,$PROFESSION_Elementalist, _ - $PROFESSION_Assassin,$PROFESSION_Ritualist, _ - $PROFESSION_Paragon,$PROFESSION_Dervish - -; ATTRIBUTE ID's -Global Enum $ATTRIB_FastCasting, $ATTRIB_IllusionMagic, $ATTRIB_DominationMagic, $ATTRIB_InspirationMagic, _ - $ATTRIB_BloodMagic, $ATTRIB_DeathMagic, $ATTRIB_SoulReaping, $ATTRIB_Curses, _ - $ATTRIB_AirMagic, $ATTRIB_EarthMagic, $ATTRIB_FireMagic, $ATTRIB_WaterMagic, $ATTRIB_EnergyStorage, _ - $ATTRIB_HealingPrayers, $ATTRIB_SmitingPrayers, $ATTRIB_ProtectionPrayers, $ATTRIB_DivineFavor, _ - $ATTRIB_Strength, $ATTRIB_AxeMastery, $ATTRIB_HammerMastery, $ATTRIB_Swordsmanship, $ATTRIB_Tactics, _ - $ATTRIB_BeastMastery, $ATTRIB_Expertise, $ATTRIB_WildernessSurvival, $ATTRIB_Marksmanship, _ - $ATTRIB_DaggerMastery, $ATTRIB_DeadlyArts, $ATTRIB_ShadowArts, _ - $ATTRIB_Communing, $ATTRIB_RestorationMagic, $ATTRIB_ChannelingMagic, _ - $ATTRIB_CriticalStrikes, _ - $ATTRIB_SpawningPower, _ - $ATTRIB_SpearMastery, $ATTRIB_Command, $ATTRIB_Motivation, $ATTRIB_Leadership, _ - $ATTRIB_ScytheMastery, $ATTRIB_WindPrayers, $ATTRIB_EarthPrayers, $ATTRIB_Mysticism - -; WEAPON TYPES -Global Enum $EQUIP_Weapon, $EQUIP_Offhand, $EQUIP_Chest, $EQUIP_Legs, $EQUIP_Head, $EQUIP_Feet, $EQUIP_Hands -#EndRegion - -#Region Skills -; SKILL TYPES -Global Enum $SKILLTYPE_Stance = 3, $SKILLTYPE_Hex, $SKILLTYPE_Spell, $SKILLTYPE_Enchantment, $SKILLTYPE_Signet, $SKILLTYPE_Well = 9, _ - $SKILLTYPE_Skill, $SKILLTYPE_Ward, $SKILLTYPE_Glyph, $SKILLTYPE_Attack = 14, $SKILLTYPE_Shout, $SKILLTYPE_Preparation = 19, _ - $SKILLTYPE_Trap = 21, $SKILLTYPE_Ritual, $SKILLTYPE_ItemSpell = 24, $SKILLTYPE_WeaponSpell, $SKILLTYPE_Chant = 27, $SKILLTYPE_EchoRefrain - -; SKILL TARGETS -Global $TARGET_self = 0 -Global $TARGET_none = 0 -Global $TARGET_spirit = 1 -Global $TARGET_animal = 1 -Global $TARGET_corpse = 1 -Global $TARGET_ally = 3 -Global $TARGET_otherally = 4 -Global $TARGET_enemy = 5 -Global $TARGET_dead_ally = 6 -Global $TARGET_minion = 14 -Global $TARGET_ground = 16 - -; RANGES -Global Const $RANGE_Adjacent = 156 -Global Const $RANGE_Nearby = 240 -Global Const $RANGE_Area = 312 -Global Const $RANGE_Earshot = 1000 -Global Const $RANGE_Spell_casting = 1085 -Global Const $RANGE_Spirit = 2500 -Global Const $RANGE_Compass = 5000 - -;SKILL IDs -Global Const $SKILLID_No_Skill = 0; -Global Const $SKILLID_Healing_Signet = 1; -Global Const $SKILLID_Resurrection_Signet = 2; -Global Const $SKILLID_Signet_of_Capture = 3; -Global Const $SKILLID_BAMPH = 4; -Global Const $SKILLID_Power_Block = 5; -Global Const $SKILLID_Mantra_of_Earth = 6; -Global Const $SKILLID_Mantra_of_Flame = 7; -Global Const $SKILLID_Mantra_of_Frost = 8; -Global Const $SKILLID_Mantra_of_Lightning = 9; -Global Const $SKILLID_Hex_Breaker = 10; -Global Const $SKILLID_Distortion = 11; -Global Const $SKILLID_Mantra_of_Celerity = 12; -Global Const $SKILLID_Mantra_of_Recovery = 13; -Global Const $SKILLID_Mantra_of_Persistence = 14; -Global Const $SKILLID_Mantra_of_Inscriptions = 15; -Global Const $SKILLID_Mantra_of_Concentration = 16; -Global Const $SKILLID_Mantra_of_Resolve = 17; -Global Const $SKILLID_Mantra_of_Signets = 18; -Global Const $SKILLID_Fragility = 19; -Global Const $SKILLID_Confusion = 20; -Global Const $SKILLID_Inspired_Enchantment = 21; -Global Const $SKILLID_Inspired_Hex = 22; -Global Const $SKILLID_Power_Spike = 23; -Global Const $SKILLID_Power_Leak = 24; -Global Const $SKILLID_Power_Drain = 25; -Global Const $SKILLID_Empathy = 26; -Global Const $SKILLID_Shatter_Delusions = 27; -Global Const $SKILLID_Backfire = 28; -Global Const $SKILLID_Blackout = 29; -Global Const $SKILLID_Diversion = 30; -Global Const $SKILLID_Conjure_Phantasm = 31; -Global Const $SKILLID_Illusion_of_Weakness = 32; -Global Const $SKILLID_Illusionary_Weaponry = 33; -Global Const $SKILLID_Sympathetic_Visage = 34; -Global Const $SKILLID_Ignorance = 35; -Global Const $SKILLID_Arcane_Conundrum = 36; -Global Const $SKILLID_Illusion_of_Haste = 37; -Global Const $SKILLID_Channeling = 38; -Global Const $SKILLID_Energy_Surge = 39; -Global Const $SKILLID_Ether_Feast = 40; -Global Const $SKILLID_Ether_Lord = 41; -Global Const $SKILLID_Energy_Burn = 42; -Global Const $SKILLID_Clumsiness = 43; -Global Const $SKILLID_Phantom_Pain = 44; -Global Const $SKILLID_Ethereal_Burden = 45; -Global Const $SKILLID_Guilt = 46; -Global Const $SKILLID_Ineptitude = 47; -Global Const $SKILLID_Spirit_of_Failure = 48; -Global Const $SKILLID_Mind_Wrack = 49; -Global Const $SKILLID_Wastrels_Worry = 50; -Global Const $SKILLID_Shame = 51; -Global Const $SKILLID_Panic = 52; -Global Const $SKILLID_Migraine = 53; -Global Const $SKILLID_Crippling_Anguish = 54; -Global Const $SKILLID_Fevered_Dreams = 55; -Global Const $SKILLID_Soothing_Images = 56; -Global Const $SKILLID_Cry_of_Frustration = 57; -Global Const $SKILLID_Signet_of_Midnight = 58; -Global Const $SKILLID_Signet_of_Weariness = 59; -Global Const $SKILLID_Signet_of_Illusions_beta_version = 60; -Global Const $SKILLID_Leech_Signet = 61; -Global Const $SKILLID_Signet_of_Humility = 62; -Global Const $SKILLID_Keystone_Signet = 63; -Global Const $SKILLID_Mimic = 64; -Global Const $SKILLID_Arcane_Mimicry = 65; -Global Const $SKILLID_Spirit_Shackles = 66; -Global Const $SKILLID_Shatter_Hex = 67; -Global Const $SKILLID_Drain_Enchantment = 68; -Global Const $SKILLID_Shatter_Enchantment = 69; -Global Const $SKILLID_Disappear = 70; -Global Const $SKILLID_Unnatural_Signet_alpha_version = 71; -Global Const $SKILLID_Elemental_Resistance = 72; -Global Const $SKILLID_Physical_Resistance = 73; -Global Const $SKILLID_Echo = 74; -Global Const $SKILLID_Arcane_Echo = 75; -Global Const $SKILLID_Imagined_Burden = 76; -Global Const $SKILLID_Chaos_Storm = 77; -Global Const $SKILLID_Epidemic = 78; -Global Const $SKILLID_Energy_Drain = 79; -Global Const $SKILLID_Energy_Tap = 80; -Global Const $SKILLID_Arcane_Thievery = 81; -Global Const $SKILLID_Mantra_of_Recall = 82; -Global Const $SKILLID_Animate_Bone_Horror = 83; -Global Const $SKILLID_Animate_Bone_Fiend = 84; -Global Const $SKILLID_Animate_Bone_Minions = 85; -Global Const $SKILLID_Grenths_Balance = 86; -Global Const $SKILLID_Veratas_Gaze = 87; -Global Const $SKILLID_Veratas_Aura = 88; -Global Const $SKILLID_Deathly_Chill = 89; -Global Const $SKILLID_Veratas_Sacrifice = 90; -Global Const $SKILLID_Well_of_Power = 91; -Global Const $SKILLID_Well_of_Blood = 92; -Global Const $SKILLID_Well_of_Suffering = 93; -Global Const $SKILLID_Well_of_the_Profane = 94; -Global Const $SKILLID_Putrid_Explosion = 95; -Global Const $SKILLID_Soul_Feast = 96; -Global Const $SKILLID_Necrotic_Traversal = 97; -Global Const $SKILLID_Consume_Corpse = 98; -Global Const $SKILLID_Parasitic_Bond = 99; -Global Const $SKILLID_Soul_Barbs = 100; -Global Const $SKILLID_Barbs = 101; -Global Const $SKILLID_Shadow_Strike = 102; -Global Const $SKILLID_Price_of_Failure = 103; -Global Const $SKILLID_Death_Nova = 104; -Global Const $SKILLID_Deathly_Swarm = 105; -Global Const $SKILLID_Rotting_Flesh = 106; -Global Const $SKILLID_Virulence = 107; -Global Const $SKILLID_Suffering = 108; -Global Const $SKILLID_Life_Siphon = 109; -Global Const $SKILLID_Unholy_Feast = 110; -Global Const $SKILLID_Awaken_the_Blood = 111; -Global Const $SKILLID_Desecrate_Enchantments = 112; -Global Const $SKILLID_Tainted_Flesh = 113; -Global Const $SKILLID_Aura_of_the_Lich = 114; -Global Const $SKILLID_Blood_Renewal = 115; -Global Const $SKILLID_Dark_Aura = 116; -Global Const $SKILLID_Enfeeble = 117; -Global Const $SKILLID_Enfeebling_Blood = 118; -Global Const $SKILLID_Blood_is_Power = 119; -Global Const $SKILLID_Blood_of_the_Master = 120; -Global Const $SKILLID_Spiteful_Spirit = 121; -Global Const $SKILLID_Malign_Intervention = 122; -Global Const $SKILLID_Insidious_Parasite = 123; -Global Const $SKILLID_Spinal_Shivers = 124; -Global Const $SKILLID_Wither = 125; -Global Const $SKILLID_Life_Transfer = 126; -Global Const $SKILLID_Mark_of_Subversion = 127; -Global Const $SKILLID_Soul_Leech = 128; -Global Const $SKILLID_Defile_Flesh = 129; -Global Const $SKILLID_Demonic_Flesh = 130; -Global Const $SKILLID_Barbed_Signet = 131; -Global Const $SKILLID_Plague_Signet = 132; -Global Const $SKILLID_Dark_Pact = 133; -Global Const $SKILLID_Order_of_Pain = 134; -Global Const $SKILLID_Faintheartedness = 135; -Global Const $SKILLID_Shadow_of_Fear = 136; -Global Const $SKILLID_Rigor_Mortis = 137; -Global Const $SKILLID_Dark_Bond = 138; -Global Const $SKILLID_Infuse_Condition = 139; -Global Const $SKILLID_Malaise = 140; -Global Const $SKILLID_Rend_Enchantments = 141; -Global Const $SKILLID_Lingering_Curse = 142; -Global Const $SKILLID_Strip_Enchantment = 143; -Global Const $SKILLID_Chilblains = 144; -Global Const $SKILLID_Signet_of_Agony = 145; -Global Const $SKILLID_Offering_of_Blood = 146; -Global Const $SKILLID_Dark_Fury = 147; -Global Const $SKILLID_Order_of_the_Vampire = 148; -Global Const $SKILLID_Plague_Sending = 149; -Global Const $SKILLID_Mark_of_Pain = 150; -Global Const $SKILLID_Feast_of_Corruption = 151; -Global Const $SKILLID_Taste_of_Death = 152; -Global Const $SKILLID_Vampiric_Gaze = 153; -Global Const $SKILLID_Plague_Touch = 154; -Global Const $SKILLID_Vile_Touch = 155; -Global Const $SKILLID_Vampiric_Touch = 156; -Global Const $SKILLID_Blood_Ritual = 157; -Global Const $SKILLID_Touch_of_Agony = 158; -Global Const $SKILLID_Weaken_Armor = 159; -Global Const $SKILLID_Windborne_Speed = 160; -Global Const $SKILLID_Lightning_Storm = 161; -Global Const $SKILLID_Gale = 162; -Global Const $SKILLID_Whirlwind = 163; -Global Const $SKILLID_Elemental_Attunement = 164; -Global Const $SKILLID_Armor_of_Earth = 165; -Global Const $SKILLID_Kinetic_Armor = 166; -Global Const $SKILLID_Eruption = 167; -Global Const $SKILLID_Magnetic_Aura = 168; -Global Const $SKILLID_Earth_Attunement = 169; -Global Const $SKILLID_Earthquake = 170; -Global Const $SKILLID_Stoning = 171; -Global Const $SKILLID_Stone_Daggers = 172; -Global Const $SKILLID_Grasping_Earth = 173; -Global Const $SKILLID_Aftershock = 174; -Global Const $SKILLID_Ward_Against_Elements = 175; -Global Const $SKILLID_Ward_Against_Melee = 176; -Global Const $SKILLID_Ward_Against_Foes = 177; -Global Const $SKILLID_Ether_Prodigy = 178; -Global Const $SKILLID_Incendiary_Bonds = 179; -Global Const $SKILLID_Aura_of_Restoration = 180; -Global Const $SKILLID_Ether_Renewal = 181; -Global Const $SKILLID_Conjure_Flame = 182; -Global Const $SKILLID_Inferno = 183; -Global Const $SKILLID_Fire_Attunement = 184; -Global Const $SKILLID_Mind_Burn = 185; -Global Const $SKILLID_Fireball = 186; -Global Const $SKILLID_Meteor = 187; -Global Const $SKILLID_Flame_Burst = 188; -Global Const $SKILLID_Rodgorts_Invocation = 189; -Global Const $SKILLID_Mark_of_Rodgort = 190; -Global Const $SKILLID_Immolate = 191; -Global Const $SKILLID_Meteor_Shower = 192; -Global Const $SKILLID_Phoenix = 193; -Global Const $SKILLID_Flare = 194; -Global Const $SKILLID_Lava_Font = 195; -Global Const $SKILLID_Searing_Heat = 196; -Global Const $SKILLID_Fire_Storm = 197; -Global Const $SKILLID_Glyph_of_Elemental_Power = 198; -Global Const $SKILLID_Glyph_of_Energy = 199; -Global Const $SKILLID_Glyph_of_Lesser_Energy = 200; -Global Const $SKILLID_Glyph_of_Concentration = 201; -Global Const $SKILLID_Glyph_of_Sacrifice = 202; -Global Const $SKILLID_Glyph_of_Renewal = 203; -Global Const $SKILLID_Rust = 204; -Global Const $SKILLID_Lightning_Surge = 205; -Global Const $SKILLID_Armor_of_Frost = 206; -Global Const $SKILLID_Conjure_Frost = 207; -Global Const $SKILLID_Water_Attunement = 208; -Global Const $SKILLID_Mind_Freeze = 209; -Global Const $SKILLID_Ice_Prison = 210; -Global Const $SKILLID_Ice_Spikes = 211; -Global Const $SKILLID_Frozen_Burst = 212; -Global Const $SKILLID_Shard_Storm = 213; -Global Const $SKILLID_Ice_Spear = 214; -Global Const $SKILLID_Maelstrom = 215; -Global Const $SKILLID_Iron_Mist = 216; -Global Const $SKILLID_Crystal_Wave = 217; -Global Const $SKILLID_Obsidian_Flesh = 218; -Global Const $SKILLID_Obsidian_Flame = 219; -Global Const $SKILLID_Blinding_Flash = 220; -Global Const $SKILLID_Conjure_Lightning = 221; -Global Const $SKILLID_Lightning_Strike = 222; -Global Const $SKILLID_Chain_Lightning = 223; -Global Const $SKILLID_Enervating_Charge = 224; -Global Const $SKILLID_Air_Attunement = 225; -Global Const $SKILLID_Mind_Shock = 226; -Global Const $SKILLID_Glimmering_Mark = 227; -Global Const $SKILLID_Thunderclap = 228; -Global Const $SKILLID_Lightning_Orb = 229; -Global Const $SKILLID_Lightning_Javelin = 230; -Global Const $SKILLID_Shock = 231; -Global Const $SKILLID_Lightning_Touch = 232; -Global Const $SKILLID_Swirling_Aura = 233; -Global Const $SKILLID_Deep_Freeze = 234; -Global Const $SKILLID_Blurred_Vision = 235; -Global Const $SKILLID_Mist_Form = 236; -Global Const $SKILLID_Water_Trident = 237; -Global Const $SKILLID_Armor_of_Mist = 238; -Global Const $SKILLID_Ward_Against_Harm = 239; -Global Const $SKILLID_Smite = 240; -Global Const $SKILLID_Life_Bond = 241; -Global Const $SKILLID_Balthazars_Spirit = 242; -Global Const $SKILLID_Strength_of_Honor = 243; -Global Const $SKILLID_Life_Attunement = 244; -Global Const $SKILLID_Protective_Spirit = 245; -Global Const $SKILLID_Divine_Intervention = 246; -Global Const $SKILLID_Symbol_of_Wrath = 247; -Global Const $SKILLID_Retribution = 248; -Global Const $SKILLID_Holy_Wrath = 249; -Global Const $SKILLID_Essence_Bond = 250; -Global Const $SKILLID_Scourge_Healing = 251; -Global Const $SKILLID_Banish = 252; -Global Const $SKILLID_Scourge_Sacrifice = 253; -Global Const $SKILLID_Vigorous_Spirit = 254; -Global Const $SKILLID_Watchful_Spirit = 255; -Global Const $SKILLID_Blessed_Aura = 256; -Global Const $SKILLID_Aegis = 257; -Global Const $SKILLID_Guardian = 258; -Global Const $SKILLID_Shield_of_Deflection = 259; -Global Const $SKILLID_Aura_of_Faith = 260; -Global Const $SKILLID_Shield_of_Regeneration = 261; -Global Const $SKILLID_Shield_of_Judgment = 262; -Global Const $SKILLID_Protective_Bond = 263; -Global Const $SKILLID_Pacifism = 264; -Global Const $SKILLID_Amity = 265; -Global Const $SKILLID_Peace_and_Harmony = 266; -Global Const $SKILLID_Judges_Insight = 267; -Global Const $SKILLID_Unyielding_Aura = 268; -Global Const $SKILLID_Mark_of_Protection = 269; -Global Const $SKILLID_Life_Barrier = 270; -Global Const $SKILLID_Zealots_Fire = 271; -Global Const $SKILLID_Balthazars_Aura = 272; -Global Const $SKILLID_Spell_Breaker = 273; -Global Const $SKILLID_Healing_Seed = 274; -Global Const $SKILLID_Mend_Condition = 275; -Global Const $SKILLID_Restore_Condition = 276; -Global Const $SKILLID_Mend_Ailment = 277; -Global Const $SKILLID_Purge_Conditions = 278; -Global Const $SKILLID_Divine_Healing = 279; -Global Const $SKILLID_Heal_Area = 280; -Global Const $SKILLID_Orison_of_Healing = 281; -Global Const $SKILLID_Word_of_Healing = 282; -Global Const $SKILLID_Dwaynas_Kiss = 283; -Global Const $SKILLID_Divine_Boon = 284; -Global Const $SKILLID_Healing_Hands = 285; -Global Const $SKILLID_Heal_Other = 286; -Global Const $SKILLID_Heal_Party = 287; -Global Const $SKILLID_Healing_Breeze = 288; -Global Const $SKILLID_Vital_Blessing = 289; -Global Const $SKILLID_Mending = 290; -Global Const $SKILLID_Live_Vicariously = 291; -Global Const $SKILLID_Infuse_Health = 292; -Global Const $SKILLID_Signet_of_Devotion = 293; -Global Const $SKILLID_Signet_of_Judgment = 294; -Global Const $SKILLID_Purge_Signet = 295; -Global Const $SKILLID_Bane_Signet = 296; -Global Const $SKILLID_Blessed_Signet = 297; -Global Const $SKILLID_Martyr = 298; -Global Const $SKILLID_Shielding_Hands = 299; -Global Const $SKILLID_Contemplation_of_Purity = 300; -Global Const $SKILLID_Remove_Hex = 301; -Global Const $SKILLID_Smite_Hex = 302; -Global Const $SKILLID_Convert_Hexes = 303; -Global Const $SKILLID_Light_of_Dwayna = 304; -Global Const $SKILLID_Resurrect = 305; -Global Const $SKILLID_Rebirth = 306; -Global Const $SKILLID_Reversal_of_Fortune = 307; -Global Const $SKILLID_Succor = 308; -Global Const $SKILLID_Holy_Veil = 309; -Global Const $SKILLID_Divine_Spirit = 310; -Global Const $SKILLID_Draw_Conditions = 311; -Global Const $SKILLID_Holy_Strike = 312; -Global Const $SKILLID_Healing_Touch = 313; -Global Const $SKILLID_Restore_Life = 314; -Global Const $SKILLID_Vengeance = 315; -Global Const $SKILLID_To_the_Limit = 316; -Global Const $SKILLID_Battle_Rage = 317; -Global Const $SKILLID_Defy_Pain = 318; -Global Const $SKILLID_Rush = 319; -Global Const $SKILLID_Hamstring = 320; -Global Const $SKILLID_Wild_Blow = 321; -Global Const $SKILLID_Power_Attack = 322; -Global Const $SKILLID_Desperation_Blow = 323; -Global Const $SKILLID_Thrill_of_Victory = 324; -Global Const $SKILLID_Distracting_Blow = 325; -Global Const $SKILLID_Protectors_Strike = 326; -Global Const $SKILLID_Griffons_Sweep = 327; -Global Const $SKILLID_Pure_Strike = 328; -Global Const $SKILLID_Skull_Crack = 329; -Global Const $SKILLID_Cyclone_Axe = 330; -Global Const $SKILLID_Hammer_Bash = 331; -Global Const $SKILLID_Bulls_Strike = 332; -Global Const $SKILLID_I_Will_Avenge_You = 333; -Global Const $SKILLID_Axe_Rake = 334; -Global Const $SKILLID_Cleave = 335; -Global Const $SKILLID_Executioners_Strike = 336; -Global Const $SKILLID_Dismember = 337; -Global Const $SKILLID_Eviscerate = 338; -Global Const $SKILLID_Penetrating_Blow = 339; -Global Const $SKILLID_Disrupting_Chop = 340; -Global Const $SKILLID_Swift_Chop = 341; -Global Const $SKILLID_Axe_Twist = 342; -Global Const $SKILLID_For_Great_Justice = 343; -Global Const $SKILLID_Flurry = 344; -Global Const $SKILLID_Defensive_Stance = 345; -Global Const $SKILLID_Frenzy = 346; -Global Const $SKILLID_Endure_Pain = 347; -Global Const $SKILLID_Watch_Yourself = 348; -Global Const $SKILLID_Sprint = 349; -Global Const $SKILLID_Belly_Smash = 350; -Global Const $SKILLID_Mighty_Blow = 351; -Global Const $SKILLID_Crushing_Blow = 352; -Global Const $SKILLID_Crude_Swing = 353; -Global Const $SKILLID_Earth_Shaker = 354; -Global Const $SKILLID_Devastating_Hammer = 355; -Global Const $SKILLID_Irresistible_Blow = 356; -Global Const $SKILLID_Counter_Blow = 357; -Global Const $SKILLID_Backbreaker = 358; -Global Const $SKILLID_Heavy_Blow = 359; -Global Const $SKILLID_Staggering_Blow = 360; -Global Const $SKILLID_Dolyak_Signet = 361; -Global Const $SKILLID_Warriors_Cunning = 362; -Global Const $SKILLID_Shield_Bash = 363; -Global Const $SKILLID_Charge = 364; -Global Const $SKILLID_Victory_is_Mine = 365; -Global Const $SKILLID_Fear_Me = 366; -Global Const $SKILLID_Shields_Up = 367; -Global Const $SKILLID_I_Will_Survive = 368; -Global Const $SKILLID_Dont_Believe_Their_Lies = 369; -Global Const $SKILLID_Berserker_Stance = 370; -Global Const $SKILLID_Balanced_Stance = 371; -Global Const $SKILLID_Gladiators_Defense = 372; -Global Const $SKILLID_Deflect_Arrows = 373; -Global Const $SKILLID_Warriors_Endurance = 374; -Global Const $SKILLID_Dwarven_Battle_Stance = 375; -Global Const $SKILLID_Disciplined_Stance = 376; -Global Const $SKILLID_Wary_Stance = 377; -Global Const $SKILLID_Shield_Stance = 378; -Global Const $SKILLID_Bulls_Charge = 379; -Global Const $SKILLID_Bonettis_Defense = 380; -Global Const $SKILLID_Hundred_Blades = 381; -Global Const $SKILLID_Sever_Artery = 382; -Global Const $SKILLID_Galrath_Slash = 383; -Global Const $SKILLID_Gash = 384; -Global Const $SKILLID_Final_Thrust = 385; -Global Const $SKILLID_Seeking_Blade = 386; -Global Const $SKILLID_Riposte = 387; -Global Const $SKILLID_Deadly_Riposte = 388; -Global Const $SKILLID_Flourish = 389; -Global Const $SKILLID_Savage_Slash = 390; -Global Const $SKILLID_Hunters_Shot = 391; -Global Const $SKILLID_Pin_Down = 392; -Global Const $SKILLID_Crippling_Shot = 393; -Global Const $SKILLID_Power_Shot = 394; -Global Const $SKILLID_Barrage = 395; -Global Const $SKILLID_Dual_Shot = 396; -Global Const $SKILLID_Quick_Shot = 397; -Global Const $SKILLID_Penetrating_Attack = 398; -Global Const $SKILLID_Distracting_Shot = 399; -Global Const $SKILLID_Precision_Shot = 400; -Global Const $SKILLID_Splinter_Shot_monster_skill = 401; -Global Const $SKILLID_Determined_Shot = 402; -Global Const $SKILLID_Called_Shot = 403; -Global Const $SKILLID_Poison_Arrow = 404; -Global Const $SKILLID_Oath_Shot = 405; -Global Const $SKILLID_Debilitating_Shot = 406; -Global Const $SKILLID_Point_Blank_Shot = 407; -Global Const $SKILLID_Concussion_Shot = 408; -Global Const $SKILLID_Punishing_Shot = 409; -Global Const $SKILLID_Call_of_Ferocity = 410; -Global Const $SKILLID_Charm_Animal = 411; -Global Const $SKILLID_Call_of_Protection = 412; -Global Const $SKILLID_Call_of_Elemental_Protection = 413; -Global Const $SKILLID_Call_of_Vitality = 414; -Global Const $SKILLID_Call_of_Haste = 415; -Global Const $SKILLID_Call_of_Healing = 416; -Global Const $SKILLID_Call_of_Resilience = 417; -Global Const $SKILLID_Call_of_Feeding = 418; -Global Const $SKILLID_Call_of_the_Hunter = 419; -Global Const $SKILLID_Call_of_Brutality = 420; -Global Const $SKILLID_Call_of_Disruption = 421; -Global Const $SKILLID_Revive_Animal = 422; -Global Const $SKILLID_Symbiotic_Bond = 423; -Global Const $SKILLID_Throw_Dirt = 424; -Global Const $SKILLID_Dodge = 425; -Global Const $SKILLID_Savage_Shot = 426; -Global Const $SKILLID_Antidote_Signet = 427; -Global Const $SKILLID_Incendiary_Arrows = 428; -Global Const $SKILLID_Melandrus_Arrows = 429; -Global Const $SKILLID_Marksmans_Wager = 430; -Global Const $SKILLID_Ignite_Arrows = 431; -Global Const $SKILLID_Read_the_Wind = 432; -Global Const $SKILLID_Kindle_Arrows = 433; -Global Const $SKILLID_Choking_Gas = 434; -Global Const $SKILLID_Apply_Poison = 435; -Global Const $SKILLID_Comfort_Animal = 436; -Global Const $SKILLID_Bestial_Pounce = 437; -Global Const $SKILLID_Maiming_Strike = 438; -Global Const $SKILLID_Feral_Lunge = 439; -Global Const $SKILLID_Scavenger_Strike = 440; -Global Const $SKILLID_Melandrus_Assault = 441; -Global Const $SKILLID_Ferocious_Strike = 442; -Global Const $SKILLID_Predators_Pounce = 443; -Global Const $SKILLID_Brutal_Strike = 444; -Global Const $SKILLID_Disrupting_Lunge = 445; -Global Const $SKILLID_Troll_Unguent = 446; -Global Const $SKILLID_Otyughs_Cry = 447; -Global Const $SKILLID_Escape = 448; -Global Const $SKILLID_Practiced_Stance = 449; -Global Const $SKILLID_Whirling_Defense = 450; -Global Const $SKILLID_Melandrus_Resilience = 451; -Global Const $SKILLID_Dryders_Defenses = 452; -Global Const $SKILLID_Lightning_Reflexes = 453; -Global Const $SKILLID_Tigers_Fury = 454; -Global Const $SKILLID_Storm_Chaser = 455; -Global Const $SKILLID_Serpents_Quickness = 456; -Global Const $SKILLID_Dust_Trap = 457; -Global Const $SKILLID_Barbed_Trap = 458; -Global Const $SKILLID_Flame_Trap = 459; -Global Const $SKILLID_Healing_Spring = 460; -Global Const $SKILLID_Spike_Trap = 461; -Global Const $SKILLID_Winter = 462; -Global Const $SKILLID_Winnowing = 463; -Global Const $SKILLID_Edge_of_Extinction = 464; -Global Const $SKILLID_Greater_Conflagration = 465; -Global Const $SKILLID_Conflagration = 466; -Global Const $SKILLID_Fertile_Season = 467; -Global Const $SKILLID_Symbiosis = 468; -Global Const $SKILLID_Primal_Echoes = 469; -Global Const $SKILLID_Predatory_Season = 470; -Global Const $SKILLID_Frozen_Soil = 471; -Global Const $SKILLID_Favorable_Winds = 472; -Global Const $SKILLID_High_Winds = 473; -Global Const $SKILLID_Energizing_Wind = 474; -Global Const $SKILLID_Quickening_Zephyr = 475; -Global Const $SKILLID_Natures_Renewal = 476; -Global Const $SKILLID_Muddy_Terrain = 477; -Global Const $SKILLID_Bleeding = 478; -Global Const $SKILLID_Blind = 479; -Global Const $SKILLID_Burning = 480; -Global Const $SKILLID_Crippled = 481; -Global Const $SKILLID_Deep_Wound = 482; -Global Const $SKILLID_Disease = 483; -Global Const $SKILLID_Poison = 484; -Global Const $SKILLID_Dazed = 485; -Global Const $SKILLID_Weakness = 486; -Global Const $SKILLID_Cleansed = 487; -Global Const $SKILLID_Eruption_environment = 488; -Global Const $SKILLID_Fire_Storm_environment = 489; -Global Const $SKILLID_Fount_Of_Maguuma = 491; -Global Const $SKILLID_Healing_Fountain = 492; -Global Const $SKILLID_Icy_Ground = 493; -Global Const $SKILLID_Maelstrom_environment = 494; -Global Const $SKILLID_Mursaat_Tower_skill = 495; -Global Const $SKILLID_Quicksand_environment_effect = 496; -Global Const $SKILLID_Curse_of_the_Bloodstone = 497; -Global Const $SKILLID_Chain_Lightning_environment = 498; -Global Const $SKILLID_Obelisk_Lightning = 499; -Global Const $SKILLID_Tar = 500; -Global Const $SKILLID_Siege_Attack = 501; -Global Const $SKILLID_Scepter_of_Orrs_Aura = 503; -Global Const $SKILLID_Scepter_of_Orrs_Power = 504; -Global Const $SKILLID_Burden_Totem = 505; -Global Const $SKILLID_Splinter_Mine_skill = 506; -Global Const $SKILLID_Entanglement = 507; -Global Const $SKILLID_Dwarven_Powder_Keg = 508; -Global Const $SKILLID_Seed_of_Resurrection = 509; -Global Const $SKILLID_Deafening_Roar = 510; -Global Const $SKILLID_Brutal_Mauling = 511; -Global Const $SKILLID_Crippling_Attack = 512; -Global Const $SKILLID_Breaking_Charm = 514; -Global Const $SKILLID_Charr_Buff = 515; -Global Const $SKILLID_Claim_Resource = 516; -Global Const $SKILLID_Dozen_Shot = 524; -Global Const $SKILLID_Nibble = 525; -Global Const $SKILLID_Reflection = 528; -Global Const $SKILLID_Giant_Stomp = 530; -Global Const $SKILLID_Agnars_Rage = 531; -Global Const $SKILLID_Crystal_Haze = 533; -Global Const $SKILLID_Crystal_Bonds = 534; -Global Const $SKILLID_Jagged_Crystal_Skin = 535; -Global Const $SKILLID_Crystal_Hibernation = 536; -Global Const $SKILLID_Hunger_of_the_Lich = 539; -Global Const $SKILLID_Embrace_the_Pain = 540; -Global Const $SKILLID_Life_Vortex = 541; -Global Const $SKILLID_Oracle_Link = 542; -Global Const $SKILLID_Guardian_Pacify = 543; -Global Const $SKILLID_Soul_Vortex = 544; -Global Const $SKILLID_Spectral_Agony = 546; -Global Const $SKILLID_Undead_sensitivity_to_Light = 554; -Global Const $SKILLID_Titans_get_plus_Health_regen_and_set_enemies_on_fire_each_time_he_is_hit = 558; -Global Const $SKILLID_Resurrect_Resurrect_Gargoyle = 560; -Global Const $SKILLID_Wurm_Siege = 563; -Global Const $SKILLID_Shiver_Touch = 566; -Global Const $SKILLID_Spontaneous_Combustion = 567; -Global Const $SKILLID_Vanish = 568; -Global Const $SKILLID_Victory_or_Death = 569; -Global Const $SKILLID_Mark_of_Insecurity = 570; -Global Const $SKILLID_Disrupting_Dagger = 571; -Global Const $SKILLID_Deadly_Paradox = 572; -Global Const $SKILLID_Holy_Blessing = 575; -Global Const $SKILLID_Statues_Blessing = 576; -Global Const $SKILLID_Domain_of_Energy_Draining = 580; -Global Const $SKILLID_Domain_of_Health_Draining = 582; -Global Const $SKILLID_Domain_of_Slow = 583; -Global Const $SKILLID_Divine_Fire = 584; -Global Const $SKILLID_Swamp_Water = 585; -Global Const $SKILLID_Janthirs_Gaze = 586; -Global Const $SKILLID_Stormcaller_skill = 589; -Global Const $SKILLID_Knock = 590; -Global Const $SKILLID_Blessing_of_the_Kurzicks = 593; -Global Const $SKILLID_Chimera_of_Intensity = 596; -Global Const $SKILLID_Life_Stealing_effect = 657; -Global Const $SKILLID_Jaundiced_Gaze = 763; -Global Const $SKILLID_Wail_of_Doom = 764; -Global Const $SKILLID_Heros_Insight = 765; -Global Const $SKILLID_Gaze_of_Contempt = 766; -Global Const $SKILLID_Berserkers_Insight = 767; -Global Const $SKILLID_Slayers_Insight = 768; -Global Const $SKILLID_Vipers_Defense = 769; -Global Const $SKILLID_Return = 770; -Global Const $SKILLID_Aura_of_Displacement = 771; -Global Const $SKILLID_Generous_Was_Tsungrai = 772; -Global Const $SKILLID_Mighty_Was_Vorizun = 773; -Global Const $SKILLID_To_the_Death = 774; -Global Const $SKILLID_Death_Blossom = 775; -Global Const $SKILLID_Twisting_Fangs = 776; -Global Const $SKILLID_Horns_of_the_Ox = 777; -Global Const $SKILLID_Falling_Spider = 778; -Global Const $SKILLID_Black_Lotus_Strike = 779; -Global Const $SKILLID_Fox_Fangs = 780; -Global Const $SKILLID_Moebius_Strike = 781; -Global Const $SKILLID_Jagged_Strike = 782; -Global Const $SKILLID_Unsuspecting_Strike = 783; -Global Const $SKILLID_Entangling_Asp = 784; -Global Const $SKILLID_Mark_of_Death = 785; -Global Const $SKILLID_Iron_Palm = 786; -Global Const $SKILLID_Resilient_Weapon = 787; -Global Const $SKILLID_Blind_Was_Mingson = 788; -Global Const $SKILLID_Grasping_Was_Kuurong = 789; -Global Const $SKILLID_Vengeful_Was_Khanhei = 790; -Global Const $SKILLID_Flesh_of_My_Flesh = 791; -Global Const $SKILLID_Splinter_Weapon = 792; -Global Const $SKILLID_Weapon_of_Warding = 793; -Global Const $SKILLID_Wailing_Weapon = 794; -Global Const $SKILLID_Nightmare_Weapon = 795; -Global Const $SKILLID_Sorrows_Flame = 796; -Global Const $SKILLID_Sorrows_Fist = 797; -Global Const $SKILLID_Blast_Furnace = 798; -Global Const $SKILLID_Beguiling_Haze = 799; -Global Const $SKILLID_Enduring_Toxin = 800; -Global Const $SKILLID_Shroud_of_Silence = 801; -Global Const $SKILLID_Expose_Defenses = 802; -Global Const $SKILLID_Power_Leech = 803; -Global Const $SKILLID_Arcane_Languor = 804; -Global Const $SKILLID_Animate_Vampiric_Horror = 805; -Global Const $SKILLID_Cultists_Fervor = 806; -Global Const $SKILLID_Reapers_Mark = 808; -Global Const $SKILLID_Shatterstone = 809; -Global Const $SKILLID_Protectors_Defense = 810; -Global Const $SKILLID_Run_as_One = 811; -Global Const $SKILLID_Defiant_Was_Xinrae = 812; -Global Const $SKILLID_Lyssas_Aura = 813; -Global Const $SKILLID_Shadow_Refuge = 814; -Global Const $SKILLID_Scorpion_Wire = 815; -Global Const $SKILLID_Mirrored_Stance = 816; -Global Const $SKILLID_Discord = 817; -Global Const $SKILLID_Well_of_Weariness = 818; -Global Const $SKILLID_Vampiric_Spirit = 819; -Global Const $SKILLID_Depravity = 820; -Global Const $SKILLID_Icy_Veins = 821; -Global Const $SKILLID_Weaken_Knees = 822; -Global Const $SKILLID_Burning_Speed = 823; -Global Const $SKILLID_Lava_Arrows = 824; -Global Const $SKILLID_Bed_of_Coals = 825; -Global Const $SKILLID_Shadow_Form = 826; -Global Const $SKILLID_Siphon_Strength = 827; -Global Const $SKILLID_Vile_Miasma = 828; -Global Const $SKILLID_Ray_of_Judgment = 830; -Global Const $SKILLID_Primal_Rage = 831; -Global Const $SKILLID_Animate_Flesh_Golem = 832; -Global Const $SKILLID_Reckless_Haste = 834; -Global Const $SKILLID_Blood_Bond = 835; -Global Const $SKILLID_Ride_the_Lightning = 836; -Global Const $SKILLID_Energy_Boon = 837; -Global Const $SKILLID_Dwaynas_Sorrow = 838; -Global Const $SKILLID_Retreat = 839; -Global Const $SKILLID_Poisoned_Heart = 840; -Global Const $SKILLID_Fetid_Ground = 841; -Global Const $SKILLID_Arc_Lightning = 842; -Global Const $SKILLID_Gust = 843; -Global Const $SKILLID_Churning_Earth = 844; -Global Const $SKILLID_Liquid_Flame = 845; -Global Const $SKILLID_Steam = 846; -Global Const $SKILLID_Boon_Signet = 847; -Global Const $SKILLID_Reverse_Hex = 848; -Global Const $SKILLID_Lacerating_Chop = 849; -Global Const $SKILLID_Fierce_Blow = 850; -Global Const $SKILLID_Sun_and_Moon_Slash = 851; -Global Const $SKILLID_Splinter_Shot = 852; -Global Const $SKILLID_Melandrus_Shot = 853; -Global Const $SKILLID_Snare = 854; -Global Const $SKILLID_Kilroy_Stonekin = 856; -Global Const $SKILLID_Adventurers_Insight = 857; -Global Const $SKILLID_Dancing_Daggers = 858; -Global Const $SKILLID_Conjure_Nightmare = 859; -Global Const $SKILLID_Signet_of_Disruption = 860; -Global Const $SKILLID_Ravenous_Gaze = 862; -Global Const $SKILLID_Order_of_Apostasy = 863; -Global Const $SKILLID_Oppressive_Gaze = 864; -Global Const $SKILLID_Lightning_Hammer = 865; -Global Const $SKILLID_Vapor_Blade = 866; -Global Const $SKILLID_Healing_Light = 867; -Global Const $SKILLID_Coward = 869; -Global Const $SKILLID_Pestilence = 870; -Global Const $SKILLID_Shadowsong = 871; -Global Const $SKILLID_Shadowsong_attack = 872; -Global Const $SKILLID_Resurrect_monster_skill = 873; -Global Const $SKILLID_Consuming_Flames = 874; -Global Const $SKILLID_Chains_of_Enslavement = 875; -Global Const $SKILLID_Signet_of_Shadows = 876; -Global Const $SKILLID_Lyssas_Balance = 877; -Global Const $SKILLID_Visions_of_Regret = 878; -Global Const $SKILLID_Illusion_of_Pain = 879; -Global Const $SKILLID_Stolen_Speed = 880; -Global Const $SKILLID_Ether_Signet = 881; -Global Const $SKILLID_Signet_of_Disenchantment = 882; -Global Const $SKILLID_Vocal_Minority = 883; -Global Const $SKILLID_Searing_Flames = 884; -Global Const $SKILLID_Shield_Guardian = 885; -Global Const $SKILLID_Restful_Breeze = 886; -Global Const $SKILLID_Signet_of_Rejuvenation = 887; -Global Const $SKILLID_Whirling_Axe = 888; -Global Const $SKILLID_Forceful_Blow = 889; -Global Const $SKILLID_None_Shall_Pass = 891; -Global Const $SKILLID_Quivering_Blade = 892; -Global Const $SKILLID_Seeking_Arrows = 893; -Global Const $SKILLID_Rampagers_Insight = 894; -Global Const $SKILLID_Hunters_Insight = 895; -Global Const $SKILLID_Oath_of_Healing = 897; -Global Const $SKILLID_Overload = 898; -Global Const $SKILLID_Images_of_Remorse = 899; -Global Const $SKILLID_Shared_Burden = 900; -Global Const $SKILLID_Soul_Bind = 901; -Global Const $SKILLID_Blood_of_the_Aggressor = 902; -Global Const $SKILLID_Icy_Prism = 903; -Global Const $SKILLID_Furious_Axe = 904; -Global Const $SKILLID_Auspicious_Blow = 905; -Global Const $SKILLID_On_Your_Knees = 906; -Global Const $SKILLID_Dragon_Slash = 907; -Global Const $SKILLID_Marauders_Shot = 908; -Global Const $SKILLID_Focused_Shot = 909; -Global Const $SKILLID_Spirit_Rift = 910; -Global Const $SKILLID_Union = 911; -Global Const $SKILLID_Tranquil_Was_Tanasen = 913; -Global Const $SKILLID_Consume_Soul = 914; -Global Const $SKILLID_Spirit_Light = 915; -Global Const $SKILLID_Lamentation = 916; -Global Const $SKILLID_Rupture_Soul = 917; -Global Const $SKILLID_Spirit_to_Flesh = 918; -Global Const $SKILLID_Spirit_Burn = 919; -Global Const $SKILLID_Destruction = 920; -Global Const $SKILLID_Dissonance = 921; -Global Const $SKILLID_Dissonance_attack = 922; -Global Const $SKILLID_Disenchantment = 923; -Global Const $SKILLID_Disenchantment_attack = 924; -Global Const $SKILLID_Recall = 925; -Global Const $SKILLID_Sharpen_Daggers = 926; -Global Const $SKILLID_Shameful_Fear = 927; -Global Const $SKILLID_Shadow_Shroud = 928; -Global Const $SKILLID_Shadow_of_Haste = 929; -Global Const $SKILLID_Auspicious_Incantation = 930; -Global Const $SKILLID_Power_Return = 931; -Global Const $SKILLID_Complicate = 932; -Global Const $SKILLID_Shatter_Storm = 933; -Global Const $SKILLID_Unnatural_Signet = 934; -Global Const $SKILLID_Rising_Bile = 935; -Global Const $SKILLID_Envenom_Enchantments = 936; -Global Const $SKILLID_Shockwave = 937; -Global Const $SKILLID_Ward_of_Stability = 938; -Global Const $SKILLID_Icy_Shackles = 939; -Global Const $SKILLID_Blessed_Light = 941; -Global Const $SKILLID_Withdraw_Hexes = 942; -Global Const $SKILLID_Extinguish = 943; -Global Const $SKILLID_Signet_of_Strength = 944; -Global Const $SKILLID_Trappers_Focus = 946; -Global Const $SKILLID_Brambles = 947; -Global Const $SKILLID_Desperate_Strike = 948; -Global Const $SKILLID_Way_of_the_Fox = 949; -Global Const $SKILLID_Shadowy_Burden = 950; -Global Const $SKILLID_Siphon_Speed = 951; -Global Const $SKILLID_Deaths_Charge = 952; -Global Const $SKILLID_Power_Flux = 953; -Global Const $SKILLID_Expel_Hexes = 954; -Global Const $SKILLID_Rip_Enchantment = 955; -Global Const $SKILLID_Spell_Shield = 957; -Global Const $SKILLID_Healing_Whisper = 958; -Global Const $SKILLID_Ethereal_Light = 959; -Global Const $SKILLID_Release_Enchantments = 960; -Global Const $SKILLID_Lacerate = 961; -Global Const $SKILLID_Spirit_Transfer = 962; -Global Const $SKILLID_Restoration = 963; -Global Const $SKILLID_Vengeful_Weapon = 964; -Global Const $SKILLID_Spear_of_Archemorus = 966; -Global Const $SKILLID_Argos_Cry = 971; -Global Const $SKILLID_Jade_Fury = 972; -Global Const $SKILLID_Blinding_Powder = 973; -Global Const $SKILLID_Mantis_Touch = 974; -Global Const $SKILLID_Exhausting_Assault = 975; -Global Const $SKILLID_Repeating_Strike = 976; -Global Const $SKILLID_Way_of_the_Lotus = 977; -Global Const $SKILLID_Mark_of_Instability = 978; -Global Const $SKILLID_Mistrust = 979; -Global Const $SKILLID_Feast_of_Souls = 980; -Global Const $SKILLID_Recuperation = 981; -Global Const $SKILLID_Shelter = 982; -Global Const $SKILLID_Weapon_of_Shadow = 983; -Global Const $SKILLID_Torch_Enchantment = 984; -Global Const $SKILLID_Caltrops = 985; -Global Const $SKILLID_Nine_Tail_Strike = 986; -Global Const $SKILLID_Way_of_the_Empty_Palm = 987; -Global Const $SKILLID_Temple_Strike = 988; -Global Const $SKILLID_Golden_Phoenix_Strike = 989; -Global Const $SKILLID_Expunge_Enchantments = 990; -Global Const $SKILLID_Deny_Hexes = 991; -Global Const $SKILLID_Triple_Chop = 992; -Global Const $SKILLID_Enraged_Smash = 993; -Global Const $SKILLID_Renewing_Smash = 994; -Global Const $SKILLID_Tiger_Stance = 995; -Global Const $SKILLID_Standing_Slash = 996; -Global Const $SKILLID_Famine = 997; -Global Const $SKILLID_Torch_Hex = 998; -Global Const $SKILLID_Torch_Degeneration_Hex = 999; -Global Const $SKILLID_Blinding_Snow = 1000; -Global Const $SKILLID_Avalanche_skill = 1001; -Global Const $SKILLID_Snowball = 1002; -Global Const $SKILLID_Mega_Snowball = 1003; -Global Const $SKILLID_Yuletide = 1004; -Global Const $SKILLID_Ice_Fort = 1006; -Global Const $SKILLID_Yellow_Snow = 1007; -Global Const $SKILLID_Hidden_Rock = 1008; -Global Const $SKILLID_Snow_Down_the_Shirt = 1009; -Global Const $SKILLID_Mmmm_Snowcone = 1010; -Global Const $SKILLID_Holiday_Blues = 1011; -Global Const $SKILLID_Icicles = 1012; -Global Const $SKILLID_Ice_Breaker = 1013; -Global Const $SKILLID_Lets_Get_Em = 1014; -Global Const $SKILLID_Flurry_of_Ice = 1015; -Global Const $SKILLID_Critical_Eye = 1018; -Global Const $SKILLID_Critical_Strike = 1019; -Global Const $SKILLID_Blades_of_Steel = 1020; -Global Const $SKILLID_Jungle_Strike = 1021; -Global Const $SKILLID_Wild_Strike = 1022; -Global Const $SKILLID_Leaping_Mantis_Sting = 1023; -Global Const $SKILLID_Black_Mantis_Thrust = 1024; -Global Const $SKILLID_Disrupting_Stab = 1025; -Global Const $SKILLID_Golden_Lotus_Strike = 1026; -Global Const $SKILLID_Critical_Defenses = 1027; -Global Const $SKILLID_Way_of_Perfection = 1028; -Global Const $SKILLID_Dark_Apostasy = 1029; -Global Const $SKILLID_Locusts_Fury = 1030; -Global Const $SKILLID_Shroud_of_Distress = 1031; -Global Const $SKILLID_Heart_of_Shadow = 1032; -Global Const $SKILLID_Impale = 1033; -Global Const $SKILLID_Seeping_Wound = 1034; -Global Const $SKILLID_Assassins_Promise = 1035; -Global Const $SKILLID_Signet_of_Malice = 1036; -Global Const $SKILLID_Dark_Escape = 1037; -Global Const $SKILLID_Crippling_Dagger = 1038; -Global Const $SKILLID_Star_Strike = 1039; -Global Const $SKILLID_Spirit_Walk = 1040; -Global Const $SKILLID_Unseen_Fury = 1041; -Global Const $SKILLID_Flashing_Blades = 1042; -Global Const $SKILLID_Dash = 1043; -Global Const $SKILLID_Dark_Prison = 1044; -Global Const $SKILLID_Palm_Strike = 1045; -Global Const $SKILLID_Assassin_of_Lyssa = 1046; -Global Const $SKILLID_Mesmer_of_Lyssa = 1047; -Global Const $SKILLID_Revealed_Enchantment = 1048; -Global Const $SKILLID_Revealed_Hex = 1049; -Global Const $SKILLID_Disciple_of_Energy = 1050; -Global Const $SKILLID_Accumulated_Pain = 1052; -Global Const $SKILLID_Psychic_Distraction = 1053; -Global Const $SKILLID_Ancestors_Visage = 1054; -Global Const $SKILLID_Recurring_Insecurity = 1055; -Global Const $SKILLID_Kitahs_Burden = 1056; -Global Const $SKILLID_Psychic_Instability = 1057; -Global Const $SKILLID_Chaotic_Power = 1058; -Global Const $SKILLID_Hex_Eater_Signet = 1059; -Global Const $SKILLID_Celestial_Haste = 1060; -Global Const $SKILLID_Feedback = 1061; -Global Const $SKILLID_Arcane_Larceny = 1062; -Global Const $SKILLID_Chaotic_Ward = 1063; -Global Const $SKILLID_Favor_of_the_Gods = 1064; -Global Const $SKILLID_Dark_Aura_blessing = 1065; -Global Const $SKILLID_Spoil_Victor = 1066; -Global Const $SKILLID_Lifebane_Strike = 1067; -Global Const $SKILLID_Bitter_Chill = 1068; -Global Const $SKILLID_Taste_of_Pain = 1069; -Global Const $SKILLID_Defile_Enchantments = 1070; -Global Const $SKILLID_Shivers_of_Dread = 1071; -Global Const $SKILLID_Star_Servant = 1072; -Global Const $SKILLID_Necromancer_of_Grenth = 1073; -Global Const $SKILLID_Ritualist_of_Grenth = 1074; -Global Const $SKILLID_Vampiric_Swarm = 1075; -Global Const $SKILLID_Blood_Drinker = 1076; -Global Const $SKILLID_Vampiric_Bite = 1077; -Global Const $SKILLID_Wallows_Bite = 1078; -Global Const $SKILLID_Enfeebling_Touch = 1079; -Global Const $SKILLID_Disciple_of_Ice = 1080; -Global Const $SKILLID_Teinais_Wind = 1081; -Global Const $SKILLID_Shock_Arrow = 1082; -Global Const $SKILLID_Unsteady_Ground = 1083; -Global Const $SKILLID_Sliver_Armor = 1084; -Global Const $SKILLID_Ash_Blast = 1085; -Global Const $SKILLID_Dragons_Stomp = 1086; -Global Const $SKILLID_Unnatural_Resistance = 1087; -Global Const $SKILLID_Second_Wind = 1088; -Global Const $SKILLID_Cloak_of_Faith = 1089; -Global Const $SKILLID_Smoldering_Embers = 1090; -Global Const $SKILLID_Double_Dragon = 1091; -Global Const $SKILLID_Disciple_of_the_Air = 1092; -Global Const $SKILLID_Teinais_Heat = 1093; -Global Const $SKILLID_Breath_of_Fire = 1094; -Global Const $SKILLID_Star_Burst = 1095; -Global Const $SKILLID_Glyph_of_Essence = 1096; -Global Const $SKILLID_Teinais_Prison = 1097; -Global Const $SKILLID_Mirror_of_Ice = 1098; -Global Const $SKILLID_Teinais_Crystals = 1099; -Global Const $SKILLID_Celestial_Storm = 1100; -Global Const $SKILLID_Monk_of_Dwayna = 1101; -Global Const $SKILLID_Aura_of_the_Grove = 1102; -Global Const $SKILLID_Cathedral_Collapse = 1103; -Global Const $SKILLID_Miasma = 1104; -Global Const $SKILLID_Acid_Trap = 1105; -Global Const $SKILLID_Shield_of_Saint_Viktor = 1106; -Global Const $SKILLID_Urn_of_Saint_Viktor = 1107; -Global Const $SKILLID_Aura_of_Light = 1112; -Global Const $SKILLID_Kirins_Wrath = 1113; -Global Const $SKILLID_Spirit_Bond = 1114; -Global Const $SKILLID_Air_of_Enchantment = 1115; -Global Const $SKILLID_Warriors_Might = 1116; -Global Const $SKILLID_Heavens_Delight = 1117; -Global Const $SKILLID_Healing_Burst = 1118; -Global Const $SKILLID_Kareis_Healing_Circle = 1119; -Global Const $SKILLID_Jameis_Gaze = 1120; -Global Const $SKILLID_Gift_of_Health = 1121; -Global Const $SKILLID_Battle_Fervor = 1122; -Global Const $SKILLID_Life_Sheath = 1123; -Global Const $SKILLID_Star_Shine = 1124; -Global Const $SKILLID_Disciple_of_Fire = 1125; -Global Const $SKILLID_Empathic_Removal = 1126; -Global Const $SKILLID_Warrior_of_Balthazar = 1127; -Global Const $SKILLID_Resurrection_Chant = 1128; -Global Const $SKILLID_Word_of_Censure = 1129; -Global Const $SKILLID_Spear_of_Light = 1130; -Global Const $SKILLID_Stonesoul_Strike = 1131; -Global Const $SKILLID_Shielding_Branches = 1132; -Global Const $SKILLID_Drunken_Blow = 1133; -Global Const $SKILLID_Leviathans_Sweep = 1134; -Global Const $SKILLID_Jaizhenju_Strike = 1135; -Global Const $SKILLID_Penetrating_Chop = 1136; -Global Const $SKILLID_Yeti_Smash = 1137; -Global Const $SKILLID_Disciple_of_the_Earth = 1138; -Global Const $SKILLID_Ranger_of_Melandru = 1139; -Global Const $SKILLID_Storm_of_Swords = 1140; -Global Const $SKILLID_You_Will_Die = 1141; -Global Const $SKILLID_Auspicious_Parry = 1142; -Global Const $SKILLID_Strength_of_the_Oak = 1143; -Global Const $SKILLID_Silverwing_Slash = 1144; -Global Const $SKILLID_Destroy_Enchantment = 1145; -Global Const $SKILLID_Shove = 1146; -Global Const $SKILLID_Base_Defense = 1147; -Global Const $SKILLID_Carrier_Defense = 1148; -Global Const $SKILLID_The_Chalice_of_Corruption = 1149; -Global Const $SKILLID_Song_of_the_Mists = 1151; -Global Const $SKILLID_Demonic_Agility = 1152; -Global Const $SKILLID_Blessing_of_the_Kirin = 1153; -Global Const $SKILLID_Juggernaut_Toss = 1155; -Global Const $SKILLID_Aura_of_the_Juggernaut = 1156; -Global Const $SKILLID_Star_Shards = 1157; -Global Const $SKILLID_Turtle_Shell = 1172; -Global Const $SKILLID_Blood_of_zu_Heltzer = 1175; -Global Const $SKILLID_Afflicted_Soul_Explosion = 1176; -Global Const $SKILLID_Dark_Chain_Lightning = 1179; -Global Const $SKILLID_Corrupted_Breath = 1181; -Global Const $SKILLID_Renewing_Corruption = 1182; -Global Const $SKILLID_Corrupted_Dragon_Spores = 1183; -Global Const $SKILLID_Corrupted_Dragon_Scales = 1184; -Global Const $SKILLID_Construct_Possession = 1185; -Global Const $SKILLID_Siege_Turtle_Attack = 1186; -Global Const $SKILLID_Of_Royal_Blood = 1189; -Global Const $SKILLID_Passage_to_Tahnnakai = 1190; -Global Const $SKILLID_Sundering_Attack = 1191; -Global Const $SKILLID_Zojuns_Shot = 1192; -Global Const $SKILLID_Predatory_Bond = 1194; -Global Const $SKILLID_Heal_as_One = 1195; -Global Const $SKILLID_Zojuns_Haste = 1196; -Global Const $SKILLID_Needling_Shot = 1197; -Global Const $SKILLID_Broad_Head_Arrow = 1198; -Global Const $SKILLID_Glass_Arrows = 1199; -Global Const $SKILLID_Archers_Signet = 1200; -Global Const $SKILLID_Savage_Pounce = 1201; -Global Const $SKILLID_Enraged_Lunge = 1202; -Global Const $SKILLID_Bestial_Mauling = 1203; -Global Const $SKILLID_Energy_Drain_effect = 1204; -Global Const $SKILLID_Poisonous_Bite = 1205; -Global Const $SKILLID_Pounce = 1206; -Global Const $SKILLID_Celestial_Stance = 1207; -Global Const $SKILLID_Sheer_Exhaustion = 1208; -Global Const $SKILLID_Bestial_Fury = 1209; -Global Const $SKILLID_Life_Drain = 1210; -Global Const $SKILLID_Vipers_Nest = 1211; -Global Const $SKILLID_Equinox = 1212; -Global Const $SKILLID_Tranquility = 1213; -Global Const $SKILLID_Clamor_of_Souls = 1215; -Global Const $SKILLID_Ritual_Lord = 1217; -Global Const $SKILLID_Cruel_Was_Daoshen = 1218; -Global Const $SKILLID_Protective_Was_Kaolai = 1219; -Global Const $SKILLID_Attuned_Was_Songkai = 1220; -Global Const $SKILLID_Resilient_Was_Xiko = 1221; -Global Const $SKILLID_Lively_Was_Naomei = 1222; -Global Const $SKILLID_Anguished_Was_Lingwah = 1223; -Global Const $SKILLID_Draw_Spirit = 1224; -Global Const $SKILLID_Channeled_Strike = 1225; -Global Const $SKILLID_Spirit_Boon_Strike = 1226; -Global Const $SKILLID_Essence_Strike = 1227; -Global Const $SKILLID_Spirit_Siphon = 1228; -Global Const $SKILLID_Explosive_Growth = 1229; -Global Const $SKILLID_Boon_of_Creation = 1230; -Global Const $SKILLID_Spirit_Channeling = 1231; -Global Const $SKILLID_Armor_of_Unfeeling = 1232; -Global Const $SKILLID_Soothing_Memories = 1233; -Global Const $SKILLID_Mend_Body_and_Soul = 1234; -Global Const $SKILLID_Dulled_Weapon = 1235; -Global Const $SKILLID_Binding_Chains = 1236; -Global Const $SKILLID_Painful_Bond = 1237; -Global Const $SKILLID_Signet_of_Creation = 1238; -Global Const $SKILLID_Signet_of_Spirits = 1239; -Global Const $SKILLID_Soul_Twisting = 1240; -Global Const $SKILLID_Celestial_Summoning = 1241; -Global Const $SKILLID_Ghostly_Haste = 1244; -Global Const $SKILLID_Gaze_from_Beyond = 1245; -Global Const $SKILLID_Ancestors_Rage = 1246; -Global Const $SKILLID_Pain = 1247; -Global Const $SKILLID_Pain_attack = 1248; -Global Const $SKILLID_Displacement = 1249; -Global Const $SKILLID_Preservation = 1250; -Global Const $SKILLID_Life = 1251; -Global Const $SKILLID_Earthbind = 1252; -Global Const $SKILLID_Bloodsong = 1253; -Global Const $SKILLID_Bloodsong_attack = 1254; -Global Const $SKILLID_Wanderlust = 1255; -Global Const $SKILLID_Wanderlust_attack = 1256; -Global Const $SKILLID_Spirit_Light_Weapon = 1257; -Global Const $SKILLID_Brutal_Weapon = 1258; -Global Const $SKILLID_Guided_Weapon = 1259; -Global Const $SKILLID_Meekness = 1260; -Global Const $SKILLID_Frigid_Armor = 1261; -Global Const $SKILLID_Healing_Ring = 1262; -Global Const $SKILLID_Renew_Life = 1263; -Global Const $SKILLID_Doom = 1264; -Global Const $SKILLID_Wielders_Boon = 1265; -Global Const $SKILLID_Soothing = 1266; -Global Const $SKILLID_Vital_Weapon = 1267; -Global Const $SKILLID_Weapon_of_Quickening = 1268; -Global Const $SKILLID_Signet_of_Rage = 1269; -Global Const $SKILLID_Fingers_of_Chaos = 1270; -Global Const $SKILLID_Echoing_Banishment = 1271; -Global Const $SKILLID_Suicidal_Impulse = 1272; -Global Const $SKILLID_Impossible_Odds = 1273; -Global Const $SKILLID_Battle_Scars = 1274; -Global Const $SKILLID_Riposting_Shadows = 1275; -Global Const $SKILLID_Meditation_of_the_Reaper = 1276; -Global Const $SKILLID_Blessed_Water = 1280; -Global Const $SKILLID_Defiled_Water = 1281; -Global Const $SKILLID_Stone_Spores = 1282; -Global Const $SKILLID_Haiju_Lagoon_Water = 1287; -Global Const $SKILLID_Aspect_of_Exhaustion = 1288; -Global Const $SKILLID_Aspect_of_Exposure = 1289; -Global Const $SKILLID_Aspect_of_Surrender = 1290; -Global Const $SKILLID_Aspect_of_Death = 1291; -Global Const $SKILLID_Aspect_of_Soothing = 1292; -Global Const $SKILLID_Aspect_of_Pain = 1293; -Global Const $SKILLID_Aspect_of_Lethargy = 1294; -Global Const $SKILLID_Aspect_of_Depletion_energy_loss = 1295; -Global Const $SKILLID_Aspect_of_Failure = 1296; -Global Const $SKILLID_Aspect_of_Shadows = 1297; -Global Const $SKILLID_Scorpion_Aspect = 1298; -Global Const $SKILLID_Aspect_of_Fear = 1299; -Global Const $SKILLID_Aspect_of_Depletion_energy_depletion_damage = 1300; -Global Const $SKILLID_Aspect_of_Decay = 1301; -Global Const $SKILLID_Aspect_of_Torment = 1302; -Global Const $SKILLID_Nightmare_Aspect = 1303; -Global Const $SKILLID_Spiked_Coral = 1304; -Global Const $SKILLID_Shielding_Urn = 1305; -Global Const $SKILLID_Extensive_Plague_Exposure = 1306; -Global Const $SKILLID_Forests_Binding = 1307; -Global Const $SKILLID_Exploding_Spores = 1308; -Global Const $SKILLID_Suicide_Energy = 1309; -Global Const $SKILLID_Suicide_Health = 1310; -Global Const $SKILLID_Nightmare_Refuge = 1311; -Global Const $SKILLID_Rage_of_the_Sea = 1315; -Global Const $SKILLID_Sugar_Rush = 1323; -Global Const $SKILLID_Torment_Slash = 1324; -Global Const $SKILLID_Spirit_of_the_Festival = 1325; -Global Const $SKILLID_Trade_Winds = 1326; -Global Const $SKILLID_Dragon_Blast = 1327; -Global Const $SKILLID_Imperial_Majesty = 1328; -Global Const $SKILLID_Extend_Conditions = 1333; -Global Const $SKILLID_Hypochondria = 1334; -Global Const $SKILLID_Wastrels_Demise = 1335; -Global Const $SKILLID_Spiritual_Pain = 1336; -Global Const $SKILLID_Drain_Delusions = 1337; -Global Const $SKILLID_Persistence_of_Memory = 1338; -Global Const $SKILLID_Symbols_of_Inspiration = 1339; -Global Const $SKILLID_Symbolic_Celerity = 1340; -Global Const $SKILLID_Frustration = 1341; -Global Const $SKILLID_Tease = 1342; -Global Const $SKILLID_Ether_Phantom = 1343; -Global Const $SKILLID_Web_of_Disruption = 1344; -Global Const $SKILLID_Enchanters_Conundrum = 1345; -Global Const $SKILLID_Signet_of_Illusions = 1346; -Global Const $SKILLID_Discharge_Enchantment = 1347; -Global Const $SKILLID_Hex_Eater_Vortex = 1348; -Global Const $SKILLID_Mirror_of_Disenchantment = 1349; -Global Const $SKILLID_Simple_Thievery = 1350; -Global Const $SKILLID_Animate_Shambling_Horror = 1351; -Global Const $SKILLID_Order_of_Undeath = 1352; -Global Const $SKILLID_Putrid_Flesh = 1353; -Global Const $SKILLID_Feast_for_the_Dead = 1354; -Global Const $SKILLID_Jagged_Bones = 1355; -Global Const $SKILLID_Contagion = 1356; -Global Const $SKILLID_Ulcerous_Lungs = 1358; -Global Const $SKILLID_Pain_of_Disenchantment = 1359; -Global Const $SKILLID_Mark_of_Fury = 1360; -Global Const $SKILLID_Corrupt_Enchantment = 1362; -Global Const $SKILLID_Signet_of_Sorrow = 1363; -Global Const $SKILLID_Signet_of_Suffering = 1364; -Global Const $SKILLID_Signet_of_Lost_Souls = 1365; -Global Const $SKILLID_Well_of_Darkness = 1366; -Global Const $SKILLID_Blinding_Surge = 1367; -Global Const $SKILLID_Chilling_Winds = 1368; -Global Const $SKILLID_Lightning_Bolt = 1369; -Global Const $SKILLID_Storm_Djinns_Haste = 1370; -Global Const $SKILLID_Stone_Striker = 1371; -Global Const $SKILLID_Sandstorm = 1372; -Global Const $SKILLID_Stone_Sheath = 1373; -Global Const $SKILLID_Ebon_Hawk = 1374; -Global Const $SKILLID_Stoneflesh_Aura = 1375; -Global Const $SKILLID_Glyph_of_Restoration = 1376; -Global Const $SKILLID_Ether_Prism = 1377; -Global Const $SKILLID_Master_of_Magic = 1378; -Global Const $SKILLID_Glowing_Gaze = 1379; -Global Const $SKILLID_Savannah_Heat = 1380; -Global Const $SKILLID_Flame_Djinns_Haste = 1381; -Global Const $SKILLID_Freezing_Gust = 1382; -Global Const $SKILLID_Sulfurous_Haze = 1384; -Global Const $SKILLID_Sentry_Trap_skill = 1386; -Global Const $SKILLID_Judges_Intervention = 1390; -Global Const $SKILLID_Supportive_Spirit = 1391; -Global Const $SKILLID_Watchful_Healing = 1392; -Global Const $SKILLID_Healers_Boon = 1393; -Global Const $SKILLID_Healers_Covenant = 1394; -Global Const $SKILLID_Balthazars_Pendulum = 1395; -Global Const $SKILLID_Words_of_Comfort = 1396; -Global Const $SKILLID_Light_of_Deliverance = 1397; -Global Const $SKILLID_Scourge_Enchantment = 1398; -Global Const $SKILLID_Shield_of_Absorption = 1399; -Global Const $SKILLID_Reversal_of_Damage = 1400; -Global Const $SKILLID_Mending_Touch = 1401; -Global Const $SKILLID_Critical_Chop = 1402; -Global Const $SKILLID_Agonizing_Chop = 1403; -Global Const $SKILLID_Flail = 1404; -Global Const $SKILLID_Charging_Strike = 1405; -Global Const $SKILLID_Headbutt = 1406; -Global Const $SKILLID_Lions_Comfort = 1407; -Global Const $SKILLID_Rage_of_the_Ntouka = 1408; -Global Const $SKILLID_Mokele_Smash = 1409; -Global Const $SKILLID_Overbearing_Smash = 1410; -Global Const $SKILLID_Signet_of_Stamina = 1411; -Global Const $SKILLID_Youre_All_Alone = 1412; -Global Const $SKILLID_Burst_of_Aggression = 1413; -Global Const $SKILLID_Enraging_Charge = 1414; -Global Const $SKILLID_Crippling_Slash = 1415; -Global Const $SKILLID_Barbarous_Slice = 1416; -Global Const $SKILLID_Vial_of_Purified_Water = 1417; -Global Const $SKILLID_Disarm_Trap = 1418; -Global Const $SKILLID_Feeding_Frenzy_skill = 1419; -Global Const $SKILLID_Quake_Of_Ahdashim = 1420; -Global Const $SKILLID_Create_Light_of_Seborhin = 1422; -Global Const $SKILLID_Unlock_Cell = 1423; -Global Const $SKILLID_Wave_of_Torment = 1430; -Global Const $SKILLID_Corsairs_Net = 1433; -Global Const $SKILLID_Corrupted_Healing = 1434; -Global Const $SKILLID_Corrupted_Strength = 1436; -Global Const $SKILLID_Desert_Wurm_disguise = 1437; -Global Const $SKILLID_Junundu_Feast = 1438; -Global Const $SKILLID_Junundu_Strike = 1439; -Global Const $SKILLID_Junundu_Smash = 1440; -Global Const $SKILLID_Junundu_Siege = 1441; -Global Const $SKILLID_Junundu_Tunnel = 1442; -Global Const $SKILLID_Leave_Junundu = 1443; -Global Const $SKILLID_Summon_Torment = 1444; -Global Const $SKILLID_Signal_Flare = 1445; -Global Const $SKILLID_The_Elixir_of_Strength = 1446; -Global Const $SKILLID_Ehzah_from_Above = 1447; -Global Const $SKILLID_Last_Rites_of_Torment = 1449; -Global Const $SKILLID_Abaddons_Conspiracy = 1450; -Global Const $SKILLID_Hungers_Bite = 1451; -Global Const $SKILLID_Call_to_the_Torment = 1454; -Global Const $SKILLID_Command_of_Torment = 1455; -Global Const $SKILLID_Abaddons_Favor = 1456; -Global Const $SKILLID_Abaddons_Chosen = 1457; -Global Const $SKILLID_Enchantment_Collapse = 1458; -Global Const $SKILLID_Call_of_Sacrifice = 1459; -Global Const $SKILLID_Enemies_Must_Die = 1460; -Global Const $SKILLID_Earth_Vortex = 1461; -Global Const $SKILLID_Frost_Vortex = 1462; -Global Const $SKILLID_Rough_Current = 1463; -Global Const $SKILLID_Turbulent_Flow = 1464; -Global Const $SKILLID_Prepared_Shot = 1465; -Global Const $SKILLID_Burning_Arrow = 1466; -Global Const $SKILLID_Arcing_Shot = 1467; -Global Const $SKILLID_Strike_as_One = 1468; -Global Const $SKILLID_Crossfire = 1469; -Global Const $SKILLID_Barbed_Arrows = 1470; -Global Const $SKILLID_Scavengers_Focus = 1471; -Global Const $SKILLID_Toxicity = 1472; -Global Const $SKILLID_Quicksand = 1473; -Global Const $SKILLID_Storms_Embrace = 1474; -Global Const $SKILLID_Trappers_Speed = 1475; -Global Const $SKILLID_Tripwire = 1476; -Global Const $SKILLID_Kournan_Guardsman_Uniform = 1477; -Global Const $SKILLID_Renewing_Surge = 1478; -Global Const $SKILLID_Offering_of_Spirit = 1479; -Global Const $SKILLID_Spirits_Gift = 1480; -Global Const $SKILLID_Death_Pact_Signet = 1481; -Global Const $SKILLID_Reclaim_Essence = 1482; -Global Const $SKILLID_Banishing_Strike = 1483; -Global Const $SKILLID_Mystic_Sweep = 1484; -Global Const $SKILLID_Eremites_Attack = 1485; -Global Const $SKILLID_Reap_Impurities = 1486; -Global Const $SKILLID_Twin_Moon_Sweep = 1487; -Global Const $SKILLID_Victorious_Sweep = 1488; -Global Const $SKILLID_Irresistible_Sweep = 1489; -Global Const $SKILLID_Pious_Assault = 1490; -Global Const $SKILLID_Mystic_Twister = 1491; -Global Const $SKILLID_Grenths_Fingers = 1493; -Global Const $SKILLID_Aura_of_Thorns = 1495; -Global Const $SKILLID_Balthazars_Rage = 1496; -Global Const $SKILLID_Dust_Cloak = 1497; -Global Const $SKILLID_Staggering_Force = 1498; -Global Const $SKILLID_Pious_Renewal = 1499; -Global Const $SKILLID_Mirage_Cloak = 1500; -Global Const $SKILLID_Arcane_Zeal = 1502; -Global Const $SKILLID_Mystic_Vigor = 1503; -Global Const $SKILLID_Watchful_Intervention = 1504; -Global Const $SKILLID_Vow_of_Piety = 1505; -Global Const $SKILLID_Vital_Boon = 1506; -Global Const $SKILLID_Heart_of_Holy_Flame = 1507; -Global Const $SKILLID_Extend_Enchantments = 1508; -Global Const $SKILLID_Faithful_Intervention = 1509; -Global Const $SKILLID_Sand_Shards = 1510; -Global Const $SKILLID_Lyssas_Haste = 1512; -Global Const $SKILLID_Guiding_Hands = 1513; -Global Const $SKILLID_Fleeting_Stability = 1514; -Global Const $SKILLID_Armor_of_Sanctity = 1515; -Global Const $SKILLID_Mystic_Regeneration = 1516; -Global Const $SKILLID_Vow_of_Silence = 1517; -Global Const $SKILLID_Avatar_of_Balthazar = 1518; -Global Const $SKILLID_Avatar_of_Dwayna = 1519; -Global Const $SKILLID_Avatar_of_Grenth = 1520; -Global Const $SKILLID_Avatar_of_Lyssa = 1521; -Global Const $SKILLID_Avatar_of_Melandru = 1522; -Global Const $SKILLID_Meditation = 1523; -Global Const $SKILLID_Eremites_Zeal = 1524; -Global Const $SKILLID_Natural_Healing = 1525; -Global Const $SKILLID_Imbue_Health = 1526; -Global Const $SKILLID_Mystic_Healing = 1527; -Global Const $SKILLID_Dwaynas_Touch = 1528; -Global Const $SKILLID_Pious_Restoration = 1529; -Global Const $SKILLID_Signet_of_Pious_Light = 1530; -Global Const $SKILLID_Intimidating_Aura = 1531; -Global Const $SKILLID_Mystic_Sandstorm = 1532; -Global Const $SKILLID_Winds_of_Disenchantment = 1533; -Global Const $SKILLID_Rending_Touch = 1534; -Global Const $SKILLID_Crippling_Sweep = 1535; -Global Const $SKILLID_Wounding_Strike = 1536; -Global Const $SKILLID_Wearying_Strike = 1537; -Global Const $SKILLID_Lyssas_Assault = 1538; -Global Const $SKILLID_Chilling_Victory = 1539; -Global Const $SKILLID_Conviction = 1540; -Global Const $SKILLID_Enchanted_Haste = 1541; -Global Const $SKILLID_Pious_Concentration = 1542; -Global Const $SKILLID_Pious_Haste = 1543; -Global Const $SKILLID_Whirling_Charge = 1544; -Global Const $SKILLID_Test_of_Faith = 1545; -Global Const $SKILLID_Blazing_Spear = 1546; -Global Const $SKILLID_Mighty_Throw = 1547; -Global Const $SKILLID_Cruel_Spear = 1548; -Global Const $SKILLID_Harriers_Toss = 1549; -Global Const $SKILLID_Unblockable_Throw = 1550; -Global Const $SKILLID_Spear_of_Lightning = 1551; -Global Const $SKILLID_Wearying_Spear = 1552; -Global Const $SKILLID_Anthem_of_Fury = 1553; -Global Const $SKILLID_Crippling_Anthem = 1554; -Global Const $SKILLID_Defensive_Anthem = 1555; -Global Const $SKILLID_Godspeed = 1556; -Global Const $SKILLID_Anthem_of_Flame = 1557; -Global Const $SKILLID_Go_for_the_Eyes = 1558; -Global Const $SKILLID_Anthem_of_Envy = 1559; -Global Const $SKILLID_Song_of_Power = 1560; -Global Const $SKILLID_Zealous_Anthem = 1561; -Global Const $SKILLID_Aria_of_Zeal = 1562; -Global Const $SKILLID_Lyric_of_Zeal = 1563; -Global Const $SKILLID_Ballad_of_Restoration = 1564; -Global Const $SKILLID_Chorus_of_Restoration = 1565; -Global Const $SKILLID_Aria_of_Restoration = 1566; -Global Const $SKILLID_Song_of_Concentration = 1567; -Global Const $SKILLID_Anthem_of_Guidance = 1568; -Global Const $SKILLID_Energizing_Chorus = 1569; -Global Const $SKILLID_Song_of_Purification = 1570; -Global Const $SKILLID_Hexbreaker_Aria = 1571; -Global Const $SKILLID_Brace_Yourself = 1572; -Global Const $SKILLID_Awe = 1573; -Global Const $SKILLID_Enduring_Harmony = 1574; -Global Const $SKILLID_Blazing_Finale = 1575; -Global Const $SKILLID_Burning_Refrain = 1576; -Global Const $SKILLID_Finale_of_Restoration = 1577; -Global Const $SKILLID_Mending_Refrain = 1578; -Global Const $SKILLID_Purifying_Finale = 1579; -Global Const $SKILLID_Bladeturn_Refrain = 1580; -Global Const $SKILLID_Glowing_Signet = 1581; -Global Const $SKILLID_Leaders_Zeal = 1583; -Global Const $SKILLID_Leaders_Comfort = 1584; -Global Const $SKILLID_Signet_of_Synergy = 1585; -Global Const $SKILLID_Angelic_Protection = 1586; -Global Const $SKILLID_Angelic_Bond = 1587; -Global Const $SKILLID_Cautery_Signet = 1588; -Global Const $SKILLID_Stand_Your_Ground = 1589; -Global Const $SKILLID_Lead_the_Way = 1590; -Global Const $SKILLID_Make_Haste = 1591; -Global Const $SKILLID_We_Shall_Return = 1592; -Global Const $SKILLID_Never_Give_Up = 1593; -Global Const $SKILLID_Help_Me = 1594; -Global Const $SKILLID_Fall_Back = 1595; -Global Const $SKILLID_Incoming = 1596; -Global Const $SKILLID_Theyre_on_Fire = 1597; -Global Const $SKILLID_Never_Surrender = 1598; -Global Const $SKILLID_Its_just_a_flesh_wound = 1599; -Global Const $SKILLID_Barbed_Spear = 1600; -Global Const $SKILLID_Vicious_Attack = 1601; -Global Const $SKILLID_Stunning_Strike = 1602; -Global Const $SKILLID_Merciless_Spear = 1603; -Global Const $SKILLID_Disrupting_Throw = 1604; -Global Const $SKILLID_Wild_Throw = 1605; -Global Const $SKILLID_Curse_of_the_Staff_of_the_Mists = 1606; -Global Const $SKILLID_Aura_of_the_Staff_of_the_Mists = 1607; -Global Const $SKILLID_Power_of_the_Staff_of_the_Mists = 1608; -Global Const $SKILLID_Scepter_of_Ether = 1609; -Global Const $SKILLID_Summoning_of_the_Scepter = 1610; -Global Const $SKILLID_Rise_From_Your_Grave = 1611; -Global Const $SKILLID_Corsair_Disguise = 1613; -Global Const $SKILLID_Queen_Heal = 1616; -Global Const $SKILLID_Queen_Wail = 1617; -Global Const $SKILLID_Queen_Armor = 1618; -Global Const $SKILLID_Queen_Bite = 1619; -Global Const $SKILLID_Queen_Thump = 1620; -Global Const $SKILLID_Queen_Siege = 1621; -Global Const $SKILLID_Dervish_of_the_Mystic = 1624; -Global Const $SKILLID_Dervish_of_the_Wind = 1625; -Global Const $SKILLID_Paragon_of_Leadership = 1626; -Global Const $SKILLID_Paragon_of_Motivation = 1627; -Global Const $SKILLID_Dervish_of_the_Blade = 1628; -Global Const $SKILLID_Paragon_of_Command = 1629; -Global Const $SKILLID_Paragon_of_the_Spear = 1630; -Global Const $SKILLID_Dervish_of_the_Earth = 1631; -Global Const $SKILLID_Malicious_Strike = 1633; -Global Const $SKILLID_Shattering_Assault = 1634; -Global Const $SKILLID_Golden_Skull_Strike = 1635; -Global Const $SKILLID_Black_Spider_Strike = 1636; -Global Const $SKILLID_Golden_Fox_Strike = 1637; -Global Const $SKILLID_Deadly_Haste = 1638; -Global Const $SKILLID_Assassins_Remedy = 1639; -Global Const $SKILLID_Foxs_Promise = 1640; -Global Const $SKILLID_Feigned_Neutrality = 1641; -Global Const $SKILLID_Hidden_Caltrops = 1642; -Global Const $SKILLID_Assault_Enchantments = 1643; -Global Const $SKILLID_Wastrels_Collapse = 1644; -Global Const $SKILLID_Lift_Enchantment = 1645; -Global Const $SKILLID_Augury_of_Death = 1646; -Global Const $SKILLID_Signet_of_Toxic_Shock = 1647; -Global Const $SKILLID_Signet_of_Twilight = 1648; -Global Const $SKILLID_Way_of_the_Assassin = 1649; -Global Const $SKILLID_Shadow_Walk = 1650; -Global Const $SKILLID_Deaths_Retreat = 1651; -Global Const $SKILLID_Shadow_Prison = 1652; -Global Const $SKILLID_Swap = 1653; -Global Const $SKILLID_Shadow_Meld = 1654; -Global Const $SKILLID_Price_of_Pride = 1655; -Global Const $SKILLID_Air_of_Disenchantment = 1656; -Global Const $SKILLID_Signet_of_Clumsiness = 1657; -Global Const $SKILLID_Symbolic_Posture = 1658; -Global Const $SKILLID_Toxic_Chill = 1659; -Global Const $SKILLID_Well_of_Silence = 1660; -Global Const $SKILLID_Glowstone = 1661; -Global Const $SKILLID_Mind_Blast = 1662; -Global Const $SKILLID_Elemental_Flame = 1663; -Global Const $SKILLID_Invoke_Lightning = 1664; -Global Const $SKILLID_Battle_Cry = 1665; -Global Const $SKILLID_Energy_Shrine_Bonus = 1667; -Global Const $SKILLID_Northern_Health_Shrine_Bonus = 1668; -Global Const $SKILLID_Southern_Health_Shrine_Bonus = 1669; -Global Const $SKILLID_Curse_of_Silence = 1671; -Global Const $SKILLID_To_the_Pain_Hero_Battles = 1672; -Global Const $SKILLID_Edge_of_Reason = 1673; -Global Const $SKILLID_Depths_of_Madness_environment_effect = 1674; -Global Const $SKILLID_Cower_in_Fear = 1675; -Global Const $SKILLID_Dreadful_Pain = 1676; -Global Const $SKILLID_Veiled_Nightmare = 1677; -Global Const $SKILLID_Base_Protection = 1678; -Global Const $SKILLID_Kournan_Siege_Flame = 1679; -Global Const $SKILLID_Drake_Skin = 1680; -Global Const $SKILLID_Skale_Vigor = 1681; -Global Const $SKILLID_Pahnai_Salad_item_effect = 1682; -Global Const $SKILLID_Pensive_Guardian = 1683; -Global Const $SKILLID_Scribes_Insight = 1684; -Global Const $SKILLID_Holy_Haste = 1685; -Global Const $SKILLID_Glimmer_of_Light = 1686; -Global Const $SKILLID_Zealous_Benediction = 1687; -Global Const $SKILLID_Defenders_Zeal = 1688; -Global Const $SKILLID_Signet_of_Mystic_Wrath = 1689; -Global Const $SKILLID_Signet_of_Removal = 1690; -Global Const $SKILLID_Dismiss_Condition = 1691; -Global Const $SKILLID_Divert_Hexes = 1692; -Global Const $SKILLID_Counterattack = 1693; -Global Const $SKILLID_Magehunter_Strike = 1694; -Global Const $SKILLID_Soldiers_Strike = 1695; -Global Const $SKILLID_Decapitate = 1696; -Global Const $SKILLID_Magehunters_Smash = 1697; -Global Const $SKILLID_Soldiers_Stance = 1698; -Global Const $SKILLID_Soldiers_Defense = 1699; -Global Const $SKILLID_Frenzied_Defense = 1700; -Global Const $SKILLID_Steady_Stance = 1701; -Global Const $SKILLID_Steelfang_Slash = 1702; -Global Const $SKILLID_Sunspear_Battle_Call = 1703; -Global Const $SKILLID_Earth_Shattering_Blow = 1705; -Global Const $SKILLID_Corrupt_Power = 1706; -Global Const $SKILLID_Words_of_Madness = 1707; -Global Const $SKILLID_Gaze_of_MoavuKaal = 1708; -Global Const $SKILLID_Presence_of_the_Skale_Lord = 1709; -Global Const $SKILLID_Madness_Dart = 1710; -Global Const $SKILLID_Reform_Carvings = 1715; -Global Const $SKILLID_Sunspear_Siege = 1717; -Global Const $SKILLID_Soul_Torture = 1718; -Global Const $SKILLID_Screaming_Shot = 1719; -Global Const $SKILLID_Keen_Arrow = 1720; -Global Const $SKILLID_Rampage_as_One = 1721; -Global Const $SKILLID_Forked_Arrow = 1722; -Global Const $SKILLID_Disrupting_Accuracy = 1723; -Global Const $SKILLID_Experts_Dexterity = 1724; -Global Const $SKILLID_Roaring_Winds = 1725; -Global Const $SKILLID_Magebane_Shot = 1726; -Global Const $SKILLID_Natural_Stride = 1727; -Global Const $SKILLID_Hekets_Rampage = 1728; -Global Const $SKILLID_Smoke_Trap = 1729; -Global Const $SKILLID_Infuriating_Heat = 1730; -Global Const $SKILLID_Vocal_Was_Sogolon = 1731; -Global Const $SKILLID_Destructive_Was_Glaive = 1732; -Global Const $SKILLID_Wielders_Strike = 1733; -Global Const $SKILLID_Gaze_of_Fury = 1734; -Global Const $SKILLID_Gaze_of_Fury_attack = 1735; -Global Const $SKILLID_Spirits_Strength = 1736; -Global Const $SKILLID_Wielders_Zeal = 1737; -Global Const $SKILLID_Sight_Beyond_Sight = 1738; -Global Const $SKILLID_Renewing_Memories = 1739; -Global Const $SKILLID_Wielders_Remedy = 1740; -Global Const $SKILLID_Ghostmirror_Light = 1741; -Global Const $SKILLID_Signet_of_Ghostly_Might = 1742; -Global Const $SKILLID_Signet_of_Binding = 1743; -Global Const $SKILLID_Caretakers_Charge = 1744; -Global Const $SKILLID_Anguish = 1745; -Global Const $SKILLID_Anguish_attack = 1746; -Global Const $SKILLID_Empowerment = 1747; -Global Const $SKILLID_Recovery = 1748; -Global Const $SKILLID_Weapon_of_Fury = 1749; -Global Const $SKILLID_Xinraes_Weapon = 1750; -Global Const $SKILLID_Warmongers_Weapon = 1751; -Global Const $SKILLID_Weapon_of_Remedy = 1752; -Global Const $SKILLID_Rending_Sweep = 1753; -Global Const $SKILLID_Onslaught = 1754; -Global Const $SKILLID_Mystic_Corruption = 1755; -Global Const $SKILLID_Grenths_Grasp = 1756; -Global Const $SKILLID_Veil_of_Thorns = 1757; -Global Const $SKILLID_Harriers_Grasp = 1758; -Global Const $SKILLID_Vow_of_Strength = 1759; -Global Const $SKILLID_Ebon_Dust_Aura = 1760; -Global Const $SKILLID_Zealous_Vow = 1761; -Global Const $SKILLID_Heart_of_Fury = 1762; -Global Const $SKILLID_Zealous_Renewal = 1763; -Global Const $SKILLID_Attackers_Insight = 1764; -Global Const $SKILLID_Rending_Aura = 1765; -Global Const $SKILLID_Featherfoot_Grace = 1766; -Global Const $SKILLID_Reapers_Sweep = 1767; -Global Const $SKILLID_Harriers_Haste = 1768; -Global Const $SKILLID_Focused_Anger = 1769; -Global Const $SKILLID_Natural_Temper = 1770; -Global Const $SKILLID_Song_of_Restoration = 1771; -Global Const $SKILLID_Lyric_of_Purification = 1772; -Global Const $SKILLID_Soldiers_Fury = 1773; -Global Const $SKILLID_Aggressive_Refrain = 1774; -Global Const $SKILLID_Energizing_Finale = 1775; -Global Const $SKILLID_Signet_of_Aggression = 1776; -Global Const $SKILLID_Remedy_Signet = 1777; -Global Const $SKILLID_Signet_of_Return = 1778; -Global Const $SKILLID_Make_Your_Time = 1779; -Global Const $SKILLID_Cant_Touch_This = 1780; -Global Const $SKILLID_Find_Their_Weakness = 1781; -Global Const $SKILLID_The_Power_Is_Yours = 1782; -Global Const $SKILLID_Slayers_Spear = 1783; -Global Const $SKILLID_Swift_Javelin = 1784; -Global Const $SKILLID_Skale_Hunt = 1790; -Global Const $SKILLID_Mandragor_Hunt = 1791; -Global Const $SKILLID_Skree_Battle = 1792; -Global Const $SKILLID_Insect_Hunt = 1793; -Global Const $SKILLID_Corsair_Bounty = 1794; -Global Const $SKILLID_Plant_Hunt = 1795; -Global Const $SKILLID_Undead_Hunt = 1796; -Global Const $SKILLID_Eternal_Suffering = 1797; -Global Const $SKILLID_Eternal_Languor = 1800; -Global Const $SKILLID_Eternal_Lethargy = 1803; -Global Const $SKILLID_Thirst_of_the_Drought = 1808; -Global Const $SKILLID_Lightbringer = 1813; -Global Const $SKILLID_Lightbringers_Gaze = 1814; -Global Const $SKILLID_Lightbringer_Signet = 1815; -Global Const $SKILLID_Sunspear_Rebirth_Signet = 1816; -Global Const $SKILLID_Wisdom = 1817; -Global Const $SKILLID_Maddened_Strike = 1818; -Global Const $SKILLID_Maddened_Stance = 1819; -Global Const $SKILLID_Spirit_Form = 1820; -Global Const $SKILLID_Monster_Hunt = 1822; -Global Const $SKILLID_Elemental_Hunt = 1826; -Global Const $SKILLID_Demon_Hunt = 1831; -Global Const $SKILLID_Minotaur_Hunt = 1832; -Global Const $SKILLID_Heket_Hunt = 1837; -Global Const $SKILLID_Kournan_Bounty = 1839; -Global Const $SKILLID_Dhuum_Battle = 1844; -Global Const $SKILLID_Menzies_Battle = 1845; -Global Const $SKILLID_Monolith_Hunt = 1847; -Global Const $SKILLID_Margonite_Battle = 1849; -Global Const $SKILLID_Titan_Hunt = 1851; -Global Const $SKILLID_Giant_Hunt = 1853; -Global Const $SKILLID_Kournan_Siege = 1855; -Global Const $SKILLID_Lose_your_Head = 1856; -Global Const $SKILLID_Altar_Buff = 1859; -Global Const $SKILLID_Choking_Breath = 1861; -Global Const $SKILLID_Junundu_Bite = 1862; -Global Const $SKILLID_Blinding_Breath = 1863; -Global Const $SKILLID_Burning_Breath = 1864; -Global Const $SKILLID_Junundu_Wail = 1865; -Global Const $SKILLID_Capture_Point = 1866; -Global Const $SKILLID_Approaching_the_Vortex = 1867; -Global Const $SKILLID_Avatar_of_Sweetness = 1871; -Global Const $SKILLID_Corrupted_Lands = 1873; -Global Const $SKILLID_Unknown_Junundu_Ability = 1876; -Global Const $SKILLID_Torment_Slash_Smothering_Tendrils = 1880; -Global Const $SKILLID_Bonds_of_Torment = 1881; -Global Const $SKILLID_Shadow_Smash = 1882; -Global Const $SKILLID_Consume_Torment = 1884; -Global Const $SKILLID_Banish_Enchantment = 1885; -Global Const $SKILLID_Summoning_Shadows = 1886; -Global Const $SKILLID_Lightbringers_Insight = 1887; -Global Const $SKILLID_Repressive_Energy = 1889; -Global Const $SKILLID_Enduring_Torment = 1890; -Global Const $SKILLID_Shroud_of_Darkness = 1891; -Global Const $SKILLID_Demonic_Miasma = 1892; -Global Const $SKILLID_Enraged = 1893; -Global Const $SKILLID_Touch_of_Aaaaarrrrrrggghhh = 1894; -Global Const $SKILLID_Wild_Smash = 1895; -Global Const $SKILLID_Unyielding_Anguish = 1896; -Global Const $SKILLID_Jadoths_Storm_of_Judgment = 1897; -Global Const $SKILLID_Anguish_Hunt = 1898; -Global Const $SKILLID_Avatar_of_Holiday_Cheer = 1899; -Global Const $SKILLID_Side_Step = 1900; -Global Const $SKILLID_Jack_Frost = 1901; -Global Const $SKILLID_Avatar_of_Grenth_snow_fighting_skill = 1902; -Global Const $SKILLID_Avatar_of_Dwayna_snow_fighting_skill = 1903; -Global Const $SKILLID_Steady_Aim = 1904; -Global Const $SKILLID_Rudis_Red_Nose = 1905; -Global Const $SKILLID_Volatile_Charr_Crystal = 1911; -Global Const $SKILLID_Hard_mode = 1912; -Global Const $SKILLID_Sugar_Jolt = 1916; -Global Const $SKILLID_Rollerbeetle_Racer = 1917; -Global Const $SKILLID_Ram = 1918; -Global Const $SKILLID_Harden_Shell = 1919; -Global Const $SKILLID_Rollerbeetle_Dash = 1920; -Global Const $SKILLID_Super_Rollerbeetle = 1921; -Global Const $SKILLID_Rollerbeetle_Echo = 1922; -Global Const $SKILLID_Distracting_Lunge = 1923; -Global Const $SKILLID_Rollerbeetle_Blast = 1924; -Global Const $SKILLID_Spit_Rocks = 1925; -Global Const $SKILLID_Lunar_Blessing = 1926; -Global Const $SKILLID_Lucky_Aura = 1927; -Global Const $SKILLID_Spiritual_Possession = 1928; -Global Const $SKILLID_Water = 1929; -Global Const $SKILLID_Pig_Form = 1930; -Global Const $SKILLID_Beetle_Metamorphosis = 1931; -Global Const $SKILLID_Golden_Egg_item_effect = 1934; -Global Const $SKILLID_Infernal_Rage = 1937; -Global Const $SKILLID_Putrid_Flames = 1938; -Global Const $SKILLID_Flame_Call = 1940; -Global Const $SKILLID_Whirling_Fires = 1942; -Global Const $SKILLID_Charr_Siege_Attack_What_Must_Be_Done = 1943; -Global Const $SKILLID_Charr_Siege_Attack_Against_the_Charr = 1944; -Global Const $SKILLID_Birthday_Cupcake_skill = 1945; -Global Const $SKILLID_Blessing_of_the_Luxons = 1947; -Global Const $SKILLID_Shadow_Sanctuary = 1948; -Global Const $SKILLID_Ether_Nightmare = 1949; -Global Const $SKILLID_Signet_of_Corruption = 1950; -Global Const $SKILLID_Elemental_Lord = 1951; -Global Const $SKILLID_Selfless_Spirit = 1952; -Global Const $SKILLID_Triple_Shot = 1953; -Global Const $SKILLID_Save_Yourselves = 1954; -Global Const $SKILLID_Aura_of_Holy_Might = 1955; -Global Const $SKILLID_Spear_of_Fury = 1957; -Global Const $SKILLID_Fire_Dart = 1983; -Global Const $SKILLID_Ice_Dart = 1984; -Global Const $SKILLID_Poison_Dart = 1985; -Global Const $SKILLID_Vampiric_Assault = 1986; -Global Const $SKILLID_Lotus_Strike = 1987; -Global Const $SKILLID_Golden_Fang_Strike = 1988; -Global Const $SKILLID_Falling_Lotus_Strike = 1990; -Global Const $SKILLID_Sadists_Signet = 1991; -Global Const $SKILLID_Signet_of_Distraction = 1992; -Global Const $SKILLID_Signet_of_Recall = 1993; -Global Const $SKILLID_Power_Lock = 1994; -Global Const $SKILLID_Waste_Not_Want_Not = 1995; -Global Const $SKILLID_Sum_of_All_Fears = 1996; -Global Const $SKILLID_Withering_Aura = 1997; -Global Const $SKILLID_Cacophony = 1998; -Global Const $SKILLID_Winters_Embrace = 1999; -Global Const $SKILLID_Earthen_Shackles = 2000; -Global Const $SKILLID_Ward_of_Weakness = 2001; -Global Const $SKILLID_Glyph_of_Swiftness = 2002; -Global Const $SKILLID_Cure_Hex = 2003; -Global Const $SKILLID_Smite_Condition = 2004; -Global Const $SKILLID_Smiters_Boon = 2005; -Global Const $SKILLID_Castigation_Signet = 2006; -Global Const $SKILLID_Purifying_Veil = 2007; -Global Const $SKILLID_Pulverizing_Smash = 2008; -Global Const $SKILLID_Keen_Chop = 2009; -Global Const $SKILLID_Knee_Cutter = 2010; -Global Const $SKILLID_Grapple = 2011; -Global Const $SKILLID_Radiant_Scythe = 2012; -Global Const $SKILLID_Grenths_Aura = 2013; -Global Const $SKILLID_Signet_of_Pious_Restraint = 2014; -Global Const $SKILLID_Farmers_Scythe = 2015; -Global Const $SKILLID_Energetic_Was_Lee_Sa = 2016; -Global Const $SKILLID_Anthem_of_Weariness = 2017; -Global Const $SKILLID_Anthem_of_Disruption = 2018; -Global Const $SKILLID_Freezing_Ground = 2020; -Global Const $SKILLID_Fire_Jet = 2022; -Global Const $SKILLID_Ice_Jet = 2023; -Global Const $SKILLID_Poison_Jet = 2024; -Global Const $SKILLID_Fire_Spout = 2027; -Global Const $SKILLID_Ice_Spout = 2028; -Global Const $SKILLID_Poison_Spout = 2029; -Global Const $SKILLID_Summon_Spirits = 2051; -Global Const $SKILLID_Shadow_Fang = 2052; -Global Const $SKILLID_Calculated_Risk = 2053; -Global Const $SKILLID_Shrinking_Armor = 2054; -Global Const $SKILLID_Aneurysm = 2055; -Global Const $SKILLID_Wandering_Eye = 2056; -Global Const $SKILLID_Foul_Feast = 2057; -Global Const $SKILLID_Putrid_Bile = 2058; -Global Const $SKILLID_Shell_Shock = 2059; -Global Const $SKILLID_Glyph_of_Immolation = 2060; -Global Const $SKILLID_Patient_Spirit = 2061; -Global Const $SKILLID_Healing_Ribbon = 2062; -Global Const $SKILLID_Aura_of_Stability = 2063; -Global Const $SKILLID_Spotless_Mind = 2064; -Global Const $SKILLID_Spotless_Soul = 2065; -Global Const $SKILLID_Disarm = 2066; -Global Const $SKILLID_I_Meant_to_Do_That = 2067; -Global Const $SKILLID_Rapid_Fire = 2068; -Global Const $SKILLID_Sloth_Hunters_Shot = 2069; -Global Const $SKILLID_Aura_Slicer = 2070; -Global Const $SKILLID_Zealous_Sweep = 2071; -Global Const $SKILLID_Pure_Was_Li_Ming = 2072; -Global Const $SKILLID_Weapon_of_Aggression = 2073; -Global Const $SKILLID_Chest_Thumper = 2074; -Global Const $SKILLID_Hasty_Refrain = 2075; -Global Const $SKILLID_Cracked_Armor = 2077; -Global Const $SKILLID_Berserk = 2078; -Global Const $SKILLID_Fleshreavers_Escape = 2079; -Global Const $SKILLID_Chomp = 2080; -Global Const $SKILLID_Twisting_Jaws = 2081; -Global Const $SKILLID_Mandragors_Charge = 2083; -Global Const $SKILLID_Rock_Slide = 2084; -Global Const $SKILLID_Avalanche_effect = 2085; -Global Const $SKILLID_Snaring_Web = 2086; -Global Const $SKILLID_Ceiling_Collapse = 2087; -Global Const $SKILLID_Trample = 2088; -Global Const $SKILLID_Wurm_Bile = 2089 ; -Global Const $SKILLID_Critical_Agility = 2101; -Global Const $SKILLID_Cry_of_Pain = 2102; -Global Const $SKILLID_Necrosis = 2103; -Global Const $SKILLID_Intensity = 2104; -Global Const $SKILLID_Seed_of_Life = 2105; -Global Const $SKILLID_Call_of_the_Eye = 2106; -Global Const $SKILLID_Whirlwind_Attack = 2107; -Global Const $SKILLID_Never_Rampage_Alone = 2108; -Global Const $SKILLID_Eternal_Aura = 2109; -Global Const $SKILLID_Vampirism = 2110; -Global Const $SKILLID_Vampirism_attack = 2111; -Global Const $SKILLID_Theres_Nothing_to_Fear = 2112; -Global Const $SKILLID_Ursan_Rage_Blood_Washes_Blood = 2113; -Global Const $SKILLID_Ursan_Strike_Blood_Washes_Blood = 2114; -Global Const $SKILLID_Sneak_Attack = 2116; -Global Const $SKILLID_Firebomb_Explosion = 2117; -Global Const $SKILLID_Firebomb = 2118; -Global Const $SKILLID_Shield_of_Fire = 2119; -Global Const $SKILLID_Spirit_World_Retreat = 2122; -Global Const $SKILLID_Shattered_Spirit = 2124; -Global Const $SKILLID_Spirit_Roar = 2125; -Global Const $SKILLID_Spirit_Senses = 2126; -Global Const $SKILLID_Unseen_Aggression = 2127; -Global Const $SKILLID_Volfen_Pounce_Curse_of_the_Nornbear = 2128; -Global Const $SKILLID_Volfen_Claw_Curse_of_the_Nornbear = 2129; -Global Const $SKILLID_Volfen_Bloodlust_Curse_of_the_Nornbear = 2131; -Global Const $SKILLID_Volfen_Agility_Curse_of_the_Nornbear = 2132; -Global Const $SKILLID_Volfen_Blessing_Curse_of_the_Nornbear = 2133; -Global Const $SKILLID_Charging_Spirit = 2134; -Global Const $SKILLID_Trampling_Ox = 2135; -Global Const $SKILLID_Smoke_Powder_Defense = 2136; -Global Const $SKILLID_Confusing_Images = 2137; -Global Const $SKILLID_Hexers_Vigor = 2138; -Global Const $SKILLID_Masochism = 2139; -Global Const $SKILLID_Piercing_Trap = 2140; -Global Const $SKILLID_Companionship = 2141; -Global Const $SKILLID_Feral_Aggression = 2142; -Global Const $SKILLID_Disrupting_Shot = 2143; -Global Const $SKILLID_Volley = 2144; -Global Const $SKILLID_Expert_Focus = 2145; -Global Const $SKILLID_Pious_Fury = 2146; -Global Const $SKILLID_Crippling_Victory = 2147; -Global Const $SKILLID_Sundering_Weapon = 2148; -Global Const $SKILLID_Weapon_of_Renewal = 2149; -Global Const $SKILLID_Maiming_Spear = 2150; -Global Const $SKILLID_Temporal_Sheen = 2151; -Global Const $SKILLID_Flux_Overload = 2152; -Global Const $SKILLID_Phase_Shield_effect = 2154; -Global Const $SKILLID_Phase_Shield = 2155; -Global Const $SKILLID_Vitality_Transfer = 2156; -Global Const $SKILLID_Golem_Strike = 2157; -Global Const $SKILLID_Bloodstone_Slash = 2158; -Global Const $SKILLID_Energy_Blast_golem = 2159; -Global Const $SKILLID_Chaotic_Energy = 2160; -Global Const $SKILLID_Golem_Fire_Shield = 2161; -Global Const $SKILLID_The_Way_of_Duty = 2162; -Global Const $SKILLID_The_Way_of_Kinship = 2163; -Global Const $SKILLID_Diamondshard_Mist_environment_effect = 2164; -Global Const $SKILLID_Diamondshard_Grave = 2165; -Global Const $SKILLID_The_Way_of_Strength = 2166; -Global Const $SKILLID_Diamondshard_Mist = 2167; -Global Const $SKILLID_Raven_Blessing_A_Gate_Too_Far = 2168; -Global Const $SKILLID_Raven_Flight_A_Gate_Too_Far = 2170; -Global Const $SKILLID_Raven_Shriek_A_Gate_Too_Far = 2171; -Global Const $SKILLID_Raven_Swoop_A_Gate_Too_Far = 2172; -Global Const $SKILLID_Raven_Talons_A_Gate_Too_Far = 2173; -Global Const $SKILLID_Aspect_of_Oak = 2174; -Global Const $SKILLID_Tremor = 2176; -Global Const $SKILLID_Pyroclastic_Shot = 2180; -Global Const $SKILLID_Rolling_Shift = 2184; -Global Const $SKILLID_Powder_Keg_Explosion = 2185; -Global Const $SKILLID_Signet_of_Deadly_Corruption = 2186; -Global Const $SKILLID_Way_of_the_Master = 2187; -Global Const $SKILLID_Defile_Defenses = 2188; -Global Const $SKILLID_Angorodons_Gaze = 2189; -Global Const $SKILLID_Magnetic_Surge = 2190; -Global Const $SKILLID_Slippery_Ground = 2191; -Global Const $SKILLID_Glowing_Ice = 2192; -Global Const $SKILLID_Energy_Blast = 2193; -Global Const $SKILLID_Distracting_Strike = 2194; -Global Const $SKILLID_Symbolic_Strike = 2195; -Global Const $SKILLID_Soldiers_Speed = 2196; -Global Const $SKILLID_Body_Blow = 2197; -Global Const $SKILLID_Body_Shot = 2198; -Global Const $SKILLID_Poison_Tip_Signet = 2199; -Global Const $SKILLID_Signet_of_Mystic_Speed = 2200; -Global Const $SKILLID_Shield_of_Force = 2201; -Global Const $SKILLID_Mending_Grip = 2202; -Global Const $SKILLID_Spiritleech_Aura = 2203; -Global Const $SKILLID_Rejuvenation = 2204; -Global Const $SKILLID_Agony = 2205; -Global Const $SKILLID_Ghostly_Weapon = 2206; -Global Const $SKILLID_Inspirational_Speech = 2207; -Global Const $SKILLID_Burning_Shield = 2208; -Global Const $SKILLID_Holy_Spear = 2209; -Global Const $SKILLID_Spear_Swipe = 2210; -Global Const $SKILLID_Alkars_Alchemical_Acid = 2211; -Global Const $SKILLID_Light_of_Deldrimor = 2212; -Global Const $SKILLID_Ear_Bite = 2213; -Global Const $SKILLID_Low_Blow = 2214; -Global Const $SKILLID_Brawling_Headbutt = 2215; -Global Const $SKILLID_Dont_Trip = 2216; -Global Const $SKILLID_By_Urals_Hammer = 2217; -Global Const $SKILLID_Drunken_Master = 2218; -Global Const $SKILLID_Great_Dwarf_Weapon = 2219; -Global Const $SKILLID_Great_Dwarf_Armor = 2220; -Global Const $SKILLID_Breath_of_the_Great_Dwarf = 2221; -Global Const $SKILLID_Snow_Storm = 2222; -Global Const $SKILLID_Black_Powder_Mine = 2223; -Global Const $SKILLID_Summon_Mursaat = 2224; -Global Const $SKILLID_Summon_Ruby_Djinn = 2225; -Global Const $SKILLID_Summon_Ice_Imp = 2226; -Global Const $SKILLID_Summon_Naga_Shaman = 2227; -Global Const $SKILLID_Deft_Strike = 2228; -Global Const $SKILLID_Signet_of_Infection = 2229; -Global Const $SKILLID_Tryptophan_Signet = 2230; -Global Const $SKILLID_Ebon_Battle_Standard_of_Courage = 2231; -Global Const $SKILLID_Ebon_Battle_Standard_of_Wisdom = 2232; -Global Const $SKILLID_Ebon_Battle_Standard_of_Honor = 2233; -Global Const $SKILLID_Ebon_Vanguard_Sniper_Support = 2234; -Global Const $SKILLID_Ebon_Vanguard_Assassin_Support = 2235; -Global Const $SKILLID_Well_of_Ruin = 2236; -Global Const $SKILLID_Atrophy = 2237; -Global Const $SKILLID_Spear_of_Redemption = 2238; -Global Const $SKILLID_Gelatinous_Material_Explosion = 2240; -Global Const $SKILLID_Gelatinous_Corpse_Consumption = 2241; -Global Const $SKILLID_Gelatinous_Absorption = 2243; -Global Const $SKILLID_Unstable_Ooze_Explosion = 2244; -Global Const $SKILLID_Unstable_Aura = 2246; -Global Const $SKILLID_Unstable_Pulse = 2247; -Global Const $SKILLID_Polymock_Power_Drain = 2248; -Global Const $SKILLID_Polymock_Block = 2249; -Global Const $SKILLID_Polymock_Glyph_of_Concentration = 2250; -Global Const $SKILLID_Polymock_Ether_Signet = 2251; -Global Const $SKILLID_Polymock_Glyph_of_Power = 2252; -Global Const $SKILLID_Polymock_Overload = 2253; -Global Const $SKILLID_Polymock_Glyph_Destabilization = 2254; -Global Const $SKILLID_Polymock_Mind_Wreck = 2255; -Global Const $SKILLID_Order_of_Unholy_Vigor = 2256; -Global Const $SKILLID_Order_of_the_Lich = 2257; -Global Const $SKILLID_Master_of_Necromancy = 2258; -Global Const $SKILLID_Animate_Undead = 2259; -Global Const $SKILLID_Polymock_Deathly_Chill = 2260; -Global Const $SKILLID_Polymock_Rising_Bile = 2261; -Global Const $SKILLID_Polymock_Rotting_Flesh = 2262; -Global Const $SKILLID_Polymock_Lightning_Strike = 2263; -Global Const $SKILLID_Polymock_Lightning_Orb = 2264; -Global Const $SKILLID_Polymock_Lightning_Djinns_Haste = 2265; -Global Const $SKILLID_Polymock_Flare = 2266; -Global Const $SKILLID_Polymock_Immolate = 2267; -Global Const $SKILLID_Polymock_Meteor = 2268; -Global Const $SKILLID_Polymock_Ice_Spear = 2269; -Global Const $SKILLID_Polymock_Icy_Prison = 2270; -Global Const $SKILLID_Polymock_Mind_Freeze = 2271; -Global Const $SKILLID_Polymock_Ice_Shard_Storm = 2272; -Global Const $SKILLID_Polymock_Frozen_Trident = 2273; -Global Const $SKILLID_Polymock_Smite = 2274; -Global Const $SKILLID_Polymock_Smite_Hex = 2275; -Global Const $SKILLID_Polymock_Bane_Signet = 2276; -Global Const $SKILLID_Polymock_Stone_Daggers = 2277; -Global Const $SKILLID_Polymock_Obsidian_Flame = 2278; -Global Const $SKILLID_Polymock_Earthquake = 2279; -Global Const $SKILLID_Polymock_Frozen_Armor = 2280; -Global Const $SKILLID_Polymock_Glyph_Freeze = 2281; -Global Const $SKILLID_Polymock_Fireball = 2282; -Global Const $SKILLID_Polymock_Rodgorts_Invocation = 2283; -Global Const $SKILLID_Polymock_Calculated_Risk = 2284; -Global Const $SKILLID_Polymock_Recurring_Insecurity = 2285; -Global Const $SKILLID_Polymock_Backfire = 2286; -Global Const $SKILLID_Polymock_Guilt = 2287; -Global Const $SKILLID_Polymock_Lamentation = 2288; -Global Const $SKILLID_Polymock_Spirit_Rift = 2289; -Global Const $SKILLID_Polymock_Painful_Bond = 2290; -Global Const $SKILLID_Polymock_Signet_of_Clumsiness = 2291; -Global Const $SKILLID_Polymock_Migraine = 2292; -Global Const $SKILLID_Polymock_Glowing_Gaze = 2293; -Global Const $SKILLID_Polymock_Searing_Flames = 2294; -Global Const $SKILLID_Polymock_Signet_of_Revenge = 2295; -Global Const $SKILLID_Polymock_Signet_of_Smiting = 2296; -Global Const $SKILLID_Polymock_Stoning = 2297; -Global Const $SKILLID_Polymock_Eruption = 2298; -Global Const $SKILLID_Polymock_Shock_Arrow = 2299; -Global Const $SKILLID_Polymock_Mind_Shock = 2300; -Global Const $SKILLID_Polymock_Piercing_Light_Spear = 2301; -Global Const $SKILLID_Polymock_Mind_Blast = 2302; -Global Const $SKILLID_Polymock_Savannah_Heat = 2303; -Global Const $SKILLID_Polymock_Diversion = 2304; -Global Const $SKILLID_Polymock_Lightning_Blast = 2305; -Global Const $SKILLID_Polymock_Poisoned_Ground = 2306; -Global Const $SKILLID_Polymock_Icy_Bonds = 2307; -Global Const $SKILLID_Polymock_Sandstorm = 2308; -Global Const $SKILLID_Polymock_Banish = 2309; -Global Const $SKILLID_Mergoyle_Form = 2310; -Global Const $SKILLID_Skale_Form = 2311; -Global Const $SKILLID_Gargoyle_Form = 2312; -Global Const $SKILLID_Ice_Imp_Form = 2313; -Global Const $SKILLID_Fire_Imp_Form = 2314; -Global Const $SKILLID_Kappa_Form = 2315; -Global Const $SKILLID_Aloe_Seed_Form = 2316; -Global Const $SKILLID_Earth_Elemental_Form = 2317; -Global Const $SKILLID_Fire_Elemental_Form = 2318; -Global Const $SKILLID_Ice_Elemental_Form = 2319; -Global Const $SKILLID_Mirage_Iboga_Form = 2320; -Global Const $SKILLID_Wind_Rider_Form = 2321; -Global Const $SKILLID_Naga_Shaman_Form = 2322; -Global Const $SKILLID_Mantis_Dreamweaver_Form = 2323; -Global Const $SKILLID_Ruby_Djinn_Form = 2324; -Global Const $SKILLID_Gaki_Form = 2325; -Global Const $SKILLID_Stone_Rain_Form = 2326; -Global Const $SKILLID_Mursaat_Elementalist_Form = 2327; -Global Const $SKILLID_Crystal_Shield = 2328; -Global Const $SKILLID_Crystal_Snare = 2329; -Global Const $SKILLID_Paranoid_Indignation = 2330; -Global Const $SKILLID_Searing_Breath = 2331; -Global Const $SKILLID_Brawling = 2333; -Global Const $SKILLID_Brawling_Block = 2334; -Global Const $SKILLID_Brawling_Jab = 2335; -Global Const $SKILLID_Brawling_Straight_Right = 2337; -Global Const $SKILLID_Brawling_Hook = 2338; -Global Const $SKILLID_Brawling_Uppercut = 2340; -Global Const $SKILLID_Brawling_Combo_Punch = 2341; -Global Const $SKILLID_Brawling_Headbutt_Brawling_skill = 2342; -Global Const $SKILLID_STAND_UP = 2343; -Global Const $SKILLID_Call_of_Destruction = 2344; -Global Const $SKILLID_Lava_Ground = 2346; -Global Const $SKILLID_Lava_Wave = 2347; -Global Const $SKILLID_Charr_Siege_Attack_Assault_on_the_Stronghold = 2352; -Global Const $SKILLID_Finish_Him = 2353; -Global Const $SKILLID_Dodge_This = 2354; -Global Const $SKILLID_I_Am_The_Strongest = 2355; -Global Const $SKILLID_I_Am_Unstoppable = 2356; -Global Const $SKILLID_A_Touch_of_Guile = 2357; -Global Const $SKILLID_You_Move_Like_a_Dwarf = 2358; -Global Const $SKILLID_You_Are_All_Weaklings = 2359; -Global Const $SKILLID_Feel_No_Pain = 2360; -Global Const $SKILLID_Club_of_a_Thousand_Bears = 2361; -Global Const $SKILLID_Lava_Blast = 2364; -Global Const $SKILLID_Thunderfist_Strike = 2365; -Global Const $SKILLID_Alkars_Concoction = 2367; -Global Const $SKILLID_Murakais_Consumption = 2368; -Global Const $SKILLID_Murakais_Censure = 2369; -Global Const $SKILLID_Murakais_Calamity = 2370; -Global Const $SKILLID_Murakais_Storm_of_Souls = 2371; -Global Const $SKILLID_Edification = 2372; -Global Const $SKILLID_Heart_of_the_Norn = 2373; -Global Const $SKILLID_Ursan_Blessing = 2374; -Global Const $SKILLID_Ursan_Strike = 2375; -Global Const $SKILLID_Ursan_Rage = 2376; -Global Const $SKILLID_Ursan_Roar = 2377; -Global Const $SKILLID_Ursan_Force = 2378; -Global Const $SKILLID_Volfen_Blessing = 2379; -Global Const $SKILLID_Volfen_Claw = 2380; -Global Const $SKILLID_Volfen_Pounce = 2381; -Global Const $SKILLID_Volfen_Bloodlust = 2382; -Global Const $SKILLID_Volfen_Agility = 2383; -Global Const $SKILLID_Raven_Blessing = 2384; -Global Const $SKILLID_Raven_Talons = 2385; -Global Const $SKILLID_Raven_Swoop = 2386; -Global Const $SKILLID_Raven_Shriek = 2387; -Global Const $SKILLID_Raven_Flight = 2388; -Global Const $SKILLID_Totem_of_Man = 2389; -Global Const $SKILLID_Murakais_Call = 2391; -Global Const $SKILLID_Spawn_Pods = 2392; -Global Const $SKILLID_Enraged_Blast = 2393; -Global Const $SKILLID_Spawn_Hatchling = 2394; -Global Const $SKILLID_Ursan_Roar_Blood_Washes_Blood = 2395; -Global Const $SKILLID_Ursan_Force_Blood_Washes_Blood = 2396; -Global Const $SKILLID_Ursan_Aura = 2397; -Global Const $SKILLID_Consume_Flames = 2398; -Global Const $SKILLID_Charr_Flame_Keeper_Form = 2401; -Global Const $SKILLID_Titan_Form = 2402; -Global Const $SKILLID_Skeletal_Mage_Form = 2403; -Global Const $SKILLID_Smoke_Wraith_Form = 2404; -Global Const $SKILLID_Bone_Dragon_Form = 2405; -Global Const $SKILLID_Dwarven_Arcanist_Form = 2407; -Global Const $SKILLID_Dolyak_Rider_Form = 2408; -Global Const $SKILLID_Extract_Inscription = 2409; -Global Const $SKILLID_Charr_Shaman_Form = 2410; -Global Const $SKILLID_Mindbender = 2411; -Global Const $SKILLID_Smooth_Criminal = 2412; -Global Const $SKILLID_Technobabble = 2413; -Global Const $SKILLID_Radiation_Field = 2414; -Global Const $SKILLID_Asuran_Scan = 2415; -Global Const $SKILLID_Air_of_Superiority = 2416; -Global Const $SKILLID_Mental_Block = 2417; -Global Const $SKILLID_Pain_Inverter = 2418; -Global Const $SKILLID_Healing_Salve = 2419; -Global Const $SKILLID_Ebon_Escape = 2420; -Global Const $SKILLID_Weakness_Trap = 2421; -Global Const $SKILLID_Winds = 2422; -Global Const $SKILLID_Dwarven_Stability = 2423; -Global Const $SKILLID_StoutHearted = 2424; -Global Const $SKILLID_Decipher_Inscriptions = 2426; -Global Const $SKILLID_Rebel_Yell = 2427; -Global Const $SKILLID_Asuran_Flame_Staff = 2429; -Global Const $SKILLID_Aura_of_the_Bloodstone = 2430; -Global Const $SKILLID_Haunted_Ground = 2433; -Global Const $SKILLID_Asuran_Bodyguard = 2434; -Global Const $SKILLID_Energy_Channel = 2437; -Global Const $SKILLID_Hunt_Rampage_Asura = 2438; -Global Const $SKILLID_Boss_Bounty = 2440; -Global Const $SKILLID_Hunt_Point_Bonus_Asura = 2441; -Global Const $SKILLID_Time_Attack = 2444; -Global Const $SKILLID_Dwarven_Raider = 2445; -Global Const $SKILLID_Great_Dwarfs_Blessing = 2449; -Global Const $SKILLID_Hunt_Rampage_Deldrimor = 2450; -Global Const $SKILLID_Hunt_Point_Bonus = 2453; -Global Const $SKILLID_Vanguard_Patrol = 2457; -Global Const $SKILLID_Vanguard_Commendation = 2461; -Global Const $SKILLID_Hunt_Rampage_Ebon_Vanguard = 2462; -Global Const $SKILLID_Norn_Hunting_Party = 2469; -Global Const $SKILLID_Strength_of_the_Norn = 2473; -Global Const $SKILLID_Hunt_Rampage_Norn = 2474; -Global Const $SKILLID_Gloat = 2483; -Global Const $SKILLID_Metamorphosis = 2484; -Global Const $SKILLID_Inner_Fire = 2485; -Global Const $SKILLID_Elemental_Shift = 2486; -Global Const $SKILLID_Dryders_Feast = 2487; -Global Const $SKILLID_Fungal_Explosion = 2488; -Global Const $SKILLID_Blood_Rage = 2489; -Global Const $SKILLID_Parasitic_Bite = 2490; -Global Const $SKILLID_False_Death = 2491; -Global Const $SKILLID_Ooze_Combination = 2492; -Global Const $SKILLID_Ooze_Division = 2493; -Global Const $SKILLID_Bear_Form = 2494; -Global Const $SKILLID_Spore_Explosion = 2496; -Global Const $SKILLID_Dormant_Husk = 2497; -Global Const $SKILLID_Monkey_See_Monkey_Do = 2498; -Global Const $SKILLID_Tengus_Mimicry = 2500; -Global Const $SKILLID_Tongue_Lash = 2501; -Global Const $SKILLID_Soulrending_Shriek = 2502; -Global Const $SKILLID_Siege_Devourer = 2504; -Global Const $SKILLID_Siege_Devourer_Feast = 2505; -Global Const $SKILLID_Devourer_Bite = 2506; -Global Const $SKILLID_Siege_Devourer_Swipe = 2507; -Global Const $SKILLID_Devourer_Siege = 2508; -Global Const $SKILLID_HYAHHHHH = 2509; -Global Const $SKILLID_Dismount_Siege_Devourer = 2513; -Global Const $SKILLID_The_Masters_Mark = 2514; -Global Const $SKILLID_The_Snipers_Spear = 2515; -Global Const $SKILLID_Mount = 2516; -Global Const $SKILLID_Reverse_Polarity_Fire_Shield = 2517; -Global Const $SKILLID_Tengus_Gaze = 2518; -Global Const $SKILLID_Armor_of_Salvation_item_effect = 2520; -Global Const $SKILLID_Grail_of_Might_item_effect = 2521; -Global Const $SKILLID_Essence_of_Celerity_item_effect = 2522; -Global Const $SKILLID_Duncans_Defense = 2527; -Global Const $SKILLID_Invigorating_Mist = 2536; -Global Const $SKILLID_Courageous_Was_Saidra = 2537; -Global Const $SKILLID_Animate_Undead_Palawa_Joko = 2538; -Global Const $SKILLID_Order_of_Unholy_Vigor_Palawa_Joko = 2539; -Global Const $SKILLID_Order_of_the_Lich_Palawa_Joko = 2540; -Global Const $SKILLID_Golem_Boosters = 2541; -Global Const $SKILLID_Tongue_Whip = 2544; -Global Const $SKILLID_Lit_Torch = 2545; -Global Const $SKILLID_Dishonorable = 2546; -Global Const $SKILLID_Veteran_Asuran_Bodyguard = 2548; -Global Const $SKILLID_Veteran_Dwarven_Raider = 2549; -Global Const $SKILLID_Veteran_Vanguard_Patrol = 2550; -Global Const $SKILLID_Veteran_Norn_Hunting_Party = 2551 ; -Global Const $SKILLID_Candy_Corn_skill = 2604; -Global Const $SKILLID_Candy_Apple_skill = 2605; -Global Const $SKILLID_Anton_disguise = 2606; -Global Const $SKILLID_Erys_Vasburg_disguise = 2607; -Global Const $SKILLID_Olias_disguise = 2608; -Global Const $SKILLID_Argo_disguise = 2609; -Global Const $SKILLID_Mhenlo_disguise = 2610; -Global Const $SKILLID_Lukas_disguise = 2611; -Global Const $SKILLID_Aidan_disguise = 2612; -Global Const $SKILLID_Kahmu_disguise = 2613; -Global Const $SKILLID_Razah_disguise = 2614; -Global Const $SKILLID_Morgahn_disguise = 2615; -Global Const $SKILLID_Nika_disguise = 2616; -Global Const $SKILLID_Seaguard_Hala_disguise = 2617; -Global Const $SKILLID_Livia_disguise = 2618; -Global Const $SKILLID_Cynn_disguise = 2619; -Global Const $SKILLID_Tahlkora_disguise = 2620; -Global Const $SKILLID_Devona_disguise = 2621; -Global Const $SKILLID_Zho_disguise = 2622; -Global Const $SKILLID_Melonni_disguise = 2623; -Global Const $SKILLID_Xandra_disguise = 2624; -Global Const $SKILLID_Hayda_disguise = 2625 ; -Global Const $SKILLID_Pie_Induced_Ecstasy = 2649; -Global Const $SKILLID_Togo_disguise = 2651; -Global Const $SKILLID_Turai_Ossa_disguise = 2652; -Global Const $SKILLID_Gwen_disguise = 2653; -Global Const $SKILLID_Saul_DAlessio_disguise = 2654; -Global Const $SKILLID_Dragon_Empire_Rage = 2655; -Global Const $SKILLID_Call_to_the_Spirit_Realm = 2656; -Global Const $SKILLID_Hide = 2658; -Global Const $SKILLID_Feign_Death = 2659; -Global Const $SKILLID_Flee = 2660; -Global Const $SKILLID_Throw_Rock = 2661; -Global Const $SKILLID_Siege_Strike = 2663; -Global Const $SKILLID_Spike_Trap_spell = 2664; -Global Const $SKILLID_Barbed_Bomb = 2665; -Global Const $SKILLID_Balm_Bomb = 2667; -Global Const $SKILLID_Explosives = 2668; -Global Const $SKILLID_Rations = 2669; -Global Const $SKILLID_Form_Up_and_Advance = 2670; -Global Const $SKILLID_Spectral_Agony_hex = 2672; -Global Const $SKILLID_Stun_Bomb = 2673; -Global Const $SKILLID_Banner_of_the_Unseen = 2674; -Global Const $SKILLID_Signet_of_the_Unseen = 2675; -Global Const $SKILLID_For_Elona = 2676; -Global Const $SKILLID_Giant_Stomp_Turai_Ossa = 2677; -Global Const $SKILLID_Whirlwind_Attack_Turai_Ossa = 2678; -Global Const $SKILLID_Journey_to_the_North = 2699; -Global Const $SKILLID_Rat_Form = 2701; -Global Const $SKILLID_Party_Time = 2712; -Global Const $SKILLID_Awakened_Head_Form = 2841; -Global Const $SKILLID_Spider_Form = 2842; -Global Const $SKILLID_Golem_Form = 2844; -Global Const $SKILLID_Norn_Form = 2846; -Global Const $SKILLID_Rift_Warden_Form = 2848; -Global Const $SKILLID_Snowman_Form = 2851; -Global Const $SKILLID_Energy_Drain_PvP = 2852; -Global Const $SKILLID_Energy_Tap_PvP = 2853; -Global Const $SKILLID_PvP_effect = 2854; -Global Const $SKILLID_Ward_Against_Melee_PvP = 2855; -Global Const $SKILLID_Lightning_Orb_PvP = 2856; -Global Const $SKILLID_Aegis_PvP = 2857; -Global Const $SKILLID_Watch_Yourself_PvP = 2858; -Global Const $SKILLID_Enfeeble_PvP = 2859; -Global Const $SKILLID_Ether_Renewal_PvP = 2860; -Global Const $SKILLID_Penetrating_Attack_PvP = 2861; -Global Const $SKILLID_Shadow_Form_PvP = 2862; -Global Const $SKILLID_Discord_PvP = 2863; -Global Const $SKILLID_Sundering_Attack_PvP = 2864; -Global Const $SKILLID_Ritual_Lord_PvP = 2865; -Global Const $SKILLID_Flesh_of_My_Flesh_PvP = 2866; -Global Const $SKILLID_Ancestors_Rage_PvP = 2867; -Global Const $SKILLID_Splinter_Weapon_PvP = 2868; -Global Const $SKILLID_Assassins_Remedy_PvP = 2869; -Global Const $SKILLID_Blinding_Surge_PvP = 2870; -Global Const $SKILLID_Light_of_Deliverance_PvP = 2871; -Global Const $SKILLID_Death_Pact_Signet_PvP = 2872; -Global Const $SKILLID_Mystic_Sweep_PvP = 2873; -Global Const $SKILLID_Eremites_Attack_PvP = 2874; -Global Const $SKILLID_Harriers_Toss_PvP = 2875; -Global Const $SKILLID_Defensive_Anthem_PvP = 2876; -Global Const $SKILLID_Ballad_of_Restoration_PvP = 2877; -Global Const $SKILLID_Song_of_Restoration_PvP = 2878; -Global Const $SKILLID_Incoming_PvP = 2879; -Global Const $SKILLID_Never_Surrender_PvP = 2880; -Global Const $SKILLID_Mantra_of_Inscriptions_PvP = 2882; -Global Const $SKILLID_For_Great_Justice_PvP = 2883; -Global Const $SKILLID_Mystic_Regeneration_PvP = 2884; -Global Const $SKILLID_Enfeebling_Blood_PvP = 2885; -Global Const $SKILLID_Summoning_Sickness = 2886; -Global Const $SKILLID_Signet_of_Judgment_PvP = 2887; -Global Const $SKILLID_Chilling_Victory_PvP = 2888; -Global Const $SKILLID_Unyielding_Aura_PvP = 2891; -Global Const $SKILLID_Spirit_Bond_PvP = 2892; -Global Const $SKILLID_Weapon_of_Warding_PvP = 2893; -Global Const $SKILLID_Smiters_Boon_PvP = 2895; -Global Const $SKILLID_Battle_Fervor_Deactivating_ROX = 2896; -Global Const $SKILLID_Cloak_of_Faith_Deactivating_ROX = 2897; -Global Const $SKILLID_Dark_Aura_Deactivating_ROX = 2898; -Global Const $SKILLID_Reactor_Blast = 2902; -Global Const $SKILLID_Reactor_Blast_Timer = 2903; -Global Const $SKILLID_Jade_Brotherhood_Disguise = 2904; -Global Const $SKILLID_Internal_Power_Engaged = 2905; -Global Const $SKILLID_Target_Acquisition = 2906; -Global Const $SKILLID_NOX_Beam = 2907; -Global Const $SKILLID_NOX_Field_Dash = 2908; -Global Const $SKILLID_NOXion_Buster = 2909; -Global Const $SKILLID_Countdown = 2910; -Global Const $SKILLID_Bit_Golem_Breaker = 2911; -Global Const $SKILLID_Bit_Golem_Rectifier = 2912; -Global Const $SKILLID_Bit_Golem_Crash = 2913; -Global Const $SKILLID_Bit_Golem_Force = 2914; -Global Const $SKILLID_NOX_Phantom = 2916; -Global Const $SKILLID_NOX_Thunder = 2917; -Global Const $SKILLID_NOX_Lock_On = 2918; -Global Const $SKILLID_NOX_Driver = 2919; -Global Const $SKILLID_NOX_Fire = 2920; -Global Const $SKILLID_NOX_Knuckle = 2921; -Global Const $SKILLID_NOX_Divider_Drive = 2922; -Global Const $SKILLID_Sloth_Hunters_Shot_PvP = 2925; -Global Const $SKILLID_Experts_Dexterity_PvP = 2959; -Global Const $SKILLID_Signet_of_Spirits_PvP = 2965; -Global Const $SKILLID_Signet_of_Ghostly_Might_PvP = 2966; -Global Const $SKILLID_Avatar_of_Grenth_PvP = 2967; -Global Const $SKILLID_Oversized_Tonic_Warning = 2968; -Global Const $SKILLID_Read_the_Wind_PvP = 2969; -Global Const $SKILLID_Blue_Rock_Candy_Rush = 2971; -Global Const $SKILLID_Green_Rock_Candy_Rush = 2972; -Global Const $SKILLID_Red_Rock_Candy_Rush = 2973; -Global Const $SKILLID_Well_Supplied = 3174; -#EndRegion - -#Region MapNames -; MAP NAMES BY ID -Global $MAP_NAME_BY_ID[880] -$MAP_NAME_BY_ID[0] = 859 -$MAP_NAME_BY_ID[4] = "Guild Hall - Warrior's Isle" -$MAP_NAME_BY_ID[5] = "Guild Hall - Hunter's Isle" -$MAP_NAME_BY_ID[6] = "Guild Hall - Wizard's Isle" -$MAP_NAME_BY_ID[7] = "Warrior's Isle Explorable" -$MAP_NAME_BY_ID[8] = "Hunter's Isle Explorable" -$MAP_NAME_BY_ID[9] = "Wizard's Isle Explorable" -$MAP_NAME_BY_ID[10] = "Bloodstone Fen outpost" -$MAP_NAME_BY_ID[11] = "The Wilds outpost" -$MAP_NAME_BY_ID[12] = "Aurora Glade outpost" -$MAP_NAME_BY_ID[13] = "Diesa Lowlands" -$MAP_NAME_BY_ID[14] = "Gates of Kryta outpost" -$MAP_NAME_BY_ID[15] = "D'Alessio Seaboard outpost" -$MAP_NAME_BY_ID[16] = "Divinity Coast outpost" -$MAP_NAME_BY_ID[17] = "Talmark Wilderness" -$MAP_NAME_BY_ID[18] = "The Black Curtain" -$MAP_NAME_BY_ID[19] = "Sanctum Cay outpost" -$MAP_NAME_BY_ID[20] = "Droknar's Forge" -$MAP_NAME_BY_ID[21] = "The Frost Gate outpost" -$MAP_NAME_BY_ID[22] = "Ice Caves of Sorrow outpost" -$MAP_NAME_BY_ID[23] = "Thunderhead Keep outpost" -$MAP_NAME_BY_ID[24] = "Iron Mines of Moladune outpost" -$MAP_NAME_BY_ID[25] = "Borlis Pass outpost" -$MAP_NAME_BY_ID[26] = "Talus Chute" -$MAP_NAME_BY_ID[27] = "Griffon's Mouth" -$MAP_NAME_BY_ID[28] = "The Great Northern Wall outpost" -$MAP_NAME_BY_ID[29] = "Fort Ranik outpost" -$MAP_NAME_BY_ID[30] = "Ruins of Surmia outpost" -$MAP_NAME_BY_ID[31] = "Xaquang Skyway" -$MAP_NAME_BY_ID[32] = "Nolani Academy outpost" -$MAP_NAME_BY_ID[33] = "Old Ascalon" -$MAP_NAME_BY_ID[34] = "The Fissure of Woe" -$MAP_NAME_BY_ID[35] = "Ember Light Camp" -$MAP_NAME_BY_ID[36] = "Grendich Courthouse" -$MAP_NAME_BY_ID[37] = "Glint' Challenge" -$MAP_NAME_BY_ID[38] = "Augury Rock outpost" -$MAP_NAME_BY_ID[39] = "Sardelac Sanitarium" -$MAP_NAME_BY_ID[40] = "Piken Square" -$MAP_NAME_BY_ID[41] = "Sage Lands" -$MAP_NAME_BY_ID[42] = "Mamnoon Lagoon" -$MAP_NAME_BY_ID[43] = "Silverwood" -$MAP_NAME_BY_ID[44] = "Ettin's Back" -$MAP_NAME_BY_ID[45] = "Reed Bog" -$MAP_NAME_BY_ID[46] = "The Falls" -$MAP_NAME_BY_ID[47] = "Dry Top" -$MAP_NAME_BY_ID[48] = "Tangle Root" -$MAP_NAME_BY_ID[49] = "Henge of Denravi" -$MAP_NAME_BY_ID[51] = "Senjis Corner" -$MAP_NAME_BY_ID[52] = "Guild Hall - Burning Isle" -$MAP_NAME_BY_ID[53] = "Tears of the Fallen" -$MAP_NAME_BY_ID[54] = "Scoundrel's Rise" -$MAP_NAME_BY_ID[55] = "Lions Arch" -$MAP_NAME_BY_ID[56] = "Cursed Lands" -$MAP_NAME_BY_ID[57] = "Bergen Hot Springs" -$MAP_NAME_BY_ID[58] = "North Kryta Province" -$MAP_NAME_BY_ID[59] = "Nebo Terrace" -$MAP_NAME_BY_ID[60] = "Majesty's Rest" -$MAP_NAME_BY_ID[61] = "Twin Serpent Lakes" -$MAP_NAME_BY_ID[62] = "Watchtower Coast" -$MAP_NAME_BY_ID[63] = "Stingray Strand" -$MAP_NAME_BY_ID[64] = "Kessex Peak" -$MAP_NAME_BY_ID[65] = "D'Alessio Arena" -$MAP_NAME_BY_ID[67] = "Burning Isle Explorable" -$MAP_NAME_BY_ID[68] = "Frozen Isle Explorable" -$MAP_NAME_BY_ID[69] = "Nomad's Isle Explorable" -$MAP_NAME_BY_ID[70] = "Druid's Isle Explorable" -$MAP_NAME_BY_ID[71] = "Isle of the Dead Explorable" -$MAP_NAME_BY_ID[72] = "The Underworld" -$MAP_NAME_BY_ID[73] = "Riverside Province outpost" -$MAP_NAME_BY_ID[75] = "The Hall of Heroes Arena" -$MAP_NAME_BY_ID[76] = "Broken Tower Arena" -$MAP_NAME_BY_ID[77] = "House zu Heltzer" -$MAP_NAME_BY_ID[78] = "The Courtyard Arena" -$MAP_NAME_BY_ID[79] = "Unholy Temples Area" -$MAP_NAME_BY_ID[80] = "Burial Mounds Arena" -$MAP_NAME_BY_ID[81] = "Ascalon City" -$MAP_NAME_BY_ID[82] = "Tomb of the Primeval Kings" -$MAP_NAME_BY_ID[83] = "The Vault Arena" -$MAP_NAME_BY_ID[84] = "The Underworld Arena" -$MAP_NAME_BY_ID[85] = "Ascalon Arena outpost" -$MAP_NAME_BY_ID[86] = "Sacred Temples Arena" -$MAP_NAME_BY_ID[87] = "Icedome" -$MAP_NAME_BY_ID[88] = "Iron Horse Mine" -$MAP_NAME_BY_ID[89] = "Anvil Rock" -$MAP_NAME_BY_ID[90] = "Lornar's Pass" -$MAP_NAME_BY_ID[91] = "Snake Dance" -$MAP_NAME_BY_ID[92] = "Tasca's Demise" -$MAP_NAME_BY_ID[93] = "Spearhead Peak" -$MAP_NAME_BY_ID[94] = "Ice Floe" -$MAP_NAME_BY_ID[95] = "Witman's Folly" -$MAP_NAME_BY_ID[96] = "Mineral Springs" -$MAP_NAME_BY_ID[97] = "Dreadnought's Drift" -$MAP_NAME_BY_ID[98] = "Frozen Forest" -$MAP_NAME_BY_ID[99] = "Traveler's Vale" -$MAP_NAME_BY_ID[100] = "Deldrimor Bowl" -$MAP_NAME_BY_ID[101] = "Regent Valley" -$MAP_NAME_BY_ID[102] = "The Breach" -$MAP_NAME_BY_ID[103] = "Ascalon Foothills" -$MAP_NAME_BY_ID[104] = "Pockmark Flats" -$MAP_NAME_BY_ID[105] = "Dragon's Gullet" -$MAP_NAME_BY_ID[106] = "Flame Temple Corridor" -$MAP_NAME_BY_ID[107] = "Eastern Frontier" -$MAP_NAME_BY_ID[108] = "The Scar" -$MAP_NAME_BY_ID[109] = "The Amnoon Oasis" -$MAP_NAME_BY_ID[110] = "Diviner's Ascent" -$MAP_NAME_BY_ID[111] = "Vulture Drifts" -$MAP_NAME_BY_ID[112] = "The Arid Sea" -$MAP_NAME_BY_ID[113] = "Prophet's Path" -$MAP_NAME_BY_ID[114] = "Salt Flats" -$MAP_NAME_BY_ID[115] = "Skyward Reach" -$MAP_NAME_BY_ID[116] = "Dunes of Despair outpost" -$MAP_NAME_BY_ID[117] = "Thirsty River outpost" -$MAP_NAME_BY_ID[118] = "Elona Reach outpost" -$MAP_NAME_BY_ID[119] = "Augury Rock outpost" -$MAP_NAME_BY_ID[120] = "The Dragon's Lair outpost" -$MAP_NAME_BY_ID[121] = "Perdition Rock" -$MAP_NAME_BY_ID[122] = "Ring of Fire outpost" -$MAP_NAME_BY_ID[123] = "Abaddon's Mouth outpost" -$MAP_NAME_BY_ID[124] = "Hell's Precipice outpost" -$MAP_NAME_BY_ID[126] = "Golden Gates" -$MAP_NAME_BY_ID[127] = "Scarred Earth" -$MAP_NAME_BY_ID[128] = "The Eternal Grove Explorable" -$MAP_NAME_BY_ID[129] = "Lutgardis Conservatory" -$MAP_NAME_BY_ID[130] = "Vasburg Armory" -$MAP_NAME_BY_ID[131] = "Serenity Temple" -$MAP_NAME_BY_ID[132] = "Ice Tooth Cave" -$MAP_NAME_BY_ID[133] = "Beacons Perch" -$MAP_NAME_BY_ID[134] = "Yaks Bend" -$MAP_NAME_BY_ID[135] = "Frontier Gate" -$MAP_NAME_BY_ID[136] = "Beetletun" -$MAP_NAME_BY_ID[137] = "Fishermens Haven" -$MAP_NAME_BY_ID[138] = "Temple of the Ages" -$MAP_NAME_BY_ID[139] = "Ventaris Refuge" -$MAP_NAME_BY_ID[140] = "Druids Overlook" -$MAP_NAME_BY_ID[141] = "Maguuma Stade" -$MAP_NAME_BY_ID[142] = "Quarrel Falls" -$MAP_NAME_BY_ID[144] = "Gyala Hatchery Explorable" -$MAP_NAME_BY_ID[145] = "The Catacombs" -$MAP_NAME_BY_ID[146] = "Lakeside County" -$MAP_NAME_BY_ID[147] = "The Northlands" -$MAP_NAME_BY_ID[148] = "Ascalon City outpost" -$MAP_NAME_BY_ID[149] = "Ascalon Academy" -$MAP_NAME_BY_ID[150] = " Ascalon Academy PvP battle" -$MAP_NAME_BY_ID[151] = "Ascalon Academy" -$MAP_NAME_BY_ID[152] = "Heroes Audience" -$MAP_NAME_BY_ID[153] = "Seekers Passage" -$MAP_NAME_BY_ID[154] = "Destinys Gorge" -$MAP_NAME_BY_ID[155] = "Camp Rankor" -$MAP_NAME_BY_ID[156] = "The Granite Citadel" -$MAP_NAME_BY_ID[157] = "Marhans Grotto" -$MAP_NAME_BY_ID[158] = "Port Sledge" -$MAP_NAME_BY_ID[159] = "Copperhammer Mines" -$MAP_NAME_BY_ID[160] = "green Hills County" -$MAP_NAME_BY_ID[161] = "Wizard's Folly" -$MAP_NAME_BY_ID[162] = "Pre-Searing: Regent valley" -$MAP_NAME_BY_ID[163] = "Pre-Searing: The Barradin Estate" -$MAP_NAME_BY_ID[164] = "Pre-Searing: Ashford Abbey" -$MAP_NAME_BY_ID[165] = "Pre-Searing: Foibles Fair" -$MAP_NAME_BY_ID[166] = "Pre-Searing: Fort Ranik" -$MAP_NAME_BY_ID[167] = "Burning Isle" -$MAP_NAME_BY_ID[168] = "Druid's Isle" -$MAP_NAME_BY_ID[170] = "Frozen Isle" -$MAP_NAME_BY_ID[171] = "Warrior's Isle" -$MAP_NAME_BY_ID[172] = "Hunter's Isle" -$MAP_NAME_BY_ID[173] = "Wizard's Isle" -$MAP_NAME_BY_ID[174] = "Nomad's Isle" -$MAP_NAME_BY_ID[175] = "Isle of the Dead" -$MAP_NAME_BY_ID[176] = "Guild Hall - Frozen Isle" -$MAP_NAME_BY_ID[177] = "Guild Hall - Nomad's Isle" -$MAP_NAME_BY_ID[178] = "Guild Hall - Druid's Isle" -$MAP_NAME_BY_ID[179] = "Guild Hall - Isle of the Dead" -$MAP_NAME_BY_ID[180] = "Fort Koga" -$MAP_NAME_BY_ID[181] = "Shiverpeak Arena outpost" -$MAP_NAME_BY_ID[182] = "Amnoon Arena" -$MAP_NAME_BY_ID[183] = "Deldrimor Arena" -$MAP_NAME_BY_ID[184] = "The Crag" -$MAP_NAME_BY_ID[188] = "Random Arenas outpost" -$MAP_NAME_BY_ID[189] = "Team Arenas outpost" -$MAP_NAME_BY_ID[190] = "Sorrow's Furnace" -$MAP_NAME_BY_ID[191] = "Grenth's Footprint" -$MAP_NAME_BY_ID[193] = "Cavalon" -$MAP_NAME_BY_ID[194] = "Kaineng Center" -$MAP_NAME_BY_ID[195] = "Drazach Thicket" -$MAP_NAME_BY_ID[196] = "Jaya Bluff" -$MAP_NAME_BY_ID[197] = "Shenzun Tunnels" -$MAP_NAME_BY_ID[198] = "Archipelagos" -$MAP_NAME_BY_ID[199] = "Maishang Hills" -$MAP_NAME_BY_ID[200] = "Mount Qinkai" -$MAP_NAME_BY_ID[201] = "Melandru's Hope" -$MAP_NAME_BY_ID[202] = "Rhea's Crater" -$MAP_NAME_BY_ID[203] = "Silent Surf" -$MAP_NAME_BY_ID[204] = "Unwaking Waters - Kurzick" -$MAP_NAME_BY_ID[205] = "Morostav Trail" -$MAP_NAME_BY_ID[206] = "Deldrimor War Camp" -$MAP_NAME_BY_ID[208] = "Heroes' Crypt" -$MAP_NAME_BY_ID[209] = "Mourning Veil Falls" -$MAP_NAME_BY_ID[210] = "Ferndale" -$MAP_NAME_BY_ID[211] = "Pongmei Valley" -$MAP_NAME_BY_ID[212] = "Monastery Overlook" -$MAP_NAME_BY_ID[213] = "Zen Daijun outpost" -$MAP_NAME_BY_ID[214] = "Minister Chos Estate outpost" -$MAP_NAME_BY_ID[215] = "Vizunah Square" -$MAP_NAME_BY_ID[216] = "Nahpui Quarter outpost" -$MAP_NAME_BY_ID[217] = "Tahnnakai Temple outpost" -$MAP_NAME_BY_ID[218] = "Arborstone outpost" -$MAP_NAME_BY_ID[219] = "Boreas Seabed outpost" -$MAP_NAME_BY_ID[220] = "Sunjiang District outpost" -$MAP_NAME_BY_ID[221] = "Fort Aspenwood" -$MAP_NAME_BY_ID[222] = "The Eternal Grove outpost" -$MAP_NAME_BY_ID[223] = "The Jade Quarry" -$MAP_NAME_BY_ID[224] = "Gyala Hatchery outpost" -$MAP_NAME_BY_ID[225] = "Raisu Palace outpost" -$MAP_NAME_BY_ID[226] = "Imperial Sanctum outpost" -$MAP_NAME_BY_ID[227] = "Unwaking Waters Luxon" -$MAP_NAME_BY_ID[228] = "Grenz Frontier" -$MAP_NAME_BY_ID[230] = "Amatz Basin Explorable" -$MAP_NAME_BY_ID[230] = "Amatz Basin outpost" -$MAP_NAME_BY_ID[233] = "Raisu Palace outpost" -$MAP_NAME_BY_ID[234] = "The Aurios Mines outpost" -$MAP_NAME_BY_ID[235] = "Panjiang Peninsula" -$MAP_NAME_BY_ID[236] = "Kinya Province" -$MAP_NAME_BY_ID[237] = "Haiju Lagoon" -$MAP_NAME_BY_ID[238] = "Sunqua Vale" -$MAP_NAME_BY_ID[239] = "Waijun Bazaar" -$MAP_NAME_BY_ID[240] = "Bukdek Byway" -$MAP_NAME_BY_ID[241] = "The Undercity" -$MAP_NAME_BY_ID[242] = "Shing Jea Monastery" -$MAP_NAME_BY_ID[243] = "Shing Jea Arena outpost" -$MAP_NAME_BY_ID[244] = "Arborstone Explorable" -$MAP_NAME_BY_ID[245] = "Minister Cho's Estate Explorable" -$MAP_NAME_BY_ID[246] = "Zen Daijun Explorable" -$MAP_NAME_BY_ID[247] = "Boreas Seabed Explorable" -$MAP_NAME_BY_ID[248] = "Great Temple of Balthazar" -$MAP_NAME_BY_ID[249] = "Tsumei Village" -$MAP_NAME_BY_ID[250] = "Seitung Harbor" -$MAP_NAME_BY_ID[251] = "Ran Musu Gardens" -$MAP_NAME_BY_ID[252] = "Linnok Courtyard" -$MAP_NAME_BY_ID[253] = "Dwayna Vs Grenth outpost" -$MAP_NAME_BY_ID[256] = "Sunjiang District Explorable" -$MAP_NAME_BY_ID[265] = "Nahpui Quarter Explorable" -$MAP_NAME_BY_ID[266] = "Urgoz's Warren outpost" -$MAP_NAME_BY_ID[272] = "Altrumm Ruins outpost" -$MAP_NAME_BY_ID[273] = "Zos Shivros Channel outpost" -$MAP_NAME_BY_ID[274] = "Dragons Throat outpost" -;~ Factions -$MAP_NAME_BY_ID[275] = "Guild Hall - Isle of Weeping Stone" -$MAP_NAME_BY_ID[276] = "Guild Hall - Isle of Jade" -$MAP_NAME_BY_ID[277] = "Harvest Temple" -$MAP_NAME_BY_ID[278] = "Breaker Hollow" -$MAP_NAME_BY_ID[279] = "Leviathan Pits" -$MAP_NAME_BY_ID[280] = "Isle of the Nameless" -$MAP_NAME_BY_ID[281] = "Zaishen Challenge outpost" -$MAP_NAME_BY_ID[282] = "Zaishen Elite outpost" -$MAP_NAME_BY_ID[283] = "Maatu Keep" -$MAP_NAME_BY_ID[284] = "Zin Ku Corridor" -$MAP_NAME_BY_ID[285] = "Monastery Overlook" -$MAP_NAME_BY_ID[286] = "Brauer Academy" -$MAP_NAME_BY_ID[287] = "Durheim Archives" -$MAP_NAME_BY_ID[288] = "Bai Paasu Reach" -$MAP_NAME_BY_ID[289] = "Seafarer's Rest" -$MAP_NAME_BY_ID[290] = "Bejunkan Pier" -$MAP_NAME_BY_ID[291] = "Vizunah Square Local Quarter" -$MAP_NAME_BY_ID[292] = "Vizunah Square Foreign Quarter" -$MAP_NAME_BY_ID[293] = "Fort Aspenwood - Luxon" -$MAP_NAME_BY_ID[294] = "Fort Aspenwood - Kurzick" -$MAP_NAME_BY_ID[295] = "The Jade Quarry - Luxon" -$MAP_NAME_BY_ID[296] = "The Jade Quarry - Kurzick" -$MAP_NAME_BY_ID[297] = "Unwaking Waters Luxon" -$MAP_NAME_BY_ID[298] = "Unwaking Waters Kurzick" -$MAP_NAME_BY_ID[300] = "Etnaran Keys" -$MAP_NAME_BY_ID[301] = "Raisu Pavillion" -$MAP_NAME_BY_ID[302] = "Kaineng Docks" -$MAP_NAME_BY_ID[303] = "The Marketplace" -$MAP_NAME_BY_ID[307] = "The Deep outpost" -$MAP_NAME_BY_ID[308] = "Ascalon Arena" -$MAP_NAME_BY_ID[309] = "Annihilation" -$MAP_NAME_BY_ID[310] = "Kill Count Training" -$MAP_NAME_BY_ID[311] = "Annihilation" -$MAP_NAME_BY_ID[312] = "Obelisk Annihilation Training" -$MAP_NAME_BY_ID[313] = "Saoshang Trail" -$MAP_NAME_BY_ID[314] = "Shiverpeak Arena" -$MAP_NAME_BY_ID[318] = "D'Alessio Arena" -$MAP_NAME_BY_ID[319] = "Amnoon Arena" -$MAP_NAME_BY_ID[320] = "Fort Koga" -$MAP_NAME_BY_ID[321] = "Heroes' Crypt" -$MAP_NAME_BY_ID[322] = "Shiverpeak Arena" -$MAP_NAME_BY_ID[328] = "Saltspray Beach - Luxon" -$MAP_NAME_BY_ID[329] = "Saltspray Beach - Kurzick" -$MAP_NAME_BY_ID[330] = "Heroes Ascent outpost" -$MAP_NAME_BY_ID[331] = "Grenz Frontier - Luxon" -$MAP_NAME_BY_ID[332] = "Grenz Frontier - Kurzick" -$MAP_NAME_BY_ID[333] = "The Ancestral Lands - Luxon" -$MAP_NAME_BY_ID[334] = "The Ancestral Lands - Kurzick" -$MAP_NAME_BY_ID[335] = "Etnaran Keys - Luxon" -$MAP_NAME_BY_ID[336] = "Etnaran Keys - Kurzick" -$MAP_NAME_BY_ID[337] = "Kaanai Canyon - Luxon" -$MAP_NAME_BY_ID[338] = "Kaanai Canyon - Kurzick" -$MAP_NAME_BY_ID[339] = "D'Alessio Arena" -$MAP_NAME_BY_ID[340] = "Amnoon Arena" -$MAP_NAME_BY_ID[341] = "Fort Koga" -$MAP_NAME_BY_ID[342] = "Heroes' Crypt" -$MAP_NAME_BY_ID[343] = "Shiverpeak Arena" -$MAP_NAME_BY_ID[344] = "The Hall of Heroes" -$MAP_NAME_BY_ID[345] = "The Courtyard" -$MAP_NAME_BY_ID[346] = "Scarred Earth" -$MAP_NAME_BY_ID[347] = "The Underworld Explorable" -$MAP_NAME_BY_ID[348] = "Tanglewood Copse" -$MAP_NAME_BY_ID[349] = "Saint Anjeka's Shrine" -$MAP_NAME_BY_ID[350] = "Eredon Terrace" -$MAP_NAME_BY_ID[351] = "Divine Path" -$MAP_NAME_BY_ID[352] = "Brawler's Pit" -$MAP_NAME_BY_ID[353] = "Petrified Arena" -$MAP_NAME_BY_ID[354] = "Seabed Arena" -$MAP_NAME_BY_ID[355] = "Isle of Weeping Stone" -$MAP_NAME_BY_ID[356] = "Isle of Jade" -$MAP_NAME_BY_ID[357] = "Imperial Isle" -$MAP_NAME_BY_ID[358] = "Isle of Meditation" -$MAP_NAME_BY_ID[359] = "Guild Hall - Imperial Isle" -$MAP_NAME_BY_ID[360] = "Guild Hall - Isle of Meditation" -$MAP_NAME_BY_ID[361] = "Isle of Weeping Stone" -$MAP_NAME_BY_ID[362] = "Isle of Jade" -$MAP_NAME_BY_ID[363] = "Imperial Isle" -$MAP_NAME_BY_ID[364] = "Isle of Meditation" -$MAP_NAME_BY_ID[368] = "Dragon Arena outpost" -$MAP_NAME_BY_ID[369] = "Jahai Bluffs" -$MAP_NAME_BY_ID[371] = "Marga Coast" -$MAP_NAME_BY_ID[373] = "Sunward Marches" -$MAP_NAME_BY_ID[375] = "Barbarous Shore" -$MAP_NAME_BY_ID[376] = "Camp Hojanu" -$MAP_NAME_BY_ID[377] = "Bahdok Caverns" -$MAP_NAME_BY_ID[378] = "Wehhan Terraces" -$MAP_NAME_BY_ID[379] = "Dejarin Estate" -$MAP_NAME_BY_ID[380] = "Arkjok Ward" -$MAP_NAME_BY_ID[381] = "Yohlon Haven" -$MAP_NAME_BY_ID[382] = "Gandara, the Moon Fortress" -$MAP_NAME_BY_ID[384] = "The Floodplain of Mahnkelon" -$MAP_NAME_BY_ID[385] = "Lion's Arch during Sunspears in Kryta" -$MAP_NAME_BY_ID[386] = "Turai's Procession" -$MAP_NAME_BY_ID[387] = "Sunspear Sanctuary" -$MAP_NAME_BY_ID[388] = "Aspenwood Gate - Kurzick" -$MAP_NAME_BY_ID[389] = "Aspenwood Gate - Luxon" -$MAP_NAME_BY_ID[390] = "Jade Flats Kurzick" -$MAP_NAME_BY_ID[391] = "Jade Flats Luxon" -$MAP_NAME_BY_ID[392] = "Yatendi Canyons" -$MAP_NAME_BY_ID[393] = "Chantry of Secrets" -$MAP_NAME_BY_ID[394] = "Garden of Seborhin" -$MAP_NAME_BY_ID[396] = "Mihanu Township" -$MAP_NAME_BY_ID[397] = "Vehjin Mines" -$MAP_NAME_BY_ID[398] = "Basalt Grotto" -$MAP_NAME_BY_ID[399] = "Forum Highlands" -$MAP_NAME_BY_ID[400] = "Kaineng Center during Sunspears in Cantha" -$MAP_NAME_BY_ID[402] = "Resplendent Makuun" -$MAP_NAME_BY_ID[403] = "Honur Hill" -$MAP_NAME_BY_ID[404] = "Wilderness of Bahdza" -$MAP_NAME_BY_ID[406] = "Vehtendi Valley" -$MAP_NAME_BY_ID[407] = "Yahnur Market" -$MAP_NAME_BY_ID[413] = "The Hidden City of Ahdashim" -$MAP_NAME_BY_ID[414] = "The Kodash Bazaar" -$MAP_NAME_BY_ID[415] = "Lion's gate" -$MAP_NAME_BY_ID[419] = "The Mirror of Lyss" -$MAP_NAME_BY_ID[420] = "Secure the Refuge" -$MAP_NAME_BY_ID[421] = "Venta Cemetery outpost" -$MAP_NAME_BY_ID[422] = "Bad Tide Rising, Kamadan Explorable" -$MAP_NAME_BY_ID[424] = "Kodonur Crossroads outpost" -$MAP_NAME_BY_ID[425] = "Rilohn Refuge outpost" -$MAP_NAME_BY_ID[426] = "Pogahn Passage outpost" -$MAP_NAME_BY_ID[427] = "Moddok Crevice outpost" -$MAP_NAME_BY_ID[428] = "Tihark Orchard outpost" -$MAP_NAME_BY_ID[429] = "Consulate" -$MAP_NAME_BY_ID[430] = "Plains of Jarin" -$MAP_NAME_BY_ID[431] = "Sunspear Great Hall" -$MAP_NAME_BY_ID[432] = "Cliffs of Dohjok" -$MAP_NAME_BY_ID[433] = "Dzagonur Bastion outpost" -$MAP_NAME_BY_ID[434] = "Dasha Vestibule outpost" -$MAP_NAME_BY_ID[435] = "Grand Court of Sebelkeh outpost" -$MAP_NAME_BY_ID[436] = "Command Post" -$MAP_NAME_BY_ID[437] = "Joko's Domain" -$MAP_NAME_BY_ID[438] = "Bone Palace" -$MAP_NAME_BY_ID[439] = "The Ruptured Heart" -$MAP_NAME_BY_ID[440] = "The Mouth of Torment" -$MAP_NAME_BY_ID[441] = "The Shattered Ravines" -$MAP_NAME_BY_ID[442] = "Lair of the Forgotten" -$MAP_NAME_BY_ID[443] = "Poisoned Outcrops" -$MAP_NAME_BY_ID[444] = "The Sulfurous Wastes" -$MAP_NAME_BY_ID[445] = "The Ebony Citadel of Mallyx" -$MAP_NAME_BY_ID[446] = "The Alkali Pan" -$MAP_NAME_BY_ID[447] = "A Land of Heroes" -$MAP_NAME_BY_ID[448] = "Crystal Overlook" -$MAP_NAME_BY_ID[449] = "Kamadan Jewel of Istan" -$MAP_NAME_BY_ID[450] = "Gate of Torment" -$MAP_NAME_BY_ID[455] = "Nightfallen Garden" -$MAP_NAME_BY_ID[456] = "Chuurhir Fields" -$MAP_NAME_BY_ID[457] = "Beknur Harbor" -$MAP_NAME_BY_ID[461] = "The Underworld" -$MAP_NAME_BY_ID[462] = "Heart of Abaddon" -$MAP_NAME_BY_ID[463] = "The Underworld" -$MAP_NAME_BY_ID[465] = "Nightfallen Jahai" -$MAP_NAME_BY_ID[466] = "Depths of Madness" -$MAP_NAME_BY_ID[467] = "Rollerbeetle Racing outpost" -$MAP_NAME_BY_ID[468] = "Domain of Fear" -$MAP_NAME_BY_ID[469] = "Gate of Fear" -$MAP_NAME_BY_ID[470] = "Domain of Pain" -$MAP_NAME_BY_ID[471] = "Bloodstone Fen Explorable" -$MAP_NAME_BY_ID[472] = "Domain of Secrets" -$MAP_NAME_BY_ID[473] = "Gate of Secrets" -$MAP_NAME_BY_ID[474] = "Domain of Anguish" -$MAP_NAME_BY_ID[476] = "Jennurs Horde outpost" -$MAP_NAME_BY_ID[477] = "Nundu Bay outpost" -$MAP_NAME_BY_ID[478] = "Gate of Desolation outpost" -$MAP_NAME_BY_ID[479] = "Champions Dawn" -$MAP_NAME_BY_ID[480] = "Ruins of Morah outpost" -$MAP_NAME_BY_ID[481] = "Fahranur, The First City" -$MAP_NAME_BY_ID[482] = "Bjora Marches" -$MAP_NAME_BY_ID[483] = "Zehlon Reach" -$MAP_NAME_BY_ID[484] = "Lahteda Bog" -$MAP_NAME_BY_ID[485] = "Arbor Bay" -$MAP_NAME_BY_ID[486] = "Issnur Isles" -$MAP_NAME_BY_ID[487] = "Beknur Harbor" -$MAP_NAME_BY_ID[488] = "Mehtani Keys" -$MAP_NAME_BY_ID[489] = "Kodlonu Hamlet" -$MAP_NAME_BY_ID[490] = "Island of Shehkah" -$MAP_NAME_BY_ID[491] = "Jokanur Diggings outpost" -$MAP_NAME_BY_ID[492] = "Blacktide Den outpost" -$MAP_NAME_BY_ID[493] = "Consulate Docks outpost" -$MAP_NAME_BY_ID[494] = "Gate of Pain outpost" -$MAP_NAME_BY_ID[495] = "Gate of Madness outpost" -$MAP_NAME_BY_ID[496] = "Abaddons Gate outpost" -$MAP_NAME_BY_ID[497] = "Sunspear Arena outpost" -$MAP_NAME_BY_ID[499] = "Ice Cliff Chasms" -$MAP_NAME_BY_ID[500] = "Bokka Amphitheatre" -$MAP_NAME_BY_ID[501] = "Riven Earth" -$MAP_NAME_BY_ID[502] = "The Astralarium" -$MAP_NAME_BY_ID[503] = "Throne of Secrets" -$MAP_NAME_BY_ID[504] = "Churranu Island Arena" -$MAP_NAME_BY_ID[505] = "Shing Jea Monastery mission" -$MAP_NAME_BY_ID[506] = "Haiju Lagoon mission" -$MAP_NAME_BY_ID[507] = "Jaya Bluffs mission" -$MAP_NAME_BY_ID[508] = "Seitung Harbor mission" -$MAP_NAME_BY_ID[509] = "Tsumei Village mission" -$MAP_NAME_BY_ID[510] = "Seitung Harbor mission 2" -$MAP_NAME_BY_ID[511] = "Tsumei Village mission 2" -$MAP_NAME_BY_ID[513] = "Drakkar Lake" -$MAP_NAME_BY_ID[529] = "Guild Hall - Uncharted Isle" -$MAP_NAME_BY_ID[530] = "Guild Hall - Isle of Wurms" -$MAP_NAME_BY_ID[531] = "Uncharted Isle" -$MAP_NAME_BY_ID[532] = "Isle of Wurms" -$MAP_NAME_BY_ID[533] = "Uncharted Isle" -$MAP_NAME_BY_ID[534] = "Isle of Wurms" -$MAP_NAME_BY_ID[536] = "Sunspear Arena" -$MAP_NAME_BY_ID[537] = "Guild Hall - Corrupted Isle" -$MAP_NAME_BY_ID[538] = "Guild Hall - Isle of Solitude" -$MAP_NAME_BY_ID[539] = "Corrupted Isle" -$MAP_NAME_BY_ID[540] = "Isle of Solitude" -$MAP_NAME_BY_ID[541] = "Corrupted Isle" -$MAP_NAME_BY_ID[542] = "Isle of Solitude" -$MAP_NAME_BY_ID[543] = "Sun Docks" -$MAP_NAME_BY_ID[544] = "Chahbek Village outpost" -$MAP_NAME_BY_ID[545] = "Remains of Sahlahja outpost" -$MAP_NAME_BY_ID[546] = "Jaga Moraine" -$MAP_NAME_BY_ID[547] = "Bombardment" -$MAP_NAME_BY_ID[548] = "Norrhart Moains" -$MAP_NAME_BY_ID[549] = "Hero Battles outpost" -$MAP_NAME_BY_ID[550] = "The Beachhead" -$MAP_NAME_BY_ID[551] = "The Crossing" -$MAP_NAME_BY_ID[552] = "Desert Sands" -$MAP_NAME_BY_ID[553] = "Varajar Fells" -$MAP_NAME_BY_ID[554] = "Dajkah Inlet outpost" -$MAP_NAME_BY_ID[555] = "The Shadow Nexus outpost" -$MAP_NAME_BY_ID[558] = "Sparkfly Swamp" -$MAP_NAME_BY_ID[559] = "Gate of the Nightfallen Lands" -$MAP_NAME_BY_ID[560] = "Cathedral of Flames" -$MAP_NAME_BY_ID[561] = "The Troubled Keeper" -$MAP_NAME_BY_ID[566] = "Verdant Cascades" -$MAP_NAME_BY_ID[567] = "Cathedral of Flames" -$MAP_NAME_BY_ID[568] = "Cathedral of Flames" -$MAP_NAME_BY_ID[569] = "Magus Stones" -$MAP_NAME_BY_ID[570] = "Catacombs of Kathandrax" -$MAP_NAME_BY_ID[571] = "Catacombs of Kathandrax" -$MAP_NAME_BY_ID[572] = "Alcazia Tangle" -$MAP_NAME_BY_ID[573] = "Rragar's Menagerie" -$MAP_NAME_BY_ID[574] = "Rragar's Menagerie" -$MAP_NAME_BY_ID[575] = "Rragar's Menagerie" -$MAP_NAME_BY_ID[576] = "Ooza Pit" -$MAP_NAME_BY_ID[577] = "Slaver's Exile" -$MAP_NAME_BY_ID[578] = "Oola's Lab" -$MAP_NAME_BY_ID[579] = "Oola's Lab" -$MAP_NAME_BY_ID[580] = "Oola's Lab" -$MAP_NAME_BY_ID[581] = "Shards of Oor" -$MAP_NAME_BY_ID[582] = "Shards of Oor" -$MAP_NAME_BY_ID[583] = "Shards of Oor" -$MAP_NAME_BY_ID[584] = "Arachni's Haunt" -$MAP_NAME_BY_ID[585] = "Arachni's Haunt" -$MAP_NAME_BY_ID[593] = "Fetid River" -$MAP_NAME_BY_ID[596] = "Forgotten Shrines" -$MAP_NAME_BY_ID[598] = "Antechamber" -$MAP_NAME_BY_ID[604] = "Vloxen Excavations" -$MAP_NAME_BY_ID[605] = "Vloxen Excavations" -$MAP_NAME_BY_ID[606] = "Vloxen Excavations" -$MAP_NAME_BY_ID[607] = "Heart of the Shiverpeaks" -$MAP_NAME_BY_ID[608] = "Heart of the Shiverpeaks" -$MAP_NAME_BY_ID[609] = "Heart of the Shiverpeaks" -$MAP_NAME_BY_ID[612] = "Bloodstone Caves" -$MAP_NAME_BY_ID[613] = "Bloodstone Caves" -$MAP_NAME_BY_ID[614] = "Bloodstone Caves" -$MAP_NAME_BY_ID[615] = "Bogroot Growths" -$MAP_NAME_BY_ID[616] = "Bogroot Growths" -$MAP_NAME_BY_ID[617] = "Raven's Point" -$MAP_NAME_BY_ID[618] = "Raven's Point" -$MAP_NAME_BY_ID[619] = "Raven's Point" -$MAP_NAME_BY_ID[620] = "Slaver's Exile" -$MAP_NAME_BY_ID[621] = "Slaver's Exile" -$MAP_NAME_BY_ID[622] = "Slaver's Exile" -$MAP_NAME_BY_ID[623] = "Slaver's Exile" -$MAP_NAME_BY_ID[624] = "Vlox's Falls" -$MAP_NAME_BY_ID[625] = "Battledepths" -$MAP_NAME_BY_ID[628] = "Sepulchre of Dragrimmar" -$MAP_NAME_BY_ID[629] = "Sepulchre of Dragrimmar" -$MAP_NAME_BY_ID[630] = "Frostmaw's Burrows" -$MAP_NAME_BY_ID[631] = "Frostmaw's Burrows" -$MAP_NAME_BY_ID[632] = "Frostmaw's Burrows" -$MAP_NAME_BY_ID[633] = "Frostmaw's Burrows" -$MAP_NAME_BY_ID[634] = "Frostmaw's Burrows" -$MAP_NAME_BY_ID[635] = "Darkrime Delves" -$MAP_NAME_BY_ID[636] = "Darkrime Delves" -$MAP_NAME_BY_ID[637] = "Darkrime Delves" -$MAP_NAME_BY_ID[638] = "Gadd's Encampment" -$MAP_NAME_BY_ID[639] = "Umbral Grotto" -$MAP_NAME_BY_ID[640] = "Rata Sum" -$MAP_NAME_BY_ID[641] = "Tarnished Haven" -$MAP_NAME_BY_ID[642] = "Eye of the North outpost" -$MAP_NAME_BY_ID[643] = "Sifhalla" -$MAP_NAME_BY_ID[644] = "Gunnar's Hold" -$MAP_NAME_BY_ID[645] = "Olafstead" -$MAP_NAME_BY_ID[646] = "Hall of Monuments" -$MAP_NAME_BY_ID[647] = "Dalada Uplands" -$MAP_NAME_BY_ID[648] = "Doomlore Shrine" -$MAP_NAME_BY_ID[649] = "Grothmar Wardowns" -$MAP_NAME_BY_ID[650] = "Longeye's Ledge" -$MAP_NAME_BY_ID[651] = "Sacnoth Valley" -$MAP_NAME_BY_ID[652] = "Central Transfer Chamber" -$MAP_NAME_BY_ID[653] = "Curse of the Nornbear" -$MAP_NAME_BY_ID[654] = "Blood Washes Blood" -$MAP_NAME_BY_ID[655] = "A Gate Too Far" -$MAP_NAME_BY_ID[656] = "A Gate Too Far" -$MAP_NAME_BY_ID[657] = "A Gate Too Far" -$MAP_NAME_BY_ID[658] = "The Elusive Golemancer" -$MAP_NAME_BY_ID[659] = "The Elusive Golemancer" -$MAP_NAME_BY_ID[660] = "The Elusive Golemancer" -$MAP_NAME_BY_ID[661] = "Finding the Bloodstone" -$MAP_NAME_BY_ID[662] = "Finding the Bloodstone" -$MAP_NAME_BY_ID[663] = "Finding the Bloodstone" -$MAP_NAME_BY_ID[664] = "Genius Operated Living Enchanted Manifestation" -$MAP_NAME_BY_ID[665] = "Against the Charr" -$MAP_NAME_BY_ID[666] = "Warband of Brothers" -$MAP_NAME_BY_ID[667] = "Warband of Brothers" -$MAP_NAME_BY_ID[668] = "Warband of Brothers" -$MAP_NAME_BY_ID[669] = "Assault the Stronghold" -$MAP_NAME_BY_ID[670] = "Destruction's Depths" -$MAP_NAME_BY_ID[671] = "Destruction's Depths" -$MAP_NAME_BY_ID[672] = "Destruction's Depths" -$MAP_NAME_BY_ID[673] = "A Time for Heroes" -$MAP_NAME_BY_ID[674] = "Warband Training" -$MAP_NAME_BY_ID[675] = "Boreal Station" -$MAP_NAME_BY_ID[676] = "Catacombs of Kathandrax" -$MAP_NAME_BY_ID[678] = "Attack of the Nornbear" -$MAP_NAME_BY_ID[686] = "Polymock Coliseum" -$MAP_NAME_BY_ID[687] = "Polymock Glacier" -$MAP_NAME_BY_ID[688] = "Polymock Crossing" -$MAP_NAME_BY_ID[690] = "Cold As Ice" -$MAP_NAME_BY_ID[691] = "Beneath Lion's Arch" -$MAP_NAME_BY_ID[692] = "Tunnels Below Cantha" -$MAP_NAME_BY_ID[693] = "Caverns Below Kamadan" -$MAP_NAME_BY_ID[695] = "Service: In Defense of the Eye" -$MAP_NAME_BY_ID[696] = "Mano a Norn-o" -$MAP_NAME_BY_ID[697] = "Service: Practice, Dummy" -$MAP_NAME_BY_ID[698] = "Hero Tutorial" -$MAP_NAME_BY_ID[700] = "The Norn Fighting Tournament" -$MAP_NAME_BY_ID[701] = "Secret Lair of the Snowmen" -$MAP_NAME_BY_ID[702] = "Norn Brawling Championship" -$MAP_NAME_BY_ID[703] = "Kilroy's Punchout Training" -$MAP_NAME_BY_ID[704] = "Fronis Irontoe's Lair" -$MAP_NAME_BY_ID[705] = "The Justiciar's End" -$MAP_NAME_BY_ID[707] = "The Great Norn Alemoot" -$MAP_NAME_BY_ID[708] = "Varajar Fells" -$MAP_NAME_BY_ID[710] = "Epilogue" -$MAP_NAME_BY_ID[711] = "Insidious Remnants" -$MAP_NAME_BY_ID[717] = "Attack on Jalis's Camp" -$MAP_NAME_BY_ID[721] = "Costume Brawl outpost" -$MAP_NAME_BY_ID[722] = "Whitefury Rapids" -$MAP_NAME_BY_ID[723] = "Kysten Shore" -$MAP_NAME_BY_ID[724] = "Deepway Ruins" -$MAP_NAME_BY_ID[725] = "Plikkup Works" -$MAP_NAME_BY_ID[726] = "Kilroy's Punchout Tournamet" -$MAP_NAME_BY_ID[727] = "Special Ops: Flame Temple Corridor" -$MAP_NAME_BY_ID[728] = "Special Ops: Dragon Gullet" -$MAP_NAME_BY_ID[729] = "Special Ops: Gendich Courthouse" -$MAP_NAME_BY_ID[770] = "The Tengu Accords" -$MAP_NAME_BY_ID[771] = "The battle of Jahai" -$MAP_NAME_BY_ID[772] = "The Flight North" -$MAP_NAME_BY_ID[773] = "The Rise of the White Mantle" -$MAP_NAME_BY_ID[781] = "Secret Lair of the Snowmen" -$MAP_NAME_BY_ID[782] = "Secret Lair of the Snowmen" -$MAP_NAME_BY_ID[783] = "Droknar's Forge Explorable" -$MAP_NAME_BY_ID[784] = "Isle of the Nameless" -$MAP_NAME_BY_ID[788] = "Deactivating R.O.X" -$MAP_NAME_BY_ID[789] = "Deactivating P.O.X" -$MAP_NAME_BY_ID[790] = "Deactivating N.O.X" -$MAP_NAME_BY_ID[791] = "Secret Underground Lair" -$MAP_NAME_BY_ID[792] = "Golem Tutorial Simulation" -$MAP_NAME_BY_ID[793] = "Snowball Dominance" -$MAP_NAME_BY_ID[794] = "Zaishen Menagerie Grounds" -$MAP_NAME_BY_ID[795] = "Zaishen Menagerie outpost" -$MAP_NAME_BY_ID[796] = "Codex Arena outpost" -$MAP_NAME_BY_ID[806] = "The Underworld: Something Wicked This Way Comes" -$MAP_NAME_BY_ID[807] = "The Underworld: Don't Fear the Reapers" -$MAP_NAME_BY_ID[808] = "Lions Arch - Halloween" -$MAP_NAME_BY_ID[809] = "Lions Arch - Wintersday" -$MAP_NAME_BY_ID[810] = "Lions Arch - Canthan New Year" -$MAP_NAME_BY_ID[811] = "Ascalon City - Wintersday" -$MAP_NAME_BY_ID[812] = "Droknars Forge - Halloween" -$MAP_NAME_BY_ID[813] = "Droknars Forge - Wintersday" -$MAP_NAME_BY_ID[814] = "Tomb of the Primeval Kings - Halloween" -$MAP_NAME_BY_ID[815] = "Shing Jea Monastery - Dragon Festival" -$MAP_NAME_BY_ID[816] = "Shing Jea Monastery - Canthan New Year" -$MAP_NAME_BY_ID[817] = "Kaineng Center" -$MAP_NAME_BY_ID[818] = "Kamadan Jewel of Istan - Halloween" -$MAP_NAME_BY_ID[819] = "Kamadan Jewel of Istan - Wintersday" -$MAP_NAME_BY_ID[820] = "Kamadan Jewel of Istan - Canthan New Year" -$MAP_NAME_BY_ID[821] = "Eye of the North outpost - Wintersday" -$MAP_NAME_BY_ID[837] = "War in Kryta: Talmark Wilderness" -$MAP_NAME_BY_ID[838] = "Trial of Zinn" -$MAP_NAME_BY_ID[839] = "Divinity Coast Explorable" -$MAP_NAME_BY_ID[840] = "Lion's Arch Keep" -$MAP_NAME_BY_ID[841] = "D'Alessio Seaboard Explorable" -$MAP_NAME_BY_ID[842] = "The Battle for Lion's Arch Explorable" -$MAP_NAME_BY_ID[843] = "Riverside Province Explorable" -$MAP_NAME_BY_ID[844] = "War in Kryta: Lion's Arch" -$MAP_NAME_BY_ID[845] = "The Masoleum" -$MAP_NAME_BY_ID[846] = "Rise" -$MAP_NAME_BY_ID[847] = "Shadows in the Jungle" -$MAP_NAME_BY_ID[848] = "A Vengeance of Blades" -$MAP_NAME_BY_ID[849] = "Auspicious Beginnings" -$MAP_NAME_BY_ID[854] = "Olfstead Explorable" -$MAP_NAME_BY_ID[855] = "The Great Snowball Fight of the Gods Operation: Crush Spirits" -$MAP_NAME_BY_ID[856] = "The Great Snowball Fight of the Gods Fighting in a Winter Wonderland" -$MAP_NAME_BY_ID[857] = "Embark Beach" -$MAP_NAME_BY_ID[860] = "What Waits in Shadow - Dragon's Throat Explorable" -$MAP_NAME_BY_ID[861] = "A Chance Encounter: Kaineng Center" -$MAP_NAME_BY_ID[862] = "Tracking the Corruption: Marketplace Explorable" -$MAP_NAME_BY_ID[863] = "Cantha Courier: Bukdek Byway" -$MAP_NAME_BY_ID[864] = "A Treaty's a Treaty: Tsumei Village" -$MAP_NAME_BY_ID[865] = "Deadly Cargo: Seitung Harbor Explorable" -$MAP_NAME_BY_ID[866] = "The Rescue Attempt: Tahnnakai Temple" -$MAP_NAME_BY_ID[867] = "Viloence in the Streets: Wajjun Bazaar" -$MAP_NAME_BY_ID[868] = "Sacred Psyche" -$MAP_NAME_BY_ID[869] = "Calling All Thugs: Shadow's Passage" -$MAP_NAME_BY_ID[870] = "Finding Jinnai: Altrumn Ruins" -$MAP_NAME_BY_ID[871] = "Raid on Shing Jea Monastery: Shing Jea Monastery" -$MAP_NAME_BY_ID[872] = "Raid on Kaineng Center: Kaineng Center" -$MAP_NAME_BY_ID[873] = "Ministry of Oppression: Wajjun Bazaar" -$MAP_NAME_BY_ID[874] = "The Final Confrontation" -$MAP_NAME_BY_ID[875] = "Lakeside County: 1070 AE" -$MAP_NAME_BY_ID[876] = "Ashford Catacombs: 1070 AE" -#EndRegion - -#Region Misc -Global Const $Sunday = "Sunday" -Global Const $Monday = "Monday" -Global Const $Tuesday = "Tuesday" -Global Const $Wednesday = "Wednesday" -Global Const $Thursday = "Thursday" -Global Const $Friday = "Friday" -Global Const $Saturday = "Saturday" - - -#EndRegion \ No newline at end of file + +#include-once + +#cs ============================================================ + GWA2 Constants File + + Thanks to: + GWCA Constants Team + d8rken for Zraw API constants + Gigi for constants from GWToolbox + +#ce ============================================================ + +#Region Map and co. +; DIFFICULTY +Global Enum $DIFFICULTY_NORMAL, $DIFFICULTY_HARD + +; INSTANCETYPE +Global Enum $INSTANCETYPE_OUTPOST, $INSTANCETYPE_EXPLORABLE, $INSTANCETYPE_LOADING + +; REGIONS +Global Enum $REGION_International = -2, $REGION_America = 0, $REGION_Korea, $REGION_Europe, $REGION_China, $REGION_Japan + +; LANGUAGES +Global Enum $LANGUAGE_English = 0, $LANGUAGE_French = 2, $LANGUAGE_German, $LANGUAGE_Italian, $LANGUAGE_Spanish, $LANGUAGE_Polish = 9, $LANGUAGE_Russian +#EndRegion + +#Region Items and Inventory/Bags +; RARITY +Global Enum $RARITY_White = 0x3D, $RARITY_Blue = 0x3F, $RARITY_Purple = 0x42, $RARITY_Gold = 0x40, $RARITY_Green = 0x43 + +; BAGS +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 + +; DYE EXTRA ID's +Global Enum $DYE_Blue = 2, $DYE_Green, $DYE_Purple, $DYE_Red, $DYE_Yellow, $DYE_Brown, $DYE_Orange, $DYE_Silver, $DYE_Black, $DYE_Gray, $DYE_White, $DYE_Pink +Global $Pink = 9 + +; MOD STRUCT IDENTIFIERS +Global Const $MODSTRUCT_HEADPIECE_DOMINATION_MAGIC = "3F" +Global Const $MODSTRUCT_HEADPIECE_FAST_CASTING = "40" +Global Const $MODSTRUCT_HEADPIECE_ILLUSION_MAGIC = "41" +Global Const $MODSTRUCT_HEADPIECE_INSPIRATION_MAGIC = "42" + +Global Const $MODSTRUCT_HEADPIECE_BLOOD_MAGIC = "43" +Global Const $MODSTRUCT_HEADPIECE_CURSES = "44" +Global Const $MODSTRUCT_HEADPIECE_DEATH_MAGIC = "45" +Global Const $MODSTRUCT_HEADPIECE_SOUL_REAPING = "46" + +Global Const $MODSTRUCT_HEADPIECE_AIR_MAGIC = "47" +Global Const $MODSTRUCT_HEADPIECE_EARTH_MAGIC = "48" +Global Const $MODSTRUCT_HEADPIECE_ENERGY_STORAGE = "49" +Global Const $MODSTRUCT_HEADPIECE_FIRE_MAGIC = "4A" +Global Const $MODSTRUCT_HEADPIECE_WATER_MAGIC = "4B" + +Global Const $MODSTRUCT_HEADPIECE_DIVINE_FAVOR = "4C" +Global Const $MODSTRUCT_HEADPIECE_HEALING_PRAYERS = "4D" +Global Const $MODSTRUCT_HEADPIECE_PROTECTION_PRAYERS = "4E" +Global Const $MODSTRUCT_HEADPIECE_SMITING_PRAYERS = "4F" + +Global Const $MODSTRUCT_HEADPIECE_AXE_MASTERY = "50" +Global Const $MODSTRUCT_HEADPIECE_HAMMER_MASTERY = "51" +Global Const $MODSTRUCT_HEADPIECE_SWORDSMANSHIP = "53" +Global Const $MODSTRUCT_HEADPIECE_STRENGTH = "54" +Global Const $MODSTRUCT_HEADPIECE_TACTICS = "55" + +Global Const $MODSTRUCT_HEADPIECE_BEAST_MASTERY = "56" +Global Const $MODSTRUCT_HEADPIECE_MARKSMANSHIP = "57" +Global Const $MODSTRUCT_HEADPIECE_EXPERTISE = "58" +Global Const $MODSTRUCT_HEADPIECE_WILDERNESS_SURVIVAL = "59" + +#Region ItemModelIDs +Global Const $Ectoplasm = 930 +Global Const $ObsidianShards = 945 +Global Const $Ruby = 937 +Global Const $Sapphire = 938 +Global Const $DiessaChalice = 24353 +Global Const $GoldenRinRelics = 24354 +Global Const $Lockpicks = 22751 +Global Const $SuperbCharrCarving = 27052 +Global Const $DarkRemains = 522 +Global Const $UmbralSkeletalLimbs = 525 +Global Const $Scroll_Underworld = 3746 +Global Const $Scroll_FOW = 22280 +Global Const $MAT_Bone = 921 +Global Const $MAT_Dust = 929 +Global Const $MAT_Iron = 948 +Global Const $MAT_TannedHides = 940 +Global Const $MAT_Scales = 953 +Global Const $MAT_Chitin = 954 +Global Const $MAT_Cloth = 925 +Global Const $MAT_Wood = 946 +Global Const $MAT_Granite = 955 +Global Const $MAT_Fiber = 934 +Global Const $MAT_Feathers = 933 +Global Const $CON_EssenceOfCelerity = 24859 +Global Const $CON_GrailOfMight = 24861 +Global Const $CON_ArmorOfSalvation = 24860 +Global Const $grog = 30855 +Global Const $golds = 2511 +Global Const $gstones = 27047 +Global Const $tots = 28434 +#EndRegion ItemModelIDs +#EndRegion + +#Region Heroes +; HERO ID's +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_Hayda, $HERO_Kahmu, $HERO_Gwen, $HERO_Xandra, $HERO_Vekk, $HERO_Ogden + +; HERO MODES +Global Enum $HEROMODE_Fight, $HEROMODE_Guard, $HEROMODE_Avoid +#EndRegion + +#Region ProfessionStats +; PROFESSION ID's +Global Enum $PROFESSION_None,$PROFESSION_Warrior,$PROFESSION_Ranger,$PROFESSION_Monk,$PROFESSION_Necromancer,$PROFESSION_Mesmer,$PROFESSION_Elementalist, _ + $PROFESSION_Assassin,$PROFESSION_Ritualist, _ + $PROFESSION_Paragon,$PROFESSION_Dervish + +; ATTRIBUTE ID's +Global Enum $ATTRIB_FastCasting, $ATTRIB_IllusionMagic, $ATTRIB_DominationMagic, $ATTRIB_InspirationMagic, _ + $ATTRIB_BloodMagic, $ATTRIB_DeathMagic, $ATTRIB_SoulReaping, $ATTRIB_Curses, _ + $ATTRIB_AirMagic, $ATTRIB_EarthMagic, $ATTRIB_FireMagic, $ATTRIB_WaterMagic, $ATTRIB_EnergyStorage, _ + $ATTRIB_HealingPrayers, $ATTRIB_SmitingPrayers, $ATTRIB_ProtectionPrayers, $ATTRIB_DivineFavor, _ + $ATTRIB_Strength, $ATTRIB_AxeMastery, $ATTRIB_HammerMastery, $ATTRIB_Swordsmanship, $ATTRIB_Tactics, _ + $ATTRIB_BeastMastery, $ATTRIB_Expertise, $ATTRIB_WildernessSurvival, $ATTRIB_Marksmanship, _ + $ATTRIB_DaggerMastery, $ATTRIB_DeadlyArts, $ATTRIB_ShadowArts, _ + $ATTRIB_Communing, $ATTRIB_RestorationMagic, $ATTRIB_ChannelingMagic, _ + $ATTRIB_CriticalStrikes, _ + $ATTRIB_SpawningPower, _ + $ATTRIB_SpearMastery, $ATTRIB_Command, $ATTRIB_Motivation, $ATTRIB_Leadership, _ + $ATTRIB_ScytheMastery, $ATTRIB_WindPrayers, $ATTRIB_EarthPrayers, $ATTRIB_Mysticism + +; WEAPON TYPES +Global Enum $EQUIP_Weapon, $EQUIP_Offhand, $EQUIP_Chest, $EQUIP_Legs, $EQUIP_Head, $EQUIP_Feet, $EQUIP_Hands +#EndRegion + +#Region Skills +; SKILL TYPES +Global Enum $SKILLTYPE_Stance = 3, $SKILLTYPE_Hex, $SKILLTYPE_Spell, $SKILLTYPE_Enchantment, $SKILLTYPE_Signet, $SKILLTYPE_Well = 9, _ + $SKILLTYPE_Skill, $SKILLTYPE_Ward, $SKILLTYPE_Glyph, $SKILLTYPE_Attack = 14, $SKILLTYPE_Shout, $SKILLTYPE_Preparation = 19, _ + $SKILLTYPE_Trap = 21, $SKILLTYPE_Ritual, $SKILLTYPE_ItemSpell = 24, $SKILLTYPE_WeaponSpell, $SKILLTYPE_Chant = 27, $SKILLTYPE_EchoRefrain + +; SKILL TARGETS +Global $TARGET_self = 0 +Global $TARGET_none = 0 +Global $TARGET_spirit = 1 +Global $TARGET_animal = 1 +Global $TARGET_corpse = 1 +Global $TARGET_ally = 3 +Global $TARGET_otherally = 4 +Global $TARGET_enemy = 5 +Global $TARGET_dead_ally = 6 +Global $TARGET_minion = 14 +Global $TARGET_ground = 16 + +; RANGES +Global Const $RANGE_Adjacent = 156 +Global Const $RANGE_Nearby = 240 +Global Const $RANGE_Area = 312 +Global Const $RANGE_Earshot = 1000 +Global Const $RANGE_Spell_casting = 1085 +Global Const $RANGE_Spirit = 2500 +Global Const $RANGE_Compass = 5000 + +;SKILL IDs +Global Const $SKILLID_No_Skill = 0; +Global Const $SKILLID_Healing_Signet = 1; +Global Const $SKILLID_Resurrection_Signet = 2; +Global Const $SKILLID_Signet_of_Capture = 3; +Global Const $SKILLID_BAMPH = 4; +Global Const $SKILLID_Power_Block = 5; +Global Const $SKILLID_Mantra_of_Earth = 6; +Global Const $SKILLID_Mantra_of_Flame = 7; +Global Const $SKILLID_Mantra_of_Frost = 8; +Global Const $SKILLID_Mantra_of_Lightning = 9; +Global Const $SKILLID_Hex_Breaker = 10; +Global Const $SKILLID_Distortion = 11; +Global Const $SKILLID_Mantra_of_Celerity = 12; +Global Const $SKILLID_Mantra_of_Recovery = 13; +Global Const $SKILLID_Mantra_of_Persistence = 14; +Global Const $SKILLID_Mantra_of_Inscriptions = 15; +Global Const $SKILLID_Mantra_of_Concentration = 16; +Global Const $SKILLID_Mantra_of_Resolve = 17; +Global Const $SKILLID_Mantra_of_Signets = 18; +Global Const $SKILLID_Fragility = 19; +Global Const $SKILLID_Confusion = 20; +Global Const $SKILLID_Inspired_Enchantment = 21; +Global Const $SKILLID_Inspired_Hex = 22; +Global Const $SKILLID_Power_Spike = 23; +Global Const $SKILLID_Power_Leak = 24; +Global Const $SKILLID_Power_Drain = 25; +Global Const $SKILLID_Empathy = 26; +Global Const $SKILLID_Shatter_Delusions = 27; +Global Const $SKILLID_Backfire = 28; +Global Const $SKILLID_Blackout = 29; +Global Const $SKILLID_Diversion = 30; +Global Const $SKILLID_Conjure_Phantasm = 31; +Global Const $SKILLID_Illusion_of_Weakness = 32; +Global Const $SKILLID_Illusionary_Weaponry = 33; +Global Const $SKILLID_Sympathetic_Visage = 34; +Global Const $SKILLID_Ignorance = 35; +Global Const $SKILLID_Arcane_Conundrum = 36; +Global Const $SKILLID_Illusion_of_Haste = 37; +Global Const $SKILLID_Channeling = 38; +Global Const $SKILLID_Energy_Surge = 39; +Global Const $SKILLID_Ether_Feast = 40; +Global Const $SKILLID_Ether_Lord = 41; +Global Const $SKILLID_Energy_Burn = 42; +Global Const $SKILLID_Clumsiness = 43; +Global Const $SKILLID_Phantom_Pain = 44; +Global Const $SKILLID_Ethereal_Burden = 45; +Global Const $SKILLID_Guilt = 46; +Global Const $SKILLID_Ineptitude = 47; +Global Const $SKILLID_Spirit_of_Failure = 48; +Global Const $SKILLID_Mind_Wrack = 49; +Global Const $SKILLID_Wastrels_Worry = 50; +Global Const $SKILLID_Shame = 51; +Global Const $SKILLID_Panic = 52; +Global Const $SKILLID_Migraine = 53; +Global Const $SKILLID_Crippling_Anguish = 54; +Global Const $SKILLID_Fevered_Dreams = 55; +Global Const $SKILLID_Soothing_Images = 56; +Global Const $SKILLID_Cry_of_Frustration = 57; +Global Const $SKILLID_Signet_of_Midnight = 58; +Global Const $SKILLID_Signet_of_Weariness = 59; +Global Const $SKILLID_Signet_of_Illusions_beta_version = 60; +Global Const $SKILLID_Leech_Signet = 61; +Global Const $SKILLID_Signet_of_Humility = 62; +Global Const $SKILLID_Keystone_Signet = 63; +Global Const $SKILLID_Mimic = 64; +Global Const $SKILLID_Arcane_Mimicry = 65; +Global Const $SKILLID_Spirit_Shackles = 66; +Global Const $SKILLID_Shatter_Hex = 67; +Global Const $SKILLID_Drain_Enchantment = 68; +Global Const $SKILLID_Shatter_Enchantment = 69; +Global Const $SKILLID_Disappear = 70; +Global Const $SKILLID_Unnatural_Signet_alpha_version = 71; +Global Const $SKILLID_Elemental_Resistance = 72; +Global Const $SKILLID_Physical_Resistance = 73; +Global Const $SKILLID_Echo = 74; +Global Const $SKILLID_Arcane_Echo = 75; +Global Const $SKILLID_Imagined_Burden = 76; +Global Const $SKILLID_Chaos_Storm = 77; +Global Const $SKILLID_Epidemic = 78; +Global Const $SKILLID_Energy_Drain = 79; +Global Const $SKILLID_Energy_Tap = 80; +Global Const $SKILLID_Arcane_Thievery = 81; +Global Const $SKILLID_Mantra_of_Recall = 82; +Global Const $SKILLID_Animate_Bone_Horror = 83; +Global Const $SKILLID_Animate_Bone_Fiend = 84; +Global Const $SKILLID_Animate_Bone_Minions = 85; +Global Const $SKILLID_Grenths_Balance = 86; +Global Const $SKILLID_Veratas_Gaze = 87; +Global Const $SKILLID_Veratas_Aura = 88; +Global Const $SKILLID_Deathly_Chill = 89; +Global Const $SKILLID_Veratas_Sacrifice = 90; +Global Const $SKILLID_Well_of_Power = 91; +Global Const $SKILLID_Well_of_Blood = 92; +Global Const $SKILLID_Well_of_Suffering = 93; +Global Const $SKILLID_Well_of_the_Profane = 94; +Global Const $SKILLID_Putrid_Explosion = 95; +Global Const $SKILLID_Soul_Feast = 96; +Global Const $SKILLID_Necrotic_Traversal = 97; +Global Const $SKILLID_Consume_Corpse = 98; +Global Const $SKILLID_Parasitic_Bond = 99; +Global Const $SKILLID_Soul_Barbs = 100; +Global Const $SKILLID_Barbs = 101; +Global Const $SKILLID_Shadow_Strike = 102; +Global Const $SKILLID_Price_of_Failure = 103; +Global Const $SKILLID_Death_Nova = 104; +Global Const $SKILLID_Deathly_Swarm = 105; +Global Const $SKILLID_Rotting_Flesh = 106; +Global Const $SKILLID_Virulence = 107; +Global Const $SKILLID_Suffering = 108; +Global Const $SKILLID_Life_Siphon = 109; +Global Const $SKILLID_Unholy_Feast = 110; +Global Const $SKILLID_Awaken_the_Blood = 111; +Global Const $SKILLID_Desecrate_Enchantments = 112; +Global Const $SKILLID_Tainted_Flesh = 113; +Global Const $SKILLID_Aura_of_the_Lich = 114; +Global Const $SKILLID_Blood_Renewal = 115; +Global Const $SKILLID_Dark_Aura = 116; +Global Const $SKILLID_Enfeeble = 117; +Global Const $SKILLID_Enfeebling_Blood = 118; +Global Const $SKILLID_Blood_is_Power = 119; +Global Const $SKILLID_Blood_of_the_Master = 120; +Global Const $SKILLID_Spiteful_Spirit = 121; +Global Const $SKILLID_Malign_Intervention = 122; +Global Const $SKILLID_Insidious_Parasite = 123; +Global Const $SKILLID_Spinal_Shivers = 124; +Global Const $SKILLID_Wither = 125; +Global Const $SKILLID_Life_Transfer = 126; +Global Const $SKILLID_Mark_of_Subversion = 127; +Global Const $SKILLID_Soul_Leech = 128; +Global Const $SKILLID_Defile_Flesh = 129; +Global Const $SKILLID_Demonic_Flesh = 130; +Global Const $SKILLID_Barbed_Signet = 131; +Global Const $SKILLID_Plague_Signet = 132; +Global Const $SKILLID_Dark_Pact = 133; +Global Const $SKILLID_Order_of_Pain = 134; +Global Const $SKILLID_Faintheartedness = 135; +Global Const $SKILLID_Shadow_of_Fear = 136; +Global Const $SKILLID_Rigor_Mortis = 137; +Global Const $SKILLID_Dark_Bond = 138; +Global Const $SKILLID_Infuse_Condition = 139; +Global Const $SKILLID_Malaise = 140; +Global Const $SKILLID_Rend_Enchantments = 141; +Global Const $SKILLID_Lingering_Curse = 142; +Global Const $SKILLID_Strip_Enchantment = 143; +Global Const $SKILLID_Chilblains = 144; +Global Const $SKILLID_Signet_of_Agony = 145; +Global Const $SKILLID_Offering_of_Blood = 146; +Global Const $SKILLID_Dark_Fury = 147; +Global Const $SKILLID_Order_of_the_Vampire = 148; +Global Const $SKILLID_Plague_Sending = 149; +Global Const $SKILLID_Mark_of_Pain = 150; +Global Const $SKILLID_Feast_of_Corruption = 151; +Global Const $SKILLID_Taste_of_Death = 152; +Global Const $SKILLID_Vampiric_Gaze = 153; +Global Const $SKILLID_Plague_Touch = 154; +Global Const $SKILLID_Vile_Touch = 155; +Global Const $SKILLID_Vampiric_Touch = 156; +Global Const $SKILLID_Blood_Ritual = 157; +Global Const $SKILLID_Touch_of_Agony = 158; +Global Const $SKILLID_Weaken_Armor = 159; +Global Const $SKILLID_Windborne_Speed = 160; +Global Const $SKILLID_Lightning_Storm = 161; +Global Const $SKILLID_Gale = 162; +Global Const $SKILLID_Whirlwind = 163; +Global Const $SKILLID_Elemental_Attunement = 164; +Global Const $SKILLID_Armor_of_Earth = 165; +Global Const $SKILLID_Kinetic_Armor = 166; +Global Const $SKILLID_Eruption = 167; +Global Const $SKILLID_Magnetic_Aura = 168; +Global Const $SKILLID_Earth_Attunement = 169; +Global Const $SKILLID_Earthquake = 170; +Global Const $SKILLID_Stoning = 171; +Global Const $SKILLID_Stone_Daggers = 172; +Global Const $SKILLID_Grasping_Earth = 173; +Global Const $SKILLID_Aftershock = 174; +Global Const $SKILLID_Ward_Against_Elements = 175; +Global Const $SKILLID_Ward_Against_Melee = 176; +Global Const $SKILLID_Ward_Against_Foes = 177; +Global Const $SKILLID_Ether_Prodigy = 178; +Global Const $SKILLID_Incendiary_Bonds = 179; +Global Const $SKILLID_Aura_of_Restoration = 180; +Global Const $SKILLID_Ether_Renewal = 181; +Global Const $SKILLID_Conjure_Flame = 182; +Global Const $SKILLID_Inferno = 183; +Global Const $SKILLID_Fire_Attunement = 184; +Global Const $SKILLID_Mind_Burn = 185; +Global Const $SKILLID_Fireball = 186; +Global Const $SKILLID_Meteor = 187; +Global Const $SKILLID_Flame_Burst = 188; +Global Const $SKILLID_Rodgorts_Invocation = 189; +Global Const $SKILLID_Mark_of_Rodgort = 190; +Global Const $SKILLID_Immolate = 191; +Global Const $SKILLID_Meteor_Shower = 192; +Global Const $SKILLID_Phoenix = 193; +Global Const $SKILLID_Flare = 194; +Global Const $SKILLID_Lava_Font = 195; +Global Const $SKILLID_Searing_Heat = 196; +Global Const $SKILLID_Fire_Storm = 197; +Global Const $SKILLID_Glyph_of_Elemental_Power = 198; +Global Const $SKILLID_Glyph_of_Energy = 199; +Global Const $SKILLID_Glyph_of_Lesser_Energy = 200; +Global Const $SKILLID_Glyph_of_Concentration = 201; +Global Const $SKILLID_Glyph_of_Sacrifice = 202; +Global Const $SKILLID_Glyph_of_Renewal = 203; +Global Const $SKILLID_Rust = 204; +Global Const $SKILLID_Lightning_Surge = 205; +Global Const $SKILLID_Armor_of_Frost = 206; +Global Const $SKILLID_Conjure_Frost = 207; +Global Const $SKILLID_Water_Attunement = 208; +Global Const $SKILLID_Mind_Freeze = 209; +Global Const $SKILLID_Ice_Prison = 210; +Global Const $SKILLID_Ice_Spikes = 211; +Global Const $SKILLID_Frozen_Burst = 212; +Global Const $SKILLID_Shard_Storm = 213; +Global Const $SKILLID_Ice_Spear = 214; +Global Const $SKILLID_Maelstrom = 215; +Global Const $SKILLID_Iron_Mist = 216; +Global Const $SKILLID_Crystal_Wave = 217; +Global Const $SKILLID_Obsidian_Flesh = 218; +Global Const $SKILLID_Obsidian_Flame = 219; +Global Const $SKILLID_Blinding_Flash = 220; +Global Const $SKILLID_Conjure_Lightning = 221; +Global Const $SKILLID_Lightning_Strike = 222; +Global Const $SKILLID_Chain_Lightning = 223; +Global Const $SKILLID_Enervating_Charge = 224; +Global Const $SKILLID_Air_Attunement = 225; +Global Const $SKILLID_Mind_Shock = 226; +Global Const $SKILLID_Glimmering_Mark = 227; +Global Const $SKILLID_Thunderclap = 228; +Global Const $SKILLID_Lightning_Orb = 229; +Global Const $SKILLID_Lightning_Javelin = 230; +Global Const $SKILLID_Shock = 231; +Global Const $SKILLID_Lightning_Touch = 232; +Global Const $SKILLID_Swirling_Aura = 233; +Global Const $SKILLID_Deep_Freeze = 234; +Global Const $SKILLID_Blurred_Vision = 235; +Global Const $SKILLID_Mist_Form = 236; +Global Const $SKILLID_Water_Trident = 237; +Global Const $SKILLID_Armor_of_Mist = 238; +Global Const $SKILLID_Ward_Against_Harm = 239; +Global Const $SKILLID_Smite = 240; +Global Const $SKILLID_Life_Bond = 241; +Global Const $SKILLID_Balthazars_Spirit = 242; +Global Const $SKILLID_Strength_of_Honor = 243; +Global Const $SKILLID_Life_Attunement = 244; +Global Const $SKILLID_Protective_Spirit = 245; +Global Const $SKILLID_Divine_Intervention = 246; +Global Const $SKILLID_Symbol_of_Wrath = 247; +Global Const $SKILLID_Retribution = 248; +Global Const $SKILLID_Holy_Wrath = 249; +Global Const $SKILLID_Essence_Bond = 250; +Global Const $SKILLID_Scourge_Healing = 251; +Global Const $SKILLID_Banish = 252; +Global Const $SKILLID_Scourge_Sacrifice = 253; +Global Const $SKILLID_Vigorous_Spirit = 254; +Global Const $SKILLID_Watchful_Spirit = 255; +Global Const $SKILLID_Blessed_Aura = 256; +Global Const $SKILLID_Aegis = 257; +Global Const $SKILLID_Guardian = 258; +Global Const $SKILLID_Shield_of_Deflection = 259; +Global Const $SKILLID_Aura_of_Faith = 260; +Global Const $SKILLID_Shield_of_Regeneration = 261; +Global Const $SKILLID_Shield_of_Judgment = 262; +Global Const $SKILLID_Protective_Bond = 263; +Global Const $SKILLID_Pacifism = 264; +Global Const $SKILLID_Amity = 265; +Global Const $SKILLID_Peace_and_Harmony = 266; +Global Const $SKILLID_Judges_Insight = 267; +Global Const $SKILLID_Unyielding_Aura = 268; +Global Const $SKILLID_Mark_of_Protection = 269; +Global Const $SKILLID_Life_Barrier = 270; +Global Const $SKILLID_Zealots_Fire = 271; +Global Const $SKILLID_Balthazars_Aura = 272; +Global Const $SKILLID_Spell_Breaker = 273; +Global Const $SKILLID_Healing_Seed = 274; +Global Const $SKILLID_Mend_Condition = 275; +Global Const $SKILLID_Restore_Condition = 276; +Global Const $SKILLID_Mend_Ailment = 277; +Global Const $SKILLID_Purge_Conditions = 278; +Global Const $SKILLID_Divine_Healing = 279; +Global Const $SKILLID_Heal_Area = 280; +Global Const $SKILLID_Orison_of_Healing = 281; +Global Const $SKILLID_Word_of_Healing = 282; +Global Const $SKILLID_Dwaynas_Kiss = 283; +Global Const $SKILLID_Divine_Boon = 284; +Global Const $SKILLID_Healing_Hands = 285; +Global Const $SKILLID_Heal_Other = 286; +Global Const $SKILLID_Heal_Party = 287; +Global Const $SKILLID_Healing_Breeze = 288; +Global Const $SKILLID_Vital_Blessing = 289; +Global Const $SKILLID_Mending = 290; +Global Const $SKILLID_Live_Vicariously = 291; +Global Const $SKILLID_Infuse_Health = 292; +Global Const $SKILLID_Signet_of_Devotion = 293; +Global Const $SKILLID_Signet_of_Judgment = 294; +Global Const $SKILLID_Purge_Signet = 295; +Global Const $SKILLID_Bane_Signet = 296; +Global Const $SKILLID_Blessed_Signet = 297; +Global Const $SKILLID_Martyr = 298; +Global Const $SKILLID_Shielding_Hands = 299; +Global Const $SKILLID_Contemplation_of_Purity = 300; +Global Const $SKILLID_Remove_Hex = 301; +Global Const $SKILLID_Smite_Hex = 302; +Global Const $SKILLID_Convert_Hexes = 303; +Global Const $SKILLID_Light_of_Dwayna = 304; +Global Const $SKILLID_Resurrect = 305; +Global Const $SKILLID_Rebirth = 306; +Global Const $SKILLID_Reversal_of_Fortune = 307; +Global Const $SKILLID_Succor = 308; +Global Const $SKILLID_Holy_Veil = 309; +Global Const $SKILLID_Divine_Spirit = 310; +Global Const $SKILLID_Draw_Conditions = 311; +Global Const $SKILLID_Holy_Strike = 312; +Global Const $SKILLID_Healing_Touch = 313; +Global Const $SKILLID_Restore_Life = 314; +Global Const $SKILLID_Vengeance = 315; +Global Const $SKILLID_To_the_Limit = 316; +Global Const $SKILLID_Battle_Rage = 317; +Global Const $SKILLID_Defy_Pain = 318; +Global Const $SKILLID_Rush = 319; +Global Const $SKILLID_Hamstring = 320; +Global Const $SKILLID_Wild_Blow = 321; +Global Const $SKILLID_Power_Attack = 322; +Global Const $SKILLID_Desperation_Blow = 323; +Global Const $SKILLID_Thrill_of_Victory = 324; +Global Const $SKILLID_Distracting_Blow = 325; +Global Const $SKILLID_Protectors_Strike = 326; +Global Const $SKILLID_Griffons_Sweep = 327; +Global Const $SKILLID_Pure_Strike = 328; +Global Const $SKILLID_Skull_Crack = 329; +Global Const $SKILLID_Cyclone_Axe = 330; +Global Const $SKILLID_Hammer_Bash = 331; +Global Const $SKILLID_Bulls_Strike = 332; +Global Const $SKILLID_I_Will_Avenge_You = 333; +Global Const $SKILLID_Axe_Rake = 334; +Global Const $SKILLID_Cleave = 335; +Global Const $SKILLID_Executioners_Strike = 336; +Global Const $SKILLID_Dismember = 337; +Global Const $SKILLID_Eviscerate = 338; +Global Const $SKILLID_Penetrating_Blow = 339; +Global Const $SKILLID_Disrupting_Chop = 340; +Global Const $SKILLID_Swift_Chop = 341; +Global Const $SKILLID_Axe_Twist = 342; +Global Const $SKILLID_For_Great_Justice = 343; +Global Const $SKILLID_Flurry = 344; +Global Const $SKILLID_Defensive_Stance = 345; +Global Const $SKILLID_Frenzy = 346; +Global Const $SKILLID_Endure_Pain = 347; +Global Const $SKILLID_Watch_Yourself = 348; +Global Const $SKILLID_Sprint = 349; +Global Const $SKILLID_Belly_Smash = 350; +Global Const $SKILLID_Mighty_Blow = 351; +Global Const $SKILLID_Crushing_Blow = 352; +Global Const $SKILLID_Crude_Swing = 353; +Global Const $SKILLID_Earth_Shaker = 354; +Global Const $SKILLID_Devastating_Hammer = 355; +Global Const $SKILLID_Irresistible_Blow = 356; +Global Const $SKILLID_Counter_Blow = 357; +Global Const $SKILLID_Backbreaker = 358; +Global Const $SKILLID_Heavy_Blow = 359; +Global Const $SKILLID_Staggering_Blow = 360; +Global Const $SKILLID_Dolyak_Signet = 361; +Global Const $SKILLID_Warriors_Cunning = 362; +Global Const $SKILLID_Shield_Bash = 363; +Global Const $SKILLID_Charge = 364; +Global Const $SKILLID_Victory_is_Mine = 365; +Global Const $SKILLID_Fear_Me = 366; +Global Const $SKILLID_Shields_Up = 367; +Global Const $SKILLID_I_Will_Survive = 368; +Global Const $SKILLID_Dont_Believe_Their_Lies = 369; +Global Const $SKILLID_Berserker_Stance = 370; +Global Const $SKILLID_Balanced_Stance = 371; +Global Const $SKILLID_Gladiators_Defense = 372; +Global Const $SKILLID_Deflect_Arrows = 373; +Global Const $SKILLID_Warriors_Endurance = 374; +Global Const $SKILLID_Dwarven_Battle_Stance = 375; +Global Const $SKILLID_Disciplined_Stance = 376; +Global Const $SKILLID_Wary_Stance = 377; +Global Const $SKILLID_Shield_Stance = 378; +Global Const $SKILLID_Bulls_Charge = 379; +Global Const $SKILLID_Bonettis_Defense = 380; +Global Const $SKILLID_Hundred_Blades = 381; +Global Const $SKILLID_Sever_Artery = 382; +Global Const $SKILLID_Galrath_Slash = 383; +Global Const $SKILLID_Gash = 384; +Global Const $SKILLID_Final_Thrust = 385; +Global Const $SKILLID_Seeking_Blade = 386; +Global Const $SKILLID_Riposte = 387; +Global Const $SKILLID_Deadly_Riposte = 388; +Global Const $SKILLID_Flourish = 389; +Global Const $SKILLID_Savage_Slash = 390; +Global Const $SKILLID_Hunters_Shot = 391; +Global Const $SKILLID_Pin_Down = 392; +Global Const $SKILLID_Crippling_Shot = 393; +Global Const $SKILLID_Power_Shot = 394; +Global Const $SKILLID_Barrage = 395; +Global Const $SKILLID_Dual_Shot = 396; +Global Const $SKILLID_Quick_Shot = 397; +Global Const $SKILLID_Penetrating_Attack = 398; +Global Const $SKILLID_Distracting_Shot = 399; +Global Const $SKILLID_Precision_Shot = 400; +Global Const $SKILLID_Splinter_Shot_monster_skill = 401; +Global Const $SKILLID_Determined_Shot = 402; +Global Const $SKILLID_Called_Shot = 403; +Global Const $SKILLID_Poison_Arrow = 404; +Global Const $SKILLID_Oath_Shot = 405; +Global Const $SKILLID_Debilitating_Shot = 406; +Global Const $SKILLID_Point_Blank_Shot = 407; +Global Const $SKILLID_Concussion_Shot = 408; +Global Const $SKILLID_Punishing_Shot = 409; +Global Const $SKILLID_Call_of_Ferocity = 410; +Global Const $SKILLID_Charm_Animal = 411; +Global Const $SKILLID_Call_of_Protection = 412; +Global Const $SKILLID_Call_of_Elemental_Protection = 413; +Global Const $SKILLID_Call_of_Vitality = 414; +Global Const $SKILLID_Call_of_Haste = 415; +Global Const $SKILLID_Call_of_Healing = 416; +Global Const $SKILLID_Call_of_Resilience = 417; +Global Const $SKILLID_Call_of_Feeding = 418; +Global Const $SKILLID_Call_of_the_Hunter = 419; +Global Const $SKILLID_Call_of_Brutality = 420; +Global Const $SKILLID_Call_of_Disruption = 421; +Global Const $SKILLID_Revive_Animal = 422; +Global Const $SKILLID_Symbiotic_Bond = 423; +Global Const $SKILLID_Throw_Dirt = 424; +Global Const $SKILLID_Dodge = 425; +Global Const $SKILLID_Savage_Shot = 426; +Global Const $SKILLID_Antidote_Signet = 427; +Global Const $SKILLID_Incendiary_Arrows = 428; +Global Const $SKILLID_Melandrus_Arrows = 429; +Global Const $SKILLID_Marksmans_Wager = 430; +Global Const $SKILLID_Ignite_Arrows = 431; +Global Const $SKILLID_Read_the_Wind = 432; +Global Const $SKILLID_Kindle_Arrows = 433; +Global Const $SKILLID_Choking_Gas = 434; +Global Const $SKILLID_Apply_Poison = 435; +Global Const $SKILLID_Comfort_Animal = 436; +Global Const $SKILLID_Bestial_Pounce = 437; +Global Const $SKILLID_Maiming_Strike = 438; +Global Const $SKILLID_Feral_Lunge = 439; +Global Const $SKILLID_Scavenger_Strike = 440; +Global Const $SKILLID_Melandrus_Assault = 441; +Global Const $SKILLID_Ferocious_Strike = 442; +Global Const $SKILLID_Predators_Pounce = 443; +Global Const $SKILLID_Brutal_Strike = 444; +Global Const $SKILLID_Disrupting_Lunge = 445; +Global Const $SKILLID_Troll_Unguent = 446; +Global Const $SKILLID_Otyughs_Cry = 447; +Global Const $SKILLID_Escape = 448; +Global Const $SKILLID_Practiced_Stance = 449; +Global Const $SKILLID_Whirling_Defense = 450; +Global Const $SKILLID_Melandrus_Resilience = 451; +Global Const $SKILLID_Dryders_Defenses = 452; +Global Const $SKILLID_Lightning_Reflexes = 453; +Global Const $SKILLID_Tigers_Fury = 454; +Global Const $SKILLID_Storm_Chaser = 455; +Global Const $SKILLID_Serpents_Quickness = 456; +Global Const $SKILLID_Dust_Trap = 457; +Global Const $SKILLID_Barbed_Trap = 458; +Global Const $SKILLID_Flame_Trap = 459; +Global Const $SKILLID_Healing_Spring = 460; +Global Const $SKILLID_Spike_Trap = 461; +Global Const $SKILLID_Winter = 462; +Global Const $SKILLID_Winnowing = 463; +Global Const $SKILLID_Edge_of_Extinction = 464; +Global Const $SKILLID_Greater_Conflagration = 465; +Global Const $SKILLID_Conflagration = 466; +Global Const $SKILLID_Fertile_Season = 467; +Global Const $SKILLID_Symbiosis = 468; +Global Const $SKILLID_Primal_Echoes = 469; +Global Const $SKILLID_Predatory_Season = 470; +Global Const $SKILLID_Frozen_Soil = 471; +Global Const $SKILLID_Favorable_Winds = 472; +Global Const $SKILLID_High_Winds = 473; +Global Const $SKILLID_Energizing_Wind = 474; +Global Const $SKILLID_Quickening_Zephyr = 475; +Global Const $SKILLID_Natures_Renewal = 476; +Global Const $SKILLID_Muddy_Terrain = 477; +Global Const $SKILLID_Bleeding = 478; +Global Const $SKILLID_Blind = 479; +Global Const $SKILLID_Burning = 480; +Global Const $SKILLID_Crippled = 481; +Global Const $SKILLID_Deep_Wound = 482; +Global Const $SKILLID_Disease = 483; +Global Const $SKILLID_Poison = 484; +Global Const $SKILLID_Dazed = 485; +Global Const $SKILLID_Weakness = 486; +Global Const $SKILLID_Cleansed = 487; +Global Const $SKILLID_Eruption_environment = 488; +Global Const $SKILLID_Fire_Storm_environment = 489; +Global Const $SKILLID_Fount_Of_Maguuma = 491; +Global Const $SKILLID_Healing_Fountain = 492; +Global Const $SKILLID_Icy_Ground = 493; +Global Const $SKILLID_Maelstrom_environment = 494; +Global Const $SKILLID_Mursaat_Tower_skill = 495; +Global Const $SKILLID_Quicksand_environment_effect = 496; +Global Const $SKILLID_Curse_of_the_Bloodstone = 497; +Global Const $SKILLID_Chain_Lightning_environment = 498; +Global Const $SKILLID_Obelisk_Lightning = 499; +Global Const $SKILLID_Tar = 500; +Global Const $SKILLID_Siege_Attack = 501; +Global Const $SKILLID_Scepter_of_Orrs_Aura = 503; +Global Const $SKILLID_Scepter_of_Orrs_Power = 504; +Global Const $SKILLID_Burden_Totem = 505; +Global Const $SKILLID_Splinter_Mine_skill = 506; +Global Const $SKILLID_Entanglement = 507; +Global Const $SKILLID_Dwarven_Powder_Keg = 508; +Global Const $SKILLID_Seed_of_Resurrection = 509; +Global Const $SKILLID_Deafening_Roar = 510; +Global Const $SKILLID_Brutal_Mauling = 511; +Global Const $SKILLID_Crippling_Attack = 512; +Global Const $SKILLID_Breaking_Charm = 514; +Global Const $SKILLID_Charr_Buff = 515; +Global Const $SKILLID_Claim_Resource = 516; +Global Const $SKILLID_Dozen_Shot = 524; +Global Const $SKILLID_Nibble = 525; +Global Const $SKILLID_Reflection = 528; +Global Const $SKILLID_Giant_Stomp = 530; +Global Const $SKILLID_Agnars_Rage = 531; +Global Const $SKILLID_Crystal_Haze = 533; +Global Const $SKILLID_Crystal_Bonds = 534; +Global Const $SKILLID_Jagged_Crystal_Skin = 535; +Global Const $SKILLID_Crystal_Hibernation = 536; +Global Const $SKILLID_Hunger_of_the_Lich = 539; +Global Const $SKILLID_Embrace_the_Pain = 540; +Global Const $SKILLID_Life_Vortex = 541; +Global Const $SKILLID_Oracle_Link = 542; +Global Const $SKILLID_Guardian_Pacify = 543; +Global Const $SKILLID_Soul_Vortex = 544; +Global Const $SKILLID_Spectral_Agony = 546; +Global Const $SKILLID_Undead_sensitivity_to_Light = 554; +Global Const $SKILLID_Titans_get_plus_Health_regen_and_set_enemies_on_fire_each_time_he_is_hit = 558; +Global Const $SKILLID_Resurrect_Resurrect_Gargoyle = 560; +Global Const $SKILLID_Wurm_Siege = 563; +Global Const $SKILLID_Shiver_Touch = 566; +Global Const $SKILLID_Spontaneous_Combustion = 567; +Global Const $SKILLID_Vanish = 568; +Global Const $SKILLID_Victory_or_Death = 569; +Global Const $SKILLID_Mark_of_Insecurity = 570; +Global Const $SKILLID_Disrupting_Dagger = 571; +Global Const $SKILLID_Deadly_Paradox = 572; +Global Const $SKILLID_Holy_Blessing = 575; +Global Const $SKILLID_Statues_Blessing = 576; +Global Const $SKILLID_Domain_of_Energy_Draining = 580; +Global Const $SKILLID_Domain_of_Health_Draining = 582; +Global Const $SKILLID_Domain_of_Slow = 583; +Global Const $SKILLID_Divine_Fire = 584; +Global Const $SKILLID_Swamp_Water = 585; +Global Const $SKILLID_Janthirs_Gaze = 586; +Global Const $SKILLID_Stormcaller_skill = 589; +Global Const $SKILLID_Knock = 590; +Global Const $SKILLID_Blessing_of_the_Kurzicks = 593; +Global Const $SKILLID_Chimera_of_Intensity = 596; +Global Const $SKILLID_Life_Stealing_effect = 657; +Global Const $SKILLID_Jaundiced_Gaze = 763; +Global Const $SKILLID_Wail_of_Doom = 764; +Global Const $SKILLID_Heros_Insight = 765; +Global Const $SKILLID_Gaze_of_Contempt = 766; +Global Const $SKILLID_Berserkers_Insight = 767; +Global Const $SKILLID_Slayers_Insight = 768; +Global Const $SKILLID_Vipers_Defense = 769; +Global Const $SKILLID_Return = 770; +Global Const $SKILLID_Aura_of_Displacement = 771; +Global Const $SKILLID_Generous_Was_Tsungrai = 772; +Global Const $SKILLID_Mighty_Was_Vorizun = 773; +Global Const $SKILLID_To_the_Death = 774; +Global Const $SKILLID_Death_Blossom = 775; +Global Const $SKILLID_Twisting_Fangs = 776; +Global Const $SKILLID_Horns_of_the_Ox = 777; +Global Const $SKILLID_Falling_Spider = 778; +Global Const $SKILLID_Black_Lotus_Strike = 779; +Global Const $SKILLID_Fox_Fangs = 780; +Global Const $SKILLID_Moebius_Strike = 781; +Global Const $SKILLID_Jagged_Strike = 782; +Global Const $SKILLID_Unsuspecting_Strike = 783; +Global Const $SKILLID_Entangling_Asp = 784; +Global Const $SKILLID_Mark_of_Death = 785; +Global Const $SKILLID_Iron_Palm = 786; +Global Const $SKILLID_Resilient_Weapon = 787; +Global Const $SKILLID_Blind_Was_Mingson = 788; +Global Const $SKILLID_Grasping_Was_Kuurong = 789; +Global Const $SKILLID_Vengeful_Was_Khanhei = 790; +Global Const $SKILLID_Flesh_of_My_Flesh = 791; +Global Const $SKILLID_Splinter_Weapon = 792; +Global Const $SKILLID_Weapon_of_Warding = 793; +Global Const $SKILLID_Wailing_Weapon = 794; +Global Const $SKILLID_Nightmare_Weapon = 795; +Global Const $SKILLID_Sorrows_Flame = 796; +Global Const $SKILLID_Sorrows_Fist = 797; +Global Const $SKILLID_Blast_Furnace = 798; +Global Const $SKILLID_Beguiling_Haze = 799; +Global Const $SKILLID_Enduring_Toxin = 800; +Global Const $SKILLID_Shroud_of_Silence = 801; +Global Const $SKILLID_Expose_Defenses = 802; +Global Const $SKILLID_Power_Leech = 803; +Global Const $SKILLID_Arcane_Languor = 804; +Global Const $SKILLID_Animate_Vampiric_Horror = 805; +Global Const $SKILLID_Cultists_Fervor = 806; +Global Const $SKILLID_Reapers_Mark = 808; +Global Const $SKILLID_Shatterstone = 809; +Global Const $SKILLID_Protectors_Defense = 810; +Global Const $SKILLID_Run_as_One = 811; +Global Const $SKILLID_Defiant_Was_Xinrae = 812; +Global Const $SKILLID_Lyssas_Aura = 813; +Global Const $SKILLID_Shadow_Refuge = 814; +Global Const $SKILLID_Scorpion_Wire = 815; +Global Const $SKILLID_Mirrored_Stance = 816; +Global Const $SKILLID_Discord = 817; +Global Const $SKILLID_Well_of_Weariness = 818; +Global Const $SKILLID_Vampiric_Spirit = 819; +Global Const $SKILLID_Depravity = 820; +Global Const $SKILLID_Icy_Veins = 821; +Global Const $SKILLID_Weaken_Knees = 822; +Global Const $SKILLID_Burning_Speed = 823; +Global Const $SKILLID_Lava_Arrows = 824; +Global Const $SKILLID_Bed_of_Coals = 825; +Global Const $SKILLID_Shadow_Form = 826; +Global Const $SKILLID_Siphon_Strength = 827; +Global Const $SKILLID_Vile_Miasma = 828; +Global Const $SKILLID_Ray_of_Judgment = 830; +Global Const $SKILLID_Primal_Rage = 831; +Global Const $SKILLID_Animate_Flesh_Golem = 832; +Global Const $SKILLID_Reckless_Haste = 834; +Global Const $SKILLID_Blood_Bond = 835; +Global Const $SKILLID_Ride_the_Lightning = 836; +Global Const $SKILLID_Energy_Boon = 837; +Global Const $SKILLID_Dwaynas_Sorrow = 838; +Global Const $SKILLID_Retreat = 839; +Global Const $SKILLID_Poisoned_Heart = 840; +Global Const $SKILLID_Fetid_Ground = 841; +Global Const $SKILLID_Arc_Lightning = 842; +Global Const $SKILLID_Gust = 843; +Global Const $SKILLID_Churning_Earth = 844; +Global Const $SKILLID_Liquid_Flame = 845; +Global Const $SKILLID_Steam = 846; +Global Const $SKILLID_Boon_Signet = 847; +Global Const $SKILLID_Reverse_Hex = 848; +Global Const $SKILLID_Lacerating_Chop = 849; +Global Const $SKILLID_Fierce_Blow = 850; +Global Const $SKILLID_Sun_and_Moon_Slash = 851; +Global Const $SKILLID_Splinter_Shot = 852; +Global Const $SKILLID_Melandrus_Shot = 853; +Global Const $SKILLID_Snare = 854; +Global Const $SKILLID_Kilroy_Stonekin = 856; +Global Const $SKILLID_Adventurers_Insight = 857; +Global Const $SKILLID_Dancing_Daggers = 858; +Global Const $SKILLID_Conjure_Nightmare = 859; +Global Const $SKILLID_Signet_of_Disruption = 860; +Global Const $SKILLID_Ravenous_Gaze = 862; +Global Const $SKILLID_Order_of_Apostasy = 863; +Global Const $SKILLID_Oppressive_Gaze = 864; +Global Const $SKILLID_Lightning_Hammer = 865; +Global Const $SKILLID_Vapor_Blade = 866; +Global Const $SKILLID_Healing_Light = 867; +Global Const $SKILLID_Coward = 869; +Global Const $SKILLID_Pestilence = 870; +Global Const $SKILLID_Shadowsong = 871; +Global Const $SKILLID_Shadowsong_attack = 872; +Global Const $SKILLID_Resurrect_monster_skill = 873; +Global Const $SKILLID_Consuming_Flames = 874; +Global Const $SKILLID_Chains_of_Enslavement = 875; +Global Const $SKILLID_Signet_of_Shadows = 876; +Global Const $SKILLID_Lyssas_Balance = 877; +Global Const $SKILLID_Visions_of_Regret = 878; +Global Const $SKILLID_Illusion_of_Pain = 879; +Global Const $SKILLID_Stolen_Speed = 880; +Global Const $SKILLID_Ether_Signet = 881; +Global Const $SKILLID_Signet_of_Disenchantment = 882; +Global Const $SKILLID_Vocal_Minority = 883; +Global Const $SKILLID_Searing_Flames = 884; +Global Const $SKILLID_Shield_Guardian = 885; +Global Const $SKILLID_Restful_Breeze = 886; +Global Const $SKILLID_Signet_of_Rejuvenation = 887; +Global Const $SKILLID_Whirling_Axe = 888; +Global Const $SKILLID_Forceful_Blow = 889; +Global Const $SKILLID_None_Shall_Pass = 891; +Global Const $SKILLID_Quivering_Blade = 892; +Global Const $SKILLID_Seeking_Arrows = 893; +Global Const $SKILLID_Rampagers_Insight = 894; +Global Const $SKILLID_Hunters_Insight = 895; +Global Const $SKILLID_Oath_of_Healing = 897; +Global Const $SKILLID_Overload = 898; +Global Const $SKILLID_Images_of_Remorse = 899; +Global Const $SKILLID_Shared_Burden = 900; +Global Const $SKILLID_Soul_Bind = 901; +Global Const $SKILLID_Blood_of_the_Aggressor = 902; +Global Const $SKILLID_Icy_Prism = 903; +Global Const $SKILLID_Furious_Axe = 904; +Global Const $SKILLID_Auspicious_Blow = 905; +Global Const $SKILLID_On_Your_Knees = 906; +Global Const $SKILLID_Dragon_Slash = 907; +Global Const $SKILLID_Marauders_Shot = 908; +Global Const $SKILLID_Focused_Shot = 909; +Global Const $SKILLID_Spirit_Rift = 910; +Global Const $SKILLID_Union = 911; +Global Const $SKILLID_Tranquil_Was_Tanasen = 913; +Global Const $SKILLID_Consume_Soul = 914; +Global Const $SKILLID_Spirit_Light = 915; +Global Const $SKILLID_Lamentation = 916; +Global Const $SKILLID_Rupture_Soul = 917; +Global Const $SKILLID_Spirit_to_Flesh = 918; +Global Const $SKILLID_Spirit_Burn = 919; +Global Const $SKILLID_Destruction = 920; +Global Const $SKILLID_Dissonance = 921; +Global Const $SKILLID_Dissonance_attack = 922; +Global Const $SKILLID_Disenchantment = 923; +Global Const $SKILLID_Disenchantment_attack = 924; +Global Const $SKILLID_Recall = 925; +Global Const $SKILLID_Sharpen_Daggers = 926; +Global Const $SKILLID_Shameful_Fear = 927; +Global Const $SKILLID_Shadow_Shroud = 928; +Global Const $SKILLID_Shadow_of_Haste = 929; +Global Const $SKILLID_Auspicious_Incantation = 930; +Global Const $SKILLID_Power_Return = 931; +Global Const $SKILLID_Complicate = 932; +Global Const $SKILLID_Shatter_Storm = 933; +Global Const $SKILLID_Unnatural_Signet = 934; +Global Const $SKILLID_Rising_Bile = 935; +Global Const $SKILLID_Envenom_Enchantments = 936; +Global Const $SKILLID_Shockwave = 937; +Global Const $SKILLID_Ward_of_Stability = 938; +Global Const $SKILLID_Icy_Shackles = 939; +Global Const $SKILLID_Blessed_Light = 941; +Global Const $SKILLID_Withdraw_Hexes = 942; +Global Const $SKILLID_Extinguish = 943; +Global Const $SKILLID_Signet_of_Strength = 944; +Global Const $SKILLID_Trappers_Focus = 946; +Global Const $SKILLID_Brambles = 947; +Global Const $SKILLID_Desperate_Strike = 948; +Global Const $SKILLID_Way_of_the_Fox = 949; +Global Const $SKILLID_Shadowy_Burden = 950; +Global Const $SKILLID_Siphon_Speed = 951; +Global Const $SKILLID_Deaths_Charge = 952; +Global Const $SKILLID_Power_Flux = 953; +Global Const $SKILLID_Expel_Hexes = 954; +Global Const $SKILLID_Rip_Enchantment = 955; +Global Const $SKILLID_Spell_Shield = 957; +Global Const $SKILLID_Healing_Whisper = 958; +Global Const $SKILLID_Ethereal_Light = 959; +Global Const $SKILLID_Release_Enchantments = 960; +Global Const $SKILLID_Lacerate = 961; +Global Const $SKILLID_Spirit_Transfer = 962; +Global Const $SKILLID_Restoration = 963; +Global Const $SKILLID_Vengeful_Weapon = 964; +Global Const $SKILLID_Spear_of_Archemorus = 966; +Global Const $SKILLID_Argos_Cry = 971; +Global Const $SKILLID_Jade_Fury = 972; +Global Const $SKILLID_Blinding_Powder = 973; +Global Const $SKILLID_Mantis_Touch = 974; +Global Const $SKILLID_Exhausting_Assault = 975; +Global Const $SKILLID_Repeating_Strike = 976; +Global Const $SKILLID_Way_of_the_Lotus = 977; +Global Const $SKILLID_Mark_of_Instability = 978; +Global Const $SKILLID_Mistrust = 979; +Global Const $SKILLID_Feast_of_Souls = 980; +Global Const $SKILLID_Recuperation = 981; +Global Const $SKILLID_Shelter = 982; +Global Const $SKILLID_Weapon_of_Shadow = 983; +Global Const $SKILLID_Torch_Enchantment = 984; +Global Const $SKILLID_Caltrops = 985; +Global Const $SKILLID_Nine_Tail_Strike = 986; +Global Const $SKILLID_Way_of_the_Empty_Palm = 987; +Global Const $SKILLID_Temple_Strike = 988; +Global Const $SKILLID_Golden_Phoenix_Strike = 989; +Global Const $SKILLID_Expunge_Enchantments = 990; +Global Const $SKILLID_Deny_Hexes = 991; +Global Const $SKILLID_Triple_Chop = 992; +Global Const $SKILLID_Enraged_Smash = 993; +Global Const $SKILLID_Renewing_Smash = 994; +Global Const $SKILLID_Tiger_Stance = 995; +Global Const $SKILLID_Standing_Slash = 996; +Global Const $SKILLID_Famine = 997; +Global Const $SKILLID_Torch_Hex = 998; +Global Const $SKILLID_Torch_Degeneration_Hex = 999; +Global Const $SKILLID_Blinding_Snow = 1000; +Global Const $SKILLID_Avalanche_skill = 1001; +Global Const $SKILLID_Snowball = 1002; +Global Const $SKILLID_Mega_Snowball = 1003; +Global Const $SKILLID_Yuletide = 1004; +Global Const $SKILLID_Ice_Fort = 1006; +Global Const $SKILLID_Yellow_Snow = 1007; +Global Const $SKILLID_Hidden_Rock = 1008; +Global Const $SKILLID_Snow_Down_the_Shirt = 1009; +Global Const $SKILLID_Mmmm_Snowcone = 1010; +Global Const $SKILLID_Holiday_Blues = 1011; +Global Const $SKILLID_Icicles = 1012; +Global Const $SKILLID_Ice_Breaker = 1013; +Global Const $SKILLID_Lets_Get_Em = 1014; +Global Const $SKILLID_Flurry_of_Ice = 1015; +Global Const $SKILLID_Critical_Eye = 1018; +Global Const $SKILLID_Critical_Strike = 1019; +Global Const $SKILLID_Blades_of_Steel = 1020; +Global Const $SKILLID_Jungle_Strike = 1021; +Global Const $SKILLID_Wild_Strike = 1022; +Global Const $SKILLID_Leaping_Mantis_Sting = 1023; +Global Const $SKILLID_Black_Mantis_Thrust = 1024; +Global Const $SKILLID_Disrupting_Stab = 1025; +Global Const $SKILLID_Golden_Lotus_Strike = 1026; +Global Const $SKILLID_Critical_Defenses = 1027; +Global Const $SKILLID_Way_of_Perfection = 1028; +Global Const $SKILLID_Dark_Apostasy = 1029; +Global Const $SKILLID_Locusts_Fury = 1030; +Global Const $SKILLID_Shroud_of_Distress = 1031; +Global Const $SKILLID_Heart_of_Shadow = 1032; +Global Const $SKILLID_Impale = 1033; +Global Const $SKILLID_Seeping_Wound = 1034; +Global Const $SKILLID_Assassins_Promise = 1035; +Global Const $SKILLID_Signet_of_Malice = 1036; +Global Const $SKILLID_Dark_Escape = 1037; +Global Const $SKILLID_Crippling_Dagger = 1038; +Global Const $SKILLID_Star_Strike = 1039; +Global Const $SKILLID_Spirit_Walk = 1040; +Global Const $SKILLID_Unseen_Fury = 1041; +Global Const $SKILLID_Flashing_Blades = 1042; +Global Const $SKILLID_Dash = 1043; +Global Const $SKILLID_Dark_Prison = 1044; +Global Const $SKILLID_Palm_Strike = 1045; +Global Const $SKILLID_Assassin_of_Lyssa = 1046; +Global Const $SKILLID_Mesmer_of_Lyssa = 1047; +Global Const $SKILLID_Revealed_Enchantment = 1048; +Global Const $SKILLID_Revealed_Hex = 1049; +Global Const $SKILLID_Disciple_of_Energy = 1050; +Global Const $SKILLID_Accumulated_Pain = 1052; +Global Const $SKILLID_Psychic_Distraction = 1053; +Global Const $SKILLID_Ancestors_Visage = 1054; +Global Const $SKILLID_Recurring_Insecurity = 1055; +Global Const $SKILLID_Kitahs_Burden = 1056; +Global Const $SKILLID_Psychic_Instability = 1057; +Global Const $SKILLID_Chaotic_Power = 1058; +Global Const $SKILLID_Hex_Eater_Signet = 1059; +Global Const $SKILLID_Celestial_Haste = 1060; +Global Const $SKILLID_Feedback = 1061; +Global Const $SKILLID_Arcane_Larceny = 1062; +Global Const $SKILLID_Chaotic_Ward = 1063; +Global Const $SKILLID_Favor_of_the_Gods = 1064; +Global Const $SKILLID_Dark_Aura_blessing = 1065; +Global Const $SKILLID_Spoil_Victor = 1066; +Global Const $SKILLID_Lifebane_Strike = 1067; +Global Const $SKILLID_Bitter_Chill = 1068; +Global Const $SKILLID_Taste_of_Pain = 1069; +Global Const $SKILLID_Defile_Enchantments = 1070; +Global Const $SKILLID_Shivers_of_Dread = 1071; +Global Const $SKILLID_Star_Servant = 1072; +Global Const $SKILLID_Necromancer_of_Grenth = 1073; +Global Const $SKILLID_Ritualist_of_Grenth = 1074; +Global Const $SKILLID_Vampiric_Swarm = 1075; +Global Const $SKILLID_Blood_Drinker = 1076; +Global Const $SKILLID_Vampiric_Bite = 1077; +Global Const $SKILLID_Wallows_Bite = 1078; +Global Const $SKILLID_Enfeebling_Touch = 1079; +Global Const $SKILLID_Disciple_of_Ice = 1080; +Global Const $SKILLID_Teinais_Wind = 1081; +Global Const $SKILLID_Shock_Arrow = 1082; +Global Const $SKILLID_Unsteady_Ground = 1083; +Global Const $SKILLID_Sliver_Armor = 1084; +Global Const $SKILLID_Ash_Blast = 1085; +Global Const $SKILLID_Dragons_Stomp = 1086; +Global Const $SKILLID_Unnatural_Resistance = 1087; +Global Const $SKILLID_Second_Wind = 1088; +Global Const $SKILLID_Cloak_of_Faith = 1089; +Global Const $SKILLID_Smoldering_Embers = 1090; +Global Const $SKILLID_Double_Dragon = 1091; +Global Const $SKILLID_Disciple_of_the_Air = 1092; +Global Const $SKILLID_Teinais_Heat = 1093; +Global Const $SKILLID_Breath_of_Fire = 1094; +Global Const $SKILLID_Star_Burst = 1095; +Global Const $SKILLID_Glyph_of_Essence = 1096; +Global Const $SKILLID_Teinais_Prison = 1097; +Global Const $SKILLID_Mirror_of_Ice = 1098; +Global Const $SKILLID_Teinais_Crystals = 1099; +Global Const $SKILLID_Celestial_Storm = 1100; +Global Const $SKILLID_Monk_of_Dwayna = 1101; +Global Const $SKILLID_Aura_of_the_Grove = 1102; +Global Const $SKILLID_Cathedral_Collapse = 1103; +Global Const $SKILLID_Miasma = 1104; +Global Const $SKILLID_Acid_Trap = 1105; +Global Const $SKILLID_Shield_of_Saint_Viktor = 1106; +Global Const $SKILLID_Urn_of_Saint_Viktor = 1107; +Global Const $SKILLID_Aura_of_Light = 1112; +Global Const $SKILLID_Kirins_Wrath = 1113; +Global Const $SKILLID_Spirit_Bond = 1114; +Global Const $SKILLID_Air_of_Enchantment = 1115; +Global Const $SKILLID_Warriors_Might = 1116; +Global Const $SKILLID_Heavens_Delight = 1117; +Global Const $SKILLID_Healing_Burst = 1118; +Global Const $SKILLID_Kareis_Healing_Circle = 1119; +Global Const $SKILLID_Jameis_Gaze = 1120; +Global Const $SKILLID_Gift_of_Health = 1121; +Global Const $SKILLID_Battle_Fervor = 1122; +Global Const $SKILLID_Life_Sheath = 1123; +Global Const $SKILLID_Star_Shine = 1124; +Global Const $SKILLID_Disciple_of_Fire = 1125; +Global Const $SKILLID_Empathic_Removal = 1126; +Global Const $SKILLID_Warrior_of_Balthazar = 1127; +Global Const $SKILLID_Resurrection_Chant = 1128; +Global Const $SKILLID_Word_of_Censure = 1129; +Global Const $SKILLID_Spear_of_Light = 1130; +Global Const $SKILLID_Stonesoul_Strike = 1131; +Global Const $SKILLID_Shielding_Branches = 1132; +Global Const $SKILLID_Drunken_Blow = 1133; +Global Const $SKILLID_Leviathans_Sweep = 1134; +Global Const $SKILLID_Jaizhenju_Strike = 1135; +Global Const $SKILLID_Penetrating_Chop = 1136; +Global Const $SKILLID_Yeti_Smash = 1137; +Global Const $SKILLID_Disciple_of_the_Earth = 1138; +Global Const $SKILLID_Ranger_of_Melandru = 1139; +Global Const $SKILLID_Storm_of_Swords = 1140; +Global Const $SKILLID_You_Will_Die = 1141; +Global Const $SKILLID_Auspicious_Parry = 1142; +Global Const $SKILLID_Strength_of_the_Oak = 1143; +Global Const $SKILLID_Silverwing_Slash = 1144; +Global Const $SKILLID_Destroy_Enchantment = 1145; +Global Const $SKILLID_Shove = 1146; +Global Const $SKILLID_Base_Defense = 1147; +Global Const $SKILLID_Carrier_Defense = 1148; +Global Const $SKILLID_The_Chalice_of_Corruption = 1149; +Global Const $SKILLID_Song_of_the_Mists = 1151; +Global Const $SKILLID_Demonic_Agility = 1152; +Global Const $SKILLID_Blessing_of_the_Kirin = 1153; +Global Const $SKILLID_Juggernaut_Toss = 1155; +Global Const $SKILLID_Aura_of_the_Juggernaut = 1156; +Global Const $SKILLID_Star_Shards = 1157; +Global Const $SKILLID_Turtle_Shell = 1172; +Global Const $SKILLID_Blood_of_zu_Heltzer = 1175; +Global Const $SKILLID_Afflicted_Soul_Explosion = 1176; +Global Const $SKILLID_Dark_Chain_Lightning = 1179; +Global Const $SKILLID_Corrupted_Breath = 1181; +Global Const $SKILLID_Renewing_Corruption = 1182; +Global Const $SKILLID_Corrupted_Dragon_Spores = 1183; +Global Const $SKILLID_Corrupted_Dragon_Scales = 1184; +Global Const $SKILLID_Construct_Possession = 1185; +Global Const $SKILLID_Siege_Turtle_Attack = 1186; +Global Const $SKILLID_Of_Royal_Blood = 1189; +Global Const $SKILLID_Passage_to_Tahnnakai = 1190; +Global Const $SKILLID_Sundering_Attack = 1191; +Global Const $SKILLID_Zojuns_Shot = 1192; +Global Const $SKILLID_Predatory_Bond = 1194; +Global Const $SKILLID_Heal_as_One = 1195; +Global Const $SKILLID_Zojuns_Haste = 1196; +Global Const $SKILLID_Needling_Shot = 1197; +Global Const $SKILLID_Broad_Head_Arrow = 1198; +Global Const $SKILLID_Glass_Arrows = 1199; +Global Const $SKILLID_Archers_Signet = 1200; +Global Const $SKILLID_Savage_Pounce = 1201; +Global Const $SKILLID_Enraged_Lunge = 1202; +Global Const $SKILLID_Bestial_Mauling = 1203; +Global Const $SKILLID_Energy_Drain_effect = 1204; +Global Const $SKILLID_Poisonous_Bite = 1205; +Global Const $SKILLID_Pounce = 1206; +Global Const $SKILLID_Celestial_Stance = 1207; +Global Const $SKILLID_Sheer_Exhaustion = 1208; +Global Const $SKILLID_Bestial_Fury = 1209; +Global Const $SKILLID_Life_Drain = 1210; +Global Const $SKILLID_Vipers_Nest = 1211; +Global Const $SKILLID_Equinox = 1212; +Global Const $SKILLID_Tranquility = 1213; +Global Const $SKILLID_Clamor_of_Souls = 1215; +Global Const $SKILLID_Ritual_Lord = 1217; +Global Const $SKILLID_Cruel_Was_Daoshen = 1218; +Global Const $SKILLID_Protective_Was_Kaolai = 1219; +Global Const $SKILLID_Attuned_Was_Songkai = 1220; +Global Const $SKILLID_Resilient_Was_Xiko = 1221; +Global Const $SKILLID_Lively_Was_Naomei = 1222; +Global Const $SKILLID_Anguished_Was_Lingwah = 1223; +Global Const $SKILLID_Draw_Spirit = 1224; +Global Const $SKILLID_Channeled_Strike = 1225; +Global Const $SKILLID_Spirit_Boon_Strike = 1226; +Global Const $SKILLID_Essence_Strike = 1227; +Global Const $SKILLID_Spirit_Siphon = 1228; +Global Const $SKILLID_Explosive_Growth = 1229; +Global Const $SKILLID_Boon_of_Creation = 1230; +Global Const $SKILLID_Spirit_Channeling = 1231; +Global Const $SKILLID_Armor_of_Unfeeling = 1232; +Global Const $SKILLID_Soothing_Memories = 1233; +Global Const $SKILLID_Mend_Body_and_Soul = 1234; +Global Const $SKILLID_Dulled_Weapon = 1235; +Global Const $SKILLID_Binding_Chains = 1236; +Global Const $SKILLID_Painful_Bond = 1237; +Global Const $SKILLID_Signet_of_Creation = 1238; +Global Const $SKILLID_Signet_of_Spirits = 1239; +Global Const $SKILLID_Soul_Twisting = 1240; +Global Const $SKILLID_Celestial_Summoning = 1241; +Global Const $SKILLID_Ghostly_Haste = 1244; +Global Const $SKILLID_Gaze_from_Beyond = 1245; +Global Const $SKILLID_Ancestors_Rage = 1246; +Global Const $SKILLID_Pain = 1247; +Global Const $SKILLID_Pain_attack = 1248; +Global Const $SKILLID_Displacement = 1249; +Global Const $SKILLID_Preservation = 1250; +Global Const $SKILLID_Life = 1251; +Global Const $SKILLID_Earthbind = 1252; +Global Const $SKILLID_Bloodsong = 1253; +Global Const $SKILLID_Bloodsong_attack = 1254; +Global Const $SKILLID_Wanderlust = 1255; +Global Const $SKILLID_Wanderlust_attack = 1256; +Global Const $SKILLID_Spirit_Light_Weapon = 1257; +Global Const $SKILLID_Brutal_Weapon = 1258; +Global Const $SKILLID_Guided_Weapon = 1259; +Global Const $SKILLID_Meekness = 1260; +Global Const $SKILLID_Frigid_Armor = 1261; +Global Const $SKILLID_Healing_Ring = 1262; +Global Const $SKILLID_Renew_Life = 1263; +Global Const $SKILLID_Doom = 1264; +Global Const $SKILLID_Wielders_Boon = 1265; +Global Const $SKILLID_Soothing = 1266; +Global Const $SKILLID_Vital_Weapon = 1267; +Global Const $SKILLID_Weapon_of_Quickening = 1268; +Global Const $SKILLID_Signet_of_Rage = 1269; +Global Const $SKILLID_Fingers_of_Chaos = 1270; +Global Const $SKILLID_Echoing_Banishment = 1271; +Global Const $SKILLID_Suicidal_Impulse = 1272; +Global Const $SKILLID_Impossible_Odds = 1273; +Global Const $SKILLID_Battle_Scars = 1274; +Global Const $SKILLID_Riposting_Shadows = 1275; +Global Const $SKILLID_Meditation_of_the_Reaper = 1276; +Global Const $SKILLID_Blessed_Water = 1280; +Global Const $SKILLID_Defiled_Water = 1281; +Global Const $SKILLID_Stone_Spores = 1282; +Global Const $SKILLID_Haiju_Lagoon_Water = 1287; +Global Const $SKILLID_Aspect_of_Exhaustion = 1288; +Global Const $SKILLID_Aspect_of_Exposure = 1289; +Global Const $SKILLID_Aspect_of_Surrender = 1290; +Global Const $SKILLID_Aspect_of_Death = 1291; +Global Const $SKILLID_Aspect_of_Soothing = 1292; +Global Const $SKILLID_Aspect_of_Pain = 1293; +Global Const $SKILLID_Aspect_of_Lethargy = 1294; +Global Const $SKILLID_Aspect_of_Depletion_energy_loss = 1295; +Global Const $SKILLID_Aspect_of_Failure = 1296; +Global Const $SKILLID_Aspect_of_Shadows = 1297; +Global Const $SKILLID_Scorpion_Aspect = 1298; +Global Const $SKILLID_Aspect_of_Fear = 1299; +Global Const $SKILLID_Aspect_of_Depletion_energy_depletion_damage = 1300; +Global Const $SKILLID_Aspect_of_Decay = 1301; +Global Const $SKILLID_Aspect_of_Torment = 1302; +Global Const $SKILLID_Nightmare_Aspect = 1303; +Global Const $SKILLID_Spiked_Coral = 1304; +Global Const $SKILLID_Shielding_Urn = 1305; +Global Const $SKILLID_Extensive_Plague_Exposure = 1306; +Global Const $SKILLID_Forests_Binding = 1307; +Global Const $SKILLID_Exploding_Spores = 1308; +Global Const $SKILLID_Suicide_Energy = 1309; +Global Const $SKILLID_Suicide_Health = 1310; +Global Const $SKILLID_Nightmare_Refuge = 1311; +Global Const $SKILLID_Rage_of_the_Sea = 1315; +Global Const $SKILLID_Sugar_Rush = 1323; +Global Const $SKILLID_Torment_Slash = 1324; +Global Const $SKILLID_Spirit_of_the_Festival = 1325; +Global Const $SKILLID_Trade_Winds = 1326; +Global Const $SKILLID_Dragon_Blast = 1327; +Global Const $SKILLID_Imperial_Majesty = 1328; +Global Const $SKILLID_Extend_Conditions = 1333; +Global Const $SKILLID_Hypochondria = 1334; +Global Const $SKILLID_Wastrels_Demise = 1335; +Global Const $SKILLID_Spiritual_Pain = 1336; +Global Const $SKILLID_Drain_Delusions = 1337; +Global Const $SKILLID_Persistence_of_Memory = 1338; +Global Const $SKILLID_Symbols_of_Inspiration = 1339; +Global Const $SKILLID_Symbolic_Celerity = 1340; +Global Const $SKILLID_Frustration = 1341; +Global Const $SKILLID_Tease = 1342; +Global Const $SKILLID_Ether_Phantom = 1343; +Global Const $SKILLID_Web_of_Disruption = 1344; +Global Const $SKILLID_Enchanters_Conundrum = 1345; +Global Const $SKILLID_Signet_of_Illusions = 1346; +Global Const $SKILLID_Discharge_Enchantment = 1347; +Global Const $SKILLID_Hex_Eater_Vortex = 1348; +Global Const $SKILLID_Mirror_of_Disenchantment = 1349; +Global Const $SKILLID_Simple_Thievery = 1350; +Global Const $SKILLID_Animate_Shambling_Horror = 1351; +Global Const $SKILLID_Order_of_Undeath = 1352; +Global Const $SKILLID_Putrid_Flesh = 1353; +Global Const $SKILLID_Feast_for_the_Dead = 1354; +Global Const $SKILLID_Jagged_Bones = 1355; +Global Const $SKILLID_Contagion = 1356; +Global Const $SKILLID_Ulcerous_Lungs = 1358; +Global Const $SKILLID_Pain_of_Disenchantment = 1359; +Global Const $SKILLID_Mark_of_Fury = 1360; +Global Const $SKILLID_Corrupt_Enchantment = 1362; +Global Const $SKILLID_Signet_of_Sorrow = 1363; +Global Const $SKILLID_Signet_of_Suffering = 1364; +Global Const $SKILLID_Signet_of_Lost_Souls = 1365; +Global Const $SKILLID_Well_of_Darkness = 1366; +Global Const $SKILLID_Blinding_Surge = 1367; +Global Const $SKILLID_Chilling_Winds = 1368; +Global Const $SKILLID_Lightning_Bolt = 1369; +Global Const $SKILLID_Storm_Djinns_Haste = 1370; +Global Const $SKILLID_Stone_Striker = 1371; +Global Const $SKILLID_Sandstorm = 1372; +Global Const $SKILLID_Stone_Sheath = 1373; +Global Const $SKILLID_Ebon_Hawk = 1374; +Global Const $SKILLID_Stoneflesh_Aura = 1375; +Global Const $SKILLID_Glyph_of_Restoration = 1376; +Global Const $SKILLID_Ether_Prism = 1377; +Global Const $SKILLID_Master_of_Magic = 1378; +Global Const $SKILLID_Glowing_Gaze = 1379; +Global Const $SKILLID_Savannah_Heat = 1380; +Global Const $SKILLID_Flame_Djinns_Haste = 1381; +Global Const $SKILLID_Freezing_Gust = 1382; +Global Const $SKILLID_Sulfurous_Haze = 1384; +Global Const $SKILLID_Sentry_Trap_skill = 1386; +Global Const $SKILLID_Judges_Intervention = 1390; +Global Const $SKILLID_Supportive_Spirit = 1391; +Global Const $SKILLID_Watchful_Healing = 1392; +Global Const $SKILLID_Healers_Boon = 1393; +Global Const $SKILLID_Healers_Covenant = 1394; +Global Const $SKILLID_Balthazars_Pendulum = 1395; +Global Const $SKILLID_Words_of_Comfort = 1396; +Global Const $SKILLID_Light_of_Deliverance = 1397; +Global Const $SKILLID_Scourge_Enchantment = 1398; +Global Const $SKILLID_Shield_of_Absorption = 1399; +Global Const $SKILLID_Reversal_of_Damage = 1400; +Global Const $SKILLID_Mending_Touch = 1401; +Global Const $SKILLID_Critical_Chop = 1402; +Global Const $SKILLID_Agonizing_Chop = 1403; +Global Const $SKILLID_Flail = 1404; +Global Const $SKILLID_Charging_Strike = 1405; +Global Const $SKILLID_Headbutt = 1406; +Global Const $SKILLID_Lions_Comfort = 1407; +Global Const $SKILLID_Rage_of_the_Ntouka = 1408; +Global Const $SKILLID_Mokele_Smash = 1409; +Global Const $SKILLID_Overbearing_Smash = 1410; +Global Const $SKILLID_Signet_of_Stamina = 1411; +Global Const $SKILLID_Youre_All_Alone = 1412; +Global Const $SKILLID_Burst_of_Aggression = 1413; +Global Const $SKILLID_Enraging_Charge = 1414; +Global Const $SKILLID_Crippling_Slash = 1415; +Global Const $SKILLID_Barbarous_Slice = 1416; +Global Const $SKILLID_Vial_of_Purified_Water = 1417; +Global Const $SKILLID_Disarm_Trap = 1418; +Global Const $SKILLID_Feeding_Frenzy_skill = 1419; +Global Const $SKILLID_Quake_Of_Ahdashim = 1420; +Global Const $SKILLID_Create_Light_of_Seborhin = 1422; +Global Const $SKILLID_Unlock_Cell = 1423; +Global Const $SKILLID_Wave_of_Torment = 1430; +Global Const $SKILLID_Corsairs_Net = 1433; +Global Const $SKILLID_Corrupted_Healing = 1434; +Global Const $SKILLID_Corrupted_Strength = 1436; +Global Const $SKILLID_Desert_Wurm_disguise = 1437; +Global Const $SKILLID_Junundu_Feast = 1438; +Global Const $SKILLID_Junundu_Strike = 1439; +Global Const $SKILLID_Junundu_Smash = 1440; +Global Const $SKILLID_Junundu_Siege = 1441; +Global Const $SKILLID_Junundu_Tunnel = 1442; +Global Const $SKILLID_Leave_Junundu = 1443; +Global Const $SKILLID_Summon_Torment = 1444; +Global Const $SKILLID_Signal_Flare = 1445; +Global Const $SKILLID_The_Elixir_of_Strength = 1446; +Global Const $SKILLID_Ehzah_from_Above = 1447; +Global Const $SKILLID_Last_Rites_of_Torment = 1449; +Global Const $SKILLID_Abaddons_Conspiracy = 1450; +Global Const $SKILLID_Hungers_Bite = 1451; +Global Const $SKILLID_Call_to_the_Torment = 1454; +Global Const $SKILLID_Command_of_Torment = 1455; +Global Const $SKILLID_Abaddons_Favor = 1456; +Global Const $SKILLID_Abaddons_Chosen = 1457; +Global Const $SKILLID_Enchantment_Collapse = 1458; +Global Const $SKILLID_Call_of_Sacrifice = 1459; +Global Const $SKILLID_Enemies_Must_Die = 1460; +Global Const $SKILLID_Earth_Vortex = 1461; +Global Const $SKILLID_Frost_Vortex = 1462; +Global Const $SKILLID_Rough_Current = 1463; +Global Const $SKILLID_Turbulent_Flow = 1464; +Global Const $SKILLID_Prepared_Shot = 1465; +Global Const $SKILLID_Burning_Arrow = 1466; +Global Const $SKILLID_Arcing_Shot = 1467; +Global Const $SKILLID_Strike_as_One = 1468; +Global Const $SKILLID_Crossfire = 1469; +Global Const $SKILLID_Barbed_Arrows = 1470; +Global Const $SKILLID_Scavengers_Focus = 1471; +Global Const $SKILLID_Toxicity = 1472; +Global Const $SKILLID_Quicksand = 1473; +Global Const $SKILLID_Storms_Embrace = 1474; +Global Const $SKILLID_Trappers_Speed = 1475; +Global Const $SKILLID_Tripwire = 1476; +Global Const $SKILLID_Kournan_Guardsman_Uniform = 1477; +Global Const $SKILLID_Renewing_Surge = 1478; +Global Const $SKILLID_Offering_of_Spirit = 1479; +Global Const $SKILLID_Spirits_Gift = 1480; +Global Const $SKILLID_Death_Pact_Signet = 1481; +Global Const $SKILLID_Reclaim_Essence = 1482; +Global Const $SKILLID_Banishing_Strike = 1483; +Global Const $SKILLID_Mystic_Sweep = 1484; +Global Const $SKILLID_Eremites_Attack = 1485; +Global Const $SKILLID_Reap_Impurities = 1486; +Global Const $SKILLID_Twin_Moon_Sweep = 1487; +Global Const $SKILLID_Victorious_Sweep = 1488; +Global Const $SKILLID_Irresistible_Sweep = 1489; +Global Const $SKILLID_Pious_Assault = 1490; +Global Const $SKILLID_Mystic_Twister = 1491; +Global Const $SKILLID_Grenths_Fingers = 1493; +Global Const $SKILLID_Aura_of_Thorns = 1495; +Global Const $SKILLID_Balthazars_Rage = 1496; +Global Const $SKILLID_Dust_Cloak = 1497; +Global Const $SKILLID_Staggering_Force = 1498; +Global Const $SKILLID_Pious_Renewal = 1499; +Global Const $SKILLID_Mirage_Cloak = 1500; +Global Const $SKILLID_Arcane_Zeal = 1502; +Global Const $SKILLID_Mystic_Vigor = 1503; +Global Const $SKILLID_Watchful_Intervention = 1504; +Global Const $SKILLID_Vow_of_Piety = 1505; +Global Const $SKILLID_Vital_Boon = 1506; +Global Const $SKILLID_Heart_of_Holy_Flame = 1507; +Global Const $SKILLID_Extend_Enchantments = 1508; +Global Const $SKILLID_Faithful_Intervention = 1509; +Global Const $SKILLID_Sand_Shards = 1510; +Global Const $SKILLID_Lyssas_Haste = 1512; +Global Const $SKILLID_Guiding_Hands = 1513; +Global Const $SKILLID_Fleeting_Stability = 1514; +Global Const $SKILLID_Armor_of_Sanctity = 1515; +Global Const $SKILLID_Mystic_Regeneration = 1516; +Global Const $SKILLID_Vow_of_Silence = 1517; +Global Const $SKILLID_Avatar_of_Balthazar = 1518; +Global Const $SKILLID_Avatar_of_Dwayna = 1519; +Global Const $SKILLID_Avatar_of_Grenth = 1520; +Global Const $SKILLID_Avatar_of_Lyssa = 1521; +Global Const $SKILLID_Avatar_of_Melandru = 1522; +Global Const $SKILLID_Meditation = 1523; +Global Const $SKILLID_Eremites_Zeal = 1524; +Global Const $SKILLID_Natural_Healing = 1525; +Global Const $SKILLID_Imbue_Health = 1526; +Global Const $SKILLID_Mystic_Healing = 1527; +Global Const $SKILLID_Dwaynas_Touch = 1528; +Global Const $SKILLID_Pious_Restoration = 1529; +Global Const $SKILLID_Signet_of_Pious_Light = 1530; +Global Const $SKILLID_Intimidating_Aura = 1531; +Global Const $SKILLID_Mystic_Sandstorm = 1532; +Global Const $SKILLID_Winds_of_Disenchantment = 1533; +Global Const $SKILLID_Rending_Touch = 1534; +Global Const $SKILLID_Crippling_Sweep = 1535; +Global Const $SKILLID_Wounding_Strike = 1536; +Global Const $SKILLID_Wearying_Strike = 1537; +Global Const $SKILLID_Lyssas_Assault = 1538; +Global Const $SKILLID_Chilling_Victory = 1539; +Global Const $SKILLID_Conviction = 1540; +Global Const $SKILLID_Enchanted_Haste = 1541; +Global Const $SKILLID_Pious_Concentration = 1542; +Global Const $SKILLID_Pious_Haste = 1543; +Global Const $SKILLID_Whirling_Charge = 1544; +Global Const $SKILLID_Test_of_Faith = 1545; +Global Const $SKILLID_Blazing_Spear = 1546; +Global Const $SKILLID_Mighty_Throw = 1547; +Global Const $SKILLID_Cruel_Spear = 1548; +Global Const $SKILLID_Harriers_Toss = 1549; +Global Const $SKILLID_Unblockable_Throw = 1550; +Global Const $SKILLID_Spear_of_Lightning = 1551; +Global Const $SKILLID_Wearying_Spear = 1552; +Global Const $SKILLID_Anthem_of_Fury = 1553; +Global Const $SKILLID_Crippling_Anthem = 1554; +Global Const $SKILLID_Defensive_Anthem = 1555; +Global Const $SKILLID_Godspeed = 1556; +Global Const $SKILLID_Anthem_of_Flame = 1557; +Global Const $SKILLID_Go_for_the_Eyes = 1558; +Global Const $SKILLID_Anthem_of_Envy = 1559; +Global Const $SKILLID_Song_of_Power = 1560; +Global Const $SKILLID_Zealous_Anthem = 1561; +Global Const $SKILLID_Aria_of_Zeal = 1562; +Global Const $SKILLID_Lyric_of_Zeal = 1563; +Global Const $SKILLID_Ballad_of_Restoration = 1564; +Global Const $SKILLID_Chorus_of_Restoration = 1565; +Global Const $SKILLID_Aria_of_Restoration = 1566; +Global Const $SKILLID_Song_of_Concentration = 1567; +Global Const $SKILLID_Anthem_of_Guidance = 1568; +Global Const $SKILLID_Energizing_Chorus = 1569; +Global Const $SKILLID_Song_of_Purification = 1570; +Global Const $SKILLID_Hexbreaker_Aria = 1571; +Global Const $SKILLID_Brace_Yourself = 1572; +Global Const $SKILLID_Awe = 1573; +Global Const $SKILLID_Enduring_Harmony = 1574; +Global Const $SKILLID_Blazing_Finale = 1575; +Global Const $SKILLID_Burning_Refrain = 1576; +Global Const $SKILLID_Finale_of_Restoration = 1577; +Global Const $SKILLID_Mending_Refrain = 1578; +Global Const $SKILLID_Purifying_Finale = 1579; +Global Const $SKILLID_Bladeturn_Refrain = 1580; +Global Const $SKILLID_Glowing_Signet = 1581; +Global Const $SKILLID_Leaders_Zeal = 1583; +Global Const $SKILLID_Leaders_Comfort = 1584; +Global Const $SKILLID_Signet_of_Synergy = 1585; +Global Const $SKILLID_Angelic_Protection = 1586; +Global Const $SKILLID_Angelic_Bond = 1587; +Global Const $SKILLID_Cautery_Signet = 1588; +Global Const $SKILLID_Stand_Your_Ground = 1589; +Global Const $SKILLID_Lead_the_Way = 1590; +Global Const $SKILLID_Make_Haste = 1591; +Global Const $SKILLID_We_Shall_Return = 1592; +Global Const $SKILLID_Never_Give_Up = 1593; +Global Const $SKILLID_Help_Me = 1594; +Global Const $SKILLID_Fall_Back = 1595; +Global Const $SKILLID_Incoming = 1596; +Global Const $SKILLID_Theyre_on_Fire = 1597; +Global Const $SKILLID_Never_Surrender = 1598; +Global Const $SKILLID_Its_just_a_flesh_wound = 1599; +Global Const $SKILLID_Barbed_Spear = 1600; +Global Const $SKILLID_Vicious_Attack = 1601; +Global Const $SKILLID_Stunning_Strike = 1602; +Global Const $SKILLID_Merciless_Spear = 1603; +Global Const $SKILLID_Disrupting_Throw = 1604; +Global Const $SKILLID_Wild_Throw = 1605; +Global Const $SKILLID_Curse_of_the_Staff_of_the_Mists = 1606; +Global Const $SKILLID_Aura_of_the_Staff_of_the_Mists = 1607; +Global Const $SKILLID_Power_of_the_Staff_of_the_Mists = 1608; +Global Const $SKILLID_Scepter_of_Ether = 1609; +Global Const $SKILLID_Summoning_of_the_Scepter = 1610; +Global Const $SKILLID_Rise_From_Your_Grave = 1611; +Global Const $SKILLID_Corsair_Disguise = 1613; +Global Const $SKILLID_Queen_Heal = 1616; +Global Const $SKILLID_Queen_Wail = 1617; +Global Const $SKILLID_Queen_Armor = 1618; +Global Const $SKILLID_Queen_Bite = 1619; +Global Const $SKILLID_Queen_Thump = 1620; +Global Const $SKILLID_Queen_Siege = 1621; +Global Const $SKILLID_Dervish_of_the_Mystic = 1624; +Global Const $SKILLID_Dervish_of_the_Wind = 1625; +Global Const $SKILLID_Paragon_of_Leadership = 1626; +Global Const $SKILLID_Paragon_of_Motivation = 1627; +Global Const $SKILLID_Dervish_of_the_Blade = 1628; +Global Const $SKILLID_Paragon_of_Command = 1629; +Global Const $SKILLID_Paragon_of_the_Spear = 1630; +Global Const $SKILLID_Dervish_of_the_Earth = 1631; +Global Const $SKILLID_Malicious_Strike = 1633; +Global Const $SKILLID_Shattering_Assault = 1634; +Global Const $SKILLID_Golden_Skull_Strike = 1635; +Global Const $SKILLID_Black_Spider_Strike = 1636; +Global Const $SKILLID_Golden_Fox_Strike = 1637; +Global Const $SKILLID_Deadly_Haste = 1638; +Global Const $SKILLID_Assassins_Remedy = 1639; +Global Const $SKILLID_Foxs_Promise = 1640; +Global Const $SKILLID_Feigned_Neutrality = 1641; +Global Const $SKILLID_Hidden_Caltrops = 1642; +Global Const $SKILLID_Assault_Enchantments = 1643; +Global Const $SKILLID_Wastrels_Collapse = 1644; +Global Const $SKILLID_Lift_Enchantment = 1645; +Global Const $SKILLID_Augury_of_Death = 1646; +Global Const $SKILLID_Signet_of_Toxic_Shock = 1647; +Global Const $SKILLID_Signet_of_Twilight = 1648; +Global Const $SKILLID_Way_of_the_Assassin = 1649; +Global Const $SKILLID_Shadow_Walk = 1650; +Global Const $SKILLID_Deaths_Retreat = 1651; +Global Const $SKILLID_Shadow_Prison = 1652; +Global Const $SKILLID_Swap = 1653; +Global Const $SKILLID_Shadow_Meld = 1654; +Global Const $SKILLID_Price_of_Pride = 1655; +Global Const $SKILLID_Air_of_Disenchantment = 1656; +Global Const $SKILLID_Signet_of_Clumsiness = 1657; +Global Const $SKILLID_Symbolic_Posture = 1658; +Global Const $SKILLID_Toxic_Chill = 1659; +Global Const $SKILLID_Well_of_Silence = 1660; +Global Const $SKILLID_Glowstone = 1661; +Global Const $SKILLID_Mind_Blast = 1662; +Global Const $SKILLID_Elemental_Flame = 1663; +Global Const $SKILLID_Invoke_Lightning = 1664; +Global Const $SKILLID_Battle_Cry = 1665; +Global Const $SKILLID_Energy_Shrine_Bonus = 1667; +Global Const $SKILLID_Northern_Health_Shrine_Bonus = 1668; +Global Const $SKILLID_Southern_Health_Shrine_Bonus = 1669; +Global Const $SKILLID_Curse_of_Silence = 1671; +Global Const $SKILLID_To_the_Pain_Hero_Battles = 1672; +Global Const $SKILLID_Edge_of_Reason = 1673; +Global Const $SKILLID_Depths_of_Madness_environment_effect = 1674; +Global Const $SKILLID_Cower_in_Fear = 1675; +Global Const $SKILLID_Dreadful_Pain = 1676; +Global Const $SKILLID_Veiled_Nightmare = 1677; +Global Const $SKILLID_Base_Protection = 1678; +Global Const $SKILLID_Kournan_Siege_Flame = 1679; +Global Const $SKILLID_Drake_Skin = 1680; +Global Const $SKILLID_Skale_Vigor = 1681; +Global Const $SKILLID_Pahnai_Salad_item_effect = 1682; +Global Const $SKILLID_Pensive_Guardian = 1683; +Global Const $SKILLID_Scribes_Insight = 1684; +Global Const $SKILLID_Holy_Haste = 1685; +Global Const $SKILLID_Glimmer_of_Light = 1686; +Global Const $SKILLID_Zealous_Benediction = 1687; +Global Const $SKILLID_Defenders_Zeal = 1688; +Global Const $SKILLID_Signet_of_Mystic_Wrath = 1689; +Global Const $SKILLID_Signet_of_Removal = 1690; +Global Const $SKILLID_Dismiss_Condition = 1691; +Global Const $SKILLID_Divert_Hexes = 1692; +Global Const $SKILLID_Counterattack = 1693; +Global Const $SKILLID_Magehunter_Strike = 1694; +Global Const $SKILLID_Soldiers_Strike = 1695; +Global Const $SKILLID_Decapitate = 1696; +Global Const $SKILLID_Magehunters_Smash = 1697; +Global Const $SKILLID_Soldiers_Stance = 1698; +Global Const $SKILLID_Soldiers_Defense = 1699; +Global Const $SKILLID_Frenzied_Defense = 1700; +Global Const $SKILLID_Steady_Stance = 1701; +Global Const $SKILLID_Steelfang_Slash = 1702; +Global Const $SKILLID_Sunspear_Battle_Call = 1703; +Global Const $SKILLID_Earth_Shattering_Blow = 1705; +Global Const $SKILLID_Corrupt_Power = 1706; +Global Const $SKILLID_Words_of_Madness = 1707; +Global Const $SKILLID_Gaze_of_MoavuKaal = 1708; +Global Const $SKILLID_Presence_of_the_Skale_Lord = 1709; +Global Const $SKILLID_Madness_Dart = 1710; +Global Const $SKILLID_Reform_Carvings = 1715; +Global Const $SKILLID_Sunspear_Siege = 1717; +Global Const $SKILLID_Soul_Torture = 1718; +Global Const $SKILLID_Screaming_Shot = 1719; +Global Const $SKILLID_Keen_Arrow = 1720; +Global Const $SKILLID_Rampage_as_One = 1721; +Global Const $SKILLID_Forked_Arrow = 1722; +Global Const $SKILLID_Disrupting_Accuracy = 1723; +Global Const $SKILLID_Experts_Dexterity = 1724; +Global Const $SKILLID_Roaring_Winds = 1725; +Global Const $SKILLID_Magebane_Shot = 1726; +Global Const $SKILLID_Natural_Stride = 1727; +Global Const $SKILLID_Hekets_Rampage = 1728; +Global Const $SKILLID_Smoke_Trap = 1729; +Global Const $SKILLID_Infuriating_Heat = 1730; +Global Const $SKILLID_Vocal_Was_Sogolon = 1731; +Global Const $SKILLID_Destructive_Was_Glaive = 1732; +Global Const $SKILLID_Wielders_Strike = 1733; +Global Const $SKILLID_Gaze_of_Fury = 1734; +Global Const $SKILLID_Gaze_of_Fury_attack = 1735; +Global Const $SKILLID_Spirits_Strength = 1736; +Global Const $SKILLID_Wielders_Zeal = 1737; +Global Const $SKILLID_Sight_Beyond_Sight = 1738; +Global Const $SKILLID_Renewing_Memories = 1739; +Global Const $SKILLID_Wielders_Remedy = 1740; +Global Const $SKILLID_Ghostmirror_Light = 1741; +Global Const $SKILLID_Signet_of_Ghostly_Might = 1742; +Global Const $SKILLID_Signet_of_Binding = 1743; +Global Const $SKILLID_Caretakers_Charge = 1744; +Global Const $SKILLID_Anguish = 1745; +Global Const $SKILLID_Anguish_attack = 1746; +Global Const $SKILLID_Empowerment = 1747; +Global Const $SKILLID_Recovery = 1748; +Global Const $SKILLID_Weapon_of_Fury = 1749; +Global Const $SKILLID_Xinraes_Weapon = 1750; +Global Const $SKILLID_Warmongers_Weapon = 1751; +Global Const $SKILLID_Weapon_of_Remedy = 1752; +Global Const $SKILLID_Rending_Sweep = 1753; +Global Const $SKILLID_Onslaught = 1754; +Global Const $SKILLID_Mystic_Corruption = 1755; +Global Const $SKILLID_Grenths_Grasp = 1756; +Global Const $SKILLID_Veil_of_Thorns = 1757; +Global Const $SKILLID_Harriers_Grasp = 1758; +Global Const $SKILLID_Vow_of_Strength = 1759; +Global Const $SKILLID_Ebon_Dust_Aura = 1760; +Global Const $SKILLID_Zealous_Vow = 1761; +Global Const $SKILLID_Heart_of_Fury = 1762; +Global Const $SKILLID_Zealous_Renewal = 1763; +Global Const $SKILLID_Attackers_Insight = 1764; +Global Const $SKILLID_Rending_Aura = 1765; +Global Const $SKILLID_Featherfoot_Grace = 1766; +Global Const $SKILLID_Reapers_Sweep = 1767; +Global Const $SKILLID_Harriers_Haste = 1768; +Global Const $SKILLID_Focused_Anger = 1769; +Global Const $SKILLID_Natural_Temper = 1770; +Global Const $SKILLID_Song_of_Restoration = 1771; +Global Const $SKILLID_Lyric_of_Purification = 1772; +Global Const $SKILLID_Soldiers_Fury = 1773; +Global Const $SKILLID_Aggressive_Refrain = 1774; +Global Const $SKILLID_Energizing_Finale = 1775; +Global Const $SKILLID_Signet_of_Aggression = 1776; +Global Const $SKILLID_Remedy_Signet = 1777; +Global Const $SKILLID_Signet_of_Return = 1778; +Global Const $SKILLID_Make_Your_Time = 1779; +Global Const $SKILLID_Cant_Touch_This = 1780; +Global Const $SKILLID_Find_Their_Weakness = 1781; +Global Const $SKILLID_The_Power_Is_Yours = 1782; +Global Const $SKILLID_Slayers_Spear = 1783; +Global Const $SKILLID_Swift_Javelin = 1784; +Global Const $SKILLID_Skale_Hunt = 1790; +Global Const $SKILLID_Mandragor_Hunt = 1791; +Global Const $SKILLID_Skree_Battle = 1792; +Global Const $SKILLID_Insect_Hunt = 1793; +Global Const $SKILLID_Corsair_Bounty = 1794; +Global Const $SKILLID_Plant_Hunt = 1795; +Global Const $SKILLID_Undead_Hunt = 1796; +Global Const $SKILLID_Eternal_Suffering = 1797; +Global Const $SKILLID_Eternal_Languor = 1800; +Global Const $SKILLID_Eternal_Lethargy = 1803; +Global Const $SKILLID_Thirst_of_the_Drought = 1808; +Global Const $SKILLID_Lightbringer = 1813; +Global Const $SKILLID_Lightbringers_Gaze = 1814; +Global Const $SKILLID_Lightbringer_Signet = 1815; +Global Const $SKILLID_Sunspear_Rebirth_Signet = 1816; +Global Const $SKILLID_Wisdom = 1817; +Global Const $SKILLID_Maddened_Strike = 1818; +Global Const $SKILLID_Maddened_Stance = 1819; +Global Const $SKILLID_Spirit_Form = 1820; +Global Const $SKILLID_Monster_Hunt = 1822; +Global Const $SKILLID_Elemental_Hunt = 1826; +Global Const $SKILLID_Demon_Hunt = 1831; +Global Const $SKILLID_Minotaur_Hunt = 1832; +Global Const $SKILLID_Heket_Hunt = 1837; +Global Const $SKILLID_Kournan_Bounty = 1839; +Global Const $SKILLID_Dhuum_Battle = 1844; +Global Const $SKILLID_Menzies_Battle = 1845; +Global Const $SKILLID_Monolith_Hunt = 1847; +Global Const $SKILLID_Margonite_Battle = 1849; +Global Const $SKILLID_Titan_Hunt = 1851; +Global Const $SKILLID_Giant_Hunt = 1853; +Global Const $SKILLID_Kournan_Siege = 1855; +Global Const $SKILLID_Lose_your_Head = 1856; +Global Const $SKILLID_Altar_Buff = 1859; +Global Const $SKILLID_Choking_Breath = 1861; +Global Const $SKILLID_Junundu_Bite = 1862; +Global Const $SKILLID_Blinding_Breath = 1863; +Global Const $SKILLID_Burning_Breath = 1864; +Global Const $SKILLID_Junundu_Wail = 1865; +Global Const $SKILLID_Capture_Point = 1866; +Global Const $SKILLID_Approaching_the_Vortex = 1867; +Global Const $SKILLID_Avatar_of_Sweetness = 1871; +Global Const $SKILLID_Corrupted_Lands = 1873; +Global Const $SKILLID_Unknown_Junundu_Ability = 1876; +Global Const $SKILLID_Torment_Slash_Smothering_Tendrils = 1880; +Global Const $SKILLID_Bonds_of_Torment = 1881; +Global Const $SKILLID_Shadow_Smash = 1882; +Global Const $SKILLID_Consume_Torment = 1884; +Global Const $SKILLID_Banish_Enchantment = 1885; +Global Const $SKILLID_Summoning_Shadows = 1886; +Global Const $SKILLID_Lightbringers_Insight = 1887; +Global Const $SKILLID_Repressive_Energy = 1889; +Global Const $SKILLID_Enduring_Torment = 1890; +Global Const $SKILLID_Shroud_of_Darkness = 1891; +Global Const $SKILLID_Demonic_Miasma = 1892; +Global Const $SKILLID_Enraged = 1893; +Global Const $SKILLID_Touch_of_Aaaaarrrrrrggghhh = 1894; +Global Const $SKILLID_Wild_Smash = 1895; +Global Const $SKILLID_Unyielding_Anguish = 1896; +Global Const $SKILLID_Jadoths_Storm_of_Judgment = 1897; +Global Const $SKILLID_Anguish_Hunt = 1898; +Global Const $SKILLID_Avatar_of_Holiday_Cheer = 1899; +Global Const $SKILLID_Side_Step = 1900; +Global Const $SKILLID_Jack_Frost = 1901; +Global Const $SKILLID_Avatar_of_Grenth_snow_fighting_skill = 1902; +Global Const $SKILLID_Avatar_of_Dwayna_snow_fighting_skill = 1903; +Global Const $SKILLID_Steady_Aim = 1904; +Global Const $SKILLID_Rudis_Red_Nose = 1905; +Global Const $SKILLID_Volatile_Charr_Crystal = 1911; +Global Const $SKILLID_Hard_mode = 1912; +Global Const $SKILLID_Sugar_Jolt = 1916; +Global Const $SKILLID_Rollerbeetle_Racer = 1917; +Global Const $SKILLID_Ram = 1918; +Global Const $SKILLID_Harden_Shell = 1919; +Global Const $SKILLID_Rollerbeetle_Dash = 1920; +Global Const $SKILLID_Super_Rollerbeetle = 1921; +Global Const $SKILLID_Rollerbeetle_Echo = 1922; +Global Const $SKILLID_Distracting_Lunge = 1923; +Global Const $SKILLID_Rollerbeetle_Blast = 1924; +Global Const $SKILLID_Spit_Rocks = 1925; +Global Const $SKILLID_Lunar_Blessing = 1926; +Global Const $SKILLID_Lucky_Aura = 1927; +Global Const $SKILLID_Spiritual_Possession = 1928; +Global Const $SKILLID_Water = 1929; +Global Const $SKILLID_Pig_Form = 1930; +Global Const $SKILLID_Beetle_Metamorphosis = 1931; +Global Const $SKILLID_Golden_Egg_item_effect = 1934; +Global Const $SKILLID_Infernal_Rage = 1937; +Global Const $SKILLID_Putrid_Flames = 1938; +Global Const $SKILLID_Flame_Call = 1940; +Global Const $SKILLID_Whirling_Fires = 1942; +Global Const $SKILLID_Charr_Siege_Attack_What_Must_Be_Done = 1943; +Global Const $SKILLID_Charr_Siege_Attack_Against_the_Charr = 1944; +Global Const $SKILLID_Birthday_Cupcake_skill = 1945; +Global Const $SKILLID_Blessing_of_the_Luxons = 1947; +Global Const $SKILLID_Shadow_Sanctuary = 1948; +Global Const $SKILLID_Ether_Nightmare = 1949; +Global Const $SKILLID_Signet_of_Corruption = 1950; +Global Const $SKILLID_Elemental_Lord = 1951; +Global Const $SKILLID_Selfless_Spirit = 1952; +Global Const $SKILLID_Triple_Shot = 1953; +Global Const $SKILLID_Save_Yourselves = 1954; +Global Const $SKILLID_Aura_of_Holy_Might = 1955; +Global Const $SKILLID_Spear_of_Fury = 1957; +Global Const $SKILLID_Fire_Dart = 1983; +Global Const $SKILLID_Ice_Dart = 1984; +Global Const $SKILLID_Poison_Dart = 1985; +Global Const $SKILLID_Vampiric_Assault = 1986; +Global Const $SKILLID_Lotus_Strike = 1987; +Global Const $SKILLID_Golden_Fang_Strike = 1988; +Global Const $SKILLID_Falling_Lotus_Strike = 1990; +Global Const $SKILLID_Sadists_Signet = 1991; +Global Const $SKILLID_Signet_of_Distraction = 1992; +Global Const $SKILLID_Signet_of_Recall = 1993; +Global Const $SKILLID_Power_Lock = 1994; +Global Const $SKILLID_Waste_Not_Want_Not = 1995; +Global Const $SKILLID_Sum_of_All_Fears = 1996; +Global Const $SKILLID_Withering_Aura = 1997; +Global Const $SKILLID_Cacophony = 1998; +Global Const $SKILLID_Winters_Embrace = 1999; +Global Const $SKILLID_Earthen_Shackles = 2000; +Global Const $SKILLID_Ward_of_Weakness = 2001; +Global Const $SKILLID_Glyph_of_Swiftness = 2002; +Global Const $SKILLID_Cure_Hex = 2003; +Global Const $SKILLID_Smite_Condition = 2004; +Global Const $SKILLID_Smiters_Boon = 2005; +Global Const $SKILLID_Castigation_Signet = 2006; +Global Const $SKILLID_Purifying_Veil = 2007; +Global Const $SKILLID_Pulverizing_Smash = 2008; +Global Const $SKILLID_Keen_Chop = 2009; +Global Const $SKILLID_Knee_Cutter = 2010; +Global Const $SKILLID_Grapple = 2011; +Global Const $SKILLID_Radiant_Scythe = 2012; +Global Const $SKILLID_Grenths_Aura = 2013; +Global Const $SKILLID_Signet_of_Pious_Restraint = 2014; +Global Const $SKILLID_Farmers_Scythe = 2015; +Global Const $SKILLID_Energetic_Was_Lee_Sa = 2016; +Global Const $SKILLID_Anthem_of_Weariness = 2017; +Global Const $SKILLID_Anthem_of_Disruption = 2018; +Global Const $SKILLID_Freezing_Ground = 2020; +Global Const $SKILLID_Fire_Jet = 2022; +Global Const $SKILLID_Ice_Jet = 2023; +Global Const $SKILLID_Poison_Jet = 2024; +Global Const $SKILLID_Fire_Spout = 2027; +Global Const $SKILLID_Ice_Spout = 2028; +Global Const $SKILLID_Poison_Spout = 2029; +Global Const $SKILLID_Summon_Spirits = 2051; +Global Const $SKILLID_Shadow_Fang = 2052; +Global Const $SKILLID_Calculated_Risk = 2053; +Global Const $SKILLID_Shrinking_Armor = 2054; +Global Const $SKILLID_Aneurysm = 2055; +Global Const $SKILLID_Wandering_Eye = 2056; +Global Const $SKILLID_Foul_Feast = 2057; +Global Const $SKILLID_Putrid_Bile = 2058; +Global Const $SKILLID_Shell_Shock = 2059; +Global Const $SKILLID_Glyph_of_Immolation = 2060; +Global Const $SKILLID_Patient_Spirit = 2061; +Global Const $SKILLID_Healing_Ribbon = 2062; +Global Const $SKILLID_Aura_of_Stability = 2063; +Global Const $SKILLID_Spotless_Mind = 2064; +Global Const $SKILLID_Spotless_Soul = 2065; +Global Const $SKILLID_Disarm = 2066; +Global Const $SKILLID_I_Meant_to_Do_That = 2067; +Global Const $SKILLID_Rapid_Fire = 2068; +Global Const $SKILLID_Sloth_Hunters_Shot = 2069; +Global Const $SKILLID_Aura_Slicer = 2070; +Global Const $SKILLID_Zealous_Sweep = 2071; +Global Const $SKILLID_Pure_Was_Li_Ming = 2072; +Global Const $SKILLID_Weapon_of_Aggression = 2073; +Global Const $SKILLID_Chest_Thumper = 2074; +Global Const $SKILLID_Hasty_Refrain = 2075; +Global Const $SKILLID_Cracked_Armor = 2077; +Global Const $SKILLID_Berserk = 2078; +Global Const $SKILLID_Fleshreavers_Escape = 2079; +Global Const $SKILLID_Chomp = 2080; +Global Const $SKILLID_Twisting_Jaws = 2081; +Global Const $SKILLID_Mandragors_Charge = 2083; +Global Const $SKILLID_Rock_Slide = 2084; +Global Const $SKILLID_Avalanche_effect = 2085; +Global Const $SKILLID_Snaring_Web = 2086; +Global Const $SKILLID_Ceiling_Collapse = 2087; +Global Const $SKILLID_Trample = 2088; +Global Const $SKILLID_Wurm_Bile = 2089 ; +Global Const $SKILLID_Critical_Agility = 2101; +Global Const $SKILLID_Cry_of_Pain = 2102; +Global Const $SKILLID_Necrosis = 2103; +Global Const $SKILLID_Intensity = 2104; +Global Const $SKILLID_Seed_of_Life = 2105; +Global Const $SKILLID_Call_of_the_Eye = 2106; +Global Const $SKILLID_Whirlwind_Attack = 2107; +Global Const $SKILLID_Never_Rampage_Alone = 2108; +Global Const $SKILLID_Eternal_Aura = 2109; +Global Const $SKILLID_Vampirism = 2110; +Global Const $SKILLID_Vampirism_attack = 2111; +Global Const $SKILLID_Theres_Nothing_to_Fear = 2112; +Global Const $SKILLID_Ursan_Rage_Blood_Washes_Blood = 2113; +Global Const $SKILLID_Ursan_Strike_Blood_Washes_Blood = 2114; +Global Const $SKILLID_Sneak_Attack = 2116; +Global Const $SKILLID_Firebomb_Explosion = 2117; +Global Const $SKILLID_Firebomb = 2118; +Global Const $SKILLID_Shield_of_Fire = 2119; +Global Const $SKILLID_Spirit_World_Retreat = 2122; +Global Const $SKILLID_Shattered_Spirit = 2124; +Global Const $SKILLID_Spirit_Roar = 2125; +Global Const $SKILLID_Spirit_Senses = 2126; +Global Const $SKILLID_Unseen_Aggression = 2127; +Global Const $SKILLID_Volfen_Pounce_Curse_of_the_Nornbear = 2128; +Global Const $SKILLID_Volfen_Claw_Curse_of_the_Nornbear = 2129; +Global Const $SKILLID_Volfen_Bloodlust_Curse_of_the_Nornbear = 2131; +Global Const $SKILLID_Volfen_Agility_Curse_of_the_Nornbear = 2132; +Global Const $SKILLID_Volfen_Blessing_Curse_of_the_Nornbear = 2133; +Global Const $SKILLID_Charging_Spirit = 2134; +Global Const $SKILLID_Trampling_Ox = 2135; +Global Const $SKILLID_Smoke_Powder_Defense = 2136; +Global Const $SKILLID_Confusing_Images = 2137; +Global Const $SKILLID_Hexers_Vigor = 2138; +Global Const $SKILLID_Masochism = 2139; +Global Const $SKILLID_Piercing_Trap = 2140; +Global Const $SKILLID_Companionship = 2141; +Global Const $SKILLID_Feral_Aggression = 2142; +Global Const $SKILLID_Disrupting_Shot = 2143; +Global Const $SKILLID_Volley = 2144; +Global Const $SKILLID_Expert_Focus = 2145; +Global Const $SKILLID_Pious_Fury = 2146; +Global Const $SKILLID_Crippling_Victory = 2147; +Global Const $SKILLID_Sundering_Weapon = 2148; +Global Const $SKILLID_Weapon_of_Renewal = 2149; +Global Const $SKILLID_Maiming_Spear = 2150; +Global Const $SKILLID_Temporal_Sheen = 2151; +Global Const $SKILLID_Flux_Overload = 2152; +Global Const $SKILLID_Phase_Shield_effect = 2154; +Global Const $SKILLID_Phase_Shield = 2155; +Global Const $SKILLID_Vitality_Transfer = 2156; +Global Const $SKILLID_Golem_Strike = 2157; +Global Const $SKILLID_Bloodstone_Slash = 2158; +Global Const $SKILLID_Energy_Blast_golem = 2159; +Global Const $SKILLID_Chaotic_Energy = 2160; +Global Const $SKILLID_Golem_Fire_Shield = 2161; +Global Const $SKILLID_The_Way_of_Duty = 2162; +Global Const $SKILLID_The_Way_of_Kinship = 2163; +Global Const $SKILLID_Diamondshard_Mist_environment_effect = 2164; +Global Const $SKILLID_Diamondshard_Grave = 2165; +Global Const $SKILLID_The_Way_of_Strength = 2166; +Global Const $SKILLID_Diamondshard_Mist = 2167; +Global Const $SKILLID_Raven_Blessing_A_Gate_Too_Far = 2168; +Global Const $SKILLID_Raven_Flight_A_Gate_Too_Far = 2170; +Global Const $SKILLID_Raven_Shriek_A_Gate_Too_Far = 2171; +Global Const $SKILLID_Raven_Swoop_A_Gate_Too_Far = 2172; +Global Const $SKILLID_Raven_Talons_A_Gate_Too_Far = 2173; +Global Const $SKILLID_Aspect_of_Oak = 2174; +Global Const $SKILLID_Tremor = 2176; +Global Const $SKILLID_Pyroclastic_Shot = 2180; +Global Const $SKILLID_Rolling_Shift = 2184; +Global Const $SKILLID_Powder_Keg_Explosion = 2185; +Global Const $SKILLID_Signet_of_Deadly_Corruption = 2186; +Global Const $SKILLID_Way_of_the_Master = 2187; +Global Const $SKILLID_Defile_Defenses = 2188; +Global Const $SKILLID_Angorodons_Gaze = 2189; +Global Const $SKILLID_Magnetic_Surge = 2190; +Global Const $SKILLID_Slippery_Ground = 2191; +Global Const $SKILLID_Glowing_Ice = 2192; +Global Const $SKILLID_Energy_Blast = 2193; +Global Const $SKILLID_Distracting_Strike = 2194; +Global Const $SKILLID_Symbolic_Strike = 2195; +Global Const $SKILLID_Soldiers_Speed = 2196; +Global Const $SKILLID_Body_Blow = 2197; +Global Const $SKILLID_Body_Shot = 2198; +Global Const $SKILLID_Poison_Tip_Signet = 2199; +Global Const $SKILLID_Signet_of_Mystic_Speed = 2200; +Global Const $SKILLID_Shield_of_Force = 2201; +Global Const $SKILLID_Mending_Grip = 2202; +Global Const $SKILLID_Spiritleech_Aura = 2203; +Global Const $SKILLID_Rejuvenation = 2204; +Global Const $SKILLID_Agony = 2205; +Global Const $SKILLID_Ghostly_Weapon = 2206; +Global Const $SKILLID_Inspirational_Speech = 2207; +Global Const $SKILLID_Burning_Shield = 2208; +Global Const $SKILLID_Holy_Spear = 2209; +Global Const $SKILLID_Spear_Swipe = 2210; +Global Const $SKILLID_Alkars_Alchemical_Acid = 2211; +Global Const $SKILLID_Light_of_Deldrimor = 2212; +Global Const $SKILLID_Ear_Bite = 2213; +Global Const $SKILLID_Low_Blow = 2214; +Global Const $SKILLID_Brawling_Headbutt = 2215; +Global Const $SKILLID_Dont_Trip = 2216; +Global Const $SKILLID_By_Urals_Hammer = 2217; +Global Const $SKILLID_Drunken_Master = 2218; +Global Const $SKILLID_Great_Dwarf_Weapon = 2219; +Global Const $SKILLID_Great_Dwarf_Armor = 2220; +Global Const $SKILLID_Breath_of_the_Great_Dwarf = 2221; +Global Const $SKILLID_Snow_Storm = 2222; +Global Const $SKILLID_Black_Powder_Mine = 2223; +Global Const $SKILLID_Summon_Mursaat = 2224; +Global Const $SKILLID_Summon_Ruby_Djinn = 2225; +Global Const $SKILLID_Summon_Ice_Imp = 2226; +Global Const $SKILLID_Summon_Naga_Shaman = 2227; +Global Const $SKILLID_Deft_Strike = 2228; +Global Const $SKILLID_Signet_of_Infection = 2229; +Global Const $SKILLID_Tryptophan_Signet = 2230; +Global Const $SKILLID_Ebon_Battle_Standard_of_Courage = 2231; +Global Const $SKILLID_Ebon_Battle_Standard_of_Wisdom = 2232; +Global Const $SKILLID_Ebon_Battle_Standard_of_Honor = 2233; +Global Const $SKILLID_Ebon_Vanguard_Sniper_Support = 2234; +Global Const $SKILLID_Ebon_Vanguard_Assassin_Support = 2235; +Global Const $SKILLID_Well_of_Ruin = 2236; +Global Const $SKILLID_Atrophy = 2237; +Global Const $SKILLID_Spear_of_Redemption = 2238; +Global Const $SKILLID_Gelatinous_Material_Explosion = 2240; +Global Const $SKILLID_Gelatinous_Corpse_Consumption = 2241; +Global Const $SKILLID_Gelatinous_Absorption = 2243; +Global Const $SKILLID_Unstable_Ooze_Explosion = 2244; +Global Const $SKILLID_Unstable_Aura = 2246; +Global Const $SKILLID_Unstable_Pulse = 2247; +Global Const $SKILLID_Polymock_Power_Drain = 2248; +Global Const $SKILLID_Polymock_Block = 2249; +Global Const $SKILLID_Polymock_Glyph_of_Concentration = 2250; +Global Const $SKILLID_Polymock_Ether_Signet = 2251; +Global Const $SKILLID_Polymock_Glyph_of_Power = 2252; +Global Const $SKILLID_Polymock_Overload = 2253; +Global Const $SKILLID_Polymock_Glyph_Destabilization = 2254; +Global Const $SKILLID_Polymock_Mind_Wreck = 2255; +Global Const $SKILLID_Order_of_Unholy_Vigor = 2256; +Global Const $SKILLID_Order_of_the_Lich = 2257; +Global Const $SKILLID_Master_of_Necromancy = 2258; +Global Const $SKILLID_Animate_Undead = 2259; +Global Const $SKILLID_Polymock_Deathly_Chill = 2260; +Global Const $SKILLID_Polymock_Rising_Bile = 2261; +Global Const $SKILLID_Polymock_Rotting_Flesh = 2262; +Global Const $SKILLID_Polymock_Lightning_Strike = 2263; +Global Const $SKILLID_Polymock_Lightning_Orb = 2264; +Global Const $SKILLID_Polymock_Lightning_Djinns_Haste = 2265; +Global Const $SKILLID_Polymock_Flare = 2266; +Global Const $SKILLID_Polymock_Immolate = 2267; +Global Const $SKILLID_Polymock_Meteor = 2268; +Global Const $SKILLID_Polymock_Ice_Spear = 2269; +Global Const $SKILLID_Polymock_Icy_Prison = 2270; +Global Const $SKILLID_Polymock_Mind_Freeze = 2271; +Global Const $SKILLID_Polymock_Ice_Shard_Storm = 2272; +Global Const $SKILLID_Polymock_Frozen_Trident = 2273; +Global Const $SKILLID_Polymock_Smite = 2274; +Global Const $SKILLID_Polymock_Smite_Hex = 2275; +Global Const $SKILLID_Polymock_Bane_Signet = 2276; +Global Const $SKILLID_Polymock_Stone_Daggers = 2277; +Global Const $SKILLID_Polymock_Obsidian_Flame = 2278; +Global Const $SKILLID_Polymock_Earthquake = 2279; +Global Const $SKILLID_Polymock_Frozen_Armor = 2280; +Global Const $SKILLID_Polymock_Glyph_Freeze = 2281; +Global Const $SKILLID_Polymock_Fireball = 2282; +Global Const $SKILLID_Polymock_Rodgorts_Invocation = 2283; +Global Const $SKILLID_Polymock_Calculated_Risk = 2284; +Global Const $SKILLID_Polymock_Recurring_Insecurity = 2285; +Global Const $SKILLID_Polymock_Backfire = 2286; +Global Const $SKILLID_Polymock_Guilt = 2287; +Global Const $SKILLID_Polymock_Lamentation = 2288; +Global Const $SKILLID_Polymock_Spirit_Rift = 2289; +Global Const $SKILLID_Polymock_Painful_Bond = 2290; +Global Const $SKILLID_Polymock_Signet_of_Clumsiness = 2291; +Global Const $SKILLID_Polymock_Migraine = 2292; +Global Const $SKILLID_Polymock_Glowing_Gaze = 2293; +Global Const $SKILLID_Polymock_Searing_Flames = 2294; +Global Const $SKILLID_Polymock_Signet_of_Revenge = 2295; +Global Const $SKILLID_Polymock_Signet_of_Smiting = 2296; +Global Const $SKILLID_Polymock_Stoning = 2297; +Global Const $SKILLID_Polymock_Eruption = 2298; +Global Const $SKILLID_Polymock_Shock_Arrow = 2299; +Global Const $SKILLID_Polymock_Mind_Shock = 2300; +Global Const $SKILLID_Polymock_Piercing_Light_Spear = 2301; +Global Const $SKILLID_Polymock_Mind_Blast = 2302; +Global Const $SKILLID_Polymock_Savannah_Heat = 2303; +Global Const $SKILLID_Polymock_Diversion = 2304; +Global Const $SKILLID_Polymock_Lightning_Blast = 2305; +Global Const $SKILLID_Polymock_Poisoned_Ground = 2306; +Global Const $SKILLID_Polymock_Icy_Bonds = 2307; +Global Const $SKILLID_Polymock_Sandstorm = 2308; +Global Const $SKILLID_Polymock_Banish = 2309; +Global Const $SKILLID_Mergoyle_Form = 2310; +Global Const $SKILLID_Skale_Form = 2311; +Global Const $SKILLID_Gargoyle_Form = 2312; +Global Const $SKILLID_Ice_Imp_Form = 2313; +Global Const $SKILLID_Fire_Imp_Form = 2314; +Global Const $SKILLID_Kappa_Form = 2315; +Global Const $SKILLID_Aloe_Seed_Form = 2316; +Global Const $SKILLID_Earth_Elemental_Form = 2317; +Global Const $SKILLID_Fire_Elemental_Form = 2318; +Global Const $SKILLID_Ice_Elemental_Form = 2319; +Global Const $SKILLID_Mirage_Iboga_Form = 2320; +Global Const $SKILLID_Wind_Rider_Form = 2321; +Global Const $SKILLID_Naga_Shaman_Form = 2322; +Global Const $SKILLID_Mantis_Dreamweaver_Form = 2323; +Global Const $SKILLID_Ruby_Djinn_Form = 2324; +Global Const $SKILLID_Gaki_Form = 2325; +Global Const $SKILLID_Stone_Rain_Form = 2326; +Global Const $SKILLID_Mursaat_Elementalist_Form = 2327; +Global Const $SKILLID_Crystal_Shield = 2328; +Global Const $SKILLID_Crystal_Snare = 2329; +Global Const $SKILLID_Paranoid_Indignation = 2330; +Global Const $SKILLID_Searing_Breath = 2331; +Global Const $SKILLID_Brawling = 2333; +Global Const $SKILLID_Brawling_Block = 2334; +Global Const $SKILLID_Brawling_Jab = 2335; +Global Const $SKILLID_Brawling_Straight_Right = 2337; +Global Const $SKILLID_Brawling_Hook = 2338; +Global Const $SKILLID_Brawling_Uppercut = 2340; +Global Const $SKILLID_Brawling_Combo_Punch = 2341; +Global Const $SKILLID_Brawling_Headbutt_Brawling_skill = 2342; +Global Const $SKILLID_STAND_UP = 2343; +Global Const $SKILLID_Call_of_Destruction = 2344; +Global Const $SKILLID_Lava_Ground = 2346; +Global Const $SKILLID_Lava_Wave = 2347; +Global Const $SKILLID_Charr_Siege_Attack_Assault_on_the_Stronghold = 2352; +Global Const $SKILLID_Finish_Him = 2353; +Global Const $SKILLID_Dodge_This = 2354; +Global Const $SKILLID_I_Am_The_Strongest = 2355; +Global Const $SKILLID_I_Am_Unstoppable = 2356; +Global Const $SKILLID_A_Touch_of_Guile = 2357; +Global Const $SKILLID_You_Move_Like_a_Dwarf = 2358; +Global Const $SKILLID_You_Are_All_Weaklings = 2359; +Global Const $SKILLID_Feel_No_Pain = 2360; +Global Const $SKILLID_Club_of_a_Thousand_Bears = 2361; +Global Const $SKILLID_Lava_Blast = 2364; +Global Const $SKILLID_Thunderfist_Strike = 2365; +Global Const $SKILLID_Alkars_Concoction = 2367; +Global Const $SKILLID_Murakais_Consumption = 2368; +Global Const $SKILLID_Murakais_Censure = 2369; +Global Const $SKILLID_Murakais_Calamity = 2370; +Global Const $SKILLID_Murakais_Storm_of_Souls = 2371; +Global Const $SKILLID_Edification = 2372; +Global Const $SKILLID_Heart_of_the_Norn = 2373; +Global Const $SKILLID_Ursan_Blessing = 2374; +Global Const $SKILLID_Ursan_Strike = 2375; +Global Const $SKILLID_Ursan_Rage = 2376; +Global Const $SKILLID_Ursan_Roar = 2377; +Global Const $SKILLID_Ursan_Force = 2378; +Global Const $SKILLID_Volfen_Blessing = 2379; +Global Const $SKILLID_Volfen_Claw = 2380; +Global Const $SKILLID_Volfen_Pounce = 2381; +Global Const $SKILLID_Volfen_Bloodlust = 2382; +Global Const $SKILLID_Volfen_Agility = 2383; +Global Const $SKILLID_Raven_Blessing = 2384; +Global Const $SKILLID_Raven_Talons = 2385; +Global Const $SKILLID_Raven_Swoop = 2386; +Global Const $SKILLID_Raven_Shriek = 2387; +Global Const $SKILLID_Raven_Flight = 2388; +Global Const $SKILLID_Totem_of_Man = 2389; +Global Const $SKILLID_Murakais_Call = 2391; +Global Const $SKILLID_Spawn_Pods = 2392; +Global Const $SKILLID_Enraged_Blast = 2393; +Global Const $SKILLID_Spawn_Hatchling = 2394; +Global Const $SKILLID_Ursan_Roar_Blood_Washes_Blood = 2395; +Global Const $SKILLID_Ursan_Force_Blood_Washes_Blood = 2396; +Global Const $SKILLID_Ursan_Aura = 2397; +Global Const $SKILLID_Consume_Flames = 2398; +Global Const $SKILLID_Charr_Flame_Keeper_Form = 2401; +Global Const $SKILLID_Titan_Form = 2402; +Global Const $SKILLID_Skeletal_Mage_Form = 2403; +Global Const $SKILLID_Smoke_Wraith_Form = 2404; +Global Const $SKILLID_Bone_Dragon_Form = 2405; +Global Const $SKILLID_Dwarven_Arcanist_Form = 2407; +Global Const $SKILLID_Dolyak_Rider_Form = 2408; +Global Const $SKILLID_Extract_Inscription = 2409; +Global Const $SKILLID_Charr_Shaman_Form = 2410; +Global Const $SKILLID_Mindbender = 2411; +Global Const $SKILLID_Smooth_Criminal = 2412; +Global Const $SKILLID_Technobabble = 2413; +Global Const $SKILLID_Radiation_Field = 2414; +Global Const $SKILLID_Asuran_Scan = 2415; +Global Const $SKILLID_Air_of_Superiority = 2416; +Global Const $SKILLID_Mental_Block = 2417; +Global Const $SKILLID_Pain_Inverter = 2418; +Global Const $SKILLID_Healing_Salve = 2419; +Global Const $SKILLID_Ebon_Escape = 2420; +Global Const $SKILLID_Weakness_Trap = 2421; +Global Const $SKILLID_Winds = 2422; +Global Const $SKILLID_Dwarven_Stability = 2423; +Global Const $SKILLID_StoutHearted = 2424; +Global Const $SKILLID_Decipher_Inscriptions = 2426; +Global Const $SKILLID_Rebel_Yell = 2427; +Global Const $SKILLID_Asuran_Flame_Staff = 2429; +Global Const $SKILLID_Aura_of_the_Bloodstone = 2430; +Global Const $SKILLID_Haunted_Ground = 2433; +Global Const $SKILLID_Asuran_Bodyguard = 2434; +Global Const $SKILLID_Energy_Channel = 2437; +Global Const $SKILLID_Hunt_Rampage_Asura = 2438; +Global Const $SKILLID_Boss_Bounty = 2440; +Global Const $SKILLID_Hunt_Point_Bonus_Asura = 2441; +Global Const $SKILLID_Time_Attack = 2444; +Global Const $SKILLID_Dwarven_Raider = 2445; +Global Const $SKILLID_Great_Dwarfs_Blessing = 2449; +Global Const $SKILLID_Hunt_Rampage_Deldrimor = 2450; +Global Const $SKILLID_Hunt_Point_Bonus = 2453; +Global Const $SKILLID_Vanguard_Patrol = 2457; +Global Const $SKILLID_Vanguard_Commendation = 2461; +Global Const $SKILLID_Hunt_Rampage_Ebon_Vanguard = 2462; +Global Const $SKILLID_Norn_Hunting_Party = 2469; +Global Const $SKILLID_Strength_of_the_Norn = 2473; +Global Const $SKILLID_Hunt_Rampage_Norn = 2474; +Global Const $SKILLID_Gloat = 2483; +Global Const $SKILLID_Metamorphosis = 2484; +Global Const $SKILLID_Inner_Fire = 2485; +Global Const $SKILLID_Elemental_Shift = 2486; +Global Const $SKILLID_Dryders_Feast = 2487; +Global Const $SKILLID_Fungal_Explosion = 2488; +Global Const $SKILLID_Blood_Rage = 2489; +Global Const $SKILLID_Parasitic_Bite = 2490; +Global Const $SKILLID_False_Death = 2491; +Global Const $SKILLID_Ooze_Combination = 2492; +Global Const $SKILLID_Ooze_Division = 2493; +Global Const $SKILLID_Bear_Form = 2494; +Global Const $SKILLID_Spore_Explosion = 2496; +Global Const $SKILLID_Dormant_Husk = 2497; +Global Const $SKILLID_Monkey_See_Monkey_Do = 2498; +Global Const $SKILLID_Tengus_Mimicry = 2500; +Global Const $SKILLID_Tongue_Lash = 2501; +Global Const $SKILLID_Soulrending_Shriek = 2502; +Global Const $SKILLID_Siege_Devourer = 2504; +Global Const $SKILLID_Siege_Devourer_Feast = 2505; +Global Const $SKILLID_Devourer_Bite = 2506; +Global Const $SKILLID_Siege_Devourer_Swipe = 2507; +Global Const $SKILLID_Devourer_Siege = 2508; +Global Const $SKILLID_HYAHHHHH = 2509; +Global Const $SKILLID_Dismount_Siege_Devourer = 2513; +Global Const $SKILLID_The_Masters_Mark = 2514; +Global Const $SKILLID_The_Snipers_Spear = 2515; +Global Const $SKILLID_Mount = 2516; +Global Const $SKILLID_Reverse_Polarity_Fire_Shield = 2517; +Global Const $SKILLID_Tengus_Gaze = 2518; +Global Const $SKILLID_Armor_of_Salvation_item_effect = 2520; +Global Const $SKILLID_Grail_of_Might_item_effect = 2521; +Global Const $SKILLID_Essence_of_Celerity_item_effect = 2522; +Global Const $SKILLID_Duncans_Defense = 2527; +Global Const $SKILLID_Invigorating_Mist = 2536; +Global Const $SKILLID_Courageous_Was_Saidra = 2537; +Global Const $SKILLID_Animate_Undead_Palawa_Joko = 2538; +Global Const $SKILLID_Order_of_Unholy_Vigor_Palawa_Joko = 2539; +Global Const $SKILLID_Order_of_the_Lich_Palawa_Joko = 2540; +Global Const $SKILLID_Golem_Boosters = 2541; +Global Const $SKILLID_Tongue_Whip = 2544; +Global Const $SKILLID_Lit_Torch = 2545; +Global Const $SKILLID_Dishonorable = 2546; +Global Const $SKILLID_Veteran_Asuran_Bodyguard = 2548; +Global Const $SKILLID_Veteran_Dwarven_Raider = 2549; +Global Const $SKILLID_Veteran_Vanguard_Patrol = 2550; +Global Const $SKILLID_Veteran_Norn_Hunting_Party = 2551 ; +Global Const $SKILLID_Candy_Corn_skill = 2604; +Global Const $SKILLID_Candy_Apple_skill = 2605; +Global Const $SKILLID_Anton_disguise = 2606; +Global Const $SKILLID_Erys_Vasburg_disguise = 2607; +Global Const $SKILLID_Olias_disguise = 2608; +Global Const $SKILLID_Argo_disguise = 2609; +Global Const $SKILLID_Mhenlo_disguise = 2610; +Global Const $SKILLID_Lukas_disguise = 2611; +Global Const $SKILLID_Aidan_disguise = 2612; +Global Const $SKILLID_Kahmu_disguise = 2613; +Global Const $SKILLID_Razah_disguise = 2614; +Global Const $SKILLID_Morgahn_disguise = 2615; +Global Const $SKILLID_Nika_disguise = 2616; +Global Const $SKILLID_Seaguard_Hala_disguise = 2617; +Global Const $SKILLID_Livia_disguise = 2618; +Global Const $SKILLID_Cynn_disguise = 2619; +Global Const $SKILLID_Tahlkora_disguise = 2620; +Global Const $SKILLID_Devona_disguise = 2621; +Global Const $SKILLID_Zho_disguise = 2622; +Global Const $SKILLID_Melonni_disguise = 2623; +Global Const $SKILLID_Xandra_disguise = 2624; +Global Const $SKILLID_Hayda_disguise = 2625 ; +Global Const $SKILLID_Pie_Induced_Ecstasy = 2649; +Global Const $SKILLID_Togo_disguise = 2651; +Global Const $SKILLID_Turai_Ossa_disguise = 2652; +Global Const $SKILLID_Gwen_disguise = 2653; +Global Const $SKILLID_Saul_DAlessio_disguise = 2654; +Global Const $SKILLID_Dragon_Empire_Rage = 2655; +Global Const $SKILLID_Call_to_the_Spirit_Realm = 2656; +Global Const $SKILLID_Hide = 2658; +Global Const $SKILLID_Feign_Death = 2659; +Global Const $SKILLID_Flee = 2660; +Global Const $SKILLID_Throw_Rock = 2661; +Global Const $SKILLID_Siege_Strike = 2663; +Global Const $SKILLID_Spike_Trap_spell = 2664; +Global Const $SKILLID_Barbed_Bomb = 2665; +Global Const $SKILLID_Balm_Bomb = 2667; +Global Const $SKILLID_Explosives = 2668; +Global Const $SKILLID_Rations = 2669; +Global Const $SKILLID_Form_Up_and_Advance = 2670; +Global Const $SKILLID_Spectral_Agony_hex = 2672; +Global Const $SKILLID_Stun_Bomb = 2673; +Global Const $SKILLID_Banner_of_the_Unseen = 2674; +Global Const $SKILLID_Signet_of_the_Unseen = 2675; +Global Const $SKILLID_For_Elona = 2676; +Global Const $SKILLID_Giant_Stomp_Turai_Ossa = 2677; +Global Const $SKILLID_Whirlwind_Attack_Turai_Ossa = 2678; +Global Const $SKILLID_Journey_to_the_North = 2699; +Global Const $SKILLID_Rat_Form = 2701; +Global Const $SKILLID_Party_Time = 2712; +Global Const $SKILLID_Awakened_Head_Form = 2841; +Global Const $SKILLID_Spider_Form = 2842; +Global Const $SKILLID_Golem_Form = 2844; +Global Const $SKILLID_Norn_Form = 2846; +Global Const $SKILLID_Rift_Warden_Form = 2848; +Global Const $SKILLID_Snowman_Form = 2851; +Global Const $SKILLID_Energy_Drain_PvP = 2852; +Global Const $SKILLID_Energy_Tap_PvP = 2853; +Global Const $SKILLID_PvP_effect = 2854; +Global Const $SKILLID_Ward_Against_Melee_PvP = 2855; +Global Const $SKILLID_Lightning_Orb_PvP = 2856; +Global Const $SKILLID_Aegis_PvP = 2857; +Global Const $SKILLID_Watch_Yourself_PvP = 2858; +Global Const $SKILLID_Enfeeble_PvP = 2859; +Global Const $SKILLID_Ether_Renewal_PvP = 2860; +Global Const $SKILLID_Penetrating_Attack_PvP = 2861; +Global Const $SKILLID_Shadow_Form_PvP = 2862; +Global Const $SKILLID_Discord_PvP = 2863; +Global Const $SKILLID_Sundering_Attack_PvP = 2864; +Global Const $SKILLID_Ritual_Lord_PvP = 2865; +Global Const $SKILLID_Flesh_of_My_Flesh_PvP = 2866; +Global Const $SKILLID_Ancestors_Rage_PvP = 2867; +Global Const $SKILLID_Splinter_Weapon_PvP = 2868; +Global Const $SKILLID_Assassins_Remedy_PvP = 2869; +Global Const $SKILLID_Blinding_Surge_PvP = 2870; +Global Const $SKILLID_Light_of_Deliverance_PvP = 2871; +Global Const $SKILLID_Death_Pact_Signet_PvP = 2872; +Global Const $SKILLID_Mystic_Sweep_PvP = 2873; +Global Const $SKILLID_Eremites_Attack_PvP = 2874; +Global Const $SKILLID_Harriers_Toss_PvP = 2875; +Global Const $SKILLID_Defensive_Anthem_PvP = 2876; +Global Const $SKILLID_Ballad_of_Restoration_PvP = 2877; +Global Const $SKILLID_Song_of_Restoration_PvP = 2878; +Global Const $SKILLID_Incoming_PvP = 2879; +Global Const $SKILLID_Never_Surrender_PvP = 2880; +Global Const $SKILLID_Mantra_of_Inscriptions_PvP = 2882; +Global Const $SKILLID_For_Great_Justice_PvP = 2883; +Global Const $SKILLID_Mystic_Regeneration_PvP = 2884; +Global Const $SKILLID_Enfeebling_Blood_PvP = 2885; +Global Const $SKILLID_Summoning_Sickness = 2886; +Global Const $SKILLID_Signet_of_Judgment_PvP = 2887; +Global Const $SKILLID_Chilling_Victory_PvP = 2888; +Global Const $SKILLID_Unyielding_Aura_PvP = 2891; +Global Const $SKILLID_Spirit_Bond_PvP = 2892; +Global Const $SKILLID_Weapon_of_Warding_PvP = 2893; +Global Const $SKILLID_Smiters_Boon_PvP = 2895; +Global Const $SKILLID_Battle_Fervor_Deactivating_ROX = 2896; +Global Const $SKILLID_Cloak_of_Faith_Deactivating_ROX = 2897; +Global Const $SKILLID_Dark_Aura_Deactivating_ROX = 2898; +Global Const $SKILLID_Reactor_Blast = 2902; +Global Const $SKILLID_Reactor_Blast_Timer = 2903; +Global Const $SKILLID_Jade_Brotherhood_Disguise = 2904; +Global Const $SKILLID_Internal_Power_Engaged = 2905; +Global Const $SKILLID_Target_Acquisition = 2906; +Global Const $SKILLID_NOX_Beam = 2907; +Global Const $SKILLID_NOX_Field_Dash = 2908; +Global Const $SKILLID_NOXion_Buster = 2909; +Global Const $SKILLID_Countdown = 2910; +Global Const $SKILLID_Bit_Golem_Breaker = 2911; +Global Const $SKILLID_Bit_Golem_Rectifier = 2912; +Global Const $SKILLID_Bit_Golem_Crash = 2913; +Global Const $SKILLID_Bit_Golem_Force = 2914; +Global Const $SKILLID_NOX_Phantom = 2916; +Global Const $SKILLID_NOX_Thunder = 2917; +Global Const $SKILLID_NOX_Lock_On = 2918; +Global Const $SKILLID_NOX_Driver = 2919; +Global Const $SKILLID_NOX_Fire = 2920; +Global Const $SKILLID_NOX_Knuckle = 2921; +Global Const $SKILLID_NOX_Divider_Drive = 2922; +Global Const $SKILLID_Sloth_Hunters_Shot_PvP = 2925; +Global Const $SKILLID_Experts_Dexterity_PvP = 2959; +Global Const $SKILLID_Signet_of_Spirits_PvP = 2965; +Global Const $SKILLID_Signet_of_Ghostly_Might_PvP = 2966; +Global Const $SKILLID_Avatar_of_Grenth_PvP = 2967; +Global Const $SKILLID_Oversized_Tonic_Warning = 2968; +Global Const $SKILLID_Read_the_Wind_PvP = 2969; +Global Const $SKILLID_Blue_Rock_Candy_Rush = 2971; +Global Const $SKILLID_Green_Rock_Candy_Rush = 2972; +Global Const $SKILLID_Red_Rock_Candy_Rush = 2973; +Global Const $SKILLID_Well_Supplied = 3174; +#EndRegion + +#Region MapNames +; MAP NAMES BY ID +Global $MAP_NAME_BY_ID[880] +$MAP_NAME_BY_ID[0] = 859 +$MAP_NAME_BY_ID[4] = "Guild Hall - Warrior's Isle" +$MAP_NAME_BY_ID[5] = "Guild Hall - Hunter's Isle" +$MAP_NAME_BY_ID[6] = "Guild Hall - Wizard's Isle" +$MAP_NAME_BY_ID[7] = "Warrior's Isle Explorable" +$MAP_NAME_BY_ID[8] = "Hunter's Isle Explorable" +$MAP_NAME_BY_ID[9] = "Wizard's Isle Explorable" +$MAP_NAME_BY_ID[10] = "Bloodstone Fen outpost" +$MAP_NAME_BY_ID[11] = "The Wilds outpost" +$MAP_NAME_BY_ID[12] = "Aurora Glade outpost" +$MAP_NAME_BY_ID[13] = "Diesa Lowlands" +$MAP_NAME_BY_ID[14] = "Gates of Kryta outpost" +$MAP_NAME_BY_ID[15] = "D'Alessio Seaboard outpost" +$MAP_NAME_BY_ID[16] = "Divinity Coast outpost" +$MAP_NAME_BY_ID[17] = "Talmark Wilderness" +$MAP_NAME_BY_ID[18] = "The Black Curtain" +$MAP_NAME_BY_ID[19] = "Sanctum Cay outpost" +$MAP_NAME_BY_ID[20] = "Droknar's Forge" +$MAP_NAME_BY_ID[21] = "The Frost Gate outpost" +$MAP_NAME_BY_ID[22] = "Ice Caves of Sorrow outpost" +$MAP_NAME_BY_ID[23] = "Thunderhead Keep outpost" +$MAP_NAME_BY_ID[24] = "Iron Mines of Moladune outpost" +$MAP_NAME_BY_ID[25] = "Borlis Pass outpost" +$MAP_NAME_BY_ID[26] = "Talus Chute" +$MAP_NAME_BY_ID[27] = "Griffon's Mouth" +$MAP_NAME_BY_ID[28] = "The Great Northern Wall outpost" +$MAP_NAME_BY_ID[29] = "Fort Ranik outpost" +$MAP_NAME_BY_ID[30] = "Ruins of Surmia outpost" +$MAP_NAME_BY_ID[31] = "Xaquang Skyway" +$MAP_NAME_BY_ID[32] = "Nolani Academy outpost" +$MAP_NAME_BY_ID[33] = "Old Ascalon" +$MAP_NAME_BY_ID[34] = "The Fissure of Woe" +$MAP_NAME_BY_ID[35] = "Ember Light Camp" +$MAP_NAME_BY_ID[36] = "Grendich Courthouse" +$MAP_NAME_BY_ID[37] = "Glint' Challenge" +$MAP_NAME_BY_ID[38] = "Augury Rock outpost" +$MAP_NAME_BY_ID[39] = "Sardelac Sanitarium" +$MAP_NAME_BY_ID[40] = "Piken Square" +$MAP_NAME_BY_ID[41] = "Sage Lands" +$MAP_NAME_BY_ID[42] = "Mamnoon Lagoon" +$MAP_NAME_BY_ID[43] = "Silverwood" +$MAP_NAME_BY_ID[44] = "Ettin's Back" +$MAP_NAME_BY_ID[45] = "Reed Bog" +$MAP_NAME_BY_ID[46] = "The Falls" +$MAP_NAME_BY_ID[47] = "Dry Top" +$MAP_NAME_BY_ID[48] = "Tangle Root" +$MAP_NAME_BY_ID[49] = "Henge of Denravi" +$MAP_NAME_BY_ID[51] = "Senjis Corner" +$MAP_NAME_BY_ID[52] = "Guild Hall - Burning Isle" +$MAP_NAME_BY_ID[53] = "Tears of the Fallen" +$MAP_NAME_BY_ID[54] = "Scoundrel's Rise" +$MAP_NAME_BY_ID[55] = "Lions Arch" +$MAP_NAME_BY_ID[56] = "Cursed Lands" +$MAP_NAME_BY_ID[57] = "Bergen Hot Springs" +$MAP_NAME_BY_ID[58] = "North Kryta Province" +$MAP_NAME_BY_ID[59] = "Nebo Terrace" +$MAP_NAME_BY_ID[60] = "Majesty's Rest" +$MAP_NAME_BY_ID[61] = "Twin Serpent Lakes" +$MAP_NAME_BY_ID[62] = "Watchtower Coast" +$MAP_NAME_BY_ID[63] = "Stingray Strand" +$MAP_NAME_BY_ID[64] = "Kessex Peak" +$MAP_NAME_BY_ID[65] = "D'Alessio Arena" +$MAP_NAME_BY_ID[67] = "Burning Isle Explorable" +$MAP_NAME_BY_ID[68] = "Frozen Isle Explorable" +$MAP_NAME_BY_ID[69] = "Nomad's Isle Explorable" +$MAP_NAME_BY_ID[70] = "Druid's Isle Explorable" +$MAP_NAME_BY_ID[71] = "Isle of the Dead Explorable" +$MAP_NAME_BY_ID[72] = "The Underworld" +$MAP_NAME_BY_ID[73] = "Riverside Province outpost" +$MAP_NAME_BY_ID[75] = "The Hall of Heroes Arena" +$MAP_NAME_BY_ID[76] = "Broken Tower Arena" +$MAP_NAME_BY_ID[77] = "House zu Heltzer" +$MAP_NAME_BY_ID[78] = "The Courtyard Arena" +$MAP_NAME_BY_ID[79] = "Unholy Temples Area" +$MAP_NAME_BY_ID[80] = "Burial Mounds Arena" +$MAP_NAME_BY_ID[81] = "Ascalon City" +$MAP_NAME_BY_ID[82] = "Tomb of the Primeval Kings" +$MAP_NAME_BY_ID[83] = "The Vault Arena" +$MAP_NAME_BY_ID[84] = "The Underworld Arena" +$MAP_NAME_BY_ID[85] = "Ascalon Arena outpost" +$MAP_NAME_BY_ID[86] = "Sacred Temples Arena" +$MAP_NAME_BY_ID[87] = "Icedome" +$MAP_NAME_BY_ID[88] = "Iron Horse Mine" +$MAP_NAME_BY_ID[89] = "Anvil Rock" +$MAP_NAME_BY_ID[90] = "Lornar's Pass" +$MAP_NAME_BY_ID[91] = "Snake Dance" +$MAP_NAME_BY_ID[92] = "Tasca's Demise" +$MAP_NAME_BY_ID[93] = "Spearhead Peak" +$MAP_NAME_BY_ID[94] = "Ice Floe" +$MAP_NAME_BY_ID[95] = "Witman's Folly" +$MAP_NAME_BY_ID[96] = "Mineral Springs" +$MAP_NAME_BY_ID[97] = "Dreadnought's Drift" +$MAP_NAME_BY_ID[98] = "Frozen Forest" +$MAP_NAME_BY_ID[99] = "Traveler's Vale" +$MAP_NAME_BY_ID[100] = "Deldrimor Bowl" +$MAP_NAME_BY_ID[101] = "Regent Valley" +$MAP_NAME_BY_ID[102] = "The Breach" +$MAP_NAME_BY_ID[103] = "Ascalon Foothills" +$MAP_NAME_BY_ID[104] = "Pockmark Flats" +$MAP_NAME_BY_ID[105] = "Dragon's Gullet" +$MAP_NAME_BY_ID[106] = "Flame Temple Corridor" +$MAP_NAME_BY_ID[107] = "Eastern Frontier" +$MAP_NAME_BY_ID[108] = "The Scar" +$MAP_NAME_BY_ID[109] = "The Amnoon Oasis" +$MAP_NAME_BY_ID[110] = "Diviner's Ascent" +$MAP_NAME_BY_ID[111] = "Vulture Drifts" +$MAP_NAME_BY_ID[112] = "The Arid Sea" +$MAP_NAME_BY_ID[113] = "Prophet's Path" +$MAP_NAME_BY_ID[114] = "Salt Flats" +$MAP_NAME_BY_ID[115] = "Skyward Reach" +$MAP_NAME_BY_ID[116] = "Dunes of Despair outpost" +$MAP_NAME_BY_ID[117] = "Thirsty River outpost" +$MAP_NAME_BY_ID[118] = "Elona Reach outpost" +$MAP_NAME_BY_ID[119] = "Augury Rock outpost" +$MAP_NAME_BY_ID[120] = "The Dragon's Lair outpost" +$MAP_NAME_BY_ID[121] = "Perdition Rock" +$MAP_NAME_BY_ID[122] = "Ring of Fire outpost" +$MAP_NAME_BY_ID[123] = "Abaddon's Mouth outpost" +$MAP_NAME_BY_ID[124] = "Hell's Precipice outpost" +$MAP_NAME_BY_ID[126] = "Golden Gates" +$MAP_NAME_BY_ID[127] = "Scarred Earth" +$MAP_NAME_BY_ID[128] = "The Eternal Grove Explorable" +$MAP_NAME_BY_ID[129] = "Lutgardis Conservatory" +$MAP_NAME_BY_ID[130] = "Vasburg Armory" +$MAP_NAME_BY_ID[131] = "Serenity Temple" +$MAP_NAME_BY_ID[132] = "Ice Tooth Cave" +$MAP_NAME_BY_ID[133] = "Beacons Perch" +$MAP_NAME_BY_ID[134] = "Yaks Bend" +$MAP_NAME_BY_ID[135] = "Frontier Gate" +$MAP_NAME_BY_ID[136] = "Beetletun" +$MAP_NAME_BY_ID[137] = "Fishermens Haven" +$MAP_NAME_BY_ID[138] = "Temple of the Ages" +$MAP_NAME_BY_ID[139] = "Ventaris Refuge" +$MAP_NAME_BY_ID[140] = "Druids Overlook" +$MAP_NAME_BY_ID[141] = "Maguuma Stade" +$MAP_NAME_BY_ID[142] = "Quarrel Falls" +$MAP_NAME_BY_ID[144] = "Gyala Hatchery Explorable" +$MAP_NAME_BY_ID[145] = "The Catacombs" +$MAP_NAME_BY_ID[146] = "Lakeside County" +$MAP_NAME_BY_ID[147] = "The Northlands" +$MAP_NAME_BY_ID[148] = "Ascalon City outpost" +$MAP_NAME_BY_ID[149] = "Ascalon Academy" +$MAP_NAME_BY_ID[150] = " Ascalon Academy PvP battle" +$MAP_NAME_BY_ID[151] = "Ascalon Academy" +$MAP_NAME_BY_ID[152] = "Heroes Audience" +$MAP_NAME_BY_ID[153] = "Seekers Passage" +$MAP_NAME_BY_ID[154] = "Destinys Gorge" +$MAP_NAME_BY_ID[155] = "Camp Rankor" +$MAP_NAME_BY_ID[156] = "The Granite Citadel" +$MAP_NAME_BY_ID[157] = "Marhans Grotto" +$MAP_NAME_BY_ID[158] = "Port Sledge" +$MAP_NAME_BY_ID[159] = "Copperhammer Mines" +$MAP_NAME_BY_ID[160] = "green Hills County" +$MAP_NAME_BY_ID[161] = "Wizard's Folly" +$MAP_NAME_BY_ID[162] = "Pre-Searing: Regent valley" +$MAP_NAME_BY_ID[163] = "Pre-Searing: The Barradin Estate" +$MAP_NAME_BY_ID[164] = "Pre-Searing: Ashford Abbey" +$MAP_NAME_BY_ID[165] = "Pre-Searing: Foibles Fair" +$MAP_NAME_BY_ID[166] = "Pre-Searing: Fort Ranik" +$MAP_NAME_BY_ID[167] = "Burning Isle" +$MAP_NAME_BY_ID[168] = "Druid's Isle" +$MAP_NAME_BY_ID[170] = "Frozen Isle" +$MAP_NAME_BY_ID[171] = "Warrior's Isle" +$MAP_NAME_BY_ID[172] = "Hunter's Isle" +$MAP_NAME_BY_ID[173] = "Wizard's Isle" +$MAP_NAME_BY_ID[174] = "Nomad's Isle" +$MAP_NAME_BY_ID[175] = "Isle of the Dead" +$MAP_NAME_BY_ID[176] = "Guild Hall - Frozen Isle" +$MAP_NAME_BY_ID[177] = "Guild Hall - Nomad's Isle" +$MAP_NAME_BY_ID[178] = "Guild Hall - Druid's Isle" +$MAP_NAME_BY_ID[179] = "Guild Hall - Isle of the Dead" +$MAP_NAME_BY_ID[180] = "Fort Koga" +$MAP_NAME_BY_ID[181] = "Shiverpeak Arena outpost" +$MAP_NAME_BY_ID[182] = "Amnoon Arena" +$MAP_NAME_BY_ID[183] = "Deldrimor Arena" +$MAP_NAME_BY_ID[184] = "The Crag" +$MAP_NAME_BY_ID[188] = "Random Arenas outpost" +$MAP_NAME_BY_ID[189] = "Team Arenas outpost" +$MAP_NAME_BY_ID[190] = "Sorrow's Furnace" +$MAP_NAME_BY_ID[191] = "Grenth's Footprint" +$MAP_NAME_BY_ID[193] = "Cavalon" +$MAP_NAME_BY_ID[194] = "Kaineng Center" +$MAP_NAME_BY_ID[195] = "Drazach Thicket" +$MAP_NAME_BY_ID[196] = "Jaya Bluff" +$MAP_NAME_BY_ID[197] = "Shenzun Tunnels" +$MAP_NAME_BY_ID[198] = "Archipelagos" +$MAP_NAME_BY_ID[199] = "Maishang Hills" +$MAP_NAME_BY_ID[200] = "Mount Qinkai" +$MAP_NAME_BY_ID[201] = "Melandru's Hope" +$MAP_NAME_BY_ID[202] = "Rhea's Crater" +$MAP_NAME_BY_ID[203] = "Silent Surf" +$MAP_NAME_BY_ID[204] = "Unwaking Waters - Kurzick" +$MAP_NAME_BY_ID[205] = "Morostav Trail" +$MAP_NAME_BY_ID[206] = "Deldrimor War Camp" +$MAP_NAME_BY_ID[208] = "Heroes' Crypt" +$MAP_NAME_BY_ID[209] = "Mourning Veil Falls" +$MAP_NAME_BY_ID[210] = "Ferndale" +$MAP_NAME_BY_ID[211] = "Pongmei Valley" +$MAP_NAME_BY_ID[212] = "Monastery Overlook" +$MAP_NAME_BY_ID[213] = "Zen Daijun outpost" +$MAP_NAME_BY_ID[214] = "Minister Chos Estate outpost" +$MAP_NAME_BY_ID[215] = "Vizunah Square" +$MAP_NAME_BY_ID[216] = "Nahpui Quarter outpost" +$MAP_NAME_BY_ID[217] = "Tahnnakai Temple outpost" +$MAP_NAME_BY_ID[218] = "Arborstone outpost" +$MAP_NAME_BY_ID[219] = "Boreas Seabed outpost" +$MAP_NAME_BY_ID[220] = "Sunjiang District outpost" +$MAP_NAME_BY_ID[221] = "Fort Aspenwood" +$MAP_NAME_BY_ID[222] = "The Eternal Grove outpost" +$MAP_NAME_BY_ID[223] = "The Jade Quarry" +$MAP_NAME_BY_ID[224] = "Gyala Hatchery outpost" +$MAP_NAME_BY_ID[225] = "Raisu Palace outpost" +$MAP_NAME_BY_ID[226] = "Imperial Sanctum outpost" +$MAP_NAME_BY_ID[227] = "Unwaking Waters Luxon" +$MAP_NAME_BY_ID[228] = "Grenz Frontier" +$MAP_NAME_BY_ID[230] = "Amatz Basin Explorable" +$MAP_NAME_BY_ID[230] = "Amatz Basin outpost" +$MAP_NAME_BY_ID[233] = "Raisu Palace outpost" +$MAP_NAME_BY_ID[234] = "The Aurios Mines outpost" +$MAP_NAME_BY_ID[235] = "Panjiang Peninsula" +$MAP_NAME_BY_ID[236] = "Kinya Province" +$MAP_NAME_BY_ID[237] = "Haiju Lagoon" +$MAP_NAME_BY_ID[238] = "Sunqua Vale" +$MAP_NAME_BY_ID[239] = "Waijun Bazaar" +$MAP_NAME_BY_ID[240] = "Bukdek Byway" +$MAP_NAME_BY_ID[241] = "The Undercity" +$MAP_NAME_BY_ID[242] = "Shing Jea Monastery" +$MAP_NAME_BY_ID[243] = "Shing Jea Arena outpost" +$MAP_NAME_BY_ID[244] = "Arborstone Explorable" +$MAP_NAME_BY_ID[245] = "Minister Cho's Estate Explorable" +$MAP_NAME_BY_ID[246] = "Zen Daijun Explorable" +$MAP_NAME_BY_ID[247] = "Boreas Seabed Explorable" +$MAP_NAME_BY_ID[248] = "Great Temple of Balthazar" +$MAP_NAME_BY_ID[249] = "Tsumei Village" +$MAP_NAME_BY_ID[250] = "Seitung Harbor" +$MAP_NAME_BY_ID[251] = "Ran Musu Gardens" +$MAP_NAME_BY_ID[252] = "Linnok Courtyard" +$MAP_NAME_BY_ID[253] = "Dwayna Vs Grenth outpost" +$MAP_NAME_BY_ID[256] = "Sunjiang District Explorable" +$MAP_NAME_BY_ID[265] = "Nahpui Quarter Explorable" +$MAP_NAME_BY_ID[266] = "Urgoz's Warren outpost" +$MAP_NAME_BY_ID[272] = "Altrumm Ruins outpost" +$MAP_NAME_BY_ID[273] = "Zos Shivros Channel outpost" +$MAP_NAME_BY_ID[274] = "Dragons Throat outpost" +;~ Factions +$MAP_NAME_BY_ID[275] = "Guild Hall - Isle of Weeping Stone" +$MAP_NAME_BY_ID[276] = "Guild Hall - Isle of Jade" +$MAP_NAME_BY_ID[277] = "Harvest Temple" +$MAP_NAME_BY_ID[278] = "Breaker Hollow" +$MAP_NAME_BY_ID[279] = "Leviathan Pits" +$MAP_NAME_BY_ID[280] = "Isle of the Nameless" +$MAP_NAME_BY_ID[281] = "Zaishen Challenge outpost" +$MAP_NAME_BY_ID[282] = "Zaishen Elite outpost" +$MAP_NAME_BY_ID[283] = "Maatu Keep" +$MAP_NAME_BY_ID[284] = "Zin Ku Corridor" +$MAP_NAME_BY_ID[285] = "Monastery Overlook" +$MAP_NAME_BY_ID[286] = "Brauer Academy" +$MAP_NAME_BY_ID[287] = "Durheim Archives" +$MAP_NAME_BY_ID[288] = "Bai Paasu Reach" +$MAP_NAME_BY_ID[289] = "Seafarer's Rest" +$MAP_NAME_BY_ID[290] = "Bejunkan Pier" +$MAP_NAME_BY_ID[291] = "Vizunah Square Local Quarter" +$MAP_NAME_BY_ID[292] = "Vizunah Square Foreign Quarter" +$MAP_NAME_BY_ID[293] = "Fort Aspenwood - Luxon" +$MAP_NAME_BY_ID[294] = "Fort Aspenwood - Kurzick" +$MAP_NAME_BY_ID[295] = "The Jade Quarry - Luxon" +$MAP_NAME_BY_ID[296] = "The Jade Quarry - Kurzick" +$MAP_NAME_BY_ID[297] = "Unwaking Waters Luxon" +$MAP_NAME_BY_ID[298] = "Unwaking Waters Kurzick" +$MAP_NAME_BY_ID[300] = "Etnaran Keys" +$MAP_NAME_BY_ID[301] = "Raisu Pavillion" +$MAP_NAME_BY_ID[302] = "Kaineng Docks" +$MAP_NAME_BY_ID[303] = "The Marketplace" +$MAP_NAME_BY_ID[307] = "The Deep outpost" +$MAP_NAME_BY_ID[308] = "Ascalon Arena" +$MAP_NAME_BY_ID[309] = "Annihilation" +$MAP_NAME_BY_ID[310] = "Kill Count Training" +$MAP_NAME_BY_ID[311] = "Annihilation" +$MAP_NAME_BY_ID[312] = "Obelisk Annihilation Training" +$MAP_NAME_BY_ID[313] = "Saoshang Trail" +$MAP_NAME_BY_ID[314] = "Shiverpeak Arena" +$MAP_NAME_BY_ID[318] = "D'Alessio Arena" +$MAP_NAME_BY_ID[319] = "Amnoon Arena" +$MAP_NAME_BY_ID[320] = "Fort Koga" +$MAP_NAME_BY_ID[321] = "Heroes' Crypt" +$MAP_NAME_BY_ID[322] = "Shiverpeak Arena" +$MAP_NAME_BY_ID[328] = "Saltspray Beach - Luxon" +$MAP_NAME_BY_ID[329] = "Saltspray Beach - Kurzick" +$MAP_NAME_BY_ID[330] = "Heroes Ascent outpost" +$MAP_NAME_BY_ID[331] = "Grenz Frontier - Luxon" +$MAP_NAME_BY_ID[332] = "Grenz Frontier - Kurzick" +$MAP_NAME_BY_ID[333] = "The Ancestral Lands - Luxon" +$MAP_NAME_BY_ID[334] = "The Ancestral Lands - Kurzick" +$MAP_NAME_BY_ID[335] = "Etnaran Keys - Luxon" +$MAP_NAME_BY_ID[336] = "Etnaran Keys - Kurzick" +$MAP_NAME_BY_ID[337] = "Kaanai Canyon - Luxon" +$MAP_NAME_BY_ID[338] = "Kaanai Canyon - Kurzick" +$MAP_NAME_BY_ID[339] = "D'Alessio Arena" +$MAP_NAME_BY_ID[340] = "Amnoon Arena" +$MAP_NAME_BY_ID[341] = "Fort Koga" +$MAP_NAME_BY_ID[342] = "Heroes' Crypt" +$MAP_NAME_BY_ID[343] = "Shiverpeak Arena" +$MAP_NAME_BY_ID[344] = "The Hall of Heroes" +$MAP_NAME_BY_ID[345] = "The Courtyard" +$MAP_NAME_BY_ID[346] = "Scarred Earth" +$MAP_NAME_BY_ID[347] = "The Underworld Explorable" +$MAP_NAME_BY_ID[348] = "Tanglewood Copse" +$MAP_NAME_BY_ID[349] = "Saint Anjeka's Shrine" +$MAP_NAME_BY_ID[350] = "Eredon Terrace" +$MAP_NAME_BY_ID[351] = "Divine Path" +$MAP_NAME_BY_ID[352] = "Brawler's Pit" +$MAP_NAME_BY_ID[353] = "Petrified Arena" +$MAP_NAME_BY_ID[354] = "Seabed Arena" +$MAP_NAME_BY_ID[355] = "Isle of Weeping Stone" +$MAP_NAME_BY_ID[356] = "Isle of Jade" +$MAP_NAME_BY_ID[357] = "Imperial Isle" +$MAP_NAME_BY_ID[358] = "Isle of Meditation" +$MAP_NAME_BY_ID[359] = "Guild Hall - Imperial Isle" +$MAP_NAME_BY_ID[360] = "Guild Hall - Isle of Meditation" +$MAP_NAME_BY_ID[361] = "Isle of Weeping Stone" +$MAP_NAME_BY_ID[362] = "Isle of Jade" +$MAP_NAME_BY_ID[363] = "Imperial Isle" +$MAP_NAME_BY_ID[364] = "Isle of Meditation" +$MAP_NAME_BY_ID[368] = "Dragon Arena outpost" +$MAP_NAME_BY_ID[369] = "Jahai Bluffs" +$MAP_NAME_BY_ID[371] = "Marga Coast" +$MAP_NAME_BY_ID[373] = "Sunward Marches" +$MAP_NAME_BY_ID[375] = "Barbarous Shore" +$MAP_NAME_BY_ID[376] = "Camp Hojanu" +$MAP_NAME_BY_ID[377] = "Bahdok Caverns" +$MAP_NAME_BY_ID[378] = "Wehhan Terraces" +$MAP_NAME_BY_ID[379] = "Dejarin Estate" +$MAP_NAME_BY_ID[380] = "Arkjok Ward" +$MAP_NAME_BY_ID[381] = "Yohlon Haven" +$MAP_NAME_BY_ID[382] = "Gandara, the Moon Fortress" +$MAP_NAME_BY_ID[384] = "The Floodplain of Mahnkelon" +$MAP_NAME_BY_ID[385] = "Lion's Arch during Sunspears in Kryta" +$MAP_NAME_BY_ID[386] = "Turai's Procession" +$MAP_NAME_BY_ID[387] = "Sunspear Sanctuary" +$MAP_NAME_BY_ID[388] = "Aspenwood Gate - Kurzick" +$MAP_NAME_BY_ID[389] = "Aspenwood Gate - Luxon" +$MAP_NAME_BY_ID[390] = "Jade Flats Kurzick" +$MAP_NAME_BY_ID[391] = "Jade Flats Luxon" +$MAP_NAME_BY_ID[392] = "Yatendi Canyons" +$MAP_NAME_BY_ID[393] = "Chantry of Secrets" +$MAP_NAME_BY_ID[394] = "Garden of Seborhin" +$MAP_NAME_BY_ID[396] = "Mihanu Township" +$MAP_NAME_BY_ID[397] = "Vehjin Mines" +$MAP_NAME_BY_ID[398] = "Basalt Grotto" +$MAP_NAME_BY_ID[399] = "Forum Highlands" +$MAP_NAME_BY_ID[400] = "Kaineng Center during Sunspears in Cantha" +$MAP_NAME_BY_ID[402] = "Resplendent Makuun" +$MAP_NAME_BY_ID[403] = "Honur Hill" +$MAP_NAME_BY_ID[404] = "Wilderness of Bahdza" +$MAP_NAME_BY_ID[406] = "Vehtendi Valley" +$MAP_NAME_BY_ID[407] = "Yahnur Market" +$MAP_NAME_BY_ID[413] = "The Hidden City of Ahdashim" +$MAP_NAME_BY_ID[414] = "The Kodash Bazaar" +$MAP_NAME_BY_ID[415] = "Lion's gate" +$MAP_NAME_BY_ID[419] = "The Mirror of Lyss" +$MAP_NAME_BY_ID[420] = "Secure the Refuge" +$MAP_NAME_BY_ID[421] = "Venta Cemetery outpost" +$MAP_NAME_BY_ID[422] = "Bad Tide Rising, Kamadan Explorable" +$MAP_NAME_BY_ID[424] = "Kodonur Crossroads outpost" +$MAP_NAME_BY_ID[425] = "Rilohn Refuge outpost" +$MAP_NAME_BY_ID[426] = "Pogahn Passage outpost" +$MAP_NAME_BY_ID[427] = "Moddok Crevice outpost" +$MAP_NAME_BY_ID[428] = "Tihark Orchard outpost" +$MAP_NAME_BY_ID[429] = "Consulate" +$MAP_NAME_BY_ID[430] = "Plains of Jarin" +$MAP_NAME_BY_ID[431] = "Sunspear Great Hall" +$MAP_NAME_BY_ID[432] = "Cliffs of Dohjok" +$MAP_NAME_BY_ID[433] = "Dzagonur Bastion outpost" +$MAP_NAME_BY_ID[434] = "Dasha Vestibule outpost" +$MAP_NAME_BY_ID[435] = "Grand Court of Sebelkeh outpost" +$MAP_NAME_BY_ID[436] = "Command Post" +$MAP_NAME_BY_ID[437] = "Joko's Domain" +$MAP_NAME_BY_ID[438] = "Bone Palace" +$MAP_NAME_BY_ID[439] = "The Ruptured Heart" +$MAP_NAME_BY_ID[440] = "The Mouth of Torment" +$MAP_NAME_BY_ID[441] = "The Shattered Ravines" +$MAP_NAME_BY_ID[442] = "Lair of the Forgotten" +$MAP_NAME_BY_ID[443] = "Poisoned Outcrops" +$MAP_NAME_BY_ID[444] = "The Sulfurous Wastes" +$MAP_NAME_BY_ID[445] = "The Ebony Citadel of Mallyx" +$MAP_NAME_BY_ID[446] = "The Alkali Pan" +$MAP_NAME_BY_ID[447] = "A Land of Heroes" +$MAP_NAME_BY_ID[448] = "Crystal Overlook" +$MAP_NAME_BY_ID[449] = "Kamadan Jewel of Istan" +$MAP_NAME_BY_ID[450] = "Gate of Torment" +$MAP_NAME_BY_ID[455] = "Nightfallen Garden" +$MAP_NAME_BY_ID[456] = "Chuurhir Fields" +$MAP_NAME_BY_ID[457] = "Beknur Harbor" +$MAP_NAME_BY_ID[461] = "The Underworld" +$MAP_NAME_BY_ID[462] = "Heart of Abaddon" +$MAP_NAME_BY_ID[463] = "The Underworld" +$MAP_NAME_BY_ID[465] = "Nightfallen Jahai" +$MAP_NAME_BY_ID[466] = "Depths of Madness" +$MAP_NAME_BY_ID[467] = "Rollerbeetle Racing outpost" +$MAP_NAME_BY_ID[468] = "Domain of Fear" +$MAP_NAME_BY_ID[469] = "Gate of Fear" +$MAP_NAME_BY_ID[470] = "Domain of Pain" +$MAP_NAME_BY_ID[471] = "Bloodstone Fen Explorable" +$MAP_NAME_BY_ID[472] = "Domain of Secrets" +$MAP_NAME_BY_ID[473] = "Gate of Secrets" +$MAP_NAME_BY_ID[474] = "Domain of Anguish" +$MAP_NAME_BY_ID[476] = "Jennurs Horde outpost" +$MAP_NAME_BY_ID[477] = "Nundu Bay outpost" +$MAP_NAME_BY_ID[478] = "Gate of Desolation outpost" +$MAP_NAME_BY_ID[479] = "Champions Dawn" +$MAP_NAME_BY_ID[480] = "Ruins of Morah outpost" +$MAP_NAME_BY_ID[481] = "Fahranur, The First City" +$MAP_NAME_BY_ID[482] = "Bjora Marches" +$MAP_NAME_BY_ID[483] = "Zehlon Reach" +$MAP_NAME_BY_ID[484] = "Lahteda Bog" +$MAP_NAME_BY_ID[485] = "Arbor Bay" +$MAP_NAME_BY_ID[486] = "Issnur Isles" +$MAP_NAME_BY_ID[487] = "Beknur Harbor" +$MAP_NAME_BY_ID[488] = "Mehtani Keys" +$MAP_NAME_BY_ID[489] = "Kodlonu Hamlet" +$MAP_NAME_BY_ID[490] = "Island of Shehkah" +$MAP_NAME_BY_ID[491] = "Jokanur Diggings outpost" +$MAP_NAME_BY_ID[492] = "Blacktide Den outpost" +$MAP_NAME_BY_ID[493] = "Consulate Docks outpost" +$MAP_NAME_BY_ID[494] = "Gate of Pain outpost" +$MAP_NAME_BY_ID[495] = "Gate of Madness outpost" +$MAP_NAME_BY_ID[496] = "Abaddons Gate outpost" +$MAP_NAME_BY_ID[497] = "Sunspear Arena outpost" +$MAP_NAME_BY_ID[499] = "Ice Cliff Chasms" +$MAP_NAME_BY_ID[500] = "Bokka Amphitheatre" +$MAP_NAME_BY_ID[501] = "Riven Earth" +$MAP_NAME_BY_ID[502] = "The Astralarium" +$MAP_NAME_BY_ID[503] = "Throne of Secrets" +$MAP_NAME_BY_ID[504] = "Churranu Island Arena" +$MAP_NAME_BY_ID[505] = "Shing Jea Monastery mission" +$MAP_NAME_BY_ID[506] = "Haiju Lagoon mission" +$MAP_NAME_BY_ID[507] = "Jaya Bluffs mission" +$MAP_NAME_BY_ID[508] = "Seitung Harbor mission" +$MAP_NAME_BY_ID[509] = "Tsumei Village mission" +$MAP_NAME_BY_ID[510] = "Seitung Harbor mission 2" +$MAP_NAME_BY_ID[511] = "Tsumei Village mission 2" +$MAP_NAME_BY_ID[513] = "Drakkar Lake" +$MAP_NAME_BY_ID[529] = "Guild Hall - Uncharted Isle" +$MAP_NAME_BY_ID[530] = "Guild Hall - Isle of Wurms" +$MAP_NAME_BY_ID[531] = "Uncharted Isle" +$MAP_NAME_BY_ID[532] = "Isle of Wurms" +$MAP_NAME_BY_ID[533] = "Uncharted Isle" +$MAP_NAME_BY_ID[534] = "Isle of Wurms" +$MAP_NAME_BY_ID[536] = "Sunspear Arena" +$MAP_NAME_BY_ID[537] = "Guild Hall - Corrupted Isle" +$MAP_NAME_BY_ID[538] = "Guild Hall - Isle of Solitude" +$MAP_NAME_BY_ID[539] = "Corrupted Isle" +$MAP_NAME_BY_ID[540] = "Isle of Solitude" +$MAP_NAME_BY_ID[541] = "Corrupted Isle" +$MAP_NAME_BY_ID[542] = "Isle of Solitude" +$MAP_NAME_BY_ID[543] = "Sun Docks" +$MAP_NAME_BY_ID[544] = "Chahbek Village outpost" +$MAP_NAME_BY_ID[545] = "Remains of Sahlahja outpost" +$MAP_NAME_BY_ID[546] = "Jaga Moraine" +$MAP_NAME_BY_ID[547] = "Bombardment" +$MAP_NAME_BY_ID[548] = "Norrhart Moains" +$MAP_NAME_BY_ID[549] = "Hero Battles outpost" +$MAP_NAME_BY_ID[550] = "The Beachhead" +$MAP_NAME_BY_ID[551] = "The Crossing" +$MAP_NAME_BY_ID[552] = "Desert Sands" +$MAP_NAME_BY_ID[553] = "Varajar Fells" +$MAP_NAME_BY_ID[554] = "Dajkah Inlet outpost" +$MAP_NAME_BY_ID[555] = "The Shadow Nexus outpost" +$MAP_NAME_BY_ID[558] = "Sparkfly Swamp" +$MAP_NAME_BY_ID[559] = "Gate of the Nightfallen Lands" +$MAP_NAME_BY_ID[560] = "Cathedral of Flames" +$MAP_NAME_BY_ID[561] = "The Troubled Keeper" +$MAP_NAME_BY_ID[566] = "Verdant Cascades" +$MAP_NAME_BY_ID[567] = "Cathedral of Flames" +$MAP_NAME_BY_ID[568] = "Cathedral of Flames" +$MAP_NAME_BY_ID[569] = "Magus Stones" +$MAP_NAME_BY_ID[570] = "Catacombs of Kathandrax" +$MAP_NAME_BY_ID[571] = "Catacombs of Kathandrax" +$MAP_NAME_BY_ID[572] = "Alcazia Tangle" +$MAP_NAME_BY_ID[573] = "Rragar's Menagerie" +$MAP_NAME_BY_ID[574] = "Rragar's Menagerie" +$MAP_NAME_BY_ID[575] = "Rragar's Menagerie" +$MAP_NAME_BY_ID[576] = "Ooza Pit" +$MAP_NAME_BY_ID[577] = "Slaver's Exile" +$MAP_NAME_BY_ID[578] = "Oola's Lab" +$MAP_NAME_BY_ID[579] = "Oola's Lab" +$MAP_NAME_BY_ID[580] = "Oola's Lab" +$MAP_NAME_BY_ID[581] = "Shards of Oor" +$MAP_NAME_BY_ID[582] = "Shards of Oor" +$MAP_NAME_BY_ID[583] = "Shards of Oor" +$MAP_NAME_BY_ID[584] = "Arachni's Haunt" +$MAP_NAME_BY_ID[585] = "Arachni's Haunt" +$MAP_NAME_BY_ID[593] = "Fetid River" +$MAP_NAME_BY_ID[596] = "Forgotten Shrines" +$MAP_NAME_BY_ID[598] = "Antechamber" +$MAP_NAME_BY_ID[604] = "Vloxen Excavations" +$MAP_NAME_BY_ID[605] = "Vloxen Excavations" +$MAP_NAME_BY_ID[606] = "Vloxen Excavations" +$MAP_NAME_BY_ID[607] = "Heart of the Shiverpeaks" +$MAP_NAME_BY_ID[608] = "Heart of the Shiverpeaks" +$MAP_NAME_BY_ID[609] = "Heart of the Shiverpeaks" +$MAP_NAME_BY_ID[612] = "Bloodstone Caves" +$MAP_NAME_BY_ID[613] = "Bloodstone Caves" +$MAP_NAME_BY_ID[614] = "Bloodstone Caves" +$MAP_NAME_BY_ID[615] = "Bogroot Growths" +$MAP_NAME_BY_ID[616] = "Bogroot Growths" +$MAP_NAME_BY_ID[617] = "Raven's Point" +$MAP_NAME_BY_ID[618] = "Raven's Point" +$MAP_NAME_BY_ID[619] = "Raven's Point" +$MAP_NAME_BY_ID[620] = "Slaver's Exile" +$MAP_NAME_BY_ID[621] = "Slaver's Exile" +$MAP_NAME_BY_ID[622] = "Slaver's Exile" +$MAP_NAME_BY_ID[623] = "Slaver's Exile" +$MAP_NAME_BY_ID[624] = "Vlox's Falls" +$MAP_NAME_BY_ID[625] = "Battledepths" +$MAP_NAME_BY_ID[628] = "Sepulchre of Dragrimmar" +$MAP_NAME_BY_ID[629] = "Sepulchre of Dragrimmar" +$MAP_NAME_BY_ID[630] = "Frostmaw's Burrows" +$MAP_NAME_BY_ID[631] = "Frostmaw's Burrows" +$MAP_NAME_BY_ID[632] = "Frostmaw's Burrows" +$MAP_NAME_BY_ID[633] = "Frostmaw's Burrows" +$MAP_NAME_BY_ID[634] = "Frostmaw's Burrows" +$MAP_NAME_BY_ID[635] = "Darkrime Delves" +$MAP_NAME_BY_ID[636] = "Darkrime Delves" +$MAP_NAME_BY_ID[637] = "Darkrime Delves" +$MAP_NAME_BY_ID[638] = "Gadd's Encampment" +$MAP_NAME_BY_ID[639] = "Umbral Grotto" +$MAP_NAME_BY_ID[640] = "Rata Sum" +$MAP_NAME_BY_ID[641] = "Tarnished Haven" +$MAP_NAME_BY_ID[642] = "Eye of the North outpost" +$MAP_NAME_BY_ID[643] = "Sifhalla" +$MAP_NAME_BY_ID[644] = "Gunnar's Hold" +$MAP_NAME_BY_ID[645] = "Olafstead" +$MAP_NAME_BY_ID[646] = "Hall of Monuments" +$MAP_NAME_BY_ID[647] = "Dalada Uplands" +$MAP_NAME_BY_ID[648] = "Doomlore Shrine" +$MAP_NAME_BY_ID[649] = "Grothmar Wardowns" +$MAP_NAME_BY_ID[650] = "Longeye's Ledge" +$MAP_NAME_BY_ID[651] = "Sacnoth Valley" +$MAP_NAME_BY_ID[652] = "Central Transfer Chamber" +$MAP_NAME_BY_ID[653] = "Curse of the Nornbear" +$MAP_NAME_BY_ID[654] = "Blood Washes Blood" +$MAP_NAME_BY_ID[655] = "A Gate Too Far" +$MAP_NAME_BY_ID[656] = "A Gate Too Far" +$MAP_NAME_BY_ID[657] = "A Gate Too Far" +$MAP_NAME_BY_ID[658] = "The Elusive Golemancer" +$MAP_NAME_BY_ID[659] = "The Elusive Golemancer" +$MAP_NAME_BY_ID[660] = "The Elusive Golemancer" +$MAP_NAME_BY_ID[661] = "Finding the Bloodstone" +$MAP_NAME_BY_ID[662] = "Finding the Bloodstone" +$MAP_NAME_BY_ID[663] = "Finding the Bloodstone" +$MAP_NAME_BY_ID[664] = "Genius Operated Living Enchanted Manifestation" +$MAP_NAME_BY_ID[665] = "Against the Charr" +$MAP_NAME_BY_ID[666] = "Warband of Brothers" +$MAP_NAME_BY_ID[667] = "Warband of Brothers" +$MAP_NAME_BY_ID[668] = "Warband of Brothers" +$MAP_NAME_BY_ID[669] = "Assault the Stronghold" +$MAP_NAME_BY_ID[670] = "Destruction's Depths" +$MAP_NAME_BY_ID[671] = "Destruction's Depths" +$MAP_NAME_BY_ID[672] = "Destruction's Depths" +$MAP_NAME_BY_ID[673] = "A Time for Heroes" +$MAP_NAME_BY_ID[674] = "Warband Training" +$MAP_NAME_BY_ID[675] = "Boreal Station" +$MAP_NAME_BY_ID[676] = "Catacombs of Kathandrax" +$MAP_NAME_BY_ID[678] = "Attack of the Nornbear" +$MAP_NAME_BY_ID[686] = "Polymock Coliseum" +$MAP_NAME_BY_ID[687] = "Polymock Glacier" +$MAP_NAME_BY_ID[688] = "Polymock Crossing" +$MAP_NAME_BY_ID[690] = "Cold As Ice" +$MAP_NAME_BY_ID[691] = "Beneath Lion's Arch" +$MAP_NAME_BY_ID[692] = "Tunnels Below Cantha" +$MAP_NAME_BY_ID[693] = "Caverns Below Kamadan" +$MAP_NAME_BY_ID[695] = "Service: In Defense of the Eye" +$MAP_NAME_BY_ID[696] = "Mano a Norn-o" +$MAP_NAME_BY_ID[697] = "Service: Practice, Dummy" +$MAP_NAME_BY_ID[698] = "Hero Tutorial" +$MAP_NAME_BY_ID[700] = "The Norn Fighting Tournament" +$MAP_NAME_BY_ID[701] = "Secret Lair of the Snowmen" +$MAP_NAME_BY_ID[702] = "Norn Brawling Championship" +$MAP_NAME_BY_ID[703] = "Kilroy's Punchout Training" +$MAP_NAME_BY_ID[704] = "Fronis Irontoe's Lair" +$MAP_NAME_BY_ID[705] = "The Justiciar's End" +$MAP_NAME_BY_ID[707] = "The Great Norn Alemoot" +$MAP_NAME_BY_ID[708] = "Varajar Fells" +$MAP_NAME_BY_ID[710] = "Epilogue" +$MAP_NAME_BY_ID[711] = "Insidious Remnants" +$MAP_NAME_BY_ID[717] = "Attack on Jalis's Camp" +$MAP_NAME_BY_ID[721] = "Costume Brawl outpost" +$MAP_NAME_BY_ID[722] = "Whitefury Rapids" +$MAP_NAME_BY_ID[723] = "Kysten Shore" +$MAP_NAME_BY_ID[724] = "Deepway Ruins" +$MAP_NAME_BY_ID[725] = "Plikkup Works" +$MAP_NAME_BY_ID[726] = "Kilroy's Punchout Tournamet" +$MAP_NAME_BY_ID[727] = "Special Ops: Flame Temple Corridor" +$MAP_NAME_BY_ID[728] = "Special Ops: Dragon Gullet" +$MAP_NAME_BY_ID[729] = "Special Ops: Gendich Courthouse" +$MAP_NAME_BY_ID[770] = "The Tengu Accords" +$MAP_NAME_BY_ID[771] = "The battle of Jahai" +$MAP_NAME_BY_ID[772] = "The Flight North" +$MAP_NAME_BY_ID[773] = "The Rise of the White Mantle" +$MAP_NAME_BY_ID[781] = "Secret Lair of the Snowmen" +$MAP_NAME_BY_ID[782] = "Secret Lair of the Snowmen" +$MAP_NAME_BY_ID[783] = "Droknar's Forge Explorable" +$MAP_NAME_BY_ID[784] = "Isle of the Nameless" +$MAP_NAME_BY_ID[788] = "Deactivating R.O.X" +$MAP_NAME_BY_ID[789] = "Deactivating P.O.X" +$MAP_NAME_BY_ID[790] = "Deactivating N.O.X" +$MAP_NAME_BY_ID[791] = "Secret Underground Lair" +$MAP_NAME_BY_ID[792] = "Golem Tutorial Simulation" +$MAP_NAME_BY_ID[793] = "Snowball Dominance" +$MAP_NAME_BY_ID[794] = "Zaishen Menagerie Grounds" +$MAP_NAME_BY_ID[795] = "Zaishen Menagerie outpost" +$MAP_NAME_BY_ID[796] = "Codex Arena outpost" +$MAP_NAME_BY_ID[806] = "The Underworld: Something Wicked This Way Comes" +$MAP_NAME_BY_ID[807] = "The Underworld: Don't Fear the Reapers" +$MAP_NAME_BY_ID[808] = "Lions Arch - Halloween" +$MAP_NAME_BY_ID[809] = "Lions Arch - Wintersday" +$MAP_NAME_BY_ID[810] = "Lions Arch - Canthan New Year" +$MAP_NAME_BY_ID[811] = "Ascalon City - Wintersday" +$MAP_NAME_BY_ID[812] = "Droknars Forge - Halloween" +$MAP_NAME_BY_ID[813] = "Droknars Forge - Wintersday" +$MAP_NAME_BY_ID[814] = "Tomb of the Primeval Kings - Halloween" +$MAP_NAME_BY_ID[815] = "Shing Jea Monastery - Dragon Festival" +$MAP_NAME_BY_ID[816] = "Shing Jea Monastery - Canthan New Year" +$MAP_NAME_BY_ID[817] = "Kaineng Center" +$MAP_NAME_BY_ID[818] = "Kamadan Jewel of Istan - Halloween" +$MAP_NAME_BY_ID[819] = "Kamadan Jewel of Istan - Wintersday" +$MAP_NAME_BY_ID[820] = "Kamadan Jewel of Istan - Canthan New Year" +$MAP_NAME_BY_ID[821] = "Eye of the North outpost - Wintersday" +$MAP_NAME_BY_ID[837] = "War in Kryta: Talmark Wilderness" +$MAP_NAME_BY_ID[838] = "Trial of Zinn" +$MAP_NAME_BY_ID[839] = "Divinity Coast Explorable" +$MAP_NAME_BY_ID[840] = "Lion's Arch Keep" +$MAP_NAME_BY_ID[841] = "D'Alessio Seaboard Explorable" +$MAP_NAME_BY_ID[842] = "The Battle for Lion's Arch Explorable" +$MAP_NAME_BY_ID[843] = "Riverside Province Explorable" +$MAP_NAME_BY_ID[844] = "War in Kryta: Lion's Arch" +$MAP_NAME_BY_ID[845] = "The Masoleum" +$MAP_NAME_BY_ID[846] = "Rise" +$MAP_NAME_BY_ID[847] = "Shadows in the Jungle" +$MAP_NAME_BY_ID[848] = "A Vengeance of Blades" +$MAP_NAME_BY_ID[849] = "Auspicious Beginnings" +$MAP_NAME_BY_ID[854] = "Olfstead Explorable" +$MAP_NAME_BY_ID[855] = "The Great Snowball Fight of the Gods Operation: Crush Spirits" +$MAP_NAME_BY_ID[856] = "The Great Snowball Fight of the Gods Fighting in a Winter Wonderland" +$MAP_NAME_BY_ID[857] = "Embark Beach" +$MAP_NAME_BY_ID[860] = "What Waits in Shadow - Dragon's Throat Explorable" +$MAP_NAME_BY_ID[861] = "A Chance Encounter: Kaineng Center" +$MAP_NAME_BY_ID[862] = "Tracking the Corruption: Marketplace Explorable" +$MAP_NAME_BY_ID[863] = "Cantha Courier: Bukdek Byway" +$MAP_NAME_BY_ID[864] = "A Treaty's a Treaty: Tsumei Village" +$MAP_NAME_BY_ID[865] = "Deadly Cargo: Seitung Harbor Explorable" +$MAP_NAME_BY_ID[866] = "The Rescue Attempt: Tahnnakai Temple" +$MAP_NAME_BY_ID[867] = "Viloence in the Streets: Wajjun Bazaar" +$MAP_NAME_BY_ID[868] = "Sacred Psyche" +$MAP_NAME_BY_ID[869] = "Calling All Thugs: Shadow's Passage" +$MAP_NAME_BY_ID[870] = "Finding Jinnai: Altrumn Ruins" +$MAP_NAME_BY_ID[871] = "Raid on Shing Jea Monastery: Shing Jea Monastery" +$MAP_NAME_BY_ID[872] = "Raid on Kaineng Center: Kaineng Center" +$MAP_NAME_BY_ID[873] = "Ministry of Oppression: Wajjun Bazaar" +$MAP_NAME_BY_ID[874] = "The Final Confrontation" +$MAP_NAME_BY_ID[875] = "Lakeside County: 1070 AE" +$MAP_NAME_BY_ID[876] = "Ashford Catacombs: 1070 AE" +#EndRegion + +#Region Misc +Global Const $Sunday = "Sunday" +Global Const $Monday = "Monday" +Global Const $Tuesday = "Tuesday" +Global Const $Wednesday = "Wednesday" +Global Const $Thursday = "Thursday" +Global Const $Friday = "Friday" +Global Const $Saturday = "Saturday" + + +#EndRegion diff --git a/gwApi/emoting.au3 b/gwApi/emoting.au3 index 0058bcd..939c85f 100644 --- a/gwApi/emoting.au3 +++ b/gwApi/emoting.au3 @@ -1,54 +1,54 @@ -#include-once - -;~ Description: Randomly emotes 6 different emotes (dance, clap, excited, drum, flute and violin) -Func Emoting() - Switch (Random(1, 6, 1)) - Case 1 - Dance() - Case 2 - Clap() - Case 3 - Excited() - Case 4 - Drum() - Case 5 - Flute() - Case 6 - Violin() - EndSwitch -EndFunc ;==>Emoting - -;~ Description: Dance emote. -Func Dance() - SendChat('dance', '/') -EndFunc ;==>Dance - -;~ Description: Clap emote. -Func Clap() - SendChat('clap', '/') -EndFunc ;==>Clap - -;~ Description: Excited emote. -Func Excited() - SendChat('excited', '/') -EndFunc ;==>Excited - -;~ Description: Drum emote. -Func Drum() - SendChat('drum', '/') -EndFunc ;==>Drum - -;~ Description: Flute emote. -Func Flute() - SendChat('flute', '/') -EndFunc ;==>Flute - -;~ Description: Violin emote. -Func Violin() - SendChat('violin', '/') -EndFunc ;==>Violin - -;~ Description: Jump emote. -Func Jump() - SendChat('jump', '/') -EndFunc ;==>Jump \ No newline at end of file +#include-once + +;~ Description: Randomly emotes 6 different emotes (dance, clap, excited, drum, flute and violin) +Func Emoting() + Switch (Random(1, 6, 1)) + Case 1 + Dance() + Case 2 + Clap() + Case 3 + Excited() + Case 4 + Drum() + Case 5 + Flute() + Case 6 + Violin() + EndSwitch +EndFunc ;==>Emoting + +;~ Description: Dance emote. +Func Dance() + SendChat('dance', '/') +EndFunc ;==>Dance + +;~ Description: Clap emote. +Func Clap() + SendChat('clap', '/') +EndFunc ;==>Clap + +;~ Description: Excited emote. +Func Excited() + SendChat('excited', '/') +EndFunc ;==>Excited + +;~ Description: Drum emote. +Func Drum() + SendChat('drum', '/') +EndFunc ;==>Drum + +;~ Description: Flute emote. +Func Flute() + SendChat('flute', '/') +EndFunc ;==>Flute + +;~ Description: Violin emote. +Func Violin() + SendChat('violin', '/') +EndFunc ;==>Violin + +;~ Description: Jump emote. +Func Jump() + SendChat('jump', '/') +EndFunc ;==>Jump diff --git a/gwApi/faction.au3 b/gwApi/faction.au3 index 88dbcd7..047cfda 100644 --- a/gwApi/faction.au3 +++ b/gwApi/faction.au3 @@ -1,60 +1,61 @@ -#include-once - -#Region Donate -;~ Description: Donate Kurzick or Luxon faction. -Func DonateFaction($aFaction) - If StringLeft($aFaction, 1) = 'k' Then - Return SendPacket(0x10, 0x2F, 0, 0, 5000) - Else - Return SendPacket(0x10, 0x2F, 0, 1, 5000) - EndIf -EndFunc ;==>DonateFaction -#EndRegion - -#Region Kurzick -;~ Description: Returns current Kurzick faction. -Func GetKurzickFaction() - Return MemoryRead($mBasePtr182C + 0x748) -EndFunc ;==>GetKurzickFaction - -;~ Description: Returns max Kurzick faction. -Func GetMaxKurzickFaction() - Return MemoryRead($mBasePtr182C + 0x7B8) -EndFunc ;==>GetMaxKurzickFaction -#EndRegion - -#Region Luxon -;~ Description: Returns current Luxon faction. -Func GetLuxonFaction() - Return MemoryRead($mBasePtr182C + 0x758) -EndFunc ;==>GetLuxonFaction - -;~ Description: Returns max Luxon faction. -Func GetMaxLuxonFaction() - Return MemoryRead($mBasePtr182C + 0x7BC) -EndFunc ;==>GetMaxLuxonFaction -#EndRegion - -#Region Imperial -;~ Description: Returns current Imperial faction. -Func GetImperialFaction() - Return MemoryRead($mBasePtr182C + 0x76C) -EndFunc ;==>GetImperialFaction - -;~ Description: Returns max Imperial faction. -Func GetMaxImperialFaction() - Return MemoryRead($mBasePtr182C + 0x7C4) -EndFunc ;==>GetMaxImperialFaction -#EndRegion - -#Region Balth -;~ Description: Returns current Balthazar faction. -Func GetBalthazarFaction() - Return MemoryRead($mBasePtr182C + 0x798) -EndFunc ;==>GetBalthazarFaction - -;~ Description: Returns max Balthazar faction. -Func GetMaxBalthazarFaction() - Return MemoryRead($mBasePtr182C + 0x7C0) -EndFunc ;==>GetMaxBalthazarFaction -#EndRegion \ No newline at end of file + +#include-once + +#Region Donate +;~ Description: Donate Kurzick or Luxon faction. +Func DonateFaction($aFaction) + If StringLeft($aFaction, 1) = 'k' Then + Return SendPacket(0x10, $CtoGS_MSG_DonateFaction, 0, 0, 5000) ;~ old -> Return SendPacket(0x10, 0x2F, 0, 0, 5000) + Else + Return SendPacket(0x10, $CtoGS_MSG_DonateFaction, 0, 1, 5000) ;~ old -> Return SendPacket(0x10, 0x2F, 0, 1, 5000) + EndIf +EndFunc ;==>DonateFaction +#EndRegion + +#Region Kurzick +;~ Description: Returns current Kurzick faction. +Func GetKurzickFaction() + Return MemoryRead($mBasePtr182C + 0x748) +EndFunc ;==>GetKurzickFaction + +;~ Description: Returns max Kurzick faction. +Func GetMaxKurzickFaction() + Return MemoryRead($mBasePtr182C + 0x7B8) +EndFunc ;==>GetMaxKurzickFaction +#EndRegion + +#Region Luxon +;~ Description: Returns current Luxon faction. +Func GetLuxonFaction() + Return MemoryRead($mBasePtr182C + 0x758) +EndFunc ;==>GetLuxonFaction + +;~ Description: Returns max Luxon faction. +Func GetMaxLuxonFaction() + Return MemoryRead($mBasePtr182C + 0x7BC) +EndFunc ;==>GetMaxLuxonFaction +#EndRegion + +#Region Imperial +;~ Description: Returns current Imperial faction. +Func GetImperialFaction() + Return MemoryRead($mBasePtr182C + 0x76C) +EndFunc ;==>GetImperialFaction + +;~ Description: Returns max Imperial faction. +Func GetMaxImperialFaction() + Return MemoryRead($mBasePtr182C + 0x7C4) +EndFunc ;==>GetMaxImperialFaction +#EndRegion + +#Region Balth +;~ Description: Returns current Balthazar faction. +Func GetBalthazarFaction() + Return MemoryRead($mBasePtr182C + 0x798) +EndFunc ;==>GetBalthazarFaction + +;~ Description: Returns max Balthazar faction. +Func GetMaxBalthazarFaction() + Return MemoryRead($mBasePtr182C + 0x7C0) +EndFunc ;==>GetMaxBalthazarFaction +#EndRegion diff --git a/gwApi/gwAPI_basics.au3 b/gwApi/gwAPI_basics.au3 index 071d8a8..73b0ae1 100644 --- a/gwApi/gwAPI_basics.au3 +++ b/gwApi/gwAPI_basics.au3 @@ -1,2793 +1,2909 @@ -#include-once - -#Region CommandStructs -; Commands -Local $mPacket = DllStructCreate('ptr;dword;dword;dword;dword;dword;dword;dword;dword;dword;dword;dword;dword') -Local $mPacketPtr = DllStructGetPtr($mPacket) - -Local $mAction = DllStructCreate('ptr;dword;dword') -Local $mActionPtr = DllStructGetPtr($mAction) - -Local $mUseSkill = DllStructCreate('ptr;dword;dword;dword') -Local $mUseSkillPtr = DllStructGetPtr($mUseSkill) - -Local $mMove = DllStructCreate('ptr;float;float;float') -Local $mMovePtr = DllStructGetPtr($mMove) - -Local $mChangeTarget = DllStructCreate('ptr;dword') -Local $mChangeTargetPtr = DllStructGetPtr($mChangeTarget) - -Local $mToggleLanguage = DllStructCreate('ptr;dword') -Local $mToggleLanguagePtr = DllStructGetPtr($mToggleLanguage) - -Local $mUseHeroSkill = DllStructCreate('ptr;dword;dword;dword') -Local $mUseHeroSkillPtr = DllStructGetPtr($mUseHeroSkill) - -Local $mUpdateAgentPos = DllStructCreate('ptr;dword;dword;dword;dword;dword;dword') -Local $mUpdateAgentPosPtr = DllStructGetPtr($mUpdateAgentPos) - -; Items -Local $mBuyItem = DllStructCreate('ptr;dword;dword;dword') -Local $mBuyItemPtr = DllStructGetPtr($mBuyItem) - -Local $mSellItem = DllStructCreate('ptr;dword;dword') -Local $mSellItemPtr = DllStructGetPtr($mSellItem) - -Local $mSalvage = DllStructCreate('ptr;dword;dword;dword') -Local $mSalvagePtr = DllStructGetPtr($mSalvage) - -Local $mOpenStorage = DllStructCreate('ptr;dword;dword;dword;dword') -Local $mOpenStoragePtr = DllStructGetPtr($mOpenStorage) - -Local $mGoNpc = DllStructCreate('ptr;dword;dword') -Local $mGoNpcPtr = DllStructGetPtr($mGoNpc) - -; Trader -Local $mTraderBuy = DllStructCreate('ptr') -Local $mTraderBuyPtr = DllStructGetPtr($mTraderBuy) - -Local $mTraderSell = DllStructCreate('ptr') -Local $mTraderSellPtr = DllStructGetPtr($mTraderSell) - -Local $mRequestQuote = DllStructCreate('ptr;dword') -Local $mRequestQuotePtr = DllStructGetPtr($mRequestQuote) - -Local $mRequestQuoteSell = DllStructCreate('ptr;dword') -Local $mRequestQuoteSellPtr = DllStructGetPtr($mRequestQuoteSell) - -; Chat -Local $mSendChat = DllStructCreate('ptr;dword') -Local $mSendChatPtr = DllStructGetPtr($mSendChat) - -Local $mWriteChat = DllStructCreate('ptr') -Local $mWriteChatPtr = DllStructGetPtr($mWriteChat) - -; Attributes -Local $mSetAttributes = DllStructCreate("ptr;dword;dword;dword;dword;dword[16];dword;dword[16]") -Local $mSetAttributesPtr = DllStructGetPtr($mSetAttributes) - -; Log -Local $mSkillLogStruct = DllStructCreate('dword;dword;dword;float') -Local $mSkillLogStructPtr = DllStructGetPtr($mSkillLogStruct) - -Local $mChatLogStruct = DllStructCreate('dword;wchar[256]') -Local $mChatLogStructPtr = DllStructGetPtr($mChatLogStruct) -#EndRegion CommandStructs - -#Region Memory -;~ Description: Open existing local process object. -Func MemoryOpen($aPID) - $mKernelHandle = DllOpen('kernel32.dll') - Local $lOpenProcess = DllCall($mKernelHandle, 'int', 'OpenProcess', 'int', 0x1F0FFF, 'int', 1, 'int', $aPID) - $mGWProcHandle = $lOpenProcess[0] - Return $lOpenProcess <> 0 -EndFunc ;==>MemoryOpen - -;~ Description: Closes process handle opened with MemoryOpen. -Func MemoryClose() - DllCall($mKernelHandle, 'int', 'CloseHandle', 'int', $mGWProcHandle) - DllClose($mKernelHandle) -EndFunc ;==>MemoryClose - -;~ Description: Write a binarystring to an address inside opened process. -Func WriteBinary($aBinaryString, $aAddress, $aRestore = True) - $aBinaryString = BinaryToString('0x' & $aBinaryString) - Local $lSize = BinaryLen($aBinaryString) - Local $lData = DllStructCreate('byte[' & $lSize & ']') - If $aRestore Then - MemoryReadToStruct($aAddress, $lData) - AddRestoreDict($aAddress, DllStructGetData($lData, 1)) - EndIf - DllStructSetData($lData, 1, $aBinaryString) - Local $lRet = DllCall($mKernelHandle, 'int', 'WriteProcessMemory', 'handle', $mGWProcHandle, 'ptr', $aAddress, 'ptr', DllStructGetPtr($lData), 'ulong_ptr', DllStructGetSize($lData), 'ulong_ptr*', 0) - Return SetExtended($lRet[5], $lRet <> 0) -EndFunc ;==>WriteBinary - -;~ Description: Writes data to specified address in opened process. -Func MemoryWrite($aAddress, $aData, $aType = 'dword', $aRestore = False) - Local $lBuffer = DllStructCreate($aType) - If $aRestore Then - MemoryReadToStruct($aAddress, $lBuffer) - AddRestoreDict($aAddress, $lBuffer) - EndIf - DllStructSetData($lBuffer, 1, $aData) - Local $lRet = DllCall($mKernelHandle, 'int', 'WriteProcessMemory', 'handle', $mGWProcHandle, 'ptr', $aAddress, 'ptr', DllStructGetPtr($lBuffer), 'ulong_ptr', DllStructGetSize($lBuffer), 'ulong_ptr*', 0) - Return SetExtended($lRet[5], $lRet <> 0) -EndFunc ;==>MemoryWrite - -;~ Description: Read process memory at specified address. -Func MemoryRead($aAddress, $aType = 'dword') - Local $lBuffer = DllStructCreate($aType) - DllCall($mKernelHandle, 'int', 'ReadProcessMemory', 'handle', $mGWProcHandle, 'ptr', $aAddress, 'ptr', DllStructGetPtr($lBuffer), 'ulong_ptr', DllStructGetSize($lBuffer), 'ulong_ptr*', 0) - Return DllStructGetData($lBuffer, 1) -EndFunc ;==>MemoryRead - -;~ Description: Read a chain of pointers. -Func MemoryReadPtr($aAddress, $aOffset, $aType = 'dword') - Local $lPointerCount = UBound($aOffset) - 2 - Local $lBuffer = DllStructCreate($aType) - For $i = 0 To $lPointerCount - $aAddress += $aOffset[$i] - DllCall($mKernelHandle, 'int', 'ReadProcessMemory', 'handle', $mGWProcHandle, 'ptr', $aAddress, 'ptr', DllStructGetPtr($lBuffer), 'ulong_ptr', DllStructGetSize($lBuffer), 'ulong_ptr*', 0) - $aAddress = DllStructGetData($lBuffer, 1) - If $aAddress = 0 Then - Local $lData[2] = [0, 0] - Return $lData - EndIf - Next - $aAddress += $aOffset[$lPointerCount + 1] - $lBuffer = DllStructCreate($aType) - DllCall($mKernelHandle, 'int', 'ReadProcessMemory', 'handle', $mGWProcHandle, 'ptr', $aAddress, 'ptr', DllStructGetPtr($lBuffer), 'ulong_ptr', DllStructGetSize($lBuffer), 'ulong_ptr*', 0) - Local $lData[2] = [$aAddress, DllStructGetData($lBuffer, 1)] - Return $lData -EndFunc ;==>MemoryReadPtr - -;~ Description: Same as MemoryReadPtr, but returns memoryread + last $aOffset instead of array. -;~ $aOffset = [0, 0x18, 0x2C, 0] returns memoryread at 0x2C -;~ $aOffset = [0, 0x18, 0x2C] returns memoryread at 0x18 and adds to that memoryread 0x2C -Func MemoryReadPtrChain($aAddress, $aOffset, $aType = 'dword') - Local $lPointerCount = UBound($aOffset) - 2 - Local $lBuffer = DllStructCreate($aType) - For $i = 0 To $lPointerCount - $aAddress += $aOffset[$i] - DllCall($mKernelHandle, 'int', 'ReadProcessMemory', 'handle', $mGWProcHandle, 'ptr', $aAddress, 'ptr', DllStructGetPtr($lBuffer), 'ulong_ptr', DllStructGetSize($lBuffer), 'ulong_ptr', 0) - $aAddress = DllStructGetData($lBuffer, 1) - If $aAddress = 0 Then - Local $lData[2] = [0, 0] - Return $lData - EndIf - Next - $aAddress += $aOffset[$lPointerCount + 1] - Return Ptr($aAddress) -EndFunc ;==>MemoryReadPtrChain - -;~ Description: Converts little endian to big endian and vice versa. -Func SwapEndian($aHex) - If IsString($aHex) Then - $aHex = StringReplace($aHex, '0x', '', 1) - Return Hex(Binary(Dec($aHex))) - Else - Return Hex(Binary($aHex)) - EndIf -EndFunc ;==>SwapEndian - -;~ Description: Converts little endian to big endian and vice versa. -Func SwapEndianOld($aHex) - Return StringMid($aHex, 7, 2) & StringMid($aHex, 5, 2) & StringMid($aHex, 3, 2) & StringMid($aHex, 1, 2) -EndFunc ;==>SwapEndian - -;~ Description: Enqueue a pointer to data to be written to process memory. -Func Enqueue($aPtr, $aSize) - If MemoryRead($mLoggedIn) <= 0 Then Return False - Local $lRet = DllCall($mKernelHandle, 'int', 'WriteProcessMemory', 'handle', $mGWProcHandle, 'ptr', 256 * $mQueueCounter + $mQueueBase, 'ptr', $aPtr, 'ulong_ptr', $aSize, 'ulong_ptr*', 0) - If $mQueueCounter = $mQueueSize Then - $mQueueCounter = 0 - Else - $mQueueCounter = $mQueueCounter + 1 - EndIf - Return SetExtended($lRet[5], $lRet <> 0) -EndFunc ;==>Enqueue - -;~ Description: Reads consecutive values from memory to buffer struct. -;~ Author: 4D1. -Func MemoryReadStruct($aAddress, $aStruct = 'dword') - Local $lBuffer = DllStructCreate($aStruct) - DllCall($mKernelHandle, 'int', 'ReadProcessMemory', 'handle', $mGWProcHandle, 'ptr', $aAddress, 'ptr', DllStructGetPtr($lBuffer), 'ulong_ptr', DllStructGetSize($lBuffer), 'ulong_ptr*', 0) - Return $lBuffer -EndFunc ;==>MemoryReadStruct - -;~ Description: Reads consecutive values from memory into referenced struct. -;~ Returns array if successful: [0] -> boolean -;~ [5] -> bytes read -;~ Author: 4D1. -Func MemoryReadToStruct($aAddress, ByRef $aStructbuffer) - Return DllCall($mKernelHandle, 'int', 'ReadProcessMemory', 'handle', $mGWProcHandle, 'ptr', $aAddress, 'ptr', DllStructGetPtr($aStructbuffer), 'ulong_ptr', DllStructGetSize($aStructbuffer), 'ulong_ptr*', 0) -EndFunc ;==>MemoryReadStruct - -;~ Description: Scans for bytestring, to be used after initialize. -Func ScanForPtr($aByteString, $aOffset = 0, $aLength = 8, $aStartAddr = 0x401000, $aEndAddr = 0x900000) - Local $lSystemInfoBuffer = DllStructCreate('word;word;dword;ptr;ptr;dword;dword;dword;dword;word;word') - DllCall($mKernelHandle, 'int', 'GetSystemInfo', 'ptr', DllStructGetPtr($lSystemInfoBuffer)) - Local $lBuffer = DllStructCreate('byte[' & DllStructGetData($lSystemInfoBuffer, 3) & ']') - For $iAddr = $aStartAddr To $aEndAddr Step DllStructGetData($lSystemInfoBuffer, 3) - MemoryReadToStruct($iAddr, $lBuffer) - StringRegExp(DllStructGetData($lBuffer, 1), $aByteString, 1, 2) - If @error = 0 Then - Local $lStringPos = @extended - StringLen($aByteString) - 2 - Local $lStart = $lStringPos + 2 + $aOffset + $aOffset - If $lStart > 0 And $lStart + $aLength <= StringLen(DllStructGetData($lBuffer, 1)) Then - Return SetExtended(Dec(SwapEndian(StringMid(DllStructGetData($lBuffer, 1), $lStart, $aLength))), _ - Ptr($iAddr + $aOffset - 1 + ($lStringPos/2))) - Else - Local $lReturn = Ptr($iAddr + $aOffset + ($lStringPos/2)) - Return SetExtended(MemoryRead($lReturn, 'byte[' & $aLength/2 & ']'), $lReturn - 1) - EndIf - EndIf - Next - Return SetError(1, 0, "0x00000000") -EndFunc - -;~ Description: Injects dll, no communicator. -;~ Author: 4D1. -Func InjectDll($aDllPath) - If Not FileExists($aDllPath) Then Return SetError(2, "", False) - If Not (StringRight($aDllPath, 4) == ".dll") Then Return SetError(3, "", False) - - Local $lDLL_Path = DllStructCreate("char[255]") - DllCall($mKernelHandle, "DWORD", "GetFullPathNameA", "str", $aDllPath, "DWORD", 255, "ptr", DllStructGetPtr($lDLL_Path), "int", 0) - If @error Then Return SetError(5, "", False) - - Local $hModule = DllCall($mKernelHandle, "DWORD", "GetModuleHandleA", "str", "kernel32.dll") - If @error Then Return SetError(7, "", False) - - Local $lpStartAddress = DllCall($mKernelHandle, "DWORD", "GetProcAddress", "DWORD", $hModule[0], "str", "LoadLibraryA") - If @error Then Return SetError(8, "", False) - - Local $lpParameter = DllCall($mKernelHandle, "DWORD", "VirtualAllocEx", "int", $mGWProcHandle, "int", 0, "ULONG_PTR", DllStructGetSize($lDLL_Path), "DWORD", 0x3000, "int", 4) - If @error Then Return SetError(9, "", False) - - DllCall("kernel32.dll", "BOOL", "WriteProcessMemory", "int", $mGWProcHandle, "DWORD", $lpParameter[0], "str", DllStructGetData($lDLL_Path, 1), "ULONG_PTR", DllStructGetSize($lDLL_Path), "int", 0) - If @error Then Return SetError(10, "", False) - - Local $hThread = DllCall($mKernelHandle, "int", "CreateRemoteThread", "DWORD", $mGWProcHandle, "int", 0, "int", 0, "DWORD", $lpStartAddress[0], "DWORD", $lpParameter[0], "int", 0, "int", 0) - If @error Then Return SetError(11, "", False) - - Return SetError(0, "", True) -EndFunc ;==>InjectDll -#EndRegion Memory - -#Region Initialisation -;~ Description: Searches in $aGW specified client and calls MemoryOpen() on that client. -;~ Injects asm functions, detours etc. into that game client. -Func Initialize($aGW = CharacterSelector(), $aChangeTitle = True, $aUseStringLog = False, $aUseEventSystem = False) - Local $lWinList - Local $lCharname = 0 - $mChangeTitle = $aChangeTitle - $mUseStringLog = $aUseStringLog - $mUseEventSystem = $aUseEventSystem - If IsString($aGW) Then ; Charactername - $lWinList = WinList("[CLASS:ArenaNet_Dx_Window_Class; REGEXPTITLE:^\D+$]") - For $i = 1 To $lWinList[0][0] - If StringInStr($lWinList[$i][0], 'Guild Wars Wiki') Then ContinueLoop - $mGWHwnd = $lWinList[$i][1] - MemoryOpen(WinGetProcess($mGWHwnd)) - If $mGWProcHandle Then - If StringRegExp(ScanForCharname(), $aGW) = 1 Then - $lCharname = $aGW - ExitLoop - EndIf - EndIf - MemoryClose() - $mGWProcHandle = 0 - Next - Else ; Process ID - $lWinList = WinList() - For $i = 1 To $lWinList[0][0] - $mGWHwnd = $lWinList[$i][1] - If WinGetProcess($mGWHwnd) = $aGW Then - MemoryOpen($aGW) - $lCharname = ScanForCharname() - ExitLoop - EndIf - Next - EndIf - Return InitClient($lCharname) -EndFunc - -;~ Description: Injects asm functions, detours etc. into the game client. -;~ Formerly part of Initialize(). MemoryOpen() has to be called before calling InitiClient(), to get $mGWProcHandle. -;~ Also needed: $mGWHwnd. -Func InitClient($aCharname = '') - If $mGWProcHandle = 0 Then Return 0 ; MemoryOpen() not successfully called. - If $mLabelDict = 0 Then CreateLabelDict() - $mGWTitleOld = WinGetTitle($mGWHwnd) - If $mUsePlugins Then InitPlugins() - Scan() - $mBasePointer = MemoryRead(GetScannedAddress('ScanBasePointer', -3)) - SetValue('BasePointer', $mBasePointer) - $mAgentBase = MemoryRead(GetScannedAddress('ScanAgentBase', 13)) - SetValue('AgentBase', $mAgentBase) - $mMaxAgents = $mAgentBase + 8 - SetValue('MaxAgents', $mMaxAgents) - $mMyID = $mAgentBase - 84 - SetValue('MyID', $mMyID) - $mMapLoading = $mAgentBase - 240 - $mCurrentTarget = $mAgentBase - 1280 - SetValue('PacketLocation', MemoryRead(GetScannedAddress('ScanBaseOffset', -3))) - SetValue('StorageFunction', GetScannedAddress('ScanStorage', -7)) - $mPing = MemoryRead(GetScannedAddress('ScanPing', -8)) - $mMapID = MemoryRead(GetScannedAddress('ScanMapID', 71)) - $mLastMapID = MemoryRead(GetScannedAddress('ScanLastMapID', 0x1A)) - $mLoggedIn = Ptr($mMapID - 0x7D4) - $mLoggedCounter = GetValue('PacketLocation') + 0x14 - $mRegion = MemoryRead(GetScannedAddress('ScanRegion', 8)) - $mLanguage = MemoryRead(GetScannedAddress('ScanLanguage', 8)) + 12 - $mSkillBase = MemoryRead(GetScannedAddress('ScanSkillBase', 9)) - $mSkillTimer = MemoryRead(GetScannedAddress('ScanSkillTimer', -3)) - $mBuildNumber = MemoryRead(GetScannedAddress('ScanBuildNumber', 0x54)) - $mZoomStill = GetScannedAddress("ScanZoomStill", -1) - $mZoomMoving = GetScannedAddress("ScanZoomMoving", 5) - $mStorageSessionBase = MemoryRead(GetScannedAddress("ScanStorageSessionIDBase", - 3)) - $mDialogOwnerID = MemoryRead(GetScannedAddress('ScanDialogOwnerID', -0x14)) - Local $lTemp - $lTemp = GetScannedAddress('ScanEngine', -16) - SetValue('MainStart', $lTemp) - SetValue('MainReturn', $lTemp + 5) - ;; Rendering Mod ;; - SetValue('RenderingMod', $lTemp + 116) - SetValue('RenderingModReturn', $lTemp + 132 + 6) - ;; TargetLog ;; - $lTemp = GetScannedAddress('ScanTargetLog', 1) - SetValue('TargetLogStart', $lTemp) - SetValue('TargetLogReturn', $lTemp + 5) - ;; SkillLog ;; - $lTemp = GetScannedAddress('ScanSkillLog', 1) - SetValue('SkillLogStart', $lTemp) - SetValue('SkillLogReturn', $lTemp + 5) - $lTemp = GetScannedAddress('ScanSkillCompleteLog', -4) - SetValue('SkillCompleteLogStart', $lTemp) - SetValue('SkillCompleteLogReturn', $lTemp + 5) - $lTemp = GetScannedAddress('ScanSkillCancelLog', 5) - SetValue('SkillCancelLogStart', $lTemp) - SetValue('SkillCancelLogReturn', $lTemp + 6) - ;; ChatLog ;; - $lTemp = GetScannedAddress('ScanChatLog', 18) - SetValue('ChatLogStart', $lTemp) - SetValue('ChatLogReturn', $lTemp + 6) - ;; TraderHook ;; - $lTemp = GetScannedAddress('ScanTraderHook', -7) - SetValue('TraderHookStart', $lTemp) - SetValue('TraderHookReturn', $lTemp + 5) - ;; StringLog ;; - $lTemp = GetScannedAddress('ScanStringFilter1', -2) - SetValue('StringFilter1Start', $lTemp) - SetValue('StringFilter1Return', $lTemp + 5) - $lTemp = GetScannedAddress('ScanStringFilter2', -2) - SetValue('StringFilter2Start', $lTemp) - SetValue('StringFilter2Return', $lTemp + 5) - SetValue('StringLogStart', GetScannedAddress('ScanStringLog', 35)) - ;; LoadFinished ;; - SetValue('LoadFinishedStart', GetScannedAddress('ScanLoadFinished', 1)) - SetValue('LoadFinishedReturn', GetScannedAddress('ScanLoadFinished', 6)) - ;; ObstructedHook ;; - $lTemp = GetScannedAddress('ScanObstructedText', -0x1B) - SetValue('ObstructedHookStart', $lTemp) - SetValue('ObstructedHookReturn', $lTemp + 5) - ;; Misc ;; - SetValue('PostMessage', MemoryRead(GetScannedAddress('ScanPostMessage', 11))) - SetValue('Sleep', MemoryRead(MemoryRead(GetValue('ScanSleep') + 8) + 3)) - SetValue('SalvageFunction', MemoryRead(GetValue('ScanSalvageFunction') + 8) - 18) - SetValue('SalvageGlobal', MemoryRead(MemoryRead(GetValue('ScanSalvageGlobal') + 8) + 1)) - SetValue('MoveFunction', GetScannedAddress('ScanMoveFunction', 1)) - SetValue('UseSkillFunction', GetScannedAddress('ScanUseSkillFunction', 1)) - SetValue('ChangeTargetFunction', GetScannedAddress('ScanChangeTargetFunction', -119)) - SetValue('WriteChatFunction', GetScannedAddress('ScanWriteChatFunction', 1)) - SetValue('SellItemFunction', GetScannedAddress('ScanSellItemFunction', -85)) - SetValue('PacketSendFunction', GetScannedAddress('ScanPacketSendFunction', 1)) - SetValue('ActionBase', MemoryRead(GetScannedAddress('ScanActionBase', -9))) - SetValue('ActionFunction', GetScannedAddress('ScanActionFunction', -5)) - SetValue('UseHeroSkillFunction', GetScannedAddress('ScanUseHeroSkillFunction', 0x7E7)) - SetValue('BuyItemFunction', GetScannedAddress('ScanBuyItemFunction', 1)) - SetValue('RequestQuoteFunction', GetScannedAddress('ScanRequestQuoteFunction', -2)) - SetValue('TraderFunction', GetScannedAddress('ScanTraderFunction', -71)) - SetValue('ClickToMoveFix', GetScannedAddress("ScanClickToMoveFix", 1)) - SetValue('UpdateAgentPositionFunction', GetScannedAddress('ScanUpdatePositionFunction', -0x95)) - SetValue('GoNpcFunction', GetScannedAddress('ScanGoNpcFunction', -0x9F)) - If $mUsePlugins Then AddPluginSetValues() - ;; Size ;; - SetValue('QueueSize', '0x00000010') - SetValue('SkillLogSize', '0x00000010') - SetValue('ChatLogSize', '0x00000010') - SetValue('TargetLogSize', '0x00000200') - SetValue('StringLogSize', '0x00000200') - SetValue('CallbackEvent', '0x00000501') - ModifyMemory() - ;; Set global variables ;; - $mQueueCounter = MemoryRead(GetValue('QueueCounter')) - $mQueueSize = GetValue('QueueSize') - 1 - $mQueueBase = GetValue('QueueBase') - $mTargetLogBase = GetValue('TargetLogBase') - $mStringLogBase = GetValue('StringLogBase') - $mMapIsLoaded = GetValue('MapIsLoaded') - $mEnsureEnglish = GetValue('EnsureEnglish') - $mTraderQuoteID = GetValue('TraderQuoteID') - $mTraderCostID = GetValue('TraderCostID') - $mTraderCostValue = GetValue('TraderCostValue') - $mDisableRendering = GetValue('DisableRendering') - $mAgentMovement = GetAgentMovementPtr() - $mObstructed = GetValue('ObstructedState') - $mCinematic = MemoryRead(GetScannedAddress('ScanCinematic', 0x23)) - -;~ Local $lTemp[4] = [0, 0x18, 0x2C, 0] -;~ $mBasePtr182C = MemoryReadPtrChain($mBasePointer, $lTemp, 'ptr') -;~ Local $lTemp[4] = [0, 0x18, 0x40, 0] -;~ $mBasePtr1840 = MemoryReadPtrChain($mBasePointer, $lTemp, 'ptr') -;~ Local $lTemp[4] = [0, 0x18, 0x4C, 0] -;~ $mBasePtr184C = MemoryReadPtrChain($mBasePointer, $lTemp, 'ptr') -;~ Local $lTemp = 0 - - - Local $lContextOffsets[3] = [0, 0x18, 0] - Global $mContextPtr = MemoryReadPtrChain($mBasePointer, $lContextOffsets, 'ptr') - - $mBasePtr182C = MemoryRead($mContextPtr + 0x2C,'ptr') - $mBasePtr1840 = MemoryRead($mContextPtr + 0x40,'ptr') - $mBasePtr184C = MemoryRead($mContextPtr + 0x4C,'ptr') - - - - - - - - If $mUseEventSystem Then MemoryWrite(GetValue('CallbackHandle'), $mGUI) - ;; commands ;; - DllStructSetData($mPacket, 1, GetValue('CommandPacketSend')) - DllStructSetData($mUseSkill, 1, GetValue('CommandUseSkill')) - DllStructSetData($mMove, 1, GetValue('CommandMove')) - DllStructSetData($mChangeTarget, 1, GetValue('CommandChangeTarget')) - DllStructSetData($mToggleLanguage, 1, GetValue('CommandToggleLanguage')) - DllStructSetData($mUseHeroSkill, 1, GetValue('CommandUseHeroSkill')) - DllStructSetData($mUpdateAgentPos, 1, Getvalue('CommandUpdateAgentPos')) - ;; Items ;; - DllStructSetData($mBuyItem, 1, GetValue('CommandBuyItem')) - DllStructSetData($mSellItem, 1, GetValue('CommandSellItem')) - DllStructSetData($mSalvage, 1, GetValue('CommandSalvage')) - DllStructSetData($mAction, 1, GetValue('CommandAction')) - DllStructSetData($mOpenStorage, 1, GetValue('CommandOpenStorage')) - ;; Trader ;; - DllStructSetData($mTraderBuy, 1, GetValue('CommandTraderBuy')) - DllStructSetData($mTraderSell, 1, GetValue('CommandTraderSell')) - DllStructSetData($mRequestQuote, 1, GetValue('CommandRequestQuote')) - DllStructSetData($mRequestQuoteSell, 1, GetValue('CommandRequestQuoteSell')) - DllStructSetData($mGoNpc, 1, GetValue('CommandGoNpc')) - ;; Chat ;; - DllStructSetData($mSendChat, 1, GetValue('CommandSendChat')) - DllStructSetData($mSendChat, 2, 0x5E) - DllStructSetData($mWriteChat, 1, GetValue('CommandWriteChat')) - ;; Attributes ;; - DllStructSetData($mSetAttributes, 1, GetValue('CommandPacketSend')) - DllStructSetData($mSetAttributes, 2, 0x90) - DllStructSetData($mSetAttributes, 3, 9) - If $mUsePlugins Then SetPluginVariables() - If $mChangeTitle Then - If $aCharname = '' Then - WinSetTitle($mGWHwnd, '', 'Guild Wars - ' & GetCharname()) - Else - WinSetTitle($mGWHwnd, '', 'Guild Wars - ' & $aCharname) - EndIf - EndIf - $mASMString = '' - $mASMSize = 0 - $mASMCodeOffset = 0 - Return $mGWHwnd -EndFunc ;==>Initialize - -;~ Description: Get Value to Key in $mLabelDict. -Func GetValue($aKey) - If $mLabelDict.Exists($aKey) Then - Return $mLabelDict($aKey) - Else - Return -1 - EndIf -EndFunc ;==>GetValue - -;~ Description: Add Key and Value to $mLabelDict. -Func SetValue($aKey, $aValue) - $mLabelDict($aKey) = Ptr($aValue) -EndFunc ;==>SetValue - -;~ Description: Creates dictionary object and sets keys to case insensitive. -Func CreateLabelDict() - $mLabelDict = ObjCreate('Scripting.Dictionary') - $mLabelDict.CompareMode = 1 ; keys -> case insensitive -EndFunc ;==>CreateLabelDict - -;~ Description: Returns Ptr to Agent Movement struct. -Func GetAgentMovementPtr() - Static Local $Offset[4] = [0, 0x18, 0x8, 0xE8] - Return MemoryReadPtr($mBasePointer, $Offset, 'ptr')[1] -EndFunc ;==>GetAgentMovementPtr - -;~ Description: Scans memory for listed patterns. -Func Scan() - $mASMSize = 0 - $mASMCodeOffset = 0 - $mASMString = '' - ;; Scan patterns ;; - _('MainModPtr/4') - _('ScanBasePointer:') - AddPattern('85C0750F8BCE') - _('ScanAgentBase:') - AddPattern('568BF13BF07204') - _('ScanEngine:') - AddPattern('5356DFE0F6C441') - _('ScanLoadFinished:') - AddPattern('8B561C8BCF52E8') - _('ScanPostMessage:') - AddPattern('6A00680080000051FF15') - _('ScanTargetLog:') - AddPattern('5356578BFA894DF4E8') - _('ScanChangeTargetFunction:') - AddPattern('33C03BDA0F95C033') - _('ScanMoveFunction:') - AddPattern('558BEC83EC2056578BF98D4DF0') - _('ScanPing:') - AddPattern('908D41248B49186A30') - _('ScanMapID:') - AddPattern('B07F8D55') - _('ScanLoggedIn:') - AddPattern('85C07411B807') - _('ScanRegion:') - AddPattern('83F9FD7406') - _('ScanLanguage:') - AddPattern('C38B75FC8B04B5') - _('ScanUseSkillFunction:') - AddPattern('558BEC83EC1053568BD9578BF2895DF0') - _('ScanChangeTargetFunction:') - AddPattern('33C03BDA0F95C033') - _('ScanPacketSendFunction:') - AddPattern('558BEC83EC2C5356578BF985') - _('ScanBaseOffset:') - AddPattern('5633F63BCE740E5633D2') - _('ScanWriteChatFunction:') - AddPattern('558BEC5153894DFC8B4D0856578B') - _('ScanSkillLog:') - AddPattern('408946105E5B5D') - _('ScanSkillCompleteLog:') - AddPattern('741D6A006A40') - _('ScanSkillCancelLog:') - AddPattern('85C0741D6A006A42') - _('ScanChatLog:') - AddPattern('8B45F48B138B4DEC50') - _('ScanSellItemFunction:') - AddPattern('8B4D2085C90F858E') - _('ScanStringLog:') - AddPattern('893E8B7D10895E04397E08') - _('ScanStringFilter1:') - AddPattern('51568B7508578BF9833E00') - _('ScanStringFilter2:') - AddPattern('515356578BF933D28B4F2C') - _('ScanActionFunction:') - AddPattern('8B7D0883FF098BF175116876010000') - _('ScanActionBase:') - AddPattern('8B4208A80175418B4A08') - _('ScanSkillBase:') - AddPattern('8D04B65EC1E00505') - _('ScanUseHeroSkillFunction:') - AddPattern('8B782C8B333BB7') - _('ScanBuyItemFunction:') - AddPattern('558BEC81ECC000000053568B75085783FE108BFA8BD97614') - _('ScanRequestQuoteFunction:') - AddPattern('81EC9C00000053568B') - _('ScanTraderFunction:') - AddPattern('8B45188B551085') - _('ScanTraderHook:') - AddPattern('8955FC6A008D55F8B9BA') - _('ScanSleep:') - AddPattern('5F5E5B741A6860EA0000') - _('ScanSalvageFunction:') - AddPattern('8BFA8BD9897DF0895DF4') - _('ScanSalvageGlobal:') - AddPattern('8B018B4904A3') - _('ScanSkillTimer:') - AddPattern('85c974158bd62bd183fa64') - _('ScanClickToMoveFix:') - AddPattern('3DD301000074') - _('ScanZoomStill:') - AddPattern('3B448BCB') - _('ScanZoomMoving:') - AddPattern('50EB116800803B448BCE') - _('ScanBuildNumber:') - AddPattern('8D8500FCFFFF8D') - _('ScanStorageSessionIDBase:') - AddPattern('8D14768D14908B4208A80175418B4A0885C9') - _('ScanStorage:') - AddPattern('6A00BA12000000E87CCDFFFFBA120000008BCE') - _('ScanUpdatePositionFunction:') - AddPattern('8B46043B875401') - _('ScanObstructedText:') - AddPattern('8BC88B460C85C0894DEC') - _('ScanCinematic:') - AddPattern('568BF15783FE0A8BFA') - _('ScanGoNpcFunction:') - AddPattern('558BEC83EC285356578BF28BD9') - _('ScanLastMapID:') - AddPattern('7409578D4DAC') - _('ScanDialogOwnerID:') - AddPattern('75146A006A018BD38BCF') - If $mUsePlugins Then AddPluginScans() - ;; Scan engine ;; - _('ScanProc:') - _('pushad') - _('mov ecx,401000') - _('mov esi,ScanProc') - _('ScanLoop:') - _('inc ecx') - _('mov al,byte[ecx]') - _('mov edx,ScanBasePointer') - ; Inner Loop ; - _('ScanInnerLoop:') - _('mov ebx,dword[edx]') - _('cmp ebx,-1') - _('jnz ScanContinue') - _('add edx,50') - _('cmp edx,esi') - _('jnz ScanInnerLoop') - _('cmp ecx,900000') - _('jnz ScanLoop') - _('jmp ScanExit') - ; Continue ; - _('ScanContinue:') - _('lea edi,dword[edx+ebx]') - _('add edi,C') - _('mov ah,byte[edi]') - _('cmp al,ah') - _('jz ScanMatched') - _('mov dword[edx],0') - _('add edx,50') - _('cmp edx,esi') - _('jnz ScanInnerLoop') - _('cmp ecx,900000') - _('jnz ScanLoop') - _('jmp ScanExit') - ; Matched ; - _('ScanMatched:') - _('inc ebx') - _('mov edi,dword[edx+4]') - _('cmp ebx,edi') - _('jz ScanFound') - _('mov dword[edx],ebx') - _('add edx,50') - _('cmp edx,esi') - _('jnz ScanInnerLoop') - _('cmp ecx,900000') - _('jnz ScanLoop') - _('jmp ScanExit') - ; Found ; - _('ScanFound:') - _('lea edi,dword[edx+8]') - _('mov dword[edi],ecx') - _('mov dword[edx],-1') - _('add edx,50') - _('cmp edx,esi') - _('jnz ScanInnerLoop') - _('cmp ecx,900000') - _('jnz ScanLoop') - ; Exit ; - _('ScanExit:') - _('popad') - _('retn') - Local $lScanMemory = MemoryRead($mBase, 'ptr') - If $lScanMemory = 0 Then - $mMemory = DllCall($mKernelHandle, 'ptr', 'VirtualAllocEx', 'handle', $mGWProcHandle, 'ptr', 0, 'ulong_ptr', $mASMSize, 'dword', 0x1000, 'dword', 0x40) - $mMemory = $mMemory[0] - AddRestoreDict($mBase, "0x00000000") - MemoryWrite($mBase, $mMemory) - Else - $mMemory = $lScanMemory - EndIf - CompleteASMCode() - If $lScanMemory = 0 Then - WriteBinary($mASMString, $mMemory + $mASMCodeOffset) - Local $lThread = DllCall($mKernelHandle, 'int', 'CreateRemoteThread', 'int', $mGWProcHandle, 'ptr', 0, 'int', 0, 'int', GetLabelInfo('ScanProc'), 'ptr', 0, 'int', 0, 'int', 0) - $lThread = $lThread[0] - Local $lResult - Do - $lResult = DllCall($mKernelHandle, 'int', 'WaitForSingleObject', 'int', $lThread, 'int', 50) - Until $lResult[0] <> 258 - DllCall($mKernelHandle, 'int', 'CloseHandle', 'int', $lThread) - EndIf -EndFunc ;==>Scan - -;~ Description: Formats and adds pattern-string to $mASMString. -Func AddPattern($aPattern) - Local $lSize = Int(0.5 * StringLen($aPattern)) - $mASMString &= '00000000' & SwapEndian(Hex($lSize, 8)) & '00000000' & $aPattern - $mASMSize += $lSize + 12 - For $i = 1 To 68 - $lSize - $mASMSize += 1 - $mASMString &= '00' - Next -EndFunc ;==>AddPattern - -;~ Description: Returns scanned address +/- offset. -Func GetScannedAddress($aLabel, $aOffset) - Local $lLabelInfo = GetLabelInfo($aLabel) - Return MemoryRead($lLabelInfo + 8) - MemoryRead($lLabelInfo + 4) + $aOffset -EndFunc ;==>GetScannedAddress - -;~ Description: Scans game client memory for charname. -Func ScanForCharname($aByteString = '90909066C705', $aStartAddr = 0x401000, $aEndAddr = 0x900000) - Local $lSystemInfoBuffer = DllStructCreate('word;word;dword;ptr;ptr;dword;dword;dword;dword;word;word') - DllCall($mKernelHandle, 'int', 'GetSystemInfo', 'ptr', DllStructGetPtr($lSystemInfoBuffer)) - Local $lBuffer = DllStructCreate('byte[' & DllStructGetData($lSystemInfoBuffer, 3) & ']') - For $iAddr = $aStartAddr To $aEndAddr Step DllStructGetData($lSystemInfoBuffer, 3) - MemoryReadToStruct($iAddr, $lBuffer) - StringRegExp(DllStructGetData($lBuffer, 1), $aByteString, 1, 2) - If @error = 0 Then - Local $lStringPos = @extended - StringLen($aByteString) - 2 - Local $lStart = $lStringPos + 14 - If $lStart + 8 > StringLen(DllStructGetData($lBuffer, 1)) Then - $mCharname = MemoryRead($iAddr + 0x6 + ($lStringPos/2), 'ptr') - Else - $mCharname = '0x' & SwapEndian(StringMid(DllStructGetData($lBuffer, 1), $lStart, 8)) - EndIf - Return GetCharname() - EndIf - Next - Return '' -EndFunc ;==>ScanForCharname - -;~ Description: Gets Winlists of open game client windows. -;~ If there's more than one, a small GUI is opened with a ComboBox to select Charname from. -Func CharacterSelector() - Local $lWinList = WinList("[CLASS:ArenaNet_Dx_Window_Class; REGEXPTITLE:^\D+$]") - Switch $lWinList[0][0] - Case 0 - Exit MsgBox(0, "Error", "No Guild Wars Clients were found.") - Case 1 - Return WinGetProcess($lWinList[1][1]) - Case Else - Local $lCharStr = "", $lFirstChar - For $winCount = 1 To $lWinList[0][0] - MemoryOpen(WinGetProcess($lWinList[$winCount][1])) - $lCharStr &= ScanForCharname() - If $winCount = 1 Then $lFirstChar = GetCharname() - If $winCount <> $lWinList[0][0] Then $lCharStr &= "|" - MemoryClose() - Next - Local $GUICharSelector = GUICreate("Character Selector", 171, 64, 192, 124) - Local $ComboCharSelector = GUICtrlCreateCombo("", 8, 8, 153, 25) - Local $ButtonCharSelector = GUICtrlCreateButton("Use This Character", 8, 32, 153, 25) - GUICtrlSetData($ComboCharSelector, $lCharStr,$lFirstChar) - GUISetState(@SW_SHOW, $GUICharSelector) - While 1 - Switch GUIGetMsg() - Case $ButtonCharSelector - Local $tmp = GUICtrlRead($ComboCharSelector) - GUIDelete($GUICharSelector) - Return $tmp - Case -3 - Exit - EndSwitch - Sleep(25) - WEnd - EndSwitch -EndFunc ;==>CharacterSelector - -;~ Description: Returns a string of charnames, delimeter: '|'. -Func GetLoggedCharnames() - Local $lWinList = WinList("[CLASS:ArenaNet_Dx_Window_Class; REGEXPTITLE:^\D+$]") - Local $lCharStr = '' - Switch $lWinList[0][0] - Case 0 - Exit MsgBox(0, "Error", "No Guild Wars Clients were found.") - Case 1 - MemoryOpen(WinGetProcess($lWinList[1][1])) - $lCharStr &= ScanForCharname() - $mFirstChar = $lCharStr - MemoryClose() - Case Else - For $winCount = 1 To $lWinList[0][0] - MemoryOpen(WinGetProcess($lWinList[$winCount][1])) - $lCharStr &= ScanForCharname() - If $winCount = 1 Then $mFirstChar = $lCharStr - If $winCount <> $lWinList[0][0] Then $lCharStr &= "|" - MemoryClose() - Next - EndSwitch - Return $lCharStr -EndFunc ;==>GetLoggedCharnames -#EndRegion Initialisation - -#Region Callback -;~ Description: Controls Event System. -Func SetEvent($aSkillActivate = '', $aSkillCancel = '', $aSkillComplete = '', $aChatReceive = '', $aLoadFinished = '') - If Not $mUseEventSystem Then Return - If $aSkillActivate <> '' Then - WriteDetour('SkillLogStart', 'SkillLogProc') - Else - $mASMString = '' - _('inc eax') - _('mov dword[esi+10],eax') - _('pop esi') - WriteBinary($mASMString, GetValue('SkillLogStart')) - EndIf - If $aSkillCancel <> '' Then - WriteDetour('SkillCancelLogStart', 'SkillCancelLogProc') - Else - $mASMString = '' - _('push 0') - _('push 42') - _('mov ecx,esi') - WriteBinary($mASMString, GetValue('SkillCancelLogStart')) - EndIf - If $aSkillComplete <> '' Then - WriteDetour('SkillCompleteLogStart', 'SkillCompleteLogProc') - Else - $mASMString = '' - _('mov eax,dword[edi+4]') - _('test eax,eax') - WriteBinary($mASMString, GetValue('SkillCompleteLogStart')) - EndIf - If $aChatReceive <> '' Then - WriteDetour('ChatLogStart', 'ChatLogProc') - Else - $mASMString = '' - _('add edi,E') - _('cmp eax,B') - WriteBinary($mASMString, GetValue('ChatLogStart')) - EndIf - $mSkillActivate = $aSkillActivate - $mSkillCancel = $aSkillCancel - $mSkillComplete = $aSkillComplete - $mChatReceive = $aChatReceive - $mLoadFinished = $aLoadFinished -EndFunc ;==>SetEvent - -;~ Description: Internal use for event system. Calls different event functions. -;~ modified by gigi -Func Event($hwnd, $msg, $wparam, $lparam) - Switch $lparam - Case 0x1 - DllCall($mKernelHandle, 'int', 'ReadProcessMemory', 'int', $mGWProcHandle, 'int', $wparam, 'ptr', $mSkillLogStructPtr, 'int', 16, 'int', '') - Call($mSkillActivate, DllStructGetData($mSkillLogStruct, 1), DllStructGetData($mSkillLogStruct, 2), DllStructGetData($mSkillLogStruct, 3), DllStructGetData($mSkillLogStruct, 4)) - Case 0x2 - DllCall($mKernelHandle, 'int', 'ReadProcessMemory', 'int', $mGWProcHandle, 'int', $wparam, 'ptr', $mSkillLogStructPtr, 'int', 16, 'int', '') - Call($mSkillCancel, DllStructGetData($mSkillLogStruct, 1), DllStructGetData($mSkillLogStruct, 2), DllStructGetData($mSkillLogStruct, 3)) - Case 0x3 - DllCall($mKernelHandle, 'int', 'ReadProcessMemory', 'int', $mGWProcHandle, 'int', $wparam, 'ptr', $mSkillLogStructPtr, 'int', 16, 'int', '') - Call($mSkillComplete, DllStructGetData($mSkillLogStruct, 1), DllStructGetData($mSkillLogStruct, 2), DllStructGetData($mSkillLogStruct, 3)) - Case 0x4 - DllCall($mKernelHandle, 'int', 'ReadProcessMemory', 'int', $mGWProcHandle, 'int', $wparam, 'ptr', $mChatLogStructPtr, 'int', 512, 'int', '') - Local $lMessage = DllStructGetData($mChatLogStruct, 2) - Local $lChannel - Local $lSender - Switch DllStructGetData($mChatLogStruct, 1) - Case 0 - $lChannel = "Alliance" - $lSender = StringMid($lMessage, 6, StringInStr($lMessage, "") - 6) - $lMessage = StringTrimLeft($lMessage, StringInStr($lMessage, "") + 6) - Case 3 - $lChannel = "All" - $lSender = StringMid($lMessage, 6, StringInStr($lMessage, "") - 6) - $lMessage = StringTrimLeft($lMessage, StringInStr($lMessage, "") + 6) - Case 9 - $lChannel = "Guild" - $lSender = StringMid($lMessage, 6, StringInStr($lMessage, "") - 6) - $lMessage = StringTrimLeft($lMessage, StringInStr($lMessage, "") + 6) - Case 11 - $lChannel = "Team" - $lSender = StringMid($lMessage, 6, StringInStr($lMessage, "") - 6) - $lMessage = StringTrimLeft($lMessage, StringInStr($lMessage, "") + 6) - Case 12 - $lChannel = "Trade" - $lSender = StringMid($lMessage, 6, StringInStr($lMessage, "") - 6) - $lMessage = StringTrimLeft($lMessage, StringInStr($lMessage, "") + 6) - Case 10 - If StringLeft($lMessage, 3) == "-> " Then - $lChannel = "Sent" - $lSender = StringMid($lMessage, 10, StringInStr($lMessage, "") - 10) - $lMessage = StringTrimLeft($lMessage, StringInStr($lMessage, "") + 6) - Else - $lChannel = "Global" - $lSender = "Guild Wars" - EndIf - Case 13 - $lChannel = "Advisory" - $lSender = "Guild Wars" - $lMessage = StringTrimLeft($lMessage, StringInStr($lMessage, "") + 6) - Case 14 - $lChannel = "Whisper" - $lSender = StringMid($lMessage, 7, StringInStr($lMessage, "") - 7) - $lMessage = StringTrimLeft($lMessage, StringInStr($lMessage, "") + 6) - Case Else - $lChannel = "Other" - $lSender = "Other" - EndSwitch - Call($mChatReceive, $lChannel, $lSender, $lMessage) - Case 0x5 - ResetPointers() - Call($mLoadFinished) - EndSwitch -EndFunc ;==>Event -#EndRegion Callback - -#Region Modification -;~ Description: Calls ASM functions. -Func ModifyMemory() - $mASMSize = 0 - $mASMCodeOffset = 0 - $mASMString = '' - CreateData() - CreateMain() - CreateTargetLog() - CreateSkillLog() - CreateSkillCancelLog() - CreateSkillCompleteLog() - CreateChatLog() - CreateTraderHook() - CreateLoadFinished() - CreateStringLog() - CreateStringFilter1() - CreateStringFilter2() - CreateRenderingMod() - CreateObstructedHook() - CreateCommands() - If $mUsePlugins Then AddPluginASM() - Local $lModMemory = MemoryRead(MemoryRead($mBase), 'ptr') - If $lModMemory = 0 Then - $mMemory = DllCall($mKernelHandle, 'ptr', 'VirtualAllocEx', 'handle', $mGWProcHandle, 'ptr', 0, 'ulong_ptr', $mASMSize, 'dword', 0x1000, 'dword', 0x40) - $mMemory = $mMemory[0] - MemoryWrite(MemoryRead($mBase), $mMemory) - $mMemoryEnd = Ptr($mMemory + $mASMSize + 40) - Else - $mMemory = $lModMemory - EndIf - CompleteASMCode() - If $lModMemory = 0 Then - WriteBinary($mASMString, $mMemory + $mASMCodeOffset) - WriteBinary("83F8009090", GetValue('ClickToMoveFix')) - MemoryWrite(GetValue('QueuePtr'), GetValue('QueueBase')) - MemoryWrite(GetValue('SkillLogPtr'), GetValue('SkillLogBase')) - MemoryWrite(GetValue('ChatLogPtr'), GetValue('ChatLogBase')) - MemoryWrite(GetValue('StringLogPtr'), GetValue('StringLogBase')) - EndIf - WriteDetour('MainStart', 'MainProc') - WriteDetour('TargetLogStart', 'TargetLogProc') - WriteDetour('TraderHookStart', 'TraderHookProc') - WriteDetour('LoadFinishedStart', 'LoadFinishedProc') - WriteDetour('RenderingMod', 'RenderingModProc') - WriteDetour('ObstructedHookStart', 'ObstructedHookProc') - If $mUseStringLog Then - WriteDetour('StringLogStart', 'StringLogProc') - WriteDetour('StringFilter1Start', 'StringFilter1Proc') - WriteDetour('StringFilter2Start', 'StringFilter2Proc') - EndIf - If $mUsePlugins Then AddPluginDetours() -EndFunc ;==>ModifyMemory - -;~ Description: Writes a jump 'from'-'to' to process memory. -Func WriteDetour($aFrom, $aTo) - Local $lFrom = GetLabelInfo($aFrom) - WriteBinary('E9' & SwapEndian(Hex(GetLabelInfo($aTo) - $lFrom - 5)), $lFrom) -EndFunc ;==>WriteDetour - -;~ Description: Add Key and Value to $mRestoreDict. -Func AddRestoreDict($aKey, $aItem) - If IsDllStruct($aItem) Then - Local $lBuffer = DllStructCreate('byte[' & DllStructGetSize($aItem) & ']', DllStructGetPtr($aItem)) - $aItem = DllStructGetData($lBuffer, 1) - EndIf - If $aItem == '' Then Return - If $mRestoreDict = 0 Then CreateRestoreDict() - $mRestoreDict($aKey) = $aItem -EndFunc - -;~ Description: Restore data saved in $mRestoreDict. -Func RestoreDetour() - While GetMapLoading() = 2 - Sleep(1000) - WEnd - If $mRestoreDict.Item($mBase) = "0x00000000" Then - Local $lItem, $lSize, $lTemp - Local $lStr = "Restoring data: " & @CRLF - For $i In $mRestoreDict.Keys - $lItem = $mRestoreDict.Item($i) - If StringLeft($lItem, 2) == '0x' Then $lItem = StringTrimLeft($lItem, 2) - $lSize = 0.5 * StringLen($lItem) - $lTemp = MemoryRead(Ptr($i), 'byte[' & $lSize & ']') - WriteBinary($lItem, $i, False) - $lStr &= Ptr($i) & ': ' & $lItem & ' | ' & $lTemp & ' -> ' & MemoryRead(Ptr($i), 'byte[' & $lSize & ']') & @CRLF - Next - WinSetTitle($mGWHwnd, '', $mGWTitleOld) - DllCall($mKernelHandle, 'int', 'VirtualFreeEx', 'handle', $mGWProcHandle, 'ptr', $mMemory, 'int', 0, 'dword', 0x8000) - ElseIf $mUsePlugins Then - $lStr = "Client was already injected. Only restoring Dialoghook." - WinSetTitle($mGWHwnd, '', $mGWTitleOld) - WriteBinary('558BEC8B41', GetLabelInfo('DialogLogStart')) - EndIf - Consolewrite($lStr & @CRLF) -EndFunc - -;~ Description: Creates dictionary object and sets keys to case insensitive. Internal use RestoreDetour. -Func CreateRestoreDict() - $mRestoreDict = ObjCreate('Scripting.Dictionary') - $mRestoreDict.CompareMode = 1 ; keys -> case insensitive -EndFunc ;==>CreateLabelDict - -;~ Description: ASM variables. -Func CreateData() - _('CallbackHandle/4') - _('QueueCounter/4') - _('SkillLogCounter/4') - _('ChatLogCounter/4') - _('ChatLogLastMsg/4') - _('MapIsLoaded/4') - _('NextStringType/4') - _('EnsureEnglish/4') - _('TraderQuoteID/4') - _('TraderCostID/4') - _('TraderCostValue/4') - _('DisableRendering/4') - _('QueueBase/' & 256 * GetValue('QueueSize')) - _('TargetLogBase/' & 4 * GetValue('TargetLogSize')) - _('SkillLogBase/' & 16 * GetValue('SkillLogSize')) - _('StringLogBase/' & 256 * GetValue('StringLogSize')) - _('ChatLogBase/' & 512 * GetValue('ChatLogSize')) - _('ObstructedState/4') - If $mUsePlugins Then AddPluginData() -EndFunc ;==>CreateData - -;~ Description: ASM function. Internal use only. -Func CreateMain() - _('MainProc:') - _('pushad') - _('mov eax,dword[EnsureEnglish]') - _('test eax,eax') - _('jz MainMain') - - _('mov ecx,dword[BasePointer]') - _('mov ecx,dword[ecx+18]') - _('mov ecx,dword[ecx+18]') - _('mov ecx,dword[ecx+194]') - _('mov al,byte[ecx+4f]') - _('cmp al,f') - _('ja MainMain') - _('mov ecx,dword[ecx+4c]') - _('mov al,byte[ecx+3f]') - _('cmp al,f') - _('ja MainMain') - _('mov eax,dword[ecx+40]') - _('test eax,eax') - _('jz MainMain') - - _('mov ecx,dword[ActionBase]') - _('mov ecx,dword[ecx+170]') - _('mov ecx,dword[ecx+20]') - _('mov ecx,dword[ecx]') - _('push 0') - _('push 0') - _('push bb') - _('mov edx,esp') - _('push 0') - _('push edx') - _('push 18') - _('call ActionFunction') - _('pop eax') - _('pop ebx') - _('pop ecx') - - _('MainMain:') - _('mov eax,dword[QueueCounter]') - _('mov ecx,eax') - _('shl eax,8') - _('add eax,QueueBase') - _('mov ebx,dword[eax]') - _('test ebx,ebx') - _('jz MainExit') - - _('push ecx') - _('mov dword[eax],0') - _('jmp ebx') - - _('CommandReturn:') - _('pop eax') - _('inc eax') - _('cmp eax,QueueSize') - _('jnz MainSkipReset') - _('xor eax,eax') - _('MainSkipReset:') - _('mov dword[QueueCounter],eax') - - _('MainExit:') - _('popad') - _('mov ebp,esp') - _('sub esp,14') - _('ljmp MainReturn') -EndFunc ;==>CreateMain - -;~ Description: ASM function. Internal use only. -Func CreateTargetLog() - _('TargetLogProc:') - _('cmp ecx,4') - _('jz TargetLogMain') - _('cmp ecx,32') - _('jz TargetLogMain') - _('cmp ecx,3C') - _('jz TargetLogMain') - _('jmp TargetLogExit') - - _('TargetLogMain:') - _('pushad') - _('mov ecx,dword[ebp+8]') - _('test ecx,ecx') - _('jnz TargetLogStore') - _('mov ecx,edx') - - _('TargetLogStore:') - _('lea eax,dword[edx*4+TargetLogBase]') - _('mov dword[eax],ecx') - _('popad') - - _('TargetLogExit:') - _('push ebx') - _('push esi') - _('push edi') - _('mov edi,edx') - _('ljmp TargetLogReturn') -EndFunc ;==>CreateTargetLog - -;~ Description: ASM function. Internal use only. -Func CreateSkillLog() - _('SkillLogProc:') - _('pushad') - _('mov eax,dword[SkillLogCounter]') - _('push eax') - _('shl eax,4') - _('add eax,SkillLogBase') - _('mov ecx,dword[edi]') - _('mov dword[eax],ecx') - _('mov ecx,dword[ecx*4+TargetLogBase]') - _('mov dword[eax+4],ecx') - _('mov ecx,dword[edi+4]') - _('mov dword[eax+8],ecx') - _('mov ecx,dword[edi+8]') - _('mov dword[eax+c],ecx') - _('push 1') - _('push eax') - _('push CallbackEvent') - _('push dword[CallbackHandle]') - _('call dword[PostMessage]') - _('pop eax') - _('inc eax') - _('cmp eax,SkillLogSize') - _('jnz SkillLogSkipReset') - _('xor eax,eax') - - _('SkillLogSkipReset:') - _('mov dword[SkillLogCounter],eax') - _('popad') - _('inc eax') - _('mov dword[esi+10],eax') - _('pop esi') - _('ljmp SkillLogReturn') -EndFunc ;==>CreateSkillLog - -;~ Description: ASM function. Internal use only. -Func CreateSkillCancelLog() - _('SkillCancelLogProc:') - _('pushad') - _('mov eax,dword[SkillLogCounter]') - _('push eax') - _('shl eax,4') - _('add eax,SkillLogBase') - _('mov ecx,dword[edi]') - _('mov dword[eax],ecx') - _('mov ecx,dword[ecx*4+TargetLogBase]') - _('mov dword[eax+4],ecx') - _('mov ecx,dword[edi+4]') - _('mov dword[eax+8],ecx') - _('push 2') - _('push eax') - _('push CallbackEvent') - _('push dword[CallbackHandle]') - _('call dword[PostMessage]') - _('pop eax') - _('inc eax') - _('cmp eax,SkillLogSize') - _('jnz SkillCancelLogSkipReset') - _('xor eax,eax') - - _('SkillCancelLogSkipReset:') - _('mov dword[SkillLogCounter],eax') - _('popad') - _('push 0') - _('push 42') - _('mov ecx,esi') - _('ljmp SkillCancelLogReturn') -EndFunc ;==>CreateSkillCancelLog - -;~ Description: ASM function. Internal use only. -Func CreateSkillCompleteLog() - _('SkillCompleteLogProc:') - _('pushad') - _('mov eax,dword[SkillLogCounter]') - _('push eax') - _('shl eax,4') - _('add eax,SkillLogBase') - _('mov ecx,dword[edi]') - _('mov dword[eax],ecx') - _('mov ecx,dword[ecx*4+TargetLogBase]') - _('mov dword[eax+4],ecx') - _('mov ecx,dword[edi+4]') - _('mov dword[eax+8],ecx') - _('push 3') - _('push eax') - _('push CallbackEvent') - _('push dword[CallbackHandle]') - _('call dword[PostMessage]') - _('pop eax') - _('inc eax') - _('cmp eax,SkillLogSize') - _('jnz SkillCompleteLogSkipReset') - _('xor eax,eax') - - _('SkillCompleteLogSkipReset:') - _('mov dword[SkillLogCounter],eax') - _('popad') - _('mov eax,dword[edi+4]') - _('test eax,eax') - _('ljmp SkillCompleteLogReturn') -EndFunc ;==>CreateSkillCompleteLog - -;~ Description: ASM function. Internal use only. -Func CreateChatLog() - _('ChatLogProc:') - _('pushad') - _('mov ecx,dword[esp+1F4]') - _('mov ebx,eax') - _('mov eax,dword[ChatLogCounter]') - _('push eax') - _('shl eax,9') - _('add eax,ChatLogBase') - _('mov dword[eax],ebx') - _('mov edi,eax') - _('add eax,4') - _('xor ebx,ebx') - - _('ChatLogCopyLoop:') - _('mov dx,word[ecx]') - _('mov word[eax],dx') - _('add ecx,2') - _('add eax,2') - _('inc ebx') - _('cmp ebx,FF') - _('jz ChatLogCopyExit') - _('test dx,dx') - _('jnz ChatLogCopyLoop') - - _('ChatLogCopyExit:') - _('push 4') - _('push edi') - _('push CallbackEvent') - _('push dword[CallbackHandle]') - _('call dword[PostMessage]') - _('pop eax') - _('inc eax') - _('cmp eax,ChatLogSize') - _('jnz ChatLogSkipReset') - _('xor eax,eax') - _('ChatLogSkipReset:') - _('mov dword[ChatLogCounter],eax') - _('popad') - - _('ChatLogExit:') - _('add edi,E') - _('cmp eax,B') - _('ljmp ChatLogReturn') -EndFunc ;==>CreateChatLog - -;~ Description: ASM function. Internal use only. -Func CreateTraderHook() - _('TraderHookProc:') - _('mov dword[TraderCostID],ecx') - _('mov dword[TraderCostValue],edx') - _('push eax') - _('mov eax,dword[TraderQuoteID]') - _('inc eax') - _('cmp eax,200') - _('jnz TraderSkipReset') - _('xor eax,eax') - _('TraderSkipReset:') - _('mov dword[TraderQuoteID],eax') - _('pop eax') - _('mov ebp,esp') - _('sub esp,8') - _('ljmp TraderHookReturn') -EndFunc ;==>CreateTraderHook - -;~ Description: ASM function. Internal use only. -Func CreateLoadFinished() - _('LoadFinishedProc:') - _('pushad') - _('mov eax,1') - _('mov dword[MapIsLoaded],eax') - _('xor ebx,ebx') - _('mov eax,StringLogBase') - - _('LoadClearStringsLoop:') - _('mov dword[eax],0') - _('inc ebx') - _('add eax,100') - _('cmp ebx,StringLogSize') - _('jnz LoadClearStringsLoop') - - _('xor ebx,ebx') - _('mov eax,TargetLogBase') - _('LoadClearTargetsLoop:') - _('mov dword[eax],0') - _('inc ebx') - _('add eax,4') - _('cmp ebx,TargetLogSize') - _('jnz LoadClearTargetsLoop') - - _('push 5') - _('push 0') - _('push CallbackEvent') - _('push dword[CallbackHandle]') - _('call dword[PostMessage]') - _('popad') - _('mov edx,dword[esi+1C]') - _('mov ecx,edi') - _('ljmp LoadFinishedReturn') -EndFunc ;==>CreateLoadFinished - -;~ Description: ASM function. Internal use only. -Func CreateStringLog() - _('StringLogProc:') - _('pushad') - _('mov eax,dword[NextStringType]') - _('test eax,eax') - _('jz StringLogExit') - - _('cmp eax,1') - _('jnz StringLogFilter2') - _('mov eax,dword[ebp+37c]') - _('jmp StringLogRangeCheck') - - _('StringLogFilter2:') - _('cmp eax,2') - _('jnz StringLogExit') - _('mov eax,dword[ebp+338]') - - _('StringLogRangeCheck:') - _('mov dword[NextStringType],0') - _('cmp eax,0') - _('jbe StringLogExit') - _('cmp eax,StringLogSize') - _('jae StringLogExit') - - _('shl eax,8') - _('add eax,StringLogBase') - _('xor ebx,ebx') - - _('StringLogCopyLoop:') - _('mov dx,word[ecx]') - _('mov word[eax],dx') - _('add ecx,2') - _('add eax,2') - _('inc ebx') - _('cmp ebx,80') - _('jz StringLogExit') - _('test dx,dx') - _('jnz StringLogCopyLoop') - - _('StringLogExit:') - _('popad') - _('mov esp,ebp') - _('pop ebp') - _('retn 10') -EndFunc ;==>CreateStringLog - -;~ Description: ASM function. Internal use only. -Func CreateStringFilter1() - _('StringFilter1Proc:') - _('mov dword[NextStringType],1') - _('push ebp') - _('mov ebp,esp') - _('push ecx') - _('push esi') - _('ljmp StringFilter1Return') -EndFunc ;==>CreateStringFilter1 - -;~ Description: ASM function. Internal use only. -Func CreateStringFilter2() - _('StringFilter2Proc:') - _('mov dword[NextStringType],2') - _('push ebp') - _('mov ebp,esp') - _('push ecx') - _('push esi') - _('ljmp StringFilter2Return') -EndFunc ;==>CreateStringFilter2 - -Func CreateObstructedHook() - _('ObstructedHookProc:') - _('mov eax,dword[ecx]') - _('cmp eax,8AB') - _('jnz ObstructedHookEnd') - _('mov dword[ObstructedState],eax') - _('ObstructedHookEnd:') - _('mov ebp,esp') - _('sub esp,18') - _('ljmp ObstructedHookReturn') -EndFunc - -;~ Description: ASM function. Internal use only. -Func CreateRenderingMod() - _('RenderingModProc:') - _('cmp dword[DisableRendering],1') - _('jz RenderingModSkipCompare') - _('cmp eax,ebx') - _('ljne RenderingModReturn') - - _('RenderingModSkipCompare:') - $mASMSize += 17 - $mASMString &= StringTrimLeft(MemoryRead(GetValue("RenderingMod") + 4, "byte[17]"), 2) - _('cmp dword[DisableRendering],1') - _('jz DisableRenderingProc') - _('retn') - - _('DisableRenderingProc:') - _('push 1') - _('call dword[Sleep]') - _('retn') -EndFunc ;==>CreateRenderingMod - -;~ Description: ASM functions as strings, each line calls conversion function _(). Internal use only. -Func CreateCommands() - #Region Commands - ; PacketSend ; - _('CommandPacketSend:') - _('mov ecx,dword[PacketLocation]') - _('lea edx,dword[eax+8]') - _('push edx') - _('mov edx,dword[eax+4]') - _('mov eax,ecx') - _('call PacketSendFunction') - _('ljmp CommandReturn') - ; Action ; - _('CommandAction:') - _('mov ecx,dword[ActionBase]') - _('mov ecx,dword[ecx+250]') - _('mov ecx,dword[ecx+10]') - _('mov ecx,dword[ecx]') - _('push 0') - _('push 0') - _('push dword[eax+4]') - _('mov edx,esp') - _('push 0') - _('push edx') - _('push dword[eax+8]') - _('call ActionFunction') - _('pop eax') - _('pop ebx') - _('pop ecx') - _('ljmp CommandReturn') - ; UseSkill ; - _('CommandUseSkill:') - _('mov ecx,dword[MyID]') - _('mov edx,dword[eax+C]') - _('push edx') - _('mov edx,dword[eax+4]') - _('dec edx') - _('push dword[eax+8]') - _('call UseSkillFunction') - _('ljmp CommandReturn') - ; Move ; - _('CommandMove:') - _('lea ecx,dword[eax+4]') - _('call MoveFunction') - _('ljmp CommandReturn') - ; ChangeTarget ; - _('CommandChangeTarget:') - _('mov ecx,dword[eax+4]') - _('xor edx,edx') - _('call ChangeTargetFunction') - _('ljmp CommandReturn') - ; ToggleLanguage ; - _('CommandToggleLanguage:') - _('mov ecx,dword[ActionBase]') - _('mov ecx,dword[ecx+170]') - _('mov ecx,dword[ecx+20]') - _('mov ecx,dword[ecx]') - _('push 0') - _('push 0') - _('push bb') - _('mov edx,esp') - _('push 0') - _('push edx') - _('push dword[eax+4]') - _('call ActionFunction') - _('pop eax') - _('pop ebx') - _('pop ecx') - _('ljmp CommandReturn') - ; UseHeroSkill ; - _('CommandUseHeroSkill:') - _('mov ecx,dword[eax+4]') - _('mov edx,dword[eax+c]') - _('mov eax,dword[eax+8]') - _('push eax') - _('call UseHeroSkillFunction') - _('ljmp CommandReturn') - ; UpdateAgentPos ; - _('CommandUpdateAgentPos:') - _('add eax,4') - _('mov ecx,eax') - _('call UpdateAgentPositionFunction') - _('ljmp CommandReturn') - ; Go NPC ; - _('CommandGoNpc:') - _('mov ecx,dword[eax+4]') - _('mov edx,dword[eax+8]') - _('call GoNpcFunction') - _('ljmp CommandReturn') - #EndRegion Commands - - #Region Items - ; Buy ; - _('CommandBuyItem:') - _('add eax,4') - _('push eax') - _('add eax,4') - _('push eax') - _('push 1') - _('push 0') - _('push 0') - _('push 0') - _('push 0') - _('mov ecx,1') - _('mov edx,dword[eax+4]') - _('call BuyItemFunction') - _('ljmp CommandReturn') - ; Sell ; - _('CommandSellItem:') - _('push 0') - _('push 0') - _('push 0') - _('push dword[eax+4]') - _('push 0') - _('add eax,8') - _('push eax') - _('push 1') - _('mov ecx,b') - _('xor edx,edx') - _('call SellItemFunction') - _('ljmp CommandReturn') - ; Salvage ; - _('CommandSalvage:') - _('mov ebx,SalvageGlobal') - _('mov ecx,dword[eax+4]') - _('mov dword[ebx],ecx') - _('push ecx') - _('mov ecx,dword[eax+8]') - _('add ebx,4') - _('mov dword[ebx],ecx') - _('mov edx,dword[eax+c]') - _('mov dword[ebx],ecx') - _('call SalvageFunction') - _('ljmp CommandReturn') - ; OpenStorage ; - _('CommandOpenStorage:') - _('pushad') - _('add eax,4') - _('mov ecx,dword[eax]') - _('add eax,4') - _('mov edx,eax') - _('call StorageFunction') - _('popad') - #EndRegion Items - - #Region Trader - ; Buy ; - _('CommandTraderBuy:') - _('push 0') - _('push TraderCostID') - _('push 1') - _('push 0') - _('push 0') - _('push 0') - _('push 0') - _('mov ecx,c') - _('mov edx,dword[TraderCostValue]') - _('call TraderFunction') - _('mov dword[TraderCostID],0') - _('mov dword[TraderCostValue],0') - _('ljmp CommandReturn') - ; Sell ; - _('CommandTraderSell:') - _('push 0') - _('push 0') - _('push 0') - _('push dword[TraderCostValue]') - _('push 0') - _('push TraderCostID') - _('push 1') - _('mov ecx,d') - _('xor edx,edx') - _('call TraderFunction') - _('mov dword[TraderCostID],0') - _('mov dword[TraderCostValue],0') - _('ljmp CommandReturn') - ; QuoteBuy ; - _('CommandRequestQuote:') - _('mov dword[TraderCostID],0') - _('mov dword[TraderCostValue],0') - _('add eax,4') - _('push eax') - _('push 1') - _('push 0') - _('push 0') - _('push 0') - _('push 0') - _('mov ecx,c') - _('xor edx,edx') - _('call RequestQuoteFunction') - _('ljmp CommandReturn') - ; QuoteSell ; - _('CommandRequestQuoteSell:') - _('mov dword[TraderCostID],0') - _('mov dword[TraderCostValue],0') - _('push 0') - _('push 0') - _('push 0') - _('add eax,4') - _('push eax') - _('push 1') - _('push 0') - _('mov ecx,d') - _('xor edx,edx') - _('call RequestQuoteFunction') - _('ljmp CommandReturn') - #EndRegion Trader - - #Region Chat - ; Send ; - _('CommandSendChat:') - _('mov ecx,dword[PacketLocation]') - _('add eax,4') - _('push eax') - _('mov edx,11c') - _('mov eax,ecx') - _('call PacketSendFunction') - _('ljmp CommandReturn') - ; Write ; - _('CommandWriteChat:') - _('add eax,4') - _('mov edx,eax') - _('xor ecx,ecx') - _('add eax,28') - _('push eax') - _('call WriteChatFunction') - _('ljmp CommandReturn') - #EndRegion Chat -EndFunc ;==>CreateCommands -#EndRegion Modification - -#Region Assembler -;~ Description: Converts ASM commands to opcodes and updates global variables. -Func _($aASM) - ;quick and dirty x86assembler unit: - ;relative values stringregexp - ;static values hardcoded - Local $lBuffer - Local $lOpCode = '' - Local $lMnemonic = StringLeft($aASM, StringInStr($aASM, ' ') - 1) - Select - Case $lMnemonic = "" ; variables and single word opcodes - Select - Case StringRight($aASM, 1) = ':' - SetValue('Label_' & StringLeft($aASM, StringLen($aASM) - 1), $mASMSize) - Case StringInStr($aASM, '/') > 0 - SetValue('Label_' & StringLeft($aASM, StringInStr($aASM, '/') - 1), $mASMSize) - Local $lOffset = StringRight($aASM, StringLen($aASM) - StringInStr($aASM, '/')) - $mASMSize += $lOffset - $mASMCodeOffset += $lOffset - Case $aASM = 'pushad' ; push all - $lOpCode = '60' - Case $aASM = 'popad' ; pop all - $lOpCode = '61' - Case $aASM = 'nop' - $lOpCode = '90' - Case $aASM = 'retn' - $lOpCode = 'C3' - Case $aASM = 'clc' - $lOpCode = 'F8' - EndSelect - Case $lMnemonic = "nop" ; nop - If StringLeft($aASM, 5) = 'nop x' Then - $lBuffer = Int(Number(StringTrimLeft($aASM, 5))) - $mASMSize += $lBuffer - For $i = 1 To $lBuffer - $mASMString &= '90' - Next - EndIf - Case StringLeft($lMnemonic, 2) = "lj" Or StringLeft($lMnemonic, 1) = "j" ; jump - Local $lStringLeft5 = StringLeft($aASM, 5) - Local $lStringLeft4 = StringLeft($aASM, 4) - Local $lStringLeft3 = StringLeft($aASM, 3) - Select - Case $lStringLeft5 = 'ljmp ' - $mASMSize += 5 - $mASMString &= 'E9{' & StringRight($aASM, StringLen($aASM) - 5) & '}' - Case $lStringLeft5 = 'ljne ' - $mASMSize += 6 - $mASMString &= '0F85{' & StringRight($aASM, StringLen($aASM) - 5) & '}' - Case $lStringLeft4 = 'jmp ' And StringLen($aASM) > 7 - $mASMSize += 2 - $mASMString &= 'EB(' & StringRight($aASM, StringLen($aASM) - 4) & ')' - Case $lStringLeft4 = 'jae ' - $mASMSize += 2 - $mASMString &= '73(' & StringRight($aASM, StringLen($aASM) - 4) & ')' - Case $lStringLeft4 = 'jnz ' - $mASMSize += 2 - $mASMString &= '75(' & StringRight($aASM, StringLen($aASM) - 4) & ')' - Case $lStringLeft4 = 'jbe ' - $mASMSize += 2 - $mASMString &= '76(' & StringRight($aASM, StringLen($aASM) - 4) & ')' - Case $lStringLeft4 = 'jge ' - $mASMSize += 2 - $mASMString &= '7D(' & StringRight($aASM, StringLen($aASM) - 4) & ')' - Case $lStringLeft4 = 'jle ' - $mASMSize += 2 - $mASMString &= '7E(' & StringRight($aASM, StringLen($aASM) - 4) & ')' - Case $lStringLeft3 = 'ja ' - $mASMSize += 2 - $mASMString &= '77(' & StringRight($aASM, StringLen($aASM) - 3) & ')' - Case $lStringLeft3 = 'jl ' - $mASMSize += 2 - $mASMString &= '7C(' & StringRight($aASM, StringLen($aASM) - 3) & ')' - Case $lStringLeft3 = 'jz ' - $mASMSize += 2 - $mASMString &= '74(' & StringRight($aASM, StringLen($aASM) - 3) & ')' - ; hardcoded - Case $aASM = 'jmp ebx' - $lOpCode = 'FFE3' - Case Else - MsgBox(0, 'ASM', 'Could not assemble: ' & $aASM) - Exit - EndSelect - Case $lMnemonic = "mov" ; mov - Select - ; mov eax,dword[EnsureEnglish] - Case StringRegExp($aASM, 'mov eax,dword[[][a-z,A-Z]{4,}[]]') - $mASMSize += 5 - $mASMString &= 'A1[' & StringMid($aASM, 15, StringLen($aASM) - 15) & ']' - Case StringRegExp($aASM, 'mov ecx,dword[[][a-z,A-Z]{4,}[]]') - $mASMSize += 6 - $mASMString &= '8B0D[' & StringMid($aASM, 15, StringLen($aASM) - 15) & ']' - Case StringRegExp($aASM, 'mov edx,dword[[][a-z,A-Z]{4,}[]]') - $mASMSize += 6 - $mASMString &= '8B15[' & StringMid($aASM, 15, StringLen($aASM) - 15) & ']' - Case StringRegExp($aASM, 'mov ebx,dword[[][a-z,A-Z]{4,}[]]') - $mASMSize += 6 - $mASMString &= '8B1D[' & StringMid($aASM, 15, StringLen($aASM) - 15) & ']' - Case StringRegExp($aASM, 'mov esi,dword[[][a-z,A-Z]{4,}[]]') - $mASMSize += 6 - $mASMString &= '8B35[' & StringMid($aASM, 15, StringLen($aASM) - 15) & ']' - Case StringRegExp($aASM, 'mov edi,dword[[][a-z,A-Z]{4,}[]]') - $mASMSize += 6 - $mASMString &= '8B3D[' & StringMid($aASM, 15, StringLen($aASM) - 15) & ']' - ; mov eax,TargetLogBase - Case StringRegExp($aASM, 'mov eax,[a-z,A-Z]{4,}') And StringInStr($aASM, ',dword') = 0 - $mASMSize += 5 - $mASMString &= 'B8[' & StringRight($aASM, StringLen($aASM) - 8) & ']' - Case StringRegExp($aASM, 'mov edx,[a-z,A-Z]{4,}') And StringInStr($aASM, ',dword') = 0 - $mASMSize += 5 - $mASMString &= 'BA[' & StringRight($aASM, StringLen($aASM) - 8) & ']' - Case StringRegExp($aASM, 'mov ebx,[a-z,A-Z]{4,}') And StringInStr($aASM, ',dword') = 0 - $mASMSize += 5 - $mASMString &= 'BB[' & StringRight($aASM, StringLen($aASM) - 8) & ']' - Case StringRegExp($aASM, 'mov esi,[a-z,A-Z]{4,}') And StringInStr($aASM, ',dword') = 0 - $mASMSize += 5 - $mASMString &= 'BE[' & StringRight($aASM, StringLen($aASM) - 8) & ']' - Case StringRegExp($aASM, 'mov edi,[a-z,A-Z]{4,}') And StringInStr($aASM, ',dword') = 0 - $mASMSize += 5 - $mASMString &= 'BF[' & StringRight($aASM, StringLen($aASM) - 8) & ']' - ; mov ecx,dword[ecx*4+TargetLogBase] - Case StringRegExp($aASM, 'mov eax,dword[[]ecx[*]4[+][a-z,A-Z]{4,}[]]') - $mASMSize += 7 - $mASMString &= '8B048D[' & StringMid($aASM, 21, StringLen($aASM) - 21) & ']' - Case StringRegExp($aASM, 'mov ecx,dword[[]ecx[*]4[+][a-z,A-Z]{4,}[]]') - $mASMSize += 7 - $mASMString &= '8B0C8D[' & StringMid($aASM, 21, StringLen($aASM) - 21) & ']' - ; mov eax,dword[ebp+8] - Case StringRegExp($aASM, 'mov (eax|ecx|edx|ebx|esp|ebp|esi|edi),dword[[](ebp|esp)[+][-[:xdigit:]]{1,8}[]]') - Local $lASM = '' - Local $lBuffer = StringMid($aASM, 19, StringLen($aASM) - 19) - $lBuffer = ASMNumber($lBuffer, True) - If @extended Then - $mASMSize += 4 - Local $lStart = 4 - Else - $mASMSize += 7 - Local $lStart = 8 - EndIf - Switch StringMid($aASM, 5, 3) - Case 'eax' - $lASM &= Hex($lStart, 1) & '5' - Case 'ecx' - $lASM &= Hex($lStart, 1) & 'D' - Case 'edx' - $lASM &= Hex($lStart + 1, 1) & '5' - Case 'ebx' - $lASM &= Hex($lStart + 1, 1) & 'D' - Case 'esp' - $lASM &= Hex($lStart + 2, 1) & '5' - Case 'ebp' - $lASM &= Hex($lStart + 2, 1) & 'D' - Case 'esi' - $lASM &= Hex($lStart + 3, 1) & '5' - Case 'edi' - $lASM &= Hex($lStart + 3, 1) & 'D' - EndSwitch - If StringMid($aASM, 15, 3) = 'esp' Then - $mASMSize += 1 - $lASM = Hex(Dec($lASM) - 1, 2) & '24' - EndIf - $mASMString &= '3E8B' & $lASM & $lBuffer - ; mov eax,dword[ecx+8] - Case StringRegExp($aASM, 'mov (eax|ecx|edx|ebx|esp|ebp|esi|edi),dword[[](eax|ecx|edx|ebx|esi|edi)[+][-[:xdigit:]]{1,8}[]]') - Local $lASM = '' - Local $lBuffer = StringMid($aASM, 19, StringLen($aASM) - 19) - $lBuffer = ASMNumber($lBuffer, True) - If @extended Then - $mASMSize += 3 - Local $lStart = 4 - Else - $mASMSize += 6 - Local $lStart = 8 - EndIf - Switch StringMid($aASM, 5, 3) - Case 'eax' - $lASM &= Hex($lStart, 1) & '0' - Case 'ecx' - $lASM &= Hex($lStart, 1) & '8' - Case 'edx' - $lASM &= Hex($lStart + 1, 1) & '0' - Case 'ebx' - $lASM &= Hex($lStart + 1, 1) & '8' - Case 'esp' - $lASM &= Hex($lStart + 2, 1) & '0' - Case 'ebp' - $lASM &= Hex($lStart + 2, 1) & '8' - Case 'esi' - $lASM &= Hex($lStart + 3, 1) & '0' - Case 'edi' - $lASM &= Hex($lStart + 3, 1) & '8' - EndSwitch - $mASMString &= '8B' & ASMOperand(StringMid($aASM, 15, 3), $lASM) & $lBuffer - ; mov ebx,dword[edx] - Case StringRegExp($aASM, 'mov (eax|ecx|edx|ebx|esp|ebp|esi|edi),dword[[](eax|ecx|edx|ebx|esp|ebp|esi|edi)[]]') - $mASMSize += 2 - Switch StringMid($aASM, 5, 3) - Case 'eax' - $lBuffer = '00' - Case 'ecx' - $lBuffer = '08' - Case 'edx' - $lBuffer = '10' - Case 'ebx' - $lBuffer = '18' - Case 'esp' - $lBuffer = '20' - Case 'ebp' - $lBuffer = '28' - Case 'esi' - $lBuffer = '30' - Case 'edi' - $lBuffer = '38' - EndSwitch - $mASMSTring &= '8B' & ASMOperand(StringMid($aASM, 15, 3), $lBuffer, True) - ; mov eax,14 - Case StringRegExp($aASM, 'mov eax,[-[:xdigit:]]{1,8}\z') - $mASMSize += 5 - $mASMString &= 'B8' & ASMNumber(StringMid($aASM, 9)) - Case StringRegExp($aASM, 'mov ebx,[-[:xdigit:]]{1,8}\z') - $mASMSize += 5 - $mASMString &= 'BB' & ASMNumber(StringMid($aASM, 9)) - Case StringRegExp($aASM, 'mov ecx,[-[:xdigit:]]{1,8}\z') - $mASMSize += 5 - $mASMString &= 'B9' & ASMNumber(StringMid($aASM, 9)) - Case StringRegExp($aASM, 'mov edx,[-[:xdigit:]]{1,8}\z') - $mASMSize += 5 - $mASMString &= 'BA' & ASMNumber(StringMid($aASM, 9)) - ; mov eax,ecx - Case StringRegExp($aASM, 'mov (eax|ecx|edx|ebx|esp|ebp|esi|edi),(eax|ecx|edx|ebx|esp|ebp|esi|edi)') - $mASMSize += 2 - Switch StringMid($aASM, 5, 3) - Case 'eax' - $lBuffer = 'C0' - Case 'ecx' - $lBuffer = 'C8' - Case 'edx' - $lBuffer = 'D0' - Case 'ebx' - $lBuffer = 'D8' - Case 'esp' - $lBuffer = 'E0' - Case 'ebp' - $lBuffer = 'E8' - Case 'esi' - $lBuffer = 'F0' - Case 'edi' - $lBuffer = 'F8' - EndSwitch - $mASMString &= '8B' & ASMOperand(StringMid($aASM, 9, 3), $lBuffer) - ; mov dword[TraderCostID],ecx - Case StringRegExp($aASM, 'mov dword[[][a-z,A-Z]{4,}[]],ecx') - $mASMSize += 6 - $mASMString &= '890D[' & StringMid($aASM, 11, StringLen($aASM) - 15) & ']' - Case StringRegExp($aASM, 'mov dword[[][a-z,A-Z]{4,}[]],edx') - $mASMSize += 6 - $mASMString &= '8915[' & StringMid($aASM, 11, StringLen($aASM) - 15) & ']' - Case StringRegExp($aASM, 'mov dword[[][a-z,A-Z]{4,}[]],eax') - $mASMSize += 5 - $mASMString &= 'A3[' & StringMid($aASM, 11, StringLen($aASM) - 15) & ']' - ; mov dword[NextStringType],2 - Case StringRegExp($aASM, 'mov dword\[[a-z,A-Z]{4,}\],[-[:xdigit:]]{1,8}\z') - $lBuffer = StringInStr($aASM, ",") - $mASMSize += 10 - $mASMString &= 'C705[' & StringMid($aASM, 11, $lBuffer - 12) & ']' & ASMNumber(StringMid($aASM, $lBuffer + 1)) - ; mov dword[edi],-1 - Case StringRegExp($aASM, 'mov dword[[](eax|ecx|edx|ebx|esp|ebp|esi|edi)[]],[-[:xdigit:]]{1,8}\z') - $mASMSize += 6 - $mASMString &= 'C7' & ASMOperand(StringMid($aASM, 11, 3), '00', True) & _ - ASMNumber(StringMid($aASM, 16, StringLen($aASM) - 15)) - ; mov dword[eax+C],ecx - Case StringRegExp($aASM, 'mov dword[[][abcdeipsx]{3}[-+[:xdigit:]]{2,9}[]],[abcdeipsx]{3}\z') - If StringMid($aASM, 14, 1) <> '+' Then - $lBuffer = BitNOT('0x' & StringMid($aASM, 15, StringInStr($aASM, ']') - 15)) + 1 - Else - $lBuffer = StringMid($aASM, 15, StringInStr($aASM, ']') - 15) - EndIf - $lBuffer = ASMNumber($lBuffer, True) - If @extended Then - $mASMSize += 3 - Local $lStart = 4 - Else - $mASMSize += 6 - Local $lStart = 8 - EndIf - Local $lASM = '' - Switch StringMid($aASM, StringLen($aASM) - 2, 3) - Case 'eax' - $lASM = Hex($lStart, 1) & '0' - Case 'ecx' - $lASM = Hex($lStart, 1) & '8' - Case 'edx' - $lASM = Hex($lStart + 1, 1) & '0' - Case 'ebx' - $lASM = Hex($lStart + 1, 1) & '8' - Case 'esp' - $lASM = Hex($lStart + 2, 1) & '0' - Case 'ebp' - $lASM = Hex($lStart + 2, 1) & '8' - Case 'esi' - $lASM = Hex($lStart + 3, 1) & '0' - Case 'edi' - $lASM = Hex($lStart + 3, 1) & '8' - EndSwitch - $mASMString &= '89' & ASMOperand(StringMid($aASM, 11, 3), $lASM, True) & $lBuffer - ; mov dword[eax],ecx - Case StringRegExp($aASM, 'mov dword[[][abcdeipsx]{3}[]],[abcdeipsx]{3}\z') - $mASMSize += 2 - $lBuffer = '' - Switch StringMid($aASM, StringLen($aASM) - 2, 3) - Case 'eax' - $lBuffer = '00' - Case 'ecx' - $lBuffer = '08' - Case 'edx' - $lBuffer = '10' - Case 'ebx' - $lBuffer = '18' - Case 'esp' - $lBuffer = '20' - Case 'ebp' - $lBuffer = '28' - Case 'esi' - $lBuffer = '30' - Case 'edi' - $lBuffer = '38' - EndSwitch - $mASMString &= '89' & ASMOperand(StringMid($aASM, 11, 3), $lBuffer, True) - ; hardcoded - Case $aASM = 'mov al,byte[ecx+4f]' - $lOpCode = '8A414F' - Case $aASM = 'mov al,byte[ecx+3f]' - $lOpCode = '8A413F' - Case $aASM = 'mov al,byte[ebx]' - $lOpCode = '8A03' - Case $aASM = 'mov al,byte[ecx]' - $lOpCode = '8A01' - Case $aASM = 'mov ah,byte[edi]' - $lOpCode = '8A27' - Case $aASM = 'mov dx,word[ecx]' - $lOpCode = '668B11' - Case $aASM = 'mov dx,word[edx]' - $lOpCode = '668B12' - Case $aASM = 'mov word[eax],dx' - $lOpCode = '668910' - Case Else - MsgBox(0, 'ASM', 'Could not assemble: ' & $aASM) - Exit - EndSelect - Case $lMnemonic = "cmp" ; cmp - Select - ; cmp ebx,dword[MaxAgents] - Case StringRegExp($aASM, 'cmp (eax|ecx|edx|ebx|esp|ebp|esi|edi),dword\[[a-z,A-Z]{4,}\]') - $lBuffer = '' - $mASMSize += 6 - Switch StringMid($aASM, 5, 3) - Case 'eax' - $lBuffer = '05' - Case 'ecx' - $lBuffer = '0D' - Case 'edx' - $lBuffer = '15' - Case 'ebx' - $lBuffer = '1D' - Case 'esp' - $lBuffer = '25' - Case 'ebp' - $lBuffer = '2D' - Case 'esi' - $lBuffer = '35' - Case 'edi' - $lBuffer = '3D' - EndSwitch - $mASMString &= '3B' & $lBuffer & '[' & StringMid($aASM, 15, StringLen($aASM) - 15) & ']' - ; cmp edi,dword[esi] - Case StringRegExp($aASM, 'cmp (eax|ecx|edx|ebx|esp|ebp|esi|edi),dword\[(eax|ecx|edx|ebx|esp|ebp|esi|edi)\]\z') - Local $lBuffer = StringMid($aASM, 15, 3) - If $lBuffer = 'ebp' Or $lBuffer = 'esp' Then - $mASMString &= '3E3B' - $mASMSize += 3 - Else - $mASMString &= '3B' - $mASMSize += 2 - EndIf - Switch StringMid($aASM, 5, 3) - Case 'eax' - $mASMString &= ASMOperand($lBuffer, '00', True, 64) - Case 'ecx' - $mASMString &= ASMOperand($lBuffer, '08', True, 64) - Case 'edx' - $mASMString &= ASMOperand($lBuffer, '10', True, 64) - Case 'ebx' - $mASMString &= ASMOperand($lBuffer, '18', True, 64) - Case 'esp' - $mASMString &= ASMOperand($lBuffer, '20', True, 64) - Case 'ebp' - $mASMString &= ASMOperand($lBuffer, '28', True, 64) - Case 'esi' - $mASMString &= ASMOperand($lBuffer, '30', True, 64) - Case 'edi' - $mASMString &= ASMOperand($lBuffer, '38', True, 64) - EndSwitch - ; cmp edi,dword[exi+4] - Case StringRegExp($aASM, 'cmp (eax|ecx|edx|ebx|esp|ebp|esi|edi),dword\[(eax|ecx|edx|ebx|esp|ebp|esi|edi)[+-][[:xdigit:]]') - If StringMid($aASM, 18, 1) <> '+' Then - $lBuffer = BitNOT('0x' & StringMid($aASM, 19, StringLen($aASM) - 19)) + 1 - Else - $lBuffer = StringMid($aASM, 19, StringLen($aASM) - 19) - EndIf - $lBuffer = ASMNumber($lBuffer, True) - If @extended Then - $mASMSize += 3 - Local $lStart = 4 - Else - $mASMSize += 6 - Local $lStart = 8 - EndIf - Switch StringMid($aASM, 15, 3) - Case 'ebp', 'esp' - Local $lASM = '3E3B' - $mASMSize += 1 - Case Else - Local $lASM = '3B' - EndSwitch - Local $lASMOpcode = '' - Switch StringMid($aASM, 5, 3) - Case 'eax' - $lASMOpcode = Hex($lStart, 1) & '0' - Case 'ecx' - $lASMOpcode = Hex($lStart, 1) & '8' - Case 'edx' - $lASMOpcode = Hex($lStart + 1, 1) & '0' - Case 'ebx' - $lASMOpcode = Hex($lStart + 1, 1) & '8' - Case 'esp' - $lASMOpcode = Hex($lStart + 2, 1) & '0' - Case 'ebp' - $lASMOpcode = Hex($lStart + 2, 1) & '8' - Case 'esi' - $lASMOpcode = Hex($lStart + 3, 1) & '0' - Case 'edi' - $lASMOpcode = Hex($lStart + 3, 1) & '8' - EndSwitch - $mASMString &= $lASM & ASMOperand(StringMid($aASM, 15, 3), $lASMOpcode, True) & $lBuffer - ; cmp dword[DisableRendering],1 - Case StringRegExp($aASM, 'cmp dword[[][a-z,A-Z]{4,}[]],[-[:xdigit:]]') - Local $lStart = StringInStr($aASM, ',') - If StringMid($aASM, $lStart + 1, 1) = '-' Then - $lBuffer = BitNOT('0x' & StringMid($aASM, $lStart + 2)) + 1 - Else - $lBuffer = StringMid($aASM, $lStart + 1) - EndIf - $lBuffer = ASMNumber($lBuffer, True) - If @extended Then - $mASMSize += 7 - $mASMString &= '833D[' & StringMid($aASM, 11, StringInStr($aASM, ",") - 12) & ']' & $lBuffer - Else - $mASMSize += 10 - $mASMString &= '813D[' & StringMid($aASM, 11, StringInStr($aASM, ",") - 12) & ']' & $lBuffer - EndIf - ; cmp eax,TargetLogBase - Case StringRegExp($aASM, 'cmp (eax|ecx|edx|ebx|esp|ebp|esi|edi),[a-z,A-Z]{4,}\z') - $lBuffer = '' - Switch StringMid($aASM, 5, 3) - Case 'eax' - $mASMSize += 5 - $lBuffer = '3D' - Case 'ecx' - $mASMSize += 6 - $lBuffer = '81F9' - Case 'edx' - $mASMSize += 6 - $lBuffer = '81FA' - Case 'ebx' - $mASMSize += 6 - $lBuffer = '81FB' - Case 'esp' - $mASMSize += 6 - $lBuffer = '81FC' - Case 'ebp' - $mASMSize += 6 - $lBuffer = '81FD' - Case 'esi' - $mASMSize += 6 - $lBuffer = '81FE' - Case 'edi' - $mASMSize += 6 - $lBuffer = '81FF' - EndSwitch - $mASMString &= $lBuffer & '[' & StringRight($aASM, StringLen($aASM) - 8) & ']' - ; cmp ebx,14 - Case StringRegExp($aASM, 'cmp (eax|ecx|edx|ebx|esp|ebp|esi|edi),[-[:xdigit:]]{1,}\z') - Local $lStart = StringInStr($aASM, ',') - If StringMid($aASM, $lStart + 1, 1) = '-' Then - $lBuffer = BitNOT('0x' & StringMid($aASM, $lStart + 2)) + 1 - Else - $lBuffer = StringMid($aASM, $lStart + 1) - EndIf - $lBuffer = ASMNumber($lBuffer, True) - If @extended Then - $mASMSize += 3 - $mASMString &= '83' & ASMOperand(StringMid($aASM, 5, 3), 'F8') & $lBuffer - Else - $mASMSize += 6 - $mASMString &= '81' & ASMOperand(StringMid($aASM, 5, 3), 'F8') & $lBuffer - EndIf - ; cmp eax,ecx - Case StringRegExp($aASM, 'cmp (eax|ecx|edx|ebx|esp|ebp|esi|edi),(eax|ecx|edx|ebx|esp|ebp|esi|edi)\z') - $lBuffer = '' - $mASMSize += 2 - Switch StringMid($aASM, 9, 3) - Case 'eax' - $mASMString &= '39' & ASMOperand(StringMid($aASM, 5, 3), 'C0') - Case 'ecx' - $mASMString &= '39' & ASMOperand(StringMid($aASM, 5, 3), 'C8') - Case 'edx' - $mASMString &= '39' & ASMOperand(StringMid($aASM, 5, 3), 'D0') - Case 'ebx' - $mASMString &= '39' & ASMOperand(StringMid($aASM, 5, 3), 'D8') - Case 'esp' - $mASMString &= '39' & ASMOperand(StringMid($aASM, 5, 3), 'E0') - Case 'ebp' - $mASMString &= '39' & ASMOperand(StringMid($aASM, 5, 3), 'E8') - Case 'esi' - $mASMString &= '39' & ASMOperand(StringMid($aASM, 5, 3), 'F0') - Case 'edi' - $mASMString &= '39' & ASMOperand(StringMid($aASM, 5, 3), 'F8') - EndSwitch - ; hardcoded - Case $aASM = 'cmp word[edx],0' - $lOpCode = '66833A00' - Case $aASM = 'cmp al,ah' - $lOpCode = '3AC4' - Case $aASM = 'cmp al,f' - $lOpCode = '3C0F' - Case $aASM = 'cmp cl,byte[esi+1B1]' - $lOpCode = '3A8EB1010000' - Case Else - MsgBox(0, 'ASM', 'Could not assemble: ' & $aASM) - Exit - EndSelect - Case $lMnemonic = "lea" ; lea - Select - ; lea eax,dword[ecx*8+TargetLogBase] - Case StringRegExp($aASM, 'lea eax,dword[[]ecx[*]8[+][a-z,A-Z]{4,}[]]') - $mASMSize += 7 - $mASMString &= '8D04CD[' & StringMid($aASM, 21, StringLen($aASM) - 21) & ']' - ; lea eax,dword[ecx*4+TargetLogBase] - Case StringRegExp($aASM, 'lea eax,dword[[]edx[*]4[+][a-z,A-Z]{4,}[]]') - $mASMSize += 7 - $mASMString &= '8D0495[' & StringMid($aASM, 21, StringLen($aASM) - 21) & ']' - ; lea ebx,dword[eax*4+TargetLogBase] - Case StringRegExp($aASM, 'lea ebx,dword[[]eax[*]4[+][a-z,A-Z]{4,}[]]') - $mASMSize += 7 - $mASMString &= '8D1C85[' & StringMid($aASM, 21, StringLen($aASM) - 21) & ']' - ; hardcoded - Case $aASM = 'lea eax,dword[eax+18]' - $lOpCode = '8D4018' - Case $aASM = 'lea ecx,dword[eax+4]' - $lOpCode = '8D4804' - Case $aASM = 'lea ecx,dword[eax+180]' - $lOpCode = '8D8880010000' - Case $aASM = 'lea edx,dword[eax+4]' - $lOpCode = '8D5004' - Case $aASM = 'lea edx,dword[eax+8]' - $lOpCode = '8D5008' - Case $aASM = 'lea esi,dword[esi+ebx*4]' - $lOpCode = '8D349E' - Case $aASM = 'lea edi,dword[edx+ebx]' - $lOpCode = '8D3C1A' - Case $aASM = 'lea edi,dword[edx+8]' - $lOpCode = '8D7A08' - Case Else - MsgBox(0, 'ASM', 'Could not assemble: ' & $aASM) - Exit - EndSelect - Case $lMnemonic = "add" ; add - Select - ; add eax, TargetLogBase - Case StringRegExp($aASM, 'add eax,[a-z,A-Z]{4,}') And StringInStr($aASM, ',dword') = 0 - $mASMSize += 5 - $mASMString &= '05[' & StringRight($aASM, StringLen($aASM) - 8) & ']' - ; add eax,14 - Case StringRegExp($aASM, 'add eax,[-[:xdigit:]]{1,8}\z') - $lBuffer = ASMNumber(StringMid($aASM, 9), True) - If @extended Then - $mASMSize += 3 - $mASMString &= '83C0' & $lBuffer - Else - $mASMSize += 5 - $mASMString &= '05' & $lBuffer - EndIf - Case StringRegExp($aASM, 'add ecx,[-[:xdigit:]]{1,8}\z') - $lBuffer = ASMNumber(StringMid($aASM, 9), True) - If @extended Then - $mASMSize += 3 - $mASMString &= '83C1' & $lBuffer - Else - $mASMSize += 6 - $mASMString &= '81C1' & $lBuffer - EndIf - Case StringRegExp($aASM, 'add edx,[-[:xdigit:]]{1,8}\z') - $lBuffer = ASMNumber(StringMid($aASM, 9), True) - If @extended Then - $mASMSize += 3 - $mASMString &= '83C2' & $lBuffer - Else - $mASMSize += 6 - $mASMString &= '81C2' & $lBuffer - EndIf - Case StringRegExp($aASM, 'add ebx,[-[:xdigit:]]{1,8}\z') - $lBuffer = ASMNumber(StringMid($aASM, 9), True) - If @extended Then - $mASMSize += 3 - $mASMString &= '83C3' & $lBuffer - Else - $mASMSize += 6 - $mASMString &= '81C3' & $lBuffer - EndIf - Case StringRegExp($aASM, 'add edi,[-[:xdigit:]]{1,8}\z') - $lBuffer = ASMNumber(StringMid($aASM, 9), True) - If @extended Then - $mASMSize += 3 - $mASMString &= '83C7' & $lBuffer - Else - $mASMSize += 6 - $mASMString &= '81C7' & $lBuffer - EndIf - Case Else - MsgBox(0, 'ASM', 'Could not assemble: ' & $aASM) - Exit - EndSelect - Case $lMnemonic = "fstp" ; fstp - ; fstp dword[EnsureEnglish] - If StringRegExp($aASM, 'fstp dword[[][a-z,A-Z]{4,}[]]') Then - $mASMSize += 6 - $mASMString &= 'D91D[' & StringMid($aASM, 12, StringLen($aASM) - 12) & ']' - Else - MsgBox(0, 'ASM', 'Could not assemble: ' & $aASM) - Exit - EndIf - Case $lMnemonic = "push" ; push - Select - ; push dword[EnsureEnglish] - Case StringRegExp($aASM, 'push dword[[][a-z,A-Z]{4,}[]]') - $mASMSize += 6 - $mASMString &= 'FF35[' & StringMid($aASM, 12, StringLen($aASM) - 12) & ']' - ; push CallbackEvent - Case StringRegExp($aASM, 'push [a-z,A-Z]{4,}\z') - $mASMSize += 5 - $mASMString &= '68[' & StringMid($aASM, 6, StringLen($aASM) - 5) & ']' - ; push 14 - Case StringRegExp($aASM, 'push [-[:xdigit:]]{1,8}\z') - $lBuffer = ASMNumber(StringMid($aASM, 6), True) - If @extended Then - $mASMSize += 2 - $mASMString &= '6A' & $lBuffer - Else - $mASMSize += 5 - $mASMString &= '68' & $lBuffer - EndIf - ; hardcoded - Case $aASM = 'push eax' - $lOpCode = '50' - Case $aASM = 'push ecx' - $lOpCode = '51' - Case $aASM = 'push edx' - $lOpCode = '52' - Case $aASM = 'push ebx' - $lOpCode = '53' - Case $aASM = 'push ebp' - $lOpCode = '55' - Case $aASM = 'push esi' - $lOpCode = '56' - Case $aASM = 'push edi' - $lOpCode = '57' - Case $aASM = 'push dword[eax+4]' - $lOpCode = 'FF7004' - Case $aASM = 'push dword[eax+8]' - $lOpCode = 'FF7008' - Case $aASM = 'push dword[eax+c]' - $lOpCode = 'FF700C' - Case Else - MsgBox(0, 'ASM', 'Could not assemble: ' & $aASM) - Exit - EndSelect - Case $lMnemonic = "pop" ; pop - ; hardcoded - Select - Case $aASM = 'pop eax' - $lOpCode = '58' - Case $aASM = 'pop ebx' - $lOpCode = '5B' - Case $aASM = 'pop edx' - $lOpCode = '5A' - Case $aASM = 'pop ecx' - $lOpCode = '59' - Case $aASM = 'pop esi' - $lOpCode = '5E' - Case $aASM = 'pop edi' - $lOpCode = '5F' - Case $aASM = 'pop ebp' - $lOpCode = '5D' - Case Else - MsgBox(0, 'ASM', 'Could not assemble: ' & $aASM) - Exit - EndSelect - Case $lMnemonic = "call" ; call - Select - ; call dword[EnsureEnglish] - Case StringRegExp($aASM, 'call dword[[][a-z,A-Z]{4,}[]]') - $mASMSize += 6 - $mASMString &= 'FF15[' & StringMid($aASM, 12, StringLen($aASM) - 12) & ']' - ; call ActionFunction - Case StringLeft($aASM, 5) = 'call ' And StringLen($aASM) > 8 - $mASMSize += 5 - $mASMString &= 'E8{' & StringMid($aASM, 6, StringLen($aASM) - 5) & '}' - Case Else - MsgBox(0, 'ASM', 'Could not assemble: ' & $aASM) - Exit - EndSelect - Case $lMnemonic = "test" - Switch $aAsm - Case $aASM = 'test eax,eax' - $lOpCode = '85C0' - Case $aASM = 'test ecx,ecx' - $lOpCode = '85C9' - Case $aASM = 'test ebx,ebx' - $lOpCode = '85DB' - Case $aASM = 'test esi,esi' - $lOpCode = '85F6' - Case $aASM = 'test dx,dx' - $lOpCode = '6685D2' - Case $aASM = 'test al,al' - $lOpCode = '84C0' - Case $aASM = 'test al,1' - $lOpCode = 'A801' - Case Else - MsgBox(0, 'ASM', 'Could not assemble: ' & $aASM) - Exit - EndSwitch - Case $lMnemonic = "inc" - Select - ; inc dword[EnsureEnglish] - Case StringRegExp($aASM, 'inc dword\[[a-zA-Z]{4,}\]') - $mASMSize += 6 - $mASMString &= 'FF05[' & StringMid($aASM, 11, StringLen($aASM) - 11) & ']' - Case $aASM = 'inc eax' - $lOpCode = '40' - Case $aASM = 'inc ecx' - $lOpCode = '41' - Case $aASM = 'inc edx' - $lOpCode = '42' - Case $aASM = 'inc ebx' - $lOpCode = '43' - Case Else - MsgBox(0, 'ASM', 'Could not assemble: ' & $aASM) - Exit - EndSelect - Case $lMnemonic = "dec" - Switch $aAsm - Case $aASM = 'dec edx' - $lOpCode = '4A' - Case Else - MsgBox(0, 'ASM', 'Could not assemble: ' & $aASM) - Exit - EndSwitch - Case $lMnemonic = "xor" - Switch $aAsm - Case $aASM = 'xor eax,eax' - $lOpCode = '33C0' - Case $aASM = 'xor ecx,ecx' - $lOpCode = '33C9' - Case $aASM = 'xor edx,edx' - $lOpCode = '33D2' - Case $aASM = 'xor ebx,ebx' - $lOpCode = '33DB' - Case Else - MsgBox(0, 'ASM', 'Could not assemble: ' & $aASM) - Exit - EndSwitch - Case $lMnemonic = "sub" - Select - Case StringRegExp($aASM, 'sub [abcdeipsx]{3},[-[:xdigit:]]{1,8}\z') - $lBuffer = ASMNumber(StringMid($aASM, 9, StringLen($aASM) - 8), True) - If @extended Then - $mASMSize += 3 - Else - $mASMSize += 6 - EndIf - $mASMString &= '83' & ASMOperand(StringMid($aASM, 5, 3), 'E8', False) & $lBuffer - Case Else - MsgBox(0, 'ASM', 'Could not assemble: ' & $aASM) - Exit - EndSelect - Case $lMnemonic = "shl" - Switch $aAsm - Case $aASM = 'shl eax,4' - $lOpCode = 'C1E004' - Case $aASM = 'shl eax,6' - $lOpCode = 'C1E006' - Case $aASM = 'shl eax,7' - $lOpCode = 'C1E007' - Case $aASM = 'shl eax,8' - $lOpCode = 'C1E008' - Case $aASM = 'shl eax,8' - $lOpCode = 'C1E008' - Case $aASM = 'shl eax,9' - $lOpCode = 'C1E009' - Case Else - MsgBox(0, 'ASM', 'Could not assemble: ' & $aASM) - Exit - EndSwitch - Case $lMnemonic = "retn" - If $aASM = 'retn 10' Then $lOpCode = 'C21000' - Case $aASM = 'repe movsb' - $lOpCode = 'F3A4' - Case Else - MsgBox(0, 'ASM', 'Could not assemble: ' & $aASM) - Exit - EndSelect - If $lOpCode <> '' Then - $mASMSize += 0.5 * StringLen($lOpCode) - $mASMString &= $lOpCode - EndIf -EndFunc ;==>_ - -;~ Description: Completes formatting of ASM code. Internal use only. -Func CompleteASMCode() - Local $lInExpression = False - Local $lExpression - Local $lTempASM = $mASMString - Local $lCurrentOffset = Dec(Hex($mMemory)) + $mASMCodeOffset - Local $lToken - For $i In $mLabelDict.Keys - If StringLeft($i, 6) = 'Label_' Then - $mLabelDict.Item($i) = $mMemory + $mLabelDict.Item($i) - $mLabelDict.Key($i) = StringTrimLeft($i, 6) - EndIf - Next - $mASMString = '' - For $i = 1 To StringLen($lTempASM) - $lToken = StringMid($lTempASM, $i, 1) - Switch $lToken - Case '(', '[', '{' - $lInExpression = True - Case ')' - $mASMString &= Hex(GetLabelInfo($lExpression) - Int($lCurrentOffset) - 1, 2) - $lCurrentOffset += 1 - $lInExpression = False - $lExpression = '' - Case ']' - $mASMString &= SwapEndian(Hex(GetLabelInfo($lExpression), 8)) - $lCurrentOffset += 4 - $lInExpression = False - $lExpression = '' - Case '}' - $mASMString &= SwapEndian(Hex(GetLabelInfo($lExpression) - Int($lCurrentOffset) - 4, 8)) - $lCurrentOffset += 4 - $lInExpression = False - $lExpression = '' - Case Else - If $lInExpression Then - $lExpression &= $lToken - Else - $mASMString &= $lToken - $lCurrentOffset += 0.5 - EndIf - EndSwitch - Next -EndFunc ;==>CompleteASMCode - -;~ Description: Returns GetValue($aLabel) and exits, if label cant be found. -Func GetLabelInfo($aLabel) - Local $lValue = GetValue($aLabel) - If $lValue = -1 Then Exit MsgBox(0, 'Label', 'Label: ' & $aLabel & ' not provided') - Return $lValue -EndFunc ;==>GetLabelInfo - -;~ Description: Converts hexadecimal to ASM. -Func ASMNumber($aNumber, $aSmall = False) - If $aNumber >= 0 Then - $aNumber = Dec($aNumber) - EndIf - If $aSmall And $aNumber <= 127 And $aNumber >= -128 Then - Return SetExtended(1, Hex($aNumber, 2)) - Else - Return SetExtended(0, SwapEndian(Hex($aNumber, 8))) - EndIf -EndFunc ;==>ASMNumber - -;~ Descripion: Increases opcode-part according to opcode basis value. -Func ASMOperand($aSearchString, $aOpcodeString, $aESP = False, $aEBP = 0) - Switch $aSearchString - Case 'eax' - Return $aOpcodeString - Case 'ecx' - Return Hex(Dec($aOpcodeString) + 1, 2) - Case 'edx' - Return Hex(Dec($aOpcodeString) + 2, 2) - Case 'ebx' - Return Hex(Dec($aOpcodeString) + 3, 2) - Case 'esp' - If $aESP Then - $mASMSize += 1 - Return Hex(Dec($aOpcodeString) + 4, 2) & '24' - EndIf - Return Hex(Dec($aOpcodeString) + 4, 2) - Case 'ebp' - If $aEBP > 0 Then - $mASMSize += 1 - Return Hex(Dec($aOpcodeString) + 5 + $aEBP, 2) & '00' - EndIf - Return Hex(Dec($aOpcodeString) + 5, 2) - Case 'esi' - Return Hex(Dec($aOpcodeString) + 6, 2) - Case 'edi' - Return Hex(Dec($aOpcodeString) + 7, 2) - EndSwitch -EndFunc -#EndRegion Assembler - -#Region Conversion -;~ Description: Converts float to integer. -Func FloatToInt($nFloat) - Local $tFloat = DllStructCreate("float") - Local $tInt = DllStructCreate("int", DllStructGetPtr($tFloat)) - DllStructSetData($tFloat, 1, $nFloat) - Return DllStructGetData($tInt, 1) -EndFunc ;==>FloatToInt -#EndRegion - -#Region Misc -;~ Description: Prepares data to be used to call Guild War's packet send function. -Func SendPacket($aSize, $aHeader, $aParam1 = 0, $aParam2 = 0, $aParam3 = 0, $aParam4 = 0, $aParam5 = 0, $aParam6 = 0, $aParam7 = 0, $aParam8 = 0, $aParam9 = 0, $aParam10 = 0) - DllStructSetData($mPacket, 2, $aSize) - DllStructSetData($mPacket, 3, $aHeader) - DllStructSetData($mPacket, 4, $aParam1) - DllStructSetData($mPacket, 5, $aParam2) - DllStructSetData($mPacket, 6, $aParam3) - DllStructSetData($mPacket, 7, $aParam4) - DllStructSetData($mPacket, 8, $aParam5) - DllStructSetData($mPacket, 9, $aParam6) - DllStructSetData($mPacket, 10, $aParam7) - DllStructSetData($mPacket, 11, $aParam8) - DllStructSetData($mPacket, 12, $aParam9) - DllStructSetData($mPacket, 13, $aParam10) - Return Enqueue($mPacketPtr, 52) -EndFunc ;==>SendPacket - -;~ Description: Call CommandAction. -Func PerformAction($aAction, $aFlag) - DllStructSetData($mAction, 2, $aAction) - DllStructSetData($mAction, 3, $aFlag) - Return Enqueue($mActionPtr, 12) -EndFunc ;==>PerformAction - -;~ Description: Returns current ping. -Func GetPing() - Return MemoryRead($mPing) -EndFunc ;==>GetPing - -;~ Description: Get name of currently logged in character. -Func GetCharname() - Return MemoryRead($mCharname, 'wchar[30]') -EndFunc ;==>GetCharname - -;~ Description: Returns logged in or not. -Func GetLoggedIn() - Return MemoryRead($mLoggedCounter) > 0 -EndFunc ;==>GetLoggedIn - -;~ Description: Returns currently used language as number, same as GetLanguage(). -Func GetDisplayLanguage() - Static Local $lLanguagePtr = 0 - If $lLanguagePtr = 0 Then - Local $lOffset[6] = [0, 0x18, 0x18, 0x194, 0x4C, 0x40] - $lLanguagePtr = MemoryReadPtrChain($mBasePointer, $lOffset, 'ptr') - EndIf - Return MemoryRead($lLanguagePtr) -EndFunc ;==>GetDisplayLanguage - -;~ Description: Returns the game client's build number. -Func GetBuildNumber() - Return $mBuildNumber -EndFunc ;==>GetBuildNumber - -;~ Description: Sleep a random amount of time. -Func RndSleep($aAmount, $aRandom = 0.05) - Local $lRandom = $aAmount * $aRandom - Sleep(Random($aAmount - $lRandom, $aAmount + $lRandom)) -EndFunc ;==>RndSleep - -;~ Description: Sleep a period of time, plus or minus a tolerance -Func TolSleep($aAmount = 150, $aTolerance = 50) - Sleep(Random($aAmount - $aTolerance, $aAmount + $aTolerance)) -EndFunc ;==>TolSleep - -;~ Description: Sleeps time plus your ping. -Func PingSleep($Time = 1000) - Sleep(GetPing() + $Time) -EndFunc ;==>PingSleep - -;~ Description: Window Handle to game client, variable set during initialize. -Func GetWindowHandle() - Return $mGWHwnd -EndFunc ;==>GetWindowHandle - -;~ Description: Computes distance between two sets of coordinates. -Func ComputeDistance($aX1, $aY1, $aX2, $aY2) - Return Sqrt(($aX1 - $aX2) ^ 2 + ($aY1 - $aY2) ^ 2) -EndFunc ;==>ComputeDistance - -;~ Description: Same as ComputeDistance, but without Sqrt. -Func ComputePseudoDistance($aX1, $aY1, $aX2, $aY2) - Return ($aX1 - $aX2) ^ 2 + ($aY1 - $aY2) ^ 2 -EndFunc ;==>ComputeDistance - -;~ Description: Opens storage window, only in outpost its possible to change content of chest. -Func OpenStorageWindow() - Local $lID = StorageSessionID() - DllStructSetData($mOpenStorage, 2, $lID) - DllStructSetData($mOpenStorage, 3, 0) - DllStructSetData($mOpenStorage, 4, 1) - DllStructSetData($mOpenStorage, 5, 2) - Return Enqueue($mOpenStoragePtr, 20) -EndFunc ;==>OpenStorageWindow - -;~ Description: Gets current storage session ID. -Func StorageSessionID() - Local $lOffset[5] = [0, 0x118, 0x10, 0, 0x14] - Local $lReturn = MemoryReadPtr($mStorageSessionBase, $lOffset) - Return $lReturn[1] -EndFunc ;==>StorageSessionID - -;~ Description: Checks if game client got disconnected and attempts to reconnect. -Func Disconnected() - If MemoryRead($MyPtr + 44, 'long') <> $MyID Then - If SetPointers() Then Return False - EndIf - If MemoryRead($mLoggedCounter) <> 0 Then Return False ; not disconnected at all - Local $lEnabledRendering = False - If Not $mRendering Then - EnableRendering(False) - $lEnabledRendering = True - EndIf - Local $lTimer = 0 - Local $lDeadlock = TimerInit() - Do - $lTimer = TimerInit() - ControlSend(GetWindowHandle(), "", "", "{Enter}") - Do - Sleep(1000) ; no rush - If MemoryRead($mLoggedCounter) <> 0 Then ; we made it back ingame hopefully - If SetPointers() Then - If $lEnabledRendering = False Then DisableRendering() - Return True ; really made it back - EndIf - ConsoleWrite("Couldnt retrieve $MyPtr." & @CRLF) - ExitLoop 2 ; client probably crashed, exit script - EndIf - Until TimerDiff($lTimer) > 10000 - Until TimerDiff($lDeadlock) > 120000 - ConsoleWrite("Exiting script." & @CRLF) - EnableRendering() - RestoreDetour() - Exit -EndFunc ;==>Disconnected - -;~ Description: Tries to get correct $MyID and $MyPtr and resets essential pointer variables to zero. -;~ Called in WaitMapLoading() and Disconnected(). -Func SetPointers() - Local $lDeadlock = TimerInit() - Do - Do - If TimerDiff($lDeadlock) > 15000 Then Return False - Sleep(1000) - $MyID = MemoryRead($mMyID) - Until $MyID > 0 - $MyPtr = GetAgentPtr($MyID) - Until $MyID = MemoryRead($MyPtr + 44, 'long') - $TitlesPtr = 0 - $HeroPtr1 = 0 - $HeroPtr2 = 0 - $HeroPtr3 = 0 - $HeroPtr4 = 0 - $ItemBasePtr = 0 - $BagBasePtr = 0 - $GoldBasePtr = 0 - $PartySizePtr = 0 - $QuestBasePtr = 0 - $SkillbarBasePtr = 0 - $BuffBasePtr = 0 - Return True -EndFunc - -;~ Description: Reset essential variables to zero. Used in event(). -;~ If eventsystem is disabled, this has to be called manually after each loading screen. -Func ResetPointers() - ConsoleWrite("ResetPointers." & @CRLF) - $TitlesPtr = 0 - $HeroPtr1 = 0 - $HeroPtr2 = 0 - $HeroPtr3 = 0 - $HeroPtr4 = 0 - $ItemBasePtr = 0 - $BagBasePtr = 0 - $GoldBasePtr = 0 - $PartySizePtr = 0 - $QuestBasePtr = 0 - $SkillbarBasePtr = 0 - $BuffBasePtr = 0 -EndFunc -#EndRegion \ No newline at end of file + +#include-once + +#Region CommandStructs +; Commands +Global $mPacket = DllStructCreate('ptr;dword;dword;dword;dword;dword;dword;dword;dword;dword;dword;dword;dword') +Global $mPacketPtr = DllStructGetPtr($mPacket) + +Global $mAction = DllStructCreate('ptr;dword;dword') +Global $mActionPtr = DllStructGetPtr($mAction) + +Global $mUseSkill = DllStructCreate('ptr;dword;dword;dword') +Global $mUseSkillPtr = DllStructGetPtr($mUseSkill) + +Global $mMove = DllStructCreate('ptr;float;float;float') +Global $mMovePtr = DllStructGetPtr($mMove) + +Global $mChangeTarget = DllStructCreate('ptr;dword') +Global $mChangeTargetPtr = DllStructGetPtr($mChangeTarget) + +Global $mToggleLanguage = DllStructCreate('ptr;dword') +Global $mToggleLanguagePtr = DllStructGetPtr($mToggleLanguage) + +Global $mUseHeroSkill = DllStructCreate('ptr;dword;dword;dword') +Global $mUseHeroSkillPtr = DllStructGetPtr($mUseHeroSkill) + +Global $mUpdateAgentPos = DllStructCreate('ptr;dword;dword;dword;dword;dword;dword') +Global $mUpdateAgentPosPtr = DllStructGetPtr($mUpdateAgentPos) + +Global $mOpenStorage = DllStructCreate('ptr;dword;dword;dword') +Global $mOpenStoragePtr = DllStructGetPtr($mOpenStorage) + + + +Local $mOpenMerchant = DllStructCreate('ptr;dword;dword;dword;dword') +Local $mOpenMerchantPtr = DllStructGetPtr($mOpenMerchant) + +; Items +Global $mBuyItem = DllStructCreate('ptr;dword;dword;dword') +Global $mBuyItemPtr = DllStructGetPtr($mBuyItem) + +Global $mSellItem = DllStructCreate('ptr;dword;dword') +Global $mSellItemPtr = DllStructGetPtr($mSellItem) + +Global $mSalvage = DllStructCreate('ptr;dword;dword;dword') +Global $mSalvagePtr = DllStructGetPtr($mSalvage) + + + +Global $mGoNpc = DllStructCreate('ptr;dword;dword') +Global $mGoNpcPtr = DllStructGetPtr($mGoNpc) + +; Trader +Global $mTraderBuy = DllStructCreate('ptr') +Global $mTraderBuyPtr = DllStructGetPtr($mTraderBuy) + +Global $mTraderSell = DllStructCreate('ptr') +Global $mTraderSellPtr = DllStructGetPtr($mTraderSell) + +Global $mRequestQuote = DllStructCreate('ptr;dword') +Global $mRequestQuotePtr = DllStructGetPtr($mRequestQuote) + +Global $mRequestQuoteSell = DllStructCreate('ptr;dword') +Global $mRequestQuoteSellPtr = DllStructGetPtr($mRequestQuoteSell) + +; Chat +Global $mSendChat = DllStructCreate('ptr;dword') +Global $mSendChatPtr = DllStructGetPtr($mSendChat) + +Global $mWriteChat = DllStructCreate('ptr') +Global $mWriteChatPtr = DllStructGetPtr($mWriteChat) + +; Attributes +Global $mSetAttributes = DllStructCreate("ptr;dword;dword;dword;dword;dword[16];dword;dword[16]") +Global $mSetAttributesPtr = DllStructGetPtr($mSetAttributes) + +; Log +Global $mSkillLogStruct = DllStructCreate('dword;dword;dword;float') +Global $mSkillLogStructPtr = DllStructGetPtr($mSkillLogStruct) + +Global $mChatLogStruct = DllStructCreate('dword;wchar[256]') +Global $mChatLogStructPtr = DllStructGetPtr($mChatLogStruct) +#EndRegion CommandStructs + +#Region Memory +;~ Description: Open existing local process object. +Func MemoryOpen($aPID) + $mKernelHandle = DllOpen('kernel32.dll') + Local $lOpenProcess = DllCall($mKernelHandle, 'int', 'OpenProcess', 'int', 0x1F0FFF, 'int', 1, 'int', $aPID) + $mGWProcHandle = $lOpenProcess[0] + Return $lOpenProcess <> 0 +EndFunc ;==>MemoryOpen + +;~ Description: Closes process handle opened with MemoryOpen. +Func MemoryClose() + DllCall($mKernelHandle, 'int', 'CloseHandle', 'int', $mGWProcHandle) + DllClose($mKernelHandle) +EndFunc ;==>MemoryClose + +;~ Description: Write a binarystring to an address inside opened process. +Func WriteBinary($aBinaryString, $aAddress, $aRestore = True) + $aBinaryString = BinaryToString('0x' & $aBinaryString) + Local $lSize = BinaryLen($aBinaryString) + Local $lData = DllStructCreate('byte[' & $lSize & ']') + If $aRestore Then + MemoryReadToStruct($aAddress, $lData) + AddRestoreDict($aAddress, DllStructGetData($lData, 1)) + EndIf + DllStructSetData($lData, 1, $aBinaryString) + Local $lRet = DllCall($mKernelHandle, 'int', 'WriteProcessMemory', 'handle', $mGWProcHandle, 'ptr', $aAddress, 'ptr', DllStructGetPtr($lData), 'ulong_ptr', DllStructGetSize($lData), 'ulong_ptr*', 0) + Return SetExtended($lRet[5], $lRet <> 0) +EndFunc ;==>WriteBinary + +;~ Description: Writes data to specified address in opened process. +Func MemoryWrite($aAddress, $aData, $aType = 'dword', $aRestore = False) + Local $lBuffer = DllStructCreate($aType) + If $aRestore Then + MemoryReadToStruct($aAddress, $lBuffer) + AddRestoreDict($aAddress, $lBuffer) + EndIf + DllStructSetData($lBuffer, 1, $aData) + Local $lRet = DllCall($mKernelHandle, 'int', 'WriteProcessMemory', 'handle', $mGWProcHandle, 'ptr', $aAddress, 'ptr', DllStructGetPtr($lBuffer), 'ulong_ptr', DllStructGetSize($lBuffer), 'ulong_ptr*', 0) + Return SetExtended($lRet[5], $lRet <> 0) +EndFunc ;==>MemoryWrite + +;~ Description: Read process memory at specified address. +Func MemoryRead($aAddress, $aType = 'dword') + Local $lBuffer = DllStructCreate($aType) + DllCall($mKernelHandle, 'int', 'ReadProcessMemory', 'handle', $mGWProcHandle, 'ptr', $aAddress, 'ptr', DllStructGetPtr($lBuffer), 'ulong_ptr', DllStructGetSize($lBuffer), 'ulong_ptr*', 0) + Return DllStructGetData($lBuffer, 1) +EndFunc ;==>MemoryRead + +;~ Description: Read a chain of pointers. +Func MemoryReadPtr($aAddress, $aOffset, $aType = 'dword') + Local $lPointerCount = UBound($aOffset) - 2 + Local $lBuffer = DllStructCreate($aType) + For $i = 0 To $lPointerCount + $aAddress += $aOffset[$i] + DllCall($mKernelHandle, 'int', 'ReadProcessMemory', 'handle', $mGWProcHandle, 'ptr', $aAddress, 'ptr', DllStructGetPtr($lBuffer), 'ulong_ptr', DllStructGetSize($lBuffer), 'ulong_ptr*', 0) + $aAddress = DllStructGetData($lBuffer, 1) + If $aAddress = 0 Then + Local $lData[2] = [0, 0] + Return $lData + EndIf + Next + $aAddress += $aOffset[$lPointerCount + 1] + $lBuffer = DllStructCreate($aType) + DllCall($mKernelHandle, 'int', 'ReadProcessMemory', 'handle', $mGWProcHandle, 'ptr', $aAddress, 'ptr', DllStructGetPtr($lBuffer), 'ulong_ptr', DllStructGetSize($lBuffer), 'ulong_ptr*', 0) + Local $lData[2] = [$aAddress, DllStructGetData($lBuffer, 1)] + Return $lData +EndFunc ;==>MemoryReadPtr + +;~ Description: Same as MemoryReadPtr, but returns memoryread + last $aOffset instead of array. +;~ $aOffset = [0, 0x18, 0x2C, 0] returns memoryread at 0x2C +;~ $aOffset = [0, 0x18, 0x2C] returns memoryread at 0x18 and adds to that memoryread 0x2C +Func MemoryReadPtrChain($aAddress, $aOffset, $aType = 'dword') + Local $lPointerCount = UBound($aOffset) - 2 + Local $lBuffer = DllStructCreate($aType) + For $i = 0 To $lPointerCount + $aAddress += $aOffset[$i] + DllCall($mKernelHandle, 'int', 'ReadProcessMemory', 'handle', $mGWProcHandle, 'ptr', $aAddress, 'ptr', DllStructGetPtr($lBuffer), 'ulong_ptr', DllStructGetSize($lBuffer), 'ulong_ptr', 0) + $aAddress = DllStructGetData($lBuffer, 1) + If $aAddress = 0 Then + Local $lData[2] = [0, 0] + Return $lData + EndIf + Next + $aAddress += $aOffset[$lPointerCount + 1] + Return Ptr($aAddress) +EndFunc ;==>MemoryReadPtrChain + +;~ Description: Converts little endian to big endian and vice versa. +Func SwapEndian($aHex) + If IsString($aHex) Then + $aHex = StringReplace($aHex, '0x', '', 1) + Return Hex(Binary(Dec($aHex))) + Else + Return Hex(Binary($aHex)) + EndIf +EndFunc ;==>SwapEndian + +;~ Description: Converts little endian to big endian and vice versa. +Func SwapEndianOld($aHex) + Return StringMid($aHex, 7, 2) & StringMid($aHex, 5, 2) & StringMid($aHex, 3, 2) & StringMid($aHex, 1, 2) +EndFunc ;==>SwapEndian + +;~ Description: Enqueue a pointer to data to be written to process memory. +Func Enqueue($aPtr, $aSize) + If MemoryRead($mLoggedIn) <= 0 Then Return False + Local $lRet = DllCall($mKernelHandle, 'int', 'WriteProcessMemory', 'handle', $mGWProcHandle, 'ptr', 256 * $mQueueCounter + $mQueueBase, 'ptr', $aPtr, 'ulong_ptr', $aSize, 'ulong_ptr*', 0) + If $mQueueCounter = $mQueueSize Then + $mQueueCounter = 0 + Else + $mQueueCounter = $mQueueCounter + 1 + EndIf + Return SetExtended($lRet[5], $lRet <> 0) +EndFunc ;==>Enqueue + +;~ Description: Reads consecutive values from memory to buffer struct. +;~ Author: 4D1. +Func MemoryReadStruct($aAddress, $aStruct = 'dword') + Local $lBuffer = DllStructCreate($aStruct) + DllCall($mKernelHandle, 'int', 'ReadProcessMemory', 'handle', $mGWProcHandle, 'ptr', $aAddress, 'ptr', DllStructGetPtr($lBuffer), 'ulong_ptr', DllStructGetSize($lBuffer), 'ulong_ptr*', 0) + Return $lBuffer +EndFunc ;==>MemoryReadStruct + +;~ Description: Reads consecutive values from memory into referenced struct. +;~ Returns array if successful: [0] -> boolean +;~ [5] -> bytes read +;~ Author: 4D1. +Func MemoryReadToStruct($aAddress, ByRef $aStructbuffer) + Return DllCall($mKernelHandle, 'int', 'ReadProcessMemory', 'handle', $mGWProcHandle, 'ptr', $aAddress, 'ptr', DllStructGetPtr($aStructbuffer), 'ulong_ptr', DllStructGetSize($aStructbuffer), 'ulong_ptr*', 0) +EndFunc ;==>MemoryReadStruct + +;~ Description: Scans for bytestring, to be used after initialize. +Func ScanForPtr($aByteString, $aOffset = 0, $aLength = 8, $aStartAddr = 0x401000, $aEndAddr = 0x900000) + Local $lSystemInfoBuffer = DllStructCreate('word;word;dword;ptr;ptr;dword;dword;dword;dword;word;word') + DllCall($mKernelHandle, 'int', 'GetSystemInfo', 'ptr', DllStructGetPtr($lSystemInfoBuffer)) + Local $lBuffer = DllStructCreate('byte[' & DllStructGetData($lSystemInfoBuffer, 3) & ']') + For $iAddr = $aStartAddr To $aEndAddr Step DllStructGetData($lSystemInfoBuffer, 3) + MemoryReadToStruct($iAddr, $lBuffer) + StringRegExp(DllStructGetData($lBuffer, 1), $aByteString, 1, 2) + If @error = 0 Then + Local $lStringPos = @extended - StringLen($aByteString) - 2 + Local $lStart = $lStringPos + 2 + $aOffset + $aOffset + If $lStart > 0 And $lStart + $aLength <= StringLen(DllStructGetData($lBuffer, 1)) Then + Return SetExtended(Dec(SwapEndian(StringMid(DllStructGetData($lBuffer, 1), $lStart, $aLength))), _ + Ptr($iAddr + $aOffset - 1 + ($lStringPos/2))) + Else + Local $lReturn = Ptr($iAddr + $aOffset + ($lStringPos/2)) + Return SetExtended(MemoryRead($lReturn, 'byte[' & $aLength/2 & ']'), $lReturn - 1) + EndIf + EndIf + Next + Return SetError(1, 0, "0x00000000") +EndFunc + +;~ Description: Injects dll, no communicator. +;~ Author: 4D1. +Func InjectDll($aDllPath) + If Not FileExists($aDllPath) Then Return SetError(2, "", False) + If Not (StringRight($aDllPath, 4) == ".dll") Then Return SetError(3, "", False) + + Local $lDLL_Path = DllStructCreate("char[255]") + DllCall($mKernelHandle, "DWORD", "GetFullPathNameA", "str", $aDllPath, "DWORD", 255, "ptr", DllStructGetPtr($lDLL_Path), "int", 0) + If @error Then Return SetError(5, "", False) + + Local $hModule = DllCall($mKernelHandle, "DWORD", "GetModuleHandleA", "str", "kernel32.dll") + If @error Then Return SetError(7, "", False) + + Local $lpStartAddress = DllCall($mKernelHandle, "DWORD", "GetProcAddress", "DWORD", $hModule[0], "str", "LoadLibraryA") + If @error Then Return SetError(8, "", False) + + Local $lpParameter = DllCall($mKernelHandle, "DWORD", "VirtualAllocEx", "int", $mGWProcHandle, "int", 0, "ULONG_PTR", DllStructGetSize($lDLL_Path), "DWORD", 0x3000, "int", 4) + If @error Then Return SetError(9, "", False) + + DllCall("kernel32.dll", "BOOL", "WriteProcessMemory", "int", $mGWProcHandle, "DWORD", $lpParameter[0], "str", DllStructGetData($lDLL_Path, 1), "ULONG_PTR", DllStructGetSize($lDLL_Path), "int", 0) + If @error Then Return SetError(10, "", False) + + Local $hThread = DllCall($mKernelHandle, "int", "CreateRemoteThread", "DWORD", $mGWProcHandle, "int", 0, "int", 0, "DWORD", $lpStartAddress[0], "DWORD", $lpParameter[0], "int", 0, "int", 0) + If @error Then Return SetError(11, "", False) + + Return SetError(0, "", True) +EndFunc ;==>InjectDll +#EndRegion Memory + +#Region Initialisation +;~ Description: Searches in $aGW specified client and calls MemoryOpen() on that client. +;~ Injects asm functions, detours etc. into that game client. +Func Initialize($aGW = CharacterSelector(), $aChangeTitle = True, $aUseStringLog = False, $aUseEventSystem = False) + Local $lWinList + Local $lCharname = 0 + $mChangeTitle = $aChangeTitle + $mUseStringLog = $aUseStringLog + $mUseEventSystem = $aUseEventSystem + If IsString($aGW) Then ; Charactername + $lWinList = WinList("[CLASS:ArenaNet_Dx_Window_Class; REGEXPTITLE:^\D+$]") + For $i = 1 To $lWinList[0][0] + If StringInStr($lWinList[$i][0], 'Guild Wars Wiki') Then ContinueLoop + $mGWHwnd = $lWinList[$i][1] + MemoryOpen(WinGetProcess($mGWHwnd)) + If $mGWProcHandle Then + If StringRegExp(ScanForCharname(), $aGW) = 1 Then + $lCharname = $aGW + ExitLoop + EndIf + EndIf + MemoryClose() + $mGWProcHandle = 0 + Next + Else ; Process ID + $lWinList = WinList() + For $i = 1 To $lWinList[0][0] + $mGWHwnd = $lWinList[$i][1] + If WinGetProcess($mGWHwnd) = $aGW Then + MemoryOpen($aGW) + $lCharname = ScanForCharname() + ExitLoop + EndIf + Next + EndIf + Return InitClient($lCharname) +EndFunc + +;~ Description: Injects asm functions, detours etc. into the game client. +;~ Formerly part of Initialize(). MemoryOpen() has to be called before calling InitiClient(), to get $mGWProcHandle. +;~ Also needed: $mGWHwnd. +Func InitClient($aCharname = '') + If $mGWProcHandle = 0 Then Return 0 ; MemoryOpen() not successfully called. + If $mLabelDict = 0 Then CreateLabelDict() + $mGWTitleOld = WinGetTitle($mGWHwnd) + If $mUsePlugins Then InitPlugins() + + Scan() + + $mBasePointer = MemoryRead(GetScannedAddress('ScanBasePointer', -3)) + SetValue('BasePointer', $mBasePointer) + $mAgentBase = MemoryRead(GetScannedAddress('ScanAgentBase', 13)) + SetValue('AgentBase', $mAgentBase) + $mMaxAgents = $mAgentBase + 8 + SetValue('MaxAgents', $mMaxAgents) + $mMyID = $mAgentBase - 84 + SetValue('MyID', $mMyID) + $mMapLoading = $mAgentBase - 240 + $mCurrentTarget = $mAgentBase - 1280 + SetValue('PacketLocation', MemoryRead(GetScannedAddress('ScanBaseOffset', -3))) + + + + $mPing = MemoryRead(GetScannedAddress('ScanPing', -8)) + $mMapID = MemoryRead(GetScannedAddress('ScanMapID', 71)) + $mLastMapID = MemoryRead(GetScannedAddress('ScanLastMapID', 0x1A)) + $mLoggedIn = Ptr($mMapID - 0x7D4) + $mLoggedCounter = GetValue('PacketLocation') + 0x14 + $mRegion = MemoryRead(GetScannedAddress('ScanRegion', 8)) + $mLanguage = MemoryRead(GetScannedAddress('ScanLanguage', 8)) + 12 + $mSkillBase = MemoryRead(GetScannedAddress('ScanSkillBase', 9)) + $mSkillTimer = MemoryRead(GetScannedAddress('ScanSkillTimer', -3)) + + + $mZoomStill = GetScannedAddress("ScanZoomStill", 0x24);>=== Edit + $mZoomMoving = GetScannedAddress("ScanZoomMoving", 0x21);>=== Edit + + + + + $mDialogOwnerID = MemoryRead(GetScannedAddress('ScanDialogOwnerID', -0x14)) + + + Local $lTemp + $lTemp = GetScannedAddress('ScanBuildNumber', 0x2C); >=== Edit + $mBuildNumber = MemoryRead($lTemp + MemoryRead($lTemp) +5); >=== Edit + +;dont work atm + $lTemp = MemoryRead(GetScannedAddress("ScanStorageSessionIDBase", - 3)); >=== Edit + $mStorageSessionBase = MemoryRead($lTemp) + + $mStorageFunction = GetScannedAddress('ScanStorage', -30) + ConsoleWrite(@CRLF & @CRLF & @CRLF & "StorageFunction = " & $mStorageFunction & @CRLF & @CRLF & @CRLF & @CRLF) + $mStorageFunction = $mStorageFunction + 2 + ConsoleWrite(@CRLF & @CRLF & @CRLF & "StorageFunction = " & $mStorageFunction & @CRLF & @CRLF & @CRLF & @CRLF) + SetValue('StorageFunction', $mStorageFunction) + + $mMerchantWindow = GetScannedAddress('ScanMerchantWindow', 1) + ConsoleWrite(@CRLF & @CRLF & @CRLF & "MerchantWindow = " & $mMerchantWindow & @CRLF & @CRLF & @CRLF & @CRLF) + SetValue('MerchantWindow', $mMerchantWindow) +; and also dont need it + + $lTemp = GetScannedAddress('ScanEngine', -16) + SetValue('MainStart', $lTemp) + SetValue('MainReturn', $lTemp + 5) + + ;; Rendering Mod ;; + SetValue('RenderingMod', $lTemp + 116) + SetValue('RenderingModReturn', $lTemp + 132 + 6) + + ;; TargetLog ;; + $lTemp = GetScannedAddress('ScanTargetLog', -0x1F) + SetValue('TargetLogStart', $lTemp) + SetValue('TargetLogReturn', $lTemp + 5) + ;; SkillLog ;; + $lTemp = GetScannedAddress('ScanSkillLog', 1) + SetValue('SkillLogStart', $lTemp) + SetValue('SkillLogReturn', $lTemp + 5) + + $lTemp = GetScannedAddress('ScanSkillCompleteLog', -4) + SetValue('SkillCompleteLogStart', $lTemp) + SetValue('SkillCompleteLogReturn', $lTemp + 5) + + $lTemp = GetScannedAddress('ScanSkillCancelLog', 5) + SetValue('SkillCancelLogStart', $lTemp) + SetValue('SkillCancelLogReturn', $lTemp + 6) + + ;; ChatLog ;; + $lTemp = GetScannedAddress('ScanChatLog', 18) + SetValue('ChatLogStart', $lTemp) + SetValue('ChatLogReturn', $lTemp + 6) + + ;; TraderHook ;; + $lTemp = GetScannedAddress('ScanTraderHook', -7) + SetValue('TraderHookStart', $lTemp) + SetValue('TraderHookReturn', $lTemp + 5) + + ;; StringLog ;; + $lTemp = GetScannedAddress('ScanStringFilter1', -2);>=== Edit + SetValue('StringFilter1Start', $lTemp) + SetValue('StringFilter1Return', $lTemp + 5) + + $lTemp = GetScannedAddress('ScanStringFilter2', 0x61);>=== Edit + SetValue('StringFilter2Start', $lTemp) + SetValue('StringFilter2Return', $lTemp + 5) + SetValue('StringLogStart', GetScannedAddress('ScanStringLog', 35)) + + ;; LoadFinished ;; + $lTemp = GetScannedAddress('ScanLoadFinished', -0x48) + SetValue('LoadFinishedStart', $lTemp) + SetValue('LoadFinishedReturn', $lTemp + 5) + + + ;; ObstructedHook ;; + $lTemp = GetScannedAddress('ScanObstructedText', -0x1B) + SetValue('ObstructedHookStart', $lTemp) + SetValue('ObstructedHookReturn', $lTemp + 5) + + ;; Misc ;; + SetValue('PostMessage', MemoryRead(GetScannedAddress('ScanPostMessage', 11))) + SetValue('Sleep', MemoryRead(MemoryRead(GetValue('ScanSleep') + 8) + 3)) + SetValue('SalvageFunction', MemoryRead(GetValue('ScanSalvageFunction') + 8) - 18) + SetValue('SalvageGlobal', MemoryRead(MemoryRead(GetValue('ScanSalvageGlobal') + 8) + 1)) + SetValue('MoveFunction', GetScannedAddress('ScanMoveFunction', 1)) + SetValue('UseSkillFunction', GetScannedAddress('ScanUseSkillFunction', 1)) + SetValue('ChangeTargetFunction', GetScannedAddress('ScanChangeTargetFunction', -119)) + + SetValue('WriteChatFunction', GetScannedAddress('ScanWriteChatFunction', 1)) + + SetValue('SellItemFunction', GetScannedAddress('ScanSellItemFunction', -85)) + SetValue('PacketSendFunction', GetScannedAddress('ScanPacketSendFunction', 1)) + + + SetValue('ActionBase', MemoryRead(GetScannedAddress('ScanActionBase', -9))) + SetValue('ActionFunction', GetScannedAddress('ScanActionFunction', -5)) + SetValue('UseHeroSkillFunction', GetScannedAddress('ScanUseHeroSkillFunction', 0xA1)) + SetValue('BuyItemFunction', GetScannedAddress('ScanBuyItemFunction', 1)) + SetValue('RequestQuoteFunction', GetScannedAddress('ScanRequestQuoteFunction', -2)) + SetValue('TraderFunction', GetScannedAddress('ScanTraderFunction', -71)) + + SetValue('ClickToMoveFix', GetScannedAddress("ScanClickToMoveFix", -0x1E));>==== Editg + + SetValue('UpdateAgentPositionFunction', GetScannedAddress('ScanUpdatePositionFunction', -0x95)) + SetValue('GoNpcFunction', GetScannedAddress('ScanGoNpcFunction', -0x9F)) + If $mUsePlugins Then AddPluginSetValues() + + ;; Size ;; + SetValue('QueueSize', '0x00000010') + SetValue('SkillLogSize', '0x00000010') + SetValue('ChatLogSize', '0x00000010') + SetValue('TargetLogSize', '0x00000200') + SetValue('StringLogSize', '0x00000200') + SetValue('CallbackEvent', '0x00000501') + + ModifyMemory() + + ;; Set global variables ;; + $mQueueCounter = MemoryRead(GetValue('QueueCounter')) + $mQueueSize = GetValue('QueueSize') - 1 + $mQueueBase = GetValue('QueueBase') + $mTargetLogBase = GetValue('TargetLogBase') + $mStringLogBase = GetValue('StringLogBase') + $mMapIsLoaded = GetValue('MapIsLoaded') + $mEnsureEnglish = GetValue('EnsureEnglish') + $mTraderQuoteID = GetValue('TraderQuoteID') + $mTraderCostID = GetValue('TraderCostID') + $mTraderCostValue = GetValue('TraderCostValue') + $mDisableRendering = GetValue('DisableRendering') + $mAgentMovement = GetAgentMovementPtr() + $mObstructed = GetValue('ObstructedState') + $mCinematic = MemoryRead(GetScannedAddress('ScanCinematic', 0x23)) + $g_mMapNameIds = ScanForPtr("568BF183FE067211", +032, 8) + 0x00EC + ConsoleWrite("$g_mMapNameIds = " & $g_mMapNameIds & @CRLF) + + Local $lContextOffsets[3] = [0, 0x18, 0] + $mContextPtr = MemoryReadPtrChain($mBasePointer, $lContextOffsets, 'ptr') + + $mBasePtr182C = MemoryRead($mContextPtr + 0x2C,'ptr') + $mBasePtr1840 = MemoryRead($mContextPtr + 0x40,'ptr') + $mBasePtr184C = MemoryRead($mContextPtr + 0x4C,'ptr') + + + If $mUseEventSystem Then MemoryWrite(GetValue('CallbackHandle'), $mGUI) + ;; commands ;; + DllStructSetData($mPacket, 1, GetValue('CommandPacketSend')) + DllStructSetData($mUseSkill, 1, GetValue('CommandUseSkill')) + DllStructSetData($mMove, 1, GetValue('CommandMove')) + + DllStructSetData($mChangeTarget, 1, GetValue('CommandChangeTarget')) + DllStructSetData($mToggleLanguage, 1, GetValue('CommandToggleLanguage')) + DllStructSetData($mUseHeroSkill, 1, GetValue('CommandUseHeroSkill')) + DllStructSetData($mUpdateAgentPos, 1, Getvalue('CommandUpdateAgentPos')) + + ;; Items ;; + DllStructSetData($mBuyItem, 1, GetValue('CommandBuyItem')) + DllStructSetData($mSellItem, 1, GetValue('CommandSellItem')) + DllStructSetData($mSalvage, 1, GetValue('CommandSalvage')) + DllStructSetData($mAction, 1, GetValue('CommandAction')) + + DllStructSetData($mOpenStorage, 1, GetValue('CommandOpenStorage')) + + ;; Trader ;; + DllStructSetData($mTraderBuy, 1, GetValue('CommandTraderBuy')) + DllStructSetData($mTraderSell, 1, GetValue('CommandTraderSell')) + DllStructSetData($mRequestQuote, 1, GetValue('CommandRequestQuote')) + DllStructSetData($mRequestQuoteSell, 1, GetValue('CommandRequestQuoteSell')) + DllStructSetData($mGoNpc, 1, GetValue('CommandGoNpc')) + ;; Chat ;; + DllStructSetData($mSendChat, 1, GetValue('CommandSendChat')) + DllStructSetData($mSendChat, 2, 0x5E) + DllStructSetData($mWriteChat, 1, GetValue('CommandWriteChat')) + + ;; Attributes ;; + DllStructSetData($mSetAttributes, 1, GetValue('CommandPacketSend')) + DllStructSetData($mSetAttributes, 2, 0x90) + DllStructSetData($mSetAttributes, 3, 9) + + If $mUsePlugins Then SetPluginVariables() + If $mChangeTitle Then + If $aCharname = '' Then + WinSetTitle($mGWHwnd, '', 'Guild Wars - ' & GetCharname()) + Else + WinSetTitle($mGWHwnd, '', 'Guild Wars - ' & $aCharname) + EndIf + EndIf + $mASMString = '' + $mASMSize = 0 + $mASMCodeOffset = 0 + Return $mGWHwnd +EndFunc ;==>Initialize + +;~ Description: Get Value to Key in $mLabelDict. +Func GetValue($aKey) + If $mLabelDict.Exists($aKey) Then + Return $mLabelDict($aKey) + Else + Return -1 + EndIf +EndFunc ;==>GetValue + +;~ Description: Add Key and Value to $mLabelDict. +Func SetValue($aKey, $aValue) + $mLabelDict($aKey) = Ptr($aValue) + ConsoleWrite($aKey & " = " & Ptr($aValue) & @CRLF) +EndFunc ;==>SetValue + +;~ Description: Creates dictionary object and sets keys to case insensitive. +Func CreateLabelDict() + $mLabelDict = ObjCreate('Scripting.Dictionary') + $mLabelDict.CompareMode = 1 ; keys -> case insensitive +EndFunc ;==>CreateLabelDict + +;~ Description: Returns Ptr to Agent Movement struct. +Func GetAgentMovementPtr() + Static Local $Offset[4] = [0, 0x18, 0x8, 0xE8] + Return MemoryReadPtr($mBasePointer, $Offset, 'ptr')[1] +EndFunc ;==>GetAgentMovementPtr + +;~ Description: Scans memory for listed patterns. +Func Scan() + $mASMSize = 0 + $mASMCodeOffset = 0 + $mASMString = '' + + ;; Scan patterns ;; + _('MainModPtr/4') + _('ScanBasePointer:') + AddPattern('85C0750F8BCE') + _('ScanAgentBase:') + AddPattern('568BF13BF07204') + _('ScanEngine:') + AddPattern('5356DFE0F6C441') + _('ScanLoadFinished:') + AddPattern('90558BEC83EC1053578BD9') + _('ScanPostMessage:') + AddPattern('6A00680080000051FF15') + _('ScanTargetLog:') + AddPattern('F1894DF0763A8B43') + _('ScanChangeTargetFunction:') + AddPattern('33C03BDA0F95C033') + _('ScanMoveFunction:') + AddPattern('558BEC83EC2056578BF98D4DF0') + _('ScanPing:') + AddPattern('908D41248B49186A30') + _('ScanMapID:') + AddPattern('B07F8D55') + _('ScanLoggedIn:') + AddPattern('85C07411B807') + _('ScanRegion:') + AddPattern('83F9FD7406') + _('ScanLanguage:') + AddPattern('C38B75FC8B04B5') + _('ScanUseSkillFunction:') + AddPattern('558BEC83EC1053568BD9578BF2895DF0') + _('ScanPacketSendFunction:') + AddPattern('558BEC83EC2C5356578BF985') + _('ScanBaseOffset:') + AddPattern('5633F63BCE740E5633D2') + _('ScanWriteChatFunction:') + AddPattern('558BEC5153894DFC8B4D0856578B') + _('ScanSkillLog:') + AddPattern('408946105E5B5D') + _('ScanSkillCompleteLog:') + AddPattern('741D6A006A40') + _('ScanSkillCancelLog:') + AddPattern('85C0741D6A006A42') + _('ScanChatLog:') + AddPattern('8B45F48B138B4DEC50');<----- Chat Log (orginal8B45F48B138B4DEC50)AddPattern('8B56148B4E0CE8') + _('ScanSellItemFunction:') + AddPattern('8B4D2085C90F858E') + _('ScanStringLog:') + AddPattern('893E8B7D10895E04397E08') + _('ScanStringFilter1:') + AddPattern('51568B7508578BF9833E00') + _('ScanStringFilter2:') + AddPattern('D85DF85F5E5BDFE0F6C441') + _('ScanActionFunction:') + AddPattern('8B7D0883FF098BF175116876010000') + _('ScanActionBase:') + AddPattern('8B4208A80175418B4A08') + _('ScanSkillBase:') + AddPattern('8D04B65EC1E00505') + _('ScanUseHeroSkillFunction:') + AddPattern('8D0C765F5E8B');change made + _('ScanBuyItemFunction:') + AddPattern('558BEC81ECC000000053568B75085783FE108BFA8BD97614') + _('ScanRequestQuoteFunction:') + AddPattern('81EC9C00000053568B') + _('ScanTraderFunction:') + AddPattern('8B45188B551085') + _('ScanTraderHook:') + AddPattern('8955FC6A008D55F8B9BA') + _('ScanSleep:') + AddPattern('5F5E5B741A6860EA0000') + _('ScanSalvageFunction:') + AddPattern('8BFA8BD9897DF0895DF4') + _('ScanSalvageGlobal:') + AddPattern('8B018B4904A3') + _('ScanSkillTimer:') + AddPattern('85C974158BD62BD183FA64') + + _('ScanClickToMoveFix:') + AddPattern('568BF1578B460883F80F');>==== Edit + + _('ScanZoomStill:') + AddPattern('89470CEBD1');>==== Edit + + _('ScanZoomMoving:') + AddPattern('EB358B4304');>==== Edit + + _('ScanBuildNumber:') + AddPattern('558BEC83EC4053568BD9') + + _('ScanUpdatePositionFunction:') + AddPattern('8B46043B875401') + _('ScanObstructedText:') + AddPattern('8BC88B460C85C0894DEC') + _('ScanCinematic:') + AddPattern('568BF15783FE0A8BFA') + _('ScanGoNpcFunction:') + AddPattern('558BEC83EC285356578BF28BD9') + _('ScanLastMapID:') + AddPattern('7409578D4DAC') + _('ScanDialogOwnerID:') + AddPattern('75146A006A018BD38BCF') + + _('ScanMerchantWindow:') + AddPattern('558BEC81ECF8000000535657') + + _('ScanStorage:');from gwax + AddPattern('8BD183E10283E20189') + + _('ScanStorageSessionIDBase:') + AddPattern('8D14768D14908B4208A80175418B4A0885C9') + +;~ _('ScanStorage:') +;~ AddPattern('6A00BA12000000E87CCDFFFFBA120000008BCE') + + If $mUsePlugins Then AddPluginScans() + ;; Scan engine ;; + _('ScanProc:') + _('pushad') + _('mov ecx,401000') + _('mov esi,ScanProc') + _('ScanLoop:') + _('inc ecx') + _('mov al,byte[ecx]') + _('mov edx,ScanBasePointer') + ; Inner Loop ; + _('ScanInnerLoop:') + _('mov ebx,dword[edx]') + _('cmp ebx,-1') + _('jnz ScanContinue') + _('add edx,50') + _('cmp edx,esi') + _('jnz ScanInnerLoop') + _('cmp ecx,900000') + _('jnz ScanLoop') + _('jmp ScanExit') + ; Continue ; + _('ScanContinue:') + _('lea edi,dword[edx+ebx]') + _('add edi,C') + _('mov ah,byte[edi]') + _('cmp al,ah') + _('jz ScanMatched') + _('mov dword[edx],0') + _('add edx,50') + _('cmp edx,esi') + _('jnz ScanInnerLoop') + _('cmp ecx,900000') + _('jnz ScanLoop') + _('jmp ScanExit') + ; Matched ; + _('ScanMatched:') + _('inc ebx') + _('mov edi,dword[edx+4]') + _('cmp ebx,edi') + _('jz ScanFound') + _('mov dword[edx],ebx') + _('add edx,50') + _('cmp edx,esi') + _('jnz ScanInnerLoop') + _('cmp ecx,900000') + _('jnz ScanLoop') + _('jmp ScanExit') + ; Found ; + _('ScanFound:') + _('lea edi,dword[edx+8]') + _('mov dword[edi],ecx') + _('mov dword[edx],-1') + _('add edx,50') + _('cmp edx,esi') + _('jnz ScanInnerLoop') + _('cmp ecx,900000') + _('jnz ScanLoop') + ; Exit ; + _('ScanExit:') + _('popad') + _('retn') + Local $lScanMemory = MemoryRead($mBase, 'ptr') + If $lScanMemory = 0 Then + $mMemory = DllCall($mKernelHandle, 'ptr', 'VirtualAllocEx', 'handle', $mGWProcHandle, 'ptr', 0, 'ulong_ptr', $mASMSize, 'dword', 0x1000, 'dword', 0x40) + $mMemory = $mMemory[0] + AddRestoreDict($mBase, "0x00000000") + MemoryWrite($mBase, $mMemory) + Else + $mMemory = $lScanMemory + EndIf + CompleteASMCode() + If $lScanMemory = 0 Then + WriteBinary($mASMString, $mMemory + $mASMCodeOffset) + Local $lThread = DllCall($mKernelHandle, 'int', 'CreateRemoteThread', 'int', $mGWProcHandle, 'ptr', 0, 'int', 0, 'int', GetLabelInfo('ScanProc'), 'ptr', 0, 'int', 0, 'int', 0) + $lThread = $lThread[0] + Local $lResult + Do + $lResult = DllCall($mKernelHandle, 'int', 'WaitForSingleObject', 'int', $lThread, 'int', 50) + Until $lResult[0] <> 258 + DllCall($mKernelHandle, 'int', 'CloseHandle', 'int', $lThread) + EndIf +EndFunc ;==>Scan + +;~ Description: Formats and adds pattern-string to $mASMString. +Func AddPattern($aPattern) + Local $lSize = Int(0.5 * StringLen($aPattern)) + $mASMString &= '00000000' & SwapEndian(Hex($lSize, 8)) & '00000000' & $aPattern + $mASMSize += $lSize + 12 + For $i = 1 To 68 - $lSize + $mASMSize += 1 + $mASMString &= '00' + Next +EndFunc ;==>AddPattern + +;~ Description: Returns scanned address +/- offset. +Func GetScannedAddress($aLabel, $aOffset) + Local $lLabelInfo = GetLabelInfo($aLabel) + Return MemoryRead($lLabelInfo + 8) - MemoryRead($lLabelInfo + 4) + $aOffset +EndFunc ;==>GetScannedAddress + +;~ Description: Scans game client memory for charname. +Func ScanForCharname($aByteString = '90909066C705', $aStartAddr = 0x401000, $aEndAddr = 0x900000) + Local $lSystemInfoBuffer = DllStructCreate('word;word;dword;ptr;ptr;dword;dword;dword;dword;word;word') + DllCall($mKernelHandle, 'int', 'GetSystemInfo', 'ptr', DllStructGetPtr($lSystemInfoBuffer)) + Local $lBuffer = DllStructCreate('byte[' & DllStructGetData($lSystemInfoBuffer, 3) & ']') + For $iAddr = $aStartAddr To $aEndAddr Step DllStructGetData($lSystemInfoBuffer, 3) + MemoryReadToStruct($iAddr, $lBuffer) + StringRegExp(DllStructGetData($lBuffer, 1), $aByteString, 1, 2) + If @error = 0 Then + Local $lStringPos = @extended - StringLen($aByteString) - 2 + Local $lStart = $lStringPos + 14 + If $lStart + 8 > StringLen(DllStructGetData($lBuffer, 1)) Then + $mCharname = MemoryRead($iAddr + 0x6 + ($lStringPos/2), 'ptr') + Else + $mCharname = '0x' & SwapEndian(StringMid(DllStructGetData($lBuffer, 1), $lStart, 8)) + EndIf + Return GetCharname() + EndIf + Next + Return '' +EndFunc ;==>ScanForCharname + +;~ Description: Gets Winlists of open game client windows. +;~ If there's more than one, a small GUI is opened with a ComboBox to select Charname from. +Func CharacterSelector() + Local $lWinList = WinList("[CLASS:ArenaNet_Dx_Window_Class; REGEXPTITLE:^\D+$]") + Switch $lWinList[0][0] + Case 0 + Exit MsgBox(0, "Error", "No Guild Wars Clients were found.") + Case 1 + Return WinGetProcess($lWinList[1][1]) + Case Else + Local $lCharStr = "", $lFirstChar + For $winCount = 1 To $lWinList[0][0] + MemoryOpen(WinGetProcess($lWinList[$winCount][1])) + $lCharStr &= ScanForCharname() + If $winCount = 1 Then $lFirstChar = GetCharname() + If $winCount <> $lWinList[0][0] Then $lCharStr &= "|" + MemoryClose() + Next + Local $GUICharSelector = GUICreate("Character Selector", 171, 64, 192, 124) + Local $ComboCharSelector = GUICtrlCreateCombo("", 8, 8, 153, 25) + Local $ButtonCharSelector = GUICtrlCreateButton("Use This Character", 8, 32, 153, 25) + GUICtrlSetData($ComboCharSelector, $lCharStr,$lFirstChar) + GUISetState(@SW_SHOW, $GUICharSelector) + While 1 + Switch GUIGetMsg() + Case $ButtonCharSelector + Local $tmp = GUICtrlRead($ComboCharSelector) + GUIDelete($GUICharSelector) + Return $tmp + Case -3 + Exit + EndSwitch + Sleep(25) + WEnd + EndSwitch +EndFunc ;==>CharacterSelector + +;~ Description: Returns a string of charnames, delimeter: '|'. +Func GetLoggedCharnames() + Local $lWinList = WinList("[CLASS:ArenaNet_Dx_Window_Class; REGEXPTITLE:^\D+$]") + Local $lCharStr = '' + Switch $lWinList[0][0] + Case 0 + Exit MsgBox(0, "Error", "No Guild Wars Clients were found.") + Case 1 + MemoryOpen(WinGetProcess($lWinList[1][1])) + $lCharStr &= ScanForCharname() + $mFirstChar = $lCharStr + MemoryClose() + Case Else + For $winCount = 1 To $lWinList[0][0] + MemoryOpen(WinGetProcess($lWinList[$winCount][1])) + $lCharStr &= ScanForCharname() + If $winCount = 1 Then $mFirstChar = $lCharStr + If $winCount <> $lWinList[0][0] Then $lCharStr &= "|" + MemoryClose() + Next + EndSwitch + Return $lCharStr +EndFunc ;==>GetLoggedCharnames +#EndRegion Initialisation + +#Region Callback +;~ Description: Controls Event System. +Func SetEvent($aSkillActivate = '', $aSkillCancel = '', $aSkillComplete = '', $aChatReceive = '', $aLoadFinished = '') + If Not $mUseEventSystem Then Return + If $aSkillActivate <> '' Then + WriteDetour('SkillLogStart', 'SkillLogProc') + Else + $mASMString = '' + _('inc eax') + _('mov dword[esi+10],eax') + _('pop esi') + WriteBinary($mASMString, GetValue('SkillLogStart')) + EndIf + If $aSkillCancel <> '' Then + WriteDetour('SkillCancelLogStart', 'SkillCancelLogProc') + Else + $mASMString = '' + _('push 0') + _('push 42') + _('mov ecx,esi') + WriteBinary($mASMString, GetValue('SkillCancelLogStart')) + EndIf + If $aSkillComplete <> '' Then + WriteDetour('SkillCompleteLogStart', 'SkillCompleteLogProc') + Else + $mASMString = '' + _('mov eax,dword[edi+4]') + _('test eax,eax') + WriteBinary($mASMString, GetValue('SkillCompleteLogStart')) + EndIf + If $aChatReceive <> '' Then + WriteDetour('ChatLogStart', 'ChatLogProc') + Else + $mASMString = '' + _('add edi,E') + _('cmp eax,B') + WriteBinary($mASMString, GetValue('ChatLogStart')) + EndIf + $mSkillActivate = $aSkillActivate + $mSkillCancel = $aSkillCancel + $mSkillComplete = $aSkillComplete + $mChatReceive = $aChatReceive + $mLoadFinished = $aLoadFinished +EndFunc ;==>SetEvent + +;~ Description: Internal use for event system. Calls different event functions. +;~ modified by gigi +Func Event($hwnd, $msg, $wparam, $lparam) + Switch $lparam + Case 0x1 + DllCall($mKernelHandle, 'int', 'ReadProcessMemory', 'int', $mGWProcHandle, 'int', $wparam, 'ptr', $mSkillLogStructPtr, 'int', 16, 'int', '') + Call($mSkillActivate, DllStructGetData($mSkillLogStruct, 1), DllStructGetData($mSkillLogStruct, 2), DllStructGetData($mSkillLogStruct, 3), DllStructGetData($mSkillLogStruct, 4)) + Case 0x2 + DllCall($mKernelHandle, 'int', 'ReadProcessMemory', 'int', $mGWProcHandle, 'int', $wparam, 'ptr', $mSkillLogStructPtr, 'int', 16, 'int', '') + Call($mSkillCancel, DllStructGetData($mSkillLogStruct, 1), DllStructGetData($mSkillLogStruct, 2), DllStructGetData($mSkillLogStruct, 3)) + Case 0x3 + DllCall($mKernelHandle, 'int', 'ReadProcessMemory', 'int', $mGWProcHandle, 'int', $wparam, 'ptr', $mSkillLogStructPtr, 'int', 16, 'int', '') + Call($mSkillComplete, DllStructGetData($mSkillLogStruct, 1), DllStructGetData($mSkillLogStruct, 2), DllStructGetData($mSkillLogStruct, 3)) + Case 0x4 + DllCall($mKernelHandle, 'int', 'ReadProcessMemory', 'int', $mGWProcHandle, 'int', $wparam, 'ptr', $mChatLogStructPtr, 'int', 512, 'int', '') + Local $lMessage = DllStructGetData($mChatLogStruct, 2) + ;ConsoleWrite($lMessage & " " & DllStructGetData($mChatLogStruct, 1) & @CRLF) + + Local $lChannel + Local $lSender + Switch DllStructGetData($mChatLogStruct, 1) + Case 0 + $lChannel = "Alliance" + $lSender = StringMid($lMessage, 6, StringInStr($lMessage, "") - 6) + $lMessage = StringTrimLeft($lMessage, StringInStr($lMessage, "") + 6) + Case 3 + $lChannel = "All" + $lSender = StringMid($lMessage, 6, StringInStr($lMessage, "") - 6) + $lMessage = StringTrimLeft($lMessage, StringInStr($lMessage, "") + 6) + Case 9 + $lChannel = "Guild" + $lSender = StringMid($lMessage, 6, StringInStr($lMessage, "") - 6) + $lMessage = StringTrimLeft($lMessage, StringInStr($lMessage, "") + 6) + Case 11 + $lChannel = "Team" + $lSender = StringMid($lMessage, 6, StringInStr($lMessage, "") - 6) + $lMessage = StringTrimLeft($lMessage, StringInStr($lMessage, "") + 6) + Case 12 + $lChannel = "Trade" + $lSender = StringMid($lMessage, 6, StringInStr($lMessage, "") - 6) + $lMessage = StringTrimLeft($lMessage, StringInStr($lMessage, "") + 6) + Case 10 + If StringLeft($lMessage, 3) == "-> " Then + $lChannel = "Sent" + $lSender = StringMid($lMessage, 10, StringInStr($lMessage, "") - 10) + $lMessage = StringTrimLeft($lMessage, StringInStr($lMessage, "") + 6) + Else + $lChannel = "Global" + $lSender = "Guild Wars" + EndIf + Case 13 + $lChannel = "Advisory" + $lSender = "Guild Wars" + $lMessage = StringTrimLeft($lMessage, StringInStr($lMessage, "") + 6) + Case 14 + $lChannel = "Whisper" + $lSender = StringMid($lMessage, 7, StringInStr($lMessage, "") - 7) + $lMessage = StringTrimLeft($lMessage, StringInStr($lMessage, "") + 6) + Case Else + $lChannel = "Other" + $lSender = "Other" + EndSwitch + Call($mChatReceive, $lChannel, $lSender, $lMessage) + Case 0x5 + ResetPointers() + Call($mLoadFinished) + EndSwitch +EndFunc ;==>Event +#EndRegion Callback + +#Region Modification +;~ Description: Calls ASM functions. +Func ModifyMemory() + $mASMSize = 0 + $mASMCodeOffset = 0 + $mASMString = '' + + CreateData() + CreateMain() + CreateTargetLog() + CreateSkillLog() + CreateSkillCancelLog() + CreateSkillCompleteLog() + CreateChatLog() + CreateTraderHook() + CreateLoadFinished() + CreateStringLog() + CreateStringFilter1() + CreateStringFilter2() + CreateRenderingMod() + CreateObstructedHook() + CreateCommands() + + If $mUsePlugins Then AddPluginASM() + Local $lModMemory = MemoryRead(MemoryRead($mBase), 'ptr') + If $lModMemory = 0 Then + $mMemory = DllCall($mKernelHandle, 'ptr', 'VirtualAllocEx', 'handle', $mGWProcHandle, 'ptr', 0, 'ulong_ptr', $mASMSize, 'dword', 0x1000, 'dword', 0x40) + $mMemory = $mMemory[0] + MemoryWrite(MemoryRead($mBase), $mMemory) + $mMemoryEnd = Ptr($mMemory + $mASMSize + 40) + Else + $mMemory = $lModMemory + EndIf + CompleteASMCode() + + If $lModMemory = 0 Then + WriteBinary($mASMString, $mMemory + $mASMCodeOffset) + WriteBinary("83F8009090", GetValue('ClickToMoveFix')) + MemoryWrite(GetValue('QueuePtr'), GetValue('QueueBase')) + MemoryWrite(GetValue('SkillLogPtr'), GetValue('SkillLogBase')) + MemoryWrite(GetValue('ChatLogPtr'), GetValue('ChatLogBase')) + MemoryWrite(GetValue('StringLogPtr'), GetValue('StringLogBase')) + EndIf + WriteDetour('MainStart', 'MainProc') + WriteDetour('TargetLogStart', 'TargetLogProc') + WriteDetour('TraderHookStart', 'TraderHookProc') + WriteDetour('LoadFinishedStart', 'LoadFinishedProc') + WriteDetour('RenderingMod', 'RenderingModProc') + WriteDetour('ObstructedHookStart', 'ObstructedHookProc') + If $mUseStringLog Then + WriteDetour('StringLogStart', 'StringLogProc') + WriteDetour('StringFilter1Start', 'StringFilter1Proc') + WriteDetour('StringFilter2Start', 'StringFilter2Proc') + EndIf + If $mUsePlugins Then AddPluginDetours() +EndFunc ;==>ModifyMemory + +;~ Description: Writes a jump 'from'-'to' to process memory. +Func WriteDetour($aFrom, $aTo) + Local $lFrom = GetLabelInfo($aFrom) + WriteBinary('E9' & SwapEndian(Hex(GetLabelInfo($aTo) - $lFrom - 5)), $lFrom) +EndFunc ;==>WriteDetour + +;~ Description: Add Key and Value to $mRestoreDict. +Func AddRestoreDict($aKey, $aItem) + If IsDllStruct($aItem) Then + Local $lBuffer = DllStructCreate('byte[' & DllStructGetSize($aItem) & ']', DllStructGetPtr($aItem)) + $aItem = DllStructGetData($lBuffer, 1) + EndIf + If $aItem == '' Then Return + If $mRestoreDict = 0 Then CreateRestoreDict() + $mRestoreDict($aKey) = $aItem + +EndFunc + +;~ Description: Restore data saved in $mRestoreDict. +Func RestoreDetour() + While GetMapLoading() = 2 + Sleep(1000) + WEnd + Local $lStr = "" + If $mRestoreDict.Item($mBase) = "0x00000000" Then + Local $lItem, $lSize, $lTemp + $lStr = "Restoring data: " & @CRLF + For $i In $mRestoreDict.Keys + $lItem = $mRestoreDict.Item($i) + If StringLeft($lItem, 2) == '0x' Then $lItem = StringTrimLeft($lItem, 2) + $lSize = 0.5 * StringLen($lItem) + $lTemp = MemoryRead(Ptr($i), 'byte[' & $lSize & ']') + WriteBinary($lItem, $i, False) + $lStr &= Ptr($i) & ': ' & $lItem & ' | ' & $lTemp & ' -> ' & MemoryRead(Ptr($i), 'byte[' & $lSize & ']') & @CRLF + Next + WinSetTitle($mGWHwnd, '', $mGWTitleOld) + DllCall($mKernelHandle, 'int', 'VirtualFreeEx', 'handle', $mGWProcHandle, 'ptr', $mMemory, 'int', 0, 'dword', 0x8000) + ElseIf $mUsePlugins Then + $lStr = "Client was already injected. Only restoring Dialoghook." + WinSetTitle($mGWHwnd, '', $mGWTitleOld) + WriteBinary('558BEC8B41', GetLabelInfo('DialogLogStart')) + EndIf + Consolewrite($lStr & @CRLF) +EndFunc + +;~ Description: Creates dictionary object and sets keys to case insensitive. Internal use RestoreDetour. +Func CreateRestoreDict() + $mRestoreDict = ObjCreate('Scripting.Dictionary') + $mRestoreDict.CompareMode = 1 ; keys -> case insensitive +EndFunc ;==>CreateLabelDict + +;~ Description: ASM variables. +Func CreateData() + _('CallbackHandle/4') + _('QueueCounter/4') + _('SkillLogCounter/4') + _('ChatLogCounter/4') + _('ChatLogLastMsg/4') + _('MapIsLoaded/4') + _('NextStringType/4') + _('EnsureEnglish/4') + _('TraderQuoteID/4') + _('TraderCostID/4') + _('TraderCostValue/4') + _('DisableRendering/4') + _('QueueBase/' & 256 * GetValue('QueueSize')) + _('TargetLogBase/' & 4 * GetValue('TargetLogSize')) + _('SkillLogBase/' & 16 * GetValue('SkillLogSize')) + _('StringLogBase/' & 256 * GetValue('StringLogSize')) + _('ChatLogBase/' & 512 * GetValue('ChatLogSize')) + _('ObstructedState/4') + If $mUsePlugins Then AddPluginData() +EndFunc ;==>CreateData + +;~ Description: ASM function. Internal use only. +Func CreateMain() + _('MainProc:') + _('pushad') + _('mov eax,dword[EnsureEnglish]') + _('test eax,eax') + _('jz MainMain') + + _('mov ecx,dword[BasePointer]') + _('mov ecx,dword[ecx+18]') + _('mov ecx,dword[ecx+18]') + _('mov ecx,dword[ecx+194]') + _('mov al,byte[ecx+4f]') + _('cmp al,f') + _('ja MainMain') + _('mov ecx,dword[ecx+4c]') + _('mov al,byte[ecx+3f]') + _('cmp al,f') + _('ja MainMain') + _('mov eax,dword[ecx+40]') + _('test eax,eax') + _('jz MainMain') + + _('mov ecx,dword[ActionBase]') + _('mov ecx,dword[ecx+170]') + _('mov ecx,dword[ecx+20]') + _('mov ecx,dword[ecx]') + _('push 0') + _('push 0') + _('push bb') + _('mov edx,esp') + _('push 0') + _('push edx') + _('push 18') + _('call ActionFunction') + _('pop eax') + _('pop ebx') + _('pop ecx') + + _('MainMain:') + _('mov eax,dword[QueueCounter]') + _('mov ecx,eax') + _('shl eax,8') + _('add eax,QueueBase') + _('mov ebx,dword[eax]') + _('test ebx,ebx') + _('jz MainExit') + + _('push ecx') + _('mov dword[eax],0') + _('jmp ebx') + + _('CommandReturn:') + _('pop eax') + _('inc eax') + _('cmp eax,QueueSize') + _('jnz MainSkipReset') + _('xor eax,eax') + _('MainSkipReset:') + _('mov dword[QueueCounter],eax') + + _('MainExit:') + _('popad') + _('mov ebp,esp') + _('sub esp,14') + _('ljmp MainReturn') +EndFunc ;==>CreateMain + +;~ Description: ASM function. Internal use only. +Func CreateTargetLog() + _('TargetLogProc:') + _('cmp ecx,4') + _('jz TargetLogMain') + _('cmp ecx,32') + _('jz TargetLogMain') + _('cmp ecx,3C') + _('jz TargetLogMain') + _('jmp TargetLogExit') + + _('TargetLogMain:') + _('pushad') + _('mov ecx,dword[ebp+8]') + _('test ecx,ecx') + _('jnz TargetLogStore') + _('mov ecx,edx') + + _('TargetLogStore:') + _('lea eax,dword[edx*4+TargetLogBase]') + _('mov dword[eax],ecx') + _('popad') + + _('TargetLogExit:') + _('push ebx') + _('push esi') + _('push edi') + _('mov edi,edx') + _('ljmp TargetLogReturn') +EndFunc ;==>CreateTargetLog + +;~ Description: ASM function. Internal use only. +Func CreateSkillLog() + _('SkillLogProc:') + _('pushad') + _('mov eax,dword[SkillLogCounter]') + _('push eax') + _('shl eax,4') + _('add eax,SkillLogBase') + _('mov ecx,dword[edi]') + _('mov dword[eax],ecx') + _('mov ecx,dword[ecx*4+TargetLogBase]') + _('mov dword[eax+4],ecx') + _('mov ecx,dword[edi+4]') + _('mov dword[eax+8],ecx') + _('mov ecx,dword[edi+8]') + _('mov dword[eax+c],ecx') + _('push 1') + _('push eax') + _('push CallbackEvent') + _('push dword[CallbackHandle]') + _('call dword[PostMessage]') + _('pop eax') + _('inc eax') + _('cmp eax,SkillLogSize') + _('jnz SkillLogSkipReset') + _('xor eax,eax') + + _('SkillLogSkipReset:') + _('mov dword[SkillLogCounter],eax') + _('popad') + _('inc eax') + _('mov dword[esi+10],eax') + _('pop esi') + _('ljmp SkillLogReturn') +EndFunc ;==>CreateSkillLog + +;~ Description: ASM function. Internal use only. +Func CreateSkillCancelLog() + _('SkillCancelLogProc:') + _('pushad') + _('mov eax,dword[SkillLogCounter]') + _('push eax') + _('shl eax,4') + _('add eax,SkillLogBase') + _('mov ecx,dword[edi]') + _('mov dword[eax],ecx') + _('mov ecx,dword[ecx*4+TargetLogBase]') + _('mov dword[eax+4],ecx') + _('mov ecx,dword[edi+4]') + _('mov dword[eax+8],ecx') + _('push 2') + _('push eax') + _('push CallbackEvent') + _('push dword[CallbackHandle]') + _('call dword[PostMessage]') + _('pop eax') + _('inc eax') + _('cmp eax,SkillLogSize') + _('jnz SkillCancelLogSkipReset') + _('xor eax,eax') + + _('SkillCancelLogSkipReset:') + _('mov dword[SkillLogCounter],eax') + _('popad') + _('push 0') + _('push 42') + _('mov ecx,esi') + _('ljmp SkillCancelLogReturn') +EndFunc ;==>CreateSkillCancelLog + +;~ Description: ASM function. Internal use only. +Func CreateSkillCompleteLog() + _('SkillCompleteLogProc:') + _('pushad') + _('mov eax,dword[SkillLogCounter]') + _('push eax') + _('shl eax,4') + _('add eax,SkillLogBase') + _('mov ecx,dword[edi]') + _('mov dword[eax],ecx') + _('mov ecx,dword[ecx*4+TargetLogBase]') + _('mov dword[eax+4],ecx') + _('mov ecx,dword[edi+4]') + _('mov dword[eax+8],ecx') + _('push 3') + _('push eax') + _('push CallbackEvent') + _('push dword[CallbackHandle]') + _('call dword[PostMessage]') + _('pop eax') + _('inc eax') + _('cmp eax,SkillLogSize') + _('jnz SkillCompleteLogSkipReset') + _('xor eax,eax') + + _('SkillCompleteLogSkipReset:') + _('mov dword[SkillLogCounter],eax') + _('popad') + _('mov eax,dword[edi+4]') + _('test eax,eax') + _('ljmp SkillCompleteLogReturn') +EndFunc ;==>CreateSkillCompleteLog + +;~ Description: ASM function. Internal use only. +Func CreateChatLog() + _('ChatLogProc:') + _('pushad') + _('mov ecx,dword[ebx]') + _('mov ebx,eax') + _('mov eax,dword[ChatLogCounter]') + _('push eax') + _('shl eax,9') + _('add eax,ChatLogBase') + _('mov dword[eax],ebx') + _('mov edi,eax') + _('add eax,4') + _('xor ebx,ebx') + + _('ChatLogCopyLoop:') + _('mov dx,word[ecx]') + _('mov word[eax],dx') + _('add ecx,2') + _('add eax,2') + _('inc ebx') + _('cmp ebx,FF') + _('jz ChatLogCopyExit') + _('test dx,dx') + _('jnz ChatLogCopyLoop') + + _('ChatLogCopyExit:') + _('push 4') + _('push edi') + _('push CallbackEvent') + _('push dword[CallbackHandle]') + _('call dword[PostMessage]') + _('pop eax') + _('inc eax') + _('cmp eax,ChatLogSize') + _('jnz ChatLogSkipReset') + _('xor eax,eax') + _('ChatLogSkipReset:') + _('mov dword[ChatLogCounter],eax') + _('popad') + + _('ChatLogExit:') + _('add edi,E') + _('cmp eax,B') + _('ljmp ChatLogReturn') +EndFunc ;==>CreateChatLog + +;~ Description: ASM function. Internal use only. +Func CreateTraderHook() + _('TraderHookProc:') + _('mov dword[TraderCostID],ecx') + _('mov dword[TraderCostValue],edx') + _('push eax') + _('mov eax,dword[TraderQuoteID]') + _('inc eax') + _('cmp eax,200') + _('jnz TraderSkipReset') + _('xor eax,eax') + _('TraderSkipReset:') + _('mov dword[TraderQuoteID],eax') + _('pop eax') + _('mov ebp,esp') + _('sub esp,8') + _('ljmp TraderHookReturn') +EndFunc ;==>CreateTraderHook + +;~ Description: ASM function. Internal use only. +Func CreateLoadFinished() + _('LoadFinishedProc:') + _('pushad') + _('mov eax,1') + _('mov dword[MapIsLoaded],eax') + _('xor ebx,ebx') + _('mov eax,StringLogBase') + + _('LoadClearStringsLoop:') + _('mov dword[eax],0') + _('inc ebx') + _('add eax,100') + _('cmp ebx,StringLogSize') + _('jnz LoadClearStringsLoop') + + _('xor ebx,ebx') + _('mov eax,TargetLogBase') + _('LoadClearTargetsLoop:') + _('mov dword[eax],0') + _('inc ebx') + _('add eax,4') + _('cmp ebx,TargetLogSize') + _('jnz LoadClearTargetsLoop') + + _('push 5') + _('push 0') + _('push CallbackEvent') + _('push dword[CallbackHandle]') + _('call dword[PostMessage]') + _('popad') + _('mov edx,dword[esi+1C]') + _('mov ecx,edi') + _('ljmp LoadFinishedReturn') +EndFunc ;==>CreateLoadFinished + +Func CreateStringLog() + _('StringLogProc:') + _('pushad') + _('mov eax,dword[NextStringType]') + _('test eax,eax') + _('jz StringLogExit') + + _('cmp eax,1') + _('jnz StringLogFilter2') + _('mov eax,dword[ebp+37c]') + _('jmp StringLogRangeCheck') + + _('StringLogFilter2:') + _('cmp eax,2') + _('jnz StringLogExit') + _('mov eax,dword[ebp+338]') + + _('StringLogRangeCheck:') + _('mov dword[NextStringType],0') + _('cmp eax,0') + _('jbe StringLogExit') + _('cmp eax,StringLogSize') + _('jae StringLogExit') + + _('shl eax,8') + _('add eax,StringLogBase') + _('xor ebx,ebx') + + _('StringLogCopyLoop:') + _('mov dx,word[ecx]') + _('mov word[eax],dx') + _('add ecx,2') + _('add eax,2') + _('inc ebx') + _('cmp ebx,80') + _('jz StringLogExit') + _('test dx,dx') + _('jnz StringLogCopyLoop') + + _('StringLogExit:') + _('popad') + _('mov esp,ebp') + _('pop ebp') + _('retn 10') +EndFunc ;==>CreateStringLog + +;~ Description: ASM function. Internal use only. +Func CreateStringFilter1() + _('StringFilter1Proc:') + _('mov dword[NextStringType],1') + _('push ebp') + _('mov ebp,esp') + _('push ecx') + _('push esi') + _('ljmp StringFilter1Return') +EndFunc ;==>CreateStringFilter1 + +;~ Description: ASM function. Internal use only. +Func CreateStringFilter2() + _('StringFilter2Proc:') + _('mov dword[NextStringType],2') + _('push ebp') + _('mov ebp,esp') + _('push ecx') + _('push esi') + _('ljmp StringFilter2Return') +EndFunc ;==>CreateStringFilter2 + +Func CreateObstructedHook() + _('ObstructedHookProc:') + _('mov eax,dword[ecx]') + _('cmp eax,8AB') + _('jnz ObstructedHookEnd') + _('mov dword[ObstructedState],eax') + _('ObstructedHookEnd:') + _('mov ebp,esp') + _('sub esp,18') + _('ljmp ObstructedHookReturn') +EndFunc + +;~ Description: ASM function. Internal use only. +Func CreateRenderingMod() + _('RenderingModProc:') + _('cmp dword[DisableRendering],1') + _('jz RenderingModSkipCompare') + _('cmp eax,ebx') + _('ljne RenderingModReturn') + + _('RenderingModSkipCompare:') + $mASMSize += 17 + $mASMString &= StringTrimLeft(MemoryRead(GetValue("RenderingMod") + 4, "byte[17]"), 2) + _('cmp dword[DisableRendering],1') + _('jz DisableRenderingProc') + _('retn') + + _('DisableRenderingProc:') + _('push 1') + _('call dword[Sleep]') + _('retn') +EndFunc ;==>CreateRenderingMod + +;~ Description: ASM functions as strings, each line calls conversion function _(). Internal use only. +Func CreateCommands() + + #Region Commands + ; PacketSend ; + _('CommandPacketSend:') + _('mov ecx,dword[PacketLocation]') + _('lea edx,dword[eax+8]') + _('push edx') + _('mov edx,dword[eax+4]') + _('mov eax,ecx') + _('call PacketSendFunction') + _('ljmp CommandReturn') + ; Action ; + _('CommandAction:') + _('mov ecx,dword[ActionBase]') + _('mov ecx,dword[ecx+250]') + _('mov ecx,dword[ecx+10]') + _('mov ecx,dword[ecx]') + _('push 0') + _('push 0') + _('push dword[eax+4]') + _('mov edx,esp') + _('push 0') + _('push edx') + _('push dword[eax+8]') + _('call ActionFunction') + _('pop eax') + _('pop ebx') + _('pop ecx') + _('ljmp CommandReturn') + ; UseSkill ; + _('CommandUseSkill:') + _('mov ecx,dword[MyID]') + _('mov edx,dword[eax+C]') + _('push edx') + _('mov edx,dword[eax+4]') + _('dec edx') + _('push dword[eax+8]') + _('call UseSkillFunction') + _('ljmp CommandReturn') + ; Move ; + _('CommandMove:') + _('lea ecx,dword[eax+4]') + _('call MoveFunction') + _('ljmp CommandReturn') + ; ChangeTarget ; + _('CommandChangeTarget:') + _('mov ecx,dword[eax+4]') + _('xor edx,edx') + _('call ChangeTargetFunction') + _('ljmp CommandReturn') + ; ToggleLanguage ; + _('CommandToggleLanguage:') + _('mov ecx,dword[ActionBase]') + _('mov ecx,dword[ecx+170]') + _('mov ecx,dword[ecx+20]') + _('mov ecx,dword[ecx]') + _('push 0') + _('push 0') + _('push bb') + _('mov edx,esp') + _('push 0') + _('push edx') + _('push dword[eax+4]') + _('call ActionFunction') + _('pop eax') + _('pop ebx') + _('pop ecx') + _('ljmp CommandReturn') + ; UseHeroSkill ; + _('CommandUseHeroSkill:') + _('mov ecx,dword[eax+4]') + _('mov edx,dword[eax+c]') + _('mov eax,dword[eax+8]') + _('push eax') + _('call UseHeroSkillFunction') + _('ljmp CommandReturn') + ; UpdateAgentPos ; + _('CommandUpdateAgentPos:') + _('add eax,4') + _('mov ecx,eax') + _('call UpdateAgentPositionFunction') + _('ljmp CommandReturn') + ; Go NPC ; + _('CommandGoNpc:') + _('mov ecx,dword[eax+4]') + _('mov edx,dword[eax+8]') + _('call GoNpcFunction') + _('ljmp CommandReturn') + #EndRegion Commands + + #Region Items + ; Buy ; + _('CommandBuyItem:') + _('add eax,4') + _('push eax') + _('add eax,4') + _('push eax') + _('push 1') + _('push 0') + _('push 0') + _('push 0') + _('push 0') + _('mov ecx,1') + _('mov edx,dword[eax+4]') + _('call BuyItemFunction') + _('ljmp CommandReturn') + + ; Sell ; + _('CommandSellItem:') + _('push 0') + _('push 0') + _('push 0') + _('push dword[eax+4]') + _('push 0') + _('add eax,8') + _('push eax') + _('push 1') + _('mov ecx,b') + _('xor edx,edx') + _('call SellItemFunction') + _('ljmp CommandReturn') + + + ; OpenStorage ; + _('CommandOpenStorage:') + _('pushad') + _('add eax,4') + _('mov ecx,dword[eax]') + _('add eax,4') + _('mov edx,eax') + _('call StorageFunction') + _('popad') + + + ; Salvage ; + _('CommandSalvage:') + _('mov ebx,SalvageGlobal') + _('mov ecx,dword[eax+4]') + _('mov dword[ebx],ecx') + _('push ecx') + _('mov ecx,dword[eax+8]') + _('add ebx,4') + _('mov dword[ebx],ecx') + _('mov edx,dword[eax+c]') + _('mov dword[ebx],ecx') + _('call SalvageFunction') + _('ljmp CommandReturn') + + + #EndRegion Items + + #Region Trader + ; Buy ; + _('CommandTraderBuy:') + _('push 0') + _('push TraderCostID') + _('push 1') + _('push 0') + _('push 0') + _('push 0') + _('push 0') + _('mov ecx,c') + _('mov edx,dword[TraderCostValue]') + _('call TraderFunction') + _('mov dword[TraderCostID],0') + _('mov dword[TraderCostValue],0') + _('ljmp CommandReturn') + ; Sell ; + _('CommandTraderSell:') + _('push 0') + _('push 0') + _('push 0') + _('push dword[TraderCostValue]') + _('push 0') + _('push TraderCostID') + _('push 1') + _('mov ecx,d') + _('xor edx,edx') + _('call TraderFunction') + _('mov dword[TraderCostID],0') + _('mov dword[TraderCostValue],0') + _('ljmp CommandReturn') + ; QuoteBuy ; + _('CommandRequestQuote:') + _('mov dword[TraderCostID],0') + _('mov dword[TraderCostValue],0') + _('add eax,4') + _('push eax') + _('push 1') + _('push 0') + _('push 0') + _('push 0') + _('push 0') + _('mov ecx,c') + _('xor edx,edx') + _('call RequestQuoteFunction') + _('ljmp CommandReturn') + ; QuoteSell ; + _('CommandRequestQuoteSell:') + _('mov dword[TraderCostID],0') + _('mov dword[TraderCostValue],0') + _('push 0') + _('push 0') + _('push 0') + _('add eax,4') + _('push eax') + _('push 1') + _('push 0') + _('mov ecx,d') + _('xor edx,edx') + _('call RequestQuoteFunction') + _('ljmp CommandReturn') + #EndRegion Trader + + #Region Chat + ; Send ; + _('CommandSendChat:') + _('mov ecx,dword[PacketLocation]') + _('add eax,4') + _('push eax') + _('mov edx,11c') + _('mov eax,ecx') + _('call PacketSendFunction') + _('ljmp CommandReturn') + ; Write ; + _('CommandWriteChat:') + _('add eax,4') + _('mov edx,eax') + _('xor ecx,ecx') + _('add eax,28') + _('push eax') + _('call WriteChatFunction') + _('ljmp CommandReturn') + #EndRegion Chat + +EndFunc ;==>CreateCommands +#EndRegion Modification + +#Region Assembler + +;~ Description: Converts ASM commands to opcodes and updates global variables. +Func _($aASM) + ;quick and dirty x86assembler unit: + ;relative values stringregexp + ;static values hardcoded + Local $lBuffer + Local $lOpCode = '' + Local $lMnemonic = StringLeft($aASM, StringInStr($aASM, ' ') - 1) + Select + Case $lMnemonic = "" ; variables and single word opcodes + Select + Case StringRight($aASM, 1) = ':' + SetValue('Label_' & StringLeft($aASM, StringLen($aASM) - 1), $mASMSize) + Case StringInStr($aASM, '/') > 0 + SetValue('Label_' & StringLeft($aASM, StringInStr($aASM, '/') - 1), $mASMSize) + Local $lOffset = StringRight($aASM, StringLen($aASM) - StringInStr($aASM, '/')) + $mASMSize += $lOffset + $mASMCodeOffset += $lOffset + Case $aASM = 'pushad' ; push all + $lOpCode = '60' + Case $aASM = 'popad' ; pop all + $lOpCode = '61' + Case $aASM = 'nop' + $lOpCode = '90' + Case $aASM = 'retn' + $lOpCode = 'C3' + Case $aASM = 'clc' + $lOpCode = 'F8' + EndSelect + Case $lMnemonic = "nop" ; nop + If StringLeft($aASM, 5) = 'nop x' Then + $lBuffer = Int(Number(StringTrimLeft($aASM, 5))) + $mASMSize += $lBuffer + For $i = 1 To $lBuffer + $mASMString &= '90' + Next + EndIf + Case StringLeft($lMnemonic, 2) = "lj" Or StringLeft($lMnemonic, 1) = "j" ; jump + Local $lStringLeft5 = StringLeft($aASM, 5) + Local $lStringLeft4 = StringLeft($aASM, 4) + Local $lStringLeft3 = StringLeft($aASM, 3) + Select + Case $lStringLeft5 = 'ljmp ' + $mASMSize += 5 + $mASMString &= 'E9{' & StringRight($aASM, StringLen($aASM) - 5) & '}' + Case $lStringLeft5 = 'ljne ' + $mASMSize += 6 + $mASMString &= '0F85{' & StringRight($aASM, StringLen($aASM) - 5) & '}' + Case $lStringLeft4 = 'jmp ' And StringLen($aASM) > 7 + $mASMSize += 2 + $mASMString &= 'EB(' & StringRight($aASM, StringLen($aASM) - 4) & ')' + Case $lStringLeft4 = 'jae ' + $mASMSize += 2 + $mASMString &= '73(' & StringRight($aASM, StringLen($aASM) - 4) & ')' + Case $lStringLeft4 = 'jnz ' + $mASMSize += 2 + $mASMString &= '75(' & StringRight($aASM, StringLen($aASM) - 4) & ')' + Case $lStringLeft4 = 'jbe ' + $mASMSize += 2 + $mASMString &= '76(' & StringRight($aASM, StringLen($aASM) - 4) & ')' + Case $lStringLeft4 = 'jge ' + $mASMSize += 2 + $mASMString &= '7D(' & StringRight($aASM, StringLen($aASM) - 4) & ')' + Case $lStringLeft4 = 'jle ' + $mASMSize += 2 + $mASMString &= '7E(' & StringRight($aASM, StringLen($aASM) - 4) & ')' + Case $lStringLeft3 = 'ja ' + $mASMSize += 2 + $mASMString &= '77(' & StringRight($aASM, StringLen($aASM) - 3) & ')' + Case $lStringLeft3 = 'jl ' + $mASMSize += 2 + $mASMString &= '7C(' & StringRight($aASM, StringLen($aASM) - 3) & ')' + Case $lStringLeft3 = 'jz ' + $mASMSize += 2 + $mASMString &= '74(' & StringRight($aASM, StringLen($aASM) - 3) & ')' + ; hardcoded + Case $aASM = 'jmp ebx' + $lOpCode = 'FFE3' + Case Else + MsgBox(0, 'ASM', 'Could not assemble: ' & $aASM) + Exit + EndSelect + Case $lMnemonic = "mov" ; mov + Select + ; mov eax,dword[EnsureEnglish] + Case StringRegExp($aASM, 'mov eax,dword[[][a-z,A-Z]{4,}[]]') + $mASMSize += 5 + $mASMString &= 'A1[' & StringMid($aASM, 15, StringLen($aASM) - 15) & ']' + Case StringRegExp($aASM, 'mov ecx,dword[[][a-z,A-Z]{4,}[]]') + $mASMSize += 6 + $mASMString &= '8B0D[' & StringMid($aASM, 15, StringLen($aASM) - 15) & ']' + Case StringRegExp($aASM, 'mov edx,dword[[][a-z,A-Z]{4,}[]]') + $mASMSize += 6 + $mASMString &= '8B15[' & StringMid($aASM, 15, StringLen($aASM) - 15) & ']' + Case StringRegExp($aASM, 'mov ebx,dword[[][a-z,A-Z]{4,}[]]') + $mASMSize += 6 + $mASMString &= '8B1D[' & StringMid($aASM, 15, StringLen($aASM) - 15) & ']' + Case StringRegExp($aASM, 'mov esi,dword[[][a-z,A-Z]{4,}[]]') + $mASMSize += 6 + $mASMString &= '8B35[' & StringMid($aASM, 15, StringLen($aASM) - 15) & ']' + Case StringRegExp($aASM, 'mov edi,dword[[][a-z,A-Z]{4,}[]]') + $mASMSize += 6 + $mASMString &= '8B3D[' & StringMid($aASM, 15, StringLen($aASM) - 15) & ']' + ; mov eax,TargetLogBase + Case StringRegExp($aASM, 'mov eax,[a-z,A-Z]{4,}') And StringInStr($aASM, ',dword') = 0 + $mASMSize += 5 + $mASMString &= 'B8[' & StringRight($aASM, StringLen($aASM) - 8) & ']' + Case StringRegExp($aASM, 'mov edx,[a-z,A-Z]{4,}') And StringInStr($aASM, ',dword') = 0 + $mASMSize += 5 + $mASMString &= 'BA[' & StringRight($aASM, StringLen($aASM) - 8) & ']' + Case StringRegExp($aASM, 'mov ebx,[a-z,A-Z]{4,}') And StringInStr($aASM, ',dword') = 0 + $mASMSize += 5 + $mASMString &= 'BB[' & StringRight($aASM, StringLen($aASM) - 8) & ']' + Case StringRegExp($aASM, 'mov esi,[a-z,A-Z]{4,}') And StringInStr($aASM, ',dword') = 0 + $mASMSize += 5 + $mASMString &= 'BE[' & StringRight($aASM, StringLen($aASM) - 8) & ']' + Case StringRegExp($aASM, 'mov edi,[a-z,A-Z]{4,}') And StringInStr($aASM, ',dword') = 0 + $mASMSize += 5 + $mASMString &= 'BF[' & StringRight($aASM, StringLen($aASM) - 8) & ']' + ; mov ecx,dword[ecx*4+TargetLogBase] + Case StringRegExp($aASM, 'mov eax,dword[[]ecx[*]4[+][a-z,A-Z]{4,}[]]') + $mASMSize += 7 + $mASMString &= '8B048D[' & StringMid($aASM, 21, StringLen($aASM) - 21) & ']' + Case StringRegExp($aASM, 'mov ecx,dword[[]ecx[*]4[+][a-z,A-Z]{4,}[]]') + $mASMSize += 7 + $mASMString &= '8B0C8D[' & StringMid($aASM, 21, StringLen($aASM) - 21) & ']' + ; mov eax,dword[ebp+8] + Case StringRegExp($aASM, 'mov (eax|ecx|edx|ebx|esp|ebp|esi|edi),dword[[](ebp|esp)[+][-[:xdigit:]]{1,8}[]]') + Local $lASM = '' + Local $lBuffer = StringMid($aASM, 19, StringLen($aASM) - 19) + $lBuffer = ASMNumber($lBuffer, True) + If @extended Then + $mASMSize += 4 + Local $lStart = 4 + Else + $mASMSize += 7 + Local $lStart = 8 + EndIf + Switch StringMid($aASM, 5, 3) + Case 'eax' + $lASM &= Hex($lStart, 1) & '5' + Case 'ecx' + $lASM &= Hex($lStart, 1) & 'D' + Case 'edx' + $lASM &= Hex($lStart + 1, 1) & '5' + Case 'ebx' + $lASM &= Hex($lStart + 1, 1) & 'D' + Case 'esp' + $lASM &= Hex($lStart + 2, 1) & '5' + Case 'ebp' + $lASM &= Hex($lStart + 2, 1) & 'D' + Case 'esi' + $lASM &= Hex($lStart + 3, 1) & '5' + Case 'edi' + $lASM &= Hex($lStart + 3, 1) & 'D' + EndSwitch + If StringMid($aASM, 15, 3) = 'esp' Then + $mASMSize += 1 + $lASM = Hex(Dec($lASM) - 1, 2) & '24' + EndIf + $mASMString &= '3E8B' & $lASM & $lBuffer + ; mov eax,dword[ecx+8] + Case StringRegExp($aASM, 'mov (eax|ecx|edx|ebx|esp|ebp|esi|edi),dword[[](eax|ecx|edx|ebx|esi|edi)[+][-[:xdigit:]]{1,8}[]]') + Local $lASM = '' + Local $lBuffer = StringMid($aASM, 19, StringLen($aASM) - 19) + $lBuffer = ASMNumber($lBuffer, True) + If @extended Then + $mASMSize += 3 + Local $lStart = 4 + Else + $mASMSize += 6 + Local $lStart = 8 + EndIf + Switch StringMid($aASM, 5, 3) + Case 'eax' + $lASM &= Hex($lStart, 1) & '0' + Case 'ecx' + $lASM &= Hex($lStart, 1) & '8' + Case 'edx' + $lASM &= Hex($lStart + 1, 1) & '0' + Case 'ebx' + $lASM &= Hex($lStart + 1, 1) & '8' + Case 'esp' + $lASM &= Hex($lStart + 2, 1) & '0' + Case 'ebp' + $lASM &= Hex($lStart + 2, 1) & '8' + Case 'esi' + $lASM &= Hex($lStart + 3, 1) & '0' + Case 'edi' + $lASM &= Hex($lStart + 3, 1) & '8' + EndSwitch + $mASMString &= '8B' & ASMOperand(StringMid($aASM, 15, 3), $lASM) & $lBuffer + ; mov ebx,dword[edx] + Case StringRegExp($aASM, 'mov (eax|ecx|edx|ebx|esp|ebp|esi|edi),dword[[](eax|ecx|edx|ebx|esp|ebp|esi|edi)[]]') + $mASMSize += 2 + Switch StringMid($aASM, 5, 3) + Case 'eax' + $lBuffer = '00' + Case 'ecx' + $lBuffer = '08' + Case 'edx' + $lBuffer = '10' + Case 'ebx' + $lBuffer = '18' + Case 'esp' + $lBuffer = '20' + Case 'ebp' + $lBuffer = '28' + Case 'esi' + $lBuffer = '30' + Case 'edi' + $lBuffer = '38' + EndSwitch + $mASMSTring &= '8B' & ASMOperand(StringMid($aASM, 15, 3), $lBuffer, True) + ; mov eax,14 + Case StringRegExp($aASM, 'mov eax,[-[:xdigit:]]{1,8}\z') + $mASMSize += 5 + $mASMString &= 'B8' & ASMNumber(StringMid($aASM, 9)) + Case StringRegExp($aASM, 'mov ebx,[-[:xdigit:]]{1,8}\z') + $mASMSize += 5 + $mASMString &= 'BB' & ASMNumber(StringMid($aASM, 9)) + Case StringRegExp($aASM, 'mov ecx,[-[:xdigit:]]{1,8}\z') + $mASMSize += 5 + $mASMString &= 'B9' & ASMNumber(StringMid($aASM, 9)) + Case StringRegExp($aASM, 'mov edx,[-[:xdigit:]]{1,8}\z') + $mASMSize += 5 + $mASMString &= 'BA' & ASMNumber(StringMid($aASM, 9)) + ; mov eax,ecx + Case StringRegExp($aASM, 'mov (eax|ecx|edx|ebx|esp|ebp|esi|edi),(eax|ecx|edx|ebx|esp|ebp|esi|edi)') + $mASMSize += 2 + Switch StringMid($aASM, 5, 3) + Case 'eax' + $lBuffer = 'C0' + Case 'ecx' + $lBuffer = 'C8' + Case 'edx' + $lBuffer = 'D0' + Case 'ebx' + $lBuffer = 'D8' + Case 'esp' + $lBuffer = 'E0' + Case 'ebp' + $lBuffer = 'E8' + Case 'esi' + $lBuffer = 'F0' + Case 'edi' + $lBuffer = 'F8' + EndSwitch + $mASMString &= '8B' & ASMOperand(StringMid($aASM, 9, 3), $lBuffer) + ; mov dword[TraderCostID],ecx + Case StringRegExp($aASM, 'mov dword[[][a-z,A-Z]{4,}[]],ecx') + $mASMSize += 6 + $mASMString &= '890D[' & StringMid($aASM, 11, StringLen($aASM) - 15) & ']' + Case StringRegExp($aASM, 'mov dword[[][a-z,A-Z]{4,}[]],edx') + $mASMSize += 6 + $mASMString &= '8915[' & StringMid($aASM, 11, StringLen($aASM) - 15) & ']' + Case StringRegExp($aASM, 'mov dword[[][a-z,A-Z]{4,}[]],eax') + $mASMSize += 5 + $mASMString &= 'A3[' & StringMid($aASM, 11, StringLen($aASM) - 15) & ']' + ; mov dword[NextStringType],2 + Case StringRegExp($aASM, 'mov dword\[[a-z,A-Z]{4,}\],[-[:xdigit:]]{1,8}\z') + $lBuffer = StringInStr($aASM, ",") + $mASMSize += 10 + $mASMString &= 'C705[' & StringMid($aASM, 11, $lBuffer - 12) & ']' & ASMNumber(StringMid($aASM, $lBuffer + 1)) + ; mov dword[edi],-1 + Case StringRegExp($aASM, 'mov dword[[](eax|ecx|edx|ebx|esp|ebp|esi|edi)[]],[-[:xdigit:]]{1,8}\z') + $mASMSize += 6 + $mASMString &= 'C7' & ASMOperand(StringMid($aASM, 11, 3), '00', True) & _ + ASMNumber(StringMid($aASM, 16, StringLen($aASM) - 15)) + ; mov dword[eax+C],ecx + Case StringRegExp($aASM, 'mov dword[[][abcdeipsx]{3}[-+[:xdigit:]]{2,9}[]],[abcdeipsx]{3}\z') + If StringMid($aASM, 14, 1) <> '+' Then + $lBuffer = BitNOT('0x' & StringMid($aASM, 15, StringInStr($aASM, ']') - 15)) + 1 + Else + $lBuffer = StringMid($aASM, 15, StringInStr($aASM, ']') - 15) + EndIf + $lBuffer = ASMNumber($lBuffer, True) + If @extended Then + $mASMSize += 3 + Local $lStart = 4 + Else + $mASMSize += 6 + Local $lStart = 8 + EndIf + Local $lASM = '' + Switch StringMid($aASM, StringLen($aASM) - 2, 3) + Case 'eax' + $lASM = Hex($lStart, 1) & '0' + Case 'ecx' + $lASM = Hex($lStart, 1) & '8' + Case 'edx' + $lASM = Hex($lStart + 1, 1) & '0' + Case 'ebx' + $lASM = Hex($lStart + 1, 1) & '8' + Case 'esp' + $lASM = Hex($lStart + 2, 1) & '0' + Case 'ebp' + $lASM = Hex($lStart + 2, 1) & '8' + Case 'esi' + $lASM = Hex($lStart + 3, 1) & '0' + Case 'edi' + $lASM = Hex($lStart + 3, 1) & '8' + EndSwitch + $mASMString &= '89' & ASMOperand(StringMid($aASM, 11, 3), $lASM, True) & $lBuffer + ; mov dword[eax],ecx + Case StringRegExp($aASM, 'mov dword[[][abcdeipsx]{3}[]],[abcdeipsx]{3}\z') + $mASMSize += 2 + $lBuffer = '' + Switch StringMid($aASM, StringLen($aASM) - 2, 3) + Case 'eax' + $lBuffer = '00' + Case 'ecx' + $lBuffer = '08' + Case 'edx' + $lBuffer = '10' + Case 'ebx' + $lBuffer = '18' + Case 'esp' + $lBuffer = '20' + Case 'ebp' + $lBuffer = '28' + Case 'esi' + $lBuffer = '30' + Case 'edi' + $lBuffer = '38' + EndSwitch + $mASMString &= '89' & ASMOperand(StringMid($aASM, 11, 3), $lBuffer, True) + ; hardcoded + Case $aASM = 'mov al,byte[ecx+4f]' + $lOpCode = '8A414F' + Case $aASM = 'mov al,byte[ecx+3f]' + $lOpCode = '8A413F' + Case $aASM = 'mov al,byte[ebx]' + $lOpCode = '8A03' + Case $aASM = 'mov al,byte[ecx]' + $lOpCode = '8A01' + Case $aASM = 'mov ah,byte[edi]' + $lOpCode = '8A27' + Case $aASM = 'mov dx,word[ecx]' + $lOpCode = '668B11' + Case $aASM = 'mov dx,word[edx]' + $lOpCode = '668B12' + Case $aASM = 'mov word[eax],dx' + $lOpCode = '668910' + Case $aASM = 'mov dword[eax],edi';<------ + $lOpCode = '368938' + Case $aASM = 'mov edi,dword[ecx]';<------- + $lOpCode = '368B39' + Case $aASM = 'mov ebp,esp' + $lOpCode = '8BEC';<--- + ;from gwax ported / atm not work + Case $aASM = 'mov dword[eax+4],0' ;<----- OpenStorage change + $lOpCode = 'C7400400000000' ;<----- OpenStorage change + Case $aASM = 'mov dword[eax+8],0' ;<----- OpenStorage change + $lOpCode = 'C7400800000000' ;<----- OpenStorage change + Case $aASM = 'mov dword[eax+C],3' ;<----- OpenStorage change + $lOpCode = 'C7800000000003' ;<----- OpenStorage change + Case Else + MsgBox(0, 'ASM', 'Could not assemble: ' & $aASM) + Exit + EndSelect + Case $lMnemonic = "cmp" ; cmp + Select + ; cmp ebx,dword[MaxAgents] + Case StringRegExp($aASM, 'cmp (eax|ecx|edx|ebx|esp|ebp|esi|edi),dword\[[a-z,A-Z]{4,}\]') + $lBuffer = '' + $mASMSize += 6 + Switch StringMid($aASM, 5, 3) + Case 'eax' + $lBuffer = '05' + Case 'ecx' + $lBuffer = '0D' + Case 'edx' + $lBuffer = '15' + Case 'ebx' + $lBuffer = '1D' + Case 'esp' + $lBuffer = '25' + Case 'ebp' + $lBuffer = '2D' + Case 'esi' + $lBuffer = '35' + Case 'edi' + $lBuffer = '3D' + EndSwitch + $mASMString &= '3B' & $lBuffer & '[' & StringMid($aASM, 15, StringLen($aASM) - 15) & ']' + ; cmp edi,dword[esi] + Case StringRegExp($aASM, 'cmp (eax|ecx|edx|ebx|esp|ebp|esi|edi),dword\[(eax|ecx|edx|ebx|esp|ebp|esi|edi)\]\z') + Local $lBuffer = StringMid($aASM, 15, 3) + If $lBuffer = 'ebp' Or $lBuffer = 'esp' Then + $mASMString &= '3E3B' + $mASMSize += 3 + Else + $mASMString &= '3B' + $mASMSize += 2 + EndIf + Switch StringMid($aASM, 5, 3) + Case 'eax' + $mASMString &= ASMOperand($lBuffer, '00', True, 64) + Case 'ecx' + $mASMString &= ASMOperand($lBuffer, '08', True, 64) + Case 'edx' + $mASMString &= ASMOperand($lBuffer, '10', True, 64) + Case 'ebx' + $mASMString &= ASMOperand($lBuffer, '18', True, 64) + Case 'esp' + $mASMString &= ASMOperand($lBuffer, '20', True, 64) + Case 'ebp' + $mASMString &= ASMOperand($lBuffer, '28', True, 64) + Case 'esi' + $mASMString &= ASMOperand($lBuffer, '30', True, 64) + Case 'edi' + $mASMString &= ASMOperand($lBuffer, '38', True, 64) + EndSwitch + ; cmp edi,dword[exi+4] + Case StringRegExp($aASM, 'cmp (eax|ecx|edx|ebx|esp|ebp|esi|edi),dword\[(eax|ecx|edx|ebx|esp|ebp|esi|edi)[+-][[:xdigit:]]') + If StringMid($aASM, 18, 1) <> '+' Then + $lBuffer = BitNOT('0x' & StringMid($aASM, 19, StringLen($aASM) - 19)) + 1 + Else + $lBuffer = StringMid($aASM, 19, StringLen($aASM) - 19) + EndIf + $lBuffer = ASMNumber($lBuffer, True) + If @extended Then + $mASMSize += 3 + Local $lStart = 4 + Else + $mASMSize += 6 + Local $lStart = 8 + EndIf + Switch StringMid($aASM, 15, 3) + Case 'ebp', 'esp' + Local $lASM = '3E3B' + $mASMSize += 1 + Case Else + Local $lASM = '3B' + EndSwitch + Local $lASMOpcode = '' + Switch StringMid($aASM, 5, 3) + Case 'eax' + $lASMOpcode = Hex($lStart, 1) & '0' + Case 'ecx' + $lASMOpcode = Hex($lStart, 1) & '8' + Case 'edx' + $lASMOpcode = Hex($lStart + 1, 1) & '0' + Case 'ebx' + $lASMOpcode = Hex($lStart + 1, 1) & '8' + Case 'esp' + $lASMOpcode = Hex($lStart + 2, 1) & '0' + Case 'ebp' + $lASMOpcode = Hex($lStart + 2, 1) & '8' + Case 'esi' + $lASMOpcode = Hex($lStart + 3, 1) & '0' + Case 'edi' + $lASMOpcode = Hex($lStart + 3, 1) & '8' + EndSwitch + $mASMString &= $lASM & ASMOperand(StringMid($aASM, 15, 3), $lASMOpcode, True) & $lBuffer + ; cmp dword[DisableRendering],1 + Case StringRegExp($aASM, 'cmp dword[[][a-z,A-Z]{4,}[]],[-[:xdigit:]]') + Local $lStart = StringInStr($aASM, ',') + If StringMid($aASM, $lStart + 1, 1) = '-' Then + $lBuffer = BitNOT('0x' & StringMid($aASM, $lStart + 2)) + 1 + Else + $lBuffer = StringMid($aASM, $lStart + 1) + EndIf + $lBuffer = ASMNumber($lBuffer, True) + If @extended Then + $mASMSize += 7 + $mASMString &= '833D[' & StringMid($aASM, 11, StringInStr($aASM, ",") - 12) & ']' & $lBuffer + Else + $mASMSize += 10 + $mASMString &= '813D[' & StringMid($aASM, 11, StringInStr($aASM, ",") - 12) & ']' & $lBuffer + EndIf + ; cmp eax,TargetLogBase + Case StringRegExp($aASM, 'cmp (eax|ecx|edx|ebx|esp|ebp|esi|edi),[a-z,A-Z]{4,}\z') + $lBuffer = '' + Switch StringMid($aASM, 5, 3) + Case 'eax' + $mASMSize += 5 + $lBuffer = '3D' + Case 'ecx' + $mASMSize += 6 + $lBuffer = '81F9' + Case 'edx' + $mASMSize += 6 + $lBuffer = '81FA' + Case 'ebx' + $mASMSize += 6 + $lBuffer = '81FB' + Case 'esp' + $mASMSize += 6 + $lBuffer = '81FC' + Case 'ebp' + $mASMSize += 6 + $lBuffer = '81FD' + Case 'esi' + $mASMSize += 6 + $lBuffer = '81FE' + Case 'edi' + $mASMSize += 6 + $lBuffer = '81FF' + EndSwitch + $mASMString &= $lBuffer & '[' & StringRight($aASM, StringLen($aASM) - 8) & ']' + ; cmp ebx,14 + Case StringRegExp($aASM, 'cmp (eax|ecx|edx|ebx|esp|ebp|esi|edi),[-[:xdigit:]]{1,}\z') + Local $lStart = StringInStr($aASM, ',') + If StringMid($aASM, $lStart + 1, 1) = '-' Then + $lBuffer = BitNOT('0x' & StringMid($aASM, $lStart + 2)) + 1 + Else + $lBuffer = StringMid($aASM, $lStart + 1) + EndIf + $lBuffer = ASMNumber($lBuffer, True) + If @extended Then + $mASMSize += 3 + $mASMString &= '83' & ASMOperand(StringMid($aASM, 5, 3), 'F8') & $lBuffer + Else + $mASMSize += 6 + $mASMString &= '81' & ASMOperand(StringMid($aASM, 5, 3), 'F8') & $lBuffer + EndIf + ; cmp eax,ecx + Case StringRegExp($aASM, 'cmp (eax|ecx|edx|ebx|esp|ebp|esi|edi),(eax|ecx|edx|ebx|esp|ebp|esi|edi)\z') + $lBuffer = '' + $mASMSize += 2 + Switch StringMid($aASM, 9, 3) + Case 'eax' + $mASMString &= '39' & ASMOperand(StringMid($aASM, 5, 3), 'C0') + Case 'ecx' + $mASMString &= '39' & ASMOperand(StringMid($aASM, 5, 3), 'C8') + Case 'edx' + $mASMString &= '39' & ASMOperand(StringMid($aASM, 5, 3), 'D0') + Case 'ebx' + $mASMString &= '39' & ASMOperand(StringMid($aASM, 5, 3), 'D8') + Case 'esp' + $mASMString &= '39' & ASMOperand(StringMid($aASM, 5, 3), 'E0') + Case 'ebp' + $mASMString &= '39' & ASMOperand(StringMid($aASM, 5, 3), 'E8') + Case 'esi' + $mASMString &= '39' & ASMOperand(StringMid($aASM, 5, 3), 'F0') + Case 'edi' + $mASMString &= '39' & ASMOperand(StringMid($aASM, 5, 3), 'F8') + EndSwitch + ; hardcoded + Case $aASM = 'cmp word[edx],0' + $lOpCode = '66833A00' + Case $aASM = 'cmp al,ah' + $lOpCode = '3AC4' + Case $aASM = 'cmp al,f' + $lOpCode = '3C0F' + Case $aASM = 'cmp cl,byte[esi+1B1]' + $lOpCode = '3A8EB1010000' + Case $aASM = 'cmp ecx,ebp' + $lOpCode = '39E9';<---- + Case Else + MsgBox(0, 'ASM', 'Could not assemble: ' & $aASM) + Exit + EndSelect + Case $lMnemonic = "lea" ; lea + Select + ; lea eax,dword[ecx*8+TargetLogBase] + Case StringRegExp($aASM, 'lea eax,dword[[]ecx[*]8[+][a-z,A-Z]{4,}[]]') + $mASMSize += 7 + $mASMString &= '8D04CD[' & StringMid($aASM, 21, StringLen($aASM) - 21) & ']' + ; lea eax,dword[ecx*4+TargetLogBase] + Case StringRegExp($aASM, 'lea eax,dword[[]edx[*]4[+][a-z,A-Z]{4,}[]]') + $mASMSize += 7 + $mASMString &= '8D0495[' & StringMid($aASM, 21, StringLen($aASM) - 21) & ']' + ; lea ebx,dword[eax*4+TargetLogBase] + Case StringRegExp($aASM, 'lea ebx,dword[[]eax[*]4[+][a-z,A-Z]{4,}[]]') + $mASMSize += 7 + $mASMString &= '8D1C85[' & StringMid($aASM, 21, StringLen($aASM) - 21) & ']' + ; hardcoded + Case $aASM = 'lea eax,dword[eax+18]' + $lOpCode = '8D4018' + Case $aASM = 'lea ecx,dword[eax+4]' + $lOpCode = '8D4804' + Case $aASM = 'lea ecx,dword[eax+180]' + $lOpCode = '8D8880010000' + Case $aASM = 'lea edx,dword[eax+4]' + $lOpCode = '8D5004' + Case $aASM = 'lea edx,dword[eax+8]' + $lOpCode = '8D5008' + Case $aASM = 'lea esi,dword[esi+ebx*4]' + $lOpCode = '8D349E' + Case $aASM = 'lea edi,dword[edx+ebx]' + $lOpCode = '8D3C1A' + Case $aASM = 'lea edi,dword[edx+8]' + $lOpCode = '8D7A08' + Case $aASM = 'lea ecx,[eax+4]' ;<----- OpenStorage change lea ecx,[eax+0x4] + $lOpCode = '8D4804' + + + Case Else + MsgBox(0, 'ASM', 'Could not assemble: ' & $aASM) + Exit + EndSelect + Case $lMnemonic = "add" ; add + Select + ; add eax, TargetLogBase + Case StringRegExp($aASM, 'add eax,[a-z,A-Z]{4,}') And StringInStr($aASM, ',dword') = 0 + $mASMSize += 5 + $mASMString &= '05[' & StringRight($aASM, StringLen($aASM) - 8) & ']' + ; add eax,14 + Case StringRegExp($aASM, 'add eax,[-[:xdigit:]]{1,8}\z') + $lBuffer = ASMNumber(StringMid($aASM, 9), True) + If @extended Then + $mASMSize += 3 + $mASMString &= '83C0' & $lBuffer + Else + $mASMSize += 5 + $mASMString &= '05' & $lBuffer + EndIf + Case StringRegExp($aASM, 'add ecx,[-[:xdigit:]]{1,8}\z') + $lBuffer = ASMNumber(StringMid($aASM, 9), True) + If @extended Then + $mASMSize += 3 + $mASMString &= '83C1' & $lBuffer + Else + $mASMSize += 6 + $mASMString &= '81C1' & $lBuffer + EndIf + Case StringRegExp($aASM, 'add edx,[-[:xdigit:]]{1,8}\z') + $lBuffer = ASMNumber(StringMid($aASM, 9), True) + If @extended Then + $mASMSize += 3 + $mASMString &= '83C2' & $lBuffer + Else + $mASMSize += 6 + $mASMString &= '81C2' & $lBuffer + EndIf + Case StringRegExp($aASM, 'add ebx,[-[:xdigit:]]{1,8}\z') + $lBuffer = ASMNumber(StringMid($aASM, 9), True) + If @extended Then + $mASMSize += 3 + $mASMString &= '83C3' & $lBuffer + Else + $mASMSize += 6 + $mASMString &= '81C3' & $lBuffer + EndIf + Case StringRegExp($aASM, 'add edi,[-[:xdigit:]]{1,8}\z') + $lBuffer = ASMNumber(StringMid($aASM, 9), True) + If @extended Then + $mASMSize += 3 + $mASMString &= '83C7' & $lBuffer + Else + $mASMSize += 6 + $mASMString &= '81C7' & $lBuffer + EndIf + Case Else + MsgBox(0, 'ASM', 'Could not assemble: ' & $aASM) + Exit + EndSelect + Case $lMnemonic = "fstp" ; fstp + ; fstp dword[EnsureEnglish] + If StringRegExp($aASM, 'fstp dword[[][a-z,A-Z]{4,}[]]') Then + $mASMSize += 6 + $mASMString &= 'D91D[' & StringMid($aASM, 12, StringLen($aASM) - 12) & ']' + Else + MsgBox(0, 'ASM', 'Could not assemble: ' & $aASM) + Exit + EndIf + Case $lMnemonic = "push" ; push + Select + + ; push dword[EnsureEnglish] + Case StringRegExp($aASM, 'push dword[[][a-z,A-Z]{4,}[]]') + $mASMSize += 6 + $mASMString &= 'FF35[' & StringMid($aASM, 12, StringLen($aASM) - 12) & ']' + ; push CallbackEvent + Case StringRegExp($aASM, 'push [a-z,A-Z]{4,}\z') + $mASMSize += 5 + $mASMString &= '68[' & StringMid($aASM, 6, StringLen($aASM) - 5) & ']' + ; push 14 + Case StringRegExp($aASM, 'push [-[:xdigit:]]{1,8}\z') + $lBuffer = ASMNumber(StringMid($aASM, 6), True) + If @extended Then + $mASMSize += 2 + $mASMString &= '6A' & $lBuffer + Else + $mASMSize += 5 + $mASMString &= '68' & $lBuffer + EndIf + + ; hardcoded + Case $aASM = 'push eax' + $lOpCode = '50' + Case $aASM = 'push ecx' + $lOpCode = '51' + Case $aASM = 'push edx' + $lOpCode = '52' + Case $aASM = 'push ebx' + $lOpCode = '53' + Case $aASM = 'push ebp' + $lOpCode = '55' + Case $aASM = 'push esi' + $lOpCode = '56' + Case $aASM = 'push edi' + $lOpCode = '57' + Case $aASM = 'push dword[eax+4]' + $lOpCode = 'FF7004' + Case $aASM = 'push dword[eax+8]' + $lOpCode = 'FF7008' + Case $aASM = 'push dword[eax+c]' + $lOpCode = 'FF700C' + Case $aASM = 'push dword[eax+10]' + $lOpCode = 'FF7010' + Case $aASM = 'push dword[eax+14]' + $lOpCode = 'FF7014' + Case $aASM = 'push dword[eax+18]' + $lOpCode = 'FF7018' + Case Else + MsgBox(0, 'ASM', 'Could not assemble: ' & $aASM) + Exit + EndSelect + Case $lMnemonic = "pop" ; pop + ; hardcoded + Select + Case $aASM = 'pop eax' + $lOpCode = '58' + Case $aASM = 'pop ebx' + $lOpCode = '5B' + Case $aASM = 'pop edx' + $lOpCode = '5A' + Case $aASM = 'pop ecx' + $lOpCode = '59' + Case $aASM = 'pop esi' + $lOpCode = '5E' + Case $aASM = 'pop edi' + $lOpCode = '5F' + Case $aASM = 'pop ebp' + $lOpCode = '5D' + Case Else + MsgBox(0, 'ASM', 'Could not assemble: ' & $aASM) + Exit + EndSelect + Case $lMnemonic = "call" ; call + Select + ; call dword[EnsureEnglish] + Case StringRegExp($aASM, 'call dword[[][a-z,A-Z]{4,}[]]') + $mASMSize += 6 + $mASMString &= 'FF15[' & StringMid($aASM, 12, StringLen($aASM) - 12) & ']' + ; call ActionFunction + Case StringLeft($aASM, 5) = 'call ' And StringLen($aASM) > 8 + $mASMSize += 5 + $mASMString &= 'E8{' & StringMid($aASM, 6, StringLen($aASM) - 5) & '}' + Case Else + MsgBox(0, 'ASM', 'Could not assemble: ' & $aASM) + Exit + EndSelect + Case $lMnemonic = "test" + Switch $aAsm + Case $aASM = 'test eax,eax' + $lOpCode = '85C0' + Case $aASM = 'test ecx,ecx' + $lOpCode = '85C9' + Case $aASM = 'test ebx,ebx' + $lOpCode = '85DB' + Case $aASM = 'test esi,esi' + $lOpCode = '85F6' + Case $aASM = 'test dx,dx' + $lOpCode = '6685D2' + Case $aASM = 'test al,al' + $lOpCode = '84C0' + Case $aASM = 'test al,1' + $lOpCode = 'A801' + Case Else + MsgBox(0, 'ASM', 'Could not assemble: ' & $aASM) + Exit + EndSwitch + Case $lMnemonic = "inc" + Select + ; inc dword[EnsureEnglish] + Case StringRegExp($aASM, 'inc dword\[[a-zA-Z]{4,}\]') + $mASMSize += 6 + $mASMString &= 'FF05[' & StringMid($aASM, 11, StringLen($aASM) - 11) & ']' + Case $aASM = 'inc eax' + $lOpCode = '40' + Case $aASM = 'inc ecx' + $lOpCode = '41' + Case $aASM = 'inc edx' + $lOpCode = '42' + Case $aASM = 'inc ebx' + $lOpCode = '43' + Case Else + MsgBox(0, 'ASM', 'Could not assemble: ' & $aASM) + Exit + EndSelect + Case $lMnemonic = "dec" + Switch $aAsm + Case $aASM = 'dec edx' + $lOpCode = '4A' + Case Else + MsgBox(0, 'ASM', 'Could not assemble: ' & $aASM) + Exit + EndSwitch + Case $lMnemonic = "xor" + Switch $aAsm + Case $aASM = 'xor eax,eax' + $lOpCode = '33C0' + Case $aASM = 'xor ecx,ecx' + $lOpCode = '33C9' + Case $aASM = 'xor edx,edx' + $lOpCode = '33D2' + Case $aASM = 'xor ebx,ebx' + $lOpCode = '33DB' + Case Else + MsgBox(0, 'ASM', 'Could not assemble: ' & $aASM) + Exit + EndSwitch + Case $lMnemonic = "sub" + Select + Case StringRegExp($aASM, 'sub [abcdeipsx]{3},[-[:xdigit:]]{1,8}\z') + $lBuffer = ASMNumber(StringMid($aASM, 9, StringLen($aASM) - 8), True) + If @extended Then + $mASMSize += 3 + Else + $mASMSize += 6 + EndIf + $mASMString &= '83' & ASMOperand(StringMid($aASM, 5, 3), 'E8', False) & $lBuffer + Case Else + MsgBox(0, 'ASM', 'Could not assemble: ' & $aASM) + Exit + EndSelect + Case $lMnemonic = "shl" + Switch $aAsm + Case $aASM = 'shl eax,4' + $lOpCode = 'C1E004' + Case $aASM = 'shl eax,6' + $lOpCode = 'C1E006' + Case $aASM = 'shl eax,7' + $lOpCode = 'C1E007' + Case $aASM = 'shl eax,8' + $lOpCode = 'C1E008' + Case $aASM = 'shl eax,8' + $lOpCode = 'C1E008' + Case $aASM = 'shl eax,9' + $lOpCode = 'C1E009' + Case Else + MsgBox(0, 'ASM', 'Could not assemble: ' & $aASM) + Exit + EndSwitch + Case $lMnemonic = "retn" + If $aASM = 'retn 10' Then $lOpCode = 'C21000' + Case $aASM = 'repe movsb' + $lOpCode = 'F3A4' + Case Else + MsgBox(0, 'ASM', 'Could not assemble: ' & $aASM) + Exit + EndSelect + If $lOpCode <> '' Then + $mASMSize += 0.5 * StringLen($lOpCode) + $mASMString &= $lOpCode + EndIf +EndFunc ;==>_ + +;~ Description: Completes formatting of ASM code. Internal use only. +Func CompleteASMCode() + Local $lInExpression = False + Local $lExpression + Local $lTempASM = $mASMString + Local $lCurrentOffset = Dec(Hex($mMemory)) + $mASMCodeOffset + Local $lToken + For $i In $mLabelDict.Keys + If StringLeft($i, 6) = 'Label_' Then + $mLabelDict.Item($i) = $mMemory + $mLabelDict.Item($i) + $mLabelDict.Key($i) = StringTrimLeft($i, 6) + EndIf + Next + $mASMString = '' + For $i = 1 To StringLen($lTempASM) + $lToken = StringMid($lTempASM, $i, 1) + Switch $lToken + Case '(', '[', '{' + $lInExpression = True + Case ')' + $mASMString &= Hex(GetLabelInfo($lExpression) - Int($lCurrentOffset) - 1, 2) + $lCurrentOffset += 1 + $lInExpression = False + $lExpression = '' + Case ']' + $mASMString &= SwapEndian(Hex(GetLabelInfo($lExpression), 8)) + $lCurrentOffset += 4 + $lInExpression = False + $lExpression = '' + Case '}' + $mASMString &= SwapEndian(Hex(GetLabelInfo($lExpression) - Int($lCurrentOffset) - 4, 8)) + $lCurrentOffset += 4 + $lInExpression = False + $lExpression = '' + Case Else + If $lInExpression Then + $lExpression &= $lToken + Else + $mASMString &= $lToken + $lCurrentOffset += 0.5 + EndIf + EndSwitch + Next +EndFunc ;==>CompleteASMCode + +;~ Description: Returns GetValue($aLabel) and exits, if label cant be found. +Func GetLabelInfo($aLabel) + Local $lValue = GetValue($aLabel) + If $lValue = -1 Then Exit MsgBox(0, 'Label', 'Label: ' & $aLabel & ' not provided') + Return $lValue +EndFunc ;==>GetLabelInfo + +;~ Description: Converts hexadecimal to ASM. +Func ASMNumber($aNumber, $aSmall = False) + If $aNumber >= 0 Then + $aNumber = Dec($aNumber) + EndIf + If $aSmall And $aNumber <= 127 And $aNumber >= -128 Then + Return SetExtended(1, Hex($aNumber, 2)) + Else + Return SetExtended(0, SwapEndian(Hex($aNumber, 8))) + EndIf +EndFunc ;==>ASMNumber + +;~ Descripion: Increases opcode-part according to opcode basis value. +Func ASMOperand($aSearchString, $aOpcodeString, $aESP = False, $aEBP = 0) + Switch $aSearchString + Case 'eax' + Return $aOpcodeString + Case 'ecx' + Return Hex(Dec($aOpcodeString) + 1, 2) + Case 'edx' + Return Hex(Dec($aOpcodeString) + 2, 2) + Case 'ebx' + Return Hex(Dec($aOpcodeString) + 3, 2) + Case 'esp' + If $aESP Then + $mASMSize += 1 + Return Hex(Dec($aOpcodeString) + 4, 2) & '24' + EndIf + Return Hex(Dec($aOpcodeString) + 4, 2) + Case 'ebp' + If $aEBP > 0 Then + $mASMSize += 1 + Return Hex(Dec($aOpcodeString) + 5 + $aEBP, 2) & '00' + EndIf + Return Hex(Dec($aOpcodeString) + 5, 2) + Case 'esi' + Return Hex(Dec($aOpcodeString) + 6, 2) + Case 'edi' + Return Hex(Dec($aOpcodeString) + 7, 2) + EndSwitch +EndFunc + +#EndRegion Assembler + +#Region Conversion +;~ Description: Converts float to integer. +Func FloatToInt($nFloat) + Local $tFloat = DllStructCreate("float") + Local $tInt = DllStructCreate("int", DllStructGetPtr($tFloat)) + DllStructSetData($tFloat, 1, $nFloat) + Return DllStructGetData($tInt, 1) +EndFunc ;==>FloatToInt +#EndRegion + +#Region Misc +;~ Description: Prepares data to be used to call Guild War's packet send function. +Func SendPacket($aSize, $aHeader, $aParam1 = 0, $aParam2 = 0, $aParam3 = 0, $aParam4 = 0, $aParam5 = 0, $aParam6 = 0, $aParam7 = 0, $aParam8 = 0, $aParam9 = 0, $aParam10 = 0) + DllStructSetData($mPacket, 2, $aSize) + DllStructSetData($mPacket, 3, $aHeader) + DllStructSetData($mPacket, 4, $aParam1) + DllStructSetData($mPacket, 5, $aParam2) + DllStructSetData($mPacket, 6, $aParam3) + DllStructSetData($mPacket, 7, $aParam4) + DllStructSetData($mPacket, 8, $aParam5) + DllStructSetData($mPacket, 9, $aParam6) + DllStructSetData($mPacket, 10, $aParam7) + DllStructSetData($mPacket, 11, $aParam8) + DllStructSetData($mPacket, 12, $aParam9) + DllStructSetData($mPacket, 13, $aParam10) + Return Enqueue($mPacketPtr, 52) +EndFunc ;==>SendPacket + +;~ Description: Call CommandAction. +Func PerformAction($aAction, $aFlag) + DllStructSetData($mAction, 2, $aAction) + DllStructSetData($mAction, 3, $aFlag) + Return Enqueue($mActionPtr, 12) +EndFunc ;==>PerformAction + +;~ Description: Returns current ping. +Func GetPing() + Return MemoryRead($mPing) +EndFunc ;==>GetPing + +;~ Description: Get name of currently logged in character. +Func GetCharname() + Return MemoryRead($mCharname, 'wchar[30]') +EndFunc ;==>GetCharname + +;~ Description: Returns logged in or not. +Func GetLoggedIn() + Return MemoryRead($mLoggedCounter) > 0 +EndFunc ;==>GetLoggedIn + +;~ Description: Returns currently used language as number, same as GetLanguage(). +Func GetDisplayLanguage() + Static Local $lLanguagePtr = 0 + If $lLanguagePtr = 0 Then + Local $lOffset[6] = [0, 0x18, 0x18, 0x194, 0x4C, 0x40] + $lLanguagePtr = MemoryReadPtrChain($mBasePointer, $lOffset, 'ptr') + EndIf + Return MemoryRead($lLanguagePtr) +EndFunc ;==>GetDisplayLanguage + +;~ Description: Returns the game client's build number. +Func GetBuildNumber() + Return $mBuildNumber +EndFunc ;==>GetBuildNumber + +;~ Description: Sleep a random amount of time. +Func RndSleep($aAmount, $aRandom = 0.05) + Local $lRandom = $aAmount * $aRandom + Sleep(Random($aAmount - $lRandom, $aAmount + $lRandom)) +EndFunc ;==>RndSleep + +;~ Description: Sleep a period of time, plus or minus a tolerance +Func TolSleep($aAmount = 150, $aTolerance = 50) + Sleep(Random($aAmount - $aTolerance, $aAmount + $aTolerance)) +EndFunc ;==>TolSleep + +;~ Description: Sleeps time plus your ping. +Func PingSleep($Time = 1000) + Sleep(GetPing() + $Time) +EndFunc ;==>PingSleep + +;~ Description: Window Handle to game client, variable set during initialize. +Func GetWindowHandle() + Return $mGWHwnd +EndFunc ;==>GetWindowHandle + +;~ Description: Computes distance between two sets of coordinates. +Func ComputeDistance($aX1, $aY1, $aX2, $aY2) + Return Sqrt(($aX1 - $aX2) ^ 2 + ($aY1 - $aY2) ^ 2) +EndFunc ;==>ComputeDistance + +;~ Description: Same as ComputeDistance, but without Sqrt. +Func ComputePseudoDistance($aX1, $aY1, $aX2, $aY2) + Return ($aX1 - $aX2) ^ 2 + ($aY1 - $aY2) ^ 2 +EndFunc ;==>ComputeDistance + +;dont use it it crash your gw +;~ Description: Opens storage window, only in outpost its possible to change content of chest. +Func OpenStorageWindow() + Local $ID = StorageSessionID() + DllStructSetData($mOpenStorage, 2, $ID) + DllStructSetData($mOpenStorage, 3, 0) + DllStructSetData($mOpenStorage, 4, 1) + Enqueue($mOpenStoragePtr, 16) +EndFunc ;==>OpenStorageWindow + +;~ Description: Gets current storage session ID. +Func StorageSessionID() + Local $lOffset[3] = [0x118, 0x10, 0] + $lReturn = MemoryReadPtr($mStorageSessionBase, $lOffset) + Return MemoryRead($lReturn[1] + 0x14) +EndFunc ;==>StorageSessionID + + +;~ Descripion +;~ Description: Checks if game client got disconnected and attempts to reconnect. +Func Disconnected() + If MemoryRead($MyPtr + 44, 'long') <> $MyID Then + If SetPointers() Then Return False + EndIf + If MemoryRead($mLoggedCounter) <> 0 Then Return False ; not disconnected at all + Local $lEnabledRendering = False + If Not $mRendering Then + EnableRendering(False) + $lEnabledRendering = True + EndIf + Local $lTimer = 0 + Local $lDeadlock = TimerInit() + Do + $lTimer = TimerInit() + ControlSend(GetWindowHandle(), "", "", "{Enter}") + Do + Sleep(1000) ; no rush + If MemoryRead($mLoggedCounter) <> 0 Then ; we made it back ingame hopefully + If SetPointers() Then + If $lEnabledRendering = False Then DisableRendering() + Return True ; really made it back + EndIf + ConsoleWrite("Couldnt retrieve $MyPtr." & @CRLF) + ExitLoop 2 ; client probably crashed, exit script + EndIf + Until TimerDiff($lTimer) > 10000 + Until TimerDiff($lDeadlock) > 120000 + ConsoleWrite("Exiting script." & @CRLF) + EnableRendering() + RestoreDetour() + Exit +EndFunc ;==>Disconnected + +;~ Description: Tries to get correct $MyID and $MyPtr and resets essential pointer variables to zero. +;~ Called in WaitMapLoading() and Disconnected(). +Func SetPointers() + Local $lDeadlock = TimerInit() + Do + Do + If TimerDiff($lDeadlock) > 15000 Then Return False + Sleep(1000) + $MyID = MemoryRead($mMyID) + Until $MyID > 0 + $MyPtr = GetAgentPtr($MyID) + Until $MyID = MemoryRead($MyPtr + 44, 'long') + $TitlesPtr = 0 + $HeroPtr1 = 0 + $HeroPtr2 = 0 + $HeroPtr3 = 0 + $HeroPtr4 = 0 + $ItemBasePtr = 0 + $BagBasePtr = 0 + $GoldBasePtr = 0 + $PartySizePtr = 0 + $QuestBasePtr = 0 + $SkillbarBasePtr = 0 + $BuffBasePtr = 0 + Return True +EndFunc + +;~ Description: Reset essential variables to zero. Used in event(). +;~ If eventsystem is disabled, this has to be called manually after each loading screen. +Func ResetPointers() + ConsoleWrite("ResetPointers." & @CRLF) + $TitlesPtr = 0 + $HeroPtr1 = 0 + $HeroPtr2 = 0 + $HeroPtr3 = 0 + $HeroPtr4 = 0 + $ItemBasePtr = 0 + $BagBasePtr = 0 + $GoldBasePtr = 0 + $PartySizePtr = 0 + $QuestBasePtr = 0 + $SkillbarBasePtr = 0 + $BuffBasePtr = 0 +EndFunc +#EndRegion + + + + diff --git a/gwApi/gwAPI_integrate.au3 b/gwApi/gwAPI_integrate.au3 index 0db5529..4e2cd01 100644 --- a/gwApi/gwAPI_integrate.au3 +++ b/gwApi/gwAPI_integrate.au3 @@ -1,1090 +1,1091 @@ -#include-once -#RequireAdmin - -Func CacheSkillbar_() - If Not $mSkillbarCache[0] Then - $mSkillbar = GetSkillbar() - $mSkillbarPtr = GetSkillbarPtr() - For $i = 1 To 8 - $mSkillbarCache[$i] = DllStructGetData($mSkillbar, 'Id' & $i) - $mSkillbarCacheStruct[$i] = GetSkillByID($mSkillbarCache[$i]) - $mSkillbarCachePtr[$i] = GetSkillPtr($mSkillbarCache[$i]) - If DllStructGetData($mSkillbarCacheStruct[$i], 'Adrenaline') > 0 Then - $SkillAdrenalineReq[$i] = DllStructGetData($mSkillbarCacheStruct[$i], 'Adrenaline') - $SkillAdrenalineReq[0] = True - $mSkillbarCacheEnergyReq[$i] = 0 - Update("Skill " & $i & " requires " & DllStructGetData($mSkillbarCacheStruct[$i], 'Adrenaline') & " Adrenaline.", "Skills") - Else - $SkillAdrenalineReq[$i] = 0 - Switch DllStructGetData($mSkillbarCacheStruct[$i], 'EnergyCost') - Case 0 - $mSkillbarCacheEnergyReq[$i] = 0 - Case 1 - $mSkillbarCacheEnergyReq[$i] = 1 - Case 5 - $mSkillbarCacheEnergyReq[$i] = 5 - Case 10 - $mSkillbarCacheEnergyReq[$i] = 10 - Case 11 - $mSkillbarCacheEnergyReq[$i] = 15 - Case 12 - $mSkillbarCacheEnergyReq[$i] = 25 - Case Else - EndSwitch - Update("Skill " & $i & " requires " & $mSkillbarCacheEnergyReq[$i] & " energy.") - EndIf - $mSkillPriorityRating[$i][1] = 0 - $SkillDamageAmount[$i] = SkillDamageAmount($mSkillbarCacheStruct[$i]) - $mSkillPriorityRating[$i][0] = $i - If IsEliteSkill($mSkillbarCacheStruct[$i]) Then $mSkillPriorityRating[$i][1] = 30 - ; YMLAD ; 1 - If $mSkillbarCache[$i] = $You_Move_Like_a_Dwarf Then - $IsYMLAD[$i] = True - $IsYMLAD[0] = True - $YMLADSlot = $i - $mSkillPriorityRating[$i][1] = 120 - $i - $mSkillPriorityRating[$i][2] = 1 - Update("Skill " & $i & " is YMLAD! Priority: " & $mSkillPriorityRating[$i][1] & ".") - ContinueLoop - EndIf - ; Interrupt ; 2 - If IsInterruptSkill($mSkillbarCacheStruct[$i]) Then - $mSkillPriorityRating[$i][1] += 110 - $i - $mSkillPriorityRating[$i][2] = 2 - $IsInterrupt[$i] = True - $IsInterrupt[0] = True - Update("Skill " & $i & " is an Interrupt Skill, Priority: " & $mSkillPriorityRating[$i][1] & ".") - ContinueLoop - EndIf - ; Heal ; 3 - If IsHealSkill($mSkillbarCacheStruct[$i]) And Not IsResSkill($mSkillbarCacheStruct[$i]) And Not IsHexRemovalSkill($mSkillbarCacheStruct[$i]) And IsConditionRemovalSkill($mSkillbarCacheStruct[$i]) == False And Not TargetOtherAllySkill($mSkillbarCacheStruct[$i]) Then - $IsHealingSpell[$i] = True - $IsHealingSpell[0] = True - $mSkillPriorityRating[$i][1] += 80 - $i + $SkillDamageAmount[$i] - $mSkillPriorityRating[$i][2] = 3 - Update("Skill " & $i & " heals ally for " & $SkillDamageAmount[$i] & ", Priority: " & $mSkillPriorityRating[$i][1] & ".") - ContinueLoop - EndIf - ; Heal Other ; 4 - If TargetOtherAllySkill($mSkillbarCacheStruct[$i]) == True And IsResSkill($mSkillbarCacheStruct[$i]) == False And IsHexRemovalSkill($mSkillbarCacheStruct[$i]) == False And IsConditionRemovalSkill($mSkillbarCacheStruct[$i]) == False Then - $mSkillPriorityRating[$i][1] += 75 - $i - $mSkillPriorityRating[$i][2] = 4 - Update("Skill " & $i & " heals other ally for " & $SkillDamageAmount[$i] & ", Priority: " & $mSkillPriorityRating[$i][1] & ".") - ContinueLoop - EndIf - ; AOE Skills ; 5 - If SkillAOERange($mSkillbarCacheStruct[$i]) > 0 Then - If TargetEnemySkill($mSkillbarCacheStruct[$i]) == True Or TargetGroundSkill($mSkillbarCacheStruct[$i]) == True Then - $mSkillPriorityRating[$i][1] += 70 - $i - $mSkillPriorityRating[$i][2] = 5 - Update("Skill " & $i & " does AOE damage of " & $SkillDamageAmount[$i] & ", Priority: " & $mSkillPriorityRating[$i][1] & ".") - ContinueLoop - EndIf - EndIf - ; Soul Twisting ; 6 - If $mSkillbarCache[$i] == $Soul_Twisting Then - $IsSoulTwistingSpell[$i] = True - $IsSoulTwistingSpell[0] = True - $mSkillPriorityRating[$i][1] = 65 - $i - $mSkillPriorityRating[$i][2] = 6 - Update("Skill " & $i & " is Soul Twisting, Priority: " & $mSkillPriorityRating[$i][1] & ".") - ContinueLoop - EndIf - ; Spirits ; 7 - If IsSpiritSkill($mSkillbarCacheStruct[$i]) == True Then - $mSkillPriorityRating[$i][1] += 60 - $i - $mSkillPriorityRating[$i][2] = 7 - Update("Skill " & $i & " is a Spirit Skill, Priority: " & $mSkillPriorityRating[$i][1] & ".") - ContinueLoop - EndIf - ; Hex Removal ; 8 - If IsHexRemovalSkill($mSkillbarCacheStruct[$i]) == True Then - $mSkillPriorityRating[$i][1] = 55 - $i - $mSkillPriorityRating[$i][2] = 8 - Update("Skill " & $i & " is a Hex Remover, Priority: " & $mSkillPriorityRating[$i][1] & ".") - ContinueLoop - EndIf - ; Condition Removal ; 9 - If IsConditionRemovalSkill($mSkillbarCacheStruct[$i]) == True Then - $mSkillPriorityRating[$i][1] = 50 - $i - $mSkillPriorityRating[$i][2] = 9 - Update("Skill " & $i & " is a Condition Remover, Priority: " & $mSkillPriorityRating[$i][1] & ".") - ContinueLoop - EndIf - ; Weapon Spell ; 10 - If IsWeaponSpell($mSkillbarCache[$i]) == True Then - $IsWeaponSpell[$i] = True - $IsWeaponSpell[0] = True - $mSkillPriorityRating[$i][1] += 40 - $i - $mSkillPriorityRating[$i][2] = 10 - Update("Skill " & $i & " is a Weapon Skill, Priority: " & $mSkillPriorityRating[$i][1] & ".") - ContinueLoop - EndIf - ; Enchantment Strip ; 11 - If IsEnchantmentStrip($mSkillbarCacheStruct[$i]) Then - $mSkillPriorityRating[$i][1] += 35 - $i - $mSkillPriorityRating[$i][2] = 11 - Update("Skill " & $i & " is a Enchantment Strip, Priority: " & $mSkillPriorityRating[$i][1] & ".") - ContinueLoop - EndIf - ; General Attack ; 12 - If SkillAOERange($mSkillbarCacheStruct[$i]) <= 0 And TargetEnemySkill($mSkillbarCacheStruct[$i]) == True And IsInterruptSkill($mSkillbarCacheStruct[$i]) == False Then - $mSkillPriorityRating[$i][1] += 30 - $i - If IsPvESkill($mSkillbarCacheStruct[$i]) Then $mSkillPriorityRating[$i][1] += 100 - $mSkillPriorityRating[$i][2] = 12 - Update("Skill " & $i & " Vs. enemies for " & $SkillDamageAmount[$i] & " damage, Priority: " & $mSkillPriorityRating[$i][1] & ".") - ContinueLoop - EndIf - ; Res Skill ; 13 - If IsResSkill($mSkillbarCacheStruct[$i]) == True Then - $mSkillPriorityRating[$i][1] = 20 - $i - $mSkillPriorityRating[$i][2] = 13 - Update("Skill " & $i & " is a Rez, Priority: " & $mSkillPriorityRating[$i][1] & ".") - ContinueLoop - EndIf - ; Self-Target, Summon spirits, enchantments ; 14 - If TargetSelfSkill($mSkillbarCacheStruct[$i]) == True And IsHealSkill($mSkillbarCacheStruct[$i]) == False And IsSpiritSkill($mSkillbarCacheStruct[$i]) == False And IsSummonSkill($mSkillbarCache[$i]) == False And $mSkillbarCache[$i] <> $Soul_Twisting Then - $IsSelfCastingSpell[$i] = True - $IsSelfCastingSpell[0] = True - $mSkillPriorityRating[$i][1] += 10 - $i - $mSkillPriorityRating[$i][2] = 14 - Update("Skill " & $i & " is a Self Targeting Skill, Priority: " & $mSkillPriorityRating[$i][1] & ".") - ContinueLoop - EndIf - ; Asuran Summon ; 15 - If IsSummonSkill($mSkillbarCache[$i]) == True Then - $IsSummonSpell[$i] = True - $IsSummonSpell[0] = True - $mSkillPriorityRating[$i][1] = 0 - $i - $mSkillPriorityRating[$i][2] = 15 - Update("Skill " & $i & " is a Summon, Priority: " & $mSkillPriorityRating[$i][1] & ".") - ContinueLoop - EndIf - Next - $lMyProfession = GetHeroProfession(0) - $lAttrPrimary = GetProfPrimaryAttribute($lMyProfession) - _ArraySort($mSkillPriorityRating, 0, 0, 0, 1) - EndIf - $mSkillbarCache[0] = True - $mSkillbarCachePtr[0] = True - $mSkillbarCacheStruct[0] = True -EndFunc ;==>CacheSkillbar - -;~ Description: Returns current target. -Func GetCurrentTarget() - Return GetAgentByID(GetCurrentTargetID()) -EndFunc ;==>GetCurrentTarget - -;~ Description: Picks up an item. -Func PickUpItem_($aItem) - Local $lAgentID - - If IsDllStruct($aItem) = 0 Then - $lAgentID = $aItem - ElseIf DllStructGetSize($aItem) < 400 Then - $lAgentID = DllStructGetData($aItem, 'AgentID') - Else - $lAgentID = DllStructGetData($aItem, 'ID') - EndIf - Return SendPacket(0xC, 0x39, $lAgentID, 0) -EndFunc ;==>PickUpItem - -;~ Description: Returns item by slot. -Func GetItemBySlot($aBag, $aSlot) - Local $lBag - - If IsDllStruct($aBag) = 0 Then - $lBag = GetBag($aBag) - Else - $lBag = $aBag - EndIf - - Local $lItemPtr = DllStructGetData($lBag, 'ItemArray') - Local $lBuffer = DllStructCreate('ptr') - Local $lItemStruct = DllStructCreate('long id;long agentId;byte unknown1[4];ptr bag;ptr modstruct;long modstructsize;ptr customized;byte unknown2[4];byte type;byte unknown3;short extraId;short value;byte unknown4[2];short interaction;long modelId;ptr modString;byte unknown5[4];ptr NameString;byte unknown6[15];byte quantity;byte equipped;byte unknown7[1];byte slot') - DllCall($mKernelHandle, 'int', 'ReadProcessMemory', 'int', $mGWProcHandle, 'int', DllStructGetData($lBag, 'ItemArray') + 4 * ($aSlot - 1), 'ptr', DllStructGetPtr($lBuffer), 'int', DllStructGetSize($lBuffer), 'int', '') - DllCall($mKernelHandle, 'int', 'ReadProcessMemory', 'int', $mGWProcHandle, 'int', DllStructGetData($lBuffer, 1), 'ptr', DllStructGetPtr($lItemStruct), 'int', DllStructGetSize($lItemStruct), 'int', '') - Return $lItemStruct -EndFunc ;==>GetItemBySlot - -;~ Description: Returns item struct. -Func GetItemByItemID($aItemID) - Local $lItemStruct = DllStructCreate('long id;long agentId;byte unknown1[4];ptr bag;ptr modstruct;long modstructsize;ptr customized;byte unknown2[4];byte type;byte unknown3;short extraId;short value;byte unknown4[2];short interaction;long modelId;ptr modString;byte unknown5[4];ptr NameString;byte unknown6[15];byte quantity;byte equipped;byte unknown7[1];byte slot') - Local $lOffset[5] = [0, 0x18, 0x40, 0xB8, 0x4 * $aItemID] - Local $lItemPtr = MemoryReadPtr($mBasePointer, $lOffset) - DllCall($mKernelHandle, 'int', 'ReadProcessMemory', 'int', $mGWProcHandle, 'int', $lItemPtr[1], 'ptr', DllStructGetPtr($lItemStruct), 'int', DllStructGetSize($lItemStruct), 'int', '') - Return $lItemStruct -EndFunc ;==>GetItemByItemID - -;~ Description: Returns item by agent ID. -Func GetItemByAgentID($aAgentID) - Local $lItemStruct = DllStructCreate('long id;long agentId;byte unknown1[4];ptr bag;ptr modstruct;long modstructsize;ptr customized;byte unknown2[4];byte type;byte unknown3;short extraId;short value;byte unknown4[2];short interaction;long modelId;ptr modString;byte unknown5[4];ptr NameString;byte unknown6[15];byte quantity;byte equipped;byte unknown7[1];byte slot') - Local $lOffset[4] = [0, 0x18, 0x40, 0xC0] - Local $lItemArraySize = MemoryReadPtr($mBasePointer, $lOffset) - Local $lOffset[5] = [0, 0x18, 0x40, 0xB8, 0] - Local $lItemPtr, $lItemID - Local $lAgentID = ConvertID($aAgentID) - - For $lItemID = 1 To $lItemArraySize[1] - $lOffset[4] = 0x4 * $lItemID - $lItemPtr = MemoryReadPtr($mBasePointer, $lOffset) - If $lItemPtr[1] = 0 Then ContinueLoop - - DllCall($mKernelHandle, 'int', 'ReadProcessMemory', 'int', $mGWProcHandle, 'int', $lItemPtr[1], 'ptr', DllStructGetPtr($lItemStruct), 'int', DllStructGetSize($lItemStruct), 'int', '') - If DllStructGetData($lItemStruct, 'AgentID') = $lAgentID Then Return $lItemStruct - Next -EndFunc ;==>GetItemByAgentID - -;~ Description: Returns item by model ID. -Func GetItemByModelID($aModelID, $BagsOnly = False) - If $BagsOnly Then - For $i = 1 to 17 - For $slot = 1 To DllStructGetData(GetBag($i), 'Slots') - $lItemStruct = GetItemBySlot($i, $Slot) - If DllStructGetData($lItemStruct, 'ID') = 0 Then ContinueLoop - If DllStructGetData($lItemStruct, 'ModelID') == $aModelID Then Return $lItemStruct - Next - Next - Else - Local $lItemStruct = DllStructCreate('long id;long agentId;byte unknown1[4];ptr bag;ptr modstruct;long modstructsize;ptr customized;byte unknown2[4];byte type;byte unknown3;short extraId;short value;byte unknown4[2];short interaction;long modelId;ptr modString;byte unknown5[4];ptr NameString;byte unknown6[15];byte quantity;byte equipped;byte unknown7[1];byte slot') - Local $lOffset[4] = [0, 0x18, 0x40, 0xC0] - Local $lItemArraySize = MemoryReadPtr($mBasePointer, $lOffset) - Local $lOffset[5] = [0, 0x18, 0x40, 0xB8, 0] - Local $lItemPtr, $lItemID - - For $lItemID = 1 To $lItemArraySize[1] - $lOffset[4] = 0x4 * $lItemID - $lItemPtr = MemoryReadPtr($mBasePointer, $lOffset) - If $lItemPtr[1] = 0 Then ContinueLoop - - DllCall($mKernelHandle, 'int', 'ReadProcessMemory', 'int', $mGWProcHandle, 'int', $lItemPtr[1], 'ptr', DllStructGetPtr($lItemStruct), 'int', DllStructGetSize($lItemStruct), 'int', '') - If DllStructGetData($lItemStruct, 'ModelID') = $aModelID Then Return $lItemStruct - Next - EndIf - Return False -EndFunc ;==>GetItemByModelID - -Func GetNumberOfFoesInRangeOfAgent_($aAgent = -2, $fMaxDistance = 4000, $ModelID = 0) - Local $lDistance, $lCount = 0, $lAgentToCompare - - If IsDllStruct($aAgent) = 0 Then $aAgent = GetAgentByID($aAgent) - For $i = 1 To GetMaxAgents() - $lAgentToCompare = GetAgentByID($i) - If DllStructGetData($lAgentToCompare, 'Type') <> 0xDB Then ContinueLoop - If DllStructGetData($lAgentToCompare, 'Allegiance') <> 3 Then ContinueLoop - If DllStructGetData($lAgentToCompare, 'HP') <= 0 Then ContinueLoop - If BitAND(DllStructGetData($lAgentToCompare, 'Effects'), 0x0010) > 0 Then ContinueLoop - If $ModelID <> 0 And DllStructGetData($lAgentToCompare, 'ModelID') == $ModelID Then ContinueLoop - $lDistance = GetDistance_($lAgentToCompare, $aAgent) - If $lDistance < $fMaxDistance Then - $lCount += 1 - EndIf - Next - Return $lCount -EndFunc ;==>GetNumberOfFoesInRangeOfAgent - -Func GetDistance_($aAgent1 = -1, $aAgent2 = -2) - If IsDllStruct($aAgent1) = 0 Then $aAgent1 = GetAgentByID($aAgent1) - If IsDllStruct($aAgent2) = 0 Then $aAgent2 = GetAgentByID($aAgent2) - Return Sqrt((DllStructGetData($aAgent1, 'X') - DllStructGetData($aAgent2, 'X')) ^ 2 + (DllStructGetData($aAgent1, 'Y') - DllStructGetData($aAgent2, 'Y')) ^ 2) -EndFunc ;==>GetDistance - -Func GetNumberOfAlliesInRangeOfAgent_($aAgent = -2, $fMaxDistance = 4000) - Local $lDistance, $lCount = 0, $lAgentToCompare - - If IsDllStruct($aAgent) = 0 Then $aAgent = GetAgentByID($aAgent) - For $i = 1 To GetMaxAgents() - $lAgentToCompare = GetAgentByID($i) - If DllStructGetData($lAgentToCompare, 'Type') <> 0xDB Then ContinueLoop - If DllStructGetData($lAgentToCompare, 'Allegiance') <> 1 Then ContinueLoop - If DllStructGetData($lAgentToCompare, 'HP') <= 0 Then ContinueLoop - If BitAND(DllStructGetData($lAgentToCompare, 'Effects'), 0x0010) > 0 Then ContinueLoop - $lDistance = GetDistance_($lAgentToCompare, $aAgent) - If $lDistance < $fMaxDistance Then - $lCount += 1 - EndIf - Next - Return $lCount -EndFunc ;==>GetNumberOfAlliesInRangeOfAgent - -;~ Returns player with most enemies around them within range $fMaxDistance -Func GetVIP_($fMaxDistance = 1350) - Local $lCount = 0, $lAgentToCompare, $VIP = 0, $Enemies = 0 - - For $i = 1 To GetMaxAgents() - $lAgentToCompare = GetAgentByID($i) - If DllStructGetData($lAgentToCompare, 'Type') <> 0xDB Then ContinueLoop - If DllStructGetData($lAgentToCompare, 'Allegiance') <> 1 Then ContinueLoop - If DllStructGetData($lAgentToCompare, 'HP') <= 0 Then ContinueLoop - If BitAND(DllStructGetData($lAgentToCompare, 'Effects'), 0x0010) > 0 Then ContinueLoop - $Enemies = GetNumberOfFoesInRangeOfAgent_($lAgentToCompare, $fMaxDistance) - If $Enemies > $lCount Then - $VIP = $lAgentToCompare - $lCount = $Enemies - EndIf - Next - Return $VIP -EndFunc ;==>GetVIP - -;~ Description: Creates an array of agents of a given type -Func GetAgentArray($aType = 0) - Local $lStruct - Local $lCount - Local $lBuffer = '' - DllStructSetData($mMakeAgentArray, 2, $aType) - MemoryWrite($mAgentCopyCount, -1, 'long') - Enqueue($mMakeAgentArrayPtr, 8) - Local $lDeadlock = TimerInit() - Do - Sleep(1) - $lCount = MemoryRead($mAgentCopyCount, 'long') - Until $lCount >= 0 Or TimerDiff($lDeadlock) > 5000 - If $lCount < 0 Then $lCount = 0 - For $i = 1 To $lCount - $lBuffer &= 'Byte[448];' - Next - $lBuffer = DllStructCreate($lBuffer) - DllCall($mKernelHandle, 'int', 'ReadProcessMemory', 'int', $mGWProcHandle, 'int', $mAgentCopyBase, 'ptr', DllStructGetPtr($lBuffer), 'int', DllStructGetSize($lBuffer), 'int', '') - Local $lReturnArray[$lCount + 1] = [$lCount] - For $i = 1 To $lCount - $lReturnArray[$i] = DllStructCreate('ptr vtable;byte unknown1[24];byte unknown2[4];ptr NextAgent;byte unknown3[8];long Id;float Z;byte unknown4[8];float BoxHoverWidth;float BoxHoverHeight;byte unknown5[8];float Rotation;byte unknown6[8];long NameProperties;byte unknown7[24];float X;float Y;byte unknown8[8];float NameTagX;float NameTagY;float NameTagZ;byte unknown9[12];long Type;float MoveX;float MoveY;byte unknown10[28];long Owner;byte unknown30[8];long ExtraType;byte unknown11[24];float AttackSpeed;float AttackSpeedModifier;word PlayerNumber;byte unknown12[6];ptr Equip;byte unknown13[10];byte Primary;byte Secondary;byte Level;byte Team;byte unknown14[6];float EnergyPips;byte unknown[4];float EnergyPercent;long MaxEnergy;byte unknown15[4];float HPPips;byte unknown16[4];float HP;long MaxHP;long Effects;byte unknown17[4];byte Hex;byte unknown18[18];long ModelState;long TypeMap;byte unknown19[16];long InSpiritRange;byte unknown20[16];long LoginNumber;float ModelMode;byte unknown21[4];long ModelAnimation;byte unknown22[32];byte LastStrike;byte Allegiance;word WeaponType;word Skill;byte unknown23[4];word WeaponItemId;word OffhandItemId') - $lStruct = DllStructCreate('byte[448]', DllStructGetPtr($lReturnArray[$i])) - DllStructSetData($lStruct, 1, DllStructGetData($lBuffer, $i)) - Next - Return $lReturnArray -EndFunc ;==>GetAgentArray - -;~ Description: Returns an agent struct. -Func GetAgentByID($aAgentID = -2) - ;returns dll struct if successful - Local $lAgentPtr = GetAgentPtr($aAgentID) - If $lAgentPtr = 0 Then Return 0 - ;Offsets: 0x2C=AgentID 0x9C=Type 0xF4=PlayerNumber 0114=Energy Pips - Local $lAgentStruct = DllStructCreate('ptr vtable;byte unknown1[24];byte unknown2[4];ptr NextAgent;byte unknown3[8];long Id;float Z;byte unknown4[8];float BoxHoverWidth;float BoxHoverHeight;byte unknown5[8];float Rotation;byte unknown6[8];long NameProperties;byte unknown7[24];float X;float Y;byte unknown8[8];float NameTagX;float NameTagY;float NameTagZ;byte unknown9[12];long Type;float MoveX;float MoveY;byte unknown10[28];long Owner;byte unknown30[8];long ExtraType;byte unknown11[24];float AttackSpeed;float AttackSpeedModifier;word PlayerNumber;byte unknown12[6];ptr Equip;byte unknown13[10];byte Primary;byte Secondary;byte Level;byte Team;byte unknown14[6];float EnergyPips;byte unknown[4];float EnergyPercent;long MaxEnergy;byte unknown15[4];float HPPips;byte unknown16[4];float HP;long MaxHP;long Effects;byte unknown17[4];byte Hex;byte unknown18[18];long ModelState;long TypeMap;byte unknown19[16];long InSpiritRange;byte unknown20[16];long LoginNumber;float ModelMode;byte unknown21[4];long ModelAnimation;byte unknown22[32];byte LastStrike;byte Allegiance;word WeaponType;word Skill;byte unknown23[4];word WeaponItemId;word OffhandItemId') - DllCall($mKernelHandle, 'int', 'ReadProcessMemory', 'int', $mGWProcHandle, 'int', $lAgentPtr, 'ptr', DllStructGetPtr($lAgentStruct), 'int', DllStructGetSize($lAgentStruct), 'int', '') - Return $lAgentStruct -EndFunc ;==>GetAgentByID - -;~ Description: Returns agent by player name. -Func GetAgentByPlayerName($aPlayerName) - For $i = 1 To GetMaxAgents() - If GetPlayerName($i) = $aPlayerName Then - Return GetAgentByID($i) - EndIf - Next -EndFunc ;==>GetAgentByPlayerName - -;~ Description: Returns agent by name. -Func GetAgentByName($aName) - If $mUseStringLog = False Then Return - - Local $lName, $lAddress - - For $i = 1 To GetMaxAgents() - $lAddress = $mStringLogBase + 256 * $i - $lName = MemoryRead($lAddress, 'wchar [128]') - $lName = StringRegExpReplace($lName, '[<]{1}([^>]+)[>]{1}', '') - If StringInStr($lName, $aName) > 0 Then Return GetAgentByID($i) - Next - - DisplayAll(True) - Sleep(100) - DisplayAll(False) - DisplayAll(True) - Sleep(100) - DisplayAll(False) - - For $i = 1 To GetMaxAgents() - $lAddress = $mStringLogBase + 256 * $i - $lName = MemoryRead($lAddress, 'wchar [128]') - $lName = StringRegExpReplace($lName, '[<]{1}([^>]+)[>]{1}', '') - If StringInStr($lName, $aName) > 0 Then Return GetAgentByID($i) - Next -EndFunc ;==>GetAgentByName - -;~ Description: Returns the nearest agent to an agent. -Func GetNearestAgentToAgent($aAgent = -2) - Local $lNearestAgent, $lNearestDistance = 100000000 - Local $lDistance - Local $lAgentArray = GetAgentArray() - - If IsDllStruct($aAgent) = 0 Then $aAgent = GetAgentByID($aAgent) - - Local $lID = DllStructGetData($aAgent, 'ID') - - For $i = 1 To $lAgentArray[0] - $lDistance = (DllStructGetData($aAgent, 'X') - DllStructGetData($lAgentArray[$i], 'X')) ^ 2 + (DllStructGetData($aAgent, 'Y') - DllStructGetData($lAgentArray[$i], 'Y')) ^ 2 - - If $lDistance < $lNearestDistance Then - If DllStructGetData($lAgentArray[$i], 'ID') == $lID Then ContinueLoop - $lNearestAgent = $lAgentArray[$i] - $lNearestDistance = $lDistance - EndIf - Next - - SetExtended(Sqrt($lNearestDistance)) - Return $lNearestAgent -EndFunc ;==>GetNearestAgentToAgent - -;~ Description: Returns the nearest enemy to an agent. -Func GetNearestEnemyToAgent($aAgent = -2) - Local $lNearestAgent, $lNearestDistance = 100000000 - Local $lDistance - Local $lAgentArray = GetAgentArray(0xDB) - - If Not IsDllStruct($aAgent) Then $aAgent = GetAgentByID($aAgent) - - Local $lID = DllStructGetData($aAgent, 'ID') - - For $i = 1 To $lAgentArray[0] - $lDistance = (DllStructGetData($aAgent, 'X') - DllStructGetData($lAgentArray[$i], 'X')) ^ 2 + (DllStructGetData($aAgent, 'Y') - DllStructGetData($lAgentArray[$i], 'Y')) ^ 2 - If DllStructGetData($lAgentArray[$i], 'Allegiance') <> 3 Then ContinueLoop - If DllStructGetData($lAgentArray[$i], 'HP') <= 0 Then ContinueLoop - If BitAND(DllStructGetData($lAgentArray[$i], 'Effects'), 0x0010) > 0 Then ContinueLoop - - $lDistance = (DllStructGetData($aAgent, 'X') - DllStructGetData($lAgentArray[$i], 'X')) ^ 2 + (DllStructGetData($aAgent, 'Y') - DllStructGetData($lAgentArray[$i], 'Y')) ^ 2 - If $lDistance < $lNearestDistance Then - If DllStructGetData($lAgentArray[$i], 'ID') == $lID Then ContinueLoop - $lNearestAgent = $lAgentArray[$i] - $lNearestDistance = $lDistance - EndIf - Next - - SetExtended(Sqrt($lNearestDistance)) - Return $lNearestAgent -EndFunc ;==>GetNearestEnemyToAgent - -;~ Description: Returns the farthest enemy to an agent within given max distance -Func GetFarthestEnemyToAgent($MaxDistance = 1400, $aAgent = -2) - Local $lFarthestAgent, $lFarthestDistance = 1 - Local $lDistance - Local $lAgentArray = GetAgentArray(0xDB) - - If Not IsDllStruct($aAgent) Then $aAgent = GetAgentByID($aAgent) - - Local $lID = DllStructGetData($aAgent, 'ID') - - For $i = 1 To $lAgentArray[0] - If DllStructGetData($lAgentArray[$i], 'Allegiance') <> 3 Then ContinueLoop - If DllStructGetData($lAgentArray[$i], 'HP') <= 0 Then ContinueLoop - If BitAND(DllStructGetData($lAgentArray[$i], 'Effects'), 0x0010) > 0 Then ContinueLoop - - $lDistance = (DllStructGetData($aAgent, 'X') - DllStructGetData($lAgentArray[$i], 'X')) ^ 2 + (DllStructGetData($aAgent, 'Y') - DllStructGetData($lAgentArray[$i], 'Y')) ^ 2 - If $lDistance > $lFarthestDistance And $lDistance < ($MaxDistance ^ 2) Then - If DllStructGetData($lAgentArray[$i], 'ID') == $lID Then ContinueLoop - $lFarthestAgent = $lAgentArray[$i] - $lFarthestDistance = $lDistance - EndIf - Next - - SetExtended(Sqrt($lFarthestDistance)) - Return $lFarthestAgent -EndFunc ;==>GetFarthestEnemyToAgent - -;~ Description: Returns the nearest agent to a set of coordinates. -Func GetNearestAgentToCoords($aX, $aY) - Local $lNearestAgent, $lNearestDistance = 100000000 - Local $lDistance - Local $lAgentArray = GetAgentArray() - - For $i = 1 To $lAgentArray[0] - $lDistance = ($aX - DllStructGetData($lAgentArray[$i], 'X')) ^ 2 + ($aY - DllStructGetData($lAgentArray[$i], 'Y')) ^ 2 - If $lDistance < $lNearestDistance Then - $lNearestAgent = $lAgentArray[$i] - $lNearestDistance = $lDistance - EndIf - Next - - SetExtended(Sqrt($lNearestDistance)) - Return $lNearestAgent -EndFunc ;==>GetNearestAgentToCoords - -;~ Description: Returns the nearest signpost to an agent. -Func GetNearestSignpostToAgent($aAgent = -2) - Local $lNearestAgent, $lNearestDistance = 100000000 - Local $lDistance - Local $lAgentArray = GetAgentArray(0x200) - - If IsDllStruct($aAgent) = 0 Then $aAgent = GetAgentByID($aAgent) - - Local $lID = DllStructGetData($aAgent, 'ID') - - For $i = 1 To $lAgentArray[0] - $lDistance = (DllStructGetData($lAgentArray[$i], 'Y') - DllStructGetData($aAgent, 'Y')) ^ 2 + (DllStructGetData($lAgentArray[$i], 'X') - DllStructGetData($aAgent, 'X')) ^ 2 - If $lDistance < $lNearestDistance Then - If DllStructGetData($lAgentArray[$i], 'ID') == $lID Then ContinueLoop - $lNearestAgent = $lAgentArray[$i] - $lNearestDistance = $lDistance - EndIf - Next - - SetExtended(Sqrt($lNearestDistance)) - Return $lNearestAgent -EndFunc ;==>GetNearestSignpostToAgent - -;~ Description: Returns the nearest signpost to a set of coordinates. -Func GetNearestSignpostToCoords($aX, $aY) - Local $lNearestAgent, $lNearestDistance = 100000000 - Local $lDistance - Local $lAgentArray = GetAgentArray(0x200) - - For $i = 1 To $lAgentArray[0] - $lDistance = ($aX - DllStructGetData($lAgentArray[$i], 'X')) ^ 2 + ($aY - DllStructGetData($lAgentArray[$i], 'Y')) ^ 2 - - If $lDistance < $lNearestDistance Then - $lNearestAgent = $lAgentArray[$i] - $lNearestDistance = $lDistance - EndIf - Next - - SetExtended(Sqrt($lNearestDistance)) - Return $lNearestAgent -EndFunc ;==>GetNearestSignpostToCoords - -;~ Description: Returns the nearest NPC to an agent. -Func GetNearestNPCToAgent($aAgent = -2) - Local $lNearestAgent, $lNearestDistance = 100000000 - Local $lDistance - Local $lAgentArray = GetAgentArray(0xDB) - - If Not IsDllStruct($aAgent) Then $aAgent = GetAgentByID($aAgent) - - Local $lID = DllStructGetData($aAgent, 'ID') - - For $i = 1 To $lAgentArray[0] - If DllStructGetData($lAgentArray[$i], 'Allegiance') <> 6 Then ContinueLoop - If DllStructGetData($lAgentArray[$i], 'HP') <= 0 Then ContinueLoop - If BitAND(DllStructGetData($lAgentArray[$i], 'Effects'), 0x0010) > 0 Then ContinueLoop - - $lDistance = (DllStructGetData($aAgent, 'X') - DllStructGetData($lAgentArray[$i], 'X')) ^ 2 + (DllStructGetData($aAgent, 'Y') - DllStructGetData($lAgentArray[$i], 'Y')) ^ 2 - If $lDistance < $lNearestDistance Then - If DllStructGetData($lAgentArray[$i], 'ID') == $lID Then ContinueLoop - $lNearestAgent = $lAgentArray[$i] - $lNearestDistance = $lDistance - EndIf - Next - - SetExtended(Sqrt($lNearestDistance)) - Return $lNearestAgent -EndFunc ;==>GetNearestNPCToAgent - -;~ Description: Returns the nearest NPC to a set of coordinates. -Func GetNearestNPCToCoords($aX, $aY) - Local $lNearestAgent, $lNearestDistance = 100000000 - Local $lDistance - Local $lAgentArray = GetAgentArray(0xDB) - - For $i = 1 To $lAgentArray[0] - If DllStructGetData($lAgentArray[$i], 'Allegiance') <> 6 Then ContinueLoop - If DllStructGetData($lAgentArray[$i], 'HP') <= 0 Then ContinueLoop - If BitAND(DllStructGetData($lAgentArray[$i], 'Effects'), 0x0010) > 0 Then ContinueLoop - - $lDistance = ($aX - DllStructGetData($lAgentArray[$i], 'X')) ^ 2 + ($aY - DllStructGetData($lAgentArray[$i], 'Y')) ^ 2 - - If $lDistance < $lNearestDistance Then - $lNearestAgent = $lAgentArray[$i] - $lNearestDistance = $lDistance - EndIf - Next - - SetExtended(Sqrt($lNearestDistance)) - Return $lNearestAgent -EndFunc ;==>GetNearestNPCToCoords - -;~ Description: Returns the nearest item to an agent. -Func GetNearestItemToAgent($aAgent = -2, $aCanPickUp = True) - Local $lNearestAgent, $lNearestDistance = 100000000 - Local $lDistance - Local $lAgentArray = GetAgentArray(0x400) - - If Not IsDllStruct($aAgent) Then $aAgent = GetAgentByID($aAgent) - - Local $lID = DllStructGetData($aAgent, 'ID') - - For $i = 1 To $lAgentArray[0] - - If $aCanPickUp And Not GetCanPickUp($lAgentArray[$i]) Then ContinueLoop - $lDistance = (DllStructGetData($aAgent, 'X') - DllStructGetData($lAgentArray[$i], 'X')) ^ 2 + (DllStructGetData($aAgent, 'Y') - DllStructGetData($lAgentArray[$i], 'Y')) ^ 2 - If $lDistance < $lNearestDistance Then - If DllStructGetData($lAgentArray[$i], 'ID') == $lID Then ContinueLoop - $lNearestAgent = $lAgentArray[$i] - $lNearestDistance = $lDistance - EndIf - Next - - SetExtended(Sqrt($lNearestDistance)) - Return $lNearestAgent -EndFunc ;==>GetNearestItemToAgent - -;~ Description: Returns array of party members -Func GetParty() - Local $lReturnArray[1] = [0] - Local $lAgentArray = GetAgentArray(0xDB) - For $i = 1 To $lAgentArray[0] - If DllStructGetData($lAgentArray[$i], 'Allegiance') == 1 Then - If BitAND(DllStructGetData($lAgentArray[$i], 'TypeMap'), 131072) Then ; An agent who's health can be viewed through the party, minion, or pet menus. - $lReturnArray[0] += 1 - ReDim $lReturnArray[$lReturnArray[0] + 1] - $lReturnArray[$lReturnArray[0]] = $lAgentArray[$i] - EndIf - EndIf - Next - Return $lReturnArray -EndFunc ;==>GetParty - -; Returns number of party members, works in explorable only -Func GetPartySize_() - Return UBound(GetParty()) -EndFunc ;==>GetPartySize - -;~ Description: Returns array of Enemy members -Func GetEnemyParty() - Local $lReturnArray[1] = [0] - Local $lAgentArray = GetAgentArray(0xDB) - For $i = 1 To $lAgentArray[0] - If BitAND(DllStructGetData($lAgentArray[$i], 'TypeMap'), 131072) Then ContinueLoop - If DllStructGetData($lAgentArray[$i], 'Allegiance') == 3 Then - $lReturnArray[0] += 1 - ReDim $lReturnArray[$lReturnArray[0] + 1] - $lReturnArray[$lReturnArray[0]] = $lAgentArray[$i] - EndIf - Next - Return $lReturnArray -EndFunc ;==>GetEnemyParty - -; Returns agent of requested player number in party -Func GetPlayerByPlayerNumber($PlayerNumber) - Local $lReturnArray[1] = [0] - Local $lAgentArray = GetAgentArray(0xDB) - For $i = 1 To $lAgentArray[0] - If DllStructGetData($lAgentArray[$i], 'Allegiance') == 1 Then - If BitAND(DllStructGetData($lAgentArray[$i], 'TypeMap'), 131072) Then - If DllStructGetData($lAgentArray[$i], 'PlayerNumber') == $PlayerNumber Then - Return $lAgentArray[$i] - EndIf - EndIf - EndIf - Next - Return 0 -EndFunc ;==>GetPlayerByPlayerNumber - -;~ Description: Updates all the information you need for combat. -Func UpdateWorld_($aRange = 1350) - Local $LocationCount = 0 - $aRange = $aRange ^ 2 - $mSelfID = GetMyID() - $mSelf = GetAgentByID($mSelfID) - If GetIsDead($mSelf) Then Return False - If GetMapLoading() <> $INSTANCETYPE_EXPLORABLE Then Return True - $mEnergy = DllStructGetData($mSelf, 'EnergyPercent') * DllStructGetData($mSelf, 'MaxEnergy') - $mEffects = GetEffect() - - $mDazed = False - $mBlind = False - $mSkillHardCounter = False - $mSkillSoftCounter = 0 - $mAttackHardCounter = False - $mAttackSoftCounter = 0 - $mAllySpellHardCounter = False - $mEnemySpellHardCounter = False - $mSpellSoftCounter = 0 - $mBlocking = False - - For $i = 1 To $mEffects[0] - Switch DllStructGetData($mEffects[$i], 'SkillID') - Case 485 ; Dazed - $mDazed = True - Case 479 ; Blind - $mBlind = True - Case 30, 764 ; Diversion, Wail of Doom - $mSkillHardCounter = True - Case 51, 127 ; Shame, Mark of Subversion - $mAllySpellHardCounter = True - Case 46, 979, 3191 ; Guilt, Mistrust - $mEnemySpellHardCounter = True - Case 878, 3234 ; Visions of Regret - $mSkillSoftCounter += 1 - $mSpellSoftCounter += 1 - $mAttackSoftCounter += 1 - Case 28, 128 ; Backfire, Soul Leech - $mSpellSoftCounter += 1 - Case 47, 43, 1004, 2056, 3195 ; Ineptitude, Clumsiness, Yuletide, Wandering Eye - $mAttackHardCounter = True - Case 123, 26, 3151, 121, 103, 66 ; Insidious Parasite, Empathy, Spiteful Spirit, Price of Failure, Spirit Shackles - $mAttackSoftCounter += 1 - ; Auspicious Parry, Bonetti's Defense, Deadly Riposte, Defensive Stance, Deflect Arrows, - ; Disciplined Stance, Frenzied Defense, Gladiator's Defense, Riposte, Shield Bash, Shield Stance, - ; Soldier's Stance, Wary Stance, Dodge, Dryder's Defenses, Escape, Lightning Reflexes - Case 905,380,388,345,373,376,1700,372,387,363,378,1698,377,425,452,448,453 - $mBlocking = True - ; Critical Defenses, Flashing Blades, Weapon of Warding, Burning Shield, Attacker's Insight, - ; Shield of Force, Mental Block, Protector's Defense, Ward Against Melee, Mirage Cloak, Natural Stride - ; Whirling Defense, Zojun's Haste, Distortion, Magnetic Aura, Sliver Armor, Swirling Aura, - Case 1027,1042,793,2208,1764,2201,2417,810,176,1500,1727,450,1196,11,168,1084,233 - $mBlocking = True - EndSwitch - Next - - Local $lAgent - Local $lTeam = DllStructGetData($mSelf, 'Team') - Local $lX = XLocation() - Local $lY = YLocation() - Local $lHP - Local $lDistance - Local $lModel - Local $lCountAOE = 1 - - Dim $mTeam[1] = [0] - Dim $mTeamOthers[1] = [0] - Dim $mTeamDead[1] = [0] - Dim $mEnemies[1] = [0] - Dim $mEnemiesRange[1] = [0] - Dim $mEnemiesSpellRange[1] = [0] - Dim $mEnemyCorpesSpellRange[1] = [0] - Dim $mSpirits[1] = [0] - Dim $mPets[1] = [0] - Dim $mMinions[1] = [0] - - $mHighestAlly = $mSelf - $mHighestAllyHP = 2 - $mLowestAlly = $mSelf - $mLowestAllyHP = 2 - $mLowestOtherAlly = 0 - $mLowestOtherAllyHP = 2 - $mLowestEnemy = 0 - $mLowestEnemyHP = 2 - $mClosestEnemy = 0 - $mClosestEnemyDist = 25000000 - $mAverageTeamHP = 0 - $BestAOETarget = 0 - $HexedAlly = 0 - $ConditionedAlly = 0 - $HexedEnemy = 0 - $EnemyNonHexed = 0 - $EnemyConditioned = 0 - $EnemyNonConditioned = 0 - $EnemyNonEnchanted = 0 - $EnemyEnchanted = 0 - $EnemyHealer = 0 - $LowHPEnemy = 0 - $NumberOfFoesInAttackRange = 0 - $NumberOfFoesInSpellRange = 0 - - Local $lAgentArray = GetAgentArray(0xDB) - For $i = 1 To $lAgentArray[0] - $lAgent = $lAgentArray[$i] - $lHP = DllStructGetData($lAgent, 'HP') - $lDistance = ($lX - XLocation($lAgent)) ^ 2 + ($lY - YLocation($lAgent)) ^ 2 - Switch DllStructGetData($lAgent, 'Allegiance') - Case 1, 6 ;Allies - If Not BitAND(DllStructGetData($lAgent, 'Typemap'), 131072) Then ContinueLoop ;Double check it's not a summon - If Not BitAND(DllStructGetData($lAgent, 'Effects'), 0x0010) Then -;~ $mTeam[0] += 1 -;~ ReDim $mTeam[$mTeam[0] + 1] -;~ $mTeam[$mTeam[0]] = $lAgent - - $mAverageTeamHP += $lHP - -;~ Lowest Ally - If $lHP < $mLowestAllyHP Then - $mLowestAlly = $lAgent - $mLowestAllyHP = $lHP - ElseIf $lHP = $mLowestAllyHP Then - If $lDistance < ($lX - DllStructGetData($mLowestAlly, 'X')) ^ 2 + ($lY - DllStructGetData($mLowestAlly, 'Y')) ^ 2 Then - $mLowestAlly = $lAgent - $mLowestAllyHP = $lHP - EndIf - ElseIf $lHP > $mHighestAllyHP Then ; Highest Ally - $mHighestAlly = $lAgent - $mHighestAllyHP = $lHP - EndIf - - If GetHasHex($lAgent) == True Then $HexedAlly = $lAgent - If GetHasCondition($lAgent) == True Then $ConditionedAlly = $lAgent - -;~ Other Allies - If $i <> $mSelfID Then - $mTeamOthers[0] += 1 - ReDim $mTeamOthers[$mTeamOthers[0] + 1] - $mTeamOthers[$mTeamOthers[0]] = $lAgent - -;~ Lowest Other Ally - If $lHP < $mLowestOtherAllyHP Then - $mLowestOtherAlly = $lAgent - $mLowestOtherAllyHP = $lHP - ElseIf $lHP = $mLowestOtherAllyHP Then - If $lDistance < ($lX - DllStructGetData($mLowestOtherAlly, 'X')) ^ 2 + ($lY - DllStructGetData($mLowestOtherAlly, 'Y')) ^ 2 Then - $mLowestOtherAlly = $lAgent - $mLowestOtherAllyHP = $lHP - EndIf - EndIf - EndIf - Else -;~ Dead Allies - $mTeamDead[0] += 1 - ReDim $mTeamDead[$mTeamDead[0] + 1] - $mTeamDead[$mTeamDead[0]] = $lAgent - EndIf - Case 3 ;Enemies - If BitAND(DllStructGetData($lAgent, 'Effects'), 0x0010) Then ; Dead Enemies -;~ ;Dead Enemies in spell range -;~ If $lDistance <= 1537600 Then ;1240 -;~ $mEnemyCorpesSpellRange[0] += 1 -;~ ReDim $mEnemyCorpesSpellRange[$mEnemyCorpesSpellRange[0] + 1] -;~ $mEnemyCorpesSpellRange[$mEnemyCorpesSpellRange[0]] = $lAgent -;~ EndIf - Else - -;~ ModelID BlackList - $lModel = DllStructGetData($lAgent, 'PlayerNumber') -;~ Switch $lModel -;~ Case $BoneHorrorID To $BoneHorrorID + 2, $BoneHorrorID + 644 To $BoneHorrorID + 658, $BoneHorrorID + 1979 To $BoneHorrorID + 2009, $BoneHorrorID + 3483 To $BoneHorrorID + 3493, $BoneHorrorID + 3623 To $BoneHorrorID + 3624 -;~ ContinueLoop -;~ EndSwitch - -;~ $mEnemies[0] += 1 -;~ ReDim $mEnemies[$mEnemies[0] + 1] -;~ $mEnemies[$mEnemies[0]] = $lAgent - -;~ Enemies in waypoint range - If $lDistance <= $aRange Then - $NumberOfFoesInAttackRange += 1 -;~ $mEnemiesRange[0] += 1 -;~ ReDim $mEnemiesRange[$mEnemiesRange[0] + 1] -;~ $mEnemiesRange[$mEnemiesRange[0]] = $lAgent - -;~ Lowest Enemy - If $lHP < $mLowestEnemyHP Then - $mLowestEnemy = $lAgent - $mLowestEnemyHP = $lHP - ElseIf $lHP = $mLowestEnemyHP Then - If $lDistance < ($lX - DllStructGetData($mLowestEnemy, 'X')) ^ 2 + ($lY - DllStructGetData($mLowestEnemy, 'Y')) ^ 2 Then - $mLowestEnemy = $lAgent - $mLowestEnemyHP = $lHP - EndIf - EndIf - - If GetNumberOfFoesInRangeOfAgent($lAgent, 256) > $lCountAOE Then - $BestAOETarget = $lAgent - $lCountAOE += 1 - EndIf - - If GetIsBoss($lAgent) == True Then - $BestAOETarget = $lAgent - $lCountAOE += 5 - EndIf - - If GetHasHex($lAgent) == True Then - $EnemyHexed = $lAgent - Else - $EnemyNonHexed = $lAgent - EndIf - If GetHasCondition($lAgent) == True Then - $EnemyConditioned = $lAgent - Else - $EnemyNonConditioned = $lAgent - EndIf - If GetIsHealer($lAgent) Then $EnemyHealer = $lAgent - - If GetIsEnchanted($lAgent) Then - $EnemyNonEnchanted = $lAgent - Else - $EnemyEnchanted = $lAgent - EndIf - - -;~ Closest Enemy -;~ If $lDistance < $mClosestEnemyDist Then -;~ $mClosestEnemyDist = $lDistance -;~ $mClosestEnemy = $lAgent -;~ $mLowestEnemy = $lAgent -;~ EndIf - EndIf - -;~ Enemies in spell range - If $lDistance <= 1440000 Then ;1200 - $NumberOfFoesInSpellRange += 1 - If DllStructGetData($lAgent, 'HP') * DllStructGetData($lAgent, 'MaxHP') < 0.5 Then - $LowHPEnemy = $lAgent - EndIf -;~ $mEnemiesSpellRange[0] += 1 -;~ ReDim $mEnemiesSpellRange[$mEnemiesSpellRange[0] + 1] -;~ $mEnemiesSpellRange[$mEnemiesSpellRange[0]] = $lAgent - EndIf - EndIf - Case 4 ;Allied Pets/Spirits - If Not BitAND(DllStructGetData($lAgent, 'Typemap'), 131072) Then ContinueLoop - If BitAND(DllStructGetData($lAgent, 'Effects'), 0x0010) Then ContinueLoop - If BitAND(DllStructGetData($lAgent, 'Typemap'), 262144) Then - $mSpirits[0] += 1 - ReDim $mSpirits[$mSpirits[0] + 1] - $mSpirits[$mSpirits[0]] = $lAgent -;~ Else -;~ $mPets[0] += 1 -;~ ReDim $mPets[$mPets[0] + 1] -;~ $mPets[$mPets[0]] = $lAgent - EndIf - Case 5 ;Allied Minions - If Not BitAND(DllStructGetData($lAgent, 'Typemap'), 131072) Then ContinueLoop - If BitAND(DllStructGetData($lAgent, 'Effects'), 0x0010) Then ContinueLoop - $mMinions[0] += 1 - ReDim $mMinions[$mMinions[0] + 1] - $mMinions[$mMinions[0]] = $lAgent - Case Else - EndSwitch - Next - $mClosestEnemyDist = Sqrt($mClosestEnemyDist) - $mAverageTeamHP /= $mTeam[0] - If $NumberOfFoesInSpellRange <= 0 Then $EnemyAttacker = 0 - -EndFunc ;==>UpdateWorld - - -;~ Description: Returns buff struct. -Func GetBuffByIndex($aBuffNumber, $aHeroNumber = 0) - Local $lBuffStruct = DllStructCreate('long SkillId;byte unknown1[4];long BuffId;long TargetId') - Local $lOffset[4] - $lOffset[0] = 0 - $lOffset[1] = 0x18 - $lOffset[2] = 0x2C - $lOffset[3] = 0x4AC - Local $lCount = MemoryReadPtr($mBasePointer, $lOffset) - ReDim $lOffset[5] - $lOffset[3] = 0x4A4 - Local $lBuffer - For $i = 0 To $lCount[1] - 1 - $lOffset[4] = 0x24 * $i - $lBuffer = MemoryReadPtr($mBasePointer, $lOffset) - If $lBuffer[1] == GetHeroID($aHeroNumber) Then - $lOffset[4] = 0x4 + 0x24 * $i - ReDim $lOffset[6] - $lOffset[5] = 0 + 0x10 * ($aBuffNumber - 1) - $lBuffStructAddress = MemoryReadPtr($mBasePointer, $lOffset) - DllCall($mKernelHandle, 'int', 'ReadProcessMemory', 'int', $mGWProcHandle, 'int', $lBuffStructAddress[0], 'ptr', DllStructGetPtr($lBuffStruct), 'int', DllStructGetSize($lBuffStruct), 'int', '') - Return $lBuffStruct - EndIf - Next - Return 0 -EndFunc ;==>GetBuffByIndex - -;~ Description: Returns skillbar struct. -Func GetSkillbar($aHeroNumber = 0) - Local $lSkillbarStruct = DllStructCreate('long AgentId;long AdrenalineA1;long AdrenalineB1;dword Recharge1;dword Id1;dword Event1;long AdrenalineA2;long AdrenalineB2;dword Recharge2;dword Id2;dword Event2;long AdrenalineA3;long AdrenalineB3;dword Recharge3;dword Id3;dword Event3;long AdrenalineA4;long AdrenalineB4;dword Recharge4;dword Id4;dword Event4;long AdrenalineA5;long AdrenalineB5;dword Recharge5;dword Id5;dword Event5;long AdrenalineA6;long AdrenalineB6;dword Recharge6;dword Id6;dword Event6;long AdrenalineA7;long AdrenalineB7;dword Recharge7;dword Id7;dword Event7;long AdrenalineA8;long AdrenalineB8;dword Recharge8;dword Id8;dword Event8;dword disabled;byte unknown[8];dword Casting') - Local $lOffset[5] - $lOffset[0] = 0 - $lOffset[1] = 0x18 - $lOffset[2] = 0x2C - $lOffset[3] = 0x68C - For $i = 0 To GetHeroCount() - $lOffset[4] = $i * 0xBC - Local $lSkillbarStructAddress = MemoryReadPtr($mBasePointer, $lOffset) - DllCall($mKernelHandle, 'int', 'ReadProcessMemory', 'int', $mGWProcHandle, 'int', $lSkillbarStructAddress[0], 'ptr', DllStructGetPtr($lSkillbarStruct), 'int', DllStructGetSize($lSkillbarStruct), 'int', '') - If DllStructGetData($lSkillbarStruct, 'AgentId') == GetHeroID($aHeroNumber) Then Return $lSkillbarStruct - Next - EndFunc ;==>GetSkillbar - -;~ Description: Returns skill struct. -Func GetSkillByID($aSkillID) - Local $lSkillStruct = DllStructCreate('long ID;byte Unknown1[4];long campaign;long Type;long Special;long ComboReq;long Effect1;long Condition;long Effect2;long WeaponReq;byte Profession;byte Attribute;byte Unknown2[2];long PvPID;byte Combo;byte Target;byte unknown3;byte EquipType;byte Unknown4a;byte EnergyCost;byte HealthCost;byte Unknown4c;dword Adrenaline;float Activation;float Aftercast;long Duration0;long Duration15;long Recharge;byte Unknown5[12];long Scale0;long Scale15;long BonusScale0;long BonusScale15;float AoERange;float ConstEffect;byte unknown6[44]') - Local $lSkillStructAddress = $mSkillBase + 160 * $aSkillID - DllCall($mKernelHandle, 'int', 'ReadProcessMemory', 'int', $mGWProcHandle, 'int', $lSkillStructAddress, 'ptr', DllStructGetPtr($lSkillStruct), 'int', DllStructGetSize($lSkillStruct), 'int', '') - Return $lSkillStruct -EndFunc ;==>GetSkillByID - -;~ Description: Returns effect struct or array of effects. -Func GetEffect($aSkillID = 0, $aHeroNumber = 0) - Local $lEffectCount, $lEffectStructAddress - Local $lReturnArray[1] = [0] - - Local $lOffset[4] - $lOffset[0] = 0 - $lOffset[1] = 0x18 - $lOffset[2] = 0x2C - $lOffset[3] = 0x4AC - Local $lCount = MemoryReadPtr($mBasePointer, $lOffset) - ReDim $lOffset[5] - $lOffset[3] = 0x4A4 - Local $lBuffer - - For $i = 0 To $lCount[1] - 1 - $lOffset[4] = 0x24 * $i - $lBuffer = MemoryReadPtr($mBasePointer, $lOffset) - If $lBuffer[1] == GetHeroID($aHeroNumber) Then - $lOffset[4] = 0x1C + 0x24 * $i - $lEffectCount = MemoryReadPtr($mBasePointer, $lOffset) - ReDim $lOffset[6] - $lOffset[4] = 0x14 + 0x24 * $i - $lOffset[5] = 0 - $lEffectStructAddress = MemoryReadPtr($mBasePointer, $lOffset) - - If $aSkillID = 0 Then - ReDim $lReturnArray[$lEffectCount[1] + 1] - $lReturnArray[0] = $lEffectCount[1] - - For $i = 0 To $lEffectCount[1] - 1 - $lReturnArray[$i + 1] = DllStructCreate('long SkillId;long EffectType;long EffectId;long AgentId;float Duration;long TimeStamp') - $lEffectStructAddress[1] = $lEffectStructAddress[0] + 24 * $i - DllCall($mKernelHandle, 'int', 'ReadProcessMemory', 'int', $mGWProcHandle, 'int', $lEffectStructAddress[1], 'ptr', DllStructGetPtr($lReturnArray[$i + 1]), 'int', 24, 'int', '') - Next - - ExitLoop - Else - Local $lReturn = DllStructCreate('long SkillId;long EffectType;long EffectId;long AgentId;float Duration;long TimeStamp') - - For $i = 0 To $lEffectCount[1] - 1 - DllCall($mKernelHandle, 'int', 'ReadProcessMemory', 'int', $mGWProcHandle, 'int', $lEffectStructAddress[0] + 24 * $i, 'ptr', DllStructGetPtr($lReturn), 'int', 24, 'int', '') - If DllStructGetData($lReturn, 'SkillID') = $aSkillID Then Return $lReturn - Next - EndIf - EndIf - Next - Return $lReturnArray -EndFunc ;==>GetEffect - -;~ Description: Returns quest struct. -Func GetQuestByID($aQuestID = 0) - Local $lQuestStruct = DllStructCreate('long id;long LogState;byte unknown1[12];long MapFrom;float X;float Y;byte unknown2[8];long MapTo') - Local $lQuestPtr, $lQuestLogSize, $lQuestID - Local $lOffset[4] = [0, 0x18, 0x2C, 0x4D0] - - $lQuestLogSize = MemoryReadPtr($mBasePointer, $lOffset) - - If $aQuestID = 0 Then - $lOffset[1] = 0x18 - $lOffset[2] = 0x2C - $lOffset[3] = 0x4C4 - $lQuestID = MemoryReadPtr($mBasePointer, $lOffset) - $lQuestID = $lQuestID[1] - Else - $lQuestID = $aQuestID - EndIf - - Local $lOffset[5] = [0, 0x18, 0x2C, 0x4C8, 0] - For $i = 0 To $lQuestLogSize[1] - $lOffset[4] = 0x34 * $i - $lQuestPtr = MemoryReadPtr($mBasePointer, $lOffset) - DllCall($mKernelHandle, 'int', 'ReadProcessMemory', 'int', $mGWProcHandle, 'int', $lQuestPtr[0], 'ptr', DllStructGetPtr($lQuestStruct), 'int', DllStructGetSize($lQuestStruct), 'int', '') - If DllStructGetData($lQuestStruct, 'ID') = $lQuestID Then Return $lQuestStruct - Next -EndFunc ;==>GetQuestByID - -Func FindItemToSalvage() - Local $lItemInfo - Local $ItemToSalvage[2] = [0, 0] - - For $i = 1 To 4 - For $j = 0 To DllStructGetData(GetBag($i), 'Slots') - 1 - $lItemInfo = GetItemBySlot($i, $j) - If GetIsIDed($lItemInfo) == False Then - $ItemToSalvage[0] = $i - $ItemToSalvage[1] = $j - Return $ItemToSalvage - EndIf - Next - Next - Return $ItemToSalvage -EndFunc ;==>FindItemToSalvage - - - - + +#include-once +#RequireAdmin + +Func CacheSkillbar_() + If Not $mSkillbarCache[0] Then + $mSkillbar = GetSkillbar() + $mSkillbarPtr = GetSkillbarPtr() + For $i = 1 To 8 + $mSkillbarCache[$i] = DllStructGetData($mSkillbar, 'Id' & $i) + $mSkillbarCacheStruct[$i] = GetSkillByID($mSkillbarCache[$i]) + $mSkillbarCachePtr[$i] = GetSkillPtr($mSkillbarCache[$i]) + If DllStructGetData($mSkillbarCacheStruct[$i], 'Adrenaline') > 0 Then + $SkillAdrenalineReq[$i] = DllStructGetData($mSkillbarCacheStruct[$i], 'Adrenaline') + $SkillAdrenalineReq[0] = True + $mSkillbarCacheEnergyReq[$i] = 0 + Update("Skill " & $i & " requires " & DllStructGetData($mSkillbarCacheStruct[$i], 'Adrenaline') & " Adrenaline.", "Skills") + Else + $SkillAdrenalineReq[$i] = 0 + Switch DllStructGetData($mSkillbarCacheStruct[$i], 'EnergyCost') + Case 0 + $mSkillbarCacheEnergyReq[$i] = 0 + Case 1 + $mSkillbarCacheEnergyReq[$i] = 1 + Case 5 + $mSkillbarCacheEnergyReq[$i] = 5 + Case 10 + $mSkillbarCacheEnergyReq[$i] = 10 + Case 11 + $mSkillbarCacheEnergyReq[$i] = 15 + Case 12 + $mSkillbarCacheEnergyReq[$i] = 25 + Case Else + EndSwitch + Update("Skill " & $i & " requires " & $mSkillbarCacheEnergyReq[$i] & " energy.") + EndIf + $mSkillPriorityRating[$i][1] = 0 + $SkillDamageAmount[$i] = SkillDamageAmount($mSkillbarCacheStruct[$i]) + $mSkillPriorityRating[$i][0] = $i + If IsEliteSkill($mSkillbarCacheStruct[$i]) Then $mSkillPriorityRating[$i][1] = 30 + ; YMLAD ; 1 + If $mSkillbarCache[$i] = $You_Move_Like_a_Dwarf Then + $IsYMLAD[$i] = True + $IsYMLAD[0] = True + $YMLADSlot = $i + $mSkillPriorityRating[$i][1] = 120 - $i + $mSkillPriorityRating[$i][2] = 1 + Update("Skill " & $i & " is YMLAD! Priority: " & $mSkillPriorityRating[$i][1] & ".") + ContinueLoop + EndIf + ; Interrupt ; 2 + If IsInterruptSkill($mSkillbarCacheStruct[$i]) Then + $mSkillPriorityRating[$i][1] += 110 - $i + $mSkillPriorityRating[$i][2] = 2 + $IsInterrupt[$i] = True + $IsInterrupt[0] = True + Update("Skill " & $i & " is an Interrupt Skill, Priority: " & $mSkillPriorityRating[$i][1] & ".") + ContinueLoop + EndIf + ; Heal ; 3 + If IsHealSkill($mSkillbarCacheStruct[$i]) And Not IsResSkill($mSkillbarCacheStruct[$i]) And Not IsHexRemovalSkill($mSkillbarCacheStruct[$i]) And IsConditionRemovalSkill($mSkillbarCacheStruct[$i]) == False And Not TargetOtherAllySkill($mSkillbarCacheStruct[$i]) Then + $IsHealingSpell[$i] = True + $IsHealingSpell[0] = True + $mSkillPriorityRating[$i][1] += 80 - $i + $SkillDamageAmount[$i] + $mSkillPriorityRating[$i][2] = 3 + Update("Skill " & $i & " heals ally for " & $SkillDamageAmount[$i] & ", Priority: " & $mSkillPriorityRating[$i][1] & ".") + ContinueLoop + EndIf + ; Heal Other ; 4 + If TargetOtherAllySkill($mSkillbarCacheStruct[$i]) == True And IsResSkill($mSkillbarCacheStruct[$i]) == False And IsHexRemovalSkill($mSkillbarCacheStruct[$i]) == False And IsConditionRemovalSkill($mSkillbarCacheStruct[$i]) == False Then + $mSkillPriorityRating[$i][1] += 75 - $i + $mSkillPriorityRating[$i][2] = 4 + Update("Skill " & $i & " heals other ally for " & $SkillDamageAmount[$i] & ", Priority: " & $mSkillPriorityRating[$i][1] & ".") + ContinueLoop + EndIf + ; AOE Skills ; 5 + If SkillAOERange($mSkillbarCacheStruct[$i]) > 0 Then + If TargetEnemySkill($mSkillbarCacheStruct[$i]) == True Or TargetGroundSkill($mSkillbarCacheStruct[$i]) == True Then + $mSkillPriorityRating[$i][1] += 70 - $i + $mSkillPriorityRating[$i][2] = 5 + Update("Skill " & $i & " does AOE damage of " & $SkillDamageAmount[$i] & ", Priority: " & $mSkillPriorityRating[$i][1] & ".") + ContinueLoop + EndIf + EndIf + ; Soul Twisting ; 6 + If $mSkillbarCache[$i] == $Soul_Twisting Then + $IsSoulTwistingSpell[$i] = True + $IsSoulTwistingSpell[0] = True + $mSkillPriorityRating[$i][1] = 65 - $i + $mSkillPriorityRating[$i][2] = 6 + Update("Skill " & $i & " is Soul Twisting, Priority: " & $mSkillPriorityRating[$i][1] & ".") + ContinueLoop + EndIf + ; Spirits ; 7 + If IsSpiritSkill($mSkillbarCacheStruct[$i]) == True Then + $mSkillPriorityRating[$i][1] += 60 - $i + $mSkillPriorityRating[$i][2] = 7 + Update("Skill " & $i & " is a Spirit Skill, Priority: " & $mSkillPriorityRating[$i][1] & ".") + ContinueLoop + EndIf + ; Hex Removal ; 8 + If IsHexRemovalSkill($mSkillbarCacheStruct[$i]) == True Then + $mSkillPriorityRating[$i][1] = 55 - $i + $mSkillPriorityRating[$i][2] = 8 + Update("Skill " & $i & " is a Hex Remover, Priority: " & $mSkillPriorityRating[$i][1] & ".") + ContinueLoop + EndIf + ; Condition Removal ; 9 + If IsConditionRemovalSkill($mSkillbarCacheStruct[$i]) == True Then + $mSkillPriorityRating[$i][1] = 50 - $i + $mSkillPriorityRating[$i][2] = 9 + Update("Skill " & $i & " is a Condition Remover, Priority: " & $mSkillPriorityRating[$i][1] & ".") + ContinueLoop + EndIf + ; Weapon Spell ; 10 + If IsWeaponSpell($mSkillbarCache[$i]) == True Then + $IsWeaponSpell[$i] = True + $IsWeaponSpell[0] = True + $mSkillPriorityRating[$i][1] += 40 - $i + $mSkillPriorityRating[$i][2] = 10 + Update("Skill " & $i & " is a Weapon Skill, Priority: " & $mSkillPriorityRating[$i][1] & ".") + ContinueLoop + EndIf + ; Enchantment Strip ; 11 + If IsEnchantmentStrip($mSkillbarCacheStruct[$i]) Then + $mSkillPriorityRating[$i][1] += 35 - $i + $mSkillPriorityRating[$i][2] = 11 + Update("Skill " & $i & " is a Enchantment Strip, Priority: " & $mSkillPriorityRating[$i][1] & ".") + ContinueLoop + EndIf + ; General Attack ; 12 + If SkillAOERange($mSkillbarCacheStruct[$i]) <= 0 And TargetEnemySkill($mSkillbarCacheStruct[$i]) == True And IsInterruptSkill($mSkillbarCacheStruct[$i]) == False Then + $mSkillPriorityRating[$i][1] += 30 - $i + If IsPvESkill($mSkillbarCacheStruct[$i]) Then $mSkillPriorityRating[$i][1] += 100 + $mSkillPriorityRating[$i][2] = 12 + Update("Skill " & $i & " Vs. enemies for " & $SkillDamageAmount[$i] & " damage, Priority: " & $mSkillPriorityRating[$i][1] & ".") + ContinueLoop + EndIf + ; Res Skill ; 13 + If IsResSkill($mSkillbarCacheStruct[$i]) == True Then + $mSkillPriorityRating[$i][1] = 20 - $i + $mSkillPriorityRating[$i][2] = 13 + Update("Skill " & $i & " is a Rez, Priority: " & $mSkillPriorityRating[$i][1] & ".") + ContinueLoop + EndIf + ; Self-Target, Summon spirits, enchantments ; 14 + If TargetSelfSkill($mSkillbarCacheStruct[$i]) == True And IsHealSkill($mSkillbarCacheStruct[$i]) == False And IsSpiritSkill($mSkillbarCacheStruct[$i]) == False And IsSummonSkill($mSkillbarCache[$i]) == False And $mSkillbarCache[$i] <> $Soul_Twisting Then + $IsSelfCastingSpell[$i] = True + $IsSelfCastingSpell[0] = True + $mSkillPriorityRating[$i][1] += 10 - $i + $mSkillPriorityRating[$i][2] = 14 + Update("Skill " & $i & " is a Self Targeting Skill, Priority: " & $mSkillPriorityRating[$i][1] & ".") + ContinueLoop + EndIf + ; Asuran Summon ; 15 + If IsSummonSkill($mSkillbarCache[$i]) == True Then + $IsSummonSpell[$i] = True + $IsSummonSpell[0] = True + $mSkillPriorityRating[$i][1] = 0 - $i + $mSkillPriorityRating[$i][2] = 15 + Update("Skill " & $i & " is a Summon, Priority: " & $mSkillPriorityRating[$i][1] & ".") + ContinueLoop + EndIf + Next + $lMyProfession = GetHeroProfession(0) + $lAttrPrimary = GetProfPrimaryAttribute($lMyProfession) + _ArraySort($mSkillPriorityRating, 0, 0, 0, 1) + EndIf + $mSkillbarCache[0] = True + $mSkillbarCachePtr[0] = True + $mSkillbarCacheStruct[0] = True +EndFunc ;==>CacheSkillbar + +;~ Description: Returns current target. +Func GetCurrentTarget() + Return GetAgentByID(GetCurrentTargetID()) +EndFunc ;==>GetCurrentTarget + +;~ Description: Picks up an item. +Func PickUpItem_($aItem) + Local $lAgentID + + If IsDllStruct($aItem) = 0 Then + $lAgentID = $aItem + ElseIf DllStructGetSize($aItem) < 400 Then + $lAgentID = DllStructGetData($aItem, 'AgentID') + Else + $lAgentID = DllStructGetData($aItem, 'ID') + EndIf + Return SendPacket(0xC, 0x3A, $lAgentID, 0) +EndFunc ;==>PickUpItem + +;~ Description: Returns item by slot. +Func GetItemBySlot($aBag, $aSlot) + Local $lBag + + If IsDllStruct($aBag) = 0 Then + $lBag = GetBag($aBag) + Else + $lBag = $aBag + EndIf + + Local $lItemPtr = DllStructGetData($lBag, 'ItemArray') + Local $lBuffer = DllStructCreate('ptr') + Local $lItemStruct = DllStructCreate('long id;long agentId;byte unknown1[4];ptr bag;ptr modstruct;long modstructsize;ptr customized;byte unknown2[4];byte type;byte unknown3;short extraId;short value;byte unknown4[2];short interaction;long modelId;ptr modString;byte unknown5[4];ptr NameString;byte unknown6[15];byte quantity;byte equipped;byte unknown7[1];byte slot') + DllCall($mKernelHandle, 'int', 'ReadProcessMemory', 'int', $mGWProcHandle, 'int', DllStructGetData($lBag, 'ItemArray') + 4 * ($aSlot - 1), 'ptr', DllStructGetPtr($lBuffer), 'int', DllStructGetSize($lBuffer), 'int', '') + DllCall($mKernelHandle, 'int', 'ReadProcessMemory', 'int', $mGWProcHandle, 'int', DllStructGetData($lBuffer, 1), 'ptr', DllStructGetPtr($lItemStruct), 'int', DllStructGetSize($lItemStruct), 'int', '') + Return $lItemStruct +EndFunc ;==>GetItemBySlot + +;~ Description: Returns item struct. +Func GetItemByItemID($aItemID) + Local $lItemStruct = DllStructCreate('long id;long agentId;byte unknown1[4];ptr bag;ptr modstruct;long modstructsize;ptr customized;byte unknown2[4];byte type;byte unknown3;short extraId;short value;byte unknown4[2];short interaction;long modelId;ptr modString;byte unknown5[4];ptr NameString;byte unknown6[15];byte quantity;byte equipped;byte unknown7[1];byte slot') + Local $lOffset[5] = [0, 0x18, 0x40, 0xB8, 0x4 * $aItemID] + Local $lItemPtr = MemoryReadPtr($mBasePointer, $lOffset) + DllCall($mKernelHandle, 'int', 'ReadProcessMemory', 'int', $mGWProcHandle, 'int', $lItemPtr[1], 'ptr', DllStructGetPtr($lItemStruct), 'int', DllStructGetSize($lItemStruct), 'int', '') + Return $lItemStruct +EndFunc ;==>GetItemByItemID + +;~ Description: Returns item by agent ID. +Func GetItemByAgentID($aAgentID) + Local $lItemStruct = DllStructCreate('long id;long agentId;byte unknown1[4];ptr bag;ptr modstruct;long modstructsize;ptr customized;byte unknown2[4];byte type;byte unknown3;short extraId;short value;byte unknown4[2];short interaction;long modelId;ptr modString;byte unknown5[4];ptr NameString;byte unknown6[15];byte quantity;byte equipped;byte unknown7[1];byte slot') + Local $lOffset[4] = [0, 0x18, 0x40, 0xC0] + Local $lItemArraySize = MemoryReadPtr($mBasePointer, $lOffset) + Local $lOffset[5] = [0, 0x18, 0x40, 0xB8, 0] + Local $lItemPtr, $lItemID + Local $lAgentID = ConvertID($aAgentID) + + For $lItemID = 1 To $lItemArraySize[1] + $lOffset[4] = 0x4 * $lItemID + $lItemPtr = MemoryReadPtr($mBasePointer, $lOffset) + If $lItemPtr[1] = 0 Then ContinueLoop + + DllCall($mKernelHandle, 'int', 'ReadProcessMemory', 'int', $mGWProcHandle, 'int', $lItemPtr[1], 'ptr', DllStructGetPtr($lItemStruct), 'int', DllStructGetSize($lItemStruct), 'int', '') + If DllStructGetData($lItemStruct, 'AgentID') = $lAgentID Then Return $lItemStruct + Next +EndFunc ;==>GetItemByAgentID + +;~ Description: Returns item by model ID. +Func GetItemByModelID($aModelID, $BagsOnly = False) + If $BagsOnly Then + For $i = 1 to 17 + For $slot = 1 To DllStructGetData(GetBag($i), 'Slots') + $lItemStruct = GetItemBySlot($i, $Slot) + If DllStructGetData($lItemStruct, 'ID') = 0 Then ContinueLoop + If DllStructGetData($lItemStruct, 'ModelID') == $aModelID Then Return $lItemStruct + Next + Next + Else + Local $lItemStruct = DllStructCreate('long id;long agentId;byte unknown1[4];ptr bag;ptr modstruct;long modstructsize;ptr customized;byte unknown2[4];byte type;byte unknown3;short extraId;short value;byte unknown4[2];short interaction;long modelId;ptr modString;byte unknown5[4];ptr NameString;byte unknown6[15];byte quantity;byte equipped;byte unknown7[1];byte slot') + Local $lOffset[4] = [0, 0x18, 0x40, 0xC0] + Local $lItemArraySize = MemoryReadPtr($mBasePointer, $lOffset) + Local $lOffset[5] = [0, 0x18, 0x40, 0xB8, 0] + Local $lItemPtr, $lItemID + + For $lItemID = 1 To $lItemArraySize[1] + $lOffset[4] = 0x4 * $lItemID + $lItemPtr = MemoryReadPtr($mBasePointer, $lOffset) + If $lItemPtr[1] = 0 Then ContinueLoop + + DllCall($mKernelHandle, 'int', 'ReadProcessMemory', 'int', $mGWProcHandle, 'int', $lItemPtr[1], 'ptr', DllStructGetPtr($lItemStruct), 'int', DllStructGetSize($lItemStruct), 'int', '') + If DllStructGetData($lItemStruct, 'ModelID') = $aModelID Then Return $lItemStruct + Next + EndIf + Return False +EndFunc ;==>GetItemByModelID + +Func GetNumberOfFoesInRangeOfAgent_($aAgent = -2, $fMaxDistance = 4000, $ModelID = 0) + Local $lDistance, $lCount = 0, $lAgentToCompare + + If IsDllStruct($aAgent) = 0 Then $aAgent = GetAgentByID($aAgent) + For $i = 1 To GetMaxAgents() + $lAgentToCompare = GetAgentByID($i) + If DllStructGetData($lAgentToCompare, 'Type') <> 0xDB Then ContinueLoop + If DllStructGetData($lAgentToCompare, 'Allegiance') <> 3 Then ContinueLoop + If DllStructGetData($lAgentToCompare, 'HP') <= 0 Then ContinueLoop + If BitAND(DllStructGetData($lAgentToCompare, 'Effects'), 0x0010) > 0 Then ContinueLoop + If $ModelID <> 0 And DllStructGetData($lAgentToCompare, 'ModelID') == $ModelID Then ContinueLoop + $lDistance = GetDistance_($lAgentToCompare, $aAgent) + If $lDistance < $fMaxDistance Then + $lCount += 1 + EndIf + Next + Return $lCount +EndFunc ;==>GetNumberOfFoesInRangeOfAgent + +Func GetDistance_($aAgent1 = -1, $aAgent2 = -2) + If IsDllStruct($aAgent1) = 0 Then $aAgent1 = GetAgentByID($aAgent1) + If IsDllStruct($aAgent2) = 0 Then $aAgent2 = GetAgentByID($aAgent2) + Return Sqrt((DllStructGetData($aAgent1, 'X') - DllStructGetData($aAgent2, 'X')) ^ 2 + (DllStructGetData($aAgent1, 'Y') - DllStructGetData($aAgent2, 'Y')) ^ 2) +EndFunc ;==>GetDistance + +Func GetNumberOfAlliesInRangeOfAgent_($aAgent = -2, $fMaxDistance = 4000) + Local $lDistance, $lCount = 0, $lAgentToCompare + + If IsDllStruct($aAgent) = 0 Then $aAgent = GetAgentByID($aAgent) + For $i = 1 To GetMaxAgents() + $lAgentToCompare = GetAgentByID($i) + If DllStructGetData($lAgentToCompare, 'Type') <> 0xDB Then ContinueLoop + If DllStructGetData($lAgentToCompare, 'Allegiance') <> 1 Then ContinueLoop + If DllStructGetData($lAgentToCompare, 'HP') <= 0 Then ContinueLoop + If BitAND(DllStructGetData($lAgentToCompare, 'Effects'), 0x0010) > 0 Then ContinueLoop + $lDistance = GetDistance_($lAgentToCompare, $aAgent) + If $lDistance < $fMaxDistance Then + $lCount += 1 + EndIf + Next + Return $lCount +EndFunc ;==>GetNumberOfAlliesInRangeOfAgent + +;~ Returns player with most enemies around them within range $fMaxDistance +Func GetVIP_($fMaxDistance = 1350) + Local $lCount = 0, $lAgentToCompare, $VIP = 0, $Enemies = 0 + + For $i = 1 To GetMaxAgents() + $lAgentToCompare = GetAgentByID($i) + If DllStructGetData($lAgentToCompare, 'Type') <> 0xDB Then ContinueLoop + If DllStructGetData($lAgentToCompare, 'Allegiance') <> 1 Then ContinueLoop + If DllStructGetData($lAgentToCompare, 'HP') <= 0 Then ContinueLoop + If BitAND(DllStructGetData($lAgentToCompare, 'Effects'), 0x0010) > 0 Then ContinueLoop + $Enemies = GetNumberOfFoesInRangeOfAgent_($lAgentToCompare, $fMaxDistance) + If $Enemies > $lCount Then + $VIP = $lAgentToCompare + $lCount = $Enemies + EndIf + Next + Return $VIP +EndFunc ;==>GetVIP + +;~ Description: Creates an array of agents of a given type +Func GetAgentArray($aType = 0) + Local $lStruct + Local $lCount + Local $lBuffer = '' + DllStructSetData($mMakeAgentArray, 2, $aType) + MemoryWrite($mAgentCopyCount, -1, 'long') + Enqueue($mMakeAgentArrayPtr, 8) + Local $lDeadlock = TimerInit() + Do + Sleep(1) + $lCount = MemoryRead($mAgentCopyCount, 'long') + Until $lCount >= 0 Or TimerDiff($lDeadlock) > 5000 + If $lCount < 0 Then $lCount = 0 + For $i = 1 To $lCount + $lBuffer &= 'Byte[448];' + Next + $lBuffer = DllStructCreate($lBuffer) + DllCall($mKernelHandle, 'int', 'ReadProcessMemory', 'int', $mGWProcHandle, 'int', $mAgentCopyBase, 'ptr', DllStructGetPtr($lBuffer), 'int', DllStructGetSize($lBuffer), 'int', '') + Local $lReturnArray[$lCount + 1] = [$lCount] + For $i = 1 To $lCount + $lReturnArray[$i] = DllStructCreate('ptr vtable;byte unknown1[24];byte unknown2[4];ptr NextAgent;byte unknown3[8];long Id;float Z;byte unknown4[8];float BoxHoverWidth;float BoxHoverHeight;byte unknown5[8];float Rotation;byte unknown6[8];long NameProperties;byte unknown7[24];float X;float Y;byte unknown8[8];float NameTagX;float NameTagY;float NameTagZ;byte unknown9[12];long Type;float MoveX;float MoveY;byte unknown10[28];long Owner;byte unknown30[8];long ExtraType;byte unknown11[24];float AttackSpeed;float AttackSpeedModifier;word PlayerNumber;byte unknown12[6];ptr Equip;byte unknown13[10];byte Primary;byte Secondary;byte Level;byte Team;byte unknown14[6];float EnergyPips;byte unknown[4];float EnergyPercent;long MaxEnergy;byte unknown15[4];float HPPips;byte unknown16[4];float HP;long MaxHP;long Effects;byte unknown17[4];byte Hex;byte unknown18[18];long ModelState;long TypeMap;byte unknown19[16];long InSpiritRange;byte unknown20[16];long LoginNumber;float ModelMode;byte unknown21[4];long ModelAnimation;byte unknown22[32];byte LastStrike;byte Allegiance;word WeaponType;word Skill;byte unknown23[4];word WeaponItemId;word OffhandItemId') + $lStruct = DllStructCreate('byte[448]', DllStructGetPtr($lReturnArray[$i])) + DllStructSetData($lStruct, 1, DllStructGetData($lBuffer, $i)) + Next + Return $lReturnArray +EndFunc ;==>GetAgentArray + +;~ Description: Returns an agent struct. +Func GetAgentByID($aAgentID = -2) + ;returns dll struct if successful + Local $lAgentPtr = GetAgentPtr($aAgentID) + If $lAgentPtr = 0 Then Return 0 + ;Offsets: 0x2C=AgentID 0x9C=Type 0xF4=PlayerNumber 0114=Energy Pips + Local $lAgentStruct = DllStructCreate('ptr vtable;byte unknown1[24];byte unknown2[4];ptr NextAgent;byte unknown3[8];long Id;float Z;byte unknown4[8];float BoxHoverWidth;float BoxHoverHeight;byte unknown5[8];float Rotation;byte unknown6[8];long NameProperties;byte unknown7[24];float X;float Y;byte unknown8[8];float NameTagX;float NameTagY;float NameTagZ;byte unknown9[12];long Type;float MoveX;float MoveY;byte unknown10[28];long Owner;byte unknown30[8];long ExtraType;byte unknown11[24];float AttackSpeed;float AttackSpeedModifier;word PlayerNumber;byte unknown12[6];ptr Equip;byte unknown13[10];byte Primary;byte Secondary;byte Level;byte Team;byte unknown14[6];float EnergyPips;byte unknown[4];float EnergyPercent;long MaxEnergy;byte unknown15[4];float HPPips;byte unknown16[4];float HP;long MaxHP;long Effects;byte unknown17[4];byte Hex;byte unknown18[18];long ModelState;long TypeMap;byte unknown19[16];long InSpiritRange;byte unknown20[16];long LoginNumber;float ModelMode;byte unknown21[4];long ModelAnimation;byte unknown22[32];byte LastStrike;byte Allegiance;word WeaponType;word Skill;byte unknown23[4];word WeaponItemId;word OffhandItemId') + DllCall($mKernelHandle, 'int', 'ReadProcessMemory', 'int', $mGWProcHandle, 'int', $lAgentPtr, 'ptr', DllStructGetPtr($lAgentStruct), 'int', DllStructGetSize($lAgentStruct), 'int', '') + Return $lAgentStruct +EndFunc ;==>GetAgentByID + +;~ Description: Returns agent by player name. +Func GetAgentByPlayerName($aPlayerName) + For $i = 1 To GetMaxAgents() + If GetPlayerName($i) = $aPlayerName Then + Return GetAgentByID($i) + EndIf + Next +EndFunc ;==>GetAgentByPlayerName + +;~ Description: Returns agent by name. +Func GetAgentByName($aName) + If $mUseStringLog = False Then Return + + Local $lName, $lAddress + + For $i = 1 To GetMaxAgents() + $lAddress = $mStringLogBase + 256 * $i + $lName = MemoryRead($lAddress, 'wchar [128]') + $lName = StringRegExpReplace($lName, '[<]{1}([^>]+)[>]{1}', '') + If StringInStr($lName, $aName) > 0 Then Return GetAgentByID($i) + Next + + DisplayAll(True) + Sleep(100) + DisplayAll(False) + DisplayAll(True) + Sleep(100) + DisplayAll(False) + + For $i = 1 To GetMaxAgents() + $lAddress = $mStringLogBase + 256 * $i + $lName = MemoryRead($lAddress, 'wchar [128]') + $lName = StringRegExpReplace($lName, '[<]{1}([^>]+)[>]{1}', '') + If StringInStr($lName, $aName) > 0 Then Return GetAgentByID($i) + Next +EndFunc ;==>GetAgentByName + +;~ Description: Returns the nearest agent to an agent. +Func GetNearestAgentToAgent($aAgent = -2) + Local $lNearestAgent, $lNearestDistance = 100000000 + Local $lDistance + Local $lAgentArray = GetAgentArray() + + If IsDllStruct($aAgent) = 0 Then $aAgent = GetAgentByID($aAgent) + + Local $lID = DllStructGetData($aAgent, 'ID') + + For $i = 1 To $lAgentArray[0] + $lDistance = (DllStructGetData($aAgent, 'X') - DllStructGetData($lAgentArray[$i], 'X')) ^ 2 + (DllStructGetData($aAgent, 'Y') - DllStructGetData($lAgentArray[$i], 'Y')) ^ 2 + + If $lDistance < $lNearestDistance Then + If DllStructGetData($lAgentArray[$i], 'ID') == $lID Then ContinueLoop + $lNearestAgent = $lAgentArray[$i] + $lNearestDistance = $lDistance + EndIf + Next + + SetExtended(Sqrt($lNearestDistance)) + Return $lNearestAgent +EndFunc ;==>GetNearestAgentToAgent + +;~ Description: Returns the nearest enemy to an agent. +Func GetNearestEnemyToAgent($aAgent = -2) + Local $lNearestAgent, $lNearestDistance = 100000000 + Local $lDistance + Local $lAgentArray = GetAgentArray(0xDB) + + If Not IsDllStruct($aAgent) Then $aAgent = GetAgentByID($aAgent) + + Local $lID = DllStructGetData($aAgent, 'ID') + + For $i = 1 To $lAgentArray[0] + $lDistance = (DllStructGetData($aAgent, 'X') - DllStructGetData($lAgentArray[$i], 'X')) ^ 2 + (DllStructGetData($aAgent, 'Y') - DllStructGetData($lAgentArray[$i], 'Y')) ^ 2 + If DllStructGetData($lAgentArray[$i], 'Allegiance') <> 3 Then ContinueLoop + If DllStructGetData($lAgentArray[$i], 'HP') <= 0 Then ContinueLoop + If BitAND(DllStructGetData($lAgentArray[$i], 'Effects'), 0x0010) > 0 Then ContinueLoop + + $lDistance = (DllStructGetData($aAgent, 'X') - DllStructGetData($lAgentArray[$i], 'X')) ^ 2 + (DllStructGetData($aAgent, 'Y') - DllStructGetData($lAgentArray[$i], 'Y')) ^ 2 + If $lDistance < $lNearestDistance Then + If DllStructGetData($lAgentArray[$i], 'ID') == $lID Then ContinueLoop + $lNearestAgent = $lAgentArray[$i] + $lNearestDistance = $lDistance + EndIf + Next + + SetExtended(Sqrt($lNearestDistance)) + Return $lNearestAgent +EndFunc ;==>GetNearestEnemyToAgent + +;~ Description: Returns the farthest enemy to an agent within given max distance +Func GetFarthestEnemyToAgent($MaxDistance = 1400, $aAgent = -2) + Local $lFarthestAgent, $lFarthestDistance = 1 + Local $lDistance + Local $lAgentArray = GetAgentArray(0xDB) + + If Not IsDllStruct($aAgent) Then $aAgent = GetAgentByID($aAgent) + + Local $lID = DllStructGetData($aAgent, 'ID') + + For $i = 1 To $lAgentArray[0] + If DllStructGetData($lAgentArray[$i], 'Allegiance') <> 3 Then ContinueLoop + If DllStructGetData($lAgentArray[$i], 'HP') <= 0 Then ContinueLoop + If BitAND(DllStructGetData($lAgentArray[$i], 'Effects'), 0x0010) > 0 Then ContinueLoop + + $lDistance = (DllStructGetData($aAgent, 'X') - DllStructGetData($lAgentArray[$i], 'X')) ^ 2 + (DllStructGetData($aAgent, 'Y') - DllStructGetData($lAgentArray[$i], 'Y')) ^ 2 + If $lDistance > $lFarthestDistance And $lDistance < ($MaxDistance ^ 2) Then + If DllStructGetData($lAgentArray[$i], 'ID') == $lID Then ContinueLoop + $lFarthestAgent = $lAgentArray[$i] + $lFarthestDistance = $lDistance + EndIf + Next + + SetExtended(Sqrt($lFarthestDistance)) + Return $lFarthestAgent +EndFunc ;==>GetFarthestEnemyToAgent + +;~ Description: Returns the nearest agent to a set of coordinates. +Func GetNearestAgentToCoords($aX, $aY) + Local $lNearestAgent, $lNearestDistance = 100000000 + Local $lDistance + Local $lAgentArray = GetAgentArray() + + For $i = 1 To $lAgentArray[0] + $lDistance = ($aX - DllStructGetData($lAgentArray[$i], 'X')) ^ 2 + ($aY - DllStructGetData($lAgentArray[$i], 'Y')) ^ 2 + If $lDistance < $lNearestDistance Then + $lNearestAgent = $lAgentArray[$i] + $lNearestDistance = $lDistance + EndIf + Next + + SetExtended(Sqrt($lNearestDistance)) + Return $lNearestAgent +EndFunc ;==>GetNearestAgentToCoords + +;~ Description: Returns the nearest signpost to an agent. +Func GetNearestSignpostToAgent($aAgent = -2) + Local $lNearestAgent, $lNearestDistance = 100000000 + Local $lDistance + Local $lAgentArray = GetAgentArray(0x200) + + If IsDllStruct($aAgent) = 0 Then $aAgent = GetAgentByID($aAgent) + + Local $lID = DllStructGetData($aAgent, 'ID') + + For $i = 1 To $lAgentArray[0] + $lDistance = (DllStructGetData($lAgentArray[$i], 'Y') - DllStructGetData($aAgent, 'Y')) ^ 2 + (DllStructGetData($lAgentArray[$i], 'X') - DllStructGetData($aAgent, 'X')) ^ 2 + If $lDistance < $lNearestDistance Then + If DllStructGetData($lAgentArray[$i], 'ID') == $lID Then ContinueLoop + $lNearestAgent = $lAgentArray[$i] + $lNearestDistance = $lDistance + EndIf + Next + + SetExtended(Sqrt($lNearestDistance)) + Return $lNearestAgent +EndFunc ;==>GetNearestSignpostToAgent + +;~ Description: Returns the nearest signpost to a set of coordinates. +Func GetNearestSignpostToCoords($aX, $aY) + Local $lNearestAgent, $lNearestDistance = 100000000 + Local $lDistance + Local $lAgentArray = GetAgentArray(0x200) + + For $i = 1 To $lAgentArray[0] + $lDistance = ($aX - DllStructGetData($lAgentArray[$i], 'X')) ^ 2 + ($aY - DllStructGetData($lAgentArray[$i], 'Y')) ^ 2 + + If $lDistance < $lNearestDistance Then + $lNearestAgent = $lAgentArray[$i] + $lNearestDistance = $lDistance + EndIf + Next + + SetExtended(Sqrt($lNearestDistance)) + Return $lNearestAgent +EndFunc ;==>GetNearestSignpostToCoords + +;~ Description: Returns the nearest NPC to an agent. +Func GetNearestNPCToAgent($aAgent = -2) + Local $lNearestAgent, $lNearestDistance = 100000000 + Local $lDistance + Local $lAgentArray = GetAgentArray(0xDB) + + If Not IsDllStruct($aAgent) Then $aAgent = GetAgentByID($aAgent) + + Local $lID = DllStructGetData($aAgent, 'ID') + + For $i = 1 To $lAgentArray[0] + If DllStructGetData($lAgentArray[$i], 'Allegiance') <> 6 Then ContinueLoop + If DllStructGetData($lAgentArray[$i], 'HP') <= 0 Then ContinueLoop + If BitAND(DllStructGetData($lAgentArray[$i], 'Effects'), 0x0010) > 0 Then ContinueLoop + + $lDistance = (DllStructGetData($aAgent, 'X') - DllStructGetData($lAgentArray[$i], 'X')) ^ 2 + (DllStructGetData($aAgent, 'Y') - DllStructGetData($lAgentArray[$i], 'Y')) ^ 2 + If $lDistance < $lNearestDistance Then + If DllStructGetData($lAgentArray[$i], 'ID') == $lID Then ContinueLoop + $lNearestAgent = $lAgentArray[$i] + $lNearestDistance = $lDistance + EndIf + Next + + SetExtended(Sqrt($lNearestDistance)) + Return $lNearestAgent +EndFunc ;==>GetNearestNPCToAgent + +;~ Description: Returns the nearest NPC to a set of coordinates. +Func GetNearestNPCToCoords($aX, $aY) + Local $lNearestAgent, $lNearestDistance = 100000000 + Local $lDistance + Local $lAgentArray = GetAgentArray(0xDB) + + For $i = 1 To $lAgentArray[0] + If DllStructGetData($lAgentArray[$i], 'Allegiance') <> 6 Then ContinueLoop + If DllStructGetData($lAgentArray[$i], 'HP') <= 0 Then ContinueLoop + If BitAND(DllStructGetData($lAgentArray[$i], 'Effects'), 0x0010) > 0 Then ContinueLoop + + $lDistance = ($aX - DllStructGetData($lAgentArray[$i], 'X')) ^ 2 + ($aY - DllStructGetData($lAgentArray[$i], 'Y')) ^ 2 + + If $lDistance < $lNearestDistance Then + $lNearestAgent = $lAgentArray[$i] + $lNearestDistance = $lDistance + EndIf + Next + + SetExtended(Sqrt($lNearestDistance)) + Return $lNearestAgent +EndFunc ;==>GetNearestNPCToCoords + +;~ Description: Returns the nearest item to an agent. +Func GetNearestItemToAgent($aAgent = -2, $aCanPickUp = True) + Local $lNearestAgent, $lNearestDistance = 100000000 + Local $lDistance + Local $lAgentArray = GetAgentArray(0x400) + + If Not IsDllStruct($aAgent) Then $aAgent = GetAgentByID($aAgent) + + Local $lID = DllStructGetData($aAgent, 'ID') + + For $i = 1 To $lAgentArray[0] + + If $aCanPickUp And Not GetCanPickUp($lAgentArray[$i]) Then ContinueLoop + $lDistance = (DllStructGetData($aAgent, 'X') - DllStructGetData($lAgentArray[$i], 'X')) ^ 2 + (DllStructGetData($aAgent, 'Y') - DllStructGetData($lAgentArray[$i], 'Y')) ^ 2 + If $lDistance < $lNearestDistance Then + If DllStructGetData($lAgentArray[$i], 'ID') == $lID Then ContinueLoop + $lNearestAgent = $lAgentArray[$i] + $lNearestDistance = $lDistance + EndIf + Next + + SetExtended(Sqrt($lNearestDistance)) + Return $lNearestAgent +EndFunc ;==>GetNearestItemToAgent + +;~ Description: Returns array of party members +Func GetParty() + Local $lReturnArray[1] = [0] + Local $lAgentArray = GetAgentArray(0xDB) + For $i = 1 To $lAgentArray[0] + If DllStructGetData($lAgentArray[$i], 'Allegiance') == 1 Then + If BitAND(DllStructGetData($lAgentArray[$i], 'TypeMap'), 131072) Then ; An agent who's health can be viewed through the party, minion, or pet menus. + $lReturnArray[0] += 1 + ReDim $lReturnArray[$lReturnArray[0] + 1] + $lReturnArray[$lReturnArray[0]] = $lAgentArray[$i] + EndIf + EndIf + Next + Return $lReturnArray +EndFunc ;==>GetParty + +; Returns number of party members, works in explorable only +Func GetPartySize_() + Return UBound(GetParty()) +EndFunc ;==>GetPartySize + +;~ Description: Returns array of Enemy members +Func GetEnemyParty() + Local $lReturnArray[1] = [0] + Local $lAgentArray = GetAgentArray(0xDB) + For $i = 1 To $lAgentArray[0] + If BitAND(DllStructGetData($lAgentArray[$i], 'TypeMap'), 131072) Then ContinueLoop + If DllStructGetData($lAgentArray[$i], 'Allegiance') == 3 Then + $lReturnArray[0] += 1 + ReDim $lReturnArray[$lReturnArray[0] + 1] + $lReturnArray[$lReturnArray[0]] = $lAgentArray[$i] + EndIf + Next + Return $lReturnArray +EndFunc ;==>GetEnemyParty + +; Returns agent of requested player number in party +Func GetPlayerByPlayerNumber($PlayerNumber) + Local $lReturnArray[1] = [0] + Local $lAgentArray = GetAgentArray(0xDB) + For $i = 1 To $lAgentArray[0] + If DllStructGetData($lAgentArray[$i], 'Allegiance') == 1 Then + If BitAND(DllStructGetData($lAgentArray[$i], 'TypeMap'), 131072) Then + If DllStructGetData($lAgentArray[$i], 'PlayerNumber') == $PlayerNumber Then + Return $lAgentArray[$i] + EndIf + EndIf + EndIf + Next + Return 0 +EndFunc ;==>GetPlayerByPlayerNumber + +;~ Description: Updates all the information you need for combat. +Func UpdateWorld_($aRange = 1350) + Local $LocationCount = 0 + $aRange = $aRange ^ 2 + $mSelfID = GetMyID() + $mSelf = GetAgentByID($mSelfID) + If GetIsDead($mSelf) Then Return False + If GetMapLoading() <> $INSTANCETYPE_EXPLORABLE Then Return True + $mEnergy = DllStructGetData($mSelf, 'EnergyPercent') * DllStructGetData($mSelf, 'MaxEnergy') + $mEffects = GetEffect() + + $mDazed = False + $mBlind = False + $mSkillHardCounter = False + $mSkillSoftCounter = 0 + $mAttackHardCounter = False + $mAttackSoftCounter = 0 + $mAllySpellHardCounter = False + $mEnemySpellHardCounter = False + $mSpellSoftCounter = 0 + $mBlocking = False + + For $i = 1 To $mEffects[0] + Switch DllStructGetData($mEffects[$i], 'SkillID') + Case 485 ; Dazed + $mDazed = True + Case 479 ; Blind + $mBlind = True + Case 30, 764 ; Diversion, Wail of Doom + $mSkillHardCounter = True + Case 51, 127 ; Shame, Mark of Subversion + $mAllySpellHardCounter = True + Case 46, 979, 3191 ; Guilt, Mistrust + $mEnemySpellHardCounter = True + Case 878, 3234 ; Visions of Regret + $mSkillSoftCounter += 1 + $mSpellSoftCounter += 1 + $mAttackSoftCounter += 1 + Case 28, 128 ; Backfire, Soul Leech + $mSpellSoftCounter += 1 + Case 47, 43, 1004, 2056, 3195 ; Ineptitude, Clumsiness, Yuletide, Wandering Eye + $mAttackHardCounter = True + Case 123, 26, 3151, 121, 103, 66 ; Insidious Parasite, Empathy, Spiteful Spirit, Price of Failure, Spirit Shackles + $mAttackSoftCounter += 1 + ; Auspicious Parry, Bonetti's Defense, Deadly Riposte, Defensive Stance, Deflect Arrows, + ; Disciplined Stance, Frenzied Defense, Gladiator's Defense, Riposte, Shield Bash, Shield Stance, + ; Soldier's Stance, Wary Stance, Dodge, Dryder's Defenses, Escape, Lightning Reflexes + Case 905,380,388,345,373,376,1700,372,387,363,378,1698,377,425,452,448,453 + $mBlocking = True + ; Critical Defenses, Flashing Blades, Weapon of Warding, Burning Shield, Attacker's Insight, + ; Shield of Force, Mental Block, Protector's Defense, Ward Against Melee, Mirage Cloak, Natural Stride + ; Whirling Defense, Zojun's Haste, Distortion, Magnetic Aura, Sliver Armor, Swirling Aura, + Case 1027,1042,793,2208,1764,2201,2417,810,176,1500,1727,450,1196,11,168,1084,233 + $mBlocking = True + EndSwitch + Next + + Local $lAgent + Local $lTeam = DllStructGetData($mSelf, 'Team') + Local $lX = XLocation() + Local $lY = YLocation() + Local $lHP + Local $lDistance + Local $lModel + Local $lCountAOE = 1 + + Dim $mTeam[1] = [0] + Dim $mTeamOthers[1] = [0] + Dim $mTeamDead[1] = [0] + Dim $mEnemies[1] = [0] + Dim $mEnemiesRange[1] = [0] + Dim $mEnemiesSpellRange[1] = [0] + Dim $mEnemyCorpesSpellRange[1] = [0] + Dim $mSpirits[1] = [0] + Dim $mPets[1] = [0] + Dim $mMinions[1] = [0] + + $mHighestAlly = $mSelf + $mHighestAllyHP = 2 + $mLowestAlly = $mSelf + $mLowestAllyHP = 2 + $mLowestOtherAlly = 0 + $mLowestOtherAllyHP = 2 + $mLowestEnemy = 0 + $mLowestEnemyHP = 2 + $mClosestEnemy = 0 + $mClosestEnemyDist = 25000000 + $mAverageTeamHP = 0 + $BestAOETarget = 0 + $HexedAlly = 0 + $ConditionedAlly = 0 + $HexedEnemy = 0 + $EnemyNonHexed = 0 + $EnemyConditioned = 0 + $EnemyNonConditioned = 0 + $EnemyNonEnchanted = 0 + $EnemyEnchanted = 0 + $EnemyHealer = 0 + $LowHPEnemy = 0 + $NumberOfFoesInAttackRange = 0 + $NumberOfFoesInSpellRange = 0 + + Local $lAgentArray = GetAgentArray(0xDB) + For $i = 1 To $lAgentArray[0] + $lAgent = $lAgentArray[$i] + $lHP = DllStructGetData($lAgent, 'HP') + $lDistance = ($lX - XLocation($lAgent)) ^ 2 + ($lY - YLocation($lAgent)) ^ 2 + Switch DllStructGetData($lAgent, 'Allegiance') + Case 1, 6 ;Allies + If Not BitAND(DllStructGetData($lAgent, 'Typemap'), 131072) Then ContinueLoop ;Double check it's not a summon + If Not BitAND(DllStructGetData($lAgent, 'Effects'), 0x0010) Then +;~ $mTeam[0] += 1 +;~ ReDim $mTeam[$mTeam[0] + 1] +;~ $mTeam[$mTeam[0]] = $lAgent + + $mAverageTeamHP += $lHP + +;~ Lowest Ally + If $lHP < $mLowestAllyHP Then + $mLowestAlly = $lAgent + $mLowestAllyHP = $lHP + ElseIf $lHP = $mLowestAllyHP Then + If $lDistance < ($lX - DllStructGetData($mLowestAlly, 'X')) ^ 2 + ($lY - DllStructGetData($mLowestAlly, 'Y')) ^ 2 Then + $mLowestAlly = $lAgent + $mLowestAllyHP = $lHP + EndIf + ElseIf $lHP > $mHighestAllyHP Then ; Highest Ally + $mHighestAlly = $lAgent + $mHighestAllyHP = $lHP + EndIf + + If GetHasHex($lAgent) == True Then $HexedAlly = $lAgent + If GetHasCondition($lAgent) == True Then $ConditionedAlly = $lAgent + +;~ Other Allies + If $i <> $mSelfID Then + $mTeamOthers[0] += 1 + ReDim $mTeamOthers[$mTeamOthers[0] + 1] + $mTeamOthers[$mTeamOthers[0]] = $lAgent + +;~ Lowest Other Ally + If $lHP < $mLowestOtherAllyHP Then + $mLowestOtherAlly = $lAgent + $mLowestOtherAllyHP = $lHP + ElseIf $lHP = $mLowestOtherAllyHP Then + If $lDistance < ($lX - DllStructGetData($mLowestOtherAlly, 'X')) ^ 2 + ($lY - DllStructGetData($mLowestOtherAlly, 'Y')) ^ 2 Then + $mLowestOtherAlly = $lAgent + $mLowestOtherAllyHP = $lHP + EndIf + EndIf + EndIf + Else +;~ Dead Allies + $mTeamDead[0] += 1 + ReDim $mTeamDead[$mTeamDead[0] + 1] + $mTeamDead[$mTeamDead[0]] = $lAgent + EndIf + Case 3 ;Enemies + If BitAND(DllStructGetData($lAgent, 'Effects'), 0x0010) Then ; Dead Enemies +;~ ;Dead Enemies in spell range +;~ If $lDistance <= 1537600 Then ;1240 +;~ $mEnemyCorpesSpellRange[0] += 1 +;~ ReDim $mEnemyCorpesSpellRange[$mEnemyCorpesSpellRange[0] + 1] +;~ $mEnemyCorpesSpellRange[$mEnemyCorpesSpellRange[0]] = $lAgent +;~ EndIf + Else + +;~ ModelID BlackList + $lModel = DllStructGetData($lAgent, 'PlayerNumber') +;~ Switch $lModel +;~ Case $BoneHorrorID To $BoneHorrorID + 2, $BoneHorrorID + 644 To $BoneHorrorID + 658, $BoneHorrorID + 1979 To $BoneHorrorID + 2009, $BoneHorrorID + 3483 To $BoneHorrorID + 3493, $BoneHorrorID + 3623 To $BoneHorrorID + 3624 +;~ ContinueLoop +;~ EndSwitch + +;~ $mEnemies[0] += 1 +;~ ReDim $mEnemies[$mEnemies[0] + 1] +;~ $mEnemies[$mEnemies[0]] = $lAgent + +;~ Enemies in waypoint range + If $lDistance <= $aRange Then + $NumberOfFoesInAttackRange += 1 +;~ $mEnemiesRange[0] += 1 +;~ ReDim $mEnemiesRange[$mEnemiesRange[0] + 1] +;~ $mEnemiesRange[$mEnemiesRange[0]] = $lAgent + +;~ Lowest Enemy + If $lHP < $mLowestEnemyHP Then + $mLowestEnemy = $lAgent + $mLowestEnemyHP = $lHP + ElseIf $lHP = $mLowestEnemyHP Then + If $lDistance < ($lX - DllStructGetData($mLowestEnemy, 'X')) ^ 2 + ($lY - DllStructGetData($mLowestEnemy, 'Y')) ^ 2 Then + $mLowestEnemy = $lAgent + $mLowestEnemyHP = $lHP + EndIf + EndIf + + If GetNumberOfFoesInRangeOfAgent($lAgent, 256) > $lCountAOE Then + $BestAOETarget = $lAgent + $lCountAOE += 1 + EndIf + + If GetIsBoss($lAgent) == True Then + $BestAOETarget = $lAgent + $lCountAOE += 5 + EndIf + + If GetHasHex($lAgent) == True Then + $EnemyHexed = $lAgent + Else + $EnemyNonHexed = $lAgent + EndIf + If GetHasCondition($lAgent) == True Then + $EnemyConditioned = $lAgent + Else + $EnemyNonConditioned = $lAgent + EndIf + If GetIsHealer($lAgent) Then $EnemyHealer = $lAgent + + If GetIsEnchanted($lAgent) Then + $EnemyNonEnchanted = $lAgent + Else + $EnemyEnchanted = $lAgent + EndIf + + +;~ Closest Enemy +;~ If $lDistance < $mClosestEnemyDist Then +;~ $mClosestEnemyDist = $lDistance +;~ $mClosestEnemy = $lAgent +;~ $mLowestEnemy = $lAgent +;~ EndIf + EndIf + +;~ Enemies in spell range + If $lDistance <= 1440000 Then ;1200 + $NumberOfFoesInSpellRange += 1 + If DllStructGetData($lAgent, 'HP') * DllStructGetData($lAgent, 'MaxHP') < 0.5 Then + $LowHPEnemy = $lAgent + EndIf +;~ $mEnemiesSpellRange[0] += 1 +;~ ReDim $mEnemiesSpellRange[$mEnemiesSpellRange[0] + 1] +;~ $mEnemiesSpellRange[$mEnemiesSpellRange[0]] = $lAgent + EndIf + EndIf + Case 4 ;Allied Pets/Spirits + If Not BitAND(DllStructGetData($lAgent, 'Typemap'), 131072) Then ContinueLoop + If BitAND(DllStructGetData($lAgent, 'Effects'), 0x0010) Then ContinueLoop + If BitAND(DllStructGetData($lAgent, 'Typemap'), 262144) Then + $mSpirits[0] += 1 + ReDim $mSpirits[$mSpirits[0] + 1] + $mSpirits[$mSpirits[0]] = $lAgent +;~ Else +;~ $mPets[0] += 1 +;~ ReDim $mPets[$mPets[0] + 1] +;~ $mPets[$mPets[0]] = $lAgent + EndIf + Case 5 ;Allied Minions + If Not BitAND(DllStructGetData($lAgent, 'Typemap'), 131072) Then ContinueLoop + If BitAND(DllStructGetData($lAgent, 'Effects'), 0x0010) Then ContinueLoop + $mMinions[0] += 1 + ReDim $mMinions[$mMinions[0] + 1] + $mMinions[$mMinions[0]] = $lAgent + Case Else + EndSwitch + Next + $mClosestEnemyDist = Sqrt($mClosestEnemyDist) + $mAverageTeamHP /= $mTeam[0] + If $NumberOfFoesInSpellRange <= 0 Then $EnemyAttacker = 0 + +EndFunc ;==>UpdateWorld + + +;~ Description: Returns buff struct. +Func GetBuffByIndex($aBuffNumber, $aHeroNumber = 0) + Local $lBuffStruct = DllStructCreate('long SkillId;byte unknown1[4];long BuffId;long TargetId') + Local $lOffset[4] + $lOffset[0] = 0 + $lOffset[1] = 0x18 + $lOffset[2] = 0x2C + $lOffset[3] = 0x510 + Local $lCount = MemoryReadPtr($mBasePointer, $lOffset) + ReDim $lOffset[5] + $lOffset[3] = 0x508 + Local $lBuffer + For $i = 0 To $lCount[1] - 1 + $lOffset[4] = 0x24 * $i + $lBuffer = MemoryReadPtr($mBasePointer, $lOffset) + If $lBuffer[1] == GetHeroID($aHeroNumber) Then + $lOffset[4] = 0x4 + 0x24 * $i + ReDim $lOffset[6] + $lOffset[5] = 0 + 0x10 * ($aBuffNumber - 1) + $lBuffStructAddress = MemoryReadPtr($mBasePointer, $lOffset) + DllCall($mKernelHandle, 'int', 'ReadProcessMemory', 'int', $mGWProcHandle, 'int', $lBuffStructAddress[0], 'ptr', DllStructGetPtr($lBuffStruct), 'int', DllStructGetSize($lBuffStruct), 'int', '') + Return $lBuffStruct + EndIf + Next + Return 0 +EndFunc ;==>GetBuffByIndex + +;~ Description: Returns skillbar struct. +Func GetSkillbar($aHeroNumber = 0) + Local $lSkillbarStruct = DllStructCreate('long AgentId;long AdrenalineA1;long AdrenalineB1;dword Recharge1;dword Id1;dword Event1;long AdrenalineA2;long AdrenalineB2;dword Recharge2;dword Id2;dword Event2;long AdrenalineA3;long AdrenalineB3;dword Recharge3;dword Id3;dword Event3;long AdrenalineA4;long AdrenalineB4;dword Recharge4;dword Id4;dword Event4;long AdrenalineA5;long AdrenalineB5;dword Recharge5;dword Id5;dword Event5;long AdrenalineA6;long AdrenalineB6;dword Recharge6;dword Id6;dword Event6;long AdrenalineA7;long AdrenalineB7;dword Recharge7;dword Id7;dword Event7;long AdrenalineA8;long AdrenalineB8;dword Recharge8;dword Id8;dword Event8;dword disabled;byte unknown[8];dword Casting') + Local $lOffset[5] + $lOffset[0] = 0 + $lOffset[1] = 0x18 + $lOffset[2] = 0x2C + $lOffset[3] = 0x6F0 + For $i = 0 To GetHeroCount() + $lOffset[4] = $i * 0xBC + Local $lSkillbarStructAddress = MemoryReadPtr($mBasePointer, $lOffset) + DllCall($mKernelHandle, 'int', 'ReadProcessMemory', 'int', $mGWProcHandle, 'int', $lSkillbarStructAddress[0], 'ptr', DllStructGetPtr($lSkillbarStruct), 'int', DllStructGetSize($lSkillbarStruct), 'int', '') + If DllStructGetData($lSkillbarStruct, 'AgentId') == GetHeroID($aHeroNumber) Then Return $lSkillbarStruct + Next + EndFunc ;==>GetSkillbar + +;~ Description: Returns skill struct. +Func GetSkillByID($aSkillID) + Local $lSkillStruct = DllStructCreate('long ID;byte Unknown1[4];long campaign;long Type;long Special;long ComboReq;long Effect1;long Condition;long Effect2;long WeaponReq;byte Profession;byte Attribute;byte Unknown2[2];long PvPID;byte Combo;byte Target;byte unknown3;byte EquipType;byte Unknown4a;byte EnergyCost;byte HealthCost;byte Unknown4c;dword Adrenaline;float Activation;float Aftercast;long Duration0;long Duration15;long Recharge;byte Unknown5[12];long Scale0;long Scale15;long BonusScale0;long BonusScale15;float AoERange;float ConstEffect;byte unknown6[44]') + Local $lSkillStructAddress = $mSkillBase + 160 * $aSkillID + DllCall($mKernelHandle, 'int', 'ReadProcessMemory', 'int', $mGWProcHandle, 'int', $lSkillStructAddress, 'ptr', DllStructGetPtr($lSkillStruct), 'int', DllStructGetSize($lSkillStruct), 'int', '') + Return $lSkillStruct +EndFunc ;==>GetSkillByID + +;~ Description: Returns effect struct or array of effects. +Func GetEffect($aSkillID = 0, $aHeroNumber = 0) + Local $lEffectCount, $lEffectStructAddress + Local $lReturnArray[1] = [0] + + Local $lOffset[4] + $lOffset[0] = 0 + $lOffset[1] = 0x18 + $lOffset[2] = 0x2C + $lOffset[3] = 0x510 + Local $lCount = MemoryReadPtr($mBasePointer, $lOffset) + ReDim $lOffset[5] + $lOffset[3] = 0x508 + Local $lBuffer + + For $i = 0 To $lCount[1] - 1 + $lOffset[4] = 0x24 * $i + $lBuffer = MemoryReadPtr($mBasePointer, $lOffset) + If $lBuffer[1] == GetHeroID($aHeroNumber) Then + $lOffset[4] = 0x1C + 0x24 * $i + $lEffectCount = MemoryReadPtr($mBasePointer, $lOffset) + ReDim $lOffset[6] + $lOffset[4] = 0x14 + 0x24 * $i + $lOffset[5] = 0 + $lEffectStructAddress = MemoryReadPtr($mBasePointer, $lOffset) + + If $aSkillID = 0 Then + ReDim $lReturnArray[$lEffectCount[1] + 1] + $lReturnArray[0] = $lEffectCount[1] + + For $i = 0 To $lEffectCount[1] - 1 + $lReturnArray[$i + 1] = DllStructCreate('long SkillId;long EffectType;long EffectId;long AgentId;float Duration;long TimeStamp') + $lEffectStructAddress[1] = $lEffectStructAddress[0] + 24 * $i + DllCall($mKernelHandle, 'int', 'ReadProcessMemory', 'int', $mGWProcHandle, 'int', $lEffectStructAddress[1], 'ptr', DllStructGetPtr($lReturnArray[$i + 1]), 'int', 24, 'int', '') + Next + + ExitLoop + Else + Local $lReturn = DllStructCreate('long SkillId;long EffectType;long EffectId;long AgentId;float Duration;long TimeStamp') + + For $i = 0 To $lEffectCount[1] - 1 + DllCall($mKernelHandle, 'int', 'ReadProcessMemory', 'int', $mGWProcHandle, 'int', $lEffectStructAddress[0] + 24 * $i, 'ptr', DllStructGetPtr($lReturn), 'int', 24, 'int', '') + If DllStructGetData($lReturn, 'SkillID') = $aSkillID Then Return $lReturn + Next + EndIf + EndIf + Next + Return $lReturnArray +EndFunc ;==>GetEffect + +;~ Description: Returns quest struct. +Func GetQuestByID($aQuestID = 0) + Local $lQuestStruct = DllStructCreate('long id;long LogState;byte unknown1[12];long MapFrom;float X;float Y;byte unknown2[8];long MapTo') + Local $lQuestPtr, $lQuestLogSize, $lQuestID + Local $lOffset[4] = [0, 0x18, 0x2C, 0x534] + + $lQuestLogSize = MemoryReadPtr($mBasePointer, $lOffset) + + If $aQuestID = 0 Then + $lOffset[1] = 0x18 + $lOffset[2] = 0x2C + $lOffset[3] = 0x528 + $lQuestID = MemoryReadPtr($mBasePointer, $lOffset) + $lQuestID = $lQuestID[1] + Else + $lQuestID = $aQuestID + EndIf + + Local $lOffset[5] = [0, 0x18, 0x2C, 0x52C, 0] + For $i = 0 To $lQuestLogSize[1] + $lOffset[4] = 0x34 * $i + $lQuestPtr = MemoryReadPtr($mBasePointer, $lOffset) + DllCall($mKernelHandle, 'int', 'ReadProcessMemory', 'int', $mGWProcHandle, 'int', $lQuestPtr[0], 'ptr', DllStructGetPtr($lQuestStruct), 'int', DllStructGetSize($lQuestStruct), 'int', '') + If DllStructGetData($lQuestStruct, 'ID') = $lQuestID Then Return $lQuestStruct + Next +EndFunc ;==>GetQuestByID + +Func FindItemToSalvage() + Local $lItemInfo + Local $ItemToSalvage[2] = [0, 0] + + For $i = 1 To 4 + For $j = 0 To DllStructGetData(GetBag($i), 'Slots') - 1 + $lItemInfo = GetItemBySlot($i, $j) + If GetIsIDed($lItemInfo) == False Then + $ItemToSalvage[0] = $i + $ItemToSalvage[1] = $j + Return $ItemToSalvage + EndIf + Next + Next + Return $ItemToSalvage +EndFunc ;==>FindItemToSalvage + + + + diff --git a/gwApi/gwAPI_integrate_BackUp.au3 b/gwApi/gwAPI_integrate_BackUp.au3 new file mode 100644 index 0000000..8316a07 --- /dev/null +++ b/gwApi/gwAPI_integrate_BackUp.au3 @@ -0,0 +1,1091 @@ +1090 +#include-once +#RequireAdmin + +Func CacheSkillbar_() + If Not $mSkillbarCache[0] Then + $mSkillbar = GetSkillbar() + $mSkillbarPtr = GetSkillbarPtr() + For $i = 1 To 8 + $mSkillbarCache[$i] = DllStructGetData($mSkillbar, 'Id' & $i) + $mSkillbarCacheStruct[$i] = GetSkillByID($mSkillbarCache[$i]) + $mSkillbarCachePtr[$i] = GetSkillPtr($mSkillbarCache[$i]) + If DllStructGetData($mSkillbarCacheStruct[$i], 'Adrenaline') > 0 Then + $SkillAdrenalineReq[$i] = DllStructGetData($mSkillbarCacheStruct[$i], 'Adrenaline') + $SkillAdrenalineReq[0] = True + $mSkillbarCacheEnergyReq[$i] = 0 + Update("Skill " & $i & " requires " & DllStructGetData($mSkillbarCacheStruct[$i], 'Adrenaline') & " Adrenaline.", "Skills") + Else + $SkillAdrenalineReq[$i] = 0 + Switch DllStructGetData($mSkillbarCacheStruct[$i], 'EnergyCost') + Case 0 + $mSkillbarCacheEnergyReq[$i] = 0 + Case 1 + $mSkillbarCacheEnergyReq[$i] = 1 + Case 5 + $mSkillbarCacheEnergyReq[$i] = 5 + Case 10 + $mSkillbarCacheEnergyReq[$i] = 10 + Case 11 + $mSkillbarCacheEnergyReq[$i] = 15 + Case 12 + $mSkillbarCacheEnergyReq[$i] = 25 + Case Else + EndSwitch + Update("Skill " & $i & " requires " & $mSkillbarCacheEnergyReq[$i] & " energy.") + EndIf + $mSkillPriorityRating[$i][1] = 0 + $SkillDamageAmount[$i] = SkillDamageAmount($mSkillbarCacheStruct[$i]) + $mSkillPriorityRating[$i][0] = $i + If IsEliteSkill($mSkillbarCacheStruct[$i]) Then $mSkillPriorityRating[$i][1] = 30 + ; YMLAD ; 1 + If $mSkillbarCache[$i] = $You_Move_Like_a_Dwarf Then + $IsYMLAD[$i] = True + $IsYMLAD[0] = True + $YMLADSlot = $i + $mSkillPriorityRating[$i][1] = 120 - $i + $mSkillPriorityRating[$i][2] = 1 + Update("Skill " & $i & " is YMLAD! Priority: " & $mSkillPriorityRating[$i][1] & ".") + ContinueLoop + EndIf + ; Interrupt ; 2 + If IsInterruptSkill($mSkillbarCacheStruct[$i]) Then + $mSkillPriorityRating[$i][1] += 110 - $i + $mSkillPriorityRating[$i][2] = 2 + $IsInterrupt[$i] = True + $IsInterrupt[0] = True + Update("Skill " & $i & " is an Interrupt Skill, Priority: " & $mSkillPriorityRating[$i][1] & ".") + ContinueLoop + EndIf + ; Heal ; 3 + If IsHealSkill($mSkillbarCacheStruct[$i]) And Not IsResSkill($mSkillbarCacheStruct[$i]) And Not IsHexRemovalSkill($mSkillbarCacheStruct[$i]) And IsConditionRemovalSkill($mSkillbarCacheStruct[$i]) == False And Not TargetOtherAllySkill($mSkillbarCacheStruct[$i]) Then + $IsHealingSpell[$i] = True + $IsHealingSpell[0] = True + $mSkillPriorityRating[$i][1] += 80 - $i + $SkillDamageAmount[$i] + $mSkillPriorityRating[$i][2] = 3 + Update("Skill " & $i & " heals ally for " & $SkillDamageAmount[$i] & ", Priority: " & $mSkillPriorityRating[$i][1] & ".") + ContinueLoop + EndIf + ; Heal Other ; 4 + If TargetOtherAllySkill($mSkillbarCacheStruct[$i]) == True And IsResSkill($mSkillbarCacheStruct[$i]) == False And IsHexRemovalSkill($mSkillbarCacheStruct[$i]) == False And IsConditionRemovalSkill($mSkillbarCacheStruct[$i]) == False Then + $mSkillPriorityRating[$i][1] += 75 - $i + $mSkillPriorityRating[$i][2] = 4 + Update("Skill " & $i & " heals other ally for " & $SkillDamageAmount[$i] & ", Priority: " & $mSkillPriorityRating[$i][1] & ".") + ContinueLoop + EndIf + ; AOE Skills ; 5 + If SkillAOERange($mSkillbarCacheStruct[$i]) > 0 Then + If TargetEnemySkill($mSkillbarCacheStruct[$i]) == True Or TargetGroundSkill($mSkillbarCacheStruct[$i]) == True Then + $mSkillPriorityRating[$i][1] += 70 - $i + $mSkillPriorityRating[$i][2] = 5 + Update("Skill " & $i & " does AOE damage of " & $SkillDamageAmount[$i] & ", Priority: " & $mSkillPriorityRating[$i][1] & ".") + ContinueLoop + EndIf + EndIf + ; Soul Twisting ; 6 + If $mSkillbarCache[$i] == $Soul_Twisting Then + $IsSoulTwistingSpell[$i] = True + $IsSoulTwistingSpell[0] = True + $mSkillPriorityRating[$i][1] = 65 - $i + $mSkillPriorityRating[$i][2] = 6 + Update("Skill " & $i & " is Soul Twisting, Priority: " & $mSkillPriorityRating[$i][1] & ".") + ContinueLoop + EndIf + ; Spirits ; 7 + If IsSpiritSkill($mSkillbarCacheStruct[$i]) == True Then + $mSkillPriorityRating[$i][1] += 60 - $i + $mSkillPriorityRating[$i][2] = 7 + Update("Skill " & $i & " is a Spirit Skill, Priority: " & $mSkillPriorityRating[$i][1] & ".") + ContinueLoop + EndIf + ; Hex Removal ; 8 + If IsHexRemovalSkill($mSkillbarCacheStruct[$i]) == True Then + $mSkillPriorityRating[$i][1] = 55 - $i + $mSkillPriorityRating[$i][2] = 8 + Update("Skill " & $i & " is a Hex Remover, Priority: " & $mSkillPriorityRating[$i][1] & ".") + ContinueLoop + EndIf + ; Condition Removal ; 9 + If IsConditionRemovalSkill($mSkillbarCacheStruct[$i]) == True Then + $mSkillPriorityRating[$i][1] = 50 - $i + $mSkillPriorityRating[$i][2] = 9 + Update("Skill " & $i & " is a Condition Remover, Priority: " & $mSkillPriorityRating[$i][1] & ".") + ContinueLoop + EndIf + ; Weapon Spell ; 10 + If IsWeaponSpell($mSkillbarCache[$i]) == True Then + $IsWeaponSpell[$i] = True + $IsWeaponSpell[0] = True + $mSkillPriorityRating[$i][1] += 40 - $i + $mSkillPriorityRating[$i][2] = 10 + Update("Skill " & $i & " is a Weapon Skill, Priority: " & $mSkillPriorityRating[$i][1] & ".") + ContinueLoop + EndIf + ; Enchantment Strip ; 11 + If IsEnchantmentStrip($mSkillbarCacheStruct[$i]) Then + $mSkillPriorityRating[$i][1] += 35 - $i + $mSkillPriorityRating[$i][2] = 11 + Update("Skill " & $i & " is a Enchantment Strip, Priority: " & $mSkillPriorityRating[$i][1] & ".") + ContinueLoop + EndIf + ; General Attack ; 12 + If SkillAOERange($mSkillbarCacheStruct[$i]) <= 0 And TargetEnemySkill($mSkillbarCacheStruct[$i]) == True And IsInterruptSkill($mSkillbarCacheStruct[$i]) == False Then + $mSkillPriorityRating[$i][1] += 30 - $i + If IsPvESkill($mSkillbarCacheStruct[$i]) Then $mSkillPriorityRating[$i][1] += 100 + $mSkillPriorityRating[$i][2] = 12 + Update("Skill " & $i & " Vs. enemies for " & $SkillDamageAmount[$i] & " damage, Priority: " & $mSkillPriorityRating[$i][1] & ".") + ContinueLoop + EndIf + ; Res Skill ; 13 + If IsResSkill($mSkillbarCacheStruct[$i]) == True Then + $mSkillPriorityRating[$i][1] = 20 - $i + $mSkillPriorityRating[$i][2] = 13 + Update("Skill " & $i & " is a Rez, Priority: " & $mSkillPriorityRating[$i][1] & ".") + ContinueLoop + EndIf + ; Self-Target, Summon spirits, enchantments ; 14 + If TargetSelfSkill($mSkillbarCacheStruct[$i]) == True And IsHealSkill($mSkillbarCacheStruct[$i]) == False And IsSpiritSkill($mSkillbarCacheStruct[$i]) == False And IsSummonSkill($mSkillbarCache[$i]) == False And $mSkillbarCache[$i] <> $Soul_Twisting Then + $IsSelfCastingSpell[$i] = True + $IsSelfCastingSpell[0] = True + $mSkillPriorityRating[$i][1] += 10 - $i + $mSkillPriorityRating[$i][2] = 14 + Update("Skill " & $i & " is a Self Targeting Skill, Priority: " & $mSkillPriorityRating[$i][1] & ".") + ContinueLoop + EndIf + ; Asuran Summon ; 15 + If IsSummonSkill($mSkillbarCache[$i]) == True Then + $IsSummonSpell[$i] = True + $IsSummonSpell[0] = True + $mSkillPriorityRating[$i][1] = 0 - $i + $mSkillPriorityRating[$i][2] = 15 + Update("Skill " & $i & " is a Summon, Priority: " & $mSkillPriorityRating[$i][1] & ".") + ContinueLoop + EndIf + Next + $lMyProfession = GetHeroProfession(0) + $lAttrPrimary = GetProfPrimaryAttribute($lMyProfession) + _ArraySort($mSkillPriorityRating, 0, 0, 0, 1) + EndIf + $mSkillbarCache[0] = True + $mSkillbarCachePtr[0] = True + $mSkillbarCacheStruct[0] = True +EndFunc ;==>CacheSkillbar + +;~ Description: Returns current target. +Func GetCurrentTarget() + Return GetAgentByID(GetCurrentTargetID()) +EndFunc ;==>GetCurrentTarget + +;~ Description: Picks up an item. +Func PickUpItem_($aItem) + Local $lAgentID + + If IsDllStruct($aItem) = 0 Then + $lAgentID = $aItem + ElseIf DllStructGetSize($aItem) < 400 Then + $lAgentID = DllStructGetData($aItem, 'AgentID') + Else + $lAgentID = DllStructGetData($aItem, 'ID') + EndIf + Return SendPacket(0xC, 0x39, $lAgentID, 0) +EndFunc ;==>PickUpItem + +;~ Description: Returns item by slot. +Func GetItemBySlot($aBag, $aSlot) + Local $lBag + + If IsDllStruct($aBag) = 0 Then + $lBag = GetBag($aBag) + Else + $lBag = $aBag + EndIf + + Local $lItemPtr = DllStructGetData($lBag, 'ItemArray') + Local $lBuffer = DllStructCreate('ptr') + Local $lItemStruct = DllStructCreate('long id;long agentId;byte unknown1[4];ptr bag;ptr modstruct;long modstructsize;ptr customized;byte unknown2[4];byte type;byte unknown3;short extraId;short value;byte unknown4[2];short interaction;long modelId;ptr modString;byte unknown5[4];ptr NameString;byte unknown6[15];byte quantity;byte equipped;byte unknown7[1];byte slot') + DllCall($mKernelHandle, 'int', 'ReadProcessMemory', 'int', $mGWProcHandle, 'int', DllStructGetData($lBag, 'ItemArray') + 4 * ($aSlot - 1), 'ptr', DllStructGetPtr($lBuffer), 'int', DllStructGetSize($lBuffer), 'int', '') + DllCall($mKernelHandle, 'int', 'ReadProcessMemory', 'int', $mGWProcHandle, 'int', DllStructGetData($lBuffer, 1), 'ptr', DllStructGetPtr($lItemStruct), 'int', DllStructGetSize($lItemStruct), 'int', '') + Return $lItemStruct +EndFunc ;==>GetItemBySlot + +;~ Description: Returns item struct. +Func GetItemByItemID($aItemID) + Local $lItemStruct = DllStructCreate('long id;long agentId;byte unknown1[4];ptr bag;ptr modstruct;long modstructsize;ptr customized;byte unknown2[4];byte type;byte unknown3;short extraId;short value;byte unknown4[2];short interaction;long modelId;ptr modString;byte unknown5[4];ptr NameString;byte unknown6[15];byte quantity;byte equipped;byte unknown7[1];byte slot') + Local $lOffset[5] = [0, 0x18, 0x40, 0xB8, 0x4 * $aItemID] + Local $lItemPtr = MemoryReadPtr($mBasePointer, $lOffset) + DllCall($mKernelHandle, 'int', 'ReadProcessMemory', 'int', $mGWProcHandle, 'int', $lItemPtr[1], 'ptr', DllStructGetPtr($lItemStruct), 'int', DllStructGetSize($lItemStruct), 'int', '') + Return $lItemStruct +EndFunc ;==>GetItemByItemID + +;~ Description: Returns item by agent ID. +Func GetItemByAgentID($aAgentID) + Local $lItemStruct = DllStructCreate('long id;long agentId;byte unknown1[4];ptr bag;ptr modstruct;long modstructsize;ptr customized;byte unknown2[4];byte type;byte unknown3;short extraId;short value;byte unknown4[2];short interaction;long modelId;ptr modString;byte unknown5[4];ptr NameString;byte unknown6[15];byte quantity;byte equipped;byte unknown7[1];byte slot') + Local $lOffset[4] = [0, 0x18, 0x40, 0xC0] + Local $lItemArraySize = MemoryReadPtr($mBasePointer, $lOffset) + Local $lOffset[5] = [0, 0x18, 0x40, 0xB8, 0] + Local $lItemPtr, $lItemID + Local $lAgentID = ConvertID($aAgentID) + + For $lItemID = 1 To $lItemArraySize[1] + $lOffset[4] = 0x4 * $lItemID + $lItemPtr = MemoryReadPtr($mBasePointer, $lOffset) + If $lItemPtr[1] = 0 Then ContinueLoop + + DllCall($mKernelHandle, 'int', 'ReadProcessMemory', 'int', $mGWProcHandle, 'int', $lItemPtr[1], 'ptr', DllStructGetPtr($lItemStruct), 'int', DllStructGetSize($lItemStruct), 'int', '') + If DllStructGetData($lItemStruct, 'AgentID') = $lAgentID Then Return $lItemStruct + Next +EndFunc ;==>GetItemByAgentID + +;~ Description: Returns item by model ID. +Func GetItemByModelID($aModelID, $BagsOnly = False) + If $BagsOnly Then + For $i = 1 to 17 + For $slot = 1 To DllStructGetData(GetBag($i), 'Slots') + $lItemStruct = GetItemBySlot($i, $Slot) + If DllStructGetData($lItemStruct, 'ID') = 0 Then ContinueLoop + If DllStructGetData($lItemStruct, 'ModelID') == $aModelID Then Return $lItemStruct + Next + Next + Else + Local $lItemStruct = DllStructCreate('long id;long agentId;byte unknown1[4];ptr bag;ptr modstruct;long modstructsize;ptr customized;byte unknown2[4];byte type;byte unknown3;short extraId;short value;byte unknown4[2];short interaction;long modelId;ptr modString;byte unknown5[4];ptr NameString;byte unknown6[15];byte quantity;byte equipped;byte unknown7[1];byte slot') + Local $lOffset[4] = [0, 0x18, 0x40, 0xC0] + Local $lItemArraySize = MemoryReadPtr($mBasePointer, $lOffset) + Local $lOffset[5] = [0, 0x18, 0x40, 0xB8, 0] + Local $lItemPtr, $lItemID + + For $lItemID = 1 To $lItemArraySize[1] + $lOffset[4] = 0x4 * $lItemID + $lItemPtr = MemoryReadPtr($mBasePointer, $lOffset) + If $lItemPtr[1] = 0 Then ContinueLoop + + DllCall($mKernelHandle, 'int', 'ReadProcessMemory', 'int', $mGWProcHandle, 'int', $lItemPtr[1], 'ptr', DllStructGetPtr($lItemStruct), 'int', DllStructGetSize($lItemStruct), 'int', '') + If DllStructGetData($lItemStruct, 'ModelID') = $aModelID Then Return $lItemStruct + Next + EndIf + Return False +EndFunc ;==>GetItemByModelID + +Func GetNumberOfFoesInRangeOfAgent_($aAgent = -2, $fMaxDistance = 4000, $ModelID = 0) + Local $lDistance, $lCount = 0, $lAgentToCompare + + If IsDllStruct($aAgent) = 0 Then $aAgent = GetAgentByID($aAgent) + For $i = 1 To GetMaxAgents() + $lAgentToCompare = GetAgentByID($i) + If DllStructGetData($lAgentToCompare, 'Type') <> 0xDB Then ContinueLoop + If DllStructGetData($lAgentToCompare, 'Allegiance') <> 3 Then ContinueLoop + If DllStructGetData($lAgentToCompare, 'HP') <= 0 Then ContinueLoop + If BitAND(DllStructGetData($lAgentToCompare, 'Effects'), 0x0010) > 0 Then ContinueLoop + If $ModelID <> 0 And DllStructGetData($lAgentToCompare, 'ModelID') == $ModelID Then ContinueLoop + $lDistance = GetDistance_($lAgentToCompare, $aAgent) + If $lDistance < $fMaxDistance Then + $lCount += 1 + EndIf + Next + Return $lCount +EndFunc ;==>GetNumberOfFoesInRangeOfAgent + +Func GetDistance_($aAgent1 = -1, $aAgent2 = -2) + If IsDllStruct($aAgent1) = 0 Then $aAgent1 = GetAgentByID($aAgent1) + If IsDllStruct($aAgent2) = 0 Then $aAgent2 = GetAgentByID($aAgent2) + Return Sqrt((DllStructGetData($aAgent1, 'X') - DllStructGetData($aAgent2, 'X')) ^ 2 + (DllStructGetData($aAgent1, 'Y') - DllStructGetData($aAgent2, 'Y')) ^ 2) +EndFunc ;==>GetDistance + +Func GetNumberOfAlliesInRangeOfAgent_($aAgent = -2, $fMaxDistance = 4000) + Local $lDistance, $lCount = 0, $lAgentToCompare + + If IsDllStruct($aAgent) = 0 Then $aAgent = GetAgentByID($aAgent) + For $i = 1 To GetMaxAgents() + $lAgentToCompare = GetAgentByID($i) + If DllStructGetData($lAgentToCompare, 'Type') <> 0xDB Then ContinueLoop + If DllStructGetData($lAgentToCompare, 'Allegiance') <> 1 Then ContinueLoop + If DllStructGetData($lAgentToCompare, 'HP') <= 0 Then ContinueLoop + If BitAND(DllStructGetData($lAgentToCompare, 'Effects'), 0x0010) > 0 Then ContinueLoop + $lDistance = GetDistance_($lAgentToCompare, $aAgent) + If $lDistance < $fMaxDistance Then + $lCount += 1 + EndIf + Next + Return $lCount +EndFunc ;==>GetNumberOfAlliesInRangeOfAgent + +;~ Returns player with most enemies around them within range $fMaxDistance +Func GetVIP_($fMaxDistance = 1350) + Local $lCount = 0, $lAgentToCompare, $VIP = 0, $Enemies = 0 + + For $i = 1 To GetMaxAgents() + $lAgentToCompare = GetAgentByID($i) + If DllStructGetData($lAgentToCompare, 'Type') <> 0xDB Then ContinueLoop + If DllStructGetData($lAgentToCompare, 'Allegiance') <> 1 Then ContinueLoop + If DllStructGetData($lAgentToCompare, 'HP') <= 0 Then ContinueLoop + If BitAND(DllStructGetData($lAgentToCompare, 'Effects'), 0x0010) > 0 Then ContinueLoop + $Enemies = GetNumberOfFoesInRangeOfAgent_($lAgentToCompare, $fMaxDistance) + If $Enemies > $lCount Then + $VIP = $lAgentToCompare + $lCount = $Enemies + EndIf + Next + Return $VIP +EndFunc ;==>GetVIP + +;~ Description: Creates an array of agents of a given type +Func GetAgentArray($aType = 0) + Local $lStruct + Local $lCount + Local $lBuffer = '' + DllStructSetData($mMakeAgentArray, 2, $aType) + MemoryWrite($mAgentCopyCount, -1, 'long') + Enqueue($mMakeAgentArrayPtr, 8) + Local $lDeadlock = TimerInit() + Do + Sleep(1) + $lCount = MemoryRead($mAgentCopyCount, 'long') + Until $lCount >= 0 Or TimerDiff($lDeadlock) > 5000 + If $lCount < 0 Then $lCount = 0 + For $i = 1 To $lCount + $lBuffer &= 'Byte[448];' + Next + $lBuffer = DllStructCreate($lBuffer) + DllCall($mKernelHandle, 'int', 'ReadProcessMemory', 'int', $mGWProcHandle, 'int', $mAgentCopyBase, 'ptr', DllStructGetPtr($lBuffer), 'int', DllStructGetSize($lBuffer), 'int', '') + Local $lReturnArray[$lCount + 1] = [$lCount] + For $i = 1 To $lCount + $lReturnArray[$i] = DllStructCreate('ptr vtable;byte unknown1[24];byte unknown2[4];ptr NextAgent;byte unknown3[8];long Id;float Z;byte unknown4[8];float BoxHoverWidth;float BoxHoverHeight;byte unknown5[8];float Rotation;byte unknown6[8];long NameProperties;byte unknown7[24];float X;float Y;byte unknown8[8];float NameTagX;float NameTagY;float NameTagZ;byte unknown9[12];long Type;float MoveX;float MoveY;byte unknown10[28];long Owner;byte unknown30[8];long ExtraType;byte unknown11[24];float AttackSpeed;float AttackSpeedModifier;word PlayerNumber;byte unknown12[6];ptr Equip;byte unknown13[10];byte Primary;byte Secondary;byte Level;byte Team;byte unknown14[6];float EnergyPips;byte unknown[4];float EnergyPercent;long MaxEnergy;byte unknown15[4];float HPPips;byte unknown16[4];float HP;long MaxHP;long Effects;byte unknown17[4];byte Hex;byte unknown18[18];long ModelState;long TypeMap;byte unknown19[16];long InSpiritRange;byte unknown20[16];long LoginNumber;float ModelMode;byte unknown21[4];long ModelAnimation;byte unknown22[32];byte LastStrike;byte Allegiance;word WeaponType;word Skill;byte unknown23[4];word WeaponItemId;word OffhandItemId') + $lStruct = DllStructCreate('byte[448]', DllStructGetPtr($lReturnArray[$i])) + DllStructSetData($lStruct, 1, DllStructGetData($lBuffer, $i)) + Next + Return $lReturnArray +EndFunc ;==>GetAgentArray + +;~ Description: Returns an agent struct. +Func GetAgentByID($aAgentID = -2) + ;returns dll struct if successful + Local $lAgentPtr = GetAgentPtr($aAgentID) + If $lAgentPtr = 0 Then Return 0 + ;Offsets: 0x2C=AgentID 0x9C=Type 0xF4=PlayerNumber 0114=Energy Pips + Local $lAgentStruct = DllStructCreate('ptr vtable;byte unknown1[24];byte unknown2[4];ptr NextAgent;byte unknown3[8];long Id;float Z;byte unknown4[8];float BoxHoverWidth;float BoxHoverHeight;byte unknown5[8];float Rotation;byte unknown6[8];long NameProperties;byte unknown7[24];float X;float Y;byte unknown8[8];float NameTagX;float NameTagY;float NameTagZ;byte unknown9[12];long Type;float MoveX;float MoveY;byte unknown10[28];long Owner;byte unknown30[8];long ExtraType;byte unknown11[24];float AttackSpeed;float AttackSpeedModifier;word PlayerNumber;byte unknown12[6];ptr Equip;byte unknown13[10];byte Primary;byte Secondary;byte Level;byte Team;byte unknown14[6];float EnergyPips;byte unknown[4];float EnergyPercent;long MaxEnergy;byte unknown15[4];float HPPips;byte unknown16[4];float HP;long MaxHP;long Effects;byte unknown17[4];byte Hex;byte unknown18[18];long ModelState;long TypeMap;byte unknown19[16];long InSpiritRange;byte unknown20[16];long LoginNumber;float ModelMode;byte unknown21[4];long ModelAnimation;byte unknown22[32];byte LastStrike;byte Allegiance;word WeaponType;word Skill;byte unknown23[4];word WeaponItemId;word OffhandItemId') + DllCall($mKernelHandle, 'int', 'ReadProcessMemory', 'int', $mGWProcHandle, 'int', $lAgentPtr, 'ptr', DllStructGetPtr($lAgentStruct), 'int', DllStructGetSize($lAgentStruct), 'int', '') + Return $lAgentStruct +EndFunc ;==>GetAgentByID + +;~ Description: Returns agent by player name. +Func GetAgentByPlayerName($aPlayerName) + For $i = 1 To GetMaxAgents() + If GetPlayerName($i) = $aPlayerName Then + Return GetAgentByID($i) + EndIf + Next +EndFunc ;==>GetAgentByPlayerName + +;~ Description: Returns agent by name. +Func GetAgentByName($aName) + If $mUseStringLog = False Then Return + + Local $lName, $lAddress + + For $i = 1 To GetMaxAgents() + $lAddress = $mStringLogBase + 256 * $i + $lName = MemoryRead($lAddress, 'wchar [128]') + $lName = StringRegExpReplace($lName, '[<]{1}([^>]+)[>]{1}', '') + If StringInStr($lName, $aName) > 0 Then Return GetAgentByID($i) + Next + + DisplayAll(True) + Sleep(100) + DisplayAll(False) + DisplayAll(True) + Sleep(100) + DisplayAll(False) + + For $i = 1 To GetMaxAgents() + $lAddress = $mStringLogBase + 256 * $i + $lName = MemoryRead($lAddress, 'wchar [128]') + $lName = StringRegExpReplace($lName, '[<]{1}([^>]+)[>]{1}', '') + If StringInStr($lName, $aName) > 0 Then Return GetAgentByID($i) + Next +EndFunc ;==>GetAgentByName + +;~ Description: Returns the nearest agent to an agent. +Func GetNearestAgentToAgent($aAgent = -2) + Local $lNearestAgent, $lNearestDistance = 100000000 + Local $lDistance + Local $lAgentArray = GetAgentArray() + + If IsDllStruct($aAgent) = 0 Then $aAgent = GetAgentByID($aAgent) + + Local $lID = DllStructGetData($aAgent, 'ID') + + For $i = 1 To $lAgentArray[0] + $lDistance = (DllStructGetData($aAgent, 'X') - DllStructGetData($lAgentArray[$i], 'X')) ^ 2 + (DllStructGetData($aAgent, 'Y') - DllStructGetData($lAgentArray[$i], 'Y')) ^ 2 + + If $lDistance < $lNearestDistance Then + If DllStructGetData($lAgentArray[$i], 'ID') == $lID Then ContinueLoop + $lNearestAgent = $lAgentArray[$i] + $lNearestDistance = $lDistance + EndIf + Next + + SetExtended(Sqrt($lNearestDistance)) + Return $lNearestAgent +EndFunc ;==>GetNearestAgentToAgent + +;~ Description: Returns the nearest enemy to an agent. +Func GetNearestEnemyToAgent($aAgent = -2) + Local $lNearestAgent, $lNearestDistance = 100000000 + Local $lDistance + Local $lAgentArray = GetAgentArray(0xDB) + + If Not IsDllStruct($aAgent) Then $aAgent = GetAgentByID($aAgent) + + Local $lID = DllStructGetData($aAgent, 'ID') + + For $i = 1 To $lAgentArray[0] + $lDistance = (DllStructGetData($aAgent, 'X') - DllStructGetData($lAgentArray[$i], 'X')) ^ 2 + (DllStructGetData($aAgent, 'Y') - DllStructGetData($lAgentArray[$i], 'Y')) ^ 2 + If DllStructGetData($lAgentArray[$i], 'Allegiance') <> 3 Then ContinueLoop + If DllStructGetData($lAgentArray[$i], 'HP') <= 0 Then ContinueLoop + If BitAND(DllStructGetData($lAgentArray[$i], 'Effects'), 0x0010) > 0 Then ContinueLoop + + $lDistance = (DllStructGetData($aAgent, 'X') - DllStructGetData($lAgentArray[$i], 'X')) ^ 2 + (DllStructGetData($aAgent, 'Y') - DllStructGetData($lAgentArray[$i], 'Y')) ^ 2 + If $lDistance < $lNearestDistance Then + If DllStructGetData($lAgentArray[$i], 'ID') == $lID Then ContinueLoop + $lNearestAgent = $lAgentArray[$i] + $lNearestDistance = $lDistance + EndIf + Next + + SetExtended(Sqrt($lNearestDistance)) + Return $lNearestAgent +EndFunc ;==>GetNearestEnemyToAgent + +;~ Description: Returns the farthest enemy to an agent within given max distance +Func GetFarthestEnemyToAgent($MaxDistance = 1400, $aAgent = -2) + Local $lFarthestAgent, $lFarthestDistance = 1 + Local $lDistance + Local $lAgentArray = GetAgentArray(0xDB) + + If Not IsDllStruct($aAgent) Then $aAgent = GetAgentByID($aAgent) + + Local $lID = DllStructGetData($aAgent, 'ID') + + For $i = 1 To $lAgentArray[0] + If DllStructGetData($lAgentArray[$i], 'Allegiance') <> 3 Then ContinueLoop + If DllStructGetData($lAgentArray[$i], 'HP') <= 0 Then ContinueLoop + If BitAND(DllStructGetData($lAgentArray[$i], 'Effects'), 0x0010) > 0 Then ContinueLoop + + $lDistance = (DllStructGetData($aAgent, 'X') - DllStructGetData($lAgentArray[$i], 'X')) ^ 2 + (DllStructGetData($aAgent, 'Y') - DllStructGetData($lAgentArray[$i], 'Y')) ^ 2 + If $lDistance > $lFarthestDistance And $lDistance < ($MaxDistance ^ 2) Then + If DllStructGetData($lAgentArray[$i], 'ID') == $lID Then ContinueLoop + $lFarthestAgent = $lAgentArray[$i] + $lFarthestDistance = $lDistance + EndIf + Next + + SetExtended(Sqrt($lFarthestDistance)) + Return $lFarthestAgent +EndFunc ;==>GetFarthestEnemyToAgent + +;~ Description: Returns the nearest agent to a set of coordinates. +Func GetNearestAgentToCoords($aX, $aY) + Local $lNearestAgent, $lNearestDistance = 100000000 + Local $lDistance + Local $lAgentArray = GetAgentArray() + + For $i = 1 To $lAgentArray[0] + $lDistance = ($aX - DllStructGetData($lAgentArray[$i], 'X')) ^ 2 + ($aY - DllStructGetData($lAgentArray[$i], 'Y')) ^ 2 + If $lDistance < $lNearestDistance Then + $lNearestAgent = $lAgentArray[$i] + $lNearestDistance = $lDistance + EndIf + Next + + SetExtended(Sqrt($lNearestDistance)) + Return $lNearestAgent +EndFunc ;==>GetNearestAgentToCoords + +;~ Description: Returns the nearest signpost to an agent. +Func GetNearestSignpostToAgent($aAgent = -2) + Local $lNearestAgent, $lNearestDistance = 100000000 + Local $lDistance + Local $lAgentArray = GetAgentArray(0x200) + + If IsDllStruct($aAgent) = 0 Then $aAgent = GetAgentByID($aAgent) + + Local $lID = DllStructGetData($aAgent, 'ID') + + For $i = 1 To $lAgentArray[0] + $lDistance = (DllStructGetData($lAgentArray[$i], 'Y') - DllStructGetData($aAgent, 'Y')) ^ 2 + (DllStructGetData($lAgentArray[$i], 'X') - DllStructGetData($aAgent, 'X')) ^ 2 + If $lDistance < $lNearestDistance Then + If DllStructGetData($lAgentArray[$i], 'ID') == $lID Then ContinueLoop + $lNearestAgent = $lAgentArray[$i] + $lNearestDistance = $lDistance + EndIf + Next + + SetExtended(Sqrt($lNearestDistance)) + Return $lNearestAgent +EndFunc ;==>GetNearestSignpostToAgent + +;~ Description: Returns the nearest signpost to a set of coordinates. +Func GetNearestSignpostToCoords($aX, $aY) + Local $lNearestAgent, $lNearestDistance = 100000000 + Local $lDistance + Local $lAgentArray = GetAgentArray(0x200) + + For $i = 1 To $lAgentArray[0] + $lDistance = ($aX - DllStructGetData($lAgentArray[$i], 'X')) ^ 2 + ($aY - DllStructGetData($lAgentArray[$i], 'Y')) ^ 2 + + If $lDistance < $lNearestDistance Then + $lNearestAgent = $lAgentArray[$i] + $lNearestDistance = $lDistance + EndIf + Next + + SetExtended(Sqrt($lNearestDistance)) + Return $lNearestAgent +EndFunc ;==>GetNearestSignpostToCoords + +;~ Description: Returns the nearest NPC to an agent. +Func GetNearestNPCToAgent($aAgent = -2) + Local $lNearestAgent, $lNearestDistance = 100000000 + Local $lDistance + Local $lAgentArray = GetAgentArray(0xDB) + + If Not IsDllStruct($aAgent) Then $aAgent = GetAgentByID($aAgent) + + Local $lID = DllStructGetData($aAgent, 'ID') + + For $i = 1 To $lAgentArray[0] + If DllStructGetData($lAgentArray[$i], 'Allegiance') <> 6 Then ContinueLoop + If DllStructGetData($lAgentArray[$i], 'HP') <= 0 Then ContinueLoop + If BitAND(DllStructGetData($lAgentArray[$i], 'Effects'), 0x0010) > 0 Then ContinueLoop + + $lDistance = (DllStructGetData($aAgent, 'X') - DllStructGetData($lAgentArray[$i], 'X')) ^ 2 + (DllStructGetData($aAgent, 'Y') - DllStructGetData($lAgentArray[$i], 'Y')) ^ 2 + If $lDistance < $lNearestDistance Then + If DllStructGetData($lAgentArray[$i], 'ID') == $lID Then ContinueLoop + $lNearestAgent = $lAgentArray[$i] + $lNearestDistance = $lDistance + EndIf + Next + + SetExtended(Sqrt($lNearestDistance)) + Return $lNearestAgent +EndFunc ;==>GetNearestNPCToAgent + +;~ Description: Returns the nearest NPC to a set of coordinates. +Func GetNearestNPCToCoords($aX, $aY) + Local $lNearestAgent, $lNearestDistance = 100000000 + Local $lDistance + Local $lAgentArray = GetAgentArray(0xDB) + + For $i = 1 To $lAgentArray[0] + If DllStructGetData($lAgentArray[$i], 'Allegiance') <> 6 Then ContinueLoop + If DllStructGetData($lAgentArray[$i], 'HP') <= 0 Then ContinueLoop + If BitAND(DllStructGetData($lAgentArray[$i], 'Effects'), 0x0010) > 0 Then ContinueLoop + + $lDistance = ($aX - DllStructGetData($lAgentArray[$i], 'X')) ^ 2 + ($aY - DllStructGetData($lAgentArray[$i], 'Y')) ^ 2 + + If $lDistance < $lNearestDistance Then + $lNearestAgent = $lAgentArray[$i] + $lNearestDistance = $lDistance + EndIf + Next + + SetExtended(Sqrt($lNearestDistance)) + Return $lNearestAgent +EndFunc ;==>GetNearestNPCToCoords + +;~ Description: Returns the nearest item to an agent. +Func GetNearestItemToAgent($aAgent = -2, $aCanPickUp = True) + Local $lNearestAgent, $lNearestDistance = 100000000 + Local $lDistance + Local $lAgentArray = GetAgentArray(0x400) + + If Not IsDllStruct($aAgent) Then $aAgent = GetAgentByID($aAgent) + + Local $lID = DllStructGetData($aAgent, 'ID') + + For $i = 1 To $lAgentArray[0] + + If $aCanPickUp And Not GetCanPickUp($lAgentArray[$i]) Then ContinueLoop + $lDistance = (DllStructGetData($aAgent, 'X') - DllStructGetData($lAgentArray[$i], 'X')) ^ 2 + (DllStructGetData($aAgent, 'Y') - DllStructGetData($lAgentArray[$i], 'Y')) ^ 2 + If $lDistance < $lNearestDistance Then + If DllStructGetData($lAgentArray[$i], 'ID') == $lID Then ContinueLoop + $lNearestAgent = $lAgentArray[$i] + $lNearestDistance = $lDistance + EndIf + Next + + SetExtended(Sqrt($lNearestDistance)) + Return $lNearestAgent +EndFunc ;==>GetNearestItemToAgent + +;~ Description: Returns array of party members +Func GetParty() + Local $lReturnArray[1] = [0] + Local $lAgentArray = GetAgentArray(0xDB) + For $i = 1 To $lAgentArray[0] + If DllStructGetData($lAgentArray[$i], 'Allegiance') == 1 Then + If BitAND(DllStructGetData($lAgentArray[$i], 'TypeMap'), 131072) Then ; An agent who's health can be viewed through the party, minion, or pet menus. + $lReturnArray[0] += 1 + ReDim $lReturnArray[$lReturnArray[0] + 1] + $lReturnArray[$lReturnArray[0]] = $lAgentArray[$i] + EndIf + EndIf + Next + Return $lReturnArray +EndFunc ;==>GetParty + +; Returns number of party members, works in explorable only +Func GetPartySize_() + Return UBound(GetParty()) +EndFunc ;==>GetPartySize + +;~ Description: Returns array of Enemy members +Func GetEnemyParty() + Local $lReturnArray[1] = [0] + Local $lAgentArray = GetAgentArray(0xDB) + For $i = 1 To $lAgentArray[0] + If BitAND(DllStructGetData($lAgentArray[$i], 'TypeMap'), 131072) Then ContinueLoop + If DllStructGetData($lAgentArray[$i], 'Allegiance') == 3 Then + $lReturnArray[0] += 1 + ReDim $lReturnArray[$lReturnArray[0] + 1] + $lReturnArray[$lReturnArray[0]] = $lAgentArray[$i] + EndIf + Next + Return $lReturnArray +EndFunc ;==>GetEnemyParty + +; Returns agent of requested player number in party +Func GetPlayerByPlayerNumber($PlayerNumber) + Local $lReturnArray[1] = [0] + Local $lAgentArray = GetAgentArray(0xDB) + For $i = 1 To $lAgentArray[0] + If DllStructGetData($lAgentArray[$i], 'Allegiance') == 1 Then + If BitAND(DllStructGetData($lAgentArray[$i], 'TypeMap'), 131072) Then + If DllStructGetData($lAgentArray[$i], 'PlayerNumber') == $PlayerNumber Then + Return $lAgentArray[$i] + EndIf + EndIf + EndIf + Next + Return 0 +EndFunc ;==>GetPlayerByPlayerNumber + +;~ Description: Updates all the information you need for combat. +Func UpdateWorld_($aRange = 1350) + Local $LocationCount = 0 + $aRange = $aRange ^ 2 + $mSelfID = GetMyID() + $mSelf = GetAgentByID($mSelfID) + If GetIsDead($mSelf) Then Return False + If GetMapLoading() <> $INSTANCETYPE_EXPLORABLE Then Return True + $mEnergy = DllStructGetData($mSelf, 'EnergyPercent') * DllStructGetData($mSelf, 'MaxEnergy') + $mEffects = GetEffect() + + $mDazed = False + $mBlind = False + $mSkillHardCounter = False + $mSkillSoftCounter = 0 + $mAttackHardCounter = False + $mAttackSoftCounter = 0 + $mAllySpellHardCounter = False + $mEnemySpellHardCounter = False + $mSpellSoftCounter = 0 + $mBlocking = False + + For $i = 1 To $mEffects[0] + Switch DllStructGetData($mEffects[$i], 'SkillID') + Case 485 ; Dazed + $mDazed = True + Case 479 ; Blind + $mBlind = True + Case 30, 764 ; Diversion, Wail of Doom + $mSkillHardCounter = True + Case 51, 127 ; Shame, Mark of Subversion + $mAllySpellHardCounter = True + Case 46, 979, 3191 ; Guilt, Mistrust + $mEnemySpellHardCounter = True + Case 878, 3234 ; Visions of Regret + $mSkillSoftCounter += 1 + $mSpellSoftCounter += 1 + $mAttackSoftCounter += 1 + Case 28, 128 ; Backfire, Soul Leech + $mSpellSoftCounter += 1 + Case 47, 43, 1004, 2056, 3195 ; Ineptitude, Clumsiness, Yuletide, Wandering Eye + $mAttackHardCounter = True + Case 123, 26, 3151, 121, 103, 66 ; Insidious Parasite, Empathy, Spiteful Spirit, Price of Failure, Spirit Shackles + $mAttackSoftCounter += 1 + ; Auspicious Parry, Bonetti's Defense, Deadly Riposte, Defensive Stance, Deflect Arrows, + ; Disciplined Stance, Frenzied Defense, Gladiator's Defense, Riposte, Shield Bash, Shield Stance, + ; Soldier's Stance, Wary Stance, Dodge, Dryder's Defenses, Escape, Lightning Reflexes + Case 905,380,388,345,373,376,1700,372,387,363,378,1698,377,425,452,448,453 + $mBlocking = True + ; Critical Defenses, Flashing Blades, Weapon of Warding, Burning Shield, Attacker's Insight, + ; Shield of Force, Mental Block, Protector's Defense, Ward Against Melee, Mirage Cloak, Natural Stride + ; Whirling Defense, Zojun's Haste, Distortion, Magnetic Aura, Sliver Armor, Swirling Aura, + Case 1027,1042,793,2208,1764,2201,2417,810,176,1500,1727,450,1196,11,168,1084,233 + $mBlocking = True + EndSwitch + Next + + Local $lAgent + Local $lTeam = DllStructGetData($mSelf, 'Team') + Local $lX = XLocation() + Local $lY = YLocation() + Local $lHP + Local $lDistance + Local $lModel + Local $lCountAOE = 1 + + Dim $mTeam[1] = [0] + Dim $mTeamOthers[1] = [0] + Dim $mTeamDead[1] = [0] + Dim $mEnemies[1] = [0] + Dim $mEnemiesRange[1] = [0] + Dim $mEnemiesSpellRange[1] = [0] + Dim $mEnemyCorpesSpellRange[1] = [0] + Dim $mSpirits[1] = [0] + Dim $mPets[1] = [0] + Dim $mMinions[1] = [0] + + $mHighestAlly = $mSelf + $mHighestAllyHP = 2 + $mLowestAlly = $mSelf + $mLowestAllyHP = 2 + $mLowestOtherAlly = 0 + $mLowestOtherAllyHP = 2 + $mLowestEnemy = 0 + $mLowestEnemyHP = 2 + $mClosestEnemy = 0 + $mClosestEnemyDist = 25000000 + $mAverageTeamHP = 0 + $BestAOETarget = 0 + $HexedAlly = 0 + $ConditionedAlly = 0 + $HexedEnemy = 0 + $EnemyNonHexed = 0 + $EnemyConditioned = 0 + $EnemyNonConditioned = 0 + $EnemyNonEnchanted = 0 + $EnemyEnchanted = 0 + $EnemyHealer = 0 + $LowHPEnemy = 0 + $NumberOfFoesInAttackRange = 0 + $NumberOfFoesInSpellRange = 0 + + Local $lAgentArray = GetAgentArray(0xDB) + For $i = 1 To $lAgentArray[0] + $lAgent = $lAgentArray[$i] + $lHP = DllStructGetData($lAgent, 'HP') + $lDistance = ($lX - XLocation($lAgent)) ^ 2 + ($lY - YLocation($lAgent)) ^ 2 + Switch DllStructGetData($lAgent, 'Allegiance') + Case 1, 6 ;Allies + If Not BitAND(DllStructGetData($lAgent, 'Typemap'), 131072) Then ContinueLoop ;Double check it's not a summon + If Not BitAND(DllStructGetData($lAgent, 'Effects'), 0x0010) Then +;~ $mTeam[0] += 1 +;~ ReDim $mTeam[$mTeam[0] + 1] +;~ $mTeam[$mTeam[0]] = $lAgent + + $mAverageTeamHP += $lHP + +;~ Lowest Ally + If $lHP < $mLowestAllyHP Then + $mLowestAlly = $lAgent + $mLowestAllyHP = $lHP + ElseIf $lHP = $mLowestAllyHP Then + If $lDistance < ($lX - DllStructGetData($mLowestAlly, 'X')) ^ 2 + ($lY - DllStructGetData($mLowestAlly, 'Y')) ^ 2 Then + $mLowestAlly = $lAgent + $mLowestAllyHP = $lHP + EndIf + ElseIf $lHP > $mHighestAllyHP Then ; Highest Ally + $mHighestAlly = $lAgent + $mHighestAllyHP = $lHP + EndIf + + If GetHasHex($lAgent) == True Then $HexedAlly = $lAgent + If GetHasCondition($lAgent) == True Then $ConditionedAlly = $lAgent + +;~ Other Allies + If $i <> $mSelfID Then + $mTeamOthers[0] += 1 + ReDim $mTeamOthers[$mTeamOthers[0] + 1] + $mTeamOthers[$mTeamOthers[0]] = $lAgent + +;~ Lowest Other Ally + If $lHP < $mLowestOtherAllyHP Then + $mLowestOtherAlly = $lAgent + $mLowestOtherAllyHP = $lHP + ElseIf $lHP = $mLowestOtherAllyHP Then + If $lDistance < ($lX - DllStructGetData($mLowestOtherAlly, 'X')) ^ 2 + ($lY - DllStructGetData($mLowestOtherAlly, 'Y')) ^ 2 Then + $mLowestOtherAlly = $lAgent + $mLowestOtherAllyHP = $lHP + EndIf + EndIf + EndIf + Else +;~ Dead Allies + $mTeamDead[0] += 1 + ReDim $mTeamDead[$mTeamDead[0] + 1] + $mTeamDead[$mTeamDead[0]] = $lAgent + EndIf + Case 3 ;Enemies + If BitAND(DllStructGetData($lAgent, 'Effects'), 0x0010) Then ; Dead Enemies +;~ ;Dead Enemies in spell range +;~ If $lDistance <= 1537600 Then ;1240 +;~ $mEnemyCorpesSpellRange[0] += 1 +;~ ReDim $mEnemyCorpesSpellRange[$mEnemyCorpesSpellRange[0] + 1] +;~ $mEnemyCorpesSpellRange[$mEnemyCorpesSpellRange[0]] = $lAgent +;~ EndIf + Else + +;~ ModelID BlackList + $lModel = DllStructGetData($lAgent, 'PlayerNumber') +;~ Switch $lModel +;~ Case $BoneHorrorID To $BoneHorrorID + 2, $BoneHorrorID + 644 To $BoneHorrorID + 658, $BoneHorrorID + 1979 To $BoneHorrorID + 2009, $BoneHorrorID + 3483 To $BoneHorrorID + 3493, $BoneHorrorID + 3623 To $BoneHorrorID + 3624 +;~ ContinueLoop +;~ EndSwitch + +;~ $mEnemies[0] += 1 +;~ ReDim $mEnemies[$mEnemies[0] + 1] +;~ $mEnemies[$mEnemies[0]] = $lAgent + +;~ Enemies in waypoint range + If $lDistance <= $aRange Then + $NumberOfFoesInAttackRange += 1 +;~ $mEnemiesRange[0] += 1 +;~ ReDim $mEnemiesRange[$mEnemiesRange[0] + 1] +;~ $mEnemiesRange[$mEnemiesRange[0]] = $lAgent + +;~ Lowest Enemy + If $lHP < $mLowestEnemyHP Then + $mLowestEnemy = $lAgent + $mLowestEnemyHP = $lHP + ElseIf $lHP = $mLowestEnemyHP Then + If $lDistance < ($lX - DllStructGetData($mLowestEnemy, 'X')) ^ 2 + ($lY - DllStructGetData($mLowestEnemy, 'Y')) ^ 2 Then + $mLowestEnemy = $lAgent + $mLowestEnemyHP = $lHP + EndIf + EndIf + + If GetNumberOfFoesInRangeOfAgent($lAgent, 256) > $lCountAOE Then + $BestAOETarget = $lAgent + $lCountAOE += 1 + EndIf + + If GetIsBoss($lAgent) == True Then + $BestAOETarget = $lAgent + $lCountAOE += 5 + EndIf + + If GetHasHex($lAgent) == True Then + $EnemyHexed = $lAgent + Else + $EnemyNonHexed = $lAgent + EndIf + If GetHasCondition($lAgent) == True Then + $EnemyConditioned = $lAgent + Else + $EnemyNonConditioned = $lAgent + EndIf + If GetIsHealer($lAgent) Then $EnemyHealer = $lAgent + + If GetIsEnchanted($lAgent) Then + $EnemyNonEnchanted = $lAgent + Else + $EnemyEnchanted = $lAgent + EndIf + + +;~ Closest Enemy +;~ If $lDistance < $mClosestEnemyDist Then +;~ $mClosestEnemyDist = $lDistance +;~ $mClosestEnemy = $lAgent +;~ $mLowestEnemy = $lAgent +;~ EndIf + EndIf + +;~ Enemies in spell range + If $lDistance <= 1440000 Then ;1200 + $NumberOfFoesInSpellRange += 1 + If DllStructGetData($lAgent, 'HP') * DllStructGetData($lAgent, 'MaxHP') < 0.5 Then + $LowHPEnemy = $lAgent + EndIf +;~ $mEnemiesSpellRange[0] += 1 +;~ ReDim $mEnemiesSpellRange[$mEnemiesSpellRange[0] + 1] +;~ $mEnemiesSpellRange[$mEnemiesSpellRange[0]] = $lAgent + EndIf + EndIf + Case 4 ;Allied Pets/Spirits + If Not BitAND(DllStructGetData($lAgent, 'Typemap'), 131072) Then ContinueLoop + If BitAND(DllStructGetData($lAgent, 'Effects'), 0x0010) Then ContinueLoop + If BitAND(DllStructGetData($lAgent, 'Typemap'), 262144) Then + $mSpirits[0] += 1 + ReDim $mSpirits[$mSpirits[0] + 1] + $mSpirits[$mSpirits[0]] = $lAgent +;~ Else +;~ $mPets[0] += 1 +;~ ReDim $mPets[$mPets[0] + 1] +;~ $mPets[$mPets[0]] = $lAgent + EndIf + Case 5 ;Allied Minions + If Not BitAND(DllStructGetData($lAgent, 'Typemap'), 131072) Then ContinueLoop + If BitAND(DllStructGetData($lAgent, 'Effects'), 0x0010) Then ContinueLoop + $mMinions[0] += 1 + ReDim $mMinions[$mMinions[0] + 1] + $mMinions[$mMinions[0]] = $lAgent + Case Else + EndSwitch + Next + $mClosestEnemyDist = Sqrt($mClosestEnemyDist) + $mAverageTeamHP /= $mTeam[0] + If $NumberOfFoesInSpellRange <= 0 Then $EnemyAttacker = 0 + +EndFunc ;==>UpdateWorld + + +;~ Description: Returns buff struct. +Func GetBuffByIndex($aBuffNumber, $aHeroNumber = 0) + Local $lBuffStruct = DllStructCreate('long SkillId;byte unknown1[4];long BuffId;long TargetId') + Local $lOffset[4] + $lOffset[0] = 0 + $lOffset[1] = 0x18 + $lOffset[2] = 0x2C + $lOffset[3] = 0x4AC + Local $lCount = MemoryReadPtr($mBasePointer, $lOffset) + ReDim $lOffset[5] + $lOffset[3] = 0x4A4 + Local $lBuffer + For $i = 0 To $lCount[1] - 1 + $lOffset[4] = 0x24 * $i + $lBuffer = MemoryReadPtr($mBasePointer, $lOffset) + If $lBuffer[1] == GetHeroID($aHeroNumber) Then + $lOffset[4] = 0x4 + 0x24 * $i + ReDim $lOffset[6] + $lOffset[5] = 0 + 0x10 * ($aBuffNumber - 1) + $lBuffStructAddress = MemoryReadPtr($mBasePointer, $lOffset) + DllCall($mKernelHandle, 'int', 'ReadProcessMemory', 'int', $mGWProcHandle, 'int', $lBuffStructAddress[0], 'ptr', DllStructGetPtr($lBuffStruct), 'int', DllStructGetSize($lBuffStruct), 'int', '') + Return $lBuffStruct + EndIf + Next + Return 0 +EndFunc ;==>GetBuffByIndex + +;~ Description: Returns skillbar struct. +Func GetSkillbar($aHeroNumber = 0) + Local $lSkillbarStruct = DllStructCreate('long AgentId;long AdrenalineA1;long AdrenalineB1;dword Recharge1;dword Id1;dword Event1;long AdrenalineA2;long AdrenalineB2;dword Recharge2;dword Id2;dword Event2;long AdrenalineA3;long AdrenalineB3;dword Recharge3;dword Id3;dword Event3;long AdrenalineA4;long AdrenalineB4;dword Recharge4;dword Id4;dword Event4;long AdrenalineA5;long AdrenalineB5;dword Recharge5;dword Id5;dword Event5;long AdrenalineA6;long AdrenalineB6;dword Recharge6;dword Id6;dword Event6;long AdrenalineA7;long AdrenalineB7;dword Recharge7;dword Id7;dword Event7;long AdrenalineA8;long AdrenalineB8;dword Recharge8;dword Id8;dword Event8;dword disabled;byte unknown[8];dword Casting') + Local $lOffset[5] + $lOffset[0] = 0 + $lOffset[1] = 0x18 + $lOffset[2] = 0x2C + $lOffset[3] = 0x68C + For $i = 0 To GetHeroCount() + $lOffset[4] = $i * 0xBC + Local $lSkillbarStructAddress = MemoryReadPtr($mBasePointer, $lOffset) + DllCall($mKernelHandle, 'int', 'ReadProcessMemory', 'int', $mGWProcHandle, 'int', $lSkillbarStructAddress[0], 'ptr', DllStructGetPtr($lSkillbarStruct), 'int', DllStructGetSize($lSkillbarStruct), 'int', '') + If DllStructGetData($lSkillbarStruct, 'AgentId') == GetHeroID($aHeroNumber) Then Return $lSkillbarStruct + Next + EndFunc ;==>GetSkillbar + +;~ Description: Returns skill struct. +Func GetSkillByID($aSkillID) + Local $lSkillStruct = DllStructCreate('long ID;byte Unknown1[4];long campaign;long Type;long Special;long ComboReq;long Effect1;long Condition;long Effect2;long WeaponReq;byte Profession;byte Attribute;byte Unknown2[2];long PvPID;byte Combo;byte Target;byte unknown3;byte EquipType;byte Unknown4a;byte EnergyCost;byte HealthCost;byte Unknown4c;dword Adrenaline;float Activation;float Aftercast;long Duration0;long Duration15;long Recharge;byte Unknown5[12];long Scale0;long Scale15;long BonusScale0;long BonusScale15;float AoERange;float ConstEffect;byte unknown6[44]') + Local $lSkillStructAddress = $mSkillBase + 160 * $aSkillID + DllCall($mKernelHandle, 'int', 'ReadProcessMemory', 'int', $mGWProcHandle, 'int', $lSkillStructAddress, 'ptr', DllStructGetPtr($lSkillStruct), 'int', DllStructGetSize($lSkillStruct), 'int', '') + Return $lSkillStruct +EndFunc ;==>GetSkillByID + +;~ Description: Returns effect struct or array of effects. +Func GetEffect($aSkillID = 0, $aHeroNumber = 0) + Local $lEffectCount, $lEffectStructAddress + Local $lReturnArray[1] = [0] + + Local $lOffset[4] + $lOffset[0] = 0 + $lOffset[1] = 0x18 + $lOffset[2] = 0x2C + $lOffset[3] = 0x4AC + Local $lCount = MemoryReadPtr($mBasePointer, $lOffset) + ReDim $lOffset[5] + $lOffset[3] = 0x4A4 + Local $lBuffer + + For $i = 0 To $lCount[1] - 1 + $lOffset[4] = 0x24 * $i + $lBuffer = MemoryReadPtr($mBasePointer, $lOffset) + If $lBuffer[1] == GetHeroID($aHeroNumber) Then + $lOffset[4] = 0x1C + 0x24 * $i + $lEffectCount = MemoryReadPtr($mBasePointer, $lOffset) + ReDim $lOffset[6] + $lOffset[4] = 0x14 + 0x24 * $i + $lOffset[5] = 0 + $lEffectStructAddress = MemoryReadPtr($mBasePointer, $lOffset) + + If $aSkillID = 0 Then + ReDim $lReturnArray[$lEffectCount[1] + 1] + $lReturnArray[0] = $lEffectCount[1] + + For $i = 0 To $lEffectCount[1] - 1 + $lReturnArray[$i + 1] = DllStructCreate('long SkillId;long EffectType;long EffectId;long AgentId;float Duration;long TimeStamp') + $lEffectStructAddress[1] = $lEffectStructAddress[0] + 24 * $i + DllCall($mKernelHandle, 'int', 'ReadProcessMemory', 'int', $mGWProcHandle, 'int', $lEffectStructAddress[1], 'ptr', DllStructGetPtr($lReturnArray[$i + 1]), 'int', 24, 'int', '') + Next + + ExitLoop + Else + Local $lReturn = DllStructCreate('long SkillId;long EffectType;long EffectId;long AgentId;float Duration;long TimeStamp') + + For $i = 0 To $lEffectCount[1] - 1 + DllCall($mKernelHandle, 'int', 'ReadProcessMemory', 'int', $mGWProcHandle, 'int', $lEffectStructAddress[0] + 24 * $i, 'ptr', DllStructGetPtr($lReturn), 'int', 24, 'int', '') + If DllStructGetData($lReturn, 'SkillID') = $aSkillID Then Return $lReturn + Next + EndIf + EndIf + Next + Return $lReturnArray +EndFunc ;==>GetEffect + +;~ Description: Returns quest struct. +Func GetQuestByID($aQuestID = 0) + Local $lQuestStruct = DllStructCreate('long id;long LogState;byte unknown1[12];long MapFrom;float X;float Y;byte unknown2[8];long MapTo') + Local $lQuestPtr, $lQuestLogSize, $lQuestID + Local $lOffset[4] = [0, 0x18, 0x2C, 0x4D0] + + $lQuestLogSize = MemoryReadPtr($mBasePointer, $lOffset) + + If $aQuestID = 0 Then + $lOffset[1] = 0x18 + $lOffset[2] = 0x2C + $lOffset[3] = 0x4C4 + $lQuestID = MemoryReadPtr($mBasePointer, $lOffset) + $lQuestID = $lQuestID[1] + Else + $lQuestID = $aQuestID + EndIf + + Local $lOffset[5] = [0, 0x18, 0x2C, 0x4C8, 0] + For $i = 0 To $lQuestLogSize[1] + $lOffset[4] = 0x34 * $i + $lQuestPtr = MemoryReadPtr($mBasePointer, $lOffset) + DllCall($mKernelHandle, 'int', 'ReadProcessMemory', 'int', $mGWProcHandle, 'int', $lQuestPtr[0], 'ptr', DllStructGetPtr($lQuestStruct), 'int', DllStructGetSize($lQuestStruct), 'int', '') + If DllStructGetData($lQuestStruct, 'ID') = $lQuestID Then Return $lQuestStruct + Next +EndFunc ;==>GetQuestByID + +Func FindItemToSalvage() + Local $lItemInfo + Local $ItemToSalvage[2] = [0, 0] + + For $i = 1 To 4 + For $j = 0 To DllStructGetData(GetBag($i), 'Slots') - 1 + $lItemInfo = GetItemBySlot($i, $j) + If GetIsIDed($lItemInfo) == False Then + $ItemToSalvage[0] = $i + $ItemToSalvage[1] = $j + Return $ItemToSalvage + EndIf + Next + Next + Return $ItemToSalvage +EndFunc ;==>FindItemToSalvage + + + + diff --git a/gwApi/h_h.au3 b/gwApi/h_h.au3 index dc8eebf..aa59139 100644 --- a/gwApi/h_h.au3 +++ b/gwApi/h_h.au3 @@ -1,210 +1,211 @@ -#include-once - -#Region PartyCommands -;~ Description: Adds a hero to the party. -Func AddHero($aHeroId) - Return SendPacket(0x8, 0x17, $aHeroId) -EndFunc ;==>AddHero - -;~ Description: Kicks a hero from the party. -Func KickHero($aHeroId) - Return SendPacket(0x8, 0x18, $aHeroId) -EndFunc ;==>KickHero - -;~ Description: Kicks all heroes from the party. -Func KickAllHeroes() - Return SendPacket(0x8, 0x18, 0x26) -EndFunc ;==>KickAllHeroes - -;~ Description: Add a henchman to the party. -Func AddNpc($aNpcId) - Return SendPacket(0x8, 0x99, $aNpcId) -EndFunc ;==>AddNpc - -;~ Description: Kick a henchman from the party. -Func KickNpc($aNpcId) - Return SendPacket(0x8, 0xA2, $aNpcId) -EndFunc ;==>KickNpc - -;~ Description: Place a hero's position flag. -Func CommandHero($aHeroNumber, $aX, $aY, $aHeroID = GetHeroID($aHeroNumber)) - Return SendPacket(0x14, 0x13, $aHeroID, FloatToInt($aX), FloatToInt($aY), 0) -EndFunc ;==>CommandHero - -;~ Description: Clear the position flag from a hero. -Func CancelHero($aHeroNumber, $aAgentID = GetHeroID($aHeroNumber)) - Return SendPacket(0x14, 0x13, $aAgentID, 0x7F800000, 0x7F800000, 0) -EndFunc ;==>CancelHero - -;~ Description: Place the full-party position flag. -Func CommandAll($aX, $aY) - Return SendPacket(0x10, 0x14, FloatToInt($aX), FloatToInt($aY), 0) -EndFunc ;==>CommandAll - -;~ Description: Clear the full-party position flag. -Func CancelAll() - Return SendPacket(0x10, 0x14, 0x7F800000, 0x7F800000, 0) -EndFunc ;==>CancelAll - -;~ Description: Clear all hero flags. -;~ Full-party position flag and hero's 1-3 position flags. -Func ClearPartyCommands() - Return PerformAction(0xDB, 0x18) -EndFunc ;==>ClearPartyCommands - -;~ Description: Lock a hero onto a target. -Func LockHeroTarget($aHeroNumber, $aAgentID = 0, $aHeroID = GetHeroID($aHeroNumber)) ;$aAgentID=0 Cancels Lock - Return SendPacket(0xC, 0xF, $aHeroID, $aAgentID) -EndFunc ;==>LockHeroTarget - -;~ Description: Change a hero's aggression level. -Func SetHeroAggression($aHeroNumber, $aAggression, $aHeroID = GetHeroID($aHeroNumber)) ;0=Fight, 1=Guard, 2=Avoid - Return SendPacket(0xC, 0xE, $aHeroID, $aAggression) -EndFunc ;==>SetHeroAggression -#EndRegion - -#Region Hero Skillbar Interaction -;~ Description: Disable a skill on a hero's skill bar. -Func DisableHeroSkillSlot($aHeroNumber, $aSkillSlot, $aPtr = GetSkillbarPtr($aHeroNumber), $aHeroID = GetHeroID($aHeroNumber)) - Local $lDeadlock = TimerInit() - While Not GetIsHeroSkillSlotDisabled($aHeroNumber, $aSkillSlot, $aPtr) - ChangeHeroSkillSlotState($aHeroNumber, $aSkillSlot, $aHeroID) - Sleep(500) - If TimerDiff($lDeadlock) > 5000 Then Return False - WEnd - Return True -EndFunc ;==>DisableHeroSkillSlot - -;~ Description: Enable a skill on a hero's skill bar. -Func EnableHeroSkillSlot($aHeroNumber, $aSkillSlot, $aPtr = GetSkillbarPtr($aHeroNumber), $aHeroID = GetHeroID($aHeroNumber)) - Local $lDeadlock = TimerInit() - While GetIsHeroSkillSlotDisabled($aHeroNumber, $aSkillSlot, $aPtr) - ChangeHeroSkillSlotState($aHeroNumber, $aSkillSlot, $aHeroID) - Sleep(500) - If TimerDiff($lDeadlock) > 5000 Then Return False - WEnd - Return True -EndFunc ;==>EnableHeroSkillSlot - -;~ Description: Internal use for enabling or disabling hero skills -Func ChangeHeroSkillSlotState($aHeroNumber, $aSkillSlot, $aHeroID = GetHeroID($aHeroNumber)) - Return SendPacket(0xC, 0x12, $aHeroID, $aSkillSlot - 1) -EndFunc ;==>ChangeHeroSkillSlotState - -;~ Description: Tests if a hero's skill slot is disabled. -Func GetIsHeroSkillSlotDisabled($aHeroNumber, $aSkillSlot, $aPtr = GetSkillbarPtr($aHeroNumber)) - Local $lDisabled = MemoryRead($aPtr + 164, 'dword') - If $aSkillSlot > 1 Then - Local $lBitMask = 2 ^ ($aSkillSlot - 1) - Else - Local $lBitMask = 1 - EndIf - Return BitAND($lBitMask, $lDisabled) > 0 -EndFunc ;==>GetIsHeroSkillSlotDisabled - -;~ Description: Order a hero to use a skill. -Func UseHeroSkill($aHero, $aSkillSlot, $aTarget = -2) - If IsPtr($aTarget) <> 0 Then - Local $lTargetID = MemoryRead($aTarget + 44, 'long') - ElseIf IsDllStruct($aTarget) <> 0 Then - Local $lTargetID = DllStructGetData($aTarget, 'ID') - Else - Local $lTargetID = ConvertID($aTarget) - EndIf - DllStructSetData($mUseHeroSkill, 2, GetHeroID($aHero)) - DllStructSetData($mUseHeroSkill, 3, $lTargetID) - DllStructSetData($mUseHeroSkill, 4, $aSkillSlot - 1) - Return Enqueue($mUseHeroSkillPtr, 16) -EndFunc ;==>UseHeroSkill -#EndRegion - -#Region Information -#cs -Herostruct1 -> $lOffset[5] = [0, 0x18, 0x4C, 0x54, 0x24], $mBasePointer - size: 0x18 - long: HeroID - byte[4]: unknown - long: HeroNameID - byte[8]: unknown - long: level - -Herostruct2 -> $lOffset[5] = [0, 0x18, 0x2C, 0x6BC, 0], $mBasePointer - size: 0x14 - long: HeroID - long: Primary - long: Secondary - byte[8]: unknown -#ce - -;~ Description: Returns number of heroes you control. -Func GetHeroCount() - If $HeroPtr1 = 0 Then $HeroPtr1 = MemoryRead($mBasePtr184C + 0x54, 'ptr') - Return MemoryRead($HeroPtr1 + 0x2C) -EndFunc ;==>GetHeroCount - -;~ Description: Returns agent ID of a hero. -Func GetHeroID($aHeroNumber) - If $aHeroNumber = 0 Then Return GetMyID() - If $HeroPtr1 = 0 Then $HeroPtr1 = MemoryRead($mBasePtr184C + 0x54, 'ptr') - If $HeroPtr2 = 0 Then $HeroPtr2 = MemoryRead($HeroPtr1 + 0x24, 'ptr') - Return MemoryRead($HeroPtr2 + 0x18 * ($aHeroNumber - 1)) -EndFunc ;==>GetHeroID - -;~ Description: Returns hero number by hero ID. -Func GetHeroNumberByHeroID($aHeroID) - If $aHeroID < 0 Then $aHeroID = ConvertID($aHeroID) - If $HeroPtr1 = 0 Then $HeroPtr1 = MemoryRead($mBasePtr184C + 0x54, 'ptr') - If $HeroPtr2 = 0 Then $HeroPtr2 = MemoryRead($HeroPtr1 + 0x24, 'ptr') - For $i = 1 To MemoryRead($HeroPtr1 + 0x2C) - If MemoryRead($HeroPtr2 + 0x18 * ($i - 1)) = $aHeroID Then Return $i - Next -EndFunc ;==>GetHeroNumberByHeroID - -;~ Description: Returns HeroNameID of hero in group. -Func GetHeroNameID($aHeroNumber) - If $aHeroNumber = 0 Then Return 0 - If $HeroPtr1 = 0 Then $HeroPtr1 = MemoryRead($mBasePtr184C + 0x54, 'ptr') - If $HeroPtr2 = 0 Then $HeroPtr2 = MemoryRead($HeroPtr1 + 0x24, 'ptr') - Local $lHeroNameID = MemoryRead($HeroPtr2 + 0x18 * ($aHeroNumber - 1) + 8) - If $lHeroNameID < 1 Or $lHeroNameID > 36 Then Return 0 - Return $lHeroNameID -EndFunc ;==>GetHeroNameID - -;~ Description: Returns my profession when passed 0 ; GetHeroProfession(0) -;~ Returns hero's profession ID (when it can't be found by other means) -Func GetHeroProfession($aHeroNumber, $aSecondary = False, $aHeroID = GetHeroID($aHeroNumber)) - If $HeroPtr3 = 0 Then $HeroPtr3 = MemoryRead($mBasePtr182C + 0x6BC) - Local $lTemp = 0, $lBuffer, $lExtended - For $i = 0 To GetHeroCount() - $lBuffer = MemoryRead($HeroPtr3 + $lTemp) - If $lBuffer = $aHeroID Then - $lTemp += 4 - If Not $aSecondary Then - Return MemoryRead($HeroPtr3 + $lTemp) - Else - $lExtended = MemoryRead($HeroPtr3 + $lTemp) - $lTemp += 4 - Return SetExtended($lExtended, MemoryRead($HeroPtr3 + $lTemp)) - EndIf - EndIf - $lTemp += 0x14 - Next -EndFunc ;==>GetHeroProfession - -;~ Description: Returns all hero equipment pointers in an array. -Func GetHeroEquipBagPtrArray() - If $HeroPtr4 = 0 Then $HeroPtr4 = MemoryRead($mBasePtr1840 + 0x24, 'ptr') - Local $lCount = 0, $lTemp - Local $lHeroCount = GetHeroCount() - Local $lReturn[$lHeroCount + 1] - For $i = 0 To 100 - $lTemp = MemoryRead($HeroPtr4 + 0x34 + $i * 4, 'ptr') - If MemoryRead(MemoryRead($lTemp + 20, 'ptr') + 68, 'ptr') <> $lTemp Then ContinueLoop - $lCount += 1 - $lReturn[$lCount] = $lTemp - If $lCount = $lHeroCount Then ExitLoop - Next - $lReturn[0] = $lCount - Return $lReturn -EndFunc ;==>GetHeroEquipBagPtrArray -#EndRegion \ No newline at end of file + +#include-once + +#Region PartyCommands +;~ Description: Adds a hero to the party. +Func AddHero($aHeroId) + Return SendPacket(0x8, $CtoGS_MSG_AddHero, $aHeroId) +EndFunc ;==>AddHero + +;~ Description: Kicks a hero from the party. +Func KickHero($aHeroId) + Return SendPacket(0x8, $CtoGS_MSG_KickHero, $aHeroId) +EndFunc ;==>KickHero + +;~ Description: Kicks all heroes from the party. +Func KickAllHeroes() + Return SendPacket(0x8, $CtoGS_MSG_KickHero, 0x26) +EndFunc ;==>KickAllHeroes + +;~ Description: Add a henchman to the party. +Func AddNpc($aNpcId) + Return SendPacket(0x8, $CtoGS_MSG_AddNpc, $aNpcId) +EndFunc ;==>AddNpc + +;~ Description: Kick a henchman from the party. +Func KickNpc($aNpcId) + Return SendPacket(0x8, $CtoGS_MSG_KickNpc, $aNpcId) +EndFunc ;==>KickNpc + +;~ Description: Place a hero's position flag. +Func CommandHero($aHeroNumber, $aX, $aY, $aHeroID = GetHeroID($aHeroNumber)) + Return SendPacket(0x14, $CtoGS_MSG_CommandHero, $aHeroID, FloatToInt($aX), FloatToInt($aY), 0) +EndFunc ;==>CommandHero + +;~ Description: Clear the position flag from a hero. +Func CancelHero($aHeroNumber, $aAgentID = GetHeroID($aHeroNumber)) + Return SendPacket(0x14, $CtoGS_MSG_CommandHero, $aAgentID, 0x7F800000, 0x7F800000, 0) +EndFunc ;==>CancelHero + +;~ Description: Place the full-party position flag. +Func CommandAll($aX, $aY) + Return SendPacket(0x10, $CtoGS_MSG_CommandAll, FloatToInt($aX), FloatToInt($aY), 0) +EndFunc ;==>CommandAll + +;~ Description: Clear the full-party position flag. +Func CancelAll() + Return SendPacket(0x10, $CtoGS_MSG_CommandAll, 0x7F800000, 0x7F800000, 0) +EndFunc ;==>CancelAll + +;~ Description: Clear all hero flags. +;~ Full-party position flag and hero's 1-3 position flags. +Func ClearPartyCommands() + Return PerformAction(0xDB, 0x18) +EndFunc ;==>ClearPartyCommands + +;~ Description: Lock a hero onto a target. +Func LockHeroTarget($aHeroNumber, $aAgentID = 0, $aHeroID = GetHeroID($aHeroNumber)) ;$aAgentID=0 Cancels Lock + Return SendPacket(0xC, $CtoGS_MSG_LockHeroTarget, $aHeroID, $aAgentID) +EndFunc ;==>LockHeroTarget + +;~ Description: Change a hero's aggression level. +Func SetHeroAggression($aHeroNumber, $aAggression, $aHeroID = GetHeroID($aHeroNumber)) ;0=Fight, 1=Guard, 2=Avoid + Return SendPacket(0xC, $CtoGS_MSG_SetHeroAggression, $aHeroID, $aAggression) +EndFunc ;==>SetHeroAggression +#EndRegion + +#Region Hero Skillbar Interaction +;~ Description: Disable a skill on a hero's skill bar. +Func DisableHeroSkillSlot($aHeroNumber, $aSkillSlot, $aPtr = GetSkillbarPtr($aHeroNumber), $aHeroID = GetHeroID($aHeroNumber)) + Local $lDeadlock = TimerInit() + While Not GetIsHeroSkillSlotDisabled($aHeroNumber, $aSkillSlot, $aPtr) + ChangeHeroSkillSlotState($aHeroNumber, $aSkillSlot, $aHeroID) + Sleep(500) + If TimerDiff($lDeadlock) > 5000 Then Return False + WEnd + Return True +EndFunc ;==>DisableHeroSkillSlot + +;~ Description: Enable a skill on a hero's skill bar. +Func EnableHeroSkillSlot($aHeroNumber, $aSkillSlot, $aPtr = GetSkillbarPtr($aHeroNumber), $aHeroID = GetHeroID($aHeroNumber)) + Local $lDeadlock = TimerInit() + While GetIsHeroSkillSlotDisabled($aHeroNumber, $aSkillSlot, $aPtr) + ChangeHeroSkillSlotState($aHeroNumber, $aSkillSlot, $aHeroID) + Sleep(500) + If TimerDiff($lDeadlock) > 5000 Then Return False + WEnd + Return True +EndFunc ;==>EnableHeroSkillSlot + +;~ Description: Internal use for enabling or disabling hero skills +Func ChangeHeroSkillSlotState($aHeroNumber, $aSkillSlot, $aHeroID = GetHeroID($aHeroNumber)) + Return SendPacket(0xC, $CtoGS_MSG_ChangeHeroSkillSlotState, $aHeroID, $aSkillSlot - 1) +EndFunc ;==>ChangeHeroSkillSlotState + +;~ Description: Tests if a hero's skill slot is disabled. +Func GetIsHeroSkillSlotDisabled($aHeroNumber, $aSkillSlot, $aPtr = GetSkillbarPtr($aHeroNumber)) + Local $lDisabled = MemoryRead($aPtr + 164, 'dword') + If $aSkillSlot > 1 Then + Local $lBitMask = 2 ^ ($aSkillSlot - 1) + Else + Local $lBitMask = 1 + EndIf + Return BitAND($lBitMask, $lDisabled) > 0 +EndFunc ;==>GetIsHeroSkillSlotDisabled + +;~ Description: Order a hero to use a skill. +Func UseHeroSkill($aHero, $aSkillSlot, $aTarget = -2) + If IsPtr($aTarget) <> 0 Then + Local $lTargetID = MemoryRead($aTarget + 44, 'long') + ElseIf IsDllStruct($aTarget) <> 0 Then + Local $lTargetID = DllStructGetData($aTarget, 'ID') + Else + Local $lTargetID = ConvertID($aTarget) + EndIf + DllStructSetData($mUseHeroSkill, 2, GetHeroID($aHero)) + DllStructSetData($mUseHeroSkill, 3, $lTargetID) + DllStructSetData($mUseHeroSkill, 4, $aSkillSlot - 1) + Return Enqueue($mUseHeroSkillPtr, 16) +EndFunc ;==>UseHeroSkill +#EndRegion + +#Region Information +#cs +Herostruct1 -> $lOffset[5] = [0, 0x18, 0x4C, 0x54, 0x24], $mBasePointer + size: 0x18 + long: HeroID + byte[4]: unknown + long: HeroNameID + byte[8]: unknown + long: level + +Herostruct2 -> $lOffset[5] = [0, 0x18, 0x2C, 0x6BC, 0], $mBasePointer + size: 0x14 + long: HeroID + long: Primary + long: Secondary + byte[8]: unknown +#ce + +;~ Description: Returns number of heroes you control. +Func GetHeroCount() + If $HeroPtr1 = 0 Then $HeroPtr1 = MemoryRead($mBasePtr184C + 0x54, 'ptr') + Return MemoryRead($HeroPtr1 + 0x2C) +EndFunc ;==>GetHeroCount + +;~ Description: Returns agent ID of a hero. +Func GetHeroID($aHeroNumber) + If $aHeroNumber = 0 Then Return GetMyID() + If $HeroPtr1 = 0 Then $HeroPtr1 = MemoryRead($mBasePtr184C + 0x54, 'ptr') + If $HeroPtr2 = 0 Then $HeroPtr2 = MemoryRead($HeroPtr1 + 0x24, 'ptr') + Return MemoryRead($HeroPtr2 + 0x18 * ($aHeroNumber - 1)) +EndFunc ;==>GetHeroID + +;~ Description: Returns hero number by hero ID. +Func GetHeroNumberByHeroID($aHeroID) + If $aHeroID < 0 Then $aHeroID = ConvertID($aHeroID) + If $HeroPtr1 = 0 Then $HeroPtr1 = MemoryRead($mBasePtr184C + 0x54, 'ptr') + If $HeroPtr2 = 0 Then $HeroPtr2 = MemoryRead($HeroPtr1 + 0x24, 'ptr') + For $i = 1 To MemoryRead($HeroPtr1 + 0x2C) + If MemoryRead($HeroPtr2 + 0x18 * ($i - 1)) = $aHeroID Then Return $i + Next +EndFunc ;==>GetHeroNumberByHeroID + +;~ Description: Returns HeroNameID of hero in group. +Func GetHeroNameID($aHeroNumber) + If $aHeroNumber = 0 Then Return 0 + If $HeroPtr1 = 0 Then $HeroPtr1 = MemoryRead($mBasePtr184C + 0x54, 'ptr') + If $HeroPtr2 = 0 Then $HeroPtr2 = MemoryRead($HeroPtr1 + 0x24, 'ptr') + Local $lHeroNameID = MemoryRead($HeroPtr2 + 0x18 * ($aHeroNumber - 1) + 8) + If $lHeroNameID < 1 Or $lHeroNameID > 36 Then Return 0 + Return $lHeroNameID +EndFunc ;==>GetHeroNameID + +;~ Description: Returns my profession when passed 0 ; GetHeroProfession(0) +;~ Returns hero's profession ID (when it can't be found by other means) +Func GetHeroProfession($aHeroNumber, $aSecondary = False, $aHeroID = GetHeroID($aHeroNumber)) + If $HeroPtr3 = 0 Then $HeroPtr3 = MemoryRead($mBasePtr182C + 0x6BC) + Local $lTemp = 0, $lBuffer, $lExtended + For $i = 0 To GetHeroCount() + $lBuffer = MemoryRead($HeroPtr3 + $lTemp) + If $lBuffer = $aHeroID Then + $lTemp += 4 + If Not $aSecondary Then + Return MemoryRead($HeroPtr3 + $lTemp) + Else + $lExtended = MemoryRead($HeroPtr3 + $lTemp) + $lTemp += 4 + Return SetExtended($lExtended, MemoryRead($HeroPtr3 + $lTemp)) + EndIf + EndIf + $lTemp += 0x14 + Next +EndFunc ;==>GetHeroProfession + +;~ Description: Returns all hero equipment pointers in an array. +Func GetHeroEquipBagPtrArray() + If $HeroPtr4 = 0 Then $HeroPtr4 = MemoryRead($mBasePtr1840 + 0x24, 'ptr') + Local $lCount = 0, $lTemp + Local $lHeroCount = GetHeroCount() + Local $lReturn[$lHeroCount + 1] + For $i = 0 To 100 + $lTemp = MemoryRead($HeroPtr4 + 0x34 + $i * 4, 'ptr') + If MemoryRead(MemoryRead($lTemp + 20, 'ptr') + 68, 'ptr') <> $lTemp Then ContinueLoop + $lCount += 1 + $lReturn[$lCount] = $lTemp + If $lCount = $lHeroCount Then ExitLoop + Next + $lReturn[0] = $lCount + Return $lReturn +EndFunc ;==>GetHeroEquipBagPtrArray +#EndRegion diff --git a/gwApi/inventory.au3 b/gwApi/inventory.au3 index e21c4a0..efc9da4 100644 --- a/gwApi/inventory.au3 +++ b/gwApi/inventory.au3 @@ -1,1461 +1,1460 @@ - - -#Region Variables -Global $mEmptyBag = 8 -Global $mEmptySlot = 0 -Global $mStoreGold = False -Global $mStoreMaterials = True -Global $mBlackWhite = True -Global $mMatExchangeGold = 930 ; ModelID of mat that should be bought in case gold storage is full -Global $mSalvageStacks = True -Global $mDustFeatherFiber = 0 ; change to 1 to sell this group of materials -Global $mGraniteIronBone = 0 ; change to 1 to sell this group of materials -Global $mWhiteMantleEmblem = True ; change to false to sell them -Global $mWhiteMantleBadge = True ; change to false to sell them -#EndRegion - - - -;~ Description: Make sure to have enough gold on character, but not too much. -Func MinMaxGold() - $lGoldCharacter = GetGoldCharacter() - $lGoldStorage = GetGoldStorage() - $lGold = $lGoldCharacter + $lGoldStorage - OpenStorageWindow() - If $lGoldCharacter < 10000 And $lGoldStorage > 10000 Then - WithdrawGold(10000 - $lGoldCharacter) - Return 10000 - ElseIf $lGoldCharacter > 50000 And $lGold < 1000000 Then - DepositGold($lGoldCharacter - 10000) - Return 10000 - Else - Return $lGoldCharacter - EndIf -EndFunc ;==>MinMaxGold - -;~ Description: Buy Ident and Salvage Kits for inventory session. -Func BuyKits($aAmount = 40, $aExpertSalv = True) - ; identification kits - $lIDKitUses = FindIDKitUses(1, 4) - If $lIDKitUses < $aAmount Then - $lItemIDRow = GetItemRowByModelID(2989) - $lKitUses = 25 - If $lItemIDRow = 0 Then - $lItemIDRow = GetItemRowByModelID(5899) - $lKitUses = 100 - If $lItemIDRow = 0 Then Return ; no id kit - EndIf - $lBuyAmount = Ceiling(($aAmount - $lIDKITUses) / $lKitUses) - Update("Buying ID Kits: " & $lBuyAmount) - BuyIdentKit($lItemIDRow, $lBuyAmount) - Sleep(250 + GetPing()) - EndIf - ; salvage kits - $lSalvKitUses = CheapSalvageUses(1, 4) - If $lSalvKitUses < $aAmount Then - $lItemIDRow = GetItemRowByModelID(2992) - $lKitUses = 25 - If $lItemIDRow = 0 Then - $lItemIDRow = GetItemRowByModelID(2993) - $lKitUses = 10 - If $lItemIDRow = 0 Then Return - EndIf - $lBuyAmount = Ceiling(($aAmount - $lSalvKitUses) / $lKitUses) - Update("Buying Salvage Kits: " & $lBuyAmount) - BuySalvKit(False, $lItemIDRow, $lBuyAmount) - Sleep(250 + GetPing()) - EndIf - ; expert salvage kits - If $aExpertSalv Then - $lExperSalvKitUses = ExpertSalvageUses(1, 4) - If $lExperSalvKitUses < $aAmount Then - $lItemIDRow = GetItemRowByModelID(2991) - $lKitUses = 25 - If $lItemIDRow = 0 Then - $lItemIDRow = GetItemRowByModelID(5900) - $lKitUses = 100 - If $lItemIDRow = 0 Then Return - EndIf - $lBuyAmount = Ceiling(($aAmount - $lExperSalvKitUses) / $lKitUses) - Update("Buying Expert Salv Kits: " & $lBuyAmount) - BuySalvKit(True, $lItemIDRow, $lBuyAmount) - Sleep(250 + GetPing()) - EndIf - EndIf -EndFunc ;==>BuyKits - -;~ Description: Returns amount of salvage uses. -Func CheapSalvageUses($aStart = 1, $aFinish = 16) - Local $lCount = 0 - For $bag = $aStart to $aFinish - Local $lBagPtr = GetBagPtr($bag) - Local $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') - For $slot = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 - Local $lItemPtr = MemoryRead($lItemArrayPtr + 4 * ($slot), 'ptr') - If $lItemPtr = 0 Then ContinueLoop - Local $lItemMID = MemoryRead($lItemPtr + 44, 'long') - If $lItemMID = 2992 Or $lItemMID = 2993 Then $lCount += MemoryRead($lItemPtr + 36, 'short') / 2 - Next - Next - Return $lCount -EndFunc ;==>SalvageUses - -;~ Description: Buys Ident kit. -Func BuyIdentKit($aItemIDRow = 0, $aAmount = 1) - If $aItemIDRow = 0 Then - $lItemIDRow = GetItemRowByModelID(2989) - If $lItemIDRow = 0 Then - $lItemIDRow = GetItemRowByModelID(5899) - If $lItemIDRow = 0 Then Return ; no id kit - EndIf - Else - $lItemIDRow = $aItemIDRow - EndIf - $lItemPtr = GetItemPtr($lItemIDRow) - $lValue = MemoryRead($lItemPtr + 36, 'short') * 2 - DllStructSetData($mBuyItem, 2, $aAmount) - DllStructSetData($mBuyItem, 3, $lItemIDRow) - DllStructSetData($mBuyItem, 4, $lValue * $aAmount) - Enqueue($mBuyItemPtr, 16) - Return $lItemPtr -EndFunc ;==>BuyIdentKit - -;~ Description: Buys salvage kit. -Func BuySalvKit($aExpert = False, $aItemIDRow = 0, $aAmount = 1) - If $aItemIDRow = 0 Then - If $aExpert Then - $lItemIDRow = GetItemRowByModelID(2991) - If $lItemIDRow = 0 Then - $lItemIDRow = GetItemRowByModelID(5900) - If $lItemIDRow = 0 Then Return - EndIf - Else - $lItemIDRow = GetItemRowByModelID(2992) - If $lItemIDRow = 0 Then - $lItemIDRow = GetItemRowByModelID(2993) - If $lItemIDRow = 0 Then Return - EndIf - EndIf - Else - $lItemIDRow = $aItemIDRow - EndIf - $lItemPtr = GetItemPtr($lItemIDRow) - $lValue = MemoryRead($lItemPtr + 36, 'short') * 2 - DllStructSetData($mBuyItem, 2, $aAmount) - DllStructSetData($mBuyItem, 3, $lItemIDRow) - DllStructSetData($mBuyItem, 4, $aAmount * $lValue) - Enqueue($mBuyItemPtr, 16) - Return $lItemPtr -EndFunc ;==>BuySalvKit - -;~ Description: Identify all unident items in inventory. -Func Ident() - For $bag = 1 to 4 ; inventory only - $lBagPtr = GetBagPtr($bag) - If $lBagPtr = 0 Then ContinueLoop - For $slot = 1 to MemoryRead($lBagPtr + 32, 'long') - $lItemPtr = GetItemPtrBySlot($lBagPtr, $slot) - If $lItemPtr = 0 Then ContinueLoop - If GetIsUnIDed($lItemPtr) Then - Update("Identify: " & $bag & ", " & $slot) - IdentifyItem($lItemPtr) - EndIf - Next - Next -EndFunc ;==>Ident - -;~ Description: Store full stacks, unident golds and mods. -Func StoreItems() - UpdateEmptyStorageSlot($mEmptyBag, $mEmptySlot) - Update("Empty Spot: " & $mEmptyBag & ", " & $mEmptySlot) - If $mEmptySlot = 0 Then Return ; no more empty slots found - OpenStorageWindow() - For $bag = 1 To 4 ; inventory only - $lBagPtr = GetBagPtr($bag) - If $lBagPtr = 0 Then ContinueLoop ; empty bag slot - $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') - For $slot = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 - $lItemPtr = MemoryRead($lItemArrayPtr + 4 * ($slot), 'ptr') - If $lItemPtr = 0 Then ContinueLoop ; empty slot - $lItemID = MemoryRead($lItemPtr, 'long') - $lItemType = MemoryRead($lItemPtr + 32, 'byte') - $lItemQuantity = MemoryRead($lItemPtr + 75, 'byte') - If $lItemType = 11 And $lItemQuantity = 250 And $mStoreMaterials Then ; materials - Update("Store Materials: " & $bag & ", " & $slot & " -> " & $mEmptyBag & ", " & $mEmptySlot) - MoveItem($lItemID, $mEmptyBag, $mEmptySlot) - Do - Sleep(250) - Until MemoryRead($lItemArrayPtr + 4 * ($slot), 'ptr') = 0 - UpdateEmptyStorageSlot($mEmptyBag, $mEmptySlot) - If $mEmptySlot = 0 Then Return - ContinueLoop - EndIf - $lItemMID = MemoryRead($lItemPtr + 44, 'long') - If StackableItems($lItemMID) And $lItemQuantity = 250 Then ; only full stacks - Update("Store Stack: " & $bag & ", " & $slot & " -> " & $mEmptyBag & ", " & $mEmptySlot) - MoveItem($lItemID, $mEmptyBag, $mEmptySlot) - Do - Sleep(250) - Until MemoryRead($lItemArrayPtr + 4 * ($slot), 'ptr') = 0 - UpdateEmptyStorageSlot($mEmptyBag, $mEmptySlot) - If $mEmptySlot = 0 Then Return - ContinueLoop - EndIf - If Keepers($lItemMID) Then - Update("Store Keepers: " & $bag & ", " & $slot & " -> " & $mEmptyBag & ", " & $mEmptySlot) - MoveItem($lItemID, $mEmptyBag, $mEmptySlot) - Do - Sleep(250) - Until MemoryRead($lItemArrayPtr + 4 * ($slot), 'ptr') = 0 - UpdateEmptyStorageSlot($mEmptyBag, $mEmptySlot) - If $mEmptySlot = 0 Then Return ; no more empty slots - ContinueLoop - EndIf - If $mStoreGold And GetRarity($lItemPtr) = 2624 Then ; store unident golds if possible - Update("Store Golds: " & $bag & ", " & $slot & " -> " & $mEmptyBag & ", " & $mEmptySlot) - MoveItem($lItemID, $mEmptyBag, $mEmptySlot) - Do - Sleep(250) - Until MemoryRead($lItemArrayPtr + 4 * ($slot), 'ptr') = 0 - UpdateEmptyStorageSlot($mEmptyBag, $mEmptySlot) - If $mEmptySlot = 0 Then Return ; no more empty slots - ContinueLoop - EndIf - Next - Next -EndFunc ;==>StoreItems - -;~ Description: Return true of item is a stackable item. -Func StackableItems($aModelID) - Switch $aModelID - ; stackable drops - Case 460,474,476,486,504,522,525,811,819,822,835,1610,2994,19185,22751,24629,24630,24631,24632,27033,27035,27044,27046,27047,27052,35123 - Return True - ; tomes - Case 21786 to 21805 - Return True - ; alcohol - Case 910,2513,5585,6049,6366,6367,6375,15477,19171,22190,24593,28435,30855,31145,31146,35124,36682 - Return True - ; party - Case 6376,6368,6369,21809,21810,21813,29436,29543,36683,4730,15837,21490,22192,30626,30630,30638,30642,30646,30648,31020,31141,31142,31144,31172 - Return True - ; sweets - Case 15528,15479,19170,21492,21812,22269,22644,22752,28431,28432,28436,31150,35125,36681 - Return True - ; scrolls - Case 3256,3746,5594,5595,5611,21233,22279,22280 - Return True - ; DPRemoval - Case 6370,21488,21489,22191,35127,26784,28433 - Return True - ; special drops - Case 18345,21491,21833,28434,35121 - Return True - Case Else - Return False - EndSwitch -EndFunc ;==>StackableItems - -;~ Description: Returns next empty slot, start at $aBag, $aSlot. Returns 0 if there's no empty slot in this bag. -Func UpdateEmptySlot(ByRef $aBagNr, ByRef $aSlot) - If $aBagNr = 0 Then - $lBagNr = 1 - Else - $lBagNr = $aBagNr - EndIf - If $aSlot = 0 Then - $lSlot = 1 - Else - $lSlot = $aSlot - EndIf - $aBagNr = 0 - $aSlot = 0 - For $bag = $lBagNr To 4 - $lBagPtr = GetBagPtr($bag) - If $lBagPtr = 0 Then Return 0 ; no bag - For $slot = $lSlot To MemoryRead($lBagPtr + 32, 'long') - $lSlotPtr = GetItemPtrBySlot($lBagPtr, $slot) - If $lSlotPtr = 0 Then - $aBagNr = $bag - $aSlot = $slot - Return True - EndIf - Next - $lSlot = 1 - Next -EndFunc ;==>UpdateEmptySlot - -;~ Description: Returns next empty slot, start at $aBag, $aSlot. Returns 0 if there's no empty slot in this bag. -Func UpdateEmptyStorageSlot(ByRef $aBagNr, ByRef $aSlot) - If $aBagNr = 0 Then - $lBagNr = 8 - Else - $lBagNr = $aBagNr - EndIf - If $aSlot = 0 Then - $lSlot = 1 - Else - $lSlot = $aSlot - EndIf - $aBagNr = 0 - $aSlot = 0 - For $bag = $lBagNr To 16 - $lBagPtr = GetBagPtr($bag) - If $lBagPtr = 0 Then Return 0 ; no bag - For $slot = $lSlot To 20 - $lSlotPtr = GetItemPtrBySlot($lBagPtr, $slot) - If $lSlotPtr = 0 Then - $aBagNr = $bag - $aSlot = $slot - Return True - EndIf - Next - $lSlot = 1 - Next -EndFunc ;==>UpdateEmptyStorageSlot - -;~ Description: Returns true for all ModelIDs specified. -Func Keepers($aModelID) - Switch $aModelID - ; mods - Case 896,908,15554,15551,15552,894,906,897,909,893,905,6323,6331,895,907,15543,15553,15544,15555,15540,15541,15542,17059,19122,19123 - Return True - Case 5551 ; Rune of Superior Vigor - Return True - Case 460 ; White Mantle Emblem - Return $mWhiteMantleEmblem - Case 461 ; White Mantle Badge - Return $mWhiteMantleBadge - Case Else - Return False - EndSwitch -EndFunc ;==>Keepers - -;~ Description: Salvages all items in all bags. -Func SalvageBags() - ; Search for ID kit - Local $lIDKit = FindIDKitPtr(), $lMod - If $lIDKit = 0 Then - Local $lIdentify = False - Else - Local $lIDKitID = MemoryRead($lIDKit, 'long') - Local $lIdentify = True - EndIf - ; Search for expert salvage kit - Local $lExpertKit = FindExpertSalvageKit() - If $lExpertKit = 0 Then - Return - Else - $lExpertKitID = MemoryRead($lExpertKit, 'long') - EndIf - ; Search for normal salvage kit - Local $lCheapKit = FindCheapSalvageKit() - If $lCheapKit = 0 Then - Return - Else - $lCheapKitID = MemoryRead($lCheapKit, 'long') - EndIf - ; Start processing - For $bag = 1 To 4 ; inventory only - $lBagPtr = GetBagPtr($bag) - If $lBagPtr = 0 Then ContinueLoop - For $slot = 1 To MemoryRead($lBagPtr + 32, 'long') ; slots - - $lItem = GetItemPtrBySlot($lBagPtr, $slot) - If IgnoreItem($lItem) Then ContinueLoop - If MemoryRead($lItem + 32, 'byte') = 31 Then ContinueLoop ; scrolls - $lQuantity = MemoryRead($lItem + 75, 'byte') - If $lQuantity > 1 And Not $mSalvageStacks Then ContinueLoop ; dont process stacks - $ItemMID = MemoryRead($lItem + 44, 'long') ; modelID - If $ItemMID = 504 Then ContinueLoop ; Decayed Orr Emblems - If $ItemMID = 460 Or $ItemMID = 461 Then ContinueLoop ; White Mantle Emblem and Badge - If Keepers($ItemMID) Then ContinueLoop ; dont salvage keepers - $ItemRarity = GetRarity($lItem) - If $ItemRarity = 2624 And GetIsRareWeapon($lItem) Then ContinueLoop ; no salvaging rare weapons - - ; Identify item if necessary and id kit available - If $lIdentify And GetIsUnIDed($lItem) Then - If MemoryRead($lIDKit + 12, 'ptr') = 0 Then - $lIDKit = FindIDKitPtr() - If $lIDKit = 0 Then - $lIdentify = False - ContinueLoop - Else - $lIDKitID = MemoryRead($lIDKit, 'long') - EndIf - EndIf - Update("Identify: " & $bag & ", " & $slot) - IdentifyItem($lItem, $lIDKitID) - Sleep(250) - Do - Sleep(250) - Until Not GetIsUnIDed($lItem) - EndIf - ; salvage white items - If $ItemRarity = 2621 Then - For $i = 1 To $lQuantity - If MemoryRead($lCheapKit + 12, 'ptr') = 0 Then - $lCheapKit = FindCheapSalvageKit() - If $lCheapKit = 0 Then - Return -1 ; no more normal salvage kits - Else - $lCheapKitID = MemoryRead($lCheapKit, 'long') - EndIf - EndIf - Update("Salvaging (white): " & $bag & ", " & $slot) - $lQuantityOld = $lQuantity - StartSalvage($lItem, $lCheapKitID) - Local $lDeadlock = TimerInit() - Do - Sleep(50) - ;$lQuantity = MemoryRead($lItem + 75, 'byte') - Until $SalvageState ;$lQuantity <> $lQuantityOld Or MemoryRead($lItem + 12, 'ptr') = 0 Or TimerDiff($lDeadlock) > 2500 - SalvageOUT() - Next - ; salvage non-whites - ElseIf $ItemRarity = 2623 Or $ItemRarity = 2626 Or $ItemRarity = 2624 Then ; blue or purple or gold - $ItemType = MemoryRead($lItem + 32, 'byte') - ; armor salvage items - If $ItemType = 0 Then - $lMod = Upgrades($lItem) - While $lMod > -1 - If MemoryRead($lExpertKit + 12, 'ptr') = 0 Then - $lExpertKit = FindExpertSalvageKit() - If $lExpertKit = 0 Then - Return -1 - Else - $lExpertKitID = MemoryRead($lExpertKit, 'long') - EndIf - EndIf - Update("Salvage (" & $lMod & "): " & $bag & ", " & $slot) - $lValue = MemoryRead($lExpertKit + 36, 'short') - StartSalvage($lItem, $lExpertKitID) - Sleep(100) - If Not SendPacket(0x8, 0x75, $lMod) Then ExitLoop 2 - ;Local $lDeadlock = TimerInit() - Do - Sleep(50) - Until $SalvageState ;$lValue <> MemoryRead($lExpertKit + 36, 'short') Or TimerDiff($lDeadlock) > 2500 - Local $stringSplit = StringSplit($whatWeGetOut, " ") - SalvageOUT() - $lMod = Upgrades($lItem) - WEnd - ; weapons - ElseIf IsWeapon($ItemType) Then - $lMod = WeaponMods($lItem) - While $lMod > -1 - If MemoryRead($lExpertKit + 12, 'ptr') = 0 Then - $lExpertKit = FindExpertSalvageKit() - If $lExpertKit = 0 Then - Return -1 - Else - $lExpertKitID = MemoryRead($lExpertKit, 'long') - EndIf - EndIf - Update("Salvage (" & $lMod & "): " & $bag & ", " & $slot) - $lValue = MemoryRead($lExpertKit + 36, 'short') - StartSalvage($lItem, $lExpertKitID) - Sleep(100) - If Not SendPacket(0x8, 0x75, $lMod) Then ExitLoop 2 - ;Local $lDeadlock = TimerInit() - Do - Sleep(50) - Until $SalvageState;$lValue <> MemoryRead($lExpertKit + 36, 'short') Or TimerDiff($lDeadlock) > 2500 - Local $stringSplit = StringSplit($whatWeGetOut, " ") - SalvageOUT() - $lMod = WeaponMods($lItem) - WEnd - EndIf - Sleep(500) - ; salvage materials if item not destroyed - If $ItemRarity <> 2624 And MemoryRead($lItem + 12, 'ptr') <> 0 Then - If MemoryRead($lCheapKit + 12, 'ptr') = 0 Then - $lCheapKit = FindCheapSalvageKit() - If $lCheapKit = 0 Then - Return -1 ; no more normal salvage kits - Else - $lCheapKitID = MemoryRead($lCheapKit, 'long') - EndIf - EndIf - Update("Salvage (Materials): " & $bag & ", " & $slot) - StartSalvage($lItem, $lCheapKitID) - Sleep(1000 + GetPing()) - If Not SendPacket(0x4, 0x74) Then ExitLoop - ;Local $lDeadlock = TimerInit() - Do - Sleep(20) - Until $SalvageState; MemoryRead($lItem + 12, 'ptr') = 0 Or TimerDiff($lDeadlock) > 2500 - SalvageOUT() - EndIf - EndIf - Sleep(500) - Next - Next -EndFunc ;==>SalvageBags - -Func SalvageOUT() -Local $stringSplit = StringSplit($whatWeGetOut, " ") -Local $index = _ArraySearch($array_Salvage_Out, $stringSplit[2], 1, 0, 0, 1, 1) -If Not @error And $index <> -1 Then - $array_Salvage_Out[$index][0] += $stringSplit[1] -Else - RedDimArray_($array_Salvage_Out, $stringSplit[1], $stringSplit[2]) -EndIf -EndFunc - -Func RedDimArray_(ByRef $Container, Const ByRef $Parameter1, Const ByRef $Parameter2, $wichColum = 1) - $Container[0][0] += 1 - ReDim $Container[$Container[0][0] + 1][2] - $Container[$Container[0][0]][0] = $Parameter1 ; Amount [$i][0] - $Container[$Container[0][0]][1] = $Parameter2 ; Name [$i][1] - _ArraySort($Container, 0, 0, 0, $wichColum) - If @error Then Return False - Return True -EndFunc ;==>_RedDimArray - - -;~ Description: Salvages all items in all bags. Modified for explorable. -Func SalvageBagsExplorable() - If CountSlots() < 2 Then Return - Local $lSalvKitUses = 0, $lIDKitUses = 0, $lSalvKitMID - $lSalvKit = FindSalvKitExplorable($lSalvKitUses) - If $lSalvKit = 0 Then Return - $lSalvKitMID = @extended - For $bag = 1 To 4 ; inventory only - $lBagPtr = GetBagPtr($bag) - If $lBagPtr = 0 Then ContinueLoop - For $slot = 1 To MemoryRead($lBagPtr + 32, 'long') ; slots - $lItem = GetItemPtrBySlot($lBagPtr, $slot) - If IgnoreItem($lItem) Then ContinueLoop - If MemoryRead($lItem + 32, 'byte') = 31 Then ContinueLoop ; scrolls - If MemoryRead($lItem + 75, 'byte') > 1 Then ContinueLoop ; dont process stacks in explorable - $ItemMID = MemoryRead($lItem + 44, 'long') ; modelID - If $ItemMID = 504 Then ContinueLoop ; Decayed Orr Emblems - If $ItemMID = 460 Or $ItemMID = 461 Then ContinueLoop ; White Mantle Emblem and Badge - If Keepers($ItemMID) Then ContinueLoop ; dont salvage keepers - $ItemRarity = GetRarity($lItem) - If $ItemRarity = 2624 And GetIsRareWeapon($lItem) Then ContinueLoop ; no salvaging rare weapons - If GetIsUnIDed($lItem) And $ItemRarity <> 2624 Then - If $ItemRarity = 2623 Or $ItemRarity = 2626 Then ; only ID blue and purple items in explorable - If $lIDKitUses = 0 Then - $lIDKit = FindIDKitExplorable($lIDKitUses) - If $lIDKitUses = 0 Then ContinueLoop ; ran out of ID kits - EndIf - $lIDKitValue = MemoryRead($lIDKit + 36, 'short') - Update("Identify: " & $bag & ", " & $slot) - IdentifyItem($lItem, MemoryRead($lIDKit, 'long')) - $lIDKitUses -= 1 - Sleep(250) - Do - Sleep(250) - Until MemoryRead($lIDKit + 36, 'short') <> $lIDKitValue Or MemoryRead($lIDKit + 12, 'ptr') = 0 - Sleep(GetPing() + 100) - EndIf - EndIf - If MemoryRead($lSalvKit + 12, 'ptr') = 0 Then ; check SalvageKit before salvaging - $lSalvKit = FindSalvKitExplorable($lSalvKitUses) - If $lSalvKit = 0 Then Return ; no more salvage kits - $lSalvKitMID = @extended - EndIf - If $ItemRarity = 2621 Then ; white - Update("Salvaging (white): " & $bag & ", " & $slot) - StartSalvage($lItem, MemoryRead($lSalvKit, 'long')) - Local $lDeadlock = TimerInit() - Do - Sleep(20) - Until MemoryRead($lItem + 12, 'ptr') = 0 Or TimerDiff($lDeadlock) > 2500 - $lSalvKitUses -= 1 - Sleep(250 + GetPing()) - ElseIf $ItemRarity = 2623 Or $ItemRarity = 2626 Then ; blue or purple - $ItemType = MemoryRead($lItem + 32, 'byte') - If $ItemType = 0 And Upgrades($lItem) <> 0 Then - ContinueLoop - ElseIf IsWeapon($ItemType) And WeaponMods($lItem) <> 0 Then - ContinueLoop - Else - Update("Salvaging (" & $lSalvKitMID & "): " & $bag & ", " & $slot) - StartSalvage($lItem, MemoryRead($lSalvKit, 'long')) - Sleep(1000 + GetPing()) - SalvageMaterials() - Local $lDeadlock = TimerInit() - Do - Sleep(20) - Until MemoryRead($lItem + 12, 'ptr') = 0 Or TimerDiff($lDeadlock) > 2500 - $lSalvKitUses -= 1 - Sleep(250 + GetPing()) - EndIf - EndIf - Sleep(250) - Next - Next -EndFunc ;==>SalvageBagsExplorable - -;~ Description: Limits bags to inventory to work in explorable, @extended returns ModelID of Kit. -Func FindSalvKitExplorable(ByRef $aUses) - Local $lUses = 101 - Local $lKit = 0 - Local $lKitMID = 0 - $aUses = 0 - For $bag = 1 to 4 - Local $lBagPtr = GetBagPtr($bag) - Local $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') - For $slot = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 - Local $lItemPtr = MemoryRead($lItemArrayPtr + 4 * ($slot), 'ptr') - If $lItemPtr = 0 Then ContinueLoop - Local $lItemMID = MemoryRead($lItemPtr + 44, 'long') - If $lItemMID = 2992 Or $lItemMID = 2993 Then - Local $lValue = MemoryRead($lItemPtr + 36, 'short') - $aUses = $lValue / 2 - Return SetExtended($lItemMID, $lItemPtr) - EndIf - Next - Next -EndFunc ;==>FindSalvKitExplorable - -;~ Description: Limits bags to inventory to work in explorable, @extended returns ModelID of Kit. -Func FindIDKitExplorable(ByRef $aUses) - Local $lUses = 101 - Local $lKit = 0 - Local $lKitMID = 0 - $aUses = 0 - For $bag = 1 to 4 - Local $lBagPtr = GetBagPtr($bag) - Local $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') - For $slot = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 - Local $lItemPtr = MemoryRead($lItemArrayPtr + 4 * ($slot), 'ptr') - If $lItemPtr = 0 Then ContinueLoop - Local $lItemMID = MemoryRead($lItemPtr + 44, 'long') - Switch $lItemMID - Case 2989 - Local $lValue = MemoryRead($lItemPtr + 36, 'short') - If $lValue / 2 < $lUses Then - $lUses = $lValue / 2 - $lKit = $lItemPtr - $lKitMID = $lItemMID - $aUses = $lUses - EndIf - Case 5899 - Local $lValue = MemoryRead($lItemPtr + 36, 'short') - If $lValue / 2.5 < $lUses Then - $lUses = $lValue / 2.5 - $lKit = $lItemPtr - $lKitMID = $lItemMID - $aUses = $lUses - EndIf - Case Else - ContinueLoop - EndSwitch - Next - Next - Return SetExtended($lKitMID, $lKit) -EndFunc ;==>FindIDKitExplorable - -;~ Description: Ignore these items while processing inventory bags. -Func IgnoreItem($aItemPtr) - If $aItemPtr = 0 Then Return True ; not a valid item - If MemoryRead($aItemPtr + 24, 'ptr') <> 0 Then Return True ; customized - If MemoryRead($aItemPtr + 76, 'byte') <> 0 Then Return True ; equipped - If MemoryRead($aItemPtr + 36, 'short') = 0 Then Return True ; value 0 - If MemoryRead($aItemPtr + 12, 'ptr') = 0 Then Return True ; not in a bag - Switch MemoryRead($aItemPtr + 32, 'byte') - Case 11 ; Materials - Return True - Case 8 ; Upgrades - Return True - Case 9 ; Usable - Return True - Case 10 ; Dyes - Return True - Case 29 ; Kits - Return True - Case 34 ; Minipet - Return True - Case 18 ; Keys - Return True - EndSwitch -EndFunc ;==>IgnoreItem - -;~ Description: Returns item ptr of expert salvage kit in inventory with least uses. -Func FindExpertSalvageKit($aStart = 1, $aFinish = 16) - Local $lUses = 101 - Local $lKit = 0 - For $bag = $aStart to $aFinish - Local $lBagPtr = GetBagPtr($bag) - If $lBagPtr = 0 Then ContinueLoop - Local $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') - For $slot = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 - Local $lItemPtr = MemoryRead($lItemArrayPtr + 4 * ($slot), 'ptr') - If $lItemPtr = 0 Then ContinueLoop - Local $lItemMID = MemoryRead($lItemPtr + 44, 'long') - If $lItemMID = 2991 Or $lItemMID = 5900 Then Return $lItemPtr - Switch $lItemMID - Case 2991 - Local $lValue = MemoryRead($lItemPtr + 36, 'short') - If $lValue / 8 < $lUses Then - $lUses = $lValue / 8 - $lKit = $lItemPtr - EndIf - Case 5900 - Local $lValue = MemoryRead($lItemPtr + 36, 'short') - If $lValue / 10 < $lUses Then - $lUses = $lValue / 10 - $lKit = $lItemPtr - EndIf - EndSwitch - Next - Next - Return $lKit -EndFunc ;==>FindExpertSalvageKit - -;~ Description: Returns item ptr of expert salvage kit in inventory with least uses. -Func FindCheapSalvageKit($aStart = 1, $aFinish = 16) - Local $lUses = 101 - Local $lKit = 0 - For $bag = $aStart to $aFinish - Local $lBagPtr = GetBagPtr($bag) - If $lBagPtr = 0 Then ContinueLoop - Local $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') - For $slot = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 - Local $lItemPtr = MemoryRead($lItemArrayPtr + 4 * ($slot), 'ptr') - If $lItemPtr = 0 Then ContinueLoop - Local $lItemMID = MemoryRead($lItemPtr + 44, 'long') - If $lItemMID = 2992 Or $lItemMID = 2993 Then Return $lItemPtr - Switch $lItemMID - Case 2992, 2993 - Local $lValue = MemoryRead($lItemPtr + 36, 'short') - If $lValue / 2 < $lUses Then - $lUses = $lValue / 2 - $lKit = $lItemPtr - EndIf - EndSwitch - Next - Next - Return $lKit -EndFunc ;==>FindExpertSalvageKit - -;~ Description: Returns item ptr of ID kit in inventory. -Func FindIDKitPtr($aStart = 1, $aFinish = 16) - Local $lUses = 101 - Local $lKit = 0 - For $bag = $aStart to $aFinish - Local $lBagPtr = GetBagPtr($bag) - Local $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') - For $slot = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 - Local $lItemPtr = MemoryRead($lItemArrayPtr + 4 * ($slot), 'ptr') - If $lItemPtr = 0 Then ContinueLoop - Local $lItemMID = MemoryRead($lItemPtr + 44, 'long') - If $lItemMID = 2989 Or $lItemMID = 5899 Then Return $lItemPtr - Next - Next -EndFunc ;==>FindIDKitPtr - -;~ Description: Returns amount of available expert salvage kit uses to salvage mods. -Func ExpertSalvageUses($aStart = 1, $aFinish = 16) - Local $lCount = 0 - For $bag = $aStart to $aFinish - Local $lBagPtr = GetBagPtr($bag) - Local $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') - For $slot = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 - Local $lItemPtr = MemoryRead($lItemArrayPtr + 4 * ($slot), 'ptr') - If $lItemPtr = 0 Then ContinueLoop - Local $lItemMID = MemoryRead($lItemPtr + 44, 'long') - Switch $lItemMID - Case 2991 - $lCount += MemoryRead($lItemPtr + 36, 'short') / 8 - Case 5900 - $lCount += MemoryRead($lItemPtr + 36, 'short') / 10 - EndSwitch - Next - Next - Return $lCount -EndFunc ;==>ExpertSalvageUses - -;~ Description: Returns true if item is a weapon. -Func IsWeapon($aType) - Switch $aType - Case 2,5,12,15,22,24,26,27,32,35,36 - Return True - Case Else - Return False - EndSwitch -EndFunc ;==>IsWeapon - -;~ Description: Returns 1 if item contains insignia to keep, 2 if item contains rune to keep. -Func Upgrades($aItemPtr) -$lModStruct = MemoryReadStruct($aItemPtr + 16, 'ptr;long') -$lMod = MemoryRead(DllStructGetData($lModStruct, 1), 'byte[' & DllStructGetData($lModStruct, 2) * 4 & ']') -For $i = 0 To (UBound($Rune_Insigmia) -1) - If StringInStr($lMod, $Rune_Insigmia[$i][0], 1) <> 0) Then - ConsoleWrite($lMod & " ==> " & @CRLF & $Rune_Insigmia[$i][0] & @CRLF & @CRLF) - Return $Rune_Insigmia[$i][1] - EndIf -Next -Return -1 -EndFunc ;==>Upgrades - -;~ Description: Returns 2 for inscription, 0 and 1 for weapon mods. -Func WeaponMods($aItemPtr) - -Local $lModStruct = MemoryReadStruct($aItemPtr + 16, 'ptr;long') -Local $lMod = MemoryRead(DllStructGetData($lModStruct, 1), 'byte[' & DllStructGetData($lModStruct, 2) * 4 & ']') -Local $lType = MemoryRead($aItemPtr + 32, 'byte') - - -For $i = 0 To (UBound($Upgrades) -1) - If (($Upgrades[$i][13] = True) And (StringInStr($lMod, $Upgrades[$i][0], 1) <> 0) And ($lType = $Upgrades[$i][10])) Then - Local $_array = StringRegExp($lModStruct, '(.{2})(.{2})' & $lMod, $Upgrades[$i][1], 3) - _ArrayDisplay($_array, "StringRegExp from WeaponMods ! ") - If (($Upgrades[$i][11] = 4) And ($_array[0] = $Upgrades[$i][8]) Or ($Upgrades[$i][12] = 2) And _ - ($_array[1] = $Upgrades[$i][9])) Then Return $Upgrades[$i][4];mod Pos - EndIf -Next - -Return -1 -EndFunc ;==>WeaponMods - -;~ Description: Sell items. -Func Sell() - For $bag = 1 to 4 ; inventory only - $lBagPtr = GetBagPtr($bag) - If $lBagPtr = 0 Then ContinueLoop - For $slot = 1 to MemoryRead($lBagPtr + 32, 'long') - $lItemPtr = GetItemPtrBySlot($lBagPtr, $slot) - If $lItemPtr = 0 Then ContinueLoop - If IgnoreItem($lItemPtr) Then ContinueLoop - $lItemMID = MemoryRead($lItemPtr + 44, 'long') - If Keepers($lItemMID) Then ContinueLoop - If StackableItems($lItemMID) Then ContinueLoop - If GetRarity($lItemPtr) = 2624 And GetIsRareWeapon($lItemPtr) Then ContinueLoop - If GetIsUnIDed($lItemPtr) Then IdentifyItem($lItemPtr) - Update("Sell Item: " & $bag & ", " & $slot) - SellItem($lItemPtr) - Sleep(500) - Next - Next -EndFunc ;==>Sell - -;~ Description: Sell materials. -Func SellMaterials($aRare = False) - For $bag = 1 to 4 ; inventory only - $lBagPtr = GetBagPtr($bag) - If $lBagPtr = 0 Then ContinueLoop - For $slot = 1 to MemoryRead($lBagPtr + 32, 'long') - $lItemPtr = GetItemPtrBySlot($lBagPtr, $slot) - If $lItemPtr = 0 Then ContinueLoop - If MemoryRead($lItemPtr + 32, 'byte') <> 11 Then ContinueLoop ; not materials - $lItemMID = MemoryRead($lItemPtr + 44, 'long') - $lMatType = CheckMaterial($lItemMID) - If $aRare Then - If $lMatType = 2 Then - For $i = 1 To MemoryRead($lItemPtr + 75, 'byte') - TraderRequestSell($lItemPtr) - Update("Sell rare materials: " & $bag & ", " & $slot) - Sleep(250) - TraderSell() - Next - EndIf - Else - If $lMatType = 1 Then - For $i = 1 To Floor(MemoryRead($lItemPtr + 75, 'byte') / 10) - Update("Sell materials: " & $bag & ", " & $slot) - TraderRequestSell($lItemPtr) - Sleep(250) - TraderSell() - Next - EndIf - EndIf - Next - Next -EndFunc ;==>SellMaterials - -;~ Description: Returns 1 for normal materials and 2 for rare materials. -;~ 0 if ModelID is not listed or mat should be ignored. -Func CheckMaterial($aModelID) - Switch $aModelID - Case 954, 925 ; Chitin, Cloth - Return 1 - Case 929, 933, 934 ; Dust, Feather, Fibers - Return $mDustFeatherFiber - Case 955, 948, 921 ; Granite, Iron, Bones - Return $mGraniteIronBone - Case 940, 946, 953 ; Scale, Tanned Hide, Wood Plank - Return 1 - Case 928, 926, 927 ; Silk, Linen, Damask - Return 2 - Case 931, 932, 923 ; Monstrous Eye, Monstrous Fang, Monstrous Claw - Return 2 - Case 922, 950, 949 ; Charcoal, Deldrimor, Steel Ingot - Return 2 - Case 951, 952, 956 ; Parchment, Vellum, Spiritwood - Return 2 - Case 937, 935, 938 ; Ruby, Diamond, Sapphire - Return 0 - Case 936, 945, 930 ; Onyx, Obsidian Shard, Ectoplasm - Return 0 - Case 941, 942, 943 ; Fur, Leather Square, Elonian Leather Square - Return 2 - Case 944, 939 ; Vial of Ink, Glass Vial - Return 2 - Case 6532, 6533 ; Amber, Jadeite - Return 0 - EndSwitch -EndFunc ;==>CheckMaterial - -;~ Description: Sell runes and insignias. -Func SellUpgrades() - For $bag = 1 to 4 ; inventory only - $lBagPtr = GetBagPtr($bag) - If $lBagPtr = 0 Then ContinueLoop - For $slot = 1 to MemoryRead($lBagPtr + 32, 'long') - $lItemPtr = GetItemPtrBySlot($lBagPtr, $slot) - If $lItemPtr = 0 Then ContinueLoop - If MemoryRead($lItemPtr + 32, 'byte') <> 8 Then ContinueLoop ; not an upgrade - If IsRuneOrInsignia(MemoryRead($lItemPtr + 44, 'long')) = 0 Then ContinueLoop ; neither rune, nor insignia - TraderRequestSell($lItemPtr) - Sleep(250) - Update("Sell Upgrade: " & $bag & ", " & $slot) - TraderSell() - Next - Next -EndFunc ;==>SellUpgrades - -;~ Description: Sell all dyes to Dye Trader except for black and white. -Func SellDyes() - For $bag = 1 to 4 ; inventory only - $lBagPtr = GetBagPtr($bag) - If $lBagPtr = 0 Then ContinueLoop - For $slot = 1 to MemoryRead($lBagPtr + 32, 'long') - $lItemPtr = GetItemPtrBySlot($lBagPtr, $slot) - If $lItemPtr = 0 Then ContinueLoop - $lItemMID = MemoryRead($lItemPtr + 44, 'long') - If $lItemMID <> 146 Then ContinueLoop ; not a dye - If $mBlackWhite Then - $lItemExtraID = MemoryRead($lItemPtr + 34, 'short') - If $lItemExtraID = 10 Or $lItemExtraID = 12 Then ContinueLoop ; black or white - EndIf - For $i = 1 To MemoryRead($lItemPtr + 75, 'byte') - Update("Sell Dye: " & $bag & ", " & $slot) - TraderRequestSell($lItemPtr) - Sleep(250) - TraderSell() - Next - Next - Next -EndFunc ;==>SellDyes - -;~ Description: Tries to make room by selling in different order and selling stuff that wasnt expressly forbidden / defined in Junk(). -Func ClearInventorySpace($aMapID) - ; first stage: sell dyes, runes, rare mats, mats, scrolls to try to make room - If GoToMerchant(GetDyeTrader($aMapID)) <> 0 Then SellDyes() - If GoToMerchant(GetRuneTrader($aMapID)) <> 0 Then SellUpgrades() - If GoToMerchant(GetMaterialTrader($aMapID)) <> 0 Then SellMaterials() - If GoToMerchant(GetScrollTrader($aMapID)) <> 0 Then SellScrolls() - If GoToMerchant(GetRareMaterialTrader($aMapID)) <> 0 Then SellMaterials(True) - $lSlots = CountSlots() - If $lSlots > 3 Then Return True ; enough room to proceed as planned - ; second stage: try selling identified purple and gold and everything else thats not expressly forbidden - GoToMerchant(GetMerchant($aMapID)) - For $bag = 1 to 4 ; inventory only - $lBagPtr = GetBagPtr($bag) - If $lBagPtr = 0 Then ContinueLoop - For $slot = 1 to MemoryRead($lBagPtr + 32, 'long') - $lItemPtr = GetItemPtrBySlot($lBagPtr, $slot) - If $lItemPtr = 0 Then ContinueLoop - If MemoryRead($lItemPtr + 24, 'ptr') <> 0 Then ContinueLoop ; customized - If MemoryRead($lItemPtr + 76, 'byte') <> 0 Then ContinueLoop ; equipped - If MemoryRead($lItemPtr + 36, 'short') = 0 Then ContinueLoop ; value 0 - If MemoryRead($lItemPtr + 12, 'ptr') = 0 Then ContinueLoop ; not in a bag - $lItemMID = MemoryRead($lItemPtr + 44, 'long') - If Junk($lItemMID) Then - Update("Sell Item: " & $bag & ", " & $slot) - SellItem($lItemPtr) - Sleep(500) - $lSlots += 1 - If $lSlots > 3 Then Return True - ContinueLoop - EndIf - If Keepers($lItemMID) Then ContinueLoop - If StackableItems($lItemMID) Then ContinueLoop - $lItemRarity = GetRarity($lItemPtr) - If GetIsUnIDed($lItemPtr) Then - If $lItemRarity = 2624 Or $lItemRarity = 2626 Then ; only gold and purple - $lIDKit = FindIDKitPtr() - $lIDKitID = MemoryRead($lIDKit, 'long') - If $lIDKitID = 0 Then ContinueLoop - Update("Identify: " & $bag & ", " & $slot) - IdentifyItem($lItemPtr, $lIDKitID) - Sleep(250) - Do - Sleep(250) - Until Not GetIsUnIDed($lItemPtr) - Else - ContinueLoop - EndIf - EndIf - Switch MemoryRead($lItemPtr + 32, 'byte') - Case 0 - If Upgrades($lItemPtr) Then ContinueLoop - Case 2, 5, 12, 15, 19, 22, 24, 26, 27, 32, 35, 36 - If $lItemRarity = 2621 Then ContinueLoop ; try to keep whites for salvaging - If $mRarityGreen And $lItemRarity = 2627 Then ContinueLoop ; dont sell greens - If WeaponMods($lItemPtr) Then ContinueLoop - Case 4, 7, 13, 16, 19 ; no selling armor pieces - ContinueLoop - Case 11 ; Materials - ContinueLoop - Case 8 ; Upgrades - ContinueLoop - Case 9 ; Usable - ContinueLoop - Case 10 ; Dyes - ContinueLoop - Case 29 ; Kits - ContinueLoop - Case 34 ; Minipet - ContinueLoop - Case 18 ; Keys - Switch $lItemMID - Case 5962 ; Shiverpeak - ContinueLoop - Case 5963 ; Darkstone - ContinueLoop - Case 5961 ; Miners Key - ContinueLoop - Case 6535 ; Kurzick - ContinueLoop - Case 6536 ; Stoneroot - ContinueLoop - Case 6538 ; Luxon - ContinueLoop - Case 6539 ; Deep Jade - ContinueLoop - Case 6534 ; Forbidden - ContinueLoop - Case 15558 ; Vabbian - ContinueLoop - Case 15556 ; Ancient Elonian - ContinueLoop - Case 15560 ; Margonite - ContinueLoop - Case 19174 ; Demonic - ContinueLoop - Case 5882 ; Phantom - ContinueLoop - Case 5971 ; Obsidian - ContinueLoop - Case 22751 ; Lockpick - ContinueLoop - EndSwitch - EndSwitch - Update("Sell Item: " & $bag & ", " & $slot) - SellItem($lItemPtr) - Sleep(500) - $lSlots += 1 - If $lSlots > 3 Then Return True - Next - Next - Return $lSlots > 3 -EndFunc - -;~ Description: Contains all modelIDs of items that could be sold if storage space is low. Use with caution. -Func Junk($aModelID) - Switch $aModelID - Case 460 ; White Mantle Emblem - Return True - Case 461 ; White Mantle Badge - Return True - Case 504 ; Decayed Orr Emblem - Return True - EndSwitch -EndFunc - -;~ Description: Sell all gold rarity scrolls to scroll trader. -Func SellScrolls() - For $bag = 1 to 4 ; inventory only - $lBagPtr = GetBagPtr($bag) - If $lBagPtr = 0 Then ContinueLoop - For $slot = 1 to MemoryRead($lBagPtr + 32, 'long') - $lItemPtr = GetItemPtrBySlot($lBagPtr, $slot) - If $lItemPtr = 0 Then ContinueLoop - If MemoryRead($lItemPtr + 32, 'byte') <> 31 Then ContinueLoop ; not a scroll - If GetRarity($lItemPtr) <> 2624 Then ContinueLoop ; not a scrolltrader scroll - TraderRequestSell($lItemPtr) - Sleep(250) - Update("Sell Scroll: " & $bag & ", " & $slot) - TraderSell() - Next - Next -EndFunc ;==>SellScrolls - -;~ Description: Go to merchant and co, if playernumber wasnt found go to xunlai chest and try again. -Func GoToMerchant($aPlayernumber) -Local $found = False - ; first try - - $lAgentArray = MemoryReadAgentPtrStruct() - For $i = 1 To $lAgentArray[0] - If MemoryRead($lAgentArray[$i] + 244, 'word') = $aPlayernumber Then - GoToNPC($lAgentArray[$i]) - Sleep(500) - Dialog(0x7F) - $found = True - ExitLoop - EndIf - Next - - If Not $found Then - ; merchant wasnt found, next try, but first... go to chest - For $i = 1 To $lAgentArray[0] - If MemoryRead($lAgentArray[$i] + 244, 'word') = 4991 Then - GoToNPC($lAgentArray[$i]) - ExitLoop - EndIf - Next - ; aaaaand... try again to find merchant - $lAgentArray = MemoryReadAgentPtrStruct() - For $i = 1 To $lAgentArray[0] - If MemoryRead($lAgentArray[$i] + 244, 'word') = $aPlayernumber Then - GoToNPC($lAgentArray[$i]) - Sleep(500) - Dialog(0x7F) - $found = True - ExitLoop - EndIf - Next - EndIf - - Return $found -EndFunc ;==>GoToMerchant - -;~ Description: Return merchant depending on MapID. -Func GetMerchant($aMapID) - Switch $aMapID - Case 4, 5, 6, 52, 176, 177, 178, 179 ; proph gh - Return 209 - Case 275, 276, 359, 360, 529, 530, 537, 538 ; factions and nf gh - Return 196 - Case 10, 11, 12, 139, 141, 142, 49, 857 - Return 2030 - Case 109, 120, 154 - Return 1987 - Case 116, 117, 118, 152, 153, 38 - Return 1988 - Case 122, 35 - Return 2130 - Case 123, 124 - Return 2131 - Case 129, 348, 390 - Return 3396 - Case 130, 218, 230, 287, 349, 388 - Return 3397 - Case 131, 21, 25, 36 - Return 2080 - Case 132, 135, 28, 29, 30, 32, 39, 40 - Return 2091 - Case 133, 155, 156, 157, 158, 159, 206, 22, 23, 24 - Return 2101 - Case 134, 81 - Return 2005 - Case 136, 137, 14, 15, 16, 19, 57, 73 - Return 1983 - Case 138 - Return 1969 - Case 193, 234, 278, 288, 391 - Return 3612 - Case 194, 213, 214, 225, 226, 242, 250, 283, 284, 291, 292 - Return 3269 - Case 216, 217, 249, 251 - Return 3265 - Case 219, 224, 273, 277, 279, 289, 297, 350, 389 - Return 3611 - Case 220, 274, 51 - Return 3267 - Case 222, 272, 286, 77 - Return 3395 - Case 248 - Return 1201 - Case 303 - Return 3266 - Case 376, 378, 425, 426, 477, 478 - Return 5379 - Case 381, 387, 421, 424, 427, 554 - Return 5380 - Case 393, 396, 403, 414, 476 - Return 5660 - Case 398, 407, 428, 433, 434, 435 - Return 5659 - Case 431 - Return 4715 - Case 438, 545 - Return 5615 - Case 440, 442, 469, 473, 480, 494, 496 - Return 5607 - Case 450, 559 - Return 4983 - Case 474, 495 - Return 5608 - Case 479, 487, 489, 491, 492, 502, 818 - Return 4714 - Case 555 - Return 4982 - Case 624 - Return 6752 - Case 638 - Return 6054 - Case 639, 640 - Return 6751 - Case 641 - Return 6057 - Case 642 - Return 6041 - Case 643, 645, 650 - Return 6377 - Case 644 - Return 6378 - Case 648 - Return 6583 - Case 652 - Return 6225 - Case 675 - Return 6184 - Case 808 - Return 7442 - Case 814 - Return 104 - EndSwitch -EndFunc ;==>GetMerchant - -;~ Description: Return material trader depending on MapID. -Func GetMaterialTrader($aMapID) - Switch $aMapID - Case 4, 5, 6, 52, 176, 177, 178, 179 ; proph gh - Return 204 - Case 275, 276, 359, 360, 529, 530, 537, 538 ; factions and nf gh - Return 191 - Case 109, 49, 81 - Return 2011 - Case 193 - Return 3618 - Case 194, 242, 857 - Return 3279 - Case 250 - Return 3280 - Case 376 - Return 5385 - Case 398 - Return 5665 - Case 414 - Return 5668 - Case 424 - Return 5386 - Case 433 - Return 5666 - Case 438 - Return 5618 - Case 491 - Return 4720 - Case 492 - Return 4721 - Case 638 - Return 6757 - Case 640 - Return 6758 - Case 641 - Return 6059 - Case 642 - Return 6044 - Case 643 - Return 6383 - Case 644 - Return 6384 - Case 652 - Return 6227 - Case 77 - Return 3409 - Case 808 - Return 7446 - Case 818 - Return 4723 - EndSwitch -EndFunc ;==>GetMaterialTrader - -;~ Description: Return rare material trader depending on MapID. -Func GetRareMaterialTrader($aMapID) - Switch $aMapID - Case 4, 5, 6, 52, 176, 177, 178, 179 ; proph gh - Return 205 - Case 275, 276, 359, 360, 529, 530, 537, 538 ; factions and nf gh - Return 192 - Case 109 - Return 1997 - Case 193 - Return 3621 - Case 194, 250, 857 - Return 3282 - Case 242 - Return 3281 - Case 376 - Return 5388 - Case 398, 433 - Return 5667 - Case 414 - Return 5668 - Case 424 - Return 5387 - Case 438 - Return 5613 - Case 49 - Return 2038 - Case 491, 818 - Return 4723 - Case 492 - Return 4722 - Case 638 - Return 6760 - Case 640 - Return 6759 - Case 641 - Return 6060 - Case 642 - Return 6045 - Case 643 - Return 6386 - Case 644 - Return 6385 - Case 652 - Return 6228 - Case 77 - Return 3410 - Case 81 - Return 2083 - EndSwitch -EndFunc ;==>GetRareMaterialTrader - -;~ Description: Return rune trader depending on MapID. -Func GetRuneTrader($aMapID) - Switch $aMapID - Case 4, 5, 6, 52, 176, 177, 178, 179 ; proph gh - Return 203 - Case 275, 276, 359, 360, 529, 530, 537, 538 ; factions and nf gh - Return 190 - Case 109, 814 - Return 1999 - Case 193 - Return 3624 - Case 194, 242, 250 - Return 3285 - Case 248, 857 - Return 1975 - Case 396 - Return 5672 - Case 414 - Return 5671 - Case 438 - Return 5620 - Case 477 - Return 5390 - Case 487 - Return 4726 - Case 49 - Return 2039 - Case 502 - Return 4727 - Case 624 - Return 6764 - Case 640 - Return 6763 - Case 642 - Return 6046 - Case 643, 645 - Return 6389 - Case 644 - Return 6390 - Case 77 - Return 3415 - Case 808 - Return 7450 - Case 81 - Return 2085 - Case 818 - Return 4705 - EndSwitch -EndFunc ;==>GetRuneTrader - -;~ Description: Return dye trader depending on MapID. -Func GetDyeTrader($aMapID) - Switch $aMapID - Case 4, 5, 6, 52, 176, 177, 178, 179 ; proph gh - Return 206 - Case 275, 276, 359, 360, 529, 530, 537, 538 ; factions and nf gh - Return 193 - Case 109, 49, 81, 857 - Return 2010 - Case 193 - Return 3617 - Case 194, 242 - Return 3278 - Case 250 - Return 3277 - Case 286 - Return 3402 - Case 381, 477 - Return 5383 - Case 403 - Return 5663 - Case 414 - Return 5664 - Case 640 - Return 6756 - Case 642 - Return 6043 - Case 644 - Return 6382 - Case 77 - Return 3401 - Case 812 - Return 2107 - Case 818 - Return 4719 - EndSwitch -EndFunc ;==>GetDyeTrader - -;~ Description: Return scroll trader depending on MapID. -Func GetScrollTrader($aMapID) - Switch $aMapID - Case 4, 5, 6, 52, 176, 177, 178, 179 ; proph gh - Return 207 - Case 275, 276, 359, 360, 529, 530, 537, 538 ; factions and nf gh - Return 194 - Case 109 - Return 1998 - Case 193 - Return 3623 - Case 194 - Return 3283 - Case 287 - Return 3413 - Case 396, 414 - Return 5669 - Case 426, 857 - Return 5392 - Case 442, 480 - Return 5621 - Case 49 - Return 2040 - Case 624 - Return 6761 - Case 638 - Return 6056 - Case 639, 640 - Return 6762 - Case 643, 644 - Return 6387 - Case 645 - Return 6388 - Case 77 - Return 3412 - Case 808 - Return 7448 - EndSwitch -EndFunc ;==>GetScrollTrader \ No newline at end of file + +#Region Variables +Global $mEmptyBag = 8 +Global $mEmptySlot = 0 +Global $mStoreGold = False +Global $mStoreMaterials = True +Global $mBlackWhite = True +Global $mMatExchangeGold = 930 ; ModelID of mat that should be bought in case gold storage is full +Global $mSalvageStacks = True +Global $mDustFeatherFiber = 0 ; change to 1 to sell this group of materials +Global $mGraniteIronBone = 0 ; change to 1 to sell this group of materials +Global $mWhiteMantleEmblem = True ; change to false to sell them +Global $mWhiteMantleBadge = True ; change to false to sell them +#EndRegion + + + +;~ Description: Make sure to have enough gold on character, but not too much. +Func MinMaxGold() + $lGoldCharacter = GetGoldCharacter() + $lGoldStorage = GetGoldStorage() + $lGold = $lGoldCharacter + $lGoldStorage + OpenStorageWindow() + If $lGoldCharacter < 10000 And $lGoldStorage > 10000 Then + WithdrawGold(10000 - $lGoldCharacter) + Return 10000 + ElseIf $lGoldCharacter > 50000 And $lGold < 1000000 Then + DepositGold($lGoldCharacter - 10000) + Return 10000 + Else + Return $lGoldCharacter + EndIf +EndFunc ;==>MinMaxGold + +;~ Description: Buy Ident and Salvage Kits for inventory session. +Func BuyKits($aAmount = 40, $aExpertSalv = True) + ; identification kits + $lIDKitUses = FindIDKitUses(1, 4) + If $lIDKitUses < $aAmount Then + $lItemIDRow = GetItemRowByModelID(2989) + $lKitUses = 25 + If $lItemIDRow = 0 Then + $lItemIDRow = GetItemRowByModelID(5899) + $lKitUses = 100 + If $lItemIDRow = 0 Then Return ; no id kit + EndIf + $lBuyAmount = Ceiling(($aAmount - $lIDKITUses) / $lKitUses) + Update("Buying ID Kits: " & $lBuyAmount) + BuyIdentKit($lItemIDRow, $lBuyAmount) + Sleep(250 + GetPing()) + EndIf + ; salvage kits + $lSalvKitUses = CheapSalvageUses(1, 4) + If $lSalvKitUses < $aAmount Then + $lItemIDRow = GetItemRowByModelID(2992) + $lKitUses = 25 + If $lItemIDRow = 0 Then + $lItemIDRow = GetItemRowByModelID(2993) + $lKitUses = 10 + If $lItemIDRow = 0 Then Return + EndIf + $lBuyAmount = Ceiling(($aAmount - $lSalvKitUses) / $lKitUses) + Update("Buying Salvage Kits: " & $lBuyAmount) + BuySalvKit(False, $lItemIDRow, $lBuyAmount) + Sleep(250 + GetPing()) + EndIf + ; expert salvage kits + If $aExpertSalv Then + $lExperSalvKitUses = ExpertSalvageUses(1, 4) + If $lExperSalvKitUses < $aAmount Then + $lItemIDRow = GetItemRowByModelID(2991) + $lKitUses = 25 + If $lItemIDRow = 0 Then + $lItemIDRow = GetItemRowByModelID(5900) + $lKitUses = 100 + If $lItemIDRow = 0 Then Return + EndIf + $lBuyAmount = Ceiling(($aAmount - $lExperSalvKitUses) / $lKitUses) + Update("Buying Expert Salv Kits: " & $lBuyAmount) + BuySalvKit(True, $lItemIDRow, $lBuyAmount) + Sleep(250 + GetPing()) + EndIf + EndIf +EndFunc ;==>BuyKits + +;~ Description: Returns amount of salvage uses. +Func CheapSalvageUses($aStart = 1, $aFinish = 16) + Local $lCount = 0 + For $bag = $aStart to $aFinish + Local $lBagPtr = GetBagPtr($bag) + Local $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') + For $slot = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 + Local $lItemPtr = MemoryRead($lItemArrayPtr + 4 * ($slot), 'ptr') + If $lItemPtr = 0 Then ContinueLoop + Local $lItemMID = MemoryRead($lItemPtr + 44, 'long') + If $lItemMID = 2992 Or $lItemMID = 2993 Then $lCount += MemoryRead($lItemPtr + 36, 'short') / 2 + Next + Next + Return $lCount +EndFunc ;==>SalvageUses + +;~ Description: Buys Ident kit. +Func BuyIdentKit($aItemIDRow = 0, $aAmount = 1) + If $aItemIDRow = 0 Then + $lItemIDRow = GetItemRowByModelID(2989) + If $lItemIDRow = 0 Then + $lItemIDRow = GetItemRowByModelID(5899) + If $lItemIDRow = 0 Then Return ; no id kit + EndIf + Else + $lItemIDRow = $aItemIDRow + EndIf + $lItemPtr = GetItemPtr($lItemIDRow) + $lValue = MemoryRead($lItemPtr + 36, 'short') * 2 + DllStructSetData($mBuyItem, 2, $aAmount) + DllStructSetData($mBuyItem, 3, $lItemIDRow) + DllStructSetData($mBuyItem, 4, $lValue * $aAmount) + Enqueue($mBuyItemPtr, 16) + Return $lItemPtr +EndFunc ;==>BuyIdentKit + +;~ Description: Buys salvage kit. +Func BuySalvKit($aExpert = False, $aItemIDRow = 0, $aAmount = 1) + If $aItemIDRow = 0 Then + If $aExpert Then + $lItemIDRow = GetItemRowByModelID(2991) + If $lItemIDRow = 0 Then + $lItemIDRow = GetItemRowByModelID(5900) + If $lItemIDRow = 0 Then Return + EndIf + Else + $lItemIDRow = GetItemRowByModelID(2992) + If $lItemIDRow = 0 Then + $lItemIDRow = GetItemRowByModelID(2993) + If $lItemIDRow = 0 Then Return + EndIf + EndIf + Else + $lItemIDRow = $aItemIDRow + EndIf + $lItemPtr = GetItemPtr($lItemIDRow) + $lValue = MemoryRead($lItemPtr + 36, 'short') * 2 + DllStructSetData($mBuyItem, 2, $aAmount) + DllStructSetData($mBuyItem, 3, $lItemIDRow) + DllStructSetData($mBuyItem, 4, $aAmount * $lValue) + Enqueue($mBuyItemPtr, 16) + Return $lItemPtr +EndFunc ;==>BuySalvKit + +;~ Description: Identify all unident items in inventory. +Func Ident() + For $bag = 1 to 4 ; inventory only + $lBagPtr = GetBagPtr($bag) + If $lBagPtr = 0 Then ContinueLoop + For $slot = 1 to MemoryRead($lBagPtr + 32, 'long') + $lItemPtr = GetItemPtrBySlot($lBagPtr, $slot) + If $lItemPtr = 0 Then ContinueLoop + If GetIsUnIDed($lItemPtr) Then + Update("Identify: " & $bag & ", " & $slot) + IdentifyItem($lItemPtr) + EndIf + Next + Next +EndFunc ;==>Ident + +;~ Description: Store full stacks, unident golds and mods. +Func StoreItems() + UpdateEmptyStorageSlot($mEmptyBag, $mEmptySlot) + Update("Empty Spot: " & $mEmptyBag & ", " & $mEmptySlot) + If $mEmptySlot = 0 Then Return ; no more empty slots found + OpenStorageWindow() + For $bag = 1 To 4 ; inventory only + $lBagPtr = GetBagPtr($bag) + If $lBagPtr = 0 Then ContinueLoop ; empty bag slot + $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') + For $slot = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 + $lItemPtr = MemoryRead($lItemArrayPtr + 4 * ($slot), 'ptr') + If $lItemPtr = 0 Then ContinueLoop ; empty slot + $lItemID = MemoryRead($lItemPtr, 'long') + $lItemType = MemoryRead($lItemPtr + 32, 'byte') + $lItemQuantity = MemoryRead($lItemPtr + 75, 'byte') + If $lItemType = 11 And $lItemQuantity = 250 And $mStoreMaterials Then ; materials + Update("Store Materials: " & $bag & ", " & $slot & " -> " & $mEmptyBag & ", " & $mEmptySlot) + MoveItem($lItemID, $mEmptyBag, $mEmptySlot) + Do + Sleep(250) + Until MemoryRead($lItemArrayPtr + 4 * ($slot), 'ptr') = 0 + UpdateEmptyStorageSlot($mEmptyBag, $mEmptySlot) + If $mEmptySlot = 0 Then Return + ContinueLoop + EndIf + $lItemMID = MemoryRead($lItemPtr + 44, 'long') + If StackableItems($lItemMID) And $lItemQuantity = 250 Then ; only full stacks + Update("Store Stack: " & $bag & ", " & $slot & " -> " & $mEmptyBag & ", " & $mEmptySlot) + MoveItem($lItemID, $mEmptyBag, $mEmptySlot) + Do + Sleep(250) + Until MemoryRead($lItemArrayPtr + 4 * ($slot), 'ptr') = 0 + UpdateEmptyStorageSlot($mEmptyBag, $mEmptySlot) + If $mEmptySlot = 0 Then Return + ContinueLoop + EndIf + If Keepers($lItemMID) Then + Update("Store Keepers: " & $bag & ", " & $slot & " -> " & $mEmptyBag & ", " & $mEmptySlot) + MoveItem($lItemID, $mEmptyBag, $mEmptySlot) + Do + Sleep(250) + Until MemoryRead($lItemArrayPtr + 4 * ($slot), 'ptr') = 0 + UpdateEmptyStorageSlot($mEmptyBag, $mEmptySlot) + If $mEmptySlot = 0 Then Return ; no more empty slots + ContinueLoop + EndIf + If $mStoreGold And GetRarity($lItemPtr) = 2624 Then ; store unident golds if possible + Update("Store Golds: " & $bag & ", " & $slot & " -> " & $mEmptyBag & ", " & $mEmptySlot) + MoveItem($lItemID, $mEmptyBag, $mEmptySlot) + Do + Sleep(250) + Until MemoryRead($lItemArrayPtr + 4 * ($slot), 'ptr') = 0 + UpdateEmptyStorageSlot($mEmptyBag, $mEmptySlot) + If $mEmptySlot = 0 Then Return ; no more empty slots + ContinueLoop + EndIf + Next + Next +EndFunc ;==>StoreItems + +;~ Description: Return true of item is a stackable item. +Func StackableItems($aModelID) + Switch $aModelID + ; stackable drops + Case 460,474,476,486,504,522,525,811,819,822,835,1610,2994,19185,22751,24629,24630,24631,24632,27033,27035,27044,27046,27047,27052,35123 + Return True + ; tomes + Case 21786 to 21805 + Return True + ; alcohol + Case 910,2513,5585,6049,6366,6367,6375,15477,19171,22190,24593,28435,30855,31145,31146,35124,36682 + Return True + ; party + Case 6376,6368,6369,21809,21810,21813,29436,29543,36683,4730,15837,21490,22192,30626,30630,30638,30642,30646,30648,31020,31141,31142,31144,31172 + Return True + ; sweets + Case 15528,15479,19170,21492,21812,22269,22644,22752,28431,28432,28436,31150,35125,36681 + Return True + ; scrolls + Case 3256,3746,5594,5595,5611,21233,22279,22280 + Return True + ; DPRemoval + Case 6370,21488,21489,22191,35127,26784,28433 + Return True + ; special drops + Case 18345,21491,21833,28434,35121 + Return True + Case Else + Return False + EndSwitch +EndFunc ;==>StackableItems + +;~ Description: Returns next empty slot, start at $aBag, $aSlot. Returns 0 if there's no empty slot in this bag. +Func UpdateEmptySlot(ByRef $aBagNr, ByRef $aSlot) + If $aBagNr = 0 Then + $lBagNr = 1 + Else + $lBagNr = $aBagNr + EndIf + If $aSlot = 0 Then + $lSlot = 1 + Else + $lSlot = $aSlot + EndIf + $aBagNr = 0 + $aSlot = 0 + For $bag = $lBagNr To 4 + $lBagPtr = GetBagPtr($bag) + If $lBagPtr = 0 Then Return 0 ; no bag + For $slot = $lSlot To MemoryRead($lBagPtr + 32, 'long') + $lSlotPtr = GetItemPtrBySlot($lBagPtr, $slot) + If $lSlotPtr = 0 Then + $aBagNr = $bag + $aSlot = $slot + Return True + EndIf + Next + $lSlot = 1 + Next +EndFunc ;==>UpdateEmptySlot + +;~ Description: Returns next empty slot, start at $aBag, $aSlot. Returns 0 if there's no empty slot in this bag. +Func UpdateEmptyStorageSlot(ByRef $aBagNr, ByRef $aSlot) + If $aBagNr = 0 Then + $lBagNr = 8 + Else + $lBagNr = $aBagNr + EndIf + If $aSlot = 0 Then + $lSlot = 1 + Else + $lSlot = $aSlot + EndIf + $aBagNr = 0 + $aSlot = 0 + For $bag = $lBagNr To 16 + $lBagPtr = GetBagPtr($bag) + If $lBagPtr = 0 Then Return 0 ; no bag + For $slot = $lSlot To 20 + $lSlotPtr = GetItemPtrBySlot($lBagPtr, $slot) + If $lSlotPtr = 0 Then + $aBagNr = $bag + $aSlot = $slot + Return True + EndIf + Next + $lSlot = 1 + Next +EndFunc ;==>UpdateEmptyStorageSlot + +;~ Description: Returns true for all ModelIDs specified. +Func Keepers($aModelID) + Switch $aModelID + ; mods + Case 896,908,15554,15551,15552,894,906,897,909,893,905,6323,6331,895,907,15543,15553,15544,15555,15540,15541,15542,17059,19122,19123 + Return True + Case 5551 ; Rune of Superior Vigor + Return True + Case 460 ; White Mantle Emblem + Return $mWhiteMantleEmblem + Case 461 ; White Mantle Badge + Return $mWhiteMantleBadge + Case Else + Return False + EndSwitch +EndFunc ;==>Keepers + +;~ Description: Salvages all items in all bags. +Func SalvageBags() + ; Search for ID kit + Local $lIDKit = FindIDKitPtr(), $lMod + If $lIDKit = 0 Then + Local $lIdentify = False + Else + Local $lIDKitID = MemoryRead($lIDKit, 'long') + Local $lIdentify = True + EndIf + ; Search for expert salvage kit + Local $lExpertKit = FindExpertSalvageKit() + If $lExpertKit = 0 Then + Return + Else + $lExpertKitID = MemoryRead($lExpertKit, 'long') + EndIf + ; Search for normal salvage kit + Local $lCheapKit = FindCheapSalvageKit() + If $lCheapKit = 0 Then + Return + Else + $lCheapKitID = MemoryRead($lCheapKit, 'long') + EndIf + ; Start processing + For $bag = 1 To 4 ; inventory only + $lBagPtr = GetBagPtr($bag) + If $lBagPtr = 0 Then ContinueLoop + For $slot = 1 To MemoryRead($lBagPtr + 32, 'long') ; slots + + $lItem = GetItemPtrBySlot($lBagPtr, $slot) + If IgnoreItem($lItem) Then ContinueLoop + If MemoryRead($lItem + 32, 'byte') = 31 Then ContinueLoop ; scrolls + $lQuantity = MemoryRead($lItem + 75, 'byte') + If $lQuantity > 1 And Not $mSalvageStacks Then ContinueLoop ; dont process stacks + $ItemMID = MemoryRead($lItem + 44, 'long') ; modelID + If $ItemMID = 504 Then ContinueLoop ; Decayed Orr Emblems + If $ItemMID = 460 Or $ItemMID = 461 Then ContinueLoop ; White Mantle Emblem and Badge + If Keepers($ItemMID) Then ContinueLoop ; dont salvage keepers + $ItemRarity = GetRarity($lItem) + If $ItemRarity = 2624 And GetIsRareWeapon($lItem) Then ContinueLoop ; no salvaging rare weapons + + ; Identify item if necessary and id kit available + If $lIdentify And GetIsUnIDed($lItem) Then + If MemoryRead($lIDKit + 12, 'ptr') = 0 Then + $lIDKit = FindIDKitPtr() + If $lIDKit = 0 Then + $lIdentify = False + ContinueLoop + Else + $lIDKitID = MemoryRead($lIDKit, 'long') + EndIf + EndIf + Update("Identify: " & $bag & ", " & $slot) + IdentifyItem($lItem, $lIDKitID) + Sleep(250) + Do + Sleep(250) + Until Not GetIsUnIDed($lItem) + EndIf + ; salvage white items + If $ItemRarity = 2621 Then + For $i = 1 To $lQuantity + If MemoryRead($lCheapKit + 12, 'ptr') = 0 Then + $lCheapKit = FindCheapSalvageKit() + If $lCheapKit = 0 Then + Return -1 ; no more normal salvage kits + Else + $lCheapKitID = MemoryRead($lCheapKit, 'long') + EndIf + EndIf + Update("Salvaging (white): " & $bag & ", " & $slot) + $lQuantityOld = $lQuantity + StartSalvage($lItem, $lCheapKitID) + Local $lDeadlock = TimerInit() + Do + Sleep(50) + ;$lQuantity = MemoryRead($lItem + 75, 'byte') + Until $SalvageState ;$lQuantity <> $lQuantityOld Or MemoryRead($lItem + 12, 'ptr') = 0 Or TimerDiff($lDeadlock) > 2500 + SalvageOUT() + Next + ; salvage non-whites + ElseIf $ItemRarity = 2623 Or $ItemRarity = 2626 Or $ItemRarity = 2624 Then ; blue or purple or gold + $ItemType = MemoryRead($lItem + 32, 'byte') + ; armor salvage items + If $ItemType = 0 Then + $lMod = Upgrades($lItem) + While $lMod > -1 + If MemoryRead($lExpertKit + 12, 'ptr') = 0 Then + $lExpertKit = FindExpertSalvageKit() + If $lExpertKit = 0 Then + Return -1 + Else + $lExpertKitID = MemoryRead($lExpertKit, 'long') + EndIf + EndIf + Update("Salvage (" & $lMod & "): " & $bag & ", " & $slot) + $lValue = MemoryRead($lExpertKit + 36, 'short') + StartSalvage($lItem, $lExpertKitID) + Sleep(100) + If Not SendPacket(0x8, $CtoGS_MSG_SalvageMod, $lMod) Then ExitLoop 2 ;~ old -> If Not SendPacket(0x8, 0x75, $lMod) Then ExitLoop 2 + ;Local $lDeadlock = TimerInit() + Do + Sleep(50) + Until $SalvageState ;$lValue <> MemoryRead($lExpertKit + 36, 'short') Or TimerDiff($lDeadlock) > 2500 + Local $stringSplit = StringSplit($whatWeGetOut, " ") + SalvageOUT() + $lMod = Upgrades($lItem) + WEnd + ; weapons + ElseIf IsWeapon($ItemType) Then + $lMod = WeaponMods($lItem) + While $lMod > -1 + If MemoryRead($lExpertKit + 12, 'ptr') = 0 Then + $lExpertKit = FindExpertSalvageKit() + If $lExpertKit = 0 Then + Return -1 + Else + $lExpertKitID = MemoryRead($lExpertKit, 'long') + EndIf + EndIf + Update("Salvage (" & $lMod & "): " & $bag & ", " & $slot) + $lValue = MemoryRead($lExpertKit + 36, 'short') + StartSalvage($lItem, $lExpertKitID) + Sleep(100) + If Not SendPacket(0x8, $CtoGS_MSG_SalvageMod, $lMod) Then ExitLoop 2 ;~ old -> If Not SendPacket(0x8, 0x75, $lMod) Then ExitLoop 2 + ;Local $lDeadlock = TimerInit() + Do + Sleep(50) + Until $SalvageState;$lValue <> MemoryRead($lExpertKit + 36, 'short') Or TimerDiff($lDeadlock) > 2500 + Local $stringSplit = StringSplit($whatWeGetOut, " ") + SalvageOUT() + $lMod = WeaponMods($lItem) + WEnd + EndIf + Sleep(500) + ; salvage materials if item not destroyed + If $ItemRarity <> 2624 And MemoryRead($lItem + 12, 'ptr') <> 0 Then + If MemoryRead($lCheapKit + 12, 'ptr') = 0 Then + $lCheapKit = FindCheapSalvageKit() + If $lCheapKit = 0 Then + Return -1 ; no more normal salvage kits + Else + $lCheapKitID = MemoryRead($lCheapKit, 'long') + EndIf + EndIf + Update("Salvage (Materials): " & $bag & ", " & $slot) + StartSalvage($lItem, $lCheapKitID) + Sleep(1000 + GetPing()) + If Not SendPacket(0x4, $CtoGS_MSG_SalvageMaterials) Then ExitLoop ;~ old -> If Not SendPacket(0x4, 0x74) Then ExitLoop + ;Local $lDeadlock = TimerInit() + Do + Sleep(20) + Until $SalvageState; MemoryRead($lItem + 12, 'ptr') = 0 Or TimerDiff($lDeadlock) > 2500 + SalvageOUT() + EndIf + EndIf + Sleep(500) + Next + Next +EndFunc ;==>SalvageBags + +Func SalvageOUT() +Local $stringSplit = StringSplit($whatWeGetOut, " ") +Local $index = _ArraySearch($array_Salvage_Out, $stringSplit[2], 1, 0, 0, 1, 1) +If Not @error And $index <> -1 Then + $array_Salvage_Out[$index][0] += $stringSplit[1] +Else + RedDimArray_($array_Salvage_Out, $stringSplit[1], $stringSplit[2]) +EndIf +EndFunc + +Func RedDimArray_(ByRef $Container, Const ByRef $Parameter1, Const ByRef $Parameter2, $wichColum = 1) + $Container[0][0] += 1 + ReDim $Container[$Container[0][0] + 1][2] + $Container[$Container[0][0]][0] = $Parameter1 ; Amount [$i][0] + $Container[$Container[0][0]][1] = $Parameter2 ; Name [$i][1] + _ArraySort($Container, 0, 0, 0, $wichColum) + If @error Then Return False + Return True +EndFunc ;==>_RedDimArray + + +;~ Description: Salvages all items in all bags. Modified for explorable. +Func SalvageBagsExplorable() + If CountSlots() < 2 Then Return + Local $lSalvKitUses = 0, $lIDKitUses = 0, $lSalvKitMID + $lSalvKit = FindSalvKitExplorable($lSalvKitUses) + If $lSalvKit = 0 Then Return + $lSalvKitMID = @extended + For $bag = 1 To 4 ; inventory only + $lBagPtr = GetBagPtr($bag) + If $lBagPtr = 0 Then ContinueLoop + For $slot = 1 To MemoryRead($lBagPtr + 32, 'long') ; slots + $lItem = GetItemPtrBySlot($lBagPtr, $slot) + If IgnoreItem($lItem) Then ContinueLoop + If MemoryRead($lItem + 32, 'byte') = 31 Then ContinueLoop ; scrolls + If MemoryRead($lItem + 75, 'byte') > 1 Then ContinueLoop ; dont process stacks in explorable + $ItemMID = MemoryRead($lItem + 44, 'long') ; modelID + If $ItemMID = 504 Then ContinueLoop ; Decayed Orr Emblems + If $ItemMID = 460 Or $ItemMID = 461 Then ContinueLoop ; White Mantle Emblem and Badge + If Keepers($ItemMID) Then ContinueLoop ; dont salvage keepers + $ItemRarity = GetRarity($lItem) + If $ItemRarity = 2624 And GetIsRareWeapon($lItem) Then ContinueLoop ; no salvaging rare weapons + If GetIsUnIDed($lItem) And $ItemRarity <> 2624 Then + If $ItemRarity = 2623 Or $ItemRarity = 2626 Then ; only ID blue and purple items in explorable + If $lIDKitUses = 0 Then + $lIDKit = FindIDKitExplorable($lIDKitUses) + If $lIDKitUses = 0 Then ContinueLoop ; ran out of ID kits + EndIf + $lIDKitValue = MemoryRead($lIDKit + 36, 'short') + Update("Identify: " & $bag & ", " & $slot) + IdentifyItem($lItem, MemoryRead($lIDKit, 'long')) + $lIDKitUses -= 1 + Sleep(250) + Do + Sleep(250) + Until MemoryRead($lIDKit + 36, 'short') <> $lIDKitValue Or MemoryRead($lIDKit + 12, 'ptr') = 0 + Sleep(GetPing() + 100) + EndIf + EndIf + If MemoryRead($lSalvKit + 12, 'ptr') = 0 Then ; check SalvageKit before salvaging + $lSalvKit = FindSalvKitExplorable($lSalvKitUses) + If $lSalvKit = 0 Then Return ; no more salvage kits + $lSalvKitMID = @extended + EndIf + If $ItemRarity = 2621 Then ; white + Update("Salvaging (white): " & $bag & ", " & $slot) + StartSalvage($lItem, MemoryRead($lSalvKit, 'long')) + Local $lDeadlock = TimerInit() + Do + Sleep(20) + Until MemoryRead($lItem + 12, 'ptr') = 0 Or TimerDiff($lDeadlock) > 2500 + $lSalvKitUses -= 1 + Sleep(250 + GetPing()) + ElseIf $ItemRarity = 2623 Or $ItemRarity = 2626 Then ; blue or purple + $ItemType = MemoryRead($lItem + 32, 'byte') + If $ItemType = 0 And Upgrades($lItem) <> 0 Then + ContinueLoop + ElseIf IsWeapon($ItemType) And WeaponMods($lItem) <> 0 Then + ContinueLoop + Else + Update("Salvaging (" & $lSalvKitMID & "): " & $bag & ", " & $slot) + StartSalvage($lItem, MemoryRead($lSalvKit, 'long')) + Sleep(1000 + GetPing()) + SalvageMaterials() + Local $lDeadlock = TimerInit() + Do + Sleep(20) + Until MemoryRead($lItem + 12, 'ptr') = 0 Or TimerDiff($lDeadlock) > 2500 + $lSalvKitUses -= 1 + Sleep(250 + GetPing()) + EndIf + EndIf + Sleep(250) + Next + Next +EndFunc ;==>SalvageBagsExplorable + +;~ Description: Limits bags to inventory to work in explorable, @extended returns ModelID of Kit. +Func FindSalvKitExplorable(ByRef $aUses) + Local $lUses = 101 + Local $lKit = 0 + Local $lKitMID = 0 + $aUses = 0 + For $bag = 1 to 4 + Local $lBagPtr = GetBagPtr($bag) + Local $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') + For $slot = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 + Local $lItemPtr = MemoryRead($lItemArrayPtr + 4 * ($slot), 'ptr') + If $lItemPtr = 0 Then ContinueLoop + Local $lItemMID = MemoryRead($lItemPtr + 44, 'long') + If $lItemMID = 2992 Or $lItemMID = 2993 Then + Local $lValue = MemoryRead($lItemPtr + 36, 'short') + $aUses = $lValue / 2 + Return SetExtended($lItemMID, $lItemPtr) + EndIf + Next + Next +EndFunc ;==>FindSalvKitExplorable + +;~ Description: Limits bags to inventory to work in explorable, @extended returns ModelID of Kit. +Func FindIDKitExplorable(ByRef $aUses) + Local $lUses = 101 + Local $lKit = 0 + Local $lKitMID = 0 + $aUses = 0 + For $bag = 1 to 4 + Local $lBagPtr = GetBagPtr($bag) + Local $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') + For $slot = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 + Local $lItemPtr = MemoryRead($lItemArrayPtr + 4 * ($slot), 'ptr') + If $lItemPtr = 0 Then ContinueLoop + Local $lItemMID = MemoryRead($lItemPtr + 44, 'long') + Switch $lItemMID + Case 2989 + Local $lValue = MemoryRead($lItemPtr + 36, 'short') + If $lValue / 2 < $lUses Then + $lUses = $lValue / 2 + $lKit = $lItemPtr + $lKitMID = $lItemMID + $aUses = $lUses + EndIf + Case 5899 + Local $lValue = MemoryRead($lItemPtr + 36, 'short') + If $lValue / 2.5 < $lUses Then + $lUses = $lValue / 2.5 + $lKit = $lItemPtr + $lKitMID = $lItemMID + $aUses = $lUses + EndIf + Case Else + ContinueLoop + EndSwitch + Next + Next + Return SetExtended($lKitMID, $lKit) +EndFunc ;==>FindIDKitExplorable + +;~ Description: Ignore these items while processing inventory bags. +Func IgnoreItem($aItemPtr) + If $aItemPtr = 0 Then Return True ; not a valid item + If MemoryRead($aItemPtr + 24, 'ptr') <> 0 Then Return True ; customized + If MemoryRead($aItemPtr + 76, 'byte') <> 0 Then Return True ; equipped + If MemoryRead($aItemPtr + 36, 'short') = 0 Then Return True ; value 0 + If MemoryRead($aItemPtr + 12, 'ptr') = 0 Then Return True ; not in a bag + Switch MemoryRead($aItemPtr + 32, 'byte') + Case 11 ; Materials + Return True + Case 8 ; Upgrades + Return True + Case 9 ; Usable + Return True + Case 10 ; Dyes + Return True + Case 29 ; Kits + Return True + Case 34 ; Minipet + Return True + Case 18 ; Keys + Return True + EndSwitch +EndFunc ;==>IgnoreItem + +;~ Description: Returns item ptr of expert salvage kit in inventory with least uses. +Func FindExpertSalvageKit($aStart = 1, $aFinish = 16) + Local $lUses = 101 + Local $lKit = 0 + For $bag = $aStart to $aFinish + Local $lBagPtr = GetBagPtr($bag) + If $lBagPtr = 0 Then ContinueLoop + Local $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') + For $slot = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 + Local $lItemPtr = MemoryRead($lItemArrayPtr + 4 * ($slot), 'ptr') + If $lItemPtr = 0 Then ContinueLoop + Local $lItemMID = MemoryRead($lItemPtr + 44, 'long') + If $lItemMID = 2991 Or $lItemMID = 5900 Then Return $lItemPtr + Switch $lItemMID + Case 2991 + Local $lValue = MemoryRead($lItemPtr + 36, 'short') + If $lValue / 8 < $lUses Then + $lUses = $lValue / 8 + $lKit = $lItemPtr + EndIf + Case 5900 + Local $lValue = MemoryRead($lItemPtr + 36, 'short') + If $lValue / 10 < $lUses Then + $lUses = $lValue / 10 + $lKit = $lItemPtr + EndIf + EndSwitch + Next + Next + Return $lKit +EndFunc ;==>FindExpertSalvageKit + +;~ Description: Returns item ptr of expert salvage kit in inventory with least uses. +Func FindCheapSalvageKit($aStart = 1, $aFinish = 16) + Local $lUses = 101 + Local $lKit = 0 + For $bag = $aStart to $aFinish + Local $lBagPtr = GetBagPtr($bag) + If $lBagPtr = 0 Then ContinueLoop + Local $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') + For $slot = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 + Local $lItemPtr = MemoryRead($lItemArrayPtr + 4 * ($slot), 'ptr') + If $lItemPtr = 0 Then ContinueLoop + Local $lItemMID = MemoryRead($lItemPtr + 44, 'long') + If $lItemMID = 2992 Or $lItemMID = 2993 Then Return $lItemPtr + Switch $lItemMID + Case 2992, 2993 + Local $lValue = MemoryRead($lItemPtr + 36, 'short') + If $lValue / 2 < $lUses Then + $lUses = $lValue / 2 + $lKit = $lItemPtr + EndIf + EndSwitch + Next + Next + Return $lKit +EndFunc ;==>FindExpertSalvageKit + +;~ Description: Returns item ptr of ID kit in inventory. +Func FindIDKitPtr($aStart = 1, $aFinish = 16) + Local $lUses = 101 + Local $lKit = 0 + For $bag = $aStart to $aFinish + Local $lBagPtr = GetBagPtr($bag) + Local $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') + For $slot = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 + Local $lItemPtr = MemoryRead($lItemArrayPtr + 4 * ($slot), 'ptr') + If $lItemPtr = 0 Then ContinueLoop + Local $lItemMID = MemoryRead($lItemPtr + 44, 'long') + If $lItemMID = 2989 Or $lItemMID = 5899 Then Return $lItemPtr + Next + Next +EndFunc ;==>FindIDKitPtr + +;~ Description: Returns amount of available expert salvage kit uses to salvage mods. +Func ExpertSalvageUses($aStart = 1, $aFinish = 16) + Local $lCount = 0 + For $bag = $aStart to $aFinish + Local $lBagPtr = GetBagPtr($bag) + Local $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') + For $slot = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 + Local $lItemPtr = MemoryRead($lItemArrayPtr + 4 * ($slot), 'ptr') + If $lItemPtr = 0 Then ContinueLoop + Local $lItemMID = MemoryRead($lItemPtr + 44, 'long') + Switch $lItemMID + Case 2991 + $lCount += MemoryRead($lItemPtr + 36, 'short') / 8 + Case 5900 + $lCount += MemoryRead($lItemPtr + 36, 'short') / 10 + EndSwitch + Next + Next + Return $lCount +EndFunc ;==>ExpertSalvageUses + +;~ Description: Returns true if item is a weapon. +Func IsWeapon($aType) + Switch $aType + Case 2,5,12,15,22,24,26,27,32,35,36 + Return True + Case Else + Return False + EndSwitch +EndFunc ;==>IsWeapon + +;~ Description: Returns 1 if item contains insignia to keep, 2 if item contains rune to keep. +Func Upgrades($aItemPtr) +$lModStruct = MemoryReadStruct($aItemPtr + 16, 'ptr;long') +$lMod = MemoryRead(DllStructGetData($lModStruct, 1), 'byte[' & DllStructGetData($lModStruct, 2) * 4 & ']') +For $i = 0 To (UBound($Rune_Insigmia) -1) + If StringInStr($lMod, $Rune_Insigmia[$i][0], 1) <> 0) Then + ConsoleWrite($lMod & " ==> " & @CRLF & $Rune_Insigmia[$i][0] & @CRLF & @CRLF) + Return $Rune_Insigmia[$i][1] + EndIf +Next +Return -1 +EndFunc ;==>Upgrades + +;~ Description: Returns 2 for inscription, 0 and 1 for weapon mods. +Func WeaponMods($aItemPtr) + +Local $lModStruct = MemoryReadStruct($aItemPtr + 16, 'ptr;long') +Local $lMod = MemoryRead(DllStructGetData($lModStruct, 1), 'byte[' & DllStructGetData($lModStruct, 2) * 4 & ']') +Local $lType = MemoryRead($aItemPtr + 32, 'byte') + + +For $i = 0 To (UBound($Upgrades) -1) + If (($Upgrades[$i][13] = True) And (StringInStr($lMod, $Upgrades[$i][0], 1) <> 0) And ($lType = $Upgrades[$i][10])) Then + Local $_array = StringRegExp($lModStruct, '(.{2})(.{2})' & $lMod, $Upgrades[$i][1], 3) + ;_ArrayDisplay($_array, "StringRegExp from WeaponMods ! ") + If (($Upgrades[$i][11] = 4) And ($_array[0] = $Upgrades[$i][8]) Or ($Upgrades[$i][12] = 2) And _ + ($_array[1] = $Upgrades[$i][9])) Then Return $Upgrades[$i][4];mod Pos + EndIf +Next + +Return -1 +EndFunc ;==>WeaponMods + +;~ Description: Sell items. +Func Sell() + For $bag = 1 to 4 ; inventory only + $lBagPtr = GetBagPtr($bag) + If $lBagPtr = 0 Then ContinueLoop + For $slot = 1 to MemoryRead($lBagPtr + 32, 'long') + $lItemPtr = GetItemPtrBySlot($lBagPtr, $slot) + If $lItemPtr = 0 Then ContinueLoop + If IgnoreItem($lItemPtr) Then ContinueLoop + $lItemMID = MemoryRead($lItemPtr + 44, 'long') + If Keepers($lItemMID) Then ContinueLoop + If StackableItems($lItemMID) Then ContinueLoop + If GetRarity($lItemPtr) = 2624 And GetIsRareWeapon($lItemPtr) Then ContinueLoop + If GetIsUnIDed($lItemPtr) Then IdentifyItem($lItemPtr) + Update("Sell Item: " & $bag & ", " & $slot) + SellItem($lItemPtr) + Sleep(500) + Next + Next +EndFunc ;==>Sell + +;~ Description: Sell materials. +Func SellMaterials($aRare = False) + For $bag = 1 to 4 ; inventory only + $lBagPtr = GetBagPtr($bag) + If $lBagPtr = 0 Then ContinueLoop + For $slot = 1 to MemoryRead($lBagPtr + 32, 'long') + $lItemPtr = GetItemPtrBySlot($lBagPtr, $slot) + If $lItemPtr = 0 Then ContinueLoop + If MemoryRead($lItemPtr + 32, 'byte') <> 11 Then ContinueLoop ; not materials + $lItemMID = MemoryRead($lItemPtr + 44, 'long') + $lMatType = CheckMaterial($lItemMID) + If $aRare Then + If $lMatType = 2 Then + For $i = 1 To MemoryRead($lItemPtr + 75, 'byte') + TraderRequestSell($lItemPtr) + Update("Sell rare materials: " & $bag & ", " & $slot) + Sleep(250) + TraderSell() + Next + EndIf + Else + If $lMatType = 1 Then + For $i = 1 To Floor(MemoryRead($lItemPtr + 75, 'byte') / 10) + Update("Sell materials: " & $bag & ", " & $slot) + TraderRequestSell($lItemPtr) + Sleep(250) + TraderSell() + Next + EndIf + EndIf + Next + Next +EndFunc ;==>SellMaterials + +;~ Description: Returns 1 for normal materials and 2 for rare materials. +;~ 0 if ModelID is not listed or mat should be ignored. +Func CheckMaterial($aModelID) + Switch $aModelID + Case 954, 925 ; Chitin, Cloth + Return 1 + Case 929, 933, 934 ; Dust, Feather, Fibers + Return $mDustFeatherFiber + Case 955, 948, 921 ; Granite, Iron, Bones + Return $mGraniteIronBone + Case 940, 946, 953 ; Scale, Tanned Hide, Wood Plank + Return 1 + Case 928, 926, 927 ; Silk, Linen, Damask + Return 2 + Case 931, 932, 923 ; Monstrous Eye, Monstrous Fang, Monstrous Claw + Return 2 + Case 922, 950, 949 ; Charcoal, Deldrimor, Steel Ingot + Return 2 + Case 951, 952, 956 ; Parchment, Vellum, Spiritwood + Return 2 + Case 937, 935, 938 ; Ruby, Diamond, Sapphire + Return 0 + Case 936, 945, 930 ; Onyx, Obsidian Shard, Ectoplasm + Return 0 + Case 941, 942, 943 ; Fur, Leather Square, Elonian Leather Square + Return 2 + Case 944, 939 ; Vial of Ink, Glass Vial + Return 2 + Case 6532, 6533 ; Amber, Jadeite + Return 0 + EndSwitch +EndFunc ;==>CheckMaterial + +;~ Description: Sell runes and insignias. +Func SellUpgrades() + For $bag = 1 to 4 ; inventory only + $lBagPtr = GetBagPtr($bag) + If $lBagPtr = 0 Then ContinueLoop + For $slot = 1 to MemoryRead($lBagPtr + 32, 'long') + $lItemPtr = GetItemPtrBySlot($lBagPtr, $slot) + If $lItemPtr = 0 Then ContinueLoop + If MemoryRead($lItemPtr + 32, 'byte') <> 8 Then ContinueLoop ; not an upgrade + If IsRuneOrInsignia(MemoryRead($lItemPtr + 44, 'long')) = 0 Then ContinueLoop ; neither rune, nor insignia + TraderRequestSell($lItemPtr) + Sleep(250) + Update("Sell Upgrade: " & $bag & ", " & $slot) + TraderSell() + Next + Next +EndFunc ;==>SellUpgrades + +;~ Description: Sell all dyes to Dye Trader except for black and white. +Func SellDyes() + For $bag = 1 to 4 ; inventory only + $lBagPtr = GetBagPtr($bag) + If $lBagPtr = 0 Then ContinueLoop + For $slot = 1 to MemoryRead($lBagPtr + 32, 'long') + $lItemPtr = GetItemPtrBySlot($lBagPtr, $slot) + If $lItemPtr = 0 Then ContinueLoop + $lItemMID = MemoryRead($lItemPtr + 44, 'long') + If $lItemMID <> 146 Then ContinueLoop ; not a dye + If $mBlackWhite Then + $lItemExtraID = MemoryRead($lItemPtr + 34, 'short') + If $lItemExtraID = 10 Or $lItemExtraID = 12 Then ContinueLoop ; black or white + EndIf + For $i = 1 To MemoryRead($lItemPtr + 75, 'byte') + Update("Sell Dye: " & $bag & ", " & $slot) + TraderRequestSell($lItemPtr) + Sleep(250) + TraderSell() + Next + Next + Next +EndFunc ;==>SellDyes + +;~ Description: Tries to make room by selling in different order and selling stuff that wasnt expressly forbidden / defined in Junk(). +Func ClearInventorySpace($aMapID) + ; first stage: sell dyes, runes, rare mats, mats, scrolls to try to make room + If GoToMerchant(GetDyeTrader($aMapID)) <> 0 Then SellDyes() + If GoToMerchant(GetRuneTrader($aMapID)) <> 0 Then SellUpgrades() + If GoToMerchant(GetMaterialTrader($aMapID)) <> 0 Then SellMaterials() + If GoToMerchant(GetScrollTrader($aMapID)) <> 0 Then SellScrolls() + If GoToMerchant(GetRareMaterialTrader($aMapID)) <> 0 Then SellMaterials(True) + $lSlots = CountSlots() + If $lSlots > 3 Then Return True ; enough room to proceed as planned + ; second stage: try selling identified purple and gold and everything else thats not expressly forbidden + GoToMerchant(GetMerchant($aMapID)) + For $bag = 1 to 4 ; inventory only + $lBagPtr = GetBagPtr($bag) + If $lBagPtr = 0 Then ContinueLoop + For $slot = 1 to MemoryRead($lBagPtr + 32, 'long') + $lItemPtr = GetItemPtrBySlot($lBagPtr, $slot) + If $lItemPtr = 0 Then ContinueLoop + If MemoryRead($lItemPtr + 24, 'ptr') <> 0 Then ContinueLoop ; customized + If MemoryRead($lItemPtr + 76, 'byte') <> 0 Then ContinueLoop ; equipped + If MemoryRead($lItemPtr + 36, 'short') = 0 Then ContinueLoop ; value 0 + If MemoryRead($lItemPtr + 12, 'ptr') = 0 Then ContinueLoop ; not in a bag + $lItemMID = MemoryRead($lItemPtr + 44, 'long') + If Junk($lItemMID) Then + Update("Sell Item: " & $bag & ", " & $slot) + SellItem($lItemPtr) + Sleep(500) + $lSlots += 1 + If $lSlots > 3 Then Return True + ContinueLoop + EndIf + If Keepers($lItemMID) Then ContinueLoop + If StackableItems($lItemMID) Then ContinueLoop + $lItemRarity = GetRarity($lItemPtr) + If GetIsUnIDed($lItemPtr) Then + If $lItemRarity = 2624 Or $lItemRarity = 2626 Then ; only gold and purple + $lIDKit = FindIDKitPtr() + $lIDKitID = MemoryRead($lIDKit, 'long') + If $lIDKitID = 0 Then ContinueLoop + Update("Identify: " & $bag & ", " & $slot) + IdentifyItem($lItemPtr, $lIDKitID) + Sleep(250) + Do + Sleep(250) + Until Not GetIsUnIDed($lItemPtr) + Else + ContinueLoop + EndIf + EndIf + Switch MemoryRead($lItemPtr + 32, 'byte') + Case 0 + If Upgrades($lItemPtr) Then ContinueLoop + Case 2, 5, 12, 15, 19, 22, 24, 26, 27, 32, 35, 36 + If $lItemRarity = 2621 Then ContinueLoop ; try to keep whites for salvaging + If $mRarityGreen And $lItemRarity = 2627 Then ContinueLoop ; dont sell greens + If WeaponMods($lItemPtr) Then ContinueLoop + Case 4, 7, 13, 16, 19 ; no selling armor pieces + ContinueLoop + Case 11 ; Materials + ContinueLoop + Case 8 ; Upgrades + ContinueLoop + Case 9 ; Usable + ContinueLoop + Case 10 ; Dyes + ContinueLoop + Case 29 ; Kits + ContinueLoop + Case 34 ; Minipet + ContinueLoop + Case 18 ; Keys + Switch $lItemMID + Case 5962 ; Shiverpeak + ContinueLoop + Case 5963 ; Darkstone + ContinueLoop + Case 5961 ; Miners Key + ContinueLoop + Case 6535 ; Kurzick + ContinueLoop + Case 6536 ; Stoneroot + ContinueLoop + Case 6538 ; Luxon + ContinueLoop + Case 6539 ; Deep Jade + ContinueLoop + Case 6534 ; Forbidden + ContinueLoop + Case 15558 ; Vabbian + ContinueLoop + Case 15556 ; Ancient Elonian + ContinueLoop + Case 15560 ; Margonite + ContinueLoop + Case 19174 ; Demonic + ContinueLoop + Case 5882 ; Phantom + ContinueLoop + Case 5971 ; Obsidian + ContinueLoop + Case 22751 ; Lockpick + ContinueLoop + EndSwitch + EndSwitch + Update("Sell Item: " & $bag & ", " & $slot) + SellItem($lItemPtr) + Sleep(500) + $lSlots += 1 + If $lSlots > 3 Then Return True + Next + Next + Return $lSlots > 3 +EndFunc + +;~ Description: Contains all modelIDs of items that could be sold if storage space is low. Use with caution. +Func Junk($aModelID) + Switch $aModelID + Case 460 ; White Mantle Emblem + Return True + Case 461 ; White Mantle Badge + Return True + Case 504 ; Decayed Orr Emblem + Return True + EndSwitch +EndFunc + +;~ Description: Sell all gold rarity scrolls to scroll trader. +Func SellScrolls() + For $bag = 1 to 4 ; inventory only + $lBagPtr = GetBagPtr($bag) + If $lBagPtr = 0 Then ContinueLoop + For $slot = 1 to MemoryRead($lBagPtr + 32, 'long') + $lItemPtr = GetItemPtrBySlot($lBagPtr, $slot) + If $lItemPtr = 0 Then ContinueLoop + If MemoryRead($lItemPtr + 32, 'byte') <> 31 Then ContinueLoop ; not a scroll + If GetRarity($lItemPtr) <> 2624 Then ContinueLoop ; not a scrolltrader scroll + TraderRequestSell($lItemPtr) + Sleep(250) + Update("Sell Scroll: " & $bag & ", " & $slot) + TraderSell() + Next + Next +EndFunc ;==>SellScrolls + +;~ Description: Go to merchant and co, if playernumber wasnt found go to xunlai chest and try again. +Func GoToMerchant($aPlayernumber) +Local $found = False + ; first try + + $lAgentArray = MemoryReadAgentPtrStruct() + For $i = 1 To $lAgentArray[0] + If MemoryRead($lAgentArray[$i] + 244, 'word') = $aPlayernumber Then + GoToNPC($lAgentArray[$i]) + Sleep(500) + Dialog(0x7F) + $found = True + ExitLoop + EndIf + Next + + If Not $found Then + ; merchant wasnt found, next try, but first... go to chest + For $i = 1 To $lAgentArray[0] + If MemoryRead($lAgentArray[$i] + 244, 'word') = 4991 Then + GoToNPC($lAgentArray[$i]) + ExitLoop + EndIf + Next + ; aaaaand... try again to find merchant + $lAgentArray = MemoryReadAgentPtrStruct() + For $i = 1 To $lAgentArray[0] + If MemoryRead($lAgentArray[$i] + 244, 'word') = $aPlayernumber Then + GoToNPC($lAgentArray[$i]) + Sleep(500) + Dialog(0x7F) + $found = True + ExitLoop + EndIf + Next + EndIf + + Return $found +EndFunc ;==>GoToMerchant + +;~ Description: Return merchant depending on MapID. +Func GetMerchant($aMapID) + Switch $aMapID + Case 4, 5, 6, 52, 176, 177, 178, 179 ; proph gh + Return 209 + Case 275, 276, 359, 360, 529, 530, 537, 538 ; factions and nf gh + Return 196 + Case 10, 11, 12, 139, 141, 142, 49, 857 + Return 2030 + Case 109, 120, 154 + Return 1987 + Case 116, 117, 118, 152, 153, 38 + Return 1988 + Case 122, 35 + Return 2130 + Case 123, 124 + Return 2131 + Case 129, 348, 390 + Return 3396 + Case 130, 218, 230, 287, 349, 388 + Return 3397 + Case 131, 21, 25, 36 + Return 2080 + Case 132, 135, 28, 29, 30, 32, 39, 40 + Return 2091 + Case 133, 155, 156, 157, 158, 159, 206, 22, 23, 24 + Return 2101 + Case 134, 81 + Return 2005 + Case 136, 137, 14, 15, 16, 19, 57, 73 + Return 1983 + Case 138 + Return 1969 + Case 193, 234, 278, 288, 391 + Return 3612 + Case 194, 213, 214, 225, 226, 242, 250, 283, 284, 291, 292 + Return 3269 + Case 216, 217, 249, 251 + Return 3265 + Case 219, 224, 273, 277, 279, 289, 297, 350, 389 + Return 3611 + Case 220, 274, 51 + Return 3267 + Case 222, 272, 286, 77 + Return 3395 + Case 248 + Return 1201 + Case 303 + Return 3266 + Case 376, 378, 425, 426, 477, 478 + Return 5379 + Case 381, 387, 421, 424, 427, 554 + Return 5380 + Case 393, 396, 403, 414, 476 + Return 5660 + Case 398, 407, 428, 433, 434, 435 + Return 5659 + Case 431 + Return 4715 + Case 438, 545 + Return 5615 + Case 440, 442, 469, 473, 480, 494, 496 + Return 5607 + Case 450, 559 + Return 4983 + Case 474, 495 + Return 5608 + Case 479, 487, 489, 491, 492, 502, 818 + Return 4714 + Case 555 + Return 4982 + Case 624 + Return 6752 + Case 638 + Return 6054 + Case 639, 640 + Return 6751 + Case 641 + Return 6057 + Case 642 + Return 6041 + Case 643, 645, 650 + Return 6377 + Case 644 + Return 6378 + Case 648 + Return 6583 + Case 652 + Return 6225 + Case 675 + Return 6184 + Case 808 + Return 7442 + Case 814 + Return 104 + EndSwitch +EndFunc ;==>GetMerchant + +;~ Description: Return material trader depending on MapID. +Func GetMaterialTrader($aMapID) + Switch $aMapID + Case 4, 5, 6, 52, 176, 177, 178, 179 ; proph gh + Return 204 + Case 275, 276, 359, 360, 529, 530, 537, 538 ; factions and nf gh + Return 191 + Case 109, 49, 81 + Return 2011 + Case 193 + Return 3618 + Case 194, 242, 857 + Return 3279 + Case 250 + Return 3280 + Case 376 + Return 5385 + Case 398 + Return 5665 + Case 414 + Return 5668 + Case 424 + Return 5386 + Case 433 + Return 5666 + Case 438 + Return 5618 + Case 491 + Return 4720 + Case 492 + Return 4721 + Case 638 + Return 6757 + Case 640 + Return 6758 + Case 641 + Return 6059 + Case 642 + Return 6044 + Case 643 + Return 6383 + Case 644 + Return 6384 + Case 652 + Return 6227 + Case 77 + Return 3409 + Case 808 + Return 7446 + Case 818 + Return 4723 + EndSwitch +EndFunc ;==>GetMaterialTrader + +;~ Description: Return rare material trader depending on MapID. +Func GetRareMaterialTrader($aMapID) + Switch $aMapID + Case 4, 5, 6, 52, 176, 177, 178, 179 ; proph gh + Return 205 + Case 275, 276, 359, 360, 529, 530, 537, 538 ; factions and nf gh + Return 192 + Case 109 + Return 1997 + Case 193 + Return 3621 + Case 194, 250, 857 + Return 3282 + Case 242 + Return 3281 + Case 376 + Return 5388 + Case 398, 433 + Return 5667 + Case 414 + Return 5668 + Case 424 + Return 5387 + Case 438 + Return 5613 + Case 49 + Return 2038 + Case 491, 818 + Return 4723 + Case 492 + Return 4722 + Case 638 + Return 6760 + Case 640 + Return 6759 + Case 641 + Return 6060 + Case 642 + Return 6045 + Case 643 + Return 6386 + Case 644 + Return 6385 + Case 652 + Return 6228 + Case 77 + Return 3410 + Case 81 + Return 2083 + EndSwitch +EndFunc ;==>GetRareMaterialTrader + +;~ Description: Return rune trader depending on MapID. +Func GetRuneTrader($aMapID) + Switch $aMapID + Case 4, 5, 6, 52, 176, 177, 178, 179 ; proph gh + Return 203 + Case 275, 276, 359, 360, 529, 530, 537, 538 ; factions and nf gh + Return 190 + Case 109, 814 + Return 1999 + Case 193 + Return 3624 + Case 194, 242, 250 + Return 3285 + Case 248, 857 + Return 1975 + Case 396 + Return 5672 + Case 414 + Return 5671 + Case 438 + Return 5620 + Case 477 + Return 5390 + Case 487 + Return 4726 + Case 49 + Return 2039 + Case 502 + Return 4727 + Case 624 + Return 6764 + Case 640 + Return 6763 + Case 642 + Return 6046 + Case 643, 645 + Return 6389 + Case 644 + Return 6390 + Case 77 + Return 3415 + Case 808 + Return 7450 + Case 81 + Return 2085 + Case 818 + Return 4705 + EndSwitch +EndFunc ;==>GetRuneTrader + +;~ Description: Return dye trader depending on MapID. +Func GetDyeTrader($aMapID) + Switch $aMapID + Case 4, 5, 6, 52, 176, 177, 178, 179 ; proph gh + Return 206 + Case 275, 276, 359, 360, 529, 530, 537, 538 ; factions and nf gh + Return 193 + Case 109, 49, 81, 857 + Return 2010 + Case 193 + Return 3617 + Case 194, 242 + Return 3278 + Case 250 + Return 3277 + Case 286 + Return 3402 + Case 381, 477 + Return 5383 + Case 403 + Return 5663 + Case 414 + Return 5664 + Case 640 + Return 6756 + Case 642 + Return 6043 + Case 644 + Return 6382 + Case 77 + Return 3401 + Case 812 + Return 2107 + Case 818 + Return 4719 + EndSwitch +EndFunc ;==>GetDyeTrader + +;~ Description: Return scroll trader depending on MapID. +Func GetScrollTrader($aMapID) + Switch $aMapID + Case 4, 5, 6, 52, 176, 177, 178, 179 ; proph gh + Return 207 + Case 275, 276, 359, 360, 529, 530, 537, 538 ; factions and nf gh + Return 194 + Case 109 + Return 1998 + Case 193 + Return 3623 + Case 194 + Return 3283 + Case 287 + Return 3413 + Case 396, 414 + Return 5669 + Case 426, 857 + Return 5392 + Case 442, 480 + Return 5621 + Case 49 + Return 2040 + Case 624 + Return 6761 + Case 638 + Return 6056 + Case 639, 640 + Return 6762 + Case 643, 644 + Return 6387 + Case 645 + Return 6388 + Case 77 + Return 3412 + Case 808 + Return 7448 + EndSwitch +EndFunc ;==>GetScrollTrader diff --git a/gwApi/items.au3 b/gwApi/items.au3 index 50f64db..d6650ad 100644 --- a/gwApi/items.au3 +++ b/gwApi/items.au3 @@ -1,1350 +1,1376 @@ -#include-once - -#Region Ptr -#Region Items -;~ Description: Returns ptr of an item. -Func GetItemPtr($aItemID) - If $ItemBasePtr = 0 Then $ItemBasePtr = MemoryRead($mBasePtr1840 + 0xB8) - Return MemoryRead($ItemBasePtr + 0x4 * $aItemID, 'ptr') -EndFunc ;==>GetItemPtr - -;~ Description: Returns Itemptr by Bag- and Slotnumber. -Func GetItemPtrBySlot($aBag, $aSlot) - If IsPtr($aBag) Then - Local $lBagPtr = $aBag - ElseIf IsDllStruct($aBag) Then - Local $lBagPtr = GetBagPtr(DllStructGetData($aBag, 'index') + 1) - Else - If $aBag < 1 Or $aBag > 17 Then Return 0 - If $aSlot < 1 Or $aSlot > GetMaxSlots($aBag) Then Return 0 - Local $lBagPtr = GetBagPtr($aBag) - EndIf - Local $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') - Return MemoryRead($lItemArrayPtr + 4 * ($aSlot - 1), 'ptr') -EndFunc ;==>GetItemPtrBySlot - -;~ Description: Returns Itemptr by agentid. -Func GetItemPtrByAgentID($aAgentID) - Local $lItemArraySize = MemoryRead($mBasePtr1840 + 0xC0) - Local $lItemPtr, $lItemID, $lAgentID - For $lItemID = 1 To $lItemArraySize - $lItemPtr = GetItemPtr($lItemID) - $lAgentID = MemoryRead($lItemPtr + 4, 'long') - If $lAgentID = $aAgentID Then Return $lItemPtr - Next -EndFunc ;==>GetItemPtrByAgentID - -;~ Description: Returns Item ptr via ModelID. -Func GetItemPtrByModelID($aModelID, $aBagsOnly = False) - Local $lItemArraySize = MemoryRead($mBasePtr1840 + 0xC0) - Local $lItemPtr, $lItemID - For $lItemID = 1 To $lItemArraySize - $lItemPtr = GetItemPtr($lItemID) - If MemoryRead($lItemPtr + 44, 'long') = $aModelID Then - If Not $aBagsOnly Then Return $lItemPtr - If MemoryRead($lItemPtr + 12, 'ptr') = 0 Then ContinueLoop - Return $lItemPtr - EndIf - Next -EndFunc ;==>GetItemPtrByModelID - -;~ Description: Returns agentID of item on the ground with ModelID. -Func GetAgentIDByModelID($aModelID) - Local $lItemArraySize = MemoryRead($mBasePtr1840 + 0xC0) - Local $lItemPtr, $lItemID, $lAgentID - For $lItemID = 1 To $lItemArraySize - $lItemPtr = GetItemPtr($lItemID) - If MemoryRead($lItemPtr + 44, 'long') = $aModelID Then - $lAgentID = MemoryRead($lItemPtr + 4, 'long') - If $lAgentID <> 0 Then Return $lAgentID - EndIf - Next -EndFunc - -;~ Description: Returns first itemptr in Bags with correct ModelID. -;~ Bags to be searched are stored in $aBagNrArray, with first Element being the amount of bags. -Func GetBagItemPtrByModelID($aModelID, ByRef Const $aBagNumberArray) - Local $lLastQuantity = 0 - Local $lReturn = 0 - Local $lBagPtr, $lSlots, $lItemArrayPtr, $lItemPtr - For $i = 1 to $aBagNumberArray[0] - $lBagPtr = GetBagPtr($aBagNumberArray[$i]) - $lSlots = MemoryRead($lBagPtr + 32, 'long') - $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') - For $slot = 0 To $lSlots - 1 - $lItemPtr = MemoryRead($lItemArrayPtr + 4 * $slot, 'ptr') - If MemoryRead($lItemPtr + 44, 'long') = $aModelID Then Return $lItemPtr - Next - Next -EndFunc ;==>GetBagItemPtrByModelID -#EndRegion Items - -#Region Bags -;~ Description: Returns ptr of an inventory bag. -Func GetBagPtr($aBagNumber) - If $BagBasePtr = 0 Then $BagBasePtr = MemoryRead($mBasePtr1840 + 0xF8) - Return MemoryRead($BagBasePtr + 0x4 * $aBagNumber) -EndFunc ;==>GetBagPtr - -;~ Description: Returns array with existing bag's ptrs, first entry is amount of existing bags. -Func GetExistingBagPtrArray() - Local $lBagArray[18] - Local $lBagPtr, $lBagCount = 0 - For $i = 1 to 17 - $lBagPtr = GetBagPtr($i) - If $lBagPtr <> 0 Then - $lBagCount += 1 - $lBagArray[$lBagCount] = $lBagPtr - EndIf - Next - $lBagArray[0] = $lBagCount - ReDim $lBagArray[$lBagCount+1] - Return $lBagArray -EndFunc ;==>GetExistingBagPtrArray -#EndRegion Bags -#EndRegion Ptr - -#Region Inventory and Storage -#Region Slots -;~ Description: Returns amount of slots of bag. -Func GetMaxSlots($aBag) - If IsPtr($aBag) Then - Return MemoryRead($aBag + 32, 'long') - Else - Return MemoryRead(GetBagPtr($aBag) + 32, 'long') - EndIf -EndFunc ;==>GetMaxSlots - -;~ Description: Returns amount of slots available to character. -Func GetMaxTotalSlots() - Local $SlotCount = 0, $lBagPtr - For $Bag = 1 to 5 - $lBagPtr = GetBagPtr($Bag) - $SlotCount += MemoryRead($lBagPtr + 32, 'long') - Next - For $Bag = 8 to 17 - $lBagPtr = GetBagPtr($Bag) - $SlotCount += MemoryRead($lBagPtr + 32, 'long') - Next - Return $SlotCount -EndFunc ;==>GetMaxTotalSlots - -;~ Description: Returns number of free slots in inventory. -Func CountSlots() - Local $lCount = 0, $lBagPtr - For $lBag = 1 To 4 - $lBagPtr = GetBagPtr($lBag) - If $lBagPtr = 0 Then ContinueLoop - $lCount += MemoryRead($lBagPtr + 32, 'long') - MemoryRead($lBagPtr + 16, 'long') - Next - Return $lCount -EndFunc ;==>CountSlots - -;~ Description: Returns number of free slots in storage. -Func CountSlotsChest() - Local $lCount = 0, $lBagPtr - For $lBag = 8 To 16 - $lBagPtr = GetBagPtr($lBag) - If $lBagPtr = 0 Then ContinueLoop - $lCount += MemoryRead($lBagPtr + 32, 'long') - MemoryRead($lBagPtr + 16, 'long') - Next - Return $lCount -EndFunc ;==>CountSlotsChest -#EndRegion Slots - -#Region FindItemInfo -;~ Description: Returns first empty slotnumber found or, if no empty slot is found, returns 0. -Func FindEmptySlot($aBag) - If IsPtr($aBag) <> 0 Then - Local $lBagPtr = $aBag - Local $lSlots = MemoryRead($aBag + 32, 'long') - ElseIf IsDllStruct($aBag) <> 0 Then - Local $lBagPtr = GetBagPtr(DllStructGetData($aBag, 'index') + 1) - Local $lSlots = DllStructGetData($aBag, 'slots') - Else - Local $lBagPtr = GetBagPtr($aBag) - Local $lSlots = MemoryRead($lBagPtr + 32, 'long') - EndIf - Local $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') - Local $lItemPtr - For $i = 0 To $lSlots - 1 - $lItemPtr = MemoryRead($lItemArrayPtr + 4 * $i, 'ptr') - If $lItemPtr = 0 Then Return $i + 1 - Next -EndFunc ;==>FindEmptySlot - -;~ Description: Returns amount of items in inventory with $aModelID. -Func CountInventoryItem($aModelID) - Local $lCount = 0, $lBagPtr, $lItemArrayPtr, $lItemPtr - For $i = 1 To 4 - $lBagPtr = GetBagPtr($i) - If $lBagPtr = 0 Then ContinueLoop - $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') - For $j = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 - $lItemPtr = MemoryRead($lItemArrayPtr + 4 * $j, 'ptr') - If $lItemPtr = 0 Then ContinueLoop - If MemoryRead($lItemPtr + 44, 'long') = $aModelID Then $lCount += MemoryRead($lItemPtr + 75, 'byte') - Next - Next - Return $lCount -EndFunc ;==>CountInventoryItem - -;~ Description: Returns array with itemIDs of Items in Bags with correct ModelID. -Func GetBagItemIDArrayByModelID($aModelID) - Local $lRetArr[291][3] - Local $lCount = 0 - Local $lBagPtr, $lItemArrayPtr, $lItemPtr, $lItemID - For $bag = 1 to 17 - $lBagPtr = GetBagPtr($bag) - If $lBagPtr = 0 Then ContinueLoop - $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') - For $slot = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 - $lItemPtr = MemoryRead($lItemArrayPtr + 4 * $slot, 'ptr') - If MemoryRead($lItemPtr + 44, 'long') = $aModelID Then - $lItemID = MemoryRead($lItemPtr, 'long') - $lRetArr[$lCount][0] = $lItemID - $lRetArr[$lCount][1] = $bag - $lRetArr[$lCount][2] = $slot + 1 - $lCount += 1 - EndIf - Next - Next - ReDim $lRetArr[$lCount][3] - Return $lRetArr -EndFunc ;==>GetBagItemIDArrayByModelID - -;~ Description: Returns item ID of salvage kit in inventory. -Func FindSalvageKit($aStart = 1, $aFinish = 16) - Local $lUses = 101 - Local $lKit = 0 - Local $lBagPtr, $lItemArrayPtr, $lItemPtr, $lValue - For $bag = $aStart to $aFinish - $lBagPtr = GetBagPtr($bag) - If $lBagPtr = 0 Then ContinueLoop - $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') - For $slot = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 - $lItemPtr = MemoryRead($lItemArrayPtr + 4 * ($slot), 'ptr') - If $lItemPtr = 0 Then ContinueLoop - Switch MemoryRead($lItemPtr + 44, 'long') - Case 2992, 2993 - $lValue = MemoryRead($lItemPtr + 36, 'short') - If $lValue / 2 < $lUses Then - $lUses = $lValue / 2 - $lKit = MemoryRead($lItemPtr, 'long') - EndIf - Case 2991 - $lValue = MemoryRead($lItemPtr + 36, 'short') - If $lValue / 8 < $lUses Then - $lUses = $lValue / 8 - $lKit = MemoryRead($lItemPtr, 'long') - EndIf - Case 5900 - $lValue = MemoryRead($lItemPtr + 36, 'short') - If $lValue / 10 < $lUses Then - $lUses = $lValue / 10 - $lKit = MemoryRead($lItemPtr, 'long') - EndIf - EndSwitch - Next - Next - Return $lKit -EndFunc ;==>FindSalvageKit - -;~ Description: Returns amount of salvage uses. -Func SalvageUses($aStart = 1, $aFinish = 16) - Local $lCount = 0 - Local $lBagPtr, $lItemArrayPtr, $lItemPtr - For $bag = $aStart to $aFinish - $lBagPtr = GetBagPtr($bag) - If $lBagPtr = 0 Then ContinueLoop - $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') - For $slot = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 - $lItemPtr = MemoryRead($lItemArrayPtr + 4 * ($slot), 'ptr') - If $lItemPtr = 0 Then ContinueLoop - Switch MemoryRead($lItemPtr + 44, 'long') - Case 2992, 2993 - $lCount += MemoryRead($lItemPtr + 36, 'short') / 2 - Case 2991 - $lCount += MemoryRead($lItemPtr + 36, 'short') / 8 - Case 5900 - $lCount += MemoryRead($lItemPtr + 36, 'short') / 10 - EndSwitch - Next - Next - Return $lCount -EndFunc ;==>SalvageUses - -;~ Description: Returns item ID of ID kit in inventory. -Func FindIDKit($aStart = 1, $aFinish = 16) - Local $lUses = 101 - Local $lKit = 0 - Local $lBagPtr, $lItemArrayPtr, $lItemPtr, $lValue - For $bag = $aStart to $aFinish - $lBagPtr = GetBagPtr($bag) - If $lBagPtr = 0 Then ContinueLoop - $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') - For $slot = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 - $lItemPtr = MemoryRead($lItemArrayPtr + 4 * ($slot), 'ptr') - If $lItemPtr = 0 Then ContinueLoop - Switch MemoryRead($lItemPtr + 44, 'long') - Case 2989 - $lValue = MemoryRead($lItemPtr + 36, 'short') - If $lValue / 2 < $lUses Then - $lUses = $lValue / 2 - $lKit = MemoryRead($lItemPtr, 'long') - EndIf - Case 5899 - $lValue = MemoryRead($lItemPtr + 36, 'short') - If $lValue / 2.5 < $lUses Then - $lUses = $lValue / 2.5 - $lKit = MemoryRead($lItemPtr, 'long') - EndIf - EndSwitch - Next - Next - Return $lKit -EndFunc ;==>FindIDKit - -;~ Description: Returns amount of ID kit uses. -Func FindIDKitUses($aStart = 1, $aFinish = 16) - Local $lUses = 0 - Local $lBagPtr, $lItemArrayPtr, $lItemPtr - For $bag = $aStart to $aFinish - $lBagPtr = GetBagPtr($bag) - If $lBagPtr = 0 Then ContinueLoop - $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') - For $slot = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 - $lItemPtr = MemoryRead($lItemArrayPtr + 4 * ($slot), 'ptr') - If $lItemPtr = 0 Then ContinueLoop - Switch MemoryRead($lItemPtr + 44, 'long') - Case 2989 - $lUses += MemoryRead($lItemPtr + 36, 'short') / 2 - Case 5899 - $lUses += MemoryRead($lItemPtr + 36, 'short') / 2.5 - Case Else - ContinueLoop - EndSwitch - Next - Next - Return $lUses -EndFunc ;==>FindIDKitUses - -;~ Description: Returns amount of items of ModelID in inventory. -Func CountItemInBagsByModelID($aItemModelID) - Local $lCount = 0 - Local $lBagPtr, $lItemArrayPtr, $lItemPtr - For $bag = 1 To 4 - $lBagPtr = GetBagPtr($bag) - If $lBagPtr = 0 Then ContinueLoop - $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') - For $slot = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 - $lItemPtr = MemoryRead($lItemArrayPtr + 4 * $slot, 'ptr') - If $lItemPtr = 0 Then ContinueLoop - If MemoryRead($lItemPtr + 44, 'long') = $aItemModelID Then $lCount += MemoryRead($lItemPtr + 75, 'byte') - Next - Next - Return $lCount -EndFunc ;==>CountItemInBagsByModelID - -;~ Description: Returns amount of items of ModelID in storage. -Func CountItemInStorageByModelID($aItemModelID) ; Bag 6 is Material Storage, which is not included - Local $lCount = 0 - Local $lBagPtr, $lItemArrayPtr, $lItemPtr - For $bag = 8 To 16 - $lBagPtr = GetBagPtr($bag) - If $lBagPtr = 0 Then ContinueLoop - $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') - For $slot = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 - $lItemPtr = MemoryRead($lItemArrayPtr + 4 * $slot, 'ptr') - If $lItemPtr = 0 Then ContinueLoop - If MemoryRead($lItemPtr + 44, 'long') = $aItemModelID Then $lCount += MemoryRead($lItemPtr + 75, 'byte') - Next - Next - Return $lCount -EndFunc ;==>CountItemInStorageByModelID - -;~ Description: Returns amount of items of ModelID. -Func CountItemTotalByModelID($aItemModelID, $aIncludeMats = True) - Local $lCount = 0 - Local $lBagPtr, $lItemArrayPtr, $lItemPtr - If $aIncludeMats Then - Local $lBagSearch[15] = [14,1,2,3,4,5,6,8,10,11,12,13,14,15,16] - Else - Local $lBagSearch[14] = [13,1,2,3,4,5,8,10,11,12,13,14,15,16] - EndIf - For $i = 1 To $lBagSearch[0] - $lBagPtr = GetBagPtr($lBagSearch[$i]) - If $lBagPtr = 0 Then ContinueLoop - $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') - For $slot = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 - $lItemPtr = MemoryRead($lItemArrayPtr + 4 * $slot, 'ptr') - If $lItemPtr = 0 Then ContinueLoop - If MemoryRead($lItemPtr + 44, 'long') = $aItemModelID Then $lCount += MemoryRead($lItemPtr + 75, 'byte') - Next - Next - Return $lCount -EndFunc ;==>CountItemTotalByModelID -#EndRegion FindItemInfo - -#Region Salvage -;~ Description: Starts a salvaging session of an item. -Func StartSalvage($aItem, $aSalvageKitID = 0) - If IsPtr($aItem) <> 0 Then - Local $lItemID = MemoryRead($aItem, 'long') - ElseIf IsDllStruct($aItem) <> 0 Then - Local $lItemID = DllStructGetData($aItem, 'ID') - Else - Local $lItemID = $aItem - EndIf - Local $lSalvageSessionID = MemoryRead($mBasePtr182C + 0x690) - If $aSalvageKitID = 0 Then - Local $lSalvageKitID = FindSalvageKit() - Else - Local $lSalvageKitID = $aSalvageKitID - EndIf - ConsoleWrite("$lSalvageKitID = " & $lSalvageKitID & @CRLF) - If $lSalvageKitID = 0 Then Return False - DllStructSetData($mSalvage, 2, $lItemID) - DllStructSetData($mSalvage, 3, $lSalvageKitID) - DllStructSetData($mSalvage, 4, $lSalvageSessionID) - If Not Enqueue($mSalvagePtr, 16) Then Return False - Return SetExtended($lSalvageSessionID, $lSalvageKitID) -EndFunc ;==>StartSalvage -;~ Description: Salvage the materials out of an item. -Func SalvageMaterials() - Return SendPacket(0x4, 0x74) -EndFunc ;==>SalvageMaterials - - -Func StartSalvageWithPacket($aItem, $aSalvageKitID = 0) -;~ Start Salvage -;~ Size = 16 Header = 113 Value Of Elements = 5 -;~ 0x10, 0x71, 0x15, 0x6A, 0x5D - -If IsPtr($aItem) <> 0 Then - Local $lItemID = MemoryRead($aItem, 'long') -Else - Local $lItemID = $aItem -EndIf - -Local $lSalvageSessionID = MemoryRead($mBasePtr182C + 0x690) - -If $aSalvageKitID = 0 Then - Local $lSalvageKitID = FindSalvageKit() -Else - Local $lSalvageKitID = $aSalvageKitID -EndIf - -ConsoleWrite("$lSalvageKitID = " & $lSalvageKitID & @CRLF) - -If $lSalvageKitID = 0 Then Return False -SendPacket(0x10, 0x71, $lItemID, $lSalvageKitID, $lSalvageSessionID) - -EndFunc ;==>StartSalvage - -;~ Description: Salvages a mod out of an item. -;~ ModIndex: 0 -> Insignia, 1 -> Rune for armor upgrades. -Func SalvageMod($aModIndex) -;~ If $aModIndex > 0 Then - SendPacket(0x8, 0x75, $aModIndex) -;~ Sleep(GetPing()+ 250) -;~ EndIf - -;~ SendPacket(0x4, 0x73) -EndFunc ;==>SalvageMod - -Func Chancel() -Return SendPacket(0x4, 0x72) -EndFunc -#EndRegion Salvage - -#Region ItemActions -;~ Description: Identifies an item. -Func IdentifyItem($aItem, $aIDKit = 0) - If IsPtr($aItem) <> 0 Then - Local $lItemID = MemoryRead($aItem, 'long') - ElseIf IsDllStruct($aItem) <> 0 Then - Local $lItemID = DllStructGetData($aItem, 'ID') - Else - Local $lItemID = $aItem - EndIf - If $aIDKit = 0 Then - Local $lIDKit = FindIDKit() - Else - Local $lIDKit = $aIDKit - EndIf - If $lIDKit = 0 Then Return False - Local $lTimer = TimerInit() - Local $lDeadlock - While GetIsUnIDed($aItem) And TimerDiff($lTimer) < 30000 - SendPacket(0xC, 0x66, $lIDKit, $lItemID) - $lDeadlock = TimerInit() - Do - Sleep(250) - If GetIsIDed($aItem) Then Return True - Until TimerDiff($lDeadlock) > 5000 - WEnd -EndFunc ;==>IdentifyItem - -;~ Description: Equips an item. -Func EquipItem($aItem) - If IsPtr($aItem) <> 0 Then - Return SendPacket(0x8, 0x2A, MemoryRead($aItem, 'long')) - ElseIf IsDllStruct($aItem) <> 0 Then - Return SendPacket(0x8, 0x2A, DllStructGetData($aItem, 'ID')) - Else - Return SendPacket(0x8, 0x2A, $aItem) - EndIf -EndFunc ;==>EquipItem - -;~ Description: Uses an item. -Func UseItem($aItem) - If IsPtr($aItem) <> 0 Then - Return SendPacket(0x8, 0x78, MemoryRead($aItem, 'long')) - ElseIf IsDllStruct($aItem) <> 0 Then - Return SendPacket(0x8, 0x78, DllStructGetData($aItem, 'ID')) - Else - Return SendPacket(0x8, 0x78, $aItem) - EndIf -EndFunc ;==>UseItem - -;~ Description: Drops an item. -Func DropItem($aItem, $aAmount = 0) - If IsPtr($aItem) <> 0 Then - If $aAmount = 0 Then $aAmount = MemoryRead($aItem + 75, 'byte') - Return SendPacket(0xC, 0x26, MemoryRead($aItem, 'long'), $aAmount) - ElseIf IsDllStruct($aItem) <> 0 Then - If $aAmount = 0 Then $aAmount = DllStructGetData($aItem, 'Quantity') - Return SendPacket(0xC, 0x26, DllStructGetData($aItem, 'ID'), $aAmount) - Else - If $aAmount = 0 Then $aAmount = MemoryRead(GetItemPtr($aItem) + 75, 'byte') - Return SendPacket(0xC, 0x26, $aItem, $aAmount) - EndIf -EndFunc ;==>DropItem - -;~ Description: Moves an item. -Func MoveItem($aItem, $aBag, $aSlot) - If IsPtr($aItem) <> 0 Then - Local $lItemID = MemoryRead($aItem, 'long') - ElseIf IsDllStruct($aItem) <> 0 Then - Local $lItemID = DllStructGetData($aItem, 'ID') - Else - Local $lItemID = $aItem - EndIf - If IsPtr($aBag) <> 0 Then - Local $lBagID = MemoryRead($aBag + 8, 'long') - ElseIf IsDllStruct($aBag) <> 0 Then - Local $lBagID = DllStructGetData($aBag, 'ID') - Else - Local $lBagID = MemoryRead(GetBagPtr($aBag) + 8, 'long') - EndIf - Return SendPacket(0x10, 0x6C, $lItemID, $lBagID, $aSlot - 1) -EndFunc ;==>MoveItem - -;~ Description: Moves an item, with amount to be moved. -Func MoveItemEx($aItem, $aBag, $aSlot, $aAmount) - If IsPtr($aItem) <> 0 Then - Local $lItemID = MemoryRead($aItem, 'long') - Local $lQuantity = MemoryRead($aItem + 75, 'byte') - ElseIf IsDllStruct($aItem) <> 0 Then - Local $lItemID = DllStructGetData($aItem, 'ID') - Local $lQuantity = DllStructGetData($aItem, 'Quantity') - Else - Local $lItemID = $aItem - Local $lQuantity = MemoryRead(GetItemPtr($aItem) + 75, 'byte') - EndIf - If IsPtr($aBag) <> 0 Then - Local $lBagID = MemoryRead($aBag + 8, 'long') - ElseIf IsDllStruct($aBag) <> 0 Then - Local $lBagID = DllStructGetData($aBag, 'ID') - Else - Local $lBagID = MemoryRead(GetBagPtr($aBag) + 8, 'long') - EndIf - If $lQuantity > $aAmount Then $lQuantity = $aAmount - Return SendPacket(0x14, 0x6F, $lItemID, $lQuantity, $lBagID, $aSlot - 1) -EndFunc ;==>MoveItemEx - -;~ Description: Unequips item to $abag, $aslot (1-based). -;~ Equipmentslots: 1 -> Mainhand/Two-hand -;~ 2 -> Offhand -;~ 3 -> Chestpiece -;~ 4 -> Leggings -;~ 5 -> Headpiece -;~ 6 -> Boots -;~ 7 -> Gloves -Func UnequipItem($aEquipmentSlot, $aBag, $aSlot) - If IsPtr($aBag) Then - Local $lBagID = MemoryRead($aBag + 8, 'long') - ElseIf IsDllStruct($aBag) Then - Local $lBagID = DllStructGetData($aBag, 'ID') - Else - Local $lBagID = MemoryRead(GetBagPtr($aBag) + 8, 'long') - EndIf - Return SendPacket(0x10, 0x49, $aEquipmentSlot - 1, $lBagID, $aSlot - 1) -EndFunc ;==>UnequipItem - -;~ Description: Destroys an item. -Func DestroyItem($aItem) - If IsPtr($aItem) <> 0 Then - Return SendPacket(0x8, 0x63, MemoryRead($aItem, 'long')) - ElseIf IsDllStruct($aItem) <> 0 Then - Return SendPacket(0x8, 0x63, DllStructGetData($aItem, 'ID')) - Else - Return SendPacket(0x8, 0x63, $aItem) - EndIf -EndFunc ;==>DestroyItem - -;~ Description: Accepts unclaimed items after a mission. -Func AcceptAllItems() - Return SendPacket(0x8, 0x6D, MemoryRead(GetBagPtr(7) + 8, 'long')) -EndFunc ;==>AcceptAllItems -#EndRegion ItemActions -#EndRegion Inventory and Storage - -#Region Merchants -;~ Description: Sells an item. -Func SellItem($aItem, $aQuantity = 0) - If IsPtr($aItem) <> 0 Then - Local $lItemID = MemoryRead($aItem, 'long') - Local $lQuantity = MemoryRead($aItem + 75, 'byte') - Local $lValue = MemoryRead($aItem + 36, 'short') - ElseIf IsDllStruct($aItem) <> 0 Then - Local $lItemID = DllStructGetData($aItem, 'ID') - Local $lQuantity = DllStructGetData($aItem, 'Quantity') - Local $lValue = DllStructGetData($aItem, 'Value') - Else - Local $lItemID = $aItem - Local $lItemPtr = GetItemPtr($aItem) - Local $lQuantity = MemoryRead($lItemPtr + 75, 'byte') - Local $lValue = MemoryRead($lItemPtr + 36, 'short') - EndIf - If $aQuantity = 0 Or $aQuantity > $lQuantity Then $aQuantity = $lQuantity - DllStructSetData($mSellItem, 2, $aQuantity * $lValue) - DllStructSetData($mSellItem, 3, $lItemID) - Return Enqueue($mSellItemPtr, 12) -EndFunc ;==>SellItem - -#Region BuyItem -;~ Description: Buys an item. -Func BuyItem($aItemRow, $aQuantity, $aValue) - Local $lMerchantItemsBase = GetMerchantItemsBase() - If Not $lMerchantItemsBase Then Return - If $aItemRow < 1 Or $aItemRow > GetMerchantItemsSize() Then Return - DllStructSetData($mBuyItem, 2, $aQuantity) - DllStructSetData($mBuyItem, 3, MemoryRead($lMerchantItemsBase + 4 * ($aItemRow - 1))) - DllStructSetData($mBuyItem, 4, $aQuantity * $aValue) - Return Enqueue($mBuyItemPtr, 16) -EndFunc ;==>BuyItem - -;~ Description: Internal use for BuyItem() -Func GetMerchantItemsBase() - Return MemoryRead($mBasePtr182C + 0x24) -EndFunc ;==>GetMerchantItemsBase - -;~ Description: Internal use for BuyItem() -Func GetMerchantItemsSize() - Return MemoryRead($mBasePtr182C + 0x28) -EndFunc ;==>GetMerchantItemsSize - -;~ Description: Buys an ID kit. -Func BuyIDKit($aAmount = 1) - Local $lItemIDRow = GetItemRowByModelID(2989) - If $lItemIDRow = 0 Then Return ; no id kit - Local $lItemPtr = GetItemPtr($lItemIDRow) - Local $lValue = MemoryRead($lItemPtr + 36, 'short') * 2 - DllStructSetData($mBuyItem, 2, $aAmount) - DllStructSetData($mBuyItem, 3, $lItemIDRow) - DllStructSetData($mBuyItem, 4, $lValue * $aAmount) - ConsoleWrite($mBuyItemPtr & @CRLF) - Return SetExtended($lItemPtr, Enqueue($mBuyItemPtr, 16)) -EndFunc ;==>BuyIDKit - -;~ Description: Buys a superior ID kit. -Func BuySuperiorIDKit($aAmount = 1) - Local $lItemIDRow = GetItemRowByModelID(5899) - If $lItemIDRow = 0 Then Return ; no id kit - Local $lItemPtr = GetItemPtr($lItemIDRow) - Local $lValue = MemoryRead($lItemPtr + 36, 'short') * 2 - DllStructSetData($mBuyItem, 2, $aAmount) - DllStructSetData($mBuyItem, 3, $lItemIDRow) - DllStructSetData($mBuyItem, 4, $lValue * $aAmount) - Return SetExtended($lItemPtr, Enqueue($mBuyItemPtr, 16)) -EndFunc ;==>BuySuperiorIDKit - -;~ Description: Buys 3 Salvage Kits. -Func BuySalvageKitThree() - Return BuySalvageKit(3) -EndFunc ;==>BuySalvageKitThree - -;~ Description: Buys 2 Salvage Kits. -Func BuySalvageKitTwo() - Return BuySalvageKit(2) -EndFunc ;==>BuySalvageKitTwo - -;~ Description: Buys 1 Salvage Kits. -Func BuySalvageKit($aAmount = 1) - Local $lItemIDRow = GetItemRowByModelID(2992) - If $lItemIDRow = 0 Then - $lItemIDRow = GetItemRowByModelID(2993) - If $lItemIDRow = 0 Then Return - EndIf - Local $lItemPtr = GetItemPtr($lItemIDRow) - Local $lValue = MemoryRead($lItemPtr + 36, 'short') * 2 - DllStructSetData($mBuyItem, 2, $aAmount) - DllStructSetData($mBuyItem, 3, $lItemIDRow) - DllStructSetData($mBuyItem, 4, $aAmount * $lValue) - Return SetExtended($lItemPtr, Enqueue($mBuyItemPtr, 16)) -EndFunc ;==>BuySalvageKit -#EndRegion Buy - -#Region BuyItemByModelID -;~ Description: Buys an item by modelid instead of row. -Func BuyItemByModelID($aModelID, $aQuantity, $aValue) - Local $lItemIDRow = GetItemRowByModelID($aModelID) - DllStructSetData($mBuyItem, 2, $aQuantity) - DllStructSetData($mBuyItem, 3, $lItemIDRow) - DllStructSetData($mBuyItem, 4, $aQuantity * $aValue) - Return Enqueue($mBuyItemPtr, 16) -EndFunc ;==>BuyItemByModelID - -;~ Description: Internal Use CraftItem and BuyItemByModelID. -Func GetItemRowByModelID($aModelID) - Local $lItemArraySize = MemoryRead($mBasePtr182C + 0x28) - Local $lMerchantBase = MemoryRead($mBasePtr182C + 0x24) - Local $lItemID, $lItemPtr - For $i = 0 To $lItemArraySize - 1 - $lItemID = MemoryRead($lMerchantBase + 4 * $i) - $lItemPtr = GetItemPtr($lItemID) - If $lItemPtr = 0 Then ContinueLoop - If MemoryRead($lItemPtr + 44, 'long') = $aModelID And MemoryRead($lItemPtr + 64, 'long') = 2 Then - Return MemoryRead($lItemPtr, 'long') - EndIf - Next -EndFunc ;==>GetItemRowByModelID -#EndRegion CraftItemEx & BuyItemByModelID - -#Region Trader -;~ Description: Request a quote to buy an item from a trader. Returns true if successful. -Func TraderRequest($aModelID, $aExtraID = -1) - Local $lItemArraySize = MemoryRead($mBasePtr182C + 0x28) - Local $lMerchantBase = MemoryRead($mBasePtr182C + 0x24) - Local $lItemPtr = 0, $lItemID = 0 - Local $lFound = False - For $i = 0 To $lItemArraySize - 1 - $lItemID = MemoryRead($lMerchantBase + 4 * $i) - $lItemPtr = GetItemPtr($lItemID) - If $lItemPtr = 0 Then ContinueLoop - If MemoryRead($lItemPtr + 44, 'long') = $aModelID And MemoryRead($lItemPtr + 12, 'ptr') = 0 And MemoryRead($lItemPtr + 4, 'long') = 0 Then - ConsoleWrite("Trader request found modelid." & @CRLF) - If $aExtraID = -1 Or MemoryRead($lItemPtr + 34, 'short') = $aExtraID Then - $lFound = True - ExitLoop - EndIf - EndIf - Next - If Not $lFound Then Return False - Local $lQuoteID = MemoryRead($mTraderQuoteID) - DllStructSetData($mRequestQuote, 2, $lItemID) - If Not Enqueue($mRequestQuotePtr, 8) Then Return False - Local $lDeadlock = TimerInit() - Do - Sleep(100) - If MemoryRead($mTraderQuoteID) <> $lQuoteID Then Return True - Until TimerDiff($lDeadlock) > GetPing() + 5000 -EndFunc ;==>TraderRequest - -;~ Description: Request a quote to buy an item from a trader. Returns true if successful. -Func TraderRequest_($aModelID, $aExtraID = -1) - Local $lItemArraySize = MemoryRead($mBasePtr1840 + 0xC0) - Local $lItemPtr = 0 - Local $lFound = False - Local $lQuoteID = MemoryRead($mTraderQuoteID) - For $lItemID = 1 To $lItemArraySize - $lItemPtr = GetItemPtr($lItemID) - If $lItemPtr = 0 Then ContinueLoop - If MemoryRead($lItemPtr + 44, 'long') = $aModelID Then - ConsoleWrite("Trader request found modelid." & @CRLF) - If MemoryRead($lItemPtr + 12, 'ptr') = 0 And MemoryRead($lItemPtr + 4, 'long') = 0 Then - If $aExtraID = -1 Or MemoryRead($lItemPtr + 34, 'short') = $aExtraID Then - $lFound = True - ExitLoop - EndIf - EndIf - EndIf - Next - If Not $lFound Then Return False - DllStructSetData($mRequestQuote, 2, $lItemID) - If Not Enqueue($mRequestQuotePtr, 8) Then Return False - Local $lDeadlock = TimerInit() - Do - Sleep(100) - If MemoryRead($mTraderQuoteID) <> $lQuoteID Then Return True - Until TimerDiff($lDeadlock) > GetPing() + 5000 -EndFunc ;==>TraderRequest - -;~ Description: Request a quote to buy a rune from a trader. Returns true if successful. -Func RuneRequestBuy($aModelID, $aModStruct) - Local $lItemArraySize = MemoryRead($mBasePtr1840 + 0xC0) - Local $lItemPtr = 0 - Local $lModStruct = 0 - Local $lBuffer = DllStructCreate('ptr;long') - Local $lFound = False - Local $lQuoteID = MemoryRead($mTraderQuoteID) - For $lItemID = 1 To $lItemArraySize - $lItemPtr = GetItemPtr($lItemID) - If MemoryRead($lItemPtr + 44, 'long') = $aModelID Then - If MemoryRead($lItemPtr + 12, 'ptr') <> 0 Then ContinueLoop - MemoryReadToStruct($lItemPtr + 16, $lBuffer) - $lModStruct = MemoryRead(DllStructGetData($lBuffer, 1), 'byte[' & DllStructGetData($lBuffer, 2) * 4 & ']') - If StringInStr($lModStruct, $aModStruct) <> 0 Then - $lFound = True - ExitLoop - EndIf - EndIf - Next - If Not $lFound Then Return -1 - DllStructSetData($mRequestQuote, 2, $lItemID) - If Not Enqueue($mRequestQuotePtr, 8) Then Return False - Local $lDeadlock = TimerInit() - Do - Sleep(100) - If MemoryRead($mTraderQuoteID) <> $lQuoteID Then Return True - Until TimerDiff($lDeadlock) > GetPing() + 5000 - Return -2 -EndFunc ;==>RuneRequestBuy - -;~ Description: Buy the requested item. -Func TraderBuy() - If Not GetTraderCostID() Or Not GetTraderCostValue() Then Return False - Return Enqueue($mTraderBuyPtr, 4) -EndFunc ;==>TraderBuy - -;~ Description: Request a quote to sell an item to the trader. -Func TraderRequestSell($aItem) - If IsPtr($aItem) <> 0 Then - Local $lItemID = MemoryRead($aItem, 'long') - ElseIf IsDllStruct($aItem) <> 0 Then - Local $lItemID = DllStructGetData($aItem, 'ID') - Else - Local $lItemID = $aItem - EndIf - Local $lFound = False - Local $lQuoteID = MemoryRead($mTraderQuoteID) - DllStructSetData($mRequestQuoteSell, 2, $lItemID) - Enqueue($mRequestQuoteSellPtr, 8) - Local $lDeadlock = TimerInit() - Do - Sleep(20) - $lFound = MemoryRead($mTraderQuoteID) <> $lQuoteID - Until $lFound Or TimerDiff($lDeadlock) > GetPing() + 5000 - Return $lFound -EndFunc ;==>TraderRequestSell - -;~ Description: ID of the item item being sold. -Func TraderSell() - If Not GetTraderCostID() Or Not GetTraderCostValue() Then Return False - Return Enqueue($mTraderSellPtr, 4) -EndFunc ;==>TraderSell - -;~ Description: Returns the item ID of the quoted item. -Func GetTraderCostID() - Return MemoryRead($mTraderCostID) -EndFunc ;==>GetTraderCostID - -;~ Description: Returns the cost of the requested item. -Func GetTraderCostValue() - Return MemoryRead($mTraderCostValue) -EndFunc ;==>GetTraderCostValue -#EndRegion Trader -#EndRegion - -#Region PickingUp -;~ Description: Picks up an item, requires AgentID. -Func PickUpItem($aAgentID) - If IsPtr($aAgentID) <> 0 Then - Return SendPacket(0xC, 0x39, MemoryRead($aAgentID + 44, 'long'), 0) - ElseIf IsDllStruct($aAgentID) <> 0 Then - Return SendPacket(0xC, 0x39, DllStructGetData($aAgentID, 'ID'), 0) - Else - Return SendPacket(0xC, 0x39, ConvertID($aAgentID), 0) - EndIf -EndFunc ;==>PickUpItem - -;~ Description: Picks up loot that has been specified in PickUpList(). -Func PickUpLoot($aMinSlots = 2, $aMyID = GetMyID(), $aMe = GetAgentPtr($aMyID)) - Local $lMeX, $lMeY, $lAgentX, $lAgentY - Local $lSlots = CountSlots() - Local $lAgentArray = GetSortedItemPtrArray($aMe, 0x400) - Local $lItemPtr, $lAgentID, $lItemType, $lDistance, $lOwner, $lItemMID - For $i = 1 To $lAgentArray[0][0] - If GetIsDead($aMe) Then Return False ; died, cant pick up items dead - If GetMapLoading() <> 1 Then Return True ; not in explorable -> no items to pick up - $lAgentID = MemoryRead($lAgentArray[$i][0] + 44, 'long') - $lItemPtr = GetItemPtrByAgentID($lAgentID) - If $lItemPtr = 0 Then ContinueLoop - $lItemType = MemoryRead($lItemPtr + 32, 'byte') - If $lItemType = 20 Then ; coins - UpdateAgentPosByPtr($lAgentArray[$i][0], $lAgentX, $lAgentY) - UpdateAgentPosByPtr($aMe, $lMeX, $lMeY) - $lDistance = Sqrt(($lMeX - $lAgentX) ^ 2 + ($lMeY - $lAgentY) ^ 2) - PickUpItems($lAgentArray[$i][0], $lAgentID, $lAgentX, $lAgentY, $lDistance, $aMe) - EndIf - If $lItemType = 6 Then ; quest items / bundles - If $mPickUpBundles Then - UpdateAgentPosByPtr($lAgentArray[$i][0], $lAgentX, $lAgentY) - UpdateAgentPosByPtr($aMe, $lMeX, $lMeY) - $lDistance = Sqrt(($lMeX - $lAgentX) ^ 2 + ($lMeY - $lAgentY) ^ 2) - PickUpItems($lAgentArray[$i][0], $lAgentID, $lAgentX, $lAgentY, $lDistance, $aMe) - Else - ContinueLoop - EndIf - EndIf - If $lSlots < $aMinSlots Then ; inventory is full - If $lItemType <> 6 And $lItemType <> 20 Then Return False ; quest items and coins - EndIf - $lOwner = MemoryRead($lAgentArray[$i][0] + 196, 'long') - If $lOwner <> 0 And $lOwner <> $aMyID Then ContinueLoop ; assigned to someone else - UpdateAgentPosByPtr($aMe, $lMeX, $lMeY) - UpdateAgentPosByPtr($lAgentArray[$i][0], $lAgentX, $lAgentY) - $lDistance = Sqrt(($lMeX - $lAgentX) ^ 2 + ($lMeY - $lAgentY) ^ 2) - If $lDistance > 2000 Then ContinueLoop ; item is too far away - $lItemMID = MemoryRead($lItemPtr + 44, 'long') - If $mEventModelID <> 0 Then - If $lItemMID = $mEventModelID Then $mEventCount += 1 - EndIf - If Not $mMapPieces Then - If $lItemMID = 24629 Or $lItemMID = 24630 Or $lItemMID = 24631 Or $lItemMID = 24632 Then ContinueLoop ; no map pieces please - EndIf - If $lItemMID = 27977 And Not $mBattlePlans Then ContinueLoop ; no charr battle plans - If $lItemMID = 21797 And Not $mMesmerTomes Then ContinueLoop ; no mesmer tomes - If $lItemMID = 21799 And Not $mElementalistTomes Then ContinueLoop ; no elementalist tomes - If $mPickUpAll Or PickUpList($lItemPtr) Then - PickUpItems($lAgentArray[$i][0], $lAgentID, $lAgentX, $lAgentY, $lDistance, $aMe) - EndIf - Next -EndFunc ;==>PickUpLoot - -;~ Description: Returns item ptr array, sorted by distance from player to speed up looting. -Func GetSortedItemPtrArray($aMe = GetAgentPtr(-2), $aType = 0x400) - Local $lMaxAgents = GetMaxAgents() - Local $lAgentPtrStruct = DllStructCreate("ptr[" & $lMaxAgents & "]") - DllCall($mKernelHandle, "int", "ReadProcessMemory", "handle", $mGWProcHandle, "ptr", MemoryRead($mAgentBase), "struct*", $lAgentPtrStruct, "ulong_ptr", $lMaxAgents * 4, "ulong_ptr*", 0) - Local $lTemp - Local $lAgentArray[$lMaxAgents + 1][2] - For $i = 1 To $lMaxAgents - $lTemp = DllStructGetData($lAgentPtrStruct, 1, $i) - If $lTemp = 0 Then ContinueLoop - If MemoryRead($lTemp + 156, 'long') <> $aType Then ContinueLoop - $lAgentArray[0][0] += 1 - $lAgentArray[$lAgentArray[0][0]][0] = $lTemp - $lAgentArray[$lAgentArray[0][0]][1] = GetPseudoDistance($aMe, $lTemp) - Next - ReDim $lAgentArray[$lAgentArray[0][0] + 1][2] - If $lAgentArray[0][0] > 2 Then QuickSort2D($lAgentArray, 1, $lAgentArray[0][0], 1) - Return $lAgentArray -EndFunc - -;~ Description: Quicksort by distances, internal use GetSortedItemPtrArray. -Func QuickSort2D(ByRef $aArray, Const ByRef $aStart, Const ByRef $aEnd, Const ByRef $aColumn) - If $aEnd <= $aStart Then Return - Local $lTmp - Local $lLeft = $aStart - Local $lRight = $aEnd - Local $lPivot = $aArray[Int(($aStart + $aEnd) / 2)][$aColumn] - Do - If IsNumber($lPivot) Then - While ($aArray[$lLeft][$aColumn] - $lPivot) < 0 And IsNumber($aArray[$lLeft][$aColumn]) - $lLeft += 1 - WEnd - While ($aArray[$lRight][$aColumn] - $lPivot) > 0 And IsNumber($aArray[$lRight][$aColumn]) - $lRight -= 1 - WEnd - EndIf - If $lLeft <= $lRight Then - For $i = 0 To 1 - $lTmp = $aArray[$lLeft][$i] - $aArray[$lLeft][$i] = $aArray[$lRight][$i] - $aArray[$lRight][$i] = $lTmp - Next - $lLeft += 1 - $lRight -= 1 - EndIf - Until $lLeft > $lRight - QuickSort2D($aArray, $aStart, $lRight, $aColumn) - QuickSort2D($aArray, $lLeft, $aEnd, $aColumn) -EndFunc - -;~ Description: Internal use PickUpLoot(). -Func PickUpItems($aPtr, $aAgentID, $aX, $aY, $aDistance, $aMe) - Local $lBlocked = 0 - If $aDistance > 150 And $aDistance <= 500 Then - Move_($aX, $aY) - Do - If Not GetIsMoving($aMe) Then - $lBlocked += 1 - Move_($aX, $aY) - EndIf - Sleep(250) - Until GetDistance($aPtr, $aMe) <= 150 Or $lBlocked > 20 - Else - MoveTo($aX, $aY) - EndIf - Local $lTimer = TimerInit() - Do - PickUpItem($aAgentID) - Sleep(500) - If GetAgentPtr($aAgentID) <> $aPtr Then Return True - Until TimerDiff($lTimer) > 3000 -EndFunc - -;~ Description: Internal use PickUpLoot(). -Func PickUpList($aItemPtr) - Local $lRarity = GetRarity($aItemPtr) - If $lRarity = 2624 Or $lRarity = 2626 And $mLeecher Then Return False ; leecher present to pick up loot - If $lRarity = 2627 Then Return $mRarityGreen ; green items - If $lRarity = 2624 Then Return $mRarityGold ; gold items - Local $lModelID = MemoryRead($aItemPtr + 44, 'long') - If $lModelID = 27977 Then Return $mBattlePlans ; charr battle plans - If $lModelID = 24629 Then Return $mMapPieces ; map top left - If $lModelID = 24630 Then Return $mMapPieces ; map top right - If $lModelID = 24631 Then Return $mMapPieces ; map bottom left - If $lModelID = 24632 Then Return $mMapPieces ; map bottom right - If $lModelID = 6104 Then Return $mQuestItems ; Quest item: Urn - If $lModelID = 6102 Then Return $mQuestItems ; Quest item: Spear - Local $lType = MemoryRead($aItemPtr + 32, 'byte') - Switch $lType - Case 9, 11, 18, 20, 31 ; consumables, materials and z-coins, keys, gold coins, scrolls - Return True - Case 10 ; dyes - Local $lExtraID = MemoryRead($aItemPtr + 34, 'short') - If $lExtraID = 10 Or $lExtraID = 12 Then - Return True ; black and white dye - Else - Return $mDyes - EndIf - Case 21 ; quest items - Return $mQuestItems - EndSwitch - Switch $lModelID - Case 1953, 1956 to 1975 ; froggys - Return True - Case 21786 to 21795 ; elite tomes - Return $mEliteTomes - Case 21796 ; assassin tomes - Return $mTomes - Case 21797 ; mesmer tomes - Return $mMesmerTomes - Case 21798 ; necromancer tomes - Return $mTomes - Case 21799 ; elementalist tomes - Return $mElementalistTomes - Case 21800 ; monk tomes - Return $mTomes - Case 21801 ; warrior tomes - Return $mTomes - Case 21802 ; ranger tomes - Return $mTomes - Case 21803 ; dervish tomes - Return $mTomes - Case 21804 ; ritualist tomes - Return $mTomes - Case 21805 ; paragon tomes - Return $mTomes - Case 21127 to 21131 ; gems - Return True - Case 522, 835, 476, 525, 444, 27047 ; dark remains, feathered scalp, demonic remains, umbral skeletal limb, feathered caromi scalp, glacial stones - Return $mSalvageTrophies - Case 27033, 27035, 27036, 27050, 27974 ; destroyer core, saurian bone, amphibian tongue, elemental dust, undead bone - Return True - Case 28434, 18345, 21491, 37765, 30855, 22191, 22190 ; Event items - Return True - EndSwitch - If GetIsIronItem($lModelID) Then Return True - Return GetIsRareWeapon($aItemPtr) -EndFunc ;==>PickUpList -#EndRegion - -#Region Itemstats -;~ Description: Returns rarity (name color) of an item. -Func GetRarity($aItem) - If IsPtr($aItem) <> 0 Then - Local $lNameString = MemoryRead($aItem + 56, 'ptr') - ElseIf IsDllStruct($aItem) <> 0 Then - Local $lNameString = DllStructGetData($aItem, 'Namestring') - Else - Local $lNameString = MemoryRead(GetItemPtr($aItem) + 56, 'ptr') - EndIf - If $lNameString = 0 Then Return - Return MemoryRead($lNameString, 'ushort') -EndFunc ;==>GetRarity - -;~ Description: Tests if an item is identified. -Func GetIsIDed($aItem) - If IsPtr($aItem) <> 0 Then - Return BitAND(MemoryRead($aItem + 40, 'short'), 1) > 0 - ElseIf IsDllStruct($aItem) <> 0 Then - Return BitAND(DllStructGetData($aItem, 'interaction'), 1) > 0 - Else - Return BitAND(MemoryRead(GetItemPtr($aItem) + 40, 'short'), 1) > 0 - EndIf -EndFunc ;==>GetIsIDed - -;~ Descriptions: Tests if an item is unidentfied and can be identified. -Func GetIsUnIDed($aItem) - If IsPtr($aItem) <> 0 Then - Return BitAND(MemoryRead($aItem + 40, 'long'), 8388608) > 0 - ElseIf IsDllStruct($aItem) <> 0 Then - Return BitAND(DllStructGetData($aItem, 'interaction'), 8388608) > 0 - Else - Return BitAND(MemoryRead(GetItemPtr($aItem) + 40, 'long'), 8388608) > 0 - EndIf -EndFunc ;==>GetIsUnIDed - -;~ Description: Returns true if item has a suffix, prefix or inscription in it that isnt fixed. -Func GetIsUpgraded($lItemPtr) - Local $lInteraction = MemoryRead($lItemPtr + 40) - If BitAnd($lInterAction, 68222976) Then Return True -EndFunc - -;~ Description: Returns a weapon or shield's minimum required attribute. -Func GetItemReq($aItem) - Local $lMod = GetModByIdentifier($aItem, "9827") - Return $lMod[0] -EndFunc ;==>GetItemReq - -;~ Description: Returns a weapon or shield's required attribute. -Func GetItemAttribute($aItem) - Local $lMod = GetModByIdentifier($aItem, "9827") - Return $lMod[1] -EndFunc ;==>GetItemAttribute - -;~ Description: Returns an array of the requested mod. -Func GetModByIdentifier($aItem, $aIdentifier) - Local $lReturn[2] - Local $lString = StringTrimLeft(GetModStruct($aItem), 2) - For $i = 0 To StringLen($lString) / 8 - 2 - If StringMid($lString, 8 * $i + 5, 4) == $aIdentifier Then - $lReturn[0] = Int("0x" & StringMid($lString, 8 * $i + 1, 2)) - $lReturn[1] = Int("0x" & StringMid($lString, 8 * $i + 3, 2)) - ExitLoop - EndIf - Next - Return $lReturn -EndFunc ;==>GetModByIdentifier - -;~ Description: Returns modstruct of an item. -Func GetModStruct($aItem) - If IsPtr($aItem) <> 0 Then - Local $lBuffer = DllStructCreate('ptr;long') - MemoryReadToStruct($aItem + 16, $lBuffer) - If DllStructGetData($lBuffer, 1) <> 0 Then - Return MemoryRead(DllStructGetData($lBuffer, 1), 'Byte[' & DllStructGetData($lBuffer, 2) * 4 & ']') - EndIf - ElseIf IsDllStruct($aItem) <> 0 Then - Local $lModstruct = DllStructGetData($aItem, 'modstruct') - Local $lModSize = DllStructGetData($aItem, 'modstructsize') - If $lModstruct <> 0 Then - Return MemoryRead($lModstruct, 'Byte[' & $lModSize * 4 & ']') - EndIf - Else - Local $lBuffer = DllStructCreate('ptr;long') - MemoryReadToStruct(GetItemPtr($aItem) + 16, $lBuffer) - If DllStructGetData($lBuffer, 1) <> 0 Then - Return MemoryRead(DllStructGetData($lBuffer, 1), 'Byte[' & DllStructGetData($lBuffer, 2) * 4 & ']') - EndIf - EndIf -EndFunc ;==>GetModStruct - -;~ Description: Tests if an item is assigned to you. -Func GetAssignedToMe($aAgent) - If IsPtr($aAgent) <> 0 Then - Local $lOwner = MemoryRead($aAgent + 196, 'long') - ElseIf IsDllStruct($aAgent) <> 0 Then - Local $lOwner = DllStructGetData($aAgent, 'Owner') - Else - Local $lOwner = MemoryRead(GetAgentPtr($aAgent) + 196, 'long') - EndIf - If $lOwner = 0 Or $lOwner = GetMyID() Then - Return True - Else - Return False - EndIf -EndFunc ;==>GetAssignedToMe - -;~ Description: Returns mod's attribute. -Func GetAttributeByMod($aMod) - Switch $aMod - Case "3F" ; $MODSTRUCT_HEADPIECE_DOMINATION_MAGIC - Return 3 ; $ATTRIB_DOMINATIONMAGIC - Case "40" ; $MODSTRUCT_HEADPIECE_FAST_CASTING - Return 1 ; $ATTRIB_FASTCASTING - Case "41" ; $MODSTRUCT_HEADPIECE_ILLUSION_MAGIC - Return 2 ; $ATTRIB_ILLUSIONMAGIC - Case "42" ; $MODSTRUCT_HEADPIECE_INSPIRATION_MAGIC - Return 4 ; $ATTRIB_INSPIRATIONMAGIC - Case "43" ; $MODSTRUCT_HEADPIECE_BLOOD_MAGIC - Return 5 ; $ATTRIB_BLOODMAGIC - Case "44" ; $MODSTRUCT_HEADPIECE_CURSES - Return 8 ; $ATTRIB_CURSES - Case "45" ; $MODSTRUCT_HEADPIECE_DEATH_MAGIC - Return 6 ; $ATTRIB_DEATHMAGIC - Case "46" ; $MODSTRUCT_HEADPIECE_SOUL_REAPING - Return 7 ; $ATTRIB_SOULREAPING - Case "47" ; $MODSTRUCT_HEADPIECE_AIR_MAGIC - Return 9 ; $ATTRIB_AIRMAGIC - Case "48" ; $MODSTRUCT_HEADPIECE_EARTH_MAGIC - Return 10 ; $ATTRIB_EARTHMAGIC - Case "49" ; $MODSTRUCT_HEADPIECE_ENERGY_STORAGE - Return 13 ; $ATTRIB_ENERGYSTORAGE - Case "4A" ; $MODSTRUCT_HEADPIECE_FIRE_MAGIC - Return 11 ; $ATTRIB_FIREMAGIC - Case "4B" ; $MODSTRUCT_HEADPIECE_WATER_MAGIC - Return 12 ; $ATTRIB_WATERMAGIC - Case "4C" ; $MODSTRUCT_HEADPIECE_DIVINE_FAVOR - Return 17 ; $ATTRIB_DIVINEFAVOR - Case "4D" ; $MODSTRUCT_HEADPIECE_HEALING_PRAYERS - Return 14 ; $ATTRIB_HEALINGPRAYERS - Case "4E" ; $MODSTRUCT_HEADPIECE_PROTECTION_PRAYERS - Return 16 ; $ATTRIB_PROTECTIONPRAYERS - Case "4F" ; $MODSTRUCT_HEADPIECE_SMITING_PRAYERS - Return 15 ; $ATTRIB_SMITINGPRAYERS - Case "50" ; $MODSTRUCT_HEADPIECE_AXE_MASTERY - Return 19 ; $ATTRIB_AXEMASTERY - Case "51" ; $MODSTRUCT_HEADPIECE_HAMMER_MASTERY - Return 20 ; $ATTRIB_HAMMERMASTERY - Case "53" ; $MODSTRUCT_HEADPIECE_SWORDSMANSHIP - Return 21 ; $ATTRIB_SWORDSMANSHIP - Case "54" ; $MODSTRUCT_HEADPIECE_STRENGTH - Return 18 ; $ATTRIB_STRENGTH - Case "55" ; $MODSTRUCT_HEADPIECE_TACTICS - Return 22 ; $ATTRIB_TACTICS - Case "56" ; $MODSTRUCT_HEADPIECE_BEAST_MASTERY - Return 23 ; $ATTRIB_BEASTMASTERY - Case "57" ; $MODSTRUCT_HEADPIECE_MARKSMANSHIP - Return 26 ; $ATTRIB_MARKSMANSHIP - Case "58" ; $MODSTRUCT_HEADPIECE_EXPERTISE - Return 24 ; $ATTRIB_EXPERTISE - Case "59" ; $MODSTRUCT_HEADPIECE_WILDERNESS_SURVIVAL - Return 25 ; $ATTRIB_WILDERNESSSURVIVAL - EndSwitch -EndFunc ;==>GetAttributeByMod - -;~ Description: Returns max dmg of item. -Func GetItemMaxDmg($aItem) - Local $lModString = GetModStruct($aItem) - Local $lPos = StringInStr($lModString, "A8A7") ; Weapon Damage - If $lPos = 0 Then $lPos = StringInStr($lModString, "C867") ; Energy (focus) - If $lPos = 0 Then $lPos = StringInStr($lModString, "B8A7") ; Armor (shield) - If $lPos = 0 Then Return 0 - Return Int("0x" & StringMid($lModString, $lPos - 2, 2)) -EndFunc ;==>GetItemMaxDmg - -;~ Description: All these salvage into Iron. -Func GetIsIronItem($aItem) - Local $lItemMID - If IsPtr($aItem) <> 0 Then - $lItemMID = MemoryRead($aItem + 44, 'long') - ElseIf IsDllStruct($aItem) <> 0 Then - $lItemMID = DllStructGetData($aItem, 'ModelID') - Else - $lItemMID = $aItem - EndIf - Switch $lItemMID - Case 109, 110, 111, 113, 116, 120, 121, 126, 149, 150, 151, 153, 201, 202, 206, 214, 216, 222, 251, 254, 255, 257, 258, 259, 261, 263, 265, 266 - Return True - Case 269, 271, 274, 275, 278, 279, 282, 284, 285, 286, 288, 289, 290, 326, 327, 331, 334, 335, 336, 337, 338, 343, 345, 396, 400, 402, 405, 406 - Return True - Case 407, 408, 412, 418, 419, 421, 1753, 1755, 1757, 1758, 1759, 1765, 1767, 1781, 1785, 1787, 1788, 1790, 1791, 1792, 1793, 1800, 1808, 1810, 1813 - Return True - Case 1815, 1820, 1825, 1827, 1830, 1831, 1832, 1834, 1835, 1837, 1841, 1844, 1850, 1851, 1852, 1857, 1858, 1859, 1860, 1863, 1869, 1871, 1872, 1873 - Return True - Case 1874, 1875, 1876, 1887, 1889, 1892, 1898, 1899, 1901, 1902, 1903, 1904, 1906, 1908, 1910, 1911, 1912, 1913, 1914, 1917, 1928, 1933, 1935, 1937 - Return True - Case 1941, 1944, 1946, 1947, 1954, 2040, 2041, 2042, 2043, 2065, 2072, 2077, 2078, 2104, 2109, 2191, 2200, 2201, 2204, 2211, 2218, 2219, 2220, 2222 - Return True - Case 2224, 2225, 2228, 2231, 2233, 2234, 2251, 2253, 2255, 2403, 2404, 2405, 2406, 2407, 2408, 2411, 2412 - Return True - Case Else - Return False - EndSwitch -EndFunc ;==>GetIsIronItem - -;~ Description: Returns if rare weapon. -Func GetIsRareWeapon($aItem) - Local $Attribute = GetItemAttribute($aItem) - Local $Requirement = GetItemReq($aItem) - Local $Damage = GetItemMaxDmg($aItem) - If $Attribute = 21 And $Requirement <= 8 And $Damage = 22 Then ; req8 Swords - Return True - ElseIf $Attribute = 18 And $Requirement <= 8 And $Damage = 16 Then ; req8 Shields - Return True - ElseIf $Attribute = 22 And $Requirement <= 8 And $Damage = 16 Then ; Req8 Shields - Return True - ElseIf $Attribute = 36 And $Requirement <= 8 And $Damage = 16 Then ; Req8 Shields - Return True - ElseIf $Attribute = 37 And $Requirement <= 8 And $Damage = 16 Then ; Req Shields - Return True - EndIf - Return False -EndFunc ;==>GetIsRareWeapon -#EndRegion - -#Region Gold -;~ Description: Returns amount of gold in storage. -Func GetGoldStorage() - If $GoldBasePtr = 0 Then $GoldBasePtr = MemoryRead($mBasePtr1840 + 0xF8) - Return MemoryRead($GoldBasePtr + 0x80) -EndFunc ;==>GetGoldStorage - -;~ Description: Returns amount of gold being carried. -Func GetGoldCharacter() - If $GoldBasePtr = 0 Then $GoldBasePtr = MemoryRead($mBasePtr1840 + 0xF8) - Return MemoryRead($GoldBasePtr + 0x7C) -EndFunc ;==>GetGoldCharacter - -;~ Description: Drop gold on the ground. -Func DropGold($aAmount = 0) - Local $lAmount - If $aAmount > 0 Then - $lAmount = $aAmount - Else - $lAmount = GetGoldCharacter() - EndIf - Return SendPacket(0x8, 0x29, $lAmount) -EndFunc ;==>DropGold - -;~ Description: Deposit gold into storage. -Func DepositGold($aAmount = 0) - Local $lAmount - Local $lStorage = GetGoldStorage() - Local $lCharacter = GetGoldCharacter() - If $aAmount > 0 And $lCharacter >= $aAmount Then - $lAmount = $aAmount - Else - $lAmount = $lCharacter - EndIf - If $lStorage + $lAmount > 1000000 Then $lAmount = 1000000 - $lStorage - Return ChangeGold($lCharacter - $lAmount, $lStorage + $lAmount) -EndFunc ;==>DepositGold - -;~ Description: Withdraw gold from storage. -Func WithdrawGold($aAmount = 0) - Local $lAmount - Local $lStorage = GetGoldStorage() - Local $lCharacter = GetGoldCharacter() - If $aAmount > 0 And $lStorage >= $aAmount Then - $lAmount = $aAmount - Else - $lAmount = $lStorage - EndIf - If $lCharacter + $lAmount > 100000 Then $lAmount = 100000 - $lCharacter - Return ChangeGold($lCharacter + $lAmount, $lStorage - $lAmount) -EndFunc ;==>WithdrawGold - -;~ Description: Internal use for moving gold. -Func ChangeGold($aCharacter, $aStorage) - Local $lResult = SendPacket(0xC, 0x76, $aCharacter, $aStorage) - Sleep(250) - Return $lResult -EndFunc ;==>ChangeGold -#EndRegion \ No newline at end of file + +#include-once + +#Region Ptr +#Region Items +;~ Description: Returns ptr of an item. +Func GetItemPtr($aItemID) + If $ItemBasePtr = 0 Then $ItemBasePtr = MemoryRead($mBasePtr1840 + 0xB8) + Return MemoryRead($ItemBasePtr + 0x4 * $aItemID, 'ptr') +EndFunc ;==>GetItemPtr + +;~ Description: Returns Itemptr by Bag- and Slotnumber. +Func GetItemPtrBySlot($aBag, $aSlot) + If IsPtr($aBag) Then + Local $lBagPtr = $aBag + ElseIf IsDllStruct($aBag) Then + Local $lBagPtr = GetBagPtr(DllStructGetData($aBag, 'index') + 1) + Else + If $aBag < 1 Or $aBag > 17 Then Return 0 + If $aSlot < 1 Or $aSlot > GetMaxSlots($aBag) Then Return 0 + Local $lBagPtr = GetBagPtr($aBag) + EndIf + Local $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') + Return MemoryRead($lItemArrayPtr + 4 * ($aSlot - 1), 'ptr') +EndFunc ;==>GetItemPtrBySlot + +;~ Description: Returns Itemptr by agentid. +Func GetItemPtrByAgentID($aAgentID) + Local $lItemArraySize = MemoryRead($mBasePtr1840 + 0xC0) + Local $lItemPtr, $lItemID, $lAgentID + For $lItemID = 1 To $lItemArraySize + $lItemPtr = GetItemPtr($lItemID) + $lAgentID = MemoryRead($lItemPtr + 4, 'long') + If $lAgentID = $aAgentID Then Return $lItemPtr + Next +EndFunc ;==>GetItemPtrByAgentID + +;~ Description: Returns Item ptr via ModelID. +Func GetItemPtrByModelID($aModelID, $aBagsOnly = False) + Local $lItemArraySize = MemoryRead($mBasePtr1840 + 0xC0) + Local $lItemPtr, $lItemID + For $lItemID = 1 To $lItemArraySize + $lItemPtr = GetItemPtr($lItemID) + If MemoryRead($lItemPtr + 44, 'long') = $aModelID Then + If Not $aBagsOnly Then Return $lItemPtr + If MemoryRead($lItemPtr + 12, 'ptr') = 0 Then ContinueLoop + Return $lItemPtr + EndIf + Next +EndFunc ;==>GetItemPtrByModelID + +;~ Description: Returns agentID of item on the ground with ModelID. +Func GetAgentIDByModelID($aModelID) + Local $lItemArraySize = MemoryRead($mBasePtr1840 + 0xC0) + Local $lItemPtr, $lItemID, $lAgentID + For $lItemID = 1 To $lItemArraySize + $lItemPtr = GetItemPtr($lItemID) + If MemoryRead($lItemPtr + 44, 'long') = $aModelID Then + $lAgentID = MemoryRead($lItemPtr + 4, 'long') + If $lAgentID <> 0 Then Return $lAgentID + EndIf + Next +EndFunc + +;~ Description: Returns first itemptr in Bags with correct ModelID. +;~ Bags to be searched are stored in $aBagNrArray, with first Element being the amount of bags. +Func GetBagItemPtrByModelID($aModelID, ByRef Const $aBagNumberArray) + Local $lLastQuantity = 0 + Local $lReturn = 0 + Local $lBagPtr, $lSlots, $lItemArrayPtr, $lItemPtr + For $i = 1 to $aBagNumberArray[0] + $lBagPtr = GetBagPtr($aBagNumberArray[$i]) + $lSlots = MemoryRead($lBagPtr + 32, 'long') + $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') + For $slot = 0 To $lSlots - 1 + $lItemPtr = MemoryRead($lItemArrayPtr + 4 * $slot, 'ptr') + If MemoryRead($lItemPtr + 44, 'long') = $aModelID Then Return $lItemPtr + Next + Next +EndFunc ;==>GetBagItemPtrByModelID +#EndRegion Items + +#Region Bags +;~ Description: Returns ptr of an inventory bag. +Func GetBagPtr($aBagNumber) + If $BagBasePtr = 0 Then $BagBasePtr = MemoryRead($mBasePtr1840 + 0xF8) + Return MemoryRead($BagBasePtr + 0x4 * $aBagNumber) +EndFunc ;==>GetBagPtr + +;~ Description: Returns array with existing bag's ptrs, first entry is amount of existing bags. +Func GetExistingBagPtrArray() + Local $lBagArray[18] + Local $lBagPtr, $lBagCount = 0 + For $i = 1 to 17 + $lBagPtr = GetBagPtr($i) + If $lBagPtr <> 0 Then + $lBagCount += 1 + $lBagArray[$lBagCount] = $lBagPtr + EndIf + Next + $lBagArray[0] = $lBagCount + ReDim $lBagArray[$lBagCount+1] + Return $lBagArray +EndFunc ;==>GetExistingBagPtrArray +#EndRegion Bags +#EndRegion Ptr + +#Region Inventory and Storage +#Region Slots +;~ Description: Returns amount of slots of bag. +Func GetMaxSlots($aBag) + If IsPtr($aBag) Then + Return MemoryRead($aBag + 32, 'long') + Else + Return MemoryRead(GetBagPtr($aBag) + 32, 'long') + EndIf +EndFunc ;==>GetMaxSlots + +;~ Description: Returns amount of slots available to character. +Func GetMaxTotalSlots() + Local $SlotCount = 0, $lBagPtr + For $Bag = 1 to 5 + $lBagPtr = GetBagPtr($Bag) + $SlotCount += MemoryRead($lBagPtr + 32, 'long') + Next + For $Bag = 8 to 17 + $lBagPtr = GetBagPtr($Bag) + $SlotCount += MemoryRead($lBagPtr + 32, 'long') + Next + Return $SlotCount +EndFunc ;==>GetMaxTotalSlots + +;~ Description: Returns number of free slots in inventory. +Func CountSlots() + Local $lCount = 0, $lBagPtr + For $lBag = 1 To 4 + $lBagPtr = GetBagPtr($lBag) + If $lBagPtr = 0 Then ContinueLoop + $lCount += MemoryRead($lBagPtr + 32, 'long') - MemoryRead($lBagPtr + 16, 'long') + Next + Return $lCount +EndFunc ;==>CountSlots + +;~ Description: Returns number of free slots in storage. +Func CountSlotsChest() + Local $lCount = 0, $lBagPtr + For $lBag = 8 To 16 + $lBagPtr = GetBagPtr($lBag) + If $lBagPtr = 0 Then ContinueLoop + $lCount += MemoryRead($lBagPtr + 32, 'long') - MemoryRead($lBagPtr + 16, 'long') + Next + Return $lCount +EndFunc ;==>CountSlotsChest +#EndRegion Slots + +#Region FindItemInfo +;~ Description: Returns first empty slotnumber found or, if no empty slot is found, returns 0. +Func FindEmptySlot($aBag) + If IsPtr($aBag) <> 0 Then + Local $lBagPtr = $aBag + Local $lSlots = MemoryRead($aBag + 32, 'long') + ElseIf IsDllStruct($aBag) <> 0 Then + Local $lBagPtr = GetBagPtr(DllStructGetData($aBag, 'index') + 1) + Local $lSlots = DllStructGetData($aBag, 'slots') + Else + Local $lBagPtr = GetBagPtr($aBag) + Local $lSlots = MemoryRead($lBagPtr + 32, 'long') + EndIf + Local $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') + Local $lItemPtr + For $i = 0 To $lSlots - 1 + $lItemPtr = MemoryRead($lItemArrayPtr + 4 * $i, 'ptr') + If $lItemPtr = 0 Then Return $i + 1 + Next +EndFunc ;==>FindEmptySlot + +;~ Description: Returns amount of items in inventory with $aModelID. +Func CountInventoryItem($aModelID) + Local $lCount = 0, $lBagPtr, $lItemArrayPtr, $lItemPtr + For $i = 1 To 4 + $lBagPtr = GetBagPtr($i) + If $lBagPtr = 0 Then ContinueLoop + $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') + For $j = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 + $lItemPtr = MemoryRead($lItemArrayPtr + 4 * $j, 'ptr') + If $lItemPtr = 0 Then ContinueLoop + If MemoryRead($lItemPtr + 44, 'long') = $aModelID Then $lCount += MemoryRead($lItemPtr + 75, 'byte') + Next + Next + Return $lCount +EndFunc ;==>CountInventoryItem + +;~ Description: Returns array with itemIDs of Items in Bags with correct ModelID. +Func GetBagItemIDArrayByModelID($aModelID) + Local $lRetArr[291][3] + Local $lCount = 0 + Local $lBagPtr, $lItemArrayPtr, $lItemPtr, $lItemID + For $bag = 1 to 17 + $lBagPtr = GetBagPtr($bag) + If $lBagPtr = 0 Then ContinueLoop + $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') + For $slot = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 + $lItemPtr = MemoryRead($lItemArrayPtr + 4 * $slot, 'ptr') + If MemoryRead($lItemPtr + 44, 'long') = $aModelID Then + $lItemID = MemoryRead($lItemPtr, 'long') + $lRetArr[$lCount][0] = $lItemID + $lRetArr[$lCount][1] = $bag + $lRetArr[$lCount][2] = $slot + 1 + $lCount += 1 + EndIf + Next + Next + ReDim $lRetArr[$lCount][3] + Return $lRetArr +EndFunc ;==>GetBagItemIDArrayByModelID + +;~ Description: Returns item ID of salvage kit in inventory. +Func FindSalvageKit($aStart = 1, $aFinish = 16) + Local $lUses = 101 + Local $lKit = 0 + Local $lBagPtr, $lItemArrayPtr, $lItemPtr, $lValue + For $bag = $aStart to $aFinish + $lBagPtr = GetBagPtr($bag) + If $lBagPtr = 0 Then ContinueLoop + $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') + For $slot = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 + $lItemPtr = MemoryRead($lItemArrayPtr + 4 * ($slot), 'ptr') + If $lItemPtr = 0 Then ContinueLoop + Switch MemoryRead($lItemPtr + 44, 'long') + Case 2992, 2993 + $lValue = MemoryRead($lItemPtr + 36, 'short') + If $lValue / 2 < $lUses Then + $lUses = $lValue / 2 + $lKit = MemoryRead($lItemPtr, 'long') + EndIf + Case 2991 + $lValue = MemoryRead($lItemPtr + 36, 'short') + If $lValue / 8 < $lUses Then + $lUses = $lValue / 8 + $lKit = MemoryRead($lItemPtr, 'long') + EndIf + Case 5900 + $lValue = MemoryRead($lItemPtr + 36, 'short') + If $lValue / 10 < $lUses Then + $lUses = $lValue / 10 + $lKit = MemoryRead($lItemPtr, 'long') + EndIf + EndSwitch + Next + Next + Return $lKit +EndFunc ;==>FindSalvageKit + +;~ Description: Returns amount of salvage uses. +Func SalvageUses($aStart = 1, $aFinish = 16) + Local $lCount = 0 + Local $lBagPtr, $lItemArrayPtr, $lItemPtr + For $bag = $aStart to $aFinish + $lBagPtr = GetBagPtr($bag) + If $lBagPtr = 0 Then ContinueLoop + $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') + For $slot = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 + $lItemPtr = MemoryRead($lItemArrayPtr + 4 * ($slot), 'ptr') + If $lItemPtr = 0 Then ContinueLoop + Switch MemoryRead($lItemPtr + 44, 'long') + Case 2992, 2993 + $lCount += MemoryRead($lItemPtr + 36, 'short') / 2 + Case 2991 + $lCount += MemoryRead($lItemPtr + 36, 'short') / 8 + Case 5900 + $lCount += MemoryRead($lItemPtr + 36, 'short') / 10 + EndSwitch + Next + Next + Return $lCount +EndFunc ;==>SalvageUses + +;~ Description: Returns item ID of ID kit in inventory. +Func FindIDKit($aStart = 1, $aFinish = 16) + Local $lUses = 101 + Local $lKit = 0 + Local $lBagPtr, $lItemArrayPtr, $lItemPtr, $lValue + For $bag = $aStart to $aFinish + $lBagPtr = GetBagPtr($bag) + If $lBagPtr = 0 Then ContinueLoop + $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') + For $slot = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 + $lItemPtr = MemoryRead($lItemArrayPtr + 4 * ($slot), 'ptr') + If $lItemPtr = 0 Then ContinueLoop + Switch MemoryRead($lItemPtr + 44, 'long') + Case 2989 + $lValue = MemoryRead($lItemPtr + 36, 'short') + If $lValue / 2 < $lUses Then + $lUses = $lValue / 2 + $lKit = MemoryRead($lItemPtr, 'long') + EndIf + Case 5899 + $lValue = MemoryRead($lItemPtr + 36, 'short') + If $lValue / 2.5 < $lUses Then + $lUses = $lValue / 2.5 + $lKit = MemoryRead($lItemPtr, 'long') + EndIf + EndSwitch + Next + Next + Return $lKit +EndFunc ;==>FindIDKit + +;~ Description: Returns amount of ID kit uses. +Func FindIDKitUses($aStart = 1, $aFinish = 16) + Local $lUses = 0 + Local $lBagPtr, $lItemArrayPtr, $lItemPtr + For $bag = $aStart to $aFinish + $lBagPtr = GetBagPtr($bag) + If $lBagPtr = 0 Then ContinueLoop + $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') + For $slot = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 + $lItemPtr = MemoryRead($lItemArrayPtr + 4 * ($slot), 'ptr') + If $lItemPtr = 0 Then ContinueLoop + Switch MemoryRead($lItemPtr + 44, 'long') + Case 2989 + $lUses += MemoryRead($lItemPtr + 36, 'short') / 2 + Case 5899 + $lUses += MemoryRead($lItemPtr + 36, 'short') / 2.5 + Case Else + ContinueLoop + EndSwitch + Next + Next + Return $lUses +EndFunc ;==>FindIDKitUses + +;~ Description: Returns amount of items of ModelID in inventory. +Func CountItemInBagsByModelID($aItemModelID) + Local $lCount = 0 + Local $lBagPtr, $lItemArrayPtr, $lItemPtr + For $bag = 1 To 4 + $lBagPtr = GetBagPtr($bag) + If $lBagPtr = 0 Then ContinueLoop + $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') + For $slot = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 + $lItemPtr = MemoryRead($lItemArrayPtr + 4 * $slot, 'ptr') + If $lItemPtr = 0 Then ContinueLoop + If MemoryRead($lItemPtr + 44, 'long') = $aItemModelID Then $lCount += MemoryRead($lItemPtr + 75, 'byte') + Next + Next + Return $lCount +EndFunc ;==>CountItemInBagsByModelID + +;~ Description: Returns amount of items of ModelID in storage. +Func CountItemInStorageByModelID($aItemModelID) ; Bag 6 is Material Storage, which is not included + Local $lCount = 0 + Local $lBagPtr, $lItemArrayPtr, $lItemPtr + For $bag = 8 To 16 + $lBagPtr = GetBagPtr($bag) + If $lBagPtr = 0 Then ContinueLoop + $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') + For $slot = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 + $lItemPtr = MemoryRead($lItemArrayPtr + 4 * $slot, 'ptr') + If $lItemPtr = 0 Then ContinueLoop + If MemoryRead($lItemPtr + 44, 'long') = $aItemModelID Then $lCount += MemoryRead($lItemPtr + 75, 'byte') + Next + Next + Return $lCount +EndFunc ;==>CountItemInStorageByModelID + +;~ Description: Returns amount of items of ModelID. +Func CountItemTotalByModelID($aItemModelID, $aIncludeMats = True) + Local $lCount = 0 + Local $lBagPtr, $lItemArrayPtr, $lItemPtr + If $aIncludeMats Then + Local $lBagSearch[15] = [14,1,2,3,4,5,6,8,10,11,12,13,14,15,16] + Else + Local $lBagSearch[14] = [13,1,2,3,4,5,8,10,11,12,13,14,15,16] + EndIf + For $i = 1 To $lBagSearch[0] + $lBagPtr = GetBagPtr($lBagSearch[$i]) + If $lBagPtr = 0 Then ContinueLoop + $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') + For $slot = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 + $lItemPtr = MemoryRead($lItemArrayPtr + 4 * $slot, 'ptr') + If $lItemPtr = 0 Then ContinueLoop + If MemoryRead($lItemPtr + 44, 'long') = $aItemModelID Then $lCount += MemoryRead($lItemPtr + 75, 'byte') + Next + Next + Return $lCount +EndFunc ;==>CountItemTotalByModelID +#EndRegion FindItemInfo + +#Region Salvage +;~ Description: Starts a salvaging session of an item. +Func StartSalvage($aItem, $aSalvageKitID = 0) + If IsPtr($aItem) <> 0 Then + Local $lItemID = MemoryRead($aItem, 'long') + ElseIf IsDllStruct($aItem) <> 0 Then + Local $lItemID = DllStructGetData($aItem, 'ID') + Else + Local $lItemID = $aItem + EndIf + Local $lSalvageSessionID = MemoryRead($mBasePtr182C + 0x690) + If $aSalvageKitID = 0 Then + Local $lSalvageKitID = FindSalvageKit() + Else + Local $lSalvageKitID = $aSalvageKitID + EndIf + ConsoleWrite("$lSalvageKitID = " & $lSalvageKitID & @CRLF) + If $lSalvageKitID = 0 Then Return False + DllStructSetData($mSalvage, 2, $lItemID) + DllStructSetData($mSalvage, 3, $lSalvageKitID) + DllStructSetData($mSalvage, 4, $lSalvageSessionID) + If Not Enqueue($mSalvagePtr, 16) Then Return False + Return SetExtended($lSalvageSessionID, $lSalvageKitID) +EndFunc ;==>StartSalvage + +;~ Description: Salvage the materials out of an item. +Func SalvageMaterials() + Return SendPacket(0x4, $CtoGS_MSG_SalvageMaterials) And SalvageSleep(250) ;And SendPacket(0x4, $CtoGS_MSG_FinishSalvageMaterials) And SalvageSleep(500) +EndFunc ;==>SalvageMaterials + +Func SalvageSleep($SleepTime) + Sleep($SleepTime + GetPing()) + Return True +EndFunc + +Func StartSalvageWithPacket($aItem, $aSalvageKitID = 0) +;~ Start Salvage +;~ Size = 16 Header = 113 Value Of Elements = 5 +;~ 0x10, 0x71, 0x15, 0x6A, 0x5D + +If IsPtr($aItem) <> 0 Then + Local $lItemID = MemoryRead($aItem, 'long') +Else + Local $lItemID = $aItem +EndIf + +Local $lSalvageSessionID = MemoryRead($mBasePtr182C + 0x690) + +If $aSalvageKitID = 0 Then + Local $lSalvageKitID = FindSalvageKit() +Else + Local $lSalvageKitID = $aSalvageKitID +EndIf + +ConsoleWrite("$lSalvageKitID = " & $lSalvageKitID & @CRLF) + +Return SendPacket(0x10, $CtoGS_MSG_StartSalvage, $lItemID, $lSalvageKitID, $lSalvageSessionID) And SalvageSleep(250) +EndFunc ;==>StartSalvage + +;~ Description: Salvages a mod out of an item. +;~ ModIndex: 0 -> Insignia, 1 -> Rune for armor upgrades. +Func SalvageMod($aModIndex) +Return SendPacket(0x8, $CtoGS_MSG_SalvageMod, $aModIndex) And SalvageSleep(250) +EndFunc ;==>SalvageMod + +Func Chancel() +Return SendPacket(0x4, $CtoGS_MSG_CancelAction) +EndFunc +#EndRegion Salvage + +#Region ItemActions +;~ Description: Identifies an item. +Func IdentifyItem($aItem, $aIDKit = 0) + If IsPtr($aItem) <> 0 Then + Local $lItemID = MemoryRead($aItem, 'long') + ElseIf IsDllStruct($aItem) <> 0 Then + Local $lItemID = DllStructGetData($aItem, 'ID') + Else + Local $lItemID = $aItem + EndIf + If $aIDKit = 0 Then + Local $lIDKit = FindIDKit() + Else + Local $lIDKit = $aIDKit + EndIf + If $lIDKit = 0 Then Return False + Local $lTimer = TimerInit() + Local $lDeadlock + While GetIsUnIDed($aItem) And TimerDiff($lTimer) < 30000 + SendPacket(0xC, $CtoGS_MSG_IdentifyItem, $lIDKit, $lItemID) + $lDeadlock = TimerInit() + Do + Sleep(250) + If GetIsIDed($aItem) Then Return True + Until TimerDiff($lDeadlock) > 5000 + WEnd +EndFunc ;==>IdentifyItem + +;~ Description: Equips an item. +Func EquipItem($aItem) + If IsPtr($aItem) <> 0 Then + Return SendPacket(0x8, $CtoGS_MSG_EquipItem, MemoryRead($aItem, 'long')) ;~ old -> Return SendPacket(0x8, 0x2A, MemoryRead($aItem, 'long')) + ElseIf IsDllStruct($aItem) <> 0 Then + Return SendPacket(0x8, $CtoGS_MSG_EquipItem, DllStructGetData($aItem, 'ID')) ;~ old -> Return SendPacket(0x8, 0x2A, DllStructGetData($aItem, 'ID')) + Else + Return SendPacket(0x8, $CtoGS_MSG_EquipItem, $aItem) ;~ old -> Return SendPacket(0x8, 0x2A, $aItem) + EndIf +EndFunc ;==>EquipItem + +;~ Description: Uses an item. +Func UseItem($aItem) + If IsPtr($aItem) <> 0 Then + Return SendPacket(0x8, $CtoGS_MSG_UseItem, MemoryRead($aItem, 'long')) ;~ old -> Return SendPacket(0x8, 0x78, MemoryRead($aItem, 'long')) + ElseIf IsDllStruct($aItem) <> 0 Then + Return SendPacket(0x8, $CtoGS_MSG_UseItem, DllStructGetData($aItem, 'ID')) ;~ old -> Return SendPacket(0x8, 0x78, DllStructGetData($aItem, 'ID')) + Else + Return SendPacket(0x8, $CtoGS_MSG_UseItem, $aItem) ;~ old -> Return SendPacket(0x8, 0x78, $aItem) + EndIf +EndFunc ;==>UseItem + +;~ Description: Drops an item. +Func DropItem($aItem, $aAmount = 0) + If IsPtr($aItem) <> 0 Then + If $aAmount = 0 Then $aAmount = MemoryRead($aItem + 75, 'byte') + Return SendPacket(0xC, $CtoGS_MSG_DropItem, MemoryRead($aItem, 'long'), $aAmount) ;~ old -> Return SendPacket(0xC, 0x26, MemoryRead($aItem, 'long'), $aAmount) + ElseIf IsDllStruct($aItem) <> 0 Then + If $aAmount = 0 Then $aAmount = DllStructGetData($aItem, 'Quantity') + Return SendPacket(0xC, $CtoGS_MSG_DropItem, DllStructGetData($aItem, 'ID'), $aAmount) ;~ old -> Return SendPacket(0xC, 0x26, DllStructGetData($aItem, 'ID'), $aAmount) + Else + If $aAmount = 0 Then $aAmount = MemoryRead(GetItemPtr($aItem) + 75, 'byte') + Return SendPacket(0xC, $CtoGS_MSG_DropItem, $aItem, $aAmount) ;~ old -> Return SendPacket(0xC, 0x26, $aItem, $aAmount) + EndIf +EndFunc ;==>DropItem + +;~ Description: Moves an item. +Func MoveItem($aItem, $aBag, $aSlot) + If IsPtr($aItem) <> 0 Then + Local $lItemID = MemoryRead($aItem, 'long') + ElseIf IsDllStruct($aItem) <> 0 Then + Local $lItemID = DllStructGetData($aItem, 'ID') + Else + Local $lItemID = $aItem + EndIf + If IsPtr($aBag) <> 0 Then + Local $lBagID = MemoryRead($aBag + 8, 'long') + ElseIf IsDllStruct($aBag) <> 0 Then + Local $lBagID = DllStructGetData($aBag, 'ID') + Else + Local $lBagID = MemoryRead(GetBagPtr($aBag) + 8, 'long') + EndIf + Return SendPacket(0x10, $CtoGS_MSG_MoveItem, $lItemID, $lBagID, $aSlot - 1) +EndFunc ;==>MoveItem + +;~ Description: Moves an item, with amount to be moved. +Func MoveItemEx($aItem, $aBag, $aSlot, $aAmount) + If IsPtr($aItem) <> 0 Then + Local $lItemID = MemoryRead($aItem, 'long') + Local $lQuantity = MemoryRead($aItem + 75, 'byte') + ElseIf IsDllStruct($aItem) <> 0 Then + Local $lItemID = DllStructGetData($aItem, 'ID') + Local $lQuantity = DllStructGetData($aItem, 'Quantity') + Else + Local $lItemID = $aItem + Local $lQuantity = MemoryRead(GetItemPtr($aItem) + 75, 'byte') + EndIf + If IsPtr($aBag) <> 0 Then + Local $lBagID = MemoryRead($aBag + 8, 'long') + ElseIf IsDllStruct($aBag) <> 0 Then + Local $lBagID = DllStructGetData($aBag, 'ID') + Else + Local $lBagID = MemoryRead(GetBagPtr($aBag) + 8, 'long') + EndIf + If $lQuantity > $aAmount Then $lQuantity = $aAmount + Return SendPacket(0x14, $CtoGS_MSG_SplitStack, $lItemID, $lQuantity, $lBagID, $aSlot - 1) +EndFunc ;==>MoveItemEx + +;~ Description: Unequips item to $abag, $aslot (1-based). +;~ Equipmentslots: 1 -> Mainhand/Two-hand +;~ 2 -> Offhand +;~ 3 -> Chestpiece +;~ 4 -> Leggings +;~ 5 -> Headpiece +;~ 6 -> Boots +;~ 7 -> Gloves +Func UnequipItem($aEquipmentSlot, $aBag, $aSlot) + If IsPtr($aBag) Then + Local $lBagID = MemoryRead($aBag + 8, 'long') + ElseIf IsDllStruct($aBag) Then + Local $lBagID = DllStructGetData($aBag, 'ID') + Else + Local $lBagID = MemoryRead(GetBagPtr($aBag) + 8, 'long') + EndIf + Return SendPacket(0x10, $CtoGS_MSG_EquipItem, $aEquipmentSlot - 1, $lBagID, $aSlot - 1) +EndFunc ;==>UnequipItem + +;~ Description: Destroys an item. +Func DestroyItem($aItem) + If IsPtr($aItem) <> 0 Then + Return SendPacket(0x8, $CtoGS_MSG_DeleteItem, MemoryRead($aItem, 'long')) ;~ old -> Return SendPacket(0x8, 0x63, MemoryRead($aItem, 'long')) + ElseIf IsDllStruct($aItem) <> 0 Then + Return SendPacket(0x8, $CtoGS_MSG_DeleteItem, DllStructGetData($aItem, 'ID')) ;~ old -> Return SendPacket(0x8, 0x63, DllStructGetData($aItem, 'ID')) + Else + Return SendPacket(0x8, $CtoGS_MSG_DeleteItem, $aItem) ;~ old -> Return SendPacket(0x8, 0x63, $aItem) + EndIf +EndFunc ;==>DestroyItem + +;~ Description: Accepts unclaimed items after a mission. +Func AcceptAllItems() + Return SendPacket(0x8, $CtoGS_MSG_AcceptAllItems, MemoryRead(GetBagPtr(7) + 8, 'long')) +EndFunc ;==>AcceptAllItems +#EndRegion ItemActions +#EndRegion Inventory and Storage + +#Region Merchants +;~ Description: Sells an item. +Func SellItem($aItem, $aQuantity = 0) + If IsPtr($aItem) <> 0 Then + Local $lItemID = MemoryRead($aItem, 'long') + Local $lQuantity = MemoryRead($aItem + 75, 'byte') + Local $lValue = MemoryRead($aItem + 36, 'short') + ElseIf IsDllStruct($aItem) <> 0 Then + Local $lItemID = DllStructGetData($aItem, 'ID') + Local $lQuantity = DllStructGetData($aItem, 'Quantity') + Local $lValue = DllStructGetData($aItem, 'Value') + Else + Local $lItemID = $aItem + Local $lItemPtr = GetItemPtr($aItem) + Local $lQuantity = MemoryRead($lItemPtr + 75, 'byte') + Local $lValue = MemoryRead($lItemPtr + 36, 'short') + EndIf + If $aQuantity = 0 Or $aQuantity > $lQuantity Then $aQuantity = $lQuantity + DllStructSetData($mSellItem, 2, $aQuantity * $lValue) + DllStructSetData($mSellItem, 3, $lItemID) + Return Enqueue($mSellItemPtr, 12) +EndFunc ;==>SellItem + +#Region BuyItem +;~ Description: Buys an item. +Func BuyItem($aItemRow, $aQuantity, $aValue) + Local $lMerchantItemsBase = GetMerchantItemsBase() + If Not $lMerchantItemsBase Then Return + If $aItemRow < 1 Or $aItemRow > GetMerchantItemsSize() Then Return + DllStructSetData($mBuyItem, 2, $aQuantity) + DllStructSetData($mBuyItem, 3, MemoryRead($lMerchantItemsBase + 4 * ($aItemRow - 1))) + DllStructSetData($mBuyItem, 4, $aQuantity * $aValue) + Return Enqueue($mBuyItemPtr, 16) +EndFunc ;==>BuyItem + +;~ Description: Internal use for BuyItem() +Func GetMerchantItemsBase() + Return MemoryRead($mBasePtr182C + 0x24) +EndFunc ;==>GetMerchantItemsBase + +;~ Description: Internal use for BuyItem() +Func GetMerchantItemsSize() + Return MemoryRead($mBasePtr182C + 0x28) +EndFunc ;==>GetMerchantItemsSize + +;~ Description: Buys an ID kit. +Func BuyIDKit($aAmount = 1) + Local $lItemIDRow = GetItemRowByModelID(2989) + If $lItemIDRow = 0 Then Return ; no id kit + Local $lItemPtr = GetItemPtr($lItemIDRow) + Local $lValue = MemoryRead($lItemPtr + 36, 'short') * 2 + DllStructSetData($mBuyItem, 2, $aAmount) + DllStructSetData($mBuyItem, 3, $lItemIDRow) + DllStructSetData($mBuyItem, 4, $lValue * $aAmount) + ConsoleWrite($mBuyItemPtr & @CRLF) + Return SetExtended($lItemPtr, Enqueue($mBuyItemPtr, 16)) +EndFunc ;==>BuyIDKit + +;~ Description: Buys a superior ID kit. +Func BuySuperiorIDKit($aAmount = 1) + Local $lItemIDRow = GetItemRowByModelID(5899) + If $lItemIDRow = 0 Then Return ; no id kit + Local $lItemPtr = GetItemPtr($lItemIDRow) + Local $lValue = MemoryRead($lItemPtr + 36, 'short') * 2 + DllStructSetData($mBuyItem, 2, $aAmount) + DllStructSetData($mBuyItem, 3, $lItemIDRow) + DllStructSetData($mBuyItem, 4, $lValue * $aAmount) + Return SetExtended($lItemPtr, Enqueue($mBuyItemPtr, 16)) +EndFunc ;==>BuySuperiorIDKit + +;~ Description: Buys 3 Salvage Kits. +Func BuySalvageKitThree() + Return BuySalvageKit(3) +EndFunc ;==>BuySalvageKitThree + +;~ Description: Buys 2 Salvage Kits. +Func BuySalvageKitTwo() + Return BuySalvageKit(2) +EndFunc ;==>BuySalvageKitTwo + +;~ Description: Buys 1 Salvage Kits. +Func BuySalvageKit($aAmount = 1) + Local $lItemIDRow = GetItemRowByModelID(2992) + If $lItemIDRow = 0 Then + $lItemIDRow = GetItemRowByModelID(2993) + If $lItemIDRow = 0 Then Return + EndIf + Local $lItemPtr = GetItemPtr($lItemIDRow) + Local $lValue = MemoryRead($lItemPtr + 36, 'short') * 2 + DllStructSetData($mBuyItem, 2, $aAmount) + DllStructSetData($mBuyItem, 3, $lItemIDRow) + DllStructSetData($mBuyItem, 4, $aAmount * $lValue) + Return SetExtended($lItemPtr, Enqueue($mBuyItemPtr, 16)) +EndFunc ;==>BuySalvageKit +#EndRegion Buy + +#Region BuyItemByModelID +;~ Description: Buys an item by modelid instead of row. +Func BuyItemByModelID($aModelID, $aQuantity, $aValue) + Local $lItemIDRow = GetItemRowByModelID($aModelID) + DllStructSetData($mBuyItem, 2, $aQuantity) + DllStructSetData($mBuyItem, 3, $lItemIDRow) + DllStructSetData($mBuyItem, 4, $aQuantity * $aValue) + Return Enqueue($mBuyItemPtr, 16) +EndFunc ;==>BuyItemByModelID + +;~ Description: Internal Use CraftItem and BuyItemByModelID. +Func GetItemRowByModelID($aModelID) + Local $lItemArraySize = MemoryRead($mBasePtr182C + 0x28) + Local $lMerchantBase = MemoryRead($mBasePtr182C + 0x24) + Local $lItemID, $lItemPtr + For $i = 0 To $lItemArraySize - 1 + $lItemID = MemoryRead($lMerchantBase + 4 * $i) + $lItemPtr = GetItemPtr($lItemID) + If $lItemPtr = 0 Then ContinueLoop + If MemoryRead($lItemPtr + 44, 'long') = $aModelID And MemoryRead($lItemPtr + 64, 'long') = 2 Then + Return MemoryRead($lItemPtr, 'long') + EndIf + Next +EndFunc ;==>GetItemRowByModelID +#EndRegion CraftItemEx & BuyItemByModelID + +#Region Trader +;~ Description: Request a quote to buy an item from a trader. Returns true if successful. +Func TraderRequest($aModelID, $aExtraID = -1) + Local $lItemArraySize = MemoryRead($mBasePtr182C + 0x28) + Local $lMerchantBase = MemoryRead($mBasePtr182C + 0x24) + Local $lItemPtr = 0, $lItemID = 0 + Local $lFound = False + For $i = 0 To $lItemArraySize - 1 + $lItemID = MemoryRead($lMerchantBase + 4 * $i) + $lItemPtr = GetItemPtr($lItemID) + If $lItemPtr = 0 Then ContinueLoop + If MemoryRead($lItemPtr + 44, 'long') = $aModelID And MemoryRead($lItemPtr + 12, 'ptr') = 0 And MemoryRead($lItemPtr + 4, 'long') = 0 Then + ConsoleWrite("Trader request found modelid." & @CRLF) + If $aExtraID = -1 Or MemoryRead($lItemPtr + 34, 'short') = $aExtraID Then + $lFound = True + ExitLoop + EndIf + EndIf + Next + If Not $lFound Then Return False + Local $lQuoteID = MemoryRead($mTraderQuoteID) + DllStructSetData($mRequestQuote, 2, $lItemID) + If Not Enqueue($mRequestQuotePtr, 8) Then Return False + Local $lDeadlock = TimerInit() + Do + Sleep(100) + If MemoryRead($mTraderQuoteID) <> $lQuoteID Then Return True + Until TimerDiff($lDeadlock) > GetPing() + 5000 +EndFunc ;==>TraderRequest + +;~ Description: Request a quote to buy an item from a trader. Returns true if successful. +Func TraderRequest_($aModelID, $aExtraID = -1) + Local $lItemArraySize = MemoryRead($mBasePtr1840 + 0xC0) + Local $lItemPtr = 0 + Local $lFound = False + Local $lQuoteID = MemoryRead($mTraderQuoteID) + For $lItemID = 1 To $lItemArraySize + $lItemPtr = GetItemPtr($lItemID) + If $lItemPtr = 0 Then ContinueLoop + If MemoryRead($lItemPtr + 44, 'long') = $aModelID Then + ConsoleWrite("Trader request found modelid." & @CRLF) + If MemoryRead($lItemPtr + 12, 'ptr') = 0 And MemoryRead($lItemPtr + 4, 'long') = 0 Then + If $aExtraID = -1 Or MemoryRead($lItemPtr + 34, 'short') = $aExtraID Then + $lFound = True + ExitLoop + EndIf + EndIf + EndIf + Next + If Not $lFound Then Return False + DllStructSetData($mRequestQuote, 2, $lItemID) + If Not Enqueue($mRequestQuotePtr, 8) Then Return False + Local $lDeadlock = TimerInit() + Do + Sleep(100) + If MemoryRead($mTraderQuoteID) <> $lQuoteID Then Return True + Until TimerDiff($lDeadlock) > GetPing() + 5000 +EndFunc ;==>TraderRequest + +;~ Description: Request a quote to buy a rune from a trader. Returns true if successful. +Func RuneRequestBuy($aModelID, $aModStruct) + Local $lItemArraySize = MemoryRead($mBasePtr1840 + 0xC0) + Local $lItemPtr = 0 + Local $lModStruct = 0 + Local $lBuffer = DllStructCreate('ptr;long') + Local $lFound = False + Local $lQuoteID = MemoryRead($mTraderQuoteID) + For $lItemID = 1 To $lItemArraySize + $lItemPtr = GetItemPtr($lItemID) + If MemoryRead($lItemPtr + 44, 'long') = $aModelID Then + If MemoryRead($lItemPtr + 12, 'ptr') <> 0 Then ContinueLoop + MemoryReadToStruct($lItemPtr + 16, $lBuffer) + $lModStruct = MemoryRead(DllStructGetData($lBuffer, 1), 'byte[' & DllStructGetData($lBuffer, 2) * 4 & ']') + If StringInStr($lModStruct, $aModStruct) <> 0 Then + $lFound = True + ExitLoop + EndIf + EndIf + Next + If Not $lFound Then Return -1 + DllStructSetData($mRequestQuote, 2, $lItemID) + If Not Enqueue($mRequestQuotePtr, 8) Then Return False + Local $lDeadlock = TimerInit() + Do + Sleep(100) + If MemoryRead($mTraderQuoteID) <> $lQuoteID Then Return True + Until TimerDiff($lDeadlock) > GetPing() + 5000 + Return -2 +EndFunc ;==>RuneRequestBuy + +;~ Description: Buy the requested item. +Func TraderBuy() + If Not GetTraderCostID() Or Not GetTraderCostValue() Then Return False + Return Enqueue($mTraderBuyPtr, 4) +EndFunc ;==>TraderBuy + +;~ Description: Request a quote to sell an item to the trader. +Func TraderRequestSell($aItem) + If IsPtr($aItem) <> 0 Then + Local $lItemID = MemoryRead($aItem, 'long') + ElseIf IsDllStruct($aItem) <> 0 Then + Local $lItemID = DllStructGetData($aItem, 'ID') + Else + Local $lItemID = $aItem + EndIf + Local $lFound = False + Local $lQuoteID = MemoryRead($mTraderQuoteID) + DllStructSetData($mRequestQuoteSell, 2, $lItemID) + Enqueue($mRequestQuoteSellPtr, 8) + Local $lDeadlock = TimerInit() + Do + Sleep(20) + $lFound = MemoryRead($mTraderQuoteID) <> $lQuoteID + Until $lFound Or TimerDiff($lDeadlock) > GetPing() + 5000 + Return $lFound +EndFunc ;==>TraderRequestSell + +;~ Description: ID of the item item being sold. +Func TraderSell() + If Not GetTraderCostID() Or Not GetTraderCostValue() Then Return False + Return Enqueue($mTraderSellPtr, 4) +EndFunc ;==>TraderSell + +;~ Description: Returns the item ID of the quoted item. +Func GetTraderCostID() + Return MemoryRead($mTraderCostID) +EndFunc ;==>GetTraderCostID + +;~ Description: Returns the cost of the requested item. +Func GetTraderCostValue() + Return MemoryRead($mTraderCostValue) +EndFunc ;==>GetTraderCostValue +#EndRegion Trader +#EndRegion + +#Region PickingUp +;~ Description: Finds items on ground, used for Pick Up Loot fuction. +Func GetNearestItemPtrTo($aAgent = GetAgentPtr(-2)) + Local $lAgentX, $lAgentY + If IsPtr($aAgent) <> 0 Then + UpdateAgentPosByPtr($aAgent, $lAgentX, $lAgentY) + ElseIf IsDllStruct($aAgent) <> 0 Then + $lAgentX = DllStructGetData($aAgent, 'X') + $lAgentY = DllStructGetData($aAgent, 'Y') + Else + UpdateAgentPosByPtr(GetAgentPtr($aAgent), $lAgentX, $lAgentY) + EndIf + Local $lNearestAgent = 0, $lNearestDistance = 100000000 + Local $lDistance, $lAgentToCompare, $lAgentToCompareX, $lAgentToCompareY + For $i = 1 To GetMaxAgents() + $lAgentToCompare = GetAgentPtr($i) + If MemoryRead($lAgentToCompare + 156, 'long') <> 0x400 Then ContinueLoop + UpdateAgentPosByPtr($lAgentToCompare, $lAgentToCompareX, $lAgentToCompareY) + $lDistance = ($lAgentToCompareY - $lAgentY) ^ 2 + ($lAgentToCompareX - $lAgentX) ^ 2 + If $lDistance < $lNearestDistance Then + $lNearestAgent = $lAgentToCompare + $lNearestDistance = $lDistance + EndIf + Next + SetExtended(Sqrt($lNearestDistance)) ;this could be used to retrieve the distance also + Return $lNearestAgent +EndFunc ;==>GetNearestItemPtrTo + +;~ Description: Picks up an item, requires AgentID. +Func PickUpItem($aAgentID) + If IsPtr($aAgentID) <> 0 Then + Return SendPacket(0xC, $CtoGS_MSG_PickUpItem, MemoryRead($aAgentID + 44, 'long'), 0) ;~ old -> Return SendPacket(0xC, 0x39, MemoryRead($aAgentID + 44, 'long'), 0) + ElseIf IsDllStruct($aAgentID) <> 0 Then + Return SendPacket(0xC, $CtoGS_MSG_PickUpItem, DllStructGetData($aAgentID, 'ID'), 0) ;~ old -> Return SendPacket(0xC, 0x39, DllStructGetData($aAgentID, 'ID'), 0) + Else + Return SendPacket(0xC, $CtoGS_MSG_PickUpItem, ConvertID($aAgentID), 0) ;~ old -> Return SendPacket(0xC, 0x39, ConvertID($aAgentID), 0) + EndIf +EndFunc ;==>PickUpItem + +;~ Description: Picks up loot that has been specified in PickUpList(). +Func PickUpLoot($aMinSlots = 2, $aMyID = GetMyID(), $aMe = GetAgentPtr($aMyID)) + Local $lMeX, $lMeY, $lAgentX, $lAgentY + Local $lSlots = CountSlots() + Local $lAgentArray = GetSortedItemPtrArray($aMe, 0x400) + Local $lItemPtr, $lAgentID, $lItemType, $lDistance, $lOwner, $lItemMID + For $i = 1 To $lAgentArray[0][0] + If GetIsDead($aMe) Then Return False ; died, cant pick up items dead + If GetMapLoading() <> 1 Then Return True ; not in explorable -> no items to pick up + $lAgentID = MemoryRead($lAgentArray[$i][0] + 44, 'long') + $lItemPtr = GetItemPtrByAgentID($lAgentID) + If $lItemPtr = 0 Then ContinueLoop + $lItemType = MemoryRead($lItemPtr + 32, 'byte') + If $lItemType = 20 Then ; coins + UpdateAgentPosByPtr($lAgentArray[$i][0], $lAgentX, $lAgentY) + UpdateAgentPosByPtr($aMe, $lMeX, $lMeY) + $lDistance = Sqrt(($lMeX - $lAgentX) ^ 2 + ($lMeY - $lAgentY) ^ 2) + PickUpItems($lAgentArray[$i][0], $lAgentID, $lAgentX, $lAgentY, $lDistance, $aMe) + EndIf + If $lItemType = 6 Then ; quest items / bundles + If $mPickUpBundles Then + UpdateAgentPosByPtr($lAgentArray[$i][0], $lAgentX, $lAgentY) + UpdateAgentPosByPtr($aMe, $lMeX, $lMeY) + $lDistance = Sqrt(($lMeX - $lAgentX) ^ 2 + ($lMeY - $lAgentY) ^ 2) + PickUpItems($lAgentArray[$i][0], $lAgentID, $lAgentX, $lAgentY, $lDistance, $aMe) + Else + ContinueLoop + EndIf + EndIf + If $lSlots < $aMinSlots Then ; inventory is full + If $lItemType <> 6 And $lItemType <> 20 Then Return False ; quest items and coins + EndIf + $lOwner = MemoryRead($lAgentArray[$i][0] + 196, 'long') + If $lOwner <> 0 And $lOwner <> $aMyID Then ContinueLoop ; assigned to someone else + UpdateAgentPosByPtr($aMe, $lMeX, $lMeY) + UpdateAgentPosByPtr($lAgentArray[$i][0], $lAgentX, $lAgentY) + $lDistance = Sqrt(($lMeX - $lAgentX) ^ 2 + ($lMeY - $lAgentY) ^ 2) + If $lDistance > 2000 Then ContinueLoop ; item is too far away + $lItemMID = MemoryRead($lItemPtr + 44, 'long') + If $mEventModelID <> 0 Then + If $lItemMID = $mEventModelID Then $mEventCount += 1 + EndIf + If Not $mMapPieces Then + If $lItemMID = 24629 Or $lItemMID = 24630 Or $lItemMID = 24631 Or $lItemMID = 24632 Then ContinueLoop ; no map pieces please + EndIf + If $lItemMID = 27977 And Not $mBattlePlans Then ContinueLoop ; no charr battle plans + If $lItemMID = 21797 And Not $mMesmerTomes Then ContinueLoop ; no mesmer tomes + If $lItemMID = 21799 And Not $mElementalistTomes Then ContinueLoop ; no elementalist tomes + If $mPickUpAll Or PickUpList($lItemPtr) Then + PickUpItems($lAgentArray[$i][0], $lAgentID, $lAgentX, $lAgentY, $lDistance, $aMe) + EndIf + Next +EndFunc ;==>PickUpLoot + +;~ Description: Returns item ptr array, sorted by distance from player to speed up looting. +Func GetSortedItemPtrArray($aMe = GetAgentPtr(-2), $aType = 0x400) + Local $lMaxAgents = GetMaxAgents() + Local $lAgentPtrStruct = DllStructCreate("ptr[" & $lMaxAgents & "]") + DllCall($mKernelHandle, "int", "ReadProcessMemory", "handle", $mGWProcHandle, "ptr", MemoryRead($mAgentBase), "struct*", $lAgentPtrStruct, "ulong_ptr", $lMaxAgents * 4, "ulong_ptr*", 0) + Local $lTemp + Local $lAgentArray[$lMaxAgents + 1][2] + For $i = 1 To $lMaxAgents + $lTemp = DllStructGetData($lAgentPtrStruct, 1, $i) + If $lTemp = 0 Then ContinueLoop + If MemoryRead($lTemp + 156, 'long') <> $aType Then ContinueLoop + $lAgentArray[0][0] += 1 + $lAgentArray[$lAgentArray[0][0]][0] = $lTemp + $lAgentArray[$lAgentArray[0][0]][1] = GetPseudoDistance($aMe, $lTemp) + Next + ReDim $lAgentArray[$lAgentArray[0][0] + 1][2] + If $lAgentArray[0][0] > 2 Then QuickSort2D($lAgentArray, 1, $lAgentArray[0][0], 1) + Return $lAgentArray +EndFunc + +;~ Description: Quicksort by distances, internal use GetSortedItemPtrArray. +Func QuickSort2D(ByRef $aArray, Const ByRef $aStart, Const ByRef $aEnd, Const ByRef $aColumn) + If $aEnd <= $aStart Then Return + Local $lTmp + Local $lLeft = $aStart + Local $lRight = $aEnd + Local $lPivot = $aArray[Int(($aStart + $aEnd) / 2)][$aColumn] + Do + If IsNumber($lPivot) Then + While ($aArray[$lLeft][$aColumn] - $lPivot) < 0 And IsNumber($aArray[$lLeft][$aColumn]) + $lLeft += 1 + WEnd + While ($aArray[$lRight][$aColumn] - $lPivot) > 0 And IsNumber($aArray[$lRight][$aColumn]) + $lRight -= 1 + WEnd + EndIf + If $lLeft <= $lRight Then + For $i = 0 To 1 + $lTmp = $aArray[$lLeft][$i] + $aArray[$lLeft][$i] = $aArray[$lRight][$i] + $aArray[$lRight][$i] = $lTmp + Next + $lLeft += 1 + $lRight -= 1 + EndIf + Until $lLeft > $lRight + QuickSort2D($aArray, $aStart, $lRight, $aColumn) + QuickSort2D($aArray, $lLeft, $aEnd, $aColumn) +EndFunc + +;~ Description: Internal use PickUpLoot(). +Func PickUpItems($aPtr, $aAgentID, $aX, $aY, $aDistance, $aMe) + Local $lBlocked = 0 + If $aDistance > 150 And $aDistance <= 500 Then + Move_($aX, $aY) + Do + If Not GetIsMoving($aMe) Then + $lBlocked += 1 + Move_($aX, $aY) + EndIf + Sleep(250) + Until GetDistance($aPtr, $aMe) <= 150 Or $lBlocked > 20 + Else + MoveTo($aX, $aY) + EndIf + Local $lTimer = TimerInit() + Do + PickUpItem($aAgentID) + Sleep(500) + If GetAgentPtr($aAgentID) <> $aPtr Then Return True + Until TimerDiff($lTimer) > 3000 +EndFunc + +;~ Description: Internal use PickUpLoot(). +Func PickUpList($aItemPtr) + Local $lRarity = GetRarity($aItemPtr) + If $lRarity = 2624 Or $lRarity = 2626 And $mLeecher Then Return False ; leecher present to pick up loot + If $lRarity = 2627 Then Return $mRarityGreen ; green items + If $lRarity = 2624 Then Return $mRarityGold ; gold items + Local $lModelID = MemoryRead($aItemPtr + 44, 'long') + If $lModelID = 27977 Then Return $mBattlePlans ; charr battle plans + If $lModelID = 24629 Then Return $mMapPieces ; map top left + If $lModelID = 24630 Then Return $mMapPieces ; map top right + If $lModelID = 24631 Then Return $mMapPieces ; map bottom left + If $lModelID = 24632 Then Return $mMapPieces ; map bottom right + If $lModelID = 6104 Then Return $mQuestItems ; Quest item: Urn + If $lModelID = 6102 Then Return $mQuestItems ; Quest item: Spear + Local $lType = MemoryRead($aItemPtr + 32, 'byte') + Switch $lType + Case 9, 11, 18, 20, 31 ; consumables, materials and z-coins, keys, gold coins, scrolls + Return True + Case 10 ; dyes + Local $lExtraID = MemoryRead($aItemPtr + 34, 'short') + If $lExtraID = 10 Or $lExtraID = 12 Then + Return True ; black and white dye + Else + Return $mDyes + EndIf + Case 21 ; quest items + Return $mQuestItems + EndSwitch + Switch $lModelID + Case 1953, 1956 to 1975 ; froggys + Return True + Case 21786 to 21795 ; elite tomes + Return $mEliteTomes + Case 21796 ; assassin tomes + Return $mTomes + Case 21797 ; mesmer tomes + Return $mMesmerTomes + Case 21798 ; necromancer tomes + Return $mTomes + Case 21799 ; elementalist tomes + Return $mElementalistTomes + Case 21800 ; monk tomes + Return $mTomes + Case 21801 ; warrior tomes + Return $mTomes + Case 21802 ; ranger tomes + Return $mTomes + Case 21803 ; dervish tomes + Return $mTomes + Case 21804 ; ritualist tomes + Return $mTomes + Case 21805 ; paragon tomes + Return $mTomes + Case 21127 to 21131 ; gems + Return True + Case 522, 835, 476, 525, 444, 27047 ; dark remains, feathered scalp, demonic remains, umbral skeletal limb, feathered caromi scalp, glacial stones + Return $mSalvageTrophies + Case 27033, 27035, 27036, 27050, 27974 ; destroyer core, saurian bone, amphibian tongue, elemental dust, undead bone + Return True + Case 28434, 18345, 21491, 37765, 30855, 22191, 22190 ; Event items + Return True + EndSwitch + If GetIsIronItem($lModelID) Then Return True + Return GetIsRareWeapon($aItemPtr) +EndFunc ;==>PickUpList +#EndRegion + +#Region Itemstats +;~ Description: Returns rarity (name color) of an item. +Func GetRarity($aItem) + If IsPtr($aItem) <> 0 Then + Local $lNameString = MemoryRead($aItem + 56, 'ptr') + ElseIf IsDllStruct($aItem) <> 0 Then + Local $lNameString = DllStructGetData($aItem, 'Namestring') + Else + Local $lNameString = MemoryRead(GetItemPtr($aItem) + 56, 'ptr') + EndIf + If $lNameString = 0 Then Return + Return MemoryRead($lNameString, 'ushort') +EndFunc ;==>GetRarity + +;~ Description: Tests if an item is identified. +Func GetIsIDed($aItem) + If IsPtr($aItem) <> 0 Then + Return BitAND(MemoryRead($aItem + 40, 'short'), 1) > 0 + ElseIf IsDllStruct($aItem) <> 0 Then + Return BitAND(DllStructGetData($aItem, 'interaction'), 1) > 0 + Else + Return BitAND(MemoryRead(GetItemPtr($aItem) + 40, 'short'), 1) > 0 + EndIf +EndFunc ;==>GetIsIDed + +;~ Descriptions: Tests if an item is unidentfied and can be identified. +Func GetIsUnIDed($aItem) + If IsPtr($aItem) <> 0 Then + Return BitAND(MemoryRead($aItem + 40, 'long'), 8388608) > 0 + ElseIf IsDllStruct($aItem) <> 0 Then + Return BitAND(DllStructGetData($aItem, 'interaction'), 8388608) > 0 + Else + Return BitAND(MemoryRead(GetItemPtr($aItem) + 40, 'long'), 8388608) > 0 + EndIf +EndFunc ;==>GetIsUnIDed + +;~ Description: Returns true if item has a suffix, prefix or inscription in it that isnt fixed. +Func GetIsUpgraded($lItemPtr) + Local $lInteraction = MemoryRead($lItemPtr + 40) + If BitAnd($lInterAction, 68222976) Then Return True +EndFunc + +;~ Description: Returns a weapon or shield's minimum required attribute. +Func GetItemReq($aItem) + Local $lMod = GetModByIdentifier($aItem, "9827") + Return $lMod[0] +EndFunc ;==>GetItemReq + +;~ Description: Returns a weapon or shield's required attribute. +Func GetItemAttribute($aItem) + Local $lMod = GetModByIdentifier($aItem, "9827") + Return $lMod[1] +EndFunc ;==>GetItemAttribute + +;~ Description: Returns an array of the requested mod. +Func GetModByIdentifier($aItem, $aIdentifier) + Local $lReturn[2] + Local $lString = StringTrimLeft(GetModStruct($aItem), 2) + For $i = 0 To StringLen($lString) / 8 - 2 + If StringMid($lString, 8 * $i + 5, 4) == $aIdentifier Then + $lReturn[0] = Int("0x" & StringMid($lString, 8 * $i + 1, 2)) + $lReturn[1] = Int("0x" & StringMid($lString, 8 * $i + 3, 2)) + ExitLoop + EndIf + Next + Return $lReturn +EndFunc ;==>GetModByIdentifier + +;~ Description: Returns modstruct of an item. +Func GetModStruct($aItem) + If IsPtr($aItem) <> 0 Then + Local $lBuffer = DllStructCreate('ptr;long') + MemoryReadToStruct($aItem + 16, $lBuffer) + If DllStructGetData($lBuffer, 1) <> 0 Then + Return MemoryRead(DllStructGetData($lBuffer, 1), 'Byte[' & DllStructGetData($lBuffer, 2) * 4 & ']') + EndIf + ElseIf IsDllStruct($aItem) <> 0 Then + Local $lModstruct = DllStructGetData($aItem, 'modstruct') + Local $lModSize = DllStructGetData($aItem, 'modstructsize') + If $lModstruct <> 0 Then + Return MemoryRead($lModstruct, 'Byte[' & $lModSize * 4 & ']') + EndIf + Else + Local $lBuffer = DllStructCreate('ptr;long') + MemoryReadToStruct(GetItemPtr($aItem) + 16, $lBuffer) + If DllStructGetData($lBuffer, 1) <> 0 Then + Return MemoryRead(DllStructGetData($lBuffer, 1), 'Byte[' & DllStructGetData($lBuffer, 2) * 4 & ']') + EndIf + EndIf +EndFunc ;==>GetModStruct + +;~ Description: Tests if an item is assigned to you. +Func GetAssignedToMe($aAgent) + If IsPtr($aAgent) <> 0 Then + Local $lOwner = MemoryRead($aAgent + 196, 'long') + ElseIf IsDllStruct($aAgent) <> 0 Then + Local $lOwner = DllStructGetData($aAgent, 'Owner') + Else + Local $lOwner = MemoryRead(GetAgentPtr($aAgent) + 196, 'long') + EndIf + If $lOwner = 0 Or $lOwner = GetMyID() Then + Return True + Else + Return False + EndIf +EndFunc ;==>GetAssignedToMe + +;~ Description: Returns mod's attribute. +Func GetAttributeByMod($aMod) + Switch $aMod + Case "3F" ; $MODSTRUCT_HEADPIECE_DOMINATION_MAGIC + Return 3 ; $ATTRIB_DOMINATIONMAGIC + Case "40" ; $MODSTRUCT_HEADPIECE_FAST_CASTING + Return 1 ; $ATTRIB_FASTCASTING + Case "41" ; $MODSTRUCT_HEADPIECE_ILLUSION_MAGIC + Return 2 ; $ATTRIB_ILLUSIONMAGIC + Case "42" ; $MODSTRUCT_HEADPIECE_INSPIRATION_MAGIC + Return 4 ; $ATTRIB_INSPIRATIONMAGIC + Case "43" ; $MODSTRUCT_HEADPIECE_BLOOD_MAGIC + Return 5 ; $ATTRIB_BLOODMAGIC + Case "44" ; $MODSTRUCT_HEADPIECE_CURSES + Return 8 ; $ATTRIB_CURSES + Case "45" ; $MODSTRUCT_HEADPIECE_DEATH_MAGIC + Return 6 ; $ATTRIB_DEATHMAGIC + Case "46" ; $MODSTRUCT_HEADPIECE_SOUL_REAPING + Return 7 ; $ATTRIB_SOULREAPING + Case "47" ; $MODSTRUCT_HEADPIECE_AIR_MAGIC + Return 9 ; $ATTRIB_AIRMAGIC + Case "48" ; $MODSTRUCT_HEADPIECE_EARTH_MAGIC + Return 10 ; $ATTRIB_EARTHMAGIC + Case "49" ; $MODSTRUCT_HEADPIECE_ENERGY_STORAGE + Return 13 ; $ATTRIB_ENERGYSTORAGE + Case "4A" ; $MODSTRUCT_HEADPIECE_FIRE_MAGIC + Return 11 ; $ATTRIB_FIREMAGIC + Case "4B" ; $MODSTRUCT_HEADPIECE_WATER_MAGIC + Return 12 ; $ATTRIB_WATERMAGIC + Case "4C" ; $MODSTRUCT_HEADPIECE_DIVINE_FAVOR + Return 17 ; $ATTRIB_DIVINEFAVOR + Case "4D" ; $MODSTRUCT_HEADPIECE_HEALING_PRAYERS + Return 14 ; $ATTRIB_HEALINGPRAYERS + Case "4E" ; $MODSTRUCT_HEADPIECE_PROTECTION_PRAYERS + Return 16 ; $ATTRIB_PROTECTIONPRAYERS + Case "4F" ; $MODSTRUCT_HEADPIECE_SMITING_PRAYERS + Return 15 ; $ATTRIB_SMITINGPRAYERS + Case "50" ; $MODSTRUCT_HEADPIECE_AXE_MASTERY + Return 19 ; $ATTRIB_AXEMASTERY + Case "51" ; $MODSTRUCT_HEADPIECE_HAMMER_MASTERY + Return 20 ; $ATTRIB_HAMMERMASTERY + Case "53" ; $MODSTRUCT_HEADPIECE_SWORDSMANSHIP + Return 21 ; $ATTRIB_SWORDSMANSHIP + Case "54" ; $MODSTRUCT_HEADPIECE_STRENGTH + Return 18 ; $ATTRIB_STRENGTH + Case "55" ; $MODSTRUCT_HEADPIECE_TACTICS + Return 22 ; $ATTRIB_TACTICS + Case "56" ; $MODSTRUCT_HEADPIECE_BEAST_MASTERY + Return 23 ; $ATTRIB_BEASTMASTERY + Case "57" ; $MODSTRUCT_HEADPIECE_MARKSMANSHIP + Return 26 ; $ATTRIB_MARKSMANSHIP + Case "58" ; $MODSTRUCT_HEADPIECE_EXPERTISE + Return 24 ; $ATTRIB_EXPERTISE + Case "59" ; $MODSTRUCT_HEADPIECE_WILDERNESS_SURVIVAL + Return 25 ; $ATTRIB_WILDERNESSSURVIVAL + EndSwitch +EndFunc ;==>GetAttributeByMod + +;~ Description: Returns max dmg of item. +Func GetItemMaxDmg($aItem) + Local $lModString = GetModStruct($aItem) + Local $lPos = StringInStr($lModString, "A8A7") ; Weapon Damage + If $lPos = 0 Then $lPos = StringInStr($lModString, "C867") ; Energy (focus) + If $lPos = 0 Then $lPos = StringInStr($lModString, "B8A7") ; Armor (shield) + If $lPos = 0 Then Return 0 + Return Int("0x" & StringMid($lModString, $lPos - 2, 2)) +EndFunc ;==>GetItemMaxDmg + +;~ Description: All these salvage into Iron. +Func GetIsIronItem($aItem) + Local $lItemMID + If IsPtr($aItem) <> 0 Then + $lItemMID = MemoryRead($aItem + 44, 'long') + ElseIf IsDllStruct($aItem) <> 0 Then + $lItemMID = DllStructGetData($aItem, 'ModelID') + Else + $lItemMID = $aItem + EndIf + Switch $lItemMID + Case 109, 110, 111, 113, 116, 120, 121, 126, 149, 150, 151, 153, 201, 202, 206, 214, 216, 222, 251, 254, 255, 257, 258, 259, 261, 263, 265, 266 + Return True + Case 269, 271, 274, 275, 278, 279, 282, 284, 285, 286, 288, 289, 290, 326, 327, 331, 334, 335, 336, 337, 338, 343, 345, 396, 400, 402, 405, 406 + Return True + Case 407, 408, 412, 418, 419, 421, 1753, 1755, 1757, 1758, 1759, 1765, 1767, 1781, 1785, 1787, 1788, 1790, 1791, 1792, 1793, 1800, 1808, 1810, 1813 + Return True + Case 1815, 1820, 1825, 1827, 1830, 1831, 1832, 1834, 1835, 1837, 1841, 1844, 1850, 1851, 1852, 1857, 1858, 1859, 1860, 1863, 1869, 1871, 1872, 1873 + Return True + Case 1874, 1875, 1876, 1887, 1889, 1892, 1898, 1899, 1901, 1902, 1903, 1904, 1906, 1908, 1910, 1911, 1912, 1913, 1914, 1917, 1928, 1933, 1935, 1937 + Return True + Case 1941, 1944, 1946, 1947, 1954, 2040, 2041, 2042, 2043, 2065, 2072, 2077, 2078, 2104, 2109, 2191, 2200, 2201, 2204, 2211, 2218, 2219, 2220, 2222 + Return True + Case 2224, 2225, 2228, 2231, 2233, 2234, 2251, 2253, 2255, 2403, 2404, 2405, 2406, 2407, 2408, 2411, 2412 + Return True + Case Else + Return False + EndSwitch +EndFunc ;==>GetIsIronItem + +;~ Description: Returns if rare weapon. +Func GetIsRareWeapon($aItem) + Local $Attribute = GetItemAttribute($aItem) + Local $Requirement = GetItemReq($aItem) + Local $Damage = GetItemMaxDmg($aItem) + If $Attribute = 21 And $Requirement <= 8 And $Damage = 22 Then ; req8 Swords + Return True + ElseIf $Attribute = 18 And $Requirement <= 8 And $Damage = 16 Then ; req8 Shields + Return True + ElseIf $Attribute = 22 And $Requirement <= 8 And $Damage = 16 Then ; Req8 Shields + Return True + ElseIf $Attribute = 36 And $Requirement <= 8 And $Damage = 16 Then ; Req8 Shields + Return True + ElseIf $Attribute = 37 And $Requirement <= 8 And $Damage = 16 Then ; Req Shields + Return True + EndIf + Return False +EndFunc ;==>GetIsRareWeapon +#EndRegion + +#Region Gold +;~ Description: Returns amount of gold in storage. +Func GetGoldStorage() + If $GoldBasePtr = 0 Then $GoldBasePtr = MemoryRead($mBasePtr1840 + 0xF8) + Return MemoryRead($GoldBasePtr + 0x80) +EndFunc ;==>GetGoldStorage + +;~ Description: Returns amount of gold being carried. +Func GetGoldCharacter() + If $GoldBasePtr = 0 Then $GoldBasePtr = MemoryRead($mBasePtr1840 + 0xF8) + Return MemoryRead($GoldBasePtr + 0x7C) +EndFunc ;==>GetGoldCharacter + +;~ Description: Drop gold on the ground. +Func DropGold($aAmount = 0) + Local $lAmount + If $aAmount > 0 Then + $lAmount = $aAmount + Else + $lAmount = GetGoldCharacter() + EndIf + Return SendPacket(0x8, $CtoGS_MSG_DropGold, $lAmount) +EndFunc ;==>DropGold + +;~ Description: Deposit gold into storage. +Func DepositGold($aAmount = 0) + Local $lAmount + Local $lStorage = GetGoldStorage() + Local $lCharacter = GetGoldCharacter() + If $aAmount > 0 And $lCharacter >= $aAmount Then + $lAmount = $aAmount + Else + $lAmount = $lCharacter + EndIf + If $lStorage + $lAmount > 1000000 Then $lAmount = 1000000 - $lStorage + Return ChangeGold($lCharacter - $lAmount, $lStorage + $lAmount) +EndFunc ;==>DepositGold + +;~ Description: Withdraw gold from storage. +Func WithdrawGold($aAmount = 0) + Local $lAmount + Local $lStorage = GetGoldStorage() + Local $lCharacter = GetGoldCharacter() + If $aAmount > 0 And $lStorage >= $aAmount Then + $lAmount = $aAmount + Else + $lAmount = $lStorage + EndIf + If $lCharacter + $lAmount > 100000 Then $lAmount = 100000 - $lCharacter + Return ChangeGold($lCharacter + $lAmount, $lStorage - $lAmount) +EndFunc ;==>WithdrawGold + +;~ Description: Internal use for moving gold. +Func ChangeGold($aCharacter, $aStorage) + Local $lResult = SendPacket(0xC, $CtoGS_MSG_ChangeGold, $aCharacter, $aStorage) + Sleep(250) + Return $lResult +EndFunc ;==>ChangeGold +#EndRegion diff --git a/gwApi/map.au3 b/gwApi/map.au3 index 0fd061f..07705a2 100644 --- a/gwApi/map.au3 +++ b/gwApi/map.au3 @@ -1,253 +1,254 @@ -#include-once - -#Region MapLoad -;~ Description: Sets value of GetMapIsLoaded() to 0. -Func InitMapLoad() - Return MemoryWrite($mMapIsLoaded, 0) -EndFunc ;==>InitMapLoad - -;~ Description: Returns if map has been loaded. Reset with InitMapLoad(). -Func GetMapIsLoaded() - Return MemoryRead($mMapIsLoaded) And GetAgentExists(-2) -EndFunc ;==>GetMapIsLoaded - -;~ Description: Wait for map to load. Returns true if successful. -Func WaitMapLoading($aMapID = 0, $aDeadlock = 15000) - If $aMapID = Default Then $aMapID = 0 - If $aDeadlock = Default Then $aDeadlock = 7500 - InitMapLoad() - Local $lDeadlock = TimerInit() - While GetMapLoading() <> 2 - Sleep(200) - If TimerDiff($lDeadlock) > $aDeadlock Then Return - WEnd - $lDeadlock = TimerInit() - Do - Sleep(1000) - If TimerDiff($lDeadlock) > $aDeadlock Then Return - Until GetMapLoading <> 2 And MemoryRead($mLoggedCounter) <> 0 - Sleep($mSleepAfterPort) -;~ IF $mRendering Then _PurgeHook(262144000) - If Not SetPointers() Then Return - If GetMapLoading() = 1 Then - $mPartyArray = GetAgentPtrArray(2, 0xDB, 1) - Else - $mMaxPartySize = GetMaxPartySize(GetMapID()) - $mPartyArray = 0 - EndIf - - Return (($aMapID = 0) ? (True) : (GetMapID() = $aMapID)) -EndFunc -#EndRegion MapLoad - -#Region MapTravel -;~ Description: Map travel to an outpost. -Func TravelTo($aMapID, $aDistrict = 0, $aRegion = -1, $aLanguage = -1) - Local $lLanguage = $aLanguage - Local $lRegion = $aRegion - Local $lDistrict = $aDistrict - ; returns true if already there - If GetMapID() = $aMapID And GetMapLoading() = 0 Then - If $aDistrict <= 0 And $aRegion < 0 And $aLanguage < 0 Then Return True - If $aDistrict > 0 Then $lDistrict = GetDistrict() - If $aRegion >= 0 Then $lRegion = GetRegion() - If $aLanguage >= 0 Then $lLanguage = GetLanguage() - If $aDistrict = $lDistrict And $aRegion = $lRegion And $aLanguage = $lLanguage Then Return True - EndIf - If $aDistrict > 0 Then - $lDistrict = $aDistrict - ElseIf $lDistrict < 0 Then - $lDistrict = 0 - EndIf - If $aRegion >= 0 Then - $lRegion = $aRegion - ElseIf $lRegion < 0 Then - $lRegion = GetRegion() - EndIf - If $aLanguage >= 0 Then - $lLanguage = $aLanguage - ElseIf $lLanguage < 0 Then - $lLanguage = GetLanguage() - EndIf - Update("Travel to map: " & $aMapID) - If MoveMap($aMapID, $lRegion, $lDistrict, $lLanguage) Then - Return WaitMapLoading($aMapID) - Else - Return False - EndIf -EndFunc ;==>TravelTo - -;~ Description: Internal use for map travel. -Func MoveMap($aMapID, $aRegion, $aDistrict, $aLanguage) - Return SendPacket(0x18, 0xAB, $aMapID, $aRegion, $aDistrict, $aLanguage, False) -EndFunc ;==>MoveMap - -;~ Description: Returns to outpost after resigning/failure. -Func ReturnToOutpost() - Return SendPacket(0x4, 0xA1) -EndFunc ;==>ReturnToOutpost - -;~ Description: Switch district to on randomly chosen. -Func DistrictChange($aMapID = 0, $aUseRegions = 5, $aUseLanguages = 6) - If $aMapID = 0 Or $aMapID = Default Then $aMapID = GetMapID() - If $aUseRegions > 5 Or $aUseRegions = Default Then $aUseRegions = 5 - If $aUseRegions < 0 Then $aUseRegions = 0 - If $aUseLanguages > 6 Or $aUseLanguages = Default Then $aUseLanguages = 6 - If $aUseLanguages < 0 Then $aUseLanguages = 0 - Static Local $lLanguages[7] = [10, 9, 5, 4, 3, 2, 0] - Static Local $lRegions[6] = [2, 1, 3, 4, -2, 0] - Local $lNewRegion = 0 - Local $lNewLanguage = 0 - Local $lCurrentRegion = GetRegion() - Local $lCurrentLanguage = -1 - If $aUseRegions > 0 And $aUseLanguages > 0 Then - Do - $lNewRegion = $lRegions[Random(0, $aUseRegions, 1)] - If $lNewRegion = 2 And $lCurrentRegion = 2 Then - If $lCurrentLanguage = -1 Then $lCurrentLanguage = GetLanguage() - Do - $lNewLanguage = $lLanguages[Random(0, $aUseLanguages, 1)] - Until $lNewLanguage <> $lCurrentLanguage - ElseIf $lNewRegion = 2 Then - $lNewLanguage = $lLanguages[Random(0, $aUseLanguages, 1)] - EndIf - Until $lCurrentRegion <> $lNewRegion - EndIf - MoveMap($aMapID, $lNewRegion, 0, $lNewLanguage) - Return WaitMapLoading($aMapID) -EndFunc ;==>DistrictChange -#EndRegion MapTravel - -#Region EnterChallenge -;~ Description: Enter a challenge mission/pvp. -Func EnterChallenge() - Return SendPacket(0x8, 0x9F, 1) -EndFunc ;==>EnterChallenge - -;~ Description: Enter a foreign challenge mission/pvp. -Func EnterChallengeForeign() - Return SendPacket(0x8, 0x9F, 0) -EndFunc ;==>EnterChallengeForeign - -;~ Description: Enters challenge mission/pvp and waits for end of loading screen. -Func SecureEnterChallenge() - If Not EnterChallengeForeign() Then Return - Do - Sleep(1000) - Until GetMapLoading() = 2 - Do - Sleep(1000) - Until GetMapLoading() <> 2 - SetPointers() - Return True -EndFunc -#EndRegion EnterChallenge - -#Region Guildhall -;~ Description: Tries to travel to GH. Checks first if already in gh and returns false if not successful. -Func TravelGuildHall($aMapID = GetMapID()) - If CheckGuildHallMapID($aMapID) Then Return True - TravelGH() - Sleep(1000) - Return CheckGuildHallMapID(GetMapID()) -EndFunc ;==>TravelGuildHall - -;~ Description: Return true if MapID belongs to any Guild Hall. -Func CheckGuildHallMapID($aMapID) - Switch $aMapID - Case 4, 5, 6, 52, 176, 177, 178, 179, 275, 276, 359, 360, 529, 530, 537, 538 - Return True - EndSwitch -EndFunc - -;~ Description: Travel to your guild hall. -Func TravelGH() - Static Local $lGHPtr = 0 - If $lGHPtr = 0 Then - Local $lOffset[4] = [0, 0x18, 0x3C, 0] - $lGHPtr = MemoryReadPtrChain($mBasePointer, $lOffset, 'ptr') - EndIf - MemoryReadToStruct($lGHPtr + 0x64, $GHPassKeyBuffer) - SendPacket(0x18, 0xAA, DllStructGetData($GHPassKeyBuffer, 1), DllStructGetData($GHPassKeyBuffer, 2), DllStructGetData($GHPassKeyBuffer, 3), DllStructGetData($GHPassKeyBuffer, 4), 1) - Return WaitMapLoading() -EndFunc ;==>TravelGH - -;~ Description: Travels to own gh if $aPass1 = 0, or to specified gh passes. -Func TravelGHEx($aPass1 = 0, $aPass2 = 0, $aPass3 = 0, $aPass4 = 0) -Static $lOffset[4] = [0, 0x18, 0x3C, 0] -Local $lResult = 0 -If $aPass1 = 0 Then - Static Local $lGHPtr = 0 - MemoryReadToStruct((($lGHPtr = 0) ? ($lGHPtr = MemoryReadPtrChain($mBasePointer, $lOffset, 'ptr')) : ($lGHPtr)) + 0x64, $GHPassKeyBuffer) - $lResult = SendPacket(0x18, 0xAA, DllStructGetData($GHPassKeyBuffer, 1), DllStructGetData($GHPassKeyBuffer, 2), DllStructGetData($GHPassKeyBuffer, 3), DllStructGetData($GHPassKeyBuffer, 4), 1) -Else - $lResult = SendPacket(0x18, 0xAA, $aPass1, $aPass2, $aPass3, $aPass4, 1) -EndIf -If $lResult then Return WaitMapLoading() -EndFunc - -;~ Description: Leave your guild hall. -Func LeaveGH() - Local $lLastMapID = MemoryRead($mLastMapID) - If CheckGuildHallMapID($lLastMapID) Then Return ;$lLastMapID = 0 - SendPacket(0x8, 0xAC, 0x1) - Return WaitMapLoading($lLastMapID) -EndFunc ;==>LeaveGH -#EndRegion Guildhall - -#Region MapInfo -;~ Description: Returns current load-state. -Func GetMapLoading() - Return MemoryRead($mMapLoading) -EndFunc ;==>GetMapLoading - -;~ Description: Amount of time the current instance has been active. -Func GetInstanceUpTime() - Static Local $lTimerPtr = 0 - If $lTimerPtr = 0 Then - Local $lOffset[4] = [0, 0x18, 0x8, 0x1AC] - $lTimerPtr = MemoryReadPtrChain($mBasePointer, $lOffset, 'ptr') - EndIf - Return MemoryRead($lTimerPtr) -EndFunc ;==>GetInstanceUpTime - -;~ Description: Returns current map ID. -Func GetMapID() - Return MemoryRead($mMapID) -EndFunc ;==>GetMapID - -;~ Description: Returns current district. -Func GetDistrict() - Static Local $lDistrictPtr = 0 - If $lDistrictPtr = 0 Then - Local $lOffset[4] = [0, 0x18, 0x44, 0] - $lDistrictPtr = MemoryReadPtrChain($mBasePointer, $lOffset, 'ptr') + 0x1B4 - EndIf - Return MemoryRead($lDistrictPtr) -EndFunc ;==>GetDistrict - -;~ Description: Internal use for travel functions. -Func GetRegion() - Return MemoryRead($mRegion) -EndFunc ;==>GetRegion - -;~ Description: Internal use for travel functions. Returns Language. -Func GetLanguage() - Return MemoryRead($mLanguage) -EndFunc ;==>GetLanguage - -;~ Description: Returns number of foes that have been killed so far. -Func GetFoesKilled() - Return MemoryRead($mBasePtr182C + 0x84C) -EndFunc ;==>GetFoesKilled - -;~ Description: Returns number of enemies left to kill for vanquish. -Func GetFoesToKill() - Return MemoryRead($mBasePtr182C + 0x850) -EndFunc ;==>GetFoesToKill - -;~ Description: Tests if an area has been vanquished. -Func GetAreaVanquished() - Return GetFoesToKill() = 0 -EndFunc ;==>GetAreaVanquished -#EndRegion \ No newline at end of file + +#include-once + +#Region MapLoad +;~ Description: Sets value of GetMapIsLoaded() to 0. +Func InitMapLoad() + Return MemoryWrite($mMapIsLoaded, 0) +EndFunc ;==>InitMapLoad + +;~ Description: Returns if map has been loaded. Reset with InitMapLoad(). +Func GetMapIsLoaded() + Return MemoryRead($mMapIsLoaded) And GetAgentExists(-2) +EndFunc ;==>GetMapIsLoaded + +;~ Description: Wait for map to load. Returns true if successful. +Func WaitMapLoading($aMapID = 0, $aDeadlock = 15000) + If $aMapID = Default Then $aMapID = 0 + If $aDeadlock = Default Then $aDeadlock = 7500 + InitMapLoad() + Local $lDeadlock = TimerInit() + While GetMapLoading() <> 2 + Sleep(200) + If TimerDiff($lDeadlock) > $aDeadlock Then Return + WEnd + $lDeadlock = TimerInit() + Do + Sleep(1000) + If TimerDiff($lDeadlock) > $aDeadlock Then Return + Until GetMapLoading <> 2 And MemoryRead($mLoggedCounter) <> 0 + Sleep($mSleepAfterPort) +;~ IF $mRendering Then _PurgeHook(262144000) + If Not SetPointers() Then Return + If GetMapLoading() = 1 Then + $mPartyArray = GetAgentPtrArray(2, 0xDB, 1) + Else + $mMaxPartySize = GetMaxPartySize(GetMapID()) + $mPartyArray = 0 + EndIf + + Return (($aMapID = 0) ? (True) : (GetMapID() = $aMapID)) +EndFunc +#EndRegion MapLoad + +#Region MapTravel +;~ Description: Map travel to an outpost. +Func TravelTo($aMapID, $aDistrict = 0, $aRegion = -1, $aLanguage = -1) + Local $lLanguage = $aLanguage + Local $lRegion = $aRegion + Local $lDistrict = $aDistrict + ; returns true if already there + If GetMapID() = $aMapID And GetMapLoading() = 0 Then + If $aDistrict <= 0 And $aRegion < 0 And $aLanguage < 0 Then Return True + If $aDistrict > 0 Then $lDistrict = GetDistrict() + If $aRegion >= 0 Then $lRegion = GetRegion() + If $aLanguage >= 0 Then $lLanguage = GetLanguage() + If $aDistrict = $lDistrict And $aRegion = $lRegion And $aLanguage = $lLanguage Then Return True + EndIf + If $aDistrict > 0 Then + $lDistrict = $aDistrict + ElseIf $lDistrict < 0 Then + $lDistrict = 0 + EndIf + If $aRegion >= 0 Then + $lRegion = $aRegion + ElseIf $lRegion < 0 Then + $lRegion = GetRegion() + EndIf + If $aLanguage >= 0 Then + $lLanguage = $aLanguage + ElseIf $lLanguage < 0 Then + $lLanguage = GetLanguage() + EndIf + Update("Travel to map: " & $aMapID) + If MoveMap($aMapID, $lRegion, $lDistrict, $lLanguage) Then + Return WaitMapLoading($aMapID) + Else + Return False + EndIf +EndFunc ;==>TravelTo + +;~ Description: Internal use for map travel. +Func MoveMap($aMapID, $aRegion, $aDistrict, $aLanguage) + Return SendPacket(0x18, $CtoGS_MSG_TravelTo, $aMapID, $aRegion, $aDistrict, $aLanguage, False) +EndFunc ;==>MoveMap + +;~ Description: Returns to outpost after resigning/failure. +Func ReturnToOutpost() + Return SendPacket(0x4, $CtoGS_MSG_ReturnToOutpost) +EndFunc ;==>ReturnToOutpost + +;~ Description: Switch district to on randomly chosen. +Func DistrictChange($aMapID = 0, $aUseRegions = 5, $aUseLanguages = 6) + If $aMapID = 0 Or $aMapID = Default Then $aMapID = GetMapID() + If $aUseRegions > 5 Or $aUseRegions = Default Then $aUseRegions = 5 + If $aUseRegions < 0 Then $aUseRegions = 0 + If $aUseLanguages > 6 Or $aUseLanguages = Default Then $aUseLanguages = 6 + If $aUseLanguages < 0 Then $aUseLanguages = 0 + Static Local $lLanguages[7] = [10, 9, 5, 4, 3, 2, 0] + Static Local $lRegions[6] = [2, 1, 3, 4, -2, 0] + Local $lNewRegion = 0 + Local $lNewLanguage = 0 + Local $lCurrentRegion = GetRegion() + Local $lCurrentLanguage = -1 + If $aUseRegions > 0 And $aUseLanguages > 0 Then + Do + $lNewRegion = $lRegions[Random(0, $aUseRegions, 1)] + If $lNewRegion = 2 And $lCurrentRegion = 2 Then + If $lCurrentLanguage = -1 Then $lCurrentLanguage = GetLanguage() + Do + $lNewLanguage = $lLanguages[Random(0, $aUseLanguages, 1)] + Until $lNewLanguage <> $lCurrentLanguage + ElseIf $lNewRegion = 2 Then + $lNewLanguage = $lLanguages[Random(0, $aUseLanguages, 1)] + EndIf + Until $lCurrentRegion <> $lNewRegion + EndIf + MoveMap($aMapID, $lNewRegion, 0, $lNewLanguage) + Return WaitMapLoading($aMapID) +EndFunc ;==>DistrictChange +#EndRegion MapTravel + +#Region EnterChallenge +;~ Description: Enter a challenge mission/pvp. +Func EnterChallenge() + Return SendPacket(0x8, $CtoGS_MSG_EnterChallenge, 1) +EndFunc ;==>EnterChallenge + +;~ Description: Enter a foreign challenge mission/pvp. +Func EnterChallengeForeign() + Return SendPacket(0x8, $CtoGS_MSG_EnterChallenge, 0) +EndFunc ;==>EnterChallengeForeign + +;~ Description: Enters challenge mission/pvp and waits for end of loading screen. +Func SecureEnterChallenge() + If Not EnterChallengeForeign() Then Return + Do + Sleep(1000) + Until GetMapLoading() = 2 + Do + Sleep(1000) + Until GetMapLoading() <> 2 + SetPointers() + Return True +EndFunc +#EndRegion EnterChallenge + +#Region Guildhall +;~ Description: Tries to travel to GH. Checks first if already in gh and returns false if not successful. +Func TravelGuildHall($aMapID = GetMapID()) + If CheckGuildHallMapID($aMapID) Then Return True + TravelGH() + Sleep(1000) + Return CheckGuildHallMapID(GetMapID()) +EndFunc ;==>TravelGuildHall + +;~ Description: Return true if MapID belongs to any Guild Hall. +Func CheckGuildHallMapID($aMapID) + Switch $aMapID + Case 4, 5, 6, 52, 176, 177, 178, 179, 275, 276, 359, 360, 529, 530, 537, 538 + Return True + EndSwitch +EndFunc + +;~ Description: Travel to your guild hall. +Func TravelGH() + Static Local $lGHPtr = 0 + If $lGHPtr = 0 Then + Local $lOffset[4] = [0, 0x18, 0x3C, 0] + $lGHPtr = MemoryReadPtrChain($mBasePointer, $lOffset, 'ptr') + EndIf + MemoryReadToStruct($lGHPtr + 0x64, $GHPassKeyBuffer) + SendPacket(0x18, $CtoGS_MSG_TravelGH, DllStructGetData($GHPassKeyBuffer, 1), DllStructGetData($GHPassKeyBuffer, 2), DllStructGetData($GHPassKeyBuffer, 3), DllStructGetData($GHPassKeyBuffer, 4), 1) + Return WaitMapLoading() +EndFunc ;==>TravelGH + +;~ Description: Travels to own gh if $aPass1 = 0, or to specified gh passes. +Func TravelGHEx($aPass1 = 0, $aPass2 = 0, $aPass3 = 0, $aPass4 = 0) +Static $lOffset[4] = [0, 0x18, 0x3C, 0] +Local $lResult = 0 +If $aPass1 = 0 Then + Static Local $lGHPtr = 0 + MemoryReadToStruct((($lGHPtr = 0) ? ($lGHPtr = MemoryReadPtrChain($mBasePointer, $lOffset, 'ptr')) : ($lGHPtr)) + 0x64, $GHPassKeyBuffer) + $lResult = SendPacket(0x18, $CtoGS_MSG_TravelGH, DllStructGetData($GHPassKeyBuffer, 1), DllStructGetData($GHPassKeyBuffer, 2), DllStructGetData($GHPassKeyBuffer, 3), DllStructGetData($GHPassKeyBuffer, 4), 1) ;~ old -> $lResult = SendPacket(0x18, 0xAA, DllStructGetData($GHPassKeyBuffer, 1), DllStructGetData($GHPassKeyBuffer, 2), DllStructGetData($GHPassKeyBuffer, 3), DllStructGetData($GHPassKeyBuffer, 4), 1) +Else + $lResult = SendPacket(0x18, $CtoGS_MSG_TravelGH, $aPass1, $aPass2, $aPass3, $aPass4, 1) ;~ old -> $lResult = SendPacket(0x18, 0xAA, $aPass1, $aPass2, $aPass3, $aPass4, 1) +EndIf +If $lResult then Return WaitMapLoading() +EndFunc + +;~ Description: Leave your guild hall. +Func LeaveGH() + Local $lLastMapID = MemoryRead($mLastMapID) + If CheckGuildHallMapID($lLastMapID) Then Return ;$lLastMapID = 0 + SendPacket(0x8, $CtoGS_MSG_LeaveGH, 0x1) + Return WaitMapLoading($lLastMapID) +EndFunc ;==>LeaveGH +#EndRegion Guildhall + +#Region MapInfo +;~ Description: Returns current load-state. +Func GetMapLoading() + Return MemoryRead($mMapLoading) +EndFunc ;==>GetMapLoading + +;~ Description: Amount of time the current instance has been active. +Func GetInstanceUpTime() + Static Local $lTimerPtr = 0 + If $lTimerPtr = 0 Then + Local $lOffset[4] = [0, 0x18, 0x8, 0x1AC] + $lTimerPtr = MemoryReadPtrChain($mBasePointer, $lOffset, 'ptr') + EndIf + Return MemoryRead($lTimerPtr) +EndFunc ;==>GetInstanceUpTime + +;~ Description: Returns current map ID. +Func GetMapID() + Return MemoryRead($mMapID) +EndFunc ;==>GetMapID + +;~ Description: Returns current district. +Func GetDistrict() + Static Local $lDistrictPtr = 0 + If $lDistrictPtr = 0 Then + Local $lOffset[4] = [0, 0x18, 0x44, 0] + $lDistrictPtr = MemoryReadPtrChain($mBasePointer, $lOffset, 'ptr') + 0x1B4 + EndIf + Return MemoryRead($lDistrictPtr) +EndFunc ;==>GetDistrict + +;~ Description: Internal use for travel functions. +Func GetRegion() + Return MemoryRead($mRegion) +EndFunc ;==>GetRegion + +;~ Description: Internal use for travel functions. Returns Language. +Func GetLanguage() + Return MemoryRead($mLanguage) +EndFunc ;==>GetLanguage + +;~ Description: Returns number of foes that have been killed so far. +Func GetFoesKilled() + Return MemoryRead($mBasePtr182C + 0x84C) +EndFunc ;==>GetFoesKilled + +;~ Description: Returns number of enemies left to kill for vanquish. +Func GetFoesToKill() + Return MemoryRead($mBasePtr182C + 0x850) +EndFunc ;==>GetFoesToKill + +;~ Description: Tests if an area has been vanquished. +Func GetAreaVanquished() + Return GetFoesToKill() = 0 +EndFunc ;==>GetAreaVanquished +#EndRegion diff --git a/gwApi/memreads.au3 b/gwApi/memreads.au3 index a82f9f8..17f7d95 100644 --- a/gwApi/memreads.au3 +++ b/gwApi/memreads.au3 @@ -1,199 +1,200 @@ -#include-once - -#Region Arrays -#Region Agent -Global $mAgentvtable[2] = ['ptr', 0] -Global $mAgentTimer[2] = ['long', 20] -Global $mAgentNearestAgentPtr[2] = ['ptr', 28] -Global $mAgentNextAgent[2] = ['ptr', 32] -Global $mAgentId[2] = ['long', 44] -Global $mAgentZ[2] = ['float', 48] -Global $mAgentBoxHoverWidth[2] = ['float', 60] -Global $mAgentBoxHoverHeight[2] = ['float', 64] -Global $mAgentRotation[2] = ['float', 76] -Global $mAgentNameProperties[2] = ['long', 88] -Global $mAgentX[2] = ['float', 116] -Global $mAgentY[2] = ['float', 120] -Global $mAgentGround[2] = ['long', 124] -Global $mAgentNameTagX[2] = ['float', 132] -Global $mAgentNameTagY[2] = ['float', 136] -Global $mAgentNameTagZ[2] = ['float', 140] -Global $mAgentType[2] = ['long', 156] -Global $mAgentMoveX[2] = ['float', 160] -Global $mAgentMoveY[2] = ['float', 164] -Global $mAgentOwner[2] = ['long', 196] -Global $mAgentExtraType[2] = ['long', 208] -Global $mAgentAnimation[2] = ['byte', 220] -Global $mAgentAttackSpeed[2] = ['float', 236] -Global $mAgentAttackSpeedModifier[2] = ['float', 240] -Global $mAgentPlayerNumber[2] = ['word', 244] -Global $mAgentPlayerOrNPC[2] = ['char', 247] -Global $mAgentEquip[2] = ['ptr', 252] -Global $mAgentPrimary[2] = ['byte', 266] -Global $mAgentSecondary[2] = ['byte', 267] -Global $mAgentLevel[2] = ['byte', 268] -Global $mAgentTeam[2] = ['byte', 269] -Global $mAgentEnergyPips[2] = ['float', 276] -Global $mAgentEnergyPercent[2] = ['float', 284] -Global $mAgentMaxEnergy[2] = ['long', 288] -Global $mAgentHPPips[2] = ['float', 296] -Global $mAgentHP[2] = ['float', 304] -Global $mAgentMaxHP[2] = ['long', 308] -Global $mAgentEffects[2] = ['long', 312] -Global $mAgentHex[2] = ['byte', 320] -Global $mAgentModelState[2] = ['long', 340] -Global $mAgentTypeMap[2] = ['long', 344] -Global $mAgentInSpiritRange[2] = ['long', 364] -Global $mAgentLoginNumber[2] = ['long', 384] -Global $mAgentModelMode[2] = ['float', 388] -Global $mAgentModelAnimation[2] = ['long', 396] -Global $mAgentLastStrike[2] = ['byte', 432] -Global $mAgentAllegiance[2] = ['byte', 433] -Global $mAgentWeaponType[2] = ['word', 434] -Global $mAgentSkill[2] = ['word', 436] -Global $mAgentWeaponItemId[2] = ['word', 442] -Global $mAgentOffhandItemId[2] = ['word', 444] -#EndRegion - -#Region Bag -Global $mBagType[2] = ['long', 0] -Global $mBagIndex[2] = ['long', 4] -Global $mBagId[2] = ['long', 8] -Global $mBagContainerItem[2] = ['ptr', 12] -Global $mBagItemsCount[2] = ['long', 16] -Global $mBagArray[2] = ['ptr', 20] -Global $mBagItemArray[2] = ['ptr', 24] -Global $mBagFakeSlots[2] = ['long', 28] -Global $mBagSlots[2] = ['long', 32] -#EndRegion - -#Region Buff -Global $mBuffSkillId[2] = ['long', 0] -Global $mBuffId[2] = ['long', 8] -Global $mBuffTargetId[2] = ['long', 12] -#EndRegion - -#Region Item -Global $mItemId[2] = ['long', 0] -Global $mItemAgentId[2] = ['long', 4] -Global $mItemBag[2] = ['ptr', 12] -Global $mItemModstruct[2] = ['ptr', 16] -Global $mItemModstructsize[2] = ['long', 20] -Global $mItemCustomized[2] = ['ptr', 24] -Global $mItemType[2] = ['byte', 32] -Global $mItemExtraId[2] = ['short', 34] -Global $mItemValue[2] = ['short', 36] -Global $mItemInteraction[2] = ['short', 40] -Global $mItemModelId[2] = ['long', 44] -Global $mItemModString[2] = ['ptr', 48] -Global $mItemNameString[2] = ['ptr', 56] -Global $mItemQuantity[2] = ['byte', 75] -Global $mItemEquipped[2] = ['byte', 76] -Global $mItemSlot[2] = ['byte', 78] -#EndRegion - -#Region Quest -Global $mQuestId[2] = ['long', 0] -Global $mQuestLogState[2] = ['long', 4] -Global $mQuestMapFrom[2] = ['long', 20] -Global $mQuestX[2] = ['float', 24] -Global $mQuestY[2] = ['float', 28] -Global $mQuestMapTo[2] = ['long', 40] -#EndRegion - -#Region Skillbar -Global $mSbarAgentId[2] = ['long', 0] -Global $mSbarAdrenalineA1[2] = ['long', 4] -Global $mSbarAdrenalineB1[2] = ['long', 8] -Global $mSbarRecharge1[2] = ['dword', 12] -Global $mSbarId1[2] = ['dword', 16] -Global $mSbarEvent1[2] = ['dword', 20] -Global $mSbarAdrenalineA2[2] = ['long', 24] -Global $mSbarAdrenalineB2[2] = ['long', 28] -Global $mSbarRecharge2[2] = ['dword', 32] -Global $mSbarId2[2] = ['dword', 36] -Global $mSbarEvent2[2] = ['dword', 40] -Global $mSbarAdrenalineA3[2] = ['long', 44] -Global $mSbarAdrenalineB3[2] = ['long', 48] -Global $mSbarRecharge3[2] = ['dword', 52] -Global $mSbarId3[2] = ['dword', 56] -Global $mSbarEvent3[2] = ['dword', 60] -Global $mSbarAdrenalineA4[2] = ['long', 64] -Global $mSbarAdrenalineB4[2] = ['long', 68] -Global $mSbarRecharge4[2] = ['dword', 72] -Global $mSbarId4[2] = ['dword', 76] -Global $mSbarEvent4[2] = ['dword', 80] -Global $mSbarAdrenalineA5[2] = ['long', 84] -Global $mSbarAdrenalineB5[2] = ['long', 88] -Global $mSbarRecharge5[2] = ['dword', 92] -Global $mSbarId5[2] = ['dword', 96] -Global $mSbarEvent5[2] = ['dword', 100] -Global $mSbarAdrenalineA6[2] = ['long', 104] -Global $mSbarAdrenalineB6[2] = ['long', 108] -Global $mSbarRecharge6[2] = ['dword', 112] -Global $mSbarId6[2] = ['dword', 116] -Global $mSbarEvent6[2] = ['dword', 120] -Global $mSbarAdrenalineA7[2] = ['long', 124] -Global $mSbarAdrenalineB7[2] = ['long', 128] -Global $mSbarRecharge7[2] = ['dword', 132] -Global $mSbarId7[2] = ['dword', 136] -Global $mSbarEvent7[2] = ['dword', 140] -Global $mSbarAdrenalineA8[2] = ['long', 144] -Global $mSbarAdrenalineB8[2] = ['long', 148] -Global $mSbarRecharge8[2] = ['dword', 152] -Global $mSbarId8[2] = ['dword', 156] -Global $mSbarEvent8[2] = ['dword', 160] -Global $mSbarDisabled[2] = ['dword', 164] -Global $mSbarCasting[2] = ['dword', 176] -#EndRegion - -#Region SkillEffect -Global $mEffectSkillId[2] = ['long', 0] -Global $mEffectType[2] = ['long', 4] -Global $mEffectId[2] = ['long', 8] -Global $mEffectAgentId[2] = ['long', 12] -Global $mEffectDuration[2] = ['float', 16] -Global $mEffectTimeStamp[2] = ['long', 20] -#EndRegion - -#Region Skill -Global $mSkillID[2] = ['long', 0] -Global $mSkillCampaign[2] = ['long', 8] -Global $mSkillType[2] = ['long', 12] -Global $mSkillSpecial[2] = ['long', 16] -Global $mSkillComboReq[2] = ['long', 20] -Global $mSkillEffect1[2] = ['long', 24] -Global $mSkillCondition[2] = ['long', 28] -Global $mSkillEffect2[2] = ['long', 32] -Global $mSkillWeaponReq[2] = ['long', 36] -Global $mSkillProfession[2] = ['byte', 40] -Global $mSkillAttribute[2] = ['byte', 41] -Global $mSkillPvPID[2] = ['long', 44] -Global $mSkillCombo[2] = ['byte', 48] -Global $mSkillTarget[2] = ['byte', 49] -Global $mSkillEquipType[2] = ['byte', 51] -Global $mSkillEnergyCost[2] = ['byte', 53] -Global $mSkillHealthCost[2] = ['byte', 54] -Global $mSkillAdrenaline[2] = ['dword', 56] -Global $mSkillActivation[2] = ['float', 60] -Global $mSkillAftercast[2] = ['float', 64] -Global $mSkillDuration0[2] = ['long', 68] -Global $mSkillDuration15[2] = ['long', 72] -Global $mSkillRecharge[2] = ['long', 76] -Global $mSkillScale0[2] = ['long', 92] -Global $mSkillScale15[2] = ['long', 96] -Global $mSkillBonusScale0[2] = ['long', 100] -Global $mSkillBonusScale15[2] = ['long', 104] -Global $mSkillAoERange[2] = ['float', 108] -Global $mSkillConstEffect[2] = ['float', 112] -#EndRegion -#EndRegion - -#Region GetValue -;~ Description: Easier format of memreads. -;~ Example: Skill ID -> -;~ $lSkillID = GetMemoryValue($lSkillPtr, $mSkillID) -Func GetMemoryValue($aPtr, $aGlobalArray) - Return MemoryRead($aPtr + $aGlobalArray[1], $aGlobalArray[0]) -EndFunc ;==>GetMemoryValue -#EndRegion \ No newline at end of file +199 +#include-once + +#Region Arrays +#Region Agent +Global $mAgentvtable[2] = ['ptr', 0] +Global $mAgentTimer[2] = ['long', 20] +Global $mAgentNearestAgentPtr[2] = ['ptr', 28] +Global $mAgentNextAgent[2] = ['ptr', 32] +Global $mAgentId[2] = ['long', 44] +Global $mAgentZ[2] = ['float', 48] +Global $mAgentBoxHoverWidth[2] = ['float', 60] +Global $mAgentBoxHoverHeight[2] = ['float', 64] +Global $mAgentRotation[2] = ['float', 76] +Global $mAgentNameProperties[2] = ['long', 88] +Global $mAgentX[2] = ['float', 116] +Global $mAgentY[2] = ['float', 120] +Global $mAgentGround[2] = ['long', 124] +Global $mAgentNameTagX[2] = ['float', 132] +Global $mAgentNameTagY[2] = ['float', 136] +Global $mAgentNameTagZ[2] = ['float', 140] +Global $mAgentType[2] = ['long', 156] +Global $mAgentMoveX[2] = ['float', 160] +Global $mAgentMoveY[2] = ['float', 164] +Global $mAgentOwner[2] = ['long', 196] +Global $mAgentExtraType[2] = ['long', 208] +Global $mAgentAnimation[2] = ['byte', 220] +Global $mAgentAttackSpeed[2] = ['float', 236] +Global $mAgentAttackSpeedModifier[2] = ['float', 240] +Global $mAgentPlayerNumber[2] = ['word', 244] +Global $mAgentPlayerOrNPC[2] = ['char', 247] +Global $mAgentEquip[2] = ['ptr', 252] +Global $mAgentPrimary[2] = ['byte', 266] +Global $mAgentSecondary[2] = ['byte', 267] +Global $mAgentLevel[2] = ['byte', 268] +Global $mAgentTeam[2] = ['byte', 269] +Global $mAgentEnergyPips[2] = ['float', 276] +Global $mAgentEnergyPercent[2] = ['float', 284] +Global $mAgentMaxEnergy[2] = ['long', 288] +Global $mAgentHPPips[2] = ['float', 296] +Global $mAgentHP[2] = ['float', 304] +Global $mAgentMaxHP[2] = ['long', 308] +Global $mAgentEffects[2] = ['long', 312] +Global $mAgentHex[2] = ['byte', 320] +Global $mAgentModelState[2] = ['long', 340] +Global $mAgentTypeMap[2] = ['long', 344] +Global $mAgentInSpiritRange[2] = ['long', 364] +Global $mAgentLoginNumber[2] = ['long', 384] +Global $mAgentModelMode[2] = ['float', 388] +Global $mAgentModelAnimation[2] = ['long', 396] +Global $mAgentLastStrike[2] = ['byte', 432] +Global $mAgentAllegiance[2] = ['byte', 433] +Global $mAgentWeaponType[2] = ['word', 434] +Global $mAgentSkill[2] = ['word', 436] +Global $mAgentWeaponItemId[2] = ['word', 442] +Global $mAgentOffhandItemId[2] = ['word', 444] +#EndRegion + +#Region Bag +Global $mBagType[2] = ['long', 0] +Global $mBagIndex[2] = ['long', 4] +Global $mBagId[2] = ['long', 8] +Global $mBagContainerItem[2] = ['ptr', 12] +Global $mBagItemsCount[2] = ['long', 16] +Global $mBagArray[2] = ['ptr', 20] +Global $mBagItemArray[2] = ['ptr', 24] +Global $mBagFakeSlots[2] = ['long', 28] +Global $mBagSlots[2] = ['long', 32] +#EndRegion + +#Region Buff +Global $mBuffSkillId[2] = ['long', 0] +Global $mBuffId[2] = ['long', 8] +Global $mBuffTargetId[2] = ['long', 12] +#EndRegion + +#Region Item +Global $mItemId[2] = ['long', 0] +Global $mItemAgentId[2] = ['long', 4] +Global $mItemBag[2] = ['ptr', 12] +Global $mItemModstruct[2] = ['ptr', 16] +Global $mItemModstructsize[2] = ['long', 20] +Global $mItemCustomized[2] = ['ptr', 24] +Global $mItemType[2] = ['byte', 32] +Global $mItemExtraId[2] = ['short', 34] +Global $mItemValue[2] = ['short', 36] +Global $mItemInteraction[2] = ['short', 40] +Global $mItemModelId[2] = ['long', 44] +Global $mItemModString[2] = ['ptr', 48] +Global $mItemNameString[2] = ['ptr', 56] +Global $mItemQuantity[2] = ['byte', 75] +Global $mItemEquipped[2] = ['byte', 76] +Global $mItemSlot[2] = ['byte', 78] +#EndRegion + +#Region Quest +Global $mQuestId[2] = ['long', 0] +Global $mQuestLogState[2] = ['long', 4] +Global $mQuestMapFrom[2] = ['long', 20] +Global $mQuestX[2] = ['float', 24] +Global $mQuestY[2] = ['float', 28] +Global $mQuestMapTo[2] = ['long', 40] +#EndRegion + +#Region Skillbar +Global $mSbarAgentId[2] = ['long', 0] +Global $mSbarAdrenalineA1[2] = ['long', 4] +Global $mSbarAdrenalineB1[2] = ['long', 8] +Global $mSbarRecharge1[2] = ['dword', 12] +Global $mSbarId1[2] = ['dword', 16] +Global $mSbarEvent1[2] = ['dword', 20] +Global $mSbarAdrenalineA2[2] = ['long', 24] +Global $mSbarAdrenalineB2[2] = ['long', 28] +Global $mSbarRecharge2[2] = ['dword', 32] +Global $mSbarId2[2] = ['dword', 36] +Global $mSbarEvent2[2] = ['dword', 40] +Global $mSbarAdrenalineA3[2] = ['long', 44] +Global $mSbarAdrenalineB3[2] = ['long', 48] +Global $mSbarRecharge3[2] = ['dword', 52] +Global $mSbarId3[2] = ['dword', 56] +Global $mSbarEvent3[2] = ['dword', 60] +Global $mSbarAdrenalineA4[2] = ['long', 64] +Global $mSbarAdrenalineB4[2] = ['long', 68] +Global $mSbarRecharge4[2] = ['dword', 72] +Global $mSbarId4[2] = ['dword', 76] +Global $mSbarEvent4[2] = ['dword', 80] +Global $mSbarAdrenalineA5[2] = ['long', 84] +Global $mSbarAdrenalineB5[2] = ['long', 88] +Global $mSbarRecharge5[2] = ['dword', 92] +Global $mSbarId5[2] = ['dword', 96] +Global $mSbarEvent5[2] = ['dword', 100] +Global $mSbarAdrenalineA6[2] = ['long', 104] +Global $mSbarAdrenalineB6[2] = ['long', 108] +Global $mSbarRecharge6[2] = ['dword', 112] +Global $mSbarId6[2] = ['dword', 116] +Global $mSbarEvent6[2] = ['dword', 120] +Global $mSbarAdrenalineA7[2] = ['long', 124] +Global $mSbarAdrenalineB7[2] = ['long', 128] +Global $mSbarRecharge7[2] = ['dword', 132] +Global $mSbarId7[2] = ['dword', 136] +Global $mSbarEvent7[2] = ['dword', 140] +Global $mSbarAdrenalineA8[2] = ['long', 144] +Global $mSbarAdrenalineB8[2] = ['long', 148] +Global $mSbarRecharge8[2] = ['dword', 152] +Global $mSbarId8[2] = ['dword', 156] +Global $mSbarEvent8[2] = ['dword', 160] +Global $mSbarDisabled[2] = ['dword', 164] +Global $mSbarCasting[2] = ['dword', 176] +#EndRegion + +#Region SkillEffect +Global $mEffectSkillId[2] = ['long', 0] +Global $mEffectType[2] = ['long', 4] +Global $mEffectId[2] = ['long', 8] +Global $mEffectAgentId[2] = ['long', 12] +Global $mEffectDuration[2] = ['float', 16] +Global $mEffectTimeStamp[2] = ['long', 20] +#EndRegion + +#Region Skill +Global $mSkillID[2] = ['long', 0] +Global $mSkillCampaign[2] = ['long', 8] +Global $mSkillType[2] = ['long', 12] +Global $mSkillSpecial[2] = ['long', 16] +Global $mSkillComboReq[2] = ['long', 20] +Global $mSkillEffect1[2] = ['long', 24] +Global $mSkillCondition[2] = ['long', 28] +Global $mSkillEffect2[2] = ['long', 32] +Global $mSkillWeaponReq[2] = ['long', 36] +Global $mSkillProfession[2] = ['byte', 40] +Global $mSkillAttribute[2] = ['byte', 41] +Global $mSkillPvPID[2] = ['long', 44] +Global $mSkillCombo[2] = ['byte', 48] +Global $mSkillTarget[2] = ['byte', 49] +Global $mSkillEquipType[2] = ['byte', 51] +Global $mSkillEnergyCost[2] = ['byte', 53] +Global $mSkillHealthCost[2] = ['byte', 54] +Global $mSkillAdrenaline[2] = ['dword', 56] +Global $mSkillActivation[2] = ['float', 60] +Global $mSkillAftercast[2] = ['float', 64] +Global $mSkillDuration0[2] = ['long', 68] +Global $mSkillDuration15[2] = ['long', 72] +Global $mSkillRecharge[2] = ['long', 76] +Global $mSkillScale0[2] = ['long', 92] +Global $mSkillScale15[2] = ['long', 96] +Global $mSkillBonusScale0[2] = ['long', 100] +Global $mSkillBonusScale15[2] = ['long', 104] +Global $mSkillAoERange[2] = ['float', 108] +Global $mSkillConstEffect[2] = ['float', 112] +#EndRegion +#EndRegion + +#Region GetValue +;~ Description: Easier format of memreads. +;~ Example: Skill ID -> +;~ $lSkillID = GetMemoryValue($lSkillPtr, $mSkillID) +Func GetMemoryValue($aPtr, $aGlobalArray) + Return MemoryRead($aPtr + $aGlobalArray[1], $aGlobalArray[0]) +EndFunc ;==>GetMemoryValue +#EndRegion diff --git a/gwApi/movement.au3 b/gwApi/movement.au3 index bdc8bc5..e2dbe4d 100644 --- a/gwApi/movement.au3 +++ b/gwApi/movement.au3 @@ -1,659 +1,660 @@ -#include-once - -#Region Move -;~ Description: Move to a location. -Func Move($aX, $aY, $aRandom = 50) - If $aX = 0 Or $aY = 0 Then Return - DllStructSetData($mMove, 2, $aX + Random(-$aRandom, $aRandom)) - DllStructSetData($mMove, 3, $aY + Random(-$aRandom, $aRandom)) - Return Enqueue($mMovePtr, 16) -EndFunc ;==>Move - -;~ Description: Move to exact location, no random number added. -Func Move_($aX, $aY) - If $aX = 0 Or $aY = 0 Then Return - DllStructSetData($mMove, 2, $aX) - DllStructSetData($mMove, 3, $aY) - Return Enqueue($mMovePtr, 16) -EndFunc ;==>Move_ - -;~ Description: Move to a location and wait until you reach it. -Func MoveTo($aX, $aY, $aRandom = 50, $aMyID = GetMyID(), $aMe = GetAgentPtr($aMyID)) - If GetIsDead($aMe) Then Return False - If $aRandom = Default Then $aRandom = 50 - Local $lBlocked = 0 - Local $lRubberbanding = 0 - Local $lAlpha = 0 - Local $lDistance, $lDistanceOld, $lOut, $lStuckX, $lStuckY - Local $lMoveX, $lMoveY, $lMeX, $lMeY, $lNewX, $lNewY, $lOldX = 0, $lOldY = 0 - UpdateAgentPosByPtr($aMe, $lMeX, $lMeY) - If ComputeDistance($lMeX, $lMeY, $aX, $aY) <= $aRandom Then Return True - Local $lMapLoading = GetMapLoading(), $lMapLoadingOld - If $lMapLoading = 2 Then Return False - Local $lDestX = $aX + Random(-$aRandom, $aRandom) - Local $lDestY = $aY + Random(-$aRandom, $aRandom) - Move_($lDestX, $lDestY) - Sleep(500 + GetPing()) - Do - Sleep(500) - If MemoryRead($aMe + 304, 'float') <= 0 Then Return False - $lMapLoadingOld = $lMapLoading - $lMapLoading = GetMapLoading() - If $lMapLoading <> $lMapLoadingOld Then Return False - UpdateAgentMoveByPtr($aMe, $lMoveX, $lMoveY) - If $lMoveX = 0 And $lMoveY = 0 Then ; not moving - UpdateAgentPosByPtr($aMe, $lMeX, $lMeY) - $lStuckX = $lMeX - $lStuckY = $lMeY - $lDistanceOld = ComputeDistance($lMeX, $lMeY, $lDestX, $lDestY) - If $lDistanceOld <= $aRandom Or $lDistanceOld <= 150 Then Return True - $lBlocked += 1 - If $lBlocked > 1 Then - If $lOldX <> $lMeX And $lOldY <> $lMeY Then - $lAlpha = ATan(($lMeX - $lOldX) / ($lMeY - $lOldY)) + 5.24 - Else - $lAlpha = 0 - EndIf - $lOldX = $lMeX - $lOldY = $lMeY - $lOut = False - For $i = 1 To 9 - $lNewX = Sin($lAlpha) * 300 + $lMeX - $lNewY = Cos($lAlpha) * 300 + $lMeY - ConsoleWrite($lNewX & ', ' & $lNewY & @CRLF) - Move($lNewX, $lNewY) - Sleep(1000) - UpdateAgentPosByPtr($aMe, $lMeX, $lMeY) - If ComputePseudoDistance($lMeX, $lMeY, $lNewX, $lNewY) < 22500 Then - ConsoleWrite("Moving again." & @CRLF) - $lOut = True - ExitLoop - EndIf - $lAlpha += 0.524 - Next - If Not $lOut And ComputePseudoDistance($lMeX, $lMeY, $lOldX, $lOldY) < 10000 Then - ConsoleWrite("Got really stuck." & @CRLF) - Return False - EndIf - If $lBlocked > 2 Then - For $i = 1 To 9 - $lNewX = Sin($lAlpha) * 300 + $lStuckX - $lNewY = Cos($lAlpha) * 300 + $lStuckY - Move($lNewX, $lNewY) - Sleep(500) - UpdateAgentPosByPtr($aMe, $lMeX, $lMeY) - $lAlpha += 0.524 - Next - $lNewX = Sin($lAlpha) * 300 + $lStuckX - $lNewY = Cos($lAlpha) * 300 + $lStuckY - Move_($lNewX, $lNewY) - Sleep(500) - EndIf - Move_($lDestX, $lDestY) - Sleep(500 + GetPing()) - EndIf - ElseIf Not GetMoving($aMyID) Then ; rubberbanding - UpdateAgentPosByPtr($aMe, $lMeX, $lMeY) - If ComputeDistance($lMeX, $lMeY, $lDestX, $lDestY) <= $aRandom Then Return True - $lRubberbanding += 1 - If $lRubberbanding > 20 Then Return False - If Mod($lRubberbanding, 2) = 0 Then - UpdateAgentPos($aMyID) - Sleep(250) - Move_($lDestX, $lDestY) - Sleep(500 + GetPing()) - EndIf - Else - $lOldX = $lMeX - $lOldY = $lMeY - EndIf - UpdateAgentPosByPtr($aMe, $lMeX, $lMeY) - Until ComputeDistance($lMeX, $lMeY, $lDestX, $lDestY) <= $aRandom - Return True -EndFunc ;==>MoveTo - -;~ Description: Updates agent position, internal use only. -Func UpdateAgentPos($aAgentID = -2) -;~ If $aAgentID = -2 Then -;~ $aAgentID = GetMyID() -;~ ElseIf $aAgentID = -1 Then -;~ ConsoleWrite("Cant update agent pos for target." & @CRLF) -;~ Return False -;~ EndIf - - - If $mAgentMovement = 0 Then $mAgentMovement = GetAgentMovementPtr() - Local $lAgentMovementPtr = MemoryRead($mAgentMovement + 4 * ConvertID($aAgentID)) - - If $lAgentMovementPtr = 0 Then - ConsoleWrite("Error getting movement struct pointer." & @CRLF) - Return False - EndIf - Local $lAgentMovementID = MemoryRead($lAgentMovementPtr + 16, 'long') - - - If $lAgentMovementID <> $aAgentID Then - Local $lNewID = GetMyID() - If $lNewID <> $MyID Then SetPointers() - If $lNewID <> $lAgentMovementID Then - $mAgentMovement = GetAgentMovementPtr() - ConsoleWrite("Error, outdated AgentMovementPtr." & @CRLF) - Return False - EndIf - EndIf - If MemoryRead($lAgentMovementPtr + 60, 'long') <> 0 Then - ConsoleWrite("Error, we are moving again." & @CRLF) - Return - EndIf - - Local Static $lBuffer = DllStructCreate('byte X[4];byte Y[4]') - MemoryReadToStruct($lAgentMovementPtr + 120, $lBuffer) - If DllStructGetData($lBuffer, 'X') = 0 And DllStructGetData($lBuffer, 'Y') = 0 Then - ConsoleWrite("Error reading movement struct." & @CRLF) - Return False - EndIf - ConsoleWrite(DllStructGetData($lBuffer, 'X') & ' | ' & DllStructGetData($lBuffer, 'Y') & @CRLF) - DllStructSetData($mUpdateAgentPos, 2, 0x21) - DllStructSetData($mUpdateAgentPos, 3, $aAgentID) - DllStructSetData($mUpdateAgentPos, 4, DllStructGetData($lBuffer, 'X')) - DllStructSetData($mUpdateAgentPos, 5, DllStructGetData($lBuffer, 'Y')) - DllStructSetData($mUpdateAgentPos, 6, 0) - DllStructSetData($mUpdateAgentPos, 7, 0) - Return Enqueue($mUpdateAgentPosPtr, 28) -EndFunc ;==>UpdateAgentPos - -#Region MoveAggroing -;~ Description: Params: MoveX, MoveY, Sleep after moving. Requires UpdateWorld() variables. -Func MoveAggroing($aMoveToX, $aMoveToY, $aSleepTime = 3600000, $aMyID = GetMyID(), $aMe = GetAgentPtr($aMyID)) - If $aSleepTime = Default Then $aSleepTime = 3600000 - Local Static $WaypointCounter = 1 - Local $lBlocked = 0 - Local $lAngle = 0 - Local $lMapLoading, $MyLocation - If GetMapLoading() = 2 Then Return False ; loading screen - Update("Move to waypoint #" & $WaypointCounter) - $WaypointCounter += 1 - Move($aMoveToX, $aMoveToY) - Local $lSleepTimer = TimerInit() - Local $lAgentArray = GetAgentPtrArray(1) ; all living - For $i = 1 To 400 - PingSleep(200) - If Mod($i, 2) = 0 Then Local $lAgentArray = GetAgentPtrArray(1) ; all living - If Not UpdateWorld($lAgentArray, 1350, $aMyID, $aMe) Then - ConsoleWrite("UpdateWorld." & @CRLF) - If Death($lAgentArray, $aMe) Then ExitLoop - EndIf - If Not MoveIfHurt($aMe) Then - ConsoleWrite("MoveIfHurt." & @CRLF) - If Death($lAgentArray, $aMe) Then ExitLoop - EndIf - If Not AttackRange($lAgentArray, 1350, $aMe) Then - ConsoleWrite("AttackRange." & @CRLF) - If Death($lAgentArray, $aMe) Then ExitLoop - EndIf - If Not SmartCast($aMe) Then - ConsoleWrite("Smartcast." & @CRLF) - If Death($lAgentArray, $aMe) Then ExitLoop - EndIf - If Not PickUpLoot(2, $aMyID, $aMe) Then - ConsoleWrite("PickUpLoot." & @CRLF) - If Death($lAgentArray, $aMe) Then ExitLoop - EndIf - If Not $boolRun Then - ConsoleWrite("ExitLoop." & @CRLF) - ExitLoop - EndIf - GetHealthCheck($lAgentArray) - Disconnected() - $lMapLoading = GetMapLoading() - If Not $SkipCinematic And $lMapLoading <> 1 Then - ExitLoop ; only explorable - EndIf - If $SkipCinematic And $lMapLoading <> 1 Then ; loading screen before cinematic? - If WaitLoadingAndSkipCinematic() Then ; skipped cinematic, probably new loading screen now - $SkipCinematic = False - For $i = 1 To 10 - Sleep(1000) - $lMapLoading = GetMapLoading() - If $lMapLoading <> 2 Then ExitLoop - Next - SetPointers() - Else - $lMapLoading = GetMapLoading() - EndIf - If $lMapLoading <> 1 Then Return ; cinematic yes or no, we are not in kansas anymore - EndIf - If $SkipCinematic And DetectCinematic() Then - $SkipCinematic = False - Return SecureSkipCinematic() - EndIf - If MemoryRead($aMe + 44, 'long') <> $aMyID Then - ConsoleWrite("MyID incorrect." & @CRLF) - ExitLoop - EndIf - $MyLocation = XandYLocation($aMe) ; returns array - If $mLowestEnemy = 0 And Not GetIsMoving($aMe) Then - $lBlocked += 1 - Move($aMoveToX, $aMoveToY) - Sleep(200) - If Mod($lBlocked, 2) = 0 And Not GetIsMoving($aMe) Then - $lAngle += 40 - Move($MyLocation[0] + 200 * Sin($lAngle), $MyLocation[1] + 200 * Cos($lAngle)) - PingSleep(500) - EndIf - EndIf - Sleep(100) - If ComputeDistance($aMoveToX, $aMoveToY, $MyLocation[0], $MyLocation[1]) < 200 And $EnemyAttacker = 0 Then Return True - If TimerDiff($lSleepTimer) > $aSleepTime Then Return False - Next - ConsoleWrite("Resign." & @CRLF) - ResignAndWaitForReturn() -EndFunc ;==>MoveAggroing - -;~ Description: Returns true if agent and party is dead. -Func Death(ByRef $aAgentArray, $aAgent = GetAgentPtr(-2), $aResign = False) - If Not IsArray($aAgentArray) Then Return - If IsPtr($aAgent) <> 0 Then - Local $lAgentPtr = $aAgent - Else - Local $lAgentPtr = GetAgentPtr($aAgent) - EndIf - Local $lPartyDead = False - If BitAND(MemoryRead($lAgentPtr + 312, 'long'), 0x0010) Then - If $aAgentArray[0] <> 0 Then - For $i = 1 to 5 - If GetMapLoading() <> 1 Then - $lPartyDead = True - ExitLoop - EndIf - For $j = 1 To $aAgentArray[0] - If MemoryRead($aAgentArray[$j] + 433, 'byte') <> 1 Then ContinueLoop ; Allegiance - If BitAND(MemoryRead($aAgentArray[$j] + 312, 'long'), 0x0010) Then - $lPartyDead = True - Else - $lPartyDead = False - EndIf - Next - RndSleep(100) - Next - Else - $lPartyDead = True - EndIf - ConsoleWrite("Test2." & @CRLF) - If $lPartyDead And $aResign Then ResignAndWaitForReturn() - Return $lPartyDead - EndIf -EndFunc ;==>Death - -;~ Description: Internal use MoveAggroing(). --- -Func AttackRange(ByRef $aAgentArray, $Distance = 1350, $aMe = GetAgentPtr(-2)) ; Cast Range - If GetIsDead($aMe) Then Return False - If GetMapLoading() <> 1 Then Return True - If $mLowestEnemy <> 0 Then - Attack($mLowestEnemy) - Else - Local $VIP = GetVIP_($aAgentArray, $Distance) - Local $VIPsTarget = GetTarget($VIP) - If $VIPsTarget > 0 Then - Attack($VIPsTarget) - EndIf - EndIf -EndFunc ;==>AttackRange - -;~ Description: Don't Continue on while anyone has low health, Returns TRUE if all have good HP. Internal use MoveAggroing() -Func GetHealthCheck(ByRef $aAgentArray) - Local $MoveX, $MoveY - If $mClosestEnemy <> 0 Then Return True ; Return if someone to fight - For $i = 1 To $aAgentArray[0] - If MemoryRead($aAgentArray[$i] + 433, 'byte') <> 1 Then ContinueLoop ; Allegiance - If MemoryRead($aAgentArray[$i] + 304, 'float') < 0.40 Then - Update("Waiting for party heal") - UpdateAgentPosByPtr($aAgentArray[$i], $MoveX, $MoveY) - Move($MoveX, $MoveY) - RndSleep(1000) - Return False - EndIf - Next - Return True -EndFunc ;==>GetHealthCheck - -;~ Description: Moves around if health is below 70%. -Func MoveIfHurt($aMe = GetAgentPtr(-2)) - Local $lX, $lY, $lRandom = 300, $lBlocked = 0 - If $NumberOfFoesInAttackRange < 1 Then Return True - If GetMapLoading() <> 1 Then Return True - If GetIsDead($aMe) Then Return False - If GetHealth($aMe) < 0.7 Then - If TimerDiff($HurtTimer) > 1000 And Not GetHasDegenHex($aMe) Then - Local $theta = Random(0, 360) - $HurtTimer = TimerInit() - UpdateAgentPosByPtr($mHighestAlly, $lX, $lY) - Move(50 * Cos($theta * 0.01745) + $lX, 50 * Sin($theta * 0.01745) + $lY, 0) - Sleep(300) - EndIf - EndIf -EndFunc ;==>MoveIfHurt -#EndRegion MoveAggroing -#EndRegion - -#Region GoTo -;~ Description: Run to or follow a player. -Func GoPlayer($aAgent) - If IsPtr($aAgent) <> 0 Then - Return SendPacket(0x8, 0x2D, MemoryRead($aAgent + 44, 'long')) - ElseIf IsDllStruct($aAgent) <> 0 Then - Return SendPacket(0x8, 0x2D, DllStructGetData($aAgent, 'ID')) - Else - Return SendPacket(0x8, 0x2D, ConvertID($aAgent)) - EndIf -EndFunc ;==>GoPlayer - -;~ Description: Talk to an NPC. -Func GoNPC($aAgent) - If IsPtr($aAgent) <> 0 Then - Local $lAgentID = MemoryRead($aAgent + 44, 'long') - ElseIf IsDllStruct($aAgent) <> 0 Then - Local $lAgentID = DllStructGetData($aAgent, 'ID') - Else - Local $lAgentID = ConvertID($aAgent) - EndIf - ChangeTarget($lAgentID) - Return SendPacket(0xC, 0x33, $lAgentID) -EndFunc ;==>GoNPC - -;~ Description: Go and talk to NPC. -;~ Author: 4D1. -Func GoNPCasm($aAgent, $aCallTarget = 0) - If IsPtr($aAgent) Then - $aAgent = MemoryRead($aAgent + 44,'dword') - Else - $aAgent = ConvertId($aAgent) - EndIf - DllStructSetData($mGoNpc, 2, $aAgent) - DllStructSetData($mGoNpc, 3, $aCallTarget) - Return Enqueue($mGoNpcPtr, 12) -EndFunc - -;~ Description: Waits until you reach npc and talks to NPC. Uses GoNPCasm instead of Sendpacket and MoveTo. -Func GoToNPC($aAgent, $aMyID = GetMyID(), $aMe = GetAgentPtr($aMyID), $aCallTarget = 0, $aTimeOut = 30000) - Local $lAgentPtr, $lAgentID, $lMoveX, $lMoveY, $lOldX, $lOldY, $lMeX, $lMeY, $lAlpha, $lStuckX, $lStuckY - Local $lAgentX = 0 - Local $lAgentY = 0 - Local $lBlocked = 0 - Local $lRubberbanding = 0 - If IsPtr($aAgent) <> 0 Then - $lAgentPtr = $aAgent - $lAgentID = MemoryRead($aAgent + 44, 'long') - ElseIf IsDllStruct($aAgent) <> 0 Then - $lAgentID = DllStructGetData($aAgent, 'ID') - $lAgentPtr = GetAgentPtr($lAgentID) - Else - $lAgentID = ConvertID($aAgent) - $lAgentPtr = GetAgentPtr($lAgentID) - EndIf - UpdateAgentPosByPtr($aMe, $lOldX, $lOldY) - MemoryWrite($mDialogOwnerID, 0, 'word') - If GoNPCasm($lAgentID) Then - Local $lAlpha - Local $lDeadlock = TimerInit() - Do - Sleep(250) - UpdateAgentPosByPtr($aMe, $lMeX, $lMeY) - UpdateAgentMoveByPtr($aMe, $lMoveX, $lMoveY) - If $lMoveX = 0 And $lMoveY = 0 Then ; not moving - $lStuckX = $lMeX - $lStuckY = $lMeY - If $lAgentX = 0 Then UpdateAgentPosByPtr($lAgentPtr, $lAgentX, $lAgentY) - Local $lDistanceOld = ComputeDistance($lMeX, $lMeY, $lAgentX, $lAgentY) - If $lDistanceOld <= 150 Then - If MemoryRead($mDialogOwnerID, 'word') = $lAgentID Then Return True - Return GoNPC($lAgentPtr) - EndIf - $lBlocked += 1 - If $lBlocked > 1 Then - If $lOldX <> $lMeX And $lOldY <> $lMeY Then - $lAlpha = ATan(($lMeX - $lOldX) / ($lMeY - $lOldY)) + 5.24 - Else - $lAlpha = 0 - EndIf - $lOldX = $lMeX - $lOldY = $lMeY - Local $lOut = False - For $i = 1 To 9 - $lNewX = Sin($lAlpha) * 300 + $lMeX - $lNewY = Cos($lAlpha) * 300 + $lMeY - Move($lNewX, $lNewY) - Sleep(1000) - UpdateAgentPosByPtr($aMe, $lMeX, $lMeY) - If ComputePseudoDistance($lMeX, $lMeY, $lNewX, $lNewY) < 22500 Then - $lOut = True - ExitLoop - EndIf - $lAlpha += 0.524 - Next - If Not $lOut And ComputePseudoDistance($lMeX, $lMeY, $lOldX, $lOldY) < 10000 Then - ConsoleWrite("Got really stuck." & @CRLF) - Return False - EndIf - If $lBlocked > 2 Then - For $i = 1 To 9 - $lNewX = Sin($lAlpha) * 300 + $lStuckX - $lNewY = Cos($lAlpha) * 300 + $lStuckY - Move($lNewX, $lNewY) - Sleep(500) - UpdateAgentPosByPtr($aMe, $lMeX, $lMeY) - $lAlpha += 0.524 - Next - $lNewX = Sin($lAlpha) * 300 + $lStuckX - $lNewY = Cos($lAlpha) * 300 + $lStuckY - Move_($lNewX, $lNewY) - Sleep(500) - EndIf - Move_($lAgentX, $lAgentY) - Sleep(500 + GetPing()) - EndIf - ElseIf Not GetMoving($aMyID) Then ; rubberbanding - UpdateAgentPosByPtr($aMe, $lMeX, $lMeY) - If $lAgentX = 0 Then UpdateAgentPosByPtr($lAgentPtr, $lAgentX, $lAgentY) - $lDistanceOld = ComputeDistance($lMeX, $lMeY, $lAgentX, $lAgentY) - If $lDistanceOld <= 150 Then - If MemoryRead($mDialogOwnerID, 'word') = $lAgentID Then Return True - Return GoNPC($lAgentPtr) - EndIf - $lRubberbanding += 1 - If $lRubberbanding > 20 Then Return False - If Mod($lRubberbanding, 2) = 0 Then - UpdateAgentPos($aMyID) - Sleep(250) - Move_($lAgentX, $lAgentY) - Sleep(500 + GetPing()) - EndIf - Else - $lOldX = $lMeX - $lOldY = $lMeY - EndIf - If MemoryRead($mDialogOwnerID, 'word') = $lAgentID Then Return True - Until TimerDiff($lDeadlock) > $aTimeOut - EndIf -EndFunc - -;~ Description: Talks to NPC and waits until you reach them. Uses Sendpacket and MoveTo. -Func GoToNPC_($aAgent, $aMyID = GetMyID(), $aMe = GetAgentPtr($aMyID)) - If IsPtr($aAgent) <> 0 Then - Local $lAgentID = MemoryRead($aAgent + 44, 'long') - Local $lAgentPtr = $aAgent - ElseIf IsDllStruct($aAgent) <> 0 Then - Local $lAgentID = DllStructGetData($aAgent, 'ID') - Local $lAgentPtr = GetAgentPtr($lAgentID) - Else - Local $lAgentID = $aAgent - Local $lAgentPtr = GetAgentPtr($lAgentID) - EndIf - Local $lAgentX, $lAgentY - UpdateAgentPosByPtr($lAgentPtr, $lAgentX, $lAgentY) - Local $lDistance = 100 - Do - $lDistance += 50 - If $lDistance > 350 Then Return False ; cant reach - Until MoveTo($lAgentX, $lAgentY, $lDistance, $aMyID, $aMe) - Sleep(100) - GoNPC($lAgentPtr) - Sleep(500 + $lDistance) - Return True -EndFunc ;==>GoToNPC - -;~ Description: Run to a signpost. -Func GoSignpost($aAgent) - If IsPtr($aAgent) <> 0 Then - Return SendPacket(0xC, 0x4B, MemoryRead($aAgent + 44, 'long'), 0) - ElseIf IsDllStruct($aAgent) <> 0 Then - Return SendPacket(0xC, 0x4B, DllStructGetData($aAgent, 'ID'), 0) - Else - Return SendPacket(0xC, 0x4B, ConvertID($aAgent), 0) - EndIf -EndFunc ;==>GoSignpost - -;~ Description: Go to signpost and waits until you reach it. -Func GoToSignpost($aAgent, $aMyID = GetMyID(), $aMe = GetAgentPtr($aMyID)) - If IsPtr($aAgent) <> 0 Then - Local $lAgentPtr = $aAgent - ElseIf IsDllStruct($aAgent) <> 0 Then - Local $lAgentID = DllStructGetData($aAgent, 'ID') - Local $lAgentPtr = GetAgentPtr($lAgentID) - Else - Local $lAgentPtr = GetAgentPtr($aAgent) - EndIf - Local $lBlocked = 0, $lMeX, $lMeY, $lAgentX, $lAgentY - Local $lMapLoading = GetMapLoading(), $lMapLoadingOld - Local $lMoveX, $lMoveY, $lMeX, $lMeY, $lAgentX, $lAgentY - UpdateAgentPosByPtr($lAgentPtr, $lAgentX, $lAgentY) - Local $lDistance = 50 - Do - $lDistance += 50 - If $lDistance > 300 Then Return False ; cant reach - Until MoveTo($lAgentX, $lAgentY, $lDistance, $aMyID, $aMe) - Sleep(100) - GoSignpost($lAgentPtr) - Sleep($lDistance) - Return True -EndFunc ;==>GoToSignpost - -;~ Description: Finds NPC nearest given coords and talks to him/her. -Func GoToNPCNearestCoords($aX, $aY, $aMyID = GetMyID(), $aMe = GetAgentPtr($aMyID)) - Local $lAgent - For $i = 1 To 20 ; about 1 sec time to retrieve npc - $lAgent = GetNearestNPCPtrToCoords($aX, $aY) - Sleep(125) - If $lAgent <> 0 Then - ChangeTarget($lAgent) - Return GoToNPC($lAgent, $aMyID, $aMe) - EndIf - Next -EndFunc ;==>GoToNPCNearestCoords - -;~ Description: Goes to NPC with playernumber and talks to that NPC. -Func GoToNPCbyPlayernumber($aPlayernumber, $aMyID = GetMyID(), $aMe = GetAgentPtr($aMyID)) - Local $lAgentArray = GetAgentPtrArray(1) - For $i = 1 To $lAgentArray[0] - If MemoryRead($lAgentArray[$i] + 244, 'word') = Int($aPlayernumber) Then - GoToNPC($lAgentArray[$i], $aMyID, $aMe) - Return Dialog(0x7F) - EndIf - Next -EndFunc ;==>GoToNPCbyPlayernumber - -;~ Description: Walks to NPC nearest X, Y location and tries to donate faction. Checks luxon faction first. -Func GoLuxons($XLocation, $YLocation, $aMyID = GetMyID(), $aMe = GetAgentPtr($aMyID)) - If GetLuxonFaction() > 12000 Then - Update("Need to donate Luxon Faction") - RndSleep(Random(1000, 10000, 1)) - Update("Talking to Luxon Scavenger") - GoToNPC(GetNearestAgentPtrToCoords($XLocation, $YLocation), $aMyID, $aMe) - Sleep(1000) - Do - Update("Donating Faction") - DonateFaction(1) - RndSleep(500) - Until GetLuxonFaction() < 5000 - RndSleep(5000) - EndIf -EndFunc ;==>GoLuxons - -;~ Description: Walks to NPC nearest X, Y location and tries to donate faction. Checks kurzick faction first. -Func GoKurzick($XLocation, $YLocation, $aMyID = GetMyID(), $aMe = GetAgentPtr($aMyID)) - If GetKurzickFaction() > 5000 Then - RndSleep(Random(1000, 10000, 1)) - Update("Talking to Kurzick Scavenger") - MoveTo(21386, 6547, 200, $aMyID, $aMe) - GoToNPC(GetNearestAgentPtrToCoords($XLocation, $YLocation), $aMyID, $aMe) - Sleep(1000) - Do - Update("Donating Faction") - DonateFaction("k") - RndSleep(500) - Until GetKurzickFaction() < 5000 - RndSleep(2000) - EndIf -EndFunc ;==>GoKurzick - -;~ Description: Talk to priest for bounty/bonus. -;~ $aDialogs = "0x84|0x85|0x86" Or "132|133" -;~ $aBounties = "0x84|0x85" Or "132|133" -Func GrabBounty($aX, $aY, $aDialogs = False, $aBounties = False, $aMyID = GetMyID(), $aMe = GetAgentPtr($aMyID)) - GoToNPCNearestCoords($aX, $aY, $aMyID, $aMe) - If $aDialogs <> False Then - Local $lDialogs = StringSplit(String($aDialogs), "|") - For $i = 1 To $lDialogs[0] - Dialog($lDialogs[$i]) - Sleep(125) - Next - EndIf - If $aBounties <> False Then - Local $lBounties = StringSplit(String($aBounties), "|") - For $i = 1 To $lBounties[0] - Dialog($lBounties[$i]) - Sleep(125) - Next - EndIf -EndFunc ;==>GrabBounty - -;~ Description: Talks to Grenth in TOA and pays him 1k. -Func GetInUnderworld($aMyID = GetMyID(), $aMe = GetAgentPtr($aMyID)) - Local $lX, $lY - Local $GrenthSpawn = 0 - Local $lMyID = GetMyID() - Update("Move To Grenth") - MoveTo(-4196, 19781, 50, $aMyID, $aMe) - PingSleep(250) - UpdateAgentPosByPtr($aMe, $lX, $lY) - If ComputeDistance($lX, $lY, -4196, 19781) > 200 Then - Do - If MemoryRead($aMe + 44, 'long') <> $lMyID Then Return False - If Not GetIsMoving($aMe) Then - MoveTo($lX, $lY, 300, $aMyID, $aMe) - PingSleep(500) - MoveTo(-4196, 19781, 50, $aMyID, $aMe) - EndIf - PingSleep(500) - UpdateAgentPosByPtr($aMe, $lX, $lY) - Until ComputeDistance($lX, $lY, -4196, 19781) <= 150 - EndIf - PingSleep(250) - Local $GrenthPtr = GetAgentPtr(83) - While $GrenthPtr = 0 - If Mod($GrenthSpawn, 20) = 0 Then Kneel() - Sleep(500) - $GrenthSpawn += 1 - $GrenthPtr = GetAgentPtr(83) - WEnd - GoNPC($GrenthPtr) - Sleep(125) -;~ Dialog(0x84) ; no -;~ Sleep(50) ; risk -;~ Dialog(0x85) ; no -;~ Sleep(50) ; fun - Dialog(0x86) - Update("Loading Underworld") - Return WaitMapLoading(72) -EndFunc ;==>GetInUnderworld -#EndRegion \ No newline at end of file + +#include-once + +#Region Move +;~ Description: Move to a location. +Func Move($aX, $aY, $aRandom = 50) + If $aX = 0 Or $aY = 0 Then Return + DllStructSetData($mMove, 2, $aX + Random(-$aRandom, $aRandom)) + DllStructSetData($mMove, 3, $aY + Random(-$aRandom, $aRandom)) + Return Enqueue($mMovePtr, 16) +EndFunc ;==>Move + +;~ Description: Move to exact location, no random number added. +Func Move_($aX, $aY) + If $aX = 0 Or $aY = 0 Then Return + DllStructSetData($mMove, 2, $aX) + DllStructSetData($mMove, 3, $aY) + Return Enqueue($mMovePtr, 16) +EndFunc ;==>Move_ + +;~ Description: Move to a location and wait until you reach it. +Func MoveTo($aX, $aY, $aRandom = 50, $aMyID = GetMyID(), $aMe = GetAgentPtr($aMyID)) + If GetIsDead($aMe) Then Return False + If $aRandom = Default Then $aRandom = 50 + Local $lBlocked = 0 + Local $lRubberbanding = 0 + Local $lAlpha = 0 + Local $lDistance, $lDistanceOld, $lOut, $lStuckX, $lStuckY + Local $lMoveX, $lMoveY, $lMeX, $lMeY, $lNewX, $lNewY, $lOldX = 0, $lOldY = 0 + UpdateAgentPosByPtr($aMe, $lMeX, $lMeY) + If ComputeDistance($lMeX, $lMeY, $aX, $aY) <= $aRandom Then Return True + Local $lMapLoading = GetMapLoading(), $lMapLoadingOld + If $lMapLoading = 2 Then Return False + Local $lDestX = $aX + Random(-$aRandom, $aRandom) + Local $lDestY = $aY + Random(-$aRandom, $aRandom) + Move_($lDestX, $lDestY) + Sleep(500 + GetPing()) + Do + Sleep(500) + If MemoryRead($aMe + 304, 'float') <= 0 Then Return False + $lMapLoadingOld = $lMapLoading + $lMapLoading = GetMapLoading() + If $lMapLoading <> $lMapLoadingOld Then Return False + UpdateAgentMoveByPtr($aMe, $lMoveX, $lMoveY) + If $lMoveX = 0 And $lMoveY = 0 Then ; not moving + UpdateAgentPosByPtr($aMe, $lMeX, $lMeY) + $lStuckX = $lMeX + $lStuckY = $lMeY + $lDistanceOld = ComputeDistance($lMeX, $lMeY, $lDestX, $lDestY) + If $lDistanceOld <= $aRandom Or $lDistanceOld <= 150 Then Return True + $lBlocked += 1 + If $lBlocked > 1 Then + If $lOldX <> $lMeX And $lOldY <> $lMeY Then + $lAlpha = ATan(($lMeX - $lOldX) / ($lMeY - $lOldY)) + 5.24 + Else + $lAlpha = 0 + EndIf + $lOldX = $lMeX + $lOldY = $lMeY + $lOut = False + For $i = 1 To 9 + $lNewX = Sin($lAlpha) * 300 + $lMeX + $lNewY = Cos($lAlpha) * 300 + $lMeY + ConsoleWrite($lNewX & ', ' & $lNewY & @CRLF) + Move($lNewX, $lNewY) + Sleep(1000) + UpdateAgentPosByPtr($aMe, $lMeX, $lMeY) + If ComputePseudoDistance($lMeX, $lMeY, $lNewX, $lNewY) < 22500 Then + ConsoleWrite("Moving again." & @CRLF) + $lOut = True + ExitLoop + EndIf + $lAlpha += 0.524 + Next + If Not $lOut And ComputePseudoDistance($lMeX, $lMeY, $lOldX, $lOldY) < 10000 Then + ConsoleWrite("Got really stuck." & @CRLF) + Return False + EndIf + If $lBlocked > 2 Then + For $i = 1 To 9 + $lNewX = Sin($lAlpha) * 300 + $lStuckX + $lNewY = Cos($lAlpha) * 300 + $lStuckY + Move($lNewX, $lNewY) + Sleep(500) + UpdateAgentPosByPtr($aMe, $lMeX, $lMeY) + $lAlpha += 0.524 + Next + $lNewX = Sin($lAlpha) * 300 + $lStuckX + $lNewY = Cos($lAlpha) * 300 + $lStuckY + Move_($lNewX, $lNewY) + Sleep(500) + EndIf + Move_($lDestX, $lDestY) + Sleep(500 + GetPing()) + EndIf + ElseIf Not GetMoving($aMyID) Then ; rubberbanding + UpdateAgentPosByPtr($aMe, $lMeX, $lMeY) + If ComputeDistance($lMeX, $lMeY, $lDestX, $lDestY) <= $aRandom Then Return True + $lRubberbanding += 1 + If $lRubberbanding > 20 Then Return False + If Mod($lRubberbanding, 2) = 0 Then + UpdateAgentPos($aMyID) + Sleep(250) + Move_($lDestX, $lDestY) + Sleep(500 + GetPing()) + EndIf + Else + $lOldX = $lMeX + $lOldY = $lMeY + EndIf + UpdateAgentPosByPtr($aMe, $lMeX, $lMeY) + Until ComputeDistance($lMeX, $lMeY, $lDestX, $lDestY) <= $aRandom + Return True +EndFunc ;==>MoveTo + +;~ Description: Updates agent position, internal use only. +Func UpdateAgentPos($aAgentID = -2) +;~ If $aAgentID = -2 Then +;~ $aAgentID = GetMyID() +;~ ElseIf $aAgentID = -1 Then +;~ ConsoleWrite("Cant update agent pos for target." & @CRLF) +;~ Return False +;~ EndIf + + + If $mAgentMovement = 0 Then $mAgentMovement = GetAgentMovementPtr() + Local $lAgentMovementPtr = MemoryRead($mAgentMovement + 4 * ConvertID($aAgentID)) + + If $lAgentMovementPtr = 0 Then + ConsoleWrite("Error getting movement struct pointer." & @CRLF) + Return False + EndIf + Local $lAgentMovementID = MemoryRead($lAgentMovementPtr + 16, 'long') + + + If $lAgentMovementID <> $aAgentID Then + Local $lNewID = GetMyID() + If $lNewID <> $MyID Then SetPointers() + If $lNewID <> $lAgentMovementID Then + $mAgentMovement = GetAgentMovementPtr() + ConsoleWrite("Error, outdated AgentMovementPtr." & @CRLF) + Return False + EndIf + EndIf + If MemoryRead($lAgentMovementPtr + 60, 'long') <> 0 Then + ConsoleWrite("Error, we are moving again." & @CRLF) + Return + EndIf + + Local Static $lBuffer = DllStructCreate('byte X[4];byte Y[4]') + MemoryReadToStruct($lAgentMovementPtr + 120, $lBuffer) + If DllStructGetData($lBuffer, 'X') = 0 And DllStructGetData($lBuffer, 'Y') = 0 Then + ConsoleWrite("Error reading movement struct." & @CRLF) + Return False + EndIf + ConsoleWrite(DllStructGetData($lBuffer, 'X') & ' | ' & DllStructGetData($lBuffer, 'Y') & @CRLF) + DllStructSetData($mUpdateAgentPos, 2, 0x21) + DllStructSetData($mUpdateAgentPos, 3, $aAgentID) + DllStructSetData($mUpdateAgentPos, 4, DllStructGetData($lBuffer, 'X')) + DllStructSetData($mUpdateAgentPos, 5, DllStructGetData($lBuffer, 'Y')) + DllStructSetData($mUpdateAgentPos, 6, 0) + DllStructSetData($mUpdateAgentPos, 7, 0) + Return Enqueue($mUpdateAgentPosPtr, 28) +EndFunc ;==>UpdateAgentPos + +#Region MoveAggroing +;~ Description: Params: MoveX, MoveY, Sleep after moving. Requires UpdateWorld() variables. +Func MoveAggroing($aMoveToX, $aMoveToY, $aSleepTime = 3600000, $aMyID = GetMyID(), $aMe = GetAgentPtr($aMyID)) + If $aSleepTime = Default Then $aSleepTime = 3600000 + Local Static $WaypointCounter = 1 + Local $lBlocked = 0 + Local $lAngle = 0 + Local $lMapLoading, $MyLocation + If GetMapLoading() = 2 Then Return False ; loading screen + Update("Move to waypoint #" & $WaypointCounter) + $WaypointCounter += 1 + Move($aMoveToX, $aMoveToY) + Local $lSleepTimer = TimerInit() + Local $lAgentArray = GetAgentPtrArray(1) ; all living + For $i = 1 To 400 + PingSleep(200) + If Mod($i, 2) = 0 Then Local $lAgentArray = GetAgentPtrArray(1) ; all living + If Not UpdateWorld($lAgentArray, 1350, $aMyID, $aMe) Then + ConsoleWrite("UpdateWorld." & @CRLF) + If Death($lAgentArray, $aMe) Then ExitLoop + EndIf + If Not MoveIfHurt($aMe) Then + ConsoleWrite("MoveIfHurt." & @CRLF) + If Death($lAgentArray, $aMe) Then ExitLoop + EndIf + If Not AttackRange($lAgentArray, 1350, $aMe) Then + ConsoleWrite("AttackRange." & @CRLF) + If Death($lAgentArray, $aMe) Then ExitLoop + EndIf + If Not SmartCast($aMe) Then + ConsoleWrite("Smartcast." & @CRLF) + If Death($lAgentArray, $aMe) Then ExitLoop + EndIf + If Not PickUpLoot(2, $aMyID, $aMe) Then + ConsoleWrite("PickUpLoot." & @CRLF) + If Death($lAgentArray, $aMe) Then ExitLoop + EndIf + If Not $boolRun Then + ConsoleWrite("ExitLoop." & @CRLF) + ExitLoop + EndIf + GetHealthCheck($lAgentArray) + Disconnected() + $lMapLoading = GetMapLoading() + If Not $SkipCinematic And $lMapLoading <> 1 Then + ExitLoop ; only explorable + EndIf + If $SkipCinematic And $lMapLoading <> 1 Then ; loading screen before cinematic? + If WaitLoadingAndSkipCinematic() Then ; skipped cinematic, probably new loading screen now + $SkipCinematic = False + For $i = 1 To 10 + Sleep(1000) + $lMapLoading = GetMapLoading() + If $lMapLoading <> 2 Then ExitLoop + Next + SetPointers() + Else + $lMapLoading = GetMapLoading() + EndIf + If $lMapLoading <> 1 Then Return ; cinematic yes or no, we are not in kansas anymore + EndIf + If $SkipCinematic And DetectCinematic() Then + $SkipCinematic = False + Return SecureSkipCinematic() + EndIf + If MemoryRead($aMe + 44, 'long') <> $aMyID Then + ConsoleWrite("MyID incorrect." & @CRLF) + ExitLoop + EndIf + $MyLocation = XandYLocation($aMe) ; returns array + If $mLowestEnemy = 0 And Not GetIsMoving($aMe) Then + $lBlocked += 1 + Move($aMoveToX, $aMoveToY) + Sleep(200) + If Mod($lBlocked, 2) = 0 And Not GetIsMoving($aMe) Then + $lAngle += 40 + Move($MyLocation[0] + 200 * Sin($lAngle), $MyLocation[1] + 200 * Cos($lAngle)) + PingSleep(500) + EndIf + EndIf + Sleep(100) + If ComputeDistance($aMoveToX, $aMoveToY, $MyLocation[0], $MyLocation[1]) < 200 And $EnemyAttacker = 0 Then Return True + If TimerDiff($lSleepTimer) > $aSleepTime Then Return False + Next + ConsoleWrite("Resign." & @CRLF) + ResignAndWaitForReturn() +EndFunc ;==>MoveAggroing + +;~ Description: Returns true if agent and party is dead. +Func Death(ByRef $aAgentArray, $aAgent = GetAgentPtr(-2), $aResign = False) + If Not IsArray($aAgentArray) Then Return + If IsPtr($aAgent) <> 0 Then + Local $lAgentPtr = $aAgent + Else + Local $lAgentPtr = GetAgentPtr($aAgent) + EndIf + Local $lPartyDead = False + If BitAND(MemoryRead($lAgentPtr + 312, 'long'), 0x0010) Then + If $aAgentArray[0] <> 0 Then + For $i = 1 to 5 + If GetMapLoading() <> 1 Then + $lPartyDead = True + ExitLoop + EndIf + For $j = 1 To $aAgentArray[0] + If MemoryRead($aAgentArray[$j] + 433, 'byte') <> 1 Then ContinueLoop ; Allegiance + If BitAND(MemoryRead($aAgentArray[$j] + 312, 'long'), 0x0010) Then + $lPartyDead = True + Else + $lPartyDead = False + EndIf + Next + RndSleep(100) + Next + Else + $lPartyDead = True + EndIf + ConsoleWrite("Test2." & @CRLF) + If $lPartyDead And $aResign Then ResignAndWaitForReturn() + Return $lPartyDead + EndIf +EndFunc ;==>Death + +;~ Description: Internal use MoveAggroing(). --- +Func AttackRange(ByRef $aAgentArray, $Distance = 1350, $aMe = GetAgentPtr(-2)) ; Cast Range + If GetIsDead($aMe) Then Return False + If GetMapLoading() <> 1 Then Return True + If $mLowestEnemy <> 0 Then + Attack($mLowestEnemy) + Else + Local $VIP = GetVIP_($aAgentArray, $Distance) + Local $VIPsTarget = GetTarget($VIP) + If $VIPsTarget > 0 Then + Attack($VIPsTarget) + EndIf + EndIf +EndFunc ;==>AttackRange + +;~ Description: Don't Continue on while anyone has low health, Returns TRUE if all have good HP. Internal use MoveAggroing() +Func GetHealthCheck(ByRef $aAgentArray) + Local $MoveX, $MoveY + If $mClosestEnemy <> 0 Then Return True ; Return if someone to fight + For $i = 1 To $aAgentArray[0] + If MemoryRead($aAgentArray[$i] + 433, 'byte') <> 1 Then ContinueLoop ; Allegiance + If MemoryRead($aAgentArray[$i] + 304, 'float') < 0.40 Then + Update("Waiting for party heal") + UpdateAgentPosByPtr($aAgentArray[$i], $MoveX, $MoveY) + Move($MoveX, $MoveY) + RndSleep(1000) + Return False + EndIf + Next + Return True +EndFunc ;==>GetHealthCheck + +;~ Description: Moves around if health is below 70%. +Func MoveIfHurt($aMe = GetAgentPtr(-2)) + Local $lX, $lY, $lRandom = 300, $lBlocked = 0 + If $NumberOfFoesInAttackRange < 1 Then Return True + If GetMapLoading() <> 1 Then Return True + If GetIsDead($aMe) Then Return False + If GetHealth($aMe) < 0.7 Then + If TimerDiff($HurtTimer) > 1000 And Not GetHasDegenHex($aMe) Then + Local $theta = Random(0, 360) + $HurtTimer = TimerInit() + UpdateAgentPosByPtr($mHighestAlly, $lX, $lY) + Move(50 * Cos($theta * 0.01745) + $lX, 50 * Sin($theta * 0.01745) + $lY, 0) + Sleep(300) + EndIf + EndIf +EndFunc ;==>MoveIfHurt +#EndRegion MoveAggroing +#EndRegion + +#Region GoTo +;~ Description: Run to or follow a player. +Func GoPlayer($aAgent) + If IsPtr($aAgent) <> 0 Then + Return SendPacket(0x8, $CtoGS_MSG_GoPlayer, MemoryRead($aAgent + 44, 'long')) ;~ old -> Return SendPacket(0x8, 0x2D, MemoryRead($aAgent + 44, 'long')) + ElseIf IsDllStruct($aAgent) <> 0 Then + Return SendPacket(0x8, $CtoGS_MSG_GoPlayer, DllStructGetData($aAgent, 'ID')) ;~ old -> Return SendPacket(0x8, 0x2D, DllStructGetData($aAgent, 'ID')) + Else + Return SendPacket(0x8, $CtoGS_MSG_GoPlayer, ConvertID($aAgent)) ;~ old -> Return SendPacket(0x8, 0x2D, ConvertID($aAgent)) + EndIf +EndFunc ;==>GoPlayer + +;~ Description: Talk to an NPC. +Func GoNPC($aAgent) + If IsPtr($aAgent) <> 0 Then + Local $lAgentID = MemoryRead($aAgent + 44, 'long') + ElseIf IsDllStruct($aAgent) <> 0 Then + Local $lAgentID = DllStructGetData($aAgent, 'ID') + Else + Local $lAgentID = ConvertID($aAgent) + EndIf + ChangeTarget($lAgentID) + Return SendPacket(0xC, $CtoGS_MSG_GoNPC, $lAgentID) +EndFunc ;==>GoNPC + +;~ Description: Go and talk to NPC. +;~ Author: 4D1. +Func GoNPCasm($aAgent, $aCallTarget = 0) + If IsPtr($aAgent) Then + $aAgent = MemoryRead($aAgent + 44,'dword') + Else + $aAgent = ConvertId($aAgent) + EndIf + DllStructSetData($mGoNpc, 2, $aAgent) + DllStructSetData($mGoNpc, 3, $aCallTarget) + Return Enqueue($mGoNpcPtr, 12) +EndFunc + +;~ Description: Waits until you reach npc and talks to NPC. Uses GoNPCasm instead of Sendpacket and MoveTo. +Func GoToNPC($aAgent, $aMyID = GetMyID(), $aMe = GetAgentPtr($aMyID), $aCallTarget = 0, $aTimeOut = 30000) + Local $lAgentPtr, $lAgentID, $lMoveX, $lMoveY, $lOldX, $lOldY, $lMeX, $lMeY, $lAlpha, $lStuckX, $lStuckY + Local $lAgentX = 0 + Local $lAgentY = 0 + Local $lBlocked = 0 + Local $lRubberbanding = 0 + If IsPtr($aAgent) <> 0 Then + $lAgentPtr = $aAgent + $lAgentID = MemoryRead($aAgent + 44, 'long') + ElseIf IsDllStruct($aAgent) <> 0 Then + $lAgentID = DllStructGetData($aAgent, 'ID') + $lAgentPtr = GetAgentPtr($lAgentID) + Else + $lAgentID = ConvertID($aAgent) + $lAgentPtr = GetAgentPtr($lAgentID) + EndIf + UpdateAgentPosByPtr($aMe, $lOldX, $lOldY) + MemoryWrite($mDialogOwnerID, 0, 'word') + If GoNPCasm($lAgentID) Then + Local $lAlpha + Local $lDeadlock = TimerInit() + Do + Sleep(250) + UpdateAgentPosByPtr($aMe, $lMeX, $lMeY) + UpdateAgentMoveByPtr($aMe, $lMoveX, $lMoveY) + If $lMoveX = 0 And $lMoveY = 0 Then ; not moving + $lStuckX = $lMeX + $lStuckY = $lMeY + If $lAgentX = 0 Then UpdateAgentPosByPtr($lAgentPtr, $lAgentX, $lAgentY) + Local $lDistanceOld = ComputeDistance($lMeX, $lMeY, $lAgentX, $lAgentY) + If $lDistanceOld <= 150 Then + If MemoryRead($mDialogOwnerID, 'word') = $lAgentID Then Return True + Return GoNPC($lAgentPtr) + EndIf + $lBlocked += 1 + If $lBlocked > 1 Then + If $lOldX <> $lMeX And $lOldY <> $lMeY Then + $lAlpha = ATan(($lMeX - $lOldX) / ($lMeY - $lOldY)) + 5.24 + Else + $lAlpha = 0 + EndIf + $lOldX = $lMeX + $lOldY = $lMeY + Local $lOut = False + For $i = 1 To 9 + $lNewX = Sin($lAlpha) * 300 + $lMeX + $lNewY = Cos($lAlpha) * 300 + $lMeY + Move($lNewX, $lNewY) + Sleep(1000) + UpdateAgentPosByPtr($aMe, $lMeX, $lMeY) + If ComputePseudoDistance($lMeX, $lMeY, $lNewX, $lNewY) < 22500 Then + $lOut = True + ExitLoop + EndIf + $lAlpha += 0.524 + Next + If Not $lOut And ComputePseudoDistance($lMeX, $lMeY, $lOldX, $lOldY) < 10000 Then + ConsoleWrite("Got really stuck." & @CRLF) + Return False + EndIf + If $lBlocked > 2 Then + For $i = 1 To 9 + $lNewX = Sin($lAlpha) * 300 + $lStuckX + $lNewY = Cos($lAlpha) * 300 + $lStuckY + Move($lNewX, $lNewY) + Sleep(500) + UpdateAgentPosByPtr($aMe, $lMeX, $lMeY) + $lAlpha += 0.524 + Next + $lNewX = Sin($lAlpha) * 300 + $lStuckX + $lNewY = Cos($lAlpha) * 300 + $lStuckY + Move_($lNewX, $lNewY) + Sleep(500) + EndIf + Move_($lAgentX, $lAgentY) + Sleep(500 + GetPing()) + EndIf + ElseIf Not GetMoving($aMyID) Then ; rubberbanding + UpdateAgentPosByPtr($aMe, $lMeX, $lMeY) + If $lAgentX = 0 Then UpdateAgentPosByPtr($lAgentPtr, $lAgentX, $lAgentY) + $lDistanceOld = ComputeDistance($lMeX, $lMeY, $lAgentX, $lAgentY) + If $lDistanceOld <= 150 Then + If MemoryRead($mDialogOwnerID, 'word') = $lAgentID Then Return True + Return GoNPC($lAgentPtr) + EndIf + $lRubberbanding += 1 + If $lRubberbanding > 20 Then Return False + If Mod($lRubberbanding, 2) = 0 Then + UpdateAgentPos($aMyID) + Sleep(250) + Move_($lAgentX, $lAgentY) + Sleep(500 + GetPing()) + EndIf + Else + $lOldX = $lMeX + $lOldY = $lMeY + EndIf + If MemoryRead($mDialogOwnerID, 'word') = $lAgentID Then Return True + Until TimerDiff($lDeadlock) > $aTimeOut + EndIf +EndFunc + +;~ Description: Talks to NPC and waits until you reach them. Uses Sendpacket and MoveTo. +Func GoToNPC_($aAgent, $aMyID = GetMyID(), $aMe = GetAgentPtr($aMyID)) + If IsPtr($aAgent) <> 0 Then + Local $lAgentID = MemoryRead($aAgent + 44, 'long') + Local $lAgentPtr = $aAgent + ElseIf IsDllStruct($aAgent) <> 0 Then + Local $lAgentID = DllStructGetData($aAgent, 'ID') + Local $lAgentPtr = GetAgentPtr($lAgentID) + Else + Local $lAgentID = $aAgent + Local $lAgentPtr = GetAgentPtr($lAgentID) + EndIf + Local $lAgentX, $lAgentY + UpdateAgentPosByPtr($lAgentPtr, $lAgentX, $lAgentY) + Local $lDistance = 100 + Do + $lDistance += 50 + If $lDistance > 350 Then Return False ; cant reach + Until MoveTo($lAgentX, $lAgentY, $lDistance, $aMyID, $aMe) + Sleep(100) + GoNPC($lAgentPtr) + Sleep(500 + $lDistance) + Return True +EndFunc ;==>GoToNPC + +;~ Description: Run to a signpost. +Func GoSignpost($aAgent) + If IsPtr($aAgent) <> 0 Then + Return SendPacket(0xC, $CtoGS_MSG_GoGadget, MemoryRead($aAgent + 44, 'long'), 0) ;~ old -> Return SendPacket(0xC, 0x4B, MemoryRead($aAgent + 44, 'long'), 0) + ElseIf IsDllStruct($aAgent) <> 0 Then + Return SendPacket(0xC, $CtoGS_MSG_GoGadget, DllStructGetData($aAgent, 'ID'), 0) ;~ old -> Return SendPacket(0xC, 0x4B, DllStructGetData($aAgent, 'ID'), 0) + Else + Return SendPacket(0xC, $CtoGS_MSG_GoGadget, ConvertID($aAgent), 0) ;~ old -> Return SendPacket(0xC, 0x4B, ConvertID($aAgent), 0) + EndIf +EndFunc ;==>GoSignpost + +;~ Description: Go to signpost and waits until you reach it. +Func GoToSignpost($aAgent, $aMyID = GetMyID(), $aMe = GetAgentPtr($aMyID)) + If IsPtr($aAgent) <> 0 Then + Local $lAgentPtr = $aAgent + ElseIf IsDllStruct($aAgent) <> 0 Then + Local $lAgentID = DllStructGetData($aAgent, 'ID') + Local $lAgentPtr = GetAgentPtr($lAgentID) + Else + Local $lAgentPtr = GetAgentPtr($aAgent) + EndIf + Local $lBlocked = 0, $lMeX, $lMeY, $lAgentX, $lAgentY + Local $lMapLoading = GetMapLoading(), $lMapLoadingOld + Local $lMoveX, $lMoveY, $lMeX, $lMeY, $lAgentX, $lAgentY + UpdateAgentPosByPtr($lAgentPtr, $lAgentX, $lAgentY) + Local $lDistance = 50 + Do + $lDistance += 50 + If $lDistance > 300 Then Return False ; cant reach + Until MoveTo($lAgentX, $lAgentY, $lDistance, $aMyID, $aMe) + Sleep(100) + GoSignpost($lAgentPtr) + Sleep($lDistance) + Return True +EndFunc ;==>GoToSignpost + +;~ Description: Finds NPC nearest given coords and talks to him/her. +Func GoToNPCNearestCoords($aX, $aY, $aMyID = GetMyID(), $aMe = GetAgentPtr($aMyID)) + Local $lAgent + For $i = 1 To 20 ; about 1 sec time to retrieve npc + $lAgent = GetNearestNPCPtrToCoords($aX, $aY) + Sleep(125) + If $lAgent <> 0 Then + ChangeTarget($lAgent) + Return GoToNPC($lAgent, $aMyID, $aMe) + EndIf + Next +EndFunc ;==>GoToNPCNearestCoords + +;~ Description: Goes to NPC with playernumber and talks to that NPC. +Func GoToNPCbyPlayernumber($aPlayernumber, $aMyID = GetMyID(), $aMe = GetAgentPtr($aMyID)) + Local $lAgentArray = GetAgentPtrArray(1) + For $i = 1 To $lAgentArray[0] + If MemoryRead($lAgentArray[$i] + 244, 'word') = Int($aPlayernumber) Then + GoToNPC($lAgentArray[$i], $aMyID, $aMe) + Return Dialog(0x7F) + EndIf + Next +EndFunc ;==>GoToNPCbyPlayernumber + +;~ Description: Walks to NPC nearest X, Y location and tries to donate faction. Checks luxon faction first. +Func GoLuxons($XLocation, $YLocation, $aMyID = GetMyID(), $aMe = GetAgentPtr($aMyID)) + If GetLuxonFaction() > 12000 Then + Update("Need to donate Luxon Faction") + RndSleep(Random(1000, 10000, 1)) + Update("Talking to Luxon Scavenger") + GoToNPC(GetNearestAgentPtrToCoords($XLocation, $YLocation), $aMyID, $aMe) + Sleep(1000) + Do + Update("Donating Faction") + DonateFaction(1) + RndSleep(500) + Until GetLuxonFaction() < 5000 + RndSleep(5000) + EndIf +EndFunc ;==>GoLuxons + +;~ Description: Walks to NPC nearest X, Y location and tries to donate faction. Checks kurzick faction first. +Func GoKurzick($XLocation, $YLocation, $aMyID = GetMyID(), $aMe = GetAgentPtr($aMyID)) + If GetKurzickFaction() > 5000 Then + RndSleep(Random(1000, 10000, 1)) + Update("Talking to Kurzick Scavenger") + MoveTo(21386, 6547, 200, $aMyID, $aMe) + GoToNPC(GetNearestAgentPtrToCoords($XLocation, $YLocation), $aMyID, $aMe) + Sleep(1000) + Do + Update("Donating Faction") + DonateFaction("k") + RndSleep(500) + Until GetKurzickFaction() < 5000 + RndSleep(2000) + EndIf +EndFunc ;==>GoKurzick + +;~ Description: Talk to priest for bounty/bonus. +;~ $aDialogs = "0x84|0x85|0x86" Or "132|133" +;~ $aBounties = "0x84|0x85" Or "132|133" +Func GrabBounty($aX, $aY, $aDialogs = False, $aBounties = False, $aMyID = GetMyID(), $aMe = GetAgentPtr($aMyID)) + GoToNPCNearestCoords($aX, $aY, $aMyID, $aMe) + If $aDialogs <> False Then + Local $lDialogs = StringSplit(String($aDialogs), "|") + For $i = 1 To $lDialogs[0] + Dialog($lDialogs[$i]) + Sleep(125) + Next + EndIf + If $aBounties <> False Then + Local $lBounties = StringSplit(String($aBounties), "|") + For $i = 1 To $lBounties[0] + Dialog($lBounties[$i]) + Sleep(125) + Next + EndIf +EndFunc ;==>GrabBounty + +;~ Description: Talks to Grenth in TOA and pays him 1k. +Func GetInUnderworld($aMyID = GetMyID(), $aMe = GetAgentPtr($aMyID)) + Local $lX, $lY + Local $GrenthSpawn = 0 + Local $lMyID = GetMyID() + Update("Move To Grenth") + MoveTo(-4196, 19781, 50, $aMyID, $aMe) + PingSleep(250) + UpdateAgentPosByPtr($aMe, $lX, $lY) + If ComputeDistance($lX, $lY, -4196, 19781) > 200 Then + Do + If MemoryRead($aMe + 44, 'long') <> $lMyID Then Return False + If Not GetIsMoving($aMe) Then + MoveTo($lX, $lY, 300, $aMyID, $aMe) + PingSleep(500) + MoveTo(-4196, 19781, 50, $aMyID, $aMe) + EndIf + PingSleep(500) + UpdateAgentPosByPtr($aMe, $lX, $lY) + Until ComputeDistance($lX, $lY, -4196, 19781) <= 150 + EndIf + PingSleep(250) + Local $GrenthPtr = GetAgentPtr(83) + While $GrenthPtr = 0 + If Mod($GrenthSpawn, 20) = 0 Then Kneel() + Sleep(500) + $GrenthSpawn += 1 + $GrenthPtr = GetAgentPtr(83) + WEnd + GoNPC($GrenthPtr) + Sleep(125) +;~ Dialog(0x84) ; no +;~ Sleep(50) ; risk +;~ Dialog(0x85) ; no +;~ Sleep(50) ; fun + Dialog(0x86) + Update("Loading Underworld") + Return WaitMapLoading(72) +EndFunc ;==>GetInUnderworld +#EndRegion diff --git a/gwApi/party.au3 b/gwApi/party.au3 index 90d0443..b7b48ac 100644 --- a/gwApi/party.au3 +++ b/gwApi/party.au3 @@ -1,95 +1,109 @@ -#include-once - -#Region Party Window -#Region Invite -;~ Description: Invite a player to the party. -Func InvitePlayer($aPlayerName) - SendChat('invite ' & $aPlayerName, '/') -EndFunc ;==>InvitePlayer - -;~ Description: Invites player by playernumber. -Func InvitePlayerByPlayerNumber($lPlayerNumber) - Return SendPacket(0x8, 0x9A, $lPlayerNumber) -EndFunc ;==>InvitePlayerByPlayerNumber - -;~ Description: Invites player by AgentID. -Func InvitePlayerByID($aAgentID) - If IsPtr($aAgentID) Then - Local $lAgentPlayerNumber = MemoryRead($aAgentID + 244, 'word') - ElseIf IsDllStruct($aAgentID) <> 0 Then - Local $lAgentPlayerNumber = DllStructGetData($aAgentID, 'Playernumber') - Else - Local $lAgentPlayerNumber = MemoryRead(GetAgentPtr($aAgentID) + 244, 'word') - EndIf - If $lAgentPlayerNumber <> 0 Then Return SendPacket(0x8, 0x9A, $lAgentPlayerNumber) -EndFunc ;==>InvitePlayerByID - -;~ Description: Invite current target. -Func InviteTarget() - Local $lpNUM = MemoryRead(GetAgentPtr(-1) + 244, 'word') - Return SendPacket(0x8, 0x9A, $lpNUM) -EndFunc ;==>InviteTarget - -;~ Description: Accepts pending invite. -Func AcceptInvite() - Return SendPacket(0x8, 0x96) -EndFunc ;==>AcceptInvite -#EndRegion - -#Region Leave/Kick -;~ Description: Leave your party. -Func LeaveGroup($aKickHeroes = True) - If $aKickHeroes Then SendPacket(0x8, 0x18, 0x26) - Return SendPacket(0x4, 0x9C) -EndFunc ;==>LeaveGroup -#EndRegion - -#Region Misc -;~ Description: Switches to/from Hard Mode. -Func SwitchMode($aMode) - Return SendPacket(0x8, 0x95, $aMode) -EndFunc ;==>SwitchMode -#EndRegion -#EndRegion - -#Region Information -;~ Description: Returns partysize. -Func GetPartySize() - If $HeroPtr1 = 0 Then $HeroPtr1 = MemoryRead($mBasePtr184C + 0x54, 'ptr') - If $PartySizePtr = 0 Then $PartySizePtr = MemoryRead($mBasePtr184C + 0x64, 'ptr') - Local $lParty1 = MemoryRead($PartySizePtr + 0x24, 'long') ; henchmen - Local $lParty2 = MemoryRead($PartySizePtr + 0x34, 'long') ; heroes - Local $lParty3 = MemoryRead($HeroPtr1 + 0xC, 'long') ; player - Local $lReturn = $lParty1 + $lParty2 + $lParty3 - If $lReturn > 12 or $lReturn < 1 Then $lReturn = 8 - Return $lReturn -EndFunc ;==>GetPartySize - -;~ Description: Returns max partysize. -;~ Works only in OUTPOST or TOWN. -Func GetMaxPartySize($aMapID) - Switch $aMapID - Case 293 to 296, 721, 368, 188, 467, 497 - Return 1 - Case 163 to 166 - Return 2 - Case 28 to 30, 32, 36, 39, 40, 81, 131, 135, 148, 189, 214, 242, 249, 251, 281, 282 - Return 4 - Case 431, 449, 479, 491, 502, 544, 555, 795, 796, 811, 815, 816, 818 to 820, 855, 856 - Return 4 - Case 10 to 12, 14 to 16, 19, 21, 25, 38, 49, 55, 57, 73, 109, 116, 117 to 119 - Return 6 - Case 132 to 134, 136, 137, 139 to 142, 152, 153, 154, 213, 250, 385, 808, 809, 810 - Return 6 - Case 266, 307 - Return 12 - Case Else - Return 8 - EndSwitch -EndFunc ;==>GetMaxPartySize - -;~ Description: Returns true if party is defeated/party has resigned. -;~ Func GetIsPartyDefeated() -;~ Return MemoryRead($mBasePtr184C + 0x14) = 160 -;~ EndFunc -#EndRegion \ No newline at end of file + +#include-once + +#Region Party Window +#Region Invite +;~ Description: Invite a player to the party. +Func InvitePlayer($aPlayerName) + SendChat('invite ' & $aPlayerName, '/') +EndFunc ;==>InvitePlayer + +;~ Func InvitePlayer($aPlayerName) +;~ Static $mInvitePlayer = DllStructCreate('ptr;dword;dword;wchar[20]') +;~ Static $mInvitePlayerPtr = Null + +;~ If ($mInvitePlayerPtr = Null) then +;~ DllStructSetData($mInvitePlayer,1,GetValue('CommandPacketSend')) +;~ DllStructSetData($mInvitePlayer,2,0x2C) +;~ DllStructSetData($mInvitePlayer,3,0x9B) +;~ EndIf + +;~ DllStructSetData($mInvitePlayer,4,$aPlayerName) +;~ EndFunc ;==>InvitePlayer + +;~ Description: Invites player by playernumber. +Func InvitePlayerByPlayerNumber($lPlayerNumber) + Return SendPacket(0x8, $CtoGS_MSG_InvitePlayer, $lPlayerNumber) +EndFunc ;==>InvitePlayerByPlayerNumber + +;~ Description: Invites player by AgentID. +Func InvitePlayerByID($aAgentID) + If IsPtr($aAgentID) Then + Local $lAgentPlayerNumber = MemoryRead($aAgentID + 244, 'word') + ElseIf IsDllStruct($aAgentID) <> 0 Then + Local $lAgentPlayerNumber = DllStructGetData($aAgentID, 'Playernumber') + Else + Local $lAgentPlayerNumber = MemoryRead(GetAgentPtr($aAgentID) + 244, 'word') + EndIf + If $lAgentPlayerNumber <> 0 Then Return SendPacket(0x8, $CtoGS_MSG_InvitePlayer, $lAgentPlayerNumber) +EndFunc ;==>InvitePlayerByID + +;~ Description: Invite current target. +Func InviteTarget() + Local $lpNUM = MemoryRead(GetAgentPtr(-1) + 244, 'word') + Return SendPacket(0x8, $CtoGS_MSG_InvitePlayer, $lpNUM) +EndFunc ;==>InviteTarget + +;~ Description: Accepts pending invite. +Func AcceptInvite() + Return SendPacket(0x8, $CtoGS_MSG_AcceptPartyRequest) +EndFunc ;==>AcceptInvite +#EndRegion + +#Region Leave/Kick +;~ Description: Leave your party. +Func LeaveGroup($aKickHeroes = True) + If $aKickHeroes Then SendPacket(0x8, 0x1E, 0x26) ;~ old -> If $aKickHeroes Then SendPacket(0x8, 0x18, 0x26) + Return SendPacket(0x4, $CtoGS_MSG_LeaveParty) ;~ old -> Return SendPacket(0x4, 0x9C) +EndFunc ;==>LeaveGroup +#EndRegion + +#Region Misc +;~ Description: Switches to/from Hard Mode. +Func SwitchMode($aMode) + Return SendPacket(0x8, $CtoGS_MSG_SwitchMode, $aMode) +EndFunc ;==>SwitchMode +#EndRegion +#EndRegion + +#Region Information +;~ Description: Returns partysize. +Func GetPartySize() + If $HeroPtr1 = 0 Then $HeroPtr1 = MemoryRead($mBasePtr184C + 0x54, 'ptr') + If $PartySizePtr = 0 Then $PartySizePtr = MemoryRead($mBasePtr184C + 0x64, 'ptr') + Local $lParty1 = MemoryRead($PartySizePtr + 0x24, 'long') ; henchmen + Local $lParty2 = MemoryRead($PartySizePtr + 0x34, 'long') ; heroes + Local $lParty3 = MemoryRead($HeroPtr1 + 0xC, 'long') ; player + Local $lReturn = $lParty1 + $lParty2 + $lParty3 + If $lReturn > 12 or $lReturn < 1 Then $lReturn = 8 + Return $lReturn +EndFunc ;==>GetPartySize + +;~ Description: Returns max partysize. +;~ Works only in OUTPOST or TOWN. +Func GetMaxPartySize($aMapID) + Switch $aMapID + Case 293 to 296, 721, 368, 188, 467, 497 + Return 1 + Case 163 to 166 + Return 2 + Case 28 to 30, 32, 36, 39, 40, 81, 131, 135, 148, 189, 214, 242, 249, 251, 281, 282 + Return 4 + Case 431, 449, 479, 491, 502, 544, 555, 795, 796, 811, 815, 816, 818 to 820, 855, 856 + Return 4 + Case 10 to 12, 14 to 16, 19, 21, 25, 38, 49, 55, 57, 73, 109, 116, 117 to 119 + Return 6 + Case 132 to 134, 136, 137, 139 to 142, 152, 153, 154, 213, 250, 385, 808, 809, 810 + Return 6 + Case 266, 307 + Return 12 + Case Else + Return 8 + EndSwitch +EndFunc ;==>GetMaxPartySize + +;~ Description: Returns true if party is defeated/party has resigned. +;~ Func GetIsPartyDefeated() +;~ Return MemoryRead($mBasePtr184C + 0x14) = 160 +;~ EndFunc +#EndRegion diff --git a/gwApi/plugin.au3 b/gwApi/plugin.au3 index 6945c8a..47462dd 100644 --- a/gwApi/plugin.au3 +++ b/gwApi/plugin.au3 @@ -1,148 +1,149 @@ -#include-once - -#Region InitializePlugins -;~ Description: Reads data from plugin files and stores them for use during initialize. -Func InitPlugins() - ; create filelist - Local $lFileListArray = CreatePluginList(StringRegExpReplace(@ScriptDir, '[\\/]+$', '') & '\gwAPI\plugins\') - If Not IsArray($lFileListArray) Then - $mUsePlugins = False - Return - EndIf - ; read line and evaluate -> dismiss empty lines, section headers - Local $lSize = 0 - Local $lTempArray = 0 - For $iFileName In $lFileListArray - $lTempArray = IniReadSection($iFileName, 'CreateASM') - If @error = 0 Then - PluginArrayCombine($mAsmArray, $lTempArray) - $mAsmArray[0][0] += $lTempArray[0][0] - EndIf - $lTempArray = IniReadSection($iFileName, 'CreateData') - If @error = 0 Then - PluginArrayCombine($mDataArray, $lTempArray) - $mDataArray[0][0] += $lTempArray[0][0] - EndIf - $lTempArray = IniReadSection($iFileName, 'CreateDetours') - If @error = 0 Then - PluginArrayCombine($mDetoursArray, $lTempArray) - $mDetoursArray[0][0] += $lTempArray[0][0] - EndIf - $lTempArray = IniReadSection($iFileName, 'CreateScans') - If @error = 0 Then - PluginArrayCombine($mScansArray, $lTempArray) - $mScansArray[0][0] += $lTempArray[0][0] - EndIf - $lTempArray = IniReadSection($iFileName, 'SetValues') - If @error = 0 Then - PluginArrayCombine($mSetValuesArray, $lTempArray) - $mSetValuesArray[0][0] += $lTempArray[0][0] - EndIf - Next - Return True -EndFunc ;==>InitPlugins - -;~ Description: Creates filelist array of plugins in plugins folder. -Func CreatePluginList($aFilePath) - Local $lReturn = '' - Local $lFileName = '' - Local $lPath = StringRegExpReplace($aFilePath, '[\\/]+$', '') & '\' - If Not FileExists($lPath) Then - ConsoleWrite("FileExists." & StringRegExpReplace($aFilePath, '[\\/]+$', '') & '\' & @CRLF) - Return - EndIf - Local $lSearchHandle = FileFindFirstFile($lPath & '*.gwplasm') - If @error Then - ConsoleWrite("Error." & @CRLF) - Return - EndIf - While 1 - $lFileName = FileFindNextFile($lSearchHandle) - If @error Then ExitLoop - If @extended = 1 Then ContinueLoop ; no clue why there's folders in there - $lReturn &= $lPath & $lFileName & '|' - WEnd - FileClose($lSearchHandle) - Return StringRegExp($lReturn, '(.+?)\|', 3) -EndFunc ;==>CreatePluginList - -;~ Description: Simple function to concatenate two 2D arrays. -Func PluginArrayCombine(ByRef $aBasisArray, Const ByRef $aAddArray) - ReDim $aBasisArray[$aBasisArray[0][0] + $aAddArray[0][0] + 1][2] - For $i = 1 To $aAddArray[0][0] - For $j = 0 To 1 - $aBasisArray[$aBasisArray[0][0] + $i][$j] = $aAddArray[$i][$j] - Next - Next -EndFunc ;==>PluginArrayCombine - -;~ Description: Adds ASM section to ModifyMemory. -Func AddPluginASM() - For $i = 1 To $mAsmArray[0][0] - _($mAsmArray[$i][1]) -;~ ConsoleWrite("('" & $mAsmArray[$i][1] & "')" & @CRLF) - Next -EndFunc - -;~ Description: Adds ASM Variables to CreateData. -Func AddPluginData() - For $i = 1 To $mDataArray[0][0] - _($mDataArray[$i][1]) -;~ ConsoleWrite("('" & $mDataArray[$i][1] & "')" & @CRLF) - Next -EndFunc - -;~ Description: Adds Detours to InitClient. -Func AddPluginDetours() - For $i = 1 To $mDetoursArray[0][0] -;~ ConsoleWrite("WriteDetour('" & $mDetoursArray[$i][0] & "', '" & $mDetoursArray[$i][1] & "')" & @CRLF) - WriteDetour($mDetoursArray[$i][0], $mDetoursArray[$i][1]) - Next -EndFunc - -;~ Description: Adds Scans to ScanEngine. -Func AddPluginScans() - For $i = 1 To $mScansArray[0][0] -;~ ConsoleWrite("_('" & $mScansArray[$i][0] & ':' & "')" & @CRLF) - _($mScansArray[$i][0] & ':') -;~ ConsoleWrite("AddPattern('" & $mScansArray[$i][1] & "')" & @CRLF) - AddPattern($mScansArray[$i][1]) - Next -EndFunc - -;~ Description: Adds scan values to LabelDict, via SetValue(). -Func AddPluginSetValues() - If $mSetValuesArray[0][0] < 4 Then Return - Local $lScannedAddress, $lName, $lOffsetString, $lSign - Local $lOldScan = '' - Local $lCount = 0 - Do - $lCount += 1 - $lName = $mSetValuesArray[$lCount][1] - $lCount += 1 - If $mSetValuesArray[$lCount][1] <> $lOldScan Then - $lOldScan = $mSetValuesArray[$lCount][1] - $lCount += 1 - $lOffsetString = $mSetValuesArray[$lCount][1] - $lSign = StringLeft($lOffsetString, 1) - If $lSign <> '-' Then - $lSign = '' - Else - $lOffsetString = StringTrimLeft($lOffsetString, 1) - EndIf - $lScannedAddress = GetScannedAddress($lOldScan, $lSign & Number($lOffsetString)) -;~ ConsoleWrite("GetScannedAddress('" & $lOldScan & "', " & $lSign & Number($lOffsetString) & ")" & @CRLF) - $lCount += 1 - If Number($mSetValuesArray[$lCount][1]) <> 0 Then -;~ ConsoleWrite("MemoryRead(" & $lScannedAddress & ")" & @CRLF) - $lScannedAddress = MemoryRead($lScannedAddress) - EndIf - Else - $lCount += 2 - EndIf - $lCount += 1 -;~ ConsoleWrite("SetValue('" & $lName & "', " & Ptr($lScannedAddress + Number($mSetValuesArray[$lCount][1])) & ")" & @CRLF) - SetValue($lName, Ptr($lScannedAddress + Number($mSetValuesArray[$lCount][1]))) - Until $lCount >= $mSetValuesArray[0][0] -EndFunc -#EndRegion \ No newline at end of file + +#include-once + +#Region InitializePlugins +;~ Description: Reads data from plugin files and stores them for use during initialize. +Func InitPlugins() + ; create filelist + Local $lFileListArray = CreatePluginList(StringRegExpReplace(@ScriptDir, '[\\/]+$', '') & '\gwAPI\plugins\') + If Not IsArray($lFileListArray) Then + $mUsePlugins = False + Return + EndIf + ; read line and evaluate -> dismiss empty lines, section headers + Local $lSize = 0 + Local $lTempArray = 0 + For $iFileName In $lFileListArray + $lTempArray = IniReadSection($iFileName, 'CreateASM') + If @error = 0 Then + PluginArrayCombine($mAsmArray, $lTempArray) + $mAsmArray[0][0] += $lTempArray[0][0] + EndIf + $lTempArray = IniReadSection($iFileName, 'CreateData') + If @error = 0 Then + PluginArrayCombine($mDataArray, $lTempArray) + $mDataArray[0][0] += $lTempArray[0][0] + EndIf + $lTempArray = IniReadSection($iFileName, 'CreateDetours') + If @error = 0 Then + PluginArrayCombine($mDetoursArray, $lTempArray) + $mDetoursArray[0][0] += $lTempArray[0][0] + EndIf + $lTempArray = IniReadSection($iFileName, 'CreateScans') + If @error = 0 Then + PluginArrayCombine($mScansArray, $lTempArray) + $mScansArray[0][0] += $lTempArray[0][0] + EndIf + $lTempArray = IniReadSection($iFileName, 'SetValues') + If @error = 0 Then + PluginArrayCombine($mSetValuesArray, $lTempArray) + $mSetValuesArray[0][0] += $lTempArray[0][0] + EndIf + Next + Return True +EndFunc ;==>InitPlugins + +;~ Description: Creates filelist array of plugins in plugins folder. +Func CreatePluginList($aFilePath) + Local $lReturn = '' + Local $lFileName = '' + Local $lPath = StringRegExpReplace($aFilePath, '[\\/]+$', '') & '\' + If Not FileExists($lPath) Then + ConsoleWrite("FileExists." & StringRegExpReplace($aFilePath, '[\\/]+$', '') & '\' & @CRLF) + Return + EndIf + Local $lSearchHandle = FileFindFirstFile($lPath & '*.gwplasm') + If @error Then + ConsoleWrite("Error." & @CRLF) + Return + EndIf + While 1 + $lFileName = FileFindNextFile($lSearchHandle) + If @error Then ExitLoop + If @extended = 1 Then ContinueLoop ; no clue why there's folders in there + $lReturn &= $lPath & $lFileName & '|' + WEnd + FileClose($lSearchHandle) + Return StringRegExp($lReturn, '(.+?)\|', 3) +EndFunc ;==>CreatePluginList + +;~ Description: Simple function to concatenate two 2D arrays. +Func PluginArrayCombine(ByRef $aBasisArray, Const ByRef $aAddArray) + ReDim $aBasisArray[$aBasisArray[0][0] + $aAddArray[0][0] + 1][2] + For $i = 1 To $aAddArray[0][0] + For $j = 0 To 1 + $aBasisArray[$aBasisArray[0][0] + $i][$j] = $aAddArray[$i][$j] + Next + Next +EndFunc ;==>PluginArrayCombine + +;~ Description: Adds ASM section to ModifyMemory. +Func AddPluginASM() + For $i = 1 To $mAsmArray[0][0] + _($mAsmArray[$i][1]) + ConsoleWrite("('" & $mAsmArray[$i][1] & "')" & @CRLF) + Next +EndFunc + +;~ Description: Adds ASM Variables to CreateData. +Func AddPluginData() + For $i = 1 To $mDataArray[0][0] + _($mDataArray[$i][1]) + ConsoleWrite("('" & $mDataArray[$i][1] & "')" & @CRLF) + Next +EndFunc + +;~ Description: Adds Detours to InitClient. +Func AddPluginDetours() + For $i = 1 To $mDetoursArray[0][0] + ConsoleWrite("WriteDetour('" & $mDetoursArray[$i][0] & "', '" & $mDetoursArray[$i][1] & "')" & @CRLF) + WriteDetour($mDetoursArray[$i][0], $mDetoursArray[$i][1]) + Next +EndFunc + +;~ Description: Adds Scans to ScanEngine. +Func AddPluginScans() + For $i = 1 To $mScansArray[0][0] + ConsoleWrite("_('" & $mScansArray[$i][0] & ':' & "')" & @CRLF) + _($mScansArray[$i][0] & ':') + ConsoleWrite("AddPattern('" & $mScansArray[$i][1] & "')" & @CRLF) + AddPattern($mScansArray[$i][1]) + Next +EndFunc + +;~ Description: Adds scan values to LabelDict, via SetValue(). +Func AddPluginSetValues() + If $mSetValuesArray[0][0] < 4 Then Return + Local $lScannedAddress, $lName, $lOffsetString, $lSign + Local $lOldScan = '' + Local $lCount = 0 + Do + $lCount += 1 + $lName = $mSetValuesArray[$lCount][1] + $lCount += 1 + If $mSetValuesArray[$lCount][1] <> $lOldScan Then + $lOldScan = $mSetValuesArray[$lCount][1] + $lCount += 1 + $lOffsetString = $mSetValuesArray[$lCount][1] + $lSign = StringLeft($lOffsetString, 1) + If $lSign <> '-' Then + $lSign = '' + Else + $lOffsetString = StringTrimLeft($lOffsetString, 1) + EndIf + $lScannedAddress = GetScannedAddress($lOldScan, $lSign & Number($lOffsetString)) + ConsoleWrite("GetScannedAddress('" & $lOldScan & "', " & $lSign & Number($lOffsetString) & ")" & @CRLF) + $lCount += 1 + If Number($mSetValuesArray[$lCount][1]) <> 0 Then + ConsoleWrite("MemoryRead(" & $lScannedAddress & ")" & @CRLF) + $lScannedAddress = MemoryRead($lScannedAddress) + EndIf + Else + $lCount += 2 + EndIf + $lCount += 1 + ConsoleWrite("SetValue('" & $lName & "', " & Ptr($lScannedAddress + Number($mSetValuesArray[$lCount][1])) & ")" & @CRLF) + SetValue($lName, Ptr($lScannedAddress + Number($mSetValuesArray[$lCount][1]))) + Until $lCount >= $mSetValuesArray[0][0] +EndFunc +#EndRegion diff --git a/gwApi/plugins/Archiv/CollectItem.gwplasm b/gwApi/plugins/Archiv/CollectItem.gwplasm new file mode 100644 index 0000000..e7839e6 --- /dev/null +++ b/gwApi/plugins/Archiv/CollectItem.gwplasm @@ -0,0 +1,24 @@ +[CreateData] + +[CreateASM] +ASM=CommandCollectItem: +ASM=push 0 +ASM=add eax,4 +ASM=push eax +ASM=push 1 +ASM=push 0 +ASM=add eax,4 +ASM=push eax +ASM=add eax,4 +ASM=push eax +ASM=push 1 +ASM=mov ecx,2 +ASM=mov edx,0 +ASM=call BuyItemFunction +ASM=ljmp CommandReturn + +[CreateScans] + +[CreateDetours] + +[SetValues] \ No newline at end of file diff --git a/gwApi/plugins/Archiv/CraftItemEx.gwplasm b/gwApi/plugins/Archiv/CraftItemEx.gwplasm new file mode 100644 index 0000000..21f7b7a --- /dev/null +++ b/gwApi/plugins/Archiv/CraftItemEx.gwplasm @@ -0,0 +1,39 @@ +[CreateData] + +[CreateASM] +ASM=CommandCraftItemEx: +ASM=add eax,4 +ASM=push eax +ASM=add eax,4 +ASM=push eax +ASM=push 1 +ASM=push 0 +ASM=push 0 +ASM=push dword[eax+4] +ASM=add eax,4 +ASM=push dword[eax+4] +ASM=add eax,4 +ASM=mov edx,esp +ASM=mov ecx,dword[CraftGlobal] +ASM=mov dword[edx-70],ecx +ASM=mov ecx,dword[edx+1C] +ASM=mov dword[edx+54],ecx +ASM=mov ecx,dword[edx+4] +ASM=mov dword[edx-14],ecx +ASM=mov ecx,3 +ASM=mov ebx,dword[eax] +ASM=mov edx,dword[eax+4] +ASM=call BuyItemFunction +ASM=ljmp CommandReturn + +[CreateScans] +ScanCraftGlobal=89750C83C60F83E6F089750C5657FF35 + +[CreateDetours] + +[SetValues] +Name=CraftGlobal +Scan=ScanCraftGlobal +Offset=17 +MemRead=1 +Add=0 \ No newline at end of file diff --git a/gwApi/plugins/Archiv/DialogLogEx.gwplasm b/gwApi/plugins/Archiv/DialogLogEx.gwplasm new file mode 100644 index 0000000..18f2fbc --- /dev/null +++ b/gwApi/plugins/Archiv/DialogLogEx.gwplasm @@ -0,0 +1,77 @@ +[CreateData] +Data=LastDialogSender/4 +Data=LastDialogButtonsSize/4 +Data=LastDialogButtons/256 +Data=LastDialogID/4 + +[CreateASM] +ASM=DialogButtonHookProc: +ASM=push ebp +ASM=mov ebp,esp +ASM=pushad +ASM=mov eax,dword[LastDialogButtonsSize] +ASM=lea ebx,dword[eax*4+LastDialogButtons] +ASM=mov eax,dword[ecx+108] +ASM=mov dword[ebx],eax +ASM=inc dword[LastDialogButtonsSize] +ASM=popad +ASM=sub esp,10 +ASM=ljmp DialogButtonReturn +ASM=DialogSenderHookProc: +ASM=push ebp +ASM=mov ebp,esp +ASM=mov dword[LastDialogButtonsSize],0 +ASM=mov dword[LastDialogSender],ecx +ASM=sub esp,0c +ASM=ljmp DialogSenderReturn +ASM=DialogLogProc: +ASM=push ebp +ASM=mov ebp,esp +ASM=mov eax,dword[ebp+8] +ASM=mov dword[LastDialogID],eax +ASM=mov eax,dword[ecx+8] +ASM=mov dword[LastDialogButtonsSize],0 +ASM=test al,1 +ASM=ljmp DialogLogReturn + +[CreateScans] +ScanDialogLog=8977045F5E5B5DC208 +ScanDialogButton=558BEC83EC108B41048D51088945F0 +ScanDialogSender=8B461C85C074058B4614EB0233C06A00 + +[CreateDetours] +DialogButtonStart=DialogButtonHookProc +DialogSenderStart=DialogSenderHookProc +DialogLogStart=DialogLogProc + +[SetValues] +Name=DialogButtonStart +Scan=ScanDialogButton +Offset=1 +MemRead=0 +Add=0 +Name=DialogButtonReturn +Scan=ScanDialogButton +Offset=1 +MemRead=0 +Add=6 +Name=DialogSenderStart +Scan=ScanDialogSender +Offset=-0x2C +MemRead=0 +Add=0 +Name=DialogSenderReturn +Scan=ScanDialogSender +Offset=-0x2C +MemRead=0 +Add=6 +Name=DialogLogStart +Scan=ScanDialogLog +Offset=15 +MemRead=0 +Add=0 +Name=DialogLogReturn +Scan=ScanDialogLog +Offset=15 +MemRead=0 +Add=8 \ No newline at end of file diff --git a/gwApi/plugins/Archiv/DrunkState.gwplasm b/gwApi/plugins/Archiv/DrunkState.gwplasm new file mode 100644 index 0000000..1262ae5 --- /dev/null +++ b/gwApi/plugins/Archiv/DrunkState.gwplasm @@ -0,0 +1,27 @@ +[CreateData] +Data=DrunkState/4 + +[CreateASM] +ASM=DrunkStateHookProc: +ASM=mov dword[DrunkState],ecx +ASM=mov ebp,esp +ASM=sub esp,10 +ASM=ljmp DrunkStateHookReturn + +[CreateScans] +ScanDrunkStateFunction=DF6DF88955F06A008D55F0 + +[CreateDetours] +DrunkStateHookStart=DrunkStateHookProc + +[SetValues] +Name=DrunkStateHookStart +Scan=ScanDrunkStateFunction +Offset=-14 +MemRead=0 +Add=0 +Name=DrunkStateHookReturn +Scan=ScanDrunkStateFunction +Offset=-14 +MemRead=0 +Add=5 \ No newline at end of file diff --git a/gwApi/plugins/Archiv/MakeAgentArrayEx.gwplasm b/gwApi/plugins/Archiv/MakeAgentArrayEx.gwplasm new file mode 100644 index 0000000..1b0ff7e --- /dev/null +++ b/gwApi/plugins/Archiv/MakeAgentArrayEx.gwplasm @@ -0,0 +1,37 @@ +[CreateData] +Data=AgentCopyCount/4 +Data=AgentCopyBase/114688 + +[CreateASM] +ASM=CommandMakeAgentArrayEx: +ASM=mov ecx,dword[eax+8] +ASM=mov eax,dword[eax+4] +ASM=xor ebx,ebx +ASM=xor edx,edx +ASM=mov edi,AgentCopyBase +ASM=AgentCopyLoopStartEx: +ASM=inc ebx +ASM=cmp ebx,dword[MaxAgents] +ASM=jge AgentCopyLoopExitEx +ASM=mov esi,dword[AgentBase] +ASM=lea esi,dword[esi+ebx*4] +ASM=mov esi,dword[esi] +ASM=test esi,esi +ASM=jz AgentCopyLoopStartEx +ASM=cmp eax,0 +ASM=jz CopyAgentEx +ASM=cmp eax,dword[esi+9C] +ASM=jnz AgentCopyLoopStartEx +ASM=cmp ecx,0 +ASM=jz CopyAgentEx +ASM=cmp cl,byte[esi+1B1] +ASM=jnz AgentCopyLoopStartEx +ASM=CopyAgentEx: +ASM=mov dword[edi],esi +ASM=add edi,4 +ASM=inc edx +ASM=jmp AgentCopyLoopStartEx +ASM=AgentCopyLoopExitEx: +ASM=mov dword[AgentCopyCount],edx +ASM=ljmp CommandReturn + diff --git a/gwApi/plugins/Archiv/Upgrade.gwplasm b/gwApi/plugins/Archiv/Upgrade.gwplasm new file mode 100644 index 0000000..44841a2 --- /dev/null +++ b/gwApi/plugins/Archiv/Upgrade.gwplasm @@ -0,0 +1,20 @@ +[CreateData] + +[CreateASM] +ASM=CommandUpgrade: +ASM=add eax,4 +ASM=mov ecx,eax +ASM=call UpgradeWindow +ASM=ljmp CommandReturn + +[CreateScans] +ScanUpgradeWindow=568B71088B4904 + +[CreateDetours] + +[SetValues] +Name=UpgradeWindow +Scan=ScanUpgradeWindow +Offset=-2 +MemRead=0 +Add=0 \ No newline at end of file diff --git a/gwApi/plugins/CollectItem.gwplasm b/gwApi/plugins/CollectItem.gwplasm index 7355e44..e7839e6 100644 --- a/gwApi/plugins/CollectItem.gwplasm +++ b/gwApi/plugins/CollectItem.gwplasm @@ -1,24 +1,24 @@ -[CreateData] - -[CreateASM] -ASM=CommandCollectItem: -ASM=push 0 -ASM=add eax,4 -ASM=push eax -ASM=push 1 -ASM=push 0 -ASM=add eax,4 -ASM=push eax -ASM=add eax,4 -ASM=push eax -ASM=push 1 -ASM=mov ecx,2 -ASM=mov edx,0 -ASM=call BuyItemFunction -ASM=ljmp CommandReturn - -[CreateScans] - -[CreateDetours] - +[CreateData] + +[CreateASM] +ASM=CommandCollectItem: +ASM=push 0 +ASM=add eax,4 +ASM=push eax +ASM=push 1 +ASM=push 0 +ASM=add eax,4 +ASM=push eax +ASM=add eax,4 +ASM=push eax +ASM=push 1 +ASM=mov ecx,2 +ASM=mov edx,0 +ASM=call BuyItemFunction +ASM=ljmp CommandReturn + +[CreateScans] + +[CreateDetours] + [SetValues] \ No newline at end of file diff --git a/gwApi/plugins/CraftItemEx.gwplasm b/gwApi/plugins/CraftItemEx.gwplasm index d01285b..21f7b7a 100644 --- a/gwApi/plugins/CraftItemEx.gwplasm +++ b/gwApi/plugins/CraftItemEx.gwplasm @@ -1,39 +1,39 @@ -[CreateData] - -[CreateASM] -ASM=CommandCraftItemEx: -ASM=add eax,4 -ASM=push eax -ASM=add eax,4 -ASM=push eax -ASM=push 1 -ASM=push 0 -ASM=push 0 -ASM=push dword[eax+4] -ASM=add eax,4 -ASM=push dword[eax+4] -ASM=add eax,4 -ASM=mov edx,esp -ASM=mov ecx,dword[CraftGlobal] -ASM=mov dword[edx-70],ecx -ASM=mov ecx,dword[edx+1C] -ASM=mov dword[edx+54],ecx -ASM=mov ecx,dword[edx+4] -ASM=mov dword[edx-14],ecx -ASM=mov ecx,3 -ASM=mov ebx,dword[eax] -ASM=mov edx,dword[eax+4] -ASM=call BuyItemFunction -ASM=ljmp CommandReturn - -[CreateScans] -ScanCraftGlobal=89750C83C60F83E6F089750C5657FF35 - -[CreateDetours] - -[SetValues] -Name=CraftGlobal -Scan=ScanCraftGlobal -Offset=17 -MemRead=1 +[CreateData] + +[CreateASM] +ASM=CommandCraftItemEx: +ASM=add eax,4 +ASM=push eax +ASM=add eax,4 +ASM=push eax +ASM=push 1 +ASM=push 0 +ASM=push 0 +ASM=push dword[eax+4] +ASM=add eax,4 +ASM=push dword[eax+4] +ASM=add eax,4 +ASM=mov edx,esp +ASM=mov ecx,dword[CraftGlobal] +ASM=mov dword[edx-70],ecx +ASM=mov ecx,dword[edx+1C] +ASM=mov dword[edx+54],ecx +ASM=mov ecx,dword[edx+4] +ASM=mov dword[edx-14],ecx +ASM=mov ecx,3 +ASM=mov ebx,dword[eax] +ASM=mov edx,dword[eax+4] +ASM=call BuyItemFunction +ASM=ljmp CommandReturn + +[CreateScans] +ScanCraftGlobal=89750C83C60F83E6F089750C5657FF35 + +[CreateDetours] + +[SetValues] +Name=CraftGlobal +Scan=ScanCraftGlobal +Offset=17 +MemRead=1 Add=0 \ No newline at end of file diff --git a/gwApi/plugins/DialogLogEx.gwplasm b/gwApi/plugins/DialogLogEx.gwplasm index 43d4e7a..18f2fbc 100644 --- a/gwApi/plugins/DialogLogEx.gwplasm +++ b/gwApi/plugins/DialogLogEx.gwplasm @@ -1,77 +1,77 @@ -[CreateData] -Data=LastDialogSender/4 -Data=LastDialogButtonsSize/4 -Data=LastDialogButtons/256 -Data=LastDialogID/4 - -[CreateASM] -ASM=DialogButtonHookProc: -ASM=push ebp -ASM=mov ebp,esp -ASM=pushad -ASM=mov eax,dword[LastDialogButtonsSize] -ASM=lea ebx,dword[eax*4+LastDialogButtons] -ASM=mov eax,dword[ecx+108] -ASM=mov dword[ebx],eax -ASM=inc dword[LastDialogButtonsSize] -ASM=popad -ASM=sub esp,10 -ASM=ljmp DialogButtonReturn -ASM=DialogSenderHookProc: -ASM=push ebp -ASM=mov ebp,esp -ASM=mov dword[LastDialogButtonsSize],0 -ASM=mov dword[LastDialogSender],ecx -ASM=sub esp,0c -ASM=ljmp DialogSenderReturn -ASM=DialogLogProc: -ASM=push ebp -ASM=mov ebp,esp -ASM=mov eax,dword[ebp+8] -ASM=mov dword[LastDialogID],eax -ASM=mov eax,dword[ecx+8] -ASM=mov dword[LastDialogButtonsSize],0 -ASM=test al,1 -ASM=ljmp DialogLogReturn - -[CreateScans] -ScanDialogLog=8977045F5E5B5DC208 -ScanDialogButton=558BEC83EC108B41048D51088945F0 -ScanDialogSender=8B461C85C074058B4614EB0233C06A00 - -[CreateDetours] -DialogButtonStart=DialogButtonHookProc -DialogSenderStart=DialogSenderHookProc -DialogLogStart=DialogLogProc - -[SetValues] -Name=DialogButtonStart -Scan=ScanDialogButton -Offset=1 -MemRead=0 -Add=0 -Name=DialogButtonReturn -Scan=ScanDialogButton -Offset=1 -MemRead=0 -Add=6 -Name=DialogSenderStart -Scan=ScanDialogSender -Offset=-0x2C -MemRead=0 -Add=0 -Name=DialogSenderReturn -Scan=ScanDialogSender -Offset=-0x2C -MemRead=0 -Add=6 -Name=DialogLogStart -Scan=ScanDialogLog -Offset=15 -MemRead=0 -Add=0 -Name=DialogLogReturn -Scan=ScanDialogLog -Offset=15 -MemRead=0 +[CreateData] +Data=LastDialogSender/4 +Data=LastDialogButtonsSize/4 +Data=LastDialogButtons/256 +Data=LastDialogID/4 + +[CreateASM] +ASM=DialogButtonHookProc: +ASM=push ebp +ASM=mov ebp,esp +ASM=pushad +ASM=mov eax,dword[LastDialogButtonsSize] +ASM=lea ebx,dword[eax*4+LastDialogButtons] +ASM=mov eax,dword[ecx+108] +ASM=mov dword[ebx],eax +ASM=inc dword[LastDialogButtonsSize] +ASM=popad +ASM=sub esp,10 +ASM=ljmp DialogButtonReturn +ASM=DialogSenderHookProc: +ASM=push ebp +ASM=mov ebp,esp +ASM=mov dword[LastDialogButtonsSize],0 +ASM=mov dword[LastDialogSender],ecx +ASM=sub esp,0c +ASM=ljmp DialogSenderReturn +ASM=DialogLogProc: +ASM=push ebp +ASM=mov ebp,esp +ASM=mov eax,dword[ebp+8] +ASM=mov dword[LastDialogID],eax +ASM=mov eax,dword[ecx+8] +ASM=mov dword[LastDialogButtonsSize],0 +ASM=test al,1 +ASM=ljmp DialogLogReturn + +[CreateScans] +ScanDialogLog=8977045F5E5B5DC208 +ScanDialogButton=558BEC83EC108B41048D51088945F0 +ScanDialogSender=8B461C85C074058B4614EB0233C06A00 + +[CreateDetours] +DialogButtonStart=DialogButtonHookProc +DialogSenderStart=DialogSenderHookProc +DialogLogStart=DialogLogProc + +[SetValues] +Name=DialogButtonStart +Scan=ScanDialogButton +Offset=1 +MemRead=0 +Add=0 +Name=DialogButtonReturn +Scan=ScanDialogButton +Offset=1 +MemRead=0 +Add=6 +Name=DialogSenderStart +Scan=ScanDialogSender +Offset=-0x2C +MemRead=0 +Add=0 +Name=DialogSenderReturn +Scan=ScanDialogSender +Offset=-0x2C +MemRead=0 +Add=6 +Name=DialogLogStart +Scan=ScanDialogLog +Offset=15 +MemRead=0 +Add=0 +Name=DialogLogReturn +Scan=ScanDialogLog +Offset=15 +MemRead=0 Add=8 \ No newline at end of file diff --git a/gwApi/plugins/DrunkState.gwplasm b/gwApi/plugins/DrunkState.gwplasm index 0b87da3..1262ae5 100644 --- a/gwApi/plugins/DrunkState.gwplasm +++ b/gwApi/plugins/DrunkState.gwplasm @@ -1,27 +1,27 @@ -[CreateData] -Data=DrunkState/4 - -[CreateASM] -ASM=DrunkStateHookProc: -ASM=mov dword[DrunkState],ecx -ASM=mov ebp,esp -ASM=sub esp,10 -ASM=ljmp DrunkStateHookReturn - -[CreateScans] -ScanDrunkStateFunction=DF6DF88955F06A008D55F0 - -[CreateDetours] -DrunkStateHookStart=DrunkStateHookProc - -[SetValues] -Name=DrunkStateHookStart -Scan=ScanDrunkStateFunction -Offset=-14 -MemRead=0 -Add=0 -Name=DrunkStateHookReturn -Scan=ScanDrunkStateFunction -Offset=-14 -MemRead=0 +[CreateData] +Data=DrunkState/4 + +[CreateASM] +ASM=DrunkStateHookProc: +ASM=mov dword[DrunkState],ecx +ASM=mov ebp,esp +ASM=sub esp,10 +ASM=ljmp DrunkStateHookReturn + +[CreateScans] +ScanDrunkStateFunction=DF6DF88955F06A008D55F0 + +[CreateDetours] +DrunkStateHookStart=DrunkStateHookProc + +[SetValues] +Name=DrunkStateHookStart +Scan=ScanDrunkStateFunction +Offset=-14 +MemRead=0 +Add=0 +Name=DrunkStateHookReturn +Scan=ScanDrunkStateFunction +Offset=-14 +MemRead=0 Add=5 \ No newline at end of file diff --git a/gwApi/plugins/MakeAgentArrayEx.gwplasm b/gwApi/plugins/MakeAgentArrayEx.gwplasm index 665e62f..1b0ff7e 100644 --- a/gwApi/plugins/MakeAgentArrayEx.gwplasm +++ b/gwApi/plugins/MakeAgentArrayEx.gwplasm @@ -1,37 +1,37 @@ -[CreateData] -Data=AgentCopyCount/4 -Data=AgentCopyBase/114688 - -[CreateASM] -ASM=CommandMakeAgentArrayEx: -ASM=mov ecx,dword[eax+8] -ASM=mov eax,dword[eax+4] -ASM=xor ebx,ebx -ASM=xor edx,edx -ASM=mov edi,AgentCopyBase -ASM=AgentCopyLoopStartEx: -ASM=inc ebx -ASM=cmp ebx,dword[MaxAgents] -ASM=jge AgentCopyLoopExitEx -ASM=mov esi,dword[AgentBase] -ASM=lea esi,dword[esi+ebx*4] -ASM=mov esi,dword[esi] -ASM=test esi,esi -ASM=jz AgentCopyLoopStartEx -ASM=cmp eax,0 -ASM=jz CopyAgentEx -ASM=cmp eax,dword[esi+9C] -ASM=jnz AgentCopyLoopStartEx -ASM=cmp ecx,0 -ASM=jz CopyAgentEx -ASM=cmp cl,byte[esi+1B1] -ASM=jnz AgentCopyLoopStartEx -ASM=CopyAgentEx: -ASM=mov dword[edi],esi -ASM=add edi,4 -ASM=inc edx -ASM=jmp AgentCopyLoopStartEx -ASM=AgentCopyLoopExitEx: -ASM=mov dword[AgentCopyCount],edx -ASM=ljmp CommandReturn - +[CreateData] +Data=AgentCopyCount/4 +Data=AgentCopyBase/114688 + +[CreateASM] +ASM=CommandMakeAgentArrayEx: +ASM=mov ecx,dword[eax+8] +ASM=mov eax,dword[eax+4] +ASM=xor ebx,ebx +ASM=xor edx,edx +ASM=mov edi,AgentCopyBase +ASM=AgentCopyLoopStartEx: +ASM=inc ebx +ASM=cmp ebx,dword[MaxAgents] +ASM=jge AgentCopyLoopExitEx +ASM=mov esi,dword[AgentBase] +ASM=lea esi,dword[esi+ebx*4] +ASM=mov esi,dword[esi] +ASM=test esi,esi +ASM=jz AgentCopyLoopStartEx +ASM=cmp eax,0 +ASM=jz CopyAgentEx +ASM=cmp eax,dword[esi+9C] +ASM=jnz AgentCopyLoopStartEx +ASM=cmp ecx,0 +ASM=jz CopyAgentEx +ASM=cmp cl,byte[esi+1B1] +ASM=jnz AgentCopyLoopStartEx +ASM=CopyAgentEx: +ASM=mov dword[edi],esi +ASM=add edi,4 +ASM=inc edx +ASM=jmp AgentCopyLoopStartEx +ASM=AgentCopyLoopExitEx: +ASM=mov dword[AgentCopyCount],edx +ASM=ljmp CommandReturn + diff --git a/gwApi/plugins/Upgrade.gwplasm b/gwApi/plugins/Upgrade.gwplasm index 129779f..44841a2 100644 --- a/gwApi/plugins/Upgrade.gwplasm +++ b/gwApi/plugins/Upgrade.gwplasm @@ -1,20 +1,20 @@ -[CreateData] - -[CreateASM] -ASM=CommandUpgrade: -ASM=add eax,4 -ASM=mov ecx,eax -ASM=call UpgradeWindow -ASM=ljmp CommandReturn - -[CreateScans] -ScanUpgradeWindow=568B71088B4904 - -[CreateDetours] - -[SetValues] -Name=UpgradeWindow -Scan=ScanUpgradeWindow -Offset=-2 -MemRead=0 +[CreateData] + +[CreateASM] +ASM=CommandUpgrade: +ASM=add eax,4 +ASM=mov ecx,eax +ASM=call UpgradeWindow +ASM=ljmp CommandReturn + +[CreateScans] +ScanUpgradeWindow=568B71088B4904 + +[CreateDetours] + +[SetValues] +Name=UpgradeWindow +Scan=ScanUpgradeWindow +Offset=-2 +MemRead=0 Add=0 \ No newline at end of file diff --git a/gwApi/plugins/pluginfunctions.au3 b/gwApi/plugins/pluginfunctions.au3 index 90b35bf..46954de 100644 --- a/gwApi/plugins/pluginfunctions.au3 +++ b/gwApi/plugins/pluginfunctions.au3 @@ -1,311 +1,295 @@ -#include-once - -#cs - Functions for asm plugins. - SetPluginVariables() at end of file. -#ce -;Global $mLastPacket -;Global $mLastPacketSize -;_('LastPacketSent/' & 512 * GetValue('PacketLogSize')) -;_('LastPacketSize/4') -;_('LastPacketBase/4') -#CS -Case 'push edi' - $lOpCode = '57';<--- -Case 'mov ebp,esp' - $lOpCode = '8BEC';<--- -Case 'mov edi,dword[ecx]';<------- - $lOpCode = '368B39' -Case 'mov dword[eax],edi';<------ - $lOpCode = '368938' -Case 'cmp ecx,ebp' - $lOpCode = '39E9';<---- -#CE - - -#Region DialogLogEx -Global $mLastDialogId = 0 - -;~ Description: Returns last DialogID in ascii. -Func GetLastDialogId() - Return MemoryRead($mLastDialogId) -EndFunc ;==>GetLastDialogId - -;~ Description: Last DialogID as hex. -Func GetLastDialogIdHex() - Local $DialogHex = MemoryRead($mLastDialogId) - Return "0x" & StringReplace(Hex($DialogHex, 8), StringRegExpReplace(Hex($DialogHex, 8), "[^0].*", ""), "") -EndFunc ;==>GetLastDialogIdHex - -;~ Description: Returns available dialogs of active dialog as a DllStruct, size is in @extended. -Func GetAvailableDialogs() - Static Local $lSizePtr = 0 - Static Local $lButtonsBase = 0 - If $lSizePtr = 0 Then $lSizePtr = GetValue('LastDialogButtonsSize') - If $lButtonsBase = 0 Then $lButtonsBase = GetValue('LastDialogButtons') - Local $lSize = MemoryRead($lSizePtr) - If $lSize <= 0 Then Return - Local $lReturn = DllStructCreate('dword[' & $lSize & ']') - MemoryReadToStruct($lButtonsBase, $lReturn) - Return SetExtended($lSize, $lReturn) -EndFunc - -;~ Description: Returns last dialog sender. -Func GetLastDialogSender() - Static Local $lDialogSenderPtr = 0 - If $lDialogSenderPtr = 0 Then $lDialogSenderPtr = GetValue('LastDialogSender') - Return MemoryRead($lDialogSenderPtr) -EndFunc -#EndRegion - -#Region MakeAgentArrayEx -Global $mMakeAgentArrayEx = DllStructCreate('ptr;dword;dword') -Global $mMakeAgentArrayExPtr = DllStructGetPtr($mMakeAgentArrayEx) - -;~ Description: Pulls only ptrs instead of whole struct from memory, uses internal ASM function. -Func GetAgentPtrArrayASM($aMode = 0, $aType = 0xDB, $aAllegiance = 3) - If $aMode = Default Then $aMode = 0 - If $aType = Default Then $aType = 0xDB - If $aAllegiance = Default Then $aAllegiance = 3 - If $aMode = 0 Then - $aType = 0 - $aAllegiance = 0 - EndIf - Local $lCount - MemoryWrite($mAgentCopyCount, -1, 'long') - ConsoleWrite(Ptr(DllStructGetData($mMakeAgentArrayEx, 1)) & Ptr($mAgentCopyCount) & @CRLF) - DllStructSetData($mMakeAgentArrayEx, 2, $aType) - DllStructSetData($mMakeAgentArrayEx, 3, $aAllegiance) - Enqueue($mMakeAgentArrayExPtr, 12) - Local $lDeadlock = TimerInit() - Do - $lCount = MemoryRead($mAgentCopyCount, 'long') - Until $lCount >= 0 Or TimerDiff($lDeadlock) > 5000 - If $lCount < 0 Or $lCount > 256 Then $lCount = 0 - Local $lBuffer = DllStructCreate("ptr[" & $lCount & "]") - DllCall($mKernelHandle, 'int', 'ReadProcessMemory', 'handle', $mGWProcHandle, 'ptr', $mAgentCopyBase, 'struct*', $lBuffer, 'ulong_ptr', $lCount * 4, 'ulong_ptr*', 0) - Local $lReturnArray[$lCount + 1] - For $i = 1 To $lCount - $lReturnArray[$i] = DllStructGetData($lBuffer, 1, $i) - Next - $lReturnArray[0] = $lCount - Return $lReturnArray -EndFunc ;==>GetAgentPtrArrayASM -#EndRegion - -#Region CraftItemEx -Global $mCraftItemEx = DllStructCreate('ptr;dword;dword;ptr;dword;dword') -Global $mCraftItemExPtr = DllStructGetPtr($mCraftItemEx) - -;~ Description: Crafts an item. Crafter merchant window has to be opened and mats and gold have to be in inventory/on character. -;~ Return 0: prerequisites not met ($aMatsarray not an array, ItemModelID not part of merchantbase, not enough memory) -;~ Return ModelID: of missing mats -> @extended = amount of missing mats -;~ Return True: function finished -> @extended = 0 if items got crafted, <> 0 if crafting failed -;~ Parameter 1: ModelID of item to be crafted -;~ Parameter 2: Amount of items to craft -;~ Parameter 3: Amount of gold needed to craft one item -;~ Parameter 4: MatsArray[ [Mat1ModelID, Mat1Amount], _ -;~ [Mat2ModelID, Mat2Amount], _ -;~ [Mat3ModelID, Mat3Amount], _ -;~ [MatNModelID, MatNAmount]] -;~ Requires: gwAPI_basics.au3, items.au3 -;~ Part of: items.au3 -;~ Author: Testytest. -Func CraftItemEx($aModelID, $aQuantity, $aGold, ByRef $aMatsArray) - Local $lItemIDRow = GetItemRowByModelID($aModelID) - If $lItemIDRow = 0 Then Return 0 ; modelID not found in merchantbase - Local $lMatString = '' - Local $lMatCount = 0 - If IsArray($aMatsArray) = 0 Then Return 0 ; mats are not in an array - Local $lMatsArraySize = UBound($aMatsArray) - 1 - Local $lCheckQuantity - For $i = $lMatsArraySize To 0 Step -1 - $lCheckQuantity = CountItemInBagsByModelID($aMatsArray[$i][0]) - If $aMatsArray[$i][1] * $aQuantity > $lCheckQuantity Then ; not enough mats in inventory - Return SetExtended($aMatsArray[$i][1] * $aQuantity - $lCheckQuantity, $aMatsArray[$i][0]) ; amount of missing mats in @extended - EndIf - Next - Local $lCheckGold = GetGoldCharacter() - For $i = 0 To $lMatsArraySize - $lMatString &= GetCraftMatsString($aMatsArray[$i][0], $aQuantity * $aMatsArray[$i][1]) - $lMatCount += @extended - Next - Local $CraftMatsType = 'dword' - For $i = 1 to $lMatCount - 1 - $CraftMatsType &= ';dword' - Next - Local $CraftMatsBuffer = DllStructCreate($CraftMatsType) - Local $CraftMatsPointer = DllStructGetPtr($CraftMatsBuffer) - Local $lSize - For $i = 1 To $lMatCount - $lSize = StringInStr($lMatString, ';') - DllStructSetData($CraftMatsBuffer, $i, StringLeft($lMatString, $lSize - 1)) - $lMatString = StringTrimLeft($lMatString, $lSize) - Next - Local $lMemSize = $lMatCount * 4 - Local $lBufferMemory = DllCall($mKernelHandle, 'ptr', 'VirtualAllocEx', 'handle', $mGWProcHandle, 'ptr', 0, 'ulong_ptr', $lMemSize, 'dword', 0x1000, 'dword', 0x40) - If $lBufferMemory = 0 Then Return 0 ; couldnt allocate enough memory - Local $lBuffer = DllCall($mKernelHandle, 'int', 'WriteProcessMemory', 'int', $mGWProcHandle, 'int', $lBufferMemory[0], 'ptr', $CraftMatsPointer, 'int', $lMemSize, 'int', '') - If $lBuffer = 0 Then Return 0 - DllStructSetData($mCraftItemEx, 2, $aQuantity) - DllStructSetData($mCraftItemEx, 3, $lItemIDRow) - DllStructSetData($mCraftItemEx, 4, $lBufferMemory[0]) - DllStructSetData($mCraftItemEx, 5, $lMatCount) - DllStructSetData($mCraftItemEx, 6, $aQuantity * $aGold) - Enqueue($mCraftItemExPtr, 24) - Local $lCurrentQuantity - Local $lDeadlock = TimerInit() - Do - Sleep(250) - $lCurrentQuantity = CountItemInBagsByModelID($aMatsArray[0][0]) - Until $lCurrentQuantity <> $lCheckQuantity Or $lCheckGold <> GetGoldCharacter() Or TimerDiff($lDeadlock) > 5000 - Local $lRet = DllCall($mKernelHandle, 'ptr', 'VirtualFreeEx', 'handle', $mGWProcHandle, 'ptr', $lBufferMemory[0], 'int', 0, 'dword', 0x8000) - Return SetExtended($lCheckQuantity - $lCurrentQuantity - $aMatsArray[0][1] * $aQuantity, $lRet <> 0) ; should be zero if items were successfully crafted -EndFunc ;==>CraftItemEx - -;~ Description: Internal use CraftItemEx. Returns item IDs of ModelIDs found in inventory as string, separate by ';'. -;~ Return: String of ItemIDs, separated by ';' -;~ @Extended: Amount of ItemIDs -;~ Parameter 1: ModelID -;~ Parameter 2: Amount needed -;~ Requires: gwAPI_basics.au3, items.au3 -;~ Part of: items.au3 -;~ Author: Testytest. -Func GetCraftMatsString($aModelID, $aAmount) - Local $lCount = 0 - Local $lQuantity = 0 - Local $lMatString = '' - Local $lBagPtr, $lItemArrayPtr, $lSlotPtr - For $bag = 1 to 4 - $lBagPtr = GetBagPtr($bag) - If $lBagPtr = 0 Then ContinueLoop ; no valid bag - $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') - For $slot = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 - $lSlotPtr = MemoryRead($lItemArrayPtr + 4 * $slot, 'ptr') - If $lSlotPtr = 0 Then ContinueLoop ; empty slot - If MemoryRead($lSlotPtr + 44, 'long') = $aModelID Then - $lMatString &= MemoryRead($lSlotPtr, 'long') & ';' - $lCount += 1 - $lQuantity += MemoryRead($lSlotPtr + 75, 'byte') - If $lQuantity >= $aAmount Then - Return SetExtended($lCount, $lMatString) - EndIf - EndIf - Next - Next -EndFunc ;==>GetCraftMatsString -#EndRegion - -#Region Upgrade -Global $mUpgrade = DllStructCreate('ptr;dword;dword;dword;dword') -Global $mUpgradePtr = DllStructGetPtr($mUpgrade) - -;~ Description: Upgrades item with upgrade. -;~ UpgradeType --> -;~ For armor: 0 -> insignia -;~ 1 -> rune -;~ For weapons: 0 -> prefix -;~ 1 -> suffix -;~ 2 -> inscription -Func Upgrade($aItemPtr, $aUpgradePtr, $aUpgradeType) - Local $lItemID = MemoryRead($aItemPtr, 'long') - Local $lUpgradeID = MemoryRead($aUpgradePtr, 'long') - If $lItemID = 0 Or $lUpgradeID = 0 Then Return False - DllStructSetData($mUpgrade, 2, 0) - DllStructSetData($mUpgrade, 3, $aUpgradeType) - DllStructSetData($mUpgrade, 4, $lItemID) - DllStructSetData($mUpgrade, 5, $lUpgradeID) - Enqueue($mUpgradePtr, 20) - Sleep(1000 + GetPing()) - Sendpacket(0x4, 0x7C) - Local $lDeadlock = TimerInit() - Do - Sleep(250) - If MemoryRead($aUpgradePtr + 12, 'ptr') = 0 Then Return True - Until TimerDiff($lDeadlock) > 5000 -EndFunc ;==>Upgrade -#EndRegion - -#Region DrunkState -Global $mDrunkState = 0 - -;~ Description: Returns Drunklevel, starting with next drunklevel-change. -Func GetIsDrunk() - Return MemoryRead($mDrunkState) -EndFunc -#EndRegion - -#Region CollectItem -Global $mCollectItem = DllStructCreate('ptr func;dword IDItemToRecieve;dword CollectedItemAmount;dword IDofItemtoCollect') -Global $mCollectItemPtr = DllStructGetPtr($mCollectItem) - -;~ Description: Crafts collector item. -;~ Author: 4D1. -Func CollectItem($aModelIDToGive, $aAmountNeededToGive, $aModelIDToRecieve) - Local $lItemIDToGive = GetItemPtrByModelID($aModelIDToGive,True) - If $lItemIDToGive = 0 Then - Return - Else - $lItemIDToGive = MemoryRead($lItemIDToGive) - EndIf - Local $lItemIDtoRecieve = GetItemRowByModelID($aModelIDToRecieve) - If $lItemIDtoRecieve = 0 Then Return - DllStructSetData($mCollectItem, 'IDofItemtoCollect', $lItemIDToGive) - DllStructSetData($mCollectItem, 'CollectedItemAmount', $aAmountNeededToGive) - DllStructSetData($mCollectItem, 'IDItemToRecieve', $lItemIDtoRecieve) - Enqueue($mCollectItemPtr,16) -EndFunc - -;~ Description: Crafts multiple collector items. -;~ Author: 4D1. -Func CollectItemEx($aModelIDToGive, $aAmountNeededToGive, $aModelIDToRecieve, $aQuantity) - Local $lItemPtrToGive = GetItemPtrByModelID($aModelIDToGive, True) - Local $lItemIDToGive, $lQuantity - If $lItemPtrToGive = 0 Then - Return - Else - $lItemIDToGive = MemoryRead($lItemIDToGive) - EndIf - Local $lItemIDtoRecieve = GetItemRowByModelID($aModelIDToRecieve) - If $lItemIDtoRecieve = 0 Then Return - DllStructSetData($mCollectItem, 'IDofItemtoCollect', $lItemIDToGive) - DllStructSetData($mCollectItem, 'CollectedItemAmount', $aAmountNeededToGive) - DllStructSetData($mCollectItem, 'IDItemToRecieve', $lItemIDtoRecieve) - For $i = 1 To $aQuantity - $lQuantity = MemoryRead($lItemPtrToGive + 75, 'byte') - If $lQuantity < $aAmountNeededToGive Then - $lItemPtrToGive = GetItemPtrByModelID($aModelIDToGive, True) - If $lItemPtrToGive = 0 Then - Return - Else - $lItemIDToGive = MemoryRead($lItemIDToGive) - DllStructSetData($mCollectItem, 'IDofItemtoCollect', $lItemIDToGive) - EndIf - EndIf - Enqueue($mCollectItemPtr, 16) - Do - Sleep(100) - Until MemoryRead($lItemPtrToGive + 75, 'byte') < $lQuantity - Next -EndFunc ;==>CollectItemEx -#EndRegion - -#Region SetPluginVariables -;~ Description: Set variables such as DllStruct at end of InitClient() -Func SetPluginVariables() - ;; DialogLogEx ;; - $mLastDialogId = GetValue('LastDialogID') - ;; MakeAgentArrayEx ;; - DllStructSetData($mMakeAgentArrayEx, 1, GetValue('CommandMakeAgentArrayEx')) - $mAgentCopyCount = GetValue('AgentCopyCount') - $mAgentCopyBase = GetValue('AgentCopyBase') - ;; CraftItemEx ;; - DllStructSetData($mCraftItemEx , 1, GetValue('CommandCraftItemEx')) - ;; Upgrade ;; - DllStructSetData($mUpgrade, 1, GetValue('CommandUpgrade')) - ;; DrunkState ;; - $mDrunkState = GetValue('DrunkState') - ;; CollectItem ;; - DllStructSetData($mCollectItem,'func',GetValue('CommandCollectItem')) -EndFunc +#include-once + +#cs + Functions for asm plugins. + SetPluginVariables() at end of file. +#ce + + + +#Region DialogLogEx +Global $mLastDialogId = 0 + +;~ Description: Returns last DialogID in ascii. +Func GetLastDialogId() + Return MemoryRead($mLastDialogId) +EndFunc ;==>GetLastDialogId + +;~ Description: Last DialogID as hex. +Func GetLastDialogIdHex() + Local $DialogHex = MemoryRead($mLastDialogId) + Return "0x" & StringReplace(Hex($DialogHex, 8), StringRegExpReplace(Hex($DialogHex, 8), "[^0].*", ""), "") +EndFunc ;==>GetLastDialogIdHex + +;~ Description: Returns available dialogs of active dialog as a DllStruct, size is in @extended. +Func GetAvailableDialogs() + Static Local $lSizePtr = 0 + Static Local $lButtonsBase = 0 + If $lSizePtr = 0 Then $lSizePtr = GetValue('LastDialogButtonsSize') + If $lButtonsBase = 0 Then $lButtonsBase = GetValue('LastDialogButtons') + Local $lSize = MemoryRead($lSizePtr) + If $lSize <= 0 Then Return + Local $lReturn = DllStructCreate('dword[' & $lSize & ']') + MemoryReadToStruct($lButtonsBase, $lReturn) + Return SetExtended($lSize, $lReturn) +EndFunc + +;~ Description: Returns last dialog sender. +Func GetLastDialogSender() + Static Local $lDialogSenderPtr = 0 + If $lDialogSenderPtr = 0 Then $lDialogSenderPtr = GetValue('LastDialogSender') + Return MemoryRead($lDialogSenderPtr) +EndFunc +#EndRegion + +#Region MakeAgentArrayEx +Global $mMakeAgentArrayEx = DllStructCreate('ptr;dword;dword') +Global $mMakeAgentArrayExPtr = DllStructGetPtr($mMakeAgentArrayEx) + +;~ Description: Pulls only ptrs instead of whole struct from memory, uses internal ASM function. +Func GetAgentPtrArrayASM($aMode = 0, $aType = 0xDB, $aAllegiance = 3) + If $aMode = Default Then $aMode = 0 + If $aType = Default Then $aType = 0xDB + If $aAllegiance = Default Then $aAllegiance = 3 + If $aMode = 0 Then + $aType = 0 + $aAllegiance = 0 + EndIf + Local $lCount + MemoryWrite($mAgentCopyCount, -1, 'long') + ConsoleWrite(Ptr(DllStructGetData($mMakeAgentArrayEx, 1)) & Ptr($mAgentCopyCount) & @CRLF) + DllStructSetData($mMakeAgentArrayEx, 2, $aType) + DllStructSetData($mMakeAgentArrayEx, 3, $aAllegiance) + Enqueue($mMakeAgentArrayExPtr, 12) + Local $lDeadlock = TimerInit() + Do + $lCount = MemoryRead($mAgentCopyCount, 'long') + Until $lCount >= 0 Or TimerDiff($lDeadlock) > 5000 + If $lCount < 0 Or $lCount > 256 Then $lCount = 0 + Local $lBuffer = DllStructCreate("ptr[" & $lCount & "]") + DllCall($mKernelHandle, 'int', 'ReadProcessMemory', 'handle', $mGWProcHandle, 'ptr', $mAgentCopyBase, 'struct*', $lBuffer, 'ulong_ptr', $lCount * 4, 'ulong_ptr*', 0) + Local $lReturnArray[$lCount + 1] + For $i = 1 To $lCount + $lReturnArray[$i] = DllStructGetData($lBuffer, 1, $i) + Next + $lReturnArray[0] = $lCount + Return $lReturnArray +EndFunc ;==>GetAgentPtrArrayASM +#EndRegion + +#Region CraftItemEx +Global $mCraftItemEx = DllStructCreate('ptr;dword;dword;ptr;dword;dword') +Global $mCraftItemExPtr = DllStructGetPtr($mCraftItemEx) + +;~ Description: Crafts an item. Crafter merchant window has to be opened and mats and gold have to be in inventory/on character. +;~ Return 0: prerequisites not met ($aMatsarray not an array, ItemModelID not part of merchantbase, not enough memory) +;~ Return ModelID: of missing mats -> @extended = amount of missing mats +;~ Return True: function finished -> @extended = 0 if items got crafted, <> 0 if crafting failed +;~ Parameter 1: ModelID of item to be crafted +;~ Parameter 2: Amount of items to craft +;~ Parameter 3: Amount of gold needed to craft one item +;~ Parameter 4: MatsArray[ [Mat1ModelID, Mat1Amount], _ +;~ [Mat2ModelID, Mat2Amount], _ +;~ [Mat3ModelID, Mat3Amount], _ +;~ [MatNModelID, MatNAmount]] +;~ Requires: gwAPI_basics.au3, items.au3 +;~ Part of: items.au3 +;~ Author: Testytest. +Func CraftItemEx($aModelID, $aQuantity, $aGold, ByRef $aMatsArray) + Local $lItemIDRow = GetItemRowByModelID($aModelID) + If $lItemIDRow = 0 Then Return 0 ; modelID not found in merchantbase + Local $lMatString = '' + Local $lMatCount = 0 + If IsArray($aMatsArray) = 0 Then Return 0 ; mats are not in an array + Local $lMatsArraySize = UBound($aMatsArray) - 1 + Local $lCheckQuantity + For $i = $lMatsArraySize To 0 Step -1 + $lCheckQuantity = CountItemInBagsByModelID($aMatsArray[$i][0]) + If $aMatsArray[$i][1] * $aQuantity > $lCheckQuantity Then ; not enough mats in inventory + Return SetExtended($aMatsArray[$i][1] * $aQuantity - $lCheckQuantity, $aMatsArray[$i][0]) ; amount of missing mats in @extended + EndIf + Next + Local $lCheckGold = GetGoldCharacter() + For $i = 0 To $lMatsArraySize + $lMatString &= GetCraftMatsString($aMatsArray[$i][0], $aQuantity * $aMatsArray[$i][1]) + $lMatCount += @extended + Next + Local $CraftMatsType = 'dword' + For $i = 1 to $lMatCount - 1 + $CraftMatsType &= ';dword' + Next + Local $CraftMatsBuffer = DllStructCreate($CraftMatsType) + Local $CraftMatsPointer = DllStructGetPtr($CraftMatsBuffer) + Local $lSize + For $i = 1 To $lMatCount + $lSize = StringInStr($lMatString, ';') + DllStructSetData($CraftMatsBuffer, $i, StringLeft($lMatString, $lSize - 1)) + $lMatString = StringTrimLeft($lMatString, $lSize) + Next + Local $lMemSize = $lMatCount * 4 + Local $lBufferMemory = DllCall($mKernelHandle, 'ptr', 'VirtualAllocEx', 'handle', $mGWProcHandle, 'ptr', 0, 'ulong_ptr', $lMemSize, 'dword', 0x1000, 'dword', 0x40) + If $lBufferMemory = 0 Then Return 0 ; couldnt allocate enough memory + Local $lBuffer = DllCall($mKernelHandle, 'int', 'WriteProcessMemory', 'int', $mGWProcHandle, 'int', $lBufferMemory[0], 'ptr', $CraftMatsPointer, 'int', $lMemSize, 'int', '') + If $lBuffer = 0 Then Return 0 + DllStructSetData($mCraftItemEx, 2, $aQuantity) + DllStructSetData($mCraftItemEx, 3, $lItemIDRow) + DllStructSetData($mCraftItemEx, 4, $lBufferMemory[0]) + DllStructSetData($mCraftItemEx, 5, $lMatCount) + DllStructSetData($mCraftItemEx, 6, $aQuantity * $aGold) + Enqueue($mCraftItemExPtr, 24) + Local $lCurrentQuantity + Local $lDeadlock = TimerInit() + Do + Sleep(250) + $lCurrentQuantity = CountItemInBagsByModelID($aMatsArray[0][0]) + Until $lCurrentQuantity <> $lCheckQuantity Or $lCheckGold <> GetGoldCharacter() Or TimerDiff($lDeadlock) > 5000 + Local $lRet = DllCall($mKernelHandle, 'ptr', 'VirtualFreeEx', 'handle', $mGWProcHandle, 'ptr', $lBufferMemory[0], 'int', 0, 'dword', 0x8000) + Return SetExtended($lCheckQuantity - $lCurrentQuantity - $aMatsArray[0][1] * $aQuantity, $lRet <> 0) ; should be zero if items were successfully crafted +EndFunc ;==>CraftItemEx + +;~ Description: Internal use CraftItemEx. Returns item IDs of ModelIDs found in inventory as string, separate by ';'. +;~ Return: String of ItemIDs, separated by ';' +;~ @Extended: Amount of ItemIDs +;~ Parameter 1: ModelID +;~ Parameter 2: Amount needed +;~ Requires: gwAPI_basics.au3, items.au3 +;~ Part of: items.au3 +;~ Author: Testytest. +Func GetCraftMatsString($aModelID, $aAmount) + Local $lCount = 0 + Local $lQuantity = 0 + Local $lMatString = '' + Local $lBagPtr, $lItemArrayPtr, $lSlotPtr + For $bag = 1 to 4 + $lBagPtr = GetBagPtr($bag) + If $lBagPtr = 0 Then ContinueLoop ; no valid bag + $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') + For $slot = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 + $lSlotPtr = MemoryRead($lItemArrayPtr + 4 * $slot, 'ptr') + If $lSlotPtr = 0 Then ContinueLoop ; empty slot + If MemoryRead($lSlotPtr + 44, 'long') = $aModelID Then + $lMatString &= MemoryRead($lSlotPtr, 'long') & ';' + $lCount += 1 + $lQuantity += MemoryRead($lSlotPtr + 75, 'byte') + If $lQuantity >= $aAmount Then + Return SetExtended($lCount, $lMatString) + EndIf + EndIf + Next + Next +EndFunc ;==>GetCraftMatsString +#EndRegion + +#Region Upgrade +Global $mUpgrade = DllStructCreate('ptr;dword;dword;dword;dword') +Global $mUpgradePtr = DllStructGetPtr($mUpgrade) + +;~ Description: Upgrades item with upgrade. +;~ UpgradeType --> +;~ For armor: 0 -> insignia +;~ 1 -> rune +;~ For weapons: 0 -> prefix +;~ 1 -> suffix +;~ 2 -> inscription +Func Upgrade($aItemPtr, $aUpgradePtr, $aUpgradeType) + Local $lItemID = MemoryRead($aItemPtr, 'long') + Local $lUpgradeID = MemoryRead($aUpgradePtr, 'long') + If $lItemID = 0 Or $lUpgradeID = 0 Then Return False + DllStructSetData($mUpgrade, 2, 0) + DllStructSetData($mUpgrade, 3, $aUpgradeType) + DllStructSetData($mUpgrade, 4, $lItemID) + DllStructSetData($mUpgrade, 5, $lUpgradeID) + Enqueue($mUpgradePtr, 20) + Sleep(1000 + GetPing()) + Sendpacket(0x4, 0x7C) + Local $lDeadlock = TimerInit() + Do + Sleep(250) + If MemoryRead($aUpgradePtr + 12, 'ptr') = 0 Then Return True + Until TimerDiff($lDeadlock) > 5000 +EndFunc ;==>Upgrade +#EndRegion + +#Region DrunkState +Global $mDrunkState = 0 + +;~ Description: Returns Drunklevel, starting with next drunklevel-change. +Func GetIsDrunk() + Return MemoryRead($mDrunkState) +EndFunc +#EndRegion + +#Region CollectItem +Global $mCollectItem = DllStructCreate('ptr func;dword IDItemToRecieve;dword CollectedItemAmount;dword IDofItemtoCollect') +Global $mCollectItemPtr = DllStructGetPtr($mCollectItem) + +;~ Description: Crafts collector item. +;~ Author: 4D1. +Func CollectItem($aModelIDToGive, $aAmountNeededToGive, $aModelIDToRecieve) + Local $lItemIDToGive = GetItemPtrByModelID($aModelIDToGive,True) + If $lItemIDToGive = 0 Then + Return + Else + $lItemIDToGive = MemoryRead($lItemIDToGive) + EndIf + Local $lItemIDtoRecieve = GetItemRowByModelID($aModelIDToRecieve) + If $lItemIDtoRecieve = 0 Then Return + DllStructSetData($mCollectItem, 'IDofItemtoCollect', $lItemIDToGive) + DllStructSetData($mCollectItem, 'CollectedItemAmount', $aAmountNeededToGive) + DllStructSetData($mCollectItem, 'IDItemToRecieve', $lItemIDtoRecieve) + Enqueue($mCollectItemPtr,16) +EndFunc + +;~ Description: Crafts multiple collector items. +;~ Author: 4D1. +Func CollectItemEx($aModelIDToGive, $aAmountNeededToGive, $aModelIDToRecieve, $aQuantity) + Local $lItemPtrToGive = GetItemPtrByModelID($aModelIDToGive, True) + Local $lItemIDToGive, $lQuantity + If $lItemPtrToGive = 0 Then + Return + Else + $lItemIDToGive = MemoryRead($lItemIDToGive) + EndIf + Local $lItemIDtoRecieve = GetItemRowByModelID($aModelIDToRecieve) + If $lItemIDtoRecieve = 0 Then Return + DllStructSetData($mCollectItem, 'IDofItemtoCollect', $lItemIDToGive) + DllStructSetData($mCollectItem, 'CollectedItemAmount', $aAmountNeededToGive) + DllStructSetData($mCollectItem, 'IDItemToRecieve', $lItemIDtoRecieve) + For $i = 1 To $aQuantity + $lQuantity = MemoryRead($lItemPtrToGive + 75, 'byte') + If $lQuantity < $aAmountNeededToGive Then + $lItemPtrToGive = GetItemPtrByModelID($aModelIDToGive, True) + If $lItemPtrToGive = 0 Then + Return + Else + $lItemIDToGive = MemoryRead($lItemIDToGive) + DllStructSetData($mCollectItem, 'IDofItemtoCollect', $lItemIDToGive) + EndIf + EndIf + Enqueue($mCollectItemPtr, 16) + Do + Sleep(100) + Until MemoryRead($lItemPtrToGive + 75, 'byte') < $lQuantity + Next +EndFunc ;==>CollectItemEx +#EndRegion + +#Region SetPluginVariables +;~ Description: Set variables such as DllStruct at end of InitClient() +Func SetPluginVariables() + ;; DialogLogEx ;; + $mLastDialogId = GetValue('LastDialogID') + ;; MakeAgentArrayEx ;; + DllStructSetData($mMakeAgentArrayEx, 1, GetValue('CommandMakeAgentArrayEx')) + $mAgentCopyCount = GetValue('AgentCopyCount') + $mAgentCopyBase = GetValue('AgentCopyBase') + ;; CraftItemEx ;; + DllStructSetData($mCraftItemEx , 1, GetValue('CommandCraftItemEx')) + ;; Upgrade ;; + DllStructSetData($mUpgrade, 1, GetValue('CommandUpgrade')) + ;; DrunkState ;; + $mDrunkState = GetValue('DrunkState') + ;; CollectItem ;; + DllStructSetData($mCollectItem,'func',GetValue('CommandCollectItem')) +EndFunc #EndRegion \ No newline at end of file diff --git a/gwApi/quest.au3 b/gwApi/quest.au3 index d04130b..6a80b31 100644 --- a/gwApi/quest.au3 +++ b/gwApi/quest.au3 @@ -1,47 +1,48 @@ -#include-once - -#Region Ptr -;~ Description: Returns questptr by questid. -Func GetQuestPtrByID($aQuestID) - If $aQuestID = 0 Then Return MemoryRead($mBasePtr182C + 0x528, 'ptr') - If $QuestBasePtr = 0 Then $QuestBasePtr = MemoryRead($mBasePtr182C + 0x52C, 'ptr') - Local $lQuestPtr = 0 - Local $lQuestID = 0 - Local $lQuestLogSize = MemoryRead($mBasePtr182C + 0x534, 'ptr') - For $i = 0 To $lQuestLogSize - $lQuestID = MemoryRead($QuestBasePtr + 0x34 * $i, 'long') - If $lQuestID = $aQuestID Then Return Ptr($QuestBasePtr + 0x34 * $i) - Next -EndFunc ;==>GetQuestPtrByID - -;~ Description: Returns questptr by number of quest in questlog. -Func GetQuestPtrByLogNumber($aLogNumber) - If $QuestBasePtr = 0 Then $QuestBasePtr = MemoryRead($mBasePtr182C + 0x52C, 'ptr') - Return Ptr($QuestBasePtr + 0x34 * ($aLogNumber - 1)) -EndFunc ;==>GetQuestPtrByLogNumber -#EndRegion Ptr - -#Region Dialogs -;~ Description: Accept a quest from an NPC. -Func AcceptQuest($aQuestID) - Return SendPacket(0x8, 0x35, '0x008' & Hex($aQuestID, 3) & '01') -EndFunc ;==>AcceptQuest - -;~ Description: Accept the reward for a quest. -Func QuestReward($aQuestID) - Return SendPacket(0x8, 0x35, '0x008' & Hex($aQuestID, 3) & '07') -EndFunc ;==>QuestReward - -;~ Description: Abandon a quest. -Func AbandonQuest($aQuestID) - Return SendPacket(0x8, 0xA, $aQuestID) -EndFunc ;==>AbandonQuest -#EndRegion - -#Region QuestState -;~ Description: Request quest data. -Func UpdateQuest($aQuestID) - ToggleQuestWindow() - ToggleQuestWindow() -EndFunc ;==>UpdateQuest -#EndRegion \ No newline at end of file + +#include-once + +#Region Ptr +;~ Description: Returns questptr by questid. +Func GetQuestPtrByID($aQuestID) + If $aQuestID = 0 Then Return MemoryRead($mBasePtr182C + 0x528, 'ptr') + If $QuestBasePtr = 0 Then $QuestBasePtr = MemoryRead($mBasePtr182C + 0x52C, 'ptr') + Local $lQuestPtr = 0 + Local $lQuestID = 0 + Local $lQuestLogSize = MemoryRead($mBasePtr182C + 0x534, 'ptr') + For $i = 0 To $lQuestLogSize + $lQuestID = MemoryRead($QuestBasePtr + 0x34 * $i, 'long') + If $lQuestID = $aQuestID Then Return Ptr($QuestBasePtr + 0x34 * $i) + Next +EndFunc ;==>GetQuestPtrByID + +;~ Description: Returns questptr by number of quest in questlog. +Func GetQuestPtrByLogNumber($aLogNumber) + If $QuestBasePtr = 0 Then $QuestBasePtr = MemoryRead($mBasePtr182C + 0x52C, 'ptr') + Return Ptr($QuestBasePtr + 0x34 * ($aLogNumber - 1)) +EndFunc ;==>GetQuestPtrByLogNumber +#EndRegion Ptr + +#Region Dialogs +;~ Description: Accept a quest from an NPC. +Func AcceptQuest($aQuestID) + Return SendPacket(0x8, $CtoGS_MSG_AbandonQuest, '0x008' & Hex($aQuestID, 3) & '01') +EndFunc ;==>AcceptQuest + +;~ Description: Accept the reward for a quest. +Func QuestReward($aQuestID) + Return SendPacket(0x8, $CtoGS_MSG_AbandonQuest, '0x008' & Hex($aQuestID, 3) & '07') +EndFunc ;==>QuestReward + +;~ Description: Abandon a quest. +Func AbandonQuest($aQuestID) + Return SendPacket(0x8, $CtoGS_MSG_AbandonQuest, $aQuestID) +EndFunc ;==>AbandonQuest +#EndRegion + +#Region QuestState +;~ Description: Request quest data. +Func UpdateQuest($aQuestID) + ToggleQuestWindow() + ToggleQuestWindow() +EndFunc ;==>UpdateQuest +#EndRegion diff --git a/gwApi/skills.au3 b/gwApi/skills.au3 index eddfe03..02785b0 100644 --- a/gwApi/skills.au3 +++ b/gwApi/skills.au3 @@ -1,1529 +1,1530 @@ -#include-once - -#Region Skillbar -;~ Description: Change a skill on the skillbar. -Func SetSkillbarSkill($aSlot, $aSkillID, $aHeroNumber = 0, $aHeroID = GetHeroID($aHeroNumber)) - Return SendPacket(0x14, 0x55, $aHeroID, $aSlot - 1, $aSkillID, 0) -EndFunc ;==>SetSkillbarSkill - -;~ Description: Load all skills onto a skillbar simultaneously. -;~ $aSkillArray[0] -> Skill 1 etc -Func LoadSkillBar(ByRef $aSkillArray, $aHeroNumber = 0, $aHeroID = GetHeroID($aHeroNumber)) - Return SendPacket(0x2C, 0x56, $aHeroID, 8, $aSkillArray[0], $aSkillArray[1], $aSkillArray[2], $aSkillArray[3], $aSkillArray[4], $aSkillArray[5], $aSkillArray[6], $aSkillArray[7]) -EndFunc ;==>LoadSkillBar - -;~ Description: Returns the recharge time remaining of an equipped skill in milliseconds. GetSkillTimer() works not while rendering disabled ! -Func GetSkillbarSkillRecharge($aSkillSlot, $aHeroNumber = 0, $aPtr = GetSkillbarPtr($aHeroNumber)) - $aSkillSlot -= 1 - Local $lTimestamp = MemoryRead($aPtr + 12 + $aSkillSlot * 20, 'dword') - If $lTimestamp = 0 Then Return 0 - Return $lTimestamp - GetSkillTimer() -EndFunc ;==>GetSkillbarSkillRecharge - -;~ Description: Returns skillslots amount of adrenaline. -Func GetSkillbarSkillAdrenaline($aSkillSlot, $aHeroNumber = 0, $aPtr = GetSkillbarPtr($aHeroNumber)) - $aSkillSlot -= 1 - Return MemoryRead($aPtr + 4 + $aSkillSlot * 20, 'long') -EndFunc ;==>GetSkillbarSkillAdrenaline - -#Region Ptr -;~ Description: Returns ptr to skillbar by HeroNumber. -Func GetSkillbarPtr($aHeroNumber = 0, $aHeroID = GetHeroID($aHeroNumber)) - If $HeroPtr1 = 0 Then $HeroPtr1 = MemoryRead($mBasePtr184C + 0x54, 'ptr') - If $SkillbarBasePtr = 0 Then $SkillbarBasePtr = MemoryRead($mBasePtr182C + 0x6F0, 'ptr') - For $i = 0 To MemoryRead($HeroPtr1 + 0x2C) - If MemoryRead($SkillbarBasePtr + $i * 0xBC) = $aHeroID Then Return Ptr($SkillbarBasePtr + $i * 0xBC) - Next -EndFunc ;==>GetSkillbarPtr -#EndRegion Ptr -#EndRegion Skillbar - -#Region LoadSkilltemplate -;~ Description: Loads skill template code. -; NEW VERSION BY 4D 1 USING SET ATTRIBUTES -Func LoadSkillTemplate($aTemplate, $aHeroNumber = 0, $aHeroID = GetHeroID($aHeroNumber), $aCheckPrimary = True) - Local $lString = '' - For $i = 1 To StringLen($aTemplate) - $lString &= Base64ToBin64(StringMid($aTemplate, $i, 1)) - Next - ; Profession - Local $lTemp = Bin64ToDec(StringMid($lString, 9, 2)) * 2 + 4 - Local $lCount = $lTemp + 11 - Local $lPrimaryProf = Bin64ToDec(StringMid($lString, 11, $lTemp)) - If $aCheckPrimary Then - If $aHeroNumber = 0 Then - If MemoryRead(GetAgentPtr($aHeroID) + 266, 'byte') <> $lPrimaryProf Then Return False - Else - If GetHeroProfession($aHeroNumber, False, $aHeroID) <> $lPrimaryProf Then Return False - EndIf - EndIf - Local $lSecondaryProf = Bin64ToDec(StringMid($lString, $lCount, $lTemp)) - ; Attributes - $lCount += $lTemp - Local $lAmount = Bin64ToDec(StringMid($lString, $lCount, 4)) - $lTemp = Bin64ToDec(StringMid($lString, $lCount + 4, 4)) + 4 - $lCount += 8 - Local $lAttributeArray[$lAmount][2] - For $i = 0 To $lAmount - 1 - $lAttributeArray[$i][0] = Bin64ToDec(StringMid($lString, $lCount, $lTemp)) - $lCount += $lTemp - $lAttributeArray[$i][1] = Bin64ToDec(StringMid($lString, $lCount, 4)) - $lCount += 4 - Next - ; Skills - $lTemp = Bin64ToDec(StringMid($lString, $lCount, 4)) + 8 - $lCount += 4 - Local $lSkillArray[8] - For $i = 0 To 7 - $lSkillArray[$i] = Bin64ToDec(StringMid($lString, $lCount, $lTemp)) - $lCount += $lTemp - Next - ChangeSecondProfession($lSecondaryProf, $aHeroNumber, $aHeroID) - SetAttributes($lAttributeArray, $aHeroNumber, $aHeroID) - LoadSkillBar($lSkillArray, $aHeroNumber, $aHeroID) - Return True -EndFunc ;==>LoadSkillTemplate - -;~ Description: Converts Base64 to Bin64. -Func Base64ToBin64($aCharacter) - Select - Case $aCharacter == "A" - Return "000000" - Case $aCharacter == "B" - Return "100000" - Case $aCharacter == "C" - Return "010000" - Case $aCharacter == "D" - Return "110000" - Case $aCharacter == "E" - Return "001000" - Case $aCharacter == "F" - Return "101000" - Case $aCharacter == "G" - Return "011000" - Case $aCharacter == "H" - Return "111000" - Case $aCharacter == "I" - Return "000100" - Case $aCharacter == "J" - Return "100100" - Case $aCharacter == "K" - Return "010100" - Case $aCharacter == "L" - Return "110100" - Case $aCharacter == "M" - Return "001100" - Case $aCharacter == "N" - Return "101100" - Case $aCharacter == "O" - Return "011100" - Case $aCharacter == "P" - Return "111100" - Case $aCharacter == "Q" - Return "000010" - Case $aCharacter == "R" - Return "100010" - Case $aCharacter == "S" - Return "010010" - Case $aCharacter == "T" - Return "110010" - Case $aCharacter == "U" - Return "001010" - Case $aCharacter == "V" - Return "101010" - Case $aCharacter == "W" - Return "011010" - Case $aCharacter == "X" - Return "111010" - Case $aCharacter == "Y" - Return "000110" - Case $aCharacter == "Z" - Return "100110" - Case $aCharacter == "a" - Return "010110" - Case $aCharacter == "b" - Return "110110" - Case $aCharacter == "c" - Return "001110" - Case $aCharacter == "d" - Return "101110" - Case $aCharacter == "e" - Return "011110" - Case $aCharacter == "f" - Return "111110" - Case $aCharacter == "g" - Return "000001" - Case $aCharacter == "h" - Return "100001" - Case $aCharacter == "i" - Return "010001" - Case $aCharacter == "j" - Return "110001" - Case $aCharacter == "k" - Return "001001" - Case $aCharacter == "l" - Return "101001" - Case $aCharacter == "m" - Return "011001" - Case $aCharacter == "n" - Return "111001" - Case $aCharacter == "o" - Return "000101" - Case $aCharacter == "p" - Return "100101" - Case $aCharacter == "q" - Return "010101" - Case $aCharacter == "r" - Return "110101" - Case $aCharacter == "s" - Return "001101" - Case $aCharacter == "t" - Return "101101" - Case $aCharacter == "u" - Return "011101" - Case $aCharacter == "v" - Return "111101" - Case $aCharacter == "w" - Return "000011" - Case $aCharacter == "x" - Return "100011" - Case $aCharacter == "y" - Return "010011" - Case $aCharacter == "z" - Return "110011" - Case $aCharacter == "0" - Return "001011" - Case $aCharacter == "1" - Return "101011" - Case $aCharacter == "2" - Return "011011" - Case $aCharacter == "3" - Return "111011" - Case $aCharacter == "4" - Return "000111" - Case $aCharacter == "5" - Return "100111" - Case $aCharacter == "6" - Return "010111" - Case $aCharacter == "7" - Return "110111" - Case $aCharacter == "8" - Return "001111" - Case $aCharacter == "9" - Return "101111" - Case $aCharacter == "+" - Return "011111" - Case $aCharacter == "/" - Return "111111" - EndSelect -EndFunc ;==>Base64ToBin64 - - ;~ Description: Converts Bin64 to decimal. -Func Bin64ToDec($aBinary) - Local $lReturn = 0 - For $i = 1 To StringLen($aBinary) - If StringMid($aBinary, $i, 1) == 1 Then $lReturn += 2 ^ ($i - 1) - Next - Return $lReturn -EndFunc ;==>Bin64ToDec -#EndRegion LoadSkilltemplate - -#Region Attributes -;~ Description: Set attributes to values in array. -;~ $aAttrArray[0][0] = AttributeID -;~ $aAttrArray[0][1] = AttributeLevel -Func SetAttributes(ByRef $aAttrArray, $aHeronumber = 0, $aHeroID = GetHeroID($aHeroNumber)) - Local $lCount = UBound($aAttrArray) - For $i = 0 To $lCount -1 - DllStructSetData($mSetAttributes, 6, $aAttrArray[$i][0], $i + 1) - DllStructSetData($mSetAttributes, 8, $aAttrArray[$i][1], $i + 1) - Next - DllStructSetData($mSetAttributes, 4, $aHeroID) - DllStructSetData($mSetAttributes, 5, $lCount) ;# of attributes - DllStructSetData($mSetAttributes, 7, $lCount) ;# of attributes - Return Enqueue($mSetAttributesPtr, 152) -EndFunc - -;~ Description: Set attributes to the given values -;~ by ddarek -;~ Usage: Call like this: -;~ SetAttributes("34|36", "12|12") ; to set to 12 both spawning power(=36) and channeling magic(=34) -;~ SetAttributes($ATTR_DIVINE_FAVOR&"|"&$ATTR_HEALING_PRAYERS&"|"&$ATTR_CURSES, "9|12|9") ; to set 3 attributes -Func SetAttributes_($fAttsID, $fAttsLevel, $aHeroNumber = 0, $aHeroID = GetHeroID($aHeroNumber)) - Local $lAttsID = StringSplit(String($fAttsID), "|") - Local $lAttsLevel = StringSplit(String($fAttsLevel), "|") - DllStructSetData($mSetAttributes, 4, $aHeroID) - DllStructSetData($mSetAttributes, 5, $lAttsID[0]) ;# of attributes - DllStructSetData($mSetAttributes, 7, $lAttsID[0]) ;# of attributes - For $i = 1 To $lAttsID[0] - DllStructSetData($mSetAttributes, 6, $lAttsID[$i], $i) - DllStructSetData($mSetAttributes, 8, $lAttsLevel[$i], $i) - Next - Return Enqueue($mSetAttributesPtr, 152) -EndFunc ;==>SetAttributes - -;~ Description: Set the two given Attributes to 12 -;~ Similar to SetAttributes but much faster since this is reusing stuff -Func MaxAttributes($aAtt1ID, $aAtt2ID = 0xFF, $aHeroNumber = 0, $aHeroID = GetHeroID($aHeroNumber)) ; ATTR_NONE = 0xFF - DllStructSetData($mSetAttributes, 4, $aHeroID) - DllStructSetData($mSetAttributes, 5, 3) ;# of attributes - DllStructSetData($mSetAttributes, 6, $aAtt1ID, 1) ;ID ofAttributes - DllStructSetData($mSetAttributes, 6, $aAtt2ID, 2) ;ID ofAttributes - DllStructSetData($mSetAttributes, 7, 3) ;# of attributes - DllStructSetData($mSetAttributes, 8, 13, 1) ;Attribute Levels - DllStructSetData($mSetAttributes, 8, 13, 2) ;Attribute Levels - Return Enqueue($mSetAttributesPtr, 152) -EndFunc ;==>MaxAttributes - -;~ Description: Sets all attributes to 0. -Func ClearAttributes($aHeroNumber = 0, $aHeroID = GetHeroID($aHeroNumber), $aPrimary = 0, $aSecondary = 0) - If $aPrimary = 0 Then - If $aHeroNumber = 0 Then - $aPrimary = MemoryRead(GetAgentPtr($aHeroID) + 266, 'byte') - Else - $aPrimary = GetHeroProfession($aHeroNumber, True, $aHeroID) - $aSecondary = @extended - EndIf - EndIf - If $aSecondary = 0 Then - If $aHeroNumber = 0 Then - $aSecondary = MemoryRead(GetAgentPtr($aHeroID) + 267, 'byte') - Else - $aPrimary = GetHeroProfession($aHeroNumber, True, $aHeroID) - $aSecondary = @extended - EndIf - EndIf - If $aPrimary <> 1 And $aSecondary <> 1 Then - Local $lAtt1 = 17 - Local $lAtt2 = 18 - ElseIf $aPrimary <> 2 And $aSecondary <> 2 Then - Local $lAtt1 = 23 - Local $lAtt2 = 24 - Else - Local $lAtt1 = 13 - Local $lAtt2 = 14 - EndIf - Return MaxAttributes($lAtt1, $lAtt2, $aHeroNumber, $aHeroID) -EndFunc - -;~ Description: Returns profession number. -Func GetProfessionByAttribute($aAttr) - Switch $aAttr - Case 0,1,2,3 ; $ATTRIB_FastCasting, $ATTRIB_IllusionMagic, $ATTRIB_DominationMagic, $ATTRIB_InspirationMagic - Return 5 ; $PROFESSION_Mesmer - Case 4,5,6,7 ; $ATTRIB_BloodMagic, $ATTRIB_DeathMagic, $ATTRIB_SoulReaping, $ATTRIB_Curses - Return 4 ; $PROFESSION_Necromancer - Case 8,9,10,11,12 ; $ATTRIB_AirMagic, $ATTRIB_EarthMagic, $ATTRIB_FireMagic, $ATTRIB_WaterMagic, $ATTRIB_EnergyStorage - Return 6 ; $PROFESSION_Elementalist - Case 13,14,15,16 ; $ATTRIB_HealingPrayers, $ATTRIB_SmitingPrayers, $ATTRIB_ProtectionPrayers, $ATTRIB_DivineFavor - Return 3 ; $PROFESSION_Monk - Case 17,18,19,20,21 ; $ATTRIB_Strength, $ATTRIB_AxeMastery, $ATTRIB_HammerMastery, $ATTRIB_Swordsmanship, $ATTRIB_Tactics - Return 1 ; $PROFESSION_Warrior - Case 22,23,24,25 ; $ATTRIB_BeastMastery, $ATTRIB_Expertise, $ATTRIB_WildernessSurvival, $ATTRIB_Marksmanship - Return 2 ; $PROFESSION_Ranger - Case 29,30,31,35 ; $ATTRIB_DaggerMastery, $ATTRIB_DeadlyArts, $ATTRIB_ShadowArts, $ATTRIB_CriticalStrikes - Return 7 ; $PROFESSION_Assassin - Case 32,33,36,36 ; $ATTRIB_Communing, $ATTRIB_RestorationMagic, $ATTRIB_ChannelingMagic, $ATTRIB_SpawningPower - Return 8 ; $PROFESSION_Ritualist - Case 37,38,39,40 ; $ATTRIB_SpearMastery, $ATTRIB_Command, $ATTRIB_Motivation, $ATTRIB_Leadership - Return 9 ; $PROFESSION_Paragon - Case 41,42,43,44 ; $ATTRIB_ScytheMastery, $ATTRIB_WindPrayers, $ATTRIB_EarthPrayers, $ATTRIB_Mysticism - Return 10 ; $PROFESSION_Dervish - Case Else - Return 0 ; $PROFESSION_None - EndSwitch -EndFunc ;==>GetProfessionByAttribute - -;~ Description: Returns secondary attributes. -Func GetSecondaryAttributesByProfession($aProf) - Switch $aProf - Case 0 ; $PROFESSION_None - Local $ret[1] = [0] - Case 5 ; $PROFESSION_Mesmer - Local $ret[4] = [3,2,1,3] ; $ATTRIB_DominationMagic, $ATTRIB_IllusionMagic, $ATTRIB_InspirationMagic] - Case 4 ; $PROFESSION_Necromancer - Local $ret[4] = [3,4,5,7] ; $ATTRIB_BloodMagic, $ATTRIB_DeathMagic, $ATTRIB_Curses] - Case 6 ; $PROFESSION_Elementalist - Local $ret[5] = [4,8,9,10,11] ; $ATTRIB_AirMagic, $ATTRIB_EarthMagic, $ATTRIB_FireMagic, $ATTRIB_WaterMagic] - Case 3 ; $PROFESSION_Monk - Local $ret[4] = [3,13,14,15] ; $ATTRIB_HealingPrayers, $ATTRIB_ProtectionPrayers, $ATTRIB_SmitingPrayers] - Case 1 ; $PROFESSION_Warrior - Local $ret[5] = [4,18,19,20,21] ; $ATTRIB_AxeMastery, $ATTRIB_HammerMastery, $ATTRIB_Swordsmanship, $ATTRIB_Tactics] - Case 2 ; $PROFESSION_Ranger - Local $ret[4] = [3,22,24,25] ; $ATTRIB_BeastMastery, $ATTRIB_WildernessSurvival, $ATTRIB_Marksmanship] - Case 7 ; $PROFESSION_Assassin - Local $ret[4] = [3,29,30,31] ; $ATTRIB_DaggerMastery, $ATTRIB_DeadlyArts, $ATTRIB_ShadowArts] - Case 8 ; $PROFESSION_Ritualist - Local $ret[4] = [3,32,33,34] ; $ATTRIB_Communing, $ATTRIB_RestorationMagic, $ATTRIB_ChannelingMagic] - Case 9 ; $PROFESSION_Paragon - Local $ret[4] = [3,37,38,39] ; $ATTRIB_SpearMastery, $ATTRIB_Command, $ATTRIB_Motivation] - Case 10 ; $PROFESSION_Dervish - Local $ret[4] = [3,41,42,43] ; $ATTRIB_ScytheMastery, $ATTRIB_WindPrayers, $ATTRIB_EarthPrayers] - EndSwitch - Return $ret -EndFunc ;==>GetSecondaryAttributesByProfession - -;~ Description: Returns main attribute by profession number. -Func GetProfPrimaryAttribute($aProfession) - Switch $aProfession - Case 1 - Return 17 - Case 2 - Return 23 - Case 3 - Return 16 - Case 4 - Return 6 - Case 5 - Return 0 - Case 6 - Return 12 - Case 7 - Return 35 - Case 8 - Return 36 - Case 9 - Return 40 - Case 10 - Return 44 - EndSwitch -EndFunc ;==>GetProfPrimaryAttribute -#EndRegion - -#Region Single Skills -;~ Description: Checks if skill given (by number in bar) is recharged. Returns True if recharged, otherwise False. -Func IsRecharged($aSkillSlot, $aHeroNumber = 0, $aPtr = GetSkillbarPtr($aHeroNumber)) - Return GetSkillbarSkillRecharge($aSkillSlot, $aHeroNumber, $aPtr) = 0 -EndFunc ;==>IsRecharged - -;~ Description: Returns the skill ID of an equipped skill. -Func GetSkillbarSkillID($aSkillSlot, $aHeroNumber = 0, $aPtr = GetSkillbarPtr($aHeroNumber)) - $aSkillSlot -= 1 - Return MemoryRead($aPtr + 16 + $aSkillSlot * 20, 'dword') -EndFunc ;==>GetSkillbarSkillID - -;~ Description: Returns the timestamp used for effects and skills (milliseconds). Only works when rendering enabled. -Func GetSkillTimer() - Return MemoryRead($mSkillTimer, "long") -EndFunc ;==>GetSkillTimer - -;~ Description: Returns skill dmg. -Func SkillDamageAmount($aSkill) - If IsPtr($aSkill) <> 0 Then - Return MemoryRead($aSkill + 96, 'long') - ElseIf IsDllStruct($aSkill) <> 0 Then - Return DllStructGetData($aSkill, 'Scale15') - Else - Return MemoryRead(GetSkillPtr($aSkill) + 96, 'long') - EndIf -EndFunc ;==>SkillDamageAmount - -;~ Description: Returns skill aoe range. -Func SkillAOERange($aSkill) - If IsPtr($aSkill) <> 0 Then - Return MemoryRead($aSkill + 108, 'float') - ElseIf IsDllStruct($aSkill) <> 0 Then - Return DllStructGetData($aSkill, 'AoERange') - Else - Return MemoryRead(GetSkillPtr($aSkill) + 108, 'float') - EndIf -EndFunc ;==>SkillAOERange - -;~ Description: Returns skill recharge. -Func SkillRecharge($aSkill) - If IsPtr($aSkill) <> 0 Then - Return MemoryRead($aSkill + 76, 'long') - ElseIf IsDllStruct($aSkill) <> 0 Then - Return DllStructGetData($aSkill, 'Recharge') - Else - Return MemoryRead(GetSkillPtr($aSkill) + 76, 'long') - EndIf -EndFunc ;==>SkillRecharge - -;~ Description: Returns skill activationtime. -Func SkillActivation($aSkill) - If IsPtr($aSkill) <> 0 Then - Return MemoryRead($aSkill + 60, 'float') - ElseIf IsDllStruct($aSkill) <> 0 Then - Return DllStructGetData($aSkill, 'Activation') - Else - Return MemoryRead(GetSkillPtr($aSkill) + 60, 'float') - EndIf -EndFunc ;==>SkillActivation - -;~ Description: Returns skill attribute. -Func SkillAttribute($aSkill) - If IsPtr($aSkill) <> 0 Then - Return MemoryRead($aSkill + 41, 'byte') - ElseIf IsDllStruct($aSkill) <> 0 Then - Return DllStructGetData($aSkill, 'Attribute') - Else - Return MemoryRead(GetSkillPtr($aSkill) + 41, 'byte') - EndIf -EndFunc ;==>SkillAttribute - -#Region Type -;~ Description: Returns true if skill is hex spell, false if not. -Func IsHexSpell($aSkill) - If IsPtr($aSkill) <> 0 Then - Return MemoryRead($aSkill + 12, 'long') = 4 - ElseIf IsDllStruct($aSkill) <> 0 Then - Return DllStructGetData($aSkill, 'Type') = 4 - Else - Return MemoryRead(GetSkillPtr($aSkill) + 12, 'long') = 4 - EndIf -EndFunc ;==>IsHexSpell - -;~ Description: Returns true if skill is condition spell, false if not. -Func IsConditionSpell($aSkill) - If IsPtr($aSkill) <> 0 Then - Return MemoryRead($aSkill + 12, 'long') = 8 - ElseIf IsDllStruct($aSkill) <> 0 Then - Return DllStructGetData($aSkill, 'Type') = 8 - Else - Return MemoryRead(GetSkillPtr($aSkill) + 12, 'long') = 8 - EndIf -EndFunc ;==>IsConditionSpell - -;~ Description: Returns true if skill is enchantment spell, false if not. -Func IsEnchantmentSkill($aSkill) - If IsPtr($aSkill) <> 0 Then - Return MemoryRead($aSkill + 12, 'long') = 6 - ElseIf IsDllStruct($aSkill) <> 0 Then - Return DllStructGetData($aSkill, 'Type') = 6 - Else - Return MemoryRead(GetSkillPtr($aSkill) + 12, 'long') = 6 - EndIf -EndFunc ;==>IsEnchantmentSkill - -;~ Description: Returns true if skill is attack skill, false if not. -Func IsAttackSkill($aSkill) - If IsPtr($aSkill) <> 0 Then - Return MemoryRead($aSkill + 12, 'long') = 14 - ElseIf IsDllStruct($aSkill) <> 0 Then - Return DllStructGetData($aSkill, 'Type') = 14 - Else - Return MemoryRead(GetSkillPtr($aSkill) + 12, 'long') = 14 - EndIf -EndFunc ;==>IsAttackSkill -#EndRegion - -#Region Requirements -;~ Description: Returns true if skill requires bleeding. -Func SkillRequiresBleeding($aSkill) - If IsPtr($aSkill) <> 0 Then - Return BitAND(MemoryRead($aSkill + 28, 'long'), 1) - ElseIf IsDllStruct($aSkill) <> 0 Then - Return BitAND(DllStructGetData($aSkill, 'Condition'), 1) - Else - Return BitAND(MemoryRead(GetSkillPtr($aSkill) + 28, 'long'), 1) - EndIf -EndFunc ;==>SkillRequiresBleeding - -;~ Description: Returns true if skill requires burning. -Func SkillRequiresBurning($aSkill) - If IsPtr($aSkill) <> 0 Then - Return BitAND(MemoryRead($aSkill + 28, 'long'), 4) - ElseIf IsDllStruct($aSkill) <> 0 Then - Return BitAND(DllStructGetData($aSkill, 'Condition'), 4) - Else - Return BitAND(MemoryRead(GetSkillPtr($aSkill) + 28, 'long'), 4) - EndIf -EndFunc ;==>SkillRequiresBurning - -;~ Description: Returns true if skill requires cripple. -Func SkillRequiresCripple($aSkill) - If IsPtr($aSkill) <> 0 Then - Return BitAND(MemoryRead($aSkill + 28, 'long'), 8) - ElseIf IsDllStruct($aSkill) <> 0 Then - Return BitAND(DllStructGetData($aSkill, 'Condition'), 8) - Else - Return BitAND(MemoryRead(GetSkillPtr($aSkill) + 28, 'long'), 8) - EndIf -EndFunc ;==>SkillRequiresCripple - -;~ Description: Returns true if skill requires deep wound. -Func SkillRequiresDeepWound($aSkill) - If IsPtr($aSkill) <> 0 Then - Return BitAND(MemoryRead($aSkill + 28, 'long'), 16) - ElseIf IsDllStruct($aSkill) <> 0 Then - Return BitAND(DllStructGetData($aSkill, 'Condition'), 16) - Else - Return BitAND(MemoryRead(GetSkillPtr($aSkill) + 28, 'long'), 16) - EndIf -EndFunc ;==>SkillRequiresDeepWound - -;~ Description: Returns true if skill requires earth hex. -Func SkillRequiresEarthHex($aSkill) - If IsPtr($aSkill) <> 0 Then - Return BitAND(MemoryRead($aSkill + 28, 'long'), 64) - ElseIf IsDllStruct($aSkill) <> 0 Then - Return BitAND(DllStructGetData($aSkill, 'Condition'), 64) - Else - Return BitAND(MemoryRead(GetSkillPtr($aSkill) + 28, 'long'), 64) - EndIf -EndFunc ;==>SkillRequiresEarthHex - -;~ Description: Returns true if skill requires target knocked down. -Func SkillRequiresKnockDown($aSkill) - If IsPtr($aSkill) <> 0 Then - Return BitAND(MemoryRead($aSkill + 28, 'long'), 128) - ElseIf IsDllStruct($aSkill) <> 0 Then - Return BitAND(DllStructGetData($aSkill, 'Condition'), 128) - Else - Return BitAND(MemoryRead(GetSkillPtr($aSkill) + 28, 'long'), 128) - EndIf -EndFunc ;==>SkillRequiresKnockDown - -;~ Description: Returns true if skill requires weakness. -Func SkillRequiresWeakness($aSkill) - If IsPtr($aSkill) <> 0 Then - Return BitAND(MemoryRead($aSkill + 28, 'long'), 1024) - ElseIf IsDllStruct($aSkill) <> 0 Then - Return BitAND(DllStructGetData($aSkill, 'Condition'), 1024) - Else - Return BitAND(MemoryRead(GetSkillPtr($aSkill) + 28, 'long'), 1024) - EndIf -EndFunc ;==>SkillRequiresWeakness - -;~ Description: Returns true if skill requires water hex. -Func SkillRequiresWaterHex($aSkill) - If IsPtr($aSkill) <> 0 Then - Return BitAND(MemoryRead($aSkill + 28, 'long'), 2048) - ElseIf IsDllStruct($aSkill) <> 0 Then - Return BitAND(DllStructGetData($aSkill, 'Condition'), 2048) - Else - Return BitAND(MemoryRead(GetSkillPtr($aSkill) + 28, 'long'), 2048) - EndIf -EndFunc ;==>SkillRequiresWaterHex - -;~ Description: Returns true if skill interrupts target. -Func IsInterruptSkill($aSkill) - If IsPtr($aSkill) <> 0 Then - Local $lSkillID = MemoryRead($aSkill, 'long') - ElseIf IsDllStruct($aSkill) <> 0 Then - Local $lSkillID = DllStructGetData($aSkill, 'ID') - Else - Local $lSkillID = $aSkill - EndIf - Switch $lSkillID - Case 2358; $SKILLID_You_Move_Like_a_Dwarf - Return True - Case 2066; $SKILLID_Disarm - Return True - Case 340; $SKILLID_Disrupting_Chop - Return True - Case 325; $SKILLID_Distracting_Blow - Return True - Case 399; $SKILLID_Distracting_Shot - Return True - Case 2194; $SKILLID_Distracting_Strike - Return True - Case 390; $SKILLID_Savage_Slash - Return True - Case 329; $SKILLID_Skull_Crack - Return True - Case 2143; $SKILLID_Disrupting_Shot - Return True - Case 1726; $SKILLID_Magebane_Shot - Return True - Case 409; $SKILLID_Punishing_Shot - Return True - Case 426; $SKILLID_Savage_Shot - Return True - Case 61; $SKILLID_Leech_Signet - Return True - Case 1057; $SKILLID_Psychic_Instability - Return True - Case 1350; $SKILLID_Simple_Thievery - Return True - Case 228; $SKILLID_Thunderclap - Return True - Case 1025; $SKILLID_Disrupting_Stab - Return True - Case 975; $SKILLID_Exhausting_Assault - Return True - Case 1538; $SKILLID_Lyssas_Assault - Return True - Case 1512; $SKILLID_Lyssas_Haste - Return True - Case 445; $SKILLID_Disrupting_Lunge - Return True - Case 932; $SKILLID_Complicate - Return True - Case 57; $SKILLID_Cry_of_Frustration - Return True - Case 1053; $SKILLID_Psychic_Distraction - Return True - Case 1342; $SKILLID_Tease - Return True - Case 1344; $SKILLID_Web_of_Disruption - Return True - Case 571; $SKILLID_Disrupting_Dagger - Return True - Case 860; $SKILLID_Signet_of_Disruption - Return True - Case 1992; $SKILLID_Signet_of_Distraction - Return True - Case 988; $SKILLID_Temple_Strike - Return True - Case 5; $SKILLID_Power_Block - Return True - Case 25; $SKILLID_Power_Drain - Return True - Case 953; $SKILLID_Power_Flux - Return True - Case 24; $SKILLID_Power_Leak - Return True - Case 803; $SKILLID_Power_Leech - Return True - Case 1994; $SKILLID_Power_Lock - Return True - Case 931; $SKILLID_Power_Return - Return True - Case 23; $SKILLID_Power_Spike - Return True - Case Else - Return False - EndSwitch -EndFunc ;==>IsInterruptSkill - -;~ Description: Returns true if skill is a weapon spell. -Func IsWeaponSpell($aSkill) -If IsPtr($aSkill) <> 0 Then - Return MemoryRead($aSkill + 12, 'long') = 25 - ElseIf IsDllStruct($aSkill) <> 0 Then - Return DllStructGetData($aSkill, 'Type') = 25 - Else - Return MemoryRead(GetSkillPtr($aSkill) + 12, 'long') = 25 - EndIf -EndFunc ;==>IsWeaponSpell - -;~ Description: Returns true if skill requires a condition. -Func SkillRequiresCondition($aSkill) - If IsPtr($aSkill) <> 0 Then - Local $lSkillID = MemoryRead($aSkill, 'long') - ElseIf IsDllStruct($aSkill) <> 0 Then - Local $lSkillID = DllStructGetData($aSkill, 'ID') - Else - Local $lSkillID = $aSkill - EndIf - Switch $lSkillID - Case 365; $SKILLID_Victory_is_Mine - Return True - Case 1137; $SKILLID_Yeti_Smash - Return True - Case 870; $SKILLID_Pestilence - Return True - Case 440; $SKILLID_Scavenger_Strike - Return True - Case 1471; $SKILLID_Scavengers_Focus - Return True - Case 817; $SKILLID_Discord - Return True -;~ Case 2103; $SKILLID_Necrosis -;~ Return True - Case 864; $SKILLID_Oppressive_Gaze - Return True - Case 1950; $SKILLID_Signet_of_Corruption - Return True - Case 828; $SKILLID_Vile_Miasma - Return True - Case 107; $SKILLID_Virulence - Return True - Case 78; $SKILLID_Epidemic - Return True - Case 1333; $SKILLID_Extend_Conditions - Return True - Case 55; $SKILLID_Fevered_Dreams - Return True - Case 19; $SKILLID_Fragility - Return True - Case 1334; $SKILLID_Hypochondria - Return True - Case 217; $SKILLID_Crystal_Wave - Return True - Case 786; $SKILLID_Iron_Palm - Return True - Case 1633; $SKILLID_Malicious_Strike - Return True - Case 1991; $SKILLID_Sadists_Signet - Return True - Case 1034; $SKILLID_Seeping_Wound - Return True - Case 2186; $SKILLID_Signet_of_Deadly_Corruption - Return True - Case 1036; $SKILLID_Signet_of_Malice - Return True - Case 1604; $SKILLID_Disrupting_Throw - Return True - Case 1957; $SKILLID_Spear_of_Fury - Return True - Case 1602; $SKILLID_Stunning_Strike - Return True - Case 1515; $SKILLID_Armor_of_Sanctity - Return True - Case 1486; $SKILLID_Reap_Impurities - Return True - Case Else - Return False - EndSwitch -EndFunc ;==>SkillRequiresCondition - -;~ Description: Returns true if skill requires hexed target. -Func SkillRequiresHex($aSkill) - If IsPtr($aSkill) <> 0 Then - Local $lSkillID = MemoryRead($aSkill, 'long') - ElseIf IsDllStruct($aSkill) <> 0 Then - Local $lSkillID = DllStructGetData($aSkill, 'ID') - Else - Local $lSkillID = $aSkill - EndIf - Switch $lSkillID - Case 303; $SKILLID_Convert_Hexes - Return True - Case 2003; $SKILLID_Cure_Hex - Return True - Case 1692; $SKILLID_Divert_Hexes - Return True - Case 848; $SKILLID_Reverse_Hex - Return True - Case 302; $SKILLID_Smite_Hex - Return True - Case 1337; $SKILLID_Drain_Delusions - Return True - Case 1059; $SKILLID_Hex_Eater_Signet - Return True - Case 1348; $SKILLID_Hex_Eater_Vortex - Return True - Case 22; $SKILLID_Inspired_Hex - Return True - Case 1049; $SKILLID_Revealed_Hex - Return True - Case 27; $SKILLID_Shatter_Delusions - Return True - Case 67; $SKILLID_Shatter_Hex - Return True - Case Else - Return False - EndSwitch -EndFunc ;==>SkillRequiresHex - -;~ Description: Returns true if skill is a summoning skill. -Func IsSummonSkill($aSkill) - If IsPtr($aSkill) <> 0 Then - Local $lSkillID = MemoryRead($aSkill, 'long') - ElseIf IsDllStruct($aSkill) <> 0 Then - Local $lSkillID = DllStructGetData($aSkill, 'ID') - Else - Local $lSkillID = $aSkill - EndIf - Switch $lSkillID - Case 2226; $SKILLID_Summon_Ice_Imp - Return True - Case 2224; $SKILLID_Summon_Mursaat - Return True - Case 2227; $SKILLID_Summon_Naga_Shaman - Return True - Case 2225; $SKILLID_Summon_Ruby_Djinn - Return True - Case Else - Return False - EndSwitch -EndFunc ;==>IsSummonSkill - -;~ Description: Returns true if skill is an anti melee skill. -Func IsAntiMeleeSkill($aSkill) - If IsPtr($aSkill) <> 0 Then - Local $lSkillID = MemoryRead($aSkill, 'long') - ElseIf IsDllStruct($aSkill) <> 0 Then - Local $lSkillID = DllStructGetData($aSkill, 'ID') - Else - Local $lSkillID = $aSkill - EndIf - Switch $lSkillID - Case 1130; $SKILLID_Spear_of_Light - Return True - Case 240; $SKILLID_Smite - Return True - Case 2006; $SKILLID_Castigation_Signet - Return True - Case 296; $SKILLID_Bane_Signet - Return True - Case 1657; $SKILLID_Signet_of_Clumsiness - Return True - Case 294; $SKILLID_Signet_of_Judgment - Return True - Case 47; $SKILLID_Ineptitude - Return True - Case 43; $SKILLID_Clumsiness - Return True - Case 2056; $SKILLID_Wandering_Eye - Return True - Case Else - Return False - EndSwitch -EndFunc ;==>IsAntiMeleeSkill -#EndRegion - -#Region Special -;~ Description: Returns true if skill is elite skill. -Func IsEliteSkill($aSkill) - If IsPtr($aSkill) <> 0 Then - Return MemoryRead($aSkill + 16, 'long') = 4 - ElseIf IsDllStruct($aSkill) <> 0 Then - Return DllStructGetData($aSkill, 'Special') = 4 - Else - Return MemoryRead(GetSkillPtr($aSkill) + 16, 'long') = 4 - EndIf -EndFunc ;==>IsEliteSkill - -;~ Description: Returns true if skill is pve skill. -Func IsPvESkill($aSkill) - If IsPtr($aSkill) <> 0 Then - Return BitAND(MemoryRead($aSkill + 16, 'long'), 524288) - ElseIf IsDllStruct($aSkill) <> 0 Then - Return BitAND(DllStructGetData($aSkill, 'Special'), 524288) - Else - Return BitAND(MemoryRead(GetSkillPtr($aSkill) + 16, 'long'), 524288) - EndIf -EndFunc ;==>IsPvESkill -#EndRegion - -#Region Skilltypes -;~ Description: Returns true if skillid uses skills that affect or summon ritualist spirits. -Func IsSpiritSkill($aSkill) ; Spirits (Binding Rituals) - If IsPtr($aSkill) <> 0 Then - Local $lSkillID = MemoryRead($aSkill, 'long') - ElseIf IsDllStruct($aSkill) <> 0 Then - Local $lSkillID = DllStructGetData($aSkill, 'ID') - Else - Local $lSkillID = $aSkill - EndIf - Switch $lSkillID - Case 1239; $SKILLID_Signet_of_Spirits - Return True - Case 2205; $SKILLID_Agony - Return True - Case 1745; $SKILLID_Anguish - Return True - Case 1253; $SKILLID_Bloodsong - Return True - Case 2656; $SKILLID_Call_to_the_Spirit_Realm - Return True - Case 920; $SKILLID_Destruction - Return True - Case 923; $SKILLID_Disenchantment - Return True - Case 1249; $SKILLID_Displacement - Return True - Case 921; $SKILLID_Dissonance - Return True - Case 1252; $SKILLID_Earthbind - Return True - Case 1747; $SKILLID_Empowerment - Return True - Case 1734; $SKILLID_Gaze_of_Fury - Return True - Case 1251; $SKILLID_Life - Return True - Case 1901; $SKILLID_Jack_Frost - Return True - Case 1247; $SKILLID_Pain - Return True - Case 1250; $SKILLID_Preservation - Return True - Case 1748; $SKILLID_Recovery - Return True - Case 981; $SKILLID_Recuperation - Return True - Case 2204; $SKILLID_Rejuvenation - Return True - Case 963; $SKILLID_Restoration - Return True - Case 871; $SKILLID_Shadowsong - Return True - Case 982; $SKILLID_Shelter - Return True - Case 1266; $SKILLID_Soothing - Return True - Case 911; $SKILLID_Union - Return True - Case 2110; $SKILLID_Vampirism - Return True - Case 1255; $SKILLID_Wanderlust - Return True - Case Else - Return False - EndSwitch -EndFunc ;==>IsSpiritSkill - -;~ Description: Returns true if skillid is skill that strips enchantment. -Func IsEnchantmentStrip($aSkill) ; - If IsPtr($aSkill) <> 0 Then - Local $lSkillID = MemoryRead($aSkill, 'long') - ElseIf IsDllStruct($aSkill) <> 0 Then - Local $lSkillID = DllStructGetData($aSkill, 'ID') - Else - Local $lSkillID = $aSkill - EndIf - Switch $lSkillID -;~ Necro Skills - Case 144 ; $SKILLID_Chillblains - Return True - Case 1362 ; $SKILLID_Corrupt_Enchantment ; Elite - Return True - Case 936 ; $SKILLID_Envenom_Enchantments - Return True - Case 763 ; $SKILLID_Jaundiced_Gaze - Return True - Case 1359 ; $SKILLID_Pain_of_Disenchantment ; Elite - Return True - Case 141 ; $SKILLID_Rend_Enchantments - Return True - Case 955 ; $SKILLID_Rip_Enchantment - Return True - Case 143 ; $SKILLID_Strip_Enchantment - Return True -;~ Mesmer Skills - Case 1656 ; $SKILLID_Air_of_Disenchantment ; Elite - Return True - Case 1347 ; $SKILLID_Discharge_Enchantment - Return True - Case 68 ; $SKILLID_Drain_Enchantment - Return True - Case 1061 ; $SKILLID_Feedback - Return True - Case 21 ; $SKILLID_Inspired_Enchantment - Return True - Case 877 ; $SKILLID_Lyssas_Balance - Return True - Case 1349 ; $SKILLID_Mirror_of_Disenchantment - Return True - Case 1048 ; $SKILLID_Revealed_Enchantment - Return True - Case 69 ; $SKILLID_Shatter_Enchantment - Return True - Case 933 ; $SKILLID_Shatter_Storm ; Elite - Return True - Case 882 ; $SKILLID_Signet_of_Disenchantment - Return True -;~ Assassin Skills - Case 1643 ; $SKILLID_Assault_Enchantments ; Elite - Return True - Case 990 ; $SKILLID_Expunge_Enchantments - Return True - Case 1645 ; $SKILLID_Lift_Enchantment - Return True - Case 1634 ; $SKILLID_Shattering_Assault ; Elite - Return True - Case 1648 ; $SKILLID_Signet_of_Twilight ; I would not use this, requires a hexed target - Return True -;~ Dervish Skills I left out the ones that enchant the derv and its hits take away an enchantment. - Case 1534 ; $SKILLID_Rending_Touch - Return True - Case 1545 ; $SKILLID_Test_of_Faith - Return True - Case Else - Return False - EndSwitch -EndFunc ;==>IsEnchantmentStrip - -;~ Description: Returns true if skill can be considered a healing skill. -Func IsHealSkill($aSkill) - If IsPtr($aSkill) <> 0 Then - If BitAND(MemoryRead($aSkill + 24, 'long'), 4096) Then Return True - Local $lSkillEffect2 = MemoryRead($aSkill + 32, 'long') - If BitAnd($lSkillEffect2, 2) Or BitAnd($lSkillEffect2, 4) Then Return True - Local $lSkillAttribute = MemoryRead($aSkill + 41, 'byte') - ElseIf IsDllStruct($aSkill) <> 0 Then - If BitAND(DllStructGetData($aSkill, 'Effect1'), 4096) Then Return True - Local $lSkillEffect2 = DllStructGetData($aSkill, 'Effect2') - If BitAnd($lSkillEffect2, 2) Or BitAnd($lSkillEffect2, 4) Then Return True - Local $lSkillAttribute = DllStructGetData($aSkill, 'Attribute') - Else - Local $lPtr = GetAgentPtr($aSkill) - If BitAND(MemoryRead($lPtr + 24, 'long'), 4096) Then Return True - Local $lSkillEffect2 = MemoryRead($lPtr + 32, 'long') - If BitAnd($lSkillEffect2, 2) Or BitAnd($lSkillEffect2, 4) Then Return True - Local $lSkillAttribute = MemoryRead($lPtr + 41, 'byte') - EndIf - Switch $lSkillAttribute - Case 13,15,16 ; $ATTRIB_HealingPrayers, $ATTRIB_ProtectionPrayers, $ATTRIB_DivineFavor - Return True - Case Else - Return False - EndSwitch -EndFunc ;==>IsHealSkill - -;~ Description: Returns true if skill is a rez skill. -Func IsResSkill($aSkill) - If IsPtr($aSkill) <> 0 Then - Local $lSkillID = MemoryRead($aSkill, 'long') - ElseIf IsDllStruct($aSkill) <> 0 Then - Local $lSkillID = DllStructGetData($aSkill, 'ID') - Else - Local $lSkillID = $aSkill - EndIf - Switch $lSkillID - Case 2217 ; $SKILLID_By_Urals_Hammer - Return True - Case 1592 ; $SKILLID_We_Shall_Return - Return True - Case 2872 ; $SKILLID_Death_Pact_Signet - Return True - Case 2109 ; $SKILLID_Eternal_Aura - Return True - Case 791 ; $SKILLID_Flesh_of_my_Flesh - Return True - Case 1865 ; $SKILLID_Junundu_Wail - Return True - Case 304 ; $SKILLID_Light_of_Dwayna - Return True - Case 1222 ; $SKILLID_Lively_Was_Naomei - Return True - Case 306 ; $SKILLID_Rebirth - Return True - Case 1263 ; $SKILLID_Renew_Life - Return True - Case 963 ; $SKILLID_Restoration - Return True - Case 314 ; $SKILLID_Restore_Life - Return True - Case 305 ; $SKILLID_Resurrect - Return True - Case 1128 ; $SKILLID_Resurrection_Chant - Return True - Case 2 ; $SKILLID_Resurrection_Signet - Return True - Case 1778 ; $SKILLID_Signet_of_Return - Return True - Case 1816 ; $SKILLID_Sunspear_Rebirth_Signet - Return True - Case 268 ; $SKILLID_Unyielding_Aura - Return True - Case 315 ; $SKILLID_Vengeance - Return True - Case Else - Return False - EndSwitch -EndFunc ;==>IsResSkill - -;~ Description: Returns true if skill requires target to be below 50%. -Func IsBelow50PercentEnemySkill($aSkill) ; - If IsPtr($aSkill) <> 0 Then - Local $lSkillID = MemoryRead($aSkill, 'long') - ElseIf IsDllStruct($aSkill) <> 0 Then - Local $lSkillID = DllStructGetData($aSkill, 'ID') - Else - Local $lSkillID = $aSkill - EndIf - Switch $lSkillID -;~ PvE only skills - Case 2353 ; $SKILLID_Finish_Him - Return True -;~ Warrior Skills - Case 385 ; $SKILLID_Final_Thrust ; Bonus damage triggers below 50% - Return True -;~ Ranger Skills - Case 444 ; $SKILLID_Burtal_Strike ; Bonus damage triggers below 50% - Return True - Case 1197 ; $SKILLID_Needling_Shot - Return True -;~ Monk Skills - Case 282 ; $SKILLID_Word_of_Healing ; Elite Healing skill - Return True - Case 1687 ; $SKILLID_Zealous_Benediction ; Elite Protection Skill - Return True -;~ Necro Skills - Case 1365 ; $SKILLID_Signet_of_Lost_Souls - Return True - Case 1069 ; $SKILLID_Taste_of_Pain - Return True -;~ Assassin Skills (ignoring self target skills like Shadow Shroud and Moebius Strike) - Case 1646 ; $SKILLID_Augury_of_Death ; shadow steps to them when <50% health - Return True -;~ignored all self targetting skills that trigger on <50% - Case Else - Return False - EndSwitch -EndFunc ;==>IsBelow50PercentEnemySkill - -;~ Description: Returns true if skill is a hex removal skill. -Func IsHexRemovalSkill($aSkill) - If IsPtr($aSkill) <> 0 Then - Return BitAND(MemoryRead($aSkill + 32, 'long'), 2048) - ElseIf IsDllStruct($aSkill) <> 0 Then - Return BitAND(DllStructGetData($aSkill, 'Effect2'), 2048) - Else - Return BitAND(MemoryRead(GetSkillPtr($aSkill) + 32, 'long'), 2048) - EndIf -EndFunc ;==>IsHexRemovalSkill - -;~ Description: Returns true if skill is a condition removal skill. -Func IsConditionRemovalSkill($aSkill) - If IsPtr($aSkill) <> 0 Then - Return BitAND(MemoryRead($aSkill + 32, 'long'), 4096) - ElseIf IsDllStruct($aSkill) <> 0 Then - Return BitAND(DllStructGetData($aSkill, 'Effect2'), 4096) - Else - Return BitAND(MemoryRead(GetSkillPtr($aSkill) + 32, 'long'), 4096) - EndIf -EndFunc ;==>IsConditionRemovalSkill -#EndRegion - -#Region Target -;~ Description: Returns true if skill is a self-target skill. -Func TargetSelfSkill($aSkill) - If IsPtr($aSkill) <> 0 Then - Return MemoryRead($aSkill + 49, 'byte') = 0 - ElseIf IsDllStruct($aSkill) <> 0 Then - Return DllStructGetData($aSkill, 'Target') = 0 - Else - Return MemoryRead(GetSkillPtr($aSkill) + 49, 'byte') = 0 - EndIf -EndFunc ;==>TargetSelfSkill - -;~ Description: Returns true if skill is a spirit-target skill. -Func TargetSpiritSkill($aSkill) - If IsPtr($aSkill) <> 0 Then - Return MemoryRead($aSkill + 49, 'byte') = 1 - ElseIf IsDllStruct($aSkill) <> 0 Then - Return DllStructGetData($aSkill, 'Target') = 1 - Else - Return MemoryRead(GetSkillPtr($aSkill) + 49, 'byte') = 1 - EndIf -EndFunc ;==>TargetSpiritSkill - -;~ Description: Returns true if skill works on allies. -Func TargetAllySkill($aSkill) - If IsPtr($aSkill) <> 0 Then - Return MemoryRead($aSkill + 49, 'byte') = 3 - ElseIf IsDllStruct($aSkill) <> 0 Then - Return DllStructGetData($aSkill, 'Target') = 3 - Else - Return MemoryRead(GetSkillPtr($aSkill) + 49, 'byte') = 3 - EndIf -EndFunc ;==>TargetAllySkill - -;~ Description: Returns true if skill works on other allies only. -Func TargetOtherAllySkill($aSkill) - If IsPtr($aSkill) <> 0 Then - Return MemoryRead($aSkill + 49, 'byte') = 4 - ElseIf IsDllStruct($aSkill) <> 0 Then - Return DllStructGetData($aSkill, 'Target') = 4 - Else - Return MemoryRead(GetSkillPtr($aSkill) + 49, 'byte') = 4 - EndIf -EndFunc ;==>TargetOtherAllySkill - -;~ Description: Returns true if skill works on targetted enemies. -Func TargetEnemySkill($aSkill) - If IsPtr($aSkill) <> 0 Then - Return MemoryRead($aSkill + 49, 'byte') = 5 - ElseIf IsDllStruct($aSkill) <> 0 Then - Return DllStructGetData($aSkill, 'Target') = 5 - Else - Return MemoryRead(GetSkillPtr($aSkill) + 49, 'byte') = 5 - EndIf -EndFunc ;==>TargetEnemySkill - -;~ Description: Returns true if skill works on dead allies. -Func TargetDeadAllySkill($aSkill) - If IsPtr($aSkill) <> 0 Then - Return MemoryRead($aSkill + 49, 'byte') = 6 - ElseIf IsDllStruct($aSkill) <> 0 Then - Return DllStructGetData($aSkill, 'Target') = 6 - Else - Return MemoryRead(GetSkillPtr($aSkill) + 49, 'byte') = 6 - EndIf -EndFunc ;==>TargetDeadAllySkill - -;~ Description: Returns true if skill works on minions. -Func TargetMinionSkill($aSkill) - If IsPtr($aSkill) <> 0 Then - Return MemoryRead($aSkill + 49, 'byte') = 14 - ElseIf IsDllStruct($aSkill) <> 0 Then - Return DllStructGetData($aSkill, 'Target') = 14 - Else - Return MemoryRead(GetSkillPtr($aSkill) + 49, 'byte') = 14 - EndIf -EndFunc ;==>TargetMinionSkill - -;~ Description: Returns true if skill has a ground AOE target. -Func TargetGroundSkill($aSkill) - If IsPtr($aSkill) <> 0 Then - Return MemoryRead($aSkill + 49, 'byte') = 16 - ElseIf IsDllStruct($aSkill) <> 0 Then - Return DllStructGetData($aSkill, 'Target') = 16 - Else - Return MemoryRead(GetSkillPtr($aSkill) + 49, 'byte') = 16 - EndIf -EndFunc ;==>TargetGroundSkill -#EndRegion - -#Region Ptr -;~ Description: Returns skillptr by SkillID. -Func GetSkillPtr($aSkillID) - Return Ptr($mSkillBase + 160 * $aSkillID) -EndFunc ;==>GetSkillPtr -#EndRegion Ptr -#EndRegion - -#Region UseSkill -;~ Description: Use a skill via asm call. -Func UseSkill($aSkillSlot, $aTarget, $aCallTarget = False) - If IsPtr($aTarget) <> 0 Then - Local $lTargetID = MemoryRead($aTarget + 44, 'long') - ElseIf IsDllStruct($aTarget) <> 0 Then - Local $lTargetID = DllStructGetData($aTarget, 'ID') - Else - Local $lTargetID = ConvertID($aTarget) - EndIf - DllStructSetData($mUseSkill, 2, $aSkillSlot) - DllStructSetData($mUseSkill, 3, $lTargetID) - DllStructSetData($mUseSkill, 4, $aCallTarget) - Return Enqueue($mUseSkillPtr, 16) -EndFunc ;==>UseSkill - -;~ Description: Use skill with death check, energy check. -Func UseSkillEx($aSkillSlot, $aTarget = -2, $aTimeout = 3000, $aSkillbarPtr = GetSkillbarPtr(0), $aMe = GetAgentPtr(-2)) - If IsPtr($aTarget) <> 0 Then - Local $lTargetPtr = $aTarget - Else - Local $lTargetPtr = GetAgentPtr($aTarget) - EndIf - If $lTargetPtr = 0 Then Return ; no target found - If GetSkillbarSkillRecharge($aSkillSlot, 0, $aSkillbarPtr) <> 0 Then Return - Local $lDeadlock = TimerInit() - ChangeTarget($aTarget) - Local $lSkillPtr = GetSkillPtr(GetSkillbarSkillID($aSkillSlot, 0, $aSkillbarPtr)) - If GetEnergy($aMe) < MemoryRead($lSkillPtr + 53, 'byte') Then Return ; not enough energy - If Not UseSkill($aSkillSlot, $aTarget) Then Return - Update("Using skill " & $aSkillSlot & ".") - Do - Sleep(50) - If GetIsDead($aMe) Then Return ; only me died - If GetIsDead($lTargetPtr) Then Return ; target died - If TimerDiff($lDeadlock) > $aTimeout Then Return - Until GetSkillbarSkillRecharge($aSkillSlot, 0, $aSkillbarPtr) <> 0 - Return True -EndFunc ;==>UseSkillEx - -;~ Description: Finds skillslot via skillID and uses that skill if found. -Func UseSkillByID($aSkillID, $aAgentID = 0, $aSkillbarPtr = GetSkillbarPtr(0), $aMe = GetAgentPtr(-2)) - For $i = 0 to 7 - If GetSkillbarSkillID($i, 0, $aSkillbarPtr) = $aSkillID Then - Return UseSkillEx($i+1, $aAgentID, Default, $aSkillbarPtr, $aMe) - EndIf - Next -EndFunc ;==>UseSkillByID - -;~ Description: Uses packetsend instead of asm call to use skill. -;~ TargetType -> 0 = friendly (self, ally, npc), everything else = enemy -Func UseSkillBySkillID($aSkillID, $aTargetType = 0, $aAgentID = -2) - If $aTargetType = 0 Then - Return SendPacket(0x14, 0x40, $aSkillID, 0, ConvertID($aAgentID), 0) - Else - Return SendPacket(0x14, 0x21, $aSkillID, 0, ConvertID($aAgentID), 0) - EndIf -EndFunc ;==>UseSkillBySkillID -#EndRegion - -#Region Buffs -#Region Ptr -;~ Description: Returns ptr to maintained buff. -Func GetBuffPtr($aBuffNumber, $aHeroNumber = 0, $aHeroID = GetHeroID($aHeroNumber)) - If $BuffBasePtr = 0 Then $BuffBasePtr = MemoryRead($mBasePtr182C + 0x508, 'ptr') - For $i = 0 To MemoryRead($mBasePtr182C + 0x510) - 1 - If MemoryRead($BuffBasePtr + 0x24 * $i) = $aHeroID Then - Return Ptr(MemoryRead($BuffBasePtr + 0x4 + 0x24 * $i, 'ptr') + 0x10 * ($aBuffNumber - 1)) - EndIf - Next -EndFunc ;==>GetBuffPtr - -;~ Description: Returns array with pointers to buffs maintained by heronumber/heroid. -Func GetBuffPtrArray($aHeroNumber = 0, $aHeroID = GetHeroID($aHeroNumber)) - If $BuffBasePtr = 0 Then $BuffBasePtr = MemoryRead($mBasePtr182C + 0x508, 'ptr') - Local $lHeroTempPtr = 0 - Local $lBuffcount = 0 - For $i = 0 To MemoryRead($mBasePtr182C + 0x510) - 1 - If MemoryRead($BuffBasePtr + 0x24 * $i) = $aHeroID Then - $lHeroTempPtr = Ptr(MemoryRead($BuffBasePtr + 0x4 + 0x24 * $i, 'ptr')) - $lBuffcount = MemoryRead($BuffBasePtr + 0x24 * $i + 0xC) - ExitLoop - EndIf - Next - If $lHeroTempPtr = 0 Then Return 0 - Local $lBuffArray[$lBuffcount + 1] - $lBuffArray[0] = $lBuffcount - For $i = 1 To $lBuffcount - $lBuffArray[$i] = Ptr($lHeroTempPtr + 0x10 * ($i-1)) - Next - Return $lBuffArray -EndFunc ;==>GetBuffPtrArray -#EndRegion Ptr - -;~ Description: Returns current number of buffs being maintained. -Func GetBuffCount($aHeroNumber = 0, $aHeroID = GetHeroID($aHeroNumber)) - If $BuffBasePtr = 0 Then $BuffBasePtr = MemoryRead($mBasePtr182C + 0x508, 'ptr') - Local $lBuffer - For $i = 0 To MemoryRead($mBasePtr182C + 0x510) - 1 - If MemoryRead($BuffBasePtr + 0x24 * $i) = $aHeroID Then Return MemoryRead($BuffBasePtr + 0x24 * $i + 0xC) - Next -EndFunc ;==>GetBuffCount - -;~ Description: Tests if you are currently maintaining buff on Agent. -;~ Returns 0 if not, buffnumber if buff is being maintained on Agent. -Func GetIsTargetBuffed($aSkillID, $aAgentID, $aHeroNumber = 0, $aHeroID = GetHeroID($aHeroNumber)) - Local $lBuffCount = GetBuffCount($aHeroNumber) - Local $lPtr - For $i = 1 To $lBuffCount - $lPtr = GetBuffPtr($i, $aHeroNumber, $aHeroID) - If MemoryRead($lPtr, 'long') = $aSkillID And MemoryRead($lPtr + 12, 'long') = ConvertID($aAgentID) Then - Return $i - EndIf - Next -EndFunc ;==>GetIsTargetBuffed - -;~ Description: Stop maintaining enchantment on target. -Func DropBuff($aSkillID, $aAgentID, $aHeroNumber = 0, $aHeroID = GetHeroID($aHeroNumber)) - Local $lBuffs = GetBuffPtrArray($aHeroNumber, $aHeroID) - If $lBuffs = 0 Then Return -1 ; no buffs being maintained - $aAgentID = ConvertID($aAgentID) - For $i = 1 To $lBuffs[0] - If MemoryRead($lBuffs[$i], 'long') = $aSkillID And MemoryRead($lBuffs[$i] + 12, 'long') = $aAgentID Then - Return SendPacket(0x8, 0x23, MemoryRead($lBuffs[$i] + 8, 'long')) - EndIf - Next -EndFunc ;==>DropBuff - -;~ Description: Drops all bonds. -Func DropAllBonds($aHeroNumber = 0, $aHeroID = GetHeroID($aHeroNumber)) - Local $lBuffs = GetBuffPtrArray($aHeroNumber, $aHeroID) - If $lBuffs = 0 Then Return -1 ; no buffs being maintained - Local $lSkillID = 0 - For $i = 1 To $lBuffs[0] - $lSkillID = MemoryRead($lBuffs[$i], 'long') - If $lSkillID = 263 Or $lSkillID = 244 Or $lSkillID = 242 Then ; $SKILLID_Protective_Bond, $SKILLID_Life_Attunement, $SKILLID_Balthazars_Spirit - SendPacket(0x8, 0x23, MemoryRead($lBuffs[$i] + 8, 'long')) - Sleep(50) - EndIf - Next -EndFunc ;==>DropAllBonds - -;~ Description: Drops all buffs $aHeroNumber maintains. -Func DropAllBuffs($aHeroNumber = 0, $aHeroID = GetHeroID($aHeroNumber)) - Local $lBuffs = GetBuffPtrArray($aHeroNumber, $aHeroID) - If $lBuffs = 0 Then Return -1 ; no buffs being maintained - Local $lDroppedBuff = False - For $i = 1 To $lBuffs[0] - SendPacket(0x8, 0x23, MemoryRead($lBuffs[$i] + 8, 'long')) - Sleep(50) - $lDroppedBuff = True - Next - Return $lDroppedBuff -EndFunc ;==>DropAllBuffs -#EndRegion - -#Region SkillEffects and co. -#Region Ptr -;~ Description: Returns ptr to effect by SkillID. -Func GetSkillEffectPtr($aSkillID, $aHeroNumber = 0, $aHeroID = GetHeroID($aHeroNumber)) - If $BuffBasePtr = 0 Then $BuffBasePtr = MemoryRead($mBasePtr182C + 0x508, 'ptr') - Local $lEffectCount = 0 - Local $lTemp = 0 - Local $lEffectBasePtr = 0 - For $i = 0 To MemoryRead($mBasePtr182C + 0x510) - 1 - $lTemp = 0x24 * $i - If MemoryRead($BuffBasePtr + $lTemp) = $aHeroID Then - $lEffectCount = MemoryRead($BuffBasePtr + $lTemp + 0x1C) - $lEffectBasePtr = MemoryRead($BuffBasePtr + $lTemp + 0x14, 'ptr') - For $j = 0 To $lEffectCount - 1 - If MemoryRead($lEffectBasePtr + 24 * $j, 'long') = $aSkillID Then Return Ptr($lEffectBasePtr + 24 * $j) - Next - EndIf - Next -EndFunc ;==>GetSkillEffectPtr - -;~ Description: Returns ptr to effect by EffectNumber. -Func GetSkillEffectPtrByEffectnumber($aEffectNumber, $aHeroNumber = 0, $aHeroID = GetHeroID($aHeroNumber)) - If $BuffBasePtr = 0 Then $BuffBasePtr = MemoryRead($mBasePtr182C + 0x508, 'ptr') - Local $lEffectCount = 0 - Local $lTemp = 0 - Local $lEffectBasePtr = 0 - For $i = 0 To MemoryRead($mBasePtr182C + 0x510) - 1 - $lTemp = 0x24 * $i - If MemoryRead($BuffBasePtr + $lTemp) = $aHeroID Then - $lEffectBasePtr = MemoryRead($BuffBasePtr + $lTemp + 0x14, 'ptr') - Return Ptr($lEffectBasePtr + 24 * ($aEffectNumber)) - EndIf - Next -EndFunc ;==>GetSkillEffectPtrByEffectnumber - -;~ Description: Returns array of effectptr on agent. -Func GetEffectsPtr($aSkillID = 0, $aHeroNumber = 0, $aHeroID = GetHeroID($aHeroNumber)) - If $BuffBasePtr = 0 Then $BuffBasePtr = MemoryRead($mBasePtr182C + 0x508, 'ptr') - Local $lEffectCount = 0 - Local $lTemp = 0 - Local $lEffectBasePtr = 0 - For $i = 0 To MemoryRead($mBasePtr182C + 0x510) - 1 - $lTemp = 0x24 * $i - If MemoryRead($BuffBasePtr + $lTemp) = $aHeroID Then - $lEffectCount = MemoryRead($BuffBasePtr + $lTemp + 0x1C) - $lEffectBasePtr = MemoryRead($BuffBasePtr + $lTemp + 0x14, 'ptr') - If $aSkillID = 0 Then - Local $lReturnArray[$lEffectCount + 1] - $lReturnArray[0] = $lEffectCount - For $j = 1 To $lEffectCount - $lReturnArray[$j] = Ptr($lEffectBasePtr + 24 * ($j - 1)) - Next - Return $lReturnArray - Else - Local $lReturnArray[2] = [0, 0] - For $j = 0 To $lEffectCount - 1 - If MemoryRead($lEffectBasePtr + 24 * $j, 'long') = $aSkillID Then - $lReturnArray[0] = 1 - $lReturnArray[1] = Ptr($lEffectBasePtr + 24 * $j) - Return $lReturnArray - EndIf - Next - EndIf - EndIf - Next -EndFunc ;==>GetEffectsPtr -#EndRegion Ptr - -;~ Description: Returns True if you're under the effect of $aEffectSkillID. -Func HasEffect($aEffectSkillID, $aHeroNumber = 0, $aHeroID = GetHeroID($aHeroNumber)) - Return GetSkillEffectPtr($aEffectSkillID, $aHeroNumber, $aHeroID) <> 0 -EndFunc ;==>HasEffect - -;~ Description: Returns time remaining before an effect expires, in milliseconds. SkillTimer does NOT work when rendering disabled. -Func GetEffectTimeRemaining($aEffect) - If IsArray($aEffect) Then Return 0 - If $aEffect = 0 Then Return 0 - If IsPtr($aEffect) <> 0 Then - Local $lTimeStamp = MemoryRead($aEffect + 20, 'long') - Local $lDuration = MemoryRead($aEffect + 16, 'float') - ElseIf IsDllStruct($aEffect) <> 0 Then - Local $lTimeStamp = DllStructGetData($aEffect, 'TimeStamp') - Local $lDuration = DllStructGetData($aEffect, 'Duration') - Else - Local $lPtr = GetSkillEffectPtr($aEffect) - If $lPtr = 0 Then Return 0 - Local $lTimeStamp = MemoryRead($lPtr + 20, 'long') - Local $lDuration = MemoryRead($lPtr + 16, 'float') - EndIf - Local $lReturn = $lDuration * 1000 - (GetSkillTimer() - $lTimeStamp) - If $lReturn < 0 Then Return 0 - Return $lReturn -EndFunc ;==>GetEffectTimeRemaining -#EndRegion - -#Region Misc -;~ Description: Change your secondary profession. -Func ChangeSecondProfession($aProfession, $aHeroNumber = 0, $aHeroID = GetHeroID($aHeroNumber)) - Return SendPacket(0xC, 0x3B, $aHeroID, $aProfession) -EndFunc ;==>ChangeSecondProfession -#EndRegion \ No newline at end of file + +#include-once + +#Region Skillbar +;~ Description: Change a skill on the skillbar. +Func SetSkillbarSkill($aSlot, $aSkillID, $aHeroNumber = 0, $aHeroID = GetHeroID($aHeroNumber)) + Return SendPacket(0x14, $CtoGS_MSG_SetSkillbarSkill, $aHeroID, $aSlot - 1, $aSkillID, 0) +EndFunc ;==>SetSkillbarSkill + +;~ Description: Load all skills onto a skillbar simultaneously. +;~ $aSkillArray[0] -> Skill 1 etc +Func LoadSkillBar(ByRef $aSkillArray, $aHeroNumber = 0, $aHeroID = GetHeroID($aHeroNumber)) + Return SendPacket(0x2C, $CtoGS_MSG_LoadSkillbar, $aHeroID, 8, $aSkillArray[0], $aSkillArray[1], $aSkillArray[2], $aSkillArray[3], $aSkillArray[4], $aSkillArray[5], $aSkillArray[6], $aSkillArray[7]) +EndFunc ;==>LoadSkillBar + +;~ Description: Returns the recharge time remaining of an equipped skill in milliseconds. GetSkillTimer() works not while rendering disabled ! +Func GetSkillbarSkillRecharge($aSkillSlot, $aHeroNumber = 0, $aPtr = GetSkillbarPtr($aHeroNumber)) + $aSkillSlot -= 1 + Local $lTimestamp = MemoryRead($aPtr + 12 + $aSkillSlot * 20, 'dword') + If $lTimestamp = 0 Then Return 0 + Return $lTimestamp - GetSkillTimer() +EndFunc ;==>GetSkillbarSkillRecharge + +;~ Description: Returns skillslots amount of adrenaline. +Func GetSkillbarSkillAdrenaline($aSkillSlot, $aHeroNumber = 0, $aPtr = GetSkillbarPtr($aHeroNumber)) + $aSkillSlot -= 1 + Return MemoryRead($aPtr + 4 + $aSkillSlot * 20, 'long') +EndFunc ;==>GetSkillbarSkillAdrenaline + +#Region Ptr +;~ Description: Returns ptr to skillbar by HeroNumber. +Func GetSkillbarPtr($aHeroNumber = 0, $aHeroID = GetHeroID($aHeroNumber)) + If $HeroPtr1 = 0 Then $HeroPtr1 = MemoryRead($mBasePtr184C + 0x54, 'ptr') + If $SkillbarBasePtr = 0 Then $SkillbarBasePtr = MemoryRead($mBasePtr182C + 0x6F0, 'ptr') + For $i = 0 To MemoryRead($HeroPtr1 + 0x2C) + If MemoryRead($SkillbarBasePtr + $i * 0xBC) = $aHeroID Then Return Ptr($SkillbarBasePtr + $i * 0xBC) + Next +EndFunc ;==>GetSkillbarPtr +#EndRegion Ptr +#EndRegion Skillbar + +#Region LoadSkilltemplate +;~ Description: Loads skill template code. +; NEW VERSION BY 4D 1 USING SET ATTRIBUTES +Func LoadSkillTemplate($aTemplate, $aHeroNumber = 0, $aHeroID = GetHeroID($aHeroNumber), $aCheckPrimary = True) + Local $lString = '' + For $i = 1 To StringLen($aTemplate) + $lString &= Base64ToBin64(StringMid($aTemplate, $i, 1)) + Next + ; Profession + Local $lTemp = Bin64ToDec(StringMid($lString, 9, 2)) * 2 + 4 + Local $lCount = $lTemp + 11 + Local $lPrimaryProf = Bin64ToDec(StringMid($lString, 11, $lTemp)) + If $aCheckPrimary Then + If $aHeroNumber = 0 Then + If MemoryRead(GetAgentPtr($aHeroID) + 266, 'byte') <> $lPrimaryProf Then Return False + Else + If GetHeroProfession($aHeroNumber, False, $aHeroID) <> $lPrimaryProf Then Return False + EndIf + EndIf + Local $lSecondaryProf = Bin64ToDec(StringMid($lString, $lCount, $lTemp)) + ; Attributes + $lCount += $lTemp + Local $lAmount = Bin64ToDec(StringMid($lString, $lCount, 4)) + $lTemp = Bin64ToDec(StringMid($lString, $lCount + 4, 4)) + 4 + $lCount += 8 + Local $lAttributeArray[$lAmount][2] + For $i = 0 To $lAmount - 1 + $lAttributeArray[$i][0] = Bin64ToDec(StringMid($lString, $lCount, $lTemp)) + $lCount += $lTemp + $lAttributeArray[$i][1] = Bin64ToDec(StringMid($lString, $lCount, 4)) + $lCount += 4 + Next + ; Skills + $lTemp = Bin64ToDec(StringMid($lString, $lCount, 4)) + 8 + $lCount += 4 + Local $lSkillArray[8] + For $i = 0 To 7 + $lSkillArray[$i] = Bin64ToDec(StringMid($lString, $lCount, $lTemp)) + $lCount += $lTemp + Next + ChangeSecondProfession($lSecondaryProf, $aHeroNumber, $aHeroID) + SetAttributes($lAttributeArray, $aHeroNumber, $aHeroID) + LoadSkillBar($lSkillArray, $aHeroNumber, $aHeroID) + Return True +EndFunc ;==>LoadSkillTemplate + +;~ Description: Converts Base64 to Bin64. +Func Base64ToBin64($aCharacter) + Select + Case $aCharacter == "A" + Return "000000" + Case $aCharacter == "B" + Return "100000" + Case $aCharacter == "C" + Return "010000" + Case $aCharacter == "D" + Return "110000" + Case $aCharacter == "E" + Return "001000" + Case $aCharacter == "F" + Return "101000" + Case $aCharacter == "G" + Return "011000" + Case $aCharacter == "H" + Return "111000" + Case $aCharacter == "I" + Return "000100" + Case $aCharacter == "J" + Return "100100" + Case $aCharacter == "K" + Return "010100" + Case $aCharacter == "L" + Return "110100" + Case $aCharacter == "M" + Return "001100" + Case $aCharacter == "N" + Return "101100" + Case $aCharacter == "O" + Return "011100" + Case $aCharacter == "P" + Return "111100" + Case $aCharacter == "Q" + Return "000010" + Case $aCharacter == "R" + Return "100010" + Case $aCharacter == "S" + Return "010010" + Case $aCharacter == "T" + Return "110010" + Case $aCharacter == "U" + Return "001010" + Case $aCharacter == "V" + Return "101010" + Case $aCharacter == "W" + Return "011010" + Case $aCharacter == "X" + Return "111010" + Case $aCharacter == "Y" + Return "000110" + Case $aCharacter == "Z" + Return "100110" + Case $aCharacter == "a" + Return "010110" + Case $aCharacter == "b" + Return "110110" + Case $aCharacter == "c" + Return "001110" + Case $aCharacter == "d" + Return "101110" + Case $aCharacter == "e" + Return "011110" + Case $aCharacter == "f" + Return "111110" + Case $aCharacter == "g" + Return "000001" + Case $aCharacter == "h" + Return "100001" + Case $aCharacter == "i" + Return "010001" + Case $aCharacter == "j" + Return "110001" + Case $aCharacter == "k" + Return "001001" + Case $aCharacter == "l" + Return "101001" + Case $aCharacter == "m" + Return "011001" + Case $aCharacter == "n" + Return "111001" + Case $aCharacter == "o" + Return "000101" + Case $aCharacter == "p" + Return "100101" + Case $aCharacter == "q" + Return "010101" + Case $aCharacter == "r" + Return "110101" + Case $aCharacter == "s" + Return "001101" + Case $aCharacter == "t" + Return "101101" + Case $aCharacter == "u" + Return "011101" + Case $aCharacter == "v" + Return "111101" + Case $aCharacter == "w" + Return "000011" + Case $aCharacter == "x" + Return "100011" + Case $aCharacter == "y" + Return "010011" + Case $aCharacter == "z" + Return "110011" + Case $aCharacter == "0" + Return "001011" + Case $aCharacter == "1" + Return "101011" + Case $aCharacter == "2" + Return "011011" + Case $aCharacter == "3" + Return "111011" + Case $aCharacter == "4" + Return "000111" + Case $aCharacter == "5" + Return "100111" + Case $aCharacter == "6" + Return "010111" + Case $aCharacter == "7" + Return "110111" + Case $aCharacter == "8" + Return "001111" + Case $aCharacter == "9" + Return "101111" + Case $aCharacter == "+" + Return "011111" + Case $aCharacter == "/" + Return "111111" + EndSelect +EndFunc ;==>Base64ToBin64 + + ;~ Description: Converts Bin64 to decimal. +Func Bin64ToDec($aBinary) + Local $lReturn = 0 + For $i = 1 To StringLen($aBinary) + If StringMid($aBinary, $i, 1) == 1 Then $lReturn += 2 ^ ($i - 1) + Next + Return $lReturn +EndFunc ;==>Bin64ToDec +#EndRegion LoadSkilltemplate + +#Region Attributes +;~ Description: Set attributes to values in array. +;~ $aAttrArray[0][0] = AttributeID +;~ $aAttrArray[0][1] = AttributeLevel +Func SetAttributes(ByRef $aAttrArray, $aHeronumber = 0, $aHeroID = GetHeroID($aHeroNumber)) + Local $lCount = UBound($aAttrArray) + For $i = 0 To $lCount -1 + DllStructSetData($mSetAttributes, 6, $aAttrArray[$i][0], $i + 1) + DllStructSetData($mSetAttributes, 8, $aAttrArray[$i][1], $i + 1) + Next + DllStructSetData($mSetAttributes, 4, $aHeroID) + DllStructSetData($mSetAttributes, 5, $lCount) ;# of attributes + DllStructSetData($mSetAttributes, 7, $lCount) ;# of attributes + Return Enqueue($mSetAttributesPtr, 152) +EndFunc + +;~ Description: Set attributes to the given values +;~ by ddarek +;~ Usage: Call like this: +;~ SetAttributes("34|36", "12|12") ; to set to 12 both spawning power(=36) and channeling magic(=34) +;~ SetAttributes($ATTR_DIVINE_FAVOR&"|"&$ATTR_HEALING_PRAYERS&"|"&$ATTR_CURSES, "9|12|9") ; to set 3 attributes +Func SetAttributes_($fAttsID, $fAttsLevel, $aHeroNumber = 0, $aHeroID = GetHeroID($aHeroNumber)) + Local $lAttsID = StringSplit(String($fAttsID), "|") + Local $lAttsLevel = StringSplit(String($fAttsLevel), "|") + DllStructSetData($mSetAttributes, 4, $aHeroID) + DllStructSetData($mSetAttributes, 5, $lAttsID[0]) ;# of attributes + DllStructSetData($mSetAttributes, 7, $lAttsID[0]) ;# of attributes + For $i = 1 To $lAttsID[0] + DllStructSetData($mSetAttributes, 6, $lAttsID[$i], $i) + DllStructSetData($mSetAttributes, 8, $lAttsLevel[$i], $i) + Next + Return Enqueue($mSetAttributesPtr, 152) +EndFunc ;==>SetAttributes + +;~ Description: Set the two given Attributes to 12 +;~ Similar to SetAttributes but much faster since this is reusing stuff +Func MaxAttributes($aAtt1ID, $aAtt2ID = 0xFF, $aHeroNumber = 0, $aHeroID = GetHeroID($aHeroNumber)) ; ATTR_NONE = 0xFF + DllStructSetData($mSetAttributes, 4, $aHeroID) + DllStructSetData($mSetAttributes, 5, 3) ;# of attributes + DllStructSetData($mSetAttributes, 6, $aAtt1ID, 1) ;ID ofAttributes + DllStructSetData($mSetAttributes, 6, $aAtt2ID, 2) ;ID ofAttributes + DllStructSetData($mSetAttributes, 7, 3) ;# of attributes + DllStructSetData($mSetAttributes, 8, 13, 1) ;Attribute Levels + DllStructSetData($mSetAttributes, 8, 13, 2) ;Attribute Levels + Return Enqueue($mSetAttributesPtr, 152) +EndFunc ;==>MaxAttributes + +;~ Description: Sets all attributes to 0. +Func ClearAttributes($aHeroNumber = 0, $aHeroID = GetHeroID($aHeroNumber), $aPrimary = 0, $aSecondary = 0) + If $aPrimary = 0 Then + If $aHeroNumber = 0 Then + $aPrimary = MemoryRead(GetAgentPtr($aHeroID) + 266, 'byte') + Else + $aPrimary = GetHeroProfession($aHeroNumber, True, $aHeroID) + $aSecondary = @extended + EndIf + EndIf + If $aSecondary = 0 Then + If $aHeroNumber = 0 Then + $aSecondary = MemoryRead(GetAgentPtr($aHeroID) + 267, 'byte') + Else + $aPrimary = GetHeroProfession($aHeroNumber, True, $aHeroID) + $aSecondary = @extended + EndIf + EndIf + If $aPrimary <> 1 And $aSecondary <> 1 Then + Local $lAtt1 = 17 + Local $lAtt2 = 18 + ElseIf $aPrimary <> 2 And $aSecondary <> 2 Then + Local $lAtt1 = 23 + Local $lAtt2 = 24 + Else + Local $lAtt1 = 13 + Local $lAtt2 = 14 + EndIf + Return MaxAttributes($lAtt1, $lAtt2, $aHeroNumber, $aHeroID) +EndFunc + +;~ Description: Returns profession number. +Func GetProfessionByAttribute($aAttr) + Switch $aAttr + Case 0,1,2,3 ; $ATTRIB_FastCasting, $ATTRIB_IllusionMagic, $ATTRIB_DominationMagic, $ATTRIB_InspirationMagic + Return 5 ; $PROFESSION_Mesmer + Case 4,5,6,7 ; $ATTRIB_BloodMagic, $ATTRIB_DeathMagic, $ATTRIB_SoulReaping, $ATTRIB_Curses + Return 4 ; $PROFESSION_Necromancer + Case 8,9,10,11,12 ; $ATTRIB_AirMagic, $ATTRIB_EarthMagic, $ATTRIB_FireMagic, $ATTRIB_WaterMagic, $ATTRIB_EnergyStorage + Return 6 ; $PROFESSION_Elementalist + Case 13,14,15,16 ; $ATTRIB_HealingPrayers, $ATTRIB_SmitingPrayers, $ATTRIB_ProtectionPrayers, $ATTRIB_DivineFavor + Return 3 ; $PROFESSION_Monk + Case 17,18,19,20,21 ; $ATTRIB_Strength, $ATTRIB_AxeMastery, $ATTRIB_HammerMastery, $ATTRIB_Swordsmanship, $ATTRIB_Tactics + Return 1 ; $PROFESSION_Warrior + Case 22,23,24,25 ; $ATTRIB_BeastMastery, $ATTRIB_Expertise, $ATTRIB_WildernessSurvival, $ATTRIB_Marksmanship + Return 2 ; $PROFESSION_Ranger + Case 29,30,31,35 ; $ATTRIB_DaggerMastery, $ATTRIB_DeadlyArts, $ATTRIB_ShadowArts, $ATTRIB_CriticalStrikes + Return 7 ; $PROFESSION_Assassin + Case 32,33,36,36 ; $ATTRIB_Communing, $ATTRIB_RestorationMagic, $ATTRIB_ChannelingMagic, $ATTRIB_SpawningPower + Return 8 ; $PROFESSION_Ritualist + Case 37,38,39,40 ; $ATTRIB_SpearMastery, $ATTRIB_Command, $ATTRIB_Motivation, $ATTRIB_Leadership + Return 9 ; $PROFESSION_Paragon + Case 41,42,43,44 ; $ATTRIB_ScytheMastery, $ATTRIB_WindPrayers, $ATTRIB_EarthPrayers, $ATTRIB_Mysticism + Return 10 ; $PROFESSION_Dervish + Case Else + Return 0 ; $PROFESSION_None + EndSwitch +EndFunc ;==>GetProfessionByAttribute + +;~ Description: Returns secondary attributes. +Func GetSecondaryAttributesByProfession($aProf) + Switch $aProf + Case 0 ; $PROFESSION_None + Local $ret[1] = [0] + Case 5 ; $PROFESSION_Mesmer + Local $ret[4] = [3,2,1,3] ; $ATTRIB_DominationMagic, $ATTRIB_IllusionMagic, $ATTRIB_InspirationMagic] + Case 4 ; $PROFESSION_Necromancer + Local $ret[4] = [3,4,5,7] ; $ATTRIB_BloodMagic, $ATTRIB_DeathMagic, $ATTRIB_Curses] + Case 6 ; $PROFESSION_Elementalist + Local $ret[5] = [4,8,9,10,11] ; $ATTRIB_AirMagic, $ATTRIB_EarthMagic, $ATTRIB_FireMagic, $ATTRIB_WaterMagic] + Case 3 ; $PROFESSION_Monk + Local $ret[4] = [3,13,14,15] ; $ATTRIB_HealingPrayers, $ATTRIB_ProtectionPrayers, $ATTRIB_SmitingPrayers] + Case 1 ; $PROFESSION_Warrior + Local $ret[5] = [4,18,19,20,21] ; $ATTRIB_AxeMastery, $ATTRIB_HammerMastery, $ATTRIB_Swordsmanship, $ATTRIB_Tactics] + Case 2 ; $PROFESSION_Ranger + Local $ret[4] = [3,22,24,25] ; $ATTRIB_BeastMastery, $ATTRIB_WildernessSurvival, $ATTRIB_Marksmanship] + Case 7 ; $PROFESSION_Assassin + Local $ret[4] = [3,29,30,31] ; $ATTRIB_DaggerMastery, $ATTRIB_DeadlyArts, $ATTRIB_ShadowArts] + Case 8 ; $PROFESSION_Ritualist + Local $ret[4] = [3,32,33,34] ; $ATTRIB_Communing, $ATTRIB_RestorationMagic, $ATTRIB_ChannelingMagic] + Case 9 ; $PROFESSION_Paragon + Local $ret[4] = [3,37,38,39] ; $ATTRIB_SpearMastery, $ATTRIB_Command, $ATTRIB_Motivation] + Case 10 ; $PROFESSION_Dervish + Local $ret[4] = [3,41,42,43] ; $ATTRIB_ScytheMastery, $ATTRIB_WindPrayers, $ATTRIB_EarthPrayers] + EndSwitch + Return $ret +EndFunc ;==>GetSecondaryAttributesByProfession + +;~ Description: Returns main attribute by profession number. +Func GetProfPrimaryAttribute($aProfession) + Switch $aProfession + Case 1 + Return 17 + Case 2 + Return 23 + Case 3 + Return 16 + Case 4 + Return 6 + Case 5 + Return 0 + Case 6 + Return 12 + Case 7 + Return 35 + Case 8 + Return 36 + Case 9 + Return 40 + Case 10 + Return 44 + EndSwitch +EndFunc ;==>GetProfPrimaryAttribute +#EndRegion + +#Region Single Skills +;~ Description: Checks if skill given (by number in bar) is recharged. Returns True if recharged, otherwise False. +Func IsRecharged($aSkillSlot, $aHeroNumber = 0, $aPtr = GetSkillbarPtr($aHeroNumber)) + Return GetSkillbarSkillRecharge($aSkillSlot, $aHeroNumber, $aPtr) = 0 +EndFunc ;==>IsRecharged + +;~ Description: Returns the skill ID of an equipped skill. +Func GetSkillbarSkillID($aSkillSlot, $aHeroNumber = 0, $aPtr = GetSkillbarPtr($aHeroNumber)) + $aSkillSlot -= 1 + Return MemoryRead($aPtr + 16 + $aSkillSlot * 20, 'dword') +EndFunc ;==>GetSkillbarSkillID + +;~ Description: Returns the timestamp used for effects and skills (milliseconds). Only works when rendering enabled. +Func GetSkillTimer() + Return MemoryRead($mSkillTimer, "long") +EndFunc ;==>GetSkillTimer + +;~ Description: Returns skill dmg. +Func SkillDamageAmount($aSkill) + If IsPtr($aSkill) <> 0 Then + Return MemoryRead($aSkill + 96, 'long') + ElseIf IsDllStruct($aSkill) <> 0 Then + Return DllStructGetData($aSkill, 'Scale15') + Else + Return MemoryRead(GetSkillPtr($aSkill) + 96, 'long') + EndIf +EndFunc ;==>SkillDamageAmount + +;~ Description: Returns skill aoe range. +Func SkillAOERange($aSkill) + If IsPtr($aSkill) <> 0 Then + Return MemoryRead($aSkill + 108, 'float') + ElseIf IsDllStruct($aSkill) <> 0 Then + Return DllStructGetData($aSkill, 'AoERange') + Else + Return MemoryRead(GetSkillPtr($aSkill) + 108, 'float') + EndIf +EndFunc ;==>SkillAOERange + +;~ Description: Returns skill recharge. +Func SkillRecharge($aSkill) + If IsPtr($aSkill) <> 0 Then + Return MemoryRead($aSkill + 76, 'long') + ElseIf IsDllStruct($aSkill) <> 0 Then + Return DllStructGetData($aSkill, 'Recharge') + Else + Return MemoryRead(GetSkillPtr($aSkill) + 76, 'long') + EndIf +EndFunc ;==>SkillRecharge + +;~ Description: Returns skill activationtime. +Func SkillActivation($aSkill) + If IsPtr($aSkill) <> 0 Then + Return MemoryRead($aSkill + 60, 'float') + ElseIf IsDllStruct($aSkill) <> 0 Then + Return DllStructGetData($aSkill, 'Activation') + Else + Return MemoryRead(GetSkillPtr($aSkill) + 60, 'float') + EndIf +EndFunc ;==>SkillActivation + +;~ Description: Returns skill attribute. +Func SkillAttribute($aSkill) + If IsPtr($aSkill) <> 0 Then + Return MemoryRead($aSkill + 41, 'byte') + ElseIf IsDllStruct($aSkill) <> 0 Then + Return DllStructGetData($aSkill, 'Attribute') + Else + Return MemoryRead(GetSkillPtr($aSkill) + 41, 'byte') + EndIf +EndFunc ;==>SkillAttribute + +#Region Type +;~ Description: Returns true if skill is hex spell, false if not. +Func IsHexSpell($aSkill) + If IsPtr($aSkill) <> 0 Then + Return MemoryRead($aSkill + 12, 'long') = 4 + ElseIf IsDllStruct($aSkill) <> 0 Then + Return DllStructGetData($aSkill, 'Type') = 4 + Else + Return MemoryRead(GetSkillPtr($aSkill) + 12, 'long') = 4 + EndIf +EndFunc ;==>IsHexSpell + +;~ Description: Returns true if skill is condition spell, false if not. +Func IsConditionSpell($aSkill) + If IsPtr($aSkill) <> 0 Then + Return MemoryRead($aSkill + 12, 'long') = 8 + ElseIf IsDllStruct($aSkill) <> 0 Then + Return DllStructGetData($aSkill, 'Type') = 8 + Else + Return MemoryRead(GetSkillPtr($aSkill) + 12, 'long') = 8 + EndIf +EndFunc ;==>IsConditionSpell + +;~ Description: Returns true if skill is enchantment spell, false if not. +Func IsEnchantmentSkill($aSkill) + If IsPtr($aSkill) <> 0 Then + Return MemoryRead($aSkill + 12, 'long') = 6 + ElseIf IsDllStruct($aSkill) <> 0 Then + Return DllStructGetData($aSkill, 'Type') = 6 + Else + Return MemoryRead(GetSkillPtr($aSkill) + 12, 'long') = 6 + EndIf +EndFunc ;==>IsEnchantmentSkill + +;~ Description: Returns true if skill is attack skill, false if not. +Func IsAttackSkill($aSkill) + If IsPtr($aSkill) <> 0 Then + Return MemoryRead($aSkill + 12, 'long') = 14 + ElseIf IsDllStruct($aSkill) <> 0 Then + Return DllStructGetData($aSkill, 'Type') = 14 + Else + Return MemoryRead(GetSkillPtr($aSkill) + 12, 'long') = 14 + EndIf +EndFunc ;==>IsAttackSkill +#EndRegion + +#Region Requirements +;~ Description: Returns true if skill requires bleeding. +Func SkillRequiresBleeding($aSkill) + If IsPtr($aSkill) <> 0 Then + Return BitAND(MemoryRead($aSkill + 28, 'long'), 1) + ElseIf IsDllStruct($aSkill) <> 0 Then + Return BitAND(DllStructGetData($aSkill, 'Condition'), 1) + Else + Return BitAND(MemoryRead(GetSkillPtr($aSkill) + 28, 'long'), 1) + EndIf +EndFunc ;==>SkillRequiresBleeding + +;~ Description: Returns true if skill requires burning. +Func SkillRequiresBurning($aSkill) + If IsPtr($aSkill) <> 0 Then + Return BitAND(MemoryRead($aSkill + 28, 'long'), 4) + ElseIf IsDllStruct($aSkill) <> 0 Then + Return BitAND(DllStructGetData($aSkill, 'Condition'), 4) + Else + Return BitAND(MemoryRead(GetSkillPtr($aSkill) + 28, 'long'), 4) + EndIf +EndFunc ;==>SkillRequiresBurning + +;~ Description: Returns true if skill requires cripple. +Func SkillRequiresCripple($aSkill) + If IsPtr($aSkill) <> 0 Then + Return BitAND(MemoryRead($aSkill + 28, 'long'), 8) + ElseIf IsDllStruct($aSkill) <> 0 Then + Return BitAND(DllStructGetData($aSkill, 'Condition'), 8) + Else + Return BitAND(MemoryRead(GetSkillPtr($aSkill) + 28, 'long'), 8) + EndIf +EndFunc ;==>SkillRequiresCripple + +;~ Description: Returns true if skill requires deep wound. +Func SkillRequiresDeepWound($aSkill) + If IsPtr($aSkill) <> 0 Then + Return BitAND(MemoryRead($aSkill + 28, 'long'), 16) + ElseIf IsDllStruct($aSkill) <> 0 Then + Return BitAND(DllStructGetData($aSkill, 'Condition'), 16) + Else + Return BitAND(MemoryRead(GetSkillPtr($aSkill) + 28, 'long'), 16) + EndIf +EndFunc ;==>SkillRequiresDeepWound + +;~ Description: Returns true if skill requires earth hex. +Func SkillRequiresEarthHex($aSkill) + If IsPtr($aSkill) <> 0 Then + Return BitAND(MemoryRead($aSkill + 28, 'long'), 64) + ElseIf IsDllStruct($aSkill) <> 0 Then + Return BitAND(DllStructGetData($aSkill, 'Condition'), 64) + Else + Return BitAND(MemoryRead(GetSkillPtr($aSkill) + 28, 'long'), 64) + EndIf +EndFunc ;==>SkillRequiresEarthHex + +;~ Description: Returns true if skill requires target knocked down. +Func SkillRequiresKnockDown($aSkill) + If IsPtr($aSkill) <> 0 Then + Return BitAND(MemoryRead($aSkill + 28, 'long'), 128) + ElseIf IsDllStruct($aSkill) <> 0 Then + Return BitAND(DllStructGetData($aSkill, 'Condition'), 128) + Else + Return BitAND(MemoryRead(GetSkillPtr($aSkill) + 28, 'long'), 128) + EndIf +EndFunc ;==>SkillRequiresKnockDown + +;~ Description: Returns true if skill requires weakness. +Func SkillRequiresWeakness($aSkill) + If IsPtr($aSkill) <> 0 Then + Return BitAND(MemoryRead($aSkill + 28, 'long'), 1024) + ElseIf IsDllStruct($aSkill) <> 0 Then + Return BitAND(DllStructGetData($aSkill, 'Condition'), 1024) + Else + Return BitAND(MemoryRead(GetSkillPtr($aSkill) + 28, 'long'), 1024) + EndIf +EndFunc ;==>SkillRequiresWeakness + +;~ Description: Returns true if skill requires water hex. +Func SkillRequiresWaterHex($aSkill) + If IsPtr($aSkill) <> 0 Then + Return BitAND(MemoryRead($aSkill + 28, 'long'), 2048) + ElseIf IsDllStruct($aSkill) <> 0 Then + Return BitAND(DllStructGetData($aSkill, 'Condition'), 2048) + Else + Return BitAND(MemoryRead(GetSkillPtr($aSkill) + 28, 'long'), 2048) + EndIf +EndFunc ;==>SkillRequiresWaterHex + +;~ Description: Returns true if skill interrupts target. +Func IsInterruptSkill($aSkill) + If IsPtr($aSkill) <> 0 Then + Local $lSkillID = MemoryRead($aSkill, 'long') + ElseIf IsDllStruct($aSkill) <> 0 Then + Local $lSkillID = DllStructGetData($aSkill, 'ID') + Else + Local $lSkillID = $aSkill + EndIf + Switch $lSkillID + Case 2358; $SKILLID_You_Move_Like_a_Dwarf + Return True + Case 2066; $SKILLID_Disarm + Return True + Case 340; $SKILLID_Disrupting_Chop + Return True + Case 325; $SKILLID_Distracting_Blow + Return True + Case 399; $SKILLID_Distracting_Shot + Return True + Case 2194; $SKILLID_Distracting_Strike + Return True + Case 390; $SKILLID_Savage_Slash + Return True + Case 329; $SKILLID_Skull_Crack + Return True + Case 2143; $SKILLID_Disrupting_Shot + Return True + Case 1726; $SKILLID_Magebane_Shot + Return True + Case 409; $SKILLID_Punishing_Shot + Return True + Case 426; $SKILLID_Savage_Shot + Return True + Case 61; $SKILLID_Leech_Signet + Return True + Case 1057; $SKILLID_Psychic_Instability + Return True + Case 1350; $SKILLID_Simple_Thievery + Return True + Case 228; $SKILLID_Thunderclap + Return True + Case 1025; $SKILLID_Disrupting_Stab + Return True + Case 975; $SKILLID_Exhausting_Assault + Return True + Case 1538; $SKILLID_Lyssas_Assault + Return True + Case 1512; $SKILLID_Lyssas_Haste + Return True + Case 445; $SKILLID_Disrupting_Lunge + Return True + Case 932; $SKILLID_Complicate + Return True + Case 57; $SKILLID_Cry_of_Frustration + Return True + Case 1053; $SKILLID_Psychic_Distraction + Return True + Case 1342; $SKILLID_Tease + Return True + Case 1344; $SKILLID_Web_of_Disruption + Return True + Case 571; $SKILLID_Disrupting_Dagger + Return True + Case 860; $SKILLID_Signet_of_Disruption + Return True + Case 1992; $SKILLID_Signet_of_Distraction + Return True + Case 988; $SKILLID_Temple_Strike + Return True + Case 5; $SKILLID_Power_Block + Return True + Case 25; $SKILLID_Power_Drain + Return True + Case 953; $SKILLID_Power_Flux + Return True + Case 24; $SKILLID_Power_Leak + Return True + Case 803; $SKILLID_Power_Leech + Return True + Case 1994; $SKILLID_Power_Lock + Return True + Case 931; $SKILLID_Power_Return + Return True + Case 23; $SKILLID_Power_Spike + Return True + Case Else + Return False + EndSwitch +EndFunc ;==>IsInterruptSkill + +;~ Description: Returns true if skill is a weapon spell. +Func IsWeaponSpell($aSkill) +If IsPtr($aSkill) <> 0 Then + Return MemoryRead($aSkill + 12, 'long') = 25 + ElseIf IsDllStruct($aSkill) <> 0 Then + Return DllStructGetData($aSkill, 'Type') = 25 + Else + Return MemoryRead(GetSkillPtr($aSkill) + 12, 'long') = 25 + EndIf +EndFunc ;==>IsWeaponSpell + +;~ Description: Returns true if skill requires a condition. +Func SkillRequiresCondition($aSkill) + If IsPtr($aSkill) <> 0 Then + Local $lSkillID = MemoryRead($aSkill, 'long') + ElseIf IsDllStruct($aSkill) <> 0 Then + Local $lSkillID = DllStructGetData($aSkill, 'ID') + Else + Local $lSkillID = $aSkill + EndIf + Switch $lSkillID + Case 365; $SKILLID_Victory_is_Mine + Return True + Case 1137; $SKILLID_Yeti_Smash + Return True + Case 870; $SKILLID_Pestilence + Return True + Case 440; $SKILLID_Scavenger_Strike + Return True + Case 1471; $SKILLID_Scavengers_Focus + Return True + Case 817; $SKILLID_Discord + Return True +;~ Case 2103; $SKILLID_Necrosis +;~ Return True + Case 864; $SKILLID_Oppressive_Gaze + Return True + Case 1950; $SKILLID_Signet_of_Corruption + Return True + Case 828; $SKILLID_Vile_Miasma + Return True + Case 107; $SKILLID_Virulence + Return True + Case 78; $SKILLID_Epidemic + Return True + Case 1333; $SKILLID_Extend_Conditions + Return True + Case 55; $SKILLID_Fevered_Dreams + Return True + Case 19; $SKILLID_Fragility + Return True + Case 1334; $SKILLID_Hypochondria + Return True + Case 217; $SKILLID_Crystal_Wave + Return True + Case 786; $SKILLID_Iron_Palm + Return True + Case 1633; $SKILLID_Malicious_Strike + Return True + Case 1991; $SKILLID_Sadists_Signet + Return True + Case 1034; $SKILLID_Seeping_Wound + Return True + Case 2186; $SKILLID_Signet_of_Deadly_Corruption + Return True + Case 1036; $SKILLID_Signet_of_Malice + Return True + Case 1604; $SKILLID_Disrupting_Throw + Return True + Case 1957; $SKILLID_Spear_of_Fury + Return True + Case 1602; $SKILLID_Stunning_Strike + Return True + Case 1515; $SKILLID_Armor_of_Sanctity + Return True + Case 1486; $SKILLID_Reap_Impurities + Return True + Case Else + Return False + EndSwitch +EndFunc ;==>SkillRequiresCondition + +;~ Description: Returns true if skill requires hexed target. +Func SkillRequiresHex($aSkill) + If IsPtr($aSkill) <> 0 Then + Local $lSkillID = MemoryRead($aSkill, 'long') + ElseIf IsDllStruct($aSkill) <> 0 Then + Local $lSkillID = DllStructGetData($aSkill, 'ID') + Else + Local $lSkillID = $aSkill + EndIf + Switch $lSkillID + Case 303; $SKILLID_Convert_Hexes + Return True + Case 2003; $SKILLID_Cure_Hex + Return True + Case 1692; $SKILLID_Divert_Hexes + Return True + Case 848; $SKILLID_Reverse_Hex + Return True + Case 302; $SKILLID_Smite_Hex + Return True + Case 1337; $SKILLID_Drain_Delusions + Return True + Case 1059; $SKILLID_Hex_Eater_Signet + Return True + Case 1348; $SKILLID_Hex_Eater_Vortex + Return True + Case 22; $SKILLID_Inspired_Hex + Return True + Case 1049; $SKILLID_Revealed_Hex + Return True + Case 27; $SKILLID_Shatter_Delusions + Return True + Case 67; $SKILLID_Shatter_Hex + Return True + Case Else + Return False + EndSwitch +EndFunc ;==>SkillRequiresHex + +;~ Description: Returns true if skill is a summoning skill. +Func IsSummonSkill($aSkill) + If IsPtr($aSkill) <> 0 Then + Local $lSkillID = MemoryRead($aSkill, 'long') + ElseIf IsDllStruct($aSkill) <> 0 Then + Local $lSkillID = DllStructGetData($aSkill, 'ID') + Else + Local $lSkillID = $aSkill + EndIf + Switch $lSkillID + Case 2226; $SKILLID_Summon_Ice_Imp + Return True + Case 2224; $SKILLID_Summon_Mursaat + Return True + Case 2227; $SKILLID_Summon_Naga_Shaman + Return True + Case 2225; $SKILLID_Summon_Ruby_Djinn + Return True + Case Else + Return False + EndSwitch +EndFunc ;==>IsSummonSkill + +;~ Description: Returns true if skill is an anti melee skill. +Func IsAntiMeleeSkill($aSkill) + If IsPtr($aSkill) <> 0 Then + Local $lSkillID = MemoryRead($aSkill, 'long') + ElseIf IsDllStruct($aSkill) <> 0 Then + Local $lSkillID = DllStructGetData($aSkill, 'ID') + Else + Local $lSkillID = $aSkill + EndIf + Switch $lSkillID + Case 1130; $SKILLID_Spear_of_Light + Return True + Case 240; $SKILLID_Smite + Return True + Case 2006; $SKILLID_Castigation_Signet + Return True + Case 296; $SKILLID_Bane_Signet + Return True + Case 1657; $SKILLID_Signet_of_Clumsiness + Return True + Case 294; $SKILLID_Signet_of_Judgment + Return True + Case 47; $SKILLID_Ineptitude + Return True + Case 43; $SKILLID_Clumsiness + Return True + Case 2056; $SKILLID_Wandering_Eye + Return True + Case Else + Return False + EndSwitch +EndFunc ;==>IsAntiMeleeSkill +#EndRegion + +#Region Special +;~ Description: Returns true if skill is elite skill. +Func IsEliteSkill($aSkill) + If IsPtr($aSkill) <> 0 Then + Return MemoryRead($aSkill + 16, 'long') = 4 + ElseIf IsDllStruct($aSkill) <> 0 Then + Return DllStructGetData($aSkill, 'Special') = 4 + Else + Return MemoryRead(GetSkillPtr($aSkill) + 16, 'long') = 4 + EndIf +EndFunc ;==>IsEliteSkill + +;~ Description: Returns true if skill is pve skill. +Func IsPvESkill($aSkill) + If IsPtr($aSkill) <> 0 Then + Return BitAND(MemoryRead($aSkill + 16, 'long'), 524288) + ElseIf IsDllStruct($aSkill) <> 0 Then + Return BitAND(DllStructGetData($aSkill, 'Special'), 524288) + Else + Return BitAND(MemoryRead(GetSkillPtr($aSkill) + 16, 'long'), 524288) + EndIf +EndFunc ;==>IsPvESkill +#EndRegion + +#Region Skilltypes +;~ Description: Returns true if skillid uses skills that affect or summon ritualist spirits. +Func IsSpiritSkill($aSkill) ; Spirits (Binding Rituals) + If IsPtr($aSkill) <> 0 Then + Local $lSkillID = MemoryRead($aSkill, 'long') + ElseIf IsDllStruct($aSkill) <> 0 Then + Local $lSkillID = DllStructGetData($aSkill, 'ID') + Else + Local $lSkillID = $aSkill + EndIf + Switch $lSkillID + Case 1239; $SKILLID_Signet_of_Spirits + Return True + Case 2205; $SKILLID_Agony + Return True + Case 1745; $SKILLID_Anguish + Return True + Case 1253; $SKILLID_Bloodsong + Return True + Case 2656; $SKILLID_Call_to_the_Spirit_Realm + Return True + Case 920; $SKILLID_Destruction + Return True + Case 923; $SKILLID_Disenchantment + Return True + Case 1249; $SKILLID_Displacement + Return True + Case 921; $SKILLID_Dissonance + Return True + Case 1252; $SKILLID_Earthbind + Return True + Case 1747; $SKILLID_Empowerment + Return True + Case 1734; $SKILLID_Gaze_of_Fury + Return True + Case 1251; $SKILLID_Life + Return True + Case 1901; $SKILLID_Jack_Frost + Return True + Case 1247; $SKILLID_Pain + Return True + Case 1250; $SKILLID_Preservation + Return True + Case 1748; $SKILLID_Recovery + Return True + Case 981; $SKILLID_Recuperation + Return True + Case 2204; $SKILLID_Rejuvenation + Return True + Case 963; $SKILLID_Restoration + Return True + Case 871; $SKILLID_Shadowsong + Return True + Case 982; $SKILLID_Shelter + Return True + Case 1266; $SKILLID_Soothing + Return True + Case 911; $SKILLID_Union + Return True + Case 2110; $SKILLID_Vampirism + Return True + Case 1255; $SKILLID_Wanderlust + Return True + Case Else + Return False + EndSwitch +EndFunc ;==>IsSpiritSkill + +;~ Description: Returns true if skillid is skill that strips enchantment. +Func IsEnchantmentStrip($aSkill) ; + If IsPtr($aSkill) <> 0 Then + Local $lSkillID = MemoryRead($aSkill, 'long') + ElseIf IsDllStruct($aSkill) <> 0 Then + Local $lSkillID = DllStructGetData($aSkill, 'ID') + Else + Local $lSkillID = $aSkill + EndIf + Switch $lSkillID +;~ Necro Skills + Case 144 ; $SKILLID_Chillblains + Return True + Case 1362 ; $SKILLID_Corrupt_Enchantment ; Elite + Return True + Case 936 ; $SKILLID_Envenom_Enchantments + Return True + Case 763 ; $SKILLID_Jaundiced_Gaze + Return True + Case 1359 ; $SKILLID_Pain_of_Disenchantment ; Elite + Return True + Case 141 ; $SKILLID_Rend_Enchantments + Return True + Case 955 ; $SKILLID_Rip_Enchantment + Return True + Case 143 ; $SKILLID_Strip_Enchantment + Return True +;~ Mesmer Skills + Case 1656 ; $SKILLID_Air_of_Disenchantment ; Elite + Return True + Case 1347 ; $SKILLID_Discharge_Enchantment + Return True + Case 68 ; $SKILLID_Drain_Enchantment + Return True + Case 1061 ; $SKILLID_Feedback + Return True + Case 21 ; $SKILLID_Inspired_Enchantment + Return True + Case 877 ; $SKILLID_Lyssas_Balance + Return True + Case 1349 ; $SKILLID_Mirror_of_Disenchantment + Return True + Case 1048 ; $SKILLID_Revealed_Enchantment + Return True + Case 69 ; $SKILLID_Shatter_Enchantment + Return True + Case 933 ; $SKILLID_Shatter_Storm ; Elite + Return True + Case 882 ; $SKILLID_Signet_of_Disenchantment + Return True +;~ Assassin Skills + Case 1643 ; $SKILLID_Assault_Enchantments ; Elite + Return True + Case 990 ; $SKILLID_Expunge_Enchantments + Return True + Case 1645 ; $SKILLID_Lift_Enchantment + Return True + Case 1634 ; $SKILLID_Shattering_Assault ; Elite + Return True + Case 1648 ; $SKILLID_Signet_of_Twilight ; I would not use this, requires a hexed target + Return True +;~ Dervish Skills I left out the ones that enchant the derv and its hits take away an enchantment. + Case 1534 ; $SKILLID_Rending_Touch + Return True + Case 1545 ; $SKILLID_Test_of_Faith + Return True + Case Else + Return False + EndSwitch +EndFunc ;==>IsEnchantmentStrip + +;~ Description: Returns true if skill can be considered a healing skill. +Func IsHealSkill($aSkill) + If IsPtr($aSkill) <> 0 Then + If BitAND(MemoryRead($aSkill + 24, 'long'), 4096) Then Return True + Local $lSkillEffect2 = MemoryRead($aSkill + 32, 'long') + If BitAnd($lSkillEffect2, 2) Or BitAnd($lSkillEffect2, 4) Then Return True + Local $lSkillAttribute = MemoryRead($aSkill + 41, 'byte') + ElseIf IsDllStruct($aSkill) <> 0 Then + If BitAND(DllStructGetData($aSkill, 'Effect1'), 4096) Then Return True + Local $lSkillEffect2 = DllStructGetData($aSkill, 'Effect2') + If BitAnd($lSkillEffect2, 2) Or BitAnd($lSkillEffect2, 4) Then Return True + Local $lSkillAttribute = DllStructGetData($aSkill, 'Attribute') + Else + Local $lPtr = GetAgentPtr($aSkill) + If BitAND(MemoryRead($lPtr + 24, 'long'), 4096) Then Return True + Local $lSkillEffect2 = MemoryRead($lPtr + 32, 'long') + If BitAnd($lSkillEffect2, 2) Or BitAnd($lSkillEffect2, 4) Then Return True + Local $lSkillAttribute = MemoryRead($lPtr + 41, 'byte') + EndIf + Switch $lSkillAttribute + Case 13,15,16 ; $ATTRIB_HealingPrayers, $ATTRIB_ProtectionPrayers, $ATTRIB_DivineFavor + Return True + Case Else + Return False + EndSwitch +EndFunc ;==>IsHealSkill + +;~ Description: Returns true if skill is a rez skill. +Func IsResSkill($aSkill) + If IsPtr($aSkill) <> 0 Then + Local $lSkillID = MemoryRead($aSkill, 'long') + ElseIf IsDllStruct($aSkill) <> 0 Then + Local $lSkillID = DllStructGetData($aSkill, 'ID') + Else + Local $lSkillID = $aSkill + EndIf + Switch $lSkillID + Case 2217 ; $SKILLID_By_Urals_Hammer + Return True + Case 1592 ; $SKILLID_We_Shall_Return + Return True + Case 2872 ; $SKILLID_Death_Pact_Signet + Return True + Case 2109 ; $SKILLID_Eternal_Aura + Return True + Case 791 ; $SKILLID_Flesh_of_my_Flesh + Return True + Case 1865 ; $SKILLID_Junundu_Wail + Return True + Case 304 ; $SKILLID_Light_of_Dwayna + Return True + Case 1222 ; $SKILLID_Lively_Was_Naomei + Return True + Case 306 ; $SKILLID_Rebirth + Return True + Case 1263 ; $SKILLID_Renew_Life + Return True + Case 963 ; $SKILLID_Restoration + Return True + Case 314 ; $SKILLID_Restore_Life + Return True + Case 305 ; $SKILLID_Resurrect + Return True + Case 1128 ; $SKILLID_Resurrection_Chant + Return True + Case 2 ; $SKILLID_Resurrection_Signet + Return True + Case 1778 ; $SKILLID_Signet_of_Return + Return True + Case 1816 ; $SKILLID_Sunspear_Rebirth_Signet + Return True + Case 268 ; $SKILLID_Unyielding_Aura + Return True + Case 315 ; $SKILLID_Vengeance + Return True + Case Else + Return False + EndSwitch +EndFunc ;==>IsResSkill + +;~ Description: Returns true if skill requires target to be below 50%. +Func IsBelow50PercentEnemySkill($aSkill) ; + If IsPtr($aSkill) <> 0 Then + Local $lSkillID = MemoryRead($aSkill, 'long') + ElseIf IsDllStruct($aSkill) <> 0 Then + Local $lSkillID = DllStructGetData($aSkill, 'ID') + Else + Local $lSkillID = $aSkill + EndIf + Switch $lSkillID +;~ PvE only skills + Case 2353 ; $SKILLID_Finish_Him + Return True +;~ Warrior Skills + Case 385 ; $SKILLID_Final_Thrust ; Bonus damage triggers below 50% + Return True +;~ Ranger Skills + Case 444 ; $SKILLID_Burtal_Strike ; Bonus damage triggers below 50% + Return True + Case 1197 ; $SKILLID_Needling_Shot + Return True +;~ Monk Skills + Case 282 ; $SKILLID_Word_of_Healing ; Elite Healing skill + Return True + Case 1687 ; $SKILLID_Zealous_Benediction ; Elite Protection Skill + Return True +;~ Necro Skills + Case 1365 ; $SKILLID_Signet_of_Lost_Souls + Return True + Case 1069 ; $SKILLID_Taste_of_Pain + Return True +;~ Assassin Skills (ignoring self target skills like Shadow Shroud and Moebius Strike) + Case 1646 ; $SKILLID_Augury_of_Death ; shadow steps to them when <50% health + Return True +;~ignored all self targetting skills that trigger on <50% + Case Else + Return False + EndSwitch +EndFunc ;==>IsBelow50PercentEnemySkill + +;~ Description: Returns true if skill is a hex removal skill. +Func IsHexRemovalSkill($aSkill) + If IsPtr($aSkill) <> 0 Then + Return BitAND(MemoryRead($aSkill + 32, 'long'), 2048) + ElseIf IsDllStruct($aSkill) <> 0 Then + Return BitAND(DllStructGetData($aSkill, 'Effect2'), 2048) + Else + Return BitAND(MemoryRead(GetSkillPtr($aSkill) + 32, 'long'), 2048) + EndIf +EndFunc ;==>IsHexRemovalSkill + +;~ Description: Returns true if skill is a condition removal skill. +Func IsConditionRemovalSkill($aSkill) + If IsPtr($aSkill) <> 0 Then + Return BitAND(MemoryRead($aSkill + 32, 'long'), 4096) + ElseIf IsDllStruct($aSkill) <> 0 Then + Return BitAND(DllStructGetData($aSkill, 'Effect2'), 4096) + Else + Return BitAND(MemoryRead(GetSkillPtr($aSkill) + 32, 'long'), 4096) + EndIf +EndFunc ;==>IsConditionRemovalSkill +#EndRegion + +#Region Target +;~ Description: Returns true if skill is a self-target skill. +Func TargetSelfSkill($aSkill) + If IsPtr($aSkill) <> 0 Then + Return MemoryRead($aSkill + 49, 'byte') = 0 + ElseIf IsDllStruct($aSkill) <> 0 Then + Return DllStructGetData($aSkill, 'Target') = 0 + Else + Return MemoryRead(GetSkillPtr($aSkill) + 49, 'byte') = 0 + EndIf +EndFunc ;==>TargetSelfSkill + +;~ Description: Returns true if skill is a spirit-target skill. +Func TargetSpiritSkill($aSkill) + If IsPtr($aSkill) <> 0 Then + Return MemoryRead($aSkill + 49, 'byte') = 1 + ElseIf IsDllStruct($aSkill) <> 0 Then + Return DllStructGetData($aSkill, 'Target') = 1 + Else + Return MemoryRead(GetSkillPtr($aSkill) + 49, 'byte') = 1 + EndIf +EndFunc ;==>TargetSpiritSkill + +;~ Description: Returns true if skill works on allies. +Func TargetAllySkill($aSkill) + If IsPtr($aSkill) <> 0 Then + Return MemoryRead($aSkill + 49, 'byte') = 3 + ElseIf IsDllStruct($aSkill) <> 0 Then + Return DllStructGetData($aSkill, 'Target') = 3 + Else + Return MemoryRead(GetSkillPtr($aSkill) + 49, 'byte') = 3 + EndIf +EndFunc ;==>TargetAllySkill + +;~ Description: Returns true if skill works on other allies only. +Func TargetOtherAllySkill($aSkill) + If IsPtr($aSkill) <> 0 Then + Return MemoryRead($aSkill + 49, 'byte') = 4 + ElseIf IsDllStruct($aSkill) <> 0 Then + Return DllStructGetData($aSkill, 'Target') = 4 + Else + Return MemoryRead(GetSkillPtr($aSkill) + 49, 'byte') = 4 + EndIf +EndFunc ;==>TargetOtherAllySkill + +;~ Description: Returns true if skill works on targetted enemies. +Func TargetEnemySkill($aSkill) + If IsPtr($aSkill) <> 0 Then + Return MemoryRead($aSkill + 49, 'byte') = 5 + ElseIf IsDllStruct($aSkill) <> 0 Then + Return DllStructGetData($aSkill, 'Target') = 5 + Else + Return MemoryRead(GetSkillPtr($aSkill) + 49, 'byte') = 5 + EndIf +EndFunc ;==>TargetEnemySkill + +;~ Description: Returns true if skill works on dead allies. +Func TargetDeadAllySkill($aSkill) + If IsPtr($aSkill) <> 0 Then + Return MemoryRead($aSkill + 49, 'byte') = 6 + ElseIf IsDllStruct($aSkill) <> 0 Then + Return DllStructGetData($aSkill, 'Target') = 6 + Else + Return MemoryRead(GetSkillPtr($aSkill) + 49, 'byte') = 6 + EndIf +EndFunc ;==>TargetDeadAllySkill + +;~ Description: Returns true if skill works on minions. +Func TargetMinionSkill($aSkill) + If IsPtr($aSkill) <> 0 Then + Return MemoryRead($aSkill + 49, 'byte') = 14 + ElseIf IsDllStruct($aSkill) <> 0 Then + Return DllStructGetData($aSkill, 'Target') = 14 + Else + Return MemoryRead(GetSkillPtr($aSkill) + 49, 'byte') = 14 + EndIf +EndFunc ;==>TargetMinionSkill + +;~ Description: Returns true if skill has a ground AOE target. +Func TargetGroundSkill($aSkill) + If IsPtr($aSkill) <> 0 Then + Return MemoryRead($aSkill + 49, 'byte') = 16 + ElseIf IsDllStruct($aSkill) <> 0 Then + Return DllStructGetData($aSkill, 'Target') = 16 + Else + Return MemoryRead(GetSkillPtr($aSkill) + 49, 'byte') = 16 + EndIf +EndFunc ;==>TargetGroundSkill +#EndRegion + +#Region Ptr +;~ Description: Returns skillptr by SkillID. +Func GetSkillPtr($aSkillID) + Return Ptr($mSkillBase + 160 * $aSkillID) +EndFunc ;==>GetSkillPtr +#EndRegion Ptr +#EndRegion + +#Region UseSkill +;~ Description: Use a skill via asm call. +Func UseSkill($aSkillSlot, $aTarget, $aCallTarget = False) + If IsPtr($aTarget) <> 0 Then + Local $lTargetID = MemoryRead($aTarget + 44, 'long') + ElseIf IsDllStruct($aTarget) <> 0 Then + Local $lTargetID = DllStructGetData($aTarget, 'ID') + Else + Local $lTargetID = ConvertID($aTarget) + EndIf + DllStructSetData($mUseSkill, 2, $aSkillSlot) + DllStructSetData($mUseSkill, 3, $lTargetID) + DllStructSetData($mUseSkill, 4, $aCallTarget) + Return Enqueue($mUseSkillPtr, 16) +EndFunc ;==>UseSkill + +;~ Description: Use skill with death check, energy check. +Func UseSkillEx($aSkillSlot, $aTarget = -2, $aTimeout = 3000, $aSkillbarPtr = GetSkillbarPtr(0), $aMe = GetAgentPtr(-2)) + If IsPtr($aTarget) <> 0 Then + Local $lTargetPtr = $aTarget + Else + Local $lTargetPtr = GetAgentPtr($aTarget) + EndIf + If $lTargetPtr = 0 Then Return ; no target found + If GetSkillbarSkillRecharge($aSkillSlot, 0, $aSkillbarPtr) <> 0 Then Return + Local $lDeadlock = TimerInit() + ChangeTarget($aTarget) + Local $lSkillPtr = GetSkillPtr(GetSkillbarSkillID($aSkillSlot, 0, $aSkillbarPtr)) + If GetEnergy($aMe) < MemoryRead($lSkillPtr + 53, 'byte') Then Return ; not enough energy + If Not UseSkill($aSkillSlot, $aTarget) Then Return + Update("Using skill " & $aSkillSlot & ".") + Do + Sleep(50) + If GetIsDead($aMe) Then Return ; only me died + If GetIsDead($lTargetPtr) Then Return ; target died + If TimerDiff($lDeadlock) > $aTimeout Then Return + Until GetSkillbarSkillRecharge($aSkillSlot, 0, $aSkillbarPtr) <> 0 + Return True +EndFunc ;==>UseSkillEx + +;~ Description: Finds skillslot via skillID and uses that skill if found. +Func UseSkillByID($aSkillID, $aAgentID = 0, $aSkillbarPtr = GetSkillbarPtr(0), $aMe = GetAgentPtr(-2)) + For $i = 0 to 7 + If GetSkillbarSkillID($i, 0, $aSkillbarPtr) = $aSkillID Then + Return UseSkillEx($i+1, $aAgentID, Default, $aSkillbarPtr, $aMe) + EndIf + Next +EndFunc ;==>UseSkillByID + +;~ Description: Uses packetsend instead of asm call to use skill. +;~ TargetType -> 0 = friendly (self, ally, npc), everything else = enemy +Func UseSkillBySkillID($aSkillID, $aTargetType = 0, $aAgentID = -2) + If $aTargetType = 0 Then + Return SendPacket(0x14, $CtoGS_MSG_UseSkill, $aSkillID, 0, ConvertID($aAgentID), 0) ;~ old -> Return SendPacket(0x14, 0x40, $aSkillID, 0, ConvertID($aAgentID), 0) + Else + Return SendPacket(0x14, $CtoGS_MSG_UseSkill, $aSkillID, 0, ConvertID($aAgentID), 0) ;~ old -> Return SendPacket(0x14, 0x21, $aSkillID, 0, ConvertID($aAgentID), 0) + EndIf +EndFunc ;==>UseSkillBySkillID +#EndRegion + +#Region Buffs +#Region Ptr +;~ Description: Returns ptr to maintained buff. +Func GetBuffPtr($aBuffNumber, $aHeroNumber = 0, $aHeroID = GetHeroID($aHeroNumber)) + If $BuffBasePtr = 0 Then $BuffBasePtr = MemoryRead($mBasePtr182C + 0x508, 'ptr') + For $i = 0 To MemoryRead($mBasePtr182C + 0x510) - 1 + If MemoryRead($BuffBasePtr + 0x24 * $i) = $aHeroID Then + Return Ptr(MemoryRead($BuffBasePtr + 0x4 + 0x24 * $i, 'ptr') + 0x10 * ($aBuffNumber - 1)) + EndIf + Next +EndFunc ;==>GetBuffPtr + +;~ Description: Returns array with pointers to buffs maintained by heronumber/heroid. +Func GetBuffPtrArray($aHeroNumber = 0, $aHeroID = GetHeroID($aHeroNumber)) + If $BuffBasePtr = 0 Then $BuffBasePtr = MemoryRead($mBasePtr182C + 0x508, 'ptr') + Local $lHeroTempPtr = 0 + Local $lBuffcount = 0 + For $i = 0 To MemoryRead($mBasePtr182C + 0x510) - 1 + If MemoryRead($BuffBasePtr + 0x24 * $i) = $aHeroID Then + $lHeroTempPtr = Ptr(MemoryRead($BuffBasePtr + 0x4 + 0x24 * $i, 'ptr')) + $lBuffcount = MemoryRead($BuffBasePtr + 0x24 * $i + 0xC) + ExitLoop + EndIf + Next + If $lHeroTempPtr = 0 Then Return 0 + Local $lBuffArray[$lBuffcount + 1] + $lBuffArray[0] = $lBuffcount + For $i = 1 To $lBuffcount + $lBuffArray[$i] = Ptr($lHeroTempPtr + 0x10 * ($i-1)) + Next + Return $lBuffArray +EndFunc ;==>GetBuffPtrArray +#EndRegion Ptr + +;~ Description: Returns current number of buffs being maintained. +Func GetBuffCount($aHeroNumber = 0, $aHeroID = GetHeroID($aHeroNumber)) + If $BuffBasePtr = 0 Then $BuffBasePtr = MemoryRead($mBasePtr182C + 0x508, 'ptr') + Local $lBuffer + For $i = 0 To MemoryRead($mBasePtr182C + 0x510) - 1 + If MemoryRead($BuffBasePtr + 0x24 * $i) = $aHeroID Then Return MemoryRead($BuffBasePtr + 0x24 * $i + 0xC) + Next +EndFunc ;==>GetBuffCount + +;~ Description: Tests if you are currently maintaining buff on Agent. +;~ Returns 0 if not, buffnumber if buff is being maintained on Agent. +Func GetIsTargetBuffed($aSkillID, $aAgentID, $aHeroNumber = 0, $aHeroID = GetHeroID($aHeroNumber)) + Local $lBuffCount = GetBuffCount($aHeroNumber) + Local $lPtr + For $i = 1 To $lBuffCount + $lPtr = GetBuffPtr($i, $aHeroNumber, $aHeroID) + If MemoryRead($lPtr, 'long') = $aSkillID And MemoryRead($lPtr + 12, 'long') = ConvertID($aAgentID) Then + Return $i + EndIf + Next +EndFunc ;==>GetIsTargetBuffed + +;~ Description: Stop maintaining enchantment on target. +Func DropBuff($aSkillID, $aAgentID, $aHeroNumber = 0, $aHeroID = GetHeroID($aHeroNumber)) + Local $lBuffs = GetBuffPtrArray($aHeroNumber, $aHeroID) + If $lBuffs = 0 Then Return -1 ; no buffs being maintained + $aAgentID = ConvertID($aAgentID) + For $i = 1 To $lBuffs[0] + If MemoryRead($lBuffs[$i], 'long') = $aSkillID And MemoryRead($lBuffs[$i] + 12, 'long') = $aAgentID Then + Return SendPacket(0x8, $CtoGS_MSG_DropBuff, MemoryRead($lBuffs[$i] + 8, 'long')) + EndIf + Next +EndFunc ;==>DropBuff + +;~ Description: Drops all bonds. +Func DropAllBonds($aHeroNumber = 0, $aHeroID = GetHeroID($aHeroNumber)) + Local $lBuffs = GetBuffPtrArray($aHeroNumber, $aHeroID) + If $lBuffs = 0 Then Return -1 ; no buffs being maintained + Local $lSkillID = 0 + For $i = 1 To $lBuffs[0] + $lSkillID = MemoryRead($lBuffs[$i], 'long') + If $lSkillID = 263 Or $lSkillID = 244 Or $lSkillID = 242 Then ; $SKILLID_Protective_Bond, $SKILLID_Life_Attunement, $SKILLID_Balthazars_Spirit + SendPacket(0x8, $CtoGS_MSG_DropBuff, MemoryRead($lBuffs[$i] + 8, 'long')) + Sleep(50) + EndIf + Next +EndFunc ;==>DropAllBonds + +;~ Description: Drops all buffs $aHeroNumber maintains. +Func DropAllBuffs($aHeroNumber = 0, $aHeroID = GetHeroID($aHeroNumber)) + Local $lBuffs = GetBuffPtrArray($aHeroNumber, $aHeroID) + If $lBuffs = 0 Then Return -1 ; no buffs being maintained + Local $lDroppedBuff = False + For $i = 1 To $lBuffs[0] + SendPacket(0x8, $CtoGS_MSG_DropBuff, MemoryRead($lBuffs[$i] + 8, 'long')) + Sleep(50) + $lDroppedBuff = True + Next + Return $lDroppedBuff +EndFunc ;==>DropAllBuffs +#EndRegion + +#Region SkillEffects and co. +#Region Ptr +;~ Description: Returns ptr to effect by SkillID. +Func GetSkillEffectPtr($aSkillID, $aHeroNumber = 0, $aHeroID = GetHeroID($aHeroNumber)) + If $BuffBasePtr = 0 Then $BuffBasePtr = MemoryRead($mBasePtr182C + 0x508, 'ptr') + Local $lEffectCount = 0 + Local $lTemp = 0 + Local $lEffectBasePtr = 0 + For $i = 0 To MemoryRead($mBasePtr182C + 0x510) - 1 + $lTemp = 0x24 * $i + If MemoryRead($BuffBasePtr + $lTemp) = $aHeroID Then + $lEffectCount = MemoryRead($BuffBasePtr + $lTemp + 0x1C) + $lEffectBasePtr = MemoryRead($BuffBasePtr + $lTemp + 0x14, 'ptr') + For $j = 0 To $lEffectCount - 1 + If MemoryRead($lEffectBasePtr + 24 * $j, 'long') = $aSkillID Then Return Ptr($lEffectBasePtr + 24 * $j) + Next + EndIf + Next +EndFunc ;==>GetSkillEffectPtr + +;~ Description: Returns ptr to effect by EffectNumber. +Func GetSkillEffectPtrByEffectnumber($aEffectNumber, $aHeroNumber = 0, $aHeroID = GetHeroID($aHeroNumber)) + If $BuffBasePtr = 0 Then $BuffBasePtr = MemoryRead($mBasePtr182C + 0x508, 'ptr') + Local $lEffectCount = 0 + Local $lTemp = 0 + Local $lEffectBasePtr = 0 + For $i = 0 To MemoryRead($mBasePtr182C + 0x510) - 1 + $lTemp = 0x24 * $i + If MemoryRead($BuffBasePtr + $lTemp) = $aHeroID Then + $lEffectBasePtr = MemoryRead($BuffBasePtr + $lTemp + 0x14, 'ptr') + Return Ptr($lEffectBasePtr + 24 * ($aEffectNumber)) + EndIf + Next +EndFunc ;==>GetSkillEffectPtrByEffectnumber + +;~ Description: Returns array of effectptr on agent. +Func GetEffectsPtr($aSkillID = 0, $aHeroNumber = 0, $aHeroID = GetHeroID($aHeroNumber)) + If $BuffBasePtr = 0 Then $BuffBasePtr = MemoryRead($mBasePtr182C + 0x508, 'ptr') + Local $lEffectCount = 0 + Local $lTemp = 0 + Local $lEffectBasePtr = 0 + For $i = 0 To MemoryRead($mBasePtr182C + 0x510) - 1 + $lTemp = 0x24 * $i + If MemoryRead($BuffBasePtr + $lTemp) = $aHeroID Then + $lEffectCount = MemoryRead($BuffBasePtr + $lTemp + 0x1C) + $lEffectBasePtr = MemoryRead($BuffBasePtr + $lTemp + 0x14, 'ptr') + If $aSkillID = 0 Then + Local $lReturnArray[$lEffectCount + 1] + $lReturnArray[0] = $lEffectCount + For $j = 1 To $lEffectCount + $lReturnArray[$j] = Ptr($lEffectBasePtr + 24 * ($j - 1)) + Next + Return $lReturnArray + Else + Local $lReturnArray[2] = [0, 0] + For $j = 0 To $lEffectCount - 1 + If MemoryRead($lEffectBasePtr + 24 * $j, 'long') = $aSkillID Then + $lReturnArray[0] = 1 + $lReturnArray[1] = Ptr($lEffectBasePtr + 24 * $j) + Return $lReturnArray + EndIf + Next + EndIf + EndIf + Next +EndFunc ;==>GetEffectsPtr +#EndRegion Ptr + +;~ Description: Returns True if you're under the effect of $aEffectSkillID. +Func HasEffect($aEffectSkillID, $aHeroNumber = 0, $aHeroID = GetHeroID($aHeroNumber)) + Return GetSkillEffectPtr($aEffectSkillID, $aHeroNumber, $aHeroID) <> 0 +EndFunc ;==>HasEffect + +;~ Description: Returns time remaining before an effect expires, in milliseconds. SkillTimer does NOT work when rendering disabled. +Func GetEffectTimeRemaining($aEffect) + If IsArray($aEffect) Then Return 0 + If $aEffect = 0 Then Return 0 + If IsPtr($aEffect) <> 0 Then + Local $lTimeStamp = MemoryRead($aEffect + 20, 'long') + Local $lDuration = MemoryRead($aEffect + 16, 'float') + ElseIf IsDllStruct($aEffect) <> 0 Then + Local $lTimeStamp = DllStructGetData($aEffect, 'TimeStamp') + Local $lDuration = DllStructGetData($aEffect, 'Duration') + Else + Local $lPtr = GetSkillEffectPtr($aEffect) + If $lPtr = 0 Then Return 0 + Local $lTimeStamp = MemoryRead($lPtr + 20, 'long') + Local $lDuration = MemoryRead($lPtr + 16, 'float') + EndIf + Local $lReturn = $lDuration * 1000 - (GetSkillTimer() - $lTimeStamp) + If $lReturn < 0 Then Return 0 + Return $lReturn +EndFunc ;==>GetEffectTimeRemaining +#EndRegion + +#Region Misc +;~ Description: Change your secondary profession. +Func ChangeSecondProfession($aProfession, $aHeroNumber = 0, $aHeroID = GetHeroID($aHeroNumber)) + Return SendPacket(0xC, $CtoGS_MSG_ChangeSecondary, $aHeroID, $aProfession) +EndFunc ;==>ChangeSecondProfession +#EndRegion diff --git a/gwApi/smartcast.au3 b/gwApi/smartcast.au3 index fdb6874..642a998 100644 --- a/gwApi/smartcast.au3 +++ b/gwApi/smartcast.au3 @@ -1,468 +1,469 @@ -#include-once -#include - -;~ Description: Internal use Smartcast(). -Func CanUseSkill($aSkillSlot, $aSkillbar, $aEnergy = 0, $aSoftCounter = 0) - If $mSkillSoftCounter > $aSoftCounter Then Return False - If $mEnergy < $aEnergy Then Return False - Local $lSkillPtr = $mSkillbarCachePtr[$aSkillSlot] - If GetSkillbarSkillRecharge($aSkillSlot, 0, $aSkillbar) = 0 Then - If GetSkillbarSkillAdrenaline($aSkillSlot, 0, $aSkillbar) < $mSkillbarCacheArray[$aSkillSlot][7] Then Return False - Switch $mSkillbarCacheArray[$aSkillSlot][1] - Case 14 - If $mBlind Then Return False - If $mAttackHardCounter Then Return False - If $mAttackSoftCounter > $aSoftCounter Then Return False - Case 4, 5, 6, 9, 11, 24, 25 - If $mSpellSoftCounter > $aSoftCounter Then Return False - If $mDazed Then - If $mSkillbarCacheArray[$aSkillSlot][8] > .25 Then Return False ; activation - EndIf - Switch $mSkillbarCacheArray[$aSkillSlot][5] ; target - Case 3, 4 - If $mAllySpellHardCounter Then Return False - Case 5, 16 - If $mEnemySpellHardCounter Then Return False - EndSwitch - EndSwitch - Return True - EndIf - Return False -EndFunc ;==>CanUseSkill - -;~ Description: Use Rez skill. Internal use Smartcast(). -Func RezParty($RezSkill, $aMe = GetAgentPtr(-2)) - Local $lAgentX, $lAgentY, $lMeX, $lMeY - Local $lBlocked = 0, $theta - If MemoryRead($mTeamDead[1] + 433, 'byte') = 1 Then - Do -;~ Death() - UpdateAgentPosByPtr($mTeamDead[1], $lAgentX, $lAgentY) - Move($lAgentX, $lAgentY, 250) - RndSleep(500) - If Not GetIsMoving($aMe) Then - $lBlocked += 1 - UpdateAgentPosByPtr($mTeamDead[1], $lAgentX, $lAgentY) - Move($lAgentX, $lAgentY, 250) - Sleep(200) - If Mod($lBlocked, 5) = 0 And Not GetIsMoving($aMe) Then - $theta = Random(0, 360) - UpdateAgentPosByPtr($aMe, $lMeX, $lMeY) - Move(200 * Cos($theta * 0.01745) + $lMeX, 200 * Sin($theta * 0.01745) + $lMeY, 0) - PingSleep(500) - EndIf - EndIf - UpdateAgentPosByPtr($aMe, $lMeX, $lMeY) - Until ComputeDistance($lMeX, $lMeY, $lAgentX, $lAgentY) < 600 Or $lBlocked > 50 - UseRezSkillEx($RezSkill, $mTeamDead[1]) - EndIf -EndFunc ;==>RezParty - -;~ Description: Use rez with death check, longer timeout and checks if target is alive. -Func UseRezSkillEx($aSkillSlot, $aTarget, $aTimeOut = 7000, $aSkillbarPtr = GetSkillbarPtr(0), $aMe = GetAgentPtr(-2)) - If IsPtr($aTarget) <> 0 Then - Local $lTargetID = MemoryRead($aTarget + 44, 'long') - Local $lTarget = $aTarget - ElseIf IsDllStruct($aTarget) <> 0 Then - Local $lTargetID = DllStructGetData($aTarget, 'ID') - Local $lTarget = GetAgentPtr($lTargetID) - Else - Local $lTargetID = ConvertID($aTarget) - Local $lTarget = GetAgentPtr($lTargetID) - EndIf - If $lTarget = 0 Or $lTargetID = 0 Then Return ; no target found - Local $lDeadlock = TimerInit() - ChangeTarget($lTargetID) - UseSkill($aSkillSlot, $lTargetID) - Do - Sleep(50) - If GetIsDead($aMe) Then -;~ Death($mPartyArray, $aMe) - Return - EndIf - If TimerDiff($lDeadlock) > $aTimeOut Then Return - Until GetSkillbarSkillRecharge($aSkillSlot, 0, $aSkillbarPtr) <> 0 Or Not GetIsDead($lTarget) - If GetIsCasting($aMe) Then CancelAction() -EndFunc ;==>UseRezSkillEx - -;~ Description: Returns TRUE if skillbars are identical. -Func CheckSkillbarCache() - For $i = 1 To 8 - If $mSkillbarCache[$i] <> GetSkillbarSkillID($i) Then - $mSkillbarCache[0] = False - Return False - EndIf - Next - Return True -EndFunc ;==>CheckSkillbarCache - -;~ Description: Similar to original CacheSkillbar, but instead of storing whole skillstruct, this one only stores a few values in a 2D array. -;~ $CacheSkillArray[9][11] = [['ID', 'Type', 'Special', 'Effect1', 'Condition', 'Target', 'EnergyCost', 'Adrenaline', 'Activation', 'Aftercast', 'Recharge']] -;~ Use: $CacheSkillArray[7][2] -> 'Special' of skill in skillslot 7. -Func CacheSkillbar() - If $mSkillbarCache[0] Then Return ; already cached - If $mSkillbarCacheStruct[0] Then Return ; dont mix up your cacheskillbar functions - $mSkillbarPtr = GetSkillbarPtr() - Local $lSkillStruct1, $lSkillStruct2, $lEnergy - For $i = 1 To 8 - $mSkillbarCache[$i] = GetSkillbarSkillID($i) - $mSkillbarCachePtr[$i] = GetSkillPtr($mSkillbarCache[$i]) - $lSkillStruct1 = MemoryReadStruct($mSkillbarCachePtr[$i] + 12, 'long Type;long Special;long Effect1;long Condition') - $lSkillStruct2 = MemoryReadStruct($mSkillbarCachePtr[$i] + 56, 'dword Adrenaline;float Activation;float Aftercast') - $mSkillbarCacheArray[$i][0] = $mSkillbarCache[$i] ; ID - $mSkillbarCacheArray[$i][1] = DllStructGetData($lSkillStruct1, 'Type') ; Type - $mSkillbarCacheArray[$i][2] = DllStructGetData($lSkillStruct1, 'Special') ; Special - $mSkillbarCacheArray[$i][3] = DllStructGetData($lSkillStruct1, 'Effect1') ; Effect1 - $mSkillbarCacheArray[$i][4] = DllStructGetData($lSkillStruct1, 'Condition') ; Condition - $mSkillbarCacheArray[$i][5] = MemoryRead($mSkillbarCachePtr[$i] + 49, 'byte') ; Target - $mSkillbarCacheArray[$i][7] = DllStructGetData($lSkillStruct2, 'Adrenaline') ; Adrenaline - $mSkillbarCacheArray[$i][8] = DllStructGetData($lSkillStruct2, 'Activation') ; Activation - $mSkillbarCacheArray[$i][9] = DllStructGetData($lSkillStruct2, 'Aftercast') ; Aftercast - $mSkillbarCacheArray[$i][10] = MemoryRead($mSkillbarCachePtr[$i] + 79, 'long') ; Recharge - If $mSkillbarCacheArray[$i][7] > 0 Then - $SkillAdrenalineReq[$i] = $mSkillbarCacheArray[$i][7] - $SkillAdrenalineReq[0] = True - $mSkillbarCacheEnergyReq[$i] = 0 - Update("Skill " & $i & " requires " & $mSkillbarCacheArray[$i][7] & " Adrenaline.", "Skills") - Else - $SkillAdrenalineReq[$i] = 0 - $lEnergy = MemoryRead($mSkillbarCachePtr[$i] + 53, 'byte') ; EnergyCost - Switch $lEnergy - Case 11 - $mSkillbarCacheArray[$i][6] = 15 - Case 12 - $mSkillbarCacheArray[$i][6] = 25 - Case Else - $mSkillbarCacheArray[$i][6] = $lEnergy - EndSwitch - $mSkillbarCacheEnergyReq[$i] = $mSkillbarCacheArray[$i][6] - Update("Skill " & $i & " requires " & $mSkillbarCacheEnergyReq[$i] & " energy.", "Skills") - EndIf - $mSkillPriorityRating[$i][1] = 0 - $SkillDamageAmount[$i] = SkillDamageAmount($mSkillbarCachePtr[$i]) - $mSkillPriorityRating[$i][0] = $i - If IsEliteSkill($mSkillbarCachePtr[$i]) Then $mSkillPriorityRating[$i][1] = 30 - If $mSkillbarCache[$i] = 2358 Then ; YMLAD - 1 - $IsYMLAD[$i] = True - $IsYMLAD[0] = True - $YMLADSlot = $i - $mSkillPriorityRating[$i][1] = 120 - $i - $mSkillPriorityRating[$i][2] = 1 - Update("Skill " & $i & " is YMLAD! Priority: " & $mSkillPriorityRating[$i][1] & ".", "Skills") - ContinueLoop - EndIf - If IsInterruptSkill($mSkillbarCachePtr[$i]) Then ; Interrupt - 2 - $mSkillPriorityRating[$i][1] += 110 - $i - $mSkillPriorityRating[$i][2] = 2 - $IsInterrupt[$i] = True - $IsInterrupt[0] = True - Update("Skill " & $i & " is an Interrupt Skill, Priority: " & $mSkillPriorityRating[$i][1] & ".", "Skills") - ContinueLoop - EndIf - If IsHexRemovalSkill($mSkillbarCachePtr[$i]) Then ; Hex Removal ; 8 - $mSkillPriorityRating[$i][1] = 55 - $i - $mSkillPriorityRating[$i][2] = 8 - Update("Skill " & $i & " is a Hex Remover, Priority: " & $mSkillPriorityRating[$i][1] & ".", "Skills") - ContinueLoop - EndIf - ; Condition Removal ; 9 - If IsConditionRemovalSkill($mSkillbarCachePtr[$i]) Then - $mSkillPriorityRating[$i][1] = 50 - $i - $mSkillPriorityRating[$i][2] = 9 - Update("Skill " & $i & " is a Condition Remover, Priority: " & $mSkillPriorityRating[$i][1] & ".", "Skills") - ContinueLoop - EndIf - ; Res Skill ; 13 - If IsResSkill($mSkillbarCachePtr[$i]) Then - $mSkillPriorityRating[$i][1] = 20 - $i - $mSkillPriorityRating[$i][2] = 13 - Update("Skill " & $i & " is a Rez, Priority: " & $mSkillPriorityRating[$i][1] & ".", "Skills") - ContinueLoop - EndIf - ; Heal ; 3 - If IsHealSkill($mSkillbarCachePtr[$i]) Then - ; Heal Other ; 4 - If TargetOtherAllySkill($mSkillbarCachePtr[$i]) Then - $mSkillPriorityRating[$i][1] += 75 - $i - $mSkillPriorityRating[$i][2] = 4 - Update("Skill " & $i & " heals other ally for " & $SkillDamageAmount[$i] & ", Priority: " & $mSkillPriorityRating[$i][1] & ".", "Skills") - ContinueLoop - EndIf - $IsHealingSpell[$i] = True - $IsHealingSpell[0] = True - $mSkillPriorityRating[$i][1] += 80 - $i + $SkillDamageAmount[$i] - $mSkillPriorityRating[$i][2] = 3 - Update("Skill " & $i & " heals ally for " & $SkillDamageAmount[$i] & ", Priority: " & $mSkillPriorityRating[$i][1] & ".", "Skills") - ContinueLoop - EndIf - ; AOE Skills ; 5 - If SkillAOERange($mSkillbarCachePtr[$i]) > 0 Then - If TargetEnemySkill($mSkillbarCachePtr[$i]) Or TargetGroundSkill($mSkillbarCachePtr[$i]) Then - $mSkillPriorityRating[$i][1] += 70 - $i - $mSkillPriorityRating[$i][2] = 5 - Update("Skill " & $i & " does AOE damage of " & $SkillDamageAmount[$i] & ", Priority: " & $mSkillPriorityRating[$i][1] & ".", "Skills") - ContinueLoop - EndIf - EndIf - ; Soul Twisting ; 6 - If $mSkillbarCache[$i] = 1240 Then ; $SKILLID_Soul_Twisting - $IsSoulTwistingSpell[$i] = True - $IsSoulTwistingSpell[0] = True - $mSkillPriorityRating[$i][1] = 65 - $i - $mSkillPriorityRating[$i][2] = 6 - Update("Skill " & $i & " is Soul Twisting, Priority: " & $mSkillPriorityRating[$i][1] & ".", "Skills") - ContinueLoop - EndIf - ; Spirits ; 7 - If IsSpiritSkill($mSkillbarCachePtr[$i]) Then - $mSkillPriorityRating[$i][1] += 60 - $i - $mSkillPriorityRating[$i][2] = 7 - Update("Skill " & $i & " is a Spirit Skill, Priority: " & $mSkillPriorityRating[$i][1] & ".", "Skills") - ContinueLoop - EndIf - ; Weapon Spell ; 10 - If IsWeaponSpell($mSkillbarCachePtr[$i]) Then - $IsWeaponSpell[$i] = True - $IsWeaponSpell[0] = True - $mSkillPriorityRating[$i][1] += 40 - $i - $mSkillPriorityRating[$i][2] = 10 - Update("Skill " & $i & " is a Weapon Skill, Priority: " & $mSkillPriorityRating[$i][1] & ".", "Skills") - ContinueLoop - EndIf - ; Enchantment Strip ; 11 - If IsEnchantmentStrip($mSkillbarCachePtr[$i]) Then - $mSkillPriorityRating[$i][1] += 35 - $i - $mSkillPriorityRating[$i][2] = 11 - Update("Skill " & $i & " is a Enchantment Strip, Priority: " & $mSkillPriorityRating[$i][1] & ".", "Skills") - ContinueLoop - EndIf - ; General Attack ; 12 - If TargetEnemySkill($mSkillbarCachePtr[$i]) Then - $mSkillPriorityRating[$i][1] += 30 - $i - If IsPvESkill($mSkillbarCacheStruct[$i]) Then $mSkillPriorityRating[$i][1] += 100 - $mSkillPriorityRating[$i][2] = 12 - Update("Skill " & $i & " Vs. enemies for " & $SkillDamageAmount[$i] & " damage, Priority: " & $mSkillPriorityRating[$i][1] & ".", "Skills") - ContinueLoop - EndIf - ; Asuran Summon ; 15 - If IsSummonSkill($mSkillbarCache[$i]) Then - $IsSummonSpell[$i] = True - $IsSummonSpell[0] = True - $mSkillPriorityRating[$i][1] = 0 - $i - $mSkillPriorityRating[$i][2] = 15 - Update("Skill " & $i & " is a Summon, Priority: " & $mSkillPriorityRating[$i][1] & ".", "Skills") - ContinueLoop - EndIf - ; Self-Target, Summon spirits, enchantments ; 14 - If TargetSelfSkill($mSkillbarCachePtr[$i]) Then - $IsSelfCastingSpell[$i] = True - $IsSelfCastingSpell[0] = True - $mSkillPriorityRating[$i][1] += 10 - $i - $mSkillPriorityRating[$i][2] = 14 - Update("Skill " & $i & " is a Self Targeting Skill, Priority: " & $mSkillPriorityRating[$i][1] & ".", "Skills") - ContinueLoop - EndIf - Next -;~ Local $lMyProfession = GetHeroProfession(0) -;~ Local $lAttrPrimary = GetProfPrimaryAttribute($lMyProfession) - _ArraySort($mSkillPriorityRating, 0, 0, 0, 1) - $mSkillbarCache[0] = True - $mSkillbarCachePtr[0] = True -EndFunc ;==>CacheSkillbar - -;~ Description: SmartCast by JCaulton, 4D1, Savsud. -;~ Required functions: CacheSkillbar, DropBundle, RezParty, CanUseSkill, UseSkillEx -;~ GetStatus: GetSkillbarSkillAdrenaline, GetDistance, GetSkillbarSkillRecharge, GetMapLoading, GetIsDead -;~ Skilleffects: IsAntiMeleeSkill, GetHasWeaponSpell, HasEffect, IsHealingSpell, IsHexSpell, IsConditionSpell, IsBelow50PercentEnemySkill -Func SmartCast($aMe = GetAgentPtr(-2)) - #Region Variables - If GetIsDead($aMe) Then Return False - If GetMapLoading() <> 1 Then Return True ; $INSTANCETYPE_EXPLORABLE - If Not $mSkillbarCache[0] Then -;~ $mSkillbarPtr = GetSkillbarPtr() - CacheSkillbar() - EndIf - #EndRegion Variables - - #Region Specific Skills - If $IsHealingSpell[0] Then - If HasEffect(1219) Then ; $SKILLID_Protective_Was_Kaolai - If $mAverageTeamHP < 0.80 Or $mLowestAllyHP < 0.3 Then - DropBundle() - Return - EndIf - EndIf - EndIf - #EndRegion Specific Skills - - ; Skill usage - Local $i, $IsAntiMeleeSkill, $IsHexingSpell, $IsConditioningSpell, $IsBelow50 - For $r = 8 To 1 Step -1 ; Skill priority set in Ascending order. - $i = $mSkillPriorityRating[$r][0] ; [0] is skill #, [1] is priority, [2] is SmartCast Type - - ;; Check Recharge, Energy, and Adrenaline - If $SkillAdrenalineReq[$i] = 0 Then - If GetSkillbarSkillRecharge($i) Or Not CanUseSkill($i, $mSkillbarPtr, $mSkillbarCacheEnergyReq[$i]) Then ContinueLoop - ElseIf $SkillAdrenalineReq[$i] > GetSkillbarSkillAdrenaline($i) Then - ContinueLoop - EndIf - Switch $mSkillPriorityRating[$r][2] ; [0] is skill #, [1] is priority, [2] is SmartCast Type - Case 1 ; YMLAD ; 1 - Switch $NumberOfFoesInAttackRange - Case 0 - ContinueLoop - Case 1, 2 - If GetDistance($mLowestEnemy) < 1200 Then - UseSkillEx($i, $mLowestEnemy) - Return - EndIf - Case Else - If GetDistance($EnemyNonConditioned) < 1200 Then - UseSkillEx($i, $EnemyNonConditioned) - Return - EndIf - EndSwitch - Case 3 ; Heal ; 3 - If $mSkillbarCache[$i] = 1219 Then ; $SKILLID_Protective_Was_Kaolai - If Not HasEffect(1219) Then ; $SKILLID_Protective_Was_Kaolai - UseSkillEx($i, $aMe) - Return - EndIf - EndIf - If $mLowestAllyHP < 0.75 Then - If $IsWeaponSpell[$i] Then - If $NumberOfFoesInAttackRange And Not GetHasWeaponSpell($mLowestAlly) Then - UseSkillEx($i, $mLowestAlly) - Return - EndIf - Else - UseSkillEx($i, $mLowestAlly) - Return - EndIf - EndIf - Case 4 ; Heal Other ; 4 - If $mLowestOtherAllyHP < 0.75 Then - If $IsWeaponSpell[$i] Then - If $NumberOfFoesInAttackRange And Not GetHasWeaponSpell($mLowestOtherAlly) Then - UseSkillEx($i, $mLowestOtherAlly) - Return - EndIf - Else - UseSkillEx($i, $mLowestOtherAlly) - Return - EndIf - EndIf - Case 5 ; AOE Skills ; 5 - If Not $NumberOfFoesInAttackRange Then ContinueLoop - If $mSkillbarCache[$i] = 1657 Then ; $SKILLID_Signet_of_Clumsiness - If $EnemyAttacker <> 0 Then - UseSkillEx($i, $EnemyAttacker) - Return - EndIf - Else - If $BestAOETarget <> 0 Then - UseSkillEx($i, $BestAOETarget) - Return - EndIf - If $EnemyHealer <> 0 Then - UseSkillEx($i, $EnemyHealer) - Return - EndIf - If $mLowestEnemy <> 0 Then - UseSkillEx($i, $mLowestEnemy) - Return - EndIf - EndIf - Case 6 ; Soul Twisting ; 6 - If Not HasEffect(1240) Then ; $SKILLID_Soul_Twisting - UseSkillEx($i, $aMe) - Return - EndIf - Case 7 ; Spirits ; 7 - If Not $NumberOfFoesInAttackRange Then ContinueLoop - If $IsSoulTwistingSpell[0] Then - If HasEffect(1240) And Not HasEffect($mSkillbarCache[$i]) Then ; $SKILLID_Soul_Twisting - UseSkillEx($i, $aMe) - Return - EndIf - Else - UseSkillEx($i, $aMe) - Return - EndIf - Case 8 ; Hex Removal ; 8 - If $HexedAlly <> 0 Then - UseSkillEx($i, $HexedAlly) - Return - EndIf - Case 9 ; Condition Removal ; 9 - If $ConditionedAlly <> 0 Then - UseSkillEx($i, $ConditionedAlly) - Return - EndIf - Case 10 ; Weapon Spell ; 10 - If Not $NumberOfFoesInAttackRange Then ContinueLoop - Case 11 ; Enchantment Strip ; 11 - If $EnemyEnchanted <> 0 Then - UseSkillEx($i, $EnemyEnchanted) - Return - EndIf - Case 12 ; General Attack ; 12 - If Not $NumberOfFoesInAttackRange Then ContinueLoop - If $EnemyHealer <> 0 Then - UseSkillEx($i, $EnemyHealer) - Return - EndIf - $IsAntiMeleeSkill = IsAntiMeleeSkill($mSkillbarCache[$i]) - $IsHexingSpell = IsHexSpell($mSkillbarCachePtr[$i]) - $IsConditioningSpell = IsConditionSpell($mSkillbarCachePtr[$i]) - $IsBelow50 = IsBelow50PercentEnemySkill($mSkillbarCachePtr[$i]) - If $IsAntiMeleeSkill And $EnemyAttacker <> 0 Then - UseSkillEx($i, $EnemyAttacker) - Return - EndIf - If $IsBelow50 And $LowHPEnemy <> 0 Then - UseSkillEx($i, $LowHPEnemy) - Return - EndIf - If $IsHexingSpell And Not $IsConditioningSpell And Not $IsAntiMeleeSkill And $EnemyNonHexed <> 0 Then - UseSkillEx($i, $EnemyNonHexed) - Return - EndIf - If $IsConditioningSpell And Not $IsHexingSpell And Not $IsAntiMeleeSkill And $EnemyConditioned <> 0 Then - UseSkillEx($i, $EnemyConditioned) - Return - EndIf - If $IsConditioningSpell And $EnemyNonConditioned <> 0 Then - UseSkillEx($i, $EnemyNonConditioned) - Return - EndIf - If $IsHexingSpell And $EnemyNonHexed <> 0 Then - UseSkillEx($i, $EnemyNonHexed) - Return - EndIf - If $mLowestEnemy <> 0 And Not $IsBelow50 Then - UseSkillEx($i, $mLowestEnemy) - Return - EndIf - Case 13 ; Res Skill ; 13 - If $mTeamDead[0] > 0 Then - RezParty($i, $aMe) - Return - EndIf - Case 14 ; Self-Target, Summon spirits, enchantments ; 14 - If Not $NumberOfFoesInAttackRange Then ContinueLoop - If UBound($mSpirits) < 3 And $mSkillbarCache[$i] = 2051 Then ContinueLoop ; $SKILLID_Summon_Spirits - If Not HasEffect($mSkillbarCache[$i]) Then - UseSkillEx($i, $aMe) - Return - EndIf - Case 15 ; Asuran Summon ; 15 - If $NumberOfFoesInAttackRange < 2 Then - UseSkillEx($i, $aMe) - Return - EndIf - Case Else - ContinueLoop - EndSwitch - Next -EndFunc ;==>SmartCast \ No newline at end of file + +#include-once +#include + +;~ Description: Internal use Smartcast(). +Func CanUseSkill($aSkillSlot, $aSkillbar, $aEnergy = 0, $aSoftCounter = 0) + If $mSkillSoftCounter > $aSoftCounter Then Return False + If $mEnergy < $aEnergy Then Return False + Local $lSkillPtr = $mSkillbarCachePtr[$aSkillSlot] + If GetSkillbarSkillRecharge($aSkillSlot, 0, $aSkillbar) = 0 Then + If GetSkillbarSkillAdrenaline($aSkillSlot, 0, $aSkillbar) < $mSkillbarCacheArray[$aSkillSlot][7] Then Return False + Switch $mSkillbarCacheArray[$aSkillSlot][1] + Case 14 + If $mBlind Then Return False + If $mAttackHardCounter Then Return False + If $mAttackSoftCounter > $aSoftCounter Then Return False + Case 4, 5, 6, 9, 11, 24, 25 + If $mSpellSoftCounter > $aSoftCounter Then Return False + If $mDazed Then + If $mSkillbarCacheArray[$aSkillSlot][8] > .25 Then Return False ; activation + EndIf + Switch $mSkillbarCacheArray[$aSkillSlot][5] ; target + Case 3, 4 + If $mAllySpellHardCounter Then Return False + Case 5, 16 + If $mEnemySpellHardCounter Then Return False + EndSwitch + EndSwitch + Return True + EndIf + Return False +EndFunc ;==>CanUseSkill + +;~ Description: Use Rez skill. Internal use Smartcast(). +Func RezParty($RezSkill, $aMe = GetAgentPtr(-2)) + Local $lAgentX, $lAgentY, $lMeX, $lMeY + Local $lBlocked = 0, $theta + If MemoryRead($mTeamDead[1] + 433, 'byte') = 1 Then + Do +;~ Death() + UpdateAgentPosByPtr($mTeamDead[1], $lAgentX, $lAgentY) + Move($lAgentX, $lAgentY, 250) + RndSleep(500) + If Not GetIsMoving($aMe) Then + $lBlocked += 1 + UpdateAgentPosByPtr($mTeamDead[1], $lAgentX, $lAgentY) + Move($lAgentX, $lAgentY, 250) + Sleep(200) + If Mod($lBlocked, 5) = 0 And Not GetIsMoving($aMe) Then + $theta = Random(0, 360) + UpdateAgentPosByPtr($aMe, $lMeX, $lMeY) + Move(200 * Cos($theta * 0.01745) + $lMeX, 200 * Sin($theta * 0.01745) + $lMeY, 0) + PingSleep(500) + EndIf + EndIf + UpdateAgentPosByPtr($aMe, $lMeX, $lMeY) + Until ComputeDistance($lMeX, $lMeY, $lAgentX, $lAgentY) < 600 Or $lBlocked > 50 + UseRezSkillEx($RezSkill, $mTeamDead[1]) + EndIf +EndFunc ;==>RezParty + +;~ Description: Use rez with death check, longer timeout and checks if target is alive. +Func UseRezSkillEx($aSkillSlot, $aTarget, $aTimeOut = 7000, $aSkillbarPtr = GetSkillbarPtr(0), $aMe = GetAgentPtr(-2)) + If IsPtr($aTarget) <> 0 Then + Local $lTargetID = MemoryRead($aTarget + 44, 'long') + Local $lTarget = $aTarget + ElseIf IsDllStruct($aTarget) <> 0 Then + Local $lTargetID = DllStructGetData($aTarget, 'ID') + Local $lTarget = GetAgentPtr($lTargetID) + Else + Local $lTargetID = ConvertID($aTarget) + Local $lTarget = GetAgentPtr($lTargetID) + EndIf + If $lTarget = 0 Or $lTargetID = 0 Then Return ; no target found + Local $lDeadlock = TimerInit() + ChangeTarget($lTargetID) + UseSkill($aSkillSlot, $lTargetID) + Do + Sleep(50) + If GetIsDead($aMe) Then +;~ Death($mPartyArray, $aMe) + Return + EndIf + If TimerDiff($lDeadlock) > $aTimeOut Then Return + Until GetSkillbarSkillRecharge($aSkillSlot, 0, $aSkillbarPtr) <> 0 Or Not GetIsDead($lTarget) + If GetIsCasting($aMe) Then CancelAction() +EndFunc ;==>UseRezSkillEx + +;~ Description: Returns TRUE if skillbars are identical. +Func CheckSkillbarCache() + For $i = 1 To 8 + If $mSkillbarCache[$i] <> GetSkillbarSkillID($i) Then + $mSkillbarCache[0] = False + Return False + EndIf + Next + Return True +EndFunc ;==>CheckSkillbarCache + +;~ Description: Similar to original CacheSkillbar, but instead of storing whole skillstruct, this one only stores a few values in a 2D array. +;~ $CacheSkillArray[9][11] = [['ID', 'Type', 'Special', 'Effect1', 'Condition', 'Target', 'EnergyCost', 'Adrenaline', 'Activation', 'Aftercast', 'Recharge']] +;~ Use: $CacheSkillArray[7][2] -> 'Special' of skill in skillslot 7. +Func CacheSkillbar() + If $mSkillbarCache[0] Then Return ; already cached + If $mSkillbarCacheStruct[0] Then Return ; dont mix up your cacheskillbar functions + $mSkillbarPtr = GetSkillbarPtr() + Local $lSkillStruct1, $lSkillStruct2, $lEnergy + For $i = 1 To 8 + $mSkillbarCache[$i] = GetSkillbarSkillID($i) + $mSkillbarCachePtr[$i] = GetSkillPtr($mSkillbarCache[$i]) + $lSkillStruct1 = MemoryReadStruct($mSkillbarCachePtr[$i] + 12, 'long Type;long Special;long Effect1;long Condition') + $lSkillStruct2 = MemoryReadStruct($mSkillbarCachePtr[$i] + 56, 'dword Adrenaline;float Activation;float Aftercast') + $mSkillbarCacheArray[$i][0] = $mSkillbarCache[$i] ; ID + $mSkillbarCacheArray[$i][1] = DllStructGetData($lSkillStruct1, 'Type') ; Type + $mSkillbarCacheArray[$i][2] = DllStructGetData($lSkillStruct1, 'Special') ; Special + $mSkillbarCacheArray[$i][3] = DllStructGetData($lSkillStruct1, 'Effect1') ; Effect1 + $mSkillbarCacheArray[$i][4] = DllStructGetData($lSkillStruct1, 'Condition') ; Condition + $mSkillbarCacheArray[$i][5] = MemoryRead($mSkillbarCachePtr[$i] + 49, 'byte') ; Target + $mSkillbarCacheArray[$i][7] = DllStructGetData($lSkillStruct2, 'Adrenaline') ; Adrenaline + $mSkillbarCacheArray[$i][8] = DllStructGetData($lSkillStruct2, 'Activation') ; Activation + $mSkillbarCacheArray[$i][9] = DllStructGetData($lSkillStruct2, 'Aftercast') ; Aftercast + $mSkillbarCacheArray[$i][10] = MemoryRead($mSkillbarCachePtr[$i] + 79, 'long') ; Recharge + If $mSkillbarCacheArray[$i][7] > 0 Then + $SkillAdrenalineReq[$i] = $mSkillbarCacheArray[$i][7] + $SkillAdrenalineReq[0] = True + $mSkillbarCacheEnergyReq[$i] = 0 + Update("Skill " & $i & " requires " & $mSkillbarCacheArray[$i][7] & " Adrenaline.", "Skills") + Else + $SkillAdrenalineReq[$i] = 0 + $lEnergy = MemoryRead($mSkillbarCachePtr[$i] + 53, 'byte') ; EnergyCost + Switch $lEnergy + Case 11 + $mSkillbarCacheArray[$i][6] = 15 + Case 12 + $mSkillbarCacheArray[$i][6] = 25 + Case Else + $mSkillbarCacheArray[$i][6] = $lEnergy + EndSwitch + $mSkillbarCacheEnergyReq[$i] = $mSkillbarCacheArray[$i][6] + Update("Skill " & $i & " requires " & $mSkillbarCacheEnergyReq[$i] & " energy.", "Skills") + EndIf + $mSkillPriorityRating[$i][1] = 0 + $SkillDamageAmount[$i] = SkillDamageAmount($mSkillbarCachePtr[$i]) + $mSkillPriorityRating[$i][0] = $i + If IsEliteSkill($mSkillbarCachePtr[$i]) Then $mSkillPriorityRating[$i][1] = 30 + If $mSkillbarCache[$i] = 2358 Then ; YMLAD - 1 + $IsYMLAD[$i] = True + $IsYMLAD[0] = True + $YMLADSlot = $i + $mSkillPriorityRating[$i][1] = 120 - $i + $mSkillPriorityRating[$i][2] = 1 + Update("Skill " & $i & " is YMLAD! Priority: " & $mSkillPriorityRating[$i][1] & ".", "Skills") + ContinueLoop + EndIf + If IsInterruptSkill($mSkillbarCachePtr[$i]) Then ; Interrupt - 2 + $mSkillPriorityRating[$i][1] += 110 - $i + $mSkillPriorityRating[$i][2] = 2 + $IsInterrupt[$i] = True + $IsInterrupt[0] = True + Update("Skill " & $i & " is an Interrupt Skill, Priority: " & $mSkillPriorityRating[$i][1] & ".", "Skills") + ContinueLoop + EndIf + If IsHexRemovalSkill($mSkillbarCachePtr[$i]) Then ; Hex Removal ; 8 + $mSkillPriorityRating[$i][1] = 55 - $i + $mSkillPriorityRating[$i][2] = 8 + Update("Skill " & $i & " is a Hex Remover, Priority: " & $mSkillPriorityRating[$i][1] & ".", "Skills") + ContinueLoop + EndIf + ; Condition Removal ; 9 + If IsConditionRemovalSkill($mSkillbarCachePtr[$i]) Then + $mSkillPriorityRating[$i][1] = 50 - $i + $mSkillPriorityRating[$i][2] = 9 + Update("Skill " & $i & " is a Condition Remover, Priority: " & $mSkillPriorityRating[$i][1] & ".", "Skills") + ContinueLoop + EndIf + ; Res Skill ; 13 + If IsResSkill($mSkillbarCachePtr[$i]) Then + $mSkillPriorityRating[$i][1] = 20 - $i + $mSkillPriorityRating[$i][2] = 13 + Update("Skill " & $i & " is a Rez, Priority: " & $mSkillPriorityRating[$i][1] & ".", "Skills") + ContinueLoop + EndIf + ; Heal ; 3 + If IsHealSkill($mSkillbarCachePtr[$i]) Then + ; Heal Other ; 4 + If TargetOtherAllySkill($mSkillbarCachePtr[$i]) Then + $mSkillPriorityRating[$i][1] += 75 - $i + $mSkillPriorityRating[$i][2] = 4 + Update("Skill " & $i & " heals other ally for " & $SkillDamageAmount[$i] & ", Priority: " & $mSkillPriorityRating[$i][1] & ".", "Skills") + ContinueLoop + EndIf + $IsHealingSpell[$i] = True + $IsHealingSpell[0] = True + $mSkillPriorityRating[$i][1] += 80 - $i + $SkillDamageAmount[$i] + $mSkillPriorityRating[$i][2] = 3 + Update("Skill " & $i & " heals ally for " & $SkillDamageAmount[$i] & ", Priority: " & $mSkillPriorityRating[$i][1] & ".", "Skills") + ContinueLoop + EndIf + ; AOE Skills ; 5 + If SkillAOERange($mSkillbarCachePtr[$i]) > 0 Then + If TargetEnemySkill($mSkillbarCachePtr[$i]) Or TargetGroundSkill($mSkillbarCachePtr[$i]) Then + $mSkillPriorityRating[$i][1] += 70 - $i + $mSkillPriorityRating[$i][2] = 5 + Update("Skill " & $i & " does AOE damage of " & $SkillDamageAmount[$i] & ", Priority: " & $mSkillPriorityRating[$i][1] & ".", "Skills") + ContinueLoop + EndIf + EndIf + ; Soul Twisting ; 6 + If $mSkillbarCache[$i] = 1240 Then ; $SKILLID_Soul_Twisting + $IsSoulTwistingSpell[$i] = True + $IsSoulTwistingSpell[0] = True + $mSkillPriorityRating[$i][1] = 65 - $i + $mSkillPriorityRating[$i][2] = 6 + Update("Skill " & $i & " is Soul Twisting, Priority: " & $mSkillPriorityRating[$i][1] & ".", "Skills") + ContinueLoop + EndIf + ; Spirits ; 7 + If IsSpiritSkill($mSkillbarCachePtr[$i]) Then + $mSkillPriorityRating[$i][1] += 60 - $i + $mSkillPriorityRating[$i][2] = 7 + Update("Skill " & $i & " is a Spirit Skill, Priority: " & $mSkillPriorityRating[$i][1] & ".", "Skills") + ContinueLoop + EndIf + ; Weapon Spell ; 10 + If IsWeaponSpell($mSkillbarCachePtr[$i]) Then + $IsWeaponSpell[$i] = True + $IsWeaponSpell[0] = True + $mSkillPriorityRating[$i][1] += 40 - $i + $mSkillPriorityRating[$i][2] = 10 + Update("Skill " & $i & " is a Weapon Skill, Priority: " & $mSkillPriorityRating[$i][1] & ".", "Skills") + ContinueLoop + EndIf + ; Enchantment Strip ; 11 + If IsEnchantmentStrip($mSkillbarCachePtr[$i]) Then + $mSkillPriorityRating[$i][1] += 35 - $i + $mSkillPriorityRating[$i][2] = 11 + Update("Skill " & $i & " is a Enchantment Strip, Priority: " & $mSkillPriorityRating[$i][1] & ".", "Skills") + ContinueLoop + EndIf + ; General Attack ; 12 + If TargetEnemySkill($mSkillbarCachePtr[$i]) Then + $mSkillPriorityRating[$i][1] += 30 - $i + If IsPvESkill($mSkillbarCacheStruct[$i]) Then $mSkillPriorityRating[$i][1] += 100 + $mSkillPriorityRating[$i][2] = 12 + Update("Skill " & $i & " Vs. enemies for " & $SkillDamageAmount[$i] & " damage, Priority: " & $mSkillPriorityRating[$i][1] & ".", "Skills") + ContinueLoop + EndIf + ; Asuran Summon ; 15 + If IsSummonSkill($mSkillbarCache[$i]) Then + $IsSummonSpell[$i] = True + $IsSummonSpell[0] = True + $mSkillPriorityRating[$i][1] = 0 - $i + $mSkillPriorityRating[$i][2] = 15 + Update("Skill " & $i & " is a Summon, Priority: " & $mSkillPriorityRating[$i][1] & ".", "Skills") + ContinueLoop + EndIf + ; Self-Target, Summon spirits, enchantments ; 14 + If TargetSelfSkill($mSkillbarCachePtr[$i]) Then + $IsSelfCastingSpell[$i] = True + $IsSelfCastingSpell[0] = True + $mSkillPriorityRating[$i][1] += 10 - $i + $mSkillPriorityRating[$i][2] = 14 + Update("Skill " & $i & " is a Self Targeting Skill, Priority: " & $mSkillPriorityRating[$i][1] & ".", "Skills") + ContinueLoop + EndIf + Next +;~ Local $lMyProfession = GetHeroProfession(0) +;~ Local $lAttrPrimary = GetProfPrimaryAttribute($lMyProfession) + _ArraySort($mSkillPriorityRating, 0, 0, 0, 1) + $mSkillbarCache[0] = True + $mSkillbarCachePtr[0] = True +EndFunc ;==>CacheSkillbar + +;~ Description: SmartCast by JCaulton, 4D1, Savsud. +;~ Required functions: CacheSkillbar, DropBundle, RezParty, CanUseSkill, UseSkillEx +;~ GetStatus: GetSkillbarSkillAdrenaline, GetDistance, GetSkillbarSkillRecharge, GetMapLoading, GetIsDead +;~ Skilleffects: IsAntiMeleeSkill, GetHasWeaponSpell, HasEffect, IsHealingSpell, IsHexSpell, IsConditionSpell, IsBelow50PercentEnemySkill +Func SmartCast($aMe = GetAgentPtr(-2)) + #Region Variables + If GetIsDead($aMe) Then Return False + If GetMapLoading() <> 1 Then Return True ; $INSTANCETYPE_EXPLORABLE + If Not $mSkillbarCache[0] Then +;~ $mSkillbarPtr = GetSkillbarPtr() + CacheSkillbar() + EndIf + #EndRegion Variables + + #Region Specific Skills + If $IsHealingSpell[0] Then + If HasEffect(1219) Then ; $SKILLID_Protective_Was_Kaolai + If $mAverageTeamHP < 0.80 Or $mLowestAllyHP < 0.3 Then + DropBundle() + Return + EndIf + EndIf + EndIf + #EndRegion Specific Skills + + ; Skill usage + Local $i, $IsAntiMeleeSkill, $IsHexingSpell, $IsConditioningSpell, $IsBelow50 + For $r = 8 To 1 Step -1 ; Skill priority set in Ascending order. + $i = $mSkillPriorityRating[$r][0] ; [0] is skill #, [1] is priority, [2] is SmartCast Type + + ;; Check Recharge, Energy, and Adrenaline + If $SkillAdrenalineReq[$i] = 0 Then + If GetSkillbarSkillRecharge($i) Or Not CanUseSkill($i, $mSkillbarPtr, $mSkillbarCacheEnergyReq[$i]) Then ContinueLoop + ElseIf $SkillAdrenalineReq[$i] > GetSkillbarSkillAdrenaline($i) Then + ContinueLoop + EndIf + Switch $mSkillPriorityRating[$r][2] ; [0] is skill #, [1] is priority, [2] is SmartCast Type + Case 1 ; YMLAD ; 1 + Switch $NumberOfFoesInAttackRange + Case 0 + ContinueLoop + Case 1, 2 + If GetDistance($mLowestEnemy) < 1200 Then + UseSkillEx($i, $mLowestEnemy) + Return + EndIf + Case Else + If GetDistance($EnemyNonConditioned) < 1200 Then + UseSkillEx($i, $EnemyNonConditioned) + Return + EndIf + EndSwitch + Case 3 ; Heal ; 3 + If $mSkillbarCache[$i] = 1219 Then ; $SKILLID_Protective_Was_Kaolai + If Not HasEffect(1219) Then ; $SKILLID_Protective_Was_Kaolai + UseSkillEx($i, $aMe) + Return + EndIf + EndIf + If $mLowestAllyHP < 0.75 Then + If $IsWeaponSpell[$i] Then + If $NumberOfFoesInAttackRange And Not GetHasWeaponSpell($mLowestAlly) Then + UseSkillEx($i, $mLowestAlly) + Return + EndIf + Else + UseSkillEx($i, $mLowestAlly) + Return + EndIf + EndIf + Case 4 ; Heal Other ; 4 + If $mLowestOtherAllyHP < 0.75 Then + If $IsWeaponSpell[$i] Then + If $NumberOfFoesInAttackRange And Not GetHasWeaponSpell($mLowestOtherAlly) Then + UseSkillEx($i, $mLowestOtherAlly) + Return + EndIf + Else + UseSkillEx($i, $mLowestOtherAlly) + Return + EndIf + EndIf + Case 5 ; AOE Skills ; 5 + If Not $NumberOfFoesInAttackRange Then ContinueLoop + If $mSkillbarCache[$i] = 1657 Then ; $SKILLID_Signet_of_Clumsiness + If $EnemyAttacker <> 0 Then + UseSkillEx($i, $EnemyAttacker) + Return + EndIf + Else + If $BestAOETarget <> 0 Then + UseSkillEx($i, $BestAOETarget) + Return + EndIf + If $EnemyHealer <> 0 Then + UseSkillEx($i, $EnemyHealer) + Return + EndIf + If $mLowestEnemy <> 0 Then + UseSkillEx($i, $mLowestEnemy) + Return + EndIf + EndIf + Case 6 ; Soul Twisting ; 6 + If Not HasEffect(1240) Then ; $SKILLID_Soul_Twisting + UseSkillEx($i, $aMe) + Return + EndIf + Case 7 ; Spirits ; 7 + If Not $NumberOfFoesInAttackRange Then ContinueLoop + If $IsSoulTwistingSpell[0] Then + If HasEffect(1240) And Not HasEffect($mSkillbarCache[$i]) Then ; $SKILLID_Soul_Twisting + UseSkillEx($i, $aMe) + Return + EndIf + Else + UseSkillEx($i, $aMe) + Return + EndIf + Case 8 ; Hex Removal ; 8 + If $HexedAlly <> 0 Then + UseSkillEx($i, $HexedAlly) + Return + EndIf + Case 9 ; Condition Removal ; 9 + If $ConditionedAlly <> 0 Then + UseSkillEx($i, $ConditionedAlly) + Return + EndIf + Case 10 ; Weapon Spell ; 10 + If Not $NumberOfFoesInAttackRange Then ContinueLoop + Case 11 ; Enchantment Strip ; 11 + If $EnemyEnchanted <> 0 Then + UseSkillEx($i, $EnemyEnchanted) + Return + EndIf + Case 12 ; General Attack ; 12 + If Not $NumberOfFoesInAttackRange Then ContinueLoop + If $EnemyHealer <> 0 Then + UseSkillEx($i, $EnemyHealer) + Return + EndIf + $IsAntiMeleeSkill = IsAntiMeleeSkill($mSkillbarCache[$i]) + $IsHexingSpell = IsHexSpell($mSkillbarCachePtr[$i]) + $IsConditioningSpell = IsConditionSpell($mSkillbarCachePtr[$i]) + $IsBelow50 = IsBelow50PercentEnemySkill($mSkillbarCachePtr[$i]) + If $IsAntiMeleeSkill And $EnemyAttacker <> 0 Then + UseSkillEx($i, $EnemyAttacker) + Return + EndIf + If $IsBelow50 And $LowHPEnemy <> 0 Then + UseSkillEx($i, $LowHPEnemy) + Return + EndIf + If $IsHexingSpell And Not $IsConditioningSpell And Not $IsAntiMeleeSkill And $EnemyNonHexed <> 0 Then + UseSkillEx($i, $EnemyNonHexed) + Return + EndIf + If $IsConditioningSpell And Not $IsHexingSpell And Not $IsAntiMeleeSkill And $EnemyConditioned <> 0 Then + UseSkillEx($i, $EnemyConditioned) + Return + EndIf + If $IsConditioningSpell And $EnemyNonConditioned <> 0 Then + UseSkillEx($i, $EnemyNonConditioned) + Return + EndIf + If $IsHexingSpell And $EnemyNonHexed <> 0 Then + UseSkillEx($i, $EnemyNonHexed) + Return + EndIf + If $mLowestEnemy <> 0 And Not $IsBelow50 Then + UseSkillEx($i, $mLowestEnemy) + Return + EndIf + Case 13 ; Res Skill ; 13 + If $mTeamDead[0] > 0 Then + RezParty($i, $aMe) + Return + EndIf + Case 14 ; Self-Target, Summon spirits, enchantments ; 14 + If Not $NumberOfFoesInAttackRange Then ContinueLoop + If UBound($mSpirits) < 3 And $mSkillbarCache[$i] = 2051 Then ContinueLoop ; $SKILLID_Summon_Spirits + If Not HasEffect($mSkillbarCache[$i]) Then + UseSkillEx($i, $aMe) + Return + EndIf + Case 15 ; Asuran Summon ; 15 + If $NumberOfFoesInAttackRange < 2 Then + UseSkillEx($i, $aMe) + Return + EndIf + Case Else + ContinueLoop + EndSwitch + Next +EndFunc ;==>SmartCast diff --git a/gwApi/trade.au3 b/gwApi/trade.au3 index 9afb4db..2f8cc16 100644 --- a/gwApi/trade.au3 +++ b/gwApi/trade.au3 @@ -1,52 +1,61 @@ -#include-once - -;~ Description: Open trade window. -Func TradePlayer($aAgent) - If IsPtr($aAgent) <> 0 Then - Local $lAgentID = MemoryRead($aAgent + 44, 'long') - ElseIf IsDllStruct($aAgent) <> 0 Then - Local $lAgentID = DllStructGetData($aAgent, 'ID') - Else - Local $lAgentID = ConvertID($aAgent) - EndIf - SendPacket(0x08, 0x43, $lAgentID) -EndFunc ;==>TradePlayer - -;~ Description: Like pressing the "Accept" button in a trade. Can only be used after both players have submitted their offer. -Func AcceptTrade() - Return SendPacket(0x4, 0xB4) -EndFunc ;==>AcceptTrade - -;~ Description: Like pressing the "Cancel" button in a trade. -Func CancelTrade() - Return SendPacket(0x4, 0xAE) -EndFunc ;==>CancelTrade - -;~ Description: Like pressing the "Change Offer" button. -Func ChangeOffer() - Return SendPacket(0x4, 0xB3) -EndFunc ;==>ChangeOffer - -;~ Description: Like pressing the "Submit Offer" button, but also including the amount of gold offered. -Func SubmitOffer($aGold = 0) - Return SendPacket(0x8, 0xB0, $aGold) -EndFunc ;==>SubmitOffer - -;~ Description: Offer item. -Func OfferItem($aItemID, $aQuantity = 1) - If IsPtr($aItemID) <> 0 Then - Local $lItemID = MemoryRead($aItemID, 'long') - Local $lQuantity = MemoryRead($aItemID + 75, 'byte') - ElseIf IsDllStruct($aItemID) <> 0 Then - Local $lItemID = DllStructGetData($aItemID, 'ID') - Local $lQuantity = DllStructGetData($aItemID, 'Quantity') - Else - Local $lItemID = $aItemID - Local $lQuantity = MemoryRead(GetItemPtr($aItemID) + 75, 'byte') - EndIf - If $aQuantity > $lQuantity Then - Return SendPacket(0xC, 0xAF, $lItemID, $lQuantity) - Else - Return SendPacket(0xC, 0xAF, $lItemID, $aQuantity) - EndIf -EndFunc ;==>OfferItem \ No newline at end of file +;~ Local const $CtoGS_MSG_StartTrade = 0x4F; +;~ Local const $CtoGS_MSG_AcknowledgeTrade = 0x0; +;~ Local const $CtoGS_MSG_AcceptTrade = 0x7; +;~ Local const $CtoGS_MSG_CancelTrade = 0x1; +;~ Local const $CtoGS_MSG_AddItemTrade = 0x2; +;~ Local const $CtoGS_MSG_RemoveItemTrade = 0x5; +;~ Local const $CtoGS_MSG_ChangeOffer = 0x6; +;~ Local const $CtoGS_MSG_SubmitOffer = 0x3; + +#include-once + +;~ Description: Open trade window. +Func TradePlayer($aAgent) + If IsPtr($aAgent) <> 0 Then + Local $lAgentID = MemoryRead($aAgent + 44, 'long') + ElseIf IsDllStruct($aAgent) <> 0 Then + Local $lAgentID = DllStructGetData($aAgent, 'ID') + Else + Local $lAgentID = ConvertID($aAgent) + EndIf + SendPacket(0x08, $CtoGS_MSG_StartTrade, $lAgentID) +EndFunc ;==>TradePlayer + +;~ Description: Like pressing the "Accept" button in a trade. Can only be used after both players have submitted their offer. +Func AcceptTrade() + Return SendPacket(0x4, $CtoGS_MSG_AcceptTrade) +EndFunc ;==>AcceptTrade + +;~ Description: Like pressing the "Cancel" button in a trade. +Func CancelTrade() + Return SendPacket(0x4, 0x1) +EndFunc ;==>CancelTrade + +;~ Description: Like pressing the "Change Offer" button. +Func ChangeOffer() + Return SendPacket(0x4, 0x6) +EndFunc ;==>ChangeOffer + +;~ Description: Like pressing the "Submit Offer" button, but also including the amount of gold offered. +Func SubmitOffer($aGold = 0) + Return SendPacket(0x8, $CtoGS_MSG_SubmitOffer, $aGold) +EndFunc ;==>SubmitOffer + +;~ Description: Offer item. +Func OfferItem($aItemID, $aQuantity = 1) + If IsPtr($aItemID) <> 0 Then + Local $lItemID = MemoryRead($aItemID, 'long') + Local $lQuantity = MemoryRead($aItemID + 75, 'byte') + ElseIf IsDllStruct($aItemID) <> 0 Then + Local $lItemID = DllStructGetData($aItemID, 'ID') + Local $lQuantity = DllStructGetData($aItemID, 'Quantity') + Else + Local $lItemID = $aItemID + Local $lQuantity = MemoryRead(GetItemPtr($aItemID) + 75, 'byte') + EndIf + If $aQuantity > $lQuantity Then + Return SendPacket(0xC, 0xB5, $lItemID, $lQuantity) ;~ old -> Return SendPacket(0xC, 0xAF, $lItemID, $lQuantity) + Else + Return SendPacket(0xC, 0xB5, $lItemID, $aQuantity) ;~ old -> Return SendPacket(0xC, 0xAF, $lItemID, $aQuantity) + EndIf +EndFunc ;==>OfferItem diff --git a/gwApi/utilities/GUI.au3 b/gwApi/utilities/GUI.au3 index efe3d1b..5a0f5e0 100644 --- a/gwApi/utilities/GUI.au3 +++ b/gwApi/utilities/GUI.au3 @@ -1,11 +1,12 @@ -#include-once - -;~ Description: Gregs pretty GUIs. -Func _GuiRoundCorners($h_win, $iSize) - Local $XS_pos, $XS_ret - $XS_pos = WinGetPos($h_win) - $XS_ret = DllCall("gdi32.dll", "long", "CreateRoundRectRgn", "long", 0, "long", 0, "long", $XS_pos[2] + 1, "long", $XS_pos[3] + 1, "long", $iSize, "long", $iSize) - If $XS_ret[0] Then - DllCall("user32.dll", "long", "SetWindowRgn", "hwnd", $h_win, "long", $XS_ret[0], "int", 1) - EndIf -EndFunc ;==>_GuiRoundCorners \ No newline at end of file +11 +#include-once + +;~ Description: Gregs pretty GUIs. +Func _GuiRoundCorners($h_win, $iSize) + Local $XS_pos, $XS_ret + $XS_pos = WinGetPos($h_win) + $XS_ret = DllCall("gdi32.dll", "long", "CreateRoundRectRgn", "long", 0, "long", 0, "long", $XS_pos[2] + 1, "long", $XS_pos[3] + 1, "long", $iSize, "long", $iSize) + If $XS_ret[0] Then + DllCall("user32.dll", "long", "SetWindowRgn", "hwnd", $h_win, "long", $XS_ret[0], "int", 1) + EndIf +EndFunc ;==>_GuiRoundCorners diff --git a/gwApi/utilities/GetAllGHPasses.au3 b/gwApi/utilities/GetAllGHPasses.au3 index 6ae14ef..8f3576b 100644 --- a/gwApi/utilities/GetAllGHPasses.au3 +++ b/gwApi/utilities/GetAllGHPasses.au3 @@ -1,148 +1,149 @@ -;~ #include "gwapi.au3" - -Global $GHPassKeyBuffer = DllStructCreate('dword;dword;dword;dword') - -;~ Initialize() - -;~ RandomTravelGH() - -;~ Sleep(3000) - -;~ RestoreDetour() - -;~ Description: Randomly travels to any gh in GuildHallArray. -Func RandomTravelGH() - Static Local $lGuildHallArray = 0 - If $lGuildHallArray = 0 Then $lGuildHallArray = GetAllGHPasses() - If $lGuildHallArray[0][0] = 1 Then - Local $lRandom = 1 - ElseIf $lGuildHallArray[0][0] <= 0 Then - Return - Else - Local $lRandom = Random(1, $lGuildHallArray[0][0], 1) - EndIf - Return TravelGHEx($lGuildHallArray[$lRandom][0], $lGuildHallArray[$lRandom][1], $lGuildHallArray[$lRandom][2], $lGuildHallArray[$lRandom][3]) -EndFunc - -;~ Description: Travels to own gh if $aPass1 = 0, or to specified gh passes. -Func TravelGHEx($aPass1 = 0, $aPass2 = 0, $aPass3 = 0, $aPass4 = 0) - Local $lResult = 0 - If $aPass1 = 0 Then - Static Local $lGHPtr = 0 - If $lGHPtr = 0 Then - Local $lOffset[4] = [0, 0x18, 0x3C, 0] - $lGHPtr = MemoryReadPtrChain($mBasePointer, $lOffset, 'ptr') - EndIf - Local $lBuffer = DllStructCreate('dword;dword;dword;dword') - MemoryReadToStruct($lGHPtr + 0x64, $lBuffer) - $lResult = SendPacket(0x18, 0xAA, DllStructGetData($lBuffer, 1), DllStructGetData($lBuffer, 2), DllStructGetData($lBuffer, 3), DllStructGetData($lBuffer, 4), 1) - Else - $lResult = SendPacket(0x18, 0xAA, $aPass1, $aPass2, $aPass3, $aPass4, 1) - EndIf - If $lResult then Return WaitMapLoading() -EndFunc - -;~ Description: Return guild hall passkeys to owned guild hall in 1D array. -Func GetGuildHallPass($aGHPtr) - Local $lReturnArray[4] - MemoryReadToStruct($aGHPtr + 0x64, $GHPassKeyBuffer) - $lReturnArray[0] = DllStructGetData($GHPassKeyBuffer, 1) - $lReturnArray[1] = DllStructGetData($GHPassKeyBuffer, 2) - $lReturnArray[2] = DllStructGetData($GHPassKeyBuffer, 3) - $lReturnArray[3] = DllStructGetData($GHPassKeyBuffer, 4) - Return $lReturnArray -EndFunc - -;~ Description: Return guild hall visitor passkeys in 2D array. First element contains amount of passkeys. -Func GetGuildHallVisitorPasses($aGHPtr, $aVisitorPassCount = 0) - If $aVisitorPassCount = 0 Then $aVisitorPassCount = MemoryRead($aGHPtr + 0x340, 'long') - Local $lReturnArray[$aVisitorPassCount + 1][4] - Local $lOffset[3] = [0x32C, 0x4, 0xA0] - Local $lVisitorBasePtr = MemoryReadPtrChain($aGHPtr, $lOffset, 'ptr') - For $i = 1 To $aVisitorPassCount - MemoryReadToStruct($lVisitorBasePtr, $GHPassKeyBuffer) - $lReturnArray[$i][0] = DllStructGetData($GHPassKeyBuffer, 1) - $lReturnArray[$i][1] = DllStructGetData($GHPassKeyBuffer, 2) - $lReturnArray[$i][2] = DllStructGetData($GHPassKeyBuffer, 3) - $lReturnArray[$i][3] = DllStructGetData($GHPassKeyBuffer, 4) - $lVisitorBasePtr += 0xB8 - Next - $lReturnArray[0][0] = $aVisitorPassCount - Return $lReturnArray -EndFunc - -;~ Description: Return guild hall alliance passkeys in 2D array, except for passkey to own guild hall. First element contains amount of passkeys. -Func GetGuildHallAllianceOtherPasses($aGHPtr, $aSkipPass1 = 0) - If $aSkipPass1 = 0 Then $aSkipPass1 = MemoryRead($aGHPtr + 0x64) - Local $lReturnArray[11][4] - $lReturnArray[0][0] = 0 - Local $lAllianceBasePtr = MemoryRead($aGHPtr + 0xC, 'ptr') - Local $lTemp = MemoryRead($lAllianceBasePtr + 0x8, 'long') - While $lTemp <= 10 And $lTemp > 0 And $lReturnArray[0][0] < 10 - MemoryReadToStruct($lAllianceBasePtr + 0xC, $GHPassKeyBuffer) - If DllStructGetData($GHPassKeyBuffer, 1) <> $aSkipPass1 Then - $lReturnArray[0][0] = $lReturnArray[0][0] + 1 - $lReturnArray[$lReturnArray[0][0]][0] = DllStructGetData($GHPassKeyBuffer, 1) - $lReturnArray[$lReturnArray[0][0]][1] = DllStructGetData($GHPassKeyBuffer, 2) - $lReturnArray[$lReturnArray[0][0]][2] = DllStructGetData($GHPassKeyBuffer, 3) - $lReturnArray[$lReturnArray[0][0]][3] = DllStructGetData($GHPassKeyBuffer, 4) - EndIf - $lAllianceBasePtr += 0x58 - $lTemp = MemoryRead($lAllianceBasePtr + 0x8, 'long') - WEnd - Return $lReturnArray -EndFunc - -;~ Description: Returns array with all available visitor gh passes and owned gh. -Func GetAllGHPasses($aGetAlliance = True, $aGetVisitors = True) - ; GHPtr - Static Local $lGHPtr = 0 - If $lGHPtr = 0 Then - Local $lOffset[4] = [0, 0x18, 0x3C, 0] - $lGHPtr = MemoryReadPtrChain($mBasePointer, $lOffset, 'ptr') - EndIf - ; Passkey Array -> max size = $lVisitorPassCount + 10 (alliance) + 1 (my gh) + 1 - Local $lVisitorPassCount = MemoryRead($lGHPtr + 0x340, 'long') - Local $lPasskeyArray[$lVisitorPassCount + 12][4] - ; My Guild Hall - $lPasskeyArray[0][0] = 1 - Local $lTempArray = GetGuildHallPass($lGHPtr) - $lPasskeyArray[1][0] = $lTempArray[0] - $lPasskeyArray[1][1] = $lTempArray[1] - $lPasskeyArray[1][2] = $lTempArray[2] - $lPasskeyArray[1][3] = $lTempArray[3] - ; Visitor Guild Halls - Local $lTempArray = GetGuildHallVisitorPasses($lGHPtr, $lVisitorPassCount) - For $i = 1 To $lTempArray[0][0] - $lPasskeyArray[0][0] += 1 - $lPasskeyArray[$lPasskeyArray[0][0]][0] = $lTempArray[$i][0] - $lPasskeyArray[$lPasskeyArray[0][0]][1] = $lTempArray[$i][1] - $lPasskeyArray[$lPasskeyArray[0][0]][2] = $lTempArray[$i][2] - $lPasskeyArray[$lPasskeyArray[0][0]][3] = $lTempArray[$i][3] - Next - ; Alliance Guild Halls - Local $lTempArray = GetGuildHallAllianceOtherPasses($lGHPtr, $lPasskeyArray[1][0]) - For $i = 1 To $lTempArray[0][0] - $lPasskeyArray[0][0] += 1 - $lPasskeyArray[$lPasskeyArray[0][0]][0] = $lTempArray[$i][0] - $lPasskeyArray[$lPasskeyArray[0][0]][1] = $lTempArray[$i][1] - $lPasskeyArray[$lPasskeyArray[0][0]][2] = $lTempArray[$i][2] - $lPasskeyArray[$lPasskeyArray[0][0]][3] = $lTempArray[$i][3] - Next - ReDim $lPasskeyArray[$lPasskeyArray[0][0] + 1][4] - Return $lPasskeyArray -EndFunc - -Func GetGuildAnnouncement() - Static $lOffset[4] = [0, 0x18, 0x3C,0x78] - Return MemoryReadPtr($mBasePointer, $lOffset,'wchar[255]')[1] -EndFunc - -Func SetGuildAnnouncement($aMsg) - Static $lBuf = DllStructCreate('ptr;dword;dword;dword;wchar[254]') - DllStructSetData($lBuf,1,GetValue('CommandPacketSend')) - DllStructSetData($lBuf,2,0x208) - DllStructSetData($lBuf,3,0xC0) - DllStructSetData($lBuf,5,$aMsg) - Enqueue(DllStructGetPtr($lBuf),DllStructGetSize($lBuf)) -EndFunc \ No newline at end of file +148 +;~ #include "gwapi.au3" + +Global $GHPassKeyBuffer = DllStructCreate('dword;dword;dword;dword') + +;~ Initialize() + +;~ RandomTravelGH() + +;~ Sleep(3000) + +;~ RestoreDetour() + +;~ Description: Randomly travels to any gh in GuildHallArray. +Func RandomTravelGH() + Static Local $lGuildHallArray = 0 + If $lGuildHallArray = 0 Then $lGuildHallArray = GetAllGHPasses() + If $lGuildHallArray[0][0] = 1 Then + Local $lRandom = 1 + ElseIf $lGuildHallArray[0][0] <= 0 Then + Return + Else + Local $lRandom = Random(1, $lGuildHallArray[0][0], 1) + EndIf + Return TravelGHEx($lGuildHallArray[$lRandom][0], $lGuildHallArray[$lRandom][1], $lGuildHallArray[$lRandom][2], $lGuildHallArray[$lRandom][3]) +EndFunc + +;~ Description: Travels to own gh if $aPass1 = 0, or to specified gh passes. +Func TravelGHEx($aPass1 = 0, $aPass2 = 0, $aPass3 = 0, $aPass4 = 0) + Local $lResult = 0 + If $aPass1 = 0 Then + Static Local $lGHPtr = 0 + If $lGHPtr = 0 Then + Local $lOffset[4] = [0, 0x18, 0x3C, 0] + $lGHPtr = MemoryReadPtrChain($mBasePointer, $lOffset, 'ptr') + EndIf + Local $lBuffer = DllStructCreate('dword;dword;dword;dword') + MemoryReadToStruct($lGHPtr + 0x64, $lBuffer) + $lResult = SendPacket(0x18, 0xB0, DllStructGetData($lBuffer, 1), DllStructGetData($lBuffer, 2), DllStructGetData($lBuffer, 3), DllStructGetData($lBuffer, 4), 1) ;~ old -> $lResult = SendPacket(0x18, 0xAA, DllStructGetData($lBuffer, 1), DllStructGetData($lBuffer, 2), DllStructGetData($lBuffer, 3), DllStructGetData($lBuffer, 4), 1) + Else + $lResult = SendPacket(0x18, 0xB0, $aPass1, $aPass2, $aPass3, $aPass4, 1) ;~ old -> $lResult = SendPacket(0x18, 0xAA, $aPass1, $aPass2, $aPass3, $aPass4, 1) + EndIf + If $lResult then Return WaitMapLoading() +EndFunc + +;~ Description: Return guild hall passkeys to owned guild hall in 1D array. +Func GetGuildHallPass($aGHPtr) + Local $lReturnArray[4] + MemoryReadToStruct($aGHPtr + 0x64, $GHPassKeyBuffer) + $lReturnArray[0] = DllStructGetData($GHPassKeyBuffer, 1) + $lReturnArray[1] = DllStructGetData($GHPassKeyBuffer, 2) + $lReturnArray[2] = DllStructGetData($GHPassKeyBuffer, 3) + $lReturnArray[3] = DllStructGetData($GHPassKeyBuffer, 4) + Return $lReturnArray +EndFunc + +;~ Description: Return guild hall visitor passkeys in 2D array. First element contains amount of passkeys. +Func GetGuildHallVisitorPasses($aGHPtr, $aVisitorPassCount = 0) + If $aVisitorPassCount = 0 Then $aVisitorPassCount = MemoryRead($aGHPtr + 0x340, 'long') + Local $lReturnArray[$aVisitorPassCount + 1][4] + Local $lOffset[3] = [0x32C, 0x4, 0xA0] + Local $lVisitorBasePtr = MemoryReadPtrChain($aGHPtr, $lOffset, 'ptr') + For $i = 1 To $aVisitorPassCount + MemoryReadToStruct($lVisitorBasePtr, $GHPassKeyBuffer) + $lReturnArray[$i][0] = DllStructGetData($GHPassKeyBuffer, 1) + $lReturnArray[$i][1] = DllStructGetData($GHPassKeyBuffer, 2) + $lReturnArray[$i][2] = DllStructGetData($GHPassKeyBuffer, 3) + $lReturnArray[$i][3] = DllStructGetData($GHPassKeyBuffer, 4) + $lVisitorBasePtr += 0xB8 + Next + $lReturnArray[0][0] = $aVisitorPassCount + Return $lReturnArray +EndFunc + +;~ Description: Return guild hall alliance passkeys in 2D array, except for passkey to own guild hall. First element contains amount of passkeys. +Func GetGuildHallAllianceOtherPasses($aGHPtr, $aSkipPass1 = 0) + If $aSkipPass1 = 0 Then $aSkipPass1 = MemoryRead($aGHPtr + 0x64) + Local $lReturnArray[11][4] + $lReturnArray[0][0] = 0 + Local $lAllianceBasePtr = MemoryRead($aGHPtr + 0xC, 'ptr') + Local $lTemp = MemoryRead($lAllianceBasePtr + 0x8, 'long') + While $lTemp <= 10 And $lTemp > 0 And $lReturnArray[0][0] < 10 + MemoryReadToStruct($lAllianceBasePtr + 0xC, $GHPassKeyBuffer) + If DllStructGetData($GHPassKeyBuffer, 1) <> $aSkipPass1 Then + $lReturnArray[0][0] = $lReturnArray[0][0] + 1 + $lReturnArray[$lReturnArray[0][0]][0] = DllStructGetData($GHPassKeyBuffer, 1) + $lReturnArray[$lReturnArray[0][0]][1] = DllStructGetData($GHPassKeyBuffer, 2) + $lReturnArray[$lReturnArray[0][0]][2] = DllStructGetData($GHPassKeyBuffer, 3) + $lReturnArray[$lReturnArray[0][0]][3] = DllStructGetData($GHPassKeyBuffer, 4) + EndIf + $lAllianceBasePtr += 0x58 + $lTemp = MemoryRead($lAllianceBasePtr + 0x8, 'long') + WEnd + Return $lReturnArray +EndFunc + +;~ Description: Returns array with all available visitor gh passes and owned gh. +Func GetAllGHPasses($aGetAlliance = True, $aGetVisitors = True) + ; GHPtr + Static Local $lGHPtr = 0 + If $lGHPtr = 0 Then + Local $lOffset[4] = [0, 0x18, 0x3C, 0] + $lGHPtr = MemoryReadPtrChain($mBasePointer, $lOffset, 'ptr') + EndIf + ; Passkey Array -> max size = $lVisitorPassCount + 10 (alliance) + 1 (my gh) + 1 + Local $lVisitorPassCount = MemoryRead($lGHPtr + 0x340, 'long') + Local $lPasskeyArray[$lVisitorPassCount + 12][4] + ; My Guild Hall + $lPasskeyArray[0][0] = 1 + Local $lTempArray = GetGuildHallPass($lGHPtr) + $lPasskeyArray[1][0] = $lTempArray[0] + $lPasskeyArray[1][1] = $lTempArray[1] + $lPasskeyArray[1][2] = $lTempArray[2] + $lPasskeyArray[1][3] = $lTempArray[3] + ; Visitor Guild Halls + Local $lTempArray = GetGuildHallVisitorPasses($lGHPtr, $lVisitorPassCount) + For $i = 1 To $lTempArray[0][0] + $lPasskeyArray[0][0] += 1 + $lPasskeyArray[$lPasskeyArray[0][0]][0] = $lTempArray[$i][0] + $lPasskeyArray[$lPasskeyArray[0][0]][1] = $lTempArray[$i][1] + $lPasskeyArray[$lPasskeyArray[0][0]][2] = $lTempArray[$i][2] + $lPasskeyArray[$lPasskeyArray[0][0]][3] = $lTempArray[$i][3] + Next + ; Alliance Guild Halls + Local $lTempArray = GetGuildHallAllianceOtherPasses($lGHPtr, $lPasskeyArray[1][0]) + For $i = 1 To $lTempArray[0][0] + $lPasskeyArray[0][0] += 1 + $lPasskeyArray[$lPasskeyArray[0][0]][0] = $lTempArray[$i][0] + $lPasskeyArray[$lPasskeyArray[0][0]][1] = $lTempArray[$i][1] + $lPasskeyArray[$lPasskeyArray[0][0]][2] = $lTempArray[$i][2] + $lPasskeyArray[$lPasskeyArray[0][0]][3] = $lTempArray[$i][3] + Next + ReDim $lPasskeyArray[$lPasskeyArray[0][0] + 1][4] + Return $lPasskeyArray +EndFunc + +Func GetGuildAnnouncement() + Static $lOffset[4] = [0, 0x18, 0x3C,0x78] + Return MemoryReadPtr($mBasePointer, $lOffset,'wchar[255]')[1] +EndFunc + +Func SetGuildAnnouncement($aMsg) + Static $lBuf = DllStructCreate('ptr;dword;dword;dword;wchar[254]') + DllStructSetData($lBuf,1,GetValue('CommandPacketSend')) + DllStructSetData($lBuf,2,0x208) + DllStructSetData($lBuf,3,0xC0) + DllStructSetData($lBuf,5,$aMsg) + Enqueue(DllStructGetPtr($lBuf),DllStructGetSize($lBuf)) +EndFunc diff --git a/gwApi/utilities/MoveToSafeSpot.au3 b/gwApi/utilities/MoveToSafeSpot.au3 index ceaaba2..7cea5ae 100644 --- a/gwApi/utilities/MoveToSafeSpot.au3 +++ b/gwApi/utilities/MoveToSafeSpot.au3 @@ -1,99 +1,100 @@ -#include-once - -#Region MoveToSafeSpot -Global $ClostestX[1] -Global $ClostestY[1] -Global $SpiritAverageXLocation = 0 -Global $SpiritAverageYLocation = 0 -Global $EnemyAverageXLocation = 0 - -;~ Description: Gregs circle trig. Returns Array for X,Y location of closest safe point. -Func GetClosestSafeZone($aX, $aY, $radius = 300, $aMe = GetAgentPtr(-2)) - Local $d2r = 3.141592653589 / 180 - Local $coords[2] - Local $MyLocation = XandYLocation($aMe) - Local $theta = 0, $TempX, $TempY, $ClostestLocation = 5000 - For $i = 0 To 17 - $theta += 20 - $TempX = ($radius * Cos($theta * $d2r)) + $aX - $TempY = ($radius * Sin($theta * $d2r)) + $aY - If ComputeDistance($TempX, $TempY, $MyLocation[0], $MyLocation[1]) < $ClostestLocation Then - $ClostestLocation = ComputeDistance($TempX, $TempY, $MyLocation[0], $MyLocation[1]) - $coords[0] = $TempX - $coords[1] = $TempY - EndIf - Next - Return $coords -EndFunc ;==>GetClosestSafeZone - -;~ Description: Gregs circle trig. -Func GetClosestCoordAroundAgent($Agent, $radius = 1000) - Local $d2r = 3.141592653589 / 180 - Local $coords[2] - Local $aX = XLocation($Agent) - Local $aY = YLocation($Agent) - Local $MyaX = XLocation() - Local $MyaY = YLocation() - Local $theta = 0, $TempX, $TempY, $ClostestLocation = 500 - Dim $ClostestX[1] = [0] - Dim $ClostestY[1] = [0] - For $i = 0 To 99 - $theta += 3.6 - $TempX = (($radius - UBound($mEnemyCorpesSpellRange) * 50) * Cos($theta * $d2r)) + $aX - $TempY = (($radius - UBound($mEnemyCorpesSpellRange) * 50) * Sin($theta * $d2r)) + $aY - If ComputeDistance($TempX, $TempY, $MyaX, $MyaY) > $ClostestLocation Then - $ClostestLocation = ComputeDistance($TempX, $TempY, $MyaX, $MyaY) - $ClostestX[0] += 1 - ReDim $ClostestX[$ClostestX[0] + 1] - $ClostestX[$ClostestX[0]] = $TempX - $ClostestY[0] += 1 - ReDim $ClostestY[$ClostestY[0] + 1] - $ClostestY[$ClostestY[0]] = $TempY - EndIf - Next -EndFunc ;==>GetClosestCoordAroundAgent - -;~ Description: Gregs circle trig. -Func GetAttackPositionAroundAgent($Agent, $radius = 700) - Local $d2r = 3.141592653589 / 180 - Local $coords[2] - Local $EnemyLocation = XandYLocation($Agent) - Local $LeaderLocation = XandYLocation($SavedLeaderID) - Local $MyLocation = XandYLocation() - Local $theta = 0, $TempX, $TempY, $ClostestLocation = 5000 - Local $PlayerNum = MemoryRead(GetAgentPtr(-2) + 244, 'word') - For $i = 0 To 17 - $theta += 20 - $PlayerTheta = $theta - 20 + $PlayerNum * 20 - $TempX = ($radius * Cos($PlayerTheta * $d2r)) + $EnemyLocation[0] - $TempY = ($radius * Sin($PlayerTheta * $d2r)) + $EnemyLocation[1] - If ComputeDistance($TempX, $TempY, $LeaderLocation[0], $LeaderLocation[1]) < $ClostestLocation Then - $ClostestLocation = ComputeDistance($TempX, $TempY, $LeaderLocation[0], $LeaderLocation[1]) - $coords[0] = $TempX - $coords[1] = $TempY - EndIf - Next - Return $coords -EndFunc ;==>GetAttackPositionAroundAgent - -;~ Description: Calculates a safe spot and moves to it. -Func MoveToSafeSpot($radius = 100) - If $EnemyAverageXLocation = 0 Or $SpiritAverageXLocation = 0 Then Return - Local $d2r = 3.141592653589 / 180 - Local $coords[2], $TestDistance - Local $theta = 0, $TempX, $TempY, $SafeDistance = 0 - Local $SafeX, $SafeY - For $i = 0 To 99 - $theta += 3.6 - $TempX = ($radius * Cos($theta * $d2r)) + $SpiritAverageXLocation - $TempY = ($radius * Sin($theta * $d2r)) + $SpiritAverageYLocation - $TestDistance = ComputeDistance($TempX, $TempY, $EnemyAverageXLocation, $EnemyAverageYLocation) - If $TestDistance > $SafeDistance Then - $SafeDistance = $TestDistance - $SafeX = $TempX - $SafeY = $TempY - EndIf - Next - Move($SafeX, $SafeY) -EndFunc ;==>MoveToSafeSpot -#EndRegion MoveToSafeSpot \ No newline at end of file +99 +#include-once + +#Region MoveToSafeSpot +Global $ClostestX[1] +Global $ClostestY[1] +Global $SpiritAverageXLocation = 0 +Global $SpiritAverageYLocation = 0 +Global $EnemyAverageXLocation = 0 + +;~ Description: Gregs circle trig. Returns Array for X,Y location of closest safe point. +Func GetClosestSafeZone($aX, $aY, $radius = 300, $aMe = GetAgentPtr(-2)) + Local $d2r = 3.141592653589 / 180 + Local $coords[2] + Local $MyLocation = XandYLocation($aMe) + Local $theta = 0, $TempX, $TempY, $ClostestLocation = 5000 + For $i = 0 To 17 + $theta += 20 + $TempX = ($radius * Cos($theta * $d2r)) + $aX + $TempY = ($radius * Sin($theta * $d2r)) + $aY + If ComputeDistance($TempX, $TempY, $MyLocation[0], $MyLocation[1]) < $ClostestLocation Then + $ClostestLocation = ComputeDistance($TempX, $TempY, $MyLocation[0], $MyLocation[1]) + $coords[0] = $TempX + $coords[1] = $TempY + EndIf + Next + Return $coords +EndFunc ;==>GetClosestSafeZone + +;~ Description: Gregs circle trig. +Func GetClosestCoordAroundAgent($Agent, $radius = 1000) + Local $d2r = 3.141592653589 / 180 + Local $coords[2] + Local $aX = XLocation($Agent) + Local $aY = YLocation($Agent) + Local $MyaX = XLocation() + Local $MyaY = YLocation() + Local $theta = 0, $TempX, $TempY, $ClostestLocation = 500 + Dim $ClostestX[1] = [0] + Dim $ClostestY[1] = [0] + For $i = 0 To 99 + $theta += 3.6 + $TempX = (($radius - UBound($mEnemyCorpesSpellRange) * 50) * Cos($theta * $d2r)) + $aX + $TempY = (($radius - UBound($mEnemyCorpesSpellRange) * 50) * Sin($theta * $d2r)) + $aY + If ComputeDistance($TempX, $TempY, $MyaX, $MyaY) > $ClostestLocation Then + $ClostestLocation = ComputeDistance($TempX, $TempY, $MyaX, $MyaY) + $ClostestX[0] += 1 + ReDim $ClostestX[$ClostestX[0] + 1] + $ClostestX[$ClostestX[0]] = $TempX + $ClostestY[0] += 1 + ReDim $ClostestY[$ClostestY[0] + 1] + $ClostestY[$ClostestY[0]] = $TempY + EndIf + Next +EndFunc ;==>GetClosestCoordAroundAgent + +;~ Description: Gregs circle trig. +Func GetAttackPositionAroundAgent($Agent, $radius = 700) + Local $d2r = 3.141592653589 / 180 + Local $coords[2] + Local $EnemyLocation = XandYLocation($Agent) + Local $LeaderLocation = XandYLocation($SavedLeaderID) + Local $MyLocation = XandYLocation() + Local $theta = 0, $TempX, $TempY, $ClostestLocation = 5000 + Local $PlayerNum = MemoryRead(GetAgentPtr(-2) + 244, 'word') + For $i = 0 To 17 + $theta += 20 + $PlayerTheta = $theta - 20 + $PlayerNum * 20 + $TempX = ($radius * Cos($PlayerTheta * $d2r)) + $EnemyLocation[0] + $TempY = ($radius * Sin($PlayerTheta * $d2r)) + $EnemyLocation[1] + If ComputeDistance($TempX, $TempY, $LeaderLocation[0], $LeaderLocation[1]) < $ClostestLocation Then + $ClostestLocation = ComputeDistance($TempX, $TempY, $LeaderLocation[0], $LeaderLocation[1]) + $coords[0] = $TempX + $coords[1] = $TempY + EndIf + Next + Return $coords +EndFunc ;==>GetAttackPositionAroundAgent + +;~ Description: Calculates a safe spot and moves to it. +Func MoveToSafeSpot($radius = 100) + If $EnemyAverageXLocation = 0 Or $SpiritAverageXLocation = 0 Then Return + Local $d2r = 3.141592653589 / 180 + Local $coords[2], $TestDistance + Local $theta = 0, $TempX, $TempY, $SafeDistance = 0 + Local $SafeX, $SafeY + For $i = 0 To 99 + $theta += 3.6 + $TempX = ($radius * Cos($theta * $d2r)) + $SpiritAverageXLocation + $TempY = ($radius * Sin($theta * $d2r)) + $SpiritAverageYLocation + $TestDistance = ComputeDistance($TempX, $TempY, $EnemyAverageXLocation, $EnemyAverageYLocation) + If $TestDistance > $SafeDistance Then + $SafeDistance = $TestDistance + $SafeX = $TempX + $SafeY = $TempY + EndIf + Next + Move($SafeX, $SafeY) +EndFunc ;==>MoveToSafeSpot +#EndRegion MoveToSafeSpot diff --git a/gwApi/utilities/emoting.au3 b/gwApi/utilities/emoting.au3 index 719bf05..670cda9 100644 --- a/gwApi/utilities/emoting.au3 +++ b/gwApi/utilities/emoting.au3 @@ -1,54 +1,55 @@ -#include-once - -;~ Description: Randomly emotes 6 different emotes (dance, clap, excited, drum, flute and violin) -Func Emoting() - Switch (Random(1, 6, 1)) - Case 1 - Return Dance() - Case 2 - Return Clap() - Case 3 - Return Excited() - Case 4 - Return Drum() - Case 5 - Return Flute() - Case 6 - Return Violin() - EndSwitch -EndFunc ;==>Emoting - -;~ Description: Dance emote. -Func Dance() - Return SendChat('dance', '/') -EndFunc ;==>Dance - -;~ Description: Clap emote. -Func Clap() - Return SendChat('clap', '/') -EndFunc ;==>Clap - -;~ Description: Excited emote. -Func Excited() - Return SendChat('excited', '/') -EndFunc ;==>Excited - -;~ Description: Drum emote. -Func Drum() - Return SendChat('drum', '/') -EndFunc ;==>Drum - -;~ Description: Flute emote. -Func Flute() - Return SendChat('flute', '/') -EndFunc ;==>Flute - -;~ Description: Violin emote. -Func Violin() - Return SendChat('violin', '/') -EndFunc ;==>Violin - -;~ Description: Jump emote. -Func Jump() - Return SendChat('jump', '/') -EndFunc ;==>Jump \ No newline at end of file +54 +#include-once + +;~ Description: Randomly emotes 6 different emotes (dance, clap, excited, drum, flute and violin) +Func Emoting() + Switch (Random(1, 6, 1)) + Case 1 + Return Dance() + Case 2 + Return Clap() + Case 3 + Return Excited() + Case 4 + Return Drum() + Case 5 + Return Flute() + Case 6 + Return Violin() + EndSwitch +EndFunc ;==>Emoting + +;~ Description: Dance emote. +Func Dance() + Return SendChat('dance', '/') +EndFunc ;==>Dance + +;~ Description: Clap emote. +Func Clap() + Return SendChat('clap', '/') +EndFunc ;==>Clap + +;~ Description: Excited emote. +Func Excited() + Return SendChat('excited', '/') +EndFunc ;==>Excited + +;~ Description: Drum emote. +Func Drum() + Return SendChat('drum', '/') +EndFunc ;==>Drum + +;~ Description: Flute emote. +Func Flute() + Return SendChat('flute', '/') +EndFunc ;==>Flute + +;~ Description: Violin emote. +Func Violin() + Return SendChat('violin', '/') +EndFunc ;==>Violin + +;~ Description: Jump emote. +Func Jump() + Return SendChat('jump', '/') +EndFunc ;==>Jump diff --git a/gwApi/utilities/inventory_Edit_by_Ralle.au3 b/gwApi/utilities/inventory_Edit_by_Ralle.au3 index 53ffba3..1387beb 100644 --- a/gwApi/utilities/inventory_Edit_by_Ralle.au3 +++ b/gwApi/utilities/inventory_Edit_by_Ralle.au3 @@ -1,1962 +1,2070 @@ -#Region Variables -Global $mEmptyBag = 8 -Global $mEmptySlot = 0 -Global $mStoreGold = False -Global $mStoreMaterials = True -Global $mBlackWhite = True -Global $mMatExchangeGold = 930 ; ModelID of mat that should be bought in case gold storage is full -Global $mSalvageStacks = True -Global $mDustFeatherFiber = 0 ; change to 1 to sell this group of materials -Global $mGraniteIronBone = 0 ; change to 1 to sell this group of materials -Global $mWhiteMantleEmblem = True ; change to false to sell them -Global $mWhiteMantleBadge = True ; change to false to sell them -#EndRegion - -#Region GoldManagement -;~ Description: Make sure to have enough gold on character, but not too much. -Func MinMaxGold() - Local $lGoldCharacter = GetGoldCharacter() - Local $lGoldStorage = GetGoldStorage() - Local $lGold = $lGoldCharacter + $lGoldStorage - OpenStorageWindow() - If $lGoldCharacter < 10000 And $lGoldStorage > 10000 Then - WithdrawGold(10000 - $lGoldCharacter) - Return 10000 - ElseIf $lGoldCharacter > 50000 And $lGold < 1000000 Then - DepositGold($lGoldCharacter - 10000) - Return 10000 - Else - Return $lGoldCharacter - EndIf -EndFunc ;==>MinMaxGold - -;~ Description: Checks the amount of gold a character holds and withdraws or stores accordingly. -;~ $aWithdraw -> max amount to be withdrawn from storage -;~ $aDeposit -> max amount to be deposited to storage -;~ $aMinGold -> below that gold will be withdrawn from storage -;~ $aMaxGold -> above MaxGold plus Variance, gold will be stored in storage, if storage not full -Func CheckGold($aWithdraw = 50000, $aDeposit = 50000, $aMinGold = 20000, $aMaxGold = 65000, $aVariance = 10000) - Local $Gold = GetGoldCharacter() - Local $Gold_Storage = GetGoldStorage() - If $Gold > Random($aMaxGold-$aVariance, $aMaxGold+$aVariance) Then - If $Gold_Storage = 1000000 Then Return - If $Gold_Storage + $aDeposit > 1000000 Then - Return DepositGold(1000000 - $Gold_Storage) - Else - Return DepositGold($aDeposit) - EndIf - ElseIf $Gold < $aMinGold Then - If $Gold_Storage = 0 Then Return - If $Gold_Storage < $aWithdraw Then - Return WithdrawGold($Gold_Storage) - Else - Return WithdrawGold($aWithdraw) - EndIf - EndIf -EndFunc ;==>CheckGold -#EndRegion GoldManagement - -#Region Kits -;~ Description: Buy Ident and Salvage Kits for inventory session. -Func BuyKits($aAmount = 40, $aExpertSalv = True) - Local $lItemIDRow, $lKitUses, $lBuyAmount, $lResult - Local $lIDKitUses, $lSalvKitUses, $lExperSalvKitUses - Local $lResult = False - ; identification kits - $lIDKitUses = FindIDKitUses(1, 4) - If $lIDKitUses < $aAmount Then - $lItemIDRow = GetItemRowByModelID(2989) - $lKitUses = 25 - If $lItemIDRow = 0 Then - $lItemIDRow = GetItemRowByModelID(5899) - $lKitUses = 100 - If $lItemIDRow = 0 Then Return ; no id kit - EndIf - $lBuyAmount = Ceiling(($aAmount - $lIDKITUses) / $lKitUses) - Update("Buying ID Kits: " & $lBuyAmount) - $lResult = BuyIdentKit($lItemIDRow, $lBuyAmount) - Sleep(1000 + GetPing()) - EndIf - ; salvage kits - $lSalvKitUses = KitUses(1, 4, 0, True, False) - If $lSalvKitUses < $aAmount Then - $lItemIDRow = GetItemRowByModelID(2992) - $lKitUses = 25 - If $lItemIDRow = 0 Then - $lItemIDRow = GetItemRowByModelID(2993) - $lKitUses = 10 - If $lItemIDRow = 0 Then Return - EndIf - $lBuyAmount = Ceiling(($aAmount - $lSalvKitUses) / $lKitUses) - Update("Buying Salvage Kits: " & $lBuyAmount) - $lResult = BuySalvKit(False, $lItemIDRow, $lBuyAmount) - Sleep(1000 + GetPing()) - EndIf - ; expert salvage kits - If $aExpertSalv Then - $lExperSalvKitUses = KitUses(1, 4, 0, False, True) - If $lExperSalvKitUses < $aAmount Then - $lItemIDRow = GetItemRowByModelID(2991) - $lKitUses = 25 - If $lItemIDRow = 0 Then - $lItemIDRow = GetItemRowByModelID(5900) - $lKitUses = 100 - If $lItemIDRow = 0 Then Return - EndIf - $lBuyAmount = Ceiling(($aAmount - $lExperSalvKitUses) / $lKitUses) - Update("Buying Expert Salv Kits: " & $lBuyAmount) - $lResult = BuySalvKit(True, $lItemIDRow, $lBuyAmount) - Sleep(1000 + GetPing()) - EndIf - EndIf - Return $lResult -EndFunc ;==>BuyKits - -;~ Description: Buys Ident kit. -Func BuyIdentKit($aItemIDRow = 0, $aAmount = 1) - If GetMapLoading() = 1 Then Return False - ConsoleWrite("Try to buy Ident Kit! " & @CRLF) - Local $lItemIDRow, $lItemPtr, $lValue, $Price - If $aItemIDRow = 0 Then - $lItemIDRow = GetItemRowByModelID(2989) - If $lItemIDRow = 0 Then - $lItemIDRow = GetItemRowByModelID(5899) - If $lItemIDRow = 0 Then Return False ; no id kit - EndIf - Else - $lItemIDRow = $aItemIDRow - EndIf - $lItemPtr = GetItemPtr($lItemIDRow) - $lValue = MemoryRead($lItemPtr + 36, 'short') * 2 - $Price = ($aAmount * $lValue) - Local $MoneyOnChar = GetGoldCharacter() - ConsoleWrite("Prie are = " & $Price & @CRLF) - If (($MoneyOnChar < $Price) And (GetGoldStorage() > ($Price - $MoneyOnChar))) Then - ConsoleWrite("Not enough Money..... take some !" & @CRLF) - WithdrawGold($Price - $MoneyOnChar) - ConsoleWrite("Now is the Money on Char = " & GetGoldStorage() & @CRLF) - If (GetGoldCharacter() < $Price) Then Return False - EndIf - - DllStructSetData($mBuyItem, 2, $aAmount) - DllStructSetData($mBuyItem, 3, $lItemIDRow) - DllStructSetData($mBuyItem, 4, $lValue * $aAmount) - Return SetExtended($lItemPtr, Enqueue($mBuyItemPtr, 16)) -EndFunc ;==>BuyIdentKit - -;~ Description: Buys salvage kit. -Func BuySalvKit($aExpert = False, $aItemIDRow = 0, $aAmount = 1) - If GetMapLoading() = 1 Then Return False - ConsoleWrite("Try to buy SalvageKit! " & @CRLF) -;~ Local Static $PriceForKit = [100,400,2000] - Local $lItemIDRow, $lItemPtr, $lValue, $Price - If $aItemIDRow = 0 Then - If $aExpert Then - $lItemIDRow = GetItemRowByModelID(2991) - If $lItemIDRow = 0 Then - $lItemIDRow = GetItemRowByModelID(5900) - If $lItemIDRow = 0 Then Return False - EndIf - Else - $lItemIDRow = GetItemRowByModelID(2992) - If $lItemIDRow = 0 Then - $lItemIDRow = GetItemRowByModelID(2993) - If $lItemIDRow = 0 Then Return False - EndIf - EndIf - Else - $lItemIDRow = $aItemIDRow - EndIf - $lItemPtr = GetItemPtr($lItemIDRow) - $lValue = MemoryRead($lItemPtr + 36, 'short') * 2 - $Price = ($aAmount * $lValue) - Local $MoneyOnChar = GetGoldCharacter() - ConsoleWrite("Prie are = " & $Price & @CRLF) - If (($MoneyOnChar < $Price) And (GetGoldStorage() > ($Price - $MoneyOnChar))) Then - ConsoleWrite("Not enough Money..... take some !" & @CRLF) - WithdrawGold($Price - $MoneyOnChar) - ConsoleWrite("Now is the Money on Char = " & GetGoldStorage() & @CRLF) - If (GetGoldCharacter() < $Price) Then Return False - EndIf - DllStructSetData($mBuyItem, 2, $aAmount) - DllStructSetData($mBuyItem, 3, $lItemIDRow) - DllStructSetData($mBuyItem, 4, $Price) - Return SetExtended($lItemPtr, Enqueue($mBuyItemPtr, 16)) -EndFunc ;==>BuySalvKit - -;~ Description: Finds salvage kit in specified bags and puts ptr to it in $aPtr. -;~ If $aCheapKit is set to True, then loop stops early only if kit with less than 10 uses is found, otherwise least uses kit will be returned. -;~ If only normal kits should be found, set $aNormalOnly = True. -;~ Returns modelID, uses in @extended. -Func FindSalvKitEx(ByRef $aPtr, $aBagStart = 1, $aBagEnd = 4, $aCheapKit = False, $aNormalOnly = False, $aExpertOnly = False) - If $aBagStart = Default Then $aBagStart = 1 - If $aBagEnd = Default Then $aBagEnd = 4 - If $aCheapKit = Default Then $aCheapKit = False - If $aNormalOnly = Default Then $aNormalOnly = False - If $aExpertOnly = Default Then $aExpertOnly = False - Local $lUses = 250 - Local $lKitMID = 0 - Local $lBagPtr, $lItemArrayPtr, $lItemPtr, $lValue, $lItemMID - $aPtr = 0 ; delete former value - For $bag = $aBagStart to $aBagEnd - $lBagPtr = GetBagPtr($bag) - $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') - For $slot = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 - $lItemPtr = MemoryRead($lItemArrayPtr + 4 * $slot, 'ptr') - If $lItemPtr = 0 Then ContinueLoop - $lItemMID = MemoryRead($lItemPtr + 44, 'long') - Switch $lItemMID - Case 2992, 2993 - If $aExpertOnly Then ContinueLoop - If Not FindSlavageKitEx_HelpFunc1($aCheapKit, $lKitMID, $aPtr, $lItemPtr, $lUses, $lItemMID, 2) Then ExitLoop 2 - Case 2991 - If $aNormalOnly Then ContinueLoop - If Not FindSlavageKitEx_HelpFunc1($aCheapKit, $lKitMID, $aPtr, $lItemPtr, $lUses, $lItemMID, 8) Then ExitLoop 2 - Case 5900 - If $aNormalOnly Then ContinueLoop - If Not FindSlavageKitEx_HelpFunc1($aCheapKit, $lKitMID, $aPtr, $lItemPtr, $lUses, $lItemMID, 10) Then ExitLoop 2 - EndSwitch - If $lUses < 10 Then ExitLoop 2 - Next - Next - Return SetExtended($lUses, $lKitMID) -EndFunc - -Func FindSlavageKitEx_HelpFunc1($var_1, Byref $var_2, Byref $var_3, Byref $var_4, Byref $var_5, $lItemMID, $faktor) -Local $lValue = MemoryRead($var_4 + 36, 'short') / $faktor -If Not $var_1 Then - FindSlavageKitEx_HelpFunc2($var_2, $var_3, $var_5, $var_4, $lValue, $lItemMID) - Return False -Else - If $lValue < $var_5 Then FindSlavageKitEx_HelpFunc2($var_2, $var_3, $var_5, $var_4, $lValue, $lItemMID) -EndIf -Return True -EndFunc - -Func FindSlavageKitEx_HelpFunc2(Byref $var_2, Byref $var_3, Byref $var_5, $var_4, $lValue, $lItemMID) -$var_5 = $lValue -$var_3 = $var_4 -$var_2 = $lItemMID -EndFunc - - -#Region New FincKitEx -;~ Description: Finds identification kit in specified bags and puts ptr to it in $aPtr. -;~ If $aCheapKit is set to True, then loop stops early only if kit with less than 10 uses is found, otherwise least uses kit will be returned. -;~ If only normal kits should be found, set $aNormalOnly = True. -;~ Returns modelID, uses in @extended. -Func FindIDKitEx(ByRef $aPtr, $aBagStart = 1, $aBagEnd = 4, $aCheapKit = False, $aNormalOnly = False, $aExpertOnly = False) - If $aBagStart = Default Then $aBagStart = 1 - If $aBagEnd = Default Then $aBagEnd = 4 - If $aCheapKit = Default Then $aCheapKit = False - If $aNormalOnly = Default Then $aNormalOnly = False - If $aExpertOnly = Default Then $aExpertOnly = False - Local $lUses = 250 - Local $lKitMID = 0 - Local $lBagPtr, $lItemArrayPtr, $lItemPtr - $aPtr = 0 ; delete former value - For $bag = $aBagStart to $aBagEnd - $lBagPtr = GetBagPtr($bag) - $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') - For $slot = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 - $lItemPtr = MemoryRead($lItemArrayPtr + 4 * $slot, 'ptr') - If $lItemPtr = 0 Then ContinueLoop - Switch MemoryRead($lItemPtr + 44, 'long') - Case 2989 - If $aExpertOnly Then ContinueLoop - If Not FindIDKitEx_HelpFunc1($aCheapKit, $lKitMID, $aPtr, $lItemPtr, $lUses, True) Then ExitLoop 2 - Case 5899 - If $aNormalOnly Then ContinueLoop - If Not FindIDKitEx_HelpFunc1($aCheapKit, $lKitMID, $aPtr, $lItemPtr, $lUses, False) Then ExitLoop 2 - EndSwitch - If $lUses < 10 Then ExitLoop 2 - Next - Next - Return SetExtended($lUses, $lKitMID) -EndFunc - -;$aCheapKit,$lKitMID,$aPtr,$lItemPtr,$lUses -Func FindIDKitEx_HelpFunc1($var_1, Byref $var_2, Byref $var_3, $var_4, Byref $var_5, $faktor = False) -Local $lValue = (MemoryRead($var_4 + 36, 'short') / (($faktor) ? (2) : (2.5))) -If Not $var_1 Then - FindIDKitEx_HelpFunc2($var_2, $var_3, $var_5, $lValue, $var_4, $faktor) - Return False -Else - If $lValue < $var_5 Then - FindIDKitEx_HelpFunc2($var_2, $var_3, $var_5, $lValue, $var_4, $faktor) - Return False - EndIf -EndIf -Return True -EndFunc - -Func FindIDKitEx_HelpFunc2(Byref $var_2, Byref $var_3, Byref $var_5, $lValue, $var_4, $faktor) -$var_5 = $lValue -$var_3 = $var_4 -$var_2 = (($faktor) ? (2989) : (5899)) -EndFunc -#EndRegion - - -;~ Description: Returns kit uses left. -;~ $aMode = 0 -> Salvage kits. -;~ $aMode = 1 -> Identification kits. -;~ $aMode everything but 0 or 1: All kits. -Func KitUses($aBagStart = 1, $aBagEnd = 4, $aMode = 0, $aNormalOnly = False, $aExpertOnly = False) - If $aBagStart = Default Then $aBagStart = 1 - If $aBagEnd = Default Then $aBagEnd = 1 - If $aMode = Default Then $aMode = 0 - If $aNormalOnly = Default Then $aNormalOnly = False - If $aExpertOnly = Default Then $aExpertOnly = False - Local $lUses = 0 - Local $lBagPtr, $lItemArrayPtr, $lItemPtr, $lValue - For $bag = $aBagStart to $aBagEnd - $lBagPtr = GetBagPtr($bag) - $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') - For $slot = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 - $lItemPtr = MemoryRead($lItemArrayPtr + 4 * $slot, 'ptr') - If $lItemPtr = 0 Then ContinueLoop - Switch MemoryRead($lItemPtr + 44, 'long') - Case 2989 ; id kit -> Mode 1 - If $aExpertOnly Then ContinueLoop - If $aMode <> 0 Then $lUses += MemoryRead($lItemPtr + 36, 'short') / 2 - Case 5899 ; id expert kit -> Mode 1 - If $aNormalOnly Then ContinueLoop - If $aMode <> 0 Then $lUses += MemoryRead($lItemPtr + 36, 'short') / 2.5 - Case 2992, 2993 ; salv kits -> Mode 0 - If $aExpertOnly Then ContinueLoop - If $aMode <> 1 Then $lUses += MemoryRead($lItemPtr + 36, 'short') / 2 - Case 2991 ; salv expert kit -> Mode 0 - If $aNormalOnly Then ContinueLoop - If $aMode <> 1 Then $lUses += MemoryRead($lItemPtr + 36, 'short') / 8 - Case 5900 ; salv expert kit -> Mode 0 - If $aNormalOnly Then ContinueLoop - If $aMode <> 1 Then $lUses += MemoryRead($lItemPtr + 36, 'short') / 10 - EndSwitch - Next - Next - Return $lUses -EndFunc - -;~ Description: Moves kits around so low-use kits come first in inventory. Prevents low kits piling up. -Func SortKits() - Local $lBagPtr, $lItemArrayPtr, $lItemPtr - Local $lModelID, $lValue, $lUses - Local $lTemp, $lSlot, $lDeadlock - Local $lTempArray[46][6] - Local $lCount = 0 - For $i = 1 To 4 - $lBagPtr = GetBagPtr($i) - If $lBagPtr = 0 Then ContinueLoop - $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') - For $j = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 - $lItemPtr = MemoryRead($lItemArrayPtr + 4 * $j, 'ptr') - If $lItemPtr = 0 Then ContinueLoop - If MemoryRead($lItemPtr + 32, 'byte') <> 29 Then ContinueLoop ; not a kit - $lCount += 1 - $lModelID = MemoryRead($lItemPtr + 44, 'long') - $lValue = MemoryRead($lItemPtr + 36, 'short') - Switch $lModelID - Case 2992, 2993, 2989 - $lUses = $lValue / 2 - Case 2991 - $lUses = $lValue / 8 - Case 5900 - $lUses = $lValue / 10 - Case 5899 - $lUses = $lValue / 2.5 - Case Else - ContinueLoop - EndSwitch - $lTempArray[$lCount][0] = $lItemPtr - $lTempArray[$lCount][1] = $i - $lTempArray[$lCount][2] = $j + 1 - $lTempArray[$lCount][3] = $lModelID - $lTempArray[$lCount][4] = $lUses - $lTempArray[$lCount][5] = $lItemArrayPtr - Next - Next - $lTempArray[0][0] = $lCount - For $i = 1 To $lTempArray[0][0] - $lTemp = $i - For $j = $i + 1 To $lTempArray[0][0] - If $lTempArray[$i][3] = $lTempArray[$j][3] Then - If $lTempArray[$j][4] < $lTempArray[$lTemp][4] Then $lTemp = $j - EndIf - Next - If $lTemp <> $i Then - MoveItemEx($lTempArray[$lTemp][0], $lTempArray[$i][1], $lTempArray[$i][2], 1) - $lSlot = $lTempArray[$lCount][2] - 1 - $lDeadlock = TimerInit() - Do - If TimerDiff($lDeadlock) > 5000 Then Return -1 ; something went really wrong - Sleep(250) - Until MemoryRead($lTempArray[$lTemp][5] + 4 * ($lTempArray[$lTemp][2] - 1), 'ptr') <> $lTempArray[$lTemp][0] - $lTempArray[$lTemp][0] = $lTempArray[$i][0] - $lTempArray[$lTemp][1] = $lTempArray[$i][1] - $lTempArray[$lTemp][2] = $lTempArray[$i][2] - $lTempArray[$lTemp][3] = $lTempArray[$i][3] - $lTempArray[$lTemp][4] = $lTempArray[$i][4] - $lTempArray[$lTemp][5] = $lTempArray[$i][5] - EndIf - Next - Return True -EndFunc ;==>SortKits -#EndRegion Kits - -#Region MainFunctions -;~ Description: Identify all unident items in inventory. -Func Ident() - Local $lBagPtr, $lItemPtr, $lItemArrayPtr - Local $lResult = -1 - For $bag = 1 to 4 ; inventory only - $lBagPtr = GetBagPtr($bag) - If $lBagPtr = 0 Then ContinueLoop - $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') - For $slot = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 - $lItemPtr = MemoryRead($lItemArrayPtr + 4 * ($slot), 'ptr') - If $lItemPtr = 0 Then ContinueLoop - If GetIsUnIDed($lItemPtr) Then - Update("Identify: " & $bag & ", " & $slot + 1) - OUT("Identify: " & $bag & ", " & $slot + 1) - $lResult = IdentifyItem($lItemPtr) - EndIf - Next - Next - Return $lResult -EndFunc ;==>Ident - -;~ Description: Store full stacks, unident golds and mods. -Func StoreItems() - Local $lBagPtr, $lItemArrayPtr, $lItemPtr - Local $lItemID, $lItemType, $lItemQuantity, $lItemMID - Local $lDeadlock - Local $lResult = -1 - UpdateEmptyStorageSlot($mEmptyBag, $mEmptySlot) - Update("Empty Spot: " & $mEmptyBag & ", " & $mEmptySlot) - OUT("Empty Spot: " & $mEmptyBag & ", " & $mEmptySlot) - If $mEmptySlot = 0 Then Return ; no more empty slots found - OpenStorageWindow() - For $bag = 1 To 4 ; inventory only - $lBagPtr = GetBagPtr($bag) - If $lBagPtr = 0 Then ContinueLoop ; empty bag slot - $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') - For $slot = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 - $lItemPtr = MemoryRead($lItemArrayPtr + 4 * ($slot), 'ptr') - If $lItemPtr = 0 Then ContinueLoop ; empty slot - $lItemID = MemoryRead($lItemPtr, 'long') - $lItemType = MemoryRead($lItemPtr + 32, 'byte') - $lItemQuantity = MemoryRead($lItemPtr + 75, 'byte') - If $lItemType = 11 And $lItemQuantity = 250 And $mStoreMaterials Then ; materials - Update("Store Materials: " & $bag & ", " & $slot & " -> " & $mEmptyBag & ", " & $mEmptySlot) - MoveItem($lItemID, $mEmptyBag, $mEmptySlot) - $lDeadlock = TimerInit() - Do - Sleep(250) - If TimerDiff($lDeadlock) > 5000 Then - $mEmptyBag = -1 - Return False - EndIf - Until MemoryRead($lItemArrayPtr + 4 * ($slot), 'ptr') = 0 - $lResult = True - UpdateEmptyStorageSlot($mEmptyBag, $mEmptySlot) - If $mEmptySlot = 0 Then Return $lResult - ContinueLoop - EndIf - $lItemMID = MemoryRead($lItemPtr + 44, 'long') - If StackableItems($lItemMID) And $lItemQuantity = 250 Then ; only full stacks - Update("Store Stack: " & $bag & ", " & $slot & " -> " & $mEmptyBag & ", " & $mEmptySlot) - MoveItem($lItemID, $mEmptyBag, $mEmptySlot) - $lDeadlock = TimerInit() - Do - Sleep(250) - If TimerDiff($lDeadlock) > 5000 Then - $mEmptyBag = -1 - Return False - EndIf - Until MemoryRead($lItemArrayPtr + 4 * ($slot), 'ptr') = 0 - $lResult = True - UpdateEmptyStorageSlot($mEmptyBag, $mEmptySlot) - If $mEmptySlot = 0 Then Return $lResult - ContinueLoop - EndIf - If Keepers($lItemMID) Then - Update("Store Keepers: " & $bag & ", " & $slot & " -> " & $mEmptyBag & ", " & $mEmptySlot) - MoveItem($lItemID, $mEmptyBag, $mEmptySlot) - $lDeadlock = TimerInit() - Do - Sleep(250) - If TimerDiff($lDeadlock) > 5000 Then - $mEmptyBag = -1 - Return False - EndIf - Until MemoryRead($lItemArrayPtr + 4 * ($slot), 'ptr') = 0 - $lResult = True - UpdateEmptyStorageSlot($mEmptyBag, $mEmptySlot) - If $mEmptySlot = 0 Then Return $lResult ; no more empty slots - ContinueLoop - EndIf - If $mStoreGold And GetRarity($lItemPtr) = 2624 Then ; store unident golds if possible - Update("Store Golds: " & $bag & ", " & $slot & " -> " & $mEmptyBag & ", " & $mEmptySlot) - MoveItem($lItemID, $mEmptyBag, $mEmptySlot) - $lDeadlock = TimerInit() - Do - Sleep(250) - If TimerDiff($lDeadlock) > 5000 Then - $mEmptyBag = -1 - Return False - EndIf - Until MemoryRead($lItemArrayPtr + 4 * ($slot), 'ptr') = 0 - $lResult = True - UpdateEmptyStorageSlot($mEmptyBag, $mEmptySlot) - If $mEmptySlot = 0 Then Return $lResult ; no more empty slots - ContinueLoop - EndIf - Next - Next - Return $lResult -EndFunc ;==>StoreItems - - -#Region New SalvageBags -Func IdentKitAction(ByRef $var_, $wichOne, $state1 = False, $State2 = False, $State3 = False) -FindIDKitEx($var_, 1, $wichOne, True) -If $var_ = 0 Then - If Not BuyIdentKit() Then Return False - FindIDKitEx($var_, 1, $wichOne, $state1) -EndIf -If $var_ = 0 Then Return False -Return True -EndFunc - -Func SalvageKitAction(ByRef $var_, $wichOne, $state1 = False, $State2 = False, $State3 = False) -FindSalvKitEx($var_, 1, $wichOne, $state1, $State2, $State3) -If $var_ = 0 Then - If Not BuySalvKit(True) Then Return False - FindSalvKitEx($var_, 1, $wichOne, $state1, $State2, $State3) - If $var_ = 0 Then Return False -EndIf -Return True -EndFunc - -Func GetAvaibleBagPtr() -Local $lBagPtr = 0, $tempArray[16][2] -$tempArray[0][0] = 0 -For $i = 1 To 4 - $lBagPtr = GetBagPtr($i) - If $lBagPtr = 0 Then ContinueLoop - $tempArray[0][0] += 1 - $tempArray[$tempArray[0][0]][0] = $lBagPtr - $tempArray[$tempArray[0][0]][1] = $i ; are the Numer of the Bag -Next -Redim $tempArray[$tempArray[0][0] +1][2] -Return $tempArray -EndFunc - -Func SalvageBags() -Local $MapState = GetMapLoading() -If Not IsArray(OpenBackpackSlot()) And Not TempStorage() Then Return False -Local $lIdentify = True - -Local $MaxStorageOrBag = (($MapState = 0) ? (16) : (4)) -; Search for ID kit -Local $lIDKit = 0,$lCheapKit = 0, $lExpertKit = 0 - -; Search for normal salvage kit -$lIdentify = IdentKitAction($lIDKit, $MaxStorageOrBag, True) -; Search for expert salvage kit -If Not SalvageKitAction($lExpertKit, $MaxStorageOrBag, True, False, True) Then Return False -; Search for cheapest salvage kit -If Not SalvageKitAction($lCheapKit, $MaxStorageOrBag, True, True) Then Return False - -Local $lIDKitID = MemoryRead($lIDKit, 'long') -Local $lExpertKitID = MemoryRead($lExpertKit, 'long') -Local $lCheapKitID = MemoryRead($lCheapKit, 'long') - - ; Start processing -Local $lItem, $lItemArrayPtr, $lQuantity, $ItemMID, $ItemRarity, $lDeadlock, $lQuantityOld, $Disconnect = False, $MaxSolts = 0 -Local $BagPtrArray = GetAvaibleBagPtr() -;~ _ArrayDisplay($BagPtrArray, "$BagPtrArray") -For $bag = 1 To $BagPtrArray[0][0] - $lItemArrayPtr = MemoryRead($BagPtrArray[$bag][0] + 24, 'ptr') - $MaxSolts = MemoryRead($BagPtrArray[$bag][0] + 32, 'long') - If OpenBackpackSlot() = 0 And Not TempStorage() Then ContinueLoop - - For $slot = 1 To $MaxSolts - - DisconnectCheck() -;~ If $globaldebug Then ConsoleWrite("Bag = " & $BagPtrArray[$bag][1] & " Slot = " & $slot & " Last Slot (Max) = " & $MaxSolts & @CRLF) - $lItem = MemoryRead($lItemArrayPtr + 4 * ($slot - 1), 'ptr') - - If IgnoreItem($lItem) Then ContinueLoop - If MemoryRead($lItem + 32, 'byte') = 31 Then ContinueLoop ; scrolls - - $lQuantity = MemoryRead($lItem + 75, 'byte') - If $lQuantity > 1 And Not $mSalvageStacks Then ContinueLoop ; dont process stacks - - $ItemMID = MemoryRead($lItem + 44, 'long') ; modelID - If $ItemMID = 504 Then ContinueLoop ; Decayed Orr Emblems - - If $ItemMID = 460 Or $ItemMID = 461 Then ContinueLoop ; White Mantle Emblem and Badge - If Keepers($ItemMID) Then ContinueLoop ; dont salvage keepers - - $ItemRarity = GetRarity($lItem) - If $ItemRarity = 2624 And GetIsRareWeapon($lItem) Then ContinueLoop ; no salvaging rare weapons - - If DisconnectCheck() Then - GoToMerchant(GetMerchant(GetMapID())) -;~ If $globaldebug Then ConsoleWrite("Disconnect in Slot Loop !" & @CRLF) - ContinueLoop - EndIf - -;~ ; Identify item if necessary and id kit available - If $lIdentify And GetIsUnIDed($lItem) Then - - If MemoryRead($lIDKit + 12, 'ptr') = 0 Then - $lIdentify = IdentKitAction($lIDKit, $MaxStorageOrBag, True) - If Not $lIdentify Then ContinueLoop - $lIDKitID = MemoryRead($lIDKit, 'long') - EndIf - Update("Identify: " & $BagPtrArray[$bag][1] & ", " & $slot) - IdentifyItem($lItem, $lIDKitID) - Sleep(500 + GetPing()) - $lDeadlock = TimerInit() - Do; - If TimerDiff($lDeadlock) > 5000 Then ContinueLoop 2 ; ident didnt work - Sleep(500 + GetPing()) - Until Not GetIsUnIDed($lItem) - EndIf - - Switch($ItemRarity) -;~ ; salvage whites - Case 2621 - For $i = 1 To $lQuantity; - If MemoryRead($lCheapKit + 12, 'ptr') = 0 Then - If Not SalvageKitAction($lCheapKit, $MaxStorageOrBag, True, True) Then Return False - $lCheapKitID = MemoryRead($lCheapKit, 'long') - EndIf - $lQuantityOld = $lQuantity - Update("Start Salvage (white): " & $BagPtrArray[$bag][1] & ", " & $slot & " -> " & StartSalvage($lItem, $lCheapKitID)) - If Not CheckFuncStateAfterTrySalvage(SalvageHelperFunc1()) Then Return False - Next - -;~ ; salvage non-whites - Case 2623 , 2626 , 2624 ; blue or purple or gold - If GetIsUpgraded($lItem) Then - If OpenBackpackSlot() = 0 And Not TempStorage() Then ContinueLoop - If Not SlavageOutModsRuneInsignia($lExpertKit, $lExpertKitID, $slot, $bag, $lItem, $MaxStorageOrBag) Then ContinueLoop - Else - ; salvage materials if item not destroyed - If $ItemRarity <> 2624 And MemoryRead($lItem + 12, 'ptr') <> 0 Then - If MemoryRead($lCheapKit + 12, 'ptr') = 0 Then - If Not SalvageKitAction($lCheapKit, $MaxStorageOrBag, True, True) Then Return False - $lCheapKitID = MemoryRead($lCheapKit, 'long') - EndIf - Update("Start Salvage_: " & $BagPtrArray[$bag][1] & ", " & $slot & " -> " & StartSalvage($lItem, $lCheapKitID)) - Sleep(1250 + GetPing()) - If $ItemRarity <> 2623 And MemoryRead($lItem + 12, 'ptr') <> 0 Then - Update("Salvage (Materials): " & $BagPtrArray[$bag][1] & ", " & $slot & " -> " & SalvageMaterials()) - - If Not CheckFuncStateAfterTrySalvage(SalvageHelperFunc1()) Then Return False - If MemoryRead($lItem + 12, 'ptr') = 0 Then ContinueLoop - EndIf - EndIf - EndIf - - EndSwitch - Next -Next -Return True -EndFunc ;==>SalvageBags - -Func CheckFuncStateAfterTrySalvage($state) -Local Static $String_Array = [4, " ", "Deadlock trigger !", "by salvage i had a DC !", "salvage works !"] - Switch($state) - Case 3 - Out($String_Array[$state] & @CRLF) - GoToMerchant(GetMerchant(GetMapID())) - $SalvageState = False - Return False - Case 2;, 1 - Out($String_Array[$state] & @CRLF) - $SalvageState = False - Return False - Case 4 - Out($String_Array[$state] & @CRLF) - Return True - EndSwitch -EndFunc - -Func SalvageHelperFunc1() -Local $lDeadlock = TimerInit() -Do; - Sleep(500 + GetPing()) - If DisconnectCheck() Then Return 3 - If TimerDiff($lDeadlock) >= 8000 Then Return 2 -Until $SalvageState -If $SalvageState Then $SalvageState = False - -Sleep(250 + GetPing()) -Return 4 -EndFunc - -Func SlavageOutModsRuneInsignia(ByRef $lExpertKit, ByRef $lExpertKitID, $slot, $bag, $lItem, $MaxStorageOrBag) -Static $___From_Armor = "Armor Mod" -Static $___From_Weapon = "Weapon" -Local $___Out_Data = "", $Sleep = False, $____Mod -Switch(MemoryRead($lItem + 32, 'byte')) - Case 0 - $____Mod = Upgrades($lItem) - $___Out_Data = $___From_Armor - - Case 2,5,12,15,22,24,26,27,32,35,36 - $____Mod = WeaponMods($lItem) - $___Out_Data = $___From_Weapon - $Sleep = True -Endswitch -IF $____Mod[0][0] = 0 Then Return False -;~ _ArrayDisplay($____Mod , $___Out_Data) -For $___ModX = 1 To $____Mod[0][0] - If OpenBackpackSlot() = 0 And Not TempStorage() Then Return False - If MemoryRead($lExpertKit + 12, 'ptr') = 0 Then - If Not SalvageKitAction($lExpertKit, $MaxStorageOrBag, True, False, True) Then Return False - $lExpertKitID = MemoryRead($lExpertKit, 'long') - EndIf - Local $state_Of_StartSalvage = StartSalvage($lItem, $lExpertKitID);StartSalvageWithPacket($lItem, $lExpertKitID); - - If Not $state_Of_StartSalvage Then ContinueLoop - Update("Start Salvage " & $___Out_Data & " : " & $bag & ", " & $slot & " ==> " & $state_Of_StartSalvage) - If $Sleep Then Sleep(1250 + GetPing()) - SalvageMod($____Mod[$___ModX][0]) - Update("Salvage (" & $____Mod[$___ModX][0] & "): " & $____Mod[$___ModX][1] & " ==> " & $bag & ", " & $slot) - If Not CheckFuncStateAfterTrySalvage(SalvageHelperFunc1()) Then Return False - Sleep(250 + GetPing()) - If MemoryRead($lItem + 12, 'ptr') = 0 Then ExitLoop -Next -Return True -EndFunc - -;~ Description: Returns 1 if item contains insignia to keep, 2 if item contains rune to keep. -Func Upgrades($aItemPtr) - Local $TemReturn = [[0, False]] - Local $lModStruct = MemoryReadStruct($aItemPtr + 16, 'ptr;long') - Local $lMod = MemoryRead(DllStructGetData($lModStruct, 1), 'byte[' & DllStructGetData($lModStruct, 2) * 4 & ']') - Static $numEnd = (UBound($Rune_Insigmia) -1) - For $i = 0 to $numEnd - If ($Rune_Insigmia[$i][4] And StringInStr($lMod, $Rune_Insigmia[$i][0], 1) <> 0) Then - $TemReturn[0][0] += 1 - $TemReturn[0][1] = True - ReDim $TemReturn[$TemReturn[0][0] +1][2] - $TemReturn[$TemReturn[0][0]][0] = $Rune_Insigmia[$i][1] - $TemReturn[$TemReturn[0][0]][1] = "Found In ==> " &$lMod & " This indetifier ==> " & $Rune_Insigmia[$i][0] & " with the Name ==> " & $Rune_Insigmia[$i][2] - EndIf - Next - Return $TemReturn -EndFunc ;==>Upgrades - -;~ Description: Returns 2 for inscription, 0 and 1 for weapon mods. -Func WeaponMods($aItemPtr) - Local $TemReturn = [[0, False]] - Local $lModStruct = MemoryReadStruct($aItemPtr + 16, 'ptr;long') - Local $lMod = MemoryRead(DllStructGetData($lModStruct, 1), 'byte[' & DllStructGetData($lModStruct, 2) * 4 & ']') - Local $lType = MemoryRead($aItemPtr + 32, 'byte') - Static $numEnd = (UBound($Weapon_Mods) -1) - For $i = 0 To $numEnd - If ($Weapon_Mods[$i][13] And (StringInStr($lMod, $Weapon_Mods[$i][0], 1) <> 0)) Then ;And ($lType = $Weapon_Mods[$i][10])) - - ;works but not needed atm while searching with the max Value of Upgrade -;~ Local $_array = StringRegExp($lMod, '(.{2})(.{2})' & $Upgrades[$i][1], 3) -;~ _ArrayDisplay($_array, "StringRegExp from WeaponMods ! ") - - $TemReturn[0][0] += 1 - $TemReturn[0][1] = True - ReDim $TemReturn[$TemReturn[0][0] +1][2] - $TemReturn[$TemReturn[0][0]][0] = $Weapon_Mods[$i][4] - $TemReturn[$TemReturn[0][0]][1] = "Found In ==> " &$lMod & " This indetifier ==> " & $Weapon_Mods[$i][0] & " with the Name ==> " & $Weapon_Mods[$i][5] - EndIf - Next - Return $TemReturn -EndFunc ;==>WeaponMods - -#EndRegion - - -;~ Description: Salvages all items in all bags. Modified for explorable. -Func SalvageBagsExplorable() - If CountSlots() < 2 Then Return - Local $lSalvKitUses = 0, $lSalvKitMID, $lSalvKit - Local $lIDKitUses = 0, $lIDKitValue, $lIDKit - Local $lBagPtr, $lItemArrayPtr, $lItem, $ItemMID, $ItemRarity, $ItemType - FindSalvKitEx($lSalvKit, 1, 4, True, True) - If $lSalvKit = 0 Then Return - $lSalvKitMID = @extended - For $bag = 1 To 4 ; inventory only - If DisconnectCheck() Then ExitLoop - $lBagPtr = GetBagPtr($bag) - If $lBagPtr = 0 Then ContinueLoop - $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') - For $slot = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 - If DisconnectCheck() Then ExitLoop - $lItem = MemoryRead($lItemArrayPtr + 4 * ($slot), 'ptr') - If IgnoreItem($lItem) Then ContinueLoop - If MemoryRead($lItem + 32, 'byte') = 31 Then ContinueLoop ; scrolls - If MemoryRead($lItem + 75, 'byte') > 1 Then ContinueLoop ; dont process stacks in explorable - $ItemMID = MemoryRead($lItem + 44, 'long') ; modelID - If $ItemMID = 504 Then ContinueLoop ; Decayed Orr Emblems - If $ItemMID = 460 Or $ItemMID = 461 Then ContinueLoop ; White Mantle Emblem and Badge - If Keepers($ItemMID) Then ContinueLoop ; dont salvage keepers - $ItemRarity = GetRarity($lItem) - If $ItemRarity = 2624 And GetIsRareWeapon($lItem) Then ContinueLoop ; no salvaging rare weapons - If GetIsUnIDed($lItem) Then - If $ItemRarity = 2623 Or $ItemRarity = 2626 Then ; only ID blue and purple items in explorable - If $lIDKitUses = 0 Then - FindIDKitEx($lIDKit, 1, 4, True) - If $lIDKitUses = 0 Then ContinueLoop ; ran out of ID kits - EndIf - $lIDKitValue = MemoryRead($lIDKit + 36, 'short') - Update("Identify: " & $bag & ", " & $slot + 1) - IdentifyItem($lItem, MemoryRead($lIDKit, 'long')) - $lIDKitUses -= 1 - Sleep(250 + GetPing()) - Local $lDeadlock = TimerInit() - Do - If TimerDiff($lDeadlock) > 5000 Then ContinueLoop 2 ; ident didnt work - Sleep(GetPing() + 250) - Until MemoryRead($lIDKit + 36, 'short') <> $lIDKitValue Or MemoryRead($lIDKit + 12, 'ptr') = 0 - Sleep(GetPing() + 250) - If GetIsUnIDed($lItem) Then ContinueLoop ; ident didnt work - EndIf - EndIf - If MemoryRead($lSalvKit + 12, 'ptr') = 0 Then ; check SalvageKit before salvaging - FindSalvKitEx($lSalvKit, 1, 4, True, True) - If $lSalvKit = 0 Then Return 0 ; no more salvage kits - $lSalvKitMID = @extended - EndIf - If $ItemRarity = 2621 Then ; white - Update("Salvaging (white): " & $bag & ", " & $slot + 1) - Update("Start Salvage: " & $bag & ", " & $slot & " -> " & StartSalvage($lItem, MemoryRead($lSalvKit, 'long'))) - SalvageHelperFunc1() - $lSalvKitUses -= 1 - ElseIf $ItemRarity = 2623 Or $ItemRarity = 2626 Then ; blue or purple - $ItemType = MemoryRead($lItem + 32, 'byte') - If (($ItemType = 0) And Upgrades($lItem)[0][1]) Then - ContinueLoop - ElseIf (IsWeapon($ItemType) And WeaponMods($lItem)[0][1]) Then - ContinueLoop - Else - Update("Salvaging (" & $lSalvKitMID & "): " & $bag & ", " & $slot + 1) - Update("Start Salvage: " & $bag & ", " & $slot + 1 & " -> " & StartSalvage($lItem, MemoryRead($lSalvKit, 'long'))) - Sleep(1000 + GetPing()) - If (MemoryRead($lItem + 12, 'ptr') <> 0) Then - Update("Salvage (Materials): " & $bag & ", " & $slot + 1 & " -> " & SalvageMaterials()) - SalvageHelperFunc1() - $lSalvKitUses -= 1 - EndIf - EndIf - EndIf - Sleep(250) - Next - Next - Return True -EndFunc ;==>SalvageBagsExplorable - -;~ Description: Sell items. -Func Sell() - Local $lBagPtr, $lItemArrayPtr, $lItemPtr - Local $lItemMID - For $bag = 1 to 4 ; inventory only - $lBagPtr = GetBagPtr($bag) - If $lBagPtr = 0 Then ContinueLoop - $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') - For $slot = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 - $lItemPtr = MemoryRead($lItemArrayPtr + 4 * ($slot), 'ptr') - If $lItemPtr = 0 Then ContinueLoop - If IgnoreItem($lItemPtr) Then ContinueLoop - $lItemMID = MemoryRead($lItemPtr + 44, 'long') - If Keepers($lItemMID) Then ContinueLoop - If StackableItems($lItemMID) Then ContinueLoop - If GetRarity($lItemPtr) = 2624 And GetIsRareWeapon($lItemPtr) Then ContinueLoop - If GetIsUnIDed($lItemPtr) Then IdentifyItem($lItemPtr) - Update("Sell Item: " & $bag & ", " & $slot + 1) - SellItem($lItemPtr) - Sleep(500) - Next - Next -EndFunc ;==>Sell - -;~ Description: Sell materials. -Func SellMaterials($aRare = False) - Local $lBagPtr, $lItemArrayPtr, $lItemPtr - Local $lItemMID, $lMatType - For $bag = 1 to 4 ; inventory only - $lBagPtr = GetBagPtr($bag) - If $lBagPtr = 0 Then ContinueLoop - $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') - For $slot = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 - $lItemPtr = MemoryRead($lItemArrayPtr + 4 * ($slot), 'ptr') - If $lItemPtr = 0 Then ContinueLoop - If MemoryRead($lItemPtr + 32, 'byte') <> 11 Then ContinueLoop ; not materials - $lItemMID = MemoryRead($lItemPtr + 44, 'long') - $lMatType = CheckMaterial($lItemMID) - If $aRare Then - If $lMatType = 2 Then - For $i = 1 To MemoryRead($lItemPtr + 75, 'byte') - TraderRequestSell($lItemPtr) - Update("Sell rare materials: " & $bag & ", " & $slot + 1) - Sleep(250) - TraderSell() - Next - EndIf - Else - If $lMatType = 1 Then - For $i = 1 To Floor(MemoryRead($lItemPtr + 75, 'byte') / 10) - Update("Sell materials: " & $bag & ", " & $slot + 1) - TraderRequestSell($lItemPtr) - Sleep(250) - TraderSell() - Next - EndIf - EndIf - Next - Next -EndFunc ;==>SellMaterials - -;~ Description: Sell runes and insignias. -Func SellUpgrades() - Local $lBagPtr, $lItemArrayPtr, $lItemPtr - For $bag = 1 to 4 ; inventory only - $lBagPtr = GetBagPtr($bag) - If $lBagPtr = 0 Then ContinueLoop - $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') - For $slot = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 - $lItemPtr = MemoryRead($lItemArrayPtr + 4 * ($slot), 'ptr') - If $lItemPtr = 0 Then ContinueLoop - If MemoryRead($lItemPtr + 32, 'byte') <> 8 Then ContinueLoop ; not an upgrade - If IsRuneOrInsignia(MemoryRead($lItemPtr + 44, 'long')) = 0 Then ContinueLoop ; neither rune, nor insignia - TraderRequestSell($lItemPtr) - Sleep(250) - Update("Sell Upgrade: " & $bag & ", " & $slot + 1) - TraderSell() - Next - Next -EndFunc ;==>SellUpgrades - -;~ Description: Sell all dyes to Dye Trader except for black and white. -Func SellDyes() - Local $lBagPtr, $lItemArrayPtr, $lItemPtr - Local $lItemMID, $lItemExtraID - For $bag = 1 to 4 ; inventory only - $lBagPtr = GetBagPtr($bag) - If $lBagPtr = 0 Then ContinueLoop - $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') - For $slot = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 - $lItemPtr = MemoryRead($lItemArrayPtr + 4 * ($slot), 'ptr') - If $lItemPtr = 0 Then ContinueLoop - $lItemMID = MemoryRead($lItemPtr + 44, 'long') - If $lItemMID <> 146 Then ContinueLoop ; not a dye - If $mBlackWhite Then - $lItemExtraID = MemoryRead($lItemPtr + 34, 'short') - If $lItemExtraID = 10 Or $lItemExtraID = 12 Then ContinueLoop ; black or white - EndIf - For $i = 1 To MemoryRead($lItemPtr + 75, 'byte') - Update("Sell Dye: " & $bag & ", " & $slot + 1) - TraderRequestSell($lItemPtr) - Sleep(250) - TraderSell() - Next - Next - Next -EndFunc ;==>SellDyes - -;~ Description: Sell all gold rarity scrolls to scroll trader. -Func SellScrolls() - Local $lBagPtr, $lItemArrayPtr, $lItemPtr - For $bag = 1 to 4 ; inventory only - $lBagPtr = GetBagPtr($bag) - If $lBagPtr = 0 Then ContinueLoop - $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') - For $slot = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 - $lItemPtr = MemoryRead($lItemArrayPtr + 4 * ($slot), 'ptr') - If $lItemPtr = 0 Then ContinueLoop - If MemoryRead($lItemPtr + 32, 'byte') <> 31 Then ContinueLoop ; not a scroll - If GetRarity($lItemPtr) <> 2624 Then ContinueLoop ; not a scrolltrader scroll - TraderRequestSell($lItemPtr) - Sleep(250) - Update("Sell Scroll: " & $bag & ", " & $slot) - TraderSell() - Next - Next -EndFunc ;==>SellScrolls - -;~ Description: Tries to make room by selling in different order and selling stuff that wasnt expressly forbidden / defined in Junk(). -Func ClearInventorySpace($aMapID, $aMyID = GetMyID(), $aMe = GetAgentPtr($aMyID)) - ; first stage: sell dyes, runes, rare mats, mats, scrolls to try to make room - If GoToMerchant(GetDyeTrader($aMapID), $aMyID, $aMe) <> 0 Then SellDyes() - If GoToMerchant(GetRuneTrader($aMapID), $aMyID, $aMe) <> 0 Then SellUpgrades() - If GoToMerchant(GetMaterialTrader($aMapID), $aMyID, $aMe) <> 0 Then SellMaterials() - If GoToMerchant(GetScrollTrader($aMapID), $aMyID, $aMe) <> 0 Then SellScrolls() - If GoToMerchant(GetRareMaterialTrader($aMapID), $aMyID, $aMe) <> 0 Then SellMaterials(True) - Local $lSlots = CountSlots() - If $lSlots > 3 Then Return True ; enough room to proceed as planned - ; second stage: try selling identified purple and gold and everything else thats not expressly forbidden - GoToMerchant(GetMerchant($aMapID), $aMyID, $aMe) - Local $lBagPtr, $lItemArrayPtr, $lItemPtr - Local $lItemMID, $lItemRarity, $lIDKit, $lIDKitID - Local $lDeadlock - For $bag = 1 to 4 ; inventory only - $lBagPtr = GetBagPtr($bag) - If $lBagPtr = 0 Then ContinueLoop - $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') - For $slot = 1 To MemoryRead($lBagPtr + 32, 'long') - $lItemPtr = MemoryRead($lItemArrayPtr + 4 * ($slot + 1), 'ptr') - If $lItemPtr = 0 Then ContinueLoop - If MemoryRead($lItemPtr + 24, 'ptr') <> 0 Then ContinueLoop ; customized - If MemoryRead($lItemPtr + 76, 'byte') <> 0 Then ContinueLoop ; equipped - If MemoryRead($lItemPtr + 36, 'short') = 0 Then ContinueLoop ; value 0 - If MemoryRead($lItemPtr + 12, 'ptr') = 0 Then ContinueLoop ; not in a bag - $lItemMID = MemoryRead($lItemPtr + 44, 'long') - If Junk($lItemMID) Then - Update("Sell Item: " & $bag & ", " & $slot) - SellItem($lItemPtr) - Sleep(500) - $lSlots += 1 - If $lSlots > 3 Then Return True - ContinueLoop - EndIf - If Keepers($lItemMID) Then ContinueLoop - If StackableItems($lItemMID) Then ContinueLoop - $lItemRarity = GetRarity($lItemPtr) - If GetIsUnIDed($lItemPtr) Then - If $lItemRarity = 2624 Or $lItemRarity = 2626 Then ; only gold and purple - FindIDKitEx($lIDKit, 1, 4, True) - $lIDKitID = MemoryRead($lIDKit, 'long') - If $lIDKitID = 0 Then ContinueLoop - Update("Identify: " & $bag & ", " & $slot) - IdentifyItem($lItemPtr, $lIDKitID) - Sleep(250) - $lDeadlock = TimerInit() - Do - If TimerDiff($lDeadlock) > 5000 Then ContinueLoop 2 - Sleep(250) - Until Not GetIsUnIDed($lItemPtr) - Else - ContinueLoop - EndIf - EndIf - Switch MemoryRead($lItemPtr + 32, 'byte') - Case 0 - If Upgrades($lItemPtr)[0][1] Then ContinueLoop - Case 2, 5, 12, 15, 19, 22, 24, 26, 27, 32, 35, 36 - If $lItemRarity = 2621 Then ContinueLoop ; try to keep whites for salvaging - If $mRarityGreen And $lItemRarity = 2627 Then ContinueLoop ; dont sell greens - If WeaponMods($lItemPtr)[0][1] Then ContinueLoop - Case 4, 7, 13, 16, 19 ; no selling armor pieces - ContinueLoop - Case 11 ; Materials - ContinueLoop - Case 8 ; Upgrades - ContinueLoop - Case 9 ; Usable - ContinueLoop - Case 10 ; Dyes - ContinueLoop - Case 29 ; Kits - ContinueLoop - Case 34 ; Minipet - ContinueLoop - Case 18 ; Keys - Switch $lItemMID - Case 5962 ; Shiverpeak - ContinueLoop - Case 5963 ; Darkstone - ContinueLoop - Case 5961 ; Miners Key - ContinueLoop - Case 6535 ; Kurzick - ContinueLoop - Case 6536 ; Stoneroot - ContinueLoop - Case 6538 ; Luxon - ContinueLoop - Case 6539 ; Deep Jade - ContinueLoop - Case 6534 ; Forbidden - ContinueLoop - Case 15558 ; Vabbian - ContinueLoop - Case 15556 ; Ancient Elonian - ContinueLoop - Case 15560 ; Margonite - ContinueLoop - Case 19174 ; Demonic - ContinueLoop - Case 5882 ; Phantom - ContinueLoop - Case 5971 ; Obsidian - ContinueLoop - Case 22751 ; Lockpick - ContinueLoop - EndSwitch - EndSwitch - Update("Sell Item: " & $bag & ", " & $slot) - SellItem($lItemPtr) - Sleep(500) - $lSlots += 1 - If $lSlots > 3 Then Return True - Next - Next - Return $lSlots > 3 -EndFunc - -;~ Description: Moves item from storage and onto stack in inventory. -Func MoveItemFromStorageByModelID($aModelID, $aAmount = 250) - Local $lCount = CountItemInBagsByModelID($aModelID) - If $lCount >= $aAmount Then Return True - Local $lBagPtr, $lItemArrayPtr, $lBackslotPtr, $lItemPtr - Local $lQuantity, $lTemp, $lMoveCount, $lSlotCount, $lTimer, $lDeadlock, $lQuantityNew - Local $lRest = $aAmount - $lCount - Local $lBackpackArray[46][3] - Local $lReservedSlotCount = 0 - ; Fill $lBackpackArray with possible slots in backpack until no more space needed - For $i = 1 To 4 - $lBagPtr = GetBagPtr($i) - If $lBagPtr = 0 Then ContinueLoop - Local $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') - For $j = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 - $lBackslotPtr = MemoryRead($lItemArrayPtr + 4 * $j, 'ptr') - If $lBackslotPtr = 0 Then - $lReservedSlotCount += 1 - $lBackpackArray[$lReservedSlotCount][0] = $i - $lBackpackArray[$lReservedSlotCount][1] = $j + 1 - If $lRest < 250 Then - $lBackpackArray[$lReservedSlotCount][2] = $lRest - Else - $lBackpackArray[$lReservedSlotCount][2] = 250 - EndIf - $lRest -= 250 - ElseIf MemoryRead($lBackslotPtr + 44, 'long') = $aModelID Then - $lQuantity = MemoryRead($lBackslotPtr + 75, 'byte') - If $lQuantity >= 250 Then ContinueLoop ; full stack - ignore - $lReservedSlotCount += 1 - $lTemp = 250 - $lQuantity ; room left on stack - If $lRest > $lTemp Then - $lMoveCount = $lTemp - $lRest -= $lTemp - Else - $lMoveCount = $lRest - $lRest = 0 - EndIf - $lBackpackArray[$lReservedSlotCount][0] = $i - $lBackpackArray[$lReservedSlotCount][1] = $j + 1 - $lBackpackArray[$lReservedSlotCount][2] = $lMoveCount ; 0 -> empty slot, everything > 0 -> stack - EndIf - If $lRest <= 0 Then ExitLoop 2 - Next - Next - $lBackpackArray[0][0] = $lReservedSlotCount - $lSlotCount = 1 - ; Search Storage for stacks and move them to slots defined in $lBackpackArray while updating $lBackpackArray - For $i = 8 To 16 - $lBagPtr = GetBagPtr($i) - If $lBagPtr = 0 Then ContinueLoop - Local $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') - For $j = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 - $lItemPtr = MemoryRead($lItemArrayPtr + 4 * $j, 'ptr') - If $lItemPtr = 0 Then ContinueLoop - If MemoryRead($lItemPtr + 44, 'long') = $aModelID Then - $lQuantity = MemoryRead($lItemPtr + 75, 'byte') - $lTimer = TimerInit() - While $lQuantity > $lBackpackArray[$lSlotCount][2] And $lSlotCount <= $lBackpackArray[0][0] - MoveItemEx($lItemPtr, $lBackpackArray[$lSlotCount][0], $lBackpackArray[$lSlotCount][1], $lBackpackArray[$lSlotCount][2]) - $lDeadlock = TimerInit() - Do - Sleep(250) - $lQuantityNew = MemoryRead($lItemPtr + 75, 'byte') - If $lQuantityNew < $lQuantity Then - $lBackpackArray[$lSlotCount][2] = 0 - $lSlotCount += 1 - ExitLoop - EndIf - Until TimerDiff($lDeadlock) > 5000 - $lQuantity = $lQuantityNew - If TimerDiff($lTimer) > 30000 Then Return -1 ; error moving - WEnd - If $lSlotCount > $lBackpackArray[0][0] Then Return True - If $lQuantity > 0 And $lQuantity <= $lBackpackArray[$lSlotCount][2] Then - MoveItemEx($lItemPtr, $lBackpackArray[$lSlotCount][0], $lBackpackArray[$lSlotCount][1], $lQuantity) - $lDeadlock = TimerInit() - Do - Sleep(250) - If MemoryRead($lItemPtr + 12, 'ptr') <> $lBagPtr Then - $lBackpackArray[$lSlotCount][2] = $lBackpackArray[$lSlotCount][2] - $lQuantity - If $lBackpackArray[$lSlotCount][2] = 0 Then $lSlotCount += 1 - ExitLoop - EndIf - Until TimerDiff($lDeadlock) > 5000 - EndIf - If $lSlotCount > $lBackpackArray[0][0] Then Return True - EndIf - Next - Next -EndFunc ;==>MoveItemFromStorageByModelID - -;~ Description: Stacks items in specified bags to make room. -Func CleanUpStacks($aFirst = 1, $aEnd = 4, $aIncludeMatStorage = False) - Local $lBagPtr, $lItemPtr, $lItemArrayPtr, $lEndThis - Local $lModelID, $lQuantity, $a, $b, $lToMove - ; create bagptr array with slots to reduce memoryreads - Local $lBagPtrArray[$aEnd + 1][2] - Local $lMaxSlots = 1 - For $i = $aFirst To $aEnd - If Not $aIncludeMatStorage And $i = 6 Then ContinueLoop - $lBagPtr = GetBagPtr($i) - If $lBagPtr = 0 Then - $lBagPtrArray[$i][0] = 0 - $lBagPtrArray[$i][1] = 0 - Else - $lBagPtrArray[$i][0] = $lBagPtr - $lBagPtrArray[$i][1] = MemoryRead($lBagPtr + 32, 'long') - $lMaxSlots += $lBagPtrArray[$i][1] - EndIf - Next - ; create array of modelids to stack - Local $lArray[$lMaxSlots][5] - Local $lTempArray[$lMaxSlots][4] - Local $lCount = 0 - Local $lTempCount = 0 - For $i = $aFirst To $aEnd - If Not $aIncludeMatStorage And $i = 6 Then ContinueLoop ; ignore mat storage - $lBagPtr = $lBagPtrArray[$i][0] - If $lBagPtr = 0 Then ContinueLoop - Local $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') - For $j = 0 To $lBagPtrArray[$i][1] - 1 - $lItemPtr = MemoryRead($lItemArrayPtr + 4 * $j, 'ptr') - If $lItemPtr = 0 Then ContinueLoop - $lModelID = MemoryRead($lItemPtr + 44, 'long') - If $lModelID = 146 Then ContinueLoop - $lQuantity = MemoryRead($lItemPtr + 75, 'byte') - If $lQuantity > 1 And $lQuantity < 250 Then ; stack - $lCount += 1 - $lArray[$lCount][0] = $lItemPtr - $lArray[$lCount][1] = $i - $lArray[$lCount][2] = $j + 1 - $lArray[$lCount][3] = $lModelID - $lArray[$lCount][4] = $lQuantity - ElseIf $lQuantity = 1 Then ; not yet a stack? - If StackableItems($lModelID, 1) Then ; but only if stackable - $lCount += 1 - $lArray[$lCount][0] = $lItemPtr - $lArray[$lCount][1] = $i - $lArray[$lCount][2] = $j + 1 - $lArray[$lCount][3] = $lModelID - $lArray[$lCount][4] = $lQuantity - Else ; stragglers - $lTempArray[$lTempCount][0] = $lItemPtr - $lTempArray[$lTempCount][1] = $i - $lTempArray[$lTempCount][2] = $j + 1 - $lTempArray[$lTempCount][3] = $lModelID - $lTempCount += 1 - EndIf - EndIf - Next - Next - $lArray[0][0] = $lCount - $lBagPtrArray = 0 ; no need for bagptrs anymore - ; add stragglers - For $i = 0 To $lTempCount - 1 - ; check in $lArray - For $j = 1 To $lArray[0][0] - If $lTempArray[$i][3] = $lArray[$j][3] Then - $lCount += 1 - $lArray[$lCount][0] = $lTempArray[$i][0] - $lArray[$lCount][1] = $lTempArray[$i][1] - $lArray[$lCount][2] = $lTempArray[$i][2] - $lArray[$lCount][3] = $lTempArray[$i][3] - $lArray[$lCount][4] = 1 - EndIf - Next - Next - $lTempArray = 0 - $lArray[0][0] = $lCount - ; the actual cleaning up - For $i = 1 To $lArray[0][0] - If $lArray[$i][4] >= 250 Or $lArray[$i][4] <= 0 Then ContinueLoop ; ignore full and empty stacks - For $j = 1 To $lArray[0][0] - If $j = $i Then ContinueLoop ; obvious - If $lArray[$i][3] = $lArray[$j][3] Then ; same modelid - ; switch it up when matstorage, to move TO matstorage and not FROM matstorage - If $lArray[$j][1] = 6 Then - $a = $i ; source - $b = $j ; destination - Else - $a = $j ; source - $b = $i ; destination - EndIf - $lToMove = 250 - $lArray[$b][4] ; destination stack cant get bigger than 250 obviously - If $lToMove > $lArray[$a][4] Then $lToMove = $lArray[$a][4] ; cant move amounts bigger than source stack - MoveItemEx($lArray[$a][0], $lArray[$b][1], $lArray[$b][2], $lToMove) - $lEndThis = False - For $k = 1 To 20 ; approx 5 seconds - Sleep(250) - If MemoryRead($lArray[$a][0] + 75, 'byte') <> $lArray[$a][4] Then - $lArray[$a][4] = $lArray[$a][4] - $lToMove - $lArray[$b][4] = $lArray[$b][4] + $lToMove - ExitLoop - EndIf - If MemoryRead($lArray[$a][0] + 12, 'ptr') = 0 Then ; source stack gone - $lArray[$a][4] = 0 - $lArray[$b][4] = $lArray[$b][4] + $lToMove - ExitLoop - EndIf - Next - EndIf - Next - Next - Return True -EndFunc ;==>CleanUpStacks -#EndRegion MainFunctions - -#Region EvaluateItems -;~ Description: Return true of item is a stackable item. -Func StackableItems($aModelID, $aMats = 0) - Switch $aModelID - ; stackable drops - Case 460,474,476,486,504,522,525,811,819,822,835,1610,2994,19185,22751,24629,24630,24631,24632,27033,27035,27044,27046,27047,27052,35123 - Return True - ; tomes - Case 21786 to 21805 - Return True - ; alcohol - Case 910,2513,5585,6049,6366,6367,6375,15477,19171,22190,24593,28435,30855,31145,31146,35124,36682 - Return True - ; party - Case 6376,6368,6369,21809,21810,21813,29436,29543,36683,4730,15837,21490,22192,30626,30630,30638,30642,30646,30648,31020,31141,31142,31144,31172 - Return True - ; sweets - Case 15528,15479,19170,21492,21812,22269,22644,22752,28431,28432,28436,31150,35125,36681 - Return True - ; scrolls - Case 3256,3746,5594,5595,5611,21233,22279,22280 - Return True - ; DPRemoval - Case 6370,21488,21489,22191,35127,26784,28433 - Return True - ; special drops - Case 18345,21491,21833,28434,35121 - Return True - ; materials - Case 921 to 923, 925 to 946, 948 to 956, 6532, 6533 - Return $aMats - Case Else - Return False - EndSwitch -EndFunc ;==>StackableItems - -;~ Description: Returns true for all ModelIDs specified. -Func Keepers($aModelID) - Switch $aModelID - ; mods - Case 896,908,15554,15551,15552,894,906,897,909,893,905,6323,6331,895,907,15543,15553,15544,15555,15540,15541,15542,17059,19122,19123 - Return True - Case 5551 ; Rune of Superior Vigor - Return True - Case 460 ; White Mantle Emblem - Return $mWhiteMantleEmblem - Case 461 ; White Mantle Badge - Return $mWhiteMantleBadge - Case Else - Return False - EndSwitch -EndFunc ;==>Keepers - -;~ Description: Ignore these items while processing inventory bags. -Func IgnoreItem($aItemPtr) - If $aItemPtr = 0 Then Return True ; not a valid item - If MemoryRead($aItemPtr + 24, 'ptr') <> 0 Then Return True ; customized - If MemoryRead($aItemPtr + 76, 'byte') <> 0 Then Return True ; equipped - If MemoryRead($aItemPtr + 36, 'short') = 0 Then Return True ; value 0 - If MemoryRead($aItemPtr + 12, 'ptr') = 0 Then Return True ; not in a bag - Switch MemoryRead($aItemPtr + 32, 'byte') - Case 11 ; Materials - Return True - Case 8 ; Upgrades - Return True - Case 9 ; Usable - Return True - Case 10 ; Dyes - Return True - Case 29 ; Kits - Return True - Case 34 ; Minipet - Return True - Case 18 ; Keys - Return True - EndSwitch -EndFunc ;==>IgnoreItem - -;~ Description: Contains all modelIDs of items that could be sold if storage space is low. Use with caution. -Func Junk($aModelID) - Switch $aModelID - Case 460 ; White Mantle Emblem - Return True - Case 461 ; White Mantle Badge - Return True - Case 504 ; Decayed Orr Emblem - Return True - EndSwitch -EndFunc - -;~ Description: Returns true if item is a weapon. -Func IsWeapon($aType) - Switch $aType - Case 2,5,12,15,22,24,26,27,32,35,36 - Return $aType - EndSwitch -EndFunc ;==>IsWeapon - -;~ Description: Checks if Itemptr is armor. Returns 0 if not. -Func IsArmor($aType) - Switch $aType - Case 4, 7, 13, 16, 19 - Return $aType - EndSwitch -EndFunc ;==>IsArmor - -;~ Description: Returns 1 for Rune, 2 for Insignia, 0 if not found. -Func IsRuneOrInsignia($aModelID) - Switch $aModelID - Case 903, 5558, 5559 ; Warrior Runes - Return 1 - Case 19152 to 19156 ; Warrior Insignias - Return 2 - Case 5560, 5561, 904 ; Ranger Runes - Return 1 - Case 19157 to 19162 ; Ranger Insignias - Return 2 - Case 5556, 5557, 902 ; Monk Runes - Return 1 - Case 19149 to 19151 ; Monk Insignias - Return 2 - Case 5552, 5553, 900 ; Necromancer Runes - Return 1 - Case 19138 to 19143 ; Necromancer Insignias - Return 2 - Case 3612, 5549, 899 ; Mesmer Runes - Return 1 - Case 19128, 19130, 19129 ; Mesmer Insignias - Return 2 - Case 5554, 5555, 901 ; Elementalist Runes - Return 1 - Case 19144 to 19148 ; Elementalist Insignias - Return 2 - Case 6327 to 6329 ; Ritualist Runes - Return 1 - Case 19165 to 19167 ; Ritualist Insignias - Return 2 - Case 6324 to 6326 ; Assassin Runes - Return 1 - Case 19124 to 19127 ; Assassin Insignia - Return 2 - Case 15545 to 15547 ; Dervish Runes - Return 1 - Case 19163 to 19164 ; Dervish Insignias - Return 2 - Case 15548 to 15550 ; Paragon Runes - Return 1 - Case 19168 ; Paragon Insignias - Return 2 - Case 5550, 5551, 898 ; All Profession Runes - Return 1 - Case 19131 to 19137 ; All Profession Insignias - Return 2 - EndSwitch -EndFunc ;==>IsRuneOrInsignia - -;~ Description: Returns 1 for normal materials and 2 for rare materials. -;~ 0 if ModelID is not listed or mat should be ignored. -Func CheckMaterial($aModelID) - Switch $aModelID - Case 954, 925 ; Chitin, Cloth - Return 1 - Case 929, 933, 934 ; Dust, Feather, Fibers - Return $mDustFeatherFiber - Case 955, 948, 921 ; Granite, Iron, Bones - Return $mGraniteIronBone - Case 940, 946, 953 ; Scale, Tanned Hide, Wood Plank - Return 1 - Case 928, 926, 927 ; Silk, Linen, Damask - Return 2 - Case 931, 932, 923 ; Monstrous Eye, Monstrous Fang, Monstrous Claw - Return 2 - Case 922, 950, 949 ; Charcoal, Deldrimor, Steel Ingot - Return 2 - Case 951, 952, 956 ; Parchment, Vellum, Spiritwood - Return 2 - Case 937, 935, 938 ; Ruby, Diamond, Sapphire - Return 0 - Case 936, 945, 930 ; Onyx, Obsidian Shard, Ectoplasm - Return 0 - Case 941, 942, 943 ; Fur, Leather Square, Elonian Leather Square - Return 2 - Case 944, 939 ; Vial of Ink, Glass Vial - Return 2 - Case 6532, 6533 ; Amber, Jadeite - Return 0 - EndSwitch -EndFunc ;==>CheckMaterial - -;~ Description: Returns true if aItem is a normal material. -Func GetIsNormalMaterial($aItem) - If IsPtr($aItem) <> 0 Then - Local $lItemMID = MemoryRead($aItem + 44, 'long') - ElseIf IsDllStruct($aItem) <> 0 Then - Local $lItemMID = DllStructGetData($aItem, 'ModelID') - Else - Local $lItemMID = $aItem - EndIf - Switch $lItemMID - Case 921, 954, 925, 929, 933, 934, 955, 948, 953, 940, 946 - Return True - Case Else - Return False - EndSwitch -EndFunc ;==>GetIsNormalMaterial -#EndRegion EvaluateItems - -#Region EmptySlots -;~ Description: Returns next empty slot, start at $aBag, $aSlot. Returns 0 if there's no empty slot in this bag. -Func UpdateEmptySlot(ByRef $aBagNr, ByRef $aSlot) - Local $lBagPtr, $lItemArrayPtr, $lSlotPtr, $lBagNr, $lSlot - If $aBagNr = 0 Then - $lBagNr = 1 - Else - $lBagNr = $aBagNr - EndIf - If $aSlot = 0 Then - $lSlot = 1 - Else - $lSlot = $aSlot - EndIf - $aBagNr = 0 - $aSlot = 0 - For $bag = $lBagNr To 4 - $lBagPtr = GetBagPtr($bag) - If $lBagPtr = 0 Then Return 0 ; no bag - $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') - For $slot = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 - $lSlotPtr = MemoryRead($lItemArrayPtr + 4 * ($slot), 'ptr') - If $lSlotPtr = 0 Then - $aBagNr = $bag - $aSlot = $slot + 1 - Return True - EndIf - Next - $lSlot = 1 - Next - Return True -EndFunc ;==>UpdateEmptySlot - -;~ Description: Returns next empty slot, start at $aBag, $aSlot. Returns 0 if there's no empty slot in this bag. -Func UpdateEmptyStorageSlot(ByRef $aBagNr, ByRef $aSlot) - Local $lBagPtr, $lItemArrayPtr, $lSlotPtr, $lBagNr, $lSlot - If $aBagNr < 0 Then - $aSlot = 0 - Return ; no empty storage slots left - EndIf - If $aBagNr = 0 Then - $lBagNr = 8 - Else - $lBagNr = $aBagNr - EndIf - If $aSlot = 0 Then - $lSlot = 1 - Else - $lSlot = $aSlot - EndIf - $aBagNr = 0 - $aSlot = 0 - For $bag = $lBagNr To 16 - $lBagPtr = GetBagPtr($bag) - If $lBagPtr = 0 Then Return 0 ; no bag - $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') - For $slot = 19 To $lSlot - 1 Step -1 - $lSlotPtr = MemoryRead($lItemArrayPtr + 4 * ($slot), 'ptr') - If $lSlotPtr = 0 Then - $aBagNr = $bag - $aSlot = $slot + 1 - Return True - EndIf - Next - $lSlot = 1 - Next - Return True -EndFunc ;==>UpdateEmptyStorageSlot -#EndRegion - -#Region GoToMerchant -;~ Description: Go to merchant and co, if playernumber wasnt found go to xunlai chest and try again. -Func GoToMerchant($aPlayernumber, $aMyID = GetMyID(), $aMe = GetAgentPtr($aMyID)) - ; first try - Update("Trying to find Merchant.") - Local $lAgentArray = GetAgentPtrArray() - For $i = 1 To $lAgentArray[0] - If MemoryRead($lAgentArray[$i] + 244, 'word') = $aPlayernumber Then - GoToNPC($lAgentArray[$i], $aMyID, $aMe) - Sleep(500) - Return Dialog(0x7F) - EndIf - Next - ; merchant wasnt found, next try, but first... go to chest - Update("No Merchant found, try for chest.") - For $i = 1 To $lAgentArray[0] - If MemoryRead($lAgentArray[$i] + 244, 'word') = 4991 Then - GoToNPC($lAgentArray[$i], $aMyID, $aMe) - ExitLoop - EndIf - Next - ; aaaaand... try again to find merchant - Update("Trying to find Merchant, again.") - $lAgentArray = GetAgentPtrArray() - For $i = 1 To $lAgentArray[0] - If MemoryRead($lAgentArray[$i] + 244, 'word') = $aPlayernumber Then - GoToNPC($lAgentArray[$i], $aMyID, $aMe) - Sleep(500) - Return Dialog(0x7F) - EndIf - Next -EndFunc ;==>GoToMerchant - -;~ Description: Return merchant depending on MapID. -Func GetMerchant($aMapID) - Switch $aMapID - Case 4, 5, 6, 52, 176, 177, 178, 179 ; proph gh - Return 209 - Case 275, 276, 359, 360, 529, 530, 537, 538 ; factions and nf gh - Return 196 - Case 10, 11, 12, 139, 141, 142, 49, 857 - Return 2036 - Case 109, 120, 154 - Return 1993 - Case 116, 117, 118, 152, 153, 38 - Return 1994 - Case 122, 35 - Return 2136 - Case 123, 124 - Return 2137 - Case 129, 348, 390 - Return 3402 - Case 130, 218, 230, 287, 349, 388 - Return 3403 - Case 131, 21, 25, 36 - Return 2086 - Case 132, 135, 28, 29, 30, 32, 39, 40 - Return 2101 - Case 133, 155, 156, 157, 158, 159, 206, 22, 23, 24 - Return 2107 - Case 134, 81 - Return 2011 - Case 136, 137, 14, 15, 16, 19, 57, 73 - Return 1989 - Case 138 - Return 1975 - Case 193, 234, 278, 288, 391 - Return 3618 - Case 194, 213, 214, 225, 226, 242, 250, 283, 284, 291, 292 - Return 3275 - Case 216, 217, 249, 251 - Return 3271 - Case 219, 224, 273, 277, 279, 289, 297, 350, 389 - Return 3617 - Case 220, 274, 51 - Return 3273 - Case 222, 272, 286, 77 - Return 3401 - Case 248 - Return 1207 - Case 303 - Return 3272 - Case 376, 378, 425, 426, 477, 478 - Return 5385 - Case 381, 387, 421, 424, 427, 554 - Return 5386 - Case 393, 396, 403, 414, 476 - Return 5666 - Case 398, 407, 428, 433, 434, 435 - Return 5665 - Case 431 - Return 4721 - Case 438, 545 - Return 5621 - Case 440, 442, 469, 473, 480, 494, 496 - Return 5613 - Case 450, 559 - Return 4989 - Case 474, 495 - Return 5614 - Case 479, 487, 489, 491, 492, 502, 818 - Return 4720 - Case 555 - Return 4988 - Case 624 - Return 6758 - Case 638 - Return 6060 - Case 639, 640 - Return 6757 - Case 641 - Return 6063 - Case 642 - Return 6047 - Case 643, 645, 650 - Return 6383 - Case 644 - Return 6384 - Case 648 - Return 6589 - Case 652 - Return 6231 - Case 675 - Return 6190 - Case 808 - Return 7448 - Case 814 - Return 104 - EndSwitch -EndFunc ;==>GetMerchant - -;~ Description: Return material trader depending on MapID. -Func GetMaterialTrader($aMapID) - Switch $aMapID - Case 4, 5, 6, 52, 176, 177, 178, 179 ; proph gh - Return 204 - Case 275, 276, 359, 360, 529, 530, 537, 538 ; factions and nf gh - Return 191 - Case 109, 49, 81 - Return 2017 - Case 193 - Return 3624 - Case 194, 242, 857 - Return 3285 - Case 250 - Return 3286 - Case 376 - Return 5391 - Case 398 - Return 5671 - Case 414 - Return 5674 - Case 424 - Return 5392 - Case 433 - Return 5672 - Case 438 - Return 5624 - Case 491 - Return 4726 - Case 492 - Return 4727 - Case 638 - Return 6763 - Case 640 - Return 6764 - Case 641 - Return 6065 - Case 642 - Return 6050 - Case 643 - Return 6389 - Case 644 - Return 6390 - Case 652 - Return 6233 - Case 77 - Return 3415 - Case 808 - Return 7452 - Case 818 - Return 4729 - EndSwitch -EndFunc ;==>GetMaterialTrader - -;~ Description: Return rare material trader depending on MapID. -Func GetRareMaterialTrader($aMapID) - Switch $aMapID - Case 4, 5, 6, 52, 176, 177, 178, 179 ; proph gh - Return 205 - Case 275, 276, 359, 360, 529, 530, 537, 538 ; factions and nf gh - Return 192 - Case 109 - Return 2003 - Case 193 - Return 3627 - Case 194, 250, 857 - Return 3288 - Case 242 - Return 3287 - Case 376 - Return 5394 - Case 398, 433 - Return 5673 - Case 414 - Return 5674 - Case 424 - Return 5393 - Case 438 - Return 5619 - Case 49 - Return 2044 - Case 491, 818 - Return 4729 - Case 492 - Return 4728 - Case 638 - Return 6766 - Case 640 - Return 6765 - Case 641 - Return 6066 - Case 642 - Return 6051 - Case 643 - Return 6392 - Case 644 - Return 6391 - Case 652 - Return 6234 - Case 77 - Return 3416 - Case 81 - Return 2089 - EndSwitch -EndFunc ;==>GetRareMaterialTrader - -;~ Description: Return rune trader depending on MapID. -Func GetRuneTrader($aMapID) - Switch $aMapID - Case 4, 5, 6, 52, 176, 177, 178, 179 ; proph gh - Return 203 - Case 275, 276, 359, 360, 529, 530, 537, 538 ; factions and nf gh - Return 190 - Case 109, 814 - Return 2005 - Case 193 - Return 3630 - Case 194, 242, 250 - Return 3291 - Case 248, 857 - Return 1981 - Case 396 - Return 5678 - Case 414 - Return 5677 - Case 438 - Return 5626 - Case 477 - Return 5396 - Case 487 - Return 4732 - Case 49 - Return 2045 - Case 502 - Return 4733 - Case 624 - Return 6770 - Case 640 - Return 6769 - Case 642 - Return 6052 - Case 643, 645 - Return 6395 - Case 644 - Return 6396 - Case 77 - Return 3421 - Case 808 - Return 7456 - Case 81 - Return 2091 - Case 818 - Return 4711 - EndSwitch -EndFunc ;==>GetRuneTrader - -;~ Description: Return dye trader depending on MapID. -Func GetDyeTrader($aMapID) - Switch $aMapID - Case 4, 5, 6, 52, 176, 177, 178, 179 ; proph gh - Return 206 - Case 275, 276, 359, 360, 529, 530, 537, 538 ; factions and nf gh - Return 193 - Case 109, 49, 81, 857 - Return 2016 - Case 193 - Return 3623 - Case 194, 242 - Return 3284 - Case 250 - Return 3283 - Case 286 - Return 3408 - Case 381, 477 - Return 5389 - Case 403 - Return 5669 - Case 414 - Return 5670 - Case 640 - Return 6762 - Case 642 - Return 6049 - Case 644 - Return 6388 - Case 77 - Return 3407 - Case 812 - Return 2113 - Case 818 - Return 4725 - EndSwitch -EndFunc ;==>GetDyeTrader - -;~ Description: Return scroll trader depending on MapID. -Func GetScrollTrader($aMapID) - Switch $aMapID - Case 4, 5, 6, 52, 176, 177, 178, 179 ; proph gh - Return 207 - Case 275, 276, 359, 360, 529, 530, 537, 538 ; factions and nf gh - Return 194 - Case 109 - Return 2004 - Case 193 - Return 3629 - Case 194 - Return 3289 - Case 287 - Return 3419 - Case 396, 414 - Return 5675 - Case 426, 857 - Return 5398 - Case 442, 480 - Return 5627 - Case 49 - Return 2046 - Case 624 - Return 6767 - Case 638 - Return 6062 - Case 639, 640 - Return 6768 - Case 643, 644 - Return 6393 - Case 645 - Return 6394 - Case 77 - Return 3418 - Case 808 - Return 7454 - EndSwitch -EndFunc ;==>GetScrollTrader -#EndRegion GoToMerchant - - + +#Region Variables +Global $mEmptyBag = 8 +Global $mEmptySlot = 0 +Global $mStoreGold = False +Global $mStoreMaterials = True +Global $mBlackWhite = True +Global $mMatExchangeGold = 930 ; ModelID of mat that should be bought in case gold storage is full +Global $mSalvageStacks = True +Global $mDustFeatherFiber = 0 ; change to 1 to sell this group of materials +Global $mGraniteIronBone = 0 ; change to 1 to sell this group of materials +Global $mWhiteMantleEmblem = True ; change to false to sell them +Global $mWhiteMantleBadge = True ; change to false to sell them +#EndRegion + +#Region GoldManagement +;~ Description: Make sure to have enough gold on character, but not too much. +Func MinMaxGold() + Local $lGoldCharacter = GetGoldCharacter() + Local $lGoldStorage = GetGoldStorage() + Local $lGold = $lGoldCharacter + $lGoldStorage + ;OpenStorageWindow() + If $lGoldCharacter < 10000 And $lGoldStorage > 10000 Then + WithdrawGold(10000 - $lGoldCharacter) + Return 10000 + ElseIf $lGoldCharacter > 50000 And $lGold < 1000000 Then + DepositGold($lGoldCharacter - 10000) + Return 10000 + Else + Return $lGoldCharacter + EndIf +EndFunc ;==>MinMaxGold + +;~ Description: Checks the amount of gold a character holds and withdraws or stores accordingly. +;~ $aWithdraw -> max amount to be withdrawn from storage +;~ $aDeposit -> max amount to be deposited to storage +;~ $aMinGold -> below that gold will be withdrawn from storage +;~ $aMaxGold -> above MaxGold plus Variance, gold will be stored in storage, if storage not full +Func CheckGold($aWithdraw = 50000, $aDeposit = 50000, $aMinGold = 20000, $aMaxGold = 65000, $aVariance = 10000) + Local $Gold = GetGoldCharacter() + Local $Gold_Storage = GetGoldStorage() + If $Gold > Random($aMaxGold-$aVariance, $aMaxGold+$aVariance) Then + If $Gold_Storage = 1000000 Then Return + If $Gold_Storage + $aDeposit > 1000000 Then + Return DepositGold(1000000 - $Gold_Storage) + Else + Return DepositGold($aDeposit) + EndIf + ElseIf $Gold < $aMinGold Then + If $Gold_Storage = 0 Then Return + If $Gold_Storage < $aWithdraw Then + Return WithdrawGold($Gold_Storage) + Else + Return WithdrawGold($aWithdraw) + EndIf + EndIf +EndFunc ;==>CheckGold +#EndRegion GoldManagement + +#Region Kits +;~ Description: Buy Ident and Salvage Kits for inventory session. +Func BuyKits($aAmount = 40, $aExpertSalv = True) + Local $lItemIDRow, $lKitUses, $lBuyAmount, $lResult + Local $lIDKitUses, $lSalvKitUses, $lExperSalvKitUses + Local $lResult = False + ; identification kits + $lIDKitUses = FindIDKitUses(1, 4) + If $lIDKitUses < $aAmount Then + $lItemIDRow = GetItemRowByModelID(2989) + $lKitUses = 25 + If $lItemIDRow = 0 Then + $lItemIDRow = GetItemRowByModelID(5899) + $lKitUses = 100 + If $lItemIDRow = 0 Then Return ; no id kit + EndIf + $lBuyAmount = Ceiling(($aAmount - $lIDKITUses) / $lKitUses) + Update("Buying ID Kits: " & $lBuyAmount) + $lResult = BuyIdentKit($lItemIDRow, $lBuyAmount) + Sleep(1000 + GetPing()) + EndIf + ; salvage kits + $lSalvKitUses = KitUses(1, 4, 0, True, False) + If $lSalvKitUses < $aAmount Then + $lItemIDRow = GetItemRowByModelID(2992) + $lKitUses = 25 + If $lItemIDRow = 0 Then + $lItemIDRow = GetItemRowByModelID(2993) + $lKitUses = 10 + If $lItemIDRow = 0 Then Return + EndIf + $lBuyAmount = Ceiling(($aAmount - $lSalvKitUses) / $lKitUses) + Update("Buying Salvage Kits: " & $lBuyAmount) + $lResult = BuySalvKit(False, $lItemIDRow, $lBuyAmount) + Sleep(1000 + GetPing()) + EndIf + ; expert salvage kits + If $aExpertSalv Then + $lExperSalvKitUses = KitUses(1, 4, 0, False, True) + If $lExperSalvKitUses < $aAmount Then + $lItemIDRow = GetItemRowByModelID(2991) + $lKitUses = 25 + If $lItemIDRow = 0 Then + $lItemIDRow = GetItemRowByModelID(5900) + $lKitUses = 100 + If $lItemIDRow = 0 Then Return + EndIf + $lBuyAmount = Ceiling(($aAmount - $lExperSalvKitUses) / $lKitUses) + Update("Buying Expert Salv Kits: " & $lBuyAmount) + $lResult = BuySalvKit(True, $lItemIDRow, $lBuyAmount) + Sleep(1000 + GetPing()) + EndIf + EndIf + Return $lResult +EndFunc ;==>BuyKits + +;~ Description: Buys Ident kit. +Func BuyIdentKit($aItemIDRow = 0, $aAmount = 1) + If GetMapLoading() = 1 Then Return False + ConsoleWrite("Try to buy Ident Kit! " & @CRLF) + Local $lItemIDRow, $lItemPtr, $lValue, $Price + If $aItemIDRow = 0 Then + $lItemIDRow = GetItemRowByModelID(2989) + If $lItemIDRow = 0 Then + $lItemIDRow = GetItemRowByModelID(5899) + If $lItemIDRow = 0 Then Return False ; no id kit + EndIf + Else + $lItemIDRow = $aItemIDRow + EndIf + $lItemPtr = GetItemPtr($lItemIDRow) + $lValue = MemoryRead($lItemPtr + 36, 'short') * 2 + $Price = ($aAmount * $lValue) + Local $MoneyOnChar = GetGoldCharacter() + ConsoleWrite("Prie are = " & $Price & @CRLF) + If (($MoneyOnChar < $Price) And (GetGoldStorage() > ($Price - $MoneyOnChar))) Then + ConsoleWrite("Not enough Money..... take some !" & @CRLF) + WithdrawGold($Price - $MoneyOnChar) + ConsoleWrite("Now is the Money on Char = " & GetGoldStorage() & @CRLF) + If (GetGoldCharacter() < $Price) Then Return False + EndIf + + DllStructSetData($mBuyItem, 2, $aAmount) + DllStructSetData($mBuyItem, 3, $lItemIDRow) + DllStructSetData($mBuyItem, 4, $lValue * $aAmount) + Return SetExtended($lItemPtr, Enqueue($mBuyItemPtr, 16)) +EndFunc ;==>BuyIdentKit + +;~ Description: Buys salvage kit. +Func BuySalvKit($aExpert = False, $aItemIDRow = 0, $aAmount = 1) + If GetMapLoading() = 1 Then Return False + ConsoleWrite("Try to buy SalvageKit! " & @CRLF) +;~ Local Static $PriceForKit = [100,400,2000] + Local $lItemIDRow, $lItemPtr, $lValue, $Price + If $aItemIDRow = 0 Then + If $aExpert Then + $lItemIDRow = GetItemRowByModelID(2991) + If $lItemIDRow = 0 Then + $lItemIDRow = GetItemRowByModelID(5900) + If $lItemIDRow = 0 Then Return False + EndIf + Else + $lItemIDRow = GetItemRowByModelID(2992) + If $lItemIDRow = 0 Then + $lItemIDRow = GetItemRowByModelID(2993) + If $lItemIDRow = 0 Then Return False + EndIf + EndIf + Else + $lItemIDRow = $aItemIDRow + EndIf + $lItemPtr = GetItemPtr($lItemIDRow) + $lValue = MemoryRead($lItemPtr + 36, 'short') * 2 + $Price = ($aAmount * $lValue) + Local $MoneyOnChar = GetGoldCharacter() + ConsoleWrite("Prie are = " & $Price & @CRLF) + If (($MoneyOnChar < $Price) And (GetGoldStorage() > ($Price - $MoneyOnChar))) Then + ConsoleWrite("Not enough Money..... take some !" & @CRLF) + WithdrawGold($Price - $MoneyOnChar) + ConsoleWrite("Now is the Money on Char = " & GetGoldStorage() & @CRLF) + If (GetGoldCharacter() < $Price) Then Return False + EndIf + DllStructSetData($mBuyItem, 2, $aAmount) + DllStructSetData($mBuyItem, 3, $lItemIDRow) + DllStructSetData($mBuyItem, 4, $Price) + Return SetExtended($lItemPtr, Enqueue($mBuyItemPtr, 16)) +EndFunc ;==>BuySalvKit + +;~ Description: Finds salvage kit in specified bags and puts ptr to it in $aPtr. +;~ If $aCheapKit is set to True, then loop stops early only if kit with less than 10 uses is found, otherwise least uses kit will be returned. +;~ If only normal kits should be found, set $aNormalOnly = True. +;~ Returns modelID, uses in @extended. +Func FindSalvKitEx(ByRef $aPtr, $aBagStart = 1, $aBagEnd = 4, $aCheapKit = False, $aNormalOnly = False, $aExpertOnly = False) + If $aBagStart = Default Then $aBagStart = 1 + If $aBagEnd = Default Then $aBagEnd = 4 + If $aCheapKit = Default Then $aCheapKit = False + If $aNormalOnly = Default Then $aNormalOnly = False + If $aExpertOnly = Default Then $aExpertOnly = False + Local $lUses = 250 + Local $lKitMID = 0 + Local $lBagPtr, $lItemArrayPtr, $lItemPtr, $lValue, $lItemMID + $aPtr = 0 ; delete former value + For $bag = $aBagStart to $aBagEnd + $lBagPtr = GetBagPtr($bag) + $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') + For $slot = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 + $lItemPtr = MemoryRead($lItemArrayPtr + 4 * $slot, 'ptr') + If $lItemPtr = 0 Then ContinueLoop + $lItemMID = MemoryRead($lItemPtr + 44, 'long') + Switch $lItemMID + Case 2992, 2993 + If $aExpertOnly Then ContinueLoop + If Not FindSlavageKitEx_HelpFunc1($aCheapKit, $lKitMID, $aPtr, $lItemPtr, $lUses, $lItemMID, 2) Then ExitLoop 2 + Case 2991 + If $aNormalOnly Then ContinueLoop + If Not FindSlavageKitEx_HelpFunc1($aCheapKit, $lKitMID, $aPtr, $lItemPtr, $lUses, $lItemMID, 8) Then ExitLoop 2 + Case 5900 + If $aNormalOnly Then ContinueLoop + If Not FindSlavageKitEx_HelpFunc1($aCheapKit, $lKitMID, $aPtr, $lItemPtr, $lUses, $lItemMID, 10) Then ExitLoop 2 + EndSwitch + If $lUses < 10 Then ExitLoop 2 + Next + Next + Return SetExtended($lUses, $lKitMID) +EndFunc + +Func FindSlavageKitEx_HelpFunc1($var_1, Byref $var_2, Byref $var_3, Byref $var_4, Byref $var_5, $lItemMID, $faktor) +Local $lValue = MemoryRead($var_4 + 36, 'short') / $faktor +If Not $var_1 Then + FindSlavageKitEx_HelpFunc2($var_2, $var_3, $var_5, $var_4, $lValue, $lItemMID) + Return False +Else + If $lValue < $var_5 Then FindSlavageKitEx_HelpFunc2($var_2, $var_3, $var_5, $var_4, $lValue, $lItemMID) +EndIf +Return True +EndFunc + +Func FindSlavageKitEx_HelpFunc2(Byref $var_2, Byref $var_3, Byref $var_5, $var_4, $lValue, $lItemMID) +$var_5 = $lValue +$var_3 = $var_4 +$var_2 = $lItemMID +EndFunc + + +#Region New FincKitEx +;~ Description: Finds identification kit in specified bags and puts ptr to it in $aPtr. +;~ If $aCheapKit is set to True, then loop stops early only if kit with less than 10 uses is found, otherwise least uses kit will be returned. +;~ If only normal kits should be found, set $aNormalOnly = True. +;~ Returns modelID, uses in @extended. +Func FindIDKitEx(ByRef $aPtr, $aBagStart = 1, $aBagEnd = 4, $aCheapKit = False, $aNormalOnly = False, $aExpertOnly = False) + If $aBagStart = Default Then $aBagStart = 1 + If $aBagEnd = Default Then $aBagEnd = 4 + If $aCheapKit = Default Then $aCheapKit = False + If $aNormalOnly = Default Then $aNormalOnly = False + If $aExpertOnly = Default Then $aExpertOnly = False + Local $lUses = 250 + Local $lKitMID = 0 + Local $lBagPtr, $lItemArrayPtr, $lItemPtr + $aPtr = 0 ; delete former value + For $bag = $aBagStart to $aBagEnd + $lBagPtr = GetBagPtr($bag) + $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') + For $slot = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 + $lItemPtr = MemoryRead($lItemArrayPtr + 4 * $slot, 'ptr') + If $lItemPtr = 0 Then ContinueLoop + Switch MemoryRead($lItemPtr + 44, 'long') + Case 2989 + If $aExpertOnly Then ContinueLoop + If Not FindIDKitEx_HelpFunc1($aCheapKit, $lKitMID, $aPtr, $lItemPtr, $lUses, True) Then ExitLoop 2 + Case 5899 + If $aNormalOnly Then ContinueLoop + If Not FindIDKitEx_HelpFunc1($aCheapKit, $lKitMID, $aPtr, $lItemPtr, $lUses, False) Then ExitLoop 2 + EndSwitch + If $lUses < 10 Then ExitLoop 2 + Next + Next + Return SetExtended($lUses, $lKitMID) +EndFunc + +;$aCheapKit,$lKitMID,$aPtr,$lItemPtr,$lUses +Func FindIDKitEx_HelpFunc1($var_1, Byref $var_2, Byref $var_3, $var_4, Byref $var_5, $faktor = False) +Local $lValue = (MemoryRead($var_4 + 36, 'short') / (($faktor) ? (2) : (2.5))) +If Not $var_1 Then + FindIDKitEx_HelpFunc2($var_2, $var_3, $var_5, $lValue, $var_4, $faktor) + Return False +Else + If $lValue < $var_5 Then + FindIDKitEx_HelpFunc2($var_2, $var_3, $var_5, $lValue, $var_4, $faktor) + Return False + EndIf +EndIf +Return True +EndFunc + +Func FindIDKitEx_HelpFunc2(Byref $var_2, Byref $var_3, Byref $var_5, $lValue, $var_4, $faktor) +$var_5 = $lValue +$var_3 = $var_4 +$var_2 = (($faktor) ? (2989) : (5899)) +EndFunc +#EndRegion + + +;~ Description: Returns kit uses left. +;~ $aMode = 0 -> Salvage kits. +;~ $aMode = 1 -> Identification kits. +;~ $aMode everything but 0 or 1: All kits. +Func KitUses($aBagStart = 1, $aBagEnd = 4, $aMode = 0, $aNormalOnly = False, $aExpertOnly = False) + If $aBagStart = Default Then $aBagStart = 1 + If $aBagEnd = Default Then $aBagEnd = 1 + If $aMode = Default Then $aMode = 0 + If $aNormalOnly = Default Then $aNormalOnly = False + If $aExpertOnly = Default Then $aExpertOnly = False + Local $lUses = 0 + Local $lBagPtr, $lItemArrayPtr, $lItemPtr, $lValue + For $bag = $aBagStart to $aBagEnd + $lBagPtr = GetBagPtr($bag) + $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') + For $slot = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 + $lItemPtr = MemoryRead($lItemArrayPtr + 4 * $slot, 'ptr') + If $lItemPtr = 0 Then ContinueLoop + Switch MemoryRead($lItemPtr + 44, 'long') + Case 2989 ; id kit -> Mode 1 + If $aExpertOnly Then ContinueLoop + If $aMode <> 0 Then $lUses += MemoryRead($lItemPtr + 36, 'short') / 2 + Case 5899 ; id expert kit -> Mode 1 + If $aNormalOnly Then ContinueLoop + If $aMode <> 0 Then $lUses += MemoryRead($lItemPtr + 36, 'short') / 2.5 + Case 2992, 2993 ; salv kits -> Mode 0 + If $aExpertOnly Then ContinueLoop + If $aMode <> 1 Then $lUses += MemoryRead($lItemPtr + 36, 'short') / 2 + Case 2991 ; salv expert kit -> Mode 0 + If $aNormalOnly Then ContinueLoop + If $aMode <> 1 Then $lUses += MemoryRead($lItemPtr + 36, 'short') / 8 + Case 5900 ; salv expert kit -> Mode 0 + If $aNormalOnly Then ContinueLoop + If $aMode <> 1 Then $lUses += MemoryRead($lItemPtr + 36, 'short') / 10 + EndSwitch + Next + Next + Return $lUses +EndFunc + +;~ Description: Moves kits around so low-use kits come first in inventory. Prevents low kits piling up. +Func SortKits() + Local $lBagPtr, $lItemArrayPtr, $lItemPtr + Local $lModelID, $lValue, $lUses + Local $lTemp, $lSlot, $lDeadlock + Local $lTempArray[46][6] + Local $lCount = 0 + For $i = 1 To 4 + $lBagPtr = GetBagPtr($i) + If $lBagPtr = 0 Then ContinueLoop + $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') + For $j = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 + $lItemPtr = MemoryRead($lItemArrayPtr + 4 * $j, 'ptr') + If $lItemPtr = 0 Then ContinueLoop + If MemoryRead($lItemPtr + 32, 'byte') <> 29 Then ContinueLoop ; not a kit + $lCount += 1 + $lModelID = MemoryRead($lItemPtr + 44, 'long') + $lValue = MemoryRead($lItemPtr + 36, 'short') + Switch $lModelID + Case 2992, 2993, 2989 + $lUses = $lValue / 2 + Case 2991 + $lUses = $lValue / 8 + Case 5900 + $lUses = $lValue / 10 + Case 5899 + $lUses = $lValue / 2.5 + Case Else + ContinueLoop + EndSwitch + $lTempArray[$lCount][0] = $lItemPtr + $lTempArray[$lCount][1] = $i + $lTempArray[$lCount][2] = $j + 1 + $lTempArray[$lCount][3] = $lModelID + $lTempArray[$lCount][4] = $lUses + $lTempArray[$lCount][5] = $lItemArrayPtr + Next + Next + $lTempArray[0][0] = $lCount + For $i = 1 To $lTempArray[0][0] + $lTemp = $i + For $j = $i + 1 To $lTempArray[0][0] + If $lTempArray[$i][3] = $lTempArray[$j][3] Then + If $lTempArray[$j][4] < $lTempArray[$lTemp][4] Then $lTemp = $j + EndIf + Next + If $lTemp <> $i Then + MoveItemEx($lTempArray[$lTemp][0], $lTempArray[$i][1], $lTempArray[$i][2], 1) + $lSlot = $lTempArray[$lCount][2] - 1 + $lDeadlock = TimerInit() + Do + If TimerDiff($lDeadlock) > 5000 Then Return -1 ; something went really wrong + Sleep(250) + Until MemoryRead($lTempArray[$lTemp][5] + 4 * ($lTempArray[$lTemp][2] - 1), 'ptr') <> $lTempArray[$lTemp][0] + $lTempArray[$lTemp][0] = $lTempArray[$i][0] + $lTempArray[$lTemp][1] = $lTempArray[$i][1] + $lTempArray[$lTemp][2] = $lTempArray[$i][2] + $lTempArray[$lTemp][3] = $lTempArray[$i][3] + $lTempArray[$lTemp][4] = $lTempArray[$i][4] + $lTempArray[$lTemp][5] = $lTempArray[$i][5] + EndIf + Next + Return True +EndFunc ;==>SortKits +#EndRegion Kits + +#Region MainFunctions +;~ Description: Identify all unident items in inventory. +Func Ident() + Local $lBagPtr, $lItemPtr, $lItemArrayPtr + Local $lResult = -1 + For $bag = 1 to 4 ; inventory only + $lBagPtr = GetBagPtr($bag) + If $lBagPtr = 0 Then ContinueLoop + $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') + For $slot = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 + $lItemPtr = MemoryRead($lItemArrayPtr + 4 * ($slot), 'ptr') + If $lItemPtr = 0 Then ContinueLoop + If GetIsUnIDed($lItemPtr) Then + Update("Identify: " & $bag & ", " & $slot + 1) + OUT("Identify: " & $bag & ", " & $slot + 1) + $lResult = IdentifyItem($lItemPtr) + EndIf + Next + Next + Return $lResult +EndFunc ;==>Ident + +;~ Description: Store full stacks, unident golds and mods. +Func StoreItems() + Local $lBagPtr, $lItemArrayPtr, $lItemPtr + Local $lItemID, $lItemType, $lItemQuantity, $lItemMID + Local $lDeadlock + Local $lResult = -1 + UpdateEmptyStorageSlot($mEmptyBag, $mEmptySlot) + Update("Empty Spot: " & $mEmptyBag & ", " & $mEmptySlot) + OUT("Empty Spot: " & $mEmptyBag & ", " & $mEmptySlot) + If $mEmptySlot = 0 Then Return ; no more empty slots found +;~ OpenStorageWindow() + For $bag = 1 To 4 ; inventory only + $lBagPtr = GetBagPtr($bag) + If $lBagPtr = 0 Then ContinueLoop ; empty bag slot + $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') + For $slot = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 + $lItemPtr = MemoryRead($lItemArrayPtr + 4 * ($slot), 'ptr') + If $lItemPtr = 0 Then ContinueLoop ; empty slot + $lItemID = MemoryRead($lItemPtr, 'long') + $lItemType = MemoryRead($lItemPtr + 32, 'byte') + $lItemQuantity = MemoryRead($lItemPtr + 75, 'byte') + If $lItemType = 11 And $lItemQuantity = 250 And $mStoreMaterials Then ; materials + Update("Store Materials: " & $bag & ", " & $slot & " -> " & $mEmptyBag & ", " & $mEmptySlot) + MoveItem($lItemID, $mEmptyBag, $mEmptySlot) + $lDeadlock = TimerInit() + Do + Sleep(250) + If TimerDiff($lDeadlock) > 5000 Then + $mEmptyBag = -1 + Return False + EndIf + Until MemoryRead($lItemArrayPtr + 4 * ($slot), 'ptr') = 0 + $lResult = True + UpdateEmptyStorageSlot($mEmptyBag, $mEmptySlot) + If $mEmptySlot = 0 Then Return $lResult + ContinueLoop + EndIf + $lItemMID = MemoryRead($lItemPtr + 44, 'long') + If StackableItems($lItemMID) And $lItemQuantity = 250 Then ; only full stacks + Update("Store Stack: " & $bag & ", " & $slot & " -> " & $mEmptyBag & ", " & $mEmptySlot) + MoveItem($lItemID, $mEmptyBag, $mEmptySlot) + $lDeadlock = TimerInit() + Do + Sleep(250) + If TimerDiff($lDeadlock) > 5000 Then + $mEmptyBag = -1 + Return False + EndIf + Until MemoryRead($lItemArrayPtr + 4 * ($slot), 'ptr') = 0 + $lResult = True + UpdateEmptyStorageSlot($mEmptyBag, $mEmptySlot) + If $mEmptySlot = 0 Then Return $lResult + ContinueLoop + EndIf + If Keepers($lItemMID) Then + Update("Store Keepers: " & $bag & ", " & $slot & " -> " & $mEmptyBag & ", " & $mEmptySlot) + MoveItem($lItemID, $mEmptyBag, $mEmptySlot) + $lDeadlock = TimerInit() + Do + Sleep(250) + If TimerDiff($lDeadlock) > 5000 Then + $mEmptyBag = -1 + Return False + EndIf + Until MemoryRead($lItemArrayPtr + 4 * ($slot), 'ptr') = 0 + $lResult = True + UpdateEmptyStorageSlot($mEmptyBag, $mEmptySlot) + If $mEmptySlot = 0 Then Return $lResult ; no more empty slots + ContinueLoop + EndIf + If $mStoreGold And GetRarity($lItemPtr) = 2624 Then ; store unident golds if possible + Update("Store Golds: " & $bag & ", " & $slot & " -> " & $mEmptyBag & ", " & $mEmptySlot) + MoveItem($lItemID, $mEmptyBag, $mEmptySlot) + $lDeadlock = TimerInit() + Do + Sleep(250) + If TimerDiff($lDeadlock) > 5000 Then + $mEmptyBag = -1 + Return False + EndIf + Until MemoryRead($lItemArrayPtr + 4 * ($slot), 'ptr') = 0 + $lResult = True + UpdateEmptyStorageSlot($mEmptyBag, $mEmptySlot) + If $mEmptySlot = 0 Then Return $lResult ; no more empty slots + ContinueLoop + EndIf + Next + Next + Return $lResult +EndFunc ;==>StoreItems + + +#Region New SalvageBags +Func IdentKitAction(ByRef $var_, $wichOne, $state1 = False, $State2 = False, $State3 = False) +FindIDKitEx($var_, 1, $wichOne, True) +If $var_ = 0 Then + If Not BuyIdentKit() Then Return False + FindIDKitEx($var_, 1, $wichOne, $state1) +EndIf +If $var_ = 0 Then Return False +Return True +EndFunc + +Func SalvageKitAction(ByRef $var_, $wichOne, $state1 = False, $State2 = False, $State3 = False) +FindSalvKitEx($var_, 1, $wichOne, $state1, $State2, $State3) +If $var_ = 0 Then + If Not BuySalvKit(True) Then Return False + FindSalvKitEx($var_, 1, $wichOne, $state1, $State2, $State3) + If $var_ = 0 Then Return False +EndIf +Return True +EndFunc + +Func GetAvaibleBagPtr() +Local $lBagPtr = 0, $tempArray[16][2] +$tempArray[0][0] = 0 +For $i = 1 To 4 + $lBagPtr = GetBagPtr($i) + If $lBagPtr = 0 Then ContinueLoop + $tempArray[0][0] += 1 + $tempArray[$tempArray[0][0]][0] = $lBagPtr + $tempArray[$tempArray[0][0]][1] = $i ; are the Numer of the Bag +Next +Redim $tempArray[$tempArray[0][0] +1][2] +Return $tempArray +EndFunc + +Func SalvageBags() +Local $MapState = GetMapLoading() +If Not IsArray(OpenBackpackSlot()) And Not TempStorage() Then Return False +Local $lIdentify = True + +Local $MaxStorageOrBag = (($MapState = 0) ? (16) : (4)) +; Search for ID kit +Local $lIDKit = 0,$lCheapKit = 0, $lExpertKit = 0 + +; Search for normal salvage kit +$lIdentify = IdentKitAction($lIDKit, $MaxStorageOrBag, True) +; Search for expert salvage kit +If Not SalvageKitAction($lExpertKit, $MaxStorageOrBag, True, False, True) Then Return False +; Search for cheapest salvage kit +If Not SalvageKitAction($lCheapKit, $MaxStorageOrBag, True, True) Then Return False + +Local $lIDKitID = MemoryRead($lIDKit, 'long') +Local $lExpertKitID = MemoryRead($lExpertKit, 'long') +Local $lCheapKitID = MemoryRead($lCheapKit, 'long') + + ; Start processing +Local $lItem, $lItemArrayPtr, $lQuantity, $ItemMID, $ItemRarity, $lDeadlock, $lQuantityOld, $Disconnect = False, $MaxSolts = 0 +Local $BagPtrArray = GetAvaibleBagPtr() +;~ _ArrayDisplay($BagPtrArray, "$BagPtrArray") +For $bag = 1 To $BagPtrArray[0][0] + $lItemArrayPtr = MemoryRead($BagPtrArray[$bag][0] + 24, 'ptr') + $MaxSolts = MemoryRead($BagPtrArray[$bag][0] + 32, 'long') + If Not IsArray(OpenBackpackSlot()) And Not TempStorage() Then ContinueLoop + + For $slot = 1 To $MaxSolts + + DisconnectCheck() +;~ If $globaldebug Then ConsoleWrite("Bag = " & $BagPtrArray[$bag][1] & " Slot = " & $slot & " Last Slot (Max) = " & $MaxSolts & @CRLF) + $lItem = MemoryRead($lItemArrayPtr + 4 * ($slot - 1), 'ptr') + + If IgnoreItem($lItem) Then ContinueLoop + If MemoryRead($lItem + 32, 'byte') = 31 Then ContinueLoop ; scrolls + + $lQuantity = MemoryRead($lItem + 75, 'byte') + If $lQuantity > 1 And Not $mSalvageStacks Then ContinueLoop ; dont process stacks + + $ItemMID = MemoryRead($lItem + 44, 'long') ; modelID + If $ItemMID = 504 Then ContinueLoop ; Decayed Orr Emblems + + If $ItemMID = 460 Or $ItemMID = 461 Then ContinueLoop ; White Mantle Emblem and Badge + If Keepers($ItemMID) Then ContinueLoop ; dont salvage keepers + + $ItemRarity = GetRarity($lItem) + If $ItemRarity = 2624 And GetIsRareWeapon($lItem) Then ContinueLoop ; no salvaging rare weapons + + If DisconnectCheck() Then + GoToMerchant(GetMerchant(GetMapID())) +;~ If $globaldebug Then ConsoleWrite("Disconnect in Slot Loop !" & @CRLF) + $slot -=1 + ContinueLoop + EndIf + +;~ ; Identify item if necessary and id kit available + If $lIdentify And GetIsUnIDed($lItem) Then + + If MemoryRead($lIDKit + 12, 'ptr') = 0 Then + $lIdentify = IdentKitAction($lIDKit, $MaxStorageOrBag, True) + If Not $lIdentify Then ContinueLoop + $lIDKitID = MemoryRead($lIDKit, 'long') + EndIf + Update("Identify: " & $BagPtrArray[$bag][1] & ", " & $slot) + IdentifyItem($lItem, $lIDKitID) + Sleep(1000 + GetPing()) + $lDeadlock = TimerInit() + Do; + If TimerDiff($lDeadlock) > 5000 Then ContinueLoop 2 ; ident didnt work + Sleep(500 + GetPing()) + Until Not GetIsUnIDed($lItem) + EndIf + + Switch($ItemRarity) +;~ ; salvage whites + Case 2621 + For $i = 1 To $lQuantity; + If MemoryRead($lCheapKit + 12, 'ptr') = 0 Then + If Not SalvageKitAction($lCheapKit, $MaxStorageOrBag, True, True) Then Return False + $lCheapKitID = MemoryRead($lCheapKit, 'long') + EndIf + $lQuantityOld = $lQuantity + Update("Start Salvage (white): " & $BagPtrArray[$bag][1] & ", " & $slot & " -> " & StartSalvage($lItem, $lCheapKitID)) +;~ Update("Start Salvage (white): " & $BagPtrArray[$bag][1] & ", " & $slot & " -> " & StartSalvageWithPacket($lItem, $lCheapKitID)) +;~ SalvageMaterials() + Local $returnstate = CheckFuncStateAfterTrySalvage(SalvageHelperFunc1()) + IF $returnstate = -3 Then + $i -= 1 + ContinueLoop + EndIf + IF $returnstate = 0 Then Return False + Next + +;~ ; salvage non-whites + Case 2623 , 2626 , 2624 ; blue or purple or gold + If GetIsUpgraded($lItem) Then + If Not IsArray(OpenBackpackSlot()) And Not TempStorage() Then ContinueLoop + If Not SlavageOutModsRuneInsignia($lExpertKit, $lExpertKitID, $slot, $bag, $lItem, $MaxStorageOrBag) Then ContinueLoop + Else + ; salvage materials if item not destroyed + If $ItemRarity <> 2624 And MemoryRead($lItem + 12, 'ptr') <> 0 Then + If MemoryRead($lCheapKit + 12, 'ptr') = 0 Then + If Not SalvageKitAction($lCheapKit, $MaxStorageOrBag, True, True) Then Return False + $lCheapKitID = MemoryRead($lCheapKit, 'long') + EndIf + Update("Start Salvage_: " & $BagPtrArray[$bag][1] & ", " & $slot & " -> " & StartSalvage($lItem, $lCheapKitID)) + Sleep(1250 + GetPing()) + If $ItemRarity <> 2623 And MemoryRead($lItem + 12, 'ptr') <> 0 Then + Update("Salvage (Materials): " & $BagPtrArray[$bag][1] & ", " & $slot & " -> " & SalvageMaterials()) + + Local $returnstate = CheckFuncStateAfterTrySalvage(SalvageHelperFunc1()) + IF $returnstate = -3 Then + $i -= 1 + ContinueLoop + EndIf + IF $returnstate = 0 Then Return False + If MemoryRead($lItem + 12, 'ptr') = 0 Then ContinueLoop + EndIf + EndIf + EndIf + + EndSwitch + Next +Next +IF $mTempStorage[0][0] > 0 Then RestoreStorage() +Return True +EndFunc ;==>SalvageBags + +Func CheckFuncStateAfterTrySalvage($state) +Local Static $String_Array = [4, " ", "Deadlock trigger !", "by salvage i had a DC !", "salvage works !"] + Switch($state) + Case 3 + Out($String_Array[$state] & @CRLF) + + GoToMerchant(GetMerchant()) + $SalvageState = False + Return -3 + Case 2;, 1 + Out($String_Array[$state] & @CRLF) + $SalvageState = False + Return 0 + Case 4 + Out($String_Array[$state] & @CRLF) + Return 1 + EndSwitch +EndFunc + +Func SalvageHelperFunc1() +Local $lDeadlock = TimerInit() +Do; + Sleep(500 + GetPing()) + If DisconnectCheck() Then Return 3 + If TimerDiff($lDeadlock) >= 12000 Then Return 2 +Until $SalvageState +If $SalvageState Then $SalvageState = False + +Sleep(250 + GetPing()) +Return 4 +EndFunc + +Func SlavageOutModsRuneInsignia(ByRef $lExpertKit, ByRef $lExpertKitID, $slot, $bag, $lItem, $MaxStorageOrBag) +Static $___From_Armor = "Armor Mod" +Static $___From_Weapon = "Weapon" +Local $___Out_Data = "", $ExtraSleep = False, $____Mod +Switch(MemoryRead($lItem + 32, 'byte')) + Case 0 + $____Mod = Upgrades($lItem) + $___Out_Data = $___From_Armor + + Case 2,5,12,15,22,24,26,27,32,35,36 + $____Mod = WeaponMods($lItem) + $___Out_Data = $___From_Weapon + $ExtraSleep = True +Endswitch +IF $____Mod[0][0] = 0 Then Return False +; _ArrayDisplay($____Mod , $___Out_Data) +For $___ModX = 1 To $____Mod[0][0] + If Not IsArray(OpenBackpackSlot()) And Not TempStorage() Then Return False + If MemoryRead($lExpertKit + 12, 'ptr') = 0 Then + If Not SalvageKitAction($lExpertKit, $MaxStorageOrBag, True, False, True) Then Return False + $lExpertKitID = MemoryRead($lExpertKit, 'long') + EndIf + Local $state_Of_StartSalvage = StartSalvage($lItem, $lExpertKitID);StartSalvageWithPacket($lItem, $lExpertKitID); + + If Not $state_Of_StartSalvage Then ContinueLoop + Update("Start Salvage " & $___Out_Data & " : " & $bag & ", " & $slot & " ==> " & $state_Of_StartSalvage) + Local $Sleepdummy = (($ExtraSleep = True) ? (Sleep(1250 + GetPing())) : (Sleep(250 + GetPing()))) + SalvageMod($____Mod[$___ModX][0]) + Update("Salvage (" & $____Mod[$___ModX][0] & "): " & $____Mod[$___ModX][1] & " ==> " & $bag & ", " & $slot) + Local $returnstate = CheckFuncStateAfterTrySalvage(SalvageHelperFunc1()) + IF $returnstate = -3 Then + $___ModX -= 1 + ContinueLoop + EndIf + IF $returnstate = 0 Then Return False + Sleep(750 + GetPing()) + If MemoryRead($lItem + 12, 'ptr') = 0 Then ExitLoop +Next +Return True +EndFunc + +;~ Description: Returns 1 if item contains insignia to keep, 2 if item contains rune to keep. +Func Upgrades($aItemPtr) + Local $TemReturn = [[0, False]] + Local $lModStruct = MemoryReadStruct($aItemPtr + 16, 'ptr;long') + Local $lMod = MemoryRead(DllStructGetData($lModStruct, 1), 'byte[' & DllStructGetData($lModStruct, 2) * 4 & ']') + Static $numEnd = (UBound($Rune_Insigmia) -1) + For $i = 0 to $numEnd + If ($Rune_Insigmia[$i][4] And StringInStr($lMod, $Rune_Insigmia[$i][0], 1) <> 0) Then + $TemReturn[0][0] += 1 + $TemReturn[0][1] = True + ReDim $TemReturn[$TemReturn[0][0] +1][2] + $TemReturn[$TemReturn[0][0]][0] = $Rune_Insigmia[$i][1] + $TemReturn[$TemReturn[0][0]][1] = "Found In ==> " &$lMod & " This indetifier ==> " & $Rune_Insigmia[$i][0] & " with the Name ==> " & $Rune_Insigmia[$i][2] + EndIf + Next + Return $TemReturn +EndFunc ;==>Upgrades + +;~ Description: Returns 2 for inscription, 0 and 1 for weapon mods. +Func WeaponMods($aItemPtr) + Local $TemReturn = [[0, False]] + Local $lModStruct = MemoryReadStruct($aItemPtr + 16, 'ptr;long') + Local $lMod = MemoryRead(DllStructGetData($lModStruct, 1), 'byte[' & DllStructGetData($lModStruct, 2) * 4 & ']') + Local $lType = MemoryRead($aItemPtr + 32, 'byte') + Static $numEnd = (UBound($Weapon_Mods) -1) + For $i = 0 To $numEnd + If ($Weapon_Mods[$i][13] And (StringInStr($lMod, $Weapon_Mods[$i][0], 1) <> 0)) Then ;And ($lType = $Weapon_Mods[$i][10])) +;~ _ArrayDisplay($_array, "StringRegExp from WeaponMods ! ") + $TemReturn[0][0] += 1 + $TemReturn[0][1] = True + ReDim $TemReturn[$TemReturn[0][0] +1][2] + $TemReturn[$TemReturn[0][0]][0] = $Weapon_Mods[$i][4] + $TemReturn[$TemReturn[0][0]][1] = "Found In ==> " &$lMod & " This indetifier ==> " & $Weapon_Mods[$i][0] & " with the Name ==> " & $Weapon_Mods[$i][5] + EndIf + Next + Return $TemReturn +EndFunc ;==>WeaponMods + +#EndRegion + + +;~ Description: Salvages all items in all bags. Modified for explorable. +Func SalvageBagsExplorable() + If CountSlots() < 2 Then Return + Local $lSalvKitUses = 0, $lSalvKitMID, $lSalvKit + Local $lIDKitUses = 0, $lIDKitValue, $lIDKit + Local $lBagPtr, $lItemArrayPtr, $lItem, $ItemMID, $ItemRarity, $ItemType + FindSalvKitEx($lSalvKit, 1, 4, True, True) + If $lSalvKit = 0 Then Return + $lSalvKitMID = @extended + For $bag = 1 To 4 ; inventory only + $lBagPtr = GetBagPtr($bag) + If $lBagPtr = 0 Then ContinueLoop + $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') + For $slot = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 + + If DisconnectCheck() Then + $slot = 0 + ContinueLoop + EndIf + + If Not IsArray(OpenBackpackSlot()) And Not TempStorage() Then ContinueLoop + $lItem = MemoryRead($lItemArrayPtr + 4 * ($slot), 'ptr') + If IgnoreItem($lItem) Then ContinueLoop + If MemoryRead($lItem + 32, 'byte') = 31 Then ContinueLoop ; scrolls + If MemoryRead($lItem + 75, 'byte') > 1 Then ContinueLoop ; dont process stacks in explorable + $ItemMID = MemoryRead($lItem + 44, 'long') ; modelID + If $ItemMID = 504 Then ContinueLoop ; Decayed Orr Emblems + If $ItemMID = 460 Or $ItemMID = 461 Then ContinueLoop ; White Mantle Emblem and Badge + If Keepers($ItemMID) Then ContinueLoop ; dont salvage keepers + $ItemRarity = GetRarity($lItem) + If $ItemRarity = 2624 And GetIsRareWeapon($lItem) Then ContinueLoop ; no salvaging rare weapons + If GetIsUnIDed($lItem) Then + If $ItemRarity = 2623 Or $ItemRarity = 2626 Then ; only ID blue and purple items in explorable + If $lIDKitUses = 0 Then + FindIDKitEx($lIDKit, 1, 4, True) + If $lIDKitUses = 0 Then ContinueLoop ; ran out of ID kits + EndIf + $lIDKitValue = MemoryRead($lIDKit + 36, 'short') + Update("Identify: " & $bag & ", " & $slot + 1) + IdentifyItem($lItem, MemoryRead($lIDKit, 'long')) + $lIDKitUses -= 1 + Sleep(250 + GetPing()) + Local $lDeadlock = TimerInit() + Do + If TimerDiff($lDeadlock) > 5000 Then ContinueLoop 2 ; ident didnt work + Sleep(GetPing() + 250) + Until MemoryRead($lIDKit + 36, 'short') <> $lIDKitValue Or MemoryRead($lIDKit + 12, 'ptr') = 0 + Sleep(GetPing() + 250) + If GetIsUnIDed($lItem) Then ContinueLoop ; ident didnt work + EndIf + EndIf + If MemoryRead($lSalvKit + 12, 'ptr') = 0 Then ; check SalvageKit before salvaging + FindSalvKitEx($lSalvKit, 1, 4, True, True) + If $lSalvKit = 0 Then Return 0 ; no more salvage kits + $lSalvKitMID = @extended + EndIf + If $ItemRarity = 2621 Then ; white + Update("Salvaging (white): " & $bag & ", " & $slot + 1) + Update("Start Salvage: " & $bag & ", " & $slot & " -> " & StartSalvage($lItem, MemoryRead($lSalvKit, 'long'))) + SalvageHelperFunc1() + $lSalvKitUses -= 1 + ElseIf $ItemRarity = 2623 Or $ItemRarity = 2626 Then ; blue or purple + $ItemType = MemoryRead($lItem + 32, 'byte') + If (($ItemType = 0) And Upgrades($lItem)[0][1]) Then + ContinueLoop + ElseIf (IsWeapon($ItemType) And WeaponMods($lItem)[0][1]) Then + ContinueLoop + Else + Update("Salvaging (" & $lSalvKitMID & "): " & $bag & ", " & $slot + 1) + Update("Start Salvage: " & $bag & ", " & $slot + 1 & " -> " & StartSalvage($lItem, MemoryRead($lSalvKit, 'long'))) + Sleep(1000 + GetPing()) + If (MemoryRead($lItem + 12, 'ptr') <> 0) Then + Update("Salvage (Materials): " & $bag & ", " & $slot + 1 & " -> " & SalvageMaterials()) + SalvageHelperFunc1() + $lSalvKitUses -= 1 + EndIf + EndIf + EndIf + + Sleep(250) + IF $mTempStorage[0][1] And $mTempStorage[0][0] = 0 Then + If IsArray(OpenBackpackSlot()) Then + Local $_Item_Agent_Ptr = GetNearestItemPtrTo() + If IsPtr($_Item_Agent_Ptr) Then + Local $lAgentID = MemoryRead($_Item_Agent_Ptr + 44, 'long') + If $lAgentID > 0 Then + Local $lMeX, $lMeY, $lAgentX, $lAgentY + UpdateAgentPosByPtr($MyPtr, $lMeX, $lMeY) + UpdateAgentPosByPtr($_Item_Agent_Ptr, $lAgentX, $lAgentY) + $lDistance = Sqrt(($lMeX - $lAgentX) ^ 2 + ($lMeY - $lAgentY) ^ 2) + PickUpItems($_Item_Agent_Ptr, $lAgentID, $lAgentX, $lAgentY, $lDistance, $MyPtr) + EndIf + EndIf + EndIf + EndIf + Next + Next + Return True +EndFunc ;==>SalvageBagsExplorable + +;~ Description: Sell items. +Func Sell() + Local $lBagPtr, $lItemArrayPtr, $lItemPtr + Local $lItemMID + For $bag = 1 to 4 ; inventory only + $lBagPtr = GetBagPtr($bag) + If $lBagPtr = 0 Then ContinueLoop + $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') + For $slot = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 + $lItemPtr = MemoryRead($lItemArrayPtr + 4 * ($slot), 'ptr') + If $lItemPtr = 0 Then ContinueLoop + If IgnoreItem($lItemPtr) Then ContinueLoop + $lItemMID = MemoryRead($lItemPtr + 44, 'long') + If Keepers($lItemMID) Then ContinueLoop + If StackableItems($lItemMID) Then ContinueLoop + If GetRarity($lItemPtr) = 2624 And GetIsRareWeapon($lItemPtr) Then ContinueLoop + If GetIsUnIDed($lItemPtr) Then IdentifyItem($lItemPtr) + Update("Sell Item: " & $bag & ", " & $slot + 1) + SellItem($lItemPtr) + Sleep(500) + Next + Next +EndFunc ;==>Sell + +;~ Description: Sell materials. +Func SellMaterials($aRare = False) + Local $lBagPtr, $lItemArrayPtr, $lItemPtr + Local $lItemMID, $lMatType + For $bag = 1 to 4 ; inventory only + $lBagPtr = GetBagPtr($bag) + If $lBagPtr = 0 Then ContinueLoop + $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') + For $slot = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 + $lItemPtr = MemoryRead($lItemArrayPtr + 4 * ($slot), 'ptr') + If $lItemPtr = 0 Then ContinueLoop + If MemoryRead($lItemPtr + 32, 'byte') <> 11 Then ContinueLoop ; not materials + $lItemMID = MemoryRead($lItemPtr + 44, 'long') + $lMatType = CheckMaterial($lItemMID) + If $aRare Then + If $lMatType = 2 Then + For $i = 1 To MemoryRead($lItemPtr + 75, 'byte') + TraderRequestSell($lItemPtr) + Update("Sell rare materials: " & $bag & ", " & $slot + 1) + Sleep(250) + TraderSell() + Next + EndIf + Else + If $lMatType = 1 Then + For $i = 1 To Floor(MemoryRead($lItemPtr + 75, 'byte') / 10) + Update("Sell materials: " & $bag & ", " & $slot + 1) + TraderRequestSell($lItemPtr) + Sleep(250) + TraderSell() + Next + EndIf + EndIf + Next + Next +EndFunc ;==>SellMaterials + +;~ Description: Sell runes and insignias. +Func SellUpgrades() + Local $lBagPtr, $lItemArrayPtr, $lItemPtr + For $bag = 1 to 4 ; inventory only + $lBagPtr = GetBagPtr($bag) + If $lBagPtr = 0 Then ContinueLoop + $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') + For $slot = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 + $lItemPtr = MemoryRead($lItemArrayPtr + 4 * ($slot), 'ptr') + If $lItemPtr = 0 Then ContinueLoop + If MemoryRead($lItemPtr + 32, 'byte') <> 8 Then ContinueLoop ; not an upgrade + If IsRuneOrInsignia(MemoryRead($lItemPtr + 44, 'long')) = 0 Then ContinueLoop ; neither rune, nor insignia + TraderRequestSell($lItemPtr) + Sleep(250) + Update("Sell Upgrade: " & $bag & ", " & $slot + 1) + TraderSell() + Next + Next +EndFunc ;==>SellUpgrades + +;~ Description: Sell all dyes to Dye Trader except for black and white. +Func SellDyes() + Local $lBagPtr, $lItemArrayPtr, $lItemPtr + Local $lItemMID, $lItemExtraID + For $bag = 1 to 4 ; inventory only + $lBagPtr = GetBagPtr($bag) + If $lBagPtr = 0 Then ContinueLoop + $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') + For $slot = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 + $lItemPtr = MemoryRead($lItemArrayPtr + 4 * ($slot), 'ptr') + If $lItemPtr = 0 Then ContinueLoop + $lItemMID = MemoryRead($lItemPtr + 44, 'long') + If $lItemMID <> 146 Then ContinueLoop ; not a dye + If $mBlackWhite Then + $lItemExtraID = MemoryRead($lItemPtr + 34, 'short') + If $lItemExtraID = 10 Or $lItemExtraID = 12 Then ContinueLoop ; black or white + EndIf + For $i = 1 To MemoryRead($lItemPtr + 75, 'byte') + Update("Sell Dye: " & $bag & ", " & $slot + 1) + TraderRequestSell($lItemPtr) + Sleep(250) + TraderSell() + Next + Next + Next +EndFunc ;==>SellDyes + +;~ Description: Sell all gold rarity scrolls to scroll trader. +Func SellScrolls() + Local $lBagPtr, $lItemArrayPtr, $lItemPtr + For $bag = 1 to 4 ; inventory only + $lBagPtr = GetBagPtr($bag) + If $lBagPtr = 0 Then ContinueLoop + $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') + For $slot = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 + $lItemPtr = MemoryRead($lItemArrayPtr + 4 * ($slot), 'ptr') + If $lItemPtr = 0 Then ContinueLoop + If MemoryRead($lItemPtr + 32, 'byte') <> 31 Then ContinueLoop ; not a scroll + If GetRarity($lItemPtr) <> 2624 Then ContinueLoop ; not a scrolltrader scroll + TraderRequestSell($lItemPtr) + Sleep(250) + Update("Sell Scroll: " & $bag & ", " & $slot) + TraderSell() + Next + Next +EndFunc ;==>SellScrolls +;Dye =1 +;Scroll = 2 +;Upgrades =3 +;Materials Normal = 4 +;Materials Rare= 5 +Func Check_If_ItemType_is_Given($_Check_Wich = 0) + If $_Check_Wich = 0 Then Return False + Local $lBagPtr, $lItemArrayPtr, $lItemPtr + Local $lItemMID, $lItemExtraID + For $bag = 1 to 4 ; inventory only + $lBagPtr = GetBagPtr($bag) + If $lBagPtr = 0 Then ContinueLoop + $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') + For $slot = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 + $lItemPtr = MemoryRead($lItemArrayPtr + 4 * ($slot), 'ptr') + If $lItemPtr = 0 Then ContinueLoop + $lItemMID = MemoryRead($lItemPtr + 44, 'long') + Switch $_Check_Wich + Case 1 + ;Dye + If $lItemMID <> 146 Then ContinueLoop ; not a dye + If $mBlackWhite Then + $lItemExtraID = MemoryRead($lItemPtr + 34, 'short') + If $lItemExtraID = 10 Or $lItemExtraID = 12 Then ContinueLoop ; black or white + EndIf + Return True + Case 2 + ;Scroll + If MemoryRead($lItemPtr + 32, 'byte') <> 31 Then ContinueLoop ; not a scroll + If GetRarity($lItemPtr) <> 2624 Then ContinueLoop ; not a scrolltrader scroll + Return True + Case 3 + ;Upgrades + If MemoryRead($lItemPtr + 32, 'byte') <> 8 Then ContinueLoop ; not an upgrade + If IsRuneOrInsignia(MemoryRead($lItemPtr + 44, 'long')) = 0 Then ContinueLoop ; neither rune, nor insignia + Return True + Case 4 + ;Materials Normal + If CheckMaterial($lItemMID) = 1 Then Return True + Case 5 + ;Materials Rare + If CheckMaterial($lItemMID) = 2 Then Return True + Endswitch + Next + Next + Return False +EndFunc ;==>SellDyes + +;~ Description: Tries to make room by selling in different order and selling stuff that wasnt expressly forbidden / defined in Junk(). +Func ClearInventorySpace($aMapID, $aMyID = GetMyID(), $aMe = GetAgentPtr($aMyID)) + + ; first stage: sell dyes, runes, rare mats, mats, scrolls to try to make room + + IF Check_If_ItemType_is_Given(1) Then + If GoToMerchant(GetDyeTrader($aMapID), $aMyID, $aMe) <> 0 Then SellDyes() + EndIf + + IF Check_If_ItemType_is_Given(2) Then + If GoToMerchant(GetScrollTrader($aMapID), $aMyID, $aMe) <> 0 Then SellScrolls() + EndIf + + IF Check_If_ItemType_is_Given(3) Then + If GoToMerchant(GetRuneTrader($aMapID), $aMyID, $aMe) <> 0 Then SellUpgrades() + EndIf + + IF Check_If_ItemType_is_Given(4) Then + If GoToMerchant(GetMaterialTrader($aMapID), $aMyID, $aMe) <> 0 Then SellMaterials() + EndIf + + IF Check_If_ItemType_is_Given(5) Then + If GoToMerchant(GetRareMaterialTrader($aMapID), $aMyID, $aMe) <> 0 Then SellMaterials(True) + EndIf + + + Local $lSlots = CountSlots() +; If $lSlots > 3 Then Return True ; enough room to proceed as planned + ; second stage: try selling identified purple and gold and everything else thats not expressly forbidden + GoToMerchant(GetMerchant($aMapID), $aMyID, $aMe) + Local $lBagPtr, $lItemArrayPtr, $lItemPtr + Local $lItemMID, $lItemRarity, $lIDKit, $lIDKitID + Local $lDeadlock + For $bag = 1 to 4 ; inventory only + $lBagPtr = GetBagPtr($bag) + If $lBagPtr = 0 Then ContinueLoop + $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') + For $slot = 1 To MemoryRead($lBagPtr + 32, 'long') + $lItemPtr = MemoryRead($lItemArrayPtr + 4 * ($slot + 1), 'ptr') + If $lItemPtr = 0 Then ContinueLoop + If MemoryRead($lItemPtr + 24, 'ptr') <> 0 Then ContinueLoop ; customized + If MemoryRead($lItemPtr + 76, 'byte') <> 0 Then ContinueLoop ; equipped + If MemoryRead($lItemPtr + 36, 'short') = 0 Then ContinueLoop ; value 0 + If MemoryRead($lItemPtr + 12, 'ptr') = 0 Then ContinueLoop ; not in a bag + $lItemMID = MemoryRead($lItemPtr + 44, 'long') + If Junk($lItemMID) Then + Update("Sell Item: " & $bag & ", " & $slot) + SellItem($lItemPtr) + Sleep(500) + $lSlots += 1 +; If $lSlots > 3 Then Return True + ContinueLoop + EndIf + If Keepers($lItemMID) Then ContinueLoop + If StackableItems($lItemMID) Then ContinueLoop + $lItemRarity = GetRarity($lItemPtr) + If GetIsUnIDed($lItemPtr) Then + If $lItemRarity = 2624 Or $lItemRarity = 2626 Then ; only gold and purple + FindIDKitEx($lIDKit, 1, 4, True) + $lIDKitID = MemoryRead($lIDKit, 'long') + If $lIDKitID = 0 Then ContinueLoop + Update("Identify: " & $bag & ", " & $slot) + IdentifyItem($lItemPtr, $lIDKitID) + Sleep(250) + $lDeadlock = TimerInit() + Do + If TimerDiff($lDeadlock) > 5000 Then ContinueLoop 2 + Sleep(250) + Until Not GetIsUnIDed($lItemPtr) + Else + ContinueLoop + EndIf + EndIf + Switch MemoryRead($lItemPtr + 32, 'byte') + Case 0 + If Upgrades($lItemPtr)[0][1] Then ContinueLoop + Case 2, 5, 12, 15, 19, 22, 24, 26, 27, 32, 35, 36 + If $lItemRarity = 2621 Then ContinueLoop ; try to keep whites for salvaging + If $mRarityGreen And $lItemRarity = 2627 Then ContinueLoop ; dont sell greens + If WeaponMods($lItemPtr)[0][1] Then ContinueLoop + Case 4, 7, 13, 16, 19 ; no selling armor pieces + ContinueLoop + Case 11 ; Materials + ContinueLoop + Case 8 ; Upgrades + ContinueLoop + Case 9 ; Usable + ContinueLoop + Case 10 ; Dyes + ContinueLoop + Case 29 ; Kits + ContinueLoop + Case 34 ; Minipet + ContinueLoop + Case 18 ; Keys + Switch $lItemMID + Case 5962 ; Shiverpeak + ContinueLoop + Case 5963 ; Darkstone + ContinueLoop + Case 5961 ; Miners Key + ContinueLoop + Case 6535 ; Kurzick + ContinueLoop + Case 6536 ; Stoneroot + ContinueLoop + Case 6538 ; Luxon + ContinueLoop + Case 6539 ; Deep Jade + ContinueLoop + Case 6534 ; Forbidden + ContinueLoop + Case 15558 ; Vabbian + ContinueLoop + Case 15556 ; Ancient Elonian + ContinueLoop + Case 15560 ; Margonite + ContinueLoop + Case 19174 ; Demonic + ContinueLoop + Case 5882 ; Phantom + ContinueLoop + Case 5971 ; Obsidian + ContinueLoop + Case 22751 ; Lockpick + ContinueLoop + EndSwitch + EndSwitch + Update("Sell Item: " & $bag & ", " & $slot) + SellItem($lItemPtr) + Sleep(500) + $lSlots += 1 +; If $lSlots > 3 Then Return True + Next + Next + Return $lSlots > 3 +EndFunc + +;~ Description: Moves item from storage and onto stack in inventory. +Func MoveItemFromStorageByModelID($aModelID, $aAmount = 250) + Local $lCount = CountItemInBagsByModelID($aModelID) + If $lCount >= $aAmount Then Return True + Local $lBagPtr, $lItemArrayPtr, $lBackslotPtr, $lItemPtr + Local $lQuantity, $lTemp, $lMoveCount, $lSlotCount, $lTimer, $lDeadlock, $lQuantityNew + Local $lRest = $aAmount - $lCount + Local $lBackpackArray[46][3] + Local $lReservedSlotCount = 0 + ; Fill $lBackpackArray with possible slots in backpack until no more space needed + For $i = 1 To 4 + $lBagPtr = GetBagPtr($i) + If $lBagPtr = 0 Then ContinueLoop + Local $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') + For $j = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 + $lBackslotPtr = MemoryRead($lItemArrayPtr + 4 * $j, 'ptr') + If $lBackslotPtr = 0 Then + $lReservedSlotCount += 1 + $lBackpackArray[$lReservedSlotCount][0] = $i + $lBackpackArray[$lReservedSlotCount][1] = $j + 1 + If $lRest < 250 Then + $lBackpackArray[$lReservedSlotCount][2] = $lRest + Else + $lBackpackArray[$lReservedSlotCount][2] = 250 + EndIf + $lRest -= 250 + ElseIf MemoryRead($lBackslotPtr + 44, 'long') = $aModelID Then + $lQuantity = MemoryRead($lBackslotPtr + 75, 'byte') + If $lQuantity >= 250 Then ContinueLoop ; full stack - ignore + $lReservedSlotCount += 1 + $lTemp = 250 - $lQuantity ; room left on stack + If $lRest > $lTemp Then + $lMoveCount = $lTemp + $lRest -= $lTemp + Else + $lMoveCount = $lRest + $lRest = 0 + EndIf + $lBackpackArray[$lReservedSlotCount][0] = $i + $lBackpackArray[$lReservedSlotCount][1] = $j + 1 + $lBackpackArray[$lReservedSlotCount][2] = $lMoveCount ; 0 -> empty slot, everything > 0 -> stack + EndIf + If $lRest <= 0 Then ExitLoop 2 + Next + Next + $lBackpackArray[0][0] = $lReservedSlotCount + $lSlotCount = 1 + ; Search Storage for stacks and move them to slots defined in $lBackpackArray while updating $lBackpackArray + For $i = 8 To 16 + $lBagPtr = GetBagPtr($i) + If $lBagPtr = 0 Then ContinueLoop + Local $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') + For $j = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 + $lItemPtr = MemoryRead($lItemArrayPtr + 4 * $j, 'ptr') + If $lItemPtr = 0 Then ContinueLoop + If MemoryRead($lItemPtr + 44, 'long') = $aModelID Then + $lQuantity = MemoryRead($lItemPtr + 75, 'byte') + $lTimer = TimerInit() + While $lQuantity > $lBackpackArray[$lSlotCount][2] And $lSlotCount <= $lBackpackArray[0][0] + MoveItemEx($lItemPtr, $lBackpackArray[$lSlotCount][0], $lBackpackArray[$lSlotCount][1], $lBackpackArray[$lSlotCount][2]) + $lDeadlock = TimerInit() + Do + Sleep(250) + $lQuantityNew = MemoryRead($lItemPtr + 75, 'byte') + If $lQuantityNew < $lQuantity Then + $lBackpackArray[$lSlotCount][2] = 0 + $lSlotCount += 1 + ExitLoop + EndIf + Until TimerDiff($lDeadlock) > 5000 + $lQuantity = $lQuantityNew + If TimerDiff($lTimer) > 30000 Then Return -1 ; error moving + WEnd + If $lSlotCount > $lBackpackArray[0][0] Then Return True + If $lQuantity > 0 And $lQuantity <= $lBackpackArray[$lSlotCount][2] Then + MoveItemEx($lItemPtr, $lBackpackArray[$lSlotCount][0], $lBackpackArray[$lSlotCount][1], $lQuantity) + $lDeadlock = TimerInit() + Do + Sleep(250) + If MemoryRead($lItemPtr + 12, 'ptr') <> $lBagPtr Then + $lBackpackArray[$lSlotCount][2] = $lBackpackArray[$lSlotCount][2] - $lQuantity + If $lBackpackArray[$lSlotCount][2] = 0 Then $lSlotCount += 1 + ExitLoop + EndIf + Until TimerDiff($lDeadlock) > 5000 + EndIf + If $lSlotCount > $lBackpackArray[0][0] Then Return True + EndIf + Next + Next +EndFunc ;==>MoveItemFromStorageByModelID + +;~ Description: Stacks items in specified bags to make room. +Func CleanUpStacks($aFirst = 1, $aEnd = 4, $aIncludeMatStorage = True) + Local $lBagPtr, $lItemPtr, $lItemArrayPtr, $lEndThis + Local $lModelID, $lQuantity, $a, $b, $lToMove + ; create bagptr array with slots to reduce memoryreads + Local $lBagPtrArray[$aEnd + 1][2] + Local $lMaxSlots = 1 + For $i = $aFirst To $aEnd + If Not $aIncludeMatStorage And $i = 6 Then ContinueLoop + $lBagPtr = GetBagPtr($i) + If $lBagPtr = 0 Then + $lBagPtrArray[$i][0] = 0 + $lBagPtrArray[$i][1] = 0 + Else + $lBagPtrArray[$i][0] = $lBagPtr + $lBagPtrArray[$i][1] = MemoryRead($lBagPtr + 32, 'long') + $lMaxSlots += $lBagPtrArray[$i][1] + EndIf + Next + ; create array of modelids to stack + Local $lArray[$lMaxSlots][5] + Local $lTempArray[$lMaxSlots][4] + Local $lCount = 0 + Local $lTempCount = 0 + For $i = $aFirst To $aEnd + If Not $aIncludeMatStorage And $i = 6 Then ContinueLoop ; ignore mat storage + $lBagPtr = $lBagPtrArray[$i][0] + If $lBagPtr = 0 Then ContinueLoop + Local $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') + + For $j = 0 To $lBagPtrArray[$i][1] - 1 + + IF CheckIf_mTempStorage($i, $j) Then ContinueLoop + + $lItemPtr = MemoryRead($lItemArrayPtr + 4 * $j, 'ptr') + If $lItemPtr = 0 Then ContinueLoop + $lModelID = MemoryRead($lItemPtr + 44, 'long') + If $lModelID = 146 Then ContinueLoop + $lQuantity = MemoryRead($lItemPtr + 75, 'byte') + If $lQuantity > 1 And $lQuantity < 250 Then ; stack + $lCount += 1 + $lArray[$lCount][0] = $lItemPtr + $lArray[$lCount][1] = $i + $lArray[$lCount][2] = $j + 1 + $lArray[$lCount][3] = $lModelID + $lArray[$lCount][4] = $lQuantity + ElseIf $lQuantity = 1 Then ; not yet a stack? + If StackableItems($lModelID, 1) Then ; but only if stackable + $lCount += 1 + $lArray[$lCount][0] = $lItemPtr + $lArray[$lCount][1] = $i + $lArray[$lCount][2] = $j + 1 + $lArray[$lCount][3] = $lModelID + $lArray[$lCount][4] = $lQuantity + Else ; stragglers + $lTempArray[$lTempCount][0] = $lItemPtr + $lTempArray[$lTempCount][1] = $i + $lTempArray[$lTempCount][2] = $j + 1 + $lTempArray[$lTempCount][3] = $lModelID + $lTempCount += 1 + EndIf + EndIf + + Next + Next + $lArray[0][0] = $lCount + $lBagPtrArray = 0 ; no need for bagptrs anymore + ; add stragglers + For $i = 0 To $lTempCount - 1 + ; check in $lArray + For $j = 1 To $lArray[0][0] + If $lTempArray[$i][3] = $lArray[$j][3] Then + $lCount += 1 + $lArray[$lCount][0] = $lTempArray[$i][0] + $lArray[$lCount][1] = $lTempArray[$i][1] + $lArray[$lCount][2] = $lTempArray[$i][2] + $lArray[$lCount][3] = $lTempArray[$i][3] + $lArray[$lCount][4] = 1 + EndIf + Next + Next + $lTempArray = 0 + $lArray[0][0] = $lCount + ; the actual cleaning up + For $i = 1 To $lArray[0][0] + If $lArray[$i][4] >= 250 Or $lArray[$i][4] <= 0 Then ContinueLoop ; ignore full and empty stacks + For $j = 1 To $lArray[0][0] + If $j = $i Then ContinueLoop ; obvious + If $lArray[$i][3] = $lArray[$j][3] Then ; same modelid + ; switch it up when matstorage, to move TO matstorage and not FROM matstorage + If $lArray[$j][1] = 6 Then + $a = $i ; source + $b = $j ; destination + Else + $a = $j ; source + $b = $i ; destination + EndIf + $lToMove = 250 - $lArray[$b][4] ; destination stack cant get bigger than 250 obviously + If $lToMove > $lArray[$a][4] Then $lToMove = $lArray[$a][4] ; cant move amounts bigger than source stack + MoveItemEx($lArray[$a][0], $lArray[$b][1], $lArray[$b][2], $lToMove) + $lEndThis = False + For $k = 1 To 20 ; approx 5 seconds + Sleep(250) + If MemoryRead($lArray[$a][0] + 75, 'byte') <> $lArray[$a][4] Then + $lArray[$a][4] = $lArray[$a][4] - $lToMove + $lArray[$b][4] = $lArray[$b][4] + $lToMove + ExitLoop + EndIf + If MemoryRead($lArray[$a][0] + 12, 'ptr') = 0 Then ; source stack gone + $lArray[$a][4] = 0 + $lArray[$b][4] = $lArray[$b][4] + $lToMove + ExitLoop + EndIf + Next + EndIf + Next + Next + Return True +EndFunc ;==>CleanUpStacks +#EndRegion MainFunctions + +#Region EvaluateItems +;~ Description: Return true of item is a stackable item. +Func StackableItems($aModelID, $aMats = 0) + Switch $aModelID + ; stackable drops + Case 460,474,476,486,504,522,525,811,819,822,835,1610,2994,19185,22751,24629,24630,24631,24632,27033,27035,27044,27046,27047,27052,35123 + Return True + ; tomes + Case 21786 to 21805 + Return True + ; alcohol + Case 910,2513,5585,6049,6366,6367,6375,15477,19171,22190,24593,28435,30855,31145,31146,35124,36682 + Return True + ; party + Case 6376,6368,6369,21809,21810,21813,29436,29543,36683,4730,15837,21490,22192,30626,30630,30638,30642,30646,30648,31020,31141,31142,31144,31172 + Return True + ; sweets + Case 15528,15479,19170,21492,21812,22269,22644,22752,28431,28432,28436,31150,35125,36681 + Return True + ; scrolls + Case 3256,3746,5594,5595,5611,21233,22279,22280 + Return True + ; DPRemoval + Case 6370,21488,21489,22191,35127,26784,28433 + Return True + ; special drops + Case 18345,21491,21833,28434,35121 + Return True + ; materials + Case 921 to 923, 925 to 946, 948 to 956, 6532, 6533 + Return $aMats + Case Else + Return False + EndSwitch +EndFunc ;==>StackableItems + +;~ Description: Returns true for all ModelIDs specified. +Func Keepers($aModelID) + Switch $aModelID + ; mods + Case 896,908,15554,15551,15552,894,906,897,909,893,905,6323,6331,895,907,15543,15553,15544,15555,15540,15541,15542,17059,19122,19123 + Return True + Case 5551 ; Rune of Superior Vigor + Return True + Case 460 ; White Mantle Emblem + Return $mWhiteMantleEmblem + Case 461 ; White Mantle Badge + Return $mWhiteMantleBadge + Case Else + Return False + EndSwitch +EndFunc ;==>Keepers + +;~ Description: Ignore these items while processing inventory bags. +Func IgnoreItem($aItemPtr) + If $aItemPtr = 0 Then Return True ; not a valid item + If MemoryRead($aItemPtr + 24, 'ptr') <> 0 Then Return True ; customized + If MemoryRead($aItemPtr + 76, 'byte') <> 0 Then Return True ; equipped + If MemoryRead($aItemPtr + 36, 'short') = 0 Then Return True ; value 0 + If MemoryRead($aItemPtr + 12, 'ptr') = 0 Then Return True ; not in a bag + Switch MemoryRead($aItemPtr + 32, 'byte') + Case 11 ; Materials + Return True + Case 8 ; Upgrades + Return True + Case 9 ; Usable + Return True + Case 10 ; Dyes + Return True + Case 29 ; Kits + Return True + Case 34 ; Minipet + Return True + Case 18 ; Keys + Return True + EndSwitch +EndFunc ;==>IgnoreItem + +;~ Description: Contains all modelIDs of items that could be sold if storage space is low. Use with caution. +Func Junk($aModelID) + Switch $aModelID + Case 460 ; White Mantle Emblem + Return True + Case 461 ; White Mantle Badge + Return True + Case 504 ; Decayed Orr Emblem + Return True + EndSwitch +EndFunc + +;~ Description: Returns true if item is a weapon. +Func IsWeapon($aType) + Switch $aType + Case 2,5,12,15,22,24,26,27,32,35,36 + Return $aType + EndSwitch +EndFunc ;==>IsWeapon + +;~ Description: Checks if Itemptr is armor. Returns 0 if not. +Func IsArmor($aType) + Switch $aType + Case 4, 7, 13, 16, 19 + Return $aType + EndSwitch +EndFunc ;==>IsArmor + +;~ Description: Returns 1 for Rune, 2 for Insignia, 0 if not found. +Func IsRuneOrInsignia($aModelID) + Switch $aModelID + Case 903, 5558, 5559 ; Warrior Runes + Return 1 + Case 19152 to 19156 ; Warrior Insignias + Return 2 + Case 5560, 5561, 904 ; Ranger Runes + Return 1 + Case 19157 to 19162 ; Ranger Insignias + Return 2 + Case 5556, 5557, 902 ; Monk Runes + Return 1 + Case 19149 to 19151 ; Monk Insignias + Return 2 + Case 5552, 5553, 900 ; Necromancer Runes + Return 1 + Case 19138 to 19143 ; Necromancer Insignias + Return 2 + Case 3612, 5549, 899 ; Mesmer Runes + Return 1 + Case 19128, 19130, 19129 ; Mesmer Insignias + Return 2 + Case 5554, 5555, 901 ; Elementalist Runes + Return 1 + Case 19144 to 19148 ; Elementalist Insignias + Return 2 + Case 6327 to 6329 ; Ritualist Runes + Return 1 + Case 19165 to 19167 ; Ritualist Insignias + Return 2 + Case 6324 to 6326 ; Assassin Runes + Return 1 + Case 19124 to 19127 ; Assassin Insignia + Return 2 + Case 15545 to 15547 ; Dervish Runes + Return 1 + Case 19163 to 19164 ; Dervish Insignias + Return 2 + Case 15548 to 15550 ; Paragon Runes + Return 1 + Case 19168 ; Paragon Insignias + Return 2 + Case 5550, 5551, 898 ; All Profession Runes + Return 1 + Case 19131 to 19137 ; All Profession Insignias + Return 2 + EndSwitch +EndFunc ;==>IsRuneOrInsignia + +;~ Description: Returns 1 for normal materials and 2 for rare materials. +;~ 0 if ModelID is not listed or mat should be ignored. +Func CheckMaterial($aModelID) + Switch $aModelID + Case 954, 925 ; Chitin, Cloth + Return 1 + Case 929, 933, 934 ; Dust, Feather, Fibers + Return $mDustFeatherFiber + Case 955, 948, 921 ; Granite, Iron, Bones + Return $mGraniteIronBone + Case 940, 946, 953 ; Scale, Tanned Hide, Wood Plank + Return 1 + Case 928, 926, 927 ; Silk, Linen, Damask + Return 2 + Case 931, 932, 923 ; Monstrous Eye, Monstrous Fang, Monstrous Claw + Return 2 + Case 922, 950, 949 ; Charcoal, Deldrimor, Steel Ingot + Return 2 + Case 951, 952, 956 ; Parchment, Vellum, Spiritwood + Return 2 + Case 937, 935, 938 ; Ruby, Diamond, Sapphire + Return 0 + Case 936, 945, 930 ; Onyx, Obsidian Shard, Ectoplasm + Return 0 + Case 941, 942, 943 ; Fur, Leather Square, Elonian Leather Square + Return 2 + Case 944, 939 ; Vial of Ink, Glass Vial + Return 2 + Case 6532, 6533 ; Amber, Jadeite + Return 0 + EndSwitch +EndFunc ;==>CheckMaterial + +;~ Description: Returns true if aItem is a normal material. +Func GetIsNormalMaterial($aItem) + If IsPtr($aItem) <> 0 Then + Local $lItemMID = MemoryRead($aItem + 44, 'long') + ElseIf IsDllStruct($aItem) <> 0 Then + Local $lItemMID = DllStructGetData($aItem, 'ModelID') + Else + Local $lItemMID = $aItem + EndIf + Switch $lItemMID + Case 921, 954, 925, 929, 933, 934, 955, 948, 953, 940, 946 + Return True + Case Else + Return False + EndSwitch +EndFunc ;==>GetIsNormalMaterial +#EndRegion EvaluateItems + +#Region EmptySlots +;~ Description: Returns next empty slot, start at $aBag, $aSlot. Returns 0 if there's no empty slot in this bag. +Func UpdateEmptySlot(ByRef $aBagNr, ByRef $aSlot) + Local $lBagPtr, $lItemArrayPtr, $lSlotPtr, $lBagNr, $lSlot + If $aBagNr = 0 Then + $lBagNr = 1 + Else + $lBagNr = $aBagNr + EndIf + If $aSlot = 0 Then + $lSlot = 1 + Else + $lSlot = $aSlot + EndIf + $aBagNr = 0 + $aSlot = 0 + For $bag = $lBagNr To 4 + $lBagPtr = GetBagPtr($bag) + If $lBagPtr = 0 Then Return 0 ; no bag + $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') + For $slot = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 + $lSlotPtr = MemoryRead($lItemArrayPtr + 4 * ($slot), 'ptr') + If $lSlotPtr = 0 Then + $aBagNr = $bag + $aSlot = $slot + 1 + Return True + EndIf + Next + $lSlot = 1 + Next + Return True +EndFunc ;==>UpdateEmptySlot + +;~ Description: Returns next empty slot, start at $aBag, $aSlot. Returns 0 if there's no empty slot in this bag. +Func UpdateEmptyStorageSlot(ByRef $aBagNr, ByRef $aSlot) + Local $lBagPtr, $lItemArrayPtr, $lSlotPtr, $lBagNr, $lSlot + If $aBagNr < 0 Then + $aSlot = 0 + Return ; no empty storage slots left + EndIf + If $aBagNr = 0 Then + $lBagNr = 8 + Else + $lBagNr = $aBagNr + EndIf + If $aSlot = 0 Then + $lSlot = 1 + Else + $lSlot = $aSlot + EndIf + $aBagNr = 0 + $aSlot = 0 + For $bag = $lBagNr To 16 + $lBagPtr = GetBagPtr($bag) + If $lBagPtr = 0 Then Return 0 ; no bag + $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') + For $slot = 19 To $lSlot - 1 Step -1 + $lSlotPtr = MemoryRead($lItemArrayPtr + 4 * ($slot), 'ptr') + If $lSlotPtr = 0 Then + $aBagNr = $bag + $aSlot = $slot + 1 + Return True + EndIf + Next + $lSlot = 1 + Next + Return True +EndFunc ;==>UpdateEmptyStorageSlot +#EndRegion + +#Region GoToMerchant +;~ Description: Go to merchant and co, if playernumber wasnt found go to xunlai chest and try again. +Func GoToMerchant($aPlayernumber, $aMyID = GetMyID(), $aMe = GetAgentPtr($aMyID)) + ; first try + Update("Trying to find Merchant.") + Local $lAgentArray = GetAgentPtrArray() + For $i = 1 To $lAgentArray[0] + If MemoryRead($lAgentArray[$i] + 244, 'word') = $aPlayernumber Then + GoToNPC($lAgentArray[$i], $aMyID, $aMe) + Sleep(500) + Return Dialog(0x7F) + EndIf + Next + ; merchant wasnt found, next try, but first... go to chest + Update("No Merchant found, try for chest.") + For $i = 1 To $lAgentArray[0] + If MemoryRead($lAgentArray[$i] + 244, 'word') = 4991 Then + GoToNPC($lAgentArray[$i], $aMyID, $aMe) + ExitLoop + EndIf + Next + ; aaaaand... try again to find merchant + Update("Trying to find Merchant, again.") + $lAgentArray = GetAgentPtrArray() + For $i = 1 To $lAgentArray[0] + If MemoryRead($lAgentArray[$i] + 244, 'word') = $aPlayernumber Then + GoToNPC($lAgentArray[$i], $aMyID, $aMe) + Sleep(500) + Return Dialog(0x7F) + EndIf + Next +EndFunc ;==>GoToMerchant + +;~ Description: Return merchant depending on MapID. +Func GetMerchant($aMapID = GetMapID()) + Switch $aMapID + Case 4, 5, 6, 52, 176, 177, 178, 179 ; proph gh + Return 209 + Case 275, 276, 359, 360, 529, 530, 537, 538 ; factions and nf gh + Return 196 + Case 10, 11, 12, 139, 141, 142, 49, 857 + Return 2036 + Case 109, 120, 154 + Return 1993 + Case 116, 117, 118, 152, 153, 38 + Return 1994 + Case 122, 35 + Return 2136 + Case 123, 124 + Return 2137 + Case 129, 348, 390 + Return 3402 + Case 130, 218, 230, 287, 349, 388 + Return 3403 + Case 131, 21, 25, 36 + Return 2086 + Case 132, 135, 28, 29, 30, 32, 39, 40 + Return 2101 + Case 133, 155, 156, 157, 158, 159, 206, 22, 23, 24 + Return 2107 + Case 134, 81 + Return 2011 + Case 136, 137, 14, 15, 16, 19, 57, 73 + Return 1989 + Case 138 + Return 1975 + Case 193, 234, 278, 288, 391 + Return 3618 + Case 194, 213, 214, 225, 226, 242, 250, 283, 284, 291, 292 + Return 3275 + Case 216, 217, 249, 251 + Return 3271 + Case 219, 224, 273, 277, 279, 289, 297, 350, 389 + Return 3617 + Case 220, 274, 51 + Return 3273 + Case 222, 272, 286, 77 + Return 3401 + Case 248 + Return 1207 + Case 303 + Return 3272 + Case 376, 378, 425, 426, 477, 478 + Return 5385 + Case 381, 387, 421, 424, 427, 554 + Return 5386 + Case 393, 396, 403, 414, 476 + Return 5666 + Case 398, 407, 428, 433, 434, 435 + Return 5665 + Case 431 + Return 4721 + Case 438, 545 + Return 5621 + Case 440, 442, 469, 473, 480, 494, 496 + Return 5613 + Case 450, 559 + Return 4989 + Case 474, 495 + Return 5614 + Case 479, 487, 489, 491, 492, 502, 818 + Return 4720 + Case 555 + Return 4988 + Case 624 + Return 6758 + Case 638 + Return 6060 + Case 639, 640 + Return 6757 + Case 641 + Return 6063 + Case 642 + Return 6047 + Case 643, 645, 650 + Return 6383 + Case 644 + Return 6384 + Case 648 + Return 6589 + Case 652 + Return 6231 + Case 675 + Return 6190 + Case 808 + Return 7448 + Case 814 + Return 104 + EndSwitch +EndFunc ;==>GetMerchant + +;~ Description: Return material trader depending on MapID. +Func GetMaterialTrader($aMapID) + Switch $aMapID + Case 4, 5, 6, 52, 176, 177, 178, 179 ; proph gh + Return 204 + Case 275, 276, 359, 360, 529, 530, 537, 538 ; factions and nf gh + Return 191 + Case 109, 49, 81 + Return 2017 + Case 193 + Return 3624 + Case 194, 242, 857 + Return 3285 + Case 250 + Return 3286 + Case 376 + Return 5391 + Case 398 + Return 5671 + Case 414 + Return 5674 + Case 424 + Return 5392 + Case 433 + Return 5672 + Case 438 + Return 5624 + Case 491 + Return 4726 + Case 492 + Return 4727 + Case 638 + Return 6763 + Case 640 + Return 6764 + Case 641 + Return 6065 + Case 642 + Return 6050 + Case 643 + Return 6389 + Case 644 + Return 6390 + Case 652 + Return 6233 + Case 77 + Return 3415 + Case 808 + Return 7452 + Case 818 + Return 4729 + EndSwitch +EndFunc ;==>GetMaterialTrader + +;~ Description: Return rare material trader depending on MapID. +Func GetRareMaterialTrader($aMapID) + Switch $aMapID + Case 4, 5, 6, 52, 176, 177, 178, 179 ; proph gh + Return 205 + Case 275, 276, 359, 360, 529, 530, 537, 538 ; factions and nf gh + Return 192 + Case 109 + Return 2003 + Case 193 + Return 3627 + Case 194, 250, 857 + Return 3288 + Case 242 + Return 3287 + Case 376 + Return 5394 + Case 398, 433 + Return 5673 + Case 414 + Return 5674 + Case 424 + Return 5393 + Case 438 + Return 5619 + Case 49 + Return 2044 + Case 491, 818 + Return 4729 + Case 492 + Return 4728 + Case 638 + Return 6766 + Case 640 + Return 6765 + Case 641 + Return 6066 + Case 642 + Return 6051 + Case 643 + Return 6392 + Case 644 + Return 6391 + Case 652 + Return 6234 + Case 77 + Return 3416 + Case 81 + Return 2089 + EndSwitch +EndFunc ;==>GetRareMaterialTrader + +;~ Description: Return rune trader depending on MapID. +Func GetRuneTrader($aMapID) + Switch $aMapID + Case 4, 5, 6, 52, 176, 177, 178, 179 ; proph gh + Return 203 + Case 275, 276, 359, 360, 529, 530, 537, 538 ; factions and nf gh + Return 190 + Case 109, 814 + Return 2005 + Case 193 + Return 3630 + Case 194, 242, 250 + Return 3291 + Case 248, 857 + Return 1981 + Case 396 + Return 5678 + Case 414 + Return 5677 + Case 438 + Return 5626 + Case 477 + Return 5396 + Case 487 + Return 4732 + Case 49 + Return 2045 + Case 502 + Return 4733 + Case 624 + Return 6770 + Case 640 + Return 6769 + Case 642 + Return 6052 + Case 643, 645 + Return 6395 + Case 644 + Return 6396 + Case 77 + Return 3421 + Case 808 + Return 7456 + Case 81 + Return 2091 + Case 818 + Return 4711 + EndSwitch +EndFunc ;==>GetRuneTrader + +;~ Description: Return dye trader depending on MapID. +Func GetDyeTrader($aMapID) + Switch $aMapID + Case 4, 5, 6, 52, 176, 177, 178, 179 ; proph gh + Return 206 + Case 275, 276, 359, 360, 529, 530, 537, 538 ; factions and nf gh + Return 193 + Case 109, 49, 81, 857 + Return 2016 + Case 193 + Return 3623 + Case 194, 242 + Return 3284 + Case 250 + Return 3283 + Case 286 + Return 3408 + Case 381, 477 + Return 5389 + Case 403 + Return 5669 + Case 414 + Return 5670 + Case 640 + Return 6762 + Case 642 + Return 6049 + Case 644 + Return 6388 + Case 77 + Return 3407 + Case 812 + Return 2113 + Case 818 + Return 4725 + EndSwitch +EndFunc ;==>GetDyeTrader + +;~ Description: Return scroll trader depending on MapID. +Func GetScrollTrader($aMapID) + Switch $aMapID + Case 4, 5, 6, 52, 176, 177, 178, 179 ; proph gh + Return 207 + Case 275, 276, 359, 360, 529, 530, 537, 538 ; factions and nf gh + Return 194 + Case 109 + Return 2004 + Case 193 + Return 3629 + Case 194 + Return 3289 + Case 287 + Return 3419 + Case 396, 414 + Return 5675 + Case 426, 857 + Return 5398 + Case 442, 480 + Return 5627 + Case 49 + Return 2046 + Case 624 + Return 6767 + Case 638 + Return 6062 + Case 639, 640 + Return 6768 + Case 643, 644 + Return 6393 + Case 645 + Return 6394 + Case 77 + Return 3418 + Case 808 + Return 7454 + EndSwitch +EndFunc ;==>GetScrollTrader +#EndRegion GoToMerchant + + diff --git a/gwApi/utilities/memreads.au3 b/gwApi/utilities/memreads.au3 index a82f9f8..17f7d95 100644 --- a/gwApi/utilities/memreads.au3 +++ b/gwApi/utilities/memreads.au3 @@ -1,199 +1,200 @@ -#include-once - -#Region Arrays -#Region Agent -Global $mAgentvtable[2] = ['ptr', 0] -Global $mAgentTimer[2] = ['long', 20] -Global $mAgentNearestAgentPtr[2] = ['ptr', 28] -Global $mAgentNextAgent[2] = ['ptr', 32] -Global $mAgentId[2] = ['long', 44] -Global $mAgentZ[2] = ['float', 48] -Global $mAgentBoxHoverWidth[2] = ['float', 60] -Global $mAgentBoxHoverHeight[2] = ['float', 64] -Global $mAgentRotation[2] = ['float', 76] -Global $mAgentNameProperties[2] = ['long', 88] -Global $mAgentX[2] = ['float', 116] -Global $mAgentY[2] = ['float', 120] -Global $mAgentGround[2] = ['long', 124] -Global $mAgentNameTagX[2] = ['float', 132] -Global $mAgentNameTagY[2] = ['float', 136] -Global $mAgentNameTagZ[2] = ['float', 140] -Global $mAgentType[2] = ['long', 156] -Global $mAgentMoveX[2] = ['float', 160] -Global $mAgentMoveY[2] = ['float', 164] -Global $mAgentOwner[2] = ['long', 196] -Global $mAgentExtraType[2] = ['long', 208] -Global $mAgentAnimation[2] = ['byte', 220] -Global $mAgentAttackSpeed[2] = ['float', 236] -Global $mAgentAttackSpeedModifier[2] = ['float', 240] -Global $mAgentPlayerNumber[2] = ['word', 244] -Global $mAgentPlayerOrNPC[2] = ['char', 247] -Global $mAgentEquip[2] = ['ptr', 252] -Global $mAgentPrimary[2] = ['byte', 266] -Global $mAgentSecondary[2] = ['byte', 267] -Global $mAgentLevel[2] = ['byte', 268] -Global $mAgentTeam[2] = ['byte', 269] -Global $mAgentEnergyPips[2] = ['float', 276] -Global $mAgentEnergyPercent[2] = ['float', 284] -Global $mAgentMaxEnergy[2] = ['long', 288] -Global $mAgentHPPips[2] = ['float', 296] -Global $mAgentHP[2] = ['float', 304] -Global $mAgentMaxHP[2] = ['long', 308] -Global $mAgentEffects[2] = ['long', 312] -Global $mAgentHex[2] = ['byte', 320] -Global $mAgentModelState[2] = ['long', 340] -Global $mAgentTypeMap[2] = ['long', 344] -Global $mAgentInSpiritRange[2] = ['long', 364] -Global $mAgentLoginNumber[2] = ['long', 384] -Global $mAgentModelMode[2] = ['float', 388] -Global $mAgentModelAnimation[2] = ['long', 396] -Global $mAgentLastStrike[2] = ['byte', 432] -Global $mAgentAllegiance[2] = ['byte', 433] -Global $mAgentWeaponType[2] = ['word', 434] -Global $mAgentSkill[2] = ['word', 436] -Global $mAgentWeaponItemId[2] = ['word', 442] -Global $mAgentOffhandItemId[2] = ['word', 444] -#EndRegion - -#Region Bag -Global $mBagType[2] = ['long', 0] -Global $mBagIndex[2] = ['long', 4] -Global $mBagId[2] = ['long', 8] -Global $mBagContainerItem[2] = ['ptr', 12] -Global $mBagItemsCount[2] = ['long', 16] -Global $mBagArray[2] = ['ptr', 20] -Global $mBagItemArray[2] = ['ptr', 24] -Global $mBagFakeSlots[2] = ['long', 28] -Global $mBagSlots[2] = ['long', 32] -#EndRegion - -#Region Buff -Global $mBuffSkillId[2] = ['long', 0] -Global $mBuffId[2] = ['long', 8] -Global $mBuffTargetId[2] = ['long', 12] -#EndRegion - -#Region Item -Global $mItemId[2] = ['long', 0] -Global $mItemAgentId[2] = ['long', 4] -Global $mItemBag[2] = ['ptr', 12] -Global $mItemModstruct[2] = ['ptr', 16] -Global $mItemModstructsize[2] = ['long', 20] -Global $mItemCustomized[2] = ['ptr', 24] -Global $mItemType[2] = ['byte', 32] -Global $mItemExtraId[2] = ['short', 34] -Global $mItemValue[2] = ['short', 36] -Global $mItemInteraction[2] = ['short', 40] -Global $mItemModelId[2] = ['long', 44] -Global $mItemModString[2] = ['ptr', 48] -Global $mItemNameString[2] = ['ptr', 56] -Global $mItemQuantity[2] = ['byte', 75] -Global $mItemEquipped[2] = ['byte', 76] -Global $mItemSlot[2] = ['byte', 78] -#EndRegion - -#Region Quest -Global $mQuestId[2] = ['long', 0] -Global $mQuestLogState[2] = ['long', 4] -Global $mQuestMapFrom[2] = ['long', 20] -Global $mQuestX[2] = ['float', 24] -Global $mQuestY[2] = ['float', 28] -Global $mQuestMapTo[2] = ['long', 40] -#EndRegion - -#Region Skillbar -Global $mSbarAgentId[2] = ['long', 0] -Global $mSbarAdrenalineA1[2] = ['long', 4] -Global $mSbarAdrenalineB1[2] = ['long', 8] -Global $mSbarRecharge1[2] = ['dword', 12] -Global $mSbarId1[2] = ['dword', 16] -Global $mSbarEvent1[2] = ['dword', 20] -Global $mSbarAdrenalineA2[2] = ['long', 24] -Global $mSbarAdrenalineB2[2] = ['long', 28] -Global $mSbarRecharge2[2] = ['dword', 32] -Global $mSbarId2[2] = ['dword', 36] -Global $mSbarEvent2[2] = ['dword', 40] -Global $mSbarAdrenalineA3[2] = ['long', 44] -Global $mSbarAdrenalineB3[2] = ['long', 48] -Global $mSbarRecharge3[2] = ['dword', 52] -Global $mSbarId3[2] = ['dword', 56] -Global $mSbarEvent3[2] = ['dword', 60] -Global $mSbarAdrenalineA4[2] = ['long', 64] -Global $mSbarAdrenalineB4[2] = ['long', 68] -Global $mSbarRecharge4[2] = ['dword', 72] -Global $mSbarId4[2] = ['dword', 76] -Global $mSbarEvent4[2] = ['dword', 80] -Global $mSbarAdrenalineA5[2] = ['long', 84] -Global $mSbarAdrenalineB5[2] = ['long', 88] -Global $mSbarRecharge5[2] = ['dword', 92] -Global $mSbarId5[2] = ['dword', 96] -Global $mSbarEvent5[2] = ['dword', 100] -Global $mSbarAdrenalineA6[2] = ['long', 104] -Global $mSbarAdrenalineB6[2] = ['long', 108] -Global $mSbarRecharge6[2] = ['dword', 112] -Global $mSbarId6[2] = ['dword', 116] -Global $mSbarEvent6[2] = ['dword', 120] -Global $mSbarAdrenalineA7[2] = ['long', 124] -Global $mSbarAdrenalineB7[2] = ['long', 128] -Global $mSbarRecharge7[2] = ['dword', 132] -Global $mSbarId7[2] = ['dword', 136] -Global $mSbarEvent7[2] = ['dword', 140] -Global $mSbarAdrenalineA8[2] = ['long', 144] -Global $mSbarAdrenalineB8[2] = ['long', 148] -Global $mSbarRecharge8[2] = ['dword', 152] -Global $mSbarId8[2] = ['dword', 156] -Global $mSbarEvent8[2] = ['dword', 160] -Global $mSbarDisabled[2] = ['dword', 164] -Global $mSbarCasting[2] = ['dword', 176] -#EndRegion - -#Region SkillEffect -Global $mEffectSkillId[2] = ['long', 0] -Global $mEffectType[2] = ['long', 4] -Global $mEffectId[2] = ['long', 8] -Global $mEffectAgentId[2] = ['long', 12] -Global $mEffectDuration[2] = ['float', 16] -Global $mEffectTimeStamp[2] = ['long', 20] -#EndRegion - -#Region Skill -Global $mSkillID[2] = ['long', 0] -Global $mSkillCampaign[2] = ['long', 8] -Global $mSkillType[2] = ['long', 12] -Global $mSkillSpecial[2] = ['long', 16] -Global $mSkillComboReq[2] = ['long', 20] -Global $mSkillEffect1[2] = ['long', 24] -Global $mSkillCondition[2] = ['long', 28] -Global $mSkillEffect2[2] = ['long', 32] -Global $mSkillWeaponReq[2] = ['long', 36] -Global $mSkillProfession[2] = ['byte', 40] -Global $mSkillAttribute[2] = ['byte', 41] -Global $mSkillPvPID[2] = ['long', 44] -Global $mSkillCombo[2] = ['byte', 48] -Global $mSkillTarget[2] = ['byte', 49] -Global $mSkillEquipType[2] = ['byte', 51] -Global $mSkillEnergyCost[2] = ['byte', 53] -Global $mSkillHealthCost[2] = ['byte', 54] -Global $mSkillAdrenaline[2] = ['dword', 56] -Global $mSkillActivation[2] = ['float', 60] -Global $mSkillAftercast[2] = ['float', 64] -Global $mSkillDuration0[2] = ['long', 68] -Global $mSkillDuration15[2] = ['long', 72] -Global $mSkillRecharge[2] = ['long', 76] -Global $mSkillScale0[2] = ['long', 92] -Global $mSkillScale15[2] = ['long', 96] -Global $mSkillBonusScale0[2] = ['long', 100] -Global $mSkillBonusScale15[2] = ['long', 104] -Global $mSkillAoERange[2] = ['float', 108] -Global $mSkillConstEffect[2] = ['float', 112] -#EndRegion -#EndRegion - -#Region GetValue -;~ Description: Easier format of memreads. -;~ Example: Skill ID -> -;~ $lSkillID = GetMemoryValue($lSkillPtr, $mSkillID) -Func GetMemoryValue($aPtr, $aGlobalArray) - Return MemoryRead($aPtr + $aGlobalArray[1], $aGlobalArray[0]) -EndFunc ;==>GetMemoryValue -#EndRegion \ No newline at end of file +199 +#include-once + +#Region Arrays +#Region Agent +Global $mAgentvtable[2] = ['ptr', 0] +Global $mAgentTimer[2] = ['long', 20] +Global $mAgentNearestAgentPtr[2] = ['ptr', 28] +Global $mAgentNextAgent[2] = ['ptr', 32] +Global $mAgentId[2] = ['long', 44] +Global $mAgentZ[2] = ['float', 48] +Global $mAgentBoxHoverWidth[2] = ['float', 60] +Global $mAgentBoxHoverHeight[2] = ['float', 64] +Global $mAgentRotation[2] = ['float', 76] +Global $mAgentNameProperties[2] = ['long', 88] +Global $mAgentX[2] = ['float', 116] +Global $mAgentY[2] = ['float', 120] +Global $mAgentGround[2] = ['long', 124] +Global $mAgentNameTagX[2] = ['float', 132] +Global $mAgentNameTagY[2] = ['float', 136] +Global $mAgentNameTagZ[2] = ['float', 140] +Global $mAgentType[2] = ['long', 156] +Global $mAgentMoveX[2] = ['float', 160] +Global $mAgentMoveY[2] = ['float', 164] +Global $mAgentOwner[2] = ['long', 196] +Global $mAgentExtraType[2] = ['long', 208] +Global $mAgentAnimation[2] = ['byte', 220] +Global $mAgentAttackSpeed[2] = ['float', 236] +Global $mAgentAttackSpeedModifier[2] = ['float', 240] +Global $mAgentPlayerNumber[2] = ['word', 244] +Global $mAgentPlayerOrNPC[2] = ['char', 247] +Global $mAgentEquip[2] = ['ptr', 252] +Global $mAgentPrimary[2] = ['byte', 266] +Global $mAgentSecondary[2] = ['byte', 267] +Global $mAgentLevel[2] = ['byte', 268] +Global $mAgentTeam[2] = ['byte', 269] +Global $mAgentEnergyPips[2] = ['float', 276] +Global $mAgentEnergyPercent[2] = ['float', 284] +Global $mAgentMaxEnergy[2] = ['long', 288] +Global $mAgentHPPips[2] = ['float', 296] +Global $mAgentHP[2] = ['float', 304] +Global $mAgentMaxHP[2] = ['long', 308] +Global $mAgentEffects[2] = ['long', 312] +Global $mAgentHex[2] = ['byte', 320] +Global $mAgentModelState[2] = ['long', 340] +Global $mAgentTypeMap[2] = ['long', 344] +Global $mAgentInSpiritRange[2] = ['long', 364] +Global $mAgentLoginNumber[2] = ['long', 384] +Global $mAgentModelMode[2] = ['float', 388] +Global $mAgentModelAnimation[2] = ['long', 396] +Global $mAgentLastStrike[2] = ['byte', 432] +Global $mAgentAllegiance[2] = ['byte', 433] +Global $mAgentWeaponType[2] = ['word', 434] +Global $mAgentSkill[2] = ['word', 436] +Global $mAgentWeaponItemId[2] = ['word', 442] +Global $mAgentOffhandItemId[2] = ['word', 444] +#EndRegion + +#Region Bag +Global $mBagType[2] = ['long', 0] +Global $mBagIndex[2] = ['long', 4] +Global $mBagId[2] = ['long', 8] +Global $mBagContainerItem[2] = ['ptr', 12] +Global $mBagItemsCount[2] = ['long', 16] +Global $mBagArray[2] = ['ptr', 20] +Global $mBagItemArray[2] = ['ptr', 24] +Global $mBagFakeSlots[2] = ['long', 28] +Global $mBagSlots[2] = ['long', 32] +#EndRegion + +#Region Buff +Global $mBuffSkillId[2] = ['long', 0] +Global $mBuffId[2] = ['long', 8] +Global $mBuffTargetId[2] = ['long', 12] +#EndRegion + +#Region Item +Global $mItemId[2] = ['long', 0] +Global $mItemAgentId[2] = ['long', 4] +Global $mItemBag[2] = ['ptr', 12] +Global $mItemModstruct[2] = ['ptr', 16] +Global $mItemModstructsize[2] = ['long', 20] +Global $mItemCustomized[2] = ['ptr', 24] +Global $mItemType[2] = ['byte', 32] +Global $mItemExtraId[2] = ['short', 34] +Global $mItemValue[2] = ['short', 36] +Global $mItemInteraction[2] = ['short', 40] +Global $mItemModelId[2] = ['long', 44] +Global $mItemModString[2] = ['ptr', 48] +Global $mItemNameString[2] = ['ptr', 56] +Global $mItemQuantity[2] = ['byte', 75] +Global $mItemEquipped[2] = ['byte', 76] +Global $mItemSlot[2] = ['byte', 78] +#EndRegion + +#Region Quest +Global $mQuestId[2] = ['long', 0] +Global $mQuestLogState[2] = ['long', 4] +Global $mQuestMapFrom[2] = ['long', 20] +Global $mQuestX[2] = ['float', 24] +Global $mQuestY[2] = ['float', 28] +Global $mQuestMapTo[2] = ['long', 40] +#EndRegion + +#Region Skillbar +Global $mSbarAgentId[2] = ['long', 0] +Global $mSbarAdrenalineA1[2] = ['long', 4] +Global $mSbarAdrenalineB1[2] = ['long', 8] +Global $mSbarRecharge1[2] = ['dword', 12] +Global $mSbarId1[2] = ['dword', 16] +Global $mSbarEvent1[2] = ['dword', 20] +Global $mSbarAdrenalineA2[2] = ['long', 24] +Global $mSbarAdrenalineB2[2] = ['long', 28] +Global $mSbarRecharge2[2] = ['dword', 32] +Global $mSbarId2[2] = ['dword', 36] +Global $mSbarEvent2[2] = ['dword', 40] +Global $mSbarAdrenalineA3[2] = ['long', 44] +Global $mSbarAdrenalineB3[2] = ['long', 48] +Global $mSbarRecharge3[2] = ['dword', 52] +Global $mSbarId3[2] = ['dword', 56] +Global $mSbarEvent3[2] = ['dword', 60] +Global $mSbarAdrenalineA4[2] = ['long', 64] +Global $mSbarAdrenalineB4[2] = ['long', 68] +Global $mSbarRecharge4[2] = ['dword', 72] +Global $mSbarId4[2] = ['dword', 76] +Global $mSbarEvent4[2] = ['dword', 80] +Global $mSbarAdrenalineA5[2] = ['long', 84] +Global $mSbarAdrenalineB5[2] = ['long', 88] +Global $mSbarRecharge5[2] = ['dword', 92] +Global $mSbarId5[2] = ['dword', 96] +Global $mSbarEvent5[2] = ['dword', 100] +Global $mSbarAdrenalineA6[2] = ['long', 104] +Global $mSbarAdrenalineB6[2] = ['long', 108] +Global $mSbarRecharge6[2] = ['dword', 112] +Global $mSbarId6[2] = ['dword', 116] +Global $mSbarEvent6[2] = ['dword', 120] +Global $mSbarAdrenalineA7[2] = ['long', 124] +Global $mSbarAdrenalineB7[2] = ['long', 128] +Global $mSbarRecharge7[2] = ['dword', 132] +Global $mSbarId7[2] = ['dword', 136] +Global $mSbarEvent7[2] = ['dword', 140] +Global $mSbarAdrenalineA8[2] = ['long', 144] +Global $mSbarAdrenalineB8[2] = ['long', 148] +Global $mSbarRecharge8[2] = ['dword', 152] +Global $mSbarId8[2] = ['dword', 156] +Global $mSbarEvent8[2] = ['dword', 160] +Global $mSbarDisabled[2] = ['dword', 164] +Global $mSbarCasting[2] = ['dword', 176] +#EndRegion + +#Region SkillEffect +Global $mEffectSkillId[2] = ['long', 0] +Global $mEffectType[2] = ['long', 4] +Global $mEffectId[2] = ['long', 8] +Global $mEffectAgentId[2] = ['long', 12] +Global $mEffectDuration[2] = ['float', 16] +Global $mEffectTimeStamp[2] = ['long', 20] +#EndRegion + +#Region Skill +Global $mSkillID[2] = ['long', 0] +Global $mSkillCampaign[2] = ['long', 8] +Global $mSkillType[2] = ['long', 12] +Global $mSkillSpecial[2] = ['long', 16] +Global $mSkillComboReq[2] = ['long', 20] +Global $mSkillEffect1[2] = ['long', 24] +Global $mSkillCondition[2] = ['long', 28] +Global $mSkillEffect2[2] = ['long', 32] +Global $mSkillWeaponReq[2] = ['long', 36] +Global $mSkillProfession[2] = ['byte', 40] +Global $mSkillAttribute[2] = ['byte', 41] +Global $mSkillPvPID[2] = ['long', 44] +Global $mSkillCombo[2] = ['byte', 48] +Global $mSkillTarget[2] = ['byte', 49] +Global $mSkillEquipType[2] = ['byte', 51] +Global $mSkillEnergyCost[2] = ['byte', 53] +Global $mSkillHealthCost[2] = ['byte', 54] +Global $mSkillAdrenaline[2] = ['dword', 56] +Global $mSkillActivation[2] = ['float', 60] +Global $mSkillAftercast[2] = ['float', 64] +Global $mSkillDuration0[2] = ['long', 68] +Global $mSkillDuration15[2] = ['long', 72] +Global $mSkillRecharge[2] = ['long', 76] +Global $mSkillScale0[2] = ['long', 92] +Global $mSkillScale15[2] = ['long', 96] +Global $mSkillBonusScale0[2] = ['long', 100] +Global $mSkillBonusScale15[2] = ['long', 104] +Global $mSkillAoERange[2] = ['float', 108] +Global $mSkillConstEffect[2] = ['float', 112] +#EndRegion +#EndRegion + +#Region GetValue +;~ Description: Easier format of memreads. +;~ Example: Skill ID -> +;~ $lSkillID = GetMemoryValue($lSkillPtr, $mSkillID) +Func GetMemoryValue($aPtr, $aGlobalArray) + Return MemoryRead($aPtr + $aGlobalArray[1], $aGlobalArray[0]) +EndFunc ;==>GetMemoryValue +#EndRegion diff --git a/gwApi/utilities/tempstorage.au3 b/gwApi/utilities/tempstorage.au3 index 1798df6..ebb0436 100644 --- a/gwApi/utilities/tempstorage.au3 +++ b/gwApi/utilities/tempstorage.au3 @@ -1,246 +1,276 @@ -#include-once - -#Region Variables -Global $mBags = 4 -Global $mTempStorage[1][2] = [[0, 0]] -Global $mFoundMerch = False -Global $mFoundChest = False -#EndRegion Variables - -;~ Decsription: Tries to clear up one slot. -Func TempStorage() - Local $lBagPtr, $lItemArrayPtr, $lItemPtr - Local $lType, $lMapState, $lSlot - - $lMapState = GetMapLoading() - For $i = 1 To 4;(($lMapState = 0) ? (16) : ($mBags)) - $lBagPtr = GetBagPtr($i) - If $lBagPtr = 0 Then ContinueLoop - Local $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') - For $j = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 - $lItemPtr = MemoryRead($lItemArrayPtr + 4 * $j, 'ptr') - If $lItemPtr = 0 Then Return True ; empty slot - $lType = MemoryRead($lItemPtr + 32, 'byte') - If $lType = 29 Then ContinueLoop ; kits - - If $lMapState = 0 Then ; outpost - If Not $mFoundChest Then Return False - $lSlot = OpenStorageSlot() - If IsArray($lSlot) Then - $mTempStorage[0][0] += 1 - ReDim $mTempStorage[$mTempStorage[0][0] + 1][2] - $mTempStorage[$mTempStorage[0][0]][0] = $lSlot[0] - $mTempStorage[$mTempStorage[0][0]][1] = $lSlot[1] - MoveItem($lItemPtr, $lSlot[0], $lSlot[1]) - Sleep(GetPing() + Random(1000, 1500, 1)) - Return True - EndIf - ElseIf $lMapState = 1 Then ; explorable - If SalvageUses() < 2 Then Return False - If MemoryRead($lItemPtr + 75, 'byte') > 1 Then ContinueLoop - If GetRarity($lItemPtr) <> 2621 Then ContinueLoop ; no white item - Switch $lType - Case 2, 5, 12, 15, 22, 24, 26, 27, 32, 35, 36, 0 - DropItem($lItemPtr) - Sleep(GetPing() + Random(1000, 1500, 1)) - Return True - Case Else - ContinueLoop - EndSwitch - EndIf - Next - Next - Return False -EndFunc ;==>TempStorage - -;~ Description: Moves temporarily relocated item back. --updated -Func RestoreStorage() - Local $lItemPtr, $lSlot - For $i = $mTempStorage[0][0] - 1 To 0 Step -1 - $lItemPtr = GetItemPtrBySlot($mTempStorage[$i][0], $mTempStorage[$i][1]) - $lSlot = OpenBackpackSlot() - If $lSlot = 0 Then Return False - ReDim $mTempStorage[$mTempStorage[0][0]][2] - $mTempStorage[0][0] -= 1 - MoveItem($lItemPtr, $lSlot[0], $lSlot[1]) - Sleep(GetPing() + Random(1000, 1500, 1)) - Next - If $lSlot = 0 Then Return False - Return True -EndFunc ;==>RestoreStorage - -;~ Description: Returns empty backpack slot as array. -Func OpenBackpackSlot() - Local $lBagPtr, $lItemArrayPtr - For $i = 1 To $mBags - $lBagPtr = GetBagPtr($i) - If $lBagPtr = 0 Then ContinueLoop - Local $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') - For $j = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 - If MemoryRead($lItemArrayPtr + 4 * $j, 'ptr') = 0 Then - Local $lReturnArray[2] = [$i, $j] - Return $lReturnArray - EndIf - Next - Next - Return 0 -EndFunc ;==>OpenBackpackSlot - -;~ Description: Returns empty storage slot as array. -Func OpenStorageSlot() - Local $lBagPtr, $lItemArrayPtr - For $i = 8 To 16 - $lBagPtr = GetBagPtr($i) - If $lBagPtr = 0 Then ContinueLoop - Local $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') - For $j = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 - If MemoryRead($lItemArrayPtr + 4 * $j, 'ptr') = 0 Then - Local $lReturnArray[2] = [$i, $j] - Return $lReturnArray - EndIf - Next - Next -EndFunc ;==>OpenStorageSlot - -;~ Description: Returns bag and slot as array of ModelID, if stack not full (inventory). -;~ @extended contains quantity. -Func FindBackpackStack($aModelID) - Local $lBagPtr, $lItemArrayPtr, $lItemPtr, $lQuantity - For $i = 1 To 4 - $lBagPtr = GetBagPtr($i) - If $lBagPtr = 0 Then ContinueLoop - Local $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') - For $j = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 - $lItemPtr = MemoryRead($lItemArrayPtr + 4 * $j, 'ptr') - If $lItemPtr = 0 Then ContinueLoop - If MemoryRead($lItemPtr + 44, 'long') = $aModelID Then - $lQuantity = MemoryRead($lItemPtr + 75, 'byte') - If $lQuantity < 250 Then - Local $lReturnArray[2] = [$i, $j] - Return SetExtended($lQuantity, $lReturnArray) - EndIf - EndIf - Next - Next -EndFunc ;==>FindBackpackStack - -;~ Description: Returns bag and slot as array of ModelID, ExtraID, if stack is not full (storage). -;~ @extended contains quantity. -Func FindStorageStack($aModelID, $aExtraID = 0) - Local $lBagPtr, $lItemArrayPtr, $lItemPtr, $lQuantity - For $i = 8 To 16 - $lBagPtr = GetBagPtr($i) - If $lBagPtr = 0 Then ContinueLoop - Local $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') - For $j = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 - $lItemPtr = MemoryRead($lItemArrayPtr + 4 * $j, 'ptr') - If $lItemPtr = 0 Then ContinueLoop - If MemoryRead($lItemPtr + 44, 'long') = $aModelID Then - $lQuantity = MemoryRead($lItemPtr + 75, 'byte') - If $lQuantity < 250 Then - Local $lReturnArray[2] = [$i, $j] - Return SetExtended($lQuantity, $lReturnArray) - EndIf - EndIf - Next - Next -EndFunc ;==>FindStorageStack - -;~ Description: Checks if modelID is low in inventory and moves then items from storage. -Func GetItemFromStorageIfLow($aModelID, $MinimumAmount = 250) - If CountItemInBagsByModelID($aModelID) < $MinimumAmount Then - MoveItemFromStorageByModelID_($aModelID, $MinimumAmount) - EndIf -EndFunc ;==>GetItemFromStorageIfLow - -;~ Description: Moves item from storage and onto stack in inventory. -Func MoveItemFromStorageByModelID_($aModelID, $aAmount = 250) - Local $lCount = CountItemInBagsByModelID($aModelID) - If $lCount >= $aAmount Then Return True - Local $lBagPtr, $lItemArrayPtr, $lBackslotPtr, $lItemPtr - Local $lQuantity, $lTemp, $lMoveCount, $lSlotCount, $lTimer, $lDeadlock, $lQuantityNew - Local $lRest = $aAmount - $lCount - Local $lBackpackArray[46][3] - Local $lReservedSlotCount = 0 - ; Fill $lBackpackArray with possible slots in backpack until no more space needed - For $i = 1 To 4 - $lBagPtr = GetBagPtr($i) - If $lBagPtr = 0 Then ContinueLoop - Local $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') - For $j = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 - $lBackslotPtr = MemoryRead($lItemArrayPtr + 4 * $j, 'ptr') - If $lBackslotPtr = 0 Then - $lReservedSlotCount += 1 - $lBackpackArray[$lReservedSlotCount][0] = $i - $lBackpackArray[$lReservedSlotCount][1] = $j + 1 - If $lRest < 250 Then - $lBackpackArray[$lReservedSlotCount][2] = $lRest - Else - $lBackpackArray[$lReservedSlotCount][2] = 250 - EndIf - $lRest -= 250 - ElseIf MemoryRead($lBackslotPtr + 44, 'long') = $aModelID Then - $lQuantity = MemoryRead($lBackslotPtr + 75, 'byte') - If $lQuantity >= 250 Then ContinueLoop ; full stack - ignore - $lReservedSlotCount += 1 - $lTemp = 250 - $lQuantity ; room left on stack - If $lRest > $lTemp Then - $lMoveCount = $lTemp - $lRest -= $lTemp - Else - $lMoveCount = $lRest - $lRest = 0 - EndIf - $lBackpackArray[$lReservedSlotCount][0] = $i - $lBackpackArray[$lReservedSlotCount][1] = $j + 1 - $lBackpackArray[$lReservedSlotCount][2] = $lMoveCount ; 0 -> empty slot, everything > 0 -> stack - EndIf - If $lRest <= 0 Then ExitLoop 2 - Next - Next - $lBackpackArray[0][0] = $lReservedSlotCount - $lSlotCount = 1 - ; Search Storage for stacks and move them to slots defined in $lBackpackArray while updating $lBackpackArray - For $i = 8 To 16 - $lBagPtr = GetBagPtr($i) - If $lBagPtr = 0 Then ContinueLoop - Local $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') - For $j = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 - $lItemPtr = MemoryRead($lItemArrayPtr + 4 * $j, 'ptr') - If $lItemPtr = 0 Then ContinueLoop - If MemoryRead($lItemPtr + 44, 'long') = $aModelID Then - $lQuantity = MemoryRead($lItemPtr + 75, 'byte') - $lTimer = TimerInit() - While $lQuantity > $lBackpackArray[$lSlotCount][2] And $lSlotCount <= $lBackpackArray[0][0] - MoveItemEx($lItemPtr, $lBackpackArray[$lSlotCount][0], $lBackpackArray[$lSlotCount][1], $lBackpackArray[$lSlotCount][2]) - $lDeadlock = TimerInit() - Do - Sleep(250) - $lQuantityNew = MemoryRead($lItemPtr + 75, 'byte') - If $lQuantityNew < $lQuantity Then - $lBackpackArray[$lSlotCount][2] = 0 - $lSlotCount += 1 - ExitLoop - EndIf - Until TimerDiff($lDeadlock) > 5000 - $lQuantity = $lQuantityNew - If TimerDiff($lTimer) > 30000 Then Return -1 ; error moving - WEnd - If $lSlotCount > $lBackpackArray[0][0] Then Return True - If $lQuantity > 0 And $lQuantity <= $lBackpackArray[$lSlotCount][2] Then - MoveItemEx($lItemPtr, $lBackpackArray[$lSlotCount][0], $lBackpackArray[$lSlotCount][1], $lQuantity) - $lDeadlock = TimerInit() - Do - Sleep(250) - If MemoryRead($lItemPtr + 12, 'ptr') <> $lBagPtr Then - $lBackpackArray[$lSlotCount][2] = $lBackpackArray[$lSlotCount][2] - $lQuantity - If $lBackpackArray[$lSlotCount][2] = 0 Then $lSlotCount += 1 - ExitLoop - EndIf - Until TimerDiff($lDeadlock) > 5000 - EndIf - If $lSlotCount > $lBackpackArray[0][0] Then Return True - EndIf - Next - Next -EndFunc ;==>MoveItemFromStorageByModelID_ \ No newline at end of file + +#include-once + + + +;~ Decsription: Tries to clear up one slot. +Func TempStorage() + Local $lBagPtr, $lItemArrayPtr, $lItemPtr + Local $lType, $lMapState, $lSlot, $DropItem = False + $lMapState = GetMapLoading() + If $lMapState = 0 Then CleanUpStacks(1, (($lMapState = 0) ? (16) : (4)),(($lMapState = 0) ? (True) : (False)) ) + For $i = 1 To 4 + $lBagPtr = GetBagPtr($i) + If $lBagPtr = 0 Then ContinueLoop + Local $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') + For $j = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 + $lItemPtr = MemoryRead($lItemArrayPtr + 4 * $j, 'ptr') + If $lItemPtr = 0 Then Return True ; empty slot + $lType = MemoryRead($lItemPtr + 32, 'byte') + If $lType = 29 Then ContinueLoop ; kits + If $lMapState = 0 Then ; outpost + ;If Not $mFoundChest Then Return False + Local $notFullBackPackStacks = FindBackpackStack(MemoryRead($lItemPtr + 44, 'long')) + If IsArray($notFullBackPackStacks) Then + CleanUpStacks(1, 16) + StoreItems() + EndIf + Local $lSlot_Backpack = OpenBackpackSlot() + If IsArray($lSlot_Backpack) Then + $lSlot_Storage = OpenStorageSlot() + If IsArray($lSlot_Storage) Then + $mTempStorage[0][0] += 1 + ReDim $mTempStorage[$mTempStorage[0][0] + 1][2] + $mTempStorage[$mTempStorage[0][0]][0] = $lSlot_Storage[0] + $mTempStorage[$mTempStorage[0][0]][1] = $lSlot_Storage[1] + $mTempStorage[0][1] = True + + MoveItem($lItemPtr, $lSlot_Storage[0], $lSlot_Storage[1]) + Sleep(GetPing() + Random(1000, 1500, 1)) + EndIf + EndIf + ElseIf $lMapState = 1 Then ; explorable + If SalvageUses() < 2 Then Return False + If MemoryRead($lItemPtr + 75, 'byte') > 1 Then ContinueLoop + If GetRarity($lItemPtr) <> 2621 Then ContinueLoop ; no white item + Switch $lType + Case 2, 5, 12, 15, 22, 24, 26, 27, 32, 35, 36, 0 + DropItem($lItemPtr) + Sleep(GetPing() + Random(1000, 1500, 1)) + $mTempStorage[0][1] = True + Case Else + ContinueLoop + EndSwitch + EndIf + Next + Next + + + IF $mTempStorage[0][1] Then Return True + Return False + +EndFunc ;==>TempStorage + + + +Func CheckIf_mTempStorage(Const Byref $i, Const ByRef $j) + For $n = 1 To $mTempStorage[0][0] + IF $mTempStorage[$n][0] = $i And $mTempStorage[$n][1] = $j Then Return True + Next + Return False +EndFunc + + +;~ Description: Moves temporarily relocated item back. --updated +Func RestoreStorage() + Local $lItemPtr, $lSlot + For $i = $mTempStorage[0][0] - 1 To 0 Step -1 + $lItemPtr = GetItemPtrBySlot($mTempStorage[$i][0], $mTempStorage[$i][1]) + $lSlot = OpenBackpackSlot() + If Not IsArray($lSlot) Then Return False + ReDim $mTempStorage[$mTempStorage[0][0]][2] + $mTempStorage[0][0] -= 1 + MoveItem($lItemPtr, $lSlot[0], $lSlot[1]) + Sleep(GetPing() + Random(1000, 1500, 1)) + Next + Return ((Not IsArray($lSlot)) ? (False) : (True)) +EndFunc ;==>RestoreStorage + +;~ Description: Returns empty backpack slot as array. +Func OpenBackpackSlot() + Local $lBagPtr, $lItemArrayPtr + For $i = 1 To $mBags + $lBagPtr = GetBagPtr($i) + If $lBagPtr = 0 Then ContinueLoop + Local $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') + For $j = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 + If MemoryRead($lItemArrayPtr + 4 * $j, 'ptr') = 0 Then + Local $lReturnArray[2] = [$i, $j] + Return $lReturnArray + EndIf + Next + Next + Return 0 +EndFunc ;==>OpenBackpackSlot + +;~ Description: Returns empty storage slot as array. +Func OpenStorageSlot() + Local $lBagPtr, $lItemArrayPtr + For $i = 8 To 16 + $lBagPtr = GetBagPtr($i) + If $lBagPtr = 0 Then ContinueLoop + Local $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') + For $j = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 + If MemoryRead($lItemArrayPtr + 4 * $j, 'ptr') = 0 Then + Local $lReturnArray[2] = [$i, $j] + Return $lReturnArray + EndIf + Next + Next + Return 0 +EndFunc ;==>OpenStorageSlot + + +;~ Description: Returns bag and slot as array of ModelID, if stack not full (inventory). +;~ @extended contains quantity. +Func FindBackpackStack($aModelID, $full_or_not = False) + Local $lBagPtr, $lItemArrayPtr, $lItemPtr, $lQuantity + For $i = 1 To 4 + $lBagPtr = GetBagPtr($i) + If $lBagPtr = 0 Then ContinueLoop + Local $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') + For $j = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 + $lItemPtr = MemoryRead($lItemArrayPtr + 4 * $j, 'ptr') + If $lItemPtr = 0 Then ContinueLoop + If MemoryRead($lItemPtr + 44, 'long') = $aModelID Then + $lQuantity = MemoryRead($lItemPtr + 75, 'byte') + Select + Case Not $full_or_not And $lQuantity < 250 + Return StacksHelper1($lQuantity, $i, $j) + Case $full_or_not And $lQuantity = 250 + Return StacksHelper1($lQuantity, $i, $j) + EndSelect + EndIf + Next + Next +EndFunc ;==>FindBackpackStack + +Func StacksHelper1(Const ByRef $lQuantity, Const ByRef $i, Const ByRef $j) + Local $lReturnArray[2] = [$i, $j] + Return SetExtended($lQuantity, $lReturnArray) +EndFunc + +;~ Description: Returns bag and slot as array of ModelID, ExtraID, if stack is not full (storage). +;~ @extended contains quantity. +Func FindStorageStack($aModelID, $aExtraID = 0, $full_or_not = False) + Local $lBagPtr, $lItemArrayPtr, $lItemPtr, $lQuantity + For $i = 8 To 16 + $lBagPtr = GetBagPtr($i) + If $lBagPtr = 0 Then ContinueLoop + Local $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') + For $j = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 + $lItemPtr = MemoryRead($lItemArrayPtr + 4 * $j, 'ptr') + If $lItemPtr = 0 Then ContinueLoop + If MemoryRead($lItemPtr + 44, 'long') = $aModelID Then + $lQuantity = MemoryRead($lItemPtr + 75, 'byte') + If Not $full_or_not And $lQuantity < 250 Then + Local $lReturnArray[2] = [$i, $j] + Return SetExtended($lQuantity, $lReturnArray) + EndIf + If $full_or_not And $lQuantity = 250 Then + Local $lReturnArray[2] = [$i, $j] + Return SetExtended($lQuantity, $lReturnArray) + EndIf + EndIf + Next + Next +EndFunc ;==>FindStorageStack + +;~ Description: Checks if modelID is low in inventory and moves then items from storage. +Func GetItemFromStorageIfLow($aModelID, $MinimumAmount = 250) + If CountItemInBagsByModelID($aModelID) < $MinimumAmount Then + MoveItemFromStorageByModelID_($aModelID, $MinimumAmount) + EndIf +EndFunc ;==>GetItemFromStorageIfLow + +;~ Description: Moves item from storage and onto stack in inventory. +Func MoveItemFromStorageByModelID_($aModelID, $aAmount = 250) + Local $lCount = CountItemInBagsByModelID($aModelID) + If $lCount >= $aAmount Then Return True + Local $lBagPtr, $lItemArrayPtr, $lBackslotPtr, $lItemPtr + Local $lQuantity, $lTemp, $lMoveCount, $lSlotCount, $lTimer, $lDeadlock, $lQuantityNew + Local $lRest = $aAmount - $lCount + Local $lBackpackArray[46][3] + Local $lReservedSlotCount = 0 + ; Fill $lBackpackArray with possible slots in backpack until no more space needed + For $i = 1 To 4 + $lBagPtr = GetBagPtr($i) + If $lBagPtr = 0 Then ContinueLoop + Local $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') + For $j = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 + $lBackslotPtr = MemoryRead($lItemArrayPtr + 4 * $j, 'ptr') + If $lBackslotPtr = 0 Then + $lReservedSlotCount += 1 + $lBackpackArray[$lReservedSlotCount][0] = $i + $lBackpackArray[$lReservedSlotCount][1] = $j + 1 + If $lRest < 250 Then + $lBackpackArray[$lReservedSlotCount][2] = $lRest + Else + $lBackpackArray[$lReservedSlotCount][2] = 250 + EndIf + $lRest -= 250 + ElseIf MemoryRead($lBackslotPtr + 44, 'long') = $aModelID Then + $lQuantity = MemoryRead($lBackslotPtr + 75, 'byte') + If $lQuantity >= 250 Then ContinueLoop ; full stack - ignore + $lReservedSlotCount += 1 + $lTemp = 250 - $lQuantity ; room left on stack + If $lRest > $lTemp Then + $lMoveCount = $lTemp + $lRest -= $lTemp + Else + $lMoveCount = $lRest + $lRest = 0 + EndIf + $lBackpackArray[$lReservedSlotCount][0] = $i + $lBackpackArray[$lReservedSlotCount][1] = $j + 1 + $lBackpackArray[$lReservedSlotCount][2] = $lMoveCount ; 0 -> empty slot, everything > 0 -> stack + EndIf + If $lRest <= 0 Then ExitLoop 2 + Next + Next + $lBackpackArray[0][0] = $lReservedSlotCount + $lSlotCount = 1 + ; Search Storage for stacks and move them to slots defined in $lBackpackArray while updating $lBackpackArray + For $i = 8 To 16 + $lBagPtr = GetBagPtr($i) + If $lBagPtr = 0 Then ContinueLoop + Local $lItemArrayPtr = MemoryRead($lBagPtr + 24, 'ptr') + For $j = 0 To MemoryRead($lBagPtr + 32, 'long') - 1 + $lItemPtr = MemoryRead($lItemArrayPtr + 4 * $j, 'ptr') + If $lItemPtr = 0 Then ContinueLoop + If MemoryRead($lItemPtr + 44, 'long') = $aModelID Then + $lQuantity = MemoryRead($lItemPtr + 75, 'byte') + $lTimer = TimerInit() + While $lQuantity > $lBackpackArray[$lSlotCount][2] And $lSlotCount <= $lBackpackArray[0][0] + MoveItemEx($lItemPtr, $lBackpackArray[$lSlotCount][0], $lBackpackArray[$lSlotCount][1], $lBackpackArray[$lSlotCount][2]) + $lDeadlock = TimerInit() + Do + Sleep(250) + $lQuantityNew = MemoryRead($lItemPtr + 75, 'byte') + If $lQuantityNew < $lQuantity Then + $lBackpackArray[$lSlotCount][2] = 0 + $lSlotCount += 1 + ExitLoop + EndIf + Until TimerDiff($lDeadlock) > 5000 + $lQuantity = $lQuantityNew + If TimerDiff($lTimer) > 30000 Then Return -1 ; error moving + WEnd + If $lSlotCount > $lBackpackArray[0][0] Then Return True + If $lQuantity > 0 And $lQuantity <= $lBackpackArray[$lSlotCount][2] Then + MoveItemEx($lItemPtr, $lBackpackArray[$lSlotCount][0], $lBackpackArray[$lSlotCount][1], $lQuantity) + $lDeadlock = TimerInit() + Do + Sleep(250) + If MemoryRead($lItemPtr + 12, 'ptr') <> $lBagPtr Then + $lBackpackArray[$lSlotCount][2] = $lBackpackArray[$lSlotCount][2] - $lQuantity + If $lBackpackArray[$lSlotCount][2] = 0 Then $lSlotCount += 1 + ExitLoop + EndIf + Until TimerDiff($lDeadlock) > 5000 + EndIf + If $lSlotCount > $lBackpackArray[0][0] Then Return True + EndIf + Next + Next +EndFunc ;==>MoveItemFromStorageByModelID_ diff --git a/gwApi/utilities/trade.au3 b/gwApi/utilities/trade.au3 index 9afb4db..4295cc8 100644 --- a/gwApi/utilities/trade.au3 +++ b/gwApi/utilities/trade.au3 @@ -1,52 +1,53 @@ -#include-once - -;~ Description: Open trade window. -Func TradePlayer($aAgent) - If IsPtr($aAgent) <> 0 Then - Local $lAgentID = MemoryRead($aAgent + 44, 'long') - ElseIf IsDllStruct($aAgent) <> 0 Then - Local $lAgentID = DllStructGetData($aAgent, 'ID') - Else - Local $lAgentID = ConvertID($aAgent) - EndIf - SendPacket(0x08, 0x43, $lAgentID) -EndFunc ;==>TradePlayer - -;~ Description: Like pressing the "Accept" button in a trade. Can only be used after both players have submitted their offer. -Func AcceptTrade() - Return SendPacket(0x4, 0xB4) -EndFunc ;==>AcceptTrade - -;~ Description: Like pressing the "Cancel" button in a trade. -Func CancelTrade() - Return SendPacket(0x4, 0xAE) -EndFunc ;==>CancelTrade - -;~ Description: Like pressing the "Change Offer" button. -Func ChangeOffer() - Return SendPacket(0x4, 0xB3) -EndFunc ;==>ChangeOffer - -;~ Description: Like pressing the "Submit Offer" button, but also including the amount of gold offered. -Func SubmitOffer($aGold = 0) - Return SendPacket(0x8, 0xB0, $aGold) -EndFunc ;==>SubmitOffer - -;~ Description: Offer item. -Func OfferItem($aItemID, $aQuantity = 1) - If IsPtr($aItemID) <> 0 Then - Local $lItemID = MemoryRead($aItemID, 'long') - Local $lQuantity = MemoryRead($aItemID + 75, 'byte') - ElseIf IsDllStruct($aItemID) <> 0 Then - Local $lItemID = DllStructGetData($aItemID, 'ID') - Local $lQuantity = DllStructGetData($aItemID, 'Quantity') - Else - Local $lItemID = $aItemID - Local $lQuantity = MemoryRead(GetItemPtr($aItemID) + 75, 'byte') - EndIf - If $aQuantity > $lQuantity Then - Return SendPacket(0xC, 0xAF, $lItemID, $lQuantity) - Else - Return SendPacket(0xC, 0xAF, $lItemID, $aQuantity) - EndIf -EndFunc ;==>OfferItem \ No newline at end of file +52 +#include-once + +;~ Description: Open trade window. +Func TradePlayer($aAgent) + If IsPtr($aAgent) <> 0 Then + Local $lAgentID = MemoryRead($aAgent + 44, 'long') + ElseIf IsDllStruct($aAgent) <> 0 Then + Local $lAgentID = DllStructGetData($aAgent, 'ID') + Else + Local $lAgentID = ConvertID($aAgent) + EndIf + SendPacket(0x08, 0x43, $lAgentID) +EndFunc ;==>TradePlayer + +;~ Description: Like pressing the "Accept" button in a trade. Can only be used after both players have submitted their offer. +Func AcceptTrade() + Return SendPacket(0x4, 0xB4) +EndFunc ;==>AcceptTrade + +;~ Description: Like pressing the "Cancel" button in a trade. +Func CancelTrade() + Return SendPacket(0x4, 0xAE) +EndFunc ;==>CancelTrade + +;~ Description: Like pressing the "Change Offer" button. +Func ChangeOffer() + Return SendPacket(0x4, 0xB3) +EndFunc ;==>ChangeOffer + +;~ Description: Like pressing the "Submit Offer" button, but also including the amount of gold offered. +Func SubmitOffer($aGold = 0) + Return SendPacket(0x8, 0xB0, $aGold) +EndFunc ;==>SubmitOffer + +;~ Description: Offer item. +Func OfferItem($aItemID, $aQuantity = 1) + If IsPtr($aItemID) <> 0 Then + Local $lItemID = MemoryRead($aItemID, 'long') + Local $lQuantity = MemoryRead($aItemID + 75, 'byte') + ElseIf IsDllStruct($aItemID) <> 0 Then + Local $lItemID = DllStructGetData($aItemID, 'ID') + Local $lQuantity = DllStructGetData($aItemID, 'Quantity') + Else + Local $lItemID = $aItemID + Local $lQuantity = MemoryRead(GetItemPtr($aItemID) + 75, 'byte') + EndIf + If $aQuantity > $lQuantity Then + Return SendPacket(0xC, 0xB5, $lItemID, $lQuantity) ;~ old -> Return SendPacket(0xC, 0xAF, $lItemID, $lQuantity) + Else + Return SendPacket(0xC, 0xB5, $lItemID, $aQuantity) ;~ old -> Return SendPacket(0xC, 0xAF, $lItemID, $aQuantity) + EndIf +EndFunc ;==>OfferItem