With Grimoire of Sacrifice active, the Warlock dispel binding in ClickCasting/Quickdraw stops working.
Singe Magic is the only Warlock dispel in the preset list and it is flagged as a pet spell (EllesmereUIRaidFrames/EUI_RaidFrames_ClickCast.lua:82):
{ id = 89808, name = "Singe Magic", class = "WARLOCK", pet = true }, -- Imp
That flag routes it into the known-check bypass (lines 336-345):
local PET_SPELL_IDS = {}
for _, sp in ipairs(DISPEL_SPELLS) do
if sp.pet then PET_SPELL_IDS[sp.id] = true end
end
local function IsSpellIDKnown(id)
if type(id) ~= "number" or id <= 0 or PET_SPELL_IDS[id] then return true end
local bank = Enum.SpellBookSpellBank and Enum.SpellBookSpellBank.Player
So the binding is always reported known and is never filtered out - but under Grimoire of Sacrifice there is no pet, so the cast itself has nothing to go to. The bypass hides the state rather than resolving it, which is why it presents as a binding that exists but does nothing.
Grimoire of Sacrifice (108503) is already understood elsewhere in the codebase - AuraBuffReminders suppresses its pet reminders via the Sacrifice aura (EllesmereUIAuraBuffReminders.lua:4079):
if Known(108503) and PlayerHasAuraByID({196099}) then suppress = true end
and the CDM interrupt resolver walks overrides and the Pet bank explicitly, with a comment that Command Demon can stay known while the castable form changes (EllesmereUICooldownManager.lua:6514-6532, ns.ResolveCastableInterrupt). ClickCast's IsSpellIDKnown does neither - it only ever consults Enum.SpellBookSpellBank.Player and otherwise short-circuits.
So there is an existing in-repo pattern (resolve through FindSpellOverrideByID / check the Pet bank / detect the 196099 aura) that the ClickCast path does not use. Whether a sacrificed Warlock should keep a working dispel binding at all is a design call - Grimoire of Sacrifice does not grant a replacement dispel, so the honest outcome may be to hide the binding rather than make it castable.
Environment: retail, EllesmereUI 9.2.1.
This path is secure/taint-sensitive, so flagging rather than patching blind. Reported from source reading; not reproduced on a live character.
Filed by an AI agent (OpenHands) on behalf of the repo user.
With Grimoire of Sacrifice active, the Warlock dispel binding in ClickCasting/Quickdraw stops working.
Singe Magic is the only Warlock dispel in the preset list and it is flagged as a pet spell (
EllesmereUIRaidFrames/EUI_RaidFrames_ClickCast.lua:82):{ id = 89808, name = "Singe Magic", class = "WARLOCK", pet = true }, -- ImpThat flag routes it into the known-check bypass (lines 336-345):
So the binding is always reported known and is never filtered out - but under Grimoire of Sacrifice there is no pet, so the cast itself has nothing to go to. The bypass hides the state rather than resolving it, which is why it presents as a binding that exists but does nothing.
Grimoire of Sacrifice (108503) is already understood elsewhere in the codebase - AuraBuffReminders suppresses its pet reminders via the Sacrifice aura (
EllesmereUIAuraBuffReminders.lua:4079):and the CDM interrupt resolver walks overrides and the Pet bank explicitly, with a comment that Command Demon can stay known while the castable form changes (
EllesmereUICooldownManager.lua:6514-6532,ns.ResolveCastableInterrupt). ClickCast'sIsSpellIDKnowndoes neither - it only ever consultsEnum.SpellBookSpellBank.Playerand otherwise short-circuits.So there is an existing in-repo pattern (resolve through
FindSpellOverrideByID/ check the Pet bank / detect the 196099 aura) that the ClickCast path does not use. Whether a sacrificed Warlock should keep a working dispel binding at all is a design call - Grimoire of Sacrifice does not grant a replacement dispel, so the honest outcome may be to hide the binding rather than make it castable.Environment: retail, EllesmereUI 9.2.1.
This path is secure/taint-sensitive, so flagging rather than patching blind. Reported from source reading; not reproduced on a live character.
Filed by an AI agent (OpenHands) on behalf of the repo user.