2.9 KiB
⚙️ Plateforme & Injection CommandMap - betterMcCommands
Ce document explique le fonctionnement sous le capot de l'injection dynamique, de l'isolation des namespaces et de la gestion du cycle de vie des commandes.
📑 Sommaire
- 1. Comment Fonctionne l'Injection Dynamique ?
- 2. Enveloppe Bukkit (
PaperCommandWrapper) - 3. Désenregistrement à Chaud & Hot Reload
- 4. Isolation et Multi-Instances
1. Comment Fonctionne l'Injection Dynamique ?
Au lieu de forcer les développeurs à déclarer chaque commande dans le fichier plugin.yml, betterMcCommands utilise la classe PaperCommandMapInjector :
- Résolution de la
CommandMap:- Sur Paper / Bukkit moderne,
Bukkit.getServer().getCommandMap()est interrogé. - Sur les versions antérieures, un fallback par réflexion inspecte l'attribut
commandMapdeCraftServer.
- Sur Paper / Bukkit moderne,
- Accès à la table des commandes connues (
knownCommands) :- L'injecteur accède à la table interne
Map<String, Command>deSimpleCommandMap.
- L'injecteur accède à la table interne
- Enregistrement de la commande racine et de ses alias :
- La commande est enregistrée avec le préfixe du plugin (ex:
/monplugin:commande). - L'alias principal est rendu disponible directement (ex:
/commande).
- La commande est enregistrée avec le préfixe du plugin (ex:
2. Enveloppe Bukkit (PaperCommandWrapper)
Pour que le serveur Minecraft sache router les commandes vers le moteur betterMcCommands, chaque Command racine est enveloppée dans une instance de PaperCommandWrapper qui étend org.bukkit.command.Command :
execute(CommandSender sender, String label, String[] args)-> Transmet l'appel auCommandDispatcher.tabComplete(CommandSender sender, String alias, String[] args)-> Calcule les suggestions viaCommandDispatcher.tabComplete(...)et les retourne au client.
3. Désenregistrement à Chaud & Hot Reload
Lorsqu'un plugin est désactivé (onDisable()) ou rechargé, il est primordial de retirer proprement les commandes pour éviter les fuites de mémoire et les conflits d'alias.
L'appel à commandsManager.unregisterAll() :
- Dé-enregistre chaque wrapper de la
CommandMap. - Supprime toutes les entrées associées de la table
knownCommands. - Réinitialise le
CooldownManageret leConfirmationManager. - Vide le bus d'événements
CommandEventManager.
4. Isolation et Multi-Instances
Chaque plugin utilisant betterMcCommands peut posséder sa propre instance indépendante grâce à :
BetterMcCommands pluginA = BetterMcCommands.create(monPluginA);
BetterMcCommands pluginB = BetterMcCommands.create(monPluginB);
Chaque instance possède son propre namespace, son propre bus d'événements et sa propre table de cooldowns/confirmations sans interférence mutuelle.