Aller au contenu principal

Patrouilles des PNJ et boss

EliteMobs permet aux PNJ configurés et aux Boss personnalisés de suivre des itinéraires créés par l'administrateur avec la navigation native de Minecraft. Le même système expose walk_to, hold et teleport aux scripts Lua.

Création rapide​

  1. Faites apparaître ou placez le PNJ ou le Boss personnalisé.
  2. Regardez-le directement à moins de 12 blocs et exécutez /em patrol edit.
  3. Placez-vous à chaque destination et exécutez /em patrol add. Les nouveaux itinéraires commencent avec le nœud 0 au point d'apparition configuré de l'acteur.
  4. Utilisez /em patrol mode LOOP pour relier le dernier nœud au premier, ou /em patrol mode REVERSE pour repartir en sens inverse.
  5. Exécutez /em patrol save pour enregistrer l'itinéraire et actualiser l'acteur.

L'éditeur affiche les liaisons entre les nœuds et un aperçu du chemin résolu. /em patrol remove retire le dernier nœud, /em patrol undo restaure une modification précédente et /em patrol status indique l'état du pilote d'édition. /em patrol cancel termine la session sans enregistrer les changements d'itinéraire. Ces commandes sont réservées aux joueurs et nécessitent elitemobs.patrol.admin. Les destinations doivent être dans le monde d'origine ; l'éditeur refuse les points dans une région WorldGuard où elitemob-spawning est sur deny.

Les nouveaux itinéraires utilisent des coordonnées relatives. Lors de la modification d'un itinéraire existant, l'éditeur conserve son réglage patrol.relative et enregistre les points ajoutés dans ce format. Définissez le format dans la configuration YAML.

Si un fichier de PNJ ou de boss régional possède plusieurs spawnLocations, l'enregistrement d'un itinéraire pour un acteur placé crée un fichier enfant pour cet emplacement et retire cet emplacement du fichier d'origine. La modification reste ainsi propre à cet acteur, pour les itinéraires relatifs comme absolus. Le fichier enfant hérite de l'original avec extends. Un fichier enfant de boss copie aussi leashRadius, powers et eliteScript de l'original, que extends n'hérite pas.

Configuration​

Les nœuds de patrouille sont des coordonnées x,y,z. Avec relative: true, la valeur par défaut, ce sont des décalages depuis le point d'apparition configuré de l'acteur. Avec relative: false, ce sont des coordonnées exactes dans le monde de l'acteur, y compris le monde de son instance de donjon active. Les nœuds absolus n'incluent pas de nom de monde.

patrol:
enabled: true
relative: true
mode: LOOP
speed: 1.0
virtualSpeed: 0.2
nodes:
- 0,0,0
- 1000,0,0
- 1000,0,250
CléValeursDéfautDescription
patrol.enabledtrue / falsetrue si des nœuds existentActive l'itinéraire.
patrol.relativetrue / falsetrueUtilise des décalages depuis le point d'apparition configuré avec true, ou des coordonnées exactes dans le monde de l'acteur avec false. S'applique à tous les nœuds de l'itinéraire.
patrol.modeLOOP / REVERSELOOPLOOP relie le dernier nœud au nœud 0; REVERSE rebrousse chemin.
patrol.speednombre positif fini1.0Multiplicateur de vitesse de la navigation native.
patrol.virtualSpeednombre positif finiattribut de vitesse × vitesse de patrouilleBlocs parcourus par tick sur le chemin résolu en cache lorsqu'un acteur persistant n'a pas de corps chargé. Laissez généralement cette clé absente.
patrol.startNodeWaitSecondsnombre fini, 0 ou plus0Secondes de repos de l'acteur au nœud 0 à chaque retour : une fois par tour en LOOP, une fois par aller-retour en REVERSE. Un acteur qui apparaît au nœud 0 se repose aussi avant son premier tour. Pendant le repos, il fait face à l'orientation de son point d'apparition.
patrol.nodesau moins deux coordonnéesaucunDestinations ordonnées, interprétées selon patrol.relative. Les chaînes x,y,z et les tables x/y/z sont acceptées. Les coordonnées doivent être finies et les nœuds consécutifs distincts.

Par exemple, cet itinéraire visite trois emplacements exacts avant de revenir au premier :

patrol:
enabled: true
relative: false
mode: LOOP
nodes:
- 299,91,215
- 286,91,213
- 279,91,230

Les itinéraires existants sans patrol.relative continuent d'utiliser des décalages. Changer ce réglage modifie l'interprétation de tous les nœuds ; les nombres enregistrés ne sont pas convertis. Convertissez aussi les nœuds lorsque vous changez le format d'un itinéraire existant.

Il n'existe aucune distance maximale publique par segment. Un segment de 1 000 blocs est valide. L'ancienne clé expérimentale patrol.maxLegDistance est obsolète et sans effet.

L'éditeur conserve la vitesse de navigation, tout virtualSpeed explicite et le repos au nœud de départ lors de l'enregistrement. Lors de la lecture d'un itinéraire de plus de deux nœuds, une copie du premier nœud répétée à la fin est automatiquement retirée.

Pauses des PNJ à proximité des joueurs​

Les PNJ acceptent aussi patrol.pauseNearPlayersRadius (par défaut 0, désactivé) et patrol.faceNearbyPlayers (par défaut false). Un rayon positif fini met la patrouille en pause près des joueurs vivants qui ne sont pas spectateurs ; l'option d'orientation fait regarder au PNJ le joueur admissible le plus proche. La proximité est vérifiée toutes les 20 ticks. Un rayon invalide ou négatif désactive cette pause.

Ces paramètres sont indépendants des dialogues et des pauses manuelles Lua. Ce sont des options de PNJ, pas des champs supplémentaires pour les patrouilles de boss.

Repos au nœud de départ​

Avec patrol.startNodeWaitSeconds, un acteur s'arrête au nœud 0 avant d'entamer le tour suivant. Le repos est aussi décompté pendant que l'acteur est déchargé. Une pause de proximité ou de combat suspend le décompte jusqu'à sa fin. walk_to, hold, teleport et patrol_resume() mettent immédiatement fin au repos. L'instructeur de combat de la Guilde utilise un repos de 60 secondes pour que les joueurs puissent le trouver à sa chaise entre deux tours.

Recherche de chemin à longue distance​

Les longs segments sont résolus automatiquement. EliteMobs demande à MagmaCore un itinéraire progressif dans le terrain chargé, le découpe en courtes destinations natives et le recalcule au fur et à mesure.

L'accès au terrain et la recherche du chemin sont séparés :

  • Les instantanés des chunks chargés sont capturés sur le thread serveur via le système partagé de tâches à budget par tick de MagmaCore.
  • La recherche A* bornée s'exécute en arrière-plan sur ces instantanés immuables.
  • Le pathfinder natif de Minecraft valide et parcourt les derniers petits segments.
  • La planification ne force jamais le chargement des chunks. Si du terrain manque, elle attend et réessaie. Un acteur persistant sans corps peut seulement avancer sur son chemin résolu en cache, puis attend lorsqu'il l'a épuisé. Son corps ne peut revenir que dans une zone traitant les entités.

Un itinéraire peut ainsi traverser une ville sans tout analyser en un tick ni traverser un bâtiment déchargé en ligne droite. Les créatures volantes et aquatiques utilisent une recherche volumique ; les créatures terrestres exigent un sol et un passage libre et évitent les dangers courants.

Comportement des acteurs​

  • Une patrouille de PNJ active automatiquement l'IA du corps et la synchronisation du modèle. syncMovement reste utile hors patrouille, mais ne constitue pas un second interrupteur.
  • Un Boss personnalisé nécessite ai: true, une vitesse positive et ne doit pas être passager.
  • Le boss interrompt sa patrouille en combat et la reprend ensuite.
  • Les PNJ non instanciés et les boss persistants non instanciés conservent leur position sûre dans patrol-state.yml lors des déchargements et rechargements. Une position sauvegardée est abandonnée lorsque les nœuds de l'itinéraire ou le réglage relative changent, et l'acteur repart du nœud 0.
  • Un acteur ne se rematérialise que dans une zone traitant les entités. Sans corps, sa position sauvegardée peut encore avancer sur un chemin déjà résolu ; aucun nouvel itinéraire n'est découvert dans du terrain inconnu.
  • Un passager ne peut pas posséder de patrouille ; configurez sa monture.

Contrôle Lua​

Ces méthodes sont exposées sur context.npc et context.boss ; leurs opérations de patrouille nécessitent un contrôleur configuré. En Lua, les coordonnées restent des décalages depuis le point d'apparition configuré, quel que soit patrol.relative, et chaque méthode indique si la demande est acceptée. walk_to, hold et teleport nécessitent aussi un corps vivant. L'acceptation d'une marche ne prouve pas l'arrivée : le combat, une pause de proximité, l'IA désactivée ou un échec de chemin peuvent l'interrompre.

MéthodeComportement
patrol_pause()Arrête l'itinéraire sans supprimer sa configuration.
patrol_resume()Annule une attente ou un déplacement temporaire et reprend la patrouille.
walk_to(x, y, z)Marche jusqu'au décalage puis reprend la patrouille.
hold(x, y, z)Marche jusqu'au décalage et y reste jusqu'à l'appel de patrol_resume().
teleport(x, y, z)Téléporte le corps vivant au décalage dans le même monde si la destination traite les entités et que Bukkit accepte la téléportation. N'efface ni une pause de script ni une cible temporaire existante ; utilisez patrol_resume() pour reprendre l'itinéraire.
return {
api_version = 1,
on_npc_interact = function(context)
context.npc:walk_to(40, 0, -12)
end
}

walk_to utilise le même solveur longue distance ; aucun découpage manuel n'est nécessaire.

Diagnostic​

Hors d'une session d'édition, regardez l'acteur et exécutez /em patrol status. La sortie indique l'état, les nœuds actuel et cible, la progression, la position logique, la vitesse virtuelle, la présence du corps et la cause d'une attente. start_node_wait signale le repos au nœud de départ. terrain_unavailable indique que le déplacement sans corps n'a plus de chemin résolu disponible ; un acteur chargé attendant la planification peut afficher yielded. La position logique représente la progression sur l'itinéraire et peut différer de la position sûre sauvegardée pour restaurer le corps.

Le contrôleur réessaie une fois les échecs ordinaires de parcours avant de passer au nœud suivant. Une marche ou une attente temporaire en échec reçoit également une nouvelle tentative ; cela ne prouve pas que la destination a été atteinte. Vérifiez le terrain et la navigation native si l'acteur saute un point ou reste immobilisé.