-
Notifications
You must be signed in to change notification settings - Fork 3
Hotfixes DB2
Comment ajouter un enregistrement DB2 custom, visible côté client, sans patch client.
En 7.3.5, une grande partie des données du jeu (titres, textes de gossip, spécialisations, noms d'aires…) ne vit plus en base mais dans les fichiers DB2. Le client les lit sur son disque. On peut malgré tout lui pousser des enregistrements via le système de hotfix générique du core.
C'est ce qui a permis de créer le titre « Mercenaire » sans distribuer le moindre patch aux joueurs.
Base hotfixes, table portant le nom du DB2 — par exemple char_titles :
INSERT INTO dc_hotfixes.char_titles (ID, Name, Name1, MaskID, Flags, VerifiedBuild)
VALUES (600, 'Mercenaire', 'Mercenaire', 380, 0, 26972);INSERT INTO dc_hotfixes.hotfix_data (Id, TableHash, RecordId, Deleted, VerifiedBuild)
VALUES (<id>, 2246024846, 600, 0, 26972); -- 2246024846 = 0x85DF9E8E = CharTitlesSans cette ligne, l'enregistrement n'existe que côté serveur. Le client ne le verra jamais. C'est l'erreur qu'on fait à tous les coups la première fois.
Trouver le TableHash : c'est celui de l'en-tête WDC1 du fichier .db2, à l'offset 20.
Dans worldserver.conf. Sans cela, les clients servent leur cache ADB et ne voient rien.
Le log de démarrage doit afficher un compteur >> Loaded N hotfix records incrémenté.
Le serveur ne sert que enUS (DBC.Locale = 0) : GetSessionDbcLocale() retombe sur enUS pour tous
les clients.
👉 Mettez le texte français directement dans la colonne de base (
Name), pas danschar_titles_locale.
Voir Localisation francaise.
L'en-tête WDC1 se lit en quelques lignes de Python — utile pour retrouver un TableHash ou vérifier
un nombre d'enregistrements :
import struct
with open('CharTitles.db2', 'rb') as f:
magic = f.read(4) # b'WDC1'
(record_count, field_count, record_size,
string_table_size, table_hash, layout_hash) = struct.unpack('<6I', f.read(24))
print(hex(table_hash), record_count, field_count, record_size)Structure du fichier : en-tête, puis données à l'offset 84 + field_count * 4, puis la string
table, puis la liste d'identifiants.
Le texte d'un npc_text vit dans le DB2 BroadcastText (table dc_hotfixes.broadcast_text). En
théorie on peut donc y pousser du gossip custom — en pratique, sur le
Portail de Mercenaire, le boniment passe par
creature->Whisper(std::string, LANG_UNIVERSAL, player), bien plus simple pour un texte purement
fonctionnel.
Notez aussi que la table area_table de dc_hotfixes est vide : les noms d'aires vivent dans les
DB2 sur disque. C'est pourquoi le diagnostic d'une zone passe par un .gps en jeu pour obtenir
l'areaId réel.
Titre « Mercenaire » — CharTitles ID 600, MaskID 380, créé le 16/08/2026, commit 65dacb0d.
Voir Autres customs.
SylvaniaCore — GPL v2 · La Légion de Sylvania · Discord contributeurs World of Warcraft® et Blizzard Entertainment® sont des marques déposées de Blizzard Entertainment, Inc. Projet non affilié.
Démarrer
Comprendre
Modules
Développer