I've been tweaking my HKN scripts off and on for a couple years now, and I want to share them to other people. The unfortunate truth about the niche of multiboxing on a private server is there's not many people sharing their scripts on public forums. I hope to change that here. Please consider sharing the scripts you wrote with others here as well!
A note to beginners: Simply copy-pasting this code will more often than not result in issues. This isn't a tutorial. Instead, try to read the code and figure out what can be added to yours. Additionally, since HotKeyNet's website was taken down, I've been using the wayback machine to look at the reference page: http://web.archive.org/web/201707122...functions.html
First of all, I created a user-defined language in Notepad++ to better read HKN scripts. I recommend using mine or making your own, it makes it much more readable, and I use brackets {} to be able to fold my code for easier accessibility.
HotKeyNet language in Notepad++
Spoiler:Show
To use this, copy the code block and save it to a .xml file, then import it in Notepad++'s user-defined language import section.
Code:<NotepadPlus> <UserLang name="HotKeyNet" ext="" udlVersion="2.1"> <Settings> <Global caseIgnored="no" allowFoldOfComments="no" foldCompact="no" forcePureLC="0" decimalSeparator="0" /> <Prefix Keywords1="no" Keywords2="no" Keywords3="no" Keywords4="no" Keywords5="no" Keywords6="no" Keywords7="no" Keywords8="no" /> </Settings> <KeywordLists> <Keywords name="Comments">00// 01 02 03 04</Keywords> <Keywords name="Numbers, prefix1"></Keywords> <Keywords name="Numbers, prefix2"></Keywords> <Keywords name="Numbers, extras1"></Keywords> <Keywords name="Numbers, extras2"></Keywords> <Keywords name="Numbers, suffix1"></Keywords> <Keywords name="Numbers, suffix2"></Keywords> <Keywords name="Numbers, range"></Keywords> <Keywords name="Operators1">< > "</Keywords> <Keywords name="Operators2"></Keywords> <Keywords name="Folders in code1, open">{</Keywords> <Keywords name="Folders in code1, middle"></Keywords> <Keywords name="Folders in code1, close">}</Keywords> <Keywords name="Folders in code2, open"></Keywords> <Keywords name="Folders in code2, middle"></Keywords> <Keywords name="Folders in code2, close"></Keywords> <Keywords name="Folders in comment, open">{</Keywords> <Keywords name="Folders in comment, middle"></Keywords> <Keywords name="Folders in comment, close">}</Keywords> <Keywords name="Keywords1">Passthrough
ApplyTemplate
HotKey
HotKeyDown
HotKeyUp
DoHotKey
MovementHotKey
Toggle
Template
EndTemplate
If
Else
Label
Local
Text
SendWinM
SendPC
Key
Wait
Command
SendLabel
Is
SetVar
SetButtonText
SetButtonColors
SetButtonHotkey
SetForegroundWin
SetWinRect
SetActiveWin
SendFocusWin
RenameTargetWin
SetButtonHotKey
AddButtonToPanel
CreatePictureButton
CreateColoredButton
AlwaysOnTop
TargetWin
CreatePanel
SetWinPos
TargetButton
SetPanelStyle
SetWinOpacity
CloseWin
EndIf
SetPanelLayout</Keywords> <Keywords name="Keywords2">ActiveWinIs
ScrollLockOn
ScrollLockOff
NumLockOn
NumLockOff
CapsLockOn
CapsLockOff
Shift
Ctrl
Alt
LShift
LCtrl
LAlt
RShift
RCtrl
RAlt</Keywords> <Keywords name="Keywords3">%1%
%2%
%3%
%4%
%5%
%6%</Keywords> <Keywords name="Keywords4"></Keywords> <Keywords name="Keywords5"></Keywords> <Keywords name="Keywords6"></Keywords> <Keywords name="Keywords7"></Keywords> <Keywords name="Keywords8"></Keywords> <Keywords name="Delimiters">00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23</Keywords> </KeywordLists> <Styles> <WordsStyle name="DEFAULT" fgColor="000000" bgColor="FFFFFF" fontStyle="0" nesting="0" /> <WordsStyle name="COMMENTS" fgColor="000000" bgColor="FFFFFF" fontStyle="0" nesting="0" /> <WordsStyle name="LINE COMMENTS" fgColor="8000FF" bgColor="FFFFFF" fontStyle="0" nesting="0" /> <WordsStyle name="NUMBERS" fgColor="000000" bgColor="FFFFFF" fontStyle="0" nesting="0" /> <WordsStyle name="KEYWORDS1" fgColor="DD0000" bgColor="FFFFFF" fontStyle="0" nesting="0" /> <WordsStyle name="KEYWORDS2" fgColor="00FFFF" bgColor="FFFFFF" fontStyle="0" nesting="0" /> <WordsStyle name="KEYWORDS3" fgColor="800000" bgColor="FFFFFF" fontStyle="0" nesting="0" /> <WordsStyle name="KEYWORDS4" fgColor="000000" bgColor="FFFFFF" fontStyle="0" nesting="0" /> <WordsStyle name="KEYWORDS5" fgColor="000000" bgColor="FFFFFF" fontStyle="0" nesting="0" /> <WordsStyle name="KEYWORDS6" fgColor="000000" bgColor="FFFFFF" fontStyle="0" nesting="0" /> <WordsStyle name="KEYWORDS7" fgColor="000000" bgColor="FFFFFF" fontStyle="0" nesting="0" /> <WordsStyle name="KEYWORDS8" fgColor="000000" bgColor="FFFFFF" fontStyle="0" nesting="0" /> <WordsStyle name="OPERATORS" fgColor="00FF40" bgColor="FFFFFF" fontStyle="0" nesting="0" /> <WordsStyle name="FOLDER IN CODE1" fgColor="000000" bgColor="FFFFFF" fontStyle="0" nesting="0" /> <WordsStyle name="FOLDER IN CODE2" fgColor="000000" bgColor="FFFFFF" fontStyle="0" nesting="0" /> <WordsStyle name="FOLDER IN COMMENT" fgColor="FF0000" bgColor="FFFFFF" fontStyle="0" nesting="0" /> <WordsStyle name="DELIMITERS1" fgColor="00FF00" bgColor="FFFFFF" fontStyle="0" nesting="0" /> <WordsStyle name="DELIMITERS2" fgColor="000000" bgColor="FFFFFF" fontStyle="0" nesting="0" /> <WordsStyle name="DELIMITERS3" fgColor="000000" bgColor="FFFFFF" fontStyle="0" nesting="0" /> <WordsStyle name="DELIMITERS4" fgColor="000000" bgColor="FFFFFF" fontStyle="0" nesting="0" /> <WordsStyle name="DELIMITERS5" fgColor="000000" bgColor="FFFFFF" fontStyle="0" nesting="0" /> <WordsStyle name="DELIMITERS6" fgColor="000000" bgColor="FFFFFF" fontStyle="0" nesting="0" /> <WordsStyle name="DELIMITERS7" fgColor="000000" bgColor="FFFFFF" fontStyle="0" nesting="0" /> <WordsStyle name="DELIMITERS8" fgColor="000000" bgColor="FFFFFF" fontStyle="0" nesting="0" /> </Styles> </UserLang> </NotepadPlus>
Before getting into the scripts themselves, please be aware that ALL of my keybinds require Scroll Lock to be On. This is effectively a toggle for all hotkeys. If Scroll Lock is On, the hotkeys work. If it is off, they do nothing.
Opening sequence:
Spoiler:Show
I use this for the following: Choosing the characters I am wanting to play, Opening the WoW windows themselves, and logging in to each account.
To start, I have HKN open a panel with the buttons for every character I use. Currently, I have 14 characters. I have my characters identified by class and spec. Note that the launch sequence is designed to only work one time. If it needs to be done more than once, the script must be reset. The code looks like this:
I'll decode each part in order. When pressing CTRL+Alt+L, a panel is created and 18 total buttons are mode which fill them. The buttons are hard-coded to be placed in a specific spot inside the panel. Each character's variable is also set to "0" and all buttons start in the red "off" state. This will be important later.Code://Launch Buttons { //Launch Buttons Panel { <HotKey ScrollLockOn Alt Ctrl L> //Bring up Launch Window (Only works once per reset) { <CreatePanel LaunchButtons 800 400 616 439> <TargetWin LaunchButtons> <AlwaysOnTop on> <CreateColoredButton Launch 0 0 600 100 0x000000 0xffffff "Launch Games"> <AddButtonToPanel Launch LaunchButtons 0 300> <SetButtonHotKey Launch HotKey CapsLockOn Final> //} //Team One { <CreateColoredButton TeamOne 0 0 100 100 0xcc0000 0xffffff "Team One"> <AddButtonToPanel TeamOne LaunchButtons 0 0> <SetButtonHotKey TeamOne HotKey CapsLockOn LCtrl LShift LAlt RCtrl RShift RAlt Final> <CreateColoredButton PaladinProtection 0 0 100 100 0xcc0000 0xffffff "PaladinProtection"> <AddButtonToPanel PaladinProtection LaunchButtons 100 0> <SetButtonHotKey PaladinProtection HotKey CapsLockOn LCtrl Final> <SetVar PaladinProtection 0> <CreateColoredButton MageArcane 0 0 100 100 0xcc0000 0xffffff "MageArcane"> <AddButtonToPanel MageArcane LaunchButtons 200 0> <SetButtonHotKey MageArcane HotKey CapsLockOn LCtrl LShift Final> <SetVar MageArcane 0> <CreateColoredButton DeathKnightFrost 0 0 100 100 0xcc0000 0xffffff "DeathKnightFrost"> <AddButtonToPanel DeathKnightFrost LaunchButtons 300 0> <SetButtonHotKey DeathKnightFrost HotKey CapsLockOn LCtrl LShift LAlt Final> <SetVar DeathKnightFrost 0> <CreateColoredButton WarlockDemonology 0 0 100 100 0xcc0000 0xffffff "WarlockDemonology"> <AddButtonToPanel WarlockDemonology LaunchButtons 400 0> <SetButtonHotKey WarlockDemonology HotKey CapsLockOn LCtrl LShift LAlt RCtrl Final> <SetVar WarlockDemonology 0> <CreateColoredButton PaladinHoly 0 0 100 100 0xcc0000 0xffffff "PaladinHoly"> <AddButtonToPanel PaladinHoly LaunchButtons 500 0> <SetButtonHotKey PaladinHoly HotKey CapsLockOn LCtrl LShift LAlt RCtrl RShift Final> <SetVar PaladinHoly 0> //} //Team Two { <CreateColoredButton TeamTwo 0 0 100 100 0xcc0000 0xffffff "Team Two"> <AddButtonToPanel TeamTwo LaunchButtons 0 100> <SetButtonHotKey TeamTwo HotKey CapsLockOn LCtrl LShift LAlt RShift Final> <CreateColoredButton DruidFeral 0 0 100 100 0xcc0000 0xffffff "DruidFeral"> <AddButtonToPanel DruidFeral LaunchButtons 100 100> <SetButtonHotKey DruidFeral HotKey CapsLockOn LCtrl LShift LAlt RShift RAlt Final> <SetVar DruidFeral 0> <CreateColoredButton DruidBalance1 0 0 100 100 0xcc0000 0xffffff "DruidBalance1"> <AddButtonToPanel DruidBalance1 LaunchButtons 200 100> <SetButtonHotKey DruidBalance1 HotKey CapsLockOn LCtrl LShift RCtrl Final> <SetVar DruidBalance1 0> <CreateColoredButton DruidBalance2 0 0 100 100 0xcc0000 0xffffff "DruidBalance2"> <AddButtonToPanel DruidBalance2 LaunchButtons 300 100> <SetButtonHotKey DruidBalance2 HotKey CapsLockOn LCtrl LShift RCtrl RShift Final> <SetVar DruidBalance2 0> <CreateColoredButton DruidBalance3 0 0 100 100 0xcc0000 0xffffff "DruidBalance3"> <AddButtonToPanel DruidBalance3 LaunchButtons 400 100> <SetButtonHotKey DruidBalance3 HotKey CapsLockOn LCtrl LShift RCtrl RShift RAlt Final> <SetVar DruidBalance3 0> <CreateColoredButton DruidRestoration 0 0 100 100 0xcc0000 0xffffff "DruidRestoration"> <AddButtonToPanel DruidRestoration LaunchButtons 500 100> <SetButtonHotKey DruidRestoration HotKey CapsLockOn LCtrl LShift RCtrl RAlt Final> <SetVar DruidRestoration 0> //} //Team Three { <CreateColoredButton TeamThree 0 0 100 100 0xcc0000 0xffffff "TeamThree"> <AddButtonToPanel TeamThree LaunchButtons 0 200> <SetButtonHotKey TeamThree HotKey CapsLockOn LCtrl LAlt Final> <CreateColoredButton WarriorProtection 0 0 100 100 0xcc0000 0xffffff "WarriorProtection"> <AddButtonToPanel WarriorProtection LaunchButtons 100 200> <SetButtonHotKey WarriorProtection HotKey CapsLockOn LCtrl LAlt RCtrl Final> <SetVar WarriorProtection 0> <CreateColoredButton HunterMarksman1 0 0 100 100 0xcc0000 0xffffff "HunterMarksman1"> <AddButtonToPanel HunterMarksman1 LaunchButtons 200 200> <SetButtonHotKey HunterMarksman1 HotKey CapsLockOn LCtrl LAlt RCtrl RShift Final> <SetVar HunterMarksman1 0> <CreateColoredButton HunterMarksman2 0 0 100 100 0xcc0000 0xffffff "HunterMarksman2"> <AddButtonToPanel HunterMarksman2 LaunchButtons 300 200> <SetButtonHotKey HunterMarksman2 HotKey CapsLockOn LCtrl LAlt RCtrl RShift RAlt Final> <SetVar HunterMarksman2 0> <CreateColoredButton HunterMarksman3 0 0 100 100 0xcc0000 0xffffff "HunterMarksman3"> <AddButtonToPanel HunterMarksman3 LaunchButtons 400 200> <SetButtonHotKey HunterMarksman3 HotKey CapsLockOn LCtrl LAlt RCtrl RAlt Final> <SetVar HunterMarksman3 0> //} //} <HotKey CapsLockOn Final> //Launch Button { <TargetWin LaunchButtons> <CloseWin> <If PaladinProtection Is 1> <ApplyTemplate Launch PaladinProtection> <ApplyTemplate Login PaladinProtection Username> <EndIf> <If MageArcane Is 1> <ApplyTemplate Launch MageArcane> <ApplyTemplate Login MageArcane Username> <EndIf> <If DeathKnightFrost Is 1> <ApplyTemplate Launch DeathKnightFrost> <ApplyTemplate Login DeathKnightFrost Username> <EndIf> <If WarlockDemonology Is 1> <ApplyTemplate Launch WarlockDemonology> <ApplyTemplate Login WarlockDemonology Username> <EndIf> <If PaladinHoly Is 1> <ApplyTemplate Launch PaladinHoly> <ApplyTemplate Login PaladinHoly Username> <EndIf> <If DruidFeral Is 1> <ApplyTemplate Launch DruidFeral> <ApplyTemplate Login DruidFeral Username> <EndIf> <If DruidBalance1 Is 1> <ApplyTemplate Launch DruidBalance1> <ApplyTemplate Login DruidBalance1 Username> <EndIf> <If DruidBalance2 Is 1> <ApplyTemplate Launch DruidBalance2> <ApplyTemplate Login DruidBalance2 Username> <EndIf> <If DruidBalance3 Is 1> <ApplyTemplate Launch DruidBalance3> <ApplyTemplate Login DruidBalance3 Username> <EndIf> <If DruidRestoration Is 1> <ApplyTemplate Launch DruidRestoration> <ApplyTemplate Login DruidRestoration Username> <EndIf> <If WarriorProtection Is 1> <ApplyTemplate Launch WarriorProtection> <ApplyTemplate Login WarriorProtection Username> <EndIf> <If HunterMarksman1 Is 1> <ApplyTemplate Launch HunterMarksman1> <ApplyTemplate Login HunterMarksman1 Username> <EndIf> <If HunterMarksman2 Is 1> <ApplyTemplate Launch HunterMarksman2> <ApplyTemplate Login HunterMarksman2 Username> <EndIf> <If HunterMarksman3 Is 1> <ApplyTemplate Launch HunterMarksman3> <ApplyTemplate Login HunterMarksman3 Username> <EndIf>
Each of these buttons do a single thing when clicked, they call to a virtual hotkey. The reason the hotkey is virtual is I did not ever want these hotkeys to be called outside of these buttons being clicked.
With only this part of the code, the only button that has a command is the black "launch" button at the bottom (which we will get to later).
Here is the rest of the button commands:
Here are two different kind of buttons. One kind are the "team" buttons, the other kind are individual character buttons. The individual ones set the variable to 1, and change the button to green signifying that they are active. Clicking them again will set them back to 0 and deactivate them. The team buttons simply turn all characters on that team on, then off.Code:<HotKey CapsLockOn LCtrl LShift LAlt RCtrl RShift RAlt Final> //Toggle for Team One { <SetButtonColors TeamOne 0x009900 0xffffff> <If PaladinProtection Is 0> <DoHotKey HotKey CapsLockOn LCtrl Final> <EndIf> <If MageArcane Is 0> <DoHotKey HotKey CapsLockOn LCtrl LShift Final> <EndIf> <If DeathKnightFrost Is 0> <DoHotKey HotKey CapsLockOn LCtrl LShift LAlt Final> <EndIf> <If WarlockDemonology Is 0> <DoHotKey HotKey CapsLockOn LCtrl LShift LAlt RCtrl Final> <EndIf> <If PaladinHoly Is 0> <DoHotKey HotKey CapsLockOn LCtrl LShift LAlt RCtrl RShift Final> <EndIf> <Toggle> <SetButtonColors TeamOne 0xcc0000 0xffffff> <If PaladinProtection Is 1> <DoHotKey HotKey CapsLockOn LCtrl Final> <EndIf> <If MageArcane Is 1> <DoHotKey HotKey CapsLockOn LCtrl LShift Final> <EndIf> <If DeathKnightFrost Is 1> <DoHotKey HotKey CapsLockOn LCtrl LShift LAlt Final> <EndIf> <If WarlockDemonology Is 1> <DoHotKey HotKey CapsLockOn LCtrl LShift LAlt RCtrl Final> <EndIf> <If PaladinHoly Is 1> <DoHotKey HotKey CapsLockOn LCtrl LShift LAlt RCtrl RShift Final> <EndIf>//} <HotKey CapsLockOn LCtrl Final> //Team One Individual buttons { <SetVar PaladinProtection 1> <SetButtonColors PaladinProtection 0x009900 0xffffff> <Toggle> <SetVar PaladinProtection 0> <SetButtonColors PaladinProtection 0xcc0000 0xffffff> <HotKey CapsLockOn LCtrl LShift Final> <SetVar MageArcane 1> <SetButtonColors MageArcane 0x009900 0xffffff> <Toggle> <SetVar MageArcane 0> <SetButtonColors MageArcane 0xcc0000 0xffffff> <HotKey CapsLockOn LCtrl LShift LAlt Final> <SetVar DeathKnightFrost 1> <SetButtonColors DeathKnightFrost 0x009900 0xffffff> <Toggle> <SetVar DeathKnightFrost 0> <SetButtonColors DeathKnightFrost 0xcc0000 0xffffff> <HotKey CapsLockOn LCtrl LShift LAlt RCtrl Final> <SetVar WarlockDemonology 1> <SetButtonColors WarlockDemonology 0x009900 0xffffff> <Toggle> <SetVar WarlockDemonology 0> <SetButtonColors WarlockDemonology 0xcc0000 0xffffff> <HotKey CapsLockOn LCtrl LShift LAlt RCtrl RShift Final> <SetVar PaladinHoly 1> <SetButtonColors PaladinHoly 0x009900 0xffffff> <Toggle> <SetVar PaladinHoly 0> <SetButtonColors PaladinHoly 0xcc0000 0xffffff> //} <HotKey CapsLockOn LCtrl LShift LAlt RShift Final> //Toggle for Team Two { <SetButtonColors TeamTwo 0x009900 0xffffff> <If DruidFeral Is 0> <DoHotKey HotKey CapsLockOn LCtrl LShift LAlt RShift RAlt Final> <EndIf> <If DruidBalance1 Is 0> <DoHotKey HotKey CapsLockOn LCtrl LShift RCtrl Final> <EndIf> <If DruidBalance2 Is 0> <DoHotKey HotKey CapsLockOn LCtrl LShift RCtrl RShift Final> <EndIf> <If DruidBalance3 Is 0> <DoHotKey HotKey CapsLockOn LCtrl LShift RCtrl RShift RAlt Final> <EndIf> <If DruidRestoration Is 0> <DoHotKey HotKey CapsLockOn LCtrl LShift RCtrl RAlt Final> <EndIf> <Toggle> <SetButtonColors TeamTwo 0xcc0000 0xffffff> <If DruidFeral Is 1> <DoHotKey HotKey CapsLockOn LCtrl LShift LAlt RShift RAlt Final> <EndIf> <If DruidBalance1 Is 1> <DoHotKey HotKey CapsLockOn LCtrl LShift RCtrl Final> <EndIf> <If DruidBalance2 Is 1> <DoHotKey HotKey CapsLockOn LCtrl LShift RCtrl RShift Final> <EndIf> <If DruidBalance3 Is 1> <DoHotKey HotKey CapsLockOn LCtrl LShift RCtrl RShift RAlt Final> <EndIf> <If DruidRestoration Is 1> <DoHotKey HotKey CapsLockOn LCtrl LShift RCtrl RAlt Final> <EndIf> //} <HotKey CapsLockOn LCtrl LShift LAlt RShift RAlt Final> //Team Two Individual buttons { <SetVar DruidFeral 1> <SetButtonColors DruidFeral 0x009900 0xffffff> <Toggle> <SetVar DruidFeral 0> <SetButtonColors DruidFeral 0xcc0000 0xffffff> <HotKey CapsLockOn LCtrl LShift RCtrl Final> <SetVar DruidBalance1 1> <SetButtonColors DruidBalance1 0x009900 0xffffff> <Toggle> <SetVar DruidBalance1 0> <SetButtonColors DruidBalance1 0xcc0000 0xffffff> <HotKey CapsLockOn LCtrl LShift RCtrl RShift Final> <SetVar DruidBalance2 1> <SetButtonColors DruidBalance2 0x009900 0xffffff> <Toggle> <SetVar DruidBalance2 0> <SetButtonColors DruidBalance2 0xcc0000 0xffffff> <HotKey CapsLockOn LCtrl LShift RCtrl RShift RAlt Final> <SetVar DruidBalance3 1> <SetButtonColors DruidBalance3 0x009900 0xffffff> <Toggle> <SetVar DruidBalance3 0> <SetButtonColors DruidBalance3 0xcc0000 0xffffff> <HotKey CapsLockOn LCtrl LShift RCtrl RAlt Final> <SetVar DruidRestoration 1> <SetButtonColors DruidRestoration 0x009900 0xffffff> <Toggle> <SetVar DruidRestoration 0> <SetButtonColors DruidRestoration 0xcc0000 0xffffff> //} <HotKey CapsLockOn LCtrl LAlt Final> //Toggle for Team Three { <SetButtonColors TeamThree 0x009900 0xffffff> <If WarriorProtection Is 0> <DoHotKey HotKey CapsLockOn LCtrl LAlt RCtrl Final> <EndIf> <If HunterMarksman1 Is 0> <DoHotKey HotKey CapsLockOn LCtrl LAlt RCtrl RShift Final> <EndIf> <If HunterMarksman2 Is 0> <DoHotKey HotKey CapsLockOn LCtrl LAlt RCtrl RShift RAlt Final> <EndIf> <If HunterMarksman3 Is 0> <DoHotKey HotKey CapsLockOn LCtrl LAlt RCtrl RAlt Final> <EndIf> <Toggle> <SetButtonColors TeamThree 0xcc0000 0xffffff> <If WarriorProtection Is 1> <DoHotKey HotKey CapsLockOn LCtrl LAlt RCtrl Final> <EndIf> <If HunterMarksman1 Is 1> <DoHotKey HotKey CapsLockOn LCtrl LAlt RCtrl RShift Final> <EndIf> <If HunterMarksman2 Is 1> <DoHotKey HotKey CapsLockOn LCtrl LAlt RCtrl RShift RAlt Final> <EndIf> <If HunterMarksman3 Is 1> <DoHotKey HotKey CapsLockOn LCtrl LAlt RCtrl RAlt Final> <EndIf> //} <HotKey CapsLockOn LCtrl LAlt RCtrl Final> //Team Three Individual buttons { <SetVar WarriorProtection 1> <SetButtonColors WarriorProtection 0x009900 0xffffff> <Toggle> <SetVar WarriorProtection 0> <SetButtonColors WarriorProtection 0xcc0000 0xffffff> <HotKey CapsLockOn LCtrl LAlt RCtrl RShift Final> <SetVar HunterMarksman1 1> <SetButtonColors HunterMarksman1 0x009900 0xffffff> <Toggle> <SetVar HunterMarksman1 0> <SetButtonColors HunterMarksman1 0xcc0000 0xffffff> <HotKey CapsLockOn LCtrl LAlt RCtrl RShift RAlt Final> <SetVar HunterMarksman2 1> <SetButtonColors HunterMarksman2 0x009900 0xffffff> <Toggle> <SetVar HunterMarksman2 0> <SetButtonColors HunterMarksman2 0xcc0000 0xffffff> <HotKey CapsLockOn LCtrl LAlt RCtrl RAlt Final> <SetVar HunterMarksman3 1> <SetButtonColors HunterMarksman3 0x009900 0xffffff> <Toggle> <SetVar HunterMarksman3 0> <SetButtonColors HunterMarksman3 0xcc0000 0xffffff> //}
Once I have selected what characters to use, I click the launch button. It checks every character variable individually and calls to my launch and login templates. They are both very sleek and flawlessly log me in every time, no matter how many characters I am using.
The launch sequence calls to both of these for each account. It starts by launching the window, then HKN waits for the window to be completely open before moving on to the login template. I have it wait another half second just in case it needs it (it will need it for more than 3 windows, in my experience). Then it types the username, password, and logs in. Note the "RenameTargetWin" command in the Launch template. Every window matches the character's ID that I gave them. This is very important and is very useful for identifying the windows individually. I see most beginner scripts use "WoW1, WoW2, etc." Don't do that.Code:// Open WoW Windows Template { // %1%: Window Name <Template Launch> <SendPC Local> <Run "D:Wrath of the Lich KingWoW.exe"> <RenameTargetWin %1%> <EndTemplate> //} //Login { // %1%: Window Name // %2%: Username <Template Login> <Wait 500> <SendWinM %1%> <Wait 50> <Text %2%> <Wait 100> <Key Tab> <Wait 50> <Text password> <Wait 100> <Key Enter> <EndTemplate> //}
Window Resizing
Spoiler:Show
HotKeyNet is very bad at having a dynamic amount of characters for window management. There's two programs that are much better at it than HKN that are free, WoW Open Box, and AutoHotKey. Note that WoW Open Box will also rename your windows, and that is why I do not use it. AutoHotKey can also be used for botting, so I ONLY use it for window management and it provides no in-game automation whatsoever.
Here is the AHK script I wrote:
;ListLines
#SingleInstance, Force
WinGet, WoWWindows, List, ahk_exe WoW.exe
CoordMode, ToolTip, Screen
Tooltip "Getting Data"
TotalResx := 2560
TotalResy := 1400
If (WoWWindows = 2)
{
}
If (WoWWindows = 3)
{
PrimaryWidth := 1800
PrimaryHeight := TotalResy
SecondaryWidth := (TotalResx-PrimaryWidth)
SecondaryHeight := (PrimaryHeight/2)
WoW1x := PrimaryWidth
WoW1y := 0
WoW2x := PrimaryWidth
WoW2y := SecondaryHeight
}
If (WoWWindows = 4)
{
PrimaryWidth := 1900
PrimaryHeight := TotalResy
SecondaryWidth := (TotalResx-PrimaryWidth)
SecondaryHeight := (PrimaryHeight/3)
WoW1x := PrimaryWidth
WoW1y := 0
WoW2x := PrimaryWidth
WoW2y := SecondaryHeight
WoW3x := PrimaryWidth
WoW3y := (SecondaryHeight*2)
}
If (WoWWindows = 5)
{
PrimaryWidth := 2000
PrimaryHeight := TotalResy
SecondaryWidth := (TotalResx-PrimaryWidth)
SecondaryHeight := (PrimaryHeight/4)
WoW1x := PrimaryWidth
WoW1y := 0
WoW2x := PrimaryWidth
WoW2y := SecondaryHeight
WoW3x := PrimaryWidth
WoW3y := (SecondaryHeight*2)
WoW4x := PrimaryWidth
WoW4y := (SecondaryHeight*3)
}
If (WoWWindows = 6)
{
PrimaryWidth := 2000
PrimaryHeight := TotalResy
SecondaryWidth := (TotalResx-PrimaryWidth)
SecondaryHeight := (PrimaryHeight/5)
WoW1x := PrimaryWidth
WoW1y := 0
WoW2x := PrimaryWidth
WoW2y := SecondaryHeight
WoW3x := PrimaryWidth
WoW3y := (SecondaryHeight*2)
WoW4x := PrimaryWidth
WoW4y := (SecondaryHeight*3)
WoW5x := PrimaryWidth
WoW5y := (SecondaryHeight*4)
}
If (WoWWindows = 7)
{
PrimaryWidth := (TotalResx*(2/3))
PrimaryHeight := (TotalResy*(2/3))
SecondaryWidth := (TotalResx/3)
SecondaryHeight := (PrimaryHeight/2)
WoW1x := PrimaryWidth
WoW1y := 0
WoW2x := PrimaryWidth
WoW2y := SecondaryHeight
WoW3x := 0
WoW3y := PrimaryHeight
WoW4x := SecondaryWidth
WoW4y := PrimaryHeight
WoW5x := (SecondaryWidth*2)
WoW5y := PrimaryHeight
WoW6x := (SecondaryWidth*3)
WoW6y := (SecondaryHeight*2)
}
If (WoWWindows = 8)
{
PrimaryWidth := (TotalResx*(2/3))
PrimaryHeight := (TotalResy*(2/3))
SecondaryWidth := (TotalResx/3)
SecondaryHeight := (PrimaryHeight/2)
WoW1x := PrimaryWidth
WoW1y := 0
WoW2x := PrimaryWidth
WoW2y := SecondaryHeight
WoW3x := PrimaryWidth
WoW3y := (SecondaryHeight*2)
WoW4x := 0
WoW4y := PrimaryHeight
WoW5x := SecondaryWidth
WoW5y := PrimaryHeight
WoW6x := (SecondaryWidth*2)
WoW6y := PrimaryHeight
WoW7x := (SecondaryWidth*3)
WoW7y := (SecondaryHeight*2)
}
If (WoWWindows = 9)
{
PrimaryWidth := (TotalResx*(3/4))
PrimaryHeight := (TotalResy*(3/4))
SecondaryWidth := (TotalResx/4)
SecondaryHeight := (PrimaryHeight/3)
WoW1x := PrimaryWidth
WoW1y := 0
WoW2x := PrimaryWidth
WoW2y := SecondaryHeight
WoW3x := PrimaryWidth
WoW3y := (SecondaryHeight*2)
WoW4x := 0
WoW4y := PrimaryHeight
WoW5x := SecondaryWidth
WoW5y := PrimaryHeight
WoW6x := (SecondaryWidth*2)
WoW6y := PrimaryHeight
WoW7x := (SecondaryWidth*3)
WoW7y := PrimaryHeight
WoW8x := (SecondaryWidth*4)
WoW8y := PrimaryHeight
}
If (WoWWindows = 10)
{
PrimaryWidth := (TotalResx*(4/5))
PrimaryHeight := (TotalResy*(4/5))
SecondaryWidth := (TotalResx/5)
SecondaryHeight := (PrimaryHeight/4)
WoW1x := PrimaryWidth
WoW1y := 0
WoW2x := PrimaryWidth
WoW2y := SecondaryHeight
WoW3x := PrimaryWidth
WoW3y := (SecondaryHeight*2)
WoW4x := PrimaryWidth
WoW4y := (SecondaryHeight*3)
WoW5x := 0
WoW5y := PrimaryHeight
WoW6x := SecondaryWidth
WoW6y := PrimaryHeight
WoW7x := (SecondaryWidth*2)
WoW7y := PrimaryHeight
WoW8x := (SecondaryWidth*3)
WoW8y := PrimaryHeight
WoW9x := (SecondaryWidth*4)
WoW9y := PrimaryHeight
}
If (WoWWindows = 14)
{
PrimaryWidth := (TotalResx*(6/7))
PrimaryHeight := (TotalResy*(6/7))
SecondaryWidth := (TotalResx/7)
SecondaryHeight := (PrimaryHeight/6)
WoW1x := PrimaryWidth
WoW1y := 0
WoW2x := PrimaryWidth
WoW2y := SecondaryHeight
WoW3x := PrimaryWidth
WoW3y := (SecondaryHeight*2)
WoW4x := PrimaryWidth
WoW4y := (SecondaryHeight*3)
WoW5x := PrimaryWidth
WoW5y := (SecondaryHeight*4)
WoW6x := PrimaryWidth
WoW6y := (SecondaryHeight*5)
WoW7x := 0
WoW7y := PrimaryHeight
WoW8x := SecondaryWidth
WoW8y := PrimaryHeight
WoW9x := (SecondaryWidth*2)
WoW9y := PrimaryHeight
WoW10x := (SecondaryWidth*3)
WoW10y := PrimaryHeight
WoW11x := (SecondaryWidth*4)
WoW11y := PrimaryHeight
WoW12x := (SecondaryWidth*5)
WoW12y := PrimaryHeight
WoW13x := (SecondaryWidth*6)
WoW13y := PrimaryHeight
}
Tooltip "Moving Screens", 500, 500
WinMove, ahk_id %WoWWindows1%,, 0, 0, %PrimaryWidth%, %PrimaryHeight%
WinMove, ahk_id %WoWWindows2%,, %WoW1x%, %WoW1y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows3%,, %WoW2x%, %WoW2y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows4%,, %WoW3x%, %WoW3y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows5%,, %WoW4x%, %WoW4y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows6%,, %WoW5x%, %WoW5y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows7%,, %WoW6x%, %WoW6y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows8%,, %WoW7x%, %WoW7y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows9%,, %WoW8x%, %WoW8y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows10%,, %WoW9x%, %WoW9y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows11%,, %WoW10x%, %WoW10y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows12%,, %WoW11x%, %WoW11y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows13%,, %WoW12x%, %WoW12y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows14%,, %WoW13x%, %WoW13y%, %SecondaryWidth%, %SecondaryHeight%
PrimaryWindow := WoWWindows1
GoSub BringToFront
Tooltip
Return
BringToFront:
WinActivate, ahk_id %WoWWindows14%
WinActivate, ahk_id %WoWWindows13%
WinActivate, ahk_id %WoWWindows12%
WinActivate, ahk_id %WoWWindows11%
WinActivate, ahk_id %WoWWindows10%
WinActivate, ahk_id %WoWWindows9%
WinActivate, ahk_id %WoWWindows8%
WinActivate, ahk_id %WoWWindows7%
WinActivate, ahk_id %WoWWindows6%
WinActivate, ahk_id %WoWWindows5%
WinActivate, ahk_id %WoWWindows4%
WinActivate, ahk_id %WoWWindows3%
WinActivate, ahk_id %WoWWindows2%
WinActivate, ahk_id %WoWWindows1%
Winactivate, ahk_id %PrimaryWindow%
return
~1::
ScrollLock := GetKeyState("ScrollLock", "T")
If ScrollLock = 0 && WinActive("ahk_id" PrimaryWindow)
{
SetScrollLockState, On
}
Return
~LButton::
Sleep, 30
ScrollLock := GetKeyState("ScrollLock", "T")
If ScrollLock = 1
{
If not WinExist("Ahk_exe WoW.exe")
{
SetScrollLockState, off
ExitApp
} Else If not WinActive("ahk_exe WoW.exe") && not WinActive("SkillButtons")
{
SetScrollLockState, off
}
}
return
~^LButton::
Sleep, 30
ScrollLock := GetKeyState("ScrollLock", "T")
If ScrollLock = 1
{
If WinActive("ahk_exe WoW.exe")
{
If WinActive("ahk_id" WoWWindows1) && not WinActive("ahk_id" PrimaryWindow)
{
Tooltip "Moving Screens", 500, 500
WinMove, ahk_id %WoWWindows1%,, 0, 0, %PrimaryWidth%, %PrimaryHeight%
WinMove, ahk_id %WoWWindows2%,, %WoW1x%, %WoW1y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows3%,, %WoW2x%, %WoW2y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows4%,, %WoW3x%, %WoW3y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows5%,, %WoW4x%, %WoW4y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows6%,, %WoW5x%, %WoW5y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows7%,, %WoW6x%, %WoW6y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows8%,, %WoW7x%, %WoW7y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows9%,, %WoW8x%, %WoW8y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows10%,, %WoW9x%, %WoW9y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows11%,, %WoW10x%, %WoW10y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows12%,, %WoW11x%, %WoW11y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows13%,, %WoW12x%, %WoW12y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows14%,, %WoW13x%, %WoW13y%, %SecondaryWidth%, %SecondaryHeight%
PrimaryWindow := WoWWindows1
WinActivate, ahk_id %PrimaryWindow%
Tooltip
}
If WinActive("ahk_id" WoWWindows2) && not WinActive("ahk_id" PrimaryWindow)
{
Tooltip "Moving Screens", 500, 500
WinMove, ahk_id %WoWWindows2%,, 0, 0, %PrimaryWidth%, %PrimaryHeight%
WinMove, ahk_id %WoWWindows1%,, %WoW1x%, %WoW1y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows3%,, %WoW2x%, %WoW2y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows4%,, %WoW3x%, %WoW3y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows5%,, %WoW4x%, %WoW4y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows6%,, %WoW5x%, %WoW5y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows7%,, %WoW6x%, %WoW6y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows8%,, %WoW7x%, %WoW7y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows9%,, %WoW8x%, %WoW8y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows10%,, %WoW9x%, %WoW9y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows11%,, %WoW10x%, %WoW10y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows12%,, %WoW11x%, %WoW11y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows13%,, %WoW12x%, %WoW12y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows14%,, %WoW13x%, %WoW13y%, %SecondaryWidth%, %SecondaryHeight%
PrimaryWindow := WoWWindows2
WinActivate, ahk_id %PrimaryWindow%
Tooltip
}
If WinActive("ahk_id" WoWWindows3) && not WinActive("ahk_id" PrimaryWindow)
{
Tooltip "Moving Screens", 500, 500
WinMove, ahk_id %WoWWindows3%,, 0, 0, %PrimaryWidth%, %PrimaryHeight%
WinMove, ahk_id %WoWWindows2%,, %WoW1x%, %WoW1y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows1%,, %WoW2x%, %WoW2y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows4%,, %WoW3x%, %WoW3y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows5%,, %WoW4x%, %WoW4y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows6%,, %WoW5x%, %WoW5y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows7%,, %WoW6x%, %WoW6y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows8%,, %WoW7x%, %WoW7y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows9%,, %WoW8x%, %WoW8y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows10%,, %WoW9x%, %WoW9y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows11%,, %WoW10x%, %WoW10y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows12%,, %WoW11x%, %WoW11y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows13%,, %WoW12x%, %WoW12y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows14%,, %WoW13x%, %WoW13y%, %SecondaryWidth%, %SecondaryHeight%
PrimaryWindow := WoWWindows3
WinActivate, ahk_id %PrimaryWindow%
Tooltip
}
If WinActive("ahk_id" WoWWindows4) && not WinActive("ahk_id" PrimaryWindow)
{
Tooltip "Moving Screens", 500, 500
WinMove, ahk_id %WoWWindows4%,, 0, 0, %PrimaryWidth%, %PrimaryHeight%
WinMove, ahk_id %WoWWindows2%,, %WoW1x%, %WoW1y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows3%,, %WoW2x%, %WoW2y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows1%,, %WoW3x%, %WoW3y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows5%,, %WoW4x%, %WoW4y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows6%,, %WoW5x%, %WoW5y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows7%,, %WoW6x%, %WoW6y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows8%,, %WoW7x%, %WoW7y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows9%,, %WoW8x%, %WoW8y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows10%,, %WoW9x%, %WoW9y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows11%,, %WoW10x%, %WoW10y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows12%,, %WoW11x%, %WoW11y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows13%,, %WoW12x%, %WoW12y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows14%,, %WoW13x%, %WoW13y%, %SecondaryWidth%, %SecondaryHeight%
PrimaryWindow := WoWWindows4
WinActivate, ahk_id %PrimaryWindow%
Tooltip
}
If WinActive("ahk_id" WoWWindows5) && not WinActive("ahk_id" PrimaryWindow)
{
Tooltip "Moving Screens", 500, 500
WinMove, ahk_id %WoWWindows5%,, 0, 0, %PrimaryWidth%, %PrimaryHeight%
WinMove, ahk_id %WoWWindows2%,, %WoW1x%, %WoW1y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows3%,, %WoW2x%, %WoW2y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows4%,, %WoW3x%, %WoW3y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows1%,, %WoW4x%, %WoW4y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows6%,, %WoW5x%, %WoW5y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows7%,, %WoW6x%, %WoW6y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows8%,, %WoW7x%, %WoW7y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows9%,, %WoW8x%, %WoW8y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows10%,, %WoW9x%, %WoW9y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows11%,, %WoW10x%, %WoW10y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows12%,, %WoW11x%, %WoW11y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows13%,, %WoW12x%, %WoW12y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows14%,, %WoW13x%, %WoW13y%, %SecondaryWidth%, %SecondaryHeight%
PrimaryWindow := WoWWindows5
WinActivate, ahk_id %PrimaryWindow%
Tooltip
}
If WinActive("ahk_id" WoWWindows6) && not WinActive("ahk_id" PrimaryWindow)
{
Tooltip "Moving Screens", 500, 500
WinMove, ahk_id %WoWWindows6%,, 0, 0, %PrimaryWidth%, %PrimaryHeight%
WinMove, ahk_id %WoWWindows2%,, %WoW1x%, %WoW1y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows3%,, %WoW2x%, %WoW2y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows4%,, %WoW3x%, %WoW3y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows5%,, %WoW4x%, %WoW4y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows1%,, %WoW5x%, %WoW5y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows7%,, %WoW6x%, %WoW6y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows8%,, %WoW7x%, %WoW7y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows9%,, %WoW8x%, %WoW8y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows10%,, %WoW9x%, %WoW9y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows11%,, %WoW10x%, %WoW10y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows12%,, %WoW11x%, %WoW11y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows13%,, %WoW12x%, %WoW12y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows14%,, %WoW13x%, %WoW13y%, %SecondaryWidth%, %SecondaryHeight%
PrimaryWindow := WoWWindows6
WinActivate, ahk_id %PrimaryWindow%
Tooltip
}
If WinActive("ahk_id" WoWWindows7) && not WinActive("ahk_id" PrimaryWindow)
{
Tooltip "Moving Screens", 500, 500
WinMove, ahk_id %WoWWindows7%,, 0, 0, %PrimaryWidth%, %PrimaryHeight%
WinMove, ahk_id %WoWWindows2%,, %WoW1x%, %WoW1y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows3%,, %WoW2x%, %WoW2y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows4%,, %WoW3x%, %WoW3y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows5%,, %WoW4x%, %WoW4y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows6%,, %WoW5x%, %WoW5y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows1%,, %WoW6x%, %WoW6y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows8%,, %WoW7x%, %WoW7y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows9%,, %WoW8x%, %WoW8y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows10%,, %WoW9x%, %WoW9y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows11%,, %WoW10x%, %WoW10y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows12%,, %WoW11x%, %WoW11y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows13%,, %WoW12x%, %WoW12y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows14%,, %WoW13x%, %WoW13y%, %SecondaryWidth%, %SecondaryHeight%
PrimaryWindow := WoWWindows7
WinActivate, ahk_id %PrimaryWindow%
Tooltip
}
If WinActive("ahk_id" WoWWindows8) && not WinActive("ahk_id" PrimaryWindow)
{
Tooltip "Moving Screens", 500, 500
WinMove, ahk_id %WoWWindows8%,, 0, 0, %PrimaryWidth%, %PrimaryHeight%
WinMove, ahk_id %WoWWindows2%,, %WoW1x%, %WoW1y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows3%,, %WoW2x%, %WoW2y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows4%,, %WoW3x%, %WoW3y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows5%,, %WoW4x%, %WoW4y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows6%,, %WoW5x%, %WoW5y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows7%,, %WoW6x%, %WoW6y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows1%,, %WoW7x%, %WoW7y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows9%,, %WoW8x%, %WoW8y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows10%,, %WoW9x%, %WoW9y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows11%,, %WoW10x%, %WoW10y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows12%,, %WoW11x%, %WoW11y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows13%,, %WoW12x%, %WoW12y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows14%,, %WoW13x%, %WoW13y%, %SecondaryWidth%, %SecondaryHeight%
PrimaryWindow := WoWWindows8
WinActivate, ahk_id %PrimaryWindow%
Tooltip
}
If WinActive("ahk_id" WoWWindows9) && not WinActive("ahk_id" PrimaryWindow)
{
Tooltip "Moving Screens", 500, 500
WinMove, ahk_id %WoWWindows9%,, 0, 0, %PrimaryWidth%, %PrimaryHeight%
WinMove, ahk_id %WoWWindows2%,, %WoW1x%, %WoW1y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows3%,, %WoW2x%, %WoW2y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows4%,, %WoW3x%, %WoW3y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows5%,, %WoW4x%, %WoW4y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows6%,, %WoW5x%, %WoW5y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows7%,, %WoW6x%, %WoW6y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows8%,, %WoW7x%, %WoW7y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows1%,, %WoW8x%, %WoW8y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows10%,, %WoW9x%, %WoW9y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows11%,, %WoW10x%, %WoW10y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows12%,, %WoW11x%, %WoW11y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows13%,, %WoW12x%, %WoW12y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows14%,, %WoW13x%, %WoW13y%, %SecondaryWidth%, %SecondaryHeight%
PrimaryWindow := WoWWindows9
WinActivate, ahk_id %PrimaryWindow%
Tooltip
}
If WinActive("ahk_id" WoWWindows10) && not WinActive("ahk_id" PrimaryWindow)
{
Tooltip "Moving Screens", 500, 500
WinMove, ahk_id %WoWWindows10%,, 0, 0, %PrimaryWidth%, %PrimaryHeight%
WinMove, ahk_id %WoWWindows2%,, %WoW1x%, %WoW1y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows3%,, %WoW2x%, %WoW2y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows4%,, %WoW3x%, %WoW3y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows5%,, %WoW4x%, %WoW4y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows6%,, %WoW5x%, %WoW5y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows7%,, %WoW6x%, %WoW6y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows8%,, %WoW7x%, %WoW7y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows9%,, %WoW8x%, %WoW8y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows1%,, %WoW9x%, %WoW9y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows11%,, %WoW10x%, %WoW10y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows12%,, %WoW11x%, %WoW11y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows13%,, %WoW12x%, %WoW12y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows14%,, %WoW13x%, %WoW13y%, %SecondaryWidth%, %SecondaryHeight%
PrimaryWindow := WoWWindows10
WinActivate, ahk_id %WoWWindows14%
WinActivate, ahk_id %WoWWindows13%
WinActivate, ahk_id %WoWWindows12%
WinActivate, ahk_id %WoWWindows11%
WinActivate, ahk_id %WoWWindows9%
WinActivate, ahk_id %WoWWindows8%
WinActivate, ahk_id %WoWWindows7%
WinActivate, ahk_id %WoWWindows6%
WinActivate, ahk_id %WoWWindows5%
WinActivate, ahk_id %WoWWindows4%
WinActivate, ahk_id %WoWWindows3%
WinActivate, ahk_id %WoWWindows2%
WinActivate, ahk_id %WoWWindows1%
WinActivate, ahk_id %WoWWindows10%
Tooltip
}
If WinActive("ahk_id" WoWWindows11) && not WinActive("ahk_id" PrimaryWindow)
{
Tooltip "Moving Screens", 500, 500
WinMove, ahk_id %WoWWindows11%,, 0, 0, %PrimaryWidth%, %PrimaryHeight%
WinMove, ahk_id %WoWWindows2%,, %WoW1x%, %WoW1y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows3%,, %WoW2x%, %WoW2y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows4%,, %WoW3x%, %WoW3y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows5%,, %WoW4x%, %WoW4y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows6%,, %WoW5x%, %WoW5y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows7%,, %WoW6x%, %WoW6y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows8%,, %WoW7x%, %WoW7y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows9%,, %WoW8x%, %WoW8y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows10%,, %WoW9x%, %WoW9y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows1%,, %WoW10x%, %WoW10y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows12%,, %WoW11x%, %WoW11y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows13%,, %WoW12x%, %WoW12y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows14%,, %WoW13x%, %WoW13y%, %SecondaryWidth%, %SecondaryHeight%
PrimaryWindow := WoWWindows11
WinActivate, ahk_id %WoWWindows14%
WinActivate, ahk_id %WoWWindows13%
WinActivate, ahk_id %WoWWindows12%
WinActivate, ahk_id %WoWWindows1%
WinActivate, ahk_id %WoWWindows10%
WinActivate, ahk_id %WoWWindows9%
WinActivate, ahk_id %WoWWindows8%
WinActivate, ahk_id %WoWWindows7%
WinActivate, ahk_id %WoWWindows6%
WinActivate, ahk_id %WoWWindows5%
WinActivate, ahk_id %WoWWindows4%
WinActivate, ahk_id %WoWWindows3%
WinActivate, ahk_id %WoWWindows2%
WinActivate, ahk_id %WoWWindows11%
Tooltip
}
If WinActive("ahk_id" WoWWindows12) && not WinActive("ahk_id" PrimaryWindow)
{
Tooltip "Moving Screens", 500, 500
WinMove, ahk_id %WoWWindows12%,, 0, 0, %PrimaryWidth%, %PrimaryHeight%
WinMove, ahk_id %WoWWindows2%,, %WoW1x%, %WoW1y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows3%,, %WoW2x%, %WoW2y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows4%,, %WoW3x%, %WoW3y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows5%,, %WoW4x%, %WoW4y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows6%,, %WoW5x%, %WoW5y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows7%,, %WoW6x%, %WoW6y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows8%,, %WoW7x%, %WoW7y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows9%,, %WoW8x%, %WoW8y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows10%,, %WoW9x%, %WoW9y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows11%,, %WoW10x%, %WoW10y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows1%,, %WoW11x%, %WoW11y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows13%,, %WoW12x%, %WoW12y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows14%,, %WoW13x%, %WoW13y%, %SecondaryWidth%, %SecondaryHeight%
PrimaryWindow := WoWWindows12
WinActivate, ahk_id %PrimaryWindow%
Tooltip
}
If WinActive("ahk_id" WoWWindows13) && not WinActive("ahk_id" PrimaryWindow)
{
Tooltip "Moving Screens", 500, 500
WinMove, ahk_id %WoWWindows13%,, 0, 0, %PrimaryWidth%, %PrimaryHeight%
WinMove, ahk_id %WoWWindows2%,, %WoW1x%, %WoW1y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows3%,, %WoW2x%, %WoW2y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows4%,, %WoW3x%, %WoW3y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows5%,, %WoW4x%, %WoW4y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows6%,, %WoW5x%, %WoW5y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows7%,, %WoW6x%, %WoW6y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows8%,, %WoW7x%, %WoW7y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows9%,, %WoW8x%, %WoW8y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows10%,, %WoW9x%, %WoW9y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows11%,, %WoW10x%, %WoW10y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows12%,, %WoW11x%, %WoW11y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows1%,, %WoW12x%, %WoW12y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows14%,, %WoW13x%, %WoW13y%, %SecondaryWidth%, %SecondaryHeight%
PrimaryWindow := WoWWindows13
WinActivate, ahk_id %PrimaryWindow%
Tooltip
}
If WinActive("ahk_id" WoWWindows14) && not WinActive("ahk_id" PrimaryWindow)
{
Tooltip "Moving Screens", 500, 500
WinMove, ahk_id %WoWWindows14%,, 0, 0, %PrimaryWidth%, %PrimaryHeight%
WinMove, ahk_id %WoWWindows2%,, %WoW1x%, %WoW1y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows3%,, %WoW2x%, %WoW2y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows4%,, %WoW3x%, %WoW3y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows5%,, %WoW4x%, %WoW4y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows6%,, %WoW5x%, %WoW5y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows7%,, %WoW6x%, %WoW6y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows8%,, %WoW7x%, %WoW7y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows9%,, %WoW8x%, %WoW8y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows10%,, %WoW9x%, %WoW9y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows11%,, %WoW10x%, %WoW10y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows12%,, %WoW11x%, %WoW11y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows13%,, %WoW12x%, %WoW12y%, %SecondaryWidth%, %SecondaryHeight%
WinMove, ahk_id %WoWWindows1%,, %WoW13x%, %WoW13y%, %SecondaryWidth%, %SecondaryHeight%
PrimaryWindow := WoWWindows14
WinActivate, ahk_id %PrimaryWindow%
Tooltip
}
} Else If not WinExist("Ahk_exe WoW.exe")
{
SetScrollLockState, off
ExitApp
} Else If not WinActive("ahk_exe WoW.exe") && not WinActive("SkillButtons")
{
SetScrollLockState, off
}
}
return
[/code]
I play using a 2k monitor and subtract the taskbar from the Y measurement. All the screens are using similar aspect ratios, but of course not the exact ratio for some amounts of windows. Also note I don't have measurements set up for 11, 12, and 13 windows.
The script checks how many WoW instances are open and gives them all a variable. It then assigns each window a specific length and width based on screen size. Pressing CTRL+Left Mouse Button sets that window to the primary view.
I also have it set for AHK to automatically close if all WoW windows are closed, and to turn off Scroll Lock if I am not currently in the WoW window.
HotKeys (introduction)
Spoiler:Show
Mailing labels are an enigma to me. I won't pretend I understand them, but they work for me. I use a shorthand code for each character. Should be easy to figure out by reading them:
Now that we have all of our labels, it's time to use the basic hotkeys. As a basic rule of thumb, I try to avoid making one button press a different button. For instance, I make my follow button "F" press the follow macro button (F) in game. I used to have it set for ALT+CTRL+F8 or something, but realized that was dumb. The added bonus is I can look at the macro see the "F" on it, and immediately know that is the button I press to make my characters follow.Code://Labels { <Label pdp1 Local SendWinM PaladinProtection> <Label ma1 Local SendWinM MageArcane> <Label dkf1 Local SendWinM DeathKnightFrost> <Label wld1 Local SendWinM WarlockDemonology> <Label pdh1 Local SendWinM PaladinHoly> <Label df1 Local SendWinM DruidFeral> <Label db1 Local SendWinM DruidBalance1> <Label db2 Local SendWinM DruidBalance2> <Label db3 Local SendWinM DruidBalance3> <Label dr1 Local SendWinM DruidRestoration> <Label wrp1 Local SendWinM WarriorProtection> <Label hm1 Local SendWinM HunterMarksman1> <Label hm2 Local SendWinM HunterMarksman2> <Label hm3 Local SendWinM HunterMarksman3> //}
These are a few examples of my simple hotkeys. You may have noticed the "Following" Variable I set for my follow hotkey. This is important specifically for differentiating melee DPS and ranged DPS in the following hotkey:Code:<HotKey ScrollLockOn f> //Follow command { <SetVar Following 1> <SendLabel pdp1, ma1, dkf1, wld1, pdh1, df1, db1, db2, db3, dr1, wrp1, hm1, hm2, hm3> <Key f> //} <HotKey ScrollLockOn Ctrl f> //Break Follow command { <SetVar Following 0> <SendLabel pdp1, ma1, dkf1, wld1, pdh1, df1, db1, db2, db3, dr1, wrp1, hm1, hm2, hm3> <Key down> //} <MovementHotKey ScrollLockOn Up, Down, Space> //Movement for all boxes. Also Movement HotKeys for all boxes and jump. { <SendLabel pdp1, ma1, dkf1, wld1, pdh1, df1, db1, db2, db3, dr1, wrp1, hm1, hm2, hm3> <Key %Trigger%> <MovementHotKey ScrollLockOn Left> //Movement for all boxes <SendLabel pdp1, ma1, dkf1, wld1, pdh1, df1, db1, db2, db3, dr1, wrp1, hm1, hm2, hm3> <Key q> <MovementHotKey ScrollLockOn Right> //Movement for all boxes <SendLabel pdp1, ma1, dkf1, wld1, pdh1, df1, db1, db2, db3, dr1, wrp1, hm1, hm2, hm3> <Key e>//}
[code]
<HotKey ScrollLockOn Button5> //Used for Interact With Target (IWT)
<Passthrough>
<If Following Is 1>
<SetVar Following 0>
<SendLabel ma1, wld1, db1, db2, db3, dr1, pdh1, hm1, hm2, hm3> //Break Follow command
<Key Down>
<EndIf>
<SendLabel pdp1, dkf1, df1, wrp1>//Melee IWT
<Key F11>
[code]
When I press Mouse Button 5, my ranged DPS and healers will press the "Down" key to break follow, and the melee DPS and tanks will interact with the target, causing them to run into melee range. This is done so the ranged will not continue to follow the master if I happen to be using the tank or melee DPS as the master at that time.
Hotkeys (FTL)
Spoiler:Show
Targeting is a huge dilemma with multiboxing. FTL is so important in order to be able to use any character you want. WoW macros are able to use six modifiers and I use each of them. At the top of my script I have the following that I use for reference:
Spoiler:Show
//GLOBAL ORDER FOR SIMILAR HOTKEYS {
//If you are going to use one hotkey multiple times with slight differences (for instance, how launch buttons all use CapsLockOn Final with modifiers) Go in the following order of modifiers in this hierarchy:
//LCtrl
//LShift
//LAlt
//RCtrl
//RShift
//RAlt
//For instance: All modifiers should start with one of these, but if using LShift first you should NEVER use LCtrl. All LCtrl modifiers should be exhausted before moving on to LShift.
//Example of a fully used LCtrl: {
// LCtrl
// LCtrl LShift
// LCtrl LShift LAlt
// LCtrl LShift LAlt RCtrl
// LCtrl LShift LAlt RCtrl RShift
// LCtrl LShift LAlt RCtrl RShift RAlt
// LCtrl LShift LAlt RCtrl RAlt
// LCtrl LShift LAlt RShift
// LCtrl LShift LAlt RShift RAlt
// LCtrl LShift RCtrl
// LCtrl LShift RCtrl RShift
// LCtrl LShift RCtrl RShift RAlt
// LCtrl LShift RCtrl RAlt
// LCtrl LAlt
// LCtrl LAlt RCtrl
// LCtrl LAlt RCtrl RShift
// LCtrl LAlt RCtrl RShift RAlt
// LCtrl LAlt RCtrl RAlt
// LCtrl LAlt RShift
// LCtrl LAlt RShift RAlt
// }
//Dedicated modifiers for Accounts [Currently only in FTL scripts, need to change all other sections too] {
// LCtrl - PaladinProtection
// LCtrl LShift - MageArcane
// LCtrl LShift LAlt - DeathKnightFrost
// LCtrl LShift LAlt RCtrl - WarlockDemonology
// LCtrl LShift LAlt RCtrl RShift - PaladinHoly
// LCtrl LShift LAlt RCtrl RShift RAlt - DruidFeral
// LCtrl LShift LAlt RCtrl RAlt - DruidBalance1
// LCtrl LShift LAlt RShift - DruidBalance2
// LCtrl LShift LAlt RShift RAlt - DruidBalance3
// LCtrl LShift RCtrl - DruidRestoration
// LCtrl LShift RCtrl RShift - WarriorProtection
// LCtrl LShift RCtrl RShift RAlt - HunterMarksman1
// LCtrl LShift RCtrl RAlt - HunterMarksman2
// LCtrl LAlt - HunterMarksman3
// LCtrl LAlt RCtrl
// LCtrl LAlt RCtrl RShift
// LCtrl LAlt RCtrl RShift RAlt
// LCtrl LAlt RCtrl RAlt
// LCtrl LAlt RShift
// LCtrl LAlt RShift RAlt
//}
//}
It's important to stay consistent when writing scripts like this to avoid being confused later, especially after a break.
Moving on, here are my FTL Templates. I'm very proud of these, they work perfectly.
This is likely the most complex part of the entire script. I'll break it down part by part.Code://FTL Templates - This one is for non-Movement. { // %1% : HotKey // %2% : Modifier // %3% : SlavesToSend <Template SendMasterAndSlave> <SendFocusWin> <Key %1%> <SendLabel %3%> <Key %2% %1%> <EndTemplate> // %1% : HotKey // %2% : modifier // %3% : Active window // %4% : Slave Windows <Template SendLeaderless> <If ActiveWinIs %3%> <ApplyTemplate SendMasterAndSlave "%1%" "%2%" "%4%"> <EndTemplate> // %1% : HotKey <Template FTL> <ApplyTemplate SendLeaderless "%1%" "LCtrl" PaladinProtection "ma1,dkf1,wld1,pdh1,df1,db1,db2,db3,dr1,wrp1,hm1,hm2,hm3"> <ApplyTemplate SendLeaderless "%1%" "LCtrl LShift" MageArcane "pdp1,dkf1,wld1,pdh1,df1,db1,db2,db3,dr1,wrp1,hm1,hm2,hm3"> <ApplyTemplate SendLeaderless "%1%" "LCtrl LShift LAlt" DeathKnightFrost "pdp1,ma1,wld1,pdh1,df1,db1,db2,db3,dr1,wrp1,hm1,hm2,hm3"> <ApplyTemplate SendLeaderless "%1%" "LCtrl LShift LAlt RCtrl" WarlockDemonology "pdp1,ma1,dkf1,pdh1,df1,db1,db2,db3,dr1,wrp1,hm1,hm2,hm3"> <ApplyTemplate SendLeaderless "%1%" "LCtrl LShift LAlt RCtrl RShift" PaladinHoly "pdp1,ma1,dkf1,wld1,df1,db1,db2,db3,dr1,wrp1,hm1,hm2,hm3"> <ApplyTemplate SendLeaderless "%1%" "LCtrl LShift LAlt RCtrl RShift RAlt" DruidFeral "pdp1,ma1,dkf1,wld1,pdh1,db1,db2,db3,dr1,wrp1,hm1,hm2,hm3"> <ApplyTemplate SendLeaderless "%1%" "LCtrl LShift LAlt RCtrl RAlt" DruidBalance1 "pdp1,ma1,dkf1,wld1,pdh1,df1,db2,db3,dr1,wrp1,hm1,hm2,hm3"> <ApplyTemplate SendLeaderless "%1%" "LCtrl LShift LAlt RShift" DruidBalance2 "pdp1,ma1,dkf1,wld1,pdh1,df1,db1,db3,dr1,wrp1,hm1,hm2,hm3"> <ApplyTemplate SendLeaderless "%1%" "LCtrl LShift LAlt RShift RAlt" DruidBalance3 "pdp1,ma1,dkf1,wld1,pdh1,df1,db1,db2,dr1,wrp1,hm1,hm2,hm3"> <ApplyTemplate SendLeaderless "%1%" "LCtrl LShift RCtrl" DruidRestoration "pdp1,ma1,dkf1,wld1,pdh1,df1,db1,db2,db3,wrp1,hm1,hm2,hm3"> <ApplyTemplate SendLeaderless "%1%" "LCtrl LShift RCtrl RShift" WarriorProtection "pdp1,ma1,dkf1,wld1,pdh1,df1,db1,db2,db3,dr1,hm1,hm2,hm3"> <ApplyTemplate SendLeaderless "%1%" "LCtrl LShift RCtrl RShift RAlt" HunterMarksman1 "pdp1,ma1,dkf1,wld1,pdh1,df1,db1,db2,db3,dr1,wrp1,hm2,hm3"> <ApplyTemplate SendLeaderless "%1%" "LCtrl LShift RCtrl RAlt" HunterMarksman2 "pdp1,ma1,dkf1,wld1,pdh1,df1,db1,db2,db3,dr1,wrp1,hm1,hm3"> <ApplyTemplate SendLeaderless "%1%" "LCtrl LAlt" HunterMarksman3 "pdp1,ma1,dkf1,wld1,pdh1,df1,db1,db2,db3,dr1,wrp1,hm1,hm2"> <EndTemplate> //} //FTL Templates - This one is for Mouse Presses. { // %1% : HotKey // %2% : Modifier // %3% : SlavesToSend <Template MouseSendMasterAndSlave> <Wait 500> <Sendlabel %3%> <Key %2% %1%> <EndTemplate> // %1% : HotKey // %2% : modifier // %3% : Active window // %4% : Slave Windows <Template MouseSendLeaderless> <If ActiveWinIs %3%> <ApplyTemplate MouseSendMasterAndSlave "%1%" "%2%" "%4%"> <EndIf> <EndTemplate> // %1% : HotKey <Template MouseFTL> <ApplyTemplate MouseSendLeaderless "%1%" "LCtrl" PaladinProtection "ma1,dkf1,wld1,pdh1,df1,db1,db2,db3,dr1,wrp1,hm1,hm2,hm3"> <ApplyTemplate MouseSendLeaderless "%1%" "LCtrl LShift" MageArcane "pdp1,dkf1,wld1,pdh1,df1,db1,db2,db3,dr1,wrp1,hm1,hm2,hm3"> <ApplyTemplate MouseSendLeaderless "%1%" "LCtrl LShift LAlt" DeathKnightFrost "pdp1,ma1,wld1,pdh1,df1,db1,db2,db3,dr1,wrp1,hm1,hm2,hm3"> <ApplyTemplate MouseSendLeaderless "%1%" "LCtrl LShift LAlt RCtrl" WarlockDemonology "pdp1,ma1,dkf1,pdh1,df1,db1,db2,db3,dr1,wrp1,hm1,hm2,hm3"> <ApplyTemplate MouseSendLeaderless "%1%" "LCtrl LShift LAlt RCtrl RShift" PaladinHoly "pdp1,ma1,dkf1,wld1,df1,db1,db2,db3,dr1,wrp1,hm1,hm2,hm3"> <ApplyTemplate MouseSendLeaderless "%1%" "LCtrl LShift LAlt RCtrl RShift RAlt" DruidFeral "pdp1,ma1,dkf1,wld1,pdh1,db1,db2,db3,dr1,wrp1,hm1,hm2,hm3"> <ApplyTemplate MouseSendLeaderless "%1%" "LCtrl LShift LAlt RCtrl RAlt" DruidBalance1 "pdp1,ma1,dkf1,wld1,pdh1,df1,db2,db3,dr1,wrp1,hm1,hm2,hm3"> <ApplyTemplate MouseSendLeaderless "%1%" "LCtrl LShift LAlt RShift" DruidBalance2 "pdp1,ma1,dkf1,wld1,pdh1,df1,db1,db3,dr1,wrp1,hm1,hm2,hm3"> <ApplyTemplate MouseSendLeaderless "%1%" "LCtrl LShift LAlt RShift RAlt" DruidBalance3 "pdp1,ma1,dkf1,wld1,pdh1,df1,db1,db2,dr1,wrp1,hm1,hm2,hm3"> <ApplyTemplate MouseSendLeaderless "%1%" "LCtrl LShift RCtrl" DruidRestoration "pdp1,ma1,dkf1,wld1,pdh1,df1,db1,db2,db3,wrp1,hm1,hm2,hm3"> <ApplyTemplate MouseSendLeaderless "%1%" "LCtrl LShift RCtrl RShift" WarriorProtection "pdp1,ma1,dkf1,wld1,pdh1,df1,db1,db2,db3,dr1,hm1,hm2,hm3"> <ApplyTemplate MouseSendLeaderless "%1%" "LCtrl LShift RCtrl RShift RAlt" HunterMarksman1 "pdp1,ma1,dkf1,wld1,pdh1,df1,db1,db2,db3,dr1,wrp1,hm2,hm3"> <ApplyTemplate MouseSendLeaderless "%1%" "LCtrl LShift RCtrl RAlt" HunterMarksman2 "pdp1,ma1,dkf1,wld1,pdh1,df1,db1,db2,db3,dr1,wrp1,hm1,hm3"> <ApplyTemplate MouseSendLeaderless "%1%" "LCtrl LAlt" HunterMarksman3 "pdp1,ma1,dkf1,wld1,pdh1,df1,db1,db2,db3,dr1,wrp1,hm1,hm2"> <EndTemplate> //} //FTL Templates - This one is for Specific windows to send to. { // %1% : KeyToSend // %2% : LabelToSend // %3% : Modifier <Template SpecificSend> <SendLabel %2%> <Key %3% %1%> <EndTemplate> // %1% : KeyToSend // %2% : LabelToSend // %3% : Modifier // %4% : Active Window <Template SpecificWindowCheck> <If PrimaryScreen Is %4%> <ApplyTemplate SpecificSend "%1%" "%2%" "%3%"> <EndTemplate> // %1% : KeyToSend // %2% : LabelToSend <Template SpecificFTL> <ApplyTemplate SpecificWindowCheck "%1%" "%2%" "LCtrl" PaladinProtection> <ApplyTemplate SpecificWindowCheck "%1%" "%2%" "LCtrl LShift" MageArcane> <ApplyTemplate SpecificWindowCheck "%1%" "%2%" "LCtrl LShift LAlt" DeathKnightFrost> <ApplyTemplate SpecificWindowCheck "%1%" "%2%" "LCtrl LShift LAlt RCtrl" WarlockDemonology> <ApplyTemplate SpecificWindowCheck "%1%" "%2%" "LCtrl LShift LAlt RCtrl RShift" PaladinHoly> <ApplyTemplate SpecificWindowCheck "%1%" "%2%" "LCtrl LShift LAlt RCtrl RShift RAlt" DruidFeral> <ApplyTemplate SpecificWindowCheck "%1%" "%2%" "LCtrl LShift LAlt RCtrl RAlt" DruidBalance1> <ApplyTemplate SpecificWindowCheck "%1%" "%2%" "LCtrl LShift LAlt RShift" DruidBalance2> <ApplyTemplate SpecificWindowCheck "%1%" "%2%" "LCtrl LShift LAlt RShift RAlt" DruidBalance3> <ApplyTemplate SpecificWindowCheck "%1%" "%2%" "LCtrl LShift RCtrl" DruidRestoration> <ApplyTemplate SpecificWindowCheck "%1%" "%2%" "LCtrl LShift RCtrl RShift" WarriorProtection> <ApplyTemplate SpecificWindowCheck "%1%" "%2%" "LCtrl LShift RCtrl RShift RAlt" HunterMarksman1> <ApplyTemplate SpecificWindowCheck "%1%" "%2%" "LCtrl LShift RCtrl RAlt" HunterMarksman2> <ApplyTemplate SpecificWindowCheck "%1%" "%2%" "LCtrl LAlt" HunterMarksman3> <EndTemplate> //}
First, each template has the "WindowCheck" template that they all go to. On my Left Mouse button HotKey, I have it set a variable to set "PrimaryScreen" to whatever screen I click on. So whenever I use an FTL template, the script checks for every window to see which one is the primary. Every time I click any FTL HotKey, it discards 13 windows and keeps the 1 window that is set as PrimaryScreen, then moves on to the "Send" section., where it sends the modifiers and the keys. I use Super Duper Macro to set the assist macro, which every FTL macro calls to, more on that in a bit.
Next, why do I have 3 different FTL templates? The first one is for general button presses that goes to every window EXCEPT for the primary window. Note how SendFocuswin gets the key press (%1%), and all of the other windows get the modifiers as well (%2% AND %1%).
The second one is for mouse buttons. When using Mouse FTL commands, I do not want the primary window to get an extra click, as my mouse keybinds all are Passthrough. Otherwise, it is the same as the first one.
The third one is for keybinds that have different destinations. For instance, if I want my healer to press "2" and my tank to press "3" when I press the "4" key, I would use this template.
Now that the templates are there, let me show you my left mouse button hotkey:
This button does two things: presses the "X" button (which is my assist macro) on every window with FTL modifiers, and it defines the primary window for FTL purposes. Note that the MouseFTL script has a "Wait 500" code in there. This is due to the time it takes for the primary target to go to the server, and back to the secondary windows. This takes about twice as long as there is ping on the server, which is about 150 for me. I give it more time than it needs in case the server or I am lagging. Unfortunately, this means I cannot spam click or HKN will hang until all the wait commands are complete.Code:<HotKeyUp ScrollLockOn LButton> <Passthrough> <ApplyTemplate MouseFTL "x"> <ApplyTemplate SetPrimaryWindow PaladinProtection> <ApplyTemplate SetPrimaryWindow MageArcane> <ApplyTemplate SetPrimaryWindow DeathKnightFrost> <ApplyTemplate SetPrimaryWindow WarlockDemonology> <ApplyTemplate SetPrimaryWindow PaladinHoly> <ApplyTemplate SetPrimaryWindow DruidFeral> <ApplyTemplate SetPrimaryWindow DruidBalance1> <ApplyTemplate SetPrimaryWindow DruidBalance2> <ApplyTemplate SetPrimaryWindow DruidBalance3> <ApplyTemplate SetPrimaryWindow DruidRestoration> <ApplyTemplate SetPrimaryWindow WarriorProtection> <ApplyTemplate SetPrimaryWindow HunterMarksman1> <ApplyTemplate SetPrimaryWindow HunterMarksman2> <ApplyTemplate SetPrimaryWindow HunterMarksman3>
Here is a usage for the Specific FTL template. I have a kick macro on my death knight, and the K button will have ONLY the death knight kick.
Similarlly, here is my taunt macro. It is set to work with 3 tanks. It will have them taunt in a round-robin style, skipping the ones that do not exist:Code:<HotKey ScrollLockOn k> //Kick { <ApplyTemplate SpecificFTL "k" "dkf1"> //}
Code:<HotKey ScrollLockOn t> //Taunt { <If WinDoesNotExist PaladinProtection> <DoHotKey HotKey ScrollLockOn t> <EndIf> <ApplyTemplate SpecificFTL "t" "pdp1"> <Toggle> <If WinDoesNotExist DruidFeral> <DoHotKey HotKey ScrollLockOn t> <EndIf> <ApplyTemplate SpecificFTL "t" "df1"> <Toggle> <If WinDoesNotExist WarriorProtection> <DoHotKey HotKey ScrollLockOn t> <EndIf> <ApplyTemplate SpecificFTL "t" "wrp1">//}
Hotkey (One button wins)
Spoiler:Show
So, I wanted to make the game as low-complexity as I possibly could. I wanted to make generic DPS and tanking rotations that were "good enough". The problem I ran into is procs. Every DPS class has procs that they have to react to in order to get adequate damage out. Using the SpecificFTL templates I'm able to make toggle-able inputs using If statements. Here is my Onebuttonwins hotkey:
I have an Mik's Scrolling battle text set up to show when any of these need to proc and a message that tells me what key to press to toggle the appropriate variable. For instance, when DruidBalance1 procs, Mik's tells shows me "Press F5!" on the screen.Code://One Button Wins { <HotKey ScrollLockOn 1> <DoHotKey HotKey ScrollLockOn RCtrl Kanji> //Normie classes, these classes have no procs, no toggles, and no execute thresholds. This Keybind will be called each time another class uses an ability. -- RCtrl { <HotKey ScrollLockOn RCtrl Kanji> <ApplyTemplate SpecificFTL "1" pdp1> <ApplyTemplate SpecificFTL "1" ma1> <ApplyTemplate SpecificFTL "1" pdh1> <ApplyTemplate SpecificFTL "1" df1> <ApplyTemplate SpecificFTL "1" dr1> //Warrior will only be here until I feel like changing it. <ApplyTemplate SpecificFTL "1" wrp1> //The Three hunters will be here until I add kill shot. <ApplyTemplate SpecificFTL "1" hm1> <ApplyTemplate SpecificFTL "1" hm2> <ApplyTemplate SpecificFTL "1" hm3> // } // <If Execute Is 0> //Execute Classes for when execute is Off (Currently Unused) -- RAlt { // <DoHotKey HotKey ScrollLockOff RAlt Kanji> // <EndIf> //} <If Execute Is 1> //Execute Classes for when execute is On -- RAlt { <DoHotKey HotKey ScrollLockOn RAlt Kanji> <EndIf> //} //Proc toggles. { <If MoltenCore Is 0> //Molten Core -- RShift { <DoHotKey HotKey ScrollLockOff RShift Kanji> <EndIf> <If MoltenCore Is 1> <DoHotKey HotKey ScrollLockOn RShift Kanji> <DoHotKey HotKey ScrollLockOn LCtrl LAlt ModeChange> //Toggle reset <EndIf> // } <If HowlingBlast Is 0> //Howling Blast -- RCtrl RAlt RShift { <DoHotKey HotKey ScrollLockOff RCtrl RAlt RShift Kanji> <EndIf> <If HowlingBlast Is 1> <DoHotKey HotKey ScrollLockOn RCtrl RAlt RShift Kanji> <DoHotKey HotKey ScrollLockOn LAlt LShift ModeChange> //Toggle reset <EndIf> //} <If Eclipse1 Is 0> //Eclipse1 -- RCtrl RAlt { <DoHotKey HotKey ScrollLockOff RCtrl RAlt Kanji> <EndIf> <If Eclipse1 Is 1> <DoHotKey HotKey ScrollLockOn RCtrl RAlt Kanji> <EndIf> // } <If Eclipse2 Is 0> //Eclipse2 -- RCtrl RShift { <DoHotKey HotKey ScrollLockOff RCtrl RShift Kanji> <EndIf> <If Eclipse2 Is 1> <DoHotKey HotKey ScrollLockOn RCtrl RShift Kanji> <EndIf> // } <If Eclipse3 Is 0> //Eclipse3 -- RAlt RShift { <DoHotKey HotKey ScrollLockOff RAlt RShift Kanji> <EndIf> <If Eclipse3 Is 1> <DoHotKey HotKey ScrollLockOn RAlt RShift Kanji> <EndIf> // } // <HotKey ScrollLockOff RAlt Kanji> //If Execute Is 0 (Currently Unused) { //} <HotKey ScrollLockOn RAlt Kanji> //If Execute Is 1 { <ApplyTemplate SpecificFTL "Numpad1" wld1> //} <HotKey ScrollLockOff RShift Kanji> //If MoltenCore Is 0 { <If Execute Is 0> //Check if Execute is on. If it is, then the "Execute Classes" will have already ran and soulfire is being cast. <DoHotKey HotKey ScrollLockOff CapsLockOff RShift Kanji> <EndIf> <HotKey ScrollLockOff CapsLockOff RShift Kanji> <ApplyTemplate SpecificFTL "1" wld1> //} <HotKey ScrollLockOn RShift Kanji> //If MoltenCore is 1 { <ApplyTemplate SpecificFTL "Numpad2" wld1> //} <HotKey ScrollLockOff RCtrl RAlt RShift Kanji> //If HowlingBlast Is 0 { <ApplyTemplate SpecificFTL "1" "dkf1"> <EndIf> //} <HotKey ScrollLockOn RCtrl RAlt RShift Kanji> //If HowlingBlast Is 1 { <ApplyTemplate SpecificFTL "Numpad1" "dkf1"> <EndIf> //} <HotKey ScrollLockOff RCtrl RAlt Kanji>//If Eclipse1 Is 0 { <ApplyTemplate SpecificFTL "1" db1> //} <HotKey ScrollLockOn RCtrl RAlt Kanji>//If Eclipse1 Is 1 { <ApplyTemplate SpecificFTL "Numpad1" db1> //} <HotKey ScrollLockOff RCtrl RShift Kanji>//If Eclipse2 Is 0 { <ApplyTemplate SpecificFTL "1" db2> //} <HotKey ScrollLockOn RCtrl RShift Kanji>//If Eclipse2 Is 1 { <ApplyTemplate SpecificFTL "Numpad1" db2> //} <HotKey ScrollLockOff RAlt RShift Kanji>//If Eclipse3 Is 0 { <ApplyTemplate SpecificFTL "1" db3> //} <HotKey ScrollLockOn RAlt RShift Kanji>//If Eclipse3 Is 1 { <ApplyTemplate SpecificFTL "Numpad1" db3> //} //} //} //}
To do list
Spoiler:Show
One thing I REALLY struggle with is healing. Most multibox healing methods are using mouse clicks, but I've found mouse clicks are very poor when broadcast to other screens, resulting in both delayed healing or scripts as a whole, as well as missed clicks.
The best solution I found so far is assigning a dedicated hotkey per character. For instance, "Numpad1" is a macro for healing only PaladinProtection, Numpad2 heals MageArcane, and so on. It's not ideal at all for more than 5 characters and even less ideal for dynamic healing.
Thanks for reading! Got any scripts you wrote that you want to share? Share 'em!
I did not proofread this : ^)