Edição de spawn de NPC no Lineage 2: como adicionar, corrigir e remover spawns

Editar o spawn de um NPC no Lineage 2 parece simples, até o NPC que você colocou sumir no restart, ou o guarda que você apagou voltar para a cidade na manhã seguinte. Quase toda essa dor vem de duas coisas: não saber qual comando de admin torna um spawn permanente e editar o armazenamento errado. Este guia cobre as duas coisas para emuladores da família L2J. Comandos e caminhos de arquivo mudam de build para build, então confira o código-fonte do seu pack antes de confiar em qualquer nome citado aqui.
Saiba onde o seu emulador guarda os spawns
Antes de mexer em qualquer coisa dentro do jogo, descubra o que o servidor lê na inicialização. Quem decide isso não é a chronicle, e sim o branch do emulador.
- L2J clássico (spawns em SQL). Os spawns ficam em duas tabelas do banco,
spawnlistecustom_spawnlist. Cada linha guardacount, npc_templateid, locx, locy, locz, heading, respawn_delay, respawn_random, loc_id, periodOfDay. As linhas da tabela custom podem reutilizar IDs da tabela original. - L2J Mobius e branches mais novos (spawns em XML). Os spawns são arquivos XML em
dist/game/data/spawns/<Region>/, validados contraxsd/spawns.xsd. - Outros forks (aCis e companhia). Usam uma estrutura própria. Abra o loader de spawns no código-fonte e siga até os arquivos que ele lê, em vez de tentar adivinhar.
Uma entrada de spawn no estilo Mobius fica assim (tirada de um diff de 2022, da época do Fafurion, então o seu schema pode ser um pouco diferente):
<list>
<spawn name="BalthusKnights">
<group>
<npc id="34359" x="190569" y="168057" z="-11228" heading="29292" respawnTime="60sec" />
</group>
</spawn>
</list>
| Armazenamento | Onde fica | Sobrevive a uma atualização do datapack? |
|---|---|---|
spawnlist (SQL) | Banco de dados do game | Não. As atualizações reescrevem a tabela. |
custom_spawnlist (SQL) | Banco de dados do game | Sim. As atualizações não mexem nela. |
| Arquivos XML de spawn | data/spawns/<Region>/ | Só se você controlar suas edições (um arquivo separado ou seu próprio branch no git) |

Adicionando NPCs no jogo: //spawn vs //spawn_once
No L2J Server (datapack High Five), quem cuida do posicionamento é o AdminSpawn.java. A sintaxe básica é:
//spawn <id> [count] [respawnTime]
A ordem importa. O tempo de respawn só é lido se você também informar a quantidade, então //spawn 20001 60 não significa "respawn a cada 60". Significa 60 deles. Escreva //spawn 20001 1 60.
A diferença entre as variantes é a permanência:
//spawne//spawn_monsteradicionam o spawn como permanente, ou seja, ele deve voltar depois de um restart.//spawn_onceadiciona um spawn não permanente e desliga o respawn. Matou, ficou morto. Ótimo para bosses de evento, mobs de teste e shows pontuais de GM.- Qualquer coisa spawnada enquanto você está dentro de uma instance é sempre não permanente, seja qual for o comando usado. Se o seu NPC novo sumir, confira se você não estava numa instance quando o colocou.
O mesmo handler também registra //show_spawns, //list_spawns, //list_positions, //unspawnall, //respawnall, //spawnday e //spawnnight. Rode //list_spawns antes de começar a posicionar coisas, para saber o que já existe ali e não empilhar uma segunda cópia de um NPC em cima da primeira.
Dica: fique exatamente onde quer o NPC e vire para a direção em que ele deve olhar antes de digitar o comando. Redigitar coordenadas à mão depois é a origem da maioria dos NPCs mal posicionados.
Timers de respawn e spawns de dia ou de noite
O respawn é controlado por um delay mais uma variação aleatória opcional. No layout SQL, isso é respawn_delay e respawn_random. No XML do Mobius, é o atributo respawnTime, escrito com unidade, como respawnTime="60sec".
Duas regras que vale guardar, segundo a documentação de spawn managers baseados no Mobius:
- O respawn só é ativado quando o delay é maior que 0. Um delay de 0 significa que o NPC não volta depois de morrer.
- Se o delay mínimo e o máximo forem diferentes, o servidor sorteia um valor entre eles. Essa variação é o que impede campers de cronometrar um mob ao segundo.
Para NPCs só de noite ou só de dia no L2J baseado em SQL, use periodOfDay: 0 é sempre, 1 é só de dia, 2 é só de noite. Os comandos //spawnday e //spawnnight levam o nome desses conjuntos de spawn diurno e noturno. Verifique o que eles fazem na sua build antes de depender deles para testes.

Apagando NPCs que insistem em voltar
Selecione o NPC como alvo e use //delete. No L2J Server, o AdminDelete.java remove a instância ativa, chama stopRespawn() e tira o spawn da SpawnTable, ou do RaidBossSpawnManager se for um raid boss.
O que não conseguimos confirmar é se isso também apaga a linha do banco nas builds atuais. E nos branches baseados em XML, o que é carregado na inicialização é o arquivo em disco. Então, se um NPC apagado voltou depois de um restart, parta do princípio de que a entrada armazenada sobreviveu e remova-a na origem:
- Anote o ID do NPC e as coordenadas aproximadas antes de apagar (
//list_spawnsajuda aqui). - Encontre a linha correspondente em
spawnlistoucustom_spawnlist, ou a linha<npc>correspondente no arquivo XML da região. - Remova ali e depois reinicie ou recarregue os spawns.
- Se veio da
spawnlist, registre a mudança. A próxima atualização do datapack pode colocá-lo de volta.
Recarregando depois de uma edição: o que vale ao vivo
Essa pega muita gente. No L2J Server, //reload npc recarrega os templates de NPC via NpcData.load(). Ele não recarrega posições de spawn, e não existe nenhum tipo spawn no //reload. Os tipos suportados incluem config, npc, quest, htm, multisell, buylist, skill, item, door, zone e effect.
Para spawns existe um comando separado, //spawn_reload. Uma regra prática:
- Mudou um template de NPC:
//reload npc(e//reload htmse você editou as páginas HTML dele). - Mudou linhas ou arquivos de spawn:
//spawn_reload. - Mudou muita coisa de uma vez num servidor ao vivo: faça numa janela de manutenção e reinicie. Reloads em massa com jogadores online são um ótimo jeito de acabar com mobs duplicados que você depois terá de limpar à mão.
Um fluxo seguro para editar spawns
- Faça backup das tabelas de spawn ou da pasta
data/spawnsantes de cada sessão de edição. - Coloque seus NPCs na
custom_spawnlist, ou num arquivo XML dedicado que seja seu, nunca direto nos arquivos originais. - Posicione no jogo com
//spawn, teste o respawn matando o NPC e depois reinicie um servidor de teste para provar que ele persiste. - Mantenha um changelog dos IDs e coordenadas que você adicionou ou removeu, para poder refazer tudo depois de uma atualização do emulador.
Com o mundo limpo e seus NPCs custom estáveis, os jogadores ainda precisam encontrar o servidor. Cadastre seu servidor no L2Calendar de graça para ele aparecer no calendário de aberturas. Se quiser mais visibilidade na semana de lançamento, o destaque VIP coloca o servidor mais alto nas listagens.
