Fix combo point tracking for spellbook and action bar casts

The CastSpell and UseAction hooks were only confirming existing
tracking, not actually creating it. They also called the original
functions before capturing combo points, so the points were already
consumed.

Changes to CastSpell hook (spellbook casts):
- Get spell name BEFORE calling original CastSpell
- Capture combo points to lastComboPoints if spell is combo scaling
- Call original to cast the spell
- Call TrackComboPointCast to track the combo points used
- Confirm the tracking

Changes to UseAction hook (action bar casts):
- Get spell name from action slot BEFORE calling original UseAction
- Fixed tooltip logic (was checking "not GetActionText" incorrectly)
- Capture combo points to lastComboPoints if spell is combo scaling
- Call original to execute the action
- Call TrackComboPointCast to track the combo points used
- Confirm the tracking

Both hooks now capture combo points at the exact moment before the
spell is cast, ensuring they're available in lastComboPoints for
TrackComboPointCast to use as a fallback.

This fixes tracking for:
- Clicking spells from spellbook (CastSpell)
- Clicking spells on action bars (UseAction)
- Keybinding spells on action bars (UseAction)
This commit is contained in:
Claude
2025-11-17 21:34:43 +00:00
parent 84a781a5fc
commit 2276daffdd
+61 -17
View File
@@ -418,18 +418,38 @@ function Extension.OnLoad()
Extension.Hook("CastSpellByName", "CastSpellByName_Hook")
end
-- Hook global CastSpell and UseAction for confirmation
-- Hook global CastSpell to track combo points from spellbook
if _G.CastSpell then
local originalCastSpell = _G.CastSpell
_G.CastSpell = function(id, bookType)
-- Call original first
-- Get spell name before casting
local spellName = GetSpellName(id, bookType)
-- Capture combo points BEFORE casting if it's a combo scaling spell
if spellName and CleveRoids.IsComboScalingSpell(spellName) then
local currentCP = CleveRoids.GetComboPoints()
if currentCP and currentCP > 0 then
CleveRoids.lastComboPoints = currentCP
if CleveRoids.debug then
DEFAULT_CHAT_FRAME:AddMessage(
string.format("|cffaaaaff[CastSpell]|r Captured %d combo points before casting %s",
currentCP, spellName)
)
end
end
end
-- Call original to cast the spell
originalCastSpell(id, bookType)
-- Confirm tracking for combo spells
local spellName = GetSpellName(id, bookType)
if spellName and CleveRoids.IsComboScalingSpell(spellName) and
CleveRoids.ComboPointTracking[spellName] then
CleveRoids.ComboPointTracking[spellName].confirmed = true
-- Track combo points after casting
if spellName and CleveRoids.IsComboScalingSpell(spellName) then
CleveRoids.TrackComboPointCast(spellName)
-- Confirm the tracking
if CleveRoids.ComboPointTracking[spellName] then
CleveRoids.ComboPointTracking[spellName].confirmed = true
end
end
end
end
@@ -437,20 +457,44 @@ function Extension.OnLoad()
if _G.UseAction then
local originalUseAction = _G.UseAction
_G.UseAction = function(slot, target, button)
-- Call original first
originalUseAction(slot, target, button)
-- Try to determine spell name from action slot BEFORE casting
local spellName = nil
local actionText = GetActionText(slot)
-- Try to determine spell name from action slot
if not GetActionText(slot) and IsCurrentAction(slot) then
local spellName = GetActionText(slot)
if not spellName then
-- Try to get from tooltip
GameTooltip:SetAction(slot)
-- If no action text, it's likely a spell (not a macro)
if not actionText then
-- Try to get from tooltip
GameTooltip:SetOwner(UIParent, "ANCHOR_NONE")
GameTooltip:SetAction(slot)
if GameTooltipTextLeft1 then
spellName = GameTooltipTextLeft1:GetText()
end
GameTooltip:Hide()
end
if spellName and CleveRoids.IsComboScalingSpell(spellName) and
CleveRoids.ComboPointTracking[spellName] then
-- Capture combo points BEFORE casting if it's a combo scaling spell
if spellName and CleveRoids.IsComboScalingSpell(spellName) then
local currentCP = CleveRoids.GetComboPoints()
if currentCP and currentCP > 0 then
CleveRoids.lastComboPoints = currentCP
if CleveRoids.debug then
DEFAULT_CHAT_FRAME:AddMessage(
string.format("|cffaaaaff[UseAction]|r Captured %d combo points before casting %s",
currentCP, spellName)
)
end
end
end
-- Call original to execute the action
originalUseAction(slot, target, button)
-- Track combo points after casting
if spellName and CleveRoids.IsComboScalingSpell(spellName) then
CleveRoids.TrackComboPointCast(spellName)
-- Confirm the tracking
if CleveRoids.ComboPointTracking[spellName] then
CleveRoids.ComboPointTracking[spellName].confirmed = true
end
end