mirror of
https://github.com/QbiXibQ/FBHealBox.git
synced 2026-10-09 15:40:01 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8a8c730f9b | ||
|
|
52a0e84a33 | ||
|
|
e99d32ba1e | ||
|
|
61b66b5145 | ||
|
|
0051f43861 | ||
|
|
a408984895 | ||
|
|
1689e5cc0c | ||
|
|
6d1915e807 | ||
|
|
47181f0f17 | ||
|
|
3a7ac1c851 |
+53
-1
@@ -1,6 +1,58 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
## 1.4.4.2 (2026-09-06)
|
## 1.4.4.3 (2026-09-08)
|
||||||
|
|
||||||
|
Class gate, heal chains and a Smart Healing fix. The addon no longer loads its display for warriors, rogues and hunters, Smart Healing keeps its hands off heal over time spells, and downranking may now switch spell inside a heal chain.
|
||||||
|
|
||||||
|
### English
|
||||||
|
|
||||||
|
**New & Changed**
|
||||||
|
|
||||||
|
- **Smartcross option in UI.** Added a *Smartcross* checkbox under Smart Healing in the *Buttons* tab. It is automatically enabled/disabled and grayed out based on the Smart Healing master switch (also toggleable via `/fbp smartcross`).
|
||||||
|
- **Streamlined Smart Healing tooltip.** Overhauled the options tooltip for Smart Healing across all languages. Replaced the screen-filling block of text with a compact, readable bullet-point summary of key rules.
|
||||||
|
- **Priest heal chain cleaned.** Completely removed *Flash Heal* from the Priest heal chain (`Lesser Heal · Heal · Greater Heal`). Flash Heal is preserved as a dedicated fast emergency heal and is never swapped into from Greater Heal or Heal.
|
||||||
|
- **Downranking across spells.** Until now Smart Healing only ever lowered the rank of the spell on the button, so Greater Heal (rank 4) could become Greater Heal (rank 1) but never Lesser Heal (rank 3), even though that would have covered the deficit for a fraction of the mana. Every single-target direct heal of a class now forms a *heal chain*, and the whole chain is searched: Priest `Lesser Heal · Heal · Greater Heal`, Paladin `Flash of Light · Holy Light`, Shaman `Lesser Healing Wave · Healing Wave`, Druid `Healing Touch`. The candidate with the smallest expected heal that still covers the need wins.
|
||||||
|
- **The button never gets stronger.** Nothing that heals more than the rank you assigned is ever chosen, and a tie keeps the assigned spell. Note that the cast time can change: for a small deficit a Greater Heal click may come out as Lesser Heal, and Holy Light as Flash of Light.
|
||||||
|
- **What stays out of the chains.** Group heals (Prayer of Healing, Chain Heal), fast emergency heals (Flash Heal), HoTs (Renew, Rejuvenation, Regrowth), shields and cooldown spells (Holy Shock, Lay on Hands) are never swapped. The chains sit in `FBHealChains` and can be edited freely; German spell names are included, with special characters stored as byte sequences for both Latin-1 and UTF-8 clients.
|
||||||
|
- **New command `/fbp smartcross`.** Turns chain switching off and on, saved per character in `HealBox.SmartCross` (on by default). With it off, Smart Healing stays on the assigned spell and only lowers its rank. `/fbp` shows the state next to the Smart Healing line, and the command says so when Smart Healing itself is still off.
|
||||||
|
- **Class gate for warriors, rogues and hunters.** The addon is built for healing and buffing, and those three classes get nothing out of it: no heals, no heal prediction, and a mana ticker with either no mana to watch (rage, energy) or nobody to heal (hunter). Logging in on one of them now leaves the whole display switched off: no plates, no raid grid, no minimap button, no options window. All event handlers and `OnUpdate` loops of the core and of the raid, ticker and Smart Damage modules return immediately (`FBAddonSuppressed`), so the addon costs nothing while it sleeps. Two lines in the chat explain what happened and how to change it.
|
||||||
|
- **New command `/fbp forceload`.** Shows the addon on a blocked class anyway. It starts immediately, without `/reload`, and the setting is kept per character in `HealBox.ForceLoad`. The same command switches it back off. On every other class the command reports that it is not needed. While the addon sleeps, every other `/fbp` command answers with the same hint instead of reporting on a display that was never built.
|
||||||
|
- **Class detection.** Uses the client's English class token (`WARRIOR`, `ROGUE`, `HUNTER`) with a fallback to the displayed class name in five languages, plus a last resort over the power type (rage and energy are never mana classes).
|
||||||
|
- **New hook `Suppress`.** Modules hide their own frames when the core goes to sleep; the raid module hides the grid, the ticker hides its sparks.
|
||||||
|
- **Startup message moved.** The greeting and the modules' `Loaded` hooks now run on `ADDON_LOADED` / `VARIABLES_LOADED` instead of `FBHealBox_OnLoad`, so the saved language is applied and nothing is announced for a class that stays asleep.
|
||||||
|
- **Rank rules generalised.** The upper limit is no longer "never above the assigned rank" but "never more expected healing than the assigned rank", which is the same thing inside one spell and the right rule across spells. A rank whose tooltip cannot be read is now skipped instead of ending the search.
|
||||||
|
|
||||||
|
**Fixed**
|
||||||
|
|
||||||
|
- **Smart Healing no longer downranks heal over time spells.** Renew, Rejuvenation, Regrowth, Tranquility, Lifebloom, Wild Growth, Riptide and Earth Shield now always go out at the assigned rank, for every class. A HoT spreads its healing over many seconds, so the health missing at the moment of the click says nothing about which rank fits, and a downranked HoT keeps ticking too weakly for its whole duration. Mixed spells such as Regrowth count as HoTs as well.
|
||||||
|
- **HoT detection** The new `FBHealBox_IsHoT()` checks the name list `FBHoTSpells` (English and German names, umlauts stored as byte sequences for both Latin-1 and UTF-8 clients), the tooltip evaluation (`info.hot`), the spell watch (`hasHoT`) and the HoTs currently running from the combat log. The exception therefore also applies to spells that are not in the list, for instance on custom servers. In addition the per-rank check now rejects any rank with a HoT portion.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Deutsch
|
||||||
|
|
||||||
|
**Neu & Geaendert**
|
||||||
|
|
||||||
|
- **Smartcross im Optionsfenster.** Checkbox unter Smart Healing im Reiter *Buttons* hinzugefügt. Sie steuert das zauberübergreifende Abrangen in Heilketten und wird dynamisch gesperrt und ausgegraut, wenn Smart Healing deaktiviert ist (weiterhin auch per `/fbp smartcross` schaltbar).
|
||||||
|
- **Gestraffter Smart-Healing-Tooltip.** Der bisherige riesige Fließtextblock im Optionsfenster wurde in allen Sprachen durch eine übersichtliche, stichpunktartige Zusammenfassung der Kernregeln ersetzt. Der Tooltip sprengt damit nicht mehr den Bildschirm.
|
||||||
|
- **Priester-Heilkette bereinigt.** *Blitzheilung* (*Flash Heal*) vollständig aus der Priesterkette entfernt (`Geringes Heilen · Heilen · Große Heilung`). Blitzheilung bleibt ein reiner schneller Notfallzauber und wird von Großer Heilung / Heilen nie ungewollt ausgewählt.
|
||||||
|
- **Abrangen ueber Zaubergrenzen.** Bisher senkte Smart Healing nur den Rang des Zaubers auf dem Button: Aus Große Heilung (Rang 4) konnte Große Heilung (Rang 1) werden, nie aber Geringes Heilen (Rang 3), obwohl das den Fehlbetrag für einen Bruchteil des Manas gedeckt hätte. Alle Einzelziel-Direktheilungen einer Klasse bilden nun eine *Heilkette*, und die ganze Kette wird durchsucht: Priester `Geringes Heilen · Heilen · Große Heilung`, Paladin `Blitz des Lichts · Heiliges Licht`, Schamane `Geringe Welle der Heilung · Welle der Heilung`, Druide `Heilende Berührung`. Gewonnen hat der Kandidat mit der kleinsten erwarteten Heilung, die den Bedarf noch deckt.
|
||||||
|
- **Der Button wird nie staerker.** Nie gewählt wird etwas, das mehr heilt als der belegte Rang; bei Gleichstand bleibt es beim belegten Zauber. Die Zauberzeit kann sich dabei ändern: Bei kleinem Fehlbetrag wird aus einem Klick auf Große Heilung ein Geringes Heilen, aus Heiligem Licht ein Blitz des Lichts.
|
||||||
|
- **Was draussen bleibt.** Gruppenheilungen (Gebet der Heilung, Kettenheilung), schnelle Notfallzauber (Blitzheilung), HoTs (Erneuerung, Verjüngung, Nachwachsen), Schilde und Zauber mit Abklingzeit (Heiliger Schock, Handauflegung) werden nie getauscht. Die Ketten stehen in `FBHealChains` und lassen sich frei bearbeiten; die deutschen Zaubernamen sind enthalten, Sonderzeichen als Bytefolge für Latin-1- und UTF-8-Clients.
|
||||||
|
- **Neuer Befehl `/fbp smartcross`.** Schaltet den Kettenwechsel aus und wieder ein, gespeichert je Charakter in `HealBox.SmartCross` (Standard an). Aus bleibt Smart Healing beim belegten Zauber und senkt nur dessen Rang. `/fbp` zeigt den Zustand neben der Smart-Healing-Zeile, und der Befehl weist darauf hin, wenn Smart Healing selbst noch aus ist.
|
||||||
|
- **Klassensperre fuer Krieger, Schurke und Jaeger.** Das Addon ist fürs Heilen und Buffen gebaut, diese drei Klassen haben nichts davon: keine Heilzauber, keine Heilvorhersage, und ein Mana-Ticker, der entweder kein Mana zu beobachten hat (Wut, Energie) oder niemanden zu heilen (Jäger). Wer sich damit einloggt, bekommt die Anzeige nun gar nicht mehr zu sehen: keine Plaketten, kein Raid-Raster, kein Minimap-Button, kein Optionsfenster. Sämtliche Event-Handler und `OnUpdate`-Schleifen des Kerns und der Module Raid, Ticker und Smart Damage steigen sofort aus (`FBAddonSuppressed`), das Addon kostet im Ruhezustand also nichts. Zwei Zeilen im Chat erklären, was passiert ist und wie man es ändert.
|
||||||
|
- **Neuer Befehl `/fbp forceload`.** Zeigt das Addon bei einer gesperrten Klasse trotzdem an. Es startet sofort, ohne `/reload`, und die Einstellung bleibt je Charakter in `HealBox.ForceLoad` gespeichert. Derselbe Befehl schaltet wieder aus. Bei jeder anderen Klasse meldet der Befehl, dass er nicht nötig ist. Solange das Addon ruht, antworten alle übrigen `/fbp`-Befehle mit demselben Hinweis, statt über eine Anzeige zu berichten, die nie aufgebaut wurde.
|
||||||
|
- **Klassenerkennung.** Über das englische Klassen-Token des Clients (`WARRIOR`, `ROGUE`, `HUNTER`), mit Rückfall auf den angezeigten Klassennamen in fünf Sprachen und als letzter Notnagel über den Energietyp (Wut und Energie sind nie Manaklassen).
|
||||||
|
- **Neuer Hook `Suppress`.** Module blenden ihre eigenen Rahmen aus, wenn der Kern schlafen geht: Das Raidmodul versteckt das Raster, der Ticker seine Funken.
|
||||||
|
- **Startmeldung verschoben.** Begrüßung und die `Loaded`-Hooks der Module laufen jetzt bei `ADDON_LOADED` / `VARIABLES_LOADED` statt in `FBHealBox_OnLoad`. So gilt die gespeicherte Sprache, und bei einer schlafenden Klasse meldet sich niemand.
|
||||||
|
- **Rangregel verallgemeinert.** Die Obergrenze heißt nicht mehr "nie über dem belegten Rang", sondern "nie mehr erwartete Heilung als der belegte Rang". Innerhalb eines Zaubers ist das dasselbe, über Zaubergrenzen hinweg ist es die richtige Regel. Ein Rang, dessen Tooltip sich nicht lesen lässt, wird jetzt übersprungen, statt die Suche zu beenden.
|
||||||
|
|
||||||
|
**Behoben**
|
||||||
|
|
||||||
|
- **Smart Healing rangt keine HoTs mehr ab.** Erneuerung, Verjüngung, Nachwachsen, Gelassenheit, Lebensblüte, Wildwuchs, Springflut und Erdschild gehen nun immer im belegten Rang raus, bei jeder Klasse. Ein HoT verteilt seine Heilung über viele Sekunden, das im Moment des Klicks fehlende Leben sagt also nichts darüber aus, welcher Rang passt, und ein abgerangter HoT tickt die volle Laufzeit zu schwach. Gemischte Zauber wie Nachwachsen zählen ebenfalls als HoT.
|
||||||
|
- **HoT Erkennung** Die neue Funktion `FBHealBox_IsHoT()` prüft die Namensliste `FBHoTSpells` (englische und deutsche Namen, Umlaute als Bytefolge für Latin-1- und UTF-8-Clients), die Tooltip-Auswertung (`info.hot`), die Zauberwache (`hasHoT`) und die gerade aus dem Combatlog laufenden HoTs. Die Ausnahme greift damit auch bei Zaubern, die nicht in der Liste stehen, etwa auf abweichenden Servern. Zusätzlich weist die Rangprüfung jeden Rang mit HoT-Anteil ab.
|
||||||
|
|
||||||
|
## 1.4.4.2 (2026-09-07)
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
|
|||||||
+488
-60
@@ -29,6 +29,11 @@
|
|||||||
-- gesteuert, Combatlog-Parser nach Eventklasse. Details im CHANGELOG.
|
-- gesteuert, Combatlog-Parser nach Eventklasse. Details im CHANGELOG.
|
||||||
-- * v1.4.4.1: Spells hinzugefügt, Bugfixes
|
-- * 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)
|
-- * v1.4.4.2: TOC Addonbeschreibung präzisiert, Umstellung Buff-Restlaufzeit von 4/4 Blocks auf 32 Topdown Anzeige (fadeout Effekt)
|
||||||
|
-- * v1.4.4.3: Klassensperre fuer Krieger, Schurke und Jaeger (Anzeige
|
||||||
|
-- bleibt aus, Hinweis im Chat, Freischaltung mit /fbp forceload),
|
||||||
|
-- Smart Healing rangt HoTs aller Klassen nicht mehr ab.
|
||||||
|
-- Smart Healing rangt in Heilketten auch ueber Zaubergrenzen
|
||||||
|
-- ab (Grosse Heilung -> Geringes Heilen), abschaltbar mit /fbp smartcross.
|
||||||
--
|
--
|
||||||
-- Ehre wem Ehre gebuehrt: Aufbau, Namensplaketten und Grundidee stammen
|
-- Ehre wem Ehre gebuehrt: Aufbau, Namensplaketten und Grundidee stammen
|
||||||
-- aus dem Original.
|
-- aus dem Original.
|
||||||
@@ -43,6 +48,65 @@ FBHealBox_CoreLoaded = true;
|
|||||||
FBHasSuperWoW = (SUPERWOW_VERSION ~= nil);
|
FBHasSuperWoW = (SUPERWOW_VERSION ~= nil);
|
||||||
FBClass = UnitClass("player");
|
FBClass = UnitClass("player");
|
||||||
|
|
||||||
|
-- ==========================================================================
|
||||||
|
-- [ Klassensperre ]
|
||||||
|
--
|
||||||
|
-- Das Addon lohnt sich nur fuer Klassen, die heilen oder buffen koennen.
|
||||||
|
-- Krieger, Schurken und Jaeger haben davon nichts: keine Heilzauber, keine
|
||||||
|
-- Heilvorhersage, kein Mana-Ticker (Wut und Energie regenerieren anders,
|
||||||
|
-- der Jaeger heilt niemanden). Bei diesen drei Klassen bleibt die Anzeige
|
||||||
|
-- nach dem Einloggen aus, es kommt nur ein Hinweis in den Chat. Wer sie
|
||||||
|
-- trotzdem will, schaltet sie mit /fbp forceload dauerhaft frei (gemerkt
|
||||||
|
-- je Charakter in HealBox.ForceLoad).
|
||||||
|
-- ==========================================================================
|
||||||
|
|
||||||
|
-- Klassen-Token in Grossbuchstaben ("PRIEST"), wenn der Client eines liefert
|
||||||
|
FBClassToken = nil;
|
||||||
|
do
|
||||||
|
local _, eng = UnitClass("player");
|
||||||
|
if (eng) then FBClassToken = strupper(eng); end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Rueckfall, wenn der Client kein englisches Token liefert: angezeigter
|
||||||
|
-- Klassenname. Bewusst in mehreren Sprachen, damit die Sperre auch auf
|
||||||
|
-- lokalisierten Clients greift.
|
||||||
|
FBBlockedClasses = {
|
||||||
|
["WARRIOR"] = true, ["ROGUE"] = true, ["HUNTER"] = true,
|
||||||
|
["KRIEGER"] = true, ["SCHURKE"] = true, ["JAEGER"] = true,
|
||||||
|
["GUERRIER"] = true, ["VOLEUR"] = true, ["CHASSEUR"] = true,
|
||||||
|
["GUERRERO"] = true, ["PICARO"] = true, ["CAZADOR"] = true,
|
||||||
|
["GUERRIERO"] = true, ["LADRO"] = true, ["CACCIATORE"] = true,
|
||||||
|
-- "Jaeger" und "Picaro" mit Sonderzeichen, je einmal Latin-1 und UTF-8,
|
||||||
|
-- gross wie klein: strupper des Clients laesst Umlaute in Ruhe
|
||||||
|
["J\196GER"] = true, ["J\228GER"] = true,
|
||||||
|
["J\195\132GER"] = true, ["J\195\164GER"] = true,
|
||||||
|
["P\205CARO"] = true, ["P\237CARO"] = true,
|
||||||
|
["P\195\141CARO"] = true, ["P\195\173CARO"] = true,
|
||||||
|
};
|
||||||
|
|
||||||
|
function FBHealBox_ClassIsBlocked()
|
||||||
|
if (FBClassToken and FBBlockedClasses[FBClassToken]) then return true; end
|
||||||
|
if (FBClass and FBBlockedClasses[strupper(FBClass)]) then return true; end
|
||||||
|
-- Letzter Rueckfall ohne Namen: Wut und Energie sind nie Manaklassen.
|
||||||
|
-- (Der Jaeger hat Mana und wird nur ueber den Namen erkannt.)
|
||||||
|
if (not FBClassToken) and (UnitPowerType) then
|
||||||
|
local pt = UnitPowerType("player");
|
||||||
|
if (pt == 1) or (pt == 3) then return true; end
|
||||||
|
end
|
||||||
|
return false;
|
||||||
|
end
|
||||||
|
|
||||||
|
FBClassBlocked = FBHealBox_ClassIsBlocked();
|
||||||
|
-- Bis die SavedVariables gelesen sind, gilt eine gesperrte Klasse als aus
|
||||||
|
FBAddonSuppressed = FBClassBlocked;
|
||||||
|
FBLoadAnnounced = false;
|
||||||
|
FBGateAnnounced = false;
|
||||||
|
|
||||||
|
-- Laeuft das Addon gerade im Ruhezustand? (Modul-Abfrage)
|
||||||
|
function FBHealBox_Suppressed()
|
||||||
|
return (FBAddonSuppressed == true);
|
||||||
|
end
|
||||||
|
|
||||||
-- [[ Globals ]] --
|
-- [[ Globals ]] --
|
||||||
-- Vorgabewerte. Die SavedVariables ersetzen diese Tabelle beim Laden
|
-- Vorgabewerte. Die SavedVariables ersetzen diese Tabelle beim Laden
|
||||||
-- komplett, deshalb setzt FBHealBox_ApplyDefaults() fehlende Schluessel
|
-- komplett, deshalb setzt FBHealBox_ApplyDefaults() fehlende Schluessel
|
||||||
@@ -67,19 +131,21 @@ HealBox = {
|
|||||||
BuffWatchPets = 0, -- Buff-Wache auch fuer Begleiter
|
BuffWatchPets = 0, -- Buff-Wache auch fuer Begleiter
|
||||||
SmartRank = 0, -- Smart Healing (bewusst aus: Overheal kann gewollt sein)
|
SmartRank = 0, -- Smart Healing (bewusst aus: Overheal kann gewollt sein)
|
||||||
SmartMargin = 20, -- Sicherheitsaufschlag in Prozent
|
SmartMargin = 20, -- Sicherheitsaufschlag in Prozent
|
||||||
|
SmartCross = 1, -- Abrangen auch ueber Zaubergrenzen (/fbp smartcross)
|
||||||
Cooldowns = 1, -- Cooldown-Uhr auf den Buttons
|
Cooldowns = 1, -- Cooldown-Uhr auf den Buttons
|
||||||
AggroMark = 1, -- roter Rahmen fuer den Angegriffenen
|
AggroMark = 1, -- roter Rahmen fuer den Angegriffenen
|
||||||
SpellTimers = 1, -- HoT-/Schild-Restzeit auf den Buttons
|
SpellTimers = 1, -- HoT-/Schild-Restzeit auf den Buttons
|
||||||
BuffIcons = 1, -- Buff-Icons mit Uhr im Lebensbalken
|
BuffIcons = 1, -- Buff-Icons mit Uhr im Lebensbalken
|
||||||
PlateLeft = "target", -- Klick auf die Plakette: target | menu | move | none
|
PlateLeft = "target", -- Klick auf die Plakette: target | menu | move | none
|
||||||
PlateRight = "target",
|
PlateRight = "target",
|
||||||
|
ForceLoad = 0, -- Anzeige auch bei Krieger/Schurke/Jaeger (/fbp forceload)
|
||||||
};
|
};
|
||||||
-- Anzeigename des Addons. FBADDON_FOLDER muss dem Ordnernamen unter
|
-- Anzeigename des Addons. FBADDON_FOLDER muss dem Ordnernamen unter
|
||||||
-- Interface\AddOns entsprechen (dort liegt auch die .toc). Nur dann
|
-- Interface\AddOns entsprechen (dort liegt auch die .toc). Nur dann
|
||||||
-- 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.2|r";
|
HealBoxVersion = "|cFFFFFF00v1.4.4.3|r";
|
||||||
|
|
||||||
-- ==========================================================================
|
-- ==========================================================================
|
||||||
-- [ Lokalisierung / Localization ]
|
-- [ Lokalisierung / Localization ]
|
||||||
@@ -124,7 +190,13 @@ FBLocale["enUS"] = {
|
|||||||
DROP_SET_R = "Button %d, right click: |cFFFFFFFF%s|r (dragged from the spellbook)",
|
DROP_SET_R = "Button %d, right click: |cFFFFFFFF%s|r (dragged from the spellbook)",
|
||||||
DROP_UNKNOWN = "Could not identify the dragged spell.",
|
DROP_UNKNOWN = "Could not identify the dragged spell.",
|
||||||
SMARTRANK = "Smart Healing",
|
SMARTRANK = "Smart Healing",
|
||||||
SMARTRANK_TIP = "What it does: on click, instead of the assigned rank the button casts the lowest rank of the same spell whose expected heal covers the target's missing health (minus healing already on the way) plus the safety margin. Saves mana and overhealing. Rules: never above the assigned rank, direct heals only (HoTs and shields are unaffected), and always the assigned rank below 30 % health. Downsides: the expected heal is an estimate from the tooltip or from learned values and ignores crits; with burst damage, or when you deliberately want to overheal as a buffer (a tank before a big hit), the lower rank can fall short. Turn it off whenever overhealing is what you want. Every decision is logged with /fbp debug.",
|
SMARTRANK_TIP = "Automatically casts the lowest spell rank that covers the target's missing health (minus incoming heals) plus safety margin.\n\n"
|
||||||
|
.. "|cFFFFD100Rules:|r\n"
|
||||||
|
.. "• Direct heals only (HoTs and shields untouched)\n"
|
||||||
|
.. "• Always casts assigned rank below 30 % health\n"
|
||||||
|
.. "• Never heals more than the assigned rank\n"
|
||||||
|
.. "• Chain spell switching toggled via 'Smartcross'\n"
|
||||||
|
.. "• Decisions logged with /fbp debug",
|
||||||
SMART_MARGIN = "Safety margin: |cFFFFFFFF%s %%",
|
SMART_MARGIN = "Safety margin: |cFFFFFFFF%s %%",
|
||||||
COOLDOWNS = "Cooldowns on buttons",
|
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 is not shown.",
|
COOLDOWNS_TIP = "Shows the cooldown sweep on every button (Nature's Swiftness, Inner Focus, Lay on Hands, shield cooldown). The global cooldown is not shown.",
|
||||||
@@ -207,7 +279,7 @@ FBLocale["enUS"] = {
|
|||||||
FBP_INCOMING = "Incoming",
|
FBP_INCOMING = "Incoming",
|
||||||
FBP_DEBUG = "Debug:",
|
FBP_DEBUG = "Debug:",
|
||||||
FBP_RESET = "Learned values discarded.",
|
FBP_RESET = "Learned values discarded.",
|
||||||
FBP_COMMANDS = "Commands: /fbp config (options window), /fbp test (test mode), /fbp buffs (buff diagnostics), /fbp debug, /fbp reset",
|
FBP_COMMANDS = "Commands: /fbp config (options window), /fbp test (test mode), /fbp buffs (buff diagnostics), /fbp forceload (show for warrior/rogue/hunter), /fbp smartcross (downranking across spells), /fbp debug, /fbp reset",
|
||||||
FBP_SMART = "Smart Healing: %s (safety margin %d %%)",
|
FBP_SMART = "Smart Healing: %s (safety margin %d %%)",
|
||||||
|
|
||||||
DBG_HOT = "HoT %s on %s: %d per tick, %ds",
|
DBG_HOT = "HoT %s on %s: %d per tick, %ds",
|
||||||
@@ -216,6 +288,20 @@ FBLocale["enUS"] = {
|
|||||||
DBG_TICK = "Tick corrected: %s = %d",
|
DBG_TICK = "Tick corrected: %s = %d",
|
||||||
DBG_HEAL = "Heal %s = %d (estimate now %d)",
|
DBG_HEAL = "Heal %s = %d (estimate now %d)",
|
||||||
DBG_ABSORB = "Absorb %d on %s (%d left)",
|
DBG_ABSORB = "Absorb %d on %s (%d left)",
|
||||||
|
DBG_SMART_HOT = "Smart Healing skipped: %s is a heal over time",
|
||||||
|
FBP_SMART_CROSS = "· across spells: %s",
|
||||||
|
SMART_CROSS_ON = "Smart Healing may now switch spell within a heal chain (e.g. Greater Heal to Lesser Heal). |cFF00FF00On|r.",
|
||||||
|
SMART_CROSS_OFF = "Smart Healing now stays within the assigned spell and only lowers its rank. |cFFFF0000Cross-spell off|r.",
|
||||||
|
SMART_CROSS_NEEDS = "Note: Smart Healing itself is off, so this has no effect yet. Turn it on in the options or with the Smart Healing switch on the Buttons tab.",
|
||||||
|
|
||||||
|
CLASS_BLOCKED = "not shown for %s: this addon is made for healing classes. Warriors, rogues and hunters have no heals, no heal prediction and nothing to gain from the mana ticker.",
|
||||||
|
CLASS_BLOCKED_HINT = "Type /fbp forceload to show it anyway. The setting is kept for this character.",
|
||||||
|
CLASS_FORCED = "Display forced on for %s (/fbp forceload).",
|
||||||
|
CLASS_FORCE_ON = "Display forced |cFF00FF00on|r for this class. Kept for this character.",
|
||||||
|
CLASS_FORCE_OFF = "Display |cFFFF0000off|r again for this class. /fbp forceload brings it back.",
|
||||||
|
CLASS_FORCE_NA = "Your class uses mana and heals, the display is on anyway. /fbp forceload is only for warriors, rogues and hunters.",
|
||||||
|
SMARTCROSS = "Smartcross",
|
||||||
|
SMARTCROSS_TIP = "Allows Smart Healing to switch spells within a heal chain (e.g. Greater Heal to Lesser Heal, Holy Light to Flash of Light, Healing Wave to Lesser Healing Wave). When off, Smart Healing only downranks within the assigned spell. Only active when Smart Healing is enabled.",
|
||||||
};
|
};
|
||||||
|
|
||||||
FBLocale["deDE"] = {
|
FBLocale["deDE"] = {
|
||||||
@@ -244,7 +330,13 @@ FBLocale["deDE"] = {
|
|||||||
DROP_SET_R = "Button %d, Rechtsklick: |cFFFFFFFF%s|r (aus dem Zauberbuch gezogen)",
|
DROP_SET_R = "Button %d, Rechtsklick: |cFFFFFFFF%s|r (aus dem Zauberbuch gezogen)",
|
||||||
DROP_UNKNOWN = "Der gezogene Zauber liess sich nicht erkennen.",
|
DROP_UNKNOWN = "Der gezogene Zauber liess sich nicht erkennen.",
|
||||||
SMARTRANK = "Smart Healing",
|
SMARTRANK = "Smart Healing",
|
||||||
SMARTRANK_TIP = "Was es tut: Beim Klick wirkt der Button statt des belegten Rangs den niedrigsten Rang desselben Zaubers, dessen erwartete Heilung das fehlende Leben des Ziels (abzueglich bereits eingehender Heilung) plus Sicherheitsaufschlag deckt. Spart Mana und Overheal. Regeln: nie ueber dem belegten Rang, nur Direktheilungen (HoTs und Schilde bleiben unberuehrt), unter 30 % Leben immer der belegte Rang. Nachteile: Die erwartete Heilung ist eine Schaetzung aus Tooltip oder gelernten Werten und kennt keine Crits; bei Schadensspitzen oder wenn du bewusst ueberheilen willst (Tank vor einem grossen Treffer) kann der kleinere Rang zu wenig sein. Ausschalten, wann immer Overheal gewollt ist. Jede Entscheidung steht mit /fbp debug im Chat.",
|
SMARTRANK_TIP = "Wirkt automatisch den niedrigsten Zauberrang, der das fehlende Leben (abzgl. eingehender Heilung) plus Sicherheitsaufschlag deckt.\n\n"
|
||||||
|
.. "|cFFFFD100Regeln:|r\n"
|
||||||
|
.. "• Nur Direktheilung (HoTs und Schilde unberuehrt)\n"
|
||||||
|
.. "• Unter 30 % Leben immer der belegte Rang\n"
|
||||||
|
.. "• Nie mehr Heilung als der belegte Rang\n"
|
||||||
|
.. "• Zauberwechsel in Ketten steuert 'Smartcross'\n"
|
||||||
|
.. "• Entscheidungen im Chat via /fbp debug",
|
||||||
SMART_MARGIN = "Sicherheitsaufschlag: |cFFFFFFFF%s %%",
|
SMART_MARGIN = "Sicherheitsaufschlag: |cFFFFFFFF%s %%",
|
||||||
COOLDOWNS = "Cooldowns auf den Buttons",
|
COOLDOWNS = "Cooldowns auf den Buttons",
|
||||||
COOLDOWNS_TIP = "Zeigt die Cooldown-Uhr auf jedem Button (Naturschnelligkeit, Innerer Fokus, Handauflegung, Schild-Cooldown). Der globale Cooldown wird nicht angezeigt.",
|
COOLDOWNS_TIP = "Zeigt die Cooldown-Uhr auf jedem Button (Naturschnelligkeit, Innerer Fokus, Handauflegung, Schild-Cooldown). Der globale Cooldown wird nicht angezeigt.",
|
||||||
@@ -327,7 +419,7 @@ FBLocale["deDE"] = {
|
|||||||
FBP_INCOMING = "Fremdheilung",
|
FBP_INCOMING = "Fremdheilung",
|
||||||
FBP_DEBUG = "Debug:",
|
FBP_DEBUG = "Debug:",
|
||||||
FBP_RESET = "Gelernte Werte verworfen.",
|
FBP_RESET = "Gelernte Werte verworfen.",
|
||||||
FBP_COMMANDS = "Befehle: /fbp config (Optionsfenster), /fbp test (Testmodus), /fbp buffs (Buff-Diagnose), /fbp debug, /fbp reset",
|
FBP_COMMANDS = "Befehle: /fbp config (Optionsfenster), /fbp test (Testmodus), /fbp buffs (Buff-Diagnose), /fbp forceload (Anzeige fuer Krieger/Schurke/Jaeger), /fbp smartcross (Abrangen ueber Zaubergrenzen), /fbp debug, /fbp reset",
|
||||||
FBP_SMART = "Smart Healing: %s (Sicherheitsaufschlag %d %%)",
|
FBP_SMART = "Smart Healing: %s (Sicherheitsaufschlag %d %%)",
|
||||||
|
|
||||||
DBG_HOT = "HoT %s auf %s: %d pro Tick, %ds",
|
DBG_HOT = "HoT %s auf %s: %d pro Tick, %ds",
|
||||||
@@ -336,6 +428,20 @@ FBLocale["deDE"] = {
|
|||||||
DBG_TICK = "Tick korrigiert: %s = %d",
|
DBG_TICK = "Tick korrigiert: %s = %d",
|
||||||
DBG_HEAL = "Heilung %s = %d (Schaetzung jetzt %d)",
|
DBG_HEAL = "Heilung %s = %d (Schaetzung jetzt %d)",
|
||||||
DBG_ABSORB = "Absorb %d auf %s (Rest %d)",
|
DBG_ABSORB = "Absorb %d auf %s (Rest %d)",
|
||||||
|
DBG_SMART_HOT = "Smart Healing uebersprungen: %s ist Heilung ueber Zeit",
|
||||||
|
FBP_SMART_CROSS = "· ueber Zaubergrenzen: %s",
|
||||||
|
SMART_CROSS_ON = "Smart Healing darf den Zauber innerhalb einer Heilkette wechseln (z. B. Grosse Heilung zu Geringem Heilen). |cFF00FF00An|r.",
|
||||||
|
SMART_CROSS_OFF = "Smart Healing bleibt beim belegten Zauber und senkt nur dessen Rang. |cFFFF0000Kettenwechsel aus|r.",
|
||||||
|
SMART_CROSS_NEEDS = "Hinweis: Smart Healing selbst ist aus, das wirkt also noch nicht. Einschalten im Optionsfenster ueber den Schalter Smart Healing im Reiter Buttons.",
|
||||||
|
|
||||||
|
CLASS_BLOCKED = "wird fuer %s nicht angezeigt: Das Addon ist fuer Heilerklassen gemacht. Krieger, Schurken und Jaeger haben keine Heilzauber, keine Heilvorhersage und keinen Nutzen vom Mana-Ticker.",
|
||||||
|
CLASS_BLOCKED_HINT = "Mit /fbp forceload trotzdem anzeigen. Die Einstellung bleibt fuer diesen Charakter gespeichert.",
|
||||||
|
CLASS_FORCED = "Anzeige fuer %s erzwungen (/fbp forceload).",
|
||||||
|
CLASS_FORCE_ON = "Anzeige fuer diese Klasse |cFF00FF00eingeschaltet|r. Bleibt fuer diesen Charakter gespeichert.",
|
||||||
|
CLASS_FORCE_OFF = "Anzeige fuer diese Klasse wieder |cFFFF0000aus|r. Mit /fbp forceload kommt sie zurueck.",
|
||||||
|
CLASS_FORCE_NA = "Deine Klasse heilt und hat Mana, die Anzeige laeuft ohnehin. /fbp forceload ist nur fuer Krieger, Schurken und Jaeger.",
|
||||||
|
SMARTCROSS = "Smartcross",
|
||||||
|
SMARTCROSS_TIP = "Erlaubt Smart Healing, innerhalb einer Heilkette auch den Zauber zu wechseln (z. B. Grosse Heilung zu Geringem Heilen, Heiliges Licht zu Blitz des Lichts, Welle der Heilung zu Geringer Welle der Heilung). Deaktiviert bleibt Smart Healing beim belegten Zauber und senkt nur dessen Rang. Nur bei aktivem Smart Healing aktivierbar.",
|
||||||
};
|
};
|
||||||
|
|
||||||
FBL = nil;
|
FBL = nil;
|
||||||
@@ -388,8 +494,14 @@ FBLocale["esES"] = {
|
|||||||
DROP_SET = "Botón %d: |cFFFFFFFF%s|r (arrastrado desde el libro de hechizos)",
|
DROP_SET = "Botón %d: |cFFFFFFFF%s|r (arrastrado desde el libro de hechizos)",
|
||||||
DROP_SET_R = "Botón %d, clic derecho: |cFFFFFFFF%s|r (arrastrado desde el libro de hechizos)",
|
DROP_SET_R = "Botón %d, clic derecho: |cFFFFFFFF%s|r (arrastrado desde el libro de hechizos)",
|
||||||
DROP_UNKNOWN = "No se pudo identificar el hechizo arrastrado.",
|
DROP_UNKNOWN = "No se pudo identificar el hechizo arrastrado.",
|
||||||
SMARTRANK = "Smart Healing",
|
SMARTRANK = "Smart Healing",
|
||||||
SMARTRANK_TIP = "Qué hace: al hacer clic, en lugar del rango asignado el botón lanza el rango más bajo del mismo hechizo cuya curación esperada cubra la vida que le falta al objetivo (menos la curación ya en camino) más el margen de seguridad. Ahorra maná y sobrecuración. Reglas: nunca por encima del rango asignado, solo curaciones directas (HoT y escudos no se ven afectados) y siempre el rango asignado por debajo del 30 % de vida. Desventajas: la curación esperada es una estimación del tooltip o de valores aprendidos y no cuenta los críticos; con daño en ráfaga, o cuando quieres sobrecurar a propósito como colchón (un tanque antes de un golpe fuerte), el rango menor puede quedarse corto. Desactívalo siempre que quieras sobrecurar. Cada decisión se registra con /fbp debug.",
|
SMARTRANK_TIP = "Lanza automáticamente el rango más bajo que cubra la vida faltante (menos curaciones entrantes) más el margen de seguridad.\n\n"
|
||||||
|
.. "|cFFFFD100Reglas:|r\n"
|
||||||
|
.. "• Solo curaciones directas (HoTs y escudos intactos)\n"
|
||||||
|
.. "• Siempre el rango asignado bajo 30 % de vida\n"
|
||||||
|
.. "• Nunca cura más que el rango asignado\n"
|
||||||
|
.. "• Cambio de hechizo controlado por 'Smartcross'\n"
|
||||||
|
.. "• Registro de decisiones con /fbp debug",
|
||||||
SMART_MARGIN = "Margen de seguridad: |cFFFFFFFF%s %%",
|
SMART_MARGIN = "Margen de seguridad: |cFFFFFFFF%s %%",
|
||||||
COOLDOWNS = "Reutilización en botones",
|
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 no se muestra.",
|
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 no se muestra.",
|
||||||
@@ -467,7 +579,7 @@ FBLocale["esES"] = {
|
|||||||
FBP_INCOMING = "Entrante",
|
FBP_INCOMING = "Entrante",
|
||||||
FBP_DEBUG = "Depuración:",
|
FBP_DEBUG = "Depuración:",
|
||||||
FBP_RESET = "Valores aprendidos descartados.",
|
FBP_RESET = "Valores aprendidos descartados.",
|
||||||
FBP_COMMANDS = "Comandos: /fbp config (ventana de opciones), /fbp test (modo de prueba), /fbp buffs (diagnóstico de beneficios), /fbp debug, /fbp reset",
|
FBP_COMMANDS = "Comandos: /fbp config (ventana de opciones), /fbp test (modo de prueba), /fbp buffs (diagnóstico de beneficios), /fbp forceload (mostrar para guerrero/pícaro/cazador), /fbp smartcross (reducción entre hechizos), /fbp debug, /fbp reset",
|
||||||
FBP_SMART = "Smart Healing: %s (margen de seguridad %d %%)",
|
FBP_SMART = "Smart Healing: %s (margen de seguridad %d %%)",
|
||||||
DBG_HOT = "HoT %s sobre %s: %d por pulso, %ds",
|
DBG_HOT = "HoT %s sobre %s: %d por pulso, %ds",
|
||||||
DBG_SHIELD = "Escudo %s sobre %s: %d absorción, %ds",
|
DBG_SHIELD = "Escudo %s sobre %s: %d absorción, %ds",
|
||||||
@@ -475,6 +587,20 @@ FBLocale["esES"] = {
|
|||||||
DBG_TICK = "Pulso corregido: %s = %d",
|
DBG_TICK = "Pulso corregido: %s = %d",
|
||||||
DBG_HEAL = "Curación %s = %d (estimación ahora %d)",
|
DBG_HEAL = "Curación %s = %d (estimación ahora %d)",
|
||||||
DBG_ABSORB = "Absorción %d en %s (quedan %d)",
|
DBG_ABSORB = "Absorción %d en %s (quedan %d)",
|
||||||
|
DBG_SMART_HOT = "Smart Healing omitido: %s es curación con el tiempo",
|
||||||
|
FBP_SMART_CROSS = "· entre hechizos: %s",
|
||||||
|
SMART_CROSS_ON = "Smart Healing puede cambiar de hechizo dentro de una cadena de curación (p. ej. Curar más y Curar menos). |cFF00FF00Activado|r.",
|
||||||
|
SMART_CROSS_OFF = "Smart Healing se queda en el hechizo asignado y solo baja su rango. |cFFFF0000Cambio de hechizo desactivado|r.",
|
||||||
|
SMART_CROSS_NEEDS = "Nota: Smart Healing está desactivado, así que esto aún no tiene efecto. Actívalo en la pestaña Botones.",
|
||||||
|
|
||||||
|
CLASS_BLOCKED = "no se muestra para %s: este addon está hecho para clases sanadoras. Guerreros, pícaros y cazadores no tienen curaciones, ni predicción de curación, ni provecho del marcador de maná.",
|
||||||
|
CLASS_BLOCKED_HINT = "Escribe /fbp forceload para mostrarlo igualmente. El ajuste se guarda para este personaje.",
|
||||||
|
CLASS_FORCED = "Visualización forzada para %s (/fbp forceload).",
|
||||||
|
CLASS_FORCE_ON = "Visualización |cFF00FF00activada|r para esta clase. Se guarda para este personaje.",
|
||||||
|
CLASS_FORCE_OFF = "Visualización de nuevo |cFFFF0000desactivada|r para esta clase. /fbp forceload la devuelve.",
|
||||||
|
CLASS_FORCE_NA = "Tu clase usa maná y cura, la visualización ya está activa. /fbp forceload es solo para guerreros, pícaros y cazadores.",
|
||||||
|
SMARTCROSS = "Smartcross",
|
||||||
|
SMARTCROSS_TIP = "Permite a Smart Healing cambiar de hechizo dentro de una cadena de curación (p. ej. Sanación superior a Sanación inferior). Solo disponible con Smart Healing activo.",
|
||||||
};
|
};
|
||||||
|
|
||||||
FBLocale["frFR"] = {
|
FBLocale["frFR"] = {
|
||||||
@@ -499,8 +625,14 @@ FBLocale["frFR"] = {
|
|||||||
DROP_SET = "Bouton %d : |cFFFFFFFF%s|r (glissé depuis le grimoire)",
|
DROP_SET = "Bouton %d : |cFFFFFFFF%s|r (glissé depuis le grimoire)",
|
||||||
DROP_SET_R = "Bouton %d, clic droit : |cFFFFFFFF%s|r (glissé depuis le grimoire)",
|
DROP_SET_R = "Bouton %d, clic droit : |cFFFFFFFF%s|r (glissé depuis le grimoire)",
|
||||||
DROP_UNKNOWN = "Impossible d'identifier le sort glissé.",
|
DROP_UNKNOWN = "Impossible d'identifier le sort glissé.",
|
||||||
SMARTRANK = "Smart Healing",
|
SMARTRANK = "Smart Healing",
|
||||||
SMARTRANK_TIP = "Ce que ça fait : au clic, au lieu du rang assigné, le bouton lance le rang le plus bas du même sort dont le soin attendu couvre les points de vie manquants de la cible (moins les soins déjà en route) plus la marge de sécurité. Économise du mana et du sursoin. Règles : jamais au-dessus du rang assigné, soins directs uniquement (les HoT et les boucliers ne sont pas concernés), et toujours le rang assigné sous 30 % de vie. Inconvénients : le soin attendu est une estimation tirée de l'infobulle ou des valeurs apprises et ignore les critiques ; en cas de dégâts en rafale, ou quand vous voulez volontairement sursoigner comme tampon (un tank avant un gros coup), le rang inférieur peut être insuffisant. Désactivez-le dès que vous voulez sursoigner. Chaque décision est consignée avec /fbp debug.",
|
SMARTRANK_TIP = "Lance automatiquement le rang le plus bas couvrant la vie manquante (moins soins en cours) plus la marge de sécurité.\n\n"
|
||||||
|
.. "|cFFFFD100Règles :|r\n"
|
||||||
|
.. "• Soins directs uniquement (HoTs et boucliers intacts)\n"
|
||||||
|
.. "• Rang assigné conservé sous 30 % de vie\n"
|
||||||
|
.. "• Ne soigne jamais plus que le rang assigné\n"
|
||||||
|
.. "• Changement de sort contrôlé par 'Smartcross'\n"
|
||||||
|
.. "• Décisions visibles via /fbp debug",
|
||||||
SMART_MARGIN = "Marge de sécurité : |cFFFFFFFF%s %%",
|
SMART_MARGIN = "Marge de sécurité : |cFFFFFFFF%s %%",
|
||||||
COOLDOWNS = "Recharges sur les boutons",
|
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 n'est pas affiché.",
|
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 n'est pas affiché.",
|
||||||
@@ -578,7 +710,7 @@ FBLocale["frFR"] = {
|
|||||||
FBP_INCOMING = "Entrant",
|
FBP_INCOMING = "Entrant",
|
||||||
FBP_DEBUG = "Débogage :",
|
FBP_DEBUG = "Débogage :",
|
||||||
FBP_RESET = "Valeurs apprises effacées.",
|
FBP_RESET = "Valeurs apprises effacées.",
|
||||||
FBP_COMMANDS = "Commandes : /fbp config (fenêtre des options), /fbp test (mode test), /fbp buffs (diagnostic des buffs), /fbp debug, /fbp reset",
|
FBP_COMMANDS = "Commandes : /fbp config (fenêtre des options), /fbp test (mode test), /fbp buffs (diagnostic des buffs), /fbp forceload (afficher pour guerrier/voleur/chasseur), /fbp smartcross (rang abaissé entre sorts), /fbp debug, /fbp reset",
|
||||||
FBP_SMART = "Smart Healing : %s (marge de sécurité %d %%)",
|
FBP_SMART = "Smart Healing : %s (marge de sécurité %d %%)",
|
||||||
DBG_HOT = "HoT %s sur %s : %d par tick, %ds",
|
DBG_HOT = "HoT %s sur %s : %d par tick, %ds",
|
||||||
DBG_SHIELD = "Bouclier %s sur %s : %d absorption, %ds",
|
DBG_SHIELD = "Bouclier %s sur %s : %d absorption, %ds",
|
||||||
@@ -586,6 +718,20 @@ FBLocale["frFR"] = {
|
|||||||
DBG_TICK = "Tick corrigé : %s = %d",
|
DBG_TICK = "Tick corrigé : %s = %d",
|
||||||
DBG_HEAL = "Soin %s = %d (estimation maintenant %d)",
|
DBG_HEAL = "Soin %s = %d (estimation maintenant %d)",
|
||||||
DBG_ABSORB = "Absorption %d sur %s (reste %d)",
|
DBG_ABSORB = "Absorption %d sur %s (reste %d)",
|
||||||
|
DBG_SMART_HOT = "Smart Healing ignoré : %s est un soin sur la durée",
|
||||||
|
FBP_SMART_CROSS = "· entre sorts : %s",
|
||||||
|
SMART_CROSS_ON = "Smart Healing peut changer de sort dans une chaîne de soins (p. ex. Soins supérieurs vers Soins inférieurs). |cFF00FF00Activé|r.",
|
||||||
|
SMART_CROSS_OFF = "Smart Healing reste sur le sort assigné et n'abaisse que son rang. |cFFFF0000Changement de sort désactivé|r.",
|
||||||
|
SMART_CROSS_NEEDS = "Note : Smart Healing lui-même est désactivé, ceci n'a donc pas encore d'effet. Activez-le dans l'onglet Boutons.",
|
||||||
|
|
||||||
|
CLASS_BLOCKED = "non affiché pour %s : cet addon est fait pour les classes soigneuses. Les guerriers, voleurs et chasseurs n'ont pas de soins, pas de prévision de soins et aucun usage du compteur de mana.",
|
||||||
|
CLASS_BLOCKED_HINT = "Tapez /fbp forceload pour l'afficher quand même. Le réglage est conservé pour ce personnage.",
|
||||||
|
CLASS_FORCED = "Affichage forcé pour %s (/fbp forceload).",
|
||||||
|
CLASS_FORCE_ON = "Affichage |cFF00FF00activé|r pour cette classe. Conservé pour ce personnage.",
|
||||||
|
CLASS_FORCE_OFF = "Affichage de nouveau |cFFFF0000désactivé|r pour cette classe. /fbp forceload le ramène.",
|
||||||
|
CLASS_FORCE_NA = "Votre classe utilise le mana et soigne, l'affichage est déjà actif. /fbp forceload ne sert qu'aux guerriers, voleurs et chasseurs.",
|
||||||
|
SMARTCROSS = "Smartcross",
|
||||||
|
SMARTCROSS_TIP = "Permet à Smart Healing de changer de sort dans une chaîne de soins (p. ex. Soins supérieurs vers Soins inférieurs). Disponible uniquement quand Smart Healing est activé.",
|
||||||
};
|
};
|
||||||
|
|
||||||
FBLocale["itIT"] = {
|
FBLocale["itIT"] = {
|
||||||
@@ -610,8 +756,14 @@ FBLocale["itIT"] = {
|
|||||||
DROP_SET = "Pulsante %d: |cFFFFFFFF%s|r (trascinato dal libro degli incantesimi)",
|
DROP_SET = "Pulsante %d: |cFFFFFFFF%s|r (trascinato dal libro degli incantesimi)",
|
||||||
DROP_SET_R = "Pulsante %d, clic destro: |cFFFFFFFF%s|r (trascinato dal libro degli incantesimi)",
|
DROP_SET_R = "Pulsante %d, clic destro: |cFFFFFFFF%s|r (trascinato dal libro degli incantesimi)",
|
||||||
DROP_UNKNOWN = "Impossibile identificare l'incantesimo trascinato.",
|
DROP_UNKNOWN = "Impossibile identificare l'incantesimo trascinato.",
|
||||||
SMARTRANK = "Smart Healing",
|
SMARTRANK = "Smart Healing",
|
||||||
SMARTRANK_TIP = "Cosa fa: al clic, invece del rango assegnato il pulsante lancia il rango più basso dello stesso incantesimo la cui cura prevista copre la salute mancante del bersaglio (meno le cure già in arrivo) più il margine di sicurezza. Risparmia mana e cure in eccesso. Regole: mai sopra il rango assegnato, solo cure dirette (HoT e scudi non sono toccati) e sempre il rango assegnato sotto il 30 % di salute. Svantaggi: la cura prevista è una stima dalla descrizione o dai valori appresi e ignora i critici; con danni a raffica, o quando vuoi curare in eccesso di proposito come cuscinetto (un tank prima di un colpo forte), il rango inferiore può non bastare. Disattivalo ogni volta che vuoi curare in eccesso. Ogni decisione è registrata con /fbp debug.",
|
SMARTRANK_TIP = "Lancia automaticamente il rango più basso la cui cura copre la salute mancante (meno cure in arrivo) più il margine di sicurezza.\n\n"
|
||||||
|
.. "|cFFFFD100Regole:|r\n"
|
||||||
|
.. "• Solo cure dirette (HoT e scudi non modificati)\n"
|
||||||
|
.. "• Sotto il 30 % di salute lancia sempre il rango assegnato\n"
|
||||||
|
.. "• Mai una cura superiore al rango assegnato\n"
|
||||||
|
.. "• Cambio incantesimo controllato da 'Smartcross'\n"
|
||||||
|
.. "• Decisioni registrate con /fbp debug",
|
||||||
SMART_MARGIN = "Margine di sicurezza: |cFFFFFFFF%s %%",
|
SMART_MARGIN = "Margine di sicurezza: |cFFFFFFFF%s %%",
|
||||||
COOLDOWNS = "Recuperi sui pulsanti",
|
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). Il tempo di recupero globale non viene mostrato.",
|
COOLDOWNS_TIP = "Mostra l'animazione del tempo di recupero su ogni pulsante (Rapidità della Natura, Concentrazione Interiore, Imposizione delle Mani, recupero dello scudo). Il tempo di recupero globale non viene mostrato.",
|
||||||
@@ -689,7 +841,7 @@ FBLocale["itIT"] = {
|
|||||||
FBP_INCOMING = "In arrivo",
|
FBP_INCOMING = "In arrivo",
|
||||||
FBP_DEBUG = "Debug:",
|
FBP_DEBUG = "Debug:",
|
||||||
FBP_RESET = "Valori appresi scartati.",
|
FBP_RESET = "Valori appresi scartati.",
|
||||||
FBP_COMMANDS = "Comandi: /fbp config (finestra opzioni), /fbp test (modalità test), /fbp buffs (diagnostica benefici), /fbp debug, /fbp reset",
|
FBP_COMMANDS = "Comandi: /fbp config (finestra opzioni), /fbp test (modalità test), /fbp buffs (diagnostica benefici), /fbp forceload (mostra per guerriero/ladro/cacciatore), /fbp smartcross (riduzione tra incantesimi), /fbp debug, /fbp reset",
|
||||||
FBP_SMART = "Smart Healing: %s (margine di sicurezza %d %%)",
|
FBP_SMART = "Smart Healing: %s (margine di sicurezza %d %%)",
|
||||||
DBG_HOT = "HoT %s su %s: %d per tick, %ds",
|
DBG_HOT = "HoT %s su %s: %d per tick, %ds",
|
||||||
DBG_SHIELD = "Scudo %s su %s: %d assorbimento, %ds",
|
DBG_SHIELD = "Scudo %s su %s: %d assorbimento, %ds",
|
||||||
@@ -697,6 +849,20 @@ FBLocale["itIT"] = {
|
|||||||
DBG_TICK = "Tick corretto: %s = %d",
|
DBG_TICK = "Tick corretto: %s = %d",
|
||||||
DBG_HEAL = "Cura %s = %d (stima ora %d)",
|
DBG_HEAL = "Cura %s = %d (stima ora %d)",
|
||||||
DBG_ABSORB = "Assorbimento %d su %s (restano %d)",
|
DBG_ABSORB = "Assorbimento %d su %s (restano %d)",
|
||||||
|
DBG_SMART_HOT = "Smart Healing saltato: %s è una cura nel tempo",
|
||||||
|
FBP_SMART_CROSS = "· tra incantesimi: %s",
|
||||||
|
SMART_CROSS_ON = "Smart Healing può cambiare incantesimo all'interno di una catena di cure (p. es. da Cura Superiore a Cura Inferiore). |cFF00FF00Attivo|r.",
|
||||||
|
SMART_CROSS_OFF = "Smart Healing resta sull'incantesimo assegnato e ne abbassa solo il rango. |cFFFF0000Cambio incantesimo disattivato|r.",
|
||||||
|
SMART_CROSS_NEEDS = "Nota: Smart Healing stesso è disattivato, quindi questo non ha ancora effetto. Attivalo nella scheda Pulsanti.",
|
||||||
|
|
||||||
|
CLASS_BLOCKED = "non mostrato per %s: questo addon è pensato per le classi curatrici. Guerrieri, ladri e cacciatori non hanno cure, né previsione delle cure, né vantaggi dal contatore del mana.",
|
||||||
|
CLASS_BLOCKED_HINT = "Scrivi /fbp forceload per mostrarlo comunque. L'impostazione resta salvata per questo personaggio.",
|
||||||
|
CLASS_FORCED = "Visualizzazione forzata per %s (/fbp forceload).",
|
||||||
|
CLASS_FORCE_ON = "Visualizzazione |cFF00FF00attivata|r per questa classe. Resta salvata per questo personaggio.",
|
||||||
|
CLASS_FORCE_OFF = "Visualizzazione di nuovo |cFFFF0000disattivata|r per questa classe. /fbp forceload la riporta.",
|
||||||
|
CLASS_FORCE_NA = "La tua classe usa il mana e cura, la visualizzazione è già attiva. /fbp forceload serve solo a guerrieri, ladri e cacciatori.",
|
||||||
|
SMARTCROSS = "Smartcross",
|
||||||
|
SMARTCROSS_TIP = "Permette a Smart Healing di cambiare incantesimo all'interno di una catena di cure (p. es. da Cura Superiore a Cura Inferiore). Disponibile solo con Smart Healing attivo.",
|
||||||
};
|
};
|
||||||
|
|
||||||
FBL = FBLocale[FBDetectLocale()];
|
FBL = FBLocale[FBDetectLocale()];
|
||||||
@@ -1138,13 +1304,74 @@ FBPlayerSpells = {};
|
|||||||
FBActiveSpellIDs = {};
|
FBActiveSpellIDs = {};
|
||||||
FBSpellBtns = {};
|
FBSpellBtns = {};
|
||||||
|
|
||||||
|
-- Begruessung im Chat. Laeuft erst, wenn die Einstellungen gelesen sind
|
||||||
|
-- (Sprache und Klassensperre stehen dann fest), und nur einmal.
|
||||||
|
function FBHealBox_Announce()
|
||||||
|
if (FBLoadAnnounced) then return; end
|
||||||
|
FBLoadAnnounced = true;
|
||||||
|
local swowTag = "";
|
||||||
|
if (FBHasSuperWoW) then
|
||||||
|
swowTag = FBT("SUPERWOW");
|
||||||
|
end
|
||||||
|
DEFAULT_CHAT_FRAME:AddMessage("|cFFFFFF00"..FBADDON_NAME.."|r "..HealBoxVersion.." : |cFF00FF00"..FBT("LOADED")..swowTag);
|
||||||
|
DEFAULT_CHAT_FRAME:AddMessage(FBT("CREDITS"));
|
||||||
|
if (FBClassBlocked) then
|
||||||
|
DEFAULT_CHAT_FRAME:AddMessage("|cFFFFFF00"..FBADDON_NAME..":|r "..format(FBT("CLASS_FORCED"), FBClass or "?"));
|
||||||
|
end
|
||||||
|
FBHealBox_RunHook("Loaded"); -- Module melden sich im Chat
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Anzeige samt Optionsfenster, Minimap-Button und Modulen stilllegen
|
||||||
|
function FBHealBox_HideAll()
|
||||||
|
if (FBHealBox1) then FBHealBox1:Hide(); end
|
||||||
|
for p = 1, FBSlotCount do
|
||||||
|
if (FBPartyFrame[p]) then FBPartyFrame[p]:Hide(); end
|
||||||
|
end
|
||||||
|
if (panel) then panel:Hide(); end
|
||||||
|
if (MMButton) then MMButton:Hide(); end
|
||||||
|
FBHealBox_RunHook("Suppress");
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Darf die Anzeige laufen? Gesperrte Klasse nur mit /fbp forceload.
|
||||||
|
function FBHealBox_ClassAllowed()
|
||||||
|
if (not FBClassBlocked) then return true; end
|
||||||
|
if (HealBox and HealBox.ForceLoad == 1) then return true; end
|
||||||
|
return false;
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Klassensperre auswerten. Rueckgabe: true = Addon darf laufen.
|
||||||
|
-- Wird in ADDON_LOADED und VARIABLES_LOADED aufgerufen, weil je nach Client
|
||||||
|
-- erst das zweite Ereignis die gespeicherten Werte mitbringt.
|
||||||
|
function FBHealBox_ApplyClassGate()
|
||||||
|
if (FBHealBox_ClassAllowed()) then
|
||||||
|
FBAddonSuppressed = false;
|
||||||
|
return true;
|
||||||
|
end
|
||||||
|
FBAddonSuppressed = true;
|
||||||
|
FBHealBox_HideAll();
|
||||||
|
if (not FBGateAnnounced) then
|
||||||
|
FBGateAnnounced = true;
|
||||||
|
DEFAULT_CHAT_FRAME:AddMessage("|cFFFFFF00"..FBADDON_NAME.."|r "..HealBoxVersion..": |cFFFF8000"
|
||||||
|
..format(FBT("CLASS_BLOCKED"), FBClass or "?").."|r");
|
||||||
|
DEFAULT_CHAT_FRAME:AddMessage("|cFFAAAAAA"..FBT("CLASS_BLOCKED_HINT").."|r");
|
||||||
|
end
|
||||||
|
return false;
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Volle Einrichtung der Anzeige (nach dem Laden und nach /fbp forceload)
|
||||||
|
function FBHealBox_StartUp()
|
||||||
|
FBSetLocale(HealBox.Locale, 1);
|
||||||
|
FBHealBox_Announce();
|
||||||
|
FBLoadSpellData();
|
||||||
|
FBHealBoxButtons();
|
||||||
|
FBHealBox_SyncOptions();
|
||||||
|
HealBoxAttachMode(HealBox.AttachMode);
|
||||||
|
FBHealBox_ApplyButtonSpacing();
|
||||||
|
if (MMButton) then MMButton:Show(); end
|
||||||
|
FBUpdateNames();
|
||||||
|
end
|
||||||
|
|
||||||
function FBHealBox_OnLoad()
|
function FBHealBox_OnLoad()
|
||||||
local swowTag = "";
|
|
||||||
if (FBHasSuperWoW) then
|
|
||||||
swowTag = FBT("SUPERWOW");
|
|
||||||
end
|
|
||||||
DEFAULT_CHAT_FRAME:AddMessage("|cFFFFFF00"..FBADDON_NAME.."|r "..HealBoxVersion.." : |cFF00FF00"..FBT("LOADED")..swowTag);
|
|
||||||
DEFAULT_CHAT_FRAME:AddMessage(FBT("CREDITS"));
|
|
||||||
this:RegisterEvent("ADDON_LOADED");
|
this:RegisterEvent("ADDON_LOADED");
|
||||||
this:RegisterEvent("PARTY_MEMBERS_CHANGED");
|
this:RegisterEvent("PARTY_MEMBERS_CHANGED");
|
||||||
this:RegisterEvent("PLAYER_ENTERING_WORLD");
|
this:RegisterEvent("PLAYER_ENTERING_WORLD");
|
||||||
@@ -1187,10 +1414,12 @@ function FBHealBox_ApplyDefaults()
|
|||||||
if (HealBox.BuffWatchPets == nil) then HealBox.BuffWatchPets = 0; end
|
if (HealBox.BuffWatchPets == nil) then HealBox.BuffWatchPets = 0; end
|
||||||
if (HealBox.SmartRank == nil) then HealBox.SmartRank = 0; end
|
if (HealBox.SmartRank == nil) then HealBox.SmartRank = 0; end
|
||||||
if (HealBox.SmartMargin == nil) then HealBox.SmartMargin = 20; end
|
if (HealBox.SmartMargin == nil) then HealBox.SmartMargin = 20; end
|
||||||
|
if (HealBox.SmartCross == nil) then HealBox.SmartCross = 1; end
|
||||||
if (HealBox.Cooldowns == nil) then HealBox.Cooldowns = 1; end
|
if (HealBox.Cooldowns == nil) then HealBox.Cooldowns = 1; end
|
||||||
if (HealBox.AggroMark == nil) then HealBox.AggroMark = 1; end
|
if (HealBox.AggroMark == nil) then HealBox.AggroMark = 1; end
|
||||||
if (HealBox.SpellTimers == nil) then HealBox.SpellTimers = 1; end
|
if (HealBox.SpellTimers == nil) then HealBox.SpellTimers = 1; end
|
||||||
if (HealBox.BuffIcons == nil) then HealBox.BuffIcons = 1; end
|
if (HealBox.BuffIcons == nil) then HealBox.BuffIcons = 1; end
|
||||||
|
if (HealBox.ForceLoad == nil) then HealBox.ForceLoad = 0; end
|
||||||
if (not FBPlateActionName[HealBox.PlateLeft or ""]) then HealBox.PlateLeft = "target"; end
|
if (not FBPlateActionName[HealBox.PlateLeft or ""]) then HealBox.PlateLeft = "target"; end
|
||||||
if (not FBPlateActionName[HealBox.PlateRight or ""]) then HealBox.PlateRight = "target"; end
|
if (not FBPlateActionName[HealBox.PlateRight or ""]) then HealBox.PlateRight = "target"; end
|
||||||
FBHealBox_RunHook("Defaults");
|
FBHealBox_RunHook("Defaults");
|
||||||
@@ -1214,6 +1443,7 @@ function FBHealBox_SyncOptions()
|
|||||||
if (BuffWatchPetsCheck) then BuffWatchPetsCheck:SetChecked(HealBox.BuffWatchPets == 1); end
|
if (BuffWatchPetsCheck) then BuffWatchPetsCheck:SetChecked(HealBox.BuffWatchPets == 1); end
|
||||||
if (RightClickCheck) then RightClickCheck:SetChecked(HealBox.RightClick == 1); end
|
if (RightClickCheck) then RightClickCheck:SetChecked(HealBox.RightClick == 1); end
|
||||||
if (SmartRankCheck) then SmartRankCheck:SetChecked(HealBox.SmartRank == 1); end
|
if (SmartRankCheck) then SmartRankCheck:SetChecked(HealBox.SmartRank == 1); end
|
||||||
|
if (SmartCrossCheck) then SmartCrossCheck:SetChecked(HealBox.SmartCross == 1); end
|
||||||
if (SmartMarginSlider) then SmartMarginSlider:SetValue(HealBox.SmartMargin); end
|
if (SmartMarginSlider) then SmartMarginSlider:SetValue(HealBox.SmartMargin); end
|
||||||
if (CooldownsCheck) then CooldownsCheck:SetChecked(HealBox.Cooldowns == 1); end
|
if (CooldownsCheck) then CooldownsCheck:SetChecked(HealBox.Cooldowns == 1); end
|
||||||
if (AggroMarkCheck) then AggroMarkCheck:SetChecked(HealBox.AggroMark == 1); end
|
if (AggroMarkCheck) then AggroMarkCheck:SetChecked(HealBox.AggroMark == 1); end
|
||||||
@@ -1222,9 +1452,26 @@ function FBHealBox_SyncOptions()
|
|||||||
FBHealBox_UpdateBuffWatchLabel();
|
FBHealBox_UpdateBuffWatchLabel();
|
||||||
FBHealBox_UpdatePlateActionLabels();
|
FBHealBox_UpdatePlateActionLabels();
|
||||||
FBHealBox_ApplyRightClickLayout();
|
FBHealBox_ApplyRightClickLayout();
|
||||||
|
FBHealBox_UpdateSmartCrossState();
|
||||||
FBHealBox_RunHook("SyncOptions");
|
FBHealBox_RunHook("SyncOptions");
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function FBHealBox_UpdateSmartCrossState()
|
||||||
|
if (not SmartCrossCheck) then return; end
|
||||||
|
if (HealBox.SmartRank == 1) then
|
||||||
|
SmartCrossCheck:Enable();
|
||||||
|
if (SmartCrossCheck.Text) then
|
||||||
|
-- Gold wie bei allen anderen Schaltern (GameFontNormal)
|
||||||
|
SmartCrossCheck.Text:SetTextColor(1, 0.82, 0, 1);
|
||||||
|
end
|
||||||
|
else
|
||||||
|
SmartCrossCheck:Disable();
|
||||||
|
if (SmartCrossCheck.Text) then
|
||||||
|
SmartCrossCheck.Text:SetTextColor(0.5, 0.5, 0.5, 1);
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
function FBUnitGUID(unit)
|
function FBUnitGUID(unit)
|
||||||
if (FBHasSuperWoW and UnitExists(unit)) then
|
if (FBHasSuperWoW and UnitExists(unit)) then
|
||||||
local exists, guid = UnitExists(unit);
|
local exists, guid = UnitExists(unit);
|
||||||
@@ -1789,16 +2036,19 @@ function FBMenu_ClearSpell()
|
|||||||
end
|
end
|
||||||
|
|
||||||
function FBHealBox_OnEvent(event, arg1)
|
function FBHealBox_OnEvent(event, arg1)
|
||||||
if ((event == "ADDON_LOADED") and (arg1 == FBADDON_FOLDER)) then
|
-- Die beiden Ladeereignisse zuerst: hier faellt die Entscheidung, ob das
|
||||||
|
-- Addon fuer diese Klasse ueberhaupt anzeigt.
|
||||||
|
if (((event == "ADDON_LOADED") and (arg1 == FBADDON_FOLDER)) or (event == "VARIABLES_LOADED")) then
|
||||||
FBHealBox_ApplyDefaults();
|
FBHealBox_ApplyDefaults();
|
||||||
FBSetLocale(HealBox.Locale, 1);
|
FBSetLocale(HealBox.Locale, 1);
|
||||||
FBHealBox_RunHook("Loaded"); -- Module melden sich im Chat
|
if (not FBHealBox_ApplyClassGate()) then return; end
|
||||||
FBHealBox_SyncOptions();
|
FBHealBox_StartUp();
|
||||||
HealBoxAttachMode(HealBox.AttachMode);
|
return;
|
||||||
FBHealBox_ApplyButtonSpacing();
|
|
||||||
FBUpdateNames();
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Krieger, Schurke, Jaeger ohne /fbp forceload: nichts weiter tun
|
||||||
|
if (FBAddonSuppressed) then return; end
|
||||||
|
|
||||||
if (event == "PLAYER_ENTERING_WORLD" or event == "SPELLS_CHANGED") then
|
if (event == "PLAYER_ENTERING_WORLD" or event == "SPELLS_CHANGED") then
|
||||||
FBLoadSpellData();
|
FBLoadSpellData();
|
||||||
FBHealBoxButtons();
|
FBHealBoxButtons();
|
||||||
@@ -1810,16 +2060,6 @@ function FBHealBox_OnEvent(event, arg1)
|
|||||||
FBHealBox_RefreshAllBars();
|
FBHealBox_RefreshAllBars();
|
||||||
end
|
end
|
||||||
|
|
||||||
if (event == "VARIABLES_LOADED") then
|
|
||||||
FBHealBox_ApplyDefaults();
|
|
||||||
FBSetLocale(HealBox.Locale, 1);
|
|
||||||
FBLoadSpellData();
|
|
||||||
FBHealBoxButtons();
|
|
||||||
FBHealBox_SyncOptions();
|
|
||||||
HealBoxAttachMode(HealBox.AttachMode);
|
|
||||||
FBHealBox_ApplyButtonSpacing();
|
|
||||||
FBUpdateNames();
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Button-Farben und Cooldowns: ein zentraler Durchgang statt 260 Handler.
|
-- Button-Farben und Cooldowns: ein zentraler Durchgang statt 260 Handler.
|
||||||
-- Mehrere dieser Events je Frame (jede Manaaenderung feuert USABLE)
|
-- Mehrere dieser Events je Frame (jede Manaaenderung feuert USABLE)
|
||||||
@@ -2210,12 +2450,122 @@ end
|
|||||||
-- Erwartete Heilung: gelernter Wert, sonst Tooltip-Mittelwert.
|
-- Erwartete Heilung: gelernter Wert, sonst Tooltip-Mittelwert.
|
||||||
-- ==========================================================================
|
-- ==========================================================================
|
||||||
|
|
||||||
|
-- Heilung ueber Zeit, alle Klassen. Smart Healing laesst diese Zauber in
|
||||||
|
-- Ruhe: Ein HoT heilt ueber viele Sekunden verteilt, das im Moment des
|
||||||
|
-- Klicks fehlende Leben sagt also nichts darueber aus, welcher Rang passt.
|
||||||
|
-- Ein abgerangtes Erneuerung tickt die volle Laufzeit zu schwach, und der
|
||||||
|
-- Nachschlag laesst sich nicht mehr aufholen. Gemischte Zauber (Nachwachsen:
|
||||||
|
-- Sofortheilung plus HoT) zaehlen ebenfalls als HoT.
|
||||||
|
-- Ergaenzt wird die Liste zur Laufzeit aus dem Tooltip (info.hot), aus der
|
||||||
|
-- Zauberwache und aus laufenden HoTs, deshalb greift die Ausnahme auch bei
|
||||||
|
-- Zaubern, die hier nicht stehen (z. B. auf lokalisierten Clients).
|
||||||
|
FBHoTSpells = {
|
||||||
|
-- Priester
|
||||||
|
["Renew"] = true,
|
||||||
|
-- Druide
|
||||||
|
["Rejuvenation"] = true, ["Regrowth"] = true, ["Tranquility"] = true,
|
||||||
|
["Lifebloom"] = true, ["Wild Growth"] = true,
|
||||||
|
-- Schamane
|
||||||
|
["Riptide"] = true, ["Earth Shield"] = true, ["Healing Stream Totem"] = true,
|
||||||
|
-- deutsche Zaubernamen (Umlaute als Bytefolge, damit die Datei auf jedem
|
||||||
|
-- Client passt: einmal UTF-8, einmal Latin-1)
|
||||||
|
["Erneuerung"] = true, ["Nachwachsen"] = true, ["Gelassenheit"] = true,
|
||||||
|
["Wildwuchs"] = true, ["Springflut"] = true, ["Erdschild"] = true,
|
||||||
|
["Verj\195\188ngung"] = true, ["Verj\252ngung"] = true,
|
||||||
|
["Lebensbl\195\188te"] = true, ["Lebensbl\252te"] = true,
|
||||||
|
};
|
||||||
|
|
||||||
|
-- Ist das ein Zauber mit Heilung ueber Zeit?
|
||||||
|
function FBHealBox_IsHoT(base, ranks)
|
||||||
|
if (not base) then return false; end
|
||||||
|
if (FBHoTSpells[base]) then return true; end
|
||||||
|
-- aus dem Zauberbuch gelesen: irgendein Rang hat einen HoT-Anteil
|
||||||
|
local w = FBPredictWatch and FBPredictWatch[base];
|
||||||
|
if (w and w.hasHoT) then return true; end
|
||||||
|
if (ranks) then
|
||||||
|
for _, sd in ipairs(ranks) do
|
||||||
|
local info = FBPredict_GetSpellInfo(sd.id, base);
|
||||||
|
if (info and info.hot) then return true; end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
-- laeuft gerade als HoT auf irgendjemandem (aus dem Combatlog gelernt)
|
||||||
|
for _, spells in pairs(FBHoTs) do
|
||||||
|
if (spells[base]) then return true; end
|
||||||
|
end
|
||||||
|
return false;
|
||||||
|
end
|
||||||
|
|
||||||
|
-- ==========================================================================
|
||||||
|
-- [ Heilketten ]
|
||||||
|
--
|
||||||
|
-- Welche Zauber gelten als "derselbe Heilzauber, nur kleiner"? Innerhalb
|
||||||
|
-- einer Kette darf Smart Healing die Zaubergrenze ueberschreiten: Grosse
|
||||||
|
-- Heilung (Rang 2) kann als Geringes Heilen (Rang 3) rausgehen, wenn das
|
||||||
|
-- reicht. Nur Einzelziel-Direktheilungen gehoeren hinein. Draussen bleiben
|
||||||
|
-- Gruppenheilungen (Gebet der Heilung, Kettenheilung), HoTs, Schilde und
|
||||||
|
-- Zauber mit Abklingzeit (Heiliger Schock, Handauflegung, Verjuengungs-
|
||||||
|
-- zauber), die man nicht ungefragt verbraten will.
|
||||||
|
--
|
||||||
|
-- Die Liste ist flach: Zaubernamen sind zwischen den Klassen eindeutig,
|
||||||
|
-- eine Klassenzuordnung braucht es also nicht. Ketten mit nur einem Eintrag
|
||||||
|
-- stehen der Uebersicht halber trotzdem drin.
|
||||||
|
-- ==========================================================================
|
||||||
|
|
||||||
|
FBHealChains = {
|
||||||
|
-- Priester
|
||||||
|
{ "Lesser Heal", "Heal", "Greater Heal" },
|
||||||
|
-- Paladin
|
||||||
|
{ "Flash of Light", "Holy Light" },
|
||||||
|
-- Schamane
|
||||||
|
{ "Lesser Healing Wave", "Healing Wave" },
|
||||||
|
-- Druide (Nachwachsen ist ein HoT und bleibt draussen)
|
||||||
|
{ "Healing Touch" },
|
||||||
|
-- deutsche Zaubernamen, einmal Latin-1 und einmal UTF-8 fuer die
|
||||||
|
-- Sonderzeichen (\223 = ss-Ligatur, \252 = u-Umlaut)
|
||||||
|
{ "Geringes Heilen", "Heilen", "Gro\223e Heilung", "Gro\195\159e Heilung" },
|
||||||
|
{ "Blitz des Lichts", "Heiliges Licht" },
|
||||||
|
{ "Geringe Welle der Heilung", "Welle der Heilung" },
|
||||||
|
{ "Heilende Ber\252hrung", "Heilende Ber\195\188hrung" },
|
||||||
|
};
|
||||||
|
|
||||||
|
-- [Zaubername] = seine Kette
|
||||||
|
FBHealChainOf = {};
|
||||||
|
for _, chain in ipairs(FBHealChains) do
|
||||||
|
for _, n in ipairs(chain) do
|
||||||
|
if (not FBHealChainOf[n]) then FBHealChainOf[n] = chain; end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Erwartete Heilung eines Rangs, oder nil, wenn der Zauber fuer Smart
|
||||||
|
-- Healing nicht in Frage kommt: kein Heilbetrag, Schild, HoT-Anteil, Buff
|
||||||
|
-- oder kein Heiltext im Tooltip. Gelernter Wert schlaegt den Tooltip.
|
||||||
|
function FBHealBox_DirectAmount(spellName, sd)
|
||||||
|
if (not sd) then return nil; end
|
||||||
|
local info = FBPredict_GetSpellInfo(sd.id, spellName);
|
||||||
|
if (not info) or (not info.direct) or info.shield or info.hot or (not info.isHeal) then return nil; end
|
||||||
|
return FBPredict_Remembered("direct", spellName, sd.rank) or info.direct;
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Alle Zauber, die als kleinere Ausgabe von base gelten (base immer dabei)
|
||||||
|
function FBHealBox_HealFamily(base)
|
||||||
|
if (HealBox.SmartCross ~= 1) then return { base }; end
|
||||||
|
return FBHealChainOf[base] or { base };
|
||||||
|
end
|
||||||
|
|
||||||
function FBHealBox_SmartRank(castString, unit)
|
function FBHealBox_SmartRank(castString, unit)
|
||||||
if (HealBox.SmartRank ~= 1) or (not castString) then return castString; end
|
if (HealBox.SmartRank ~= 1) or (not castString) then return castString; end
|
||||||
local base, rank = FBPredict_SplitCast(castString);
|
local base, rank = FBPredict_SplitCast(castString);
|
||||||
if (not rank) then return castString; end
|
if (not rank) then return castString; end
|
||||||
local ranks = FBPlayerSpells[base];
|
local ranks = FBPlayerSpells[base];
|
||||||
if (not ranks) or (table.getn(ranks) < 2) then return castString; end
|
if (not ranks) then return castString; end
|
||||||
|
|
||||||
|
-- HoTs aller Klassen bleiben unangetastet
|
||||||
|
if (FBHealBox_IsHoT(base, ranks)) then
|
||||||
|
if (FBPredictDebug) then
|
||||||
|
DEFAULT_CHAT_FRAME:AddMessage("|cFF00FFFF[FBP]|r "..format(FBT("DBG_SMART_HOT"), castString));
|
||||||
|
end
|
||||||
|
return castString;
|
||||||
|
end
|
||||||
if (not FBUnitExists(unit)) or FBTest_Ghost(unit) then return castString; end
|
if (not FBUnitExists(unit)) or FBTest_Ghost(unit) then return castString; end
|
||||||
|
|
||||||
local hp, hpMax = FBUnitHealth(unit);
|
local hp, hpMax = FBUnitHealth(unit);
|
||||||
@@ -2226,31 +2576,38 @@ function FBHealBox_SmartRank(castString, unit)
|
|||||||
if (deficit < 0) then deficit = 0; end
|
if (deficit < 0) then deficit = 0; end
|
||||||
local need = deficit * (1 + (HealBox.SmartMargin or 20) / 100);
|
local need = deficit * (1 + (HealBox.SmartMargin or 20) / 100);
|
||||||
|
|
||||||
local assignedIdx = nil;
|
-- Der belegte Rang ist Obergrenze und Rueckfall zugleich
|
||||||
for i, sd in ipairs(ranks) do
|
local assignedSD = nil;
|
||||||
if (sd.rank == rank) then assignedIdx = i; end
|
for _, sd in ipairs(ranks) do
|
||||||
|
if (sd.rank == rank) then assignedSD = sd; end
|
||||||
end
|
end
|
||||||
if (not assignedIdx) then return castString; end
|
local cap = FBHealBox_DirectAmount(base, assignedSD);
|
||||||
|
if (not cap) then return castString; end
|
||||||
|
|
||||||
for i = 1, assignedIdx do
|
-- Kleinsten Kandidaten suchen, der den Bedarf deckt und nicht mehr
|
||||||
local sd = ranks[i];
|
-- heilt als der belegte Rang. Gleichstand behaelt den belegten Zauber.
|
||||||
local info = FBPredict_GetSpellInfo(sd.id, base);
|
local bestSD, bestName, bestAmount = assignedSD, base, cap;
|
||||||
-- nur echte Direktheilungen: Heilbetrag vorhanden, "heal" im Tooltip,
|
for _, spellName in ipairs(FBHealBox_HealFamily(base)) do
|
||||||
-- kein Schild, kein Buff. Alles andere geht im belegten Rang raus.
|
local list = FBPlayerSpells[spellName];
|
||||||
if (not info) or (not info.direct) or info.shield or (not info.isHeal) then return castString; end
|
if (list) and ((spellName == base) or (not FBHealBox_IsHoT(spellName, list))) then
|
||||||
local amount = FBPredict_Remembered("direct", base, sd.rank) or info.direct;
|
for _, sd in ipairs(list) do
|
||||||
if (amount >= need) then
|
local amount = FBHealBox_DirectAmount(spellName, sd);
|
||||||
if (i == assignedIdx) then return castString; end
|
if (amount) and (amount >= need) and (amount < bestAmount) then
|
||||||
local chosen = base;
|
bestSD, bestName, bestAmount = sd, spellName, amount;
|
||||||
if (sd.rank and sd.rank ~= "") then chosen = base.."("..sd.rank..")"; end
|
end
|
||||||
if (FBPredictDebug) then
|
|
||||||
DEFAULT_CHAT_FRAME:AddMessage("|cFF00FFFF[FBP]|r "..format(FBT("DBG_SMARTRANK"),
|
|
||||||
castString, chosen, math.floor(deficit), math.floor(amount)));
|
|
||||||
end
|
end
|
||||||
return chosen;
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
return castString;
|
|
||||||
|
if (bestSD == assignedSD) then return castString; end
|
||||||
|
local chosen = bestName;
|
||||||
|
if (bestSD.rank and bestSD.rank ~= "") then chosen = bestName.."("..bestSD.rank..")"; end
|
||||||
|
if (chosen == castString) then return castString; end
|
||||||
|
if (FBPredictDebug) then
|
||||||
|
DEFAULT_CHAT_FRAME:AddMessage("|cFF00FFFF[FBP]|r "..format(FBT("DBG_SMARTRANK"),
|
||||||
|
castString, chosen, math.floor(deficit), math.floor(bestAmount)));
|
||||||
|
end
|
||||||
|
return chosen;
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Zauber castString auf das Ziel des Buttons wirken (Links- oder Rechtsklick)
|
-- Zauber castString auf das Ziel des Buttons wirken (Links- oder Rechtsklick)
|
||||||
@@ -2464,6 +2821,7 @@ end
|
|||||||
|
|
||||||
function FBUpdateNames()
|
function FBUpdateNames()
|
||||||
if (not FBHealBox1) then return; end
|
if (not FBHealBox1) then return; end
|
||||||
|
if (FBAddonSuppressed) then FBHealBox_HideAll(); return; end
|
||||||
for p = 1, FBSlotCount do
|
for p = 1, FBSlotCount do
|
||||||
local f = FBPartyFrame[p];
|
local f = FBPartyFrame[p];
|
||||||
f:Hide();
|
f:Hide();
|
||||||
@@ -3188,7 +3546,12 @@ function FBHealBox_ApplyLocale()
|
|||||||
SmartRankCheck.Text:SetText(FBT("SMARTRANK"));
|
SmartRankCheck.Text:SetText(FBT("SMARTRANK"));
|
||||||
SmartRankCheck.tooltipText = FBT("SMARTRANK_TIP");
|
SmartRankCheck.tooltipText = FBT("SMARTRANK_TIP");
|
||||||
end
|
end
|
||||||
|
if (SmartCrossCheck) then
|
||||||
|
SmartCrossCheck.Text:SetText(FBT("SMARTCROSS"));
|
||||||
|
SmartCrossCheck.tooltipText = FBT("SMARTCROSS_TIP");
|
||||||
|
end
|
||||||
FBUpdateSmartMarginText();
|
FBUpdateSmartMarginText();
|
||||||
|
FBHealBox_UpdateSmartCrossState();
|
||||||
if (CooldownsCheck) then
|
if (CooldownsCheck) then
|
||||||
CooldownsCheck.Text:SetText(FBT("COOLDOWNS"));
|
CooldownsCheck.Text:SetText(FBT("COOLDOWNS"));
|
||||||
CooldownsCheck.tooltipText = FBT("COOLDOWNS_TIP");
|
CooldownsCheck.tooltipText = FBT("COOLDOWNS_TIP");
|
||||||
@@ -3427,9 +3790,15 @@ function FBHealBoxCreateAddonOptionFrame()
|
|||||||
-- Smart Healing mit Sicherheitsaufschlag (oben)
|
-- Smart Healing mit Sicherheitsaufschlag (oben)
|
||||||
SmartRankCheck = FBHealBox_CreateCheck("FBHealBoxSmartRankCheck", tabButtons, 34, FBOPT_CONTENT_Y, "SMARTRANK", "SMARTRANK_TIP", function()
|
SmartRankCheck = FBHealBox_CreateCheck("FBHealBoxSmartRankCheck", tabButtons, 34, FBOPT_CONTENT_Y, "SMARTRANK", "SMARTRANK_TIP", function()
|
||||||
HealBox.SmartRank = SmartRankCheck:GetChecked() and 1 or 0;
|
HealBox.SmartRank = SmartRankCheck:GetChecked() and 1 or 0;
|
||||||
|
FBHealBox_UpdateSmartCrossState();
|
||||||
end);
|
end);
|
||||||
SmartRankCheck:SetChecked(nil);
|
SmartRankCheck:SetChecked(nil);
|
||||||
|
|
||||||
|
SmartCrossCheck = FBHealBox_CreateCheck("FBHealBoxSmartCrossCheck", tabButtons, 48, FBOPT_CONTENT_Y - 24, "SMARTCROSS", "SMARTCROSS_TIP", function()
|
||||||
|
HealBox.SmartCross = SmartCrossCheck:GetChecked() and 1 or 0;
|
||||||
|
end);
|
||||||
|
SmartCrossCheck:SetChecked(nil);
|
||||||
|
|
||||||
SmartMarginSlider = CreateFrame("Slider", "FBSmartMarginSlider", tabButtons, "OptionsSliderTemplate");
|
SmartMarginSlider = CreateFrame("Slider", "FBSmartMarginSlider", tabButtons, "OptionsSliderTemplate");
|
||||||
SmartMarginSlider:SetWidth(fieldW);
|
SmartMarginSlider:SetWidth(fieldW);
|
||||||
SmartMarginSlider:SetHeight(16);
|
SmartMarginSlider:SetHeight(16);
|
||||||
@@ -3448,8 +3817,8 @@ function FBHealBoxCreateAddonOptionFrame()
|
|||||||
FBUpdateSmartMarginText();
|
FBUpdateSmartMarginText();
|
||||||
|
|
||||||
-- Spaltenkoepfe und Zeilen
|
-- Spaltenkoepfe und Zeilen
|
||||||
local yHead = FBOPT_CONTENT_Y - 52;
|
local yHead = FBOPT_CONTENT_Y - 56;
|
||||||
local y0 = yHead - 16;
|
local y0 = yHead - 16;
|
||||||
|
|
||||||
panel.colLeft = tabButtons:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall");
|
panel.colLeft = tabButtons:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall");
|
||||||
panel.colLeft:SetPoint("TOPLEFT", tabButtons, "TOPLEFT", xLeft + 4, yHead);
|
panel.colLeft:SetPoint("TOPLEFT", tabButtons, "TOPLEFT", xLeft + 4, yHead);
|
||||||
@@ -5044,6 +5413,7 @@ for _, ev in ipairs(FBPredictEvents) do
|
|||||||
end
|
end
|
||||||
|
|
||||||
FBPredictFrame:SetScript("OnEvent", function()
|
FBPredictFrame:SetScript("OnEvent", function()
|
||||||
|
if (FBAddonSuppressed) then return; end
|
||||||
if (event == "UNIT_AURA") then
|
if (event == "UNIT_AURA") then
|
||||||
FBPredict_ScanUnit(arg1);
|
FBPredict_ScanUnit(arg1);
|
||||||
|
|
||||||
@@ -5081,6 +5451,7 @@ FBPredictFrame:SetScript("OnEvent", function()
|
|||||||
end);
|
end);
|
||||||
|
|
||||||
FBPredictFrame:SetScript("OnUpdate", function()
|
FBPredictFrame:SetScript("OnUpdate", function()
|
||||||
|
if (FBAddonSuppressed) then return; end
|
||||||
FBPredict_OnUpdate(arg1);
|
FBPredict_OnUpdate(arg1);
|
||||||
end);
|
end);
|
||||||
|
|
||||||
@@ -5380,6 +5751,39 @@ end
|
|||||||
|
|
||||||
SLASH_FBHEALPREDICT1 = "/fbp";
|
SLASH_FBHEALPREDICT1 = "/fbp";
|
||||||
SlashCmdList["FBHEALPREDICT"] = function(msg)
|
SlashCmdList["FBHEALPREDICT"] = function(msg)
|
||||||
|
-- Anzeige bei Krieger/Schurke/Jaeger dauerhaft ein- oder ausschalten.
|
||||||
|
-- Steht vor allem anderen, damit der Befehl auch im Ruhezustand geht.
|
||||||
|
if (msg == "forceload") then
|
||||||
|
if (not FBClassBlocked) then
|
||||||
|
DEFAULT_CHAT_FRAME:AddMessage("|cFFFFFF00"..FBADDON_NAME..":|r "..FBT("CLASS_FORCE_NA"));
|
||||||
|
return;
|
||||||
|
end
|
||||||
|
if (HealBox.ForceLoad == 1) then
|
||||||
|
HealBox.ForceLoad = 0;
|
||||||
|
-- Die Sperrmeldung kam beim Einloggen schon, hier reicht die
|
||||||
|
-- Rueckmeldung des Befehls
|
||||||
|
FBGateAnnounced = true;
|
||||||
|
FBHealBox_ApplyClassGate();
|
||||||
|
DEFAULT_CHAT_FRAME:AddMessage("|cFFFFFF00"..FBADDON_NAME..":|r "..FBT("CLASS_FORCE_OFF"));
|
||||||
|
else
|
||||||
|
HealBox.ForceLoad = 1;
|
||||||
|
FBGateAnnounced = false;
|
||||||
|
FBHealBox_ApplyClassGate();
|
||||||
|
FBHealBox_StartUp();
|
||||||
|
DEFAULT_CHAT_FRAME:AddMessage("|cFFFFFF00"..FBADDON_NAME..":|r "..FBT("CLASS_FORCE_ON"));
|
||||||
|
end
|
||||||
|
return;
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Im Ruhezustand bleibt es beim Hinweis: nichts ist aufgebaut,
|
||||||
|
-- Optionsfenster und Diagnose waeren leer.
|
||||||
|
if (FBAddonSuppressed) then
|
||||||
|
DEFAULT_CHAT_FRAME:AddMessage("|cFFFFFF00"..FBADDON_NAME..":|r "
|
||||||
|
..format(FBT("CLASS_BLOCKED"), FBClass or "?"));
|
||||||
|
DEFAULT_CHAT_FRAME:AddMessage("|cFFAAAAAA"..FBT("CLASS_BLOCKED_HINT").."|r");
|
||||||
|
return;
|
||||||
|
end
|
||||||
|
|
||||||
-- Module zuerst (z. B. /fbp raid)
|
-- Module zuerst (z. B. /fbp raid)
|
||||||
if (FBHealBox_RunHook("Slash", msg)) then return; end
|
if (FBHealBox_RunHook("Slash", msg)) then return; end
|
||||||
|
|
||||||
@@ -5402,6 +5806,19 @@ SlashCmdList["FBHEALPREDICT"] = function(msg)
|
|||||||
return;
|
return;
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Abrangen ueber Zaubergrenzen (Heilketten) an/aus
|
||||||
|
if (msg == "smartcross" or msg == "cross") then
|
||||||
|
if (HealBox.SmartCross == 1) then HealBox.SmartCross = 0; else HealBox.SmartCross = 1; end
|
||||||
|
local key = "SMART_CROSS_OFF";
|
||||||
|
if (HealBox.SmartCross == 1) then key = "SMART_CROSS_ON"; end
|
||||||
|
DEFAULT_CHAT_FRAME:AddMessage("|cFFFFFF00"..FBADDON_NAME..":|r "..FBT(key));
|
||||||
|
if (HealBox.SmartRank ~= 1) then
|
||||||
|
DEFAULT_CHAT_FRAME:AddMessage("|cFFAAAAAA"..FBT("SMART_CROSS_NEEDS").."|r");
|
||||||
|
end
|
||||||
|
if (SmartCrossCheck) then SmartCrossCheck:SetChecked(HealBox.SmartCross == 1); end
|
||||||
|
return;
|
||||||
|
end
|
||||||
|
|
||||||
if (msg == "config" or msg == "options" or msg == "opt") then
|
if (msg == "config" or msg == "options" or msg == "opt") then
|
||||||
FBHealBox_ToggleOptions();
|
FBHealBox_ToggleOptions();
|
||||||
return;
|
return;
|
||||||
@@ -5509,7 +5926,10 @@ SlashCmdList["FBHEALPREDICT"] = function(msg)
|
|||||||
end
|
end
|
||||||
local smart = FBT("FBP_STATE_OFF");
|
local smart = FBT("FBP_STATE_OFF");
|
||||||
if (HealBox.SmartRank == 1) then smart = FBT("FBP_STATE_ON"); end
|
if (HealBox.SmartRank == 1) then smart = FBT("FBP_STATE_ON"); end
|
||||||
DEFAULT_CHAT_FRAME:AddMessage("|cFF00FFFF[FBP]|r "..format(FBT("FBP_SMART"), smart, HealBox.SmartMargin or 20));
|
local cross = FBT("FBP_STATE_OFF");
|
||||||
|
if (HealBox.SmartCross == 1) then cross = FBT("FBP_STATE_ON"); end
|
||||||
|
DEFAULT_CHAT_FRAME:AddMessage("|cFF00FFFF[FBP]|r "..format(FBT("FBP_SMART"), smart, HealBox.SmartMargin or 20)
|
||||||
|
.." "..format(FBT("FBP_SMART_CROSS"), cross));
|
||||||
FBHealBox_RunHook("Status");
|
FBHealBox_RunHook("Status");
|
||||||
DEFAULT_CHAT_FRAME:AddMessage("|cFF00FFFF[FBP]|r "..FBT("FBP_COMMANDS"));
|
DEFAULT_CHAT_FRAME:AddMessage("|cFF00FFFF[FBP]|r "..FBT("FBP_COMMANDS"));
|
||||||
end
|
end
|
||||||
@@ -5966,4 +6386,12 @@ end
|
|||||||
|
|
||||||
MMButton = CreateMiniMapButton();
|
MMButton = CreateMiniMapButton();
|
||||||
FBHealBoxSetup();
|
FBHealBoxSetup();
|
||||||
|
|
||||||
|
-- Gesperrte Klasse: alles bleibt aus, bis ADDON_LOADED / VARIABLES_LOADED
|
||||||
|
-- die gespeicherte Einstellung geprueft hat. So blitzt die Anzeige beim
|
||||||
|
-- Einloggen nicht kurz auf.
|
||||||
|
if (FBAddonSuppressed) then
|
||||||
|
FBHealBox_HideAll();
|
||||||
|
end
|
||||||
|
|
||||||
FBHealBoxCreateAddonOptionFrame();
|
FBHealBoxCreateAddonOptionFrame();
|
||||||
+2
-2
@@ -1,9 +1,9 @@
|
|||||||
## Interface: 11200
|
## Interface: 11200
|
||||||
## Title: Heal Box Vanilla |cFFFFFF00v1.4.4.2|r
|
## Title: Heal Box Vanilla |cFFFFFF00v1.4.4.3|r
|
||||||
## Notes: Heal/raid frame addon like Healium, with quick-cast buttons, heal prediction, mana ticker and more.
|
## 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.
|
## 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.2
|
## Version: 1.4.4.3
|
||||||
## SavedVariablesPerCharacter: HealBox
|
## SavedVariablesPerCharacter: HealBox
|
||||||
## OptionalDeps: SuperWoW
|
## OptionalDeps: SuperWoW
|
||||||
|
|
||||||
|
|||||||
@@ -425,6 +425,9 @@ end
|
|||||||
|
|
||||||
-- Vor-Hook auf UseAction. true, wenn das Modul selbst gecastet hat.
|
-- Vor-Hook auf UseAction. true, wenn das Modul selbst gecastet hat.
|
||||||
function FBDmg_TryDownrank(slot, checkCursor, onSelf)
|
function FBDmg_TryDownrank(slot, checkCursor, onSelf)
|
||||||
|
-- Klassensperre des Kerns (Krieger/Schurke/Jaeger ohne /fbp forceload):
|
||||||
|
-- die Aktionsleiste bleibt unberuehrt
|
||||||
|
if (FBAddonSuppressed) then return false; end
|
||||||
if (FBDmg_Cfg().Enabled ~= 1) or onSelf then return false; end
|
if (FBDmg_Cfg().Enabled ~= 1) or onSelf then return false; end
|
||||||
if ((CursorHasSpell and CursorHasSpell()) or (CursorHasItem and CursorHasItem())) then return false; end
|
if ((CursorHasSpell and CursorHasSpell()) or (CursorHasItem and CursorHasItem())) then return false; end
|
||||||
local name, rank = FBDmg_SlotSpell(slot);
|
local name, rank = FBDmg_SlotSpell(slot);
|
||||||
@@ -464,6 +467,7 @@ for _, ev in ipairs({
|
|||||||
}) do FBDmgFrame:RegisterEvent(ev); end
|
}) do FBDmgFrame:RegisterEvent(ev); end
|
||||||
|
|
||||||
FBDmgFrame:SetScript("OnEvent", function()
|
FBDmgFrame:SetScript("OnEvent", function()
|
||||||
|
if (FBAddonSuppressed) then return; end
|
||||||
if (event == "PLAYER_ENTERING_WORLD" or event == "SPELLS_CHANGED") then
|
if (event == "PLAYER_ENTERING_WORLD" or event == "SPELLS_CHANGED") then
|
||||||
FBDmg_ScanSpells();
|
FBDmg_ScanSpells();
|
||||||
FBDmg_UpdateSpellText();
|
FBDmg_UpdateSpellText();
|
||||||
|
|||||||
@@ -1242,6 +1242,7 @@ FBRaidEventFrame:RegisterEvent("UNIT_AURA");
|
|||||||
FBRaidRosterDirty = false;
|
FBRaidRosterDirty = false;
|
||||||
|
|
||||||
FBRaidEventFrame:SetScript("OnEvent", function()
|
FBRaidEventFrame:SetScript("OnEvent", function()
|
||||||
|
if (FBAddonSuppressed) then return; end
|
||||||
if (event == "RAID_ROSTER_UPDATE" or event == "PARTY_MEMBERS_CHANGED" or event == "PLAYER_ENTERING_WORLD") then
|
if (event == "RAID_ROSTER_UPDATE" or event == "PARTY_MEMBERS_CHANGED" or event == "PLAYER_ENTERING_WORLD") then
|
||||||
-- Salven (mehrere Roster-Events je Frame beim Zonen) auf einen
|
-- Salven (mehrere Roster-Events je Frame beim Zonen) auf einen
|
||||||
-- Durchlauf im naechsten Frame zusammenfassen
|
-- Durchlauf im naechsten Frame zusammenfassen
|
||||||
@@ -1256,6 +1257,7 @@ FBRaidEventFrame:SetScript("OnEvent", function()
|
|||||||
end);
|
end);
|
||||||
|
|
||||||
FBRaidEventFrame:SetScript("OnUpdate", function()
|
FBRaidEventFrame:SetScript("OnUpdate", function()
|
||||||
|
if (FBAddonSuppressed) then return; end
|
||||||
if (FBRaidRosterDirty) then
|
if (FBRaidRosterDirty) then
|
||||||
FBRaidRosterDirty = false;
|
FBRaidRosterDirty = false;
|
||||||
FBRaid_UpdateRoster();
|
FBRaid_UpdateRoster();
|
||||||
@@ -1273,6 +1275,7 @@ FBRaidGhostAccum = 0;
|
|||||||
FBRaidEventFrame.ghostTicker = CreateFrame("Frame", nil, UIParent);
|
FBRaidEventFrame.ghostTicker = CreateFrame("Frame", nil, UIParent);
|
||||||
FBRaidEventFrame.ghostTicker:Hide(); -- laeuft nur im Raid-Test (siehe FBRaid_SetTest)
|
FBRaidEventFrame.ghostTicker:Hide(); -- laeuft nur im Raid-Test (siehe FBRaid_SetTest)
|
||||||
FBRaidEventFrame.ghostTicker:SetScript("OnUpdate", function()
|
FBRaidEventFrame.ghostTicker:SetScript("OnUpdate", function()
|
||||||
|
if (FBAddonSuppressed) then return; end
|
||||||
FBRaidGhostAccum = FBRaidGhostAccum + (arg1 or 0);
|
FBRaidGhostAccum = FBRaidGhostAccum + (arg1 or 0);
|
||||||
if (FBRaidGhostAccum < 0.2) then return; end
|
if (FBRaidGhostAccum < 0.2) then return; end
|
||||||
FBRaidGhostAccum = 0;
|
FBRaidGhostAccum = 0;
|
||||||
@@ -1520,6 +1523,11 @@ FBHealBox_RegisterHook("Loaded", function()
|
|||||||
DEFAULT_CHAT_FRAME:AddMessage("|cFFFFFF00"..FBADDON_NAME..":|r "..FBT("RAID_LOADED"));
|
DEFAULT_CHAT_FRAME:AddMessage("|cFFFFFF00"..FBADDON_NAME..":|r "..FBT("RAID_LOADED"));
|
||||||
return true;
|
return true;
|
||||||
end);
|
end);
|
||||||
|
-- Klassensperre des Kerns: Raidfenster mit stilllegen
|
||||||
|
FBHealBox_RegisterHook("Suppress", function()
|
||||||
|
if (FBRaidFrame) then FBRaidFrame:Hide(); end
|
||||||
|
return true;
|
||||||
|
end);
|
||||||
FBHealBox_RegisterHook("Defaults", function() return FBRaid_ApplyDefaults(); end);
|
FBHealBox_RegisterHook("Defaults", function() return FBRaid_ApplyDefaults(); end);
|
||||||
FBHealBox_RegisterHook("SyncOptions", function() return FBRaid_SyncOptions(); end);
|
FBHealBox_RegisterHook("SyncOptions", function() return FBRaid_SyncOptions(); end);
|
||||||
FBHealBox_RegisterHook("ApplyLocale", function() return FBRaid_ApplyLocale(); end);
|
FBHealBox_RegisterHook("ApplyLocale", function() return FBRaid_ApplyLocale(); end);
|
||||||
|
|||||||
@@ -405,6 +405,7 @@ FBTickerFrame:RegisterEvent("UNIT_MAXMANA");
|
|||||||
FBTickerFrame:RegisterEvent("UNIT_DISPLAYPOWER");
|
FBTickerFrame:RegisterEvent("UNIT_DISPLAYPOWER");
|
||||||
FBTickerFrame:RegisterEvent("PLAYER_ENTERING_WORLD");
|
FBTickerFrame:RegisterEvent("PLAYER_ENTERING_WORLD");
|
||||||
FBTickerFrame:SetScript("OnEvent", function()
|
FBTickerFrame:SetScript("OnEvent", function()
|
||||||
|
if (FBAddonSuppressed) then return; end
|
||||||
if (event == "PLAYER_ENTERING_WORLD") then
|
if (event == "PLAYER_ENTERING_WORLD") then
|
||||||
FBTicker_Reset();
|
FBTicker_Reset();
|
||||||
FBTicker_CollectBars();
|
FBTicker_CollectBars();
|
||||||
@@ -422,6 +423,7 @@ FBTickerFrame:SetScript("OnEvent", function()
|
|||||||
FBTicker_UpdateGate();
|
FBTicker_UpdateGate();
|
||||||
end);
|
end);
|
||||||
FBTickerFrame:SetScript("OnUpdate", function()
|
FBTickerFrame:SetScript("OnUpdate", function()
|
||||||
|
if (FBAddonSuppressed) then return; end
|
||||||
FBTicker_Draw();
|
FBTicker_Draw();
|
||||||
end);
|
end);
|
||||||
|
|
||||||
@@ -525,6 +527,13 @@ FBHealBox_RegisterHook("Loaded", function()
|
|||||||
DEFAULT_CHAT_FRAME:AddMessage("|cFFFFFF00"..FBADDON_NAME..":|r "..FBT("TICK_LOADED"));
|
DEFAULT_CHAT_FRAME:AddMessage("|cFFFFFF00"..FBADDON_NAME..":|r "..FBT("TICK_LOADED"));
|
||||||
return true;
|
return true;
|
||||||
end);
|
end);
|
||||||
|
-- Klassensperre des Kerns: Funken ausknipsen
|
||||||
|
FBHealBox_RegisterHook("Suppress", function()
|
||||||
|
for _, e in ipairs(FBTicker.sparks or {}) do
|
||||||
|
if (e.spark) then e.spark:Hide(); end
|
||||||
|
end
|
||||||
|
return true;
|
||||||
|
end);
|
||||||
FBHealBox_RegisterHook("Defaults", function() return FBTicker_ApplyDefaults(); end);
|
FBHealBox_RegisterHook("Defaults", function() return FBTicker_ApplyDefaults(); end);
|
||||||
FBHealBox_RegisterHook("SyncOptions", function() return FBTicker_SyncOptions(); end);
|
FBHealBox_RegisterHook("SyncOptions", function() return FBTicker_SyncOptions(); end);
|
||||||
FBHealBox_RegisterHook("ApplyLocale", function() return FBTicker_ApplyLocale(); end);
|
FBHealBox_RegisterHook("ApplyLocale", function() return FBTicker_ApplyLocale(); end);
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# Heal Box Vanilla
|
# Heal Box Vanilla
|
||||||
|
|
||||||
ADDON DOCUMENTATION · VERSION 1.4.4.2 · World of Warcraft CLIENT 1.12.1
|
ADDON DOCUMENTATION · VERSION 1.4.4.3 · 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.
|
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.
|
||||||
|
|
||||||
@@ -10,9 +10,7 @@ Party, pet and self heal display with quick-cast buttons for healers. One name p
|
|||||||
|
|
||||||
<img width="956" height="847" alt="Screenshot 2026-09-05 210241" src="https://github.com/user-attachments/assets/d7508232-eb56-47ef-8f7e-c39ab0c2b434" />
|
<img width="956" height="847" alt="Screenshot 2026-09-05 210241" src="https://github.com/user-attachments/assets/d7508232-eb56-47ef-8f7e-c39ab0c2b434" />
|
||||||
|
|
||||||
<img width="839" height="1102" alt="grafik" src="https://github.com/user-attachments/assets/eda01796-04eb-4c8d-aec1-04bba0bf8821" />
|
<img width="837" height="1097" alt="Screenshot 2026-09-08 205118" src="https://github.com/user-attachments/assets/1c5cd627-15dc-48a2-b4ec-46e7afaae172" />
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
\---
|
\---
|
||||||
|
|
||||||
@@ -40,6 +38,18 @@ The folder name must match the name of the `.toc` file, otherwise the addon neve
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## Which classes it loads for
|
||||||
|
|
||||||
|
The addon is built for healing and buffing. **Warriors, rogues and hunters** get nothing out of it: no heals, no heal prediction, and a mana ticker that either has no mana to watch (rage, energy) or nobody to heal (hunter). Logging in on one of those three classes therefore leaves everything switched off. No plates, no raid grid, no minimap button, no options window, and no event handling either, so the addon costs nothing while it sleeps. Instead two lines appear in the chat: what happened and how to change it.
|
||||||
|
|
||||||
|
**Show it anyway:** type `/fbp forceload`. The display starts immediately, no `/reload` needed, and the setting is remembered for that character (`HealBox.ForceLoad`). The same command switches it back off. On every other class `/fbp forceload` just says it is not needed.
|
||||||
|
|
||||||
|
While the addon sleeps, all other `/fbp` commands answer with the same hint, because nothing has been built that they could report on.
|
||||||
|
|
||||||
|
Detection uses the client's English class token (`WARRIOR`, `ROGUE`, `HUNTER`) and falls back to the displayed class name in five languages, so it also works on localized clients.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## The display
|
## The display
|
||||||
|
|
||||||
Ten name plates in two families. `FBHealBox1` is always the player, `FBHealBox2` through `FBHealBox5` are `party1` through `party4`. `FBHealBoxPet1` through `FBHealBoxPet5` are the matching pets (`pet`, `partypet1` through `partypet4`). Each shows name, health percentage and a layered bar. **To move them:** hold **Shift** and drag any plate with the left mouse button, the others are anchored to it and follow. The position is saved per character and survives a reload; changing the scale does not move the plate.
|
Ten name plates in two families. `FBHealBox1` is always the player, `FBHealBox2` through `FBHealBox5` are `party1` through `party4`. `FBHealBoxPet1` through `FBHealBoxPet5` are the matching pets (`pet`, `partypet1` through `partypet4`). Each shows name, health percentage and a layered bar. **To move them:** hold **Shift** and drag any plate with the left mouse button, the others are anchored to it and follow. The position is saved per character and survives a reload; changing the scale does not move the plate.
|
||||||
@@ -102,7 +112,20 @@ Up to ten buttons sit next to each plate, each showing its spell's icon. A **lef
|
|||||||
|
|
||||||
**Right-click spell (optional).** Each button can carry a second spell for **right click** (Flash Heal left, Greater Heal right, say), which doubles the density without adding buttons. This is off by default and is enabled only through the switch on the *Buttons* tab. When on, a second column appears in the assignment and a small icon in the bottom-right corner of every button shows its right-click spell; the tooltip lists it as well. Switching it off keeps the assignments, it just stops the buttons from reacting to right click.
|
**Right-click spell (optional).** Each button can carry a second spell for **right click** (Flash Heal left, Greater Heal right, say), which doubles the density without adding buttons. This is off by default and is enabled only through the switch on the *Buttons* tab. When on, a second column appears in the assignment and a small icon in the bottom-right corner of every button shows its right-click spell; the tooltip lists it as well. Switching it off keeps the assignments, it just stops the buttons from reacting to right click.
|
||||||
|
|
||||||
**Smart Healing (off by default).** With *Smart Healing* on, a click casts the lowest rank of the assigned spell whose expected heal covers the target's missing health, minus healing already on the way, plus the *Safety margin* (default 20 %). Expected heals come from the learned values of the prediction where available, otherwise from the tooltip average. It never goes above the rank you assigned, applies to direct heals only (HoTs, shields and buffs such as Fortitude are always cast as assigned; a spell qualifies only if its tooltip describes a heal), and below 30 % health it always casts the assigned rank. Downsides: the estimate ignores crits, and with burst damage or when you want to overheal on purpose (a tank before a big hit) the lower rank can fall short. Leave it off whenever overhealing is what you want. `/fbp debug` prints every decision, `/fbp` shows the state.
|
**Smart Healing (off by default).** With *Smart Healing* on, a click casts the lowest rank of the assigned spell whose expected heal covers the target's missing health, minus healing already on the way, plus the *Safety margin* (default 20 %). Expected heals come from the learned values of the prediction where available, otherwise from the tooltip average. It never goes above the rank you assigned, applies to direct heals only, and below 30 % health it always casts the assigned rank. **Heal over time spells are never downranked**, whatever the class: Renew, Rejuvenation, Regrowth, Tranquility, Lifebloom, Wild Growth, Riptide and Earth Shield always go out at the rank you assigned. A HoT spreads its healing over many seconds, so the health missing at the moment of the click says nothing about which rank fits, and a downranked HoT keeps ticking too weakly for its whole duration. Mixed spells such as Regrowth count as HoTs as well. Shields and buffs such as Fortitude are likewise cast as assigned, and a spell only qualifies at all if its tooltip describes a heal.
|
||||||
|
|
||||||
|
**Heal chains (new in 1.4.4.3).** Downranking is not limited to the assigned spell. Within a *heal chain* the spell itself may change, so a click on Greater Heal can go out as Lesser Heal rank 3 when that covers the deficit. The chains hold the single-target direct heals of one class:
|
||||||
|
|
||||||
|
|Class|Chain|
|
||||||
|
|-|-|
|
||||||
|
|Priest|Lesser Heal · Heal · Greater Heal|
|
||||||
|
|Paladin|Flash of Light · Holy Light|
|
||||||
|
|Shaman|Lesser Healing Wave · Healing Wave|
|
||||||
|
|Druid|Healing Touch (Regrowth is a HoT and stays out)|
|
||||||
|
|
||||||
|
Everything in the chain is a candidate, and the one with the smallest expected heal that still covers the need wins. Nothing that heals more than the rank you assigned is ever picked, so the button never gets stronger, only cheaper. Note that this can change the cast time: for a small deficit a Greater Heal click may become Lesser Heal, and a Holy Light click may become Flash of Light. Group heals (Prayer of Healing, Chain Heal), HoTs, shields and cooldown spells (Holy Shock, Lay on Hands) are never part of a chain.
|
||||||
|
|
||||||
|
The *Smartcross* switch on the *Buttons* tab turns chain switching off and on, `/fbp smartcross` does the same from chat. With it off, Smart Healing stays on the assigned spell and only lowers its rank, the way it worked before 1.4.4.3. The chains live in `FBHealChains` near the Smart Healing code and can be edited freely; spells you do not want swapped simply come out of the list. Downsides: the estimate ignores crits, and with burst damage or when you want to overheal on purpose (a tank before a big hit) the lower rank can fall short. Leave it off whenever overhealing is what you want. `/fbp debug` prints every decision, `/fbp` shows the state.
|
||||||
|
|
||||||
**Cooldowns.** Every button shows the usual cooldown sweep for its spell. The global cooldown is not shown (`FBCD_MIN_DURATION`). Option *Cooldowns on buttons*.
|
**Cooldowns.** Every button shows the usual cooldown sweep for its spell. The global cooldown is not shown (`FBCD_MIN_DURATION`). Option *Cooldowns on buttons*.
|
||||||
|
|
||||||
@@ -220,7 +243,7 @@ The target's remaining health comes from the first source that answers:
|
|||||||
|Target health source|Live line: which of the four sources answers for your current target|
|
|Target health source|Live line: which of the four sources answers for your current target|
|
||||||
|Spells|The attack spells found in your spellbook with their rank count|
|
|Spells|The attack spells found in your spellbook with their rank count|
|
||||||
|
|
||||||
Spells per class: Priest Smite, Holy Fire, Mind Blast; Druid Wrath, Starfire, Moonfire; Shaman Lightning Bolt, Chain Lightning, Earth/Flame/Frost Shock; Paladin Holy Shock, Hammer of Wrath, Exorcism, Holy Wrath; Mage Fireball, Frostbolt, Fire Blast, Scorch, Pyroblast; Warlock Shadow Bolt, Searing Pain, Immolate, Soul Fire, Conflagrate; Hunter Arcane Shot, Aimed Shot (list `FBDamageSpells`). `/fbp damage` toggles, `/fbp debug` logs every decision with the health source used.
|
Spells per class: Priest Smite, Holy Fire, Mind Blast; Druid Wrath, Starfire, Moonfire; Shaman Lightning Bolt, Chain Lightning, Earth/Flame/Frost Shock; Paladin Holy Shock, Hammer of Wrath, Exorcism, Holy Wrath; Mage Fireball, Frostbolt, Fire Blast, Scorch, Pyroblast; Warlock Shadow Bolt, Searing Pain, Immolate, Soul Fire, Conflagrate; Hunter Arcane Shot, Aimed Shot (list `FBDamageSpells`). `/fbp damage` toggles, `/fbp debug` logs every decision with the health source used. Note for hunters: the addon does not load for that class, so Smart Damage only runs after `/fbp forceload`, see [Which classes it loads for](#which-classes-it-loads-for).
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -246,6 +269,8 @@ The window has two tabs.
|
|||||||
|
|
||||||
**Smart Healing / Safety margin**: see [The buttons](#the-buttons). Off by default; margin 0 to 50 %, default 20.
|
**Smart Healing / Safety margin**: see [The buttons](#the-buttons). Off by default; margin 0 to 50 %, default 20.
|
||||||
|
|
||||||
|
**Smartcross**: enables downranking across spells within a heal chain. Grayed out and disabled when Smart Healing is off; on by default.
|
||||||
|
|
||||||
### Tab *General*
|
### Tab *General*
|
||||||
|
|
||||||
**Frame scale**: scales the plates from 0.6 to 1.5. Has no effect in party-frame mode.
|
**Frame scale**: scales the plates from 0.6 to 1.5. Has no effect in party-frame mode.
|
||||||
@@ -401,6 +426,8 @@ On receive, your own messages are filtered by sender name, and since HealComm st
|
|||||||
|`/fbp test`|Toggles test mode (same as the checkbox)|
|
|`/fbp test`|Toggles test mode (same as the checkbox)|
|
||||||
|`/fbp config`|Opens or closes the options window (same as the minimap button)|
|
|`/fbp config`|Opens or closes the options window (same as the minimap button)|
|
||||||
|`/fbp buffs`|Lists the tracked buff spells, their presence and remaining time on you, and your raw buff textures|
|
|`/fbp buffs`|Lists the tracked buff spells, their presence and remaining time on you, and your raw buff textures|
|
||||||
|
|`/fbp forceload`|Warrior, rogue and hunter only: shows the addon anyway, or hides it again. Saved per character|
|
||||||
|
|`/fbp smartcross`|Smart Healing: downranking across spells within a heal chain on/off (on by default)|
|
||||||
|`/fbp raid`|Toggles raid mode|
|
|`/fbp raid`|Toggles raid mode|
|
||||||
|`/fbp raidtest 20` · `40` · `off`|Raid test with 20 or 40 ghosts, or off|
|
|`/fbp raidtest 20` · `40` · `off`|Raid test with 20 or 40 ghosts, or off|
|
||||||
|`/fbp ticker`|Toggles the mana ticker|
|
|`/fbp ticker`|Toggles the mana ticker|
|
||||||
@@ -421,6 +448,7 @@ Everything lives in the `HealBox` table, saved **per character**:
|
|||||||
|`Scale`|Scale of the plates|
|
|`Scale`|Scale of the plates|
|
||||||
|`AttachMode`|0 = own plates, 1 = default party frames|
|
|`AttachMode`|0 = own plates, 1 = default party frames|
|
||||||
|`Active`|Display on/off (shift + left click on the minimap)|
|
|`Active`|Display on/off (shift + left click on the minimap)|
|
||||||
|
|`ForceLoad`|1 = show for warrior, rogue and hunter as well, 0 = off (default). Set with `/fbp forceload`|
|
||||||
|`HealComm`|1 = sync on, 0 = off|
|
|`HealComm`|1 = sync on, 0 = off|
|
||||||
|`Locale`|`deDE`, `enUS`, `esES`, `frFR` or `itIT`|
|
|`Locale`|`deDE`, `enUS`, `esES`, `frFR` or `itIT`|
|
||||||
|`ButtonSpacing`|Gap between the buttons in px (0 to 20)|
|
|`ButtonSpacing`|Gap between the buttons in px (0 to 20)|
|
||||||
@@ -433,6 +461,7 @@ Everything lives in the `HealBox` table, saved **per character**:
|
|||||||
|`LOSIcon`|1 = line-of-sight badge on, 0 = off|
|
|`LOSIcon`|1 = line-of-sight badge on, 0 = off|
|
||||||
|`PlateLeft` · `PlateRight`|Click action on a plate: `target`, `menu`, `move` or `none`|
|
|`PlateLeft` · `PlateRight`|Click action on a plate: `target`, `menu`, `move` or `none`|
|
||||||
|`SmartRank` · `SmartMargin`|Smart Healing on/off (default off) and safety margin in percent|
|
|`SmartRank` · `SmartMargin`|Smart Healing on/off (default off) and safety margin in percent|
|
||||||
|
|`SmartCross`|1 = downranking may switch spell within a heal chain (default), 0 = stay on the assigned spell. Set in the options or with `/fbp smartcross`|
|
||||||
|`Cooldowns` · `AggroMark` · `SpellTimers` · `BuffIcons`|Cooldown sweep, red border for the attacked member, HoT/shield timers, buff icons left of the bar|
|
|`Cooldowns` · `AggroMark` · `SpellTimers` · `BuffIcons`|Cooldown sweep, red border for the attacked member, HoT/shield timers, buff icons left of the bar|
|
||||||
|`ClassColors`|1 = names in class colour, 0 = white|
|
|`ClassColors`|1 = names in class colour, 0 = white|
|
||||||
|`RangeFade`|1 = fade plates out of range, 0 = off|
|
|`RangeFade`|1 = fade plates out of range, 0 = off|
|
||||||
@@ -490,6 +519,9 @@ Every knob is a global at the top of its own section and can be changed without
|
|||||||
|`FBPREDICT_TARGET_TIME`|2.0|Lifetime of the remembered cast target|
|
|`FBPREDICT_TARGET_TIME`|2.0|Lifetime of the remembered cast target|
|
||||||
|`FBPredictTickInterval`|`{Lifebloom = 1}`|Deviating tick intervals|
|
|`FBPredictTickInterval`|`{Lifebloom = 1}`|Deviating tick intervals|
|
||||||
|`FBCommGroupHeal`|`{Prayer of Healing}`|What is broadcast as `GrpHeal`|
|
|`FBCommGroupHeal`|`{Prayer of Healing}`|What is broadcast as `GrpHeal`|
|
||||||
|
|`FBHealChains`|(table)|Which spells count as the same heal, only smaller. Smart Healing may switch spell inside a chain|
|
||||||
|
|`FBHoTSpells`|(table)|Heal over time spells that Smart Healing never downranks|
|
||||||
|
|`FBBlockedClasses`|`WARRIOR`, `ROGUE`, `HUNTER`|Classes the addon does not load for without `/fbp forceload`|
|
||||||
|`FBLocale`|`enUS`, `deDE`, `esES`, `frFR`, `itIT`|Every visible string, per language|
|
|`FBLocale`|`enUS`, `deDE`, `esES`, `frFR`, `itIT`|Every visible string, per language|
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -500,8 +532,11 @@ Every knob is a global at the top of its own section and can be changed without
|
|||||||
|
|
||||||
|Function|Purpose|
|
|Function|Purpose|
|
||||||
|-|-|
|
|-|-|
|
||||||
|`FBHealBox_OnLoad()`|Event registration, startup message|
|
|`FBHealBox_OnLoad()`|Event registration|
|
||||||
|`FBHealBox_OnEvent(event, arg1)`|Central event dispatch|
|
|`FBHealBox_OnEvent(event, arg1)`|Central event dispatch; also decides the class gate on `ADDON_LOADED` / `VARIABLES_LOADED`|
|
||||||
|
|`FBHealBox_ClassIsBlocked()` · `FBHealBox_ClassAllowed()`|Is this a warrior, rogue or hunter, and may the display run anyway (`ForceLoad`)?|
|
||||||
|
|`FBHealBox_ApplyClassGate()` · `FBHealBox_Suppressed()`|Applies the class gate and reports the sleeping state to the modules|
|
||||||
|
|`FBHealBox_HideAll()` · `FBHealBox_StartUp()` · `FBHealBox_Announce()`|Puts everything to sleep, wakes everything up, prints the startup message once|
|
||||||
|`FBHealBoxSetup()`|Creates the ten plates (five players, five pets)|
|
|`FBHealBoxSetup()`|Creates the ten plates (five players, five pets)|
|
||||||
|`FBHealBoxCreateFrame(…)`|Builds one plate including its four bars|
|
|`FBHealBoxCreateFrame(…)`|Builds one plate including its four bars|
|
||||||
|`FBHealBox_SetBarStrata(f, strata)`|Stacks mana / health / shield / prediction|
|
|`FBHealBox_SetBarStrata(f, strata)`|Stacks mana / health / shield / prediction|
|
||||||
@@ -513,6 +548,8 @@ Every knob is a global at the top of its own section and can be changed without
|
|||||||
|`FBHealBox_CastOn(button, castString)`|Casts a button's spell (left or right) on its target|
|
|`FBHealBox_CastOn(button, castString)`|Casts a button's spell (left or right) on its target|
|
||||||
|`FBHealBox_DropSpell(btnIndex, side)` · `FBHealBox_CursorSpell()`|Drag and drop from the spellbook|
|
|`FBHealBox_DropSpell(btnIndex, side)` · `FBHealBox_CursorSpell()`|Drag and drop from the spellbook|
|
||||||
|`FBHealBox_SmartRank(castString, unit)`|Picks the rank to cast|
|
|`FBHealBox_SmartRank(castString, unit)`|Picks the rank to cast|
|
||||||
|
|`FBHealBox_IsHoT(base, ranks)`|Heal over time? List of names plus tooltip, spell watch and running HoTs. Smart Healing skips these|
|
||||||
|
|`FBHealBox_HealFamily(base)` · `FBHealBox_DirectAmount(spell, sd)`|The heal chain a spell belongs to; the expected heal of one rank, or nil if the spell is not eligible|
|
||||||
|`FBHealBox_CheckAggroAll()` · `FBHealBox_ApplyBorder(f)`|Red border for the attacked member; border precedence|
|
|`FBHealBox_CheckAggroAll()` · `FBHealBox_ApplyBorder(f)`|Red border for the attacked member; border precedence|
|
||||||
|`FBHealBox_UpdateSpellTimers()` · `FBHealBox_SpellTimerFor(...)`|HoT/shield timers on buttons|
|
|`FBHealBox_UpdateSpellTimers()` · `FBHealBox_SpellTimerFor(...)`|HoT/shield timers on buttons|
|
||||||
|`FBHealBox_UpdateButtonCooldown(b)` · `FBHealBox_UpdateAllCooldowns()`|Cooldown sweep|
|
|`FBHealBox_UpdateButtonCooldown(b)` · `FBHealBox_UpdateAllCooldowns()`|Cooldown sweep|
|
||||||
@@ -623,6 +660,10 @@ The four functions that feed the bars. All of them expect a **player name**, not
|
|||||||
|
|
||||||
## Troubleshooting
|
## Troubleshooting
|
||||||
|
|
||||||
|
**Nothing shows up at all after login.** Check the chat for the orange line naming your class: on a warrior, rogue or hunter the addon stays asleep on purpose. `/fbp forceload` shows it anyway, see [Which classes it loads for](#which-classes-it-loads-for).
|
||||||
|
|
||||||
|
**Smart Healing does not downrank a spell.** Heal over time spells are excluded on purpose, and so are shields, buffs and any spell whose tooltip does not describe a heal. If it downranks but never leaves the assigned spell, the spell is not in any heal chain, or `/fbp smartcross` is off. Below 30 % health the assigned rank is always used. `/fbp debug` prints the reason for every decision.
|
||||||
|
|
||||||
**A spell does not appear in the menu.** It is not in your class's spell list (`Spell.Name` near the top of the file), or not learned yet. The list can be extended freely.
|
**A spell does not appear in the menu.** It is not in your class's spell list (`Spell.Name` near the top of the file), or not learned yet. The list can be extended freely.
|
||||||
|
|
||||||
**Learned absorb values are capped.** A remembered absorb larger than 1.5 times the tooltip value is treated as a counting error and dropped on load (`FBPredict_SanitizeMemory`); values from versions before 1.4.2 that were doubled by the old double load clean themselves up this way.
|
**Learned absorb values are capped.** A remembered absorb larger than 1.5 times the tooltip value is treated as a counting error and dropped on load (`FBPredict_SanitizeMemory`); values from versions before 1.4.2 that were doubled by the old double load clean themselves up this way.
|
||||||
@@ -666,6 +707,7 @@ 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
|
* 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
|
* HealComm sync with Puppeteer, pfUI, Luna and others, without any Ace libraries
|
||||||
* English, German, Spanish, French and Italian localization, switchable in game
|
* English, German, Spanish, French and Italian localization, switchable in game
|
||||||
|
* 1.4.4.3: class gate for warriors, rogues and hunters (display stays off, chat hint, `/fbp forceload` to override) and Smart Healing no longer downranks heal over time spells of any class. Smart Healing downranks across spells inside a heal chain (Greater Heal to Lesser Heal, Holy Light to Flash of Light), `/fbp smartcross` turns it off; see CHANGELOG
|
||||||
* 1.4.4.2: 32-step buff icon duration display (replacing the 4-quadrant clock with a 32-stage vertical wipe) and syntax/diagnostic bugfixes; see CHANGELOG
|
* 1.4.4.2: 32-step buff icon duration display (replacing the 4-quadrant clock with a 32-stage vertical wipe) and syntax/diagnostic bugfixes; see CHANGELOG
|
||||||
* 1.4.4.1: buff tracking & tooltip scanning fix (Divine Spirit clock icon), expanded class spell lists with blessings, buffs, utility and rez spells, group buff alternate tracking; see CHANGELOG
|
* 1.4.4.1: buff tracking & tooltip scanning fix (Divine Spirit clock icon), expanded class spell lists with blessings, buffs, utility and rez spells, group buff alternate tracking; see CHANGELOG
|
||||||
* 1.4.4: performance pass without functional change (central button states, display caches, shared aura scans, coalesced event bursts); see CHANGELOG
|
* 1.4.4: performance pass without functional change (central button states, display caches, shared aura scans, coalesced event bursts); see CHANGELOG
|
||||||
@@ -675,14 +717,14 @@ Entries that do not exist do no harm: if the spellbook scan does not find them,
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
Heal Box Vanilla v1.4.4.2 · original by Dourd, UI Overhauled · ported to Vanilla and extended 09/2026 by Mquadrat
|
Heal Box Vanilla v1.4.4.3 · original by Dourd, UI Overhauled · ported to Vanilla and extended 09/2026 by Mquadrat
|
||||||
|
|
||||||
_______________________________________________________________________
|
_______________________________________________________________________
|
||||||
GERMAN
|
GERMAN
|
||||||
|
|
||||||
# Heal Box Vanilla
|
# Heal Box Vanilla
|
||||||
|
|
||||||
ADDON-DOKUMENTATION · VERSION 1.4.4.2 · CLIENT 1.12.1
|
ADDON DOKUMENTATION · VERSION 1.4.4.3 · 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.
|
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.
|
||||||
|
|
||||||
@@ -712,6 +754,18 @@ Der Ordnername muss zum Dateinamen der `.toc` passen, sonst startet das Addon ni
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## Für welche Klassen es lädt
|
||||||
|
|
||||||
|
Das Addon ist fürs Heilen und Buffen gebaut. **Krieger, Schurken und Jäger** haben nichts davon: keine Heilzauber, keine Heilvorhersage, und ein Mana-Ticker, der entweder kein Mana zu beobachten hat (Wut, Energie) oder niemanden zu heilen (Jäger). Wer sich mit einer dieser drei Klassen einloggt, bekommt deshalb gar nichts zu sehen. Keine Plaketten, kein Raid-Raster, kein Minimap-Button, kein Optionsfenster, und auch keine Event-Verarbeitung, das Addon kostet im Ruhezustand also nichts. Stattdessen stehen zwei Zeilen im Chat: was passiert ist und wie man es ändert.
|
||||||
|
|
||||||
|
**Trotzdem anzeigen:** `/fbp forceload` eintippen. Die Anzeige startet sofort, ohne `/reload`, und die Einstellung bleibt für diesen Charakter gespeichert (`HealBox.ForceLoad`). Derselbe Befehl schaltet sie wieder aus. Bei jeder anderen Klasse antwortet `/fbp forceload` nur, dass es nicht nötig ist.
|
||||||
|
|
||||||
|
Solange das Addon ruht, antworten alle anderen `/fbp`-Befehle mit demselben Hinweis, denn es ist nichts aufgebaut, worüber sie berichten könnten.
|
||||||
|
|
||||||
|
Erkannt wird über das englische Klassen-Token des Clients (`WARRIOR`, `ROGUE`, `HUNTER`), mit Rückfall auf den angezeigten Klassennamen in fünf Sprachen, damit die Sperre auch auf lokalisierten Clients greift.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## Die Anzeige
|
## Die Anzeige
|
||||||
|
|
||||||
Zehn Namensplaketten in zwei Familien. `FBHealBox1` ist immer der Spieler selbst, `FBHealBox2` bis `FBHealBox5` sind `party1` bis `party4`. `FBHealBoxPet1` bis `FBHealBoxPet5` sind die zugehörigen Begleiter (`pet`, `partypet1` bis `partypet4`). Jede zeigt Name, Lebensprozent und einen mehrschichtigen Balken. **Verschieben:** mit gehaltener **Shift**-Taste eine beliebige Plakette mit der linken Maustaste ziehen, die anderen hängen daran und folgen. Die Position wird pro Charakter gespeichert und übersteht den Reload; ein Wechsel der Skalierung verschiebt die Platte nicht.
|
Zehn Namensplaketten in zwei Familien. `FBHealBox1` ist immer der Spieler selbst, `FBHealBox2` bis `FBHealBox5` sind `party1` bis `party4`. `FBHealBoxPet1` bis `FBHealBoxPet5` sind die zugehörigen Begleiter (`pet`, `partypet1` bis `partypet4`). Jede zeigt Name, Lebensprozent und einen mehrschichtigen Balken. **Verschieben:** mit gehaltener **Shift**-Taste eine beliebige Plakette mit der linken Maustaste ziehen, die anderen hängen daran und folgen. Die Position wird pro Charakter gespeichert und übersteht den Reload; ein Wechsel der Skalierung verschiebt die Platte nicht.
|
||||||
@@ -774,7 +828,20 @@ Rechts neben jeder Plakette liegen bis zu zehn Buttons, jeder mit dem Icon seine
|
|||||||
|
|
||||||
**Rechtsklick-Zauber (optional).** Jeder Button kann einen zweiten Zauber für **Rechtsklick** tragen (etwa Blitzheilung links, Große Heilung rechts), was die Anzeige verdichtet, ohne Buttons hinzuzufügen. Das ist standardmäßig aus und wird ausschließlich über den Schalter im Reiter *Buttons* eingeschaltet. Eingeschaltet erscheint eine zweite Spalte in der Belegung, und ein kleines Icon unten rechts auf jedem Button zeigt seinen Rechtsklick-Zauber; der Tooltip nennt ihn ebenfalls. Ausschalten behält die Belegung, die Buttons reagieren nur nicht mehr auf Rechtsklick.
|
**Rechtsklick-Zauber (optional).** Jeder Button kann einen zweiten Zauber für **Rechtsklick** tragen (etwa Blitzheilung links, Große Heilung rechts), was die Anzeige verdichtet, ohne Buttons hinzuzufügen. Das ist standardmäßig aus und wird ausschließlich über den Schalter im Reiter *Buttons* eingeschaltet. Eingeschaltet erscheint eine zweite Spalte in der Belegung, und ein kleines Icon unten rechts auf jedem Button zeigt seinen Rechtsklick-Zauber; der Tooltip nennt ihn ebenfalls. Ausschalten behält die Belegung, die Buttons reagieren nur nicht mehr auf Rechtsklick.
|
||||||
|
|
||||||
**Smart Healing (standardmäßig aus).** Mit *Smart Healing* wirkt ein Klick den niedrigsten Rang des belegten Zaubers, dessen erwartete Heilung das fehlende Leben des Ziels abzüglich schon eingehender Heilung plus *Sicherheitsaufschlag* (Standard 20 %) deckt. Die erwartete Heilung stammt aus den gelernten Werten der Vorhersage, wo vorhanden, sonst aus dem Tooltip-Mittelwert. Nie über dem belegten Rang, nur für Direktheilungen (HoTs, Schilde und Buffs wie Seelenstärke gehen immer wie belegt raus; ein Zauber kommt nur in Frage, wenn sein Tooltip eine Heilung beschreibt), und unter 30 % Leben immer der belegte Rang. Nachteile: Die Schätzung kennt keine Crits, und bei Schadensspitzen oder gewolltem Überheilen (Tank vor einem großen Treffer) kann der kleinere Rang zu wenig sein. Aus lassen, wann immer Overheal gewollt ist. `/fbp debug` zeigt jede Entscheidung, `/fbp` den Zustand.
|
**Smart Healing (standardmäßig aus).** Mit *Smart Healing* wirkt ein Klick den niedrigsten Rang des belegten Zaubers, dessen erwartete Heilung das fehlende Leben des Ziels abzüglich schon eingehender Heilung plus *Sicherheitsaufschlag* (Standard 20 %) deckt. Die erwartete Heilung stammt aus den gelernten Werten der Vorhersage, wo vorhanden, sonst aus dem Tooltip-Mittelwert. Nie über dem belegten Rang, nur für Direktheilungen, und unter 30 % Leben immer der belegte Rang. **Zauber mit Heilung über Zeit werden nie abgerangt**, egal welcher Klasse: Erneuerung, Verjüngung, Nachwachsen, Gelassenheit, Lebensblüte, Wildwuchs, Springflut und Erdschild gehen immer im belegten Rang raus. Ein HoT verteilt seine Heilung über viele Sekunden, das im Moment des Klicks fehlende Leben sagt also nichts darüber aus, welcher Rang passt, und ein abgerangter HoT tickt die volle Laufzeit zu schwach. Gemischte Zauber wie Nachwachsen zählen ebenfalls als HoT. Schilde und Buffs wie Seelenstärke gehen genauso wie belegt raus, und ein Zauber kommt überhaupt nur in Frage, wenn sein Tooltip eine Heilung beschreibt.
|
||||||
|
|
||||||
|
**Heilketten (neu in 1.4.4.3).** Abgerangt wird nicht nur innerhalb des belegten Zaubers. Innerhalb einer *Heilkette* darf auch der Zauber selbst wechseln, ein Klick auf Große Heilung kann also als Geringes Heilen Rang 3 rausgehen, wenn das den Fehlbetrag deckt. Die Ketten enthalten die Einzelziel-Direktheilungen einer Klasse:
|
||||||
|
|
||||||
|
|Klasse|Kette|
|
||||||
|
|-|-|
|
||||||
|
|Priester|Geringes Heilen · Heilen · Große Heilung|
|
||||||
|
|Paladin|Blitz des Lichts · Heiliges Licht|
|
||||||
|
|Schamane|Geringe Welle der Heilung · Welle der Heilung|
|
||||||
|
|Druide|Heilende Berührung (Nachwachsen ist ein HoT und bleibt draußen)|
|
||||||
|
|
||||||
|
Alles in der Kette ist Kandidat, gewonnen hat der mit der kleinsten erwarteten Heilung, die den Bedarf noch deckt. Nie gewählt wird etwas, das mehr heilt als der belegte Rang, der Button wird also nie stärker, nur billiger. Das kann die Zauberzeit ändern: Bei kleinem Fehlbetrag wird aus einem Klick auf Große Heilung ein Geringes Heilen, aus Heiligem Licht ein Blitz des Lichts. Gruppenheilungen (Gebet der Heilung, Kettenheilung), HoTs, Schilde und Zauber mit Abklingzeit (Heiliger Schock, Handauflegung) sind nie Teil einer Kette.
|
||||||
|
|
||||||
|
Der Schalter *Smartcross* im Reiter *Buttons* schaltet den Kettenwechsel aus und wieder ein, `/fbp smartcross` tut dasselbe aus dem Chat. Aus bleibt Smart Healing beim belegten Zauber und senkt nur dessen Rang, so wie es vor 1.4.4.3 war. Die Ketten stehen in `FBHealChains` direkt beim Smart-Healing-Code und lassen sich frei bearbeiten; Zauber, die nicht getauscht werden sollen, fliegen einfach aus der Liste. Nachteile: Die Schätzung kennt keine Crits, und bei Schadensspitzen oder gewolltem Überheilen (Tank vor einem großen Treffer) kann der kleinere Rang zu wenig sein. Aus lassen, wann immer Overheal gewollt ist. `/fbp debug` zeigt jede Entscheidung, `/fbp` den Zustand.
|
||||||
|
|
||||||
**Cooldowns.** Jeder Button zeigt die gewohnte Cooldown-Uhr seines Zaubers. Der globale Cooldown wird nicht gezeigt (`FBCD_MIN_DURATION`). Option *Cooldowns auf den Buttons*.
|
**Cooldowns.** Jeder Button zeigt die gewohnte Cooldown-Uhr seines Zaubers. Der globale Cooldown wird nicht gezeigt (`FBCD_MIN_DURATION`). Option *Cooldowns auf den Buttons*.
|
||||||
|
|
||||||
@@ -892,7 +959,7 @@ Das Restleben des Ziels liefert die erste Quelle, die antwortet:
|
|||||||
|Lebensquelle des Ziels|Livezeile: welche der vier Quellen für dein aktuelles Ziel antwortet|
|
|Lebensquelle des Ziels|Livezeile: welche der vier Quellen für dein aktuelles Ziel antwortet|
|
||||||
|Zauber|Die im Zauberbuch gefundenen Angriffszauber mit Rangzahl|
|
|Zauber|Die im Zauberbuch gefundenen Angriffszauber mit Rangzahl|
|
||||||
|
|
||||||
Zauber je Klasse: Priester Göttliche Pein, Heiliges Feuer, Gedankenschlag; Druide Zorn, Sternenfeuer, Mondfeuer; Schamane Blitzschlag, Kettenblitzschlag, Erd-/Flammen-/Frostschock; Paladin Heiliger Schock, Hammer des Zorns, Exorzismus, Heiliger Zorn; Magier Feuerball, Frostblitz, Feuerschlag, Versengen, Pyroschlag; Hexenmeister Schattenblitz, Sengender Schmerz, Feuerbrand, Seelenfeuer, Feuersbrunst; Jäger Arkaner Schuss, Gezielter Schuss (Liste `FBDamageSpells`). `/fbp damage` schaltet um, `/fbp debug` protokolliert jede Entscheidung mit der genutzten Lebensquelle.
|
Zauber je Klasse: Priester Göttliche Pein, Heiliges Feuer, Gedankenschlag; Druide Zorn, Sternenfeuer, Mondfeuer; Schamane Blitzschlag, Kettenblitzschlag, Erd-/Flammen-/Frostschock; Paladin Heiliger Schock, Hammer des Zorns, Exorzismus, Heiliger Zorn; Magier Feuerball, Frostblitz, Feuerschlag, Versengen, Pyroschlag; Hexenmeister Schattenblitz, Sengender Schmerz, Feuerbrand, Seelenfeuer, Feuersbrunst; Jäger Arkaner Schuss, Gezielter Schuss (Liste `FBDamageSpells`). `/fbp damage` schaltet um, `/fbp debug` protokolliert jede Entscheidung mit der genutzten Lebensquelle. Hinweis für Jäger: Für diese Klasse lädt das Addon nicht, Smart Damage läuft also erst nach `/fbp forceload`, siehe [Für welche Klassen es lädt](#für-welche-klassen-es-lädt).
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -918,6 +985,8 @@ Das Fenster hat zwei Reiter.
|
|||||||
|
|
||||||
**Smart Healing / Sicherheitsaufschlag**: siehe [Die Buttons](#die-buttons). Standardmäßig aus; Aufschlag 0 bis 50 %, Standard 20.
|
**Smart Healing / Sicherheitsaufschlag**: siehe [Die Buttons](#die-buttons). Standardmäßig aus; Aufschlag 0 bis 50 %, Standard 20.
|
||||||
|
|
||||||
|
**Smartcross**: erlaubt Smart Healing das Wechseln des Zaubers innerhalb einer Heilkette. Ausgegraut und gesperrt, wenn Smart Healing deaktiviert ist; standardmäßig an.
|
||||||
|
|
||||||
### Reiter *Allgemein*
|
### Reiter *Allgemein*
|
||||||
|
|
||||||
**Skalierung**: Skalierung der Plaketten von 0.6 bis 1.5. Wirkt nicht im Party-Frame-Modus.
|
**Skalierung**: Skalierung der Plaketten von 0.6 bis 1.5. Wirkt nicht im Party-Frame-Modus.
|
||||||
@@ -1071,6 +1140,8 @@ Beim Empfang werden eigene Nachrichten über den Absendernamen gefiltert, und da
|
|||||||
|`/fbp test`|Testmodus an/aus (wie der Haken in den Optionen)|
|
|`/fbp test`|Testmodus an/aus (wie der Haken in den Optionen)|
|
||||||
|`/fbp config`|Optionsfenster auf/zu (wie der Minimap-Button)|
|
|`/fbp config`|Optionsfenster auf/zu (wie der Minimap-Button)|
|
||||||
|`/fbp buffs`|Listet die verfolgten Buff-Zauber, ihre Präsenz und Restzeit auf dir sowie deine rohen Buff-Texturen|
|
|`/fbp buffs`|Listet die verfolgten Buff-Zauber, ihre Präsenz und Restzeit auf dir sowie deine rohen Buff-Texturen|
|
||||||
|
|`/fbp forceload`|Nur für Krieger, Schurke und Jäger: zeigt das Addon trotzdem an oder blendet es wieder aus. Pro Charakter gespeichert|
|
||||||
|
|`/fbp smartcross`|Smart Healing: Abrangen über Zaubergrenzen innerhalb einer Heilkette an/aus (Standard an)|
|
||||||
|`/fbp raid`|Raidmodus an/aus|
|
|`/fbp raid`|Raidmodus an/aus|
|
||||||
|`/fbp raidtest 20` · `40` · `off`|Raid-Test mit 20 oder 40 Geistern, oder aus|
|
|`/fbp raidtest 20` · `40` · `off`|Raid-Test mit 20 oder 40 Geistern, oder aus|
|
||||||
|`/fbp ticker`|Mana-Ticker an/aus|
|
|`/fbp ticker`|Mana-Ticker an/aus|
|
||||||
@@ -1091,6 +1162,7 @@ Alles liegt in der Tabelle `HealBox`, gespeichert **pro Charakter**:
|
|||||||
|`Scale`|Skalierung der Plaketten|
|
|`Scale`|Skalierung der Plaketten|
|
||||||
|`AttachMode`|0 = eigene Plaketten, 1 = Standard-Gruppenfenster|
|
|`AttachMode`|0 = eigene Plaketten, 1 = Standard-Gruppenfenster|
|
||||||
|`Active`|Anzeige ein/aus (Shift + Linksklick auf die Minimap)|
|
|`Active`|Anzeige ein/aus (Shift + Linksklick auf die Minimap)|
|
||||||
|
|`ForceLoad`|1 = Anzeige auch für Krieger, Schurke und Jäger, 0 = aus (Standard). Wird mit `/fbp forceload` gesetzt|
|
||||||
|`HealComm`|1 = Sync an, 0 = aus|
|
|`HealComm`|1 = Sync an, 0 = aus|
|
||||||
|`Locale`|`deDE`, `enUS`, `esES`, `frFR` oder `itIT`|
|
|`Locale`|`deDE`, `enUS`, `esES`, `frFR` oder `itIT`|
|
||||||
|`ButtonSpacing`|Abstand der Buttons in px (0 bis 20)|
|
|`ButtonSpacing`|Abstand der Buttons in px (0 bis 20)|
|
||||||
@@ -1103,6 +1175,7 @@ Alles liegt in der Tabelle `HealBox`, gespeichert **pro Charakter**:
|
|||||||
|`LOSIcon`|1 = Sichtlinien-Abzeichen an, 0 = aus|
|
|`LOSIcon`|1 = Sichtlinien-Abzeichen an, 0 = aus|
|
||||||
|`PlateLeft` · `PlateRight`|Klickaktion auf einer Plakette: `target`, `menu`, `move` oder `none`|
|
|`PlateLeft` · `PlateRight`|Klickaktion auf einer Plakette: `target`, `menu`, `move` oder `none`|
|
||||||
|`SmartRank` · `SmartMargin`|Smart Healing an/aus (Standard aus) und Sicherheitsaufschlag in Prozent|
|
|`SmartRank` · `SmartMargin`|Smart Healing an/aus (Standard aus) und Sicherheitsaufschlag in Prozent|
|
||||||
|
|`SmartCross`|1 = Abrangen darf den Zauber innerhalb einer Heilkette wechseln (Standard), 0 = beim belegten Zauber bleiben. In den Optionen oder mit `/fbp smartcross` schaltbar|
|
||||||
|`Cooldowns` · `AggroMark` · `SpellTimers` · `BuffIcons`|Cooldown-Uhr, roter Rahmen für den Angegriffenen, HoT/Schild-Timer, Buff-Icons links am Balken|
|
|`Cooldowns` · `AggroMark` · `SpellTimers` · `BuffIcons`|Cooldown-Uhr, roter Rahmen für den Angegriffenen, HoT/Schild-Timer, Buff-Icons links am Balken|
|
||||||
|`ClassColors`|1 = Namen in Klassenfarbe, 0 = weiß|
|
|`ClassColors`|1 = Namen in Klassenfarbe, 0 = weiß|
|
||||||
|`RangeFade`|1 = Plaketten außer Reichweite abblenden, 0 = aus|
|
|`RangeFade`|1 = Plaketten außer Reichweite abblenden, 0 = aus|
|
||||||
@@ -1158,6 +1231,9 @@ Alle Stellschrauben stehen als Globals oben in ihrem jeweiligen Abschnitt und la
|
|||||||
|`FBPREDICT_TARGET_TIME`|2.0|Gültigkeit des gemerkten Cast-Ziels|
|
|`FBPREDICT_TARGET_TIME`|2.0|Gültigkeit des gemerkten Cast-Ziels|
|
||||||
|`FBPredictTickInterval`|`{Lifebloom = 1}`|Abweichende Tickintervalle|
|
|`FBPredictTickInterval`|`{Lifebloom = 1}`|Abweichende Tickintervalle|
|
||||||
|`FBCommGroupHeal`|`{Prayer of Healing}`|Was als `GrpHeal` gefunkt wird|
|
|`FBCommGroupHeal`|`{Prayer of Healing}`|Was als `GrpHeal` gefunkt wird|
|
||||||
|
|`FBHealChains`|(Tabelle)|Welche Zauber als derselbe Heilzauber in klein gelten. Innerhalb einer Kette darf Smart Healing den Zauber wechseln|
|
||||||
|
|`FBHoTSpells`|(Tabelle)|Zauber mit Heilung über Zeit, die Smart Healing nie abrangt|
|
||||||
|
|`FBBlockedClasses`|`WARRIOR`, `ROGUE`, `HUNTER`|Klassen, für die das Addon ohne `/fbp forceload` nicht lädt|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -1167,8 +1243,11 @@ Alle Stellschrauben stehen als Globals oben in ihrem jeweiligen Abschnitt und la
|
|||||||
|
|
||||||
|Funktion|Zweck|
|
|Funktion|Zweck|
|
||||||
|-|-|
|
|-|-|
|
||||||
|`FBHealBox_OnLoad()`|Event-Registrierung, Startmeldung|
|
|`FBHealBox_OnLoad()`|Event-Registrierung|
|
||||||
|`FBHealBox_OnEvent(event, arg1)`|Zentrale Ereignisverteilung|
|
|`FBHealBox_OnEvent(event, arg1)`|Zentrale Ereignisverteilung; entscheidet bei `ADDON_LOADED` / `VARIABLES_LOADED` auch über die Klassensperre|
|
||||||
|
|`FBHealBox_ClassIsBlocked()` · `FBHealBox_ClassAllowed()`|Krieger, Schurke oder Jäger? Und darf die Anzeige trotzdem laufen (`ForceLoad`)?|
|
||||||
|
|`FBHealBox_ApplyClassGate()` · `FBHealBox_Suppressed()`|Wendet die Klassensperre an und meldet den Ruhezustand an die Module|
|
||||||
|
|`FBHealBox_HideAll()` · `FBHealBox_StartUp()` · `FBHealBox_Announce()`|Legt alles schlafen, weckt alles auf, gibt die Startmeldung genau einmal aus|
|
||||||
|`FBHealBoxSetup()`|Legt die zehn Plaketten an (fünf Spieler, fünf Begleiter)|
|
|`FBHealBoxSetup()`|Legt die zehn Plaketten an (fünf Spieler, fünf Begleiter)|
|
||||||
|`FBHealBoxCreateFrame(…)`|Baut eine Plakette samt der vier Balken|
|
|`FBHealBoxCreateFrame(…)`|Baut eine Plakette samt der vier Balken|
|
||||||
|`FBHealBox_SetBarStrata(f, strata)`|Stapelt Mana / Leben / Schild / Vorhersage|
|
|`FBHealBox_SetBarStrata(f, strata)`|Stapelt Mana / Leben / Schild / Vorhersage|
|
||||||
@@ -1180,6 +1259,8 @@ Alle Stellschrauben stehen als Globals oben in ihrem jeweiligen Abschnitt und la
|
|||||||
|`FBHealBox_CastOn(button, castString)`|Wirkt den Zauber eines Buttons (links oder rechts) auf sein Ziel|
|
|`FBHealBox_CastOn(button, castString)`|Wirkt den Zauber eines Buttons (links oder rechts) auf sein Ziel|
|
||||||
|`FBHealBox_DropSpell(btnIndex, side)` · `FBHealBox_CursorSpell()`|Drag & Drop aus dem Zauberbuch|
|
|`FBHealBox_DropSpell(btnIndex, side)` · `FBHealBox_CursorSpell()`|Drag & Drop aus dem Zauberbuch|
|
||||||
|`FBHealBox_SmartRank(castString, unit)`|Wählt den zu wirkenden Rang|
|
|`FBHealBox_SmartRank(castString, unit)`|Wählt den zu wirkenden Rang|
|
||||||
|
|`FBHealBox_IsHoT(base, ranks)`|Heilung über Zeit? Namensliste plus Tooltip, Zauberwache und laufende HoTs. Smart Healing lässt diese aus|
|
||||||
|
|`FBHealBox_HealFamily(base)` · `FBHealBox_DirectAmount(spell, sd)`|Die Heilkette eines Zaubers; die erwartete Heilung eines Rangs, oder nil, wenn der Zauber nicht in Frage kommt|
|
||||||
|`FBHealBox_CheckAggroAll()` · `FBHealBox_ApplyBorder(f)`|Roter Rahmen für den Angegriffenen; Rahmen-Vorrang|
|
|`FBHealBox_CheckAggroAll()` · `FBHealBox_ApplyBorder(f)`|Roter Rahmen für den Angegriffenen; Rahmen-Vorrang|
|
||||||
|`FBHealBox_UpdateSpellTimers()` · `FBHealBox_SpellTimerFor(...)`|HoT/Schild-Timer auf Buttons|
|
|`FBHealBox_UpdateSpellTimers()` · `FBHealBox_SpellTimerFor(...)`|HoT/Schild-Timer auf Buttons|
|
||||||
|`FBHealBox_UpdateButtonCooldown(b)` · `FBHealBox_UpdateAllCooldowns()`|Cooldown-Uhr|
|
|`FBHealBox_UpdateButtonCooldown(b)` · `FBHealBox_UpdateAllCooldowns()`|Cooldown-Uhr|
|
||||||
@@ -1279,6 +1360,10 @@ Die vier Funktionen, die die Balken speisen. Alle erwarten einen **Spielernamen*
|
|||||||
|
|
||||||
## Fehlersuche
|
## Fehlersuche
|
||||||
|
|
||||||
|
**Nach dem Einloggen ist gar nichts zu sehen.** Im Chat steht eine orange Zeile mit deiner Klasse: Bei Krieger, Schurke und Jäger schläft das Addon mit Absicht. `/fbp forceload` zeigt es trotzdem an, siehe [Für welche Klassen es lädt](#für-welche-klassen-es-lädt).
|
||||||
|
|
||||||
|
**Smart Healing rangt einen Zauber nicht ab.** Zauber mit Heilung über Zeit sind bewusst ausgenommen, ebenso Schilde, Buffs und alles, dessen Tooltip keine Heilung beschreibt. Rangt es zwar ab, wechselt aber nie den Zauber, steht der Zauber in keiner Heilkette oder `/fbp smartcross` ist aus. Unter 30 % Leben geht immer der belegte Rang raus. `/fbp debug` schreibt zu jeder Entscheidung den Grund in den Chat.
|
||||||
|
|
||||||
**Ein Zauber taucht im Menü nicht auf.** Er steht nicht in der Zauberliste deiner Klasse (`Spell.Name` am Dateianfang) oder ist noch nicht gelernt. Die Liste lässt sich frei erweitern.
|
**Ein Zauber taucht im Menü nicht auf.** Er steht nicht in der Zauberliste deiner Klasse (`Spell.Name` am Dateianfang) oder ist noch nicht gelernt. Die Liste lässt sich frei erweitern.
|
||||||
|
|
||||||
**Gelernte Absorb-Werte sind gedeckelt.** Ein gemerkter Absorb über dem 1,5-fachen des Tooltipwerts gilt als Zählfehler und wird beim Laden verworfen (`FBPredict_SanitizeMemory`); die durch die alte Doppelladung verdoppelten Werte aus Versionen vor 1.4.2 räumen sich so von selbst auf.
|
**Gelernte Absorb-Werte sind gedeckelt.** Ein gemerkter Absorb über dem 1,5-fachen des Tooltipwerts gilt als Zählfehler und wird beim Laden verworfen (`FBPredict_SanitizeMemory`); die durch die alte Doppelladung verdoppelten Werte aus Versionen vor 1.4.2 räumen sich so von selbst auf.
|
||||||
@@ -1322,6 +1407,7 @@ 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
|
* Heilvorhersage für Direktheilung, HoT-Restticks und Absorb-Schilde, selbstkorrigierend über den Combatlog
|
||||||
* HealComm-Sync mit Puppeteer, pfUI, Luna und Co., ohne Ace-Bibliotheken
|
* HealComm-Sync mit Puppeteer, pfUI, Luna und Co., ohne Ace-Bibliotheken
|
||||||
* Lokalisierung Deutsch, Englisch, Spanisch, Französisch und Italienisch, im laufenden Spiel umschaltbar
|
* Lokalisierung Deutsch, Englisch, Spanisch, Französisch und Italienisch, im laufenden Spiel umschaltbar
|
||||||
|
* 1.4.4.3: Klassensperre für Krieger, Schurke und Jäger (Anzeige bleibt aus, Hinweis im Chat, Freischaltung mit `/fbp forceload`) und Smart Healing rangt HoTs aller Klassen nicht mehr ab. Smart Healing rangt innerhalb einer Heilkette auch über Zaubergrenzen ab (Große Heilung zu Geringem Heilen, Heiliges Licht zu Blitz des Lichts), `/fbp smartcross` schaltet es aus; siehe CHANGELOG
|
||||||
* 1.4.4.2: 32-Stufen-Ablaufanzeige für Buff-Icons (ersetzt die 4-Quadranten-Uhr durch 32 vertikale Stufen) sowie Syntax- und Diagnose-Korrekturen; siehe CHANGELOG
|
* 1.4.4.2: 32-Stufen-Ablaufanzeige für Buff-Icons (ersetzt die 4-Quadranten-Uhr durch 32 vertikale Stufen) sowie Syntax- und Diagnose-Korrekturen; siehe CHANGELOG
|
||||||
* 1.4.4.1: Buff-Erkennung & Tooltip-Scan behoben (Göttlicher Willen Uhr-Icon), vollständige Klassen-Zauberlisten mit Segen, Buffs, Hilfszaubern und Wiederbelebung, Gruppen-Buff-Erkennung; siehe CHANGELOG
|
* 1.4.4.1: Buff-Erkennung & Tooltip-Scan behoben (Göttlicher Willen Uhr-Icon), vollständige Klassen-Zauberlisten mit Segen, Buffs, Hilfszaubern und Wiederbelebung, Gruppen-Buff-Erkennung; siehe CHANGELOG
|
||||||
* 1.4.4: Leistungsdurchgang ohne Funktionsänderung (zentrale Button-Zustände, Anzeige-Zwischenspeicher, gemeinsame Aura-Scans, zusammengefasste Event-Salven); siehe CHANGELOG
|
* 1.4.4: Leistungsdurchgang ohne Funktionsänderung (zentrale Button-Zustände, Anzeige-Zwischenspeicher, gemeinsame Aura-Scans, zusammengefasste Event-Salven); siehe CHANGELOG
|
||||||
@@ -1331,7 +1417,7 @@ Nicht vorhandene Einträge stören nicht: Findet der Zauberbuch-Scan sie nicht,
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
Heal Box Vanilla v1.4.4.2 · Original von Dourd, UI Overhauled · Vanilla-Portierung und Erweiterung 09/2026 von Mquadrat
|
Heal Box Vanilla v1.4.4.3 · Original von Dourd, UI Overhauled · Vanilla-Portierung und Erweiterung 09/2026 von Mquadrat
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -1342,4 +1428,3 @@ Heal Box Vanilla v1.4.4.2 · Original von Dourd, UI Overhauled · Vanilla-Portie
|
|||||||
**Deutsch:** World of Warcraft Vanilla 1.12.1 Heiler-Addon, Classic WoW Heil-Addon, Heilfenster mit Klick-Buttons, Healium-Alternative für Vanilla, HealComm-kompatibel, Heilvorhersage und eingehende Heilung, Absorb-Schild-Anzeige, HoT-Timer, Machtwort: Schild und Geschwächte Seele, Buff-Timer als Uhr-Icons, Seelenstärke nachbuffen, Dispel-Anzeige, Gruppen- und Begleiterfenster, kompakte Raidframes für 20er und 40er Schlachtzüge, Raid-Raster für Heiler, Mana-Ticker und Fünf-Sekunden-Regel, Regenerations-Tick-Balken, automatisches Abrangen, Smart Healing, Smart Damage, Angriffsziel-Markierung, Sichtlinien-Anzeige, Reichweiten-Fading, Klassenfarben, SuperWoW, UnitXP, MobHealth3 und MobInfo-2, läuft auf Turtle WoW und anderen 1.12-Privatservern, Priester Druide Paladin Schamane Heiler-UI, Lua 5.0 Addon, Deutsch Englisch Spanisch Französisch Italienisch.
|
**Deutsch:** World of Warcraft Vanilla 1.12.1 Heiler-Addon, Classic WoW Heil-Addon, Heilfenster mit Klick-Buttons, Healium-Alternative für Vanilla, HealComm-kompatibel, Heilvorhersage und eingehende Heilung, Absorb-Schild-Anzeige, HoT-Timer, Machtwort: Schild und Geschwächte Seele, Buff-Timer als Uhr-Icons, Seelenstärke nachbuffen, Dispel-Anzeige, Gruppen- und Begleiterfenster, kompakte Raidframes für 20er und 40er Schlachtzüge, Raid-Raster für Heiler, Mana-Ticker und Fünf-Sekunden-Regel, Regenerations-Tick-Balken, automatisches Abrangen, Smart Healing, Smart Damage, Angriffsziel-Markierung, Sichtlinien-Anzeige, Reichweiten-Fading, Klassenfarben, SuperWoW, UnitXP, MobHealth3 und MobInfo-2, läuft auf Turtle WoW und anderen 1.12-Privatservern, Priester Druide Paladin Schamane Heiler-UI, Lua 5.0 Addon, Deutsch Englisch Spanisch Französisch Italienisch.
|
||||||
|
|
||||||
#WoWVanilla #Vanilla112 #WoW1121 #ClassicWoW #TurtleWoW #WoWAddon #VanillaAddon #HealerAddon #HealingAddon #Healium #HealComm #HealPrediction #RaidFrames #PartyFrames #UnitFrames #ClickCasting #ManaTicker #FiveSecondRule #Downranking #SmartHealing #SmartDamage #BuffTimer #HoTTracker #DispelTracker #Priest #Druid #Paladin #Shaman #SuperWoW #UnitXP #MobHealth #Lua50 #HealBoxVanilla
|
#WoWVanilla #Vanilla112 #WoW1121 #ClassicWoW #TurtleWoW #WoWAddon #VanillaAddon #HealerAddon #HealingAddon #Healium #HealComm #HealPrediction #RaidFrames #PartyFrames #UnitFrames #ClickCasting #ManaTicker #FiveSecondRule #Downranking #SmartHealing #SmartDamage #BuffTimer #HoTTracker #DispelTracker #Priest #Druid #Paladin #Shaman #SuperWoW #UnitXP #MobHealth #Lua50 #HealBoxVanilla
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user