feat: chef commands moved to admin + PlaceholderAPI integration

Chef → admin: the chef role no longer grants any command privilege.
All team-management subcommands now take <team> as an argument and are
gated by their crcore.team.<action> permission only:
- add <team> <player>
- remove <team> <player>
- transfer <team> <player>
- visibility <team> <PUBLIC|PRIVATE>
- setspawn <team> (still player-only — needs admin's location)

The LEADER role is kept in the data model (Team / TeamMember) and remains
usable by game plugins via the API, but does not unlock any default
command. Future work can re-introduce chef-specific commands if needed.

PlaceholderAPI: auto-detected at CRCore.enable(). If the PAPI plugin is
present on the server, CRCorePlaceholderExpansion registers automatically;
otherwise the lib runs without it (no NoClassDefFoundError thanks to the
indirection through doRegisterPlaceholderHook).

Placeholders exposed:
- Team: %crcore_team%, %crcore_team_name/tag/color/color_chat/size/
  visibility/leader_name/total_score%, %crcore_team_score_<name>%
- Player: %crcore_player_score_<name>%, %crcore_player_score_total%

Dependency: me.clip:placeholderapi:2.11.6, scope provided. New repo:
https://repo.extendedclip.com/content/repositories/placeholderapi/.

docs/features.md, decisions.md and the builtin-commands diagram updated to
reflect the simpler admin/player two-tier model and the PAPI section.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
Antone Barbaud
2026-06-09 15:05:02 +02:00
parent 002fefdc02
commit 8b7cad3fce
12 changed files with 376 additions and 108 deletions
+46
View File
@@ -367,6 +367,52 @@ Format léger : une décision = un titre + contexte + choix + raison.
bases existantes, ALTER TABLE manuel ou suppression du fichier
(les bases d'event sont jetables).
## 2026-06-09 — Toutes les commandes "chef" deviennent admin (révision)
- **Révision** de la décision "Refonte permissions + modèle admin/chef/joueur"
prise plus tôt aujourd'hui.
- **Choix** : le rôle chef n'apporte plus aucun privilège de commande pour
l'instant. Toutes les opérations de gestion d'équipe (`add`, `remove`,
`transfer`, `visibility`, `setspawn`) deviennent **admin** :
- Signature avec `<team>` en argument (au lieu d'implicite "ma team").
- Permission `crcore.team.<action>` requise.
- Plus de check `isLeader(...)` dans `execute()`.
- **Raison** : le user a explicitement décidé que pour l'instant le chef
n'a pas plus de privilèges qu'un joueur lambda côté commandes. Le rôle
`LEADER` reste dans le modèle de données (utile pour les game plugins qui
pourraient l'exploiter via l'API, ou pour de futures commandes), mais il
ne gate plus rien au niveau du framework de commandes.
- **Conséquences** :
- `TeamRemoveSubCommand` : refuse de retirer le chef (l'admin doit
`setleader` d'abord). Pas un check chef, juste une garde de cohérence.
- `TeamTransferSubCommand` : devient l'équivalent admin "strict" de
`setleader` (membre existant uniquement). Les deux cohabitent ; doc dit
quand préférer l'un ou l'autre.
- `TeamSetSpawnSubCommand` : reste `playerOnly` car nécessite la
`Location` de l'exécutant — mais c'est désormais l'admin qui se place
à l'endroit voulu et tape `/core team setspawn <team>`.
## 2026-06-09 — Intégration PlaceholderAPI (optionnelle, auto-détectée)
- **Choix** : `CRCore.enable()` détecte la présence du plugin PlaceholderAPI
via `pluginManager.getPlugin("PlaceholderAPI")` et enregistre
automatiquement `CRCorePlaceholderExpansion` si présent. Aucune action
requise côté plugin de jeu.
- **Dépendance Maven** : `me.clip:placeholderapi:2.11.6` en scope
`provided` (depuis `https://repo.extendedclip.com/...`). Le jar PAPI
n'est PAS embarqué — c'est un plugin runtime indépendant.
- **Indirection de chargement** : la méthode privée
`doRegisterPlaceholderHook()` isole la référence à
`CRCorePlaceholderExpansion`. Si PAPI est absent, la méthode n'est jamais
appelée et le bytecode référençant `me.clip.placeholderapi.*` n'est pas
vérifié → pas de `NoClassDefFoundError`.
- **Placeholders exposés** :
- Team : `%crcore_team%`, `%crcore_team_name/tag/color/color_chat/size/`
`visibility/leader_name/total_score%`, `%crcore_team_score_<name>%`
- Player : `%crcore_player_score_<name>%`, `%crcore_player_score_total%`
- **Override** : `CRCore.registerPlaceholderHook()` est `protected` — une
sous-classe peut ajouter des placeholders ou skipper la hook.
## 2026-06-09 — Nouvelle commande `/core team setleader`
- **Choix** : ajout de `TeamSetLeaderSubCommand` (`/core team setleader