From 1f0be83c7de38c676114938037dc3aecb5362ded Mon Sep 17 00:00:00 2001 From: praxis <889+praxis@noreply.octowow.st> Date: Sun, 13 Sep 2026 09:51:28 +0000 Subject: [PATCH] Add modules/energytick.lua --- modules/energytick.lua | 136 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100644 modules/energytick.lua diff --git a/modules/energytick.lua b/modules/energytick.lua new file mode 100644 index 0000000..fceeb23 --- /dev/null +++ b/modules/energytick.lua @@ -0,0 +1,136 @@ +local function getAdjustedTickTimer() + local adjustedEnergyTick = 2 + + -- Check rogue talents and compute energy tick timing reduction for Combat spec (1.18.0 Blade Rush Talent) + if UnitClass("player") == "Rogue" then + local _, _, _, _, currRank = GetTalentInfo(2, 16) + local bladeRushRank = currRank or 0 + + if bladeRushRank > 0 then + local agility = UnitStat("player", 2) -- 2 is agility stat index + local reductionPerAgi = 0.0006 * bladeRushRank -- 0.0006 for rank 1, 0.0012 for rank 2 + local totalReduction = agility * reductionPerAgi + adjustedEnergyTick = adjustedEnergyTick - totalReduction + end + end + + return adjustedEnergyTick +end + +pfUI:RegisterModule("energytick", "vanilla:tbc", function() + if not pfUI.uf or not pfUI.uf.player then + return + end + + local energytick = CreateFrame("Frame", nil, pfUI.uf.player.power.bar) + energytick:SetAllPoints(pfUI.uf.player.power.bar) + energytick:RegisterEvent("PLAYER_ENTERING_WORLD") + energytick:RegisterEvent("UNIT_DISPLAYPOWER") + energytick:RegisterEvent("UNIT_ENERGY") + energytick:RegisterEvent("UNIT_MANA") + energytick:RegisterEvent("CHAT_MSG_SPELL_SELF_BUFF") + energytick:RegisterEvent("CHAT_MSG_SPELL_PERIODIC_SELF_BUFFS") + + energytick:SetScript("OnEvent", function() + if UnitPowerType("player") == 0 and C.unitframes.player.manatick == "1" then + this.mode = "MANA" + this:Show() + elseif UnitPowerType("player") == 3 and C.unitframes.player.energy == "1" then + this.mode = "ENERGY" + this:Show() + else + this:Hide() + end + + -- Filter nur eigene Energy-Gewinne von Talents/Buffs + if event == "CHAT_MSG_SPELL_SELF_BUFF" or event == "CHAT_MSG_SPELL_PERIODIC_SELF_BUFFS" then + if string.find(arg1, "You gain") and string.find(arg1, "Energy from") then + this.ignoreNextGain = true + end + return + end + + if event == "PLAYER_ENTERING_WORLD" then + this.lastMana = UnitMana("player") + end + + if (event == "UNIT_MANA" or event == "UNIT_ENERGY") and arg1 == "player" then + this.currentMana = UnitMana("player") + local diff = 0 + if this.lastMana then + diff = this.currentMana - this.lastMana + end + + if this.mode == "MANA" and diff < 0 then + this.target = 5 + elseif this.mode == "MANA" and diff > 0 then + if UnitMana("player") >= UnitManaMax("player") then + this.start = nil + this.spark:SetAlpha(0) + this:Hide() + elseif this.max ~= 5 and diff > (this.badtick and this.badtick * 1.2 or 5) then + this.target = 2 + else + this.badtick = diff + end + elseif this.mode == "ENERGY" and diff >= 0 then + if not this.ignoreNextGain then + this.target = getAdjustedTickTimer() + end + this.ignoreNextGain = false + end + this.lastMana = this.currentMana + end + end) + + energytick:SetScript("OnUpdate", function() + -- Throttle for performance + if (this.tick or 0) > GetTime() then + return + end + this.tick = GetTime() + 0.020 -- ~50 FPS + + if this.target then + this.start, this.max = GetTime(), this.target + this.target = nil + this.spark:SetAlpha(1) + this:Show() + end + + if not this.start then + return + end + + this.current = GetTime() - this.start + + if this.current > this.max then + -- Don't restart tick timer if mana is full + if this.mode == "MANA" and UnitMana("player") >= UnitManaMax("player") then + this.start = nil + this.spark:SetAlpha(0) + return + end + this.start, this.max, this.current = GetTime(), getAdjustedTickTimer(), 0 + end + + local pos = (C.unitframes.player.pwidth ~= "-1" and C.unitframes.player.pwidth or C.unitframes.player.width) + * (this.current / this.max) + if not C.unitframes.player.pheight then + return + end + this.spark:SetPoint("LEFT", pos - ((C.unitframes.player.pheight + 5) / 2), 0) + end) + + energytick.spark = energytick:CreateTexture(nil, "OVERLAY") + energytick.spark:SetTexture("Interface\\CastingBar\\UI-CastingBar-Spark") + energytick.spark:SetHeight(C.unitframes.player.pheight + 15) + energytick.spark:SetWidth(C.unitframes.player.pheight + 5) + energytick.spark:SetBlendMode("ADD") + + local hookUpdateConfig = pfUI.uf.player.UpdateConfig + function pfUI.uf.player.UpdateConfig() + energytick.spark:SetHeight(C.unitframes.player.pheight + 15) + energytick.spark:SetWidth(C.unitframes.player.pheight + 5) + hookUpdateConfig(pfUI.uf.player) + end +end) \ No newline at end of file