diff --git a/CHANGELOG.md b/CHANGELOG.md index 327c878..5b74035 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,34 @@ # Changelog +## 1.4.5.3 (2026-10-05) + +A readability option suggested by a user has been added: 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. + +**Danke** + +- 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. diff --git a/FBHealBox.lua b/FBHealBox.lua index 5d302f5..d126a55 100644 --- a/FBHealBox.lua +++ b/FBHealBox.lua @@ -42,6 +42,8 @@ -- 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). -- -- Ehre wem Ehre gebuehrt: Aufbau, Namensplaketten und Grundidee stammen -- aus dem Original. @@ -128,6 +130,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 +159,7 @@ HealBox = { -- feuert ADDON_LOADED fuer uns. FBADDON_NAME = "Heal Box Vanilla"; FBADDON_FOLDER = "FBHealBox"; -HealBoxVersion = "|cFFFFFF00v1.4.5.2|r"; +HealBoxVersion = "|cFFFFFF00v1.4.5.3|r"; -- ========================================================================== -- [ Lokalisierung / Localization ] @@ -210,6 +213,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 +365,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 +542,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 +685,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 +828,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 +986,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 +1478,7 @@ function FBHealBox_StartUp() FBHealBox_SyncOptions(); HealBoxAttachMode(HealBox.AttachMode); FBHealBox_ApplyButtonSpacing(); + FBHealBox_ApplyBarBGAll(); FBHealBox_ApplyBlizzParty(); if (MMButton) then MMButton:Show(); end FBUpdateNames(); @@ -1492,6 +1518,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 +1555,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 +2265,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 +2496,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"); @@ -3873,6 +3926,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 +4330,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 +4692,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))); diff --git a/FBHealBox.toc b/FBHealBox.toc index 0b19546..58a96bf 100644 --- a/FBHealBox.toc +++ b/FBHealBox.toc @@ -1,9 +1,9 @@ ## Interface: 11200 -## Title: Heal Box Vanilla |cFFFFFF00v1.4.5.2|r +## Title: Heal Box Vanilla |cFFFFFF00v1.4.5.3|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.5.3 ## SavedVariablesPerCharacter: HealBox ## OptionalDeps: SuperWoW