« Plugin:Écurie » : différence entre les versions
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 | |---|--... » |
style: aligner le formatage sur Plugin:Banco (H1, gras intro, type infobox, séparateurs, code dans tableaux) (via update-page on MediaWiki MCP Server) |
||
| (2 versions intermédiaires par le même utilisateur non affichées) | |||
| Ligne 1 : | Ligne 1 : | ||
{{SHORTDESC:Gestion des écuries RP}} | |||
{{Infobox Plugin | |||
|nom=Écurie | |||
|type=roleplay | |||
|dev=[[Scriptomancien|Nefald]] | |||
|status=Installé | |||
|grade=[[Pérégrin]] | |||
|sources=https://git.nefald.fr/minecraft/plugins/ecurie | |||
|dépendance=[[Plugin:Vault|Vault]] (optionnel), [[Plugin:Banco|Banco]] (optionnel, recommandé), [[Plugin:Citizens|Citizens]] (optionnel), [[Plugin:PlaceholderAPI|PlaceholderAPI]] (optionnel), [[Plugin:MyPet|MyPet]] (optionnel) | |||
}} | |||
'''Écurie''' est un plugin PaperMC de gestion des compagnons RP pour le serveur Nefald. | |||
Permet aux joueurs de mettre leurs | Permet aux joueurs de mettre leurs montures en pension dans des étables gérées par des NPCs Citizens. Supporte les transferts inter-étables (''acheminements''), la tarification en écus (Banco/Vault), et expose des placeholders PlaceholderAPI. | ||
== Prérequis == | |||
{| class="wikitable" | |||
! Dépendance !! Rôle !! Type | |||
|- | |||
|- | | PaperMC 1.21.x || Serveur || Obligatoire | ||
| PaperMC 1.21.x | Serveur | Obligatoire | | |- | ||
| Vault | API économie | Optionnel (fallback si Banco absent) | | | Vault || API économie || Optionnel (fallback si Banco absent) | ||
| Banco | Économie item-based (écus) | Optionnel (recommandé) | | |- | ||
| Citizens | NPCs d'interface | Optionnel | | | Banco || Économie item-based (écus) || Optionnel (recommandé) | ||
| PlaceholderAPI | Placeholders | Optionnel | | |- | ||
| MyPet | Détection familiers | Optionnel | | | 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. | ||
== Installation == | |||
1. Déposer `Ecurie-<version>.jar` dans `plugins/` | 1. Déposer `Ecurie-<version>.jar` dans `plugins/` | ||
| Ligne 33 : | Ligne 42 : | ||
4. Créer les étables via les commandes admin (voir ci-dessous) | 4. Créer les étables via les commandes admin (voir ci-dessous) | ||
== 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 | ||
# Interface GUI par défaut (modifiable par joueur via /ecurie gui) | |||
# 'dialog' = Interface textuelle native Paper (1.21.6+, recommandé) | |||
# 'inventory' = Menu d'inventaire classique | |||
gui-type: "dialog" | |||
transfer: | transfer: | ||
base-delay-seconds: 600 # Délai de base pour un | base-delay-seconds: 600 # Délai de base pour un acheminement (10 min) | ||
delay-per-100-blocks: 30 # Délai additionnel par 100 blocs de distance | delay-per-100-blocks: 30 # Délai additionnel par 100 blocs de distance | ||
animation-distance: 15.0 # Distance (blocs) pour l'animation de départ/arrivée | |||
routes: | routes: | ||
on-road-speed: 0.35 # Vitesse cheval sur route (vanilla ≈ 0.225) | on-road-speed: 0.35 # Vitesse cheval sur route (vanilla ≈ 0.225) | ||
enabled: false # Routes RP (désactivé en V1) | enabled: false # Routes RP (désactivé en V1) | ||
# Tarifs des services en écus/sols (0 = gratuit) | |||
prices: | |||
store: 10 # Mise en pension | |||
retrieve: 5 # Récupération d'un compagnon | |||
rename: 50 # Modification du registre (renommage) | |||
transfer-base: 20 # Coût de base d'un acheminement | |||
transfer-per-100: 5 # Coût additionnel par tranche de 100 blocs | |||
# Formule : coût total = transfer-base + (distance / 100) * transfer-per-100 | |||
# NPC "Maître d'Écurie" : PNJ d'interface lié à l'étable (via /ecurie stable setnpc) | |||
npc: | |||
default-name: "Maître d'Écurie" | |||
default-skin-value: "<base64 skin>" # Valeur de texture NameMC | |||
default-skin-signature: "<signature>" # Signature de la texture | |||
animation: | |||
enabled: false # Animation périodique du bras (secouage) | |||
delay-ticks: 300 | |||
# NPC "Palefrenier" : PNJ temporaire, spawné uniquement pour l'animation de départ/arrivée | |||
groom: | |||
default-name: "Palefrenier" | |||
default-skin-value: "<base64 skin>" | |||
default-skin-signature: "<signature>" | |||
phantom-horse: | phantom-horse: | ||
health: 20.0 # PV du | health: 20.0 # PV du compagnon fantôme en box | ||
box-blocks: | |||
# Blocs de ciblage (wand) selon le type d'écurie | |||
STABLE: WATER_CAULDRON | |||
TERRESTRE: WATER_CAULDRON | |||
AQUATIQUE: PRISMARINE | |||
VOLIERE: DAYLIGHT_DETECTOR | |||
</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.). | ||
Variables disponibles selon le message : `{name}`, `{amount}`, `{dest}`, `{time}`, `{count}`, `{stable_id}`, `{n}`, `{x}`, `{y}`, `{z}`. | Variables disponibles selon le message : `{name}`, `{amount}`, `{dest}`, `{time}`, `{count}`, `{stable_id}`, `{n}`, `{x}`, `{y}`, `{z}`. | ||
== 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 === | |||
/ecurie horse free <horse_id> — Libère un | |||
<syntaxhighlight lang="text"> | |||
/ecurie horse free <horse_id> — Libère un compagnon 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. '''Construire l'étable''' — poser le bloc cible dans chaque stalle (ex: `WATER_CAULDRON` pour TERRESTRE, `PRISMARINE` pour AQUATIQUE). | |||
2. '''Activer le wand''' : `/ecurie wand on` → clic gauche (point A) + clic droit (coin B) pour délimiter la région | |||
3. '''Créer et scanner''' : `/ecurie stable create <nom> [type]` — crée l'étable ET enregistre automatiquement les boxes détectées. | |||
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 '''Maître d'Écurie''' (NPC Citizens de l'étable). Le plugin propose deux types d'interfaces, configurables librement par chaque joueur (préférence persistante) : | |||
* '''Dialog (par défaut)''' : Fenêtre de dialogue textuelle native (Paper 1.21.6+). Immersif et orienté RPG. | |||
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 ( | * '''Inventory''' : Inventaire classique sous forme de coffre. | ||
Une GUI s'ouvre avec les actions suivantes : | Une GUI s'ouvre avec les actions suivantes : | ||
=== Mettre en pension === | |||
1. Amener le | 1. Amener le compagnon à côté ou le monter | ||
2. Cliquer | 2. Cliquer '''Mettre en pension''' dans la GUI | ||
3. | 3. '''Si le compagnon n'a pas de nom custom''' (nom générique ou absent) → une enclume s'ouvre pour le nommer | ||
4. | 4. '''Si le compagnon a déjà un nom custom''' → mise en pension directe sans nommage | ||
5. Coût : ` | 5. Coût : `prices.store` en sols | ||
=== Reprendre un compagnon === | |||
1. Cliquer | 1. Cliquer '''Reprendre un compagnon''' | ||
2. Choisir le | 2. Choisir le compagnon dans la liste | ||
3. Coût : ` | 3. Coût : `prices.retrieve` en sols | ||
=== Demander un acheminement === | |||
L'acheminement peut être initié depuis l'écurie de départ ou d'arrivée : | |||
* '''Depuis l'écurie d'origine (envoi sortant) :''' Cliquer '''Demander un acheminement''', sélectionner le compagnon, puis choisir l'écurie de destination. | |||
* '''Depuis l'écurie d'arrivée (rapatriement entrant) :''' Cliquer '''Demander un acheminement''', le plugin liste vos compagnons situés dans d'autres étables. Cliquer sur l'un d'eux lance directement le rapatriement. | |||
* '''Calcul de distance :''' Le délai et le coût s'ajustent dynamiquement selon la distance réelle (calculée en blocs 3D) entre les deux étables (base + ajustement par tranche de 100 blocs). | |||
=== Modifier le registre === | |||
1. Cliquer | 1. Cliquer '''Modifier le registre''' | ||
2. Choisir le | 2. Choisir le compagnon 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 | 4. Coût : `prices.rename` en sols (défaut 50) | ||
=== Mes compagnons === | |||
Vue globale de tous les | Vue globale de tous les compagnons du joueur, toutes étables confondues. | ||
== Placeholders (PlaceholderAPI) == | |||
Requiert PlaceholderAPI installé. | Requiert PlaceholderAPI installé. | ||
| Placeholder | {| class="wikitable" | ||
|- | ! Placeholder !! Valeur | ||
| | |- | ||
| | | <code>%ecurie_horses_count%</code> || Nombre de compagnons en pension du joueur | ||
| | |- | ||
| | | <code>%ecurie_horse_name_<n>%</code> || Nom du n-ième compagnon (1-indexé, trié par nom) | ||
|- | |||
| <code>%ecurie_horse_stable_<n>%</code> || Nom de l'étable du n-ième compagnon | |||
|- | |||
| <code>%ecurie_horse_health_<n>%</code> || Santé (ex : <code>18.0/20.0</code>) | |||
|} | |||
== Permissions == | |||
{| class="wikitable" | |||
! Permission !! Description !! Défaut | |||
|- | |||
| <code>ecurie.admin</code> || Accès aux commandes d'administration <code>/ecurie</code> || op | |||
|- | |||
| <code>ecurie.use</code> || Interaction avec les PNJ et <code>/ecurie gui</code> || true | |||
|} | |||
== Notes techniques == | |||
* '''Stockage''' : SQLite embarqué (shadowed, pas de dépendance runtime) | |||
* '''Compagnons fantômes''' : entités invulnérables, sans gravité ni IA, représentant le compagnon en box. Toute monte ou interaction est strictement bloquée. Spawné à côté du bloc de box (pas dessus). | |||
* '''Affichage du nom''' : Le nom du compagnon (ligne 1, blanc) et le pseudo du propriétaire (ligne 2, gris italique) s'affichent via un '''TextDisplay''' passager, nettoyé automatiquement lors du despawn. | |||
* '''Maître d'Écurie''' : NPC Citizens permanent lié à l'étable via `/ecurie stable setnpc`. Sert d'interface pour toutes les interactions joueur. Nom et skin configurables dans `npc` (config.yml). | |||
* '''Palefrenier''' : NPC Citizens temporaire spawné uniquement pendant l'animation de départ ou d'arrivée d'un acheminement. Nom et skin configurables dans `groom` (config.yml). | |||
* '''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 ne peuvent aller que dans une écurie `AQUATIQUE`. Les familiers volants dans une `VOLIERE`. Les familiers terrestres dans une `TERRESTRE` ou `STABLE`. | |||
* '''MyPet''' : Le plugin stocke correctement l'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. | ||
--- | == Changelog == | ||
{| 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.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 compagnon 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 ; rapatriement depuis l'écurie de destination ; animations de départ/arrivée via pathfinding ; attribution automatique de nom/skin pour les NPCs lors du setnpc | |||
|- | |||
| 1.1.0 || 2026-06-11 || Support de tous les familiers montables et des MyPet, configuration des prix depuis config.yml, ajout des types d'écuries (AQUATIQUE, VOLIERE, TERRESTRE) avec blocs de ciblage configurables et validations RPG | |||
|- | |||
| 1.2.0 || 2026-06-11 || Architecture GUI hybride : API native Paper Dialog (1.21.6+) en interface par défaut, InventoryFramework en fallback. Choix joueur via `/ecurie gui` sauvegardé par PDC. Affichage des tarifs et gestion asynchrone sécurisée. | |||
|- | |||
| 1.3.0 || 2026-06-12 || Terminologie RP : "Mettre en pension", "Acheminement", "Compagnon" ; séparation Maître d'Écurie (interface) / Palefrenier (animation) avec skins distincts ; TextDisplay remplace ArmorStand passager pour les noms en box ; correction spawn fantôme à côté du cauldron (non dessus). | |||
|} | |||
[[Catégorie:Plugin développé pour Nefald]] | |||
[[Catégorie:Plugin installé]] | |||
Version du 11 juin 2026 à 23:37
Écurie est un plugin PaperMC de gestion des compagnons RP pour le serveur Nefald.
Permet aux joueurs de mettre leurs montures en pension dans des étables gérées par des NPCs Citizens. Supporte les transferts inter-étables (acheminements), la tarification en écus (Banco/Vault), et expose des placeholders PlaceholderAPI.
Prérequis
| Dépendance | Rôle | Type |
|---|---|---|
| PaperMC 1.21.x | Serveur | Obligatoire |
| Vault | API économie | Optionnel (fallback si Banco absent) |
| 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.
Installation
1. Déposer `Ecurie-<version>.jar` dans `plugins/` 2. Redémarrer le serveur 3. Éditer `plugins/Ecurie/config.yml` et `lang.yml` 4. Créer les étables via les commandes admin (voir ci-dessous)
Configuration
`config.yml`
database:
file: "ecurie.db" # Chemin relatif au dossier du plugin
# Interface GUI par défaut (modifiable par joueur via /ecurie gui)
# 'dialog' = Interface textuelle native Paper (1.21.6+, recommandé)
# 'inventory' = Menu d'inventaire classique
gui-type: "dialog"
transfer:
base-delay-seconds: 600 # Délai de base pour un acheminement (10 min)
delay-per-100-blocks: 30 # Délai additionnel par 100 blocs de distance
animation-distance: 15.0 # Distance (blocs) pour l'animation de départ/arrivée
routes:
on-road-speed: 0.35 # Vitesse cheval sur route (vanilla ≈ 0.225)
enabled: false # Routes RP (désactivé en V1)
# Tarifs des services en écus/sols (0 = gratuit)
prices:
store: 10 # Mise en pension
retrieve: 5 # Récupération d'un compagnon
rename: 50 # Modification du registre (renommage)
transfer-base: 20 # Coût de base d'un acheminement
transfer-per-100: 5 # Coût additionnel par tranche de 100 blocs
# Formule : coût total = transfer-base + (distance / 100) * transfer-per-100
# NPC "Maître d'Écurie" : PNJ d'interface lié à l'étable (via /ecurie stable setnpc)
npc:
default-name: "Maître d'Écurie"
default-skin-value: "<base64 skin>" # Valeur de texture NameMC
default-skin-signature: "<signature>" # Signature de la texture
animation:
enabled: false # Animation périodique du bras (secouage)
delay-ticks: 300
# NPC "Palefrenier" : PNJ temporaire, spawné uniquement pour l'animation de départ/arrivée
groom:
default-name: "Palefrenier"
default-skin-value: "<base64 skin>"
default-skin-signature: "<signature>"
phantom-horse:
health: 20.0 # PV du compagnon fantôme en box
box-blocks:
# Blocs de ciblage (wand) selon le type d'écurie
STABLE: WATER_CAULDRON
TERRESTRE: WATER_CAULDRON
AQUATIQUE: PRISMARINE
VOLIERE: DAYLIGHT_DETECTOR
`lang.yml`
Tous les messages joueurs. Supporte les balises MiniMessage (`<red>`, `<gold>`, etc.). Variables disponibles selon le message : `{name}`, `{amount}`, `{dest}`, `{time}`, `{count}`, `{stable_id}`, `{n}`, `{x}`, `{y}`, `{z}`.
Commandes admin
Permission requise : `ecurie.admin` (op par défaut). Alias : `/ec`
Wand — sélection de région
/ecurie wand [on|off]
Active/désactive le wand bâton. Clic gauche = point 1, clic droit = point 2. Utilisé pour scanner les boxes d'une étable.
Étables
/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 setnpc <stable_id> — Lie le NPC Citizens le plus proche (≤5 blocs) à l'étable
/ecurie stable list — Liste toutes les étables
Boxes
/ecurie box list <stable_id> — Liste les boxes d'une étable
/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)
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.
Chevaux
/ecurie horse free <horse_id> — Libère un compagnon de la DB (urgence admin)
Divers
/ecurie reload — Recharge config.yml et le cache ShowManager
Commandes joueurs
Permission requise : `ecurie.use` (true par défaut).
/ecurie gui [dialog|inventory] — Change votre type d'interface (persistant via PDC)
Workflow admin — Créer une étable
Étapes
1. Construire l'étable — poser le bloc cible dans chaque stalle (ex: `WATER_CAULDRON` pour TERRESTRE, `PRISMARINE` pour AQUATIQUE). 2. Activer le wand : `/ecurie wand on` → clic gauche (point A) + clic droit (coin B) pour délimiter la région 3. Créer et scanner : `/ecurie stable create <nom> [type]` — crée l'étable ET enregistre automatiquement les boxes détectées. 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 :
/ecurie show on
- Particules vertes = box libre
- Particules rouges = box occupée
Désactiver l'affichage :
/ecurie show off
Workflow joueur — Interagir avec une étable
Le joueur interagit via clic droit sur le Maître d'Écurie (NPC Citizens de l'étable). Le plugin propose deux types d'interfaces, configurables librement par chaque joueur (préférence persistante) :
- Dialog (par défaut) : Fenêtre de dialogue textuelle native (Paper 1.21.6+). Immersif et orienté RPG.
- Inventory : Inventaire classique sous forme de coffre.
Une GUI s'ouvre avec les actions suivantes :
Mettre en pension
1. Amener le compagnon à côté ou le monter 2. Cliquer Mettre en pension dans la GUI 3. Si le compagnon n'a pas de nom custom (nom générique ou absent) → une enclume s'ouvre pour le nommer 4. Si le compagnon a déjà un nom custom → mise en pension directe sans nommage 5. Coût : `prices.store` en sols
Reprendre un compagnon
1. Cliquer Reprendre un compagnon 2. Choisir le compagnon dans la liste 3. Coût : `prices.retrieve` en sols
Demander un acheminement
L'acheminement peut être initié depuis l'écurie de départ ou d'arrivée :
- Depuis l'écurie d'origine (envoi sortant) : Cliquer Demander un acheminement, sélectionner le compagnon, puis choisir l'écurie de destination.
- Depuis l'écurie d'arrivée (rapatriement entrant) : Cliquer Demander un acheminement, le plugin liste vos compagnons situés dans d'autres étables. Cliquer sur l'un d'eux lance directement le rapatriement.
- Calcul de distance : Le délai et le coût s'ajustent dynamiquement selon la distance réelle (calculée en blocs 3D) entre les deux étables (base + ajustement par tranche de 100 blocs).
Modifier le registre
1. Cliquer Modifier le registre 2. Choisir le compagnon dans la liste 3. Une enclume s'ouvre pré-remplie avec le nom actuel — modifier ou confirmer 4. Coût : `prices.rename` en sols (défaut 50)
Mes compagnons
Vue globale de tous les compagnons du joueur, toutes étables confondues.
Placeholders (PlaceholderAPI)
Requiert PlaceholderAPI installé.
| Placeholder | Valeur |
|---|---|
%ecurie_horses_count% |
Nombre de compagnons en pension du joueur |
%ecurie_horse_name_<n>% |
Nom du n-ième compagnon (1-indexé, trié par nom) |
%ecurie_horse_stable_<n>% |
Nom de l'étable du n-ième compagnon |
%ecurie_horse_health_<n>% |
Santé (ex : 18.0/20.0)
|
Permissions
| Permission | Description | Défaut |
|---|---|---|
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)
- Compagnons fantômes : entités invulnérables, sans gravité ni IA, représentant le compagnon en box. Toute monte ou interaction est strictement bloquée. Spawné à côté du bloc de box (pas dessus).
- Affichage du nom : Le nom du compagnon (ligne 1, blanc) et le pseudo du propriétaire (ligne 2, gris italique) s'affichent via un TextDisplay passager, nettoyé automatiquement lors du despawn.
- Maître d'Écurie : NPC Citizens permanent lié à l'étable via `/ecurie stable setnpc`. Sert d'interface pour toutes les interactions joueur. Nom et skin configurables dans `npc` (config.yml).
- Palefrenier : NPC Citizens temporaire spawné uniquement pendant l'animation de départ ou d'arrivée d'un acheminement. Nom et skin configurables dans `groom` (config.yml).
- 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 ne peuvent aller que dans une écurie `AQUATIQUE`. Les familiers volants dans une `VOLIERE`. Les familiers terrestres dans une `TERRESTRE` ou `STABLE`.
- MyPet : Le plugin stocke correctement l'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
./gradlew shadowJar
# Sortie : build/libs/Ecurie-<version>.jar
Requiert Java 21. La compilation locale sous Java 26+ peut échouer (incompatibilité Groovy/ASM) — utiliser la CI GitLab.
Changelog
| 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.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 compagnon 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 ; rapatriement depuis l'écurie de destination ; animations de départ/arrivée via pathfinding ; attribution automatique de nom/skin pour les NPCs lors du setnpc |
| 1.1.0 | 2026-06-11 | Support de tous les familiers montables et des MyPet, configuration des prix depuis config.yml, ajout des types d'écuries (AQUATIQUE, VOLIERE, TERRESTRE) avec blocs de ciblage configurables et validations RPG |
| 1.2.0 | 2026-06-11 | Architecture GUI hybride : API native Paper Dialog (1.21.6+) en interface par défaut, InventoryFramework en fallback. Choix joueur via `/ecurie gui` sauvegardé par PDC. Affichage des tarifs et gestion asynchrone sécurisée. |
| 1.3.0 | 2026-06-12 | Terminologie RP : "Mettre en pension", "Acheminement", "Compagnon" ; séparation Maître d'Écurie (interface) / Palefrenier (animation) avec skins distincts ; TextDisplay remplace ArmorStand passager pour les noms en box ; correction spawn fantôme à côté du cauldron (non dessus). |