Шпаргалка по API аддонов WoW Forever для интерфейса 16001
GetSpellInfo и GetItemInfo отсутствовали в сборке беты 69913, поэтому используйте вызовы C_Spell и C_Item. События заменяют боевой журнал, который, как сообщается, недоступен аддонам.
Спросите нашего потного ИИ-задрота об API аддонов
Вызовы C_Spell, секретные значения, события журнала боя, TOC Interface 16001, Settings API и другое
Всё, что охватывают наши гайды. Ответы берутся с этой страницы и из остальных гайдов, с реальными значениями на графиках и ссылками на разделы гайдов. Это ИИ, поэтому проверяйте источник, прежде чем цитировать.
Это краткий справочник по API эпохи 12.1.5 применительно к WoW: Forever. Более ранние наблюдения указывают сборку беты 1.60.1.69913. Примеры игровых правил, звуков и определения клиента сверены с сохраненными файлами клиента Blizzard из сборки 1.60.1.70338. Остальные примеры следуют документации Mainline на Warcraft Wiki. Автор не проверял ни один из них в игре.
- Интерфейс TOC
- 16001
- Старые глобальные функции заклинаний и предметов
- C_Spell, C_Item
- Боевой журнал
- Недоступно
- Семейство API
- Mainline 12.1.5
Эта справка входит в гайд для разработчиков аддонов WoW Forever. Архитектура клиента и секретные значения описаны в статье о принципах разработки аддонов WoW Forever. О типичных ошибках моделей при использовании этих вызовов читайте в статье о распространенных ошибках ИИ при создании аддонов.
Дополнения от 13 октября ссылаются на сохраненное извлечение клиента 70338. Зеркала исходного кода по ссылкам могут показывать более позднюю сборку.
Исчезнувшие глобальные функции
WoW Forever Builds обнаружил отсутствие этих глобальных функций эпохи Classic в сборке 69913. Модели, обученные на старом коде, продолжают их использовать:
| ИИ напишет | Используйте вместо этого | Примечания |
|---|---|---|
GetSpellInfo(id) | C_Spell.GetSpellInfo(id) | Возвращает одну таблицу (name, iconID, castTime и другие значения). Если заклинание не найдено, nil. |
GetItemInfo(id) | C_Item.GetItemInfo(id) | Возвращает тот же список значений, что и старая глобальная функция. nil, пока данные не закэшированы. |
GetSpellBookItemName | C_SpellBook.GetSpellBookItemName | Старая глобальная функция книги заклинаний отсутствовала в сборке 69913. |
GetTalentInfo / GetNumTalentTabs | C_Traits | WoW Forever Builds: таланты работают на системе Trait. |
GetAddOnMetadata(name, field) | C_AddOns.GetAddOnMetadata | Такой же перенос в пространство имен, как в Mainline. |
CombatLogGetCurrentEventInfo() | No verified replacement here | Reported unavailable. Test on your build before you drop the feature. |
Заклинания и предметы
Поиск может не вернуть результат. C_Spell.GetSpellInfo или C_Item.GetItemInfo для записи, которую клиент еще не загрузил, могут вернуть nil.
local info = C_Spell.GetSpellInfo(spellID)
if not info then
C_Spell.RequestLoadSpellData(spellID)
return
end
-- A field can still be secret. Guard before you print it.
local itemName, itemLink = C_Item.GetItemInfo(itemID)
if not itemName then
C_Item.RequestLoadItemDataByID(itemID)
return
endListen for SPELL_DATA_LOAD_RESULT (spellID, success) and ITEM_DATA_LOAD_RESULT (itemID, success). A nil can mean the record has not loaded or was not found. If the load event returns success false, treat the ID as not found.
Юниты и секретные значения
Blizzard сообщила, что на Forever действуют секретные значения Midnight. Арифметические операции с секретным значением и сравнение с ним вызывают ошибку:
| Вызов | Может быть секретным | Безопасное использование |
|---|---|---|
UnitHealth / UnitHealthMax | Да, число | StatusBar:SetMinMaxValues и StatusBar:SetValue |
UnitName / названия существ | Да, строка | Показывайте только после того, как issecretvalue станет false |
UnitCanAttack / UnitExists | Да, логическое значение | Не используйте значение в условии, пока проверка не подтвердит, что оно обычное. |
UnitIsEnemy | Часто это не тот вопрос | Означает, что цель можно атаковать сейчас, а не то, что она из другой фракции |
UnitFactionGroup | Проверьте перед сравнением | them ~= mine это проверка фракции |
Столбец «Может быть секретным» для названий и логических значений основан на заметках беты Warcraft Forever. Данные о здоровье получены из тестов WoW Forever Builds. Выполните эту проверку перед тем, как использовать значение в условии или показывать его:
local function Sealed(value)
return type(issecretvalue) == "function" and issecretvalue(value)
endВ шаблонах кода и примере Forever Beacon есть примеры индикаторов состояния с проверкой. Проверьте их на текущей сборке.
События вместо боевого журнала
В Midnight регистрация COMBAT_LOG_EVENT_UNFILTERED вызывает ошибку (Warcraft Wiki, изменения API в патче 12.0.0). Warcraft Forever сообщает, что на Forever чтение боевого журнала недоступно. Вместо этого регистрируйте события юнитов:
| Вы хотели | Зарегистрируйте |
|---|---|
| Здоровье игрока | RegisterUnitEvent("UNIT_HEALTH", "player") |
| Ресурс | UNIT_POWER_UPDATE |
| Начало или завершение применения заклинания | UNIT_SPELLCAST_START, _STOP, _SUCCEEDED, _FAILED, _INTERRUPTED |
| Ауры | Пусть ауры отображаются во фреймах Blizzard. UNIT_AURA не дает права читать данные аур в бою. |
| Начало и завершение боя | PLAYER_REGEN_DISABLED и PLAYER_REGEN_ENABLED |
| Начало боя с боссом | ENCOUNTER_START и ENCOUNTER_END, если они срабатывают в этом бою |
| Смена зоны | ZONE_CHANGED_NEW_AREA, PLAYER_ENTERING_WORLD |

Фреймы, время и чат
Фреймы, которым нужен фон, наследуют BackdropTemplate. Для таймеров используйте C_Timer:
local f = CreateFrame("Frame", nil, UIParent, "BackdropTemplate")
f:SetSize(240, 48)
f:SetPoint("CENTER")
f:SetScript("OnEvent", function(self, event, ...) end)
C_Timer.NewTimer(2, function() end) -- cancellable
C_Timer.After(2, function() end) -- returns nothing
SLASH_MYADDON1 = "/myaddon"
SlashCmdList["MYADDON"] = function(msg) end
DEFAULT_CHAT_FRAME:AddMessage(text, 0.83, 0.66, 0.35)Порядок параметров SetTexCoord
SetTexCoord принимает left, right, top, bottom, а не left, top, right, bottom. Передавайте доли от 0 до 1, а не пиксели.
Вызовы, которые не срабатывают без сообщения об ошибке
Warcraft Forever's page, captured September 28, lists these calls as protected on the Forever beta but names no client build:
| Не используйте | Применение |
|---|---|
ChatFrame_OpenChat / ChatEdit_ActivateChat | Оставьте редактирование чата клиенту; для ссылок по Shift + щелчку используйте HandleModifiedItemClick |
C_SuperTrack.SetSuperTrackedUserWaypoint | C_Map.SetUserWaypoint с элементом UiMapPoint |
| Защищенные атрибуты на фреймах юнитов Blizzard | Собственные кнопки |
PlaySoundFile на Sound\Interface\*.ogg | PlaySound с идентификатором SOUNDKIT |
pcall around a blocked action | Nothing; pcall does not unblock it |
Важные поля TOC
В аддоне только для Forever в бете укажите интерфейс 16001:
## Interface: 16001
## Title: My Addon
## Notes: What it does in one line
## Author: YourName
## Version: 0.1.0
## SavedVariables: MyAddonDB
## SavedVariablesPerCharacter: MyAddonCharDB
## IconTexture: Interface\Icons\INV_Misc_Note_01
## Category: Miscellaneous
## AddonCompartmentFunc: MyAddon_OnCompartmentClickОбратные вызовы раздела аддонов должны быть настоящими глобальными функциями, поскольку клиент находит их по имени. Все остальное в файлах объявляйте как локальные переменные на уровне файла. Имена SavedVariables тоже глобальные. Клиент загружает их после выполнения файлов, а затем вызывает ADDON_LOADED для вашего аддона.
API настроек
API настроек заменил старую панель параметров интерфейса и входит в код Mainline, которым пользуется Forever. Если нужны только флажки и ползунки, выберите его вместо собственного окна параметров. Если создаете собственное окно, наследуйте BackdropTemplate, сохраняйте положение при завершении перетаскивания и не перемещайте защищенные фреймы во время блокировки в бою.
InterfaceOptions_AddCategory это старый вызов настроек, который модели все еще часто используют. Вместо него запросите API настроек.
Выбор современного API вместо Classic
Во время сессии вопросов и ответов с разработчиками 17 сентября разработчика спросили, будет ли Forever использовать ограничения для аддонов из Midnight, API Classic или что-то другое. Он ответил: «we did opt for the modern API approach.» («мы все же выбрали современный подход к API»). Подтверждено записью World of Warcraft Developer Q&A на отметке 01:20:52.
По сообщению Wowhead об объявлении Blizzard в Discord для интерфейса WoW, те же изменения API "caused WeakAuras to stop development before Midnight and almost every addon to update." («привели к остановке разработки WeakAuras перед Midnight и заставили обновиться почти все аддоны»). Сообщается. При переносе начните со сборки аддона для Midnight, в которой эти правила уже учтены, а не с ветки Classic Era. Так делают и крупные проекты: в CurseForge для аддона с гайдами RestedXP указан файл «WoW Forever».
Что Blizzard встроила вместо этого
Во время того же стрима участники панели сказали, что в Forever есть собственный счетчик урона и Cooldown Manager. Подтверждено для обоих. Таймер взмахов упомянули только как возможное будущее дополнение. Прежде чем выпускать дубликат, проверьте, не выполняет ли встроенная панель нужную задачу.
Определение Forever из собственного кода
Проверка вида if WOW_PROJECT_ID == WOW_PROJECT_CLASSIC then не определит эту игру. В более раннем тесте WoW Forever Builds на сборке 69913 сообщалось о 1, том же значении, что у WOW_PROJECT_MAINLINE. Сохраненная проверка в игре на сборке 70338 от 12 октября, напротив, записала WOW_PROJECT_ID = 18, WOW_PROJECT_MAINLINE = 1 и WOW_PROJECT_CLASSIC = 2. Константы проекта Camelot от Blizzard задают WOW_PROJECT_CAMELOT = 18. Сообщается о наблюдении в клиенте: прежнее число относится к прошлому и не является текущим правилом определения.Источник: константы проекта Camelot от Blizzard, изучены в сохраненных файлах клиента 70338 13 окт. 2026; проверка в игре записана 12 окт..
Для аддона, работающего в нескольких клиентах, сравните именованную константу, если она существует, затем проверьте конкретный API, нужный вашей функции. Аддон только для Forever может работать непосредственно с Forever:
local isForever = WOW_PROJECT_CAMELOT ~= nil
and WOW_PROJECT_ID == WOW_PROJECT_CAMELOT
local canReadPreset = C_GameRules
and type(C_GameRules.GetForeverExperiencePreset) == "function"
if isForever and canReadPreset then
-- Read the preset; do not infer combat permissions from a project ID.
endНа той же странице приведен еще один способ — через TOC: объявите ## X-Family: [Family] и ## X-Game: [Game], а затем прочитайте их с помощью C_AddOns.GetAddOnMetadata. В примере Wiki сочетание семейства Mainline и игры Camelot означает Forever.
<details><summary>Технические примечания: прежние примеры определения клиента</summary>
Сохраненный пример Warcraft Wiki за сентября сочетал WOW_PROJECT_MAINLINE с LE_EXPANSION_LEVEL_CURRENT == LE_EXPANSION_CLASSIC и называл эту ветку "camelot/forever." Это условие ID проекта Mainline ложно в записанном клиенте 70338. Архитектура интерфейса Mainline не означает ID проекта Mainline. Библиотека, загружаемая только в Classic, молча не загрузится, и никакая ошибка не объяснит причину.
</details>
Получите текущие игровые правила через API интерфейса
Для запросов о режиме игры используйте C_GameRules. Текущие игровые правила — другой вопрос, чем ID проекта клиента, флаг Hardcore или выбранный игроком вариант Classic/Modern. Выбирайте значение, которое действительно нужно вашей функции:
| Что нужно | Что читать | Результат в документации 70338 |
|---|---|---|
| Запись текущего режима игры | C_GameRules.GetCurrentGameModeRecordID() | Числовой ID записи; соответствие ID Forever здесь не установлено |
| Активный режим игры | C_GameRules.GetActiveGameMode() | GameMode Значение перечисления |
| Действуют правила Hardcore | C_GameRules.IsHardcoreActive() | Логическое значение |
| Конкретное игровое правило | C_GameRules.IsGameRuleActive(gameRule) | Логическое значение; передайте документированное значение GameRule |
| Вариант игры Classic/Modern | C_GameRules.GetForeverExperiencePreset() | Enum.ForeverExperiencePreset, или nil |
| Правила канала чата | C_ChatInfo.GetChannelRuleset(channelIndex) | Enum.ChatChannelRuleset; не игровые правила |
Эти сигнатуры приведены в сгенерированной документации клиента Blizzard; их не угадали по руководствам для Classic.Источник: документация GameRules от Blizzard и документация ChatInfo, сохраненная сборка клиента 70338, изучено 13 окт. 2026.
Для быстрой диагностики после входа в мир введите /dump C_GameRules.GetCurrentGameModeRecordID(). Чтобы прочитать выбранный вариант игры Forever из кода аддона:
local function ReadExperiencePreset()
if not C_GameRules
or type(C_GameRules.GetForeverExperiencePreset) ~= "function" then
return "API unavailable"
end
local preset = C_GameRules.GetForeverExperiencePreset()
if preset == nil then return "Preset unavailable" end
if preset == Enum.ForeverExperiencePreset.Classic then return "Classic" end
if preset == Enum.ForeverExperiencePreset.Modern then return "Modern" end
return "Unknown preset"
end
print(ReadExperiencePreset())В перечислении Classic имеет значение 0, а Modern — 1. Этот пример читает настройку и ничего не меняет. GAME_RULES_CHANGED и ACTIVE_GAME_MODE_UPDATED — документированные события для обновления отображения игровых правил и активного режима. Их наличие не доказывает, что каждое изменение варианта игры вызывает одно из них. Список функций из записанной проверки включает эти функции; проверка не измеряла возвращаемые ими ID режимов игры и не запускала этот пример.
Шпаргалка по ID звуков
Для встроенного звука интерфейса используйте PlaySound(SOUNDKIT.IG_MAINMENU_OPTION_CHECKBOX_ON). SoundKitConstants.lua от Blizzard в сборке 70338 содержит следующие ID звуковых наборов:
| Звук | SOUNDKIT Ключ | ID |
|---|---|---|
| Флажок включен | IG_MAINMENU_OPTION_CHECKBOX_ON | 856 |
| Флажок выключен | IG_MAINMENU_OPTION_CHECKBOX_OFF | 857 |
| Меню открывается | IG_MAINMENU_OPEN | 850 |
| Меню закрывается | IG_MAINMENU_CLOSE | 851 |
| Вкладка персонажа | IG_CHARACTER_INFO_TAB | 841 |
| Предупреждение рейда | RAID_WARNING | 8959 |
Это ID звуковых наборов, а не заклинаний или аудиофайлов FileDataID. В файлах аддона предпочитайте именованные константы. Чтобы вручную прослушать один из звуков, введите /run PlaySound(SOUNDKIT.IG_MAINMENU_OPTION_CHECKBOX_ON). Мы изучили ID в исходном коде клиента, но не слушали эти звуки.Источник: константы звуковых наборов Blizzard, сохраненная сборка клиента 70338, изучено 13 окт. 2026.
В этой сборке Blizzard делает PlaySound псевдонимом C_Sound.PlaySound. Сгенерированная сигнатура использует UISoundSubType как второй аргумент. Пример с одним аргументом позволяет не копировать в этот клиент старую сигнатуру с каналом-строкой "Master" или "SFX". Отсутствие звука при прослушивании может быть связано с настройками; не включайте звук игрока и не увеличивайте громкость автоматически.Источник: Sound.lua от Blizzard и документация Sound API, сохраненная сборка клиента 70338, изучено 13 окт. 2026.
Функции с несколькими операциями, псевдонимы команд через косую черту, локальную команду сообщения и всплывающее сообщение ищите в практических шаблонах кода.
Почему защищенные фрагменты кода могут не компилироваться
WoW Forever Builds обнаружил еще одну поломку в собственном коде Blizzard с ограниченным выполнением. RestrictedExecution.lua вызывает функцию движка loadstring_untainted, которой нет в сборке 69913. /run print(type(loadstring_untainted)) выводит nil, и все защищенные фрагменты кода завершаются ошибкой вызова nil. Сообщается. По мнению WoW Forever Builds, дело не в политике ограничений, а в недостающей части: код Blizzard ожидает эту функцию.
Аддоны используют защищенные фрагменты для действий, безопасных в бою: переключения страниц панели действий, защищенных заголовков групп и каста по клику. Если появляется именно эта ошибка, в вашей сборке не работает система фрагментов, а не ваш код. Проверяйте ее в каждой новой сборке.
Счетчик ошибок при выполнении действия
A protected call like ChatFrame_OpenChat does not raise a Lua error you can catch on this client, so pcall will not warn you. Warcraft Forever's page, captured September 28 with no build named, reports that the client posts "Interface action failed because of an AddOn" and bumps a counter in the AddOns panel, which clears only on a full restart, not /reload. Unverified community report. A rising counter means you should check your protected calls.
Что зараженный код может делать с секретным значением
В таблице «Юниты и секретные значения» описаны арифметические операции и сравнения. Правила Wiki охватывают больше случаев, причем некоторые операции разрешены, а некоторые — нет. Зараженный код может сохранить секретное значение в переменной, внешней локальной переменной (upvalue) или значении таблицы и передать его функциям Lua. Функции C принимают его, только если Blizzard разрешила им это. Зараженный код также может объединять секретные строки и числа и передавать их в string.format, string.concat или string.join.
Зараженный код не может выполнять арифметические операции над секретным значением, сравнивать его, применять к нему оператор длины, сохранять его как ключ таблицы, обращаться по индексу или вызывать его. Условие на истинность работает для секретной строки или числа, поскольку скрыто только значение, но не для секретного логического значения. type(secret) при этом возвращает настоящий тип. Любая запрещенная операция немедленно вызывает ошибку, поэтому проверяйте значение до ветвления.
Порядок загрузки SavedVariables и ошибка восстановления в бете
Клиент выполняет файлы аддона, затем загружает его SavedVariables и SavedVariablesPerCharacter и вызывает для него ADDON_LOADED — по одному аддону за раз. PLAYER_LOGIN вызывается после загрузки всех аддонов, не требующих загрузки по запросу. Чтобы внести последнее изменение перед записью файла, используйте PLAYER_LOGOUT — последнее событие перед сохранением.
В сообщении об ошибке на форуме Blizzard от 21 сентября показано, что настройки Soundtrack правильно записались в папку WTF, но пропали при следующем запуске. Другие авторы аддонов в теме сообщили о той же проблеме. Не подтверждено, сообщения сообщества. 25 сентября другой автор сообщил, что SavedVariables снова загружались в сборке 1.60.1.70009. Проверьте свой аддон, прежде чем полагаться на исправление.
Две ловушки при переносе, описанные в одном сообщении
Сначала перенос Soundtrack завершился ошибкой в AceDB-3,0: regionKey имел значение nil. На бете GetCurrentRegion() вернул идентификатор региона, который встроенная библиотека не распознала; после изменения AceDB для обработки неизвестных идентификаторов ошибка исчезла. Автор также разделил один флаг IsRetail на два, поскольку в Forever «использовать современный API» и «включить контент только для Retail» — разные вещи.
Моменты срабатывания событий табличек имен в клиенте беты
Warcraft Forever сообщает, что NAME_PLATE_UNIT_ADDED срабатывает до заполнения данных юнита, а у фреймов табличек имен нет namePlateUnitToken. Не подтверждено. Как сообщается, проблему можно обойти, повторно проверив юнита чуть позже или самостоятельно перебрав юнитов от nameplate1 до nameplate40.
Раздел аддонов: регистрация без полей TOC
Поля TOC выше подходят для кнопки раздела аддонов, которая никогда не меняется. Если ее значок или подпись выбираются во время выполнения, Warcraft Wiki описывает ручной вызов:
AddonCompartmentFrame:RegisterAddon({
text = "My Addon",
icon = "Interface\\Icons\\TEMP.blp",
notCheckable = true,
func = function(button, menuInputData)
print("Clicked " .. menuInputData.buttonName)
end,
})Это взято из документации Mainline, а не из теста Forever, поэтому проверьте, срабатывает ли вызов в вашей сборке. Если вы пишете код с помощью системного промпта ИИ, библиотека промптов для кода аддонов содержит эти ограничения в одном месте. Для игроков на странице аддонов, работающих в Forever указано, что еще запускается.
Ключевые факты
- Интерфейс TOC Изменено16001 в строке Forever Beta таблицы TOC на Warcraft Wiki; проверьте командой /dump select(4, GetBuildInfo())Classic: в той же таблице у Classic Era указано 11509.
- Старые глобальные функции заклинаний и предметов УдаленоGetSpellInfo и GetItemInfo отсутствуют в сборке 69913; используйте C_Spell и C_Item
- Боевой журнал УдаленоСообщается, что CombatLogGetCurrentEventInfo недоступен аддонам в бетеClassic: аддоны Classic Era читают все события через COMBAT_LOG_EVENT_UNFILTERED.
- Семейство API ИзмененоИспользует архитектуру интерфейса Mainline и "the vast majority of APIs available in 12.1.5" («подавляющее большинство API, доступных в 12.1.5»)
- Записанный ID проекта Изменен18 (WOW_PROJECT_CAMELOT) в проверке от 12 октября в игре на сборке 70338; прежние сообщения о 69913 указывали 1
Источники
- What the WoW Forever beta breaks for addons: secret health values, dead secure snippets, new APIsWoW Forever Builds
- AddonsWarcraft Forever
- WoW: Forever Will Have Addon Changes from MidnightWowhead
- TOC formatWarcraft Wiki
- C_Item.GetItemInfoWarcraft Wiki
- Secret ValuesWarcraft Wiki
- Patch 12.0.0/API changesWarcraft Wiki
- Addon compartmentWarcraft Wiki
- Saving variables between game sessionsWarcraft Wiki
- C_Map.SetUserWaypointWarcraft Wiki
- WOW_PROJECT_IDWarcraft Wiki
- World of Warcraft Developer Q&A (replay and YouTube automatic captions)World of Warcraft
- WOWF Beta: Addon SavedVariables appear to write correctly to disk but are not restored at startupBlizzard Forums
- RestedXP Guide on CurseForgeCurseForge
- Blizzard client source: ProjectConstants.lua (retained build 70338; mirror may change)Blizzard Entertainment (source mirrored by Gethe)
- Blizzard client source: GameRulesDocumentation.lua (retained build 70338; mirror may change)Blizzard Entertainment (source mirrored by Gethe)
- Blizzard client source: SoundKitConstants.lua (retained build 70338; mirror may change)Blizzard Entertainment (source mirrored by Gethe)
- Blizzard client source: Sound.lua (retained build 70338; mirror may change)Blizzard Entertainment (source mirrored by Gethe)
- Blizzard client source: SoundDocumentation.lua (retained build 70338; mirror may change)Blizzard Entertainment (source mirrored by Gethe)
- Blizzard client source: ChatInfoDocumentation.lua (retained build 70338; mirror may change)Blizzard Entertainment (source mirrored by Gethe)