Sign in to follow this  
wutisgoingon

My Merciless Docks 174% IIQ Leap Slammer UPDATED FOR 1.0

Recommended Posts

This used to be an overview of my Leap Slam bot who was comfortably doing Merc Docks on Onslaught. Now it can be used as a guide to botting a leap slammer in Nemesis.

NEW 1.0 TALENT TREE (SCION START)

http://www.pathofexile.com/passive-skil ... L8xf4K_o8=

Scion seems like a very solid start with lots of life/resist nodes as well as berserking nearby, but you could still make duelist/marauder work if you want. Note there are several, good sword talents that are selected, only take those if you use a sword obviously.

GEAR - (currently I don't have much IIQ) Update-go for a Koam's Primacy

All of my gear has been acquired using currency found by botting city of sarn. I also crafted a lot of the 20% quantity jewelry myself because it's hard to find good ones for trade

The weapon I bought for 3 exalts because it has a perfect roll. I see others go for around 2 exalts. These are onslaught prices by the way. If you've been botting for awhile in city of sarn, this should be easily affordable and definitely worth it. You will also have to 4 or 5 link it.

Posted Image

This helm I bought using the poe index mostly for the necessary cold resist that I was lacking for Docks. When searching the index, quantity was the absolute priority followed by life and then cold/fire resists

Posted Image

This chest was 2 chaos from the index. This is the only piece of gear that you are free from the restriction of needing quantity. So you must try to get high armor/evasion, high life, and at least some resists.

Posted Image

Perfect sadimas provide the most quantity you can get on gloves. I paid about 4 chaos. If you can't get these go for some life/resist/quantity armor based rares

Posted Image

Perfect quantity Perandus Blazon--can't get quantity on anything else. Also has necessary fire resist and all attributes. A perfect 12% is worth 3-5 chaos. Other options are Meginord's or a rare, but this build attempts to maximize quantity while still surviving onslaught merc docks.

I paid a small premium for these 2 perfect uniques, but the % IQ go along way if you're doing a lot of botting

Posted Image

There are two options for boots. I found that for running docks, you need run speed because it spends a lot of time searching the empty grid. So I found a very nice pair with 30% move speed and 20% quantity. They also have 45% fire resist to easily replace my 30% quantity Goldwyrm Nubuck boots. I paid 5 chaos for these boots, which I plan on exalting soon, and the Goldwyrm's are 7 chaos for 30%. In my talent tree you will see 'Celerity' for 8% movement speed and 2x mana reservations so that I can run haste (more movement speed).

Posted ImagePosted Image

For my jewelry, I bought an itemlevel 77 sapphire ring and altered it until I got a 20% quantity affix. The second mod doesn't matter that much because 20% quantity is so rare. You can then regal it for another chance at max life. I ended up exalting Golem Loop until I filled up all the slots (with peer pressure from my friends) and got some pretty decent rolls.

I also crafted the ilvl77 amulet. It isn't that good, but I value 20% quantity a lot. I don't think it's quite exalt worthy but it's tempting.

And I bought Skull Nail from the index for around 5 chaos.

Posted Image

GEMS - updated for Nemesis

My current setup: Leap Slam->Blood Magic->Endurance Charge on Melee Stun->Melee Physical OR Added Fire

*Endurance Charge on Melee Stun could be swapped for more damage if you have 'Cast on damage taken' linked with enduring cry (see below).

*Once you have a 5-link, you could use Item Rarity

Note: Item Quantity does not exist in Nemesis. Another thing that is helpful is linking 'Endurance Charge on Melee Stun' to leap slam. You will have 3 charges up for 15% physical reduction pretty much ALL the time. If you get talents for extra endurance charges, you can get 5 charges for 25% reduction. This could replace Item Quantity (because you can't get it on Nemesis)

Updated Aura Setup:

Reduced Mana (at least lvl 11) -> Hatred -> Grace OR Determination

*Reduced Mana at level 11 allows you to run both auras

*Blood Magic linked to Leap Slam so you don't use any mana

*We have enough defense with talents to run Hated which is a huge damage boost

*Use Grace if you have iron reflexes and if it gives more physical reduction, otherwise use Determination

More Gem Options

Additionally, have the bot link the following:

'Cast when damage taken' -> Curse of your choice(perhaps Vulnerability/Enfeeble) -> Molten Shell -> Enduring Cry

It will cast all of these when taking 400 damage or so. This is too good to be true.

FLASKS - outdated script

First of all, I use PoE_AutoFlasks.ahk for flasks and chickening. This means I set my bot config flask settings to 0. I setup my autoflask so that it will spam three 'Seething' flasks when needed and 2 granites when needed. With this setup, my bot is pretty much a god. I find it imperative to have Seething flasks so that you can face tank LMP dogs and keep your health capped off. The following is my autoflask script utilizing 'OverrideFlaskDuration': **You must use 3 'Seething' prefix flasks in your 1-2-3 slots for this to work**

SetBatchLines, -1

DetectHiddenWindows, On

cliname=Path of Exile

cliexe=Client.exe

trayNotifications:=true ;display tray notifications about script actions : drinking potions, autoquitting

autoPotionsWatchdogPeriod:=100 ;milliseconds, decrease this value to have script recheck life/mana/flasks availability more often/increase chances of getting saved from death in time

lagCompensation:=50

autoQuitMode:=1 ; default autoQuit method : 0 =winKill, 1 = exit to login screen

autoQuitPauseBeforeClick:=100

autoQuitSoftToleranceBeforeKill:=2000 ; try to quit to loginscreen at most milliseconds before killing game window(in case we can't quit by clicking menu option for some reason)

PlayerConfig:={}

PlayerConfig["Default"]:={minLifeRatioToDrink: 0.8, minManaRatioToDrink: 0, minManaToDrink: 0, minLifeRatioToPopGranite: 0.85, minLifeRatioToQuit: 0.35} ; disableAutoPotions:true, minLifeRatioToQuit:, minNShieldRatioToQuit: , HasZealotsOath: false, }

PlayerConfig["Default"].FlaskConfig:=[]

PlayerConfig["Default"].FlaskConfig[1]:={Hotkey:"{1 Down 1 UP}", OverrideFlaskDuration:0} ; ,OverrideFlaskDuration:0, instantRecoveryOnLowLife:true, } ;specify override recovery time in deciseconds, e.g. 7 seconds = 70

PlayerConfig["Default"].FlaskConfig[2]:={Hotkey:"{2 Down 2 UP}", OverrideFlaskDuration:0}

PlayerConfig["Default"].FlaskConfig[3]:={Hotkey:"{3 Down 3 UP}", OverrideFlaskDuration:0}

PlayerConfig["Default"].FlaskConfig[4]:={Hotkey:"{4 Down 4 UP}"}

PlayerConfig["Default"].FlaskConfig[5]:={Hotkey:"{5 Down 5 UP}"}

PlayerConfig["YourHardcorePlayerName"]:={minLifeRatioToDrink: 0.7, minManaRatioToDrink: 0.35, minManaToDrink: 70, minLifeRatioToQuit: 0.4}

PlayerConfig["YourHardcorePlayerName"].FlaskConfig:=[]

PlayerConfig["YourHardcorePlayerName"].FlaskConfig[1]:={Hotkey:"{1 Down 1 UP}"}

PlayerConfig["YourHardcorePlayerName"].FlaskConfig[2]:={Hotkey:"{2 Down 2 UP}"}

PlayerConfig["YourHardcorePlayerName"].FlaskConfig[3]:={Hotkey:"{3 Down 3 UP}"}

PlayerConfig["YourHardcorePlayerName"].FlaskConfig[4]:={Hotkey:"{4 Down 4 UP}"}

PlayerConfig["YourHardcorePlayerName"].FlaskConfig[5]:={Hotkey:"{5 Down 5 UP}"}

autoPotionsState:=true

WindowQueuedFlaskEffects:=[] ;keyed by "%hwnd%%CurrPid%", hpQueueEndtime, manaQueueEndtime

baseMgrPtr:=0x71E008 ; 0.11.3b delete for script to try to auto-scan for it in newer versions, scan takes 4-5 seconds

basePtrAoBArray:=[0x6A,0xFF,0x68,"?","?","?","?",0x50,0x64,"?","?","?","?","?","?",0xA1,"?","?","?","?",0x81,0xEC,"?","?","?","?",0x53,0x55,0x56,0x57,0x33,0xFF,0x3B,0xC7]

basePtrAobOffset:=0x10

WindowBasicsCache:=[] ; keyed by "%hwnd%%CurrPid%", entries are objects with properties processHandle, moduleBase, moduleSize, baseFramePtr

#Include AutoHotkeyMemoryLib.ahk

Loop

{

AutoPotions()

}

GetWindowBasics(hwnd, byref mB="", byref pH="", byref mS="")

{

global WindowBasicsCache

global cliexe

WinGet, CurrPid, PID, ahk_id %hwnd%

k="%hwnd%%CurrPid%"

mB:=WindowBasicsCache[k].mBase

mS:=WindowBasicsCache[k].mSize

if mB=

{

WindowBasicsCache[k]:=Object()

GetModuleInfo(cliexe, CurrPid, mB, mS)

if (mB="" || mS="")

{

MsgBox, Failed to obtain moduleBase or moduleSize for PID %CurrPid%, script will now terminate

ExitApp

}

WindowBasicsCache[k].mBase:=mB

WindowBasicsCache[k].mSize:=mS

}

pH:=WindowBasicsCache[k].ProcessHandle

if pH=

{

pH:=GetProcessHandle(CurrPid)

if (pH="" || pH=-1)

{

MsgBox, Invalid process handle obtained for PID %CurrPid%, script will now terminate

ExitApp

}

WindowBasicsCache[k].ProcessHandle:=pH

}

}

ScanBaseMgrPtr(mBase,pH,moduleSize)

{

global basePtrAoBArray

global basePtrAobOffset

global baseMgrPtr

aobResult:=AobScan(pH,mBase,moduleSize,basePtrAoBArray)

if aobResult

{

SetFormat, IntegerFast, hex

baseMgrPtr:=ReadMemUInt(pH,mBase+aobResult+basePtrAobOffset)-mBase

MsgBox, PoE Base ptr found with AoB Scan baseMgrPtr = %baseMgrPtr%, save this value to script for quick startup

SetFormat, IntegerFast, dec

}

else

{

MsgBox, baseMgrPtr not found with AoBScan, script will now terminate

ExitApp

}

}

GetFrameBase(hwnd)

{

global baseMgrPtr

global WindowBasicsCache

WinGet, CurrPid, PID, ahk_id %hwnd%

k="%hwnd%%CurrPid%"

fB:=WindowBasicsCache[k].fBase

if fB=

{

GetWindowBasics(hwnd, mBase, pH, mSize)

if baseMgrPtr=

{

ScanBaseMgrPtr(mBase, pH, mSize)

}

fB:=GetMultilevelPointer(pH,[mBase+baseMgrPtr,4,0x7C,0x94])

WindowBasicsCache[k].fBase:=fB

}

return fB

}

GetUiBase(hwnd)

{

global baseMgrPtr

GetWindowBasics(hwnd, mBase, pH, mSize)

if baseMgrPtr=

{

ScanBaseMgrPtr(mBase, pH, mSize)

}

FrameBase:=GetFrameBase(hwnd)

if (FrameBase="" || FrameBase=0)

return

uiBase:=GetMultilevelPointer(pH,[FrameBase+0x38,0x78,0xA4,0x50])

return uiBase

}

ReadClientResolution(hwnd, ByRef w, ByRef h)

{

GetWindowBasics(hwnd,mBase,pH)

if (mBase!=0 && pH && pH!=-1)

{

FrameBase:=GetFrameBase(hwnd)

w:=ReadMemUInt(pH,FrameBase+0x1340)

h:=ReadMemUInt(pH,FrameBase+0x1344)

return true

}

}

ReadPlayerStats(hwnd, byRef PlayerStats)

{

GetWindowBasics(hwnd, mBase, pH)

fBase:=GetFrameBase(hwnd)

PlayerBase:=GetMultilevelPointer(pH,[fBase+0xb4,0x59C])

PlayerMain:=ReadMemUInt(pH,PlayerBase+4)

PlayerStatsOffset:=ReadMemUInt(pH,PlayerMain+0xC)

PlayerStats.MaxHP:=ReadMemUInt(pH,PlayerStatsOffset+0x50)

PlayerStats.CurrHP:=ReadMemUInt(pH,PlayerStatsOffset+0x54)

PlayerStats.ReservedHPFlat:=ReadMemUInt(pH,PlayerStatsOffset+0x5C)

PlayerStats.ReservedHPPercent:=ReadMemUInt(pH,PlayerStatsOffset+0x60)

PlayerStats.MaxMana:=ReadMemUInt(pH,PlayerStatsOffset+0x74)

PlayerStats.ReservedManaFlat:=ReadMemUInt(pH,PlayerStatsOffset+0x80)

PlayerStats.ReservedManaPercent:=ReadMemUInt(pH,PlayerStatsOffset+0x84)

PlayerStats.CurrMana:=ReadMemUInt(pH,PlayerStatsOffset+0x78)

PlayerStats.MaxNShield:=ReadMemUInt(pH,PlayerStatsOffset+0x98)

PlayerStats.CurrNShield:=ReadMemUInt(pH,PlayerStatsOffset+0x9C)

if (ReadMemUInt(pH, ReadMemUInt(pH,PlayerMain+0x14)+0x24)

PlayerStats.Name:=ReadMemStr(pH, ReadMemUint(pH,PlayerMain+0x14)+0x10,100,"UTF-16") ;immediate name in component

else

PlayerStats.Name:=ReadMemStr(pH, GetMultilevelPointer(pH,[PlayerMain+0x14,0x10]),100,"UTF-16") ; otherwise pointer to name is stored

}

ReadFlasksData(hwnd, byRef FlasksData)

{

GetWindowBasics(hwnd, mBase, pH)

UiBase:=GetUiBase(hwnd)

if (!UiBase) ;not InGame

return

FlaskInvBase:=GetMultilevelPointer(pH,[uiBase+0x8d0,0x8e8,0x28])

Loop, 5

{

currFlaskPtr:=ReadMemUInt(pH,FlaskInvBase+(A_Index-1)*4)

if (currFlaskPtr!=0) ; there's a flask in said slot

{

FlasksData[A_Index]:={}

FlaskChargesPtr:=GetMultilevelPointer(ph,[currFlaskPtr,4,0x1C,4,4,0xC])

FlasksData[A_Index].ChargesCurrent:=ReadMemUInt(pH,FlaskChargesPtr+0xC)

FlasksData[A_Index].ChargesPerUse:=ReadMemUInt(pH,ReadMemUInt(pH,FlaskChargesPtr+8)+0xC)

if (FlasksData[A_Index].ChargesCurrent

continue

FlaskMetadataPtr:=GetMultilevelPointer(ph,[currFlaskPtr,0,8])

FlaskMetadataStr:=ReadMemStr(ph,FlaskMetadataPtr,70,"UTF-16")

FlaskTypeStr:=SubStr(FlaskMetadataStr,23)

FlasksData[A_Index].type:=FlaskTypeStr

FlaskLocalstatsPtr:=GetMultilevelPointer(ph,[currFlaskPtr,4,0x18,0x20,0xC])

if InStr(FlaskTypeStr, "Life")

{

FlasksData[A_Index].HPRegAmount:=ReadMemUInt(pH,FlaskLocalstatsPtr+4)

FlasksData[A_Index].EffectDuration:=ReadMemUInt(pH,FlaskLocalstatsPtr+0xC)

}

if InStr(FlaskTypeStr, "Mana")

{

FlasksData[A_Index].ManaRegAmount:=ReadMemUInt(pH,FlaskLocalstatsPtr+4)

FlasksData[A_Index].EffectDuration:=ReadMemUInt(pH,FlaskLocalstatsPtr+0xC)

}

if InStr(FlaskTypeStr, "Hybrid")

{

FlasksData[A_Index].HPRegAmount:=ReadMemUInt(pH,FlaskLocalstatsPtr+4)

FlasksData[A_Index].ManaRegAmount:=ReadMemUInt(pH,FlaskLocalstatsPtr+0xC)

FlasksData[A_Index].EffectDuration:=ReadMemUInt(pH,FlaskLocalstatsPtr+0x14)

}

if InStr(FlaskTypeStr, "FlaskUtility")

{

FlasksData[A_Index].EffectDuration:=ReadMemUInt(pH,FlaskLocalstatsPtr+0x4)

}

}

}

}

IsInGame(hwnd)

{

if (hwnd=0 || hwnd="")

return false

GetWindowBasics(hwnd,mBase,pH)

if (mBase="" || mBase=0 || pH="" || pH=-1)

return false

fBase:=GetFrameBase(hwnd)

if (fBase="" || fBase=0)

return false

localConnection:=ReadMemUInt(pH,fBase+0xb8)

if (localConnection=0 || localConnection="")

return false

else

return true

}

SetGameStateMenu(hwnd)

{

if (hwnd=0 || hwnd="")

return false

GetWindowBasics(hwnd,mBase,pH)

if (mBase="" || mBase=0 || pH="" || pH=-1)

return false

fBase:=GetFrameBase(hwnd)

if (fBase="" || fBase=0)

return false

localConnection:=ReadMemUInt(pH,fBase+0xb8)

if (localConnection!="" && localConnection!=0)

{

WriteMemUInt(pH,localConnection+0x1d78,1)

}

}

ReadCursorScreenPosition(hwnd,ByRef cX, ByRef cY)

{

GetWindowBasics(hwnd,mBase,pH)

if (mBase!=0 && pH && pH!=-1)

{

FrameBase:=GetFrameBase(hwnd)

cX:=ReadMemSInt(pH,FrameBase+0x155c)

cY:=ReadMemSInt(pH,FrameBase+0x1560)

return true

}

}

ScreenToClient(hwnd, ByRef x, ByRef y)

{

VarSetCapacity(pt, 8)

NumPut(x, pt, 0)

NumPut(y, pt, 4)

DllCall("ScreenToClient", "uint", hwnd, "uint", &pt)

x := NumGet(pt, 0, "int")

y := NumGet(pt, 4, "int")

VarSetCapacity(pt, 0)

}

GetClientCoords(byRef mx, byRef my)

{

hwnd:=WinActive("A")

CoordMode, Mouse, Screen

MouseGetPos, mx, my

ScreenToClient(hwnd,mx,my) ;get mouse pos relative to window client rect

}

GetFractionalCoords(ByRef fX, ByRef fY)

{

hwnd:=WinActive("A")

if (!IsInGame(hwnd))

GetClientCoords(mx,my)

else

ReadCursorScreenPosition(hwnd,mx,my)

ReadClientResolution(hwnd,w,h)

fX:=mx/w

fY:=my/h

}

GetClientCoordsFromFractional(hwnd, fX,fY, ByRef cX, ByRef cY)

{

ReadClientResolution(hwnd,w,h)

cX:=fX*w

cY:=fY*h

}

QuitToLoginScreen(hwnd)

{

if (!IsInGame(hwnd))

{

return

}

SetGameStateMenu(hwnd)

}

GetMaxChargesFlaskOfType(ByRef FlasksData,TypeStr)

{

currMaxCharges:=0

Loop, 5

if (InStr(FlasksData[A_Index].type,TypeStr))

{

if FlasksData[A_Index].ChargesCurrent>currMaxCharges

{

currMaxI:=A_Index

currMaxCharges:=FlasksData[A_Index].ChargesCurrent

}

}

return currMaxI

}

AutoPotions()

{

global autoPotionsWatchdogPeriod

global lagCompensation

global PlayerConfig

global WindowQueuedFlaskEffects

global cliname

global cliexe

global trayNotifications

global autoQuitMode

if (autoPotionsState!=true)

return

WinGet, WinID, List, %cliname%

Loop, %WinID%

{

WinGet, ProcModuleName, ProcessName, % "ahk_id" WinID%A_Index%

If(ProcModuleName!=cliexe) ; got a window with title "Path of Exile" but exe is not Client.exe, perhaps we have browser window open with PoE site, ignore it

continue

if (!IsInGame(WinID%A_Index%)) ;not ingame

continue

if (WinID%A_Index%=WinActive("A"))

ThisID:=WinActive("A")

PlayerStats:={}

ReadPlayerStats(WinID%A_Index%, PlayerStats)

if (PlayerStats.MaxHP

continue

if (PlayerConfig.HasKey(PlayerStats.Name))

CurrentConfig:=PlayerConfig[PlayerStats.Name]

else

CurrentConfig:=PlayerConfig["Default"]

if PlayerStats.MaxNShield>0

{

currNShieldRatio:=PlayerStats.CurrNShield/PlayerStats.MaxNShield

}

if (PlayerStats.MaxHP>1)

{

currLifeRatio:=PlayerStats.CurrHP/(PlayerStats.MaxHP-PlayerStats.ReservedHPFlat-PlayerStats.MaxHP*PlayerStats.ReservedHPPercent/100)

}

if CurrentConfig.HasZealotsOath

{

currLifeRatio:=currNShieldRatio

}

if (PlayerStats.MaxMana>0)

{

currManaRatio:=PlayerStats.CurrMana/(PlayerStats.MaxMana-PlayerStats.ReservedManaFlat-PlayerStats.MaxMana*PlayerStats.ReservedManaPercent/100)

}

if (currLifeRatio

{

if (autoQuitMode=0)

{

TrayTip, PoE autoPotions AutoQuit by closing window, specified min life reached, %A_Space% , 2

WinKill, % "ahk_id" WinID%A_Index%

}

else if (autoQuitMode=1)

{

QuitToLoginScreen(WinID%A_Index%)

}

autoQuit:=1

continue

}

if (CurrentConfig.disableAutoPotions)

continue

FlasksData:=[]

ReadFlasksData(WinID%A_Index%,FlasksData)

WinGet, CurrPID, PID, % "ahk_id" WinID%A_Index%

hwnd:=WinID%A_Index%

k="%hwnd%%CurrPid%"

if (!WindowQueuedFlaskEffects.HasKey(k))

{

WindowQueuedFlaskEffects[k]:={}

}

if (currLifeRatio

if ((!WindowQueuedFlaskEffects[k].HasKey("graniteQueueEndtime")) || (A_TickCount>=(WindowQueuedFlaskEffects[k].graniteQueueEndtime-lagCompensation)))

{

flaskNum:=GetMaxChargesFlaskOfType(FlasksData,"FlaskUtility5") ; granite flask

if (flaskNum!="")

{

if CurrentConfig.FlaskConfig[flaskNum].HasKey("OverrideFlaskDuration")

EffectDuration:=CurrentConfig.FlaskConfig[flaskNum].OverrideFlaskDuration

else

EffectDuration:=FlasksData[flaskNum].EffectDuration

WindowQueuedFlaskEffects[k].graniteQueueEndtime:=A_TickCount+EffectDuration*100

if (trayNotifications)

{

pname:=PlayerStats.Name

TrayTip, PoE autoPotions popping Granite flask %flaskNum% on %pname%, %A_Space% , 2

}

hKey:=CurrentConfig.FlaskConfig[flaskNum].Hotkey

ControlSend,,%hkey%, % "ahk_id" hwnd

break

}

}

if (currLifeRatio=1)

WindowQueuedFlaskEffects[k].hpQueueEndtime:=A_TickCount

if (currManaRatio=1)

WindowQueuedFlaskEffects[k].ManaQueueEndtime:=A_TickCount

if (currLifeRatio

if ((!WindowQueuedFlaskEffects[k].HasKey("hpQueueEndtime")) || (A_TickCount>=(WindowQueuedFlaskEffects[k].hpQueueEndtime-lagCompensation)))

{

tflaskNum1:=GetMaxChargesFlaskOfType(FlasksData,"FlaskLife")

tflaskNum2:=GetMaxChargesFlaskOfType(FlasksData,"FlaskHybrid")

if ((tflaskNum1!=) && (tflaskNum2!=))

flaskNum:=(FlasksData[tflaskNum1].ChargesCurrent>FlasksData[tflaskNum2].ChargesCurrent) ? tflaskNum1 : tflaskNum2

else

{

if (tflaskNum1!="")

flaskNum:=tflaskNum1

if (tflaskNum2!="")

flaskNum:=tflaskNum2

}

if (flaskNum!="")

{

if CurrentConfig.FlaskConfig[flaskNum].HasKey("OverrideFlaskDuration")

EffectDuration:=CurrentConfig.FlaskConfig[flaskNum].OverrideFlaskDuration

else

EffectDuration:=FlasksData[flaskNum].EffectDuration

if ((CurrentConfig.FlaskConfig[flaskNum].instantRecoveryOnLowLife) && ((PlayerStats.CurrHP/PlayerStats.MaxHP)

EffectDuration:=lagCompensation

WindowQueuedFlaskEffects[k].hpQueueEndtime:=A_TickCount+EffectDuration*100

if (FlasksData[flaskNum].HasKey("ManaRegAmount")) ; hybrid flask

WindowQueuedFlaskEffects[k].ManaQueueEndtime:=A_TickCount+EffectDuration*100

if (trayNotifications)

{

pname:=PlayerStats.Name

TrayTip, PoE autoPotions sipping HP flask %flaskNum% on %pname%, %A_Space% , 2

}

hKey:=CurrentConfig.FlaskConfig[flaskNum].Hotkey

ControlSend,,%hkey%, % "ahk_id" hwnd

break

}

}

if (PlayerStats.MaxMana>0 && (currManaRatio

if ((!WindowQueuedFlaskEffects[k].HasKey("ManaQueueEndtime")) || (A_TickCount>=(WindowQueuedFlaskEffects[k].ManaQueueEndtime-lagCompensation)))

{

tflaskNum1:=GetMaxChargesFlaskOfType(FlasksData,"FlaskMana")

tflaskNum2:=GetMaxChargesFlaskOfType(FlasksData,"FlaskHybrid")

if ((tflaskNum1!=) && (tflaskNum2!=))

flaskNum:=(FlasksData[tflaskNum1].ChargesCurrent>FlasksData[tflaskNum2].ChargesCurrent) ? tflaskNum1 : tflaskNum2

else

{

if (tflaskNum1!="")

flaskNum:=tflaskNum1

if (tflaskNum2!="")

flaskNum:=tflaskNum2

}

if (flaskNum!="")

{

if CurrentConfig.FlaskConfig[flaskNum].HasKey("OverrideFlaskDuration")

{

EffectDuration:=CurrentConfig.FlaskConfig[flaskNum].OverrideFlaskDuration

}

else

EffectDuration:=FlasksData[flaskNum].EffectDuration

if ((CurrentConfig.FlaskConfig[flaskNum].instantRecoveryOnLowLife) && ((PlayerStats.CurrHP/PlayerStats.MaxHP)

EffectDuration:=lagCompensation

WindowQueuedFlaskEffects[k].ManaQueueEndtime:=A_TickCount+EffectDuration*100

if (FlasksData[flaskNum].HasKey("HPRegAmount")) ; hybrid flask

WindowQueuedFlaskEffects[k].hpQueueEndtime:=A_TickCount+EffectDuration*100

hKey:=CurrentConfig.FlaskConfig[flaskNum].Hotkey

if (trayNotifications)

{

pname:=PlayerStats.Name

TrayTip, PoE autoPotions sipping mana flask %flaskNum% on %pname%, %A_Space% , 2

}

ControlSend,,%hkey%, % "ahk_id" hwnd

break

}

}

}

if ((autoQuit=1) && (ThisID!="") && (ThisID!=WinActive("A")))

WinActivate, % "ahk_id" ThisID

Sleep, %autoPotionsWatchdogPeriod%

}

F1::

global autoPotionsState

global trayNotifications

autoPotionsState:=not autoPotionsState

if (trayNotifications)

{

if (autoPotionsState=true)

TrayTip, PoE autoPotions is on, %A_Space% , 2

else

TrayTip, PoE autoPotions is off, %A_Space% , 2

}

return

F2::

GetClientCoords(mx,my)

GetFractionalCoords(fx,fy)

msgbox, mx=%mx% my=%my% fx=%fx% fy=%fy%

return

F4::

QuitToLoginScreen(WinActive("A"))

return

KEY BINDS

·Auras on QWERT

·Leap Slam on left click with a 200 max range

·Move Only on right click with 600 max range

I found this to be the optimal setup

IN SUMMARY

To run docks, you must have capped fire/cold. 81% is what you should aim for with elemental adaptation and a level 20 purity

I focused part of my build on run speed. I think its worth sacrificing a little bit of quantity for it because there's a lot of running in docks.

The flask setup is extremely important. With my PoE_AutoFlask script and 3 seething potions w/ 2 granites, I never even log out with 3.1k hp.

  • Upvote 1

Share this post


Link to post
Share on other sites
d12    3

is there a reason why the bot is moving before setting up auras? (and i dont mean the movement cause of a slow pc. there seems to be a wanted moving aswell)

since if u set up auras without moving there shouldnt be any monsters be lured.

Share this post


Link to post
Share on other sites
marabot    0

is there a reason why the bot is moving before setting up auras? (and i dont mean the movement cause of a slow pc. there seems to be a wanted moving aswell)

since if u set up auras without moving there shouldnt be any monsters be lured.

I don't know, but I sure wish they'd fix that. My doofus guy runs straight out into the middle of the first pack outside the wp and stands there getting his ass kicked while he's trying to cast auras and ends up dying every time. Its making docks essentially impossible for me atm. If someone knows how to fix this, please fill me in.

Share this post


Link to post
Share on other sites
johndeere    0

As far as auras go you can set there them to cast before other spells. Set max_distance to like 1000 or something. It will cast them far before you get into combat. set aura to true and it will only cast once :)

Share this post


Link to post
Share on other sites
d12    3

the idea itself isnt too bad as a temporary fix, but im not too sure if it works.

1. cause the movement at the beginning of an area is based on an ugly implemented gem lvling.

2. if aura = true the aura gets cast right after the gem lvling is done.

so owuld just work if the gem lvling recognises monsters around and stops gem lvling and casting auras.

i also highly doubt that u got enough time to cast all auras until monsters are near enough

but anyways a good idea in theory xD

Share this post


Link to post
Share on other sites

http://l.autohotkey.net/AutoHotkey_L_Install.exe

if (A_PtrSize != 4)
{
	MsgBox, You are not running 32-bit version of Autohotkey L, reinstall correct version. Script will now terminate.
	ExitApp	
}
GetModuleInfo(ModuleName, PID, byRef mBase="", byRef mSize="")
{
    TH32CS_SNAPMODULE := 0x00000008
    INVALID_HANDLE_VALUE = -1
    VarSetCapacity(me32, 548, 0)
    NumPut(548, me32)
	
    snapMod := DllCall("CreateToolhelp32Snapshot", "Uint", TH32CS_SNAPMODULE, "Uint", PID)
	
    If (snapMod = INVALID_HANDLE_VALUE) {
        Return 0
    }
	
    If (DllCall("Module32First", "Uint", snapMod, "Uint", &me32)){
		
		If StrGet(&me32 + 32, "cp0")=ModuleName
		{
                mBase:=NumGet(&me32 + 20)
				mSize:=NumGet(&me32 + 24)
                DllCall("CloseHandle", "UInt", snapMod)
				Return

		}
				
        while(DllCall("Module32Next", "Uint", snapMod, "UInt", &me32)) 
		{
            If StrGet(&me32 + 32, "cp0")=ModuleName
			{
                mBase:=NumGet(&me32 + 20)
				mSize:=NumGet(&me32 + 24)
                DllCall("CloseHandle", "UInt", snapMod)
                Return
            }
        }
    }
	
    DllCall("CloseHandle", "Uint", snapMod)
}

GetProcessHandle(pid)
{
	return DllCall("OpenProcess", "UInt", 0x8|0x10|0x20, "UInt", 0, "UInt", pid, "UInt")
}

ReadMemFloat(ProcessHandle, MADDRESS) 
{
	if DllCall("ReadProcessMemory","UInt",ProcessHandle,"UInt",MADDRESS,"Float*",MVALUE,"UInt",4,"UInt*",0)!=0
	{
		return MVALUE
	}	
}

ReadMemUInt(ProcessHandle, MADDRESS) 
{ 
	if DllCall("ReadProcessMemory","UInt",ProcessHandle,"UInt",MADDRESS,"UInt*",MVALUE,"UInt",4,"UInt*",0)!=0
	{
		return MVALUE
	}	
}

ReadMemSInt(ProcessHandle, MADDRESS) 
{ 
	if DllCall("ReadProcessMemory","UInt",ProcessHandle,"UInt",MADDRESS,"Int*",MVALUE,"UInt",4,"UInt*",0)!=0
	{
		return MVALUE
	}	
}

WriteMemUInt(ProcessHandle, MADDRESS, val) 
{ 
	DllCall("WriteProcessMemory","UInt",ProcessHandle,"UInt",MADDRESS,"UInt*",val,"UInt",4,"UInt*",0)!=0
}

WriteMemSInt(ProcessHandle, MADDRESS, val) 
{ 
	DllCall("WriteProcessMemory","UInt",ProcessHandle,"UInt",MADDRESS,"Int*",val,"UInt",4,"UInt*",0)!=0
}

WriteMemFloat(ProcessHandle, MADDRESS, val) 
{ 
	DllCall("WriteProcessMemory","UInt",ProcessHandle,"UInt",MADDRESS,"Float*",val,"UInt",4,"UInt*",0)!=0
}

ReadMemStr(ProcessHandle, MADDRESS, maxlen=255, cp="cp0") 
{ 
	
	VarSetCapacity(MVALUE,maxlen)
	
	if DllCall("ReadProcessMemory","UInt",ProcessHandle,"UInt",MADDRESS,"PTR",&MVALUE,"UInt",maxlen,"UInt*",bytesread)!=0
	{
		Str:=StrGet(&MVALUE,cp)
		VarSetCapacity(MVALUE,0)
		return Str
	}
	
	VarSetCapacity(MVALUE,0)	
}

GetMultilevelPointer(ProcessHandle, PARRAY)
{		
	if PARRAY._MaxIndex()<2
		return
	
	if (DllCall("ReadProcessMemory","UInt",ProcessHandle,"UInt",PARRAY[1],"UInt*",currOffset,"UInt",4,"UInt*",0)!=0)	
	{

		i:=2
		while (i<=PARRAY._MaxIndex() && DllCall("ReadProcessMemory","UInt",ProcessHandle,"UInt",currOffset+PARRAY[i],"UInt*",currOffset,"UInt",4,"UInt*",0)!=0)
		{
			i:=i+1
		}
		
		if (i>PARRAY._MaxIndex())
		{
			return currOffset
		}
	}
}

AobScan(ProcessHandle,mBase,mSize, ByRef patternArray)
{
	if (patternArray._MaxIndex()>mSize)
	{
		MsgBox, aobscan fail : pattern array is larger than module size
		return
	}

	VarSetCapacity(ClientCodeSegment,mSize)
	
	if (DllCall("ReadProcessMemory","UInt",ProcessHandle,"UInt",mBase,"PTR",&ClientCodeSegment,"UInt",mSize,"UInt*",bytesread)!=0)
	{
		
		pLen:=patternArray._MaxIndex()		
		if (bytesread<>mSize)
		{
			VarSetCapacity(ClientCodeSegment,0)
			MsgBox, aobscan fail : mSize=%mSize%  bytesread=%bytesread%
			return
		}		
		i:=0
		
		while (i<=mSize-pLen-1)
		{
			j:=1
			while (j<=pLen)
			{
				if (patternArray[j]="?" || NumGet(ClientCodeSegment, i+j-1, "UChar")=patternArray[j])
				{
					j:=j+1
				}
				else
				{
					break
				}
			}
			
			if (j>pLen)
			{
				VarSetCapacity(ClientCodeSegment,0)
				return i
			}
			i:=i+1			
		}	
	}
	MsgBox, aobscan fail : pattern not found
	VarSetCapacity(ClientCodeSegment,0)
}

After a quick chat in the shout box, I figured I would toss this stuff in here, as they will be needed for the AHK script. Be sure to install AutoHotKey_L as Unicode 32 under the custom install option and run the Autoflask ahk as admin.

I will attach both spoiled codes already in ahk files as well just for ease.

VirusTotal for attachment

AHKLeap.zip

Share this post


Link to post
Share on other sites

So I set my RMB to Move Only, and the bot just keeps spamming the RMB on mobs like it is trying to attack. Am I missing something?

sounds like your skills config file is not set up properly. make sure your right click is set up 600 max range, and left click max range is 200 range

Share this post


Link to post
Share on other sites
ItsTHC    0

Are you living with just the 2% lifesteal from passives and flasks?

2% lifesteal is nothing. I have 8% lifesteal on my skill, 4% lifesteal on my character, another 7% lifesteal from a curse, etc. There's 19% lifesteal already and I have over 200 life regen.

Share this post


Link to post
Share on other sites

im allready running with similare setup of items and such. actually got even better items on my bot. and less IIQ right now cant go more IIQ cause i cant get the flask script thingy to work if someone could do a detailed guide on how to use the flask setup it would be very appriciated thanks in advance

Share this post


Link to post
Share on other sites
Malaki2030    0

When farming Merc City of Sarn how do you guys deal with the bear trapper?

I feel like he might shit all over my bot.

Edit* Just got to act 3 cruel on my level 47 leap slammer duelist, I feel like its hard for me to do atm. Even with 75 all resist. My life is 1500, 58% DR with grace up.

I started having mana problems with leap slam so i went to 4 link Leap Slam/BM/AddedFire/LifeonHit and I feel like I take to much damage now. Farming Chamber of Sins in A2 Cruel to hopefully get a few levels.

Any tips? I s my gear maybe not good enough?

Share this post


Link to post
Share on other sites

When farming Merc City of Sarn how do you guys deal with the bear trapper?

I feel like he might shit all over my bot.

Edit* Just got to act 3 cruel on my level 47 leap slammer duelist, I feel like its hard for me to do atm. Even with 75 all resist. My life is 1500, 58% DR with grace up.

I started having mana problems with leap slam so i went to 4 link Leap Slam/BM/AddedFire/LifeonHit and I feel like I take to much damage now. Farming Chamber of Sins in A2 Cruel to hopefully get a few levels.

Any tips? I s my gear maybe not good enough?

for city of sarn, you don't need resists. you should focus on life and armor. High armor is the best defense against perpetus. Life regen talents are really strong also, you should not need life on hit support gem, and instead use melee physical damage. killing faster = more survivability as well. Improving your gear though is the easiest thing to do to bot safely.

Share this post


Link to post
Share on other sites
Kylvan    0

I use that build with Bringer of Rain - it's AMAZING

Posted Image

No need high linked armor/weapon

Only IQ boots + IQ gloves + IQ belt

Posted Image

With the new passif tree ?

Share this post


Link to post
Share on other sites

Need an update of this guide because of the release please !

I just returned to the game after my bot died (refer to my older post), so I'm figuring out what I'm going to do with my new leapslammer. I think it should be generally similar, except for auras. Hatred now has a 60% mana cost, maybe we have to only use the defensive auras.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this