Lineage 2 NPC Spawn Edit: How to Add, Fix and Remove Spawns

A lineage 2 npc spawn edit sounds simple until the NPC you placed vanishes on restart, or the guard you deleted walks back into town the next morning. Most of that pain comes from two things: not knowing which admin command makes a spawn permanent, and editing the wrong storage. This guide covers both for L2J-family emulators. Commands and file paths change from build to build, so check your own pack's source before trusting any name here.
Know where your emulator keeps spawns
Before you touch anything in game, find out what your server reads at startup. The chronicle doesn't decide this. The emulator branch does.
- Classic L2J (SQL spawns). Spawns live in two database tables,
spawnlistandcustom_spawnlist. Each row holdscount, npc_templateid, locx, locy, locz, heading, respawn_delay, respawn_random, loc_id, periodOfDay. Rows in the custom table may reuse IDs from the stock one. - L2J Mobius and newer branches (XML spawns). Spawns are XML files under
dist/game/data/spawns/<Region>/, validated againstxsd/spawns.xsd. - Other forks (aCis and friends). They use their own layout. Open the spawn loader in the source and follow it to the files it parses rather than guessing.
A Mobius-style spawn entry looks like this (from a 2022 Fafurion-era diff, so your schema may differ slightly):
<list>
<spawn name="BalthusKnights">
<group>
<npc id="34359" x="190569" y="168057" z="-11228" heading="29292" respawnTime="60sec" />
</group>
</spawn>
</list>
| Storage | Where | Survives a datapack update? |
|---|---|---|
spawnlist (SQL) | Game database | No. Updates rewrite it. |
custom_spawnlist (SQL) | Game database | Yes. Updates leave it alone. |
| XML spawn files | data/spawns/<Region>/ | Only if you track your edits (a separate file or your own git branch) |

Adding NPCs in game: //spawn vs //spawn_once
On L2J Server (the High Five datapack), AdminSpawn.java handles placement. The core syntax is:
//spawn <id> [count] [respawnTime]
Order matters. The respawn time is only read if you also give a count, so //spawn 20001 60 does not mean "respawn every 60". It means 60 of them. Write //spawn 20001 1 60 instead.
The difference between the variants is permanence:
//spawnand//spawn_monsteradd the spawn as permanent, so it is meant to come back after a restart.//spawn_onceadds a non-permanent spawn and stops its respawn. Kill it and it stays dead. Good for event bosses, test mobs and one-off GM shows.- Anything spawned while you stand inside an instance is always non-permanent, whatever command you used. If your new NPC disappears, check you weren't in an instance when you placed it.
The same handler also registers //show_spawns, //list_spawns, //list_positions, //unspawnall, //respawnall, //spawnday and //spawnnight. Run //list_spawns before you start placing things, so you know what already stands there and don't stack a second copy of an NPC on top of the first.
Tip: stand exactly where you want the NPC and face the direction it should face before you type the command. Retyping coordinates by hand later is where most misplaced NPCs come from.
Respawn timers and day or night spawns
Respawn is controlled by a delay plus an optional random spread. In the SQL layout that is respawn_delay and respawn_random. In Mobius XML it is the respawnTime attribute, written with a unit, like respawnTime="60sec".
Two rules worth remembering, per Mobius-based spawn manager docs:
- Respawn only turns on when the delay is above 0. A delay of 0 means the NPC does not come back after death.
- If the minimum and maximum delay differ, the server picks a random value between them. That spread is how you stop campers from timing a mob to the second.
For night-only or day-only NPCs on SQL-based L2J, use periodOfDay: 0 is always, 1 is day only, 2 is night only. The //spawnday and //spawnnight commands are named for those day and night spawn sets. Check what they do in your build before you lean on them for testing.

Deleting NPCs that keep coming back
Target the NPC and use //delete. On L2J Server, AdminDelete.java removes the live instance, calls stopRespawn(), and removes the spawn from SpawnTable, or from RaidBossSpawnManager if it's a raid boss.
What we couldn't confirm is whether this also deletes the database row in current builds. And in XML-based branches, the file on disk is what gets loaded at startup. So if a deleted NPC is back after a restart, assume the stored entry survived and remove it at the source:
- Note the NPC ID and rough coordinates before deleting (
//list_spawnshelps here). - Find the matching row in
spawnlistorcustom_spawnlist, or the matching<npc>line in the region's XML file. - Remove it there, then restart or reload spawns.
- If it came from
spawnlist, write the change down. The next datapack update can put it right back.
Reloading after an edit: what applies live
This one catches a lot of people. On L2J Server, //reload npc reloads NPC templates through NpcData.load(). It does not reload spawn positions, and there is no spawn type under //reload at all. The supported types include config, npc, quest, htm, multisell, buylist, skill, item, door, zone and effect.
For spawns there is a separate command, //spawn_reload. A rough rule of thumb:
- Changed an NPC template:
//reload npc(and//reload htmif you edited its HTML pages). - Changed spawn rows or spawn files:
//spawn_reload. - Changed a lot at once on a live server: do it in a maintenance window and restart. Mass reloads with players online are a good way to end up with doubled mobs you then have to clean up by hand.
A safe workflow for spawn edits
- Back up the spawn tables or the
data/spawnsfolder before every editing session. - Put your own NPCs in
custom_spawnlist, or in a dedicated XML file you own, never inline in the stock files. - Place in game with
//spawn, test the respawn with a kill, then restart a test server to prove it persists. - Keep a changelog of the IDs and coordinates you added or removed, so you can redo them after an emulator update.
Once your world is clean and your custom NPCs are stable, players still need to find the server. List your server on L2Calendar for free so it shows up in the opening calendar. If you want more eyes on launch week, VIP placement puts it higher in the listings.
