;============================================================ ;Auto initialisation, non-user configurable stuff usually ;============================================================ #NoEnv #SingleInstance, Force SendMode, Input SetBatchLines, -1 SetWorkingDir, %A_ScriptDir% ;============================================================ ;configurable stuff, remember that variables need to be global if you want to set them this far from the function ;============================================================ global sWindowString:="ahk_exe PathOfExile.exe" ;============================================================ ;Hotkeys ;============================================================ Numpad1:: ;your key of choice to fire this macro { BonesAndProfane() return } ;============================================================ ;Main process or loop ;============================================================ BonesAndProfane() { ;fire bones then fire the debuff SuperSend("f","both",1000,1200,,sWindowString) ;bones SuperSend("q","both",35,1200,,sWindowString) ;profane /* The one-line SuperSend function largely replaces the need to do a series of commends for key combos with ideal timing Here's is how I had previously written the above for just 2 skils; send {t down} rsleep(35) send {t up} rsleep(840) send {q down rsleep(50) send {q up} rsleep(1050) */ } ;============================================================ ;Functions and classes etc ;============================================================ SuperSend(key,direction,delay:=50,postdelay:=0,repetition:=1, winactiveString:=0) { ;A way to do more repeat sends when the application is flaky with just a single send. Don't go big on the repetitions. ;First three parameters must be enclosed in quotes "" ;The key is the key you want to send ;The direction should be "up" or "down" for partial keys, "both" for a regular down then up ;The following paramters are optinoal: ;Delay is how many ms between the up and the down, only applies to normal key presses ;postdelay is a delay that will occur after the key press. for "both" it occurs after the up, otherwise occurs after the part key press ;Reptition is how many loops, defaulting to 1 ;winactiveString is the string to pass to ifwinactive and can be the normal paramters acceptable by that function, e.g. "ahk_exe PathOfExile.exe" if delay<1 delay:=0 if (direction = "both") ;do this for normal key sends { sStringDown:=(key . " down") sStringUp:=(key . " up") Loop, %repetition% { Send {%sStringDown%} RSleep(delay) Send {%sStringUp%} if postdelay>0 { RSleep(postdelay) } } } else ;do this when you just want key up or key down, such when applications aren't handle single key down reliably. { sString:=(key . " " . direction) Loop, %repetition% { ifwinactive, %winactiveString% { Send {%sString%} if postdelay>0 { RSleep(postdelay) } } } } } RSleep(duration,variance:=10) { min:=duration max:=min+variance random,RND,min,max sleep %RND% }