Forever Beacon: Referenz-Addon für WoW Forever

Veröffentlicht Aktualisiert Beta-Berichte aus Build 1.60.1.69913

Teilen

Addon-Guide Seite 7 von 7

Lade Forever Beacon herunter, um Code für Interface 16001 zu sehen, der Secret Values absichert, statt mit ihnen zu rechnen. Diese Website hat den Code durchgesehen, aber nicht in einem Forever-Client ausgeführt.

Frag unsere verschwitzte Zocker-KI zu Forever Beacon

Gesundheitsleiste einrichten, Beta-Installation, Probe-Ausgabe, Compartment-Eintrag, gespeicherte Notizen und mehr

Alles, was unsere Guides abdecken. Die Antworten stammen von dieser Seite und aus unseren übrigen Guides, mit den echten Werten als Diagramm und verlinkten Guide-Abschnitten. Es ist KI, also prüfe die Quelle, bevor du zitierst.

Ein kleines Testaddon für die Forever-Beta. Es speichert Notizen, zeichnet deine Gesundheitsleiste, ohne damit zu rechnen, und gibt aus, was der Client über sich selbst meldet. Es misst keinen Schaden, liest nicht das Kampflog und wirkt keine Zauber für dich.

TOC-Interface
16001
Health bar without math
Keine Berechnung mit der Gesundheit
Test im Client
Noch nicht ausgeführt
Addon compartment
Hier nicht getestet

Dieses Referenz-Addon gehört zum WoW-Forever-Addon-Entwicklerguide. Warum es Gesundheitswerte und Frame-Positionen so behandelt, erfährst du in den WoW-Forever-Addon-Mustern und im Forever-API-Spickzettel. Für kleinere Snippets sieh dir die Code-Vorlagen an.

Beacon kam mit dem Quellpaket des Guides auf diese Website, das „Forever Codex“ als Autor nennt. Der Code unten ist, abgesehen von den Zeilenenden, Byte für Byte das, was du herunterlädst.

Download

Die Zip-Datei enthält einen Ordner ForeverBeacon mit beiden Dateien. Entpacke sie in deinen Beta-Ordner AddOns.

Was das Addon macht

FunktionWas es bewirkt
Verschiebbares PanelZiehen bewirkt nichts, solange InCombatLockdown wahr ist. Das Panel merkt sich, wo du es ablegst.
Abgesicherte NamenZone und Charaktername erscheinen nur, wenn issecretvalue sagt, dass sie lesbar sind. Sonst heißt du „Adventurer“.
Health bar without mathDie Statusleiste bekommt UnitHealth und UnitHealthMax direkt. Das Label sagt „sealed“ oder „open“ und berechnet oder gibt nie einen Prozentwert aus.
Slash-Befehle/fb note speichert eine Zeile. /fb toggle zeigt oder versteckt das Panel. /fb probe meldet Build, Interface, Projekt-ID, C_Spell und ob die Gesundheit ein Secret ist. /fb reset löscht Beacons gespeicherte Daten und lädt die UI neu.
Addon-Compartment-EintragIm TOC registriert, du brauchst also keine Minimap-Button-Bibliothek. Auf einem Forever-Client noch nicht bestätigt.
Laden von ZauberdatenDie Probe sucht den Ruhestein mit C_Spell.GetSpellInfo(8690) und fordert das Laden an, wenn der Eintrag nicht im Cache liegt.

Installation in der Beta

  1. Erstelle den Ordner World of Warcraft\_classic_beta_\Interface\AddOns\ForeverBeacon\ oder entpacke die Datei dort.
  2. Speichere das TOC als ForeverBeacon.toc und das Lua als ForeverBeacon.lua.
  3. Starte den Spielclient.
  4. Tippe /fb help.
  5. Wenn Notizen zwischen Sitzungen verschwinden, prüfe deinen Build.

Ordner- und TOC-Name müssen übereinstimmen. Wenn du den Ordner hinzufügst, während das Spiel läuft, und Beacon nach /reload nicht erscheint, starte den Client neu. Wenn das Addon fehlt oder als veraltet markiert ist, prüfe die Interface-Nummer mit /dump select(4, GetBuildInfo()) und aktualisiere das TOC. Spieler meldeten Mitte September einen Ladefehler bei SavedVariables in der Beta, und ein Bericht vom 25. September sagt, Build 70009 habe ihn behoben. Siehe die häufigen KI-Addon-Stolperfallen.

Quellcode

ForeverBeacon.toc
## Interface: 16001
## Title: Forever Beacon
## Notes: Secret-safe session journal and API probe for WoW: Forever. A Forever Codex proof of concept.
## Author: Forever Codex
## Version: 0.1.0
## SavedVariables: ForeverBeaconDB
## IconTexture: Interface\Icons\INV_Misc_Note_01
## Category: Miscellaneous
## AddonCompartmentFunc: ForeverBeacon_OnCompartmentClick
## AddonCompartmentFuncOnEnter: ForeverBeacon_OnCompartmentEnter
## AddonCompartmentFuncOnLeave: ForeverBeacon_OnCompartmentLeave

ForeverBeacon.lua
ForeverBeacon.lua
-- Forever Beacon 0.1.0
-- Proof of concept for World of Warcraft: Forever (beta interface 16001).
-- Secret-safe. No combat log. No secure snippets. No Classic API.
-- Install: World of Warcraft\_classic_beta_\Interface\AddOns\ForeverBeacon\
-- Then fully restart the client. /fb help

local addonName, ns = ...

local PREFIX = "|cffd4a85a[Beacon]|r "

local defaults = {
    enabled = true,
    welcomeShown = false,
    point = { point = "CENTER", rel = "CENTER", x = 0, y = 80 },
    notes = {},
}

ns.db = nil

local frame = CreateFrame("Frame")
local events = {}
local pending = {}

local function Queue(action)
    if InCombatLockdown() then
        pending[#pending + 1] = action
    else
        action()
    end
end

local function IsSecret(value)
    if type(issecretvalue) ~= "function" then
        return false
    end
    return issecretvalue(value) and true or false
end

local function SafeString(value, fallback)
    if value == nil or IsSecret(value) then
        return fallback
    end
    return tostring(value)
end

local function Say(text)
    DEFAULT_CHAT_FRAME:AddMessage(PREFIX .. text, 0.95, 0.92, 0.86)
end

local function MergeDefaults(db)
    for key, value in pairs(defaults) do
        if db[key] == nil then
            if type(value) == "table" then
                local copy = {}
                for innerKey, innerValue in pairs(value) do
                    copy[innerKey] = innerValue
                end
                db[key] = copy
            else
                db[key] = value
            end
        end
    end
end

function events:ADDON_LOADED(loaded)
    if loaded ~= addonName then
        return
    end
    -- Beta note: Forever has been observed writing SavedVariables and then
    -- failing to restore them. Code the correct pattern anyway.
    ForeverBeaconDB = ForeverBeaconDB or {}
    MergeDefaults(ForeverBeaconDB)
    ns.db = ForeverBeaconDB
    ns:BuildPanel()
    self:UnregisterEvent("ADDON_LOADED")
end

function events:PLAYER_LOGIN()
    if not ns.db then
        return
    end
    if not ns.db.welcomeShown then
        ns.db.welcomeShown = true
        Say("online. /fb help. This panel draws health. It never does maths on it.")
    end
    ns:Refresh()
end

function events:PLAYER_ENTERING_WORLD()
    ns:Refresh()
end

function events:ZONE_CHANGED_NEW_AREA()
    ns:Refresh()
end

function events:PLAYER_REGEN_ENABLED()
    for i = 1, #pending do
        pending[i]()
    end
    wipe(pending)
end

function events:UNIT_HEALTH(unit)
    if unit == "player" then
        ns:PaintHealth()
    end
end

function events:UNIT_MAXHEALTH(unit)
    if unit == "player" then
        ns:PaintHealth()
    end
end

function ns:PaintHealth()
    local bar = ns.healthBar
    if not bar then
        return
    end
    local cur = UnitHealth("player")
    local maxv = UnitHealthMax("player")
    -- Status bars accept secrets. Arithmetic, comparison, and print do not.
    bar:SetMinMaxValues(0, maxv)
    bar:SetValue(cur)
    if ns.healthLabel then
        if IsSecret(cur) or IsSecret(maxv) then
            ns.healthLabel:SetText("Vitals sealed")
        else
            ns.healthLabel:SetText("Vitals open")
        end
    end
end

function ns:Refresh()
    if not ns.zoneText then
        return
    end
    local zone = SafeString(GetZoneText(), "Unknown wilds")
    local name = SafeString(UnitName("player"), "Adventurer")
    ns.zoneText:SetText(name .. "  ·  " .. zone)
    ns:PaintHealth()
    ns:PaintNotes()
end

function ns:PaintNotes()
    if not ns.noteText or not ns.db then
        return
    end
    local lines = ns.db.notes
    if #lines == 0 then
        ns.noteText:SetText("No field notes.  /fb note your text")
        return
    end
    local buf = ""
    local startAt = #lines - 4
    if startAt < 1 then
        startAt = 1
    end
    for i = startAt, #lines do
        if buf ~= "" then
            buf = buf .. "\n"
        end
        buf = buf .. lines[i]
    end
    ns.noteText:SetText(buf)
end

function ns:BuildPanel()
    local panel = CreateFrame("Frame", "ForeverBeaconPanel", UIParent, "BackdropTemplate")
    panel:SetSize(280, 168)
    panel:SetFrameStrata("MEDIUM")
    panel:SetClampedToScreen(true)
    panel:SetMovable(true)
    panel:EnableMouse(true)
    panel:RegisterForDrag("LeftButton")
    panel:SetScript("OnDragStart", function(self)
        if InCombatLockdown() then
            return
        end
        self:StartMoving()
    end)
    panel:SetScript("OnDragStop", function(self)
        self:StopMovingOrSizing()
        local point, _, rel, x, y = self:GetPoint(1)
        if ns.db and point and rel then
            ns.db.point = { point = point, rel = rel, x = x, y = y }
        end
    end)

    local p = ns.db and ns.db.point
    if p and p.point then
        panel:SetPoint(p.point, UIParent, p.rel or "CENTER", p.x or 0, p.y or 80)
    else
        panel:SetPoint("CENTER", UIParent, "CENTER", 0, 80)
    end

    panel:SetBackdrop({
        bgFile = "Interface\\Tooltips\\UI-Tooltip-Background",
        edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
        tile = true,
        tileSize = 16,
        edgeSize = 12,
        insets = { left = 3, right = 3, top = 3, bottom = 3 },
    })
    panel:SetBackdropColor(0.07, 0.06, 0.05, 0.92)
    panel:SetBackdropBorderColor(0.83, 0.66, 0.35, 0.9)

    local title = panel:CreateFontString(nil, "OVERLAY", "GameFontNormal")
    title:SetPoint("TOPLEFT", 12, -10)
    title:SetText("Forever Beacon")

    local zone = panel:CreateFontString(nil, "OVERLAY", "GameFontHighlightSmall")
    zone:SetPoint("TOPLEFT", 12, -28)
    zone:SetPoint("TOPRIGHT", -12, -28)
    zone:SetJustifyH("LEFT")
    ns.zoneText = zone

    local bar = CreateFrame("StatusBar", nil, panel)
    bar:SetPoint("TOPLEFT", 12, -48)
    bar:SetPoint("TOPRIGHT", -12, -48)
    bar:SetHeight(12)
    bar:SetStatusBarTexture("Interface\\TargetingFrame\\UI-StatusBar")
    bar:SetStatusBarColor(0.55, 0.12, 0.12, 1)
    bar:SetMinMaxValues(0, 1)
    bar:SetValue(0)
    ns.healthBar = bar

    local healthLabel = panel:CreateFontString(nil, "OVERLAY", "GameFontDisableSmall")
    healthLabel:SetPoint("TOPLEFT", 12, -64)
    healthLabel:SetText("Vitals")
    ns.healthLabel = healthLabel

    local note = panel:CreateFontString(nil, "OVERLAY", "GameFontHighlightSmall")
    note:SetPoint("TOPLEFT", 12, -82)
    note:SetPoint("BOTTOMRIGHT", -12, 12)
    note:SetJustifyH("LEFT")
    note:SetJustifyV("TOP")
    ns.noteText = note

    if ns.db and not ns.db.enabled then
        panel:Hide()
    end
    ns.panel = panel
end

local function Probe()
    local build = SafeString(select(2, GetBuildInfo()), "?")
    local iface = SafeString(select(4, GetBuildInfo()), "?")
    local project = SafeString(WOW_PROJECT_ID, "?")
    Say("build " .. build .. "  interface " .. iface .. "  WOW_PROJECT_ID " .. project)
    if not IsSecret(WOW_PROJECT_ID) and WOW_PROJECT_ID == 1 then
        Say("Project id is 1 (Mainline). Forever reports retail. Do not take a Classic branch.")
    end
    if type(C_Spell) == "table" and type(C_Spell.GetSpellInfo) == "function" then
        local info = C_Spell.GetSpellInfo(8690)
        if info and not IsSecret(info.name) then
            Say("C_Spell.GetSpellInfo(8690) -> " .. SafeString(info.name, "sealed"))
        elseif info == nil then
            if type(C_Spell.RequestLoadSpellData) == "function" then
                C_Spell.RequestLoadSpellData(8690)
            end
            Say("Hearthstone is not cached. Requested a load. Probe again after the result event.")
        else
            Say("Spell name is sealed. Leave it sealed.")
        end
    else
        Say("C_Spell.GetSpellInfo is missing on this build. Retest before you ship spell UI.")
    end
    if type(GetSpellInfo) == "function" then
        Say("GetSpellInfo still exists here. Prefer C_Spell anyway.")
    else
        Say("GetSpellInfo is absent. Classic snippets that call it will error.")
    end
    local h = UnitHealth("player")
    if IsSecret(h) then
        Say("UnitHealth(player) is secret. The bar can draw it. Lua must not add to it.")
    else
        Say("UnitHealth(player) is plain right now. Do not assume that stays true in combat.")
    end
end

function events:SPELL_DATA_LOAD_RESULT(spellID, success)
    if spellID ~= 8690 then
        return
    end
    if success and type(C_Spell) == "table" then
        local info = C_Spell.GetSpellInfo(8690)
        Say("Spell data arrived: " .. SafeString(info and info.name, "sealed"))
    else
        Say("Spell data load failed for 8690.")
    end
end

SLASH_FOREVERBEACON1 = "/fb"
SLASH_FOREVERBEACON2 = "/foreverbeacon"
SlashCmdList["FOREVERBEACON"] = function(msg)
    local text = msg or ""
    local cmd, rest = text:match("^(%S*)%s*(.*)$")
    cmd = (cmd or ""):lower()
    if cmd == "" or cmd == "help" then
        Say("/fb note <text>   /fb toggle   /fb probe   /fb reset")
    elseif cmd == "toggle" then
        if not ns.db or not ns.panel then
            return
        end
        Queue(function()
            ns.db.enabled = not ns.db.enabled
            if ns.db.enabled then
                ns.panel:Show()
                ns:Refresh()
            else
                ns.panel:Hide()
            end
        end)
    elseif cmd == "note" then
        if not ns.db then
            return
        end
        if not rest or rest == "" then
            Say("Usage: /fb note ferry timing on the west dock")
            return
        end
        ns.db.notes[#ns.db.notes + 1] = rest
        ns:PaintNotes()
        Say("noted.")
    elseif cmd == "probe" then
        Probe()
    elseif cmd == "reset" then
        ForeverBeaconDB = nil
        ReloadUI()
    else
        Say("Unknown command. /fb help")
    end
end

function ForeverBeacon_OnCompartmentClick()
    if not ns.db or not ns.panel then
        return
    end
    Queue(function()
        if ns.panel:IsShown() then
            ns.db.enabled = false
            ns.panel:Hide()
        else
            ns.db.enabled = true
            ns.panel:Show()
            ns:Refresh()
        end
    end)
end

function ForeverBeacon_OnCompartmentEnter(_, owner)
    GameTooltip:SetOwner(owner, "ANCHOR_LEFT")
    GameTooltip:SetText("Forever Beacon", 1, 0.82, 0.45)
    GameTooltip:AddLine("Toggle the field journal.", 0.9, 0.9, 0.9)
    GameTooltip:Show()
end

function ForeverBeacon_OnCompartmentLeave()
    GameTooltip:Hide()
end

frame:SetScript("OnEvent", function(self, event, ...)
    local handler = events[event]
    if handler then
        handler(self, ...)
    end
end)

frame:RegisterEvent("ADDON_LOADED")
frame:RegisterEvent("PLAYER_LOGIN")
frame:RegisterEvent("PLAYER_ENTERING_WORLD")
frame:RegisterEvent("ZONE_CHANGED_NEW_AREA")
frame:RegisterEvent("PLAYER_REGEN_ENABLED")
frame:RegisterEvent("SPELL_DATA_LOAD_RESULT")
if frame.RegisterUnitEvent then
    frame:RegisterUnitEvent("UNIT_HEALTH", "player")
    frame:RegisterUnitEvent("UNIT_MAXHEALTH", "player")
else
    frame:RegisterEvent("UNIT_HEALTH")
    frame:RegisterEvent("UNIT_MAXHEALTH")
end

Was das nicht beweist

Diese Website hat Beacon in keinem Forever-Client ausgeführt, weder in Build 69913 noch in einem späteren. Es ist so geschrieben, dass es den veröffentlichten Regeln und den gemeldeten Beta-Fehlern folgt, damit du diese Regeln auf deinem eigenen Client testen kannst. Wenn die Probe sagt, dass GetSpellInfo existiert oder dass die Gesundheit lesbar ist, glaube der Probe mehr als dieser Seite. Genau das ist der Sinn eines Referenz-Addons.

Was Secret Values für Beacon ändern

Das Warcraft Wiki sagt, nur „a limited set of native APIs“ akzeptiere Secret Values aus Tainted-Code, und nennt StatusBar:SetValue als Beispiel.Quelle: Secret Values, geprüft am 28. Sept. 2026. Deshalb reicht PaintHealth das rohe Ergebnis von UnitHealth direkt an bar:SetValue(cur) weiter, ohne Subtraktion, Prozentwert oder Vergleich.

The health example is untested in a Forever client. No source we found verifies that SetMinMaxValues accepts a secret UnitHealthMax value.

Die Einschränkungen sind konkret. Tainted-Code darf ein Secret speichern, an eine Lua-Funktion übergeben oder zu einem String verketten. Er darf nicht damit rechnen, es vergleichen, seine Länge bestimmen oder es als Tabellenschlüssel nutzen. Eine blockierte Operation löst sofort einen Lua-Fehler aus.

Warum das Label „sealed“ statt einer Zahl zeigt

issecretvalue ist der einzige Test, den Beacon macht, bevor es das Gesundheits-Label wählt. Wenn UnitHealth oder UnitHealthMax als Secret zurückkommt, lautet das Label „Vitals sealed“, weil ein Prozentwert die Division braucht, die der Client verweigert.

SafeString sichert Zonen- und Charakternamen auf dieselbe Weise ab. Ist ein Wert ein Secret, ersetzt es ihn durch „Unknown wilds“ oder „Adventurer“, damit das Panel weiter zeichnet, statt einen Fehler auszulösen.

Die Ausgabe von /fb Probe lesen

/fb probe gibt Build, Interface und WOW_PROJECT_ID in einer Zeile aus und ergänzt dann „Forever reports retail“, wenn die ID 1 ist. WoW Forever Builds hat denselben Wert in Beta-Build 69913 aufgezeichnet.

Die aufbewahrte WFG-Probe vom 12. Oktober auf Build 70338 zeichnet stattdessen die Projekt-ID 18 auf, und Blizzards Client-Konstanten definieren WOW_PROJECT_CAMELOT = 18. Beacons bedingte Meldung "Forever reports retail" erscheint bei diesem Wert nicht; die Bedingung beschriftet nur die Diagnoseausgabe und verhindert nicht, dass das Addon lädt. Beacon protokolliert weiterhin die rohe ID.Quelle: Blizzards Camelot-Projektkonstanten, aufbewahrter Auszug von 70338, geprüft am 13. Okt. 2026; separate WFG-Probe erfasst am 12. Okt.. Der Spiegel kann einen späteren Build zeigen.

Zur Client-Erkennung in gemeinsamen Addons vergleiche WOW_PROJECT_ID mit WOW_PROJECT_CAMELOT, wenn diese Konstante existiert, und prüfe dann die API des Features. Der Guide zu Addon-Mustern zeigt das anhand der Quellen geprüfte Beispiel. Das aufbewahrte Wiki-Beispiel mit WOW_PROJECT_MAINLINE plus LE_EXPANSION_LEVEL_CURRENT == LE_EXPANSION_CLASSIC ist historisch und passt nicht zum erfassten Client 70338; seine TOC-Metadatenoption X-Game ist ein separater Ansatz. Das heruntergeladene Beacon-Beispiel bleibt ein ungetestetes Referenz-Addon, nicht die separate Live-Probe.

Der Schritt der Zauberabfrage

Die Probe ruft C_Spell.GetSpellInfo(8690) auf, wobei 8690 die Zauber-ID des Ruhesteins ist. Dieser Aufruf mit Namespace gibt eine spellInfo-Tabelle zurück. Das alte Global GetSpellInfo gibt einzelne Werte zurück, so liest Classic-Code die Daten.Quelle: C_Spell.GetSpellInfo, geprüft am 28. Sept. 2026.

Das Wiki dokumentiert eine Rückgabe von nil für einen Zauber, den es nicht findet. Beacon liest nil als „noch nicht im Cache“, ruft C_Spell.RequestLoadSpellData auf und meldet die Antwort über SPELL_DATA_LOAD_RESULT. Das Wiki warnt, dass dieses Event einen Fehlschlag melden kann, wenn nur Teildaten ankommen, eine Zeile „load failed“ bedeutet also nicht immer, dass der Zauber fehlt.

Wie SavedVariables laden und warum Notizen verschwinden können

Der Client lädt FrameXML, dann Addon-Code, dann die gespeicherten Variablen jedes Addons und löst ADDON_LOADED für dieses Addon aus, sobald seine Variablen zurück sind.Quelle: Saving variables between game sessions, geprüft am 28. Sept. 2026. PLAYER_LOGIN löst aus, nachdem alle Addons geladen sind.

Ein Standardwert auf Dateiebene wird überschrieben, wenn der gespeicherte Wert eintrifft. Beacon vermeidet das: Es lässt ForeverBeaconDB in Ruhe bis ADDON_LOADED und füllt dann nur die Schlüssel auf, die der gespeicherten Tabelle fehlen.

Wie der Beta-Bug aussah

Ein Thread in den Blizzard-Foren, eröffnet am 21. Sept. 2026, meldete, dass gespeicherte Daten korrekt auf die Platte geschrieben wurden, aber beim nächsten Login leer zurückkamen. Andere Addon-Autoren bestätigten es in derselben Woche.Quelle: WOWF Beta: Addon SavedVariables appear to write correctly to disk but are not restored at startup, geprüft am 28. Sept. 2026.

Eine Antwort vom 25. Sept. 2026 sagt, dass Build 70009 vom 23. Sept. gespeicherte Variablen wieder korrekt lädt. Das ist die Bestätigung eines einzelnen Spielers, keine Blizzard-Patchnote, und Beacons Code hat sich deshalb nicht geändert.

Warum das Panel mit dem Verschieben oder Verstecken wartet

InCombatLockdownist wahr ab PLAYER_REGEN_DISABLED bis kurz vor PLAYER_REGEN_ENABLED.Quelle: InCombatLockdown, geprüft am 28. Sept. 2026. In diesem Zeitfenster blockiert der Lockdown laut Wiki das Verschieben eines geschützten Frames durch Zurücksetzen seiner Anker, vom Spieler ausgelöste Bewegungen sind aber weiterhin erlaubt.

Beacons Panel ist kein geschützter Frame, die Prüfungen sind also eine Vorsichtsmaßnahme, keine Pflicht. /fb toggle und der Compartment-Klick laufen beide über Queue, das die Aktion bis PLAYER_REGEN_ENABLED zurückhält und dann ausführt.

Ziehen wird abgelehnt, nicht eingereiht

OnDragStart reiht nichts ein. Es prüft InCombatLockdown und ignoriert das Ziehen einfach, obwohl das Wiki vom Spieler ausgelöste Bewegungen erlaubt. Ziehe nach dem Kampf erneut, und OnDragStop speichert die neue Position.

Der Addon-Compartment-Eintrag, weiterhin unbestätigt

Beacon registriert sich über drei TOC-Felder: AddonCompartmentFunc, AddonCompartmentFuncOnEnter und AddonCompartmentFuncOnLeave. Das Wiki nennt das automatische Registrierung: Der Client ruft die genannten globalen Funktionen selbst auf, ohne dass dafür ein Aufruf von RegisterAddon nötig ist.Quelle: Addon compartment, geprüft am 28. Sept. 2026. Der Guide zu den Code-Vorlagen enthält denselben Stub einzeln.

Der Klick-Handler schaltet ns.db.enabled um und zeigt oder versteckt das Panel über Queue. Die Hover-Handler zeichnen nur einen Tooltip. Nichts davon wurde auf einem Forever-Client bestätigt.

Was dieses Addon nicht versucht

Beacon ruft nie CombatLogGetCurrentEventInfo auf. Die Addon-Notizen von Warcraft Forever melden, dass es auf diesem Client nicht verfügbar ist und dass UnitHealth für freundliche Einheiten als Secret Number ankommt.Quelle: Addons, geprüft am 28. Sept. 2026.

Es schreibt außerdem keine Secure-Attribute und ruft keine geschützte Funktion wie ChatFrame_OpenChat auf. Dieselben Notizen sagen, ein blockierter geschützter Aufruf löst keinen Lua-Fehler aus, auch nicht innerhalb von pcall. Die einzigen Anzeichen sind „Interface action failed because of an AddOn“ und ein Zähler im AddOns-Fenster, der sich nur durch einen vollständigen Neustart des Clients zurücksetzt. Der Guide zu Addon-Stolperfallen behandelt diese Stolperfallen.

Wo vollständige Addons stehen

Beacon bleibt absichtlich klein. Das kostenlose Guide-Addon RestedXP ist ein größeres Addon, das bereits Forever-Inhalte ausliefert: Sein Release vom 25. Sept. 2026, v4.11.10, listet Forever-Routen-Updates für Mulgore, Durotar und Rotkammgebirge. Seine Notizen zu v4.11.8 vom 22. Sept. sagen, dass es seine Forever-Guides in ein #forever-Tag umgewandelt hat, eine Möglichkeit, wie eine gemeinsame Codebasis Forever-Inhalte getrennt hält.Quelle: RXPGuides releases on GitHub, geprüft am 28. Sept. 2026.

RestedXP-RXPGuides-Release v4.11.10 auf GitHub vom 25. September 2026 mit Forever-Updates für Rotkammgebirge, Brachland, Mulgore und Durotar
Bild teilen: RestedXP-RXPGuides-Release v4.11.10 auf GitHub vom 25. September 2026 mit Forever-Updates für Rotkammgebirge, Brachland, Mulgore und Durotar

Die Release Notes zu RestedXP v4.11.10, datiert 2026-09-25, listen Forever-Updates für Rotkammgebirge, Brachland, Mulgore und Durotar.Quelle: RXPGuides releases on GitHub, v4.11.10, erfasst am 30. Sept. 2026.

Wichtige Fakten

  • TOC-Interface Geändert16001 in der Zeile „Forever Beta“ der TOC-Tabelle im Warcraft Wiki; mit /dump select(4, GetBuildInfo()) prüfenClassic: Classic Era führt in derselben Tabelle 11509.
  • Health bar without math New in ForeverFeeds UnitHealth to a StatusBar without math; names pass through issecretvalue
  • Test im ClientBeacon wurde von dieser Website nicht in einem Forever-Client ausgeführt
  • Addon Compartment Neu in ForeverTOC-Felder sind für Mainline dokumentiert; hier noch nicht auf einem Forever-Client getestet

Quellen

  1. TOC formatWarcraft Wiki
  2. Secret ValuesWarcraft Wiki
  3. Addon compartmentWarcraft Wiki
  4. What the WoW Forever beta breaks for addons: secret health values, dead secure snippets, new APIsWoW Forever Builds
  5. AddonsWarcraft Forever
  6. WoW: Forever Will Have Addon Changes from MidnightWowhead
  7. WOWF Beta: Addon SavedVariables appear to write correctly to disk but are not restored at startupWorld of Warcraft Forums (player bug report)
  8. Saving variables between game sessionsWarcraft Wiki
  9. WOW_PROJECT_IDWarcraft Wiki
  10. InCombatLockdownWarcraft Wiki
  11. C_Spell.GetSpellInfoWarcraft Wiki
  12. SPELL_DATA_LOAD_RESULTWarcraft Wiki
  13. RXPGuides releasesRestedXP (GitHub)
  14. Blizzard client source: ProjectConstants.lua (retained build 70338; mirror may change)Blizzard Entertainment (source mirrored by Gethe)
  15. WoW Forever Guides · code review only