Ошибки аддонов WoW Forever: ошибки ИИ — 12, ловушки беты — 4
Модели копируют номера интерфейса 120001 или 11503, хотя вики указывает 16001, и выполняют арифметические действия с UnitHealth, которое вернуло секретное число в сборке 69913.
Спросите нашего потного ИИ-задрота о подводных камнях аддонов
Номера интерфейса, арифметика с секретными значениями здоровья, WOW_PROJECT_ID, пробелы журнала боя, звуковые ловушки беты и другое
Всё, что охватывают наши гайды. Ответы берутся с этой страницы и из остальных гайдов, с реальными значениями на графиках и ссылками на разделы гайдов. Это ИИ, поэтому проверяйте источник, прежде чем цитировать.
These are mistakes a model can make when a WoW addon prompt does not name the Forever client. Each pairs the line it may emit with the line to write instead. Porting from Retail or another client? Check each API against your target build before shipping.
- Неверный номер интерфейса
- 16001
- Арифметика с секретным здоровьем
- h + 1 не работает
- WOW_PROJECT_ID
- 18 (Camelot)
- Боевой журнал
- Reported unavailable
Этот разбор входит в гайд разработчика аддонов WoW Forever. Чтобы понять, почему возникают эти ошибки, прочитайте шаблоны аддонов WoW Forever и шпаргалку по API Forever. Большинства ошибок можно избежать с помощью готовых промптов для ИИ.
Двенадцать ошибок
01. Выпуск аддона с номером интерфейса 120001 или 11503
Модели копируют руководства для Midnight или шаблоны Classic. В Warcraft Wiki указан номер 16001 для беты Forever. Из-за другого номера клиент, на котором вы тестируете аддон, может пометить его как устаревший.

content.zygorguides.com/support/manual/enabling.## Interface: 120001## Interface: 1600102. Ветвление по WOW_PROJECT_ID
В сборке 1.60.1.69913 WOW_PROJECT_ID, по сообщениям, возвращал 1, значение Mainline. Сохраненная проверка от 12 октября на сборке 70338, напротив, записала 18, совпадающее с константой Blizzard WOW_PROJECT_CAMELOT. Ветка только для Classic пропускает Forever; универсальная ветка может принять ее за другой клиент. Сравните именованную константу, затем проверьте API нужной функции.Источник: константы проекта Camelot от Blizzard, сохраненное извлечение 70338 изучено 13 окт. 2026; проверка WFG записана 12 окт.. Зеркало может показывать более позднюю сборку.
if WOW_PROJECT_ID ~= WOW_PROJECT_MAINLINE then
-- Assumes every non-Mainline client is Classic; 70338 Forever enters here.
endlocal isForever = WOW_PROJECT_CAMELOT ~= nil
and WOW_PROJECT_ID == WOW_PROJECT_CAMELOT
if isForever then
ns:UseForeverPath()
-- Only a feature that reads the preset needs this capability.
local canReadPreset = C_GameRules
and type(C_GameRules.GetForeverExperiencePreset) == "function"
if canReadPreset then
local preset = C_GameRules.GetForeverExperiencePreset()
-- Use preset for your optional preset-specific feature.
end
endПрежний пример Warcraft Wiki сочетал WOW_PROJECT_MAINLINE с LE_EXPANSION_LEVEL_CURRENT == LE_EXPANSION_CLASSIC. Первое условие ложно в записанном клиенте 70338. Переработанный фрагмент сверен с источниками, но не проверен в игре; ns:UseForeverPath() обозначает код вашего аддона.
03. Прибавление единицы к UnitHealth
В тесте в сборке 69913 type(UnitHealth("player")) выводит number, но h + 1 не срабатывает. WoW Forever Builds зафиксировала в Grid2 ошибку «attempt to perform arithmetic on a secret number value».
local h = UnitHealth("player")
local pct = h / UnitHealthMax("player")local bar = ns.healthBar
bar:SetMinMaxValues(0, UnitHealthMax("player"))
bar:SetValue(UnitHealth("player"))This example is not tested in game; check that both setters accept the value on your build.
04. Вывод имени, которое может быть секретным
Warcraft Forever сообщает, что имена юнитов и существ могут быть секретными строками. Также говорится, что попытка вывести такое имя вызывает ошибку и может очистить рамку. Сначала проверьте его, а если не получится — используйте выбранное вами значение по умолчанию.
print("Hello " .. UnitName("player"))local name = UnitName("player")
if type(issecretvalue) == "function" and issecretvalue(name) then
name = "adventurer"
end
print("Hello " .. name)05. GetSpellInfo и GetItemInfo
В сборке 69913 отсутствовали обе функции, а также GetSpellBookItemName и старые глобальные переменные талантов. C_Spell.GetSpellInfo возвращает одну таблицу. C_Item.GetItemInfo возвращает тот же список значений, что и старая глобальная функция.
local name, _, icon = GetSpellInfo(8690)local info = C_Spell.GetSpellInfo(8690)
if not info then
C_Spell.RequestLoadSpellData(8690)
return
end
local name, icon = info.name, info.iconID06. Скромно замаскированный измеритель урона
В Midnight регистрация события журнала боя вызывает ошибку. Тестировщики сообщают, что в Forever оно недоступно. Blizzard сообщила, что в Forever есть встроенный измеритель урона и Cooldown Manager.
frame:RegisterEvent("COMBAT_LOG_EVENT_UNFILTERED")-- Presentation only. Let the built-in meter count.
frame:RegisterUnitEvent("UNIT_HEALTH", "player")07. Каст по клику через защищенный фрагмент
В сборке 69913 защищенные фрагменты не удалось скомпилировать. Даже если в более поздней сборке это исправят, Warcraft Forever указывает, что защищенные атрибуты рамок юнитов Blizzard остаются защищенными, а pcall не устранит сбой.
SecureHandlerWrapScript(button, "OnClick", button, [[
self:SetAttribute("type", "spell")
]])-- Own button, plain script, no secure attribute
-- on a Blizzard unit frame.
button:SetScript("OnClick", function()
-- open your panel, do not cast for the player
end)08. SavedVariables на уровне файла
Во время загрузки файла SavedVariables еще nil. Клиент загружает сохраненные данные после выполнения ваших файлов и заменяет все, что было задано в них. Значение по умолчанию в начале файла будет либо перезаписано, либо прочитано слишком рано. Игроки также сообщали о потере бета-версией сохраненных данных между сеансами до сборки 70009.
MyAddonDB = MyAddonDB or { enabled = true }function events:ADDON_LOADED(loaded)
if loaded ~= addonName then return end
MyAddonDB = MyAddonDB or {}
if MyAddonDB.enabled == nil then
MyAddonDB.enabled = true
end
ns.db = MyAddonDB
endПолный цикл описан в шаблоне SavedVariables.
09. Отмена C_Timer.After
After не возвращает ничего. Объект таймера создается с помощью NewTimer или NewTicker.
local t = C_Timer.After(5, func)
t:Cancel()local t = C_Timer.NewTimer(5, func)
t:Cancel()10. Защищенные вызовы, скрытые в Pcall
Warcraft Forever сообщает, что ChatFrame_OpenChat, C_SuperTrack.SetSuperTrackedUserWaypoint и защищенные атрибуты рамок Blizzard не срабатывают, не вызывая ошибки Lua. Единственный признак — счетчик действий интерфейса, который /reload не сбрасывает.
pcall(C_SuperTrack.SetSuperTrackedUserWaypoint, true)local point = UiMapPoint.CreateFromCoordinates(uiMapID, x, y)
C_Map.SetUserWaypoint(point)C_Map.SetUserWaypoint places the pin; the wiki documents C_SuperTrack.SetSuperTrackedUserWaypoint as the separate call that tracks it. Warcraft Forever's page, captured September 28, lists that call as protected but names no client build, so retest on yours.
11. Ошибочные проверки фракции
Warcraft Forever reports that UnitIsEnemy and UnitCanAttack mean "attackable right now" on this client, not "other faction": both answer false for an unflagged enemy, in a sanctuary or on another shard. Its secret-value list names UnitCanAttack, not UnitIsEnemy, as a secret boolean. The report names no build, so retest on yours.
if UnitIsEnemy("player", unit) thenlocal them = UnitFactionGroup(unit)
local mine = UnitFactionGroup("player")
if them and mine and them ~= mine then12. Команды чата, которые не регистрируются
Глобальная переменная должна быть SLASH_NAME1, а ключ SlashCmdList должен совпадать с NAME символ в символ. Локальная переменная или несовпадающий ключ не зарегистрируют команду.
local SLASH_fb1 = "/fb"
SlashCmdList.fb = function() endSLASH_FOREVERBEACON1 = "/fb"
SlashCmdList["FOREVERBEACON"] = function(msg)
endПолные примеры безопасных панелей, очередей в бою и меню аддонов смотрите в шаблонах кода.
Еще четыре ловушки из беты
Первые двенадцать охватывают самые серьезные сбои. Эти четыре менее значительны. Ловушки 13 и 14 — неподтвержденные сообщения сообщества о бете от Warcraft Forever. Ловушки 15 и 16 взяты со страниц API Mainline в Warcraft Wiki — именно на этом семействе интерфейсов работает Forever. На сборке Forever их повторно не проверяли.
13. Воспроизведение звукового файла способом из Classic
Warcraft Forever сообщает, что PlaySoundFile с путем Sound\Interface\*.ogg в этом клиенте не срабатывает без сообщения об ошибке. Ошибка не возникает, ничего не выводится, звук не проигрывается.
PlaySoundFile("Sound\\Interface\\LevelUp.ogg")-- Warcraft Wiki, PlaySound: play by SoundKitID, not a file path.
PlaySound(SOUNDKIT.READY_CHECK)На странице PlaySound вики описано воспроизведение по SoundKitID или ключу SOUNDKIT. Warcraft Forever также советует проверить общую громкость, прежде чем винить аддон.
14. Доверие к индикатору сразу после появления
Warcraft Forever сообщает, что NAME_PLATE_UNIT_ADDED срабатывает до заполнения данных юнита, а у рамок индикаторов в этом клиенте нет namePlateUnitToken. При чтении юнита в том же обработчике полезные данные еще не доступны.
frame:SetScript("OnEvent", function(self, event, unit)
self.name:SetText(UnitName(unit))
end)frame:SetScript("OnEvent", function(self, event, unit)
C_Timer.After(0, function()
self.name:SetText(UnitName(unit))
end)
end)
-- Or sweep nameplate1..nameplate40 yourself a moment later.15. Предположение, что при сбое поиска метаданных не будет ошибки
The wiki says C_AddOns.GetAddOnMetadata, unlike the old global, raises an "Invalid AddOn name" error when the addon does not exist. A model that ports the old call and keeps its nil check would stop the file on a missing optional dependency. Test the guarded pattern below on your Forever build.
local ver = C_AddOns.GetAddOnMetadata("SomeOtherAddon", "Version")
if not ver then return endlocal ok, ver = pcall(C_AddOns.GetAddOnMetadata, "SomeOtherAddon", "Version")
if not ok or not ver then return end16. Подключение панели настроек через старые глобальные функции
Вики указывает, что Settings API был переработан в патче 10.0.0, а дополнительные изменения, нарушающие совместимость, появились в 11.0.2. Согласно описанному там шаблону, категория регистрируется и открывается через Settings, а не через старую InterfaceOptionsFrame_OpenToCategory из шаблонов Classic Era.
InterfaceOptionsFrame_OpenToCategory(MyAddonOptionsPanel)local category = Settings.RegisterVerticalLayoutCategory("My Addon")
Settings.RegisterAddOnCategory(category)
-- Later, from a slash command:
Settings.OpenToCategory(category:GetID())Зарегистрируйте категорию один раз при загрузке, затем открывайте ее через команду чата или запись в меню аддонов, как в образце аддона Forever Beacon.
Почему модели по умолчанию допускают эти ошибки
These examples show a risk, not a measured error rate. Without the target client named, a model asked for a health bar may reach for arithmetic, and one asked for options may call a panel API from an older interface.
Исправление — в контексте, а не в более хитром промпте. Укажите модели номер интерфейса, ID проекта и API, о которых сообщается в бете, и начните с шаблонов промптов для аддонов Forever.
Устоявшиеся аддоны адаптируются так же — через тестирование в бете. В релизах GitHub бесплатного аддона-гайда RestedXP до сентября 2026 года включительно выходили исправления маршрутов для Forever, а Zygor Guides сообщает, что гайды для Forever станут доступны подписчикам Elite на старте.

Проверка исправления перед выпуском
Нет гарантии, что любое из этих шестнадцати исправлений продолжит работать в следующей сборке беты. Повторно проверьте каждое в используемой вами сборке.
Start with /run print(select(2, GetBuildInfo()), select(4, GetBuildInfo())), which prints the build and the interface number. Then run WoW Forever Builds' health test from trap 03: /run local h = UnitHealth("player"); print(type(h), pcall(function() return h + 1 end)). On build 69913 it printed number false: pcall caught an error, so the addition was refused. If it prints true, that read is no longer secret on your build. That result covers only this test; test the status bar example separately.
Ловушку 08 проверьте, полностью выйдя из игры и войдя снова, а не просто используя /reload. Убедитесь, что сохраненная таблица не пропала. Игроки сообщали об ошибке восстановления SavedVariables начиная с 21 сент. 2026; 25 сент. один игрок написал, что сборка 70009 ее исправила. Blizzard исправление не подтверждала.
Проверьте ловушку 11 на игроке-противнике без флага PvP, в безопасной зоне или на другом шарде. Warcraft Forever сообщает, что там UnitIsEnemy и UnitCanAttack возвращают false.
Для защищенных вызовов в ловушках 07 и 10 следите за счетчиком действий интерфейса на панели AddOns, а не за возвращаемым значением pcall. /reload не сбрасывает этот счетчик, поэтому перезапустите клиент перед повторной проверкой: старое значение может создать впечатление, что исправление не работает.
Записывайте номер сборки рядом с каждым исправлением, на которое полагаетесь, как это сделано в шпаргалке по API со строками, проверенными в сборке 69913. Исправление, работавшее в одной сборке, может перестать работать в следующей.
Ключевые факты
- Неверный номер интерфейса ИзмененоМодели копируют 120001 или 11503; в вики для беты Forever указан номер 16001
- Арифметика с секретным здоровьем Измененоtype() сообщает number, но h + 1 завершается ошибкой; pcall возвращает false вместо суммы
- WOW_PROJECT_ID Изменен18 (WOW_PROJECT_CAMELOT) в проверке WFG от 12 октября на сборке 70338; прежняя сборка 69913, по сообщениям, возвращала 1Classic: Classic Era возвращает 2 (WOW_PROJECT_CLASSIC).
- Журнал боя УдаленоРегистрация COMBAT_LOG_EVENT_UNFILTERED вызывает ошибки в Midnight; сообщается, что в Forever он недоступен
Источники
- What the WoW Forever beta breaks for addons: secret health values, dead secure snippets, new APIsWoW Forever Builds
- AddonsWarcraft Forever
- TOC formatWarcraft Wiki
- Secret ValuesWarcraft Wiki
- Patch 12.0.0/API changesWarcraft Wiki
- C_Item.GetItemInfoWarcraft Wiki
- Saving variables between game sessionsWarcraft Wiki
- WOWF Beta: Addon SavedVariables appear to write correctly to disk but are not restored at startupWorld of Warcraft Forums (player bug report)
- C_Map.SetUserWaypointWarcraft Wiki
- C_AddOns.GetAddOnMetadataWarcraft Wiki
- Settings APIWarcraft Wiki
- PlaySoundWarcraft Wiki
- RXPGuides releasesRestedXP (GitHub)
- Zygor's World of Warcraft Forever guides launching this NovemberZygor Guides
- Blizzard client source: ProjectConstants.lua (retained build 70338; mirror may change)Blizzard Entertainment (source mirrored by Gethe)
