feat: dynamic command registration + Maven publication setup
CRCore.registerCommand() now falls back to dynamic registration via the server's internal CommandMap (reflection on CraftServer.commandMap) when the command is absent from the host plugin's plugin.yml. Game plugins can now use CR-Core with zero plugin.yml changes — just instantiate CRCore. If the command IS declared in plugin.yml, CR-Core detects it and uses setExecutor/setTabCompleter as before. pom.xml: distributionManagement targeting Gitea Packages (https://gitea.luc-rival.fr/api/packages/admin/maven), plus maven-source-plugin (3.3.0) and maven-javadoc-plugin (3.6.3) so each mvn deploy publishes the main jar, a -sources.jar and a -javadoc.jar. doclint=none on javadoc to tolerate partial doc. docs/setup.md: clarifies that the commands: entry in plugin.yml is now optional. docs/decisions.md: new decision logged for the dynamic registration approach. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -322,3 +322,24 @@ Format léger : une décision = un titre + contexte + choix + raison.
|
||||
de jeu créent dans la même DB. CR-Core et le plugin de jeu partagent le
|
||||
même fichier SQLite (par défaut `<dataFolder>/crcore.db`) ; le préfixe
|
||||
isole proprement.
|
||||
|
||||
## 2026-06-09 — Enregistrement dynamique de la commande (plugin.yml optionnel)
|
||||
|
||||
- **Choix** : `CRCore.registerCommand()` tente d'abord
|
||||
`plugin.getCommand(name)`. Si la commande n'est pas déclarée dans le
|
||||
`plugin.yml` du plugin hôte, fallback sur enregistrement dynamique via le
|
||||
`CommandMap` interne du serveur (accédé par réflexion sur
|
||||
`CraftServer.commandMap`).
|
||||
- **Raison** : un plugin de jeu peut maintenant utiliser CR-Core en
|
||||
**changeant uniquement le `pom.xml` + une instanciation de `CRCore`** —
|
||||
zéro modification du `plugin.yml`. Si l'utilisateur veut customiser
|
||||
description/aliases côté Bukkit, il peut quand même déclarer la commande
|
||||
dans plugin.yml ; CR-Core détecte et utilise cette déclaration.
|
||||
- **Wrapper Bukkit** : on crée une `org.bukkit.command.Command` anonyme
|
||||
qui délègue `execute` / `tabComplete` au `CoreCommand` (qui est notre
|
||||
`BaseCommand`). On copie nom + aliases + description depuis le
|
||||
`CoreCommand` vers le wrapper.
|
||||
- **Réflexion** : stable sur Paper 1.16.5 ; le champ `commandMap` de
|
||||
`CraftServer` existe depuis longtemps. Si une version future cassait
|
||||
l'accès, le code log un severe et continue (les autres features de
|
||||
CRCore restent fonctionnelles).
|
||||
|
||||
+15
-5
@@ -48,13 +48,23 @@ name: MyGame
|
||||
main: fr.exemple.mygame.MyGamePlugin
|
||||
version: 1.0
|
||||
api-version: 1.16
|
||||
commands:
|
||||
core:
|
||||
description: Commandes CR-Core
|
||||
# aliases optionnels — équivalents au point de vue Bukkit
|
||||
aliases: [cr, crcore]
|
||||
```
|
||||
|
||||
> **Pas besoin de déclarer la commande `core`** : CR-Core l'enregistre
|
||||
> dynamiquement via le `CommandMap` du serveur quand elle est absente du
|
||||
> plugin.yml. Si tu préfères la déclarer quand même (pour customiser la
|
||||
> description ou les aliases côté Bukkit), tu peux ajouter :
|
||||
>
|
||||
> ```yaml
|
||||
> commands:
|
||||
> core:
|
||||
> description: Commandes CR-Core
|
||||
> aliases: [cr, crcore]
|
||||
> ```
|
||||
>
|
||||
> Dans ce cas, CR-Core détecte la commande déclarée et s'y branche
|
||||
> normalement via `setExecutor` (pas d'enregistrement dynamique).
|
||||
|
||||
### Code minimal
|
||||
|
||||
```java
|
||||
|
||||
Reference in New Issue
Block a user