mirror of
https://github.com/QbiXibQ/FBHealBox.git
synced 2026-10-11 08:20:01 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6c4f1d5b8f | ||
|
|
529a7dcc14 | ||
|
|
254071d1f5 | ||
|
|
23d3e45d0f | ||
|
|
4b36163446 | ||
|
|
cf9a766745 | ||
|
|
c3f89148df |
+66
-1
@@ -1,6 +1,71 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
## 1.4.4 (2026-09-05)
|
## 1.4.4.2 (2026-09-06)
|
||||||
|
|
||||||
|
Buff duration display update & bugfix. Replaces the 4-quadrant clock division for buff icons with a 32-step vertical duration wipe, offering much finer timer resolution, and fixes an <eof> syntax error when loading.
|
||||||
|
|
||||||
|
### English
|
||||||
|
|
||||||
|
**New & Changed**
|
||||||
|
|
||||||
|
- **32-step buff icon duration display.** The buff icons left of the health bar previously divided the remaining duration into 4 coarse quadrants (quarters). They now transition in 32 fine vertical steps (`FBBUFFICON_STEPS = 32`) from top to bottom. As a buff expires, the top portion is progressively desaturated and darkened in 32 increments. For a 30-minute buff like *Power Word: Fortitude* or *Divine Spirit*, the visual display now updates approximately every 56 seconds rather than once every 7.5 minutes.
|
||||||
|
- **Optimised texture usage.** Replaced the 4 quadrant textures and 4 wash textures per buff icon with a single dynamically cropped desaturated overlay (`ic.qTex`) and dark wash (`ic.wTex`), reducing texture objects by 75 % per buff icon while increasing visual granularity eightfold.
|
||||||
|
- **Shortened addon notes.** Better display in WoW-Launcher addon managers.
|
||||||
|
|
||||||
|
|
||||||
|
### Deutsch
|
||||||
|
|
||||||
|
**Neu & Geaendert**
|
||||||
|
|
||||||
|
- **32-Stufen-Ablaufanzeige fuer Buff-Icons.** Die Buff-Symbole links neben dem Lebensbalken teilten die Restlaufzeit bisher in 4 grobe Bloecke (Quadranten) auf. Dies wurde auf 32 feine Ablaufstufen (`FBBUFFICON_STEPS = 32`) von oben nach unten umgestellt. Bei ablaufender Restzeit wird das Icon in 32 Teilschritten von oben nach unten schrittweise entsaettigt (schwarz-weiss) und abgedunkelt. Bei einem 30-Minuten-Buff (z. B. *Machtwort: Seelenstaerke*) aktualisiert sich die visuelle Anzeige nun ca. alle 56 Sekunden statt nur alle 7,5 Minuten.
|
||||||
|
- **Ressourcenschonende Textur-Struktur.** Statt 4 separaten Quadranten-Texturen und 4 Abdunklungs-Overlays nutzt jedes Icon nun nur noch je eine dynamisch skalierte und beschnittene Overlay-Textur (`ic.qTex` und `ic.wTex`). Das spart 75 % der Texturobjekte pro Icon ein und erhoeht gleichzeitig die Anzeigegenauigkeit um das Achtfache.
|
||||||
|
- **Addon Beschreibung eingekuerzt** Fuer bessere Übersicht in WoW-Launchern.
|
||||||
|
|
||||||
|
|
||||||
|
## 1.4.4.1 (2026-09-06)
|
||||||
|
|
||||||
|
Buff tracking & class spells update. Fixes buff clock icons (Divine Spirit, etc.) not appearing next to the health bar, adds group buff alternate matching, and completes the spell selection lists across all healer classes with buffs, utility and rez spells.
|
||||||
|
|
||||||
|
### English
|
||||||
|
|
||||||
|
**Fixed**
|
||||||
|
|
||||||
|
- **Buff tracking & Tooltip scanning.** In Vanilla 1.12.1, `ClearLines()` on the hidden scan tooltip (`FBHealBoxScanTip`) does not clear hidden text lines. Because `FBPredict_TooltipText` did not check `fs:IsShown()`, leftover lines from previously scanned heal spells (e.g. "Heals a friendly target...") lingered and were read when inspecting buff tooltips like *Divine Spirit*. This erroneously flagged `info.isHeal = true`, skipping buff duration detection (`info.buff`) and causing *Divine Spirit* not to display its clock icon and timer in the plate UI.
|
||||||
|
- **Group buff alternate detection.** `FBPredict_BuildWatch` and `FBPredict_ScanUnit` now track group buff variants (`altTex`). When a group buff is applied or present (*Prayer of Fortitude*, *Prayer of Spirit*, *Gift of the Wild*, *Greater Blessings*), the addon correctly recognises the aura, confirms pending casts, and displays the buff clock icon.
|
||||||
|
- **Buff watch textures.** `FBLoadSpellData` now flags all spells in `FBBuffWatchSpells` as addon spells (`isHealBoxSpell = true`), ensuring their textures and ranks are gathered and monitored even if they are not yet assigned to a heal button.
|
||||||
|
- **Drag & drop instant sync.** Dropping a spell onto a button now immediately calls `FBPredict_BuildWatch()`, updating tracked buffs and predictions without requiring a `/reload`.
|
||||||
|
|
||||||
|
**New & Changed**
|
||||||
|
|
||||||
|
- **Expanded class spell lists.** Greatly expanded `Spell.Name` for all classes so that all relevant buffs, utility spells, dispels, and resurrections appear in the cascading spell menus:
|
||||||
|
- **Priest:** Added *Power Word: Fortitude*, *Prayer of Fortitude*, *Divine Spirit*, *Prayer of Spirit*, *Shadow Protection*, *Prayer of Shadow Protection*, *Fear Ward*, *Power Infusion*, *Resurrection*.
|
||||||
|
- **Druid:** Added *Mark of the Wild*, *Gift of the Wild*, *Thorns*, *Tranquility*, *Innervate*, *Rebirth*, *Cure Poison*.
|
||||||
|
- **Paladin:** Added all normal and Greater Blessings (*Wisdom, Might, Kings, Salvation, Light, Sanctuary*), *Blessing of Freedom*, *Blessing of Sacrifice*, *Redemption*, *Divine Intervention*.
|
||||||
|
- **Shaman:** Added *Ancestral Spirit*, *Purge*, *Water Walking*, *Water Breathing*, *Water Shield*.
|
||||||
|
- Added optional support for **Mage** (*Remove Lesser Curse*, *Arcane Intellect*, *Arcane Brilliance*, *Dampen Magic*, *Amplify Magic*) and **Warlock** (*Unending Breath*, *Detect Invisibility*).
|
||||||
|
- **Fear Ward in Buff Watch.** Added *Fear Ward* to `FBBuffWatchSpells` for Priests.
|
||||||
|
|
||||||
|
### Deutsch
|
||||||
|
|
||||||
|
**Behoben**
|
||||||
|
|
||||||
|
- **Buff-Erkennung & Tooltip-Scan.** Im 1.12.1-Client leert `ClearLines()` auf dem versteckten Scan-Tooltip (`FBHealBoxScanTip`) ausgeblendete Textzeilen nicht. Da `FBPredict_TooltipText` nicht pruefte, ob eine Zeile sichtbar ist (`fs:IsShown()`), wurden Textzeilen zuvor gescannter Heilzauber (z. B. „Heals a friendly target...") faelschlicherweise auch bei Buff-Tooltips wie *Goettlicher Willen* (*Divine Spirit*) mitgelesen. Dadurch wurde fehlerhaft `isHeal = true` gesetzt, was die Erkennung der Buff-Laufzeit (`info.buff`) verhinderte und dazu fuehrte, dass das Buff-Icon links am Lebensbalken nicht erschien.
|
||||||
|
- **Erkennung von Gruppen-Buffs.** `FBPredict_BuildWatch` und `FBPredict_ScanUnit` unterstuetzen nun Gruppenversionen (`altTex`). Gruppen-Buffs (*Gebet der Seelenstaerke*, *Gebet der Willenskraft*, *Gabe der Wildnis*, *Grosse Segen*) werden nun zuverlaessig bestaetigt und mit Laufzeit/Icon dargestellt.
|
||||||
|
- **Buff-Wache Texturen.** `FBLoadSpellData` markiert nun alle Zauber aus `FBBuffWatchSpells` automatisch als Addon-Zauber (`isHealBoxSpell = true`), sodass ihre Texturen und Daten auch dann geladen und getrackt werden, wenn sie noch auf keinem Button liegen.
|
||||||
|
- **Drag & Drop Sofort-Synchronisation.** Das Ablegen eines Zaubers auf einen Button ruft nun direkt `FBPredict_BuildWatch()` auf, sodass neue Buffs und Vorhersagen ohne `/reload` sofort aktiv sind.
|
||||||
|
|
||||||
|
**Neu & Geaendert**
|
||||||
|
|
||||||
|
- **Vollstaendige Klassen-Zauberlisten.** `Spell.Name` fuer alle Heilerklassen stark erweitert, sodass saemtliche Heiler-Buffs, Gruppen-Buffs, Hilfszauber und Wiederbelebungen in den Auswahlmenues verfuegbar sind:
|
||||||
|
- **Priester:** *Machtwort: Seelenstaerke*, *Gebet der Seelenstaerke*, *Goettlicher Willen*, *Gebet der Willenskraft*, *Schattenschutz*, *Gebet des Schattenschutzes*, *Furchtzauberschutz*, *Seele der Macht*, *Auferstehung* hinzugefuegt.
|
||||||
|
- **Druide:** *Mal der Wildnis*, *Gabe der Wildnis*, *Dornen*, *Gelassenheit*, *Anregen*, *Wiedergeburt*, *Vergiftung heilen* hinzugefuegt.
|
||||||
|
- **Paladin:** Alle normalen und Grossen Segen (*Weisheit, Macht, Koenige, Rettung, Licht, Schutz*), *Segen der Freiheit*, *Segen der Opferung*, *Erloesung*, *Goettliches Eingreifen* hinzugefuegt.
|
||||||
|
- **Schamane:** *Geist der Ahnen*, *Reinigen*, *Wasserwandeln*, *Wasseratmung*, *Wasserschild* hinzugefuegt.
|
||||||
|
- Zusaetzliche Unterstuetzung fuer **Magier** (*Geringen Fluch aufheben*, *Arkane Intelligenz*, *Arkane Brillanz*, *Magie daempfen*, *Magie verstaerken*) und **Hexenmeister** (*Unendlicher Atem*, *Unsichtbarkeit entdecken*) ergaenzt.
|
||||||
|
- **Furchtzauberschutz in Buff-Wache.** *Fear Ward* fuer Priester in `FBBuffWatchSpells` aufgenommen.
|
||||||
|
|
||||||
|
|
||||||
|
## 1.4.4 (2026-09-06)
|
||||||
|
|
||||||
Performance pass. No feature was added or changed; every visible behaviour is meant to be identical. A simulated five-second raid fight (40 players, aura and health events, mana changes, combat log, 60 frames per second) went from about 63,900 API and widget calls to about 14,450, a reduction of 77 %.
|
Performance pass. No feature was added or changed; every visible behaviour is meant to be identical. A simulated five-second raid fight (40 players, aura and health events, mana changes, combat log, 60 frames per second) went from about 63,900 API and widget calls to about 14,450, a reduction of 77 %.
|
||||||
|
|
||||||
|
|||||||
+158
-90
@@ -17,16 +17,18 @@
|
|||||||
-- Anzeige, Debuff-Icon mit Stackzahl
|
-- Anzeige, Debuff-Icon mit Stackzahl
|
||||||
-- * v1.4.2: Hook-Schnittstelle fuer Module (FBHealBox_RegisterHook,
|
-- * v1.4.2: Hook-Schnittstelle fuer Module (FBHealBox_RegisterHook,
|
||||||
-- FBHealBox_AddOptionsTab). Der Raidmodus lebt in FBHealBox_Raid.lua.
|
-- FBHealBox_AddOptionsTab). Der Raidmodus lebt in FBHealBox_Raid.lua.
|
||||||
-- * v1.4.4: Leistungsdurchgang ohne Funktionsaenderung: zentrale Button-
|
|
||||||
-- Zustaende statt 260 Event-Handler, Anzeige-Zwischenspeicher, Aura-Scan
|
|
||||||
-- je Frame nur einmal, Event-Salven zusammengefasst, Ticker per Event
|
|
||||||
-- gesteuert, Combatlog-Parser nach Eventklasse. Details im CHANGELOG.
|
|
||||||
-- * v1.4.3: Mana-Ticker-Modul (FBHealBox_Ticker.lua), Smart-Damage-Modul
|
-- * v1.4.3: Mana-Ticker-Modul (FBHealBox_Ticker.lua), Smart-Damage-Modul
|
||||||
-- (FBHealBox_Damage.lua, Abrangen von Angriffszaubern), Reiterknoepfe
|
-- (FBHealBox_Damage.lua, Abrangen von Angriffszaubern), Reiterknoepfe
|
||||||
-- schmaler, damit vier Reiter ins Optionsfenster passen, Smart Healing
|
-- schmaler, damit vier Reiter ins Optionsfenster passen, Smart Healing
|
||||||
-- (automatisches Abrangen je Ziel, standardmaessig aus), Cooldown-Uhr auf den Buttons, roter Rahmen fuer
|
-- (automatisches Abrangen je Ziel, standardmaessig aus), Cooldown-Uhr auf den Buttons, roter Rahmen fuer
|
||||||
-- "wer wird angegriffen", HoT- und Schild-Restzeit auf dem jeweiligen
|
-- "wer wird angegriffen", HoT- und Schild-Restzeit auf dem jeweiligen
|
||||||
-- Button (inkl. Geschwaechte Seele).
|
-- Button (inkl. Geschwaechte Seele).
|
||||||
|
-- * v1.4.4: Leistungsdurchgang ohne Funktionsaenderung: zentrale Button-
|
||||||
|
-- Zustaende statt 260 Event-Handler, Anzeige-Zwischenspeicher, Aura-Scan
|
||||||
|
-- je Frame nur einmal, Event-Salven zusammengefasst, Ticker per Event
|
||||||
|
-- gesteuert, Combatlog-Parser nach Eventklasse. Details im CHANGELOG.
|
||||||
|
-- * v1.4.4.1: Spells hinzugefügt, Bugfixes
|
||||||
|
-- * v1.4.4.2: TOC Addonbeschreibung präzisiert, Umstellung Buff-Restlaufzeit von 4/4 Blocks auf 32 Topdown Anzeige (fadeout Effekt)
|
||||||
--
|
--
|
||||||
-- Ehre wem Ehre gebuehrt: Aufbau, Namensplaketten und Grundidee stammen
|
-- Ehre wem Ehre gebuehrt: Aufbau, Namensplaketten und Grundidee stammen
|
||||||
-- aus dem Original.
|
-- aus dem Original.
|
||||||
@@ -77,7 +79,7 @@ HealBox = {
|
|||||||
-- feuert ADDON_LOADED fuer uns.
|
-- feuert ADDON_LOADED fuer uns.
|
||||||
FBADDON_NAME = "Heal Box Vanilla";
|
FBADDON_NAME = "Heal Box Vanilla";
|
||||||
FBADDON_FOLDER = "FBHealBox";
|
FBADDON_FOLDER = "FBHealBox";
|
||||||
HealBoxVersion = "|cFFFFFF00v1.4.4|r";
|
HealBoxVersion = "|cFFFFFF00v1.4.4.2|r";
|
||||||
|
|
||||||
-- ==========================================================================
|
-- ==========================================================================
|
||||||
-- [ Lokalisierung / Localization ]
|
-- [ Lokalisierung / Localization ]
|
||||||
@@ -819,7 +821,7 @@ end
|
|||||||
-- gelernten erscheinen im Menue) und welche Gruppenversion dasselbe zaehlt.
|
-- gelernten erscheinen im Menue) und welche Gruppenversion dasselbe zaehlt.
|
||||||
FBBuffWatchSpells = {
|
FBBuffWatchSpells = {
|
||||||
Priest = { "Power Word: Fortitude", "Prayer of Fortitude", "Divine Spirit", "Prayer of Spirit",
|
Priest = { "Power Word: Fortitude", "Prayer of Fortitude", "Divine Spirit", "Prayer of Spirit",
|
||||||
"Shadow Protection", "Prayer of Shadow Protection", "Renew", "Power Word: Shield" },
|
"Shadow Protection", "Prayer of Shadow Protection", "Fear Ward", "Renew", "Power Word: Shield", "Inner Fire" },
|
||||||
Druid = { "Mark of the Wild", "Gift of the Wild", "Thorns", "Rejuvenation", "Regrowth" },
|
Druid = { "Mark of the Wild", "Gift of the Wild", "Thorns", "Rejuvenation", "Regrowth" },
|
||||||
Paladin = { "Blessing of Wisdom", "Greater Blessing of Wisdom", "Blessing of Might", "Greater Blessing of Might",
|
Paladin = { "Blessing of Wisdom", "Greater Blessing of Wisdom", "Blessing of Might", "Greater Blessing of Might",
|
||||||
"Blessing of Kings", "Greater Blessing of Kings", "Blessing of Salvation", "Greater Blessing of Salvation",
|
"Blessing of Kings", "Greater Blessing of Kings", "Blessing of Salvation", "Greater Blessing of Salvation",
|
||||||
@@ -1029,50 +1031,106 @@ Spell = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
if (FBClass == "Druid") then
|
if (FBClass == "Druid") then
|
||||||
Spell.Name[1] = "Rejuvenation";
|
-- Heilung
|
||||||
Spell.Name[2] = "Regrowth";
|
Spell.Name[1] = "Healing Touch";
|
||||||
Spell.Name[3] = "Lifebloom";
|
Spell.Name[2] = "Regrowth";
|
||||||
Spell.Name[4] = "Healing Touch";
|
Spell.Name[3] = "Rejuvenation";
|
||||||
Spell.Name[5] = "Swiftmend";
|
Spell.Name[4] = "Swiftmend";
|
||||||
Spell.Name[6] = "Remove Curse";
|
Spell.Name[5] = "Tranquility";
|
||||||
Spell.Name[7] = "Abolish Poison";
|
Spell.Name[6] = "Lifebloom"; -- TBC / Vanilla+
|
||||||
|
-- Reinigung
|
||||||
|
Spell.Name[7] = "Abolish Poison";
|
||||||
|
Spell.Name[8] = "Cure Poison";
|
||||||
|
Spell.Name[9] = "Remove Curse";
|
||||||
|
-- Buffs & Rezz
|
||||||
|
Spell.Name[10] = "Mark of the Wild";
|
||||||
|
Spell.Name[11] = "Gift of the Wild";
|
||||||
|
Spell.Name[12] = "Thorns";
|
||||||
|
Spell.Name[13] = "Innervate";
|
||||||
|
Spell.Name[14] = "Rebirth";
|
||||||
end
|
end
|
||||||
|
|
||||||
if (FBClass == "Priest") then
|
if (FBClass == "Priest") then
|
||||||
Spell.Name[1] = "Renew";
|
Spell.Name[1] = "Lesser Heal";
|
||||||
Spell.Name[2] = "Flash Heal";
|
Spell.Name[2] = "Heal";
|
||||||
Spell.Name[3] = "Lesser Heal";
|
Spell.Name[3] = "Flash Heal";
|
||||||
Spell.Name[4] = "Heal";
|
Spell.Name[4] = "Greater Heal";
|
||||||
Spell.Name[5] = "Greater Heal";
|
Spell.Name[5] = "Renew";
|
||||||
Spell.Name[6] = "Binding Heal";
|
Spell.Name[6] = "Power Word: Shield";
|
||||||
Spell.Name[7] = "Prayer of Healing";
|
Spell.Name[7] = "Prayer of Healing";
|
||||||
Spell.Name[8] = "Prayer of Mending";
|
Spell.Name[8] = "Binding Heal"; -- TBC / Vanilla+
|
||||||
Spell.Name[9] = "Circle of Healing";
|
Spell.Name[9] = "Prayer of Mending"; -- TBC / Vanilla+
|
||||||
Spell.Name[10] = "Power Word: Shield";
|
Spell.Name[10] = "Circle of Healing"; -- TBC / Vanilla+
|
||||||
Spell.Name[11] = "Abolish Disease";
|
Spell.Name[11] = "Dispel Magic";
|
||||||
Spell.Name[12] = "Cure Disease";
|
Spell.Name[12] = "Abolish Disease";
|
||||||
Spell.Name[13] = "Dispel Magic";
|
Spell.Name[13] = "Cure Disease";
|
||||||
end
|
Spell.Name[14] = "Power Word: Fortitude";
|
||||||
|
Spell.Name[15] = "Prayer of Fortitude";
|
||||||
if (FBClass == "Shaman") then
|
Spell.Name[16] = "Divine Spirit";
|
||||||
Spell.Name[1] = "Lesser Healing Wave";
|
Spell.Name[17] = "Prayer of Spirit";
|
||||||
Spell.Name[2] = "Healing Wave";
|
Spell.Name[18] = "Shadow Protection";
|
||||||
Spell.Name[3] = "Chain Heal";
|
Spell.Name[19] = "Prayer of Shadow Protection";
|
||||||
Spell.Name[4] = "Earth Shield";
|
Spell.Name[20] = "Fear Ward";
|
||||||
Spell.Name[5] = "Cure Poison";
|
Spell.Name[21] = "Inner Fire";
|
||||||
Spell.Name[6] = "Cure Disease";
|
Spell.Name[22] = "Power Infusion";
|
||||||
|
Spell.Name[23] = "Resurrection";
|
||||||
end
|
end
|
||||||
|
|
||||||
if (FBClass == "Paladin") then
|
if (FBClass == "Paladin") then
|
||||||
Spell.Name[1] = "Flash of Light";
|
Spell.Name[1] = "Flash of Light";
|
||||||
Spell.Name[2] = "Holy Light";
|
Spell.Name[2] = "Holy Light";
|
||||||
Spell.Name[3] = "Holy Shock";
|
Spell.Name[3] = "Holy Shock";
|
||||||
Spell.Name[4] = "Lay on Hands";
|
Spell.Name[4] = "Lay on Hands";
|
||||||
Spell.Name[5] = "Purify";
|
Spell.Name[5] = "Cleanse";
|
||||||
Spell.Name[6] = "Cleanse";
|
Spell.Name[6] = "Purify";
|
||||||
Spell.Name[7] = "Blessing of Protection";
|
Spell.Name[7] = "Blessing of Protection";
|
||||||
|
Spell.Name[8] = "Blessing of Freedom";
|
||||||
|
Spell.Name[9] = "Blessing of Sacrifice";
|
||||||
|
Spell.Name[10] = "Redemption";
|
||||||
|
Spell.Name[11] = "Divine Intervention";
|
||||||
|
Spell.Name[12] = "Blessing of Wisdom";
|
||||||
|
Spell.Name[13] = "Blessing of Might";
|
||||||
|
Spell.Name[14] = "Blessing of Kings";
|
||||||
|
Spell.Name[15] = "Blessing of Salvation";
|
||||||
|
Spell.Name[16] = "Blessing of Light";
|
||||||
|
Spell.Name[17] = "Blessing of Sanctuary";
|
||||||
|
Spell.Name[18] = "Greater Blessing of Wisdom";
|
||||||
|
Spell.Name[19] = "Greater Blessing of Might";
|
||||||
|
Spell.Name[20] = "Greater Blessing of Kings";
|
||||||
|
Spell.Name[21] = "Greater Blessing of Salvation";
|
||||||
|
Spell.Name[22] = "Greater Blessing of Light";
|
||||||
|
Spell.Name[23] = "Greater Blessing of Sanctuary";
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if (FBClass == "Shaman") then
|
||||||
|
Spell.Name[1] = "Lesser Healing Wave";
|
||||||
|
Spell.Name[2] = "Healing Wave";
|
||||||
|
Spell.Name[3] = "Chain Heal";
|
||||||
|
Spell.Name[4] = "Earth Shield"; -- TBC / Vanilla+
|
||||||
|
Spell.Name[5] = "Water Shield"; -- TBC / Vanilla+
|
||||||
|
Spell.Name[6] = "Cure Poison";
|
||||||
|
Spell.Name[7] = "Cure Disease";
|
||||||
|
Spell.Name[8] = "Purge";
|
||||||
|
Spell.Name[9] = "Ancestral Spirit";
|
||||||
|
Spell.Name[10] = "Water Walking";
|
||||||
|
Spell.Name[11] = "Water Breathing";
|
||||||
|
end
|
||||||
|
|
||||||
|
if (FBClass == "Mage") then
|
||||||
|
Spell.Name[1] = "Remove Lesser Curse";
|
||||||
|
Spell.Name[2] = "Arcane Intellect";
|
||||||
|
Spell.Name[3] = "Arcane Brilliance";
|
||||||
|
Spell.Name[4] = "Dampen Magic";
|
||||||
|
Spell.Name[5] = "Amplify Magic";
|
||||||
|
end
|
||||||
|
|
||||||
|
if (FBClass == "Warlock") then
|
||||||
|
Spell.Name[1] = "Unending Breath";
|
||||||
|
Spell.Name[2] = "Detect Invisibility";
|
||||||
|
Spell.Name[3] = "Detect Lesser Invisibility";
|
||||||
|
Spell.Name[4] = "Detect Greater Invisibility";
|
||||||
|
end
|
||||||
|
|
||||||
MaxButtonCount = 10;
|
MaxButtonCount = 10;
|
||||||
|
|
||||||
-- Speichert alle verfügbaren Zauber und Ränge
|
-- Speichert alle verfügbaren Zauber und Ränge
|
||||||
@@ -1201,13 +1259,14 @@ function FBLoadSpellData()
|
|||||||
break;
|
break;
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
-- Buff-Wache: Textur des Zaubers merken (rangunabhaengig)
|
-- Buff-Wache: Textur des Zaubers merken (rangunabhaengig) und als Addon-Zauber erfassen
|
||||||
for _, v in ipairs(FBBuffWatchSpells[FBClass] or {}) do
|
for _, v in ipairs(FBBuffWatchSpells[FBClass] or {}) do
|
||||||
if (v == spellName) then
|
if (v == spellName) then
|
||||||
FBBuffSpells[spellName] = { icon = GetSpellTexture(i, BOOKTYPE_SPELL) };
|
FBBuffSpells[spellName] = { icon = GetSpellTexture(i, BOOKTYPE_SPELL) };
|
||||||
|
isHealBoxSpell = true;
|
||||||
break;
|
break;
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if isHealBoxSpell then
|
if isHealBoxSpell then
|
||||||
if not FBPlayerSpells[spellName] then
|
if not FBPlayerSpells[spellName] then
|
||||||
@@ -2129,6 +2188,7 @@ function FBHealBox_DropSpell(btnIndex, side)
|
|||||||
local _, _, _, _, savedTable = FBChoiceTables(side);
|
local _, _, _, _, savedTable = FBChoiceTables(side);
|
||||||
savedTable[btnIndex] = castString;
|
savedTable[btnIndex] = castString;
|
||||||
FBApplySpellChoice(btnIndex, castString, side);
|
FBApplySpellChoice(btnIndex, castString, side);
|
||||||
|
FBPredict_BuildWatch();
|
||||||
FBHealBoxButtonsChanged();
|
FBHealBoxButtonsChanged();
|
||||||
|
|
||||||
local key = "DROP_SET";
|
local key = "DROP_SET";
|
||||||
@@ -4162,7 +4222,7 @@ function FBPredict_TooltipText(bookID)
|
|||||||
local i = 1;
|
local i = 1;
|
||||||
while (i <= 30) do
|
while (i <= 30) do
|
||||||
local fs = getglobal("FBHealBoxScanTipTextLeft"..i);
|
local fs = getglobal("FBHealBoxScanTipTextLeft"..i);
|
||||||
if (not fs) then break; end
|
if (not fs or not fs:IsShown()) then break; end
|
||||||
local line = fs:GetText();
|
local line = fs:GetText();
|
||||||
if (line) then txt = txt.." "..line; end
|
if (line) then txt = txt.." "..line; end
|
||||||
i = i + 1;
|
i = i + 1;
|
||||||
@@ -4350,8 +4410,11 @@ function FBPredict_BuildWatch()
|
|||||||
local top = ranks[table.getn(ranks)];
|
local top = ranks[table.getn(ranks)];
|
||||||
local info = FBPredict_GetSpellInfo(top.id, spellName);
|
local info = FBPredict_GetSpellInfo(top.id, spellName);
|
||||||
if (info) then
|
if (info) then
|
||||||
|
local alt = FBBuffAlternates[spellName];
|
||||||
|
local altTex = alt and FBBuffSpells[alt] and strupper(FBBuffSpells[alt].icon or "");
|
||||||
FBPredictWatch[spellName] = {
|
FBPredictWatch[spellName] = {
|
||||||
tex = strupper(top.icon or ""),
|
tex = strupper(top.icon or ""),
|
||||||
|
altTex = altTex,
|
||||||
bookID = top.id,
|
bookID = top.id,
|
||||||
rank = top.rank,
|
rank = top.rank,
|
||||||
hasDirect = (info.direct ~= nil),
|
hasDirect = (info.direct ~= nil),
|
||||||
@@ -4683,7 +4746,7 @@ function FBPredict_ScanUnit(unit)
|
|||||||
-- ein Refresh (Nachcasten) die Uhr neu stellt.
|
-- ein Refresh (Nachcasten) die Uhr neu stellt.
|
||||||
if (FBPredictPending and FBPredictPending.target == name) then
|
if (FBPredictPending and FBPredictPending.target == name) then
|
||||||
local w = FBPredictWatch[FBPredictPending.spell];
|
local w = FBPredictWatch[FBPredictPending.spell];
|
||||||
if (w and textures[w.tex]) then
|
if (w and (textures[w.tex] or (w.altTex and textures[w.altTex]))) then
|
||||||
if (w.hasHoT) then
|
if (w.hasHoT) then
|
||||||
dirty = FBPredict_StartHoT(name, FBPredictPending.spell,
|
dirty = FBPredict_StartHoT(name, FBPredictPending.spell,
|
||||||
FBPredictPending.rank, FBPredictPending.bookID, true) or dirty;
|
FBPredictPending.rank, FBPredictPending.bookID, true) or dirty;
|
||||||
@@ -4705,14 +4768,12 @@ function FBPredict_ScanUnit(unit)
|
|||||||
if (not FBBuffPresent[name]) then FBBuffPresent[name] = {}; end
|
if (not FBBuffPresent[name]) then FBBuffPresent[name] = {}; end
|
||||||
for spellName, w in pairs(FBPredictWatch) do
|
for spellName, w in pairs(FBPredictWatch) do
|
||||||
if (w.hasBuff) then
|
if (w.hasBuff) then
|
||||||
local present = textures[w.tex];
|
local present = textures[w.tex] or (w.altTex and textures[w.altTex]);
|
||||||
if (FBBuffPresent[name][spellName] ~= present) then FBBuffIconsDirty = true; end
|
if (FBBuffPresent[name][spellName] ~= present) then FBBuffIconsDirty = true; end
|
||||||
FBBuffPresent[name][spellName] = present;
|
FBBuffPresent[name][spellName] = present;
|
||||||
local tracked = FBBuffTimers[name] and FBBuffTimers[name][spellName];
|
local tracked = FBBuffTimers[name] and FBBuffTimers[name][spellName];
|
||||||
if (present and unit == "player") then
|
if (present and unit == "player") then
|
||||||
-- beim Spieler bei jedem Scan neu aus der Buff-API lesen: so
|
local left = FBPredict_PlayerBuffTimeLeft(w.tex) or (w.altTex and FBPredict_PlayerBuffTimeLeft(w.altTex));
|
||||||
-- stellt auch ein Neucast per Aktionsleiste die Uhr auf voll
|
|
||||||
local left = FBPredict_PlayerBuffTimeLeft(w.tex);
|
|
||||||
if (left) then FBPredict_StartBuff(name, spellName, left); end
|
if (left) then FBPredict_StartBuff(name, spellName, left); end
|
||||||
elseif (tracked and not present) then
|
elseif (tracked and not present) then
|
||||||
FBBuffTimers[name][spellName] = nil;
|
FBBuffTimers[name][spellName] = nil;
|
||||||
@@ -5366,8 +5427,8 @@ SlashCmdList["FBHEALPREDICT"] = function(msg)
|
|||||||
for k, ic in ipairs(FBHealBox1.buffIcons) do
|
for k, ic in ipairs(FBHealBox1.buffIcons) do
|
||||||
DEFAULT_CHAT_FRAME:AddMessage("|cFF00FFFF[FBP]|r icon "..k..": shown="..tostring(ic:IsShown() and true or false)
|
DEFAULT_CHAT_FRAME:AddMessage("|cFF00FFFF[FBP]|r icon "..k..": shown="..tostring(ic:IsShown() and true or false)
|
||||||
.." name="..tostring(ic.buffName).." left="..tostring(ic.buffLeft and math.floor(ic.buffLeft))
|
.." name="..tostring(ic.buffName).." left="..tostring(ic.buffLeft and math.floor(ic.buffLeft))
|
||||||
.." grey="..tostring(ic.greyCount).." q1shown="..tostring(ic.q[1]:IsShown() and true or false)
|
.." grey="..tostring(ic.greyCount).." q1shown="..tostring(ic.qTex and ic.qTex:IsShown() and true or false)
|
||||||
.." desat="..tostring(ic.q[1].fbDesat));
|
.." desat="..tostring(ic.qTex and ic.qTex.fbDesat));
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
local i = 1;
|
local i = 1;
|
||||||
@@ -5537,13 +5598,7 @@ end
|
|||||||
-- (fremder Cast): Icon ohne Uhr. Der Name macht Platz.
|
-- (fremder Cast): Icon ohne Uhr. Der Name macht Platz.
|
||||||
-- ==========================================================================
|
-- ==========================================================================
|
||||||
|
|
||||||
-- Quadranten der Uhr im Uhrzeigersinn ab 12 Uhr: Ecke, Texturausschnitt
|
FBBUFFICON_STEPS = 32;
|
||||||
FBBUFFICON_QUADS = {
|
|
||||||
{ corner = "TOPRIGHT", u1 = 0.50, u2 = 0.93, v1 = 0.07, v2 = 0.50 },
|
|
||||||
{ corner = "BOTTOMRIGHT", u1 = 0.50, u2 = 0.93, v1 = 0.50, v2 = 0.93 },
|
|
||||||
{ corner = "BOTTOMLEFT", u1 = 0.07, u2 = 0.50, v1 = 0.50, v2 = 0.93 },
|
|
||||||
{ corner = "TOPLEFT", u1 = 0.07, u2 = 0.50, v1 = 0.07, v2 = 0.50 },
|
|
||||||
};
|
|
||||||
|
|
||||||
-- Icon Nr. k anlegen, aussen links neben der Plakette, in Zweierstapeln:
|
-- Icon Nr. k anlegen, aussen links neben der Plakette, in Zweierstapeln:
|
||||||
-- Icon 1 oben an der Kante, Icon 2 darunter, Icon 3 oben in der naechsten
|
-- Icon 1 oben an der Kante, Icon 2 darunter, Icon 3 oben in der naechsten
|
||||||
@@ -5571,28 +5626,23 @@ function FBHealBox_GetBuffIcon(frame, k, size, rows)
|
|||||||
-- Reihenfolge, Textur-Layer innerhalb eines Frames nicht in jedem Fall.
|
-- Reihenfolge, Textur-Layer innerhalb eines Frames nicht in jedem Fall.
|
||||||
ic.grey = CreateFrame("Frame", nil, ic);
|
ic.grey = CreateFrame("Frame", nil, ic);
|
||||||
ic.grey:SetAllPoints(ic);
|
ic.grey:SetAllPoints(ic);
|
||||||
if (ic.grey.SetFrameLevel and ic.GetFrameLevel) then ic.grey:SetFrameLevel((ic:GetFrameLevel() or 0) + 1); end
|
if (ic.grey.SetFrameLevel and frame.GetFrameLevel) then ic.grey:SetFrameLevel((ic:GetFrameLevel() or 0) + 1); end
|
||||||
ic.q = {};
|
|
||||||
ic.w = {};
|
-- Schwarz-weißes Icon-Overlay (wächst von oben nach unten)
|
||||||
local half = size / 2;
|
ic.qTex = ic.grey:CreateTexture(nil, "ARTWORK");
|
||||||
for i, qd in ipairs(FBBUFFICON_QUADS) do
|
ic.qTex:SetPoint("TOPLEFT", ic, "TOPLEFT", 0, 0);
|
||||||
-- schwarz-weisser Ausschnitt des Icons ...
|
ic.qTex:SetPoint("TOPRIGHT", ic, "TOPRIGHT", 0, 0);
|
||||||
local t = ic.grey:CreateTexture(nil, "ARTWORK");
|
ic.qTex:SetHeight(0);
|
||||||
t:SetWidth(half);
|
ic.qTex:Hide();
|
||||||
t:SetHeight(half);
|
|
||||||
t:SetPoint(qd.corner, ic, qd.corner, 0, 0);
|
-- Dunkle Schattierung über dem abgelaufenen Bereich
|
||||||
t:SetTexCoord(qd.u1, qd.u2, qd.v1, qd.v2);
|
ic.wTex = ic.grey:CreateTexture(nil, "OVERLAY");
|
||||||
t:Hide();
|
ic.wTex:SetPoint("TOPLEFT", ic, "TOPLEFT", 0, 0);
|
||||||
ic.q[i] = t;
|
ic.wTex:SetPoint("TOPRIGHT", ic, "TOPRIGHT", 0, 0);
|
||||||
-- ... plus dunkle Waesche darueber, damit der Unterschied auf jedem Client sichtbar ist
|
ic.wTex:SetTexture(FBBUFFICON_WASH[1], FBBUFFICON_WASH[2], FBBUFFICON_WASH[3], FBBUFFICON_WASH[4]);
|
||||||
local wsh = ic.grey:CreateTexture(nil, "OVERLAY");
|
ic.wTex:SetHeight(0);
|
||||||
wsh:SetWidth(half);
|
ic.wTex:Hide();
|
||||||
wsh:SetHeight(half);
|
|
||||||
wsh:SetPoint(qd.corner, ic, qd.corner, 0, 0);
|
|
||||||
wsh:SetTexture(FBBUFFICON_WASH[1], FBBUFFICON_WASH[2], FBBUFFICON_WASH[3], FBBUFFICON_WASH[4]);
|
|
||||||
wsh:Hide();
|
|
||||||
ic.w[i] = wsh;
|
|
||||||
end
|
|
||||||
-- Tooltip: Buffname und Restzeit (auch zur Diagnose)
|
-- Tooltip: Buffname und Restzeit (auch zur Diagnose)
|
||||||
ic:EnableMouse(true);
|
ic:EnableMouse(true);
|
||||||
ic:SetScript("OnEnter", function()
|
ic:SetScript("OnEnter", function()
|
||||||
@@ -5626,19 +5676,37 @@ function FBHealBox_GreyTexture(t)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Uhrstand setzen: remaining = Restanteil 0..1, nil = unbekannt (alles farbig)
|
|
||||||
function FBHealBox_SetBuffIconProgress(ic, remaining)
|
function FBHealBox_SetBuffIconProgress(ic, remaining)
|
||||||
local grey = 0;
|
local grey = 0;
|
||||||
if (remaining) then
|
if (remaining) then
|
||||||
if (remaining < 0) then remaining = 0; end
|
if (remaining < 0) then remaining = 0; end
|
||||||
if (remaining > 1) then remaining = 1; end
|
if (remaining > 1) then remaining = 1; end
|
||||||
grey = math.floor((1 - remaining) * 4 + 0.5); -- 0..4 Quadranten grau, ab 12 Uhr im Uhrzeigersinn
|
grey = math.floor((1 - remaining) * FBBUFFICON_STEPS + 0.5);
|
||||||
if (grey > 4) then grey = 4; end
|
if (grey > FBBUFFICON_STEPS) then grey = FBBUFFICON_STEPS; end
|
||||||
end
|
end
|
||||||
|
|
||||||
if (ic.greyCount == grey) then return; end
|
if (ic.greyCount == grey) then return; end
|
||||||
ic.greyCount = grey;
|
ic.greyCount = grey;
|
||||||
for i = 1, 4 do
|
|
||||||
if (i <= grey) then ic.q[i]:Show(); ic.w[i]:Show(); else ic.q[i]:Hide(); ic.w[i]:Hide(); end
|
if (grey == 0) then
|
||||||
|
if (ic.qTex) then ic.qTex:Hide(); end
|
||||||
|
if (ic.wTex) then ic.wTex:Hide(); end
|
||||||
|
else
|
||||||
|
local size = ic:GetHeight() or FBBUFFICON_SIZE;
|
||||||
|
local frac = grey / FBBUFFICON_STEPS;
|
||||||
|
local h = size * frac;
|
||||||
|
|
||||||
|
if (ic.qTex) then
|
||||||
|
ic.qTex:SetHeight(h);
|
||||||
|
-- Standard-Icon-Beschnitt (0.07 bis 0.93) anteilig anpassen:
|
||||||
|
local vBottom = 0.07 + (0.93 - 0.07) * frac;
|
||||||
|
ic.qTex:SetTexCoord(0.07, 0.93, 0.07, vBottom);
|
||||||
|
ic.qTex:Show();
|
||||||
|
end
|
||||||
|
if (ic.wTex) then
|
||||||
|
ic.wTex:SetHeight(h);
|
||||||
|
ic.wTex:Show();
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -5697,13 +5765,13 @@ function FBHealBox_UpdateBuffIcons(frame, unitName, g, size, rows, maxIcons)
|
|||||||
if (ic.lastTex ~= b.tex) then
|
if (ic.lastTex ~= b.tex) then
|
||||||
ic.lastTex = b.tex;
|
ic.lastTex = b.tex;
|
||||||
ic.tex:SetTexture(b.tex);
|
ic.tex:SetTexture(b.tex);
|
||||||
for i = 1, 4 do
|
if (ic.qTex) then
|
||||||
ic.q[i]:SetTexture(b.tex);
|
ic.qTex:SetTexture(b.tex);
|
||||||
FBHealBox_GreyTexture(ic.q[i]);
|
FBHealBox_GreyTexture(ic.qTex);
|
||||||
end
|
end
|
||||||
ic.greyCount = nil;
|
ic.greyCount = nil;
|
||||||
end
|
end
|
||||||
-- Uhr: Restanteil bekannt -> Quadranten; unbekannt -> alles farbig
|
|
||||||
local remaining = nil;
|
local remaining = nil;
|
||||||
ic.buffName = b.name;
|
ic.buffName = b.name;
|
||||||
ic.buffLeft = nil;
|
ic.buffLeft = nil;
|
||||||
|
|||||||
+4
-4
@@ -1,9 +1,9 @@
|
|||||||
## Interface: 11200
|
## Interface: 11200
|
||||||
## Title: Heal Box Vanilla |cFFFFFF00v1.4.4|r
|
## Title: Heal Box Vanilla |cFFFFFF00v1.4.4.2|r
|
||||||
## Notes: Party, pet and self heal display with quick-cast buttons for healers. Ported to client 1.12.1 (optional SuperWoW). Up to 10 buttons per row, mana bar inside the health bar, class colours, buff watch, range fading, adjustable spacing, test mode with ghost players, optional raid mode for 20 and 40 players, mana ticker with five-second rule, smart damage ranking for attack spells. Heal prediction for direct heals, HoT ticks and absorb shields, self-correcting from the combat log. HealComm sync with Puppeteer, pfUI and others. German/English. Original by Dourd, ported to Vanilla and extended 09/2026 by Mquadrat.
|
## Notes: Heal/raid frame addon like Healium, with quick-cast buttons, heal prediction, mana ticker and more.
|
||||||
## Notes-deDE: Party-, Begleiter- und Selbst-Heilanzeige mit Schnellzugriff-Buttons fuer Heiler. Portiert fuer Client 1.12.1 (optional SuperWoW). Bis zu 10 Buttons pro Reihe, Manabalken im Lebensbalken, Klassenfarben, Buff-Wache, Reichweiten-Fading, einstellbare Abstaende, Testmodus mit Geisterspielern, optionaler Raidmodus fuer 20 und 40 Spieler, Mana-Ticker mit Fuenf-Sekunden-Regel, Smart Damage fuer Angriffszauber. Heal-Prediction fuer Direktheilung, HoT-Ticks und Absorb-Schilde, selbstkorrigierend ueber den Combatlog. HealComm-Sync mit Puppeteer, pfUI und Co. Deutsch/Englisch. Original von Dourd, Vanilla-Portierung und Erweiterung 09/2026 von Mquadrat.
|
## 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
|
## Author: Dourd (Argent Dawn EU) | Vanilla-Port & Erweiterung 09/2026: Mquadrat
|
||||||
## Version: 1.4.4
|
## Version: 1.4.4.2
|
||||||
## SavedVariablesPerCharacter: HealBox
|
## SavedVariablesPerCharacter: HealBox
|
||||||
## OptionalDeps: SuperWoW
|
## OptionalDeps: SuperWoW
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user