Basculer le menu
Changer de menu des préférences
Basculer le menu personnel
Non connecté(e)
Votre adresse IP sera visible au public si vous faites des modifications.

« Plugin:Écurie » : différence entre les versions

Gestion d'écuries RP : mise en pension, acheminements de montures et stockage physique de compagnons
Hiob (discussion | contributions)
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 | |---|--... »
 
Hiob (discussion | contributions)
Mise à jour des commandes, permissions, configuration MySQL et restrictions par type (v1.4.0)
 
(7 versions intermédiaires par le même utilisateur non affichées)
Ligne 1 : Ligne 1 :
# Ecurie
{{SHORTDESC:Gestion d'écuries RP : mise en pension, acheminements de montures et stockage physique de compagnons}}


<p align="center">
{{Infobox Plugin
  <img src="nanobanana-output/Ecurie_logo.png" alt="Ecurie Logo" width="300" />
|nom=Écurie
</p>
|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)
}}


Plugin PaperMC de gestion des chevaux RP pour le serveur Nefald.
'''Écurie''' est un plugin PaperMC de gestion des compagnons 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.
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 ==


## Prérequis
{| class="wikitable"
 
! Dépendance !! Rôle !! Type
| 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 ==


## Installation
# Déposer <code>Ecurie-&lt;version&gt;.jar</code> dans <code>plugins/</code>
# Redémarrer le serveur
# Éditer <code>plugins/Ecurie/config.yml</code> et <code>lang.yml</code>
# Créer les étables via les commandes admin (voir ci-dessous)


1. Déposer `Ecurie-<version>.jar` dans `plugins/`
== Configuration ==
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)


---
=== config.yml ===


## Configuration
<syntaxhighlight lang="yaml">
database:
  # 'sqlite' ou 'mysql'
  type: "sqlite"
 
  # Configuration SQLite
  sqlite:
    file: "ecurie.db"
   
  # Configuration MySQL / MariaDB (HikariCP)
  mysql:
    host: "localhost"
    port: 3306
    database: "ecurie"
    username: "root"
    password: "password"
    pool:
      maximum-pool-size: 10
      minimum-idle: 2


### `config.yml`
# Interface GUI par défaut (modifiable par joueur via /ecurie gui)
 
# 'dialog'    = Interface textuelle native Paper (1.21.6+, recommandé)
```yaml
# 'inventory' = Menu d'inventaire classique
database:
gui-type: "dialog"
  file: "ecurie.db"         # Chemin relatif au dossier du plugin


transfer:
transfer:
   base-delay-seconds: 600    # Délai de base pour un transfert (10 min)
   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:
# Tarifs des services en écus/sols (0 = gratuit)
   on-road-speed: 0.35        # Vitesse cheval sur route (vanilla ≈ 0.225)
prices:
   enabled: false            # Routes RP (désactivé en V1)
   store: 10                  # Mise en pension
 
  retrieve: 5                # Récupération d'un compagnon
phantom-horse:
   rename: 50                # Modification du registre (renommage)
   health: 20.0              # PV du cheval fantôme en box
  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


### `lang.yml`
# NPC "Maître d'Écurie" : PNJ d'interface lié à l'étable (via /ecurie 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


Tous les messages joueurs. Supporte les balises MiniMessage (`<red>`, `<gold>`, etc.).
# NPC "Palefrenier" : PNJ temporaire, spawné uniquement pour l'animation de départ/arrivée
Variables disponibles selon le message : `{name}`, `{amount}`, `{dest}`, `{time}`, `{count}`, `{stable_id}`, `{n}`, `{x}`, `{y}`, `{z}`.
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
## 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.
# Si vrai, restreint le stockage et le transfert selon le type du compagnon et de l'écurie
# Compagnon aquatique -> Écurie AQUATIQUE uniquement
# Compagnon volant -> Écurie VOLIERE uniquement
# Compagnon terrestre -> Écurie TERRESTRE/STABLE uniquement
restrict-stable-types: true


### Étables
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 ===
/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
Tous les messages joueurs. Supporte les balises MiniMessage (<code>&lt;red&gt;</code>, <code>&lt;gold&gt;</code>, etc.).
Variables disponibles selon le message : <code>{name}</code>, <code>{amount}</code>, <code>{dest}</code>, <code>{time}</code>, <code>{count}</code>, <code>{stable_id}</code>, <code>{n}</code>, <code>{x}</code>, <code>{y}</code>, <code>{z}</code>.


```
== Commandes ==
/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 :
=== Commandes joueurs ===
- `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


```
{| class="wikitable"
/ecurie horse free <horse_id>         — Libère un cheval de la DB (urgence admin)
! Commande !! Description !! Permission
```
|-
| <code>/ecurie gui [dialog/inventory]</code> || Modifie le type d'interface préféré du joueur (sauvegardé en PDC) || <code>ecurie.use</code>
|}


### Divers
=== Commandes d'administration ===


```
{| class="wikitable"
/ecurie reload                       — Recharge config.yml et le cache ShowManager
! Commande !! Description !! Permission
```
|-
| <code>/ecurie wand [on/off]</code> || Active ou désactive le wand (bâton de sélection pour délimiter les étables) || <code>ecurie.admin</code>
|-
| <code>/ecurie create &lt;nom&gt; [type]</code> || Crée une étable dans la sélection wand et scanne automatiquement les boxes. Types : <code>STABLE</code>, <code>RELAY</code>, <code>TERRESTRE</code>, <code>AQUATIQUE</code>, <code>VOLIERE</code>. || <code>ecurie.admin</code>
|-
| <code>/ecurie delete &lt;id&gt;</code> || Supprime l'étable spécifiée (rend ses compagnons orphelins) || <code>ecurie.admin</code>
|-
| <code>/ecurie setnpc &lt;stable_id&gt;</code> || Lie le NPC Citizens le plus proche (&le;5 blocs) à l'étable en lui attribuant son nom/skin par défaut || <code>ecurie.admin</code>
|-
| <code>/ecurie list</code> || Liste toutes les étables enregistrées || <code>ecurie.admin</code>
|-
| <code>/ecurie tp &lt;stable_id/nom&gt;</code> || Téléporte le joueur en face du NPC de l'étable spécifiée (sécurité anticollision intégrée) || <code>ecurie.admin</code>
|-
| <code>/ecurie box scan &lt;stable_id&gt;</code> || Relance la détection des blocs cibles (box) dans la sélection wand pour cette étable || <code>ecurie.admin</code>
|-
| <code>/ecurie box list &lt;stable_id&gt;</code> || Liste les coordonnées de toutes les boxes de l'étable spécifiée || <code>ecurie.admin</code>
|-
| <code>/ecurie box delete &lt;box_id&gt;</code> || Supprime définitivement la box spécifiée || <code>ecurie.admin</code>
|-
| <code>/ecurie show [on/off]</code> || Active ou désactive l'affichage de particules colorées sur les blocs de box (vert=libre, rouge=occupé) || <code>ecurie.admin</code>
|-
| <code>/ecurie horse free &lt;horse_id&gt;</code> || Supprime définitivement un compagnon de la base de données || <code>ecurie.admin</code>
|-
| <code>/ecurie horse orphans</code> || Liste tous les compagnons orphelins (sans écurie suite à une suppression) || <code>ecurie.admin</code>
|-
| <code>/ecurie horse reassign &lt;horse_id&gt; &lt;stable_id&gt;</code> || Réassigne un compagnon orphelin à une box libre de l'étable spécifiée || <code>ecurie.admin</code>
|-
| <code>/ecurie reload</code> || Recharge les fichiers de configuration <code>config.yml</code> et de traduction <code>lang.yml</code> || <code>ecurie.admin</code>
|}


---
Les blocs cibles de boxes détectés par défaut selon le type d'écurie sont :
* <code>STABLE</code> / <code>TERRESTRE</code> : '''WATER_CAULDRON'''
* <code>AQUATIQUE</code> : '''PRISMARINE'''
* <code>VOLIERE</code> : '''DAYLIGHT_DETECTOR'''


## Commandes joueurs
== Permissions ==


Permission requise : `ecurie.use` (true par défaut).
{| class="wikitable"
! Permission !! Description !! Défaut
|-
| <code>ecurie.admin</code> || Accès complet aux commandes d'administration <code>/ecurie</code> || op
|-
| <code>ecurie.use</code> || Interaction avec les NPCs Maître d'Écurie et utilisation de <code>/ecurie gui</code> || true
|}


```
== Workflow admin Créer une étable ==
/ecurie gui [dialog|inventory]        Change votre type d'interface (persistant via PDC)
```


---
=== Étapes ===


## Workflow admin Créer une étable
# '''Construire l'étable''' — poser le bloc cible dans chaque stalle (ex: <code>WATER_CAULDRON</code> pour TERRESTRE, <code>PRISMARINE</code> pour AQUATIQUE).
# '''Activer le wand''' : <code>/ecurie wand on</code> → clic gauche (point A) + clic droit (coin B) pour délimiter la région
# '''Créer et scanner''' : <code>/ecurie create &lt;nom&gt; [type]</code> crée l'étable ET enregistre automatiquement les boxes détectées.
# '''Lier un NPC''' : placer un Citizens devant l'étable, s'en approcher à &lt; 5 blocs : <code>/ecurie setnpc &lt;stable_id&gt;</code> (le nom et le skin par défaut sont appliqués automatiquement).


### Étapes
=== Visualiser les boxes ===
 
1. **Construire l'étable** — poser le bloc cible de la box (ex: `WATER_CAULDRON`, `PRISMARINE`) dans chaque stalle.
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 (selon le type `TERRESTRE`, `AQUATIQUE` ou `VOLIERE`).
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 '''vertes''' = box libre
- Particules **rouges** = box occupée
* 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 ==


## 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 (la préférence est persistante) :
* '''Inventory''' : Inventaire classique sous forme de coffre.
- **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
=== Mettre en pension ===
1. Amener le cheval à côté ou le monter
# Amener le compagnon à côté ou le monter
2. Cliquer **Stocker mon cheval** dans la GUI
# Cliquer '''Mettre en pension''' dans la GUI
3. **Si le cheval n'a pas de nom custom** (nom "Horse" ou absent) → une enclume s'ouvre pour nommer le cheval
# '''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 cheval a déjà un nom custom** stockage direct sans nommage
# '''Si le compagnon a déjà un nom custom''' mise en pension directe sans nommage
5. Coût : `price-in` de l'étable en sols
# Coût : <code>prices.store</code> en sols
 
### Récupérer un cheval
1. Cliquer **Récupérer un cheval**
2. Choisir le cheval dans la liste
3. Coût : `price-out` de l'étable


### Transférer ou Rapatrier un cheval
=== Reprendre un compagnon ===
Le transfert peut être initié depuis l'écurie de départ ou de destination :
# Cliquer '''Reprendre un compagnon'''
- **Depuis l'écurie d'origine (Transfert sortant) :** Cliquer **Transférer vers...**, sélectionner le cheval, puis choisir l'écurie de destination.
# Choisir le compagnon dans la liste
- **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.
# Coût : <code>prices.retrieve</code> en sols
- **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
=== Demander un acheminement ===
1. Cliquer **Renommer un cheval**
L'acheminement peut être initié depuis l'écurie de départ ou d'arrivée :
2. Choisir le cheval dans la liste
* '''Depuis l'écurie d'origine (envoi sortant) :''' Cliquer '''Demander un acheminement''', sélectionner le compagnon, puis choisir l'écurie de destination.
3. Une enclume s'ouvre pré-remplie avec le nom actuel — modifier ou confirmer
* '''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.
4. Coût : `rename-price` en sols (défaut 50)
* '''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).


### Mes chevaux
=== Modifier le registre ===
Vue globale de tous les chevaux du joueur, toutes étables confondues.
# Cliquer '''Modifier le registre'''
# Choisir le compagnon dans la liste
# Une enclume s'ouvre pré-remplie avec le nom actuel — modifier ou confirmer
# Coût : <code>prices.rename</code> en sols (défaut 50)


---
=== Mes compagnons ===
Vue globale de tous les compagnons du joueur, toutes étables confondues.


## Placeholders (PlaceholderAPI)
== Placeholders (PlaceholderAPI) ==


Requiert PlaceholderAPI installé.
Requiert PlaceholderAPI installé.


| Placeholder | Valeur |
{| 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) |
| <code>%ecurie_horses_count%</code> || Nombre de compagnons 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`) |
| <code>%ecurie_horse_name_&lt;n&gt;%</code> || Nom du n-ième compagnon (1-indexé, trié par nom)
 
|-
---
| <code>%ecurie_horse_stable_&lt;n&gt;%</code> || Nom de l'étable du n-ième compagnon
 
|-
## Permissions
| <code>%ecurie_horse_health_&lt;n&gt;%</code> || Santé (ex : <code>18.0/20.0</code>)
 
|}
| 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)
== Notes techniques ==
- **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


---
* '''Stockage''' : SQLite embarqué (local) ou base de données MySQL / MariaDB via HikariCP.
* '''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 <code>/ecurie setnpc</code>. Sert d'interface pour toutes les interactions joueur. Nom et skin configurables dans <code>npc</code> (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 <code>groom</code> (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 <code>AQUATIQUE</code>. Les familiers volants dans une <code>VOLIERE</code>. Les familiers terrestres dans une <code>TERRESTRE</code> ou <code>STABLE</code>. Les restrictions sont activables via l'option <code>restrict-stable-types</code>.
* '''MyPet''' : Le plugin révoque automatiquement le MyPet lors de la mise en pension (via <code>/petsendaway</code>) pour éviter les doublons dans le monde, et restaure correctement ses états.
* '''Transferts''' : vérifiés toutes les 10 secondes en async


## Build
== Build ==


```bash
<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 ==


## 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 <code>/ecurie gui</code> 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).
|-
| 1.4.0 || 2026-06-13 || Ajout de la commande /ecurie tp, support de MySQL / MariaDB via HikariCP, correction de la persistance de l'activité MyPet, et restrictions par type d'écurie.
|}


| Version | Date | Notes |
[[Catégorie:Plugin développé pour Nefald]]
|---|---|---|
[[Catégorie:Plugin installé]]
| 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 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. |

Dernière version du 12 juin 2026 à 22:39


Écurie
Type
Roleplay
Développeur
Statut
Grade requis
Ressources
Code source
Compatibilité
Dépendance(s)
Vault (optionnel), Banco (optionnel, recommandé), Citizens (optionnel), PlaceholderAPI (optionnel), MyPet (optionnel)


É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:
  # 'sqlite' ou 'mysql'
  type: "sqlite"
  
  # Configuration SQLite
  sqlite:
    file: "ecurie.db"
    
  # Configuration MySQL / MariaDB (HikariCP)
  mysql:
    host: "localhost"
    port: 3306
    database: "ecurie"
    username: "root"
    password: "password"
    pool:
      maximum-pool-size: 10
      minimum-idle: 2

# 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

# 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 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

# Si vrai, restreint le stockage et le transfert selon le type du compagnon et de l'écurie
# Compagnon aquatique -> Écurie AQUATIQUE uniquement
# Compagnon volant -> Écurie VOLIERE uniquement
# Compagnon terrestre -> Écurie TERRESTRE/STABLE uniquement
restrict-stable-types: true

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

Commandes joueurs

Commande Description Permission
/ecurie gui [dialog/inventory] Modifie le type d'interface préféré du joueur (sauvegardé en PDC) ecurie.use

Commandes d'administration

Commande Description Permission
/ecurie wand [on/off] Active ou désactive le wand (bâton de sélection pour délimiter les étables) ecurie.admin
/ecurie create <nom> [type] Crée une étable dans la sélection wand et scanne automatiquement les boxes. Types : STABLE, RELAY, TERRESTRE, AQUATIQUE, VOLIERE. ecurie.admin
/ecurie delete <id> Supprime l'étable spécifiée (rend ses compagnons orphelins) ecurie.admin
/ecurie setnpc <stable_id> Lie le NPC Citizens le plus proche (≤5 blocs) à l'étable en lui attribuant son nom/skin par défaut ecurie.admin
/ecurie list Liste toutes les étables enregistrées ecurie.admin
/ecurie tp <stable_id/nom> Téléporte le joueur en face du NPC de l'étable spécifiée (sécurité anticollision intégrée) ecurie.admin
/ecurie box scan <stable_id> Relance la détection des blocs cibles (box) dans la sélection wand pour cette étable ecurie.admin
/ecurie box list <stable_id> Liste les coordonnées de toutes les boxes de l'étable spécifiée ecurie.admin
/ecurie box delete <box_id> Supprime définitivement la box spécifiée ecurie.admin
/ecurie show [on/off] Active ou désactive l'affichage de particules colorées sur les blocs de box (vert=libre, rouge=occupé) ecurie.admin
/ecurie horse free <horse_id> Supprime définitivement un compagnon de la base de données ecurie.admin
/ecurie horse orphans Liste tous les compagnons orphelins (sans écurie suite à une suppression) ecurie.admin
/ecurie horse reassign <horse_id> <stable_id> Réassigne un compagnon orphelin à une box libre de l'étable spécifiée ecurie.admin
/ecurie reload Recharge les fichiers de configuration config.yml et de traduction lang.yml ecurie.admin

Les blocs cibles de boxes détectés par défaut selon le type d'écurie sont :

  • STABLE / TERRESTRE : WATER_CAULDRON
  • AQUATIQUE : PRISMARINE
  • VOLIERE : DAYLIGHT_DETECTOR

Permissions

Permission Description Défaut
ecurie.admin Accès complet aux commandes d'administration /ecurie op
ecurie.use Interaction avec les NPCs Maître d'Écurie et utilisation de /ecurie gui true

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 create <nom> [type] — crée l'étable ET enregistre automatiquement les boxes détectées.
  4. Lier un NPC : placer un Citizens devant l'étable, s'en approcher à < 5 blocs : /ecurie setnpc <stable_id> (le nom et le skin par défaut sont appliqués automatiquement).

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)

Notes techniques

  • Stockage : SQLite embarqué (local) ou base de données MySQL / MariaDB via HikariCP.
  • 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 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. Les restrictions sont activables via l'option restrict-stable-types.
  • MyPet : Le plugin révoque automatiquement le MyPet lors de la mise en pension (via /petsendaway) pour éviter les doublons dans le monde, et restaure correctement ses états.
  • 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).
1.4.0 2026-06-13 Ajout de la commande /ecurie tp, support de MySQL / MariaDB via HikariCP, correction de la persistance de l'activité MyPet, et restrictions par type d'écurie.
Les témoins (''cookies'') nous aident à fournir nos services. En utilisant nos services, vous acceptez notre utilisation de témoins.