Skip to content

Hotfixes DB2

SylvaniaCore deploy edited this page Aug 31, 2026 · 1 revision

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.


La procédure

1. Insérer la ligne dans la table miroir

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);

2. ⚠️ Ajouter la ligne hotfix_data — indispensable

INSERT INTO dc_hotfixes.hotfix_data (Id, TableHash, RecordId, Deleted, VerifiedBuild)
VALUES (<id>, 2246024846, 600, 0, 26972);   -- 2246024846 = 0x85DF9E8E = CharTitles

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

3. Incrémenter HotfixCacheVersion

Dans worldserver.conf. Sans cela, les clients servent leur cache ADB et ne voient rien.

4. Redémarrer et vérifier

Le log de démarrage doit afficher un compteur >> Loaded N hotfix records incrémenté.


⚠️ La locale

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 dans char_titles_locale.

Voir Localisation francaise.


Inspecter un .db2 sans outil

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.


Ce que ça ne résout pas

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.


Précédent

Titre « Mercenaire » — CharTitles ID 600, MaskID 380, créé le 16/08/2026, commit 65dacb0d. Voir Autres customs.

Clone this wiki locally