Créer des PNJ
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é | Valeurs | Défaut |
|---|---|---|
isEnabled | Booléen | true |
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é | Valeurs | Défaut |
|---|---|---|
name | Texte | chaîne vide |
Exemple
name: "&aEnn Peecee"

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é | Valeurs | Défaut |
|---|---|---|
scale | Multiplicateur | 1.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é | Valeurs | Défaut |
|---|---|---|
role | Texte | chaîne vide |
Exemple
role: "&c<Red Fellow>"

profession
Définit la profession du villageois et son apparence lorsqu'aucun déguisement ni modèle personnalisé n'est utilisé.
| Clé | Valeurs | Défaut |
|---|---|---|
profession | Profession | NITWIT |
Exemple
profession: NITWIT

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é | Valeurs | Défaut |
|---|---|---|
greetings | Liste de textes | aucun |
Exemple
greetings:
- Hi there!
- Good day.

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
CHATtentent 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é | Valeurs | Défaut |
|---|---|---|
dialog | Liste de textes | aucun |
Exemple
dialog:
- I like apples!
- Sure is hot.

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é | Valeurs | Défaut |
|---|---|---|
farewell | Liste de textes | aucun |
Exemple
farewell:
- Until next time!
- Bye!

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é | Valeurs | Défaut |
|---|---|---|
canTalk | Booléen | true |
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é | Valeurs | Défaut |
|---|---|---|
activationRadius | Décimal | 3.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é | Valeurs | Défaut |
|---|---|---|
scripts | Liste de textes | aucun |
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é | Valeurs | Défaut |
|---|---|---|
interactionType | Spé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é | Valeurs | Défaut |
|---|---|---|
noPreviousLocationMessage | Texte | chaîne vide |
Exemple
noPreviousLocationMessage: '&8[EliteMobs] &cCouldn''t send you back to your previous location - no previous location found!'

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é | Valeurs | Défaut |
|---|---|---|
timeout | Décimal | 0 (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é | Valeurs | Défaut |
|---|---|---|
questFileName | Liste de textes | aucun |
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é | Valeurs | Défaut |
|---|---|---|
disguise | Format LibsDisguises | aucun |
Exemple
disguise: SKELETON

customDisguiseData
Définit les données d'un déguisement LibsDisguises personnalisé.
| Clé | Valeurs | Défaut |
|---|---|---|
customDisguiseData | Format LibsDisguises | aucun |
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}

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é | Valeurs | Défaut |
|---|---|---|
customModel | Texte | aucun |
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é | Valeurs | Défaut |
|---|---|---|
arena | Nom de fichier | aucun |
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é | Valeurs | Défaut |
|---|---|---|
command | Texte | aucun |
Exemple
command: say Look at me running a command, how cool!
![]()
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é | Valeurs | Défaut |
|---|---|---|
spawnLocation | Texte | aucun |
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é | Valeurs | Défaut |
|---|---|---|
spawnLocations | Liste de textes | aucun |
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é | Valeurs | Défaut |
|---|---|---|
instanced | Booléen | false |
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é | Valeurs | Défaut |
|---|---|---|
syncMovement | Booléen | true |
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

Spécial [1]
Voici la liste des types d'interaction de PNJ valides :
| Type | Description |
|---|---|
GUILD_GREETER | Ouvre les bonus de compétences d'armes. Nécessite elitemobs.skill.npc. |
CLASS_TRAINER | Ouvre la branche de classRoot. Nécessite elitemobs.command. |
TRANSPORT | Ouvre les destinations de transportRoutes. |
CHAT | Tente une réplique aléatoire de dialog lors de l'interaction. |
CUSTOM_SHOP | Ouvre la boutique personnalisée. Nécessite elitemobs.shop.custom.npc. |
PROCEDURALLY_GENERATED_SHOP | Ouvre la boutique générée. Nécessite elitemobs.shop.dynamic.npc. |
BAR | Non implémenté. Indique au joueur que la fonctionnalité arrive bientôt. |
ARENA | Ne fait rien. Utilisez ARENA_MASTER à la place. |
QUEST_GIVER | Ouvre les quêtes générées. Nécessite elitemobs.quest.npc. |
CUSTOM_QUEST_GIVER | Propose les quêtes accessibles de questFileName et accepte les retours assignés. |
NONE | Aucune action intégrée ; scripts, proximité et dialogues de quête restent possibles. |
SELL | Ouvre la vente. Nécessite elitemobs.shop.sell.npc. |
TELEPORT_BACK | Utilise la destination de retour EliteMobs enregistrée. Nécessite elitemobs.back.npc. |
SCRAPPER | Ouvre la récupération. Nécessite elitemobs.scrap.npc. |
REPAIRMAN | Ouvre les réparations. Nécessite elitemobs.repair.npc. |
ENCHANTER | Ouvre l'enchantement. Nécessite elitemobs.enchant.npc. |
REFINER | REMPLACÉ - Indique au joueur que la fonctionnalité a été remplacée ; les administrateurs sont invités à retirer le PNJ |
SMELTER | REMPLACÉ - Indique au joueur que la fonctionnalité a été remplacée ; les administrateurs sont invités à retirer le PNJ |
ENHANCER | REMPLACÉ - Indique au joueur que la fonctionnalité a été remplacée ; les administrateurs sont invités à retirer le PNJ |
UNBINDER | Ouvre la déliaison. Nécessite elitemobs.unbind.npc. |
ARENA_MASTER | Ouvre le menu d'arène pour l'arène définie dans arena |
COMMAND | Exécute la commande définie dans command |
SCROLL_APPLIER | Ouvre les parchemins d'objet d'élite. Nécessite elitemobs.scroll.npc ; n'apparaît pas si useEliteItemScrolls est désactivé. |
ARROW_SHOP | Ouvre la boutique de flèches. Nécessite elitemobs.shop.arrow.npc. |
GAMBLING_BLACKJACK | Ouvre le blackjack. Nécessite elitemobs.gambling.npc. |
GAMBLING_COINFLIP | Ouvre pile ou face. Nécessite elitemobs.gambling.npc. |
GAMBLING_SLOTS | Ouvre la machine à sous. Nécessite elitemobs.gambling.npc. |
GAMBLING_HIGHERLOWER | Ouvre 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.
