Add NPC/monster spawn browser with map and monster names to webtools

Map names now come from LIST_ZONE.STB (row index = map id, matching
CWorldServer::LoadZoneData). New NPCs tab lists all placed NPCs from
list_npcs with coordinates; new Monsters tab lists all 1,193 named montypes
from LIST_NPC.STB. Both are click-to-copy GM commands (/tele, /mon) for
quick GM navigation/spawning.
This commit is contained in:
Thomas committed 2026-07-10 14:20:12 +02:00
1 parent 16dccc94f2
commit e0d1f629db
4 files changed
+468 -36

No files matched your search

+331 -30
View File
@@ -1,32 +1,333 @@
[
{"id":1,"spawnPoints":45,"totalMonsters":225,"npcCount":22,"bounds":{"minX":5097,"maxX":5500,"minY":5050,"maxY":5448}},
{"id":2,"spawnPoints":43,"totalMonsters":92,"npcCount":27,"bounds":{"minX":5075,"maxX":5767,"minY":5433,"maxY":5535}},
{"id":3,"spawnPoints":0,"totalMonsters":0,"npcCount":1,"bounds":null},
{"id":5,"spawnPoints":0,"totalMonsters":0,"npcCount":2,"bounds":null},
{"id":6,"spawnPoints":0,"totalMonsters":0,"npcCount":1,"bounds":null},
{"id":9,"spawnPoints":0,"totalMonsters":0,"npcCount":2,"bounds":null},
{"id":11,"spawnPoints":0,"totalMonsters":0,"npcCount":4,"bounds":null},
{"id":12,"spawnPoints":0,"totalMonsters":0,"npcCount":4,"bounds":null},
{"id":13,"spawnPoints":0,"totalMonsters":0,"npcCount":4,"bounds":null},
{"id":15,"spawnPoints":0,"totalMonsters":0,"npcCount":18,"bounds":null},
{"id":20,"spawnPoints":46,"totalMonsters":455,"npcCount":5,"bounds":{"minX":5030,"maxX":5713,"minY":4738,"maxY":5375},"note":"default respawn/town map (townid=20 in characters table)"},
{"id":21,"spawnPoints":43,"totalMonsters":183,"npcCount":3,"bounds":{"minX":5098,"maxX":5435,"minY":5053,"maxY":5505}},
{"id":22,"spawnPoints":52,"totalMonsters":415,"npcCount":9,"bounds":{"minX":4983,"maxX":5748,"minY":4995,"maxY":5485}},
{"id":23,"spawnPoints":44,"totalMonsters":201,"npcCount":4,"bounds":{"minX":5053,"maxX":5512,"minY":4900,"maxY":5498}},
{"id":24,"spawnPoints":63,"totalMonsters":281,"npcCount":3,"bounds":{"minX":5053,"maxX":5685,"minY":4998,"maxY":5530}},
{"id":25,"spawnPoints":74,"totalMonsters":232,"npcCount":3,"bounds":{"minX":5023,"maxX":5688,"minY":4871,"maxY":5520}},
{"id":26,"spawnPoints":97,"totalMonsters":241,"npcCount":1,"bounds":{"minX":5053,"maxX":5695,"minY":4873,"maxY":5544}},
{"id":27,"spawnPoints":100,"totalMonsters":250,"npcCount":5,"bounds":{"minX":5005,"maxX":5831,"minY":4979,"maxY":5509}},
{"id":28,"spawnPoints":55,"totalMonsters":126,"npcCount":1,"bounds":{"minX":5027,"maxX":5567,"minY":4769,"maxY":5518}},
{"id":31,"spawnPoints":27,"totalMonsters":75,"npcCount":0,"bounds":{"minX":5028,"maxX":5446,"minY":5057,"maxY":5449}},
{"id":32,"spawnPoints":31,"totalMonsters":74,"npcCount":0,"bounds":{"minX":5079,"maxX":5523,"minY":5138,"maxY":5541}},
{"id":33,"spawnPoints":2,"totalMonsters":20,"npcCount":0,"bounds":{"minX":5246,"maxX":5251,"minY":5352,"maxY":5372}},
{"id":37,"spawnPoints":0,"totalMonsters":0,"npcCount":1,"bounds":null},
{"id":38,"spawnPoints":7,"totalMonsters":53,"npcCount":2,"bounds":{"minX":5080,"maxX":5164,"minY":5371,"maxY":5478}},
{"id":40,"spawnPoints":0,"totalMonsters":0,"npcCount":1,"bounds":null},
{"id":51,"spawnPoints":35,"totalMonsters":103,"npcCount":9,"bounds":{"minX":5048,"maxX":5640,"minY":4710,"maxY":5296}},
{"id":52,"spawnPoints":49,"totalMonsters":176,"npcCount":0,"bounds":{"minX":5041,"maxX":6111,"minY":4467,"maxY":5271}},
{"id":54,"spawnPoints":56,"totalMonsters":156,"npcCount":1,"bounds":{"minX":5057,"maxX":5645,"minY":4285,"maxY":5313}},
{"id":61,"spawnPoints":0,"totalMonsters":0,"npcCount":17,"bounds":null},
{"id":62,"spawnPoints":0,"totalMonsters":0,"npcCount":8,"bounds":null}
{
"id": 1,
"name": "Canyon City of Zant",
"spawnPoints": 45,
"totalMonsters": 225,
"npcCount": 22,
"bounds": {
"minX": 5097,
"maxX": 5500,
"minY": 5050,
"maxY": 5448
}
},
{
"id": 2,
"name": "City of Junon Polis",
"spawnPoints": 43,
"totalMonsters": 92,
"npcCount": 27,
"bounds": {
"minX": 5075,
"maxX": 5767,
"minY": 5433,
"maxY": 5535
}
},
{
"id": 3,
"name": "Dolphin Island",
"spawnPoints": 0,
"totalMonsters": 0,
"npcCount": 1,
"bounds": null
},
{
"id": 5,
"name": "Junon Cartel",
"spawnPoints": 0,
"totalMonsters": 0,
"npcCount": 2,
"bounds": null
},
{
"id": 6,
"name": "Crusader Training Camp",
"spawnPoints": 0,
"totalMonsters": 0,
"npcCount": 1,
"bounds": null
},
{
"id": 9,
"name": "주논카르텔",
"spawnPoints": 0,
"totalMonsters": 0,
"npcCount": 2,
"bounds": null
},
{
"id": 11,
"name": "Junon Clan Field",
"spawnPoints": 0,
"totalMonsters": 0,
"npcCount": 4,
"bounds": null
},
{
"id": 12,
"name": "Junon Clan Field",
"spawnPoints": 0,
"totalMonsters": 0,
"npcCount": 4,
"bounds": null
},
{
"id": 13,
"name": "Junon Clan Field",
"spawnPoints": 0,
"totalMonsters": 0,
"npcCount": 4,
"bounds": null
},
{
"id": 15,
"name": "클랜아지트",
"spawnPoints": 0,
"totalMonsters": 0,
"npcCount": 18,
"bounds": null
},
{
"id": 20,
"name": "Birth Island",
"spawnPoints": 46,
"totalMonsters": 455,
"npcCount": 5,
"bounds": {
"minX": 5030,
"maxX": 5713,
"minY": 4738,
"maxY": 5375
},
"note": "default respawn/town map (townid=20 in characters table)"
},
{
"id": 21,
"name": "Valley of Luxem Tower",
"spawnPoints": 43,
"totalMonsters": 183,
"npcCount": 3,
"bounds": {
"minX": 5098,
"maxX": 5435,
"minY": 5053,
"maxY": 5505
}
},
{
"id": 22,
"name": "Adventurer's Plains",
"spawnPoints": 52,
"totalMonsters": 415,
"npcCount": 9,
"bounds": {
"minX": 4983,
"maxX": 5748,
"minY": 4995,
"maxY": 5485
}
},
{
"id": 23,
"name": "Breezy Hills",
"spawnPoints": 44,
"totalMonsters": 201,
"npcCount": 4,
"bounds": {
"minX": 5053,
"maxX": 5512,
"minY": 4900,
"maxY": 5498
}
},
{
"id": 24,
"name": "El Verloon Desert",
"spawnPoints": 63,
"totalMonsters": 281,
"npcCount": 3,
"bounds": {
"minX": 5053,
"maxX": 5685,
"minY": 4998,
"maxY": 5530
}
},
{
"id": 25,
"name": "Anima Lake",
"spawnPoints": 74,
"totalMonsters": 232,
"npcCount": 3,
"bounds": {
"minX": 5023,
"maxX": 5688,
"minY": 4871,
"maxY": 5520
}
},
{
"id": 26,
"name": "Forest of Wisdom",
"spawnPoints": 97,
"totalMonsters": 241,
"npcCount": 1,
"bounds": {
"minX": 5053,
"maxX": 5695,
"minY": 4873,
"maxY": 5544
}
},
{
"id": 27,
"name": "Kenji Beach",
"spawnPoints": 100,
"totalMonsters": 250,
"npcCount": 5,
"bounds": {
"minX": 5005,
"maxX": 5831,
"minY": 4979,
"maxY": 5509
}
},
{
"id": 28,
"name": "Gorge of Silence",
"spawnPoints": 55,
"totalMonsters": 126,
"npcCount": 1,
"bounds": {
"minX": 5027,
"maxX": 5567,
"minY": 4769,
"maxY": 5518
}
},
{
"id": 31,
"name": "Goblin Cave (B1)",
"spawnPoints": 27,
"totalMonsters": 75,
"npcCount": 0,
"bounds": {
"minX": 5028,
"maxX": 5446,
"minY": 5057,
"maxY": 5449
}
},
{
"id": 32,
"name": "Goblin Cave (B2)",
"spawnPoints": 31,
"totalMonsters": 74,
"npcCount": 0,
"bounds": {
"minX": 5079,
"maxX": 5523,
"minY": 5138,
"maxY": 5541
}
},
{
"id": 33,
"name": "Goblin Cave (B3)",
"spawnPoints": 2,
"totalMonsters": 20,
"npcCount": 0,
"bounds": {
"minX": 5246,
"maxX": 5251,
"minY": 5352,
"maxY": 5372
}
},
{
"id": 37,
"name": "Sunshine Coast",
"spawnPoints": 0,
"totalMonsters": 0,
"npcCount": 1,
"bounds": null
},
{
"id": 38,
"name": "Santa Planetoid",
"spawnPoints": 7,
"totalMonsters": 53,
"npcCount": 2,
"bounds": {
"minX": 5080,
"maxX": 5164,
"minY": 5371,
"maxY": 5478
}
},
{
"id": 40,
"name": "Grand Ballroom",
"spawnPoints": 0,
"totalMonsters": 0,
"npcCount": 1,
"bounds": null
},
{
"id": 51,
"name": "Magic City of the Eucar",
"spawnPoints": 35,
"totalMonsters": 103,
"npcCount": 9,
"bounds": {
"minX": 5048,
"maxX": 5640,
"minY": 4710,
"maxY": 5296
}
},
{
"id": 52,
"name": "Mana Snowfields",
"spawnPoints": 49,
"totalMonsters": 176,
"npcCount": 0,
"bounds": {
"minX": 5041,
"maxX": 6111,
"minY": 4467,
"maxY": 5271
}
},
{
"id": 54,
"name": "Crystal Snowfields",
"spawnPoints": 56,
"totalMonsters": 156,
"npcCount": 1,
"bounds": {
"minX": 5057,
"maxX": 5645,
"minY": 4285,
"maxY": 5313
}
},
{
"id": 61,
"name": "피난처시타",
"spawnPoints": 0,
"totalMonsters": 0,
"npcCount": 17,
"bounds": null
},
{
"id": 62,
"name": "그림자정글",
"spawnPoints": 0,
"totalMonsters": 0,
"npcCount": 8,
"bounds": null
}
]