Aide-mémoire de l’API d’addon WoW Forever pour l’interface 16001

Publié le Mis à jour le Rapports de la bêta de la build 1.60.1.69913

Partager

Guide des addons page 3 sur 7

GetSpellInfo et GetItemInfo étaient absents de la build bêta 69913 : écrivez donc des appels C_Spell et C_Item. Les événements remplacent le journal de combat, rapporté comme indisponible pour les addons.

Demandez tout sur l’API d’addon à notre IA accro

Appels C_Spell, valeurs secrètes, événements du journal de combat, interface TOC 16001, API Settings et plus

Tout ce que couvrent nos guides. Les réponses proviennent de cette page et du reste de nos guides, avec les vraies valeurs en graphique et les sections de guide liées. C’est une IA : vérifiez la source avant de la citer.

Ce guide est une référence rapide de l’API de l’ère 12.1.5 appliquée à WoW: Forever. Les observations antérieures mentionnent la build bêta 1.60.1.69913. Les exemples de règles, de sons et de détection sont vérifiés dans les fichiers client conservés de la build 1.60.1.70338 de Blizzard. Les autres exemples suivent la documentation Mainline du Warcraft Wiki. Cet auteur n’en a testé aucun en jeu.

Interface TOC
16001
Anciens globaux de sorts et d’objets
C_Spell, C_Item
Journal de combat
Indisponible
Famille d’API
Mainline 12.1.5

Cette référence fait partie du guide du développeur d’addons WoW Forever. Pour l’architecture du client et les valeurs secrètes, lisez les patterns d’addons WoW Forever. Pour voir comment les modèles se trompent sur ces appels, lisez les pièges courants des addons écrits par IA.

Les ajouts du 13 octobre citent l’extrait client conservé 70338. Les miroirs de sources liés peuvent afficher une build plus récente.

Globaux disparus

WoW Forever Builds a constaté que ces globaux de l’ère Classic étaient absents de la build 69913. Les modèles entraînés sur du vieux code les écrivent encore :

Ce que l’IA écriraÀ utiliser à la placeNotes
GetSpellInfo(id)C_Spell.GetSpellInfo(id)Renvoie une seule table (name, iconID, castTime et plus). nil si le sort est introuvable.
GetItemInfo(id)C_Item.GetItemInfo(id)Renvoie la même liste de valeurs que l’ancien global. nil tant que ce n’est pas en cache.
GetSpellBookItemNameC_SpellBook.GetSpellBookItemNameL’ancien global du livre de sorts était absent de la build 69913.
GetTalentInfo / GetNumTalentTabsC_TraitsWoW Forever Builds : les talents reposent sur le système de traits.
GetAddOnMetadata(name, field)C_AddOns.GetAddOnMetadataMême déplacement de namespace que sur Mainline.
CombatLogGetCurrentEventInfo()No verified replacement hereReported unavailable. Test on your build before you drop the feature.

Sorts et objets

Les recherches peuvent revenir vides. C_Spell.GetSpellInfo ou C_Item.GetItemInfo sur un enregistrement que le client n’a pas encore chargé peut renvoyer nil.

SpellLookup.lua
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
end

Listen 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.

Unités et secrets

Blizzard a indiqué que les valeurs secrètes de Midnight sont actives sur Forever. Faire un calcul sur une valeur secrète, ou en comparer une, provoque une erreur :

AppelPeut être secretUsage sûr
UnitHealth / UnitHealthMaxOui, nombreStatusBar:SetMinMaxValues et StatusBar:SetValue
UnitName / noms de créaturesOui, chaîneAfficher seulement quand issecretvalue est false
UnitCanAttack / UnitExistsOui, booléenNe branchez pas avant que la garde indique une valeur normale
UnitIsEnemySouvent la mauvaise questionSignifie attaquable maintenant, pas faction opposée
UnitFactionGroupVérifier avant de comparerthem ~= mine est le test de faction

La colonne « peut être secret » pour les noms et les booléens vient des notes de la bêta de Warcraft Forever. Pour la vie, elle vient du test de WoW Forever Builds. Exécutez cette garde avant de brancher sur une valeur ou de l’afficher :

Guard.lua
local function Sealed(value)
    return type(issecretvalue) == "function" and issecretvalue(value)
end

Les modèles de code et l’exemple Forever Beacon contiennent des exemples de barres d’état protégées. Testez-les sur votre build actuelle.

Des événements à la place du journal de combat

Sur Midnight, l’enregistrement de COMBAT_LOG_EVENT_UNFILTERED provoque une erreur (Warcraft Wiki, changements d’API du patch 12.0.0). Warcraft Forever rapporte que le lecteur du journal de combat est indisponible sur Forever. Enregistrez plutôt des événements d’unité :

Ce que vous voulezEnregistrer
Vie du joueurRegisterUnitEvent("UNIT_HEALTH", "player")
PuissanceUNIT_POWER_UPDATE
Un lancement de sort commencé ou terminéUNIT_SPELLCAST_START, _STOP, _SUCCEEDED, _FAILED, _INTERRUPTED
AurasLaissez les frames d’aura de Blizzard les afficher. UNIT_AURA n’autorise pas à lire les données d’aura en combat.
Entrée et sortie de combatPLAYER_REGEN_DISABLED et PLAYER_REGEN_ENABLED
Un pull de bossENCOUNTER_START et ENCOUNTER_END, si la rencontre les déclenche
Changements de zoneZONE_CHANGED_NEW_AREA, PLAYER_ENTERING_WORLD
Notes de version GitHub de Guidelime v6.000, avec « Initial work to support WoW Forever » et une entrée d’option « Add arrow ETA and TomTom »
Partager l’image : notes de version GitHub de Guidelime v6.000, avec « Initial work to support WoW Forever » et une entrée d’option « Add arrow ETA and TomTom »

Les notes de version v6.000 de Guidelime incluent un correctif pour ignorer les valeurs secrètes dans UNITSPELLCASTSUCCEEDED sur WoW Forever.Source : Guidelime v6.000 sur GitHub, capturé le 30 sept. 2026.

Frames, temps, chat

Les frames qui ont besoin d’un backdrop héritent de BackdropTemplate. Les timers utilisent C_Timer :

Basics.lua
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)

Ordre des paramètres de SetTexCoord

SetTexCoord prend left, right, top, bottom, et non left, top, right, bottom. Passez des fractions de 0 à 1, pas des pixels.

Appels qui échouent en silence

Warcraft Forever's page, captured September 28, lists these calls as protected on the Forever beta but names no client build:

À éviterUtilisation
ChatFrame_OpenChat / ChatEdit_ActivateChatLaissez le client gérer l’édition du chat ; utilisez HandleModifiedItemClick pour les liens par Maj+clic
C_SuperTrack.SetSuperTrackedUserWaypointC_Map.SetUserWaypoint avec un UiMapPoint
Attributs sécurisés sur les cadres d’unité de BlizzardVos propres boutons
PlaySoundFile sur Sound\Interface\*.oggPlaySound avec un ID SOUNDKIT
pcall around a blocked actionNothing; pcall does not unblock it

Champs TOC importants ici

Un addon réservé à Forever déclare l’interface 16001 sur la bêta :

MyAddon.toc
## 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

Les callbacks du compartment doivent être de vraies globales, car le client les recherche par leur nom. Gardez tout le reste dans vos fichiers en variables locales au fichier. Les noms de SavedVariables sont aussi des globales. Le client les charge après l’exécution de vos fichiers, puis déclenche ADDON_LOADED pour votre addon.

Settings API

L’API Settings a remplacé l’ancien panneau Options d’interface, et fait partie du code Mainline que Forever partage. Préférez-la à une fenêtre d’options privée quand il ne vous faut que des cases à cocher et des curseurs. Si vous créez une fenêtre personnalisée, héritez de BackdropTemplate, enregistrez l’ancrage à la fin du glissement, et ne déplacez pas de cadres protégés pendant le verrouillage du combat.

InterfaceOptions_AddCategory est l’ancien appel d’options, et les modèles d’IA y reviennent encore. Demandez plutôt l’API Settings.

Pourquoi l’API moderne plutôt que celle de Classic

Lors de la session de questions-réponses des développeurs du 17 septembre, on a demandé à un développeur si Forever utiliserait les restrictions d’addons de Midnight, l’API Classic ou autre chose, et il a répondu : « we did opt for the modern API approach. » Confirmé, d’après le replay de World of Warcraft Developer Q&A à 01:20:52.

Wowhead, qui relaie l’annonce de Blizzard sur le Discord WoW UI, affirme que ces mêmes changements d’API « caused WeakAuras to stop development before Midnight and almost every addon to update. » Rapporté. Quand vous portez un addon, partez de sa version Midnight, qui gère déjà ces règles, et non de sa branche Classic Era. Les gros projets font ainsi : l’addon de guides RestedXP répertorie un fichier « WoW Forever » sur CurseForge.

Ce que Blizzard a intégré

Pendant le même stream, le panel a indiqué que Forever propose son propre compteur de dégâts et son propre Cooldown Manager. Confirmé pour les deux. Un minuteur de coups n’a été évoqué que comme ajout possible plus tard. Vérifiez si un panneau intégré fait déjà le travail avant de publier un doublon.

Détecter Forever depuis votre propre code

Une condition écrite if WOW_PROJECT_ID == WOW_PROJECT_CLASSIC then ne détectera pas ce jeu. L’ancien test de WoW Forever Builds sur la build 69913 rapportait 1, la même valeur que WOW_PROJECT_MAINLINE. La sonde en jeu conservée de la build 70338, du 12 octobre, relève au contraire WOW_PROJECT_ID = 18, WOW_PROJECT_MAINLINE = 1 et WOW_PROJECT_CLASSIC = 2. Les constantes de projet Camelot de Blizzard définissent WOW_PROJECT_CAMELOT = 18. Observation du client rapportée : l’ancien nombre est historique, pas une règle de détection actuelle.Source : constantes de projet Camelot de Blizzard, inspectées dans les fichiers client conservés 70338 le 13 oct. 2026 ; sonde en jeu capturée le 12 oct..

Pour un addon partagé, comparez la constante nommée quand elle existe, puis vérifiez l’API précise dont votre fonction a besoin. Un addon réservé à Forever peut cibler Forever directement :

Detect.lua
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

La même page montre une autre voie, via le TOC : déclarez ## X-Family: [Family] et ## X-Game: [Game], puis lisez-les avec C_AddOns.GetAddOnMetadata. Dans l’exemple du wiki, la famille Mainline avec le jeu Camelot désigne Forever.

<details><summary>Notes techniques : anciens exemples de détection</summary>

L’exemple de septembre conservé du Warcraft Wiki associait WOW_PROJECT_MAINLINE à LE_EXPANSION_LEVEL_CURRENT == LE_EXPANSION_CLASSIC et nommait la branche "camelot/forever." Cette condition d’ID de projet Mainline est fausse sur le client 70338 capturé. Une architecture d’interface Mainline n’implique pas un ID de projet Mainline. Une bibliothèque chargée uniquement sur Classic ne se charge pas, silencieusement, sans erreur expliquant pourquoi.

</details>

Obtenir les règles actuelles avec l’API d’interface

Utilisez C_GameRules pour les requêtes sur le mode de jeu. Les règles actuelles ne correspondent ni à l’ID de projet du client, ni à un indicateur Hardcore, ni au préréglage d’expérience Classic/Modern du joueur. Choisissez la valeur dont votre fonction a réellement besoin :

Votre besoinLireRésultat dans la documentation 70338
Enregistrement du mode de jeu actuelC_GameRules.GetCurrentGameModeRecordID()ID numérique d’enregistrement ; aucun ID Forever n’est associé ici
Mode de jeu actifC_GameRules.GetActiveGameMode()GameMode Valeur enum
Règle Hardcore activeC_GameRules.IsHardcoreActive()Booléen
Une règle de jeu préciseC_GameRules.IsGameRuleActive(gameRule)Booléen ; transmettez la valeur GameRule documentée
Préréglage d’expérience Classic/ModernC_GameRules.GetForeverExperiencePreset()Enum.ForeverExperiencePreset, ou nil
Règles du canal de discussionC_ChatInfo.GetChannelRuleset(channelIndex)Enum.ChatChannelRuleset; pas les règles du jeu

Ces signatures viennent de la documentation client générée de Blizzard ; elles ne sont pas déduites de tutoriels Classic.Source : documentation GameRules de Blizzard et documentation ChatInfo, build du client conservée 70338, inspectée le 13 oct. 2026.

Pour un diagnostic rapide après votre entrée dans le monde, tapez /dump C_GameRules.GetCurrentGameModeRecordID(). Pour lire le préréglage d’expérience Forever dans le code d’un addon :

Ruleset.lua
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())

L’enum utilise Classic 0 et Modern 1. Cet exemple lit la préférence ; il ne change rien. GAME_RULES_CHANGED et ACTIVE_GAME_MODE_UPDATED sont des événements documentés pour actualiser l’affichage des règles de jeu et du mode actif. Leur présence ne prouve pas que chaque changement de préréglage déclenche l’un de ces événements. La liste des fonctions relevée par la sonde capturée inclut ces fonctions ; elle n’a ni mesuré les ID de mode de jeu renvoyés ni exécuté cet exemple.

Aide-mémoire des ID de sons

Utilisez PlaySound(SOUNDKIT.IG_MAINMENU_OPTION_CHECKBOX_ON) pour un son intégré à l’interface. Le SoundKitConstants.lua de Blizzard 70338 fournit ces ID de kits sonores :

SonSOUNDKIT CléID
Case cochéeIG_MAINMENU_OPTION_CHECKBOX_ON856
Case décochéeIG_MAINMENU_OPTION_CHECKBOX_OFF857
Ouverture du menuIG_MAINMENU_OPEN850
Fermeture du menuIG_MAINMENU_CLOSE851
Onglet du personnageIG_CHARACTER_INFO_TAB841
Avertissement de raidRAID_WARNING8959

Ce sont des ID de kits sonores, pas des ID de sorts ou des FileDataID audio. Préférez les constantes nommées dans les fichiers d’addon. Pour écouter un son manuellement, tapez /run PlaySound(SOUNDKIT.IG_MAINMENU_OPTION_CHECKBOX_ON). Nous avons inspecté les ID dans le code client ; nous n’avons pas écouté ces aperçus.Source : constantes de kits sonores de Blizzard, build du client conservée 70338, inspectée le 13 oct. 2026.

Dans cette build, Blizzard fait de PlaySound un alias de C_Sound.PlaySound. La signature générée utilise un UISoundSubType comme deuxième argument. L’exemple à un argument évite de copier dans ce client une ancienne signature avec une chaîne de canal "Master" ou "SFX". Un aperçu silencieux peut refléter les réglages du son ; n’activez ni n’augmentez automatiquement le son d’un joueur.Source : Sound.lua de Blizzard et documentation de l’API Sound, build du client conservée 70338, inspectée le 13 oct. 2026.

Pour les fonctions à plusieurs instructions, les alias de commandes slash, une commande de message local et un message dans une fenêtre, utilisez les modèles de code pratiques.

Pourquoi les secure snippets peuvent ne pas compiler

WoW Forever Builds a relevé un second problème dans le code d’exécution restreinte de Blizzard. RestrictedExecution.lua appelle une fonction du moteur, loadstring_untainted, que la build 69913 ne fournit jamais. /run print(type(loadstring_untainted)) affiche nil, et chaque secure snippet échoue avec une erreur d’appel de nil. Rapporté. Le média, WoW Forever Builds, y voit une pièce manquante et non une politique, car le code de Blizzard attend cette fonction.

Les addons utilisent les secure snippets pour les tâches sûres en combat, comme la pagination des barres d’action, les en-têtes de groupe sécurisés et le click casting. Si le vôtre déclenche exactement cette erreur, c’est le système de snippets qui est en panne sur votre build, pas votre code. Retestez à chaque nouvelle build.

Le compteur d’actions échouées

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.

Ce que le code souillé peut encore faire avec une valeur secrète

Le tableau « Units and secrets » couvre l’arithmétique et les comparaisons. Les règles du wiki vont plus loin, dans les deux sens : certaines choses sont permises, d’autres non. Le code souillé peut stocker un secret dans une variable, une upvalue ou une valeur de table, et le passer à des fonctions Lua. Les fonctions C ne l’acceptent que si Blizzard les y autorise. Le code souillé peut aussi concaténer des chaînes et des nombres secrets, et les passer à string.format, string.concat ou string.join.

Le code souillé ne peut pas faire d’arithmétique sur un secret, le comparer, lui appliquer l’opérateur de longueur, le stocker comme clé de table, l’indexer ni l’appeler. Un test de véracité fonctionne sur une chaîne ou un nombre secret, puisque seule la valeur est masquée, mais pas sur un booléen secret. type(secret) renvoie toujours le vrai type. Chaque opération interdite lève une erreur immédiatement : protégez-vous avant de brancher.

Ordre de chargement des SavedVariables et bug de restauration de la bêta

Le client exécute les fichiers de votre addon, puis charge ses SavedVariables et SavedVariablesPerCharacter et déclenche ADDON_LOADED pour lui, un addon à la fois. PLAYER_LOGIN se déclenche une fois que tous les addons non chargés à la demande sont chargés. Pour faire un dernier changement avant l’écriture du fichier, utilisez PLAYER_LOGOUT, le dernier événement avant la sauvegarde.

Un signalement de bug sur les Blizzard Forums du 21 septembre montrait que les paramètres de Soundtrack étaient bien écrits dans le dossier WTF mais absents au lancement suivant. D’autres auteurs d’addons du fil ont signalé la même chose. Non vérifié, signalé par la communauté. Le 25 septembre, un autre auteur a dit que les SavedVariables se chargeaient de nouveau sur la build 1.60.1.70009. Retestez votre propre addon avant de croire au correctif.

Deux pièges de portage issus du même signalement

Le portage de Soundtrack a d’abord échoué dans AceDB-3,0 avec un regionKey nil. Sur la bêta, GetCurrentRegion() renvoyait un ID de région que la bibliothèque incluse ne reconnaissait pas, et modifier AceDB pour tolérer les ID inconnus a réglé le problème. L’auteur a aussi scindé un indicateur IsRetail en deux, car sur Forever « utiliser l’API moderne » et « activer le contenu réservé à Retail » sont deux questions différentes.

Timing des barres de noms sur le client bêta

Warcraft Forever indique que NAME_PLATE_UNIT_ADDED se déclenche avant que l’unité soit renseignée, sans namePlateUnitToken sur les cadres des barres de noms. Non vérifié. Le contournement rapporté consiste à revérifier l’unité un instant plus tard, ou à parcourir vous-même nameplate1 jusqu’à nameplate40.

Addon Compartment : enregistrement sans champs TOC

Les champs TOC ci-dessus couvrent un bouton de compartment qui ne change jamais. Si le vôtre choisit son icône ou son libellé à l’exécution, le Warcraft Wiki documente un appel manuel :

Compartment.lua
AddonCompartmentFrame:RegisterAddon({
    text = "My Addon",
    icon = "Interface\\Icons\\TEMP.blp",
    notCheckable = true,
    func = function(button, menuInputData)
        print("Clicked " .. menuInputData.buttonName)
    end,
})

Ceci provient de la documentation Mainline, pas d’un test sur Forever : vérifiez donc qu’il se déclenche sur votre build. Si vous rédigez avec un prompt système d’IA, la bibliothèque de prompts IA pour le code d’addon regroupe ces contraintes au même endroit. Côté joueur, la page addons compatibles avec Forever suit ce qui fonctionne encore.

Faits clés

  • Interface TOC Modifiée16001 dans la ligne Forever Beta du tableau TOC du Warcraft Wiki ; vérifiez avec /dump select(4, GetBuildInfo())Classic : Classic Era indique 11509 dans le même tableau.
  • Anciennes globales de sorts et d’objets SuppriméGetSpellInfo et GetItemInfo absents de la build 69913 ; utilisez C_Spell et C_Item
  • Journal de combat SuppriméCombatLogGetCurrentEventInfo rapporté comme indisponible pour les addons sur la bêtaClassic : les addons Classic Era lisent chaque événement via COMBAT_LOG_EVENT_UNFILTERED.
  • Famille d’API ModifiéePartage l’architecture d’interface Mainline et "the vast majority of APIs available in 12.1.5" (« la grande majorité des API disponibles dans cette version »)
  • ID de projet capturé Modifié18 (WOW_PROJECT_CAMELOT) dans la sonde en jeu du 12 octobre, build 70338 ; les anciens rapports 69913 indiquaient 1

Sources

  1. What the WoW Forever beta breaks for addons: secret health values, dead secure snippets, new APIsWoW Forever Builds
  2. AddonsWarcraft Forever
  3. WoW: Forever Will Have Addon Changes from MidnightWowhead
  4. TOC formatWarcraft Wiki
  5. C_Item.GetItemInfoWarcraft Wiki
  6. Secret ValuesWarcraft Wiki
  7. Patch 12.0.0/API changesWarcraft Wiki
  8. Addon compartmentWarcraft Wiki
  9. Saving variables between game sessionsWarcraft Wiki
  10. C_Map.SetUserWaypointWarcraft Wiki
  11. WOW_PROJECT_IDWarcraft Wiki
  12. World of Warcraft Developer Q&A (replay and YouTube automatic captions)World of Warcraft
  13. WOWF Beta: Addon SavedVariables appear to write correctly to disk but are not restored at startupBlizzard Forums
  14. RestedXP Guide on CurseForgeCurseForge
  15. Blizzard client source: ProjectConstants.lua (retained build 70338; mirror may change)Blizzard Entertainment (source mirrored by Gethe)
  16. Blizzard client source: GameRulesDocumentation.lua (retained build 70338; mirror may change)Blizzard Entertainment (source mirrored by Gethe)
  17. Blizzard client source: SoundKitConstants.lua (retained build 70338; mirror may change)Blizzard Entertainment (source mirrored by Gethe)
  18. Blizzard client source: Sound.lua (retained build 70338; mirror may change)Blizzard Entertainment (source mirrored by Gethe)
  19. Blizzard client source: SoundDocumentation.lua (retained build 70338; mirror may change)Blizzard Entertainment (source mirrored by Gethe)
  20. Blizzard client source: ChatInfoDocumentation.lua (retained build 70338; mirror may change)Blizzard Entertainment (source mirrored by Gethe)