Aller au contenu principal

Créer des PNJ

webapp_banner.jpg

Placez les définitions dans plugins/EliteMobs/npcs/, avec des noms de fichier uniques incluant .yml. Enregistrez le fichier puis lancez /em reload avant de placer un nouveau PNJ. Un joueur disposant de elitemobs.place.npc peut utiliser /em place npc <npcfilename.yml> à la position et dans la direction souhaitées. Un fichier peut contenir plusieurs emplacements.

Réutiliser un autre fichier de PNJ​

Un fichier de PNJ peut partir d'un autre fichier de PNJ avec extends, puis ne modifier que ce qui diffère :

extends: my_base_npc.yml
name: "&aSecond Guard"
spawnLocations:
- my_world,20,64,20,90,0

Le fichier hérite de toutes les valeurs de la base et remplace les clés qu'il définit. Les sections imbriquées, comme patrol, sont fusionnées clé par clé ; une liste, comme dialog, remplace entièrement la liste de la base. Désignez la base par son seul nom de fichier, sans chemin de dossier. Il doit s'agir d'un autre fichier de npcs, sous-dossiers compris, et cette base peut elle-même étendre une autre base.

isEnabled, spawnLocation et spawnLocations ne sont jamais hérités : chaque fichier conserve donc ses propres emplacements. Une base définie sur isEnabled: false peut servir de modèle : les fichiers qui l'étendent se chargent quand même. EliteMobs n'écrit pas de valeurs par défaut dans un fichier qui utilise extends. Une base introuvable, un chemin dans extends ou une boucle de références extends désactive le fichier avec un avertissement dans la console. L'éditeur de patrouille utilise extends lorsqu'il sépare un emplacement d'un fichier qui en contient plusieurs.

Paramètres de configuration​

isEnabled​

Active la définition lors du chargement des configurations. Rechargez après modification. Un SCROLL_APPLIER nécessite aussi l'activation globale de useEliteItemScrolls pour apparaître.

CléValeursDéfaut
isEnabledBooléentrue
Exemple
isEnabled: true

name​

Définit le nom affiché, avec prise en charge des codes de couleur. EliteMobs inscrit ce texte dans son CSV de traduction et utilise la traduction de la langue configurée lorsqu'elle existe.

CléValeursDéfaut
nameTextechaîne vide
Exemple
name: "&aEnn Peecee"

create_npc_name.jpg


Disposition des étiquettes​

Le nom et le rôle utilisent une disposition fixe. Il n'existe pas de réglages nameplateScale ou nameplateLineGap par PNJ. Les étiquettes ordinaires ou déguisées suivent la hauteur du corps ou du déguisement. Les modèles FreeMinecraftModels compatibles gèrent leurs étiquettes ; ModelEngine conserve son propre nom tandis qu'EliteMobs affiche le rôle. Les indicateurs personnels de quête sont placés au-dessus.

Lorsque les jeux d'argent sont activés, le PNJ spécial gambling_den_owner.yml ajoute les gains de la maison à ces mêmes étiquettes, actualisées environ chaque seconde.

scale​

Définit la taille du villageois sous-jacent via l'attribut d'échelle de Minecraft. Un modèle ou déguisement peut gérer sa propre taille visuelle ; ce réglage ne garantit pas qu'il suive celle du villageois.

CléValeursDéfaut
scaleMultiplicateur1.0

Lors de la mise à l'échelle, 1.0 représente la taille par défaut. Pour agrandir l'entité, augmentez la valeur (par exemple, 1.2). Pour rapetisser l'entité, diminuez la valeur (par exemple, 0.8).

Exemple
scale: 1.2

role​

Définit l'étiquette de rôle sous le nom. Purement visuelle, elle accepte les codes de couleur et est inscrite dans le CSV de traduction.

CléValeursDéfaut
roleTextechaîne vide
Exemple
role: "&c<Red Fellow>"

create_npc_role.jpg


profession​

Définit la profession du villageois et son apparence lorsqu'aucun déguisement ni modèle personnalisé n'est utilisé.

CléValeursDéfaut
professionProfessionNITWIT
Exemple
profession: NITWIT

create_npc_profession.jpg


greetings​

Définit les salutations tentées lorsqu'une analyse détecte pour la première fois le joueur dans activationRadius. Une entrée aléatoire devient une bulle flottante, visible seulement par ce joueur pendant environ 5 secondes. La liste est inscrite dans le CSV de traduction. La parole exige canTalk et la fin du délai partagé entre dialogues.

La salutation n'est tentée qu'à l'entrée détectée. Si le délai partagé la bloque, rester dans le rayon ne relance pas cette tentative.

CléValeursDéfaut
greetingsListe de textesaucun
Exemple
greetings:
- Hi there!
- Good day.

create_npc_greetings.jpg


dialog​

Définit les répliques en bulle flottante. Une entrée est choisie au hasard à chaque fois, sans suivre l'ordre de la liste. La liste est inscrite dans le CSV de traduction.

Le moment du déclenchement dépend de l'interactionType :

  • Les PNJ CHAT tentent une réplique lors d'une interaction, normalement un clic droit. FreeMinecraftModels transmet aussi les clics gauches sur le modèle au gestionnaire d'interactions.
  • Les autres types tentent une réplique lors des analyses suivantes tant que le joueur reste dans activationRadius ; l'analyse d'entrée tente plutôt une salutation.

Un \n littéral crée des lignes empilées. Conservez-le avec des guillemets simples YAML, ou écrivez \\n entre guillemets doubles. Cela vaut aussi pour les salutations et adieux.

CléValeursDéfaut
dialogListe de textesaucun
Exemple
dialog:
- I like apples!
- Sure is hot.

create_npc_dialog.jpg


farewell​

Définit les adieux, choisis au hasard pour une bulle flottante. La liste est inscrite dans le CSV de traduction.

La fermeture de toute vue d'inventaire avec un titre non vide tente de faire parler les PNJ proches. La recherche s'étend sur 5 blocs le long de chaque axe autour du joueur, sans se limiter au propriétaire du menu. Plusieurs PNJ peuvent répondre. Sortir de activationRadius ne déclenche pas d'adieu.

CléValeursDéfaut
farewellListe de textesaucun
Exemple
farewell: 
- Until next time!
- Bye!

create_npc_farewell.jpg


canTalk​

Contrôle les bulles intégrées. false supprime greetings, dialog et farewell, mais ne désactive ni menus, commandes, scripts Lua, dialogues de quête, détection de proximité ni indicateurs de quête.

CléValeursDéfaut
canTalkBooléentrue
Exemple
canTalk: true

activationRadius​

Définit le rayon, en blocs, auquel un PNJ peut détecter l'approche d'un joueur.

La proximité est analysée tous les 100 ticks, environ 5 secondes, avec une distance en trois dimensions et sans contrôle de ligne de vue. Un PNJ immobile peut regarder le joueur, le saluer à son entrée puis dialoguer lors des analyses suivantes. 0 ou moins désactive ces interactions, y compris les hooks Lua de proximité. Les indicateurs de QUEST_GIVER et CUSTOM_QUEST_GIVER ont un rayon indépendant de 30 blocs et fonctionnent avec activationRadius: 0 ; ils reflètent les quêtes disponibles et à rendre pour ce joueur.

CléValeursDéfaut
activationRadiusDécimal3.0

L'analyse et les bulles sont suspendues lorsqu'une patrouille se déplace ou est en cours d'édition. patrol.pauseNearPlayersRadius et patrol.faceNearbyPlayers règlent la pause et l'orientation près des joueurs ; consultez Patrouilles.

Exemple
activationRadius: 3.0

scripts​

Définit les scripts Lua attachés à ce PNJ. Les fichiers de script sont chargés depuis plugins/EliteMobs/npc_scripts/. L'extension .lua est optionnelle — elle est ajoutée automatiquement si vous l'omettez.

CléValeursDéfaut
scriptsListe de textesaucun

Le moteur Lua partagé MagmaCore accepte on_spawn, on_game_tick, on_remove, on_npc_interact, on_npc_proximity_enter, on_npc_proximity_leave, on_zone_enter et on_zone_leave. Le hook de tick des PNJ est on_game_tick. Chaque PNJ a ses propres instances ; les priorités inférieures passent d'abord. Un script avec seulement un hook de tick a aussi besoin d'un on_spawn, éventuellement vide, pour être initialisé. Consultez Scripts Lua de PNJ pour l'API et les exemples.

Un nom sans définition de script chargée correspondante est ignoré avec un avertissement ; le PNJ apparaît quand même. Respectez la casse du fichier et rechargez après modification.

Un dialogue de quête peut consommer le clic avant on_npc_interact. Sinon, ce hook précède l'interaction configurée et ne l'annule pas.

Exemple
scripts:
- wave.lua

interactionType​

Définit le type d'interaction que le PNJ effectuera.

CléValeursDéfaut
interactionTypeSpécial [1]NONE
Exemple
interactionType: TELEPORT_BACK

noPreviousLocationMessage​

Message de TELEPORT_BACK lorsqu'aucune destination de retour n'est enregistrée. Il s'agit du point de départ sauvegardé par une téléportation EliteMobs depuis l'extérieur d'un monde EliteMobs, pas de la dernière position à pied ou de mort. Le retour utilise la téléportation EliteMobs habituelle, avec son délai et ses règles d'annulation. Ce message accepte les codes de couleur et est inscrit dans le CSV de traduction.

CléValeursDéfaut
noPreviousLocationMessageTextechaîne vide
Exemple
noPreviousLocationMessage: '&8[EliteMobs] &cCouldn''t send you back to your previous location - no previous location found!'

create_npc_noteleportlocation.jpg


timeout​

Délai en minutes avant de retirer le PNJ apparu. 0 ou moins désactive le minuteur. Cela ne supprime pas l'emplacement enregistré et ne désactive pas la définition : le PNJ peut revenir après rechargement, redémarrage ou restauration du chunk.

Pour supprimer un emplacement, activez /em remove, frappez le PNJ, puis relancez /em remove pour quitter ce mode. Permission : elitemobs.remove. L'entrée correspondante d'une liste est supprimée ; une ancienne définition à emplacement unique est désactivée. Lors du passage à spawnLocations, retirez l'ancienne clé spawnLocation, sinon elle peut redevenir active quand la liste est vide.

CléValeursDéfaut
timeoutDécimal0 (jamais)
Exemple
timeout: 0

questFileName​

Liste les fichiers de plugins/EliteMobs/customquests/, avec .yml, pour CUSTOM_QUEST_GIVER. La clé au singulier accepte une liste. Le menu propose les quêtes accessibles et accepte celles à rendre au nom de fichier de ce PNJ. Un PNJ de retour peut donc avoir une liste vide. Les emplacements du même fichier partagent cette identité. Les permissions et conditions de chaque quête restent applicables.

CléValeursDéfaut
questFileNameListe de textesaucun
Exemple
questFileName:
- my_quest_one.yml
- my_quest_two.yml

disguise​

Définit le déguisement et nécessite LibsDisguises. Un modèle personnalisé chargé correctement est prioritaire.

CléValeursDéfaut
disguiseFormat LibsDisguisesaucun
Exemple
disguise: SKELETON

create_npc_disguise.jpg


customDisguiseData​

Définit les données d'un déguisement LibsDisguises personnalisé.

CléValeursDéfaut
customDisguiseDataFormat LibsDisguisesaucun
Exemple
disguise: custom:my_cool_disguise_name
customDisguiseData: player my_cool_disguise_name setskin {"id":"364acb6d-9050-46f7-b5fb-f8c3fd83a6fc","name":"Unknown","properties":[{"name":"textures","value":"ewogICJ0aW1lc3RhbXAiIDogMTYxMTk4ODA4Nzc1NSwKICAicHJvZmlsZUlkIiA6ICJkZGVkNTZlMWVmOGI0MGZlOGFkMTYyOTIwZjdhZWNkYSIsCiAgInByb2ZpbGVOYW1lIiA6ICJEaXNjb3JkQXBwIiwKICAic2lnbmF0dXJlUmVxdWlyZWQiIDogdHJ1ZSwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzliYmVkODQzNWY4YmYyNzhhZmUyNmU2NGZkOTI2YjhiMzc3MzJkODhlMzM0ODk3ZGJkNTI3ZDU2ZmY5MTk5MGUiCiAgICB9CiAgfQp9","signature":"ujLq1joYVktuQAp1xpFKlxQFUVinSePiDBiVCAxxix/mA5vP86i/eAOfb1mtGjaAZ6sO0l2olbzvycnGXNBtbAxgqprguROXY4tpWiePVTDmy3iD4GdOCxHAkYLoyMV5qTT4SNsldUFFuND8GSEgbNMltKDLmhNKwzm08iCigPfpeuYpwljgJPxu6ka54PKNaQu4doI0ZDZXKqq4hPhR3Bs2Sz9MI0SmdmQWwcCzUz3DFdVno27fmQ6LwqmT+eSoOv0EttVG/XMaTYQ5lhBY61mqf6WlJyYVUSfjJk1AbYsctu7dWM+sbY8jFq5ljvXJGGr5TyKi+fs8vHy06Z2go20QgTYOw+caFxFijAS6fgm3oY57VEO/+/9OLHdD+Z9BrWqQWcIIrVeIfxjue/yt4pyeVv9jX59hjNFjhcPEwotkxJ+vZ96WlTLWDG4BiqauDr2VeGyLlVaygO9ZU0wwsN65iSh91GI3tMIA5wbDR0Hts/9ABvt9eafHbowS+4SZXN0i9mYnKg7op1eiB8nMEAGsPJg3DwsmUrh3ACAapQ6eYHiJpo59RXDqKlRcXwo7wsEFp//5LgQWbPj0NP3nxnywdpozqSAeq6236qlhE9BT9eiyJ41V9sMelYFEWMlUAltR40NdbIrHB0J3nmfuLJz44/sTwWf6P1khOy//XX0="}],"legacy":false}

create_npc_custom_disguise.jpg


customModel​

Définit un modèle FreeMinecraftModels ou ModelEngine. Installez-le dans le fournisseur sélectionné avant de référencer son ID. FreeMinecraftModels est prioritaire si les deux sont présents ; un modèle FMM manquant ne fait pas sélectionner ModelEngine. Si aucun modèle ne se charge, le PNJ utilise son déguisement ou l'apparence ordinaire du villageois. Consultez Modèles personnalisés.

CléValeursDéfaut
customModelTexteaucun
Exemple
customModel: MY_MODEL_ONE

Entraîneurs de classe et transport​

Utilisez interactionType: CLASS_TRAINER avec classRoot pour choisir la branche de classe. Partez des définitions incluses class_trainer_*.yml. Les épreuves et la progression figurent dans Advanced Combat System.

Pour interactionType: TRANSPORT, transportRoutes contient des IDs de route sans .yml ; cliquer ouvre le choix des destinations. Consultez Routes de transport.

arena​

Définit le nom de fichier de l'arène pour laquelle le PNJ ouvrira un menu (nécessite l'interactionType ARENA_MASTER).

CléValeursDéfaut
arenaNom de fichieraucun
Exemple
arena: my_arena.yml

command​

Commande pour COMMAND. Elle s'exécute au tick suivant en tant que joueur ayant cliqué, avec ses permissions habituelles. Omettez le / initial. Ce champ ne remplace pas automatiquement les variables du joueur et n'utilise pas le format de commandes console EliteMobs.

CléValeursDéfaut
commandTexteaucun
Exemple
command: say Look at me running a command, how cool!

create_npc_command.jpg


spawnLocation​

Définit un unique emplacement d'apparition pour le PNJ. C'est la clé héritée à emplacement unique : elle n'est lue que si spawnLocations est absente ou vide. Les nouveaux emplacements placés en jeu sont écrits dans spawnLocations à la place ; préférez donc cette clé.

Le format conseillé est world,x,y,z,yaw,pitch. Le monde nommé doit déjà être chargé ; ce réglage ne le charge pas.

CléValeursDéfaut
spawnLocationTexteaucun
Exemple
spawnLocation: my_world,10,50,10,0,0

spawnLocations​

Définit plusieurs emplacements pour le même PNJ. /em place npc <npcfilename.yml> ajoute votre position et votre orientation, arrondies à deux décimales, et définit isEnabled: true. Un emplacement sérialisé strictement identique n'est pas ajouté deux fois. Les PNJ sont restaurés lorsque leurs chunks peuvent traiter les entités.

Le format de chaque entrée est world,x,y,z,yaw,pitch.

CléValeursDéfaut
spawnLocationsListe de textesaucun
Exemple
spawnLocations: 
- my_world,10,50,10,0,0
- my_world,-10,50,-10,0,0

instanced​

Définit si le PNJ doit être instancié (pour une utilisation dans les donjons instanciés). Lorsqu'il est défini sur true, le PNJ n'apparaît pas dans le monde blueprint ; il est enregistré comme modèle et cloné pour chaque instance de donjon, chaque clone existant dans le monde d'instance correspondant.

CléValeursDéfaut
instancedBooléenfalse
Exemple
instanced: false

syncMovement​

Définit si le modèle personnalisé du PNJ doit voir son mouvement synchronisé avec l'entité sous-jacente. Cela n'a d'effet que lorsque customModel est défini et que le modèle est chargé — le paramètre est ignoré pour les PNJ simples et les PNJ LibsDisguises.

Une patrol valide active cette synchronisation même en pause ou si cette option vaut false. Le réglage reste utile pour les modèles sans patrouille.

CléValeursDéfaut
syncMovementBooléentrue
Exemple
syncMovement: true

patrol​

Ajoute à ce PNJ un itinéraire natif avec recherche automatique de chemin. Les nœuds sont des décalages depuis le point d'apparition défini pour ce PNJ, ou des coordonnées exactes dans son monde avec patrol.relative: false. Les longs segments sont calculés et divisés automatiquement, et les patrouilles ne forcent pas le chargement des chunks. patrol.startNodeWaitSeconds fait se reposer le PNJ au premier nœud une fois par tour, patrol.pauseNearPlayersRadius, réservé aux PNJ, le met en pause près des joueurs, et patrol.faceNearbyPlayers le tourne vers eux pendant la pause. Consultez Patrouilles des PNJ et boss pour le schéma, l'éditeur, le comportement longue distance et les contrôles Lua.


Exemple de configuration de PNJ
isEnabled: true
name: "&cRed Rubin"
role: "&a<Generic NPC>"
profession: NITWIT
greetings:
- Hiya!
- Hello!
dialog:
- Great conversation!
- Pleasure talking with you!
farewell:
- Goodbye!
- Laters!
canTalk: true
activationRadius: 4
interactionType: CHAT
timeout: 0
spawnLocations:
- my_world,584,55,127,90,10

create_npc_npc.jpg


Spécial [1]​

Voici la liste des types d'interaction de PNJ valides :

TypeDescription
GUILD_GREETEROuvre les bonus de compétences d'armes. Nécessite elitemobs.skill.npc.
CLASS_TRAINEROuvre la branche de classRoot. Nécessite elitemobs.command.
TRANSPORTOuvre les destinations de transportRoutes.
CHATTente une réplique aléatoire de dialog lors de l'interaction.
CUSTOM_SHOPOuvre la boutique personnalisée. Nécessite elitemobs.shop.custom.npc.
PROCEDURALLY_GENERATED_SHOPOuvre la boutique générée. Nécessite elitemobs.shop.dynamic.npc.
BARNon implémenté. Indique au joueur que la fonctionnalité arrive bientôt.
ARENANe fait rien. Utilisez ARENA_MASTER à la place.
QUEST_GIVEROuvre les quêtes générées. Nécessite elitemobs.quest.npc.
CUSTOM_QUEST_GIVERPropose les quêtes accessibles de questFileName et accepte les retours assignés.
NONEAucune action intégrée ; scripts, proximité et dialogues de quête restent possibles.
SELLOuvre la vente. Nécessite elitemobs.shop.sell.npc.
TELEPORT_BACKUtilise la destination de retour EliteMobs enregistrée. Nécessite elitemobs.back.npc.
SCRAPPEROuvre la récupération. Nécessite elitemobs.scrap.npc.
REPAIRMANOuvre les réparations. Nécessite elitemobs.repair.npc.
ENCHANTEROuvre l'enchantement. Nécessite elitemobs.enchant.npc.
REFINERREMPLACÉ - Indique au joueur que la fonctionnalité a été remplacée ; les administrateurs sont invités à retirer le PNJ
SMELTERREMPLACÉ - Indique au joueur que la fonctionnalité a été remplacée ; les administrateurs sont invités à retirer le PNJ
ENHANCERREMPLACÉ - Indique au joueur que la fonctionnalité a été remplacée ; les administrateurs sont invités à retirer le PNJ
UNBINDEROuvre la déliaison. Nécessite elitemobs.unbind.npc.
ARENA_MASTEROuvre le menu d'arène pour l'arène définie dans arena
COMMANDExécute la commande définie dans command
SCROLL_APPLIEROuvre les parchemins d'objet d'élite. Nécessite elitemobs.scroll.npc ; n'apparaît pas si useEliteItemScrolls est désactivé.
ARROW_SHOPOuvre la boutique de flèches. Nécessite elitemobs.shop.arrow.npc.
GAMBLING_BLACKJACKOuvre le blackjack. Nécessite elitemobs.gambling.npc.
GAMBLING_COINFLIPOuvre pile ou face. Nécessite elitemobs.gambling.npc.
GAMBLING_SLOTSOuvre la machine à sous. Nécessite elitemobs.gambling.npc.
GAMBLING_HIGHERLOWEROuvre plus haut/plus bas. Nécessite elitemobs.gambling.npc.

Pour plus d'informations sur ce que font les types d'interaction SCRAPPER et similaires, cliquez ici.

Notes sur le comportement des PNJ​

Le comportement intégré comprend également :

  • Mouvement : les PNJ restent normalement immobiles et regardent les joueurs proches. Les patrouilles et scripts peuvent les déplacer ; une patrouille contrôle l'itinéraire à la place du comportement ordinaire du villageois.
  • Ordre des interactions : un dialogue de quête peut consommer le clic avant Lua et l'action intégrée. Sinon, Lua précède l'action et ses contrôles de permissions. Une protection d'un tick empêche les interactions répétées du même joueur entre PNJ. L'édition d'une patrouille bloque les interactions, pas son déplacement normal.
  • Protection : les corps ne produisent pas les collisions habituelles. EliteMobs annule les dégâts, les transformations de villageois et l'ouverture du commerce ordinaire.
  • Étiquettes : nom et rôle suivent la disposition fixe décrite plus haut. Les PNJ ordinaires et déguisés utilisent leur hauteur actuelle ; modifier l'échelle peut donc déplacer les étiquettes. Les modèles FMM compatibles gèrent nom et rôle ensemble.
  • Bedrock : l'affichage dépend de l'intégration active des modèles et étiquettes. Le moteur actuel n'utilise pas la clé conservée bedrockNPCRoleYOffset.
  • Délai de dialogue : chaque PNJ partage un délai de 3 secondes entre tous les joueurs. Saluer l'un peut empêcher de saluer l'autre pendant cet intervalle. Chaque bulle personnelle disparaît après environ 5 secondes.
  • Invisibilité : un PNJ sous effet de potion d'invisibilité n'affichera pas de bulles de chat.
  • Chunks : les PNJ disparaissent au déchargement et reviennent quand le chunk peut traiter les entités. Leurs entités ne sont pas sauvegardées dans le monde ; leurs emplacements proviennent des configurations.
  • Renommage : le clic droit ordinaire sur le villageois avec une étiquette dans la main principale est annulé avec un message. Les modèles utilisent leurs propres callbacks ; FreeMinecraftModels transmet les clics gauches et droits au gestionnaire du PNJ.