NOTE I have created a plugin for all of my Demon Hunter sequences, they are available at both Curseforge and Wago. Just search for ‘Elfyau’ or ‘GSE’
This is my first working pass, built to get you the correct talent strings and a clean, usable sequence so you can dive straight into the chaos without setup headaches. It’s all about making Havoc playable and smooth right out of the gate.
It’s an early build, but it should feel fast and reliable in combat. I hope it flows nicely for you — happy slashing!
CHANGES:-
TALENTS: Changed hero set and other major talent changes.
SEQUENCE: Major changes to the sequence.
MACROS: None.
Your feedback is the secret ingredient that transforms great macros into legendary ones! Every click, comment, and suggestion is a building block for future awesomeness.
Let’s work together to create macros that elevate your gameplay to the next level. Help me make them smoother, stronger, and faster! Let’s unlock the full potential of your character together!
P.S. You can find me on Patreon and other social links at: Links - Elfyau
Elfy! You have done it again thanks for the amazing macro so good if I would say only one maybe not Blur as much but thats just being picky lol thanks again
I’m getting this error when running this after about 45 seconds.
Message: Interface/AddOns/GSE/API/Storage.lua:547: attempt to index field ‘?’ (a nil value)
Time: Mon Feb 9 12:45:24 2026
Count: 9
Stack:
[Interface/AddOns/Blizzard_RestrictedAddOnEnvironment/RestrictedExecution.lua]:485: in function <…d_RestrictedAddOnEnvironment/RestrictedExecution.lua:448>
[tail call]: ?
[Interface/AddOns/Blizzard_RestrictedAddOnEnvironment/SecureHandlers.lua]:285: in function <…izzard_RestrictedAddOnEnvironment/SecureHandlers.lua:279>
[tail call]: ?
Locals:
owningFrame = EA_HDH_v0.1 {
}
signature = “self,button,down”
body = " local mods = “RALT=” .. tostring(IsRightAltKeyDown()) .. “|” ..
“LALT=”.. tostring(IsLeftAltKeyDown()) .. “|” ..
“AALT=” .. tostring(IsAltKeyDown()) .. “|” ..
“RCTRL=” .. tostring(IsRightControlKeyDown()) .. “|” ..
“LCTRL=” .. tostring(IsLeftControlKeyDown()) .. “|” ..
“ACTRL=” .. tostring(IsControlKeyDown()) .. “|” ..
“RSHIFT=” .. tostring(IsRightShiftKeyDown()) .. “|” ..
“LSHIFT=” .. tostring(IsLeftShiftKeyDown()) .. “|” ..
“ASHIFT=” .. tostring(IsShiftKeyDown()) .. “|” ..
“AMOD=” .. tostring(IsModifierKeyDown()) .. “|” ..
“MOUSEBUTTON=” .. GetMouseButtonClicked()
self:SetAttribute(‘localmods’, mods)
local iteration = self:GetAttribute(‘iteration’) or 1
local step = self:GetAttribute(‘step’)
step = tonumber(step)
iteration = tonumber(iteration)
if self:GetAttribute(‘stepped’) then
self:SetAttribute(‘stepped’, false)
else
for k,v in pairs(spelllist[iteration][step]) do
if k == “macrotext” then
factory = {
}
LOCAL_Closure_Factories = {
self = {
}
self,button,down = {
}
}
LOCAL_execution_count = 1
Well damn… I’ve deleted all my havoc sequences prior to importing this one. Is there another way to purge GSE of all the sequences besides right-click → delete?