Errores de addons en WoW Forever: 12 fallos de la IA y 4 trampas de la beta
Los modelos copian la interfaz 120001 o 11503 cuando la wiki indica 16001, y hacen cálculos con UnitHealth, que devolvió un número secreto en la compilación 69913.
Pregunta a nuestra IA sudorosa y degenerada sobre errores de addons
Números de interfaz, cálculos con salud secreta, WOW_PROJECT_ID, carencias del registro de combate, trampas de sonido de la beta 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.
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.
- Número de interfaz incorrecto
- 16001
- Cálculos con salud secreta
- h + 1 falla
- WOW_PROJECT_ID
- 18 (Camelot)
- Registro de combate
- Reported unavailable
Este desglose forma parte de la guía para desarrolladores de addons de WoW Forever. Para entender por qué ocurren estos errores, lee los patrones de addons de WoW Forever y la hoja de referencia de la API de Forever. Puedes evitar la mayoría con los prompts de IA listos para usar.
Doce trampas
01. Publicar con la interfaz 120001 o 11503
Los modelos copian guías de Midnight o plantillas de Classic. La Warcraft Wiki indica 16001 para la beta de Forever. Un número distinto puede hacer que el cliente que estás probando marque el addon como desactualizado.

content.zygorguides.com/support/manual/enabling.## Interface: 120001## Interface: 1600102. Bifurcar según WOW_PROJECT_ID
En la compilación 1.60.1.69913, se reportó que WOW_PROJECT_ID devolvía 1, el valor de Mainline. La sonda conservada del 12 de octubre en la compilación 70338 registra en cambio 18, que coincide con la constante WOW_PROJECT_CAMELOT de Blizzard. Una rama solo para Classic no detecta Forever; una rama que engloba el resto puede confundirlo con otro cliente. Compara la constante con nombre y después comprueba la API de la función.Fuente: constantes de proyecto Camelot de Blizzard, extracto conservado de 70338 inspeccionado el 13 oct 2026; sonda de WFG capturada el 12 oct. El espejo puede mostrar una compilación posterior.
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
endEl ejemplo anterior de la Warcraft Wiki combinaba WOW_PROJECT_MAINLINE con LE_EXPANSION_LEVEL_CURRENT == LE_EXPANSION_CLASSIC. Esa primera condición es falsa en el cliente 70338 capturado. El fragmento revisado se ha cotejado con las fuentes, pero no se ha probado en el juego; ns:UseForeverPath() representa el código de tu propio addon.
03. Sumar uno a UnitHealth
En una prueba en la compilación 69913, type(UnitHealth("player")) imprime number, pero h + 1 falla. WoW Forever Builds vio que Grid2 lanzaba «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. Imprimir un nombre que puede ser secreto
Warcraft Forever informa de que los nombres de unidades y criaturas pueden ser cadenas secretas. También dice que imprimir uno lanza un error y puede dejar tu marco en blanco. Comprueba primero y recurre después a un valor que hayas elegido.
print("Hello " .. UnitName("player"))local name = UnitName("player")
if type(issecretvalue) == "function" and issecretvalue(name) then
name = "adventurer"
end
print("Hello " .. name)05. GetSpellInfo y GetItemInfo
Ambas faltaban en la compilación 69913, junto con GetSpellBookItemName y los antiguos globales de talentos. C_Spell.GetSpellInfo devuelve una sola tabla. C_Item.GetItemInfo devuelve la misma lista de valores que el antiguo global.
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. Un medidor de daño con disfraz educado
En Midnight, registrar el evento del registro de combate lanza un error. Los probadores reportan que no está disponible en Forever. Blizzard dijo que Forever incluye un medidor de daño y un gestor de tiempos de reutilización integrados.
frame:RegisterEvent("COMBAT_LOG_EVENT_UNFILTERED")-- Presentation only. Let the built-in meter count.
frame:RegisterUnitEvent("UNIT_HEALTH", "player")07. Click-cast mediante un fragmento seguro
Los fragmentos seguros no se compilaban en la compilación 69913. Aunque una compilación posterior lo arregle, Warcraft Forever indica que los atributos seguros de los marcos de unidad de Blizzard están protegidos, y pcall no hace que el fallo desaparezca.
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 en el ámbito del archivo
SavedVariables es nil mientras se carga tu archivo. El cliente carga los datos guardados después de ejecutar tus archivos y sustituye lo que haya definido tu archivo. Un valor por defecto asignado al principio se sobrescribe o se lee demasiado pronto. Los jugadores también reportaron que la beta perdía datos guardados entre sesiones hasta la compilación 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
endConsulta el ciclo de vida completo en la plantilla de SavedVariables.
09. Cancelar C_Timer.After
After no devuelve nada. El objeto temporizador procede de NewTimer o NewTicker.
local t = C_Timer.After(5, func)
t:Cancel()local t = C_Timer.NewTimer(5, func)
t:Cancel()10. Llamadas protegidas ocultas en pcall
Warcraft Forever informa de que ChatFrame_OpenChat, C_SuperTrack.SetSuperTrackedUserWaypoint y los atributos seguros de los marcos de Blizzard fallan sin un error de Lua. El único síntoma es un contador de acciones de interfaz que /reload no reinicia.
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. Comprobaciones de facción que mienten
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. Comandos de barra que nunca se registran
El global debe ser SLASH_NAME1 y la clave SlashCmdList debe ser la misma NAME, escrita igual. Una variable local, o una clave que no coincide, nunca se registra.
local SLASH_fb1 = "/fb"
SlashCmdList.fb = function() endSLASH_FOREVERBEACON1 = "/fb"
SlashCmdList["FOREVERBEACON"] = function(msg)
endPara barras seguras completas, colas de combate y compartimentos de addons, consulta las plantillas de código.
Cuatro trampas más de la beta
Las doce anteriores cubren los fallos más graves. Estas cuatro son menores. Las trampas 13 y 14 son reportes de la comunidad de la beta, sin confirmar, de Warcraft Forever. Las trampas 15 y 16 proceden de las páginas de la API Mainline de la Warcraft Wiki, la familia de interfaz que usa Forever. No se han vuelto a probar en una compilación de Forever.
13. Reproducir un archivo de sonido al estilo Classic
Warcraft Forever informa de que PlaySoundFile con una ruta Sound\Interface\*.ogg falla en silencio en este cliente. No hay errores ni se imprime nada; el sonido nunca suena.
PlaySoundFile("Sound\\Interface\\LevelUp.ogg")-- Warcraft Wiki, PlaySound: play by SoundKitID, not a file path.
PlaySound(SOUNDKIT.READY_CHECK)La página PlaySound de la wiki documenta la reproducción mediante SoundKitID o una clave SOUNDKIT. Warcraft Forever también dice que compruebes el volumen general antes de culpar al addon.
14. Fiarse de una placa de nombre en cuanto aparece
Warcraft Forever informa de que NAME_PLATE_UNIT_ADDED se dispara antes de que la unidad esté rellenada, y de que los marcos de placa no tienen namePlateUnitToken en este cliente. Leer la unidad en el mismo manejador no da nada útil.
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. Suponer que una consulta de metadatos falla en silencio
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. Conectar el panel de ajustes con los antiguos globales
La wiki sitúa la reescritura de la API de Settings en el parche 10.0.0, con más cambios incompatibles en 11.0.2. Su patrón documentado registra una categoría y la abre mediante Settings, no con el antiguo InterfaceOptionsFrame_OpenToCategory que usan las plantillas de Classic Era.
InterfaceOptionsFrame_OpenToCategory(MyAddonOptionsPanel)local category = Settings.RegisterVerticalLayoutCategory("My Addon")
Settings.RegisterAddOnCategory(category)
-- Later, from a slash command:
Settings.OpenToCategory(category:GetID())Registra la categoría una sola vez al cargar y ábrela después desde un comando de barra o una entrada del compartimento de addons, como la del addon de ejemplo Forever Beacon.
Por qué los modelos recaen en estos errores
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.
La solución es el contexto, no un prompt más ingenioso. Dile al modelo el número de interfaz, el ID de proyecto y las API que reporta la beta, y empieza con las plantillas de prompts para addons de Forever.
Los addons consolidados se están adaptando del mismo modo, probando en la beta. El addon gratis de guías de RestedXP ha publicado correcciones de rutas de Forever en sus versiones de GitHub hasta septiembre de 2026, y Zygor Guides dice que sus guías de Forever llegarán a los suscriptores Elite en el lanzamiento.

Verificar una corrección antes de publicarla
Ninguna de estas dieciséis correcciones tiene garantizado sobrevivir a la próxima compilación de la beta. Vuelve a probar cada una en la compilación que estés usando.
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.
Para la trampa 08, cierra sesión del todo y vuelve a entrar, no solo /reload, y comprueba que tu tabla guardada ha sobrevivido. Los jugadores reportaron un error de restauración de SavedVariables desde el 21 sept 2026, y un jugador dijo que la compilación 70009 lo arregló el 25 sept. Blizzard no ha confirmado una corrección.
Prueba la trampa 11 contra un jugador enemigo sin marcar, en un santuario o en otro shard. Warcraft Forever informa de que UnitIsEnemy y UnitCanAttack devuelven false ahí.
Para las llamadas protegidas de las trampas 07 y 10, fíjate en el contador de acciones de interfaz del panel de AddOns en lugar de en el valor devuelto por pcall. /reload no reinicia ese contador, así que reinicia el cliente antes de volver a probar, o un recuento antiguo hará que una corrección que funciona parezca rota.
Anota el número de compilación junto a cualquier corrección en la que confíes, como hace la hoja de referencia de la API con las filas observadas en la compilación 69913. Una trampa corregida en una compilación puede reabrirse en la siguiente.
Datos clave
- Número de interfaz incorrecto CambiadoLos modelos copian 120001 o 11503; la wiki indica 16001 para la beta de Forever
- Cálculos con salud secreta Cambiadotype() dice number, pero h + 1 falla; pcall devuelve false en lugar de una suma
- WOW_PROJECT_ID Cambiado18 (WOW_PROJECT_CAMELOT) en la sonda de WFG del 12 de octubre en la compilación 70338; la compilación anterior 69913 reportó 1Classic: Classic Era devuelve 2 (WOW_PROJECT_CLASSIC).
- Registro de combate EliminadoRegistrar COMBAT_LOG_EVENT_UNFILTERED da error en Midnight; se reporta como no disponible en Forever
Fuentes
- 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)
