« Plugin:Écurie » : différence entre les versions
De Nefald
Autres actions
Page créée avec « # Ecurie <p align="center"> <img src="nanobanana-output/Ecurie_logo.png" alt="Ecurie Logo" width="300" /> </p> Plugin PaperMC de gestion des chevaux RP pour le serveur Nefald. Permet aux joueurs de mettre leurs chevaux en pension dans des étables gérées par des NPCs Citizens. Supporte les transferts inter-étables, la tarification en écus (Banco/Vault), et expose des placeholders PlaceholderAPI. --- ## Prérequis | Dépendance | Rôle | Type | |---|--... » |
Aucun résumé des modifications |
||
| Ligne 1 : | Ligne 1 : | ||
= Ecurie = | |||
Plugin PaperMC de gestion des chevaux RP pour le serveur Nefald. | Plugin PaperMC de gestion des chevaux RP pour le serveur Nefald. | ||
| Ligne 11 : | Ligne 9 : | ||
--- | --- | ||
== Prérequis == | |||
| Dépendance | {| class="wikitable" | ||
|- | ! Dépendance !! Rôle !! Type | ||
| PaperMC 1.21.x | Serveur | Obligatoire | | |- | ||
| Vault | API économie | Optionnel (fallback si Banco absent) | | | PaperMC 1.21.x || Serveur || Obligatoire | ||
| Banco | Économie item-based (écus) | Optionnel (recommandé) | | |- | ||
| Citizens | NPCs d'interface | Optionnel | | | Vault || API économie || Optionnel (fallback si Banco absent) | ||
| PlaceholderAPI | Placeholders | Optionnel | | |- | ||
| MyPet | Détection familiers | Optionnel | | | Banco || Économie item-based (écus) || Optionnel (recommandé) | ||
|- | |||
| Citizens || NPCs d'interface || Optionnel | |||
|- | |||
| PlaceholderAPI || Placeholders || Optionnel | |||
|- | |||
| MyPet || Détection familiers || Optionnel | |||
|} | |||
Le plugin charge sans aucune de ces dépendances optionnelles. | Le plugin charge sans aucune de ces dépendances optionnelles. | ||
| Ligne 26 : | Ligne 31 : | ||
--- | --- | ||
== Installation == | |||
1. Déposer `Ecurie-<version>.jar` dans `plugins/` | 1. Déposer `Ecurie-<version>.jar` dans `plugins/` | ||
| Ligne 35 : | Ligne 40 : | ||
--- | --- | ||
== Configuration == | |||
=== `config.yml` === | |||
<syntaxhighlight lang="yaml"> | |||
database: | database: | ||
file: "ecurie.db" # Chemin relatif au dossier du plugin | file: "ecurie.db" # Chemin relatif au dossier du plugin | ||
| Ligne 53 : | Ligne 58 : | ||
phantom-horse: | phantom-horse: | ||
health: 20.0 # PV du cheval fantôme en box | health: 20.0 # PV du cheval fantôme en box | ||
</syntaxhighlight> | |||
=== `lang.yml` === | |||
Tous les messages joueurs. Supporte les balises MiniMessage (`<red>`, `<gold>`, etc.). | Tous les messages joueurs. Supporte les balises MiniMessage (`<red>`, `<gold>`, etc.). | ||
| Ligne 62 : | Ligne 67 : | ||
--- | --- | ||
== Commandes admin == | |||
Permission requise : `ecurie.admin` (op par défaut). Alias : `/ec` | Permission requise : `ecurie.admin` (op par défaut). Alias : `/ec` | ||
=== Wand — sélection de région === | |||
<syntaxhighlight lang="text"> | |||
/ecurie wand [on|off] | /ecurie wand [on|off] | ||
</syntaxhighlight> | |||
Active/désactive le wand bâton. Clic gauche = point 1, clic droit = point 2. Utilisé pour scanner les boxes d'une étable. | Active/désactive le wand bâton. Clic gauche = point 1, clic droit = point 2. Utilisé pour scanner les boxes d'une étable. | ||
=== Étables === | |||
<syntaxhighlight lang="text"> | |||
/ecurie stable create <nom> [type] — Crée l'étable ET scanne automatiquement les boxes. Type: STABLE, TERRESTRE, AQUATIQUE, VOLIERE. | /ecurie stable create <nom> [type] — Crée l'étable ET scanne automatiquement les boxes. Type: STABLE, TERRESTRE, AQUATIQUE, VOLIERE. | ||
/ecurie stable delete <id> — Supprime une étable | /ecurie stable delete <id> — Supprime une étable | ||
/ecurie stable setnpc <stable_id> — Lie le NPC Citizens le plus proche (≤5 blocs) à l'étable | /ecurie stable setnpc <stable_id> — Lie le NPC Citizens le plus proche (≤5 blocs) à l'étable | ||
/ecurie stable list — Liste toutes les étables | /ecurie stable list — Liste toutes les étables | ||
</syntaxhighlight> | |||
=== Boxes === | |||
<syntaxhighlight lang="text"> | |||
/ecurie box list <stable_id> — Liste les boxes d'une étable | /ecurie box list <stable_id> — Liste les boxes d'une étable | ||
/ecurie box delete <box_id> — Supprime une box | /ecurie box delete <box_id> — Supprime une box | ||
/ecurie show [on|off] — Affiche les boxes en surbrillance (particules colorées : vertes=libre, rouges=occupée) | /ecurie show [on|off] — Affiche les boxes en surbrillance (particules colorées : vertes=libre, rouges=occupée) | ||
</syntaxhighlight> | |||
Détection : chaque stalle doit contenir un bloc spécifique configuré dans `config.yml` (`box-blocks`). Par défaut : | Détection : chaque stalle doit contenir un bloc spécifique configuré dans `config.yml` (`box-blocks`). Par défaut : | ||
* `STABLE` / `TERRESTRE` : '''WATER_CAULDRON''' | |||
* `AQUATIQUE` : '''PRISMARINE''' | |||
* `VOLIERE` : '''DAYLIGHT_DETECTOR''' | |||
La commande `stable create` détecte automatiquement tous ces blocs dans la région wand et enregistre les boxes immédiatement. | La commande `stable create` détecte automatiquement tous ces blocs dans la région wand et enregistre les boxes immédiatement. | ||
=== Chevaux === | |||
<syntaxhighlight lang="text"> | |||
/ecurie horse free <horse_id> — Libère un cheval de la DB (urgence admin) | /ecurie horse free <horse_id> — Libère un cheval de la DB (urgence admin) | ||
</syntaxhighlight> | |||
=== Divers === | |||
<syntaxhighlight lang="text"> | |||
/ecurie reload — Recharge config.yml et le cache ShowManager | /ecurie reload — Recharge config.yml et le cache ShowManager | ||
</syntaxhighlight> | |||
--- | --- | ||
== Commandes joueurs == | |||
Permission requise : `ecurie.use` (true par défaut). | Permission requise : `ecurie.use` (true par défaut). | ||
<syntaxhighlight lang="text"> | |||
/ecurie gui [dialog|inventory] — Change votre type d'interface (persistant via PDC) | /ecurie gui [dialog|inventory] — Change votre type d'interface (persistant via PDC) | ||
</syntaxhighlight> | |||
--- | --- | ||
== Workflow admin — Créer une étable == | |||
=== Étapes === | |||
1. | 1. '''Construire l'étable''' — poser le bloc cible de la box (ex: `WATER_CAULDRON`, `PRISMARINE`) dans chaque stalle. | ||
2. | 2. '''Activer le wand''' : `/ecurie wand on` → clic gauche (point A) + clic droit (coin B) pour délimiter la région | ||
3. | 3. '''Créer et scanner''' : `/ecurie stable create <nom> [type]` — crée l'étable ET enregistre automatiquement les boxes détectées (selon le type `TERRESTRE`, `AQUATIQUE` ou `VOLIERE`). | ||
4. | 4. '''(Optionnel) Lier un NPC''' : placer un Citizens devant l'étable, s'en approcher à < 5 blocs : `/ecurie stable setnpc <stable_id>` | ||
=== Visualiser les boxes === | |||
Après création, afficher les boxes avec particules colorées : | Après création, afficher les boxes avec particules colorées : | ||
<syntaxhighlight lang="text"> | |||
/ecurie show on | /ecurie show on | ||
</syntaxhighlight> | |||
* Particules '''vertes''' = box libre | |||
* Particules '''rouges''' = box occupée | |||
Désactiver l'affichage : | Désactiver l'affichage : | ||
<syntaxhighlight lang="text"> | |||
/ecurie show off | /ecurie show off | ||
</syntaxhighlight> | |||
--- | --- | ||
== Workflow joueur — Interagir avec une étable == | |||
Le joueur interagit via clic droit sur le NPC Citizens de l'étable. Le plugin propose deux types d'interfaces, configurables librement par chaque joueur (la préférence est persistante) : | Le joueur interagit via clic droit sur le NPC Citizens de l'étable. Le plugin propose deux types d'interfaces, configurables librement par chaque joueur (la préférence est persistante) : | ||
* '''Dialog (par défaut)''' : Une fenêtre de dialogue textuelle native (Paper 1.21.6+). Immersif et orienté RPG. | |||
* '''Inventory''' : Un inventaire classique sous forme de coffre pour les habitués. | |||
Une GUI s'ouvre avec les actions suivantes : | Une GUI s'ouvre avec les actions suivantes : | ||
=== Stocker un cheval === | |||
1. Amener le cheval à côté ou le monter | 1. Amener le cheval à côté ou le monter | ||
2. Cliquer | 2. Cliquer '''Stocker mon cheval''' dans la GUI | ||
3. | 3. '''Si le cheval n'a pas de nom custom''' (nom "Horse" ou absent) → une enclume s'ouvre pour nommer le cheval | ||
4. | 4. '''Si le cheval a déjà un nom custom''' → stockage direct sans nommage | ||
5. Coût : `price-in` de l'étable en sols | 5. Coût : `price-in` de l'étable en sols | ||
=== Récupérer un cheval === | |||
1. Cliquer | 1. Cliquer '''Récupérer un cheval''' | ||
2. Choisir le cheval dans la liste | 2. Choisir le cheval dans la liste | ||
3. Coût : `price-out` de l'étable | 3. Coût : `price-out` de l'étable | ||
=== Transférer ou Rapatrier un cheval === | |||
Le transfert peut être initié depuis l'écurie de départ ou de destination : | Le transfert peut être initié depuis l'écurie de départ ou de destination : | ||
* '''Depuis l'écurie d'origine (Transfert sortant) :''' Cliquer '''Transférer vers...''', sélectionner le cheval, puis choisir l'écurie de destination. | |||
* '''Depuis l'écurie d'arrivée (Rapatriement entrant) :''' Cliquer '''Transférer vers...''', le plugin liste vos chevaux situés dans d'autres étables. Cliquer sur l'un d'eux lance directement le rapatriement vers l'écurie actuelle. | |||
* '''Calcul de distance :''' Le délai de transfert et le coût en écus s'ajustent dynamiquement selon la distance réelle (calculée en blocs 3D) entre les deux étables (délai/coût de base + ajustement par tranche de 100 blocs). | |||
=== Renommer un cheval === | |||
1. Cliquer | 1. Cliquer '''Renommer un cheval''' | ||
2. Choisir le cheval dans la liste | 2. Choisir le cheval dans la liste | ||
3. Une enclume s'ouvre pré-remplie avec le nom actuel — modifier ou confirmer | 3. Une enclume s'ouvre pré-remplie avec le nom actuel — modifier ou confirmer | ||
4. Coût : `rename-price` en sols (défaut 50) | 4. Coût : `rename-price` en sols (défaut 50) | ||
=== Mes chevaux === | |||
Vue globale de tous les chevaux du joueur, toutes étables confondues. | Vue globale de tous les chevaux du joueur, toutes étables confondues. | ||
--- | --- | ||
== Placeholders (PlaceholderAPI) == | |||
Requiert PlaceholderAPI installé. | Requiert PlaceholderAPI installé. | ||
| Placeholder | {| class="wikitable" | ||
|- | ! Placeholder !! Valeur | ||
| `%ecurie_horses_count%` | Nombre de chevaux en pension du joueur | | |- | ||
| `%ecurie_horse_name_<n>%` | Nom du n-ième cheval (1-indexé, trié par nom) | | | `%ecurie_horses_count%` || Nombre de chevaux en pension du joueur | ||
| `%ecurie_horse_stable_<n>%` | Nom de l'étable du n-ième cheval | | |- | ||
| `%ecurie_horse_health_<n>%` | Santé (ex : `18.0/20.0`) | | | `%ecurie_horse_name_<n>%` || Nom du n-ième cheval (1-indexé, trié par nom) | ||
|- | |||
| `%ecurie_horse_stable_<n>%` || Nom de l'étable du n-ième cheval | |||
|- | |||
| `%ecurie_horse_health_<n>%` || Santé (ex : `18.0/20.0`) | |||
|} | |||
--- | --- | ||
== Permissions == | |||
| Permission | {| class="wikitable" | ||
|- | ! Permission !! Description !! Défaut | ||
| `ecurie.admin` | Accès aux commandes d'administration `/ecurie` | op | | |- | ||
| `ecurie.use` | Interaction avec les PNJ et `/ecurie gui` | true | | | `ecurie.admin` || Accès aux commandes d'administration `/ecurie` || op | ||
|- | |||
| `ecurie.use` || Interaction avec les PNJ et `/ecurie gui` || true | |||
|} | |||
--- | --- | ||
== Notes techniques == | |||
* '''Stockage''' : SQLite embarqué (shadowed, pas de dépendance runtime) | |||
* '''Chevaux fantômes''' : entités invulnérables, sans gravité ni IA, représentant le cheval en box. Toute monte ou interaction (inventaire du cheval, etc.) est strictement bloquée pour des raisons de sécurité. | |||
* '''Double étiquette de nom''' : Le nom du cheval (ligne 1, blanc) et le pseudo du propriétaire (ligne 2, gris italique) s'affichent au-dessus du cheval en box grâce à un Armor Stand passager invisible (`Marker`), nettoyé automatiquement lors du despawn. | |||
* '''Mort en box''' : perte définitive, slot libéré | |||
* '''Banco''' : intégré par réflexion pure (aucun jar requis à la compilation) | |||
* '''Stockage universel''' : Supporte tous les familiers montables (Chevaux, Chameaux, Cochons, Striders) ainsi que tous les familiers '''MyPet'''. | |||
* '''Typage des écuries (RPG)''' : Les familiers aquatiques (Dauphin, Calamar MyPet, etc.) ne peuvent aller que dans une écurie de type `AQUATIQUE`. Les familiers volants (Perroquet, Phantom, etc.) dans une `VOLIERE`. Les familiers terrestres dans une `TERRESTRE`. | |||
* '''MyPet''' : Ecurie stocke correctement le `UUID` du MyPet et s'assure qu'il est révoqué automatiquement pour éviter les doublons lors du stockage. | |||
* '''Transferts''' : vérifiés toutes les 10 secondes en async | |||
--- | --- | ||
== Build == | |||
<syntaxhighlight lang="bash"> | |||
./gradlew shadowJar | ./gradlew shadowJar | ||
# Sortie : build/libs/Ecurie-<version>.jar | # Sortie : build/libs/Ecurie-<version>.jar | ||
</syntaxhighlight> | |||
Requiert Java 21. La compilation locale sous Java 26+ peut échouer (incompatibilité Groovy/ASM) — utiliser la CI GitLab. | Requiert Java 21. La compilation locale sous Java 26+ peut échouer (incompatibilité Groovy/ASM) — utiliser la CI GitLab. | ||
| Ligne 229 : | Ligne 242 : | ||
--- | --- | ||
== Changelog == | |||
| Version | {| class="wikitable" | ||
|- | ! Version !! Date !! Notes | ||
| 1.0.0 | 2026-05-15 | V1 : pension, récupération, transfert, GUI | | |- | ||
| 1.0.1 | 2026-05-16 | PlaceholderAPI + garde MyPet | | | 1.0.0 || 2026-05-15 || V1 : pension, récupération, transfert, GUI | ||
| 1.0.2 | 2026-05-18 | Détection boxes : WATER_CAULDRON remplace HAY_BLOCK+Sign, scan+création fusionnés en une commande | | |- | ||
| 1.0.3 | 2026-05-19 | Nommage : skip enclume si cheval déjà nommé au stockage ; fix renommage (slot résultat pré-rempli) | | | 1.0.1 || 2026-05-16 || PlaceholderAPI + garde MyPet | ||
| 1.0.4 | 2026-06-11 | Fix validation renommage ; noms fantômes 2 lignes (ArmorStand passager) ; blocage monte ; correction calcul distance transferts ; possibilité d'initier un transfert (rapatriement) depuis l'écurie de destination ; animations de départ et d'arrivée des chevaux avec PNJ montés via pathfinding local ; attribution automatique de nom/skin configurables par défaut pour les NPCs d'écurie lors du setnpc | | |- | ||
| 1.1.0 | 2026-06-11 | Support de tous les familiers montables et des MyPet, configuration des prix en jeu depuis config.yml, ajout des types d'écuries (AQUATIQUE, VOLIERE, TERRESTRE) avec blocs de ciblage wand configurables et validations RPG pour le stockage. | | | 1.0.2 || 2026-05-18 || Détection boxes : WATER_CAULDRON remplace HAY_BLOCK+Sign, scan+création fusionnés en une commande | ||
| 1.2.0 | 2026-06-11 | Architecture GUI hybride : intégration de l'API native Paper Dialog (1.21.6+) en interface par défaut, et maintien d'InventoryFramework en fallback. Choix laissé aux joueurs via `/ecurie gui [dialog|inventory]` sauvegardé par PDC. Affichage ostensible des tarifs et gestion asynchrone sécurisée. | | |- | ||
| 1.0.3 || 2026-05-19 || Nommage : skip enclume si cheval déjà nommé au stockage ; fix renommage (slot résultat pré-rempli) | |||
|- | |||
| 1.0.4 || 2026-06-11 || Fix validation renommage ; noms fantômes 2 lignes (ArmorStand passager) ; blocage monte ; correction calcul distance transferts ; possibilité d'initier un transfert (rapatriement) depuis l'écurie de destination ; animations de départ et d'arrivée des chevaux avec PNJ montés via pathfinding local ; attribution automatique de nom/skin configurables par défaut pour les NPCs d'écurie lors du setnpc | |||
|- | |||
| 1.1.0 || 2026-06-11 || Support de tous les familiers montables et des MyPet, configuration des prix en jeu depuis config.yml, ajout des types d'écuries (AQUATIQUE, VOLIERE, TERRESTRE) avec blocs de ciblage wand configurables et validations RPG pour le stockage. | |||
|- | |||
| 1.2.0 || 2026-06-11 || Architecture GUI hybride : intégration de l'API native Paper Dialog (1.21.6+) en interface par défaut, et maintien d'InventoryFramework en fallback. Choix laissé aux joueurs via `/ecurie gui [dialog|inventory]` sauvegardé par PDC. Affichage ostensible des tarifs et gestion asynchrone sécurisée. | |||
|} | |||