Forever Beacon: справочный аддон для WoW Forever

Опубликовано Обновлено Сообщения о бете для сборки 1.60.1.69913

Поделиться

Гайд по аддонам, страница 7 из 7

Скачайте Forever Beacon, чтобы посмотреть код интерфейса 16001, который проверяет секретные значения, а не выполняет с ними вычисления. Этот сайт изучил его код, но не запускал в клиенте Forever.

Спросите нашего потного ИИ-задрота о Forever Beacon

Настройка полоски здоровья, установка в бете, вывод проверки, запись в меню аддонов, сохраненные заметки и другое

Всё, что охватывают наши гайды. Ответы берутся с этой страницы и из остальных гайдов, с реальными значениями на графиках и ссылками на разделы гайдов. Это ИИ, поэтому проверяйте источник, прежде чем цитировать.

Небольшой тестовый аддон для беты Forever. Он хранит заметки, отображает полоску здоровья без вычислений и выводит сведения, которые сообщает о себе клиент. Он не измеряет урон, не читает журнал боя и не применяет заклинания за вас.

Интерфейс TOC
16001
Health bar without math
Без вычислений над здоровьем
Тест в клиенте
Еще не запускался
Addon compartment
Здесь не проверено

Этот справочный аддон входит в гайд для разработчиков аддонов WoW Forever. Чтобы понять, почему он так работает со значениями здоровья и положением рамки, прочитайте шаблоны аддонов WoW Forever и краткую памятку по API Forever. Небольшие фрагменты кода смотрите в шаблонах кода.

Beacon попал на этот сайт вместе с исходниками гайда; в них автор указан как «Forever Codex». Код ниже побайтно совпадает с загружаемым, кроме символов конца строк.

Скачать

В zip-архиве находится папка ForeverBeacon с обоими файлами. Распакуйте ее в папку беты AddOns.

Что делает аддон

ФункцияЧто делает
Перемещаемая панельПеретаскивание ничего не делает, пока InCombatLockdown имеет значение true. Панель запоминает место, куда вы ее переместили.
Защищенные именаЗона и имя персонажа отображаются, только если issecretvalue сообщает, что это обычные значения. Иначе показывается «Adventurer».
Health bar without mathПолоска состояния получает напрямую UnitHealth и UnitHealthMax. Подпись сообщает, запечатано значение или открыто, и никогда не вычисляет и не выводит процент.
Команды со слешем/fb note сохраняет строку. /fb toggle показывает или скрывает панель. /fb probe сообщает сборку, интерфейс, ID проекта, C_Spell и является ли здоровье секретным. /fb reset удаляет сохраненные данные Beacon и перезагружает интерфейс.
Запись в отсеке аддоновЗарегистрирован в TOC, поэтому библиотека кнопки мини-карты не нужна. В клиенте Forever пока не подтверждено.
Загрузка данных заклинанийПроверка ищет Камень возвращения с помощью C_Spell.GetSpellInfo(8690) и запрашивает загрузку, если записи нет в кэше.

Установка в бете

  1. Создайте папку World of Warcraft\_classic_beta_\Interface\AddOns\ForeverBeacon\ или распакуйте архив туда.
  2. Сохраните TOC как ForeverBeacon.toc, а Lua — как ForeverBeacon.lua.
  3. Запустите игровой клиент.
  4. Введите /fb help.
  5. Если заметки пропадают между сеансами, проверьте сборку.

Имя папки и TOC должны совпадать. Если добавить папку при запущенной игре, а Beacon не появится после /reload, перезапустите клиент. Если аддон отсутствует или помечен как устаревший, проверьте номер интерфейса с помощью /dump select(4, GetBuildInfo()) и обновите TOC. В середине сентября игроки сообщали об ошибке загрузки SavedVariables в бете, а в сообщении от 25 сентября сказано, что сборка 70009 ее исправила. См. распространенные подводные камни при создании аддонов с ИИ.

Исходный код

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

Чего это не доказывает

Этот сайт не запускал Beacon в клиенте Forever ни на сборке 69913, ни на более поздней. Аддон написан с учетом опубликованных правил и сообщений об ошибках беты, чтобы вы могли проверить эти правила на своем клиенте. Если проверка показывает, что GetSpellInfo существует или что здоровье — обычное значение, доверяйте проверке, а не этой странице. В этом и смысл справочного аддона.

Как секретные значения влияют на Beacon

В Warcraft Wiki говорится, что только "a limited set of native APIs" («ограниченный набор встроенных API») принимает секретные значения из загрязненного кода; в качестве примераИсточник: Secret Values, проверено 28 сент. 2026. указана StatusBar:SetValue. Поэтому PaintHealth передает результат UnitHealth напрямую в bar:SetValue(cur) — без вычитания, процентов и сравнений.

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

Ограничения конкретны. Загрязненный код может хранить секретное значение, передавать его функции Lua или объединять со строкой. Нельзя выполнять над ним арифметические операции, сравнивать его, получать его длину или использовать как ключ таблицы. Заблокированная операция немедленно вызывает ошибку Lua.

Почему подпись сообщает «sealed», а не число

issecretvalue — единственная проверка, которую Beacon выполняет перед выбором подписи здоровья. Если UnitHealth или UnitHealthMax возвращает секретное значение, подпись гласит «Vitals sealed», поскольку для вычисления процента нужно деление, которое клиент запрещает.

SafeString Так же защищаются зона и имя персонажа. Если значение секретное, вместо него подставляется «Unknown wilds» или «Adventurer», поэтому панель продолжает отображаться и не вызывает ошибку.

Что сообщает проверка /fb

/fb probe выводит в одной строке сборку, интерфейс и WOW_PROJECT_ID, а затем добавляет «Forever reports retail», если ID равен 1. WoW Forever Builds зафиксировал то же значение на бета-сборке 69913.

Сохраненная проверка WFG от 12 октября на сборке 70338, напротив, записала ID проекта 18, а константы клиента Blizzard определяют WOW_PROJECT_CAMELOT = 18. Условное сообщение Beacon "Forever reports retail" при этом значении не появится; условие лишь подписывает диагностический вывод и не мешает загрузке аддона. Beacon по-прежнему записывает исходный ID.Источник: константы проекта Camelot от Blizzard, сохраненное извлечение 70338 изучено 13 окт. 2026; отдельная проверка WFG записана 12 окт.. Зеркало может показывать более позднюю сборку.

Для определения клиента в общем аддоне сравните WOW_PROJECT_ID с WOW_PROJECT_CAMELOT, если эта константа существует, затем проверьте API нужной функции. Гайд по шаблонам аддонов показывает пример, сверенный с источниками. Пример сохраненной вики с WOW_PROJECT_MAINLINE и LE_EXPANSION_LEVEL_CURRENT == LE_EXPANSION_CLASSIC относится к прошлому и не соответствует записанному клиенту 70338; вариант с метаданными TOC X-Game — отдельный подход. Загружаемый образец Beacon остается непроверенным примером аддона, а не той отдельной проверкой в игре.

Этап поиска заклинания

Проверка вызывает C_Spell.GetSpellInfo(8690), где 8690 — ID заклинания Камня возвращения. Этот вызов с пространством имен возвращает одну таблицу spellInfo. Старая глобальная функция GetSpellInfo возвращает отдельные значения — именно так код Classic считывает их.Источник: C_Spell.GetSpellInfo, проверено 28 сент. 2026.

В вики описан возврат nil, если заклинание не найдено. Beacon воспринимает nil как «еще не в кэше», вызывает C_Spell.RequestLoadSpellData и выводит ответ через SPELL_DATA_LOAD_RESULT. Вики предупреждает, что это событие может сообщить об ошибке, если получены лишь частичные данные, поэтому строка «load failed» не всегда означает, что заклинание отсутствует.

Как загружаются SavedVariables и почему заметки могут пропасть

Клиент загружает FrameXML, затем код аддонов, затем сохраненные переменные каждого аддона и вызывает ADDON_LOADED после того, как переменные этого аддона загружены.Источник: Saving variables between game sessions, проверено 28 сент. 2026. PLAYER_LOGIN вызывается после загрузки всех аддонов.

Значение по умолчанию, заданное на уровне файла, будет заменено, когда поступит сохраненное значение. Beacon избегает этого: он не трогает ForeverBeaconDB до вызова ADDON_LOADED, а затем заполняет только отсутствующие в сохраненной таблице ключи.

Как выглядела ошибка беты

В теме на форуме Blizzard, созданной 21 сент. 2026, сообщалось, что сохраненные данные правильно записывались на диск, но при следующем входе оказывались пустыми. Другие авторы аддонов подтвердили это в ту же неделю.Источник: WOWF Beta: Addon SavedVariables appear to write correctly to disk but are not restored at startup, проверено 28 сент. 2026.

В ответе от 25 сент. 2026 говорится, что сборка 70009 от 23 сент. снова правильно загружает сохраненные переменные. Это подтверждение одного игрока, а не заметки к патчу Blizzard; код Beacon из-за этого не менялся.

Почему панель ждет, чтобы переместиться или скрыться

InCombatLockdownимеет значение true от PLAYER_REGEN_DISABLED до момента непосредственно перед PLAYER_REGEN_ENABLED.Источник: InCombatLockdown, проверено 28 сент. 2026. В это время, как сказано в вики, блокировка запрещает перемещать защищенную рамку путем сброса ее точек привязки, хотя перемещения, инициированные игроком, разрешены.

Панель Beacon не является защищенной рамкой, поэтому эти проверки — мера предосторожности, а не требование. И /fb toggle, и щелчок по отсеку проходят через Queue, которая удерживает действие до PLAYER_REGEN_ENABLED, а затем выполняет его.

Перетаскивание отклоняется, а не ставится в очередь

OnDragStart не ставит действие в очередь. Он проверяет InCombatLockdown и просто игнорирует перетаскивание, хотя вики разрешает перемещения, инициированные игроком. Перетащите панель после боя — и OnDragStop сохранит новое положение.

Запись в отсеке аддонов: пока не подтверждена

Beacon регистрируется через три поля TOC: AddonCompartmentFunc, AddonCompartmentFuncOnEnter и AddonCompartmentFuncOnLeave. В вики это называется автоматической регистрацией: клиент сам вызывает указанные глобальные функции, без вызоваИсточник: Addon compartment, проверено 28 сент. 2026. RegisterAddon. В гайде по шаблонам кода есть такая же заготовка.

Обработчик щелчка переключает ns.db.enabled и показывает или скрывает панель через Queue. Обработчики наведения только отображают подсказку. В клиенте Forever это пока не подтверждено.

Чего этот аддон не пытается делать

Beacon никогда не вызывает CombatLogGetCurrentEventInfo. В заметках Warcraft Forever сообщается, что эта функция недоступна в данном клиенте, а дружественный UnitHealth приходит как секретное число.Источник: Addons, проверено 28 сент. 2026.

Он также не задает защищенные атрибуты и не вызывает защищенные функции, например ChatFrame_OpenChat. В тех же заметках сказано, что заблокированный защищенный вызов не вызывает ошибки Lua, даже внутри pcall. Единственные признаки — «Interface action failed because of an AddOn» и счетчик в панели AddOns, который сбрасывается только при полном перезапуске клиента. В гайде по подводным камням аддонов разобраны эти ловушки.

Что происходит с большими аддонами

Beacon намеренно остается небольшим. Бесплатный аддон-гайд RestedXP крупнее и уже включает контент для Forever: в релизе от 25 сент. 2026, v4.11.10, перечислены обновления маршрутов Forever для Мулгора, Дуротара и Красногорья. В заметках к v4.11.8 от 22 сент. сказано, что гайды Forever переведены на тег #forever — один из способов отделить контент Forever в общей кодовой базе.Источник: RXPGuides releases on GitHub, проверено 28 сент. 2026.

Релиз RestedXP RXPGuides на GitHub v4.11.10 от 25 сентября 2026 со списком обновлений для Красногорья, Степей, Мулгора и Дуротара в Forever
Поделиться изображением: релиз RestedXP RXPGuides на GitHub v4.11.10 от 25 сентября 2026 со списком обновлений для Красногорья, Степей, Мулгора и Дуротара в Forever

В заметках к релизу RestedXP v4.11.10 от 2026-09-25 перечислены обновления Forever для Красногорья, Степей, Мулгора и Дуротара.Источник: RXPGuides releases on GitHub, v4.11.10, снимок от 30 сент. 2026.

Ключевые факты

  • Интерфейс TOC Изменено16001 в строке Forever Beta таблицы TOC на Warcraft Wiki; проверьте командой /dump select(4, GetBuildInfo())Classic: в той же таблице у Classic Era указано 11509.
  • Health bar without math New in ForeverFeeds UnitHealth to a StatusBar without math; names pass through issecretvalue
  • Тест в клиентеЭтот сайт не запускал Beacon в клиенте Forever
  • Отсек аддонов Новое в ForeverПоля TOC описаны для Mainline; здесь их еще не проверяли в клиенте Forever

Источники

  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