diff --git a/ComboPointTracker.lua b/ComboPointTracker.lua index 93a152b..44efe1b 100644 --- a/ComboPointTracker.lua +++ b/ComboPointTracker.lua @@ -418,42 +418,98 @@ 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 - originalCastSpell(id, bookType) + -- Safely try to track combo points without breaking the cast + local success, spellName = pcall(GetSpellName, 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 + if success and 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 (and capture return value) + local result1, result2, result3 = originalCastSpell(id, bookType) + + -- Track combo points after casting (with error protection) + if success and spellName and CleveRoids.IsComboScalingSpell(spellName) then + pcall(function() + CleveRoids.TrackComboPointCast(spellName) + if CleveRoids.ComboPointTracking[spellName] then + CleveRoids.ComboPointTracking[spellName].confirmed = true + end + end) + end + + return result1, result2, result3 end end if _G.UseAction then local originalUseAction = _G.UseAction _G.UseAction = function(slot, target, button) - -- Call original first - originalUseAction(slot, target, button) + -- Safely try to determine spell name without breaking action bar + local spellName = nil + pcall(function() + 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) - spellName = GameTooltipTextLeft1:GetText() + -- If no action text, it's likely a spell (not a macro) + if not actionText then + -- Try to get spell name from tooltip + -- Use a temporary hidden tooltip to avoid UI interference + local tooltip = getglobal("CleveRoidsComboTooltip") + if not tooltip then + tooltip = CreateFrame("GameTooltip", "CleveRoidsComboTooltip", nil, "GameTooltipTemplate") + tooltip:SetOwner(WorldFrame, "ANCHOR_NONE") + end + + tooltip:ClearLines() + tooltip:SetAction(slot) + local text = getglobal("CleveRoidsComboTooltipTextLeft1") + if text then + spellName = text:GetText() + end end - if spellName and CleveRoids.IsComboScalingSpell(spellName) and - CleveRoids.ComboPointTracking[spellName] then - CleveRoids.ComboPointTracking[spellName].confirmed = true + -- Capture combo points 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 + end) + + -- Call original to execute the action (and capture return value) + local result1, result2, result3 = originalUseAction(slot, target, button) + + -- Track combo points after casting (with error protection) + if spellName and CleveRoids.IsComboScalingSpell(spellName) then + pcall(function() + CleveRoids.TrackComboPointCast(spellName) + if CleveRoids.ComboPointTracking[spellName] then + CleveRoids.ComboPointTracking[spellName].confirmed = true + end + end) end + + return result1, result2, result3 end end end