mirror of
https://github.com/QbiXibQ/FBHealBox.git
synced 2026-10-13 00:52:39 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b6db62d7dc | ||
|
|
934e0047b0 | ||
|
|
d0a3bbfa9b | ||
|
|
86cfea6b76 |
@@ -1,5 +1,69 @@
|
||||
# Changelog
|
||||
|
||||
## 1.4.6 (2026-10-06)
|
||||
|
||||
Performance pass over the display loop, with no change in behaviour: only the units that actually changed are redrawn, and two loops that ran empty five times a second now stop early.
|
||||
|
||||
### English
|
||||
|
||||
**Performance**
|
||||
|
||||
- **Only the units that changed are redrawn.** The 0.2 second pass used to set a single dirty flag: if any heal over time ticked anywhere, everything was redrawn, which in a full raid meant forty cells plus ten plates although exactly one unit had changed. The pass now collects the affected unit names in a reused table and hands them to `FBHealBox_RefreshUnitsByName`, and the raid module picks up the same list through the new `RefreshNames` hook. With several HoTs running this turns three to five full sweeps a second into at most one plus a handful of single-unit updates.
|
||||
- **A full sweep stays as a safety net.** At most once a second, and only while something is actually changing, the old full refresh still runs, so a name that does not match a plate for any reason can never leave a stale bar behind for longer than that.
|
||||
- **Empty leftovers are cleared.** When the last heal over time or the last foreign heal on a unit expires, the now-empty sub-table is removed instead of being left behind. Several places read `FBHoTs[name]` as "is anything running on this unit", and an empty table answered yes.
|
||||
- **Raid spell timers skip cells with nothing to show.** The intent to skip was already in the code but the result was thrown away two lines later, so the button loop ran anyway: in a full raid that was 160 do-nothing calls five times a second. The cell is now skipped outright, exactly as the plates already did.
|
||||
- **Spell timers get an early out.** When no heal over time and no shield of yours is running anywhere, the plate loop no longer asks every slot for its unit and name five times a second; it only looks where a timer still has to be cleared. Classes without HoTs and the time between fights benefit.
|
||||
|
||||
**Checked and left alone**
|
||||
|
||||
- The three `OnUpdate` loops do no unnecessary work. The prediction checks three dirty flags and two counters per frame, the mana ticker leaves at its gate (a full mana bar means no pass at all), and the raid ghost ticker is hidden outside test mode. Event handling filters unit events through a lookup table rather than walking every frame.
|
||||
- The global cooldown has been drawn as a sweep since 1.4.5.1, which means every visible button gets a fresh sweep after every cast. That is the intended behaviour and the animation runs in the client, not in Lua, so it stays. Should it ever feel heavy in a dense raid, `FBCD_SHOW_MIN` set to 2 limits the sweep to real cooldowns again.
|
||||
|
||||
### Deutsch
|
||||
|
||||
**Leistung**
|
||||
|
||||
- **Nur noch die Einheiten neu zeichnen, bei denen sich etwas geaendert hat.** Der 0,2-Sekunden-Takt setzte bisher ein einziges Dirty-Flag: Lief irgendwo ein HoT-Tick ab, wurde alles neu gezeichnet, im Vierzigerraid also vierzig Zellen und zehn Plaketten, obwohl sich bei genau einer Einheit etwas geaendert hatte. Der Takt sammelt die betroffenen Namen jetzt in einer wiederverwendeten Tabelle und reicht sie an `FBHealBox_RefreshUnitsByName`; das Raidmodul bekommt dieselbe Liste ueber den neuen Hook `RefreshNames`. Mit mehreren laufenden HoTs werden aus drei bis fuenf vollen Durchlaeufen je Sekunde hoechstens einer plus eine Handvoll Einzel-Updates.
|
||||
- **Der volle Durchlauf bleibt als Sicherheitsnetz.** Hoechstens einmal je Sekunde, und nur solange sich ueberhaupt etwas aendert, laeuft er weiterhin. Ein Name, der aus irgendeinem Grund zu keiner Plakette passt, kann so nie laenger als eine Sekunde einen alten Balken stehen lassen.
|
||||
- **Leere Reste werden weggeraeumt.** Laeuft der letzte HoT oder die letzte fremde Heilung auf einer Einheit ab, verschwindet die nun leere Untertabelle, statt liegen zu bleiben. Mehrere Stellen lesen `FBHoTs[name]` als "laeuft da ueberhaupt etwas", und eine leere Tabelle hat darauf mit ja geantwortet.
|
||||
- **Raid-Zaubertimer ueberspringen Zellen ohne Anzeige.** Die Absicht zu ueberspringen stand schon im Code, das Ergebnis wurde aber zwei Zeilen spaeter wieder verworfen, sodass die Buttonschleife trotzdem lief: im Vierzigerraid 160 Leeraufrufe fuenfmal je Sekunde. Die Zelle wird jetzt wirklich uebersprungen, genau wie es die Plaketten laengst machen.
|
||||
- **Zaubertimer steigen frueher aus.** Laeuft nirgends ein eigener HoT und kein eigener Schild, fragt die Plakettenschleife nicht mehr fuenfmal je Sekunde jeden Slot nach Einheit und Namen, sondern schaut nur noch dort hinein, wo ein Timer wegzuraeumen ist. Davon profitieren Klassen ohne HoTs und die Zeit zwischen den Kaempfen.
|
||||
|
||||
**Geprueft und so gelassen**
|
||||
|
||||
- Die drei `OnUpdate`-Schleifen arbeiten nicht unnoetig. Die Vorhersage prueft je Frame drei Dirty-Flags und zwei Zaehler, der Mana-Ticker steigt am Torwaechter aus (voller Manabalken heisst gar kein Durchlauf), und der Geister-Ticker im Raid ist ausserhalb des Testmodus versteckt. Die Ereignisverarbeitung filtert Unit-Events ueber eine Nachschlagetabelle, statt je Frame zu suchen.
|
||||
- Der globale Cooldown laeuft seit 1.4.5.1 als Uhr mit, das heisst nach jedem Zauber bekommt jeder sichtbare Button eine neue Uhr gesetzt. Das ist das gewollte Verhalten, und die Animation laeuft im Client, nicht in Lua, deshalb bleibt es so. Sollte es im dichten Raid doch schwer wirken, beschraenkt `FBCD_SHOW_MIN` auf 2 die Uhr wieder auf echte Abklingzeiten.
|
||||
|
||||
|
||||
## 1.4.5.3 (2026-10-05)
|
||||
|
||||
A readability option suggested by a user: the area behind the bars can be given a solid background, so the game world no longer shows through where health is missing.
|
||||
|
||||
### English
|
||||
|
||||
**New**
|
||||
|
||||
- **Bar background.** New slider *Bar background* on the *General* tab, 0 to 100 per cent in steps of 5. At 0, which is the default, nothing changes: the plate stays see-through and grass, sky or stone show through the empty part of the health bar. Turned up, a quiet dark grey surface sits behind the bars, so the green of the health bar stands on a fixed background. At 100 the plate is opaque. The shade is `FBBAR_BG_COLOR` (0.15 grey) and the setting is kept per character in `HealBox.BarBG`.
|
||||
- **Where it sits.** The texture hangs on the lowest of the four stacked bars, the incoming-heal bar, on the `BACKGROUND` layer. That puts it under the prediction, the shield, the health and the mana bar, and it is shown and hidden together with them, so nothing is left behind on a plate that is currently empty or hidden by the attach mode. At 0 per cent no texture is set at all, rather than a fully transparent one.
|
||||
- **Raid cells need nothing.** They already have their own backdrop at 80 per cent black, so there is no world shining through there; the slider deliberately only touches the plates.
|
||||
|
||||
**Thanks**
|
||||
|
||||
- The idea and a working patch came from a user who finds the translucent bar hard to read. The patch used `WHITE8X8` plus `SetVertexColor`; the version shipped here uses `SetTexture(r, g, b, a)`, which creates a solid colour directly in 1.12 and is what the mana strip already does. Same result, no texture file involved.
|
||||
|
||||
### Deutsch
|
||||
|
||||
**Neu**
|
||||
|
||||
- **Balkenhintergrund.** Neuer Regler *Balkenhintergrund* im Reiter *Allgemein*, 0 bis 100 Prozent in Fuenferschritten. Bei 0, dem Standard, aendert sich nichts: Die Plakette bleibt durchscheinend, durch den leeren Teil des Lebensbalkens sieht man Gras, Himmel oder Stein. Hochgedreht liegt eine ruhige dunkelgraue Flaeche hinter den Balken, das Gruen des Lebensbalkens steht dann auf festem Grund. Bei 100 ist die Plakette undurchsichtig. Der Grundton ist `FBBAR_BG_COLOR` (0,15 Grau), die Einstellung bleibt je Charakter in `HealBox.BarBG` gespeichert.
|
||||
- **Wo die Flaeche haengt.** Die Textur sitzt auf der untersten der vier gestapelten Balken, der Heilvorhersage, auf der Ebene `BACKGROUND`. Damit liegt sie unter Vorhersage, Schild, Leben und Mana, und sie wird zusammen mit ihnen ein- und ausgeblendet; auf einer leeren oder im Anheftmodus versteckten Plakette bleibt also nichts stehen. Bei 0 Prozent wird gar keine Textur gesetzt statt einer voellig durchsichtigen.
|
||||
- **Raidzellen brauchen nichts.** Sie haben bereits ihren eigenen Hintergrund mit 80 Prozent Schwarz, dort scheint keine Welt durch; der Regler fasst bewusst nur die Plaketten an.
|
||||
|
||||
**Dank**
|
||||
|
||||
- Idee und ein lauffaehiger Patch kamen von einem Nutzer, dem der durchscheinende Balken schlecht lesbar ist. Der Patch benutzte `WHITE8X8` mit `SetVertexColor`; hier ausgeliefert wird `SetTexture(r, g, b, a)`, das in 1.12 direkt eine Vollfarbe erzeugt und genau das ist, was der Manastreifen ohnehin schon macht. Gleiches Ergebnis, ohne Texturdatei.
|
||||
|
||||
|
||||
## 1.4.5.2 (2026-09-12)
|
||||
|
||||
One fix: a running HoT no longer pulls Smart Healing down a rank.
|
||||
|
||||
+159
-7
@@ -42,6 +42,11 @@
|
||||
-- und laeuft stattdessen als Uhr mit (eigene Schwelle FBCD_SHOW_MIN).
|
||||
-- * v1.4.5.2: Laufende HoTs zaehlen bei Smart Healing nicht mehr als
|
||||
-- anfliegende Heilung.
|
||||
-- * v1.4.5.3: Einstellbarer Hintergrund hinter den Balken der Plaketten
|
||||
-- (Regler "Balkenhintergrund", Standard 0 = wie bisher durchscheinend).
|
||||
-- * v1.4.6: Leistungsdurchgang ohne Funktionsaenderung: nur geaenderte
|
||||
-- Einheiten werden neu gezeichnet (FBHealBox_RefreshUnitsByName, Hook
|
||||
-- "RefreshNames"), Zaubertimer steigen frueher aus.
|
||||
--
|
||||
-- Ehre wem Ehre gebuehrt: Aufbau, Namensplaketten und Grundidee stammen
|
||||
-- aus dem Original.
|
||||
@@ -128,6 +133,7 @@ HealBox = {
|
||||
ButtonSpacing = 2, -- px zwischen den Buttons (1..20)
|
||||
RowSpacing = 4, -- px zwischen den Plaketten (1..20)
|
||||
ManaBar = 1, -- Manabalken im Lebensbalken anzeigen
|
||||
BarBG = 0, -- Deckkraft des Balkenhintergrunds in Prozent
|
||||
PowerBar = 0, -- auch Wut, Energie und Fokus im Balken zeigen
|
||||
HideBlizzParty = 0, -- Blizzards Gruppenfenster verstecken
|
||||
HealBonus = 1, -- +Heilung der Ausruestung in die Vorhersage rechnen
|
||||
@@ -156,7 +162,7 @@ HealBox = {
|
||||
-- feuert ADDON_LOADED fuer uns.
|
||||
FBADDON_NAME = "Heal Box Vanilla";
|
||||
FBADDON_FOLDER = "FBHealBox";
|
||||
HealBoxVersion = "|cFFFFFF00v1.4.5.2|r";
|
||||
HealBoxVersion = "|cFFFFFF00v1.4.6|r";
|
||||
|
||||
-- ==========================================================================
|
||||
-- [ Lokalisierung / Localization ]
|
||||
@@ -210,6 +216,9 @@ FBLocale["enUS"] = {
|
||||
.. "• Chain spell switching toggled via 'Smartcross'\n"
|
||||
.. "• Decisions logged with /fbp debug",
|
||||
SMART_MARGIN = "Safety margin: |cFFFFFFFF%s %%",
|
||||
BAR_BG = "Bar background: |cFFFFFFFF%s %%",
|
||||
BAR_BG_OFF = "clear",
|
||||
BAR_BG_FULL = "solid",
|
||||
COOLDOWNS = "Cooldowns on buttons",
|
||||
COOLDOWNS_TIP = "Shows the cooldown sweep on every button (Nature's Swiftness, Inner Focus, Lay on Hands, shield cooldown). The global cooldown runs as a sweep too, so after every cast you see the short wait run out instead of the icons going dark and bright again. Set FBCD_SHOW_MIN to 2 in the code to leave the global cooldown out.",
|
||||
AGGRO = "Mark who is attacked",
|
||||
@@ -359,6 +368,9 @@ FBLocale["deDE"] = {
|
||||
.. "• Zauberwechsel in Ketten steuert 'Smartcross'\n"
|
||||
.. "• Entscheidungen im Chat via /fbp debug",
|
||||
SMART_MARGIN = "Sicherheitsaufschlag: |cFFFFFFFF%s %%",
|
||||
BAR_BG = "Balkenhintergrund: |cFFFFFFFF%s %%",
|
||||
BAR_BG_OFF = "klar",
|
||||
BAR_BG_FULL = "deckend",
|
||||
COOLDOWNS = "Cooldowns auf den Buttons",
|
||||
COOLDOWNS_TIP = "Zeigt die Cooldown-Uhr auf jedem Button (Naturschnelligkeit, Innerer Fokus, Handauflegung, Schild-Cooldown). Auch der globale Cooldown laeuft als Uhr mit, nach jedem Zauber siehst du also die kurze Wartezeit ablaufen, statt dass die Symbole dunkel und wieder hell werden. Wer ihn nicht sehen will, setzt FBCD_SHOW_MIN im Code auf 2.",
|
||||
AGGRO = "Angegriffenen markieren",
|
||||
@@ -533,6 +545,9 @@ FBLocale["esES"] = {
|
||||
.. "• Cambio de hechizo controlado por 'Smartcross'\n"
|
||||
.. "• Registro de decisiones con /fbp debug",
|
||||
SMART_MARGIN = "Margen de seguridad: |cFFFFFFFF%s %%",
|
||||
BAR_BG = "Fondo de la barra: |cFFFFFFFF%s %%",
|
||||
BAR_BG_OFF = "nítido",
|
||||
BAR_BG_FULL = "opaco",
|
||||
COOLDOWNS = "Reutilización en botones",
|
||||
COOLDOWNS_TIP = "Muestra el barrido de reutilización en cada botón (Rapidez de la naturaleza, Enfoque interno, Imposición de manos, reutilización del escudo). La reutilización global también se muestra como barrido, así ves correr la breve espera tras cada lanzamiento en lugar de que los iconos se oscurezcan y se aclaren. Para omitirla, pon FBCD_SHOW_MIN en 2 en el código.",
|
||||
AGGRO = "Marcar al atacado",
|
||||
@@ -673,6 +688,9 @@ FBLocale["frFR"] = {
|
||||
.. "• Changement de sort contrôlé par 'Smartcross'\n"
|
||||
.. "• Décisions visibles via /fbp debug",
|
||||
SMART_MARGIN = "Marge de sécurité : |cFFFFFFFF%s %%",
|
||||
BAR_BG = "Fond de la barre : |cFFFFFFFF%s %%",
|
||||
BAR_BG_OFF = "clair",
|
||||
BAR_BG_FULL = "opaque",
|
||||
COOLDOWNS = "Recharges sur les boutons",
|
||||
COOLDOWNS_TIP = "Affiche le balayage du temps de recharge sur chaque bouton (Rapidité de la nature, Focalisation intérieure, Imposition des mains, recharge du bouclier). Le temps de recharge global est affiché lui aussi : après chaque incantation vous voyez la courte attente s'écouler au lieu de voir les icônes s'assombrir puis redevenir claires. Pour l'exclure, mettez FBCD_SHOW_MIN à 2 dans le code.",
|
||||
AGGRO = "Marquer la cible attaquée",
|
||||
@@ -813,6 +831,9 @@ FBLocale["itIT"] = {
|
||||
.. "• Cambio incantesimo controllato da 'Smartcross'\n"
|
||||
.. "• Decisioni registrate con /fbp debug",
|
||||
SMART_MARGIN = "Margine di sicurezza: |cFFFFFFFF%s %%",
|
||||
BAR_BG = "Sfondo della barra: |cFFFFFFFF%s %%",
|
||||
BAR_BG_OFF = "limpido",
|
||||
BAR_BG_FULL = "opaco",
|
||||
COOLDOWNS = "Recuperi sui pulsanti",
|
||||
COOLDOWNS_TIP = "Mostra l'animazione del tempo di recupero su ogni pulsante (Rapidità della Natura, Concentrazione Interiore, Imposizione delle Mani, recupero dello scudo). Anche il tempo di recupero globale scorre come animazione: dopo ogni lancio vedi scorrere la breve attesa invece di icone che si scuriscono e si riaccendono. Per escluderlo, imposta FBCD_SHOW_MIN a 2 nel codice.",
|
||||
AGGRO = "Segnala chi è attaccato",
|
||||
@@ -968,6 +989,13 @@ FBPOWER_COLORS = {
|
||||
};
|
||||
FBMANA_BG_ALPHA = 0.35; -- dunkler Streifen hinter dem Mana (0 = aus)
|
||||
|
||||
-- Grundton des Balkenhintergrunds auf den Plaketten. Wie deckend er liegt,
|
||||
-- entscheidet HealBox.BarBG (0 bis 100 Prozent, Regler im Reiter Allgemein).
|
||||
-- Bei 0 bleibt es beim alten Bild: Durch den leeren Teil des Lebensbalkens
|
||||
-- scheint die Spielwelt durch. Wer wenig Kontrast sieht, dreht ihn hoch und
|
||||
-- bekommt eine ruhige graue Flaeche, auf der das Gruen des Lebens steht.
|
||||
FBBAR_BG_COLOR = { 0.15, 0.15, 0.15 };
|
||||
|
||||
-- Begleiter-Plaketten: Namensfarbe, Einrueckung unter dem Besitzer (die
|
||||
-- Plakette wird um denselben Betrag schmaler, damit die Buttons buendig
|
||||
-- bleiben) und ein kleines Pfoten-Icon vor dem Namen.
|
||||
@@ -1453,6 +1481,7 @@ function FBHealBox_StartUp()
|
||||
FBHealBox_SyncOptions();
|
||||
HealBoxAttachMode(HealBox.AttachMode);
|
||||
FBHealBox_ApplyButtonSpacing();
|
||||
FBHealBox_ApplyBarBGAll();
|
||||
FBHealBox_ApplyBlizzParty();
|
||||
if (MMButton) then MMButton:Show(); end
|
||||
FBUpdateNames();
|
||||
@@ -1492,6 +1521,9 @@ function FBHealBox_ApplyDefaults()
|
||||
if (HealBox.ButtonSpacing == nil) then HealBox.ButtonSpacing = 2; end
|
||||
if (HealBox.RowSpacing == nil) then HealBox.RowSpacing = 4; end
|
||||
if (HealBox.ManaBar == nil) then HealBox.ManaBar = 1; end
|
||||
if (HealBox.BarBG == nil) then HealBox.BarBG = 0; end
|
||||
if (HealBox.BarBG < 0) then HealBox.BarBG = 0; end
|
||||
if (HealBox.BarBG > 100) then HealBox.BarBG = 100; end
|
||||
if (HealBox.PowerBar == nil) then HealBox.PowerBar = 0; end
|
||||
if (HealBox.HideBlizzParty == nil) then HealBox.HideBlizzParty = 0; end
|
||||
if (HealBox.HealBonus == nil) then HealBox.HealBonus = 1; end
|
||||
@@ -1526,6 +1558,7 @@ function FBHealBox_SyncOptions()
|
||||
if (HealCommCheck) then HealCommCheck:SetChecked(HealBox.HealComm == 1); end
|
||||
if (ManaBarCheck) then ManaBarCheck:SetChecked(HealBox.ManaBar == 1); end
|
||||
if (PowerBarCheck) then PowerBarCheck:SetChecked(HealBox.PowerBar == 1); end
|
||||
if (BarBGSlider) then BarBGSlider:SetValue(HealBox.BarBG or 0); FBUpdateBarBGSliderText(); end
|
||||
if (HidePartyCheck) then HidePartyCheck:SetChecked(HealBox.HideBlizzParty == 1); end
|
||||
if (ShowPetsCheck) then ShowPetsCheck:SetChecked(HealBox.ShowPets == 1); end
|
||||
if (TestModeCheck) then TestModeCheck:SetChecked(FBTestMode); end
|
||||
@@ -2235,6 +2268,22 @@ function FBHealBox_SetBarStrata(f, strata)
|
||||
f.ManaBar:SetFrameLevel(4);
|
||||
end
|
||||
|
||||
-- Balkenhintergrund einer Plakette setzen. 0 Prozent heisst: gar keine
|
||||
-- Textur, damit nichts gezeichnet wird, was man ohnehin nicht sieht.
|
||||
function FBHealBox_ApplyBarBG(f)
|
||||
if (not f) or (not f.BarBG) then return; end
|
||||
local a = (HealBox.BarBG or 0) / 100;
|
||||
if (a <= 0) then f.BarBG:Hide(); return; end
|
||||
f.BarBG:SetTexture(FBBAR_BG_COLOR[1], FBBAR_BG_COLOR[2], FBBAR_BG_COLOR[3], a);
|
||||
f.BarBG:Show();
|
||||
end
|
||||
|
||||
function FBHealBox_ApplyBarBGAll()
|
||||
for p = 1, FBSlotCount do
|
||||
FBHealBox_ApplyBarBG(FBPartyFrame[p]);
|
||||
end
|
||||
end
|
||||
|
||||
-- Alle Balken einer Plakette ein-/ausblenden (Party-Frame-Modus blendet aus)
|
||||
function FBHealBox_SetPlateVisible(f, visible)
|
||||
if (not f) or (not f.HealthBar) then return; end
|
||||
@@ -2450,6 +2499,13 @@ function FBHealBoxCreateFrame(FrameName,ParentFrame,FrameTexture,FrameWidth,Fram
|
||||
f.IncHealBar:SetStatusBarColor(0.4, 1, 0.4, 0.5);
|
||||
f.IncHealBar:Show();
|
||||
|
||||
-- Fester Hintergrund hinter allen Balken. Er haengt bewusst an der
|
||||
-- untersten Bar: so liegt er unter Heilvorhersage, Schild, Leben und
|
||||
-- Mana, und er wird zusammen mit ihnen ein- und ausgeblendet.
|
||||
f.BarBG = f.IncHealBar:CreateTexture(nil, "BACKGROUND");
|
||||
f.BarBG:SetAllPoints(f.IncHealBar);
|
||||
f.BarBG:Hide();
|
||||
|
||||
-- Manabalken: FBMANA_BAR_HEIGHT px am unteren Rand des Lebensbalkens,
|
||||
-- "Balken im Balken". Nur sichtbar bei Einheiten mit Mana.
|
||||
f.ManaBar = CreateFrame("STATUSBAR", nil, f, "TextStatusBar");
|
||||
@@ -2915,6 +2971,26 @@ function FBHealBox_RefreshAllBars()
|
||||
FBHealBox_RunHook("RefreshAllBars");
|
||||
end
|
||||
|
||||
-- Nur die Plaketten auffrischen, deren Einheit in der Namensliste steht.
|
||||
--
|
||||
-- Der 0,2-Sekunden-Takt setzte frueher ein einziges Dirty-Flag: Lief
|
||||
-- irgendwo ein HoT-Tick ab, wurde alles neu gezeichnet, im Vierzigerraid
|
||||
-- also vierzig Zellen, obwohl sich bei genau einer Einheit etwas geaendert
|
||||
-- hatte. Jetzt sammelt der Takt die betroffenen Namen ein und nur die werden
|
||||
-- angefasst. Die Schleife selbst bleibt, sie kostet nur einen Tabellen-
|
||||
-- zugriff je Plakette; teuer war immer die Aktualisierung dahinter.
|
||||
function FBHealBox_RefreshUnitsByName(names)
|
||||
if (not FBHealBox1) or (not FBHealBox1.ShieldBar) or (not names) then return; end
|
||||
for p = 1, FBSlotCount do
|
||||
local unit = FBPartyUnit[p];
|
||||
if (FBUnitExists(unit)) then
|
||||
local n = FBUnitName(unit);
|
||||
if (n and names[n]) then FBHealBox_UpdateUnit(unit, FBPartyFrame[p]); end
|
||||
end
|
||||
end
|
||||
FBHealBox_RunHook("RefreshNames", names);
|
||||
end
|
||||
|
||||
-- Ist dieser Slot gerade anzuzeigen? (Begleiter nur mit ShowPets)
|
||||
function FBSlotActive(p)
|
||||
if (p == 1) then return true; end
|
||||
@@ -3268,10 +3344,17 @@ end
|
||||
function FBHealBox_UpdateSpellTimers()
|
||||
local now = GetTime();
|
||||
local on = (HealBox.SpellTimers == 1);
|
||||
-- Laeuft ueberhaupt ein eigener HoT oder Schild? Wenn nicht, gibt es auf
|
||||
-- den Plaketten nichts anzuzeigen, und die Schleife braucht nur noch dort
|
||||
-- hineinzuschauen, wo noch ein Timer wegzuraeumen ist. Spart bei Klassen
|
||||
-- ohne HoT und zwischen den Kaempfen zehn Namensabfragen fuenfmal je
|
||||
-- Sekunde. next() ist wahr, sobald die Tabelle einen Eintrag hat; leere
|
||||
-- Untertabellen raeumt der Takt in FBPredict_OnUpdate weg.
|
||||
local tracked = FBTestMode or (next(FBHoTs) ~= nil) or (next(FBShields) ~= nil);
|
||||
for p = 1, FBSlotCount do
|
||||
local f = FBPartyFrame[p];
|
||||
local unit = FBPartyUnit[p];
|
||||
if (f and FBPartyTable[p]) then
|
||||
if (f and FBPartyTable[p] and (tracked or f.timersShown)) then
|
||||
local shown = on and f:IsShown() and FBUnitExists(unit);
|
||||
local name = shown and FBUnitName(unit);
|
||||
local g = shown and FBTest_Ghost(unit);
|
||||
@@ -3873,6 +3956,11 @@ function FBHealBox_ApplyLocale()
|
||||
PowerBarCheck.Text:SetText(FBT("POWERBAR"));
|
||||
PowerBarCheck.tooltipText = FBT("POWERBAR_TIP");
|
||||
end
|
||||
if (BarBGSlider) then
|
||||
getglobal(BarBGSlider:GetName() .. "Low"):SetText(FBT("BAR_BG_OFF"));
|
||||
getglobal(BarBGSlider:GetName() .. "High"):SetText(FBT("BAR_BG_FULL"));
|
||||
FBUpdateBarBGSliderText();
|
||||
end
|
||||
FBHealBox_UpdatePartyExclusion();
|
||||
FBUpdateSmartMarginText();
|
||||
FBHealBox_UpdateSmartCrossState();
|
||||
@@ -4272,7 +4360,26 @@ function FBHealBoxCreateAddonOptionFrame()
|
||||
FBUpdateSpacingSliderText();
|
||||
FBHealBox_Layout();
|
||||
end);
|
||||
-- Deckkraft des Balkenhintergrunds (0..100 %)
|
||||
BarBGSlider = CreateFrame("Slider", "FBBarBGSlider", tabGeneral, "OptionsSliderTemplate");
|
||||
BarBGSlider:SetWidth(128);
|
||||
BarBGSlider:SetHeight(16);
|
||||
BarBGSlider:SetPoint("TOPLEFT", 260, gy - 50);
|
||||
BarBGSlider:SetMinMaxValues(0, 100);
|
||||
BarBGSlider:SetValueStep(5);
|
||||
BarBGSlider:SetValue(HealBox.BarBG or 0);
|
||||
BarBGSlider.Text = BarBGSlider:CreateFontString(nil, "BACKGROUND", "GameFontNormal");
|
||||
BarBGSlider.Text:SetPoint("CENTER", 0, 15);
|
||||
getglobal(BarBGSlider:GetName() .. "Low"):SetText(FBT("BAR_BG_OFF"));
|
||||
getglobal(BarBGSlider:GetName() .. "High"):SetText(FBT("BAR_BG_FULL"));
|
||||
BarBGSlider:SetScript("OnValueChanged", function()
|
||||
HealBox.BarBG = math.floor(BarBGSlider:GetValue() + 0.5);
|
||||
FBUpdateBarBGSliderText();
|
||||
FBHealBox_ApplyBarBGAll();
|
||||
end);
|
||||
|
||||
FBUpdateSpacingSliderText();
|
||||
FBUpdateBarBGSliderText();
|
||||
|
||||
-- [ Schalter ] ----------------------------------------------------------
|
||||
local cy = gy - 95;
|
||||
@@ -4615,6 +4722,12 @@ function FBUpdateSmartMarginText()
|
||||
end
|
||||
end
|
||||
|
||||
function FBUpdateBarBGSliderText()
|
||||
if (BarBGSlider and BarBGSlider.Text) then
|
||||
BarBGSlider.Text:SetText(format(FBT("BAR_BG"), math.floor(BarBGSlider:GetValue() + 0.5)));
|
||||
end
|
||||
end
|
||||
|
||||
function FBUpdateSpacingSliderText()
|
||||
if (ButtonSpacingSlider and ButtonSpacingSlider.Text) then
|
||||
ButtonSpacingSlider.Text:SetText(format(FBT("BTN_SPACING"), math.floor(ButtonSpacingSlider:GetValue() + 0.5)));
|
||||
@@ -5936,6 +6049,8 @@ end);
|
||||
|
||||
FBNamesDirty = false;
|
||||
FBBlizzPartyDirty = false;
|
||||
FBDirtyNames = {}; -- im Takt betroffene Einheitennamen (wiederverwendet)
|
||||
FBFullRefreshAccum = 0; -- Sekunden seit dem letzten vollen Durchlauf
|
||||
FBBtnStatesDirty = nil;
|
||||
FBBuffIconsDirty = true;
|
||||
FBBuffIconsAccum = 0;
|
||||
@@ -5986,39 +6101,60 @@ function FBPredict_OnUpdate(elapsed)
|
||||
|
||||
local now = GetTime();
|
||||
local dirty = false;
|
||||
local full = false;
|
||||
|
||||
for _, spells in pairs(FBHoTs) do
|
||||
-- Betroffene Einheiten einsammeln statt pauschal alles neu zu zeichnen.
|
||||
-- Die Tabelle wird wiederverwendet und nur geleert, damit je Durchlauf
|
||||
-- keine neue entsteht.
|
||||
local names = FBDirtyNames;
|
||||
for k in pairs(names) do names[k] = nil; end
|
||||
|
||||
for uname, spells in pairs(FBHoTs) do
|
||||
local anyLeft = false;
|
||||
for spellName, e in pairs(spells) do
|
||||
if (now >= e.expires) then
|
||||
spells[spellName] = nil;
|
||||
names[uname] = true;
|
||||
dirty = true;
|
||||
else
|
||||
anyLeft = true;
|
||||
local n = FBPredict_TicksLeft(e, now);
|
||||
if (n ~= e.lastTicks) then
|
||||
e.lastTicks = n;
|
||||
names[uname] = true;
|
||||
dirty = true;
|
||||
end
|
||||
end
|
||||
end
|
||||
-- leere Untertabelle wegraeumen: andernorts wird FBHoTs[name] als
|
||||
-- "laeuft da ein HoT?" gelesen, und eine leere Tabelle ist wahr
|
||||
if (not anyLeft) then FBHoTs[uname] = nil; end
|
||||
end
|
||||
|
||||
for name, s in pairs(FBShields) do
|
||||
if (now >= s.expires) then
|
||||
FBShields[name] = nil;
|
||||
names[name] = true;
|
||||
dirty = true;
|
||||
end
|
||||
end
|
||||
|
||||
for _, casters in pairs(FBCommHeals) do
|
||||
for uname, casters in pairs(FBCommHeals) do
|
||||
local anyLeft = false;
|
||||
for caster, info in pairs(casters) do
|
||||
if (now >= info.expires) then
|
||||
casters[caster] = nil;
|
||||
names[uname] = true;
|
||||
dirty = true;
|
||||
else
|
||||
anyLeft = true;
|
||||
end
|
||||
end
|
||||
if (not anyLeft) then FBCommHeals[uname] = nil; end
|
||||
end
|
||||
|
||||
if (FBPredictDirect and now > FBPredictDirect.finish) then
|
||||
if (FBPredictDirect.target) then names[FBPredictDirect.target] = true; end
|
||||
FBPredictDirect = nil;
|
||||
dirty = true;
|
||||
end
|
||||
@@ -6027,10 +6163,26 @@ function FBPredict_OnUpdate(elapsed)
|
||||
FBPredictPending = nil;
|
||||
end
|
||||
|
||||
-- Testmodus: die Geister atmen, im Takt der Vorhersage neu zeichnen
|
||||
if (FBTestMode) then dirty = true; end
|
||||
-- Testmodus: die Geister atmen, da muss alles mit
|
||||
if (FBTestMode) then dirty = true; full = true; end
|
||||
|
||||
if (dirty) then FBHealBox_RefreshAllBars(); end
|
||||
-- Sicherheitsnetz: hoechstens einmal je Sekunde doch der volle Durchlauf,
|
||||
-- falls ein Name einmal zu keiner Plakette passt. Kostet gegenueber
|
||||
-- frueher immer noch nur einen Bruchteil, weil es vorher mehrmals je
|
||||
-- Sekunde passierte.
|
||||
if (dirty) then
|
||||
FBFullRefreshAccum = FBFullRefreshAccum + FBPREDICT_THROTTLE;
|
||||
if (FBFullRefreshAccum >= 1.0) then
|
||||
FBFullRefreshAccum = 0;
|
||||
full = true;
|
||||
end
|
||||
end
|
||||
|
||||
if (full) then
|
||||
FBHealBox_RefreshAllBars();
|
||||
elseif (dirty) then
|
||||
FBHealBox_RefreshUnitsByName(names);
|
||||
end
|
||||
end
|
||||
|
||||
FBPredict_InitPatterns();
|
||||
|
||||
+2
-2
@@ -1,9 +1,9 @@
|
||||
## Interface: 11200
|
||||
## Title: Heal Box Vanilla |cFFFFFF00v1.4.5.2|r
|
||||
## Title: Heal Box Vanilla |cFFFFFF00v1.4.6|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.2
|
||||
## Version: 1.4.6
|
||||
## SavedVariablesPerCharacter: HealBox
|
||||
## OptionalDeps: SuperWoW
|
||||
|
||||
|
||||
+32
-13
@@ -1093,21 +1093,24 @@ function FBRaid_UpdateSpellTimers(now)
|
||||
for pos = 1, FBRAID_PER_GROUP do
|
||||
local c = FBRaidCells[g][pos];
|
||||
if (c) then
|
||||
-- ohne verfolgten HoT/Schild auf der Einheit nur einmal ausblenden
|
||||
local shown = on and c.unit and c:IsShown() and (c.ghost or FBHoTs[c.name] or FBShields[c.name]);
|
||||
if (not shown and not c.timersShown) then shown = nil; end
|
||||
c.timersShown = shown and true or false;
|
||||
if (shown == nil) then shown = false; end
|
||||
for i = 1, FBRAID_MAX_BUTTONS do
|
||||
local b = c.buttons[i];
|
||||
if (shown and b:IsShown()) then
|
||||
local text, color = FBHealBox_SpellTimerFor(b.spellBase, c.name, now, c.ghost, i);
|
||||
if (not text and b.spellBaseR) then
|
||||
text, color = FBHealBox_SpellTimerFor(b.spellBaseR, c.name, now, nil, i);
|
||||
-- Nichts anzuzeigen und nichts mehr wegzuraeumen: Zelle
|
||||
-- ueberspringen. Vorher lief die Buttonschleife auch dann
|
||||
-- durch, im Vierzigerraid 160 Leeraufrufe fuenfmal je
|
||||
-- Sekunde. Der Kern macht es bei den Plaketten genauso.
|
||||
if (shown or c.timersShown) then
|
||||
c.timersShown = (shown and true) or false;
|
||||
for i = 1, FBRAID_MAX_BUTTONS do
|
||||
local b = c.buttons[i];
|
||||
if (shown and b:IsShown()) then
|
||||
local text, color = FBHealBox_SpellTimerFor(b.spellBase, c.name, now, c.ghost, i);
|
||||
if (not text and b.spellBaseR) then
|
||||
text, color = FBHealBox_SpellTimerFor(b.spellBaseR, c.name, now, nil, i);
|
||||
end
|
||||
FBHealBox_SetButtonTimer(b, text, color);
|
||||
else
|
||||
FBHealBox_SetButtonTimer(b, nil);
|
||||
end
|
||||
FBHealBox_SetButtonTimer(b, text, color);
|
||||
else
|
||||
FBHealBox_SetButtonTimer(b, nil);
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -1583,6 +1586,22 @@ FBHealBox_RegisterHook("ActiveToggle", function()
|
||||
FBRaid_UpdateVisibility();
|
||||
return true;
|
||||
end);
|
||||
-- Nur die Zellen anfassen, deren Einheit sich geaendert hat. Der Kern
|
||||
-- schickt die Namensliste mit; eine Zelle, die nicht drinsteht, kostet
|
||||
-- einen Tabellenzugriff statt einer vollen Aktualisierung.
|
||||
FBHealBox_RegisterHook("RefreshNames", function(names)
|
||||
if (not FBRaid_IsActive()) or (not names) then return true; end
|
||||
for g = 1, FBRAID_GROUPS do
|
||||
if (FBRaidCells[g]) then
|
||||
for pos = 1, FBRAID_PER_GROUP do
|
||||
local c = FBRaidCells[g][pos];
|
||||
if (c and c.unit and c.name and names[c.name]) then FBRaid_UpdateCell(c); end
|
||||
end
|
||||
end
|
||||
end
|
||||
return true;
|
||||
end);
|
||||
|
||||
FBHealBox_RegisterHook("RefreshAllBars", function()
|
||||
FBRaid_RefreshAll();
|
||||
return true;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Heal Box Vanilla
|
||||
|
||||
ADDON DOCUMENTATION · VERSION 1.4.5.2 · World of Warcraft CLIENT 1.12.1
|
||||
ADDON DOCUMENTATION · VERSION 1.4.6 · World of Warcraft CLIENT 1.12.1
|
||||
|
||||
Party, pet and self heal display with quick-cast buttons for healers. One name plate with a health bar per group slot, plus one for every pet in the group directly below its owner, and next to it up to ten freely assignable spell buttons. A thin mana bar sits inside the health bar for everyone who actually uses mana. On top of that a complete heal prediction (direct heals, remaining HoT ticks and absorb shields) that corrects itself from the combat log and shares its numbers with other healers in the HealComm format. The interface is available in **English and German**, switchable in the options window.
|
||||
|
||||
@@ -287,6 +287,8 @@ The window has two tabs.
|
||||
|
||||
**Default party frames**: instead of the addon's own plates, the buttons attach to Blizzard's default party frames (`PartyMemberFrameN`); pet buttons attach to `PetFrame` and `PartyMemberFrameNPetFrame`. The addon's name plates and bars are hidden; the heal prediction keeps working invisibly.
|
||||
|
||||
**Bar background**: how solid the area behind the bars is, 0 to 100 per cent in steps of 5. Default 0, which is the old look: where health is missing, the game world shows through the plate. Turn it up and a quiet dark grey surface (`FBBAR_BG_COLOR`) sits behind the bars, so the green of the health bar stands on a fixed background instead of on grass, sky or stone. At 100 the plate is opaque. Suggested by a user who found the see-through bar hard to read, and it is worth a try for anyone playing on a bright screen or in a cluttered zone.
|
||||
|
||||
**Mana bar**: shows or hides the mana strip inside the health bar. On by default.
|
||||
|
||||
**Hide Blizzard party frames**: hides `PartyMemberFrame1` to `4` while you are in a group, so only the Heal Box plates remain. Off by default. This and *Default party frames* can never both be on, because the attach mode docks the plates onto exactly those frames; whichever one is ticked greys the other out. Switching it off brings the frames back immediately, and a class the addon does not load for gets them back too.
|
||||
@@ -471,6 +473,7 @@ Everything lives in the `HealBox` table, saved **per character**:
|
||||
|`ButtonSpacing`|Gap between the buttons in px (0 to 20)|
|
||||
|`RowSpacing`|Gap between the plates in px (0 to 20)|
|
||||
|`ManaBar`|1 = mana strip on, 0 = off|
|
||||
|`BarBG`|Opacity of the bar background in per cent, 0 to 100. 0 (default) keeps the see-through look|
|
||||
|`ShowPets`|1 = pet plates on, 0 = off|
|
||||
|`SpellChoiceR[1..10]`|Cast string per button for right click|
|
||||
|`RightClick`|1 = right-click spell on, 0 = off (default)|
|
||||
@@ -508,6 +511,7 @@ Every knob is a global at the top of its own section and can be changed without
|
||||
|`FBMANA_BAR_HEIGHT`|5|Height of the mana strip in px|
|
||||
|`FBMANA_BAR_COLOR`|`{0.15, 0.4, 1, 1}`|Colour of the mana strip|
|
||||
|`FBMANA_BG_ALPHA`|0.35|Dark strip behind missing mana (0 = off)|
|
||||
|`FBBAR_BG_COLOR`|0.15 · 0.15 · 0.15|Shade of the bar background; how solid it sits is the `BarBG` option|
|
||||
|`FBPET_NAME_COLOR`|`{0.75, 0.85, 1, 1}`|Name colour on pet plates|
|
||||
|`FBPET_INDENT`|12|Indent (and width reduction) of pet plates|
|
||||
|`FBPET_ICON` · `FBPET_ICON_SIZE`|footprint · 12|Paw icon in front of pet names|
|
||||
@@ -579,6 +583,8 @@ Every knob is a global at the top of its own section and can be changed without
|
||||
|`FBHealBox_SpellCastSeconds(id)`|Cast time from the tooltip (0 = instant), cached per spellbook slot|
|
||||
|`FBHealBox_ApplyBlizzParty()` · `FBHealBox_HideBlizzPartyActive()`|Hides or restores Blizzard's party frames, including the lock against the attach mode|
|
||||
|`FBHealBox_SetPowerColor(bar, cache, ptype)`|Colours a resource bar for mana, rage, focus or energy|
|
||||
|`FBHealBox_ApplyBarBG(f)` · `FBHealBox_ApplyBarBGAll()`|Sets the background behind a plate's bars from the `BarBG` option|
|
||||
|`FBHealBox_RefreshUnitsByName(names)`|Redraws only the plates whose unit is in the name set; the raid module gets the same set through the `RefreshNames` hook|
|
||||
|`FBPredict_ScanPlayerBuffTimes()`|Reads all of your own buff timers once per frame into a texture-to-seconds map|
|
||||
|`FBHealBox_ApiFailed()`|Puts range, distance and line of sight back to the protected single call after a sweep threw|
|
||||
|`FBHealBox_UpperTex(tex)`|Upper-cased texture path, remembered, so `strupper` does not allocate per call|
|
||||
@@ -739,6 +745,8 @@ Entries that do not exist do no harm: if the spellbook scan does not find them,
|
||||
* heal prediction for direct heals, remaining HoT ticks and absorb shields, self-correcting from the combat log
|
||||
* HealComm sync with Puppeteer, pfUI, Luna and others, without any Ace libraries
|
||||
* English, German, Spanish, French and Italian localization, switchable in game
|
||||
* 1.4.6: performance pass without functional change (only changed units are redrawn via the `RefreshNames` hook, raid spell timers skip idle cells, spell timers leave early when nothing is running); see CHANGELOG
|
||||
* 1.4.5.3: adjustable background behind the plate bars, so the game world no longer shows through where health is missing; see CHANGELOG
|
||||
* 1.4.5.2: a running HoT no longer counts as incoming healing when Smart Healing picks a rank; see CHANGELOG
|
||||
* 1.4.5.1: mana ticker spark no longer stutters (movement threshold and redraw step), and the global cooldown no longer darkens every button but is shown as a sweep instead (own threshold `FBCD_SHOW_MIN`); see CHANGELOG
|
||||
* 1.4.5: Blizzard's party frames can be hidden (mutually exclusive with the attach mode), rage, energy and focus in the resource bar, and the equipment healing bonus via ClassicAPI in the prediction, plus a performance pass without functional change (player buffs read once per frame, staggered raid range and line-of-sight sweeps, fewer protected calls, no throwaway strings in the raid health text); see CHANGELOG
|
||||
@@ -752,14 +760,14 @@ Entries that do not exist do no harm: if the spellbook scan does not find them,
|
||||
|
||||
---
|
||||
|
||||
Heal Box Vanilla v1.4.5.2 · original by Dourd, UI Overhauled · ported to Vanilla and extended 09/2026 by Mquadrat
|
||||
Heal Box Vanilla v1.4.6 · original by Dourd, UI Overhauled · ported to Vanilla and extended 09/2026 by Mquadrat
|
||||
|
||||
_______________________________________________________________________
|
||||
GERMAN
|
||||
|
||||
# Heal Box Vanilla
|
||||
|
||||
ADDON DOKUMENTATION · VERSION 1.4.5.2 · World of Warcraft CLIENT 1.12.1
|
||||
ADDON DOKUMENTATION · VERSION 1.4.6 · World of Warcraft CLIENT 1.12.1
|
||||
|
||||
Party-, Begleiter- und Selbst-Heilanzeige mit Schnellzugriff-Buttons für Heiler. Für jeden Gruppenplatz eine Namensplakette mit Lebensbalken, dazu eine für jeden Begleiter in der Gruppe direkt unter seinem Besitzer, daneben bis zu zehn frei belegbare Zauber-Buttons. Ein schmaler Manabalken liegt im Lebensbalken, bei allen, die tatsächlich Mana nutzen. Dazu eine vollständige Heilvorhersage (Direktheilung, HoT-Restticks und Absorb-Schilde), die sich über den Combatlog selbst korrigiert und ihre Werte im HealComm-Format mit anderen Heilern teilt. Die Oberfläche gibt es auf **Deutsch und Englisch**, umschaltbar im Optionsfenster.
|
||||
|
||||
@@ -1038,6 +1046,8 @@ Das Fenster hat zwei Reiter.
|
||||
|
||||
**Standard-Gruppenfenster**: statt eigener Plaketten hängen die Buttons an Blizzards Standard-Gruppenfenstern (`PartyMemberFrameN`); die Pet-Buttons an `PetFrame` bzw. `PartyMemberFrameNPetFrame`. Die eigenen Namensplaketten und Balken werden dabei ausgeblendet; die Heilvorhersage arbeitet unsichtbar weiter.
|
||||
|
||||
**Balkenhintergrund**: wie deckend die Fläche hinter den Balken liegt, 0 bis 100 Prozent in Fünferschritten. Standard 0, also das bisherige Bild: Wo Leben fehlt, scheint die Spielwelt durch die Plakette. Hochgedreht liegt eine ruhige dunkelgraue Fläche hinter den Balken (`FBBAR_BG_COLOR`), das Grün des Lebensbalkens steht dann auf festem Grund statt auf Gras, Himmel oder Stein. Bei 100 ist die Plakette undurchsichtig. Angeregt von einem Nutzer, dem der durchscheinende Balken schlecht lesbar war, und einen Versuch wert für alle mit hellem Bildschirm oder unruhiger Umgebung.
|
||||
|
||||
**Manabalken**: Manastreifen im Lebensbalken an/aus. Standardmäßig an.
|
||||
|
||||
**Blizzard-Gruppenfenster aus**: versteckt `PartyMemberFrame1` bis `4`, solange du in einer Gruppe bist, sodass nur die Plaketten der Heal Box übrig bleiben. Standardmäßig aus. Diese Option und *Standard-Gruppenfenster* können nie beide an sein, weil der Anheftmodus die Plaketten genau an diese Frames hängt; was angehakt ist, graut das andere aus. Ausschalten holt die Frames sofort zurück, und eine Klasse, für die das Addon nicht lädt, bekommt sie ebenfalls zurück.
|
||||
@@ -1220,6 +1230,7 @@ Alles liegt in der Tabelle `HealBox`, gespeichert **pro Charakter**:
|
||||
|`ButtonSpacing`|Abstand der Buttons in px (0 bis 20)|
|
||||
|`RowSpacing`|Abstand der Plaketten in px (0 bis 20)|
|
||||
|`ManaBar`|1 = Manastreifen an, 0 = aus|
|
||||
|`BarBG`|Deckkraft des Balkenhintergrunds in Prozent, 0 bis 100. 0 (Standard) behält das durchscheinende Bild|
|
||||
|`ShowPets`|1 = Pet-Plaketten an, 0 = aus|
|
||||
|`SpellChoiceR[1..10]`|Cast-String je Button für Rechtsklick|
|
||||
|`RightClick`|1 = Rechtsklick-Zauber an, 0 = aus (Standard)|
|
||||
@@ -1255,6 +1266,7 @@ Alle Stellschrauben stehen als Globals oben in ihrem jeweiligen Abschnitt und la
|
||||
|`FBMANA_BAR_HEIGHT`|5|Höhe des Manastreifens in px|
|
||||
|`FBMANA_BAR_COLOR`|`{0.15, 0.4, 1, 1}`|Farbe des Manastreifens|
|
||||
|`FBMANA_BG_ALPHA`|0.35|Dunkler Streifen hinter fehlendem Mana (0 = aus)|
|
||||
|`FBBAR_BG_COLOR`|0.15 · 0.15 · 0.15|Grundton des Balkenhintergrunds; wie deckend er liegt, regelt die Option `BarBG`|
|
||||
|`FBPET_NAME_COLOR`|`{0.75, 0.85, 1, 1}`|Namensfarbe auf Pet-Plaketten|
|
||||
|`FBPET_INDENT`|12|Einrückung (und Verschmälerung) der Pet-Plaketten|
|
||||
|`FBPET_ICON` · `FBPET_ICON_SIZE`|Fußabdruck · 12|Pfoten-Icon vor Pet-Namen|
|
||||
@@ -1325,6 +1337,8 @@ Alle Stellschrauben stehen als Globals oben in ihrem jeweiligen Abschnitt und la
|
||||
|`FBHealBox_SpellCastSeconds(id)`|Zauberzeit aus dem Tooltip (0 = Instant), je Zauberbuchplatz gemerkt|
|
||||
|`FBHealBox_ApplyBlizzParty()` · `FBHealBox_HideBlizzPartyActive()`|Versteckt Blizzards Gruppenfenster oder gibt sie zurück, samt Sperre gegen den Anheftmodus|
|
||||
|`FBHealBox_SetPowerColor(bar, cache, ptype)`|Färbt einen Ressourcenbalken für Mana, Wut, Fokus oder Energie|
|
||||
|`FBHealBox_ApplyBarBG(f)` · `FBHealBox_ApplyBarBGAll()`|Setzt den Hintergrund hinter den Balken einer Plakette nach der Option `BarBG`|
|
||||
|`FBHealBox_RefreshUnitsByName(names)`|Zeichnet nur die Plaketten neu, deren Einheit in der Namensliste steht; das Raidmodul bekommt dieselbe Liste über den Hook `RefreshNames`|
|
||||
|`FBPredict_ScanPlayerBuffTimes()`|Liest alle eigenen Bufflaufzeiten einmal je Frame in eine Tabelle Textur nach Sekunden|
|
||||
|`FBHealBox_ApiFailed()`|Stellt Reichweite, Abstand und Sichtlinie auf den geschützten Einzelaufruf zurück, wenn ein Durchlauf geworfen hat|
|
||||
|`FBHealBox_UpperTex(tex)`|Groß geschriebener Texturpfad, gemerkt, damit `strupper` nicht je Aufruf zuteilt|
|
||||
@@ -1474,6 +1488,8 @@ Nicht vorhandene Einträge stören nicht: Findet der Zauberbuch-Scan sie nicht,
|
||||
* Heilvorhersage für Direktheilung, HoT-Restticks und Absorb-Schilde, selbstkorrigierend über den Combatlog
|
||||
* HealComm-Sync mit Puppeteer, pfUI, Luna und Co., ohne Ace-Bibliotheken
|
||||
* Lokalisierung Deutsch, Englisch, Spanisch, Französisch und Italienisch, im laufenden Spiel umschaltbar
|
||||
* 1.4.6: Leistungsdurchgang ohne Funktionsänderung (nur geänderte Einheiten werden neu gezeichnet, über den Hook `RefreshNames`, Raid-Zaubertimer überspringen stille Zellen, Zaubertimer steigen früher aus); siehe CHANGELOG
|
||||
* 1.4.5.3: Einstellbarer Hintergrund hinter den Balken der Plaketten, damit die Spielwelt nicht mehr durch fehlendes Leben scheint; siehe CHANGELOG
|
||||
* 1.4.5.2: Ein laufender HoT zählt bei der Rangwahl von Smart Healing nicht mehr als anfliegende Heilung; siehe CHANGELOG
|
||||
* 1.4.5.1: Ruckeln des Manafunkens behoben (Bewegungsschwelle und Zeichentakt), der globale Cooldown dunkelt nicht mehr alle Buttons ab und läuft stattdessen als Uhr mit (eigene Schwelle `FBCD_SHOW_MIN`); siehe CHANGELOG
|
||||
* 1.4.5: Blizzards Gruppenfenster ausblendbar (schließt sich mit dem Anheftmodus gegenseitig aus), Wut, Energie und Fokus im Ressourcenbalken, Heilbonus der Ausrüstung über ClassicAPI in der Vorhersage, dazu ein Leistungsdurchgang ohne Funktionsänderung (Spielerbuffs einmal je Frame, gestaffelte Reichweiten- und Sichtlinienprüfung im Raid, weniger geschützte Aufrufe, keine Wegwerf-Strings im Raid-HP-Text); siehe CHANGELOG
|
||||
@@ -1487,7 +1503,7 @@ Nicht vorhandene Einträge stören nicht: Findet der Zauberbuch-Scan sie nicht,
|
||||
|
||||
---
|
||||
|
||||
Heal Box Vanilla v1.4.5.2 · Original von Dourd, UI Overhauled · Vanilla-Portierung und Erweiterung 09/2026 von Mquadrat
|
||||
Heal Box Vanilla v1.4.6 · Original von Dourd, UI Overhauled · Vanilla-Portierung und Erweiterung 09/2026 von Mquadrat
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user