Make libpredict dormant until healing predictions are enabled

This commit is contained in:
Dusk-92
2026-09-02 22:18:21 +02:00
parent ebf78b5c75
commit caae9dcb88
+60 -35
View File
@@ -26,9 +26,7 @@ do -- Prayer of Healing
end end
local libpredict = CreateFrame("Frame") local libpredict = CreateFrame("Frame")
libpredict:RegisterEvent("UNIT_HEALTH") libpredict.enabled = false
libpredict:RegisterEvent("CHAT_MSG_ADDON")
libpredict:RegisterEvent("PLAYER_TARGET_CHANGED")
libpredict:SetScript("OnEvent", function() libpredict:SetScript("OnEvent", function()
if event == "CHAT_MSG_ADDON" and (arg1 == "HealComm" or arg1 == "CTRA") then if event == "CHAT_MSG_ADDON" and (arg1 == "HealComm" or arg1 == "CTRA") then
this:ParseChatMessage(arg4, arg2, arg1) this:ParseChatMessage(arg4, arg2, arg1)
@@ -256,9 +254,6 @@ local realm = GetRealmName()
local player = UnitName("player") local player = UnitName("player")
local cache, gear_string = {}, "" local cache, gear_string = {}, ""
local resetcache = CreateFrame("Frame") local resetcache = CreateFrame("Frame")
resetcache:RegisterEvent("PLAYER_ENTERING_WORLD")
resetcache:RegisterEvent("SKILL_LINES_CHANGED")
resetcache:RegisterEvent("UNIT_INVENTORY_CHANGED")
resetcache:SetScript("OnEvent", function() resetcache:SetScript("OnEvent", function()
if event == "PLAYER_ENTERING_WORLD" then if event == "PLAYER_ENTERING_WORLD" then
-- load and initialize previous caches of spell amounts -- load and initialize previous caches of spell amounts
@@ -314,27 +309,30 @@ local function UpdateCache(spell, heal, crit)
end end
end end
-- Gather Data by User Actions -- Gather Data by User Actions. Hooks are installed lazily by libpredict:Enable()
hooksecurefunc("CastSpell", function(id, bookType) -- 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 if not libpredict.sender.enabled then return end
local effect, rank = libspell.GetSpellInfo(id, bookType) local effect, rank = libspell.GetSpellInfo(id, bookType)
if not effect then return end if not effect then return end
spell_queue[1] = effect spell_queue[1] = effect
spell_queue[2] = effect.. ( rank or "" ) spell_queue[2] = effect.. ( rank or "" )
spell_queue[3] = UnitName("target") and UnitCanAssist("player", "target") and UnitName("target") or UnitName("player") 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 if not libpredict.sender.enabled then return end
local effect, rank = libspell.GetSpellInfo(effect) local effect, rank = libspell.GetSpellInfo(effect)
if not effect then return end if not effect then return end
spell_queue[1] = effect spell_queue[1] = effect
spell_queue[2] = effect.. ( rank or "" ) spell_queue[2] = effect.. ( rank or "" )
spell_queue[3] = UnitName("target") and UnitCanAssist("player", "target") and UnitName("target") or UnitName("player") spell_queue[3] = UnitName("target") and UnitCanAssist("player", "target") and UnitName("target") or UnitName("player")
end) end
local scanner = libtipscan:GetScanner("prediction") local function TrackUseAction(slot, target, selfcast)
hooksecurefunc("UseAction", function(slot, target, selfcast)
if not libpredict.sender.enabled then return end if not libpredict.sender.enabled then return end
if GetActionText(slot) or not IsCurrentAction(slot) then return end if GetActionText(slot) or not IsCurrentAction(slot) then return end
scanner:SetAction(slot) scanner:SetAction(slot)
@@ -343,10 +341,18 @@ hooksecurefunc("UseAction", function(slot, target, selfcast)
spell_queue[1] = effect spell_queue[1] = effect
spell_queue[2] = effect.. ( rank or "" ) 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") 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 = CreateFrame("Frame", "ShaguTweaksPredictionSender", UIParent)
libpredict.sender.enabled = true libpredict.sender.enabled = false
libpredict.sender.SendHealCommMsg = function(self, msg) libpredict.sender.SendHealCommMsg = function(self, msg)
SendAddonMessage("HealComm", msg, "RAID") SendAddonMessage("HealComm", msg, "RAID")
SendAddonMessage("HealComm", msg, "BATTLEGROUND") SendAddonMessage("HealComm", msg, "BATTLEGROUND")
@@ -356,26 +362,6 @@ libpredict.sender.SendResCommMsg = function(self, msg)
SendAddonMessage("CTRA", msg, "BATTLEGROUND") SendAddonMessage("CTRA", msg, "BATTLEGROUND")
end 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() libpredict.sender:SetScript("OnEvent", function()
if event == "CHAT_MSG_SPELL_SELF_BUFF" then -- vanilla if event == "CHAT_MSG_SPELL_SELF_BUFF" then -- vanilla
local spell, _, heal = cmatch(arg1, HEALEDSELFOTHER) -- "Your %s heals %s for %d." local spell, _, heal = cmatch(arg1, HEALEDSELFOTHER) -- "Your %s heals %s for %d."
@@ -484,4 +470,43 @@ libpredict.sender:SetScript("OnEvent", function()
end end
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 ShaguTweaks.libpredict = libpredict