KeyPress / KeyRelease variables not repeating after initial cast

Hi everyone!
My name is Charlotte and I am such a huge fan of GSE! :heart_eyes:

After a lot of years using other people’s macros, I wanted to try and create my own for my Paladin - but I can’t seem to make it work :confused: After three days of doing nothing but troubleshooting, testing, amending, testing, troubleshoot etc. I thought I’d go directly to the source for help :slight_smile:

So it seems like my macro is doing what it should immediately after I have done an edit and then saved it. But the next fight the macro variable KeyPress will not trigger anymore (or ever). If I edit/save, it works again for one fight.

Anyone has any idea?
Thank you in advance!

    ["Variables"] = {
        ["KeyPress"] = {
            [1] = "/castsequence [nochanneling] Divine Toll, Crusade, null"
        }
    },
    ["Actions"] = {
        [1] = {
            [1] = "~~KeyPress~~",
            [2] = "/castsequence [nochanneling] Judgment",
            ["Type"] = "Action"
        },
        [2] = {
            [1] = "~~KeyPress~~",
            [2] = "/castsequence [nochanneling] Wake of Ashes",
            ["Type"] = "Action"
        },
        [3] = {
            [1] = "~~KeyPress~~",
            [2] = "/castsequence [nochanneling] Crusader Strike",
            ["Type"] = "Action"
        },
        [4] = {
            [1] = "~~KeyPress~~",
            [2] = "/castsequence [nochanneling] Crusader Strike",
            ["Type"] = "Action"
        },
        [5] = {
            [1] = "~~KeyPress~~",
            [2] = "/castsequence [nochanneling] Consecration",
            ["Type"] = "Action"
        },
        [6] = {
            [1] = "~~KeyPress~~",
            [2] = "/castsequence [nochanneling] Shield of Vengeance",
            ["Type"] = "Action"
        }
    },
    ["InbuiltVariables"] = {
        ["Combat"] = true,
        ["Trinket1"] = true,
        ["Trinket2"] = true
    }
}

You don’t have a reset on your castsequence in your KeyPress variable. It won’t reset till you login next or you edit it.

Hi Timothy!
Thanks for your reply :slight_smile:

I tried it with adding a reset=combat/target (like below snippet), but then the rest of the actions will not cast.
“/castsequence [nochanneling] reset=combat/target Divine Toll, Crusade, null”

I don’t use castsequence as a rule as it’s broken, buggy and inconsistent - I’d try to keep it simple with either target or combat first rather than both then testing, Also using null doesn’t always work.

also all of these need to change as they are single casts:

/castsequence [nochanneling] Crusader Strike
should be /cast [nochanneling] Crusader Strike which also may not be helping

Last note: If you don’t have a trinket that requires channeling I’d also remove the [nochanneling]

1 Like

Thanks for your notes! I have indeed read that you have mentioned /castsequence being broken several times, but since every macro out there uses it… :wink:

I think we’re making progress though! I made the changes suggested, and what happens now is that the macro will only work if Crusade is off cool down, otherwise it locks all actions.

/castsequence  reset=target  Divine Toll, Crusade, null

The command “/cast reset=target” doesn’t seem to work, so I left that as castsequence. If I remove “null” at the end only the Variable will work, and not the Action Blocks.

This is now the current version:

{
    ["Variables"] = {
        ["KeyPress"] = {
            [1] = "/castsequence  reset=target  Divine Toll, Crusade, null"
        }
    },
    ["Actions"] = {
        [1] = {
            [1] = "~~KeyPress~~",
            [2] = "/cast Judgment",
            ["Type"] = "Action"
        },
        [2] = {
            [1] = "~~KeyPress~~",
            [2] = "/cast Wake of Ashes",
            ["Type"] = "Action"
        },
        [3] = {
            [1] = "~~KeyPress~~",
            [2] = "/cast Crusader Strike",
            ["Type"] = "Action"
        },
        [4] = {
            [1] = "~~KeyPress~~",
            [2] = "/cast Crusader Strike",
            ["Type"] = "Action"
        },
        [5] = {
            [1] = "~~KeyPress~~",
            [2] = "/cast Consecration",
            ["Type"] = "Action"
        },
        [6] = {
            [1] = "~~KeyPress~~",
            [2] = "/cast Shield of Vengeance",
            ["Type"] = "Action"
        }
    },
    ["InbuiltVariables"] = {
        ["Combat"] = true,
        ["Trinket1"] = true,
        ["Trinket2"] = true
    }
}


That could be if Crusade is on the Global Cool-down. WoW has a rule that the first GCD ability it sees irrespective of if it’s able to be used or not locks any other gcd abilities in that action.

1 Like

I looked it up, and with the release of Shadowlands the global cooldown seems to have been removed from Crusade. Maybe the problem lies with Divine Toll (covenant ability)?

1 Like

Would a solution be to have Crusade with KeyPress, and Divine Toll with KeyRelease instead? Or will that not make any difference? I tried this segment, and Crusade and Judgment are OK but Divine Toll is not triggering.

        ["KeyRelease"] = {
            [1] = "/cast Divine Toll"
        },
        ["KeyPress"] = {
            [1] = "/castsequence [nochanneling] Crusade, Judgment, null"
        }

I’m so sorry for all these questions, I am really trying to learn :slight_smile:

If you look at the compiled template you will see all the variables and gse options combined with the contents of each action - what is actually being sent to WoW each click. The way WoW interprets this is top down per action.

KeyPress and KeyRelease have no meaning. They are only placeholders for wherever you actually place them within the action. They could be called anything but where they are placed affects the action stack as a whole.

Now how WoW interprets this stack is as said top down. In this stack you can have an unlimited amount of non GCD abilities and these will be executed in sub microns of a millisecond. The limit is that only ONE GCD ability will be recognised though and that will be the very first one it sees. Irrespective of it that’s on cool-down, you have the mana or holy power or whatever - the first one it sees is the first one it will execute.

You have a castsequence which is trying to do something but you have to look at that in the context of the entire action and work through the issue. Something is blocking the stack. The command /gse debug will bring up a window and tell you what WoW was trying to execute from the stack and why it did or did not work.

But as soon as you start trying to figure out why your castsequence is doing anything you are in a world of black arts and pain as everything will tell you that it should work but it just won’t reliably. What it does do for some people is work. For others it will see the null and think thats an actual ability and lock up as it can’t cast that. What can happen is that WoW thinks null is short for Nullification Barrier and as you are not a DK it will just sit there locking the stack of everything that’s below it.

You will see a lot of macros use mods like [mod:shift] as opposed to castsequences for cool-downs. These work as they are what WoW sees when you hold the mod keys as opposed to the normal lines.

Now also as mentioned your divine bell will lock the macro if that’s on the GCD if it’s on cool-down and your KeyPress variable is at the top of your action. This is especially possible with reset=target if you switch targets while Divine Bell is on cool-down. (Remember top down for the stack). If it’s on the GCD and you place it after your main commandthen you would get the reverse - the main command will lock it out instead.

It’s all about being careful with placement and knowing which abilities are on the GCD and which aren’t.

1 Like

You could have

[2] = {
            [1] = "~~KeyRelease~~",
            [2] = "~~KeyPress~~",
            [3] = "/cast Wake of Ashes",
            ["Type"] = "Action"

Or

[2] = {
            [1] = "/cast Wake of Ashes",
            [2] = "~~KeyPress~~",
            ["Type"] = "Action"

Or even

[2] = {
            [1] = "~~someothernamehere~~",
            [2] = "/cast Wake of Ashes",
            ["Type"] = "Action"

And a different variable the next action.

All of those options will turn out differently and have different results.

1 Like

The other sub note - take ideas from other macros yes - but just because it’s how people do it - doesn’t mean that a) it will work for you and b) there isn’t a better way if you think through the problem and look at it differently without the baggage from the past that people keep trying to maintain.

1 Like

If I understand everything you wrote, I need to group spells into with and without GCD - as well as separate the spenders from the generators (yes, I read the Wiki :rofl:).
Is this correct?

E.g.:

GCD YES
Divine Toll
Wake of Ashes
Blade of Justice
Consecration
Templar’s Verdict
Final Reckoning
Divine Storm

GCD NO
Judgment
Avenging Wrath
Crusader Strike
Hammer of Wrath

SPENDERS
Templar’s Verdict
Divine Storm

GENERATORS
Judgment
Blade of Justice
Hammer of Wrath
Wake of Ashes

So I could basically put all the non-GCD generators into one Variable that gets triggered when I execute an Action for a spell that is on the GCD? :thinking: And I could create any amount of Variables with different names (e.g. Var1, Var2, Var3) and have each one execute with a different Action (ex. Crusader Strike -no GCD- activates together with Blade of Justice -on GCD)?
This would then be the safer bet to replace the buggy /castsequence line?

Oh man I hope I’m understanding everything correctly, my pea-sized brain is reaching its limits :rofl:

Also a BIG continued THANK YOU for your patience in trying to make me understand :heart:

This is what I have now - not perfect but it’s working just fine :smiling_face_with_three_hearts:

{
    ["Variables"] = {
        ["KeyPress"] = {
            [1] = "/cast Avenging Wrath"
        }
    },
    ["Actions"] = {
        [1] = {
            [1] = "/cast Judgment",
            ["Disabled"] = false,
            ["Type"] = "Action"
        },
        [2] = {
            [1] = {
                [1] = "/cast Divine Toll",
                [2] = "~~KeyPress~~",
                ["Type"] = "Action"
            },
            [2] = {
                [1] = "~~KeyPress~~",
                [2] = "/cast [@player] Final Reckoning",
                ["Disabled"] = false,
                ["Type"] = "Action"
            },
            [3] = {
                [1] = "~~KeyPress~~",
                [2] = "/cast Wake of Ashes",
                ["Type"] = "Action"
            },
            [4] = {
                [1] = "~~KeyPress~~",
                [2] = "/castsequence Crusader Strike, Crusader Strike",
                ["Type"] = "Action"
            },
            [5] = {
                [1] = "~~KeyPress~~",
                [2] = "/cast Blade of Justice",
                ["Type"] = "Action"
            },
            ["Repeat"] = 1,
            ["Type"] = "Loop",
            ["StepFunction"] = "Sequential"
        },
        [3] = {
            [1] = "/cast Consecration",
            ["Type"] = "Action"
        },
        [4] = {
            [1] = "/cast Shield of Vengeance",
            ["Type"] = "Action"
        }
    },
    ["InbuiltVariables"] = {
        ["Combat"] = true,
        ["Trinket1"] = true,
        ["Trinket2"] = true
    }
}


Just gotta figure out the loop sequence and priorities and I’ll get there :smiley:

im pretty sure Judgement is on the GCD.

also /castsequence Crusader Strike, Crusader Strike is exactly the same as /cast Crusader Strike

In your look you might want to try “Reverse Priority” instead of Sequential as the step function. (GSE3: Advanced Loop Step Functions Priority and Reverse Priority · TimothyLuke/GSE-Advanced-Macro-Compiler Wiki · GitHub)

Honestly I based my GCD list off Wowhead like a real noob. Better to test for real I guess :smiley:

I’ll try the Reverse Priority, thanks!
Are my assumptions about this here below correct though? Or are there limitations to how many Variables can be used in one Macro? And linking one Variable to one Action, and another Var to another Action etc.?

Oh man, everything is on GCD but Avenging Wrath! No wonder nothing worked :smiley: I will never trust Wowhead again! :wink:

Ok, one last question = I PROMISE!!!

Why is it when I run the below macro that the icon for the spells only switches between Judgment, Divine Bell, Avenging Wrath - and is not showing the other spells in the macro?

{
    ["Variables"] = {
        ["KeyPress"] = {
            [1] = "/targetenemy [noharm][dead]",
            [2] = "/cast [nomod] Avenging Wrath"
        }
    },
    ["Actions"] = {
        [1] = {
            [1] = "/cast Judgment",
            ["Type"] = "Action"
        },
        [2] = {
            [1] = {
                [1] = "/cast Divine Toll",
                [2] = "~~KeyPress~~",
                ["Type"] = "Action"
            },
            [2] = {
                [1] = "~~KeyPress~~",
                [2] = "/cast [@player] Final Reckoning",
                ["Type"] = "Action"
            },
            ["Repeat"] = 1,
            ["Type"] = "Loop",
            ["StepFunction"] = "Priority"
        },
        [3] = {
            [1] = "~~KeyPress~~",
            [2] = "/cast Crusader Strike",
            ["Type"] = "Action"
        },
        [4] = {
            [1] = "~~KeyPress~~",
            [2] = "/cast Blade of Justice",
            ["Type"] = "Action"
        },
        [5] = {
            [1] = "~~KeyPress~~",
            [2] = "/cast Crusader Strike",
            ["Type"] = "Action"
        }
    },
    ["InbuiltVariables"] = {
        ["Combat"] = true,
        ["Trinket1"] = true,
        ["Trinket2"] = true
    }
}




Edit: linked wrong one :innocent:

It will take teh first thing it sees which most of the time will be Avenging Wrath. Notice how its not in with Judgement and its After Divine Toll but before the others? (look at the action as a whole from the top down - Hunters keep putting all their pet stuff at the top of the action where it could be at the end and often have the same thing happen.)

Also /cast [nomod] Avenging Wrath as you have no mods could just be /cast Avenging Wrath Unless you are planning to hold shift or something to force it not to fire.