Forever Beacon : addon de référence pour WoW Forever

Publié Mis à jour Rapports bêta de la build 1.60.1.69913

Partager

Guide des addons page 7 sur 7

Téléchargez Forever Beacon pour voir du code d’interface 16001 qui protège les valeurs secrètes au lieu de faire des calculs dessus. Ce site a relu son code, mais ne l’a pas exécuté dans un client Forever.

Demandez tout sur Forever Beacon à notre IA accro

Configuration de la barre de vie, installation bêta, résultats de sonde, entrée du compartiment, notes sauvegardées et plus

Tout ce que couvrent nos guides. Les réponses proviennent de cette page et du reste de nos guides, avec les vraies valeurs en graphique et les sections de guide liées. C’est une IA : vérifiez la source avant de la citer.

Un petit addon de test pour la bêta de Forever. Il garde des notes, dessine votre barre de vie sans calcul dessus et affiche ce que le client rapporte de lui-même. Il ne mesure pas les dégâts, ne lit pas le journal de combat et ne lance aucun sort à votre place.

Interface TOC
16001
Health bar without math
Aucun calcul sur la vie
Test en client
Pas encore exécuté
Addon compartment
Non testé ici

Cet addon de référence fait partie du guide du développeur d’addons WoW Forever. Pour comprendre pourquoi il gère ainsi les valeurs de vie et le positionnement des cadres, lisez WoW Forever addon patterns et la Forever API cheat sheet. Pour des extraits plus courts, consultez les modèles de code.

Beacon est arrivé sur ce site avec le pack source du guide, qui en nomme l’auteur « Forever Codex ». Le code ci-dessous est identique octet pour octet à ce que vous téléchargez, hors fins de ligne.

Téléchargement

Le zip contient un dossier ForeverBeacon avec les deux fichiers. Décompressez-le dans votre dossier AddOns de la bêta.

Ce que fait l’addon

FonctionnalitéEffet
Panneau déplaçableLe glisser-déposer ne fait rien tant que InCombatLockdown est vrai. Le panneau retient l’endroit où vous le déposez.
Noms protégésLa zone et le nom du personnage ne s’affichent que si issecretvalue indique qu’ils sont lisibles. Sinon, vous êtes « Adventurer ».
Health bar without mathLa barre d’état reçoit directement UnitHealth et UnitHealthMax. Le libellé indique scellé ou ouvert, et ne calcule ni n’affiche jamais de pourcentage.
Commandes slash/fb note enregistre une ligne. /fb toggle affiche ou masque le panneau. /fb probe rapporte la build, l’interface, l’ID de projet, C_Spell et si la vie est secrète. /fb reset efface les données enregistrées de Beacon et recharge l’interface.
Entrée du compartiment d’addonsEnregistrée dans le TOC, donc aucune bibliothèque de bouton de minicarte n’est nécessaire. Pas encore confirmée sur un client Forever.
Chargement des données de sortLa sonde cherche la Pierre de foyer avec C_Spell.GetSpellInfo(8690) et demande un chargement si l’enregistrement n’est pas en cache.

Installer sur la bêta

  1. Créez le dossier World of Warcraft\_classic_beta_\Interface\AddOns\ForeverBeacon\, ou décompressez-y l’archive.
  2. Enregistrez le TOC sous ForeverBeacon.toc et le Lua sous ForeverBeacon.lua.
  3. Lancez le client du jeu.
  4. Tapez /fb help.
  5. Si les notes disparaissent entre deux sessions, vérifiez votre build.

Le nom du dossier et celui du TOC doivent correspondre. Si vous ajoutez le dossier pendant que le jeu tourne et que Beacon n’apparaît pas après /reload, redémarrez le client. Si l’addon est absent ou marqué comme périmé, vérifiez le numéro d’interface avec /dump select(4, GetBuildInfo()) et mettez le TOC à jour. Des joueurs ont signalé un bug de chargement de SavedVariables dans la bêta à la mi-septembre, et un signalement du 25 septembre indique que la build 70009 l’a corrigé. Voir les pièges courants des addons écrits par IA.

Code source

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

Ce que cela ne prouve pas

Ce site n’a pas exécuté Beacon dans un client Forever, ni sur la build 69913 ni sur une build ultérieure. Il est écrit pour suivre les règles publiées et les échecs rapportés de la bêta, afin que vous puissiez tester ces règles sur votre propre client. Si la sonde indique que GetSpellInfo existe, ou que la vie est lisible, croyez la sonde plutôt que cette page. C’est le but d’un addon de référence.

Ce que les valeurs secrètes changent pour Beacon

Le Warcraft Wiki dit seulement qu’« a limited set of native APIs » accepte des valeurs secrètes venant d’un code tainted, et cite StatusBar:SetValue comme exemple.Source : Secret Values, vérifié le 28 sept. 2026. C’est pourquoi PaintHealth transmet le résultat brut de UnitHealth directement à bar:SetValue(cur), sans soustraction, pourcentage ni comparaison.

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

Les restrictions sont précises. Un code tainted peut stocker un secret, le passer à une fonction Lua ou le concaténer dans une chaîne. Il ne peut ni faire d’arithmétique dessus, ni le comparer, ni en prendre la longueur, ni l’utiliser comme clé de table. Une opération bloquée déclenche immédiatement une erreur Lua.

Pourquoi le libellé affiche « sealed » au lieu d’un nombre

issecretvalue est le seul test que Beacon exécute avant de choisir le libellé de vie. Si UnitHealth ou UnitHealthMax renvoie une valeur secrète, le libellé affiche « Vitals sealed », car un pourcentage exige la division que le client refuse.

SafeString protège de la même façon la zone et le nom du personnage. Quand une valeur est secrète, il la remplace par « Unknown wilds » ou « Adventurer », afin que le panneau continue de s’afficher au lieu de lever une erreur.

Lire ce que rapporte /fb Probe

/fb probe affiche la build, l’interface et WOW_PROJECT_ID sur une seule ligne, puis ajoute « Forever reports retail » lorsque l’ID vaut 1. WoW Forever Builds a enregistré cette même valeur sur la build bêta 69913.

La sonde WFG conservée du 12 octobre sur la build 70338 relève plutôt l’ID de projet 18, et les constantes du client de Blizzard définissent WOW_PROJECT_CAMELOT = 18. Le message conditionnel "Forever reports retail" de Beacon ne s’affichera pas pour cette valeur ; la condition ne fait qu’annoter les résultats de diagnostic et n’empêche pas le chargement de l’addon. Beacon consigne toujours l’ID brut.Source : constantes de projet Camelot de Blizzard, extrait conservé 70338 inspecté le 13 oct. 2026 ; sonde WFG distincte capturée le 12 oct.. Le miroir peut afficher une build plus récente.

Pour détecter le client dans un addon commun à plusieurs clients, comparez WOW_PROJECT_ID à WOW_PROJECT_CAMELOT lorsque cette constante existe, puis vérifiez l’API de la fonctionnalité. Le guide des patterns d’addon présente l’exemple vérifié dans les sources. L’exemple conservé du wiki avec WOW_PROJECT_MAINLINE et LE_EXPANSION_LEVEL_CURRENT == LE_EXPANSION_CLASSIC est historique et ne correspond pas au client 70338 capturé ; son option de métadonnées TOC X-Game est une approche distincte. L’exemple Beacon téléchargé reste un addon de référence non testé, distinct de la sonde en direct.

L’étape de recherche du sort

La sonde appelle C_Spell.GetSpellInfo(8690), où 8690 est l’ID du sort de la Pierre de foyer. Cet appel à espace de noms renvoie une seule table spellInfo. L’ancienne fonction globale GetSpellInfo renvoie des valeurs séparées, ce qui est la façon dont le code Classic la lit.Source : C_Spell.GetSpellInfo, vérifié le 28 sept. 2026.

Le wiki documente un retour nil pour un sort introuvable. Beacon interprète nil comme « pas encore en cache », appelle C_Spell.RequestLoadSpellData et rapporte la réponse sur SPELL_DATA_LOAD_RESULT. Le wiki prévient que cet événement peut signaler un échec quand seules des données partielles arrivent, donc une ligne « load failed » ne signifie pas toujours que le sort est introuvable.

Comment les SavedVariables se chargent, et pourquoi des notes peuvent disparaître

Le client charge FrameXML, puis le code des addons, puis les variables sauvegardées de chaque addon, et déclenche ADDON_LOADED pour cet addon dès que ses variables sont revenues.Source : Saving variables between game sessions, vérifié le 28 sept. 2026. PLAYER_LOGIN se déclenche une fois tous les addons chargés.

Une valeur par défaut définie au niveau du fichier est écrasée à l’arrivée de la valeur sauvegardée. Beacon l’évite : il ne touche pas à ForeverBeaconDB avant ADDON_LOADED, puis ne remplit que les clés absentes de la table sauvegardée.

À quoi ressemblait le bug de la bêta

Un fil des forums Blizzard ouvert le 21 sept. 2026 signalait que les données sauvegardées étaient bien écrites sur le disque mais revenaient vides à la connexion suivante. D’autres auteurs d’addons l’ont confirmé la même semaine.Source : WOWF Beta: Addon SavedVariables appear to write correctly to disk but are not restored at startup, vérifié le 28 sept. 2026.

Une réponse du 25 sept. 2026 indique que la build 70009, datée du 23 sept., recharge de nouveau correctement les variables sauvegardées. Il s’agit de la confirmation d’un seul joueur, pas d’une note de patch de Blizzard, et le code de Beacon n’a pas changé pour autant.

Pourquoi le panneau attend pour se déplacer ou se masquer

InCombatLockdownest vrai de PLAYER_REGEN_DISABLED jusqu’à juste avant PLAYER_REGEN_ENABLED.Source : InCombatLockdown, vérifié le 28 sept. 2026. Pendant cette fenêtre, le wiki indique que le verrouillage empêche de déplacer un cadre protégé en réinitialisant ses ancres, mais les déplacements lancés par le joueur restent autorisés.

Le panneau de Beacon n’est pas un cadre protégé : ces vérifications sont donc une précaution, pas une obligation. /fb toggle et le clic dans le compartiment passent tous deux par Queue, qui retient l’action jusqu’à PLAYER_REGEN_ENABLED puis l’exécute.

Le glisser est refusé, pas mis en file

OnDragStart ne met rien en file. Il vérifie InCombatLockdown et ignore simplement le glissement, même si le wiki autorise les déplacements initiés par le joueur. Faites glisser de nouveau après le combat, et OnDragStop enregistre la nouvelle position.

L’entrée du compartiment d’addons, toujours non confirmée

Beacon s’enregistre via trois champs TOC, AddonCompartmentFunc, AddonCompartmentFuncOnEnter et AddonCompartmentFuncOnLeave. Le wiki parle d’enregistrement automatique : le client appelle lui-même les fonctions globales nommées, sans aucun RegisterAddon appel.Source : Addon compartment, vérifié le 28 sept. 2026. Le guide des modèles de code propose le même stub seul.

Le gestionnaire de clic bascule ns.db.enabled et affiche ou masque le panneau via Queue. Les gestionnaires de survol ne font qu’afficher une infobulle. Rien de tout cela n’a été confirmé sur un client Forever.

Ce que cet addon ne tente pas

Beacon n’appelle jamais CombatLogGetCurrentEventInfo. Les notes d’addon de Warcraft Forever indiquent qu’elle est indisponible sur ce client, et que UnitHealth pour une cible amicale arrive sous forme de nombre secret.Source : Addons, vérifié le 28 sept. 2026.

Il n’écrit pas non plus d’attributs sécurisés et n’appelle aucune fonction protégée comme ChatFrame_OpenChat. Les mêmes notes précisent qu’un appel protégé bloqué ne lève aucune erreur Lua, même dans pcall. Les seuls signes sont « Interface action failed because of an AddOn » et un compteur du panneau AddOns qui ne se réinitialise qu’avec un redémarrage complet du client. Le guide des pièges des addons traite de ces écueils.

Où en sont les addons complets

Beacon reste volontairement petit. L’addon de guides gratuit RestedXP est un addon plus volumineux qui livre déjà du contenu Forever : sa version v4.11.10 du 25 sept. 2026 répertorie des mises à jour d’itinéraires Forever pour Mulgore, Durotar et Redridge. Ses notes de la v4.11.8, du 22 sept., indiquent qu’il a converti ses guides Forever vers une balise #forever, une façon pour une base de code partagée de garder le contenu Forever à part.Source : RXPGuides releases on GitHub, vérifié le 28 sept. 2026.

Version v4.11.10 de RestedXP RXPGuides sur GitHub du 25 septembre 2026, indiquant les mises à jour des Carmines, des Tarides, de Mulgore et de Durotar pour Forever
Partager l’image : version v4.11.10 de RestedXP RXPGuides sur GitHub du 25 septembre 2026, indiquant les mises à jour des Carmines, des Tarides, de Mulgore et de Durotar pour Forever

Les notes de version v4.11.10 de RestedXP, datées du 2026-09-25, répertorient des mises à jour Forever pour Redridge, Barrens, Mulgore et Durotar.Source : RXPGuides releases on GitHub, v4.11.10, capturé le 30 sept. 2026.

Faits clés

  • Interface TOC Modifiée16001 dans la ligne Forever Beta du tableau TOC du Warcraft Wiki ; vérifiez avec /dump select(4, GetBuildInfo())Classic : Classic Era indique 11509 dans le même tableau.
  • Health bar without math New in ForeverFeeds UnitHealth to a StatusBar without math; names pass through issecretvalue
  • Test en clientCe site n’a pas exécuté Beacon dans un client Forever
  • Addon compartment Nouveau dans ForeverLes champs TOC sont documentés pour Mainline ; pas encore testés ici sur un client Forever

Sources

  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