From caae9dcb882cedc546c48ec075a77fe89c7a91e8 Mon Sep 17 00:00:00 2001 From: Dusk-92 Date: Wed, 2 Sep 2026 22:18:21 +0200 Subject: [PATCH] Make libpredict dormant until healing predictions are enabled --- libs/libpredict.lua | 95 ++++++++++++++++++++++++++++----------------- 1 file changed, 60 insertions(+), 35 deletions(-) diff --git a/libs/libpredict.lua b/libs/libpredict.lua index 3b88de1..4d4e278 100644 --- a/libs/libpredict.lua +++ b/libs/libpredict.lua @@ -26,9 +26,7 @@ do -- Prayer of Healing end local libpredict = CreateFrame("Frame") -libpredict:RegisterEvent("UNIT_HEALTH") -libpredict:RegisterEvent("CHAT_MSG_ADDON") -libpredict:RegisterEvent("PLAYER_TARGET_CHANGED") +libpredict.enabled = false libpredict:SetScript("OnEvent", function() if event == "CHAT_MSG_ADDON" and (arg1 == "HealComm" or arg1 == "CTRA") then this:ParseChatMessage(arg4, arg2, arg1) @@ -256,9 +254,6 @@ local realm = GetRealmName() local player = UnitName("player") local cache, gear_string = {}, "" local resetcache = CreateFrame("Frame") -resetcache:RegisterEvent("PLAYER_ENTERING_WORLD") -resetcache:RegisterEvent("SKILL_LINES_CHANGED") -resetcache:RegisterEvent("UNIT_INVENTORY_CHANGED") resetcache:SetScript("OnEvent", function() if event == "PLAYER_ENTERING_WORLD" then -- load and initialize previous caches of spell amounts @@ -314,27 +309,30 @@ local function UpdateCache(spell, heal, crit) end end --- Gather Data by User Actions -hooksecurefunc("CastSpell", function(id, bookType) +-- Gather Data by User Actions. Hooks are installed lazily by libpredict:Enable() +-- so disabling healing predictions leaves no spell hook on the hot path. +local scanner = libtipscan:GetScanner("prediction") +local hooksInstalled + +local function TrackCastSpell(id, bookType) if not libpredict.sender.enabled then return end local effect, rank = libspell.GetSpellInfo(id, bookType) if not effect then return end spell_queue[1] = effect spell_queue[2] = effect.. ( rank or "" ) spell_queue[3] = UnitName("target") and UnitCanAssist("player", "target") and UnitName("target") or UnitName("player") -end) +end -hooksecurefunc("CastSpellByName", function(effect, target) +local function TrackCastSpellByName(effect, target) if not libpredict.sender.enabled then return end local effect, rank = libspell.GetSpellInfo(effect) if not effect then return end spell_queue[1] = effect spell_queue[2] = effect.. ( rank or "" ) spell_queue[3] = UnitName("target") and UnitCanAssist("player", "target") and UnitName("target") or UnitName("player") -end) +end -local scanner = libtipscan:GetScanner("prediction") -hooksecurefunc("UseAction", function(slot, target, selfcast) +local function TrackUseAction(slot, target, selfcast) if not libpredict.sender.enabled then return end if GetActionText(slot) or not IsCurrentAction(slot) then return end scanner:SetAction(slot) @@ -343,10 +341,18 @@ hooksecurefunc("UseAction", function(slot, target, selfcast) spell_queue[1] = effect spell_queue[2] = effect.. ( rank or "" ) spell_queue[3] = selfcast and UnitName("player") or UnitName("target") and UnitCanAssist("player", "target") and UnitName("target") or UnitName("player") -end) +end + +local function InstallSenderHooks() + if hooksInstalled then return end + hooksecurefunc("CastSpell", TrackCastSpell) + hooksecurefunc("CastSpellByName", TrackCastSpellByName) + hooksecurefunc("UseAction", TrackUseAction) + hooksInstalled = true +end libpredict.sender = CreateFrame("Frame", "ShaguTweaksPredictionSender", UIParent) -libpredict.sender.enabled = true +libpredict.sender.enabled = false libpredict.sender.SendHealCommMsg = function(self, msg) SendAddonMessage("HealComm", msg, "RAID") SendAddonMessage("HealComm", msg, "BATTLEGROUND") @@ -356,26 +362,6 @@ libpredict.sender.SendResCommMsg = function(self, msg) SendAddonMessage("CTRA", msg, "BATTLEGROUND") end --- tbc -libpredict.sender:RegisterEvent("COMBAT_LOG_EVENT_UNFILTERED") -libpredict.sender:RegisterEvent("UNIT_SPELLCAST_START") -libpredict.sender:RegisterEvent("UNIT_SPELLCAST_STOP") -libpredict.sender:RegisterEvent("UNIT_SPELLCAST_FAILED") -libpredict.sender:RegisterEvent("UNIT_SPELLCAST_INTERRUPTED") -libpredict.sender:RegisterEvent("UNIT_SPELLCAST_SENT") - --- vanilla -libpredict.sender:RegisterEvent("CHAT_MSG_SPELL_SELF_BUFF") -libpredict.sender:RegisterEvent("SPELLCAST_START") -libpredict.sender:RegisterEvent("SPELLCAST_STOP") -libpredict.sender:RegisterEvent("SPELLCAST_FAILED") -libpredict.sender:RegisterEvent("SPELLCAST_INTERRUPTED") -libpredict.sender:RegisterEvent("SPELLCAST_DELAYED") - --- force cache updates -libpredict.sender:RegisterEvent("UNIT_INVENTORY_CHANGED") -libpredict.sender:RegisterEvent("SKILL_LINES_CHANGED") - libpredict.sender:SetScript("OnEvent", function() if event == "CHAT_MSG_SPELL_SELF_BUFF" then -- vanilla local spell, _, heal = cmatch(arg1, HEALEDSELFOTHER) -- "Your %s heals %s for %d." @@ -484,4 +470,43 @@ libpredict.sender:SetScript("OnEvent", function() end end) +function libpredict:Enable() + if self.enabled then return end + + self.enabled = true + self.sender.enabled = true + + -- incoming HealComm / resurrection tracking + self:RegisterEvent("UNIT_HEALTH") + self:RegisterEvent("CHAT_MSG_ADDON") + self:RegisterEvent("PLAYER_TARGET_CHANGED") + + -- prediction cache lifecycle + resetcache:RegisterEvent("PLAYER_ENTERING_WORLD") + resetcache:RegisterEvent("SKILL_LINES_CHANGED") + resetcache:RegisterEvent("UNIT_INVENTORY_CHANGED") + + -- tbc + self.sender:RegisterEvent("COMBAT_LOG_EVENT_UNFILTERED") + self.sender:RegisterEvent("UNIT_SPELLCAST_START") + self.sender:RegisterEvent("UNIT_SPELLCAST_STOP") + self.sender:RegisterEvent("UNIT_SPELLCAST_FAILED") + self.sender:RegisterEvent("UNIT_SPELLCAST_INTERRUPTED") + self.sender:RegisterEvent("UNIT_SPELLCAST_SENT") + + -- vanilla + self.sender:RegisterEvent("CHAT_MSG_SPELL_SELF_BUFF") + self.sender:RegisterEvent("SPELLCAST_START") + self.sender:RegisterEvent("SPELLCAST_STOP") + self.sender:RegisterEvent("SPELLCAST_FAILED") + self.sender:RegisterEvent("SPELLCAST_INTERRUPTED") + self.sender:RegisterEvent("SPELLCAST_DELAYED") + + -- force cache updates + self.sender:RegisterEvent("UNIT_INVENTORY_CHANGED") + self.sender:RegisterEvent("SKILL_LINES_CHANGED") + + InstallSenderHooks() +end + ShaguTweaks.libpredict = libpredict \ No newline at end of file