Hoja de referencia de la API de addons de WoW Forever para la interfaz 16001
GetSpellInfo y GetItemInfo no estaban en la compilación 69913 de la beta, así que escribe llamadas a C_Spell y C_Item. Los eventos sustituyen al registro de combate, que se informa como no disponible para los addons.
Pregunta a nuestra IA sudorosa y degenerada sobre la API de addons
Llamadas a C_Spell, valores secretos, eventos del registro de combate, interfaz 16001 del TOC, API de Settings y más
Cualquier cosa que cubran nuestras guías. Las respuestas salen de esta página y del resto de nuestras guías, con los valores reales en gráficos y las secciones de la guía enlazadas. Es IA, así que comprueba la fuente antes de citarla.
Esta es una referencia rápida de la API de la época de 12.1.5 aplicada a WoW: Forever. Las observaciones anteriores nombran la compilación de la beta 1.60.1.69913. Los ejemplos de reglas, sonido y detección se han cotejado con los archivos conservados del cliente de Blizzard de la compilación 1.60.1.70338. Los demás ejemplos siguen la documentación Mainline de Warcraft Wiki. Este autor no ha probado ninguno en el juego.
- Interfaz TOC
- 16001
- Antiguos globales de hechizos y objetos
- C_Spell, C_Item
- Registro de combate
- No disponible
- Familia de API
- Mainline 12.1.5
Esta referencia forma parte de la guía para desarrolladores de addons de WoW Forever. Para la arquitectura del cliente y los valores secretos, lee los patrones de addons de WoW Forever. Para ver en qué fallan los modelos con estas llamadas, lee los errores habituales de la IA con los addons.
Las incorporaciones del 13 de octubre citan el extracto conservado del cliente 70338. Los espejos de las fuentes enlazadas pueden mostrar una compilación posterior.
Globales que ya no estaban
WoW Forever Builds comprobó que estos globales de la era Classic no estaban en la compilación 69913. Los modelos entrenados con código antiguo siguen escribiéndolos:
| Lo que escribirá la IA | Usa en su lugar | Notas |
|---|---|---|
GetSpellInfo(id) | C_Spell.GetSpellInfo(id) | Devuelve una sola tabla (name, iconID, castTime y más). nil si no se encuentra el hechizo. |
GetItemInfo(id) | C_Item.GetItemInfo(id) | Devuelve la misma lista de valores que el global antiguo. nil hasta que se guarde en caché. |
GetSpellBookItemName | C_SpellBook.GetSpellBookItemName | El antiguo global del libro de hechizos no estaba en 69913. |
GetTalentInfo / GetNumTalentTabs | C_Traits | WoW Forever Builds: los talentos funcionan con el sistema de rasgos. |
GetAddOnMetadata(name, field) | C_AddOns.GetAddOnMetadata | Mismo cambio de espacio de nombres que en Mainline. |
CombatLogGetCurrentEventInfo() | No verified replacement here | Reported unavailable. Test on your build before you drop the feature. |
Hechizos y objetos
Las búsquedas pueden devolver un resultado vacío. C_Spell.GetSpellInfo o C_Item.GetItemInfo sobre un registro que el cliente aún no ha cargado pueden devolver 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.
Unidades y secretos
Blizzard dijo que los valores secretos de Midnight están activos en Forever. Hacer operaciones matemáticas con un valor secreto, o compararlo, provoca un error:
| Llamada | Puede ser secreto | Uso seguro |
|---|---|---|
UnitHealth / UnitHealthMax | Sí, número | StatusBar:SetMinMaxValues y StatusBar:SetValue |
UnitName / nombres de criaturas | Sí, cadena | Muéstralo solo cuando issecretvalue sea false |
UnitCanAttack / UnitExists | Sí, booleano | No ramifiques hasta que la protección indique que es un valor normal |
UnitIsEnemy | A menudo es la pregunta equivocada | Significa que se puede atacar ahora, no que sea de la facción contraria |
UnitFactionGroup | Comprueba antes de comparar | them ~= mine es la prueba de facción |
La columna «puede ser secreto» para nombres y booleanos procede de las notas de la beta de Warcraft Forever. Salud procede de la prueba de WoW Forever Builds. Ejecuta esta protección antes de ramificar según un valor o mostrarlo:
local function Sealed(value)
return type(issecretvalue) == "function" and issecretvalue(value)
endLas plantillas de código y el ejemplo de Forever Beacon incluyen ejemplos protegidos de barras de estado. Pruébalos en tu compilación actual.
Eventos en lugar del registro de combate
En Midnight, registrar COMBAT_LOG_EVENT_UNFILTERED provoca un error (Warcraft Wiki, cambios de la API del parche 12.0.0). Warcraft Forever informa de que el lector del registro de combate no está disponible en Forever. Registra mejor eventos de unidad:
| Lo que querías | Registra |
|---|---|
| Salud del jugador | RegisterUnitEvent("UNIT_HEALTH", "player") |
| Poder | UNIT_POWER_UPDATE |
| Un lanzamiento de hechizo que empieza o termina | UNIT_SPELLCAST_START, _STOP, _SUCCEEDED, _FAILED, _INTERRUPTED |
| Auras | Deja que los marcos de auras de Blizzard las dibujen. UNIT_AURA no es una licencia para leer datos de auras en combate. |
| Entrar en combate y salir de él | PLAYER_REGEN_DISABLED y PLAYER_REGEN_ENABLED |
| Un combate contra un jefe | ENCOUNTER_START y ENCOUNTER_END, si el encuentro los dispara |
| Cambios de zona | ZONE_CHANGED_NEW_AREA, PLAYER_ENTERING_WORLD |

Marcos, tiempo y chat
Los marcos que necesitan un fondo heredan BackdropTemplate. Los temporizadores usan 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)Orden de los parámetros de SetTexCoord
SetTexCoord toma left, right, top, bottom, no left, top, right, bottom. Pasa fracciones de 0 a 1, no píxeles.
Llamadas que fallan sin avisar
Warcraft Forever's page, captured September 28, lists these calls as protected on the Forever beta but names no client build:
| Evita | Uso |
|---|---|
ChatFrame_OpenChat / ChatEdit_ActivateChat | Deja la edición del chat al cliente; usa HandleModifiedItemClick para los enlaces con Mayús + clic |
C_SuperTrack.SetSuperTrackedUserWaypoint | C_Map.SetUserWaypoint con un UiMapPoint |
| Atributos seguros en los marcos de unidad de Blizzard | Tus propios botones |
PlaySoundFile en Sound\Interface\*.ogg | PlaySound con un ID de SOUNDKIT |
pcall around a blocked action | Nothing; pcall does not unblock it |
Campos del TOC que importan aquí
Un addon solo para Forever declara la interfaz 16001 en la beta:
## 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_OnCompartmentClickLas funciones de callback del compartimento deben ser globales reales, porque el cliente las busca por nombre. Mantén todo lo demás en tus archivos como variables locales del archivo. Los nombres de SavedVariables también son globales. El cliente los carga después de ejecutar tus archivos y luego dispara ADDON_LOADED para tu addon.
Settings API
La API de Settings sustituyó al antiguo panel de opciones de la interfaz, y forma parte del código de Mainline que comparte Forever. Prefiérela a una ventana de opciones propia cuando solo necesites casillas y deslizadores. Si creas una ventana personalizada, hereda de BackdropTemplate, guarda el anclaje al terminar de arrastrar y no muevas marcos protegidos durante el bloqueo de combate.
InterfaceOptions_AddCategory es la llamada de opciones antigua, y los modelos de IA siguen recurriendo a ella. Pide en su lugar la API de Settings.
Elegir la API moderna frente a la de Classic
En las preguntas y respuestas con desarrolladores del 17 de septiembre, preguntaron a un desarrollador si Forever usaría las restricciones de addons de Midnight, la API de Classic u otra cosa, y respondió: "we did opt for the modern API approach." Confirmado, según la repetición de World of Warcraft Developer Q&A en 01:20:52.
Wowhead, que informa del anuncio de Blizzard en el Discord de WoW UI, dice que los mismos cambios de API "caused WeakAuras to stop development before Midnight and almost every addon to update." Reportado. Al portar, parte de la build de Midnight de un addon, que ya gestiona estas reglas, y no de su rama de Classic Era. Grandes proyectos ya lo hacen: el addon de guías de RestedXP lista un archivo "WoW Forever" en CurseForge.
Lo que Blizzard ha integrado
En la misma retransmisión, el panel dijo que Forever ofrece su propio medidor de daño y su propio gestor de tiempos de reutilización. Confirmado en ambos casos. Un temporizador de golpes solo se mencionó como posible incorporación posterior. Comprueba si un panel integrado ya cumple esa función antes de publicar un duplicado.
Detectar Forever desde tu propio código
Una protección escrita como if WOW_PROJECT_ID == WOW_PROJECT_CLASSIC then no detectará este juego. La prueba anterior de WoW Forever Builds en la compilación 69913 reportó 1, el mismo valor que WOW_PROJECT_MAINLINE. La sonda en vivo conservada de la compilación 70338, del 12 de octubre, registra en cambio WOW_PROJECT_ID = 18, WOW_PROJECT_MAINLINE = 1 y WOW_PROJECT_CLASSIC = 2. Las constantes de proyecto Camelot de Blizzard establecen WOW_PROJECT_CAMELOT = 18. Observación del cliente reportada: el número anterior es histórico, no una regla de detección actual.Fuente: constantes de proyecto Camelot de Blizzard, inspeccionadas en los archivos conservados del cliente 70338 el 13 oct 2026; sonda en vivo capturada el 12 oct.
Para un addon compartido, compara la constante con nombre cuando exista y después comprueba la API concreta que necesita tu función. Un addon solo para Forever puede dirigirse a Forever directamente:
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.
endLa misma página muestra otra vía, a través del TOC: declara ## X-Family: [Family] y ## X-Game: [Game], y léelos con C_AddOns.GetAddOnMetadata. En el ejemplo de la wiki, la familia Mainline con el juego Camelot significa Forever.
<details><summary>Notas técnicas: ejemplos anteriores de detección</summary>
El ejemplo de septiembre conservado de la Warcraft Wiki combinaba WOW_PROJECT_MAINLINE con LE_EXPANSION_LEVEL_CURRENT == LE_EXPANSION_CLASSIC y etiquetaba la rama como "camelot/forever." Esa condición del ID de proyecto Mainline es falsa en el cliente 70338 capturado. La arquitectura de interfaz Mainline no implica un ID de proyecto Mainline. Una biblioteca que solo se carga en Classic no se carga y no muestra ningún error que explique por qué.
</details>
Obtener las reglas actuales con la API de interfaz
Usa C_GameRules para consultar el modo de juego. Las reglas actuales no responden a la misma pregunta que el ID de proyecto del cliente, un indicador de Hardcore o la preferencia de experiencia Classic/Modern del jugador. Elige el valor que realmente necesita tu función:
| Necesitas | Lee | Resultado en la documentación de 70338 |
|---|---|---|
| Registro del modo de juego actual | C_GameRules.GetCurrentGameModeRecordID() | ID numérico del registro; aquí no se afirma ninguna correspondencia de ID para Forever |
| Modo de juego activo | C_GameRules.GetActiveGameMode() | GameMode Valor de enum |
| Regla de Hardcore activa | C_GameRules.IsHardcoreActive() | Booleano |
| Una regla de juego concreta | C_GameRules.IsGameRuleActive(gameRule) | Booleano; pasa el valor GameRule documentado |
| Preferencia de experiencia Classic/Modern | C_GameRules.GetForeverExperiencePreset() | Enum.ForeverExperiencePreset, o nil |
| Reglas del canal de chat | C_ChatInfo.GetChannelRuleset(channelIndex) | Enum.ChatChannelRuleset; no las reglas del juego |
Estas firmas aparecen en la documentación generada del cliente de Blizzard; no se han deducido de tutoriales de Classic.Fuente: documentación de GameRules de Blizzard y documentación de ChatInfo, compilación conservada del cliente 70338, inspeccionada el 13 oct 2026.
Para un diagnóstico rápido después de entrar en el mundo, escribe /dump C_GameRules.GetCurrentGameModeRecordID(). Para leer la preferencia de experiencia de Forever desde el código de un addon:
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())El enum usa Classic 0 y Modern 1. Este ejemplo lee la preferencia; no cambia nada. GAME_RULES_CHANGED y ACTIVE_GAME_MODE_UPDATED son eventos documentados para actualizar las vistas de reglas y del modo activo. Su presencia no demuestra que cada cambio de preferencia dispare alguno de los dos eventos. La lista de funciones registrada por la sonda capturada incluye estas funciones; no midió los ID de modo de juego que devolvían ni ejecutó este ejemplo.
Hoja de referencia de ID de sonidos
Usa PlaySound(SOUNDKIT.IG_MAINMENU_OPTION_CHECKBOX_ON) para un sonido integrado de la interfaz. El SoundKitConstants.lua de Blizzard de 70338 proporciona estos ID de kits de sonido:
| Sonido | SOUNDKIT Clave | ID |
|---|---|---|
| Casilla activada | IG_MAINMENU_OPTION_CHECKBOX_ON | 856 |
| Casilla desactivada | IG_MAINMENU_OPTION_CHECKBOX_OFF | 857 |
| Se abre el menú | IG_MAINMENU_OPEN | 850 |
| Se cierra el menú | IG_MAINMENU_CLOSE | 851 |
| Pestaña de personaje | IG_CHARACTER_INFO_TAB | 841 |
| Aviso de banda | RAID_WARNING | 8959 |
Son ID de kits de sonido, no ID de hechizos ni FileDataID de audio. Da preferencia a las constantes con nombre en los archivos del addon. Para escuchar uno manualmente, escribe /run PlaySound(SOUNDKIT.IG_MAINMENU_OPTION_CHECKBOX_ON). Inspeccionamos los ID en el código fuente del cliente; no escuchamos estas muestras.Fuente: constantes de kits de sonido de Blizzard, compilación conservada del cliente 70338, inspeccionada el 13 oct 2026.
En esta compilación, Blizzard define PlaySound como alias de C_Sound.PlaySound. La firma generada usa un UISoundSubType como segundo argumento. El ejemplo con un argumento evita copiar en este cliente una firma anterior con la cadena de canal "Master" o "SFX". Una muestra que no suena puede deberse a los ajustes de sonido; no actives ni subas el audio del jugador automáticamente.Fuente: Sound.lua de Blizzard y documentación de la API de Sound, compilación conservada del cliente 70338, inspeccionada el 13 oct 2026.
Para funciones con varias instrucciones, alias de comandos de barra, un comando de mensaje local y un mensaje emergente, usa las plantillas de código prácticas.
Por qué pueden fallar al compilar los fragmentos seguros
WoW Forever Builds rastreó un segundo fallo hasta el propio código de ejecución restringida de Blizzard. RestrictedExecution.lua llama a una función del motor, loadstring_untainted, y la compilación 69913 nunca la proporciona. /run print(type(loadstring_untainted)) imprime nil, y todos los fragmentos seguros fallan con un error de llamada a nil. Reportado. El medio, WoW Forever Builds, lo interpreta como una pieza que falta, no como una decisión de política, porque el código de Blizzard espera esa función.
Los addons usan fragmentos seguros para tareas aptas para el combate, como el paginado de barras de acción, las cabeceras de grupo seguras y el lanzamiento con clic. Si el tuyo lanza ese error exacto, el sistema de fragmentos no funciona en tu compilación; el fallo no es de tu código. Vuelve a probar en cada compilación nueva.
El contador de acciones fallidas
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.
Qué puede hacer aún el código contaminado con un valor secreto
La tabla «Units and secrets» cubre la aritmética y las comparaciones. Las reglas de la wiki van más allá y funcionan en ambos sentidos: algunas cosas se permiten y otras no. El código contaminado puede guardar un secreto en una variable, un upvalue o un valor de tabla, y pasarlo a funciones de Lua. Las funciones de C solo lo aceptan cuando Blizzard las marca para ello. El código contaminado también puede concatenar cadenas y números secretos, y pasarlos a string.format, string.concat o string.join.
El código contaminado no puede hacer aritmética con un secreto, compararlo, usar el operador de longitud sobre él, guardarlo como clave de tabla, indexarlo ni llamarlo. Una prueba de veracidad funciona con una cadena o un número secretos, ya que solo se oculta el valor, pero no con un booleano secreto. type(secret) sigue devolviendo el tipo real. Cada operación prohibida lanza un error de inmediato, así que protege el código antes de bifurcar.
Orden de carga de SavedVariables y el error de restauración de la beta
El cliente ejecuta los archivos de tu addon, luego carga sus SavedVariables y SavedVariablesPerCharacter y dispara ADDON_LOADED para él, un addon a la vez. PLAYER_LOGIN se dispara cuando se han cargado todos los addons que no son de carga bajo demanda. Para hacer un último cambio antes de que se escriba el archivo, usa PLAYER_LOGOUT, el último evento antes de guardar.
Un informe de error en los foros de Blizzard del 21 de septiembre mostró que los ajustes de Soundtrack se escribían correctamente en la carpeta WTF, pero desaparecían tras el siguiente inicio. Otros autores de addons en el hilo reportaron lo mismo. Sin confirmar, reportado por la comunidad. El 25 de septiembre, otro autor dijo que SavedVariables volvían a cargarse en la compilación 1.60.1.70009. Vuelve a probar tu propio addon antes de fiarte de la corrección.
Dos trampas al portar del mismo informe
El port de Soundtrack falló primero dentro de AceDB-3,0 con un regionKey nil. En la beta, GetCurrentRegion() devolvió un ID de región que la biblioteca incluida no reconocía, y parchear AceDB para que tolere ID desconocidos lo solucionó. El autor también dividió un indicador IsRetail en dos, porque en Forever «usar la API moderna» y «activar contenido exclusivo de Retail» son preguntas distintas.
Momento de las placas de nombre en el cliente de la beta
Warcraft Forever indica que NAME_PLATE_UNIT_ADDED se dispara antes de que la unidad esté rellenada, sin namePlateUnitToken en los marcos de las placas. Sin confirmar. La solución alternativa reportada es volver a comprobar la unidad un momento después, o recorrer tú mismo nameplate1 hasta nameplate40.
Compartimento de addons: registro sin campos del TOC
Los campos del TOC anteriores cubren un botón de compartimento que nunca cambia. Si el tuyo elige su icono o su etiqueta en tiempo de ejecución, la Warcraft Wiki documenta una llamada manual:
AddonCompartmentFrame:RegisterAddon({
text = "My Addon",
icon = "Interface\\Icons\\TEMP.blp",
notCheckable = true,
func = function(button, menuInputData)
print("Clicked " .. menuInputData.buttonName)
end,
})Esto procede de la documentación de Mainline, no de una prueba en Forever, así que confirma que se dispara en tu compilación. Si redactas con un prompt de sistema de IA, la biblioteca de prompts de IA para código de addons reúne estas restricciones en un solo lugar. Para el lado del jugador, la página de addons que funcionan en Forever recoge lo que sigue funcionando.
Datos clave
- Interfaz TOC Cambiada16001 en la fila Forever Beta de la tabla TOC de Warcraft Wiki; confírmalo con /dump select(4, GetBuildInfo())Classic: Classic Era indica 11509 en la misma tabla.
- Globales antiguas de hechizos y objetos EliminadasGetSpellInfo y GetItemInfo no existen en la compilación 69913; usa C_Spell y C_Item
- Registro de combate EliminadoCombatLogGetCurrentEventInfo se reporta como no disponible para addons en la betaClassic: los addons de Classic Era leen todos los eventos mediante COMBAT_LOG_EVENT_UNFILTERED.
- Familia de API CambiadaComparte la arquitectura de la interfaz de Mainline y «la gran mayoría de las API de esa versión» (“the vast majority of APIs available in 12.1.5”)
- ID de proyecto capturado Cambiado18 (WOW_PROJECT_CAMELOT) en la sonda en vivo del 12 de octubre en la compilación 70338; los informes anteriores de 69913 indicaban 1
Fuentes
- 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)