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

TableContenu
tcg_playersuuid, name, last_seen
tcg_cardsplayer_uuid, card_id, amount, first_obtained, last_obtained
tcg_cards (1.1)+ holo_amount, holo_first
tcg_completionsplayer_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_metaschema_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.
  • StorageProvider est l'abstraction : une implémentation MySQL n'aura qu'à fournir les mêmes opérations.