Éditeur de la base de données d'ArchCore, l'émulateur de serveur ArchLord
Application de bureau · Rust · MariaDB · Windows, Linux, macOS
ArchForge crée et modifie le contenu du monde d'ArchCore sans écrire de SQL : créatures et leurs apparitions, butin, PNJ et leurs fonctions, objets, boutiques, quêtes, compétences, téléportation, régions, traductions, comptes. Chaque champ est expliqué, des sélecteurs aident à choisir les valeurs et les drapeaux, et la requête SQL produite est affichée — les seuls changements, ou l'entrée complète pour une sauvegarde — à copier, à exécuter sur la base ou à ajouter à la couche de contenu d'ArchCore.
C'est l'« Éditeur de la base de données » de la feuille de route d'ArchCore, sur le modèle de Keira3 (AzerothCore).
Keira3 est l'éditeur de base de données d'AzerothCore (WoW 3.3.5) : Angular 22, Electron 41, Bootstrap,
monorepo Nx, mysql2 (avec tunnel SSH), squel pour construire le SQL, SQLite pour les données du client
(sorts…). Son fonctionnement tient en quelques mécanismes :
| Mécanisme | Dans Keira3 |
|---|---|
| Éditeur générique | des classes de base (SingleRowEditorService, MultiRowEditorService, …ComplexKey…) : un éditeur concret ne déclare que sa table, sa clé et sa classe de ligne ; le formulaire, le rechargement et le SQL sont hérités |
| SQL produit | MysqlQueryService : getUpdateQuery (seulement les colonnes changées), getDiffDeleteInsert… (lignes ajoutées ou retirées), getFullDeleteInsertQuery (entrée complète) ; affichés dans un panneau « Diff / Full » avec Copier et Exécuter |
| Entité et onglets | un handler par entité (créature, quête, objet, objet de jeu…) et un onglet par table rattachée (template, spawn, loot, equip…) ; un point signale l'onglet modifié |
| Recherche et création | page de recherche par filtres ; création avec un nouvel ID libre ou par copie d'une entrée existante |
| Aide à la saisie | sélecteurs (recherche d'un objet, d'une créature, d'un sort…), fenêtres de drapeaux (bits), listes de valeurs, info-bulles par champ |
| Outils | éditeur SQL libre, éditeur SmartAI, conditions, textes, tableau de bord, visionneuse de carte et de modèles 3D |
| Connexion | fenêtre de connexion, connexions récentes, base publique en lecture seule |
| Keira3 (AzerothCore) | ArchForge (ArchCore) |
|---|---|
| Electron + Angular, un installeur par système | un seul exécutable Rust (comme archcore) qui ouvre sa propre fenêtre : l'interface (JavaScript sans étape de compilation, embarquée) y est affichée par la vue web du système (WebView2, WebKit) — le principe d'Electron, sans embarquer de navigateur |
| connexion saisie à la main | reprise de config/world.conf du dépôt ArchCore (--archcore) : hôte, compte, noms des quatre bases |
| SQL exécuté sur la base | exécuté dans une transaction (tout ou rien) — et : « Ajouter au contenu » écrit la requête dans content/<AAAAMMJJHHMM>_<sujet>.sql. archcore import régénère la base monde depuis le client : sans cette couche, toute modification serait perdue au prochain import |
| colonnes typées | ArchLord garde ses tables d'origine en JSON (raw, data, spec, consts) : les clés utiles sont des champs expliqués, les autres restent modifiables ; le « diff » n'écrit que les clés changées (JSON_SET / JSON_REMOVE), si bien qu'un fichier de contenu ne recopie pas les données du client |
| clés primaires stables | monster_spawn, monster_drop, resurrection_point n'ont qu'un numéro d'import : les lignes sont visées par leur stable_key ; une ligne ajoutée reçoit une clé …#af… et un id calculé au passage (MAX(id) + 1), ce qui rend la requête rejouable |
creature_template + creature + creature_loot_template |
character_template + character_data_table + monster_spawn + monster_drop + growup_factor |
npc_vendor, gossip |
npc_trade_list et les fonctions de npc.ini (paires ordonnées : dialogue, boutique, quêtes, enchères), éditées en place |
quest_template, creature_queststarter |
quest_template.data (conditions, objectifs, récompenses lus par le serveur) et quest_group |
*_locale |
localized_text (onglet « Traductions » de chaque éditeur) et language |
| champs documentés | en plus, un badge « serveur » sur chaque champ que lit vraiment ArchCore (relevé dans crates/archcore/src/world/*.rs) |
Les éditeurs :
| Éditeur | Tables |
|---|---|
| Créatures | character_template, character_data_table, monster_spawn, monster_drop, growup_factor, traductions |
| PNJ | npc_spawn (position, modèle, fonctions de npc.ini), traductions |
| Objets | item_data, item_template, où l'objet est vendu, qui le lâche, traductions |
| Boutiques | npc_trade_list, PNJ vendeurs |
| Groupes de butin | drop_group, objets du groupe |
| Quêtes, Groupes de quêtes | quest_template, quest_group, PNJ du groupe, traductions |
| Compétences | skill_template, skill_spec, skill_level, traductions |
| Téléportation | teleport_point, teleport_fee, portails |
| Régions | region_template, resurrection_point, traductions |
| Langues, Comptes | language ; account, account_banned, personnages du compte |
| Éditeur SQL, Couche de contenu | requêtes libres ; fichiers de content/ |
Prérequis : une base ArchCore (MariaDB) créée par archcore db-init et remplie par archcore import.
Télécharger l'archive de son système sur la page Releases
(Windows x64, Linux x64, macOS Apple Silicon) et lancer archforge : la fenêtre d'ArchForge s'ouvre sur
l'écran de connexion. Placé dans le dossier d'ArchCore (à côté de config/), il en reprend la configuration ;
sinon, lui donner le dossier par --archcore (raccourci, terminal).
| Système | Vue web utilisée |
|---|---|
| Windows 10 et 11 | Microsoft Edge WebView2, déjà installé avec Windows 11 et les Windows 10 à jour (installeur sinon) |
| Linux | WebKitGTK 4.1 : paquet webkit2gtk-4.1 (Arch, CachyOS), libwebkit2gtk-4.1-0 (Debian, Ubuntu) |
| macOS | WebKit du système |
Ou compiler soi-même, avec Rust 1.85 ou plus (sous Linux, avec les paquets de
développement webkit2gtk-4.1 et gtk3) :
cargo build --release
target/release/archforge --archcore ../ArchCore| Option | Rôle |
|---|---|
--archcore <dossier> |
dépôt ArchCore : connexion lue dans config/world.conf, couche de contenu dans content/. Par défaut : le dossier courant s'il contient config/world.conf, sinon la variable ARCHCORE_DIR |
--port <n> |
port local de l'API (8787 par défaut ; s'il est pris, le premier libre parmi les vingt suivants) |
--browser |
afficher l'interface dans le navigateur plutôt que dans la fenêtre d'ArchForge (si la vue web manque) |
--serve |
servir l'interface sans rien ouvrir, par exemple sur un serveur joint par un tunnel SSH |
Une erreur au démarrage s'affiche dans une boîte de dialogue. La fermeture de la fenêtre demande
confirmation s'il reste des modifications non enregistrées. Les réglages de l'interface (connexions récentes,
filtres) sont gardés dans %LOCALAPPDATA%\ArchForge (Windows), ~/.local/share/archforge (Linux) ou
~/Library/Application Support/ArchForge (macOS). L'exécutable Windows porte l'icône d'ArchForge
(assets/archforge.ico, intégrée par build.rs).
- Connexion : les valeurs de
world.confsont proposées ; les connexions récentes sont gardées dans le navigateur (le mot de passe seulement si on le demande). - Rechercher une entrée par ses filtres, ou en créer une : identifiant libre proposé, copie possible d'une entrée existante (tables rattachées comprises quand cela a un sens : butin, boutique, niveaux…).
- Modifier : chaque onglet montre sous le formulaire la requête produite, en deux formes :
- Changements : seulement ce qui diffère de la base — c'est la forme à mettre dans la couche de contenu ;
- Entrée complète :
DELETEpuisINSERT, pour sauvegarder ou transporter une entrée.
- Exécuter (un onglet, ou « Tout enregistrer ») ou Ajouter au contenu (un onglet, ou « Tout ajouter au
contenu ») : nouveau fichier ou ajout à un fichier existant de
content/. - Redémarrer le serveur ArchCore : il charge le monde au démarrage.
archcore contentrejoue la couche de contenu seule, sans réimporter.
Les champs en pointillés sont des clés absentes de la ligne (une saisie les ajoute) ; un champ en rouge bloque l'exécution ; un point orange signale un onglet modifié, et quitter l'entrée demande confirmation.
La fenêtre parle à une API locale, qui exécute le SQL qu'on lui envoie : elle n'écoute que sur 127.0.0.1, refuse tout en-tête Host non local
(rattachement DNS) et exige une clé tirée à chaque lancement, glissée dans la page (une autre page ouverte dans
le navigateur ne peut pas la lire). La couche de contenu refuse CREATE, ALTER, DROP, TRUNCATE… (le
schéma passe par sql/migrations/ d'ArchCore) et n'écrit que des fichiers AAAAMMJJHHMM_sujet.sql.
src/
main.rs options, lancement du serveur local, erreurs de démarrage
window.rs fenêtre de l'application (tao + wry) : vue web, icône, liens externes, fermeture
api.rs API (/api/…), clé et contrôle de l'hôte, fichiers de l'interface embarqués
db.rs MariaDB : alias des bases, lectures paramétrées, scripts en transaction
content.rs couche de contenu : noms, instructions refusées, ajout aux fichiers
archcore.rs lecture de config/world.conf
web/
js/sql.js génération du SQL (changements, entrée complète, JSON_SET, clés stables)
js/editor.js moteur : onglets une ligne / plusieurs lignes / liste, sortie SQL, recherche, création
js/fields.js champs : nombres, listes, drapeaux, références, clés JSON, paires de npc.ini
js/refs.js références entre tables : noms affichés, fenêtres de recherche
js/defs/*.js un fichier par domaine (créatures, PNJ, objets, quêtes…), purement déclaratif
js/pages.js connexion, tableau de bord, éditeur SQL, couche de contenu
tests/sql.test.mjs tests du générateur SQL
Un éditeur est une déclaration dans web/js/defs/ : table principale, clé, recherche (colonnes et
filtres), onglets. Un onglet single (une ligne) donne ses champs ; un onglet multi (lignes rattachées)
donne parent, rowKey (colonnes qui désignent une ligne de façon stable) et, au besoin, autoId ; un onglet
list donne une requête en lecture seule. Un champ : { name, label, help, type, enum, flags, ref, server }.
Ajouter l'éditeur à web/js/defs/index.js.
cargo test # serveur : noms de contenu, instructions refusées, hôtes, world.conf
node --test tests/sql.test.mjs # générateur SQLEssai (2026-10-22) : MariaDB 13.0 locale, copie de la base monde d'ArchCore. Vérifiés dans le navigateur :
connexion par world.conf, tableau de bord, les douze éditeurs et leurs recherches, ajout d'un butin
(sélecteur d'objet, insertion avec clé stable et MAX(id) + 1), modification d'une clé JSON (JSON_SET d'une
seule clé), création d'un objet par copie (deux tables), boutique (mise à jour, suppression, ajout), fonction de
PNJ modifiée en place, ajout à un fichier de content/, transaction annulée sur erreur, refus d'un DROP et
d'un appel sans clé. Fenêtre de bureau (Windows 11, version 0.2.0) : ouverture par l'exécutable seul, titre
et icône, écran de connexion repris de world.conf, fermeture par la croix, erreur de port affichée en boîte
de dialogue. Non essayés : la fenêtre sous Linux et macOS (seule leur compilation est vérifiée par la CI), et
la relecture des modifications par un serveur ArchCore redémarré.
- Mettre à jour
versiondansCargo.toml(puiscargo buildpourCargo.lock) et ajouter une section## X.Y.Z — dateen tête deCHANGELOG.md. - Pousser une étiquette :
git tag vX.Y.Z && git push origin vX.Y.Z. Le workflowReleasevérifie que l'étiquette correspond àCargo.toml, compile pour Windows, Linux et macOS et publie les trois archives avec les notes du changelog.
GPL-3.0-or-later, comme ArchCore et ArchRust. Keira3 (AGPL-3.0) a servi de modèle : aucun code n'en est repris, seul le principe l'est.
