Editar spawns de NPC en Lineage 2: cómo añadir, corregir y eliminar spawns

Editar los spawns de NPC en Lineage 2 parece sencillo hasta que el NPC que colocaste desaparece al reiniciar, o el guardia que borraste vuelve a pasearse por la ciudad a la mañana siguiente. Casi siempre el problema viene de dos cosas: no saber qué comando de admin hace que un spawn sea permanente y editar el almacenamiento equivocado. Esta guía cubre ambas cosas para emuladores de la familia L2J. Los comandos y las rutas de archivos cambian de un build a otro, así que revisa el código fuente de tu propio pack antes de fiarte de cualquier nombre que aparezca aquí.
Averigua dónde guarda los spawns tu emulador
Antes de tocar nada dentro del juego, comprueba qué lee tu servidor al arrancar. Eso no lo decide la crónica, sino la rama del emulador.
- L2J clásico (spawns en SQL). Los spawns viven en dos tablas de la base de datos,
spawnlistycustom_spawnlist. Cada fila contienecount, npc_templateid, locx, locy, locz, heading, respawn_delay, respawn_random, loc_id, periodOfDay. Las filas de la tabla custom pueden reutilizar IDs de la tabla original. - L2J Mobius y ramas más nuevas (spawns en XML). Los spawns son archivos XML dentro de
dist/game/data/spawns/<Region>/, validados contraxsd/spawns.xsd. - Otros forks (aCis y compañía). Usan su propia estructura. Abre el cargador de spawns en el código fuente y sigue la pista hasta los archivos que procesa, en lugar de adivinar.
Una entrada de spawn al estilo Mobius se ve así (sacada de un diff de 2022 de la época de Fafurion, así que tu esquema puede variar un poco):
<list>
<spawn name="BalthusKnights">
<group>
<npc id="34359" x="190569" y="168057" z="-11228" heading="29292" respawnTime="60sec" />
</group>
</spawn>
</list>
| Almacenamiento | Ubicación | ¿Sobrevive a una actualización del datapack? |
|---|---|---|
spawnlist (SQL) | Base de datos del juego | No. Las actualizaciones la sobrescriben. |
custom_spawnlist (SQL) | Base de datos del juego | Sí. Las actualizaciones no la tocan. |
| Archivos XML de spawns | data/spawns/<Region>/ | Solo si llevas control de tus cambios (un archivo aparte o tu propia rama de git) |

Añadir NPCs desde el juego: //spawn vs //spawn_once
En L2J Server (el datapack de High Five), la colocación la gestiona AdminSpawn.java. La sintaxis básica es:
//spawn <id> [count] [respawnTime]
El orden importa. El tiempo de respawn solo se lee si también indicas una cantidad, así que //spawn 20001 60 no significa "reaparecer cada 60", sino 60 unidades del mob. Escribe //spawn 20001 1 60 en su lugar.
La diferencia entre las variantes está en la permanencia:
//spawny//spawn_monsterañaden el spawn como permanente, así que está pensado para volver después de un reinicio.//spawn_onceañade un spawn no permanente y detiene su respawn. Si lo matas, se queda muerto. Ideal para jefes de eventos, mobs de prueba y apariciones puntuales del GM.- Todo lo que spawnees estando dentro de una instancia es siempre no permanente, uses el comando que uses. Si tu nuevo NPC desaparece, comprueba que no estabas en una instancia cuando lo colocaste.
El mismo handler registra también //show_spawns, //list_spawns, //list_positions, //unspawnall, //respawnall, //spawnday y //spawnnight. Ejecuta //list_spawns antes de empezar a colocar cosas, para saber qué hay ya en ese punto y no apilar una segunda copia de un NPC encima de la primera.
Consejo: colócate exactamente donde quieres el NPC y mira hacia la dirección en la que debe mirar antes de escribir el comando. Reescribir coordenadas a mano después es la causa de la mayoría de NPCs mal colocados.
Tiempos de respawn y spawns de día o de noche
El respawn se controla con un retraso más una variación aleatoria opcional. En la estructura SQL son respawn_delay y respawn_random. En el XML de Mobius es el atributo respawnTime, escrito con su unidad, por ejemplo respawnTime="60sec".
Dos reglas que conviene recordar, según la documentación del gestor de spawns de las bases Mobius:
- El respawn solo se activa cuando el retraso es mayor que 0. Un retraso de 0 significa que el NPC no vuelve tras morir.
- Si el retraso mínimo y el máximo son distintos, el servidor elige un valor aleatorio entre ambos. Ese margen es lo que impide que los campers calculen la aparición de un mob al segundo.
Para NPCs solo nocturnos o solo diurnos en L2J basado en SQL, usa periodOfDay: 0 es siempre, 1 solo de día y 2 solo de noche. Los comandos //spawnday y //spawnnight deben su nombre a esos conjuntos de spawns de día y de noche. Comprueba qué hacen en tu build antes de apoyarte en ellos para hacer pruebas.

Eliminar NPCs que siempre vuelven
Selecciona el NPC y usa //delete. En L2J Server, AdminDelete.java elimina la instancia activa, llama a stopRespawn() y quita el spawn de SpawnTable, o de RaidBossSpawnManager si se trata de un raid boss.
Lo que no hemos podido confirmar es si en los builds actuales también se borra la fila de la base de datos. Y en las ramas basadas en XML, lo que se carga al arrancar es el archivo en disco. Así que si un NPC eliminado reaparece tras un reinicio, da por hecho que la entrada guardada sobrevivió y bórrala en el origen:
- Anota el ID del NPC y sus coordenadas aproximadas antes de borrarlo (
//list_spawnsayuda con esto). - Busca la fila correspondiente en
spawnlistocustom_spawnlist, o la línea<npc>correspondiente en el archivo XML de la región. - Elimínala ahí y después reinicia o recarga los spawns.
- Si venía de
spawnlist, apunta el cambio. La próxima actualización del datapack puede volver a meterlo.
Recargar tras una edición: qué se aplica en vivo
Aquí cae mucha gente. En L2J Server, //reload npc recarga las plantillas de NPC mediante NpcData.load(). No recarga las posiciones de los spawns, y de hecho no existe ningún tipo spawn dentro de //reload. Los tipos admitidos incluyen config, npc, quest, htm, multisell, buylist, skill, item, door, zone y effect.
Para los spawns hay un comando aparte, //spawn_reload. Como regla general:
- Cambiaste una plantilla de NPC:
//reload npc(y//reload htmsi editaste sus páginas HTML). - Cambiaste filas o archivos de spawns:
//spawn_reload. - Cambiaste muchas cosas a la vez en un servidor en producción: hazlo en una ventana de mantenimiento y reinicia. Las recargas masivas con jugadores conectados son una forma muy eficaz de acabar con mobs duplicados que luego tendrás que limpiar a mano.
Un flujo de trabajo seguro para editar spawns
- Haz una copia de seguridad de las tablas de spawns o de la carpeta
data/spawnsantes de cada sesión de edición. - Pon tus propios NPCs en
custom_spawnlist, o en un archivo XML dedicado que sea tuyo, nunca directamente en los archivos originales. - Colócalos en el juego con
//spawn, prueba el respawn matándolos y luego reinicia un servidor de pruebas para confirmar que persisten. - Lleva un registro de cambios con los IDs y coordenadas que añadiste o eliminaste, para poder rehacerlos tras una actualización del emulador.
Una vez que tu mundo esté limpio y tus NPCs personalizados sean estables, los jugadores todavía tienen que encontrar el servidor. Publica tu servidor en L2Calendar gratis para que aparezca en el calendario de aperturas. Si quieres más visibilidad durante la semana de lanzamiento, la posición VIP lo coloca más arriba en los listados.
