GroupeZ Docs

Base de données

Architecture de la base de données, tables et moteurs de stockage de zEssentials

zEssentials utilise une base de données relationnelle pour conserver toutes les données des joueurs, les économies, les sanctions, les coffres, etc. Cette page présente les moteurs de stockage disponibles, le schéma complet de la base, les optimisations de performance et le système de migrations.

Moteurs de stockage

Configurez l'option storage-type du config.yml pour choisir votre moteur.

ValeurMoteurRecommandé pour
SQLITEFichier SQLite localInstallation et tests uniquement
MYSQLMySQL via HikariCPProduction
MARIADBMariaDB via HikariCP (driver MariaDB)Production
HIKARICPMySQL/MariaDB via HikariCPProduction
JSONUn fichier JSON par joueurDéconseillé

SQLITE

SQLite est le moteur par défaut. Les données sont stockées dans un fichier local, plugins/zEssentials/database.db. Aucun serveur de base de données externe n'est nécessaire.

storage-type: SQLITE

SQLite est prévu uniquement pour l'installation et les tests. Certaines fonctionnalités sont limitées (par exemple la mise à jour des sanctions au démarrage du plugin), il n'autorise qu'un seul écrivain à la fois et il ne peut pas être partagé entre plusieurs serveurs.

N'utilisez pas SQLite en production. Passez à MYSQL, MARIADB ou HIKARICP avant d'ouvrir votre serveur.

MYSQL, MARIADB et HIKARICP

Ces trois valeurs se connectent à un serveur MySQL ou MariaDB. Elles utilisent toutes un pool de connexions HikariCP, qui réutilise les connexions, vérifie leur état et élimine celles qui sont périmées. MARIADB se connecte avec le driver JDBC MariaDB (jdbc:mariadb:), MYSQL et HIKARICP utilisent une URL jdbc:mysql:.

storage-type: HIKARICP

database-configuration:
  table-prefix: "zessentials_"
  host: 192.168.10.10
  port: 3306
  user: homestead
  password: 'secret'
  database: zessentials
  debug: false

Le driver JDBC MariaDB n'est pas inclus dans le JAR : il est téléchargé depuis Maven Central par Paper au démarrage du serveur (voir Installation).

Recommandé

Pour tout serveur accueillant de vrais joueurs, utilisez HIKARICP (ou MARIADB si votre serveur utilise MariaDB). Il gère efficacement les accès concurrents à la base et est indispensable pour partager les données entre plusieurs serveurs.

JSON

storage-type: JSON

Les données sont stockées dans un fichier par joueur, plugins/zEssentials/users/<uuid>.json. Ce moteur ne supporte pas toutes les fonctionnalités : les coffres, la boîte aux lettres d'items, l'historique du chat, le classement de l'économie (baltop), les logs de transactions et de commandes ne sont pas disponibles, et les convertisseurs de données ne peuvent pas être utilisés.

Référence de la configuration

PropriétéValeur par défautDescription
table-prefixzessentials_Préfixe appliqué à toutes les tables
host192.168.10.10Nom d'hôte ou adresse IP du serveur de base de données
port3306Port du serveur de base de données
userhomesteadNom d'utilisateur
passwordsecretMot de passe
databasezessentialsNom de la base (elle doit déjà exister)
debugfalseAffiche les requêtes SQL exécutées

Changez toujours les identifiants par défaut avant de passer en production. Les valeurs ci-dessus ne sont que des exemples.

Tables de la base de données

zEssentials crée 25 tables (présentées ci-dessous avec le préfixe par défaut zessentials_), ainsi que la table zessentials_migrations utilisée pour suivre les migrations appliquées. Chaque table est décrite avec ses colonnes, leurs types et leur rôle.

zessentials_users

Données principales des joueurs. Une ligne par joueur.

ColonneTypeCléDescription
unique_idUUIDPKUUID du joueur
nameVARCHAR(16)Nom actuel du joueur
last_locationTEXTDernière position connue, sérialisée
play_timeBIGINTTemps de jeu total
ban_sanction_idBIGINTID du ban actif dans zessentials_sanctions
mute_sanction_idBIGINTID du mute actif dans zessentials_sanctions
voteBIGINTNombre total de votes
vote_offlineINTVotes reçus hors ligne
frozenBOOLEANIndique si le joueur est actuellement gelé
fly_secondsBIGINTTemps de vol temporaire restant en secondes
player_timeBIGINTHeure personnelle définie avec /ptime (réappliquée à la connexion)
player_weatherVARCHAR(32)Météo personnelle définie avec /pweather (réappliquée à la connexion)
created_atTIMESTAMPPremière apparition du compte
updated_atTIMESTAMPDernière mise à jour des données

zessentials_economies

Soldes des joueurs pour chaque économie. Supporte plusieurs devises.

ColonneTypeCléDescription
unique_idUUIDPK (composite)UUID du joueur
economy_nameVARCHARPK (composite)Nom de l'économie/devise
amountDECIMAL(65,2)Solde actuel

zessentials_economy_transactions

Historique de toutes les transactions économiques entre joueurs ou depuis le serveur.

ColonneTypeCléDescription
from_unique_idUUIDUUID de l'émetteur
to_unique_idUUIDUUID du destinataire
economy_nameVARCHARNom de l'économie/devise
amountDECIMAL(65,2)Montant de la transaction
from_amountDECIMAL(65,2)Solde de l'émetteur après la transaction
to_amountDECIMAL(65,2)Solde du destinataire après la transaction
reasonTEXTRaison ou description de la transaction

zessentials_user_homes

Positions des homes des joueurs.

ColonneTypeCléDescription
unique_idUUIDPK (composite)UUID du joueur
nameVARCHARPK (composite)Nom du home
locationTEXTPosition sérialisée (monde, x, y, z, yaw, pitch)
materialVARCHARMatériau de l'icône dans l'interface
is_publicBOOLEANIndique si le home est public (/homepublic) et peut être visité par tous
categoryVARCHAR(32)Catégorie du home (/homecategory)
is_favoriteBOOLEANIndique si le home est en favori (/homefavorite)

zessentials_user_home_shares

Homes partagés avec des joueurs précis (/homeshare). Les partages sont supprimés lorsque le home est supprimé.

ColonneTypeCléDescription
owner_idUUIDPK (composite)UUID du propriétaire du home
home_nameVARCHARPK (composite)Nom du home partagé
target_idUUIDPK (composite)UUID du joueur avec qui le home est partagé

zessentials_user_ignores

Joueurs ignorés avec /ignore (les messages privés, les demandes de téléportation et les mails texte sont bloqués).

ColonneTypeCléDescription
unique_idUUIDPK (composite)UUID du joueur qui ignore
ignored_idUUIDPK (composite)UUID du joueur ignoré

zessentials_sanctions

Toutes les sanctions (bans, mutes, kicks) avec leur historique complet.

ColonneTypeCléDescription
idBIGINTPK (auto-incrément)ID de la sanction
player_unique_idUUIDUUID du joueur sanctionné
sender_unique_idUUIDUUID du membre du staff ayant appliqué la sanction
sanction_typeVARCHARType de sanction (BAN, MUTE, KICK, etc.)
reasonTEXTRaison de la sanction
durationBIGINTDurée en millisecondes
expired_atTIMESTAMPDate d'expiration de la sanction

zessentials_chat_message

Historique des messages envoyés dans le chat.

ColonneTypeCléDescription
unique_idUUIDUUID du joueur
contentTEXTContenu du message
created_atTIMESTAMPDate d'envoi du message

zessentials_private_messages

Historique des messages privés entre joueurs.

ColonneTypeCléDescription
sender_unique_idUUIDUUID de l'émetteur
receiver_unique_idUUIDUUID du destinataire
contentTEXTContenu du message

zessentials_commands

Historique des commandes exécutées par les joueurs (lorsque enable-command-log est activé).

ColonneTypeCléDescription
unique_idUUIDUUID du joueur
commandTEXTCommande complète
created_atTIMESTAMPDate d'exécution de la commande

zessentials_user_mail_boxes

Items en attente dans la boîte aux lettres d'un joueur (boîte aux lettres d'items).

ColonneTypeCléDescription
idBIGINTPK (auto-incrément)ID de l'entrée
unique_idUUIDUUID du destinataire
itemstackTEXTItemStack sérialisé
expired_atTIMESTAMPDate d'expiration de l'item

zessentials_user_mail_messages

Mails texte envoyés avec /mail send et /mail sendall.

ColonneTypeCléDescription
idBIGINTPK (auto-incrément)ID du mail
unique_idUUIDUUID du destinataire
sender_idUUIDUUID de l'expéditeur (null si envoyé par la console)
sender_nameVARCHAR(36)Nom de l'expéditeur
contentTEXTContenu du mail
is_readBOOLEANIndique si le mail a été lu (/mail read)
created_atTIMESTAMPDate d'envoi du mail

zessentials_vaults

Métadonnées des coffres de stockage des joueurs.

ColonneTypeCléDescription
unique_idUUIDPK (composite)UUID du joueur
vault_idBIGINTPK (composite)Numéro du coffre
nameVARCHARNom personnalisé du coffre
iconTEXTIcône affichée dans l'interface

zessentials_vault_items

Items contenus dans les coffres des joueurs.

ColonneTypeCléDescription
unique_idUUIDPK (composite)UUID du joueur
vault_idBIGINTPK (composite)Numéro du coffre
slotBIGINTPK (composite)Emplacement de l'item dans le coffre
itemTEXTItemStack sérialisé
quantityBIGINTQuantité de l'item

zessentials_player_slots

Nombre d'emplacements de coffre débloqués par joueur.

ColonneTypeCléDescription
unique_idUUIDPKUUID du joueur
slotsBIGINTNombre d'emplacements débloqués

zessentials_user_options

Options booléennes de chaque joueur (vanish, god, social spy, réception des téléportations, son de ping...).

ColonneTypeCléDescription
unique_idUUIDPKUUID du joueur
option_nameVARCHARIdentifiant de l'option
option_valueBOOLEANÉtat actuel de l'option

zessentials_user_cooldowns

Cooldowns de chaque joueur pour les commandes et fonctionnalités.

ColonneTypeCléDescription
unique_idUUIDPK (composite)UUID du joueur
cooldown_nameVARCHARPK (composite)Identifiant du cooldown
cooldown_valueBIGINTDate d'expiration du cooldown en millisecondes

zessentials_user_play_times

Sessions de jeu individuelles avec leurs informations de connexion.

ColonneTypeCléDescription
unique_idUUIDUUID du joueur
play_timeBIGINTDurée de la session
addressVARCHARAdresse IP du joueur pour la session

zessentials_user_power_tools

Power tools associant un matériau à une commande.

ColonneTypeCléDescription
unique_idUUIDPK (composite)UUID du joueur
materialVARCHARPK (composite)Nom du matériau Minecraft
commandTEXTCommande exécutée à l'utilisation de l'item

zessentials_steps

Progression des joueurs dans les étapes du module Step.

ColonneTypeCléDescription
unique_idUUIDPK (composite)UUID du joueur
step_nameVARCHARPK (composite)Identifiant de l'étape
dataJSONDonnées libres de l'étape
play_time_startBIGINTTemps de jeu au début de l'étape
play_time_endBIGINTTemps de jeu à la fin de l'étape
play_time_betweenBIGINTTemps de jeu passé entre le début et la fin
finished_atTIMESTAMPDate de fin de l'étape (null si en cours)

zessentials_vote_sites

Date du dernier vote de chaque joueur sur chaque site.

ColonneTypeCléDescription
player_idUUIDPK (composite)UUID du joueur
siteVARCHARPK (composite)Identifiant du site de vote
last_vote_atTIMESTAMPDate du dernier vote sur ce site

Liaisons vérifiées entre comptes Discord et Minecraft.

ColonneTypeCléDescription
user_idBIGINTPK (composite)ID de l'utilisateur Discord
unique_idUUIDPK (composite)UUID du joueur Minecraft
minecraft_nameVARCHAR(16)Nom Minecraft
discord_nameVARCHAR(32)Nom d'utilisateur Discord

Codes temporaires utilisés pendant la liaison des comptes.

ColonneTypeCléDescription
codeVARCHARPK (composite)Code de liaison temporaire
user_idBIGINTPK (composite)ID de l'utilisateur Discord
discord_nameVARCHAR(32)Nom d'utilisateur Discord

Historique de toutes les liaisons et suppressions de liaison.

ColonneTypeCléDescription
idBIGINTPK (auto-incrément)ID de l'entrée
actionVARCHARType d'action (LINK, UNLINK, etc.)
discord_idBIGINTID de l'utilisateur Discord
minecraft_idUUIDUUID du joueur Minecraft
discord_nameVARCHAR(32)Nom Discord au moment de l'action
minecraft_nameVARCHAR(16)Nom Minecraft au moment de l'action
dataTEXTDonnées supplémentaires sur l'action

zessentials_storages

Stockage clé-valeur générique pour les données internes du serveur.

ColonneTypeCléDescription
nameVARCHARPKClé de stockage
contentTEXTValeur sérialisée

Sauf mention contraire, la plupart des tables contiennent aussi les colonnes d'horodatage created_at et updated_at.

Optimisations de performance

zEssentials met en place plusieurs niveaux d'optimisation des écritures pour limiter la charge sur la base de données et garder un gameplay fluide.

Traitement par lots (TypeSafeCache)

Les logs et les mises à jour fréquentes ne sont pas écrits un par un. Les logs de commandes, les messages du chat, les messages privés, les transactions économiques et les mises à jour du temps de vol sont accumulés dans un TypeSafeCache puis envoyés en base par lots, à un intervalle configurable :

batch-auto-save: 10000 # Intervalle d'envoi en millisecondes

L'intervalle par défaut est de 10 secondes (10000 ms). Cela réduit considérablement le nombre d'allers-retours avec la base par rapport à une écriture individuelle de chaque entrée.

Regroupement des mises à jour de l'économie

Les mises à jour des soldes sont regroupées par joueur et par économie grâce à un AtomicReference. Lorsque plusieurs opérations visent le même solde en peu de temps (par exemple des achats rapides dans un shop), l'écriture en attente est réutilisée et seule la dernière valeur est enregistrée. Cela évite les écritures inutiles tout en garantissant que la base contient toujours le bon solde final.

Écritures asynchrones

Toutes les autres écritures (homes, options, items des coffres, sanctions...) sont exécutées de façon asynchrone, afin que le thread principal du serveur ne soit jamais bloqué par une requête.

Système de migrations

zEssentials utilise un système de migrations séquentielles (fourni par la bibliothèque Sarah) pour faire évoluer le schéma de la base d'une version à l'autre. Les migrations appliquées sont enregistrées dans la table zessentials_migrations : seules les nouvelles migrations sont exécutées au démarrage.

Il y a actuellement 37 migrations enregistrées :

ÉtapeMigrations
Tables principalesusers, storages, user_options, user_cooldowns, economies, economy_transactions, user_homes
Socialuser_ignores, user_home_shares
Sanctions & logssanctions, colonnes ban_sanction_id/mute_sanction_id sur users, chat_message, commands, user_play_times
Fonctionnalités joueursuser_power_tools, user_mail_boxes, colonnes vote/vote_offline, vote_sites
Coffresvault_items, vaults, player_slots
Colonnes utilisateurcolonnes frozen, fly_seconds, player_time/player_weather sur users
Homescolonnes is_public, category, is_favorite sur user_homes
Économiecolonne reason sur economy_transactions
Discordlink_codes, link_accounts, link_histories
Refonteuser_power_tools (v2, clé primaire composite), mise à jour de player_slots, private_messages, steps (v2 avec les colonnes de temps de jeu)
Boîte aux lettresuser_mail_messages (mails texte)

Les migrations s'exécutent automatiquement au démarrage du serveur, sans aucune intervention manuelle. Si vous mettez à jour depuis une ancienne version, le plugin applique uniquement les migrations qui n'ont pas encore été exécutées.

Ne modifiez jamais manuellement la table de suivi des migrations et ne sautez aucune migration : cela pourrait laisser votre base dans un état incohérent. En cas d'erreur de migration, consultez la console du serveur et signalez le problème sur GitHub ou sur Discord.

Sur cette page

GroupeZ MCP

La documentation dans ton IA

Le MCP permet à ton IA de chercher dans la documentation GroupeZ et de lire les exemples à jour pour t’aider à configurer tes plugins.

Lecture seule · Sans clé API côté documentation

1. Copie l’adresse du serveur

Transport : HTTP (Streamable HTTP). Authentification : aucune. Ton outil utilise son propre modèle et ses propres limites d’abonnement.

  1. Ouvre Plugins dans ChatGPT sur le web, puis + → Ajouter un serveur MCP personnalisé.
  2. Nomme-le « GroupeZ Documentation », colle l’URL ci-dessus et choisis « Aucune authentification ». Crée puis installe le plugin.
  3. Dans une conversation, tape @ et sélectionne ce plugin avant d’envoyer ta question. Si nécessaire, active search, get_page et list_pages dans ses paramètres.
Guide officiel de cet outil

3. Pose une question

Utilise le MCP GroupeZ pour m’aider à créer un inventaire zMenu. Recherche les pages pertinentes, lis les exemples et cite tes sources.
Autres clients et dépannage

Pour les clients utilisant mcpServers, adapte cet exemple à leur format :

{
  "mcpServers": {
    "groupez-docs": {
      "url": ""
    }
  }
}

Les outils disponibles sont search, get_page et list_pages. Après une mise à jour, actualise les outils du connecteur. Si ton IA n’y accède pas, vérifie que le connecteur est activé dans la conversation et que ton compte autorise les MCP personnalisés. Ouvrir l’URL dans un navigateur n’est pas un test MCP.