Stockage
config.yml > storage.type : SQLITE (un serveur, défaut) ou MYSQL (MySQL ou MariaDB). Le driver est fourni par Paper.
Réseau de serveurs (MySQL) : tous les serveurs pointent vers la même base (storage.mysql, préfixe de tables configurable). Un joueur retrouve partout ses cartes découvertes, compteurs, brillantes, poussière, titre, objectifs et récompenses ; l'hôtel des ventes et les classements sont communs. Les écritures sont additives (aucun serveur n'écrase l'autre) et la connexion se rétablit seule si MySQL redémarre.
Les items dans l'inventaire restent propres à chaque serveur, comme tout item Minecraft : une carte posée dans l'inventaire sur le lobby n'apparaît pas sur la survie, sauf avec un plugin de synchronisation d'inventaire. La collection, elle, est partagée. Pour faire passer une carte d'un serveur à l'autre, l'hôtel des ventes (commun) fonctionne. Les commandes admin sur un joueur connecté à un autre serveur du réseau modifient la base ; ce serveur-là ne voit le changement qu'à la reconnexion du joueur.
SQLite (plugins/TCG/data.db, driver fourni par Paper) :
| Table | Contenu |
|---|---|
tcg_players | uuid, name, last_seen |
tcg_cards | player_uuid, card_id, amount, first_obtained, last_obtained |
tcg_cards (1.1) | + holo_amount, holo_first |
tcg_completions | player_uuid, group_id, completed_at (collections, paliers nature@25, classeur *) |
tcg_stats (1.1) | player_uuid, stat, value : poussière, paquets ouverts, échanges... |
tcg_players (1.1) | + title |
tcg_trades (1.2) | historique des échanges : date, joueurs, ce que chacun a donné |
tcg_market (1.2) | annonces de l'hôtel des ventes (item sérialisé, prix, monnaie, état, livraisons) |
tcg_objectives (1.2) | progression des objectifs par période (les périodes passées sont purgées) |
tcg_meta | schema_version (3 depuis la 1.2) |
- La collection est chargée pendant la pré-connexion (hors thread principal) puis gardée en mémoire tant que le joueur est connecté.
- Chaque obtention est écrite en asynchrone par un thread SQLite dédié (upsert
amount = amount + n, ordre garanti). Le thread principal ne fait jamais de requête. - À l'arrêt du serveur, les écritures en attente sont terminées avant la fermeture.
- Une base 1.0 ou 1.1 est migrée automatiquement au démarrage (tables et colonnes ajoutées, aucune donnée modifiée). Passer de SQLite à MySQL ne copie pas les données existantes.
StorageProviderest l'abstraction : une implémentation MySQL n'aura qu'à fournir les mêmes opérations.