Patrullas de NPCs y jefes
EliteMobs puede hacer que los NPCs configurados y los Jefes Personalizados sigan rutas creadas por el administrador mediante la navegación nativa de Minecraft. El mismo sistema permite controlar walk_to, hold y teleport desde Lua.
Flujo rápido de creación
- Genera o coloca el NPC o Jefe Personalizado.
- Míralo directamente desde un máximo de 12 bloques y ejecuta
/em patrol edit. - Sitúate en cada destino y ejecuta
/em patrol add. Las rutas nuevas empiezan con el nodo0en el punto de aparición configurado del actor. - Usa
/em patrol mode LOOPpara volver del último nodo al primero, o/em patrol mode REVERSEpara recorrer la lista en sentido inverso. - Ejecuta
/em patrol savepara guardar la ruta y actualizar al actor.
El editor muestra las conexiones entre nodos y una vista previa del recorrido resuelto. /em patrol remove elimina el último nodo, /em patrol undo restaura una edición anterior y /em patrol status informa del estado del controlador de edición. /em patrol cancel termina la sesión sin guardar cambios de ruta. Todos los comandos de edición son exclusivos para jugadores y requieren elitemobs.patrol.admin. Los destinos deben estar en el mundo configurado; el editor rechaza puntos dentro de una región de WorldGuard con elitemob-spawning en deny.
Las rutas nuevas usan coordenadas relativas. Al editar una ruta existente, el editor conserva su ajuste patrol.relative y guarda los puntos añadidos en ese formato. Define el formato en la configuración YAML.
Si un archivo de NPC o jefe regional contiene varios spawnLocations, guardar una ruta para un actor crea un archivo secundario para esa ubicación y la elimina del original. Así, la edición afecta solo a ese actor, tanto en rutas relativas como absolutas. El nuevo archivo hereda del original mediante extends. Un archivo secundario de jefe también copia leashRadius, powers y eliteScript del original, que extends no hereda.
Configuración
Los nodos de patrulla son coordenadas x,y,z. Con relative: true, el valor por defecto, son desplazamientos desde el punto de aparición configurado del actor. Con relative: false, son coordenadas exactas en el mundo del actor, incluido el mundo de su instancia de mazmorra activa. Los nodos absolutos no incluyen un nombre de mundo.
patrol:
enabled: true
relative: true
mode: LOOP
speed: 1.0
virtualSpeed: 0.2
nodes:
- 0,0,0
- 1000,0,0
- 1000,0,250
| Clave | Valores | Predeterminado | Descripción |
|---|---|---|---|
patrol.enabled | true / false | true si hay nodos | Activa la ruta. |
patrol.relative | true / false | true | Usa desplazamientos desde el punto de aparición configurado con true, o coordenadas exactas en el mundo del actor con false. Se aplica a todos los nodos de la ruta. |
patrol.mode | LOOP / REVERSE | LOOP | LOOP conecta el último nodo con el nodo 0; REVERSE vuelve por la lista. |
patrol.speed | número positivo finito | 1.0 | Multiplicador de velocidad de la navegación nativa. |
patrol.virtualSpeed | número positivo finito | atributo de velocidad × velocidad de patrulla | Bloques avanzados por tick por el recorrido resuelto almacenado cuando un actor persistente no tiene cuerpo cargado. Normalmente debe omitirse. |
patrol.startNodeWaitSeconds | número finito, 0 o más | 0 | Segundos que el actor descansa en el nodo 0 cada vez que vuelve a él: una vez por vuelta en LOOP y una vez por ida y vuelta en REVERSE. Un actor que aparece en el nodo 0 también descansa antes de su primera vuelta. Mientras descansa, mira en la dirección de su punto de aparición. |
patrol.nodes | al menos dos coordenadas | ninguno | Destinos ordenados, interpretados según patrol.relative. Acepta cadenas x,y,z y mapas con x, y y z. Las coordenadas deben ser finitas y los nodos consecutivos distintos. |
Por ejemplo, esta ruta visita tres ubicaciones exactas antes de volver a la primera:
patrol:
enabled: true
relative: false
mode: LOOP
nodes:
- 299,91,215
- 286,91,213
- 279,91,230
Las rutas existentes sin patrol.relative siguen usando desplazamientos. Cambiar el ajuste cambia cómo se interpretan todos los nodos; no convierte los números guardados. Convierte también los nodos al cambiar el formato de una ruta existente.
No existe un límite público por tramo. Un tramo de 1000 bloques es válido. La antigua clave experimental patrol.maxLegDistance está obsoleta y no tiene efecto.
El editor conserva al guardar la velocidad de navegación, cualquier virtualSpeed explícito y el descanso en el nodo inicial. Al leer una ruta con más de dos nodos, se elimina automáticamente una copia del primer nodo repetida al final.
Pausas de NPC por proximidad
Los NPC también admiten patrol.pauseNearPlayersRadius (por defecto 0, desactivado) y patrol.faceNearbyPlayers (por defecto false). Un radio positivo finito pausa la patrulla cerca de jugadores vivos que no sean espectadores; la opción de orientación hace que el NPC mire al jugador válido más cercano. La proximidad se comprueba cada 20 ticks. Los radios no válidos o negativos desactivan la pausa.
Estos ajustes son independientes de los diálogos y las esperas manuales de patrulla mediante Lua. Son opciones de NPC, no campos adicionales de patrulla de jefe.
Descanso en el nodo inicial
Con patrol.startNodeWaitSeconds, un actor se detiene en el nodo 0 antes de empezar la siguiente vuelta. La cuenta atrás del descanso continúa también mientras el actor está descargado. Una pausa por proximidad o por combate detiene la cuenta atrás hasta que termina. walk_to, hold, teleport y patrol_resume() terminan el descanso de inmediato. El instructor de combate del Gremio usa un descanso de 60 segundos para que los jugadores puedan encontrarlo en su silla entre vueltas.
Búsqueda de rutas a larga distancia
Los tramos largos se resuelven automáticamente. EliteMobs solicita a MagmaCore una ruta progresiva por el terreno cargado, la divide en destinos cortos para la navegación nativa y vuelve a calcularla conforme avanza el actor.
El acceso al terreno y la búsqueda de rutas están separados deliberadamente:
- Las instantáneas de chunks cargados se capturan en el hilo del servidor mediante el sistema compartido de cargas de trabajo con presupuesto por tick de MagmaCore.
- La búsqueda A* limitada se ejecuta de forma asíncrona sobre esas instantáneas inmutables.
- El pathfinder nativo de Minecraft valida y recorre los tramos cortos finales.
- La planificación nunca fuerza la carga de chunks. Si falta terreno, espera y vuelve a intentarlo. Un actor persistente sin cuerpo solo puede avanzar por su recorrido resuelto almacenado y espera cuando se agota. Su cuerpo solo puede volver en una zona que procese entidades.
Así se pueden atravesar ciudades sin escanearlo todo en un tick ni atravesar edificios descargados en línea recta. Las criaturas voladoras y acuáticas usan búsquedas volumétricas; las terrestres requieren apoyo y espacio libre y evitan peligros habituales.
Comportamiento de los actores
- Las patrullas de NPCs activan automáticamente la IA del cuerpo y la sincronización de movimiento del modelo.
syncMovementsigue controlando modelos sin patrulla, pero no es un segundo interruptor de patrulla. - Los Jefes Personalizados necesitan
ai: true, velocidad positiva y no pueden ser pasajeros. - Los jefes pausan su patrulla durante el combate y la reanudan al terminar.
- Los NPCs no instanciados y los jefes persistentes no instanciados conservan su posición segura en
patrol-state.ymldurante descargas de chunks y recargas. Una posición guardada se descarta cuando cambian los nodos de la ruta o su ajusterelative, y el actor vuelve a empezar desde el nodo0. - Un actor solo vuelve a materializarse en la zona que procesa entidades. Sin cuerpo, su posición guardada todavía puede avanzar por un recorrido resuelto previamente; no descubre rutas nuevas por terreno desconocido.
- Un pasajero no puede tener patrulla; configura la montura.
Control mediante Lua
Estos métodos están expuestos en context.npc y context.boss; sus operaciones de patrulla requieren un controlador configurado. Las coordenadas de Lua siguen siendo desplazamientos desde el punto de aparición configurado del actor, sea cual sea patrol.relative, y cada método devuelve si aceptó la solicitud. walk_to, hold y teleport también necesitan un cuerpo vivo. Aceptar una marcha no demuestra la llegada: el combate, las pausas por proximidad, la IA desactivada o un fallo de ruta pueden interrumpirla.
| Método | Comportamiento |
|---|---|
patrol_pause() | Detiene la ruta actual sin perder su configuración. |
patrol_resume() | Cancela una espera o marcha temporal y reanuda la patrulla. |
walk_to(x, y, z) | Camina hasta el desplazamiento y después reanuda la patrulla. |
hold(x, y, z) | Camina hasta el desplazamiento y permanece allí hasta que se llame a patrol_resume(). |
teleport(x, y, z) | Teletransporta el cuerpo vivo al desplazamiento dentro del mismo mundo si el destino procesa entidades y Bukkit acepta el teletransporte. No borra una pausa de script ni un destino temporal existentes; usa patrol_resume() para volver a la ruta. |
return {
api_version = 1,
on_npc_interact = function(context)
context.npc:walk_to(40, 0, -12)
end
}
walk_to usa el mismo solucionador de larga distancia; no hace falta dividir manualmente el trayecto.
Diagnóstico
Fuera de una sesión de edición, mira al actor y ejecuta /em patrol status. La salida incluye el estado, los nodos actual y objetivo, la fracción de ruta, la ubicación lógica, la velocidad virtual, la presencia de cuerpo y el motivo de pausa. start_node_wait indica el descanso en el nodo inicial. terrain_unavailable indica que el movimiento sin cuerpo ya no tiene un recorrido resuelto disponible; un actor cargado que espera la planificación puede mostrar yielded. La ubicación lógica representa el progreso de la ruta y puede diferir de la posición segura guardada para restaurar el cuerpo.
El controlador reintenta una vez los fallos normales de ruta antes de avanzar al siguiente nodo. Una marcha o espera temporal fallida también recibe un reintento del controlador; eso no demuestra que se haya llegado al destino. Comprueba el terreno y la navegación nativa si el actor se salta un punto o permanece detenido.