Add files via upload

This commit is contained in:
Mquadrat
2026-09-11 19:16:52 +02:00
committed by GitHub
parent 728a3ab5c6
commit 2b57864a47
4 changed files with 69 additions and 21 deletions
+24 -3
View File
@@ -1,6 +1,27 @@
# Changelog
## 1.4.5 (2026-09-09)
## 1.4.5.1 (2026-09-08)
Two display fixes: the mana ticker spark moves smoothly again, and the global cooldown no longer greys out every button.
### English
**Fixed**
- **The mana ticker spark moves smoothly again.** The spark was only redrawn once it had travelled half a pixel. That sounds frugal, but it crosses the bar in five seconds, roughly 20 pixels per second, so at 60 frames it advanced on every second frame at best and, depending on rounding, sometimes after one frame and sometimes after two. That uneven step was the stutter, and the fixed 0.03 second redraw step introduced in 1.4.5 made it worse. The threshold is now effectively gone (0.05 px) and the spark is drawn every frame again, which doubles its motion from 30 to 60 steps per second with an even gap.
- **Drawing every frame still costs nothing.** Each spark remembers the width and height of its bar and re-reads them four times a second (`FBTICK_GEOM_STEP`) instead of asking the frame on every pass, and the gate check sits in front of it all: with a full mana bar there is no pass at all.
- **The global cooldown no longer darkens every button.** After casting anything, the client reports every spell as unusable for the length of the global cooldown. Taken literally, that turned all icons dark grey for a second and a half after every cast, as if nothing were available at all. A running cooldown no longer than the global one (`FBCD_MIN_DURATION`) is no longer treated as a reason to darken a button. Blue for missing mana, red for out of range and grey for a spell that really cannot be cast, for instance in the wrong shapeshift form, all work as before, and real cooldowns are still shown by the clock on the button. This affects the plates and the raid cells alike, both go through `FBHealBox_ButtonUsable`.
### Deutsch
**Behoben**
- **Der Funke im Manabalken laeuft wieder rund.** Neu gezeichnet wurde er erst, wenn er einen halben Pixel weitergewandert war. Das klingt sparsam, er braucht fuer den Balken aber fuenf Sekunden, also rund 20 Pixel je Sekunde: Bei 60 Bildern kam er damit bestenfalls in jedem zweiten Frame voran und je nach Rundung mal nach einem, mal nach zwei Frames. Genau dieser ungleiche Schritt war das Ruckeln, und der feste Zeichentakt von 0,03 Sekunden aus 1.4.5 hat es verstaerkt. Die Schwelle ist jetzt praktisch weg (0,05 px) und gezeichnet wird wieder in jedem Frame, das verdoppelt die Bewegung von 30 auf 60 gleichmaessige Schritte je Sekunde.
- **Das Zeichnen je Frame kostet trotzdem nichts.** Jeder Funke merkt sich Breite und Hoehe seines Balkens und liest sie viermal je Sekunde nach (`FBTICK_GEOM_STEP`), statt sie bei jedem Durchlauf zu erfragen, und der Torwaechter sitzt weiterhin davor: Bei vollem Manabalken laeuft gar kein Durchlauf.
- **Der globale Cooldown dunkelt nicht mehr alle Buttons ab.** Nach jedem gewirkten Zauber meldet der Client fuer die Dauer des globalen Cooldowns saemtliche Zauber als nicht nutzbar. Woertlich genommen wurden dadurch nach jedem Zauber anderthalb Sekunden lang alle Symbole dunkelgrau, als waere gar nichts mehr verfuegbar. Eine laufende Abklingzeit, die nicht laenger ist als der globale Cooldown (`FBCD_MIN_DURATION`), gilt jetzt nicht mehr als Grund zum Abdunkeln. Blau fuer fehlendes Mana, Rot fuer ausser Reichweite und Grau fuer einen Zauber, der wirklich nicht geht, etwa in der falschen Gestalt, arbeiten unveraendert weiter, und echte Abklingzeiten zeigt weiterhin die Uhr auf dem Button. Das gilt fuer Plaketten und Raidzellen gleichermassen, beide laufen ueber `FBHealBox_ButtonUsable`.
## 1.4.5 (2026-09-08)
Three additions around the frames and the prediction: Blizzard's party frames can go away, the resource bar is no longer reserved for mana, and gear healing is counted where an API can supply it. Plus a performance pass with no change in behaviour.
@@ -25,7 +46,7 @@ Three additions around the frames and the prediction: Blizzard's party frames ca
- **Cheap pre-test before the combat log patterns.** Up to four anchored patterns ran on every message from twenty registered events. A plain substring test now filters first, with the words cut out of the client's own message templates so it works in every language. The tick test deliberately comes from the self template, because "You gain" and "%s gains" differ in the verb but share what follows.
- **Equipment bonus read once instead of per candidate.** With heal chains a single Smart Healing click asked the API for the bonus up to fifteen times. The value is now remembered and dropped again on `UNIT_INVENTORY_CHANGED` or a spellbook rebuild.
- **Cast time comes free with the spell scan.** `FBHealBox_SpellCastSeconds` used to build its own tooltip on a cache miss, which could mean a dozen tooltip builds in the middle of combat on the first click. `FBPredict_TooltipText` now picks the cast time off the right-hand side while the tooltip is standing anyway and fills the cache; the standalone scan remains only as a fallback. The cast time is deliberately kept out of the parsed text, because a number like 2.5 would confuse the shield duration and heal amount patterns.
- **Smaller things.** The range spell of the first assigned button is remembered instead of being searched over ten slots on every range check (invalidated on rebinding and on a spellbook rebuild). The ticker redraws on a fixed 0.03 second step instead of every frame. Blizzard's party frames are re-evaluated in the same collection point as the name updates instead of on every event of a burst. Two `or {}` fallbacks in loops no longer allocate a throwaway table.
- **Smaller things.** The range spell of the first assigned button is remembered instead of being searched over ten slots on every range check (invalidated on rebinding and on a spellbook rebuild). The ticker redraws on a fixed 0.03 second step instead of every frame (taken back in 1.4.5.1, it made the spark stutter). Blizzard's party frames are re-evaluated in the same collection point as the name updates instead of on every event of a burst. Two `or {}` fallbacks in loops no longer allocate a throwaway table.
### Deutsch
@@ -48,7 +69,7 @@ Three additions around the frames and the prediction: Blizzard's party frames ca
- **Billiger Vortest vor den Combatlog-Mustern.** Bei jeder Meldung aus zwanzig registrierten Ereignissen liefen bis zu vier verankerte Muster. Ein einfacher Textvergleich filtert jetzt vorweg, mit Wortstuecken, die aus den Meldungsvorlagen des Clients geschnitten werden und damit in jeder Sprache passen. Der Tick-Vortest kommt bewusst aus der Selbst-Vorlage, weil sich "You gain" und "%s gains" im Verb unterscheiden, im Rest aber gleich sind.
- **Ausruestungsbonus einmal statt je Kandidat.** Mit Heilketten fragte ein einziger Smart-Healing-Klick die API bis zu fuenfzehnmal nach dem Bonus. Der Wert wird jetzt gemerkt und bei `UNIT_INVENTORY_CHANGED` oder einem Neuaufbau des Zauberbuchs wieder verworfen.
- **Zauberzeit faellt beim Auslesen der Zauber mit ab.** `FBHealBox_SpellCastSeconds` baute bei einem Fehlgriff einen eigenen Tooltip, was beim ersten Klick mitten im Kampf ein Dutzend Tooltip-Aufbauten bedeuten konnte. `FBPredict_TooltipText` liest die Zauberzeit jetzt nebenbei von der rechten Seite ab, solange der Tooltip ohnehin steht, und fuellt den Zwischenspeicher; der eigene Scan bleibt nur als Rueckfall. Der Wert kommt bewusst nicht in den ausgewerteten Text, weil eine Zahl wie 2.5 die Muster fuer Schilddauer und Heilbetrag durcheinanderbraechte.
- **Kleinigkeiten.** Der Reichweiten-Zauber des ersten belegten Buttons wird gemerkt, statt bei jeder Pruefung ueber zehn Plaetze zu suchen (verworfen beim Umbelegen und beim Neuaufbau des Zauberbuchs). Der Ticker zeichnet in einem festen Takt von 0,03 Sekunden statt in jedem Frame. Blizzards Gruppenfenster werden im selben Sammelpunkt wie die Namen neu bewertet statt bei jedem Ereignis einer Salve. Zwei `or {}`-Rueckfaelle in Schleifen legen keine Wegwerf-Tabelle mehr an.
- **Kleinigkeiten.** Der Reichweiten-Zauber des ersten belegten Buttons wird gemerkt, statt bei jeder Pruefung ueber zehn Plaetze zu suchen (verworfen beim Umbelegen und beim Neuaufbau des Zauberbuchs). Der Ticker zeichnet in einem festen Takt von 0,03 Sekunden statt in jedem Frame (in 1.4.5.1 zurueckgenommen, der Funke ruckelte dadurch). Blizzards Gruppenfenster werden im selben Sammelpunkt wie die Namen neu bewertet statt bei jedem Ereignis einer Salve. Zwei `or {}`-Rueckfaelle in Schleifen legen keine Wegwerf-Tabelle mehr an.
## 1.4.4.3 (2026-09-08)
+15 -1
View File
@@ -37,6 +37,8 @@
-- * v1.4.5: Blizzards Gruppenfenster ausblendbar (schliesst sich mit dem
-- Anheftmodus gegenseitig aus), Wut, Energie und Fokus im Balken,
-- +Heilung der Ausruestung ueber ClassicAPI in der Vorhersage.
-- * v1.4.5.1: Ruckeln des Manafunkens behoben (Bewegungsschwelle und
-- Zeichentakt), globaler Cooldown dunkelt nicht mehr alle Buttons ab.
--
-- Ehre wem Ehre gebuehrt: Aufbau, Namensplaketten und Grundidee stammen
-- aus dem Original.
@@ -151,7 +153,7 @@ HealBox = {
-- feuert ADDON_LOADED fuer uns.
FBADDON_NAME = "Heal Box Vanilla";
FBADDON_FOLDER = "FBHealBox";
HealBoxVersion = "|cFFFFFF00v1.4.5|r";
HealBoxVersion = "|cFFFFFF00v1.4.5.1|r";
-- ==========================================================================
-- [ Lokalisierung / Localization ]
@@ -4701,6 +4703,18 @@ function FBHealBox_ButtonUsable(id)
if (e and e.pass == FBBtnPass) then return e.st; end
if (not e) then e = {}; FBBtnUsableCache[id] = e; end
local isUsable, noMana = FBHealBox_SpellUsable(id);
-- Waehrend des globalen Cooldowns meldet der Client jeden Zauber als
-- nicht nutzbar. Ungefiltert wuerden nach jedem gewirkten Zauber
-- saemtliche Buttons anderthalb Sekunden lang dunkel, was aussieht, als
-- waere gar nichts mehr verfuegbar. Laeuft eine Abklingzeit, die nicht
-- laenger als der globale Cooldown ist, zaehlt sie deshalb nicht als
-- Grund. Echte Abklingzeiten bleiben unberuehrt, die zeigt die Uhr.
if (not isUsable) and (not noMana) then
local cd = FBHealBox_ButtonCooldown(id);
if (cd[1] > 0) and (cd[2] > 0) and (cd[2] <= FBCD_MIN_DURATION) then
isUsable = 1;
end
end
if (isUsable) then e.st = "ok"; elseif (noMana) then e.st = "mana"; else e.st = "no"; end
e.pass = FBBtnPass;
return e.st;
+2 -2
View File
@@ -1,9 +1,9 @@
## Interface: 11200
## Title: Heal Box Vanilla |cFFFFFF00v1.4.5|r
## Title: Heal Box Vanilla |cFFFFFF00v1.4.5.1|r
## Notes: Heal/raid frame addon like Healium, with quick-cast buttons, heal prediction, mana ticker and more.
## Notes-deDE: Heal/Raidframe Addon aehnlich Healium, mit Schnellzugriff Buttons, Heal Prediction und Mana Ticker und mehr.
## Author: Dourd (Argent Dawn EU) | Vanilla-Port & Erweiterung 09/2026: Mquadrat
## Version: 1.4.5
## Version: 1.4.5.1
## SavedVariablesPerCharacter: HealBox
## OptionalDeps: SuperWoW
+28 -15
View File
@@ -351,7 +351,8 @@ end
function FBTicker_Draw()
if (not FBTicker.gate) then return; end
local frac, mode = FBTicker_Progress(GetTime());
local now = GetTime();
local frac, mode = FBTicker_Progress(now);
if (not frac) then
FBTicker_HideAll();
return;
@@ -364,8 +365,17 @@ function FBTicker_Draw()
local bar, s = e.bar, e.spark;
if (s and bar) then
if (bar:IsShown()) then
local bw = bar:GetWidth() or 0;
local bh = bar:GetHeight() or 0;
-- Breite und Hoehe aendern sich nur beim Umbauen der Anzeige.
-- Sie werden deshalb viermal je Sekunde nachgelesen und
-- dazwischen gemerkt; so kostet das Zeichnen je Frame fast
-- nichts mehr und darf wieder in jedem Frame laufen.
if (not e.geomT) or ((now - e.geomT) >= FBTICK_GEOM_STEP) then
e.geomT = now;
e.bw = bar:GetWidth() or 0;
e.bh = bar:GetHeight() or 0;
end
local bw = e.bw or 0;
local bh = e.bh or 0;
if (bw > w and bh > 0) then
if (e.w ~= w or e.h ~= bh) then
e.w = w; e.h = bh;
@@ -376,10 +386,16 @@ function FBTicker_Draw()
e.mode = mode;
s:SetTexture(col[1], col[2], col[3], col[4]);
end
-- Anker nur setzen, wenn der Funke mindestens einen halben
-- Pixel weitergewandert ist
-- Anker setzen, sobald sich die Position ueberhaupt
-- geaendert hat. Eine Schwelle von einem halben Pixel
-- klingt sparsam, der Funke wandert aber nur rund 20 px
-- je Sekunde: bei 60 Bildern kam er damit nur in jedem
-- zweiten Frame voran, und je nach Rundung mal nach einem,
-- mal nach zwei Frames. Genau das sah ruckelig aus. Die
-- Feinrundung auf ganze Bildpunkte macht ohnehin die
-- Oberflaeche selbst.
local x = frac * (bw - w);
if (not e.x) or (math.abs(x - e.x) >= 0.5) then
if (not e.x) or (math.abs(x - e.x) >= 0.05) then
e.x = x;
s:ClearAllPoints();
s:SetPoint("LEFT", bar, "LEFT", x, 0);
@@ -422,19 +438,16 @@ FBTickerFrame:SetScript("OnEvent", function()
end
FBTicker_UpdateGate();
end);
-- Der Funke wandert in fuenf Sekunden ueber den Balken, ein Neuzeichnen in
-- jedem Frame bringt dabei kein sichtbar weicheres Bild. Ein fester Takt von
-- 0,03 Sekunden (rund 33 Bilder je Sekunde) spart auf schnellen Rechnern die
-- Haelfte der Durchlaeufe samt der Breiten- und Hoehenabfragen je Balken.
FBTickerDrawAccum = 0;
FBTICK_DRAW_STEP = 0.03;
-- Gezeichnet wird in jedem Frame. Ein fester Takt spart zwar Durchlaeufe,
-- macht die Bewegung aber sichtbar stufig: der Funke braucht fuer den Balken
-- fuenf Sekunden, jede ausgelassene Position sieht man sofort. Teuer ist das
-- Zeichnen nicht mehr, weil die Balkenmasse gemerkt werden und der Ausstieg
-- ueber das Gate davor sitzt (voller Manabalken = gar kein Durchlauf).
FBTICK_GEOM_STEP = 0.25; -- Sek.: so oft werden Breite und Hoehe nachgelesen
FBTickerFrame:SetScript("OnUpdate", function()
if (FBAddonSuppressed) then return; end
if (not FBTicker.gate) then return; end
FBTickerDrawAccum = FBTickerDrawAccum + (arg1 or 0);
if (FBTickerDrawAccum < FBTICK_DRAW_STEP) then return; end
FBTickerDrawAccum = 0;
FBTicker_Draw();
end);