Monday, June 15, 2009

Multi-Boxing World of Warcraft and Auto Hot Key

Wowza, has it been half an age since I last updated! Among all the other real-life emergencies, events, and activities going on in my days, something had to give and it was the Blog. And for that... I'm sorry!

Recently I've begun a Refer A Friend drive, where I have "referred" a friend to wow and we level toons together. In the spirit of that, I decided I wanted a few horde-side toons as well, so I took advantage of a 10-day trial period to give Multiboxing a shot. Whew, can it be tough! But it's FUN!

Right now I'm running around with a warrior, and a healbot druid tagging along behind her. To make this whole endeavor more simple on me (as well as to save time and frustration!), and minimize the amount of tabbing back and forth between wow applications, I downloaded a program called AutoHotKey (AHK), which allows you to send keystrokes to multiple applications on your machine.

Before you ask, yes this is PERFECTLY legal with Blizzard (as you can see here and here!), so don't worry, I'm not doing or advocating anything against blizzard policy!

The only problem I ran into when choosing to multibox was that I was struggling to control both toons, and downloading AHK managed to solve that... after doing quite a bit of research. You see, AHK doesn't come automatically equipped to handle your wow-playing, and you must then take the time to create a script pertaining to your wow applications that detailes what happens when you push each key! At long last, I found one on Elitist Jerks that worked nearly perfectly... except that it did not include an Alt+key command in the script.

Eventually, I figured out how to add in the alt commands, and so here I give you the perfect AutoHotKey World of Warcraft script for multi-boxing your toons!



;ClonesPush(strKeys)
;{
; global WowWinId1
; global WowWinId2
; global WowWinId3
; global WowWinId4
; global WowWinId5
; IfWinNotActive, ahk_id %WowWinId1%
; ControlSend, , %strKeys%, ahk_id %WowWinId1%
; IfWinNotActive, ahk_id %WowWinId2%
; ControlSend, , %strKeys%, ahk_id %WowWinId2%
; IfWinNotActive, ahk_id %WowWinId3%
; ControlSend, , %strKeys%, ahk_id %WowWinId3%
; IfWinNotActive, ahk_id %WowWinId4%
; ControlSend, , %strKeys%, ahk_id %WowWinId4%
; IfWinNotActive, ahk_id %WowWinId5%
; ControlSend, , %strKeys%, ahk_id %WowWinId5%
;}

;ClonesClick(strKeys)
;{
; IfWinNotActive, ahk_id %WowWinId1%
; ControlClick, , ahk_id %WowWinId1%,, %strKeys%,
; IfWinNotActive, ahk_id %WowWinId2%
; ControlClick, , ahk_id %WowWinId2%,, %strKeys%,
; IfWinNotActive, ahk_id %WowWinId3%
; ControlClick, , ahk_id %WowWinId3%,, %strKeys%,
; IfWinNotActive, ahk_id %WowWinId4%
; ControlClick, , ahk_id %WowWinId4%,, %strKeys%,
; IfWinNotActive, ahk_id %WowWinId5%
; ControlClick, , ahk_id %WowWinId5%,, %strKeys%,
;}

ClonesPush(keys) {

global WowWinId1
global WowWinId2
global WowWinId3
global WowWinId4
global WowWinId5

Loop, 5 {
win := WowWinId%A_Index%
IfWinNotActive, ahk_id %win%
ControlSend, , %keys%, ahk_id %win%
}

}

ClonesClick(button) {

global WowWinId1
global WowWinId2
global WowWinId3
global WowWinId4
global WowWinId5

Loop, 5 {
win := WowWinId%A_Index%
IfWinNotActive, ahk_id %win%
ControlClick, , ahk_id %win%, , %button%,
}

}

;Grab unique window ID's
WinGet, WowWinId, List, World of Warcraft

; *******************************
; *** Only if WoW is in focus ***
; *******************************
#IfWinActive, World of Warcraft

;*** Special Functions ***

; *** Makes clones follow main ***
^-::ClonesPush("{- down}{- up}")

; *** Makes clones assist main ***
^=::ClonesPush("{= down}{= up}")

; *** Makes clones jump with main ***
~Space::ClonesPush("{Space down}{Space up}")

; *** Suspends HotKeys while typing on main ***
~Enter::Suspend, Toggle
~/::Suspend, On
~Escape::Suspend, Off


; *******************
; *** Hotbars 1-0 ***
; *******************
; *** Hotbars 1-0 ***
~1::ClonesPush("{1 down}{1 up}")
~2::ClonesPush("{2 down}{2 up}")
~3::ClonesPush("{3 down}{3 up}")
~4::ClonesPush("{4 down}{4 up}")
~5::ClonesPush("{5 down}{5 up}")
~6::ClonesPush("{6 down}{6 up}")
~7::ClonesPush("{7 down}{7 up}")
~8::ClonesPush("{8 down}{8 up}")
~9::ClonesPush("{9 down}{9 up}")
~0::ClonesPush("{0 down}{0 up}")
~-::ClonesPush("{- down}{- up}")
~=::ClonesPush("{= down}{= up}")



; ***************************
; *** Hotbars Alt(!) 1-0 ***
; ***************************
~!1::ClonesPush("{Alt down}{1 down}{1 up}{Alt up}")
~!2::ClonesPush("{Alt down}{2 down}{2 up}{Alt up}")
~!3::ClonesPush("{Alt down}{3 down}{3 up}{Alt up}")
~!4::ClonesPush("{Alt down}{4 down}{4 up}{Alt up}")
~!5::ClonesPush("{Alt down}{5 down}{5 up}{Alt up}")
~!6::ClonesPush("{Alt down}{6 down}{6 up}{Alt up}")
~!7::ClonesPush("{Alt down}{7 down}{7 up}{Alt up}")
~!8::ClonesPush("{Alt down}{8 down}{8 up}{Alt up}")
~!9::ClonesPush("{Alt down}{9 down}{9 up}{Alt up}")
~!0::ClonesPush("{Alt down}{0 down}{0 up}{Alt up}")

; ***************************
; *** Hotbars SHIFT(+) 1-0 ***
; ***************************
~+1::ClonesPush("{Shift down}{1 down}{1 up}{Shift up}")
~+2::ClonesPush("{Shift down}{2 down}{2 up}{Shift up}")
~+3::ClonesPush("{Shift down}{3 down}{3 up}{Shift up}")
~+4::ClonesPush("{Shift down}{4 down}{4 up}{Shift up}")
~+5::ClonesPush("{Shift down}{5 down}{5 up}{Shift up}")
~+6::ClonesPush("{Shift down}{6 down}{6 up}{Shift up}")
~+7::ClonesPush("{Shift down}{7 down}{7 up}{Shift up}")
~+8::ClonesPush("{Shift down}{8 down}{8 up}{Shift up}")
~+9::ClonesPush("{Shift down}{9 down}{9 up}{Shift up}")
~+0::ClonesPush("{Shift down}{0 down}{0 up}{Shift up}")

; **************************
; *** Hotbars CTRL(^) 1-0 ***
; **************************
~^1::ClonesPush("{Ctrl down}{1 down}{1 up}{Ctrl up}")
~^2::ClonesPush("{Ctrl down}{2 down}{2 up}{Ctrl up}")
~^3::ClonesPush("{Ctrl down}{3 down}{3 up}{Ctrl up}")
~^4::ClonesPush("{Ctrl down}{4 down}{4 up}{Ctrl up}")
~^5::ClonesPush("{Ctrl down}{5 down}{5 up}{Ctrl up}")
~^6::ClonesPush("{Ctrl down}{6 down}{6 up}{Ctrl up}")
~^7::ClonesPush("{Ctrl down}{7 down}{7 up}{Ctrl up}")
~^8::ClonesPush("{Ctrl down}{8 down}{8 up}{Ctrl up}")
~^9::ClonesPush("{Ctrl down}{9 down}{9 up}{Ctrl up}")
~^0::ClonesPush("{Ctrl down}{0 down}{0 up}{Ctrl up}")

; *** Move clones ***
~Up::ClonesPush("{Up down}")
~Up Up::ClonesPush("{Up up}")
~Down::ClonesPush("{Down down}")
~Down Up::ClonesPush("{Down up}")
~Left::ClonesPush("{Left down}")
~Left Up::ClonesPush("{Left up}")
~Right::ClonesPush("{Right down}")
~Right Up::ClonesPush("{Right up}")

; Quest Turn ins
~[::ClonesPush("{[ down}{[ up}")
~]::ClonesPush("{] down}{] up}")

; Healing
~H::ClonesPush("{H down}{H up}")
~+H::ClonesPush("{Shift down}{H down}{H up}{Shift up}")

; Buff Weapon
~V::ClonesPush("{V down}{V up}")

; Totems
~F1::ClonesPush("{F1 down}{F1 up}")
~F2::ClonesPush("{F2 down}{F2 up}")
~F3::ClonesPush("{F3 down}{F3 up}")
~F4::ClonesPush("{F4 down}{F4 up}")

; Attacks
~t::ClonesPush("{t down}{t up}")

; Formation
~Delete::ClonesPush("{Delete down}{Delete up}")
; Misc
~\::ClonesPush("{\ down}{\ up}")

; Clicks
;~XButton2::ClonesClick("X2")
;~XButton1::ClonesClick("X1")
^x::ClonesClick("X2")
Voila! Enjoy, and feel free to ask if you have any questions!

No comments: