From efa46b48d8106afdb5a15b500b9f02ed7659a448 Mon Sep 17 00:00:00 2001 From: Dusk-92 Date: Thu, 3 Sep 2026 11:29:37 +0200 Subject: [PATCH] Remove prediction action hooks with ClassicAPI --- libs/libpredict.lua | 35 ++++++++++++++++++++++++++++------- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/libs/libpredict.lua b/libs/libpredict.lua index 16c514c..a669f9c 100644 --- a/libs/libpredict.lua +++ b/libs/libpredict.lua @@ -314,6 +314,7 @@ end -- so disabling healing predictions leaves no spell hook on the hot path. local scanner local hooksInstalled +local useClassicSenderEvents local function TrackCastSpell(id, bookType) if not libpredict.sender.enabled then return end @@ -418,10 +419,26 @@ libpredict.sender:SetScript("OnEvent", function() end elseif event == "UNIT_SPELLCAST_SENT" then if arg1 ~= "player" then return end - -- ClassicAPI follows the modern event shape: unit, target, castGUID, - -- spellID, spellName, rank. TBC's legacy shape stores target in arg4. - local castTarget = GetExpansion() == "vanilla" and arg2 or arg4 - senttarget = castTarget and castTarget ~= "" and castTarget or nil + + if GetExpansion() == "vanilla" and useClassicSenderEvents then + -- ClassicAPI already resolved the actual outgoing spell and target: + -- unit, target, castGUID, spellID, spellName, rank. Use it directly so + -- prediction tracking needs no CastSpell/UseAction hooks at all. + local target = arg2 and arg2 ~= "" and arg2 or UnitName("player") + local spell = arg5 + local rank = arg6 or "" + + senttarget = target + if spell then + spell_queue[1] = spell + spell_queue[2] = spell .. rank + spell_queue[3] = target + end + else + -- Native TBC layout keeps the target in arg4. + local castTarget = arg4 + senttarget = castTarget and castTarget ~= "" and castTarget or nil + end elseif strfind(event, "SPELLCAST_START", 1) then local spell, time = arg1, arg2 @@ -527,17 +544,19 @@ function libpredict:Enable() -- those instead of registering both event families and processing each cast -- twice. Keep the native SPELLCAST_DELAYED event because it carries the -- exact delay delta consumed by HealDelay(). - local useClassicCastEvents = API and API.eventutils and _G.C_EventUtils + useClassicSenderEvents = API and API.eventutils and _G.C_EventUtils and _G.C_EventUtils.IsEventValid("UNIT_SPELLCAST_START") and _G.C_EventUtils.IsEventValid("UNIT_SPELLCAST_STOP") and _G.C_EventUtils.IsEventValid("UNIT_SPELLCAST_FAILED") + and _G.C_EventUtils.IsEventValid("UNIT_SPELLCAST_FAILED_QUIET") and _G.C_EventUtils.IsEventValid("UNIT_SPELLCAST_INTERRUPTED") and _G.C_EventUtils.IsEventValid("UNIT_SPELLCAST_SENT") - if useClassicCastEvents then + if useClassicSenderEvents then self.sender:RegisterEvent("UNIT_SPELLCAST_START") self.sender:RegisterEvent("UNIT_SPELLCAST_STOP") self.sender:RegisterEvent("UNIT_SPELLCAST_FAILED") + self.sender:RegisterEvent("UNIT_SPELLCAST_FAILED_QUIET") self.sender:RegisterEvent("UNIT_SPELLCAST_INTERRUPTED") self.sender:RegisterEvent("UNIT_SPELLCAST_SENT") else @@ -563,7 +582,9 @@ function libpredict:Enable() self.sender:RegisterEvent("UNIT_INVENTORY_CHANGED") self.sender:RegisterEvent("SKILL_LINES_CHANGED") - InstallSenderHooks() + if not useClassicSenderEvents then + InstallSenderHooks() + end end ShaguTweaks.libpredict = libpredict \ No newline at end of file