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

De Nefald
Hiob (discussion | contributions)
Mise à jour des commandes, permissions, configuration MySQL et restrictions par type (v1.4.0)
Hiob (discussion | contributions)
Réécriture — recentre l'article sur le joueur (doc admin déplacée vers codex.nefald.fr), corrige gui-type/SQLite/blocs box obsolètes, ajoute bail prépayé/réserve (via update-page on MediaWiki MCP Server)
Ligne 1 : Ligne 1 :
{{SHORTDESC:Gestion d'écuries RP : mise en pension, acheminements de montures et stockage physique de compagnons}}
{{SHORTDESC:Mets tes montures et compagnons en pension auprès des Maîtres d'Écurie et fais-les voyager entre les étables de Nefald}}


{{Infobox Plugin
{{Infobox Plugin
|nom=Écurie
| nom = Écurie
|type=roleplay
| type = roleplay
|dev=[[Scriptomancien|Nefald]]
| dev = [[Scriptomancien|Nefald]]
|status=Installé
| status = Installé
|grade=[[Pérégrin]]
| sources = https://git.nefald.fr/minecraft/plugins/ecurie
|sources=https://git.nefald.fr/minecraft/plugins/ecurie
| dépendance = [[Plugin:Citizens|Citizens]], [[Plugin:PlaceholderAPI|PlaceholderAPI]] (optionnel), [[Plugin:MyPet|MyPet]] (optionnel)
|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.
'''Écurie''' te permet de mettre tes montures et familiers en pension auprès d'un '''Maître d'Écurie''', un PNJ posté devant chaque étable du monde. Ton compagnon est gardé en sécurité, à l'abri des mobs et des voleurs, et tu peux le faire voyager d'une étable à l'autre sans avoir à parcourir toi-même la distance.


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.
== Où trouver une écurie ==


== Prérequis ==
Les étables sont construites par l'Intendance dans les principales cités et zones de Fendral. Chacune est tenue par un '''Maître d'Écurie''' : clique-droit sur lui pour ouvrir le registre de l'étable.


{| class="wikitable"
À ton tout premier clic sur un Maître d'Écurie donné, il t'explique son service en détail. Les fois suivantes, il t'accueille d'une phrase différente à chaque passage — et te remercie après chaque service rendu.
! 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.
== Mettre un compagnon en pension ==


== Installation ==
# Amène ton compagnon à côté de toi (ou monte-le).
# Clique-droit sur le Maître d'Écurie, puis choisis '''Mettre en pension'''.
# S'il n'a pas encore de nom, une enclume s'ouvre pour le baptiser avant de le confier.
# Le coût affiché couvre la mise en pension '''et''' le bail prépayé (voir ci-dessous) — tout est réglé en une fois.


# Déposer <code>Ecurie-&lt;version&gt;.jar</code> dans <code>plugins/</code>
Ton compagnon est alors gardé dans une box de l'étable, en parfaite sécurité, jusqu'à ce que tu viennes le récupérer.
# 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)


== Configuration ==
== Le bail de la box ==


=== config.yml ===
Chaque pension inclut un '''bail prépayé''' : la box est louée pour une durée fixe dès la mise en pension. Tant que le bail court, ton compagnon reste sur place sans rien à payer de plus.


<syntaxhighlight lang="yaml">
* Le bail est '''prolongeable''' à tout moment depuis le menu de récupération.
database:
* Si le bail expire — ou si tu désertes le serveur trop longtemps — le Maître d'Écurie ne peut plus garantir la box : ton compagnon est mis '''En Réserve''' pour libérer la place.
  # 'sqlite' ou 'mysql'
* Un compagnon '''En Réserve''' n'est pas perdu : il reste récupérable auprès du PNJ, moyennant une pénalité de stockage longue durée (tarif de récupération majoré par rapport à une récupération normale).
  type: "sqlite"
* Tu peux activer le '''renouvellement automatique''' depuis le menu de récupération : le loyer est alors prélevé directement sur ton compte, même hors ligne, pour éviter que ton compagnon ne finisse En Réserve.
 
  # 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)
== Récupérer un compagnon ==
# 'dialog'    = Interface textuelle native Paper (1.21.6+, recommandé)
# 'inventory' = Menu d'inventaire classique
gui-type: "dialog"


transfer:
# Clique-droit sur le Maître d'Écurie, choisis '''Pension & récupération'''.
  base-delay-seconds: 600    # Délai de base pour un acheminement (10 min)
# Sélectionne ton compagnon dans la liste.
  delay-per-100-blocks: 30  # Délai additionnel par 100 blocs de distance
# Le tarif dépend de son état : récupération normale, ou tarif majoré s'il est En Réserve.
  animation-distance: 15.0  # Distance (blocs) pour l'animation de départ/arrivée


# Tarifs des services en écus/sols (0 = gratuit)
== Demander un acheminement ==
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)
Besoin de retrouver ta monture ailleurs sur Fendral ? Le Maître d'Écurie peut organiser un '''acheminement''' vers une autre étable :
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
* '''Depuis l'étable de départ''' : choisis '''Demander un acheminement''', sélectionne ton compagnon, puis l'étable de destination.
groom:
* '''Depuis l'étable d'arrivée''' : le Maître d'Écurie te propose directement de faire venir un compagnon stationné ailleurs.
  default-name: "Palefrenier"
  default-skin-value: "<base64 skin>"
  default-skin-signature: "<signature>"


phantom-horse:
Le délai et le coût du voyage dépendent de la distance réelle entre les deux étables — plus c'est loin, plus c'est long et cher. Un '''Palefrenier''' (PNJ temporaire) anime le départ et l'arrivée de ton compagnon.
  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
== Modifier le registre ==
# Compagnon aquatique -> Écurie AQUATIQUE uniquement
# Compagnon volant -> Écurie VOLIERE uniquement
# Compagnon terrestre -> Écurie TERRESTRE/STABLE uniquement
restrict-stable-types: true


box-blocks:
Envie de rebaptiser ton compagnon ? Choisis '''Modifier le registre''' dans le menu du Maître d'Écurie : une enclume s'ouvre, pré-remplie avec le nom actuel — modifie-le ou confirme tel quel.
  # Blocs de ciblage (wand) selon le type d'écurie
  STABLE: WATER_CAULDRON
  TERRESTRE: WATER_CAULDRON
  AQUATIQUE: PRISMARINE
  VOLIERE: DAYLIGHT_DETECTOR
</syntaxhighlight>


=== lang.yml ===
== Mes compagnons ==


Tous les messages joueurs. Supporte les balises MiniMessage (<code>&lt;red&gt;</code>, <code>&lt;gold&gt;</code>, etc.).
Cette entrée du menu te donne une vue d'ensemble de '''tous''' tes compagnons en pension, toutes étables confondues — pratique pour savoir où se trouve chacun avant de demander un acheminement.
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 ==
== Compagnons acceptés ==


=== Commandes joueurs ===
Écurie accepte toutes les montures classiques (chevaux, chameaux, cochons sellés, striders) ainsi que tous les familiers [[MyPet]]. Selon le type d'étable, seuls certains compagnons sont acceptés :


{| class="wikitable"
{| class="wikitable"
! Commande !! Description !! Permission
! Type d'étable !! Compagnons acceptés
|-
| <code>/ecurie gui [dialog/inventory]</code> || Modifie le type d'interface préféré du joueur (sauvegardé en PDC) || <code>ecurie.use</code>
|}
 
=== Commandes d'administration ===
 
{| class="wikitable"
! 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>
| Terrestre || Chevaux, chameaux, cochons, familiers terrestres
|-
|-
| <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>
| Aquatique || Familiers/montures aquatiques
|-
|-
| <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>
| Volière || Familiers volants
|-
| <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 :
{{Info|Un familier [[MyPet]] mis en pension est automatiquement rappelé pour éviter qu'il ne traîne en double dans le monde. Il te sera rendu dans son état actuel à la récupération.}}
* <code>STABLE</code> / <code>TERRESTRE</code> : '''WATER_CAULDRON'''
* <code>AQUATIQUE</code> : '''PRISMARINE'''
* <code>VOLIERE</code> : '''DAYLIGHT_DETECTOR'''


== Permissions ==
== Tarifs ==


{| class="wikitable"
Tous les tarifs sont réglés en sols, prélevés directement sur ton compte au moment du service. Les montants exacts (mise en pension + bail, récupération, récupération En Réserve, renommage, acheminement) sont fixés par l'Intendance et peuvent varier d'une étable à l'autre le Maître d'Écurie t'affiche toujours le prix avant confirmation.
! 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 ==
 
=== Étapes ===
 
# '''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).
 
=== Visualiser les boxes ===
 
Après création, afficher les boxes avec particules colorées :
<syntaxhighlight lang="text">
/ecurie show on
</syntaxhighlight>
* Particules '''vertes''' = box libre
* Particules '''rouges''' = box occupée


Désactiver l'affichage :
{{Bandeau|type=important|Un compagnon mort en box est perdu définitivement. Prends soin de venir le récupérer ou de renouveler son bail à temps.}}
<syntaxhighlight lang="text">
/ecurie show off
</syntaxhighlight>


== Workflow joueur — Interagir avec une étable ==
== Voir aussi ==
 
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 ===
# Amener le compagnon à côté ou le monter
# Cliquer '''Mettre en pension''' dans la GUI
# '''Si le compagnon n'a pas de nom custom''' (nom générique ou absent) → une enclume s'ouvre pour le nommer
# '''Si le compagnon a déjà un nom custom''' → mise en pension directe sans nommage
# Coût : <code>prices.store</code> en sols
 
=== Reprendre un compagnon ===
# Cliquer '''Reprendre un compagnon'''
# Choisir le compagnon dans la liste
# Coût : <code>prices.retrieve</code> 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 ===
# 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) ==
 
Requiert PlaceholderAPI installé.
 
{| class="wikitable"
! Placeholder !! Valeur
|-
| <code>%ecurie_horses_count%</code> || Nombre de compagnons en pension du joueur
|-
| <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
|-
| <code>%ecurie_horse_health_&lt;n&gt;%</code> || Santé (ex : <code>18.0/20.0</code>)
|}
 
== 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 <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 ==
 
<syntaxhighlight lang="bash">
./gradlew shadowJar
# 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.
 
== 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.
|}


[[Catégorie:Plugin développé pour Nefald]]
* [[MyPet]] — familiers combattants
[[Catégorie:Plugin installé]]
* [[Grades]] — accès et permissions selon ton rang
Les témoins (''cookies'') nous aident à fournir nos services. En utilisant nos services, vous acceptez notre utilisation de témoins.