Tired of begging for builds that use few skills?
Didn’t have piano lessons as a child?
Suffering from rheumatism or tendinitis?
Maybe even missing a few fingers?
Don’t worry, we have a solution…
GDAutocaster - have the piano play for you!
Credits to klasperstanze, ncience, Garfunkel, Dlightfull, Danut, Nico_Pootato, GaeanC, tippytam, CaiusMartius, wulunzun, Hagritty, Vlad_Ahmedyanov and others from AHK threads
Write if you
- need help with specific config (or just describe how you play and I’ll propose a config)
- would like some additional features
- something doesn’t work as expected
Main features
- designed to work with all games
- making 10 buttons piano builds into 3 buttons builds without using DPS / efficiency
- autocasting skills like Blood of Dreeg / Pneumatic Burst / Wind Devils
- combos (press one button for multiple debuffs / casting all pets / permabuffs)
- spamming multiple cooldown skills while holding one button
- automatic camera rotation following the character
- fast manual camera rotation (one button press → i.e. 60 degrees rotation)
- holding one button to have other buttons held
- press one button to have button(s) held
- centered Inquisitor Seal and other skills (also with )
- controls GDHacker that can currently
- freeze Tributes
- toggle game speed
- show DPS / Stats window
- automatic hiding of items
- prevent autocasting while you’re holding some button(s)
- clicking multiple points on the screen by pressing a button
- you can make 1-button summoning + changing behavior to aggressive combo with this
- you can generate 20 rings in GDStash with one press of a button
- binding skill to buttons that are not normally possible
- skills spam or combos on double LMB press / hold
- merging all these things together so that i.e. when you press and hold RMB
- first your 2 debuffs fire
- than inquisitor seal
- than spamming of your cooldown skills starts and channeling of continuous skill
Some clever usage samples:
- using skills actively from the 2nd hotbar
- ensuring you don’t lose casts because of Grim Dawn skill interruption
- your skill not registering / buffering while other skills animations are in progress
- multiple movements skills while holding one button
- World Map instead of just Local Map with one button press
- Aether Ray on LMB
- making a (movement) skill use Force Move automatically so that it doesn’t lock on enemies
- pick up all items around by holding a button instead of pressing it repeatedly
- drop item from inventory with one button press (clicking with mouse not needed)
Only Left Mouse Button was used in the video but there’s moving and 5 skills used!
Download GDAutocaster! (652.4 KB)
How to use it
-
launch GDAutocaster.exe
-
load a config file
- needs to have .ini extension to be visible
- make sure your Windows displays extensions
-
launch / un-minimize Grim Dawn
- or other game if configured properly
- the program starts working after ~3 seconds
-
you don’t need to reload the config after you make changes to it
-
the program reloads it automatically
- because it restarts every time you go back to the game
-
Command line arguments
The program reads command line / shortcut arguments
GDAutocaster.exe config.ini (reads config.ini and skips file selection dialog)
GDAutocaster.exe config.ini BIT_MASK
-
reads config.ini
-
skips file selection dialog
-
BIT_MASK
-
first bit is for whether keys are Suspended after you first launch the game
-
if BIT_MASK=
- 0 it means none of the bits are set
- 1 it means 1st bit it set
- 2 it means 2nd bit is set
- 3 it means both bits are set
…
-
How to make the program start automaically with Windows
Documentation - excessive config explained
List of buttons to use in the config / what their names are: Key List
All sections and individual settings in this extensive config are optional.
[general]
comment=//
game_window_id=ahk_exe Grim Dawn.exe
kill_on_exit=false
press_duration=-1
suspend_key=Tab
suspend_stops_autocast=false
title_match_mode=3
[autocast by toggle]
autocast_on_launch=false
delay=1000
cast1=`:2,4,5
delay1=3000
cast2=`:6
not_hold_keys2=LButton,RButton
delay2=500
cast3=`:1
delay3=18000
reset_key3=1
cast4=T:3,4
delay4=2000
alternate4=true
cast5=`:7,7,7,7
inner_delay5=1000
[combo presses]
delay=300
initial_delay=0
combo1=j:7,3,6
combo2=h:t,1,2,t
delay2=200
initial_delay2=200
combo3=Space:1,1,1,1,1
delay3=2000
stop_on_release3=true
combo4=RButton:1,2
delay4=200
double_press4=true
double_press_time_gap4=300
combo5=CapsLock:m
key_native_function5=false
combo6=Tab:+LButton,#^!Z
[autocast by hold]
delay=100
key_native_function=true
cast1=RButton:0,9
delay1=200
cast2=Space:2
initial_delay2=500
cast3=LButton:1
delay3=500
double_press3=true
double_press_time_gap3=300
cast4=Shift,A:1
cast5=CapsLock:5
key_native_function5=false
cast6=RButton:7,7,7,7
delay6=4000
inner_delay6=200
cast7=RButton:1,1,1
delay7=100
time_out7=4000
inner_delay7=100
[combo holds]
initial_delay=0
combo1=LButton:7
initial_delay1=150
double_press1=true
double_press_time_gap1=300
combo2=RButton:6
initial_delay2=0
combo3=CapsLock:m
key_native_function3=false
combo4=Space:3
interrupt_delay4=3000
interrupt_duration4=200
[toggle holds]
initial_delay=0
key_native_function=true
toggle1=Q:1
toggle2=Q:2
toggle3=A:1,2
key_native_function3=false
toggle4=LButton:7
initial_delay4=150
double_press4=true
double_press_time_gap4=300
[center casts]
center=500,500
screen_width=1920
screen_height=1280
off_center=true
cast1=RButton:7,6
initial_delay1=0
delay1=200
delay_after_cursor1=40
off_center1=false
[fixed clicks]
delay=25
initial_delay=0
go_back=true
clicks1=(75,165)(80,90)[234,234]
delay1=25
initial_delay1=0
repeat1=5
translation1=200,200
button1=CapsLock
key_native_function1=false
[relative clicks]
delay=0
button1=1
rows1=2
columns1=10
width1=32
height1=32
button2=2
rows2=2
columns2=5
width2=64
height2=64
is_left2=false
[hold toggles]
hold1=RButton:Space
hold2=RButton,Space,A:RAlt
time_out2=2000
[camera]
angle=60
clockwise=d
counter_clockwise=a
delay=40
drag_delay=0
rotation_key=k
[automatic camera]
delay=200
ignore_area_shape=circle
ignore_area_size=30
ignore_segment_angle=20
initial_delay=200
rotate_key=LButton
rotate_left=b
rotate_right=n
[hacker]
faster_camera=4
freeze_tributes=true
speed_initial=1.5
speed_initial_delay=30000
speed_toggle=Q
speeds=2,1
stats_toggle=Tab
[gamepad]
button_nr=6
delay=40
key=RButton
vertical_shift=-20
Click sections below to show specific documentations for them
general settings
[general]
comment=//
game_window_id=ahk_exe Grim Dawn.exe
kill_on_exit=false
press_duration=-1
suspend_key=Tab
suspend_stops_autocast=false
title_match_mode=3
-
comment [optional]
- indicates a comment after a config entry, i.e. in
suspend_key=Tab//tralala
- in lines without config entries you can still comment however you want
- don’t comment in this particular line though
- indicates a comment after a config entry, i.e. in
-
game_window_id [optional] {ahk_exe Grim Dawn.exe by default}
-
the default value is ahk_exe Grim Dawn.exe
- this identifies the window by process that’s attached to it
-
you need to change it if you’d like to use the program in other games
-
can also identify by just window’s name: game_window_id=Grim Dawn
-
multiple identifiers / games are supported with the use of comma:
- game_window_id=Grim Dawn,Diablo 3
-
-
kill_on_exit [optional]
-
kills the program after you exit the game
-
false by default
-
-
press_duration [optional]
-
“Certain games and other specialized applications may require a delay inside each keystroke; that is, after the press of the key but before its release.” For example Slormancer that I played. SetKeyDelay - Syntax & Usage | AutoHotkey v1
-
I added PRESS_DURATION config entry in [general] for that (-1 by default). I set it to 50 for Slormancer.
-
-
suspend_key [optional]
-
turns off/on all the hotkeys except itself
-
doesn’t turn off/on Autocast by toggle feature just hotkeys that do it
-
you can also have multiple Suspend keys if you write
- suspend_key=Tab,Enter
or
suspend_keys=Tab,Enter
- suspend_key=Tab,Enter
-
-
suspend_stops_autocast [optional]
- if you set it to true
-
autocasts on toggle (i.e. Blood of Dreeg) will stop when you suspend
Hotkeys / Features / Combos with Suspend Key (i.e. Tab) -
it will resume it you press it again
-
- if you set it to true
-
title_match_mode [optional]
-
see SetTitleMatchMode - Syntax & Usage | AutoHotkey v1
1 : A window’s title must start with the specified WinTitle to be a match.
2 : A window’s title can contain WinTitle anywhere inside it to be a match.
3 : A window’s title must exactly match WinTitle to be a match.
-
autocast by toggle (buttons pressed periodically w/o user’s interaction on toggle)
-
only option for autocasting without touching the keyboard/mouse for skills like Blood of Dreeg all the time or for skills like Storm Totem when you don’t hold any buttons
-
for fighting when I hold RMB I usually disable it with not_hold_keys and spam it with Autocast by Hold instead because it has more options like initial_delay
- which allows you to squeeze in some debuffs with a certainty that they are not interrupted by your autocasts
-
-
Warning! Autocasting on toggle interrupts cinematics.
[autocast by toggle]
autocast_on_launch=false
delay=1000
-
delay [optional]
-
global delay in-between button presses for all the buttons/autocasts unless overridden by delayX for a specific button what I usually do
-
100 ms is the default if you don’t specify it IIRC
- it may be an overkill over spamming skills, maybe 200 ms is better
- for skills like Blood of Dreeg asap cast maybe use 1s
-
-
autocast_on_launch [optional]
- starts autocasting right away
- done once by game launch, after that it’s in state you leave it in
cast1=`:2,4,5
delay1=3000
-
skills bound to 2, 4, 5 in-game (i.e. Wind Devil on 2 on hotbar) cast every 3000 ms by themselves
-
turned on/off by ` (button over Tab)
- ` toggle button is a hotkey and thus it can be turned off/on by suspend_key
cast2=`:6
not_hold_keys2=LButton,RButton
delay2=500
-
skill bound to 6 in-game i.e. Ring of Steel cast automatically by itself every 0.5s if you pressed `
-
press it again to stop autocasting
-
not_hold_keys - this autocast is disabled if you’re holding LButton or RButton
- I used it often to disable autocasting while I hold for example RMB and enable it then with different feature Autocast by Hold which has more options like initial_delay (time gap) to not interrupt other spells I’d like to cast just after pressing down RMB
cast3=`:1
delay3=18000
reset_key3=1
- I explained reset_key in detail in the following post.
cast4=T:3,4
delay4=2000
alternate4=true
- presses 3
- after 2 seconds it presses 4
- after 2 seconds it presses 3
- etc.
cast5=`:7,7,7,7
inner_delay5=1000
- presses 7 four times every delay but with inner_delay time gaps between the presses
combo presses (one-time sequences of button presses)
-
sequences of button presses / clicks, rebinding the key
-
I combine it with [autocast by hold], [combo holds] and [center casts] in the same button using initial_delay, usually 200 ms per button press
[combo presses]
delay=300
initial_delay=0
combo1=j:7,3,6
combo2=h:t,1,2,t
delay2=200
initial_delay2=200
combo3=Space:1,1,1,1,1
delay3=2000
stop_on_release3=true
combo4=RButton:1,2
delay4=200
double_press4=true
double_press_time_gap4=300
combo5=CapsLock:m
key_native_function5=false
combo6=Tab:+LButton,#^!Z
-
string of buttons presses activated by a button pressed
-
sample usages
-
casting all your permabuffs & pets with 1 button press, even if some of them are on the 2nd hotbar
-
casting multiple debuffs with i.e RMB before your other RMB (possibly) delayed spamming starts
-
actively casting a skill from the second hotbar (by swap, button, swap combo)
-
making a drop item button that doesn’t require you to pick an item before hands
-
-
delay [optional]
- global delay in-between button presses for all the comboX unless overridden by delayX for a specific combo
-
initial_delay [optional]
- global initial_delay before the combo starts for all the comboX unless overridden by initial_delayX for a specific combo
-
combo1=j:7,3,6
-
after pressing J, buttons 7, 3, 6 are pressed
- 7 intstantly
- 3 after 300 ms
- 7 after another 300 ms (600ms in total from the start)
-
-
stop_on_release3=true [optional]
- makes the 3rd combo stop if you release the button
- you just make a short press, probably only the 1st press from the combo will be made
-
double_press4=true [optional]
- activates the combo on a double press, useful for i.e. Pet Attack, Movement skills
-
double_press_time_gap4=300 [optional]
- the time window you give yourself for the 2nd click/press after the 1st one to activate the combo
-
key_native_function5=false [optional]
-
blocks the key native function
-
I advise not to use it in general because you won’t block skills from Hotbars / in-game mouse action anyway I think
-
I used it here for Capslock to not light up when I use it for showing/hiding the map
-
-
combo6=Tab:+LButton,#^!Z
- presses Shift + LMB and after that Windows Key + Ctrl + Alt + Z
autocast by hold (buttons pressed periodically while the user is holding some button(s))
-
your default spamming / autocasting while holding some button(s)
-
combine it with [combo presses], [combo holds] and [center casts] in the same button using initial_delay, usually 200 ms per button press
[autocast by hold]
delay=100
key_native_function=true
cast1=RButton:0,9
delay1=200
cast2=Space:2
initial_delay2=500
cast3=LButton:1
delay3=500
double_press3=true
double_press_time_gap3=300
cast4=Shift,A:1
cast5=CapsLock:5
key_native_function5=false
cast6=RButton:7,7,7,7
delay6=4000
inner_delay6=200
cast7=RButton:1,1,1
delay7=100
time_out7=4000
inner_delay7=100
-
your default autocasting while holding some buttons
-
first press is instant which might not be the case for [X] autocasting holding version
-
here the delay is not in between separate buttons but in-between full spams of multiple butons (will be explained below)
-
delay=100 [optional
- the default delay 100 for spamming ASAP if I remember correctly
- is overridden by delayK for specific castK
-
key_native_function=true [optional]
-
turn it off if for example you have Skill 1 bound to A in Grim Dawn
and you want some autocast by hold bound to it in GDAutocaster
yet you don’t want Skill 1 to activate -
I don’t think you can turn if off for LMB / RMB in Grim Dawn
-
this is global option for the whole section,
you can override it for specific casts, see below
-
-
cast1=RButton:0,9
-
when you press RMB, the buttons 0, 9 are instantly pressed
- but in that order, so if for example they are movement skills, 0 will have higher priority
-
if you continue to hold RMB
-
-
initial_delay2=500
- spamming starts with 500 ms delay with a default frequency of 100 ms
-
double_press3=true [optional]
- activates the spam cast after a double press + holds
-
double_press_time_gap3=300 [optional]
- the time window you give yourself for the 2nd click/press after the 1st one to activate the cast
-
cast4=Shift,A:1
- you can also demand holding multiple buttons but I personally never use it
-
key_native_function5=false [optional]
-
blocks the key native function
-
I used it here for Capslock to not light up when I use it for showing/hiding the map
-
cast6=RButton:7,7,7,7
delay6=4000
inner_delay6=200
-
the new inner_delay option allows you to insert time delays between button sets of button presses
-
I use it i.e. to cast Amarasta only once per 4 seconds (not more often) but make multiple timed presses instead of one for the duration of 1 second for example to ensure it’s never interrupted by another skill animation (such interruption may or may not be possible depending on your config)
-
time_out7 is used for perfect ABB-Lethal Assault / Bone Harvest-Soul Harvest casts
it’s described in the following post
combo holds (buttons held / pressed down while the user is holding / pressing down button(s))
-
holds down a button to have another button(s) held
-
combine it with [combo presses], [autocast by hold] and [center casts] in the same button using initial_delay, usually 200 ms per button press
[combo holds]
initial_delay=0
combo1=LButton:7
initial_delay1=150
double_press1=true
double_press_time_gap1=300
combo2=RButton:6
initial_delay2=0
combo3=CapsLock:m
key_native_function3=false
combo4=Space:3
interrupt_delay4=3000
interrupt_duration4=200
-
literally holds the button down
-
in the first combo
-
7 is held if you hold LMB
-
some delay for pressing and holding 7 down is sometimes needed for it to work
- for example for Aether Ray on LMB
-
-
but sometimes not, especially if you want non-skills to be held, i.e. Force Move, Stationary Attack
-
also the 1st combo was made to start working on the 2nd click + hold which has to be no more than 300 ms after the 1 click
-
hold after single button press is the default option
-
multiple buttons can be held IIRC
-
initial_delay=0 [optional]
- is global for all the cast unless overridden by i.e. initial_delay1=300
-
key_native_function3=false [optional]
-
blocks the key native function
-
I advise not to use it in general because you won’t block skills from Hotbars / in-game mouse action anyway I think
-
I used it here for Capslock to not light up when I use it for showing/hiding the map
-
-
interrupt_delay4=3000, interrupt_duration4=200
- pressed buttons are released for 200ms every 3s
toggle holds (buttons held / pressed down on toggle)
- press a button once to have some button(s) held
- press it again to release
[toggle holds]
key_native_function=true
initial_delay=0
toggle1=Q:1
toggle2=Q:2
toggle3=A:1,2
key_native_function3=false
toggle4=LButton:7
initial_delay4=150
double_press4=true
double_press_time_gap4=300
It works similarly to other features. Please check them for details.
center casts (button presses combined with moving cursor to the center of the screen)
-
like Combo Press but also moves your cursor under your character’s feet for i.e. Inquisitor Seal
-
combine it with [combo presses], [autocast by hold] and [combo holds] in the same button using initial_delay, usually 200 ms per button press
[center casts]
center=500,500
screen_width=1920
screen_height=1280
off_center=true
cast1=RButton:7,6
initial_delay1=0
delay1=200
delay_after_cursor1=40
off_center1=false
-
center [optional] - only use if needed, normally center of the screen should be calculated automatically
-
screen_width, screen_height [optional]
- not needed because dimensions should be read correctly dynamically
but some users has issues with it and it’s a potential fix
- not needed because dimensions should be read correctly dynamically
-
off_center=true [optional]
- similar to the option off_center1 explain below but it’s global for a section and overwritten by off_center1
-
cast1=RButton:7,6
-
user’s mouse movement is blocked
-
cursor moves to the center of the screen
-
7 and 6 are pressed with 200 ms delay in-between them
-
cursor goes back after that
-
user’s mouse movement is unlocked
-
-
delay_after_cursor1=40
- should be as low as possible
-
off_center1=false
-
I normally use it with true
- which makes cursor not go to the center but slightly further from it so that the character’s rotation is not changing randomly which can sometimes happen with false
-
camera (quick keyboard / wheel camera rotation)
[camera]
angle=60
counter_clockwise=a
clockwise=d
rotation_key=k
delay=40
drag_delay=0
-
see [Tool] Faster camera rotation 🔄 using keyboard or scroll wheel
-
drag_delay - from 0 [default] to 100. Increase it if you need for dragging of the cursor used in this rotation to be slower
-
hotkeys responsible for (counter) clockwise rotations are turned on/off by suspend_key
fixed clicks (combination of clicks at defined pixels on the screen)
delay=25
initial_delay=0
go_back=true
clicks1=(75,165)(80,90)[234,234]
delay1=25
initial_delay1=0
repeat1=5
translation1=200,200
button1=CapsLock
key_native_function1=false
-
multiple clicks combos for changing pets to aggressive for example; can be combined with summoning them in 1 button
- here’s an example SUMMONING PETS EXAMPLE VIDEO + CONFIG
-
() means LMB click
-
[] means RMB click
-
go_back - moves cursor to initial position after the combo is finished
-
repeat - repeat the clicks from clicks that many times with optional translation
-
delay - time gap between clicks
- increasing it might be needed if it doesn’t work properly
-
initial_delay - time gap before the whole combo starts
- two combine it with summoning in 1 button
-
translation - next set of clicks (see repeat) is translated by this vector
- this accumulates with multiple repeatings
-
button - press this to activate the combo
-
key_native_function3=false [optional]
-
blocks the key native function
-
I advise not to use it in general because you won’t block skills from Hotbars / in-game mouse action anyway I think
-
I used it here for Capslock to not light up when I use it for showing/hiding the map
-
hold toggles (press some button to have another one pressed and pressed again on release of the first one / timeout and multiple button option to delay button release)
[hold toggles]
hold1=RButton:Space
hold2=RButton,Space,A:RAlt
time_out2=2000
-
hold1: Space is pressed on RMB press and again on its Release
-
hold2:
- RAlt is pressed on when you press RMB, Space or A
- RAlt is pressed again after you stop pressing or holding each of these buttons for 2 seconds
-
Example 1 - after you hold CHOSEN_BTN
- your Weapons are Swapped
- 100 ms later Shadow Strike and another Movement skill are spammed
- after that on CHOSEN_BTN release Weapons are Swapped again
[hold toggles] hold1=CHOSEN_BTN:WEAPON_SWAP_BTN [autocast by hold] cast1=CHOSEN_BTN:SS_BTN,OTHER_MV initial_delay1=100
-
Example 2 - if in Hold2 the RALt button hides items on the ground
and you keep pressing or holding your attack buttons RMB, Space and A in every 2s internal
items on the ground will be hidden during this “fight”
automatic camera (keeping the camera behind your back automatically)
[automatic camera]
rotate_left=b
rotate_right=n
initial_delay=200
rotate_key=LButton
delay=200
ignore_area_shape=circle
ignore_area_size=30
ignore_segment_angle=20
-
rotate_left [mandatory]
- in-game button resposible for left camera rotation
-
rotate_right [mandatory]
- in-game button reponsible for right camera rotation
-
initial_delay [optional] {200 by default}
- rotation starts this many milliseconds after you hold the rotate_key
-
rotate_key [mandatory]
- rotation activates when you hold this button
-
delay [optional] {100 by default}
- cursor position is checked every this many milliseconds
-
ignore_area_shape [optional]
- circle [default] or rectangle
- shape of area centered at the middle of the screen where rotation doesn’t take place
-
ignore_area_size [optional] {50 by default}
- this percentage of maximum area
-
which is either the whole screen
- in case of rectangle
-
or the biggest circle than can be fit on the screen
- in case of circle
-
- this percentage of maximum area
-
ignore_segment_angle [optional] {20 by default}
- half of the radius of a circular segment around 12 o’clock where rotations doesn’t take place
relative clicks (combination of clicks relative to current cursor position
[relative clicks]
delay=0
button1=1
rows1=2
columns1=10
width1=32
height1=32
button2=2
rows2=2
columns2=5
width2=64
height2=64
button3=3
rows3=2
columns3=5
width3=64
height3=96
- for generating items in GDStash
- better explained here
hacker (support for GDHacker)
[hacker]
speeds=2,1
speed_toggle=Q
speed_initial=1.5
speed_initial_delay=30000
freeze_tributes=true
stats_toggle=Tab
faster_camera=true
- speed_initial [optional]
- sets game’s speed to a given value once (on game’s launch)
- speed_initial_delay [optional]
- delay to the above
gamepad (center casts for gamepads)
Achieved by moving the cursor slightly which switches the game to & mode and then pressing or button with a skill. After that the user has to move the analog stick to go back to mode. Works best if you put the skill on RMB.
[gamepad]
delay=40
vertical_shift=-20
key=RButton
button_nr=6
-
delay [mandatory]
- delay in ms between button press and or press
-
vertical_shift [mandatory]
- correction of the y coordinate of the center center cast
-
key [mandatory]
- or button which you bind your skill to in-game
-
button_nr [mandatory]
- JoyDetect.zip (638.3 KB) (it’s from AutoHotkey official site to see which number X corresponds to your button)
(the program displays this window near your cursor)
- JoyDetect.zip (638.3 KB) (it’s from AutoHotkey official site to see which number X corresponds to your button)