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

+135 -6
View File
@@ -175,6 +175,8 @@
<div class="tab active" data-view="commands"><span class="ico">⌘</span> GM Commands</div>
<div class="tab" data-view="items"><span class="ico">◆</span> Item Configurator</div>
<div class="tab" data-view="maps"><span class="ico">⌗</span> Maps</div>
<div class="tab" data-view="npcs"><span class="ico">☺</span> NPCs</div>
<div class="tab" data-view="monsters"><span class="ico">☠</span> Monsters</div>
<a class="tab-link" href="/admin/"><span class="ico">⚙</span> Admin Panel</a>
</nav>
@@ -200,6 +202,22 @@
</select>
</div>
<div class="side-panel" id="panel-npcs">
<div class="label">Map</div>
<select id="npc-map"></select>
<div class="label">Search by name</div>
<input id="q-npcs" type="text" placeholder="e.g. Lampa" autocomplete="off" />
</div>
<div class="side-panel" id="panel-monsters">
<div class="label">Spawn count</div>
<input id="mon-count" type="number" value="1" min="1" />
<div class="label">AI (0 = default)</div>
<input id="mon-ai" type="number" value="0" min="0" />
<div class="label">Search by name or id</div>
<input id="q-monsters" type="text" placeholder="e.g. jelly, or 210" autocomplete="off" />
</div>
<div class="legend" id="legend-commands">
<div class="row"><span class="pill pill-any">any</span> usable by any GM character</div>
<div class="row"><span class="pill pill-gm">gm 300+</span> accesslevel ≥ 300</div>
@@ -254,17 +272,39 @@
<section class="view" id="view-maps">
<div class="pagehead">
<h1>Every map with active spawn or NPC data</h1>
<p>Aggregated live from <code>list_special_spawns</code> and <code>list_npcs</code>.</p>
<p>Names pulled straight from <code>LIST_ZONE.STB</code> (row index = map id, same as <code>CWorldServer::LoadZoneData</code>
uses server-side); spawn/NPC counts aggregated live from <code>list_special_spawns</code> and <code>list_npcs</code>.</p>
</div>
<div class="map-empty-note">
No minimap images or display names are shown here — this repo only ships the server side of KTRose, not the
client's 3D/texture assets, and the localized zone-name strings aren't parsed by the server's simplified STB
loader either. What's below (spawn counts, monster totals, coordinate bounds) is real, queried straight from
the running database.
No minimap images are shipped here — this repo only ships the server side of KTRose, not the client's 3D/texture
assets. A handful of zone names are untranslated Korean (the dev-tool STB just was never localized for those rows).
</div>
<div class="map-grid" id="results-maps"></div>
</section>
<!-- ===================== NPCS ===================== -->
<section class="view" id="view-npcs">
<div class="pagehead">
<h1>Every placed NPC, with exact coordinates</h1>
<p>Straight out of <code>list_npcs</code>. Click a card to copy the matching <code>/tele</code> command
and warp straight to it as GM.</p>
</div>
<div class="resultmeta" id="resultmeta-npcs"></div>
<div class="item-grid" id="results-npcs"></div>
</section>
<!-- ===================== MONSTERS ===================== -->
<section class="view" id="view-monsters">
<div class="pagehead">
<h1>Every monster/NPC type, ready to spawn</h1>
<p>1,193 named entries straight out of <code>LIST_NPC.STB</code> (row index = <code>montype</code>, the same
id <code>/mon</code> and <code>/spawn</code> expect). Click one to copy a ready-to-paste <code>/mon</code>
command that drops it next to you.</p>
</div>
<div class="resultmeta" id="resultmeta-monsters"></div>
<div class="item-grid" id="results-monsters"></div>
</section>
</main>
</div>
@@ -456,7 +496,7 @@ function renderMaps(){
? `<div>X range</div><b>${m.bounds.minX} – ${m.bounds.maxX}</b><div>Y range</div><b>${m.bounds.minY} – ${m.bounds.maxY}</b>`
: `<div>Coordinates</div><b>no spawn data</b><div></div><b></b>`;
el.innerHTML = `
<h3>Map ${m.id}</h3>
<h3>${m.name || ("Map "+m.id)} <span style="color:var(--ink-faint); font-weight:400;">#${m.id}</span></h3>
${m.note ? `<div class="note">${m.note}</div>` : ""}
<div class="map-stats">
<div>Spawn points</div><b>${m.spawnPoints}</b>
@@ -469,6 +509,81 @@ function renderMaps(){
}
document.getElementById("map-sort").addEventListener("change", renderMaps);
/* ---------------- NPCS TAB ---------------- */
let NPCS = [];
function renderNpcs(){
const root = document.getElementById("results-npcs");
const meta = document.getElementById("resultmeta-npcs");
const map = document.getElementById("npc-map").value;
const q = document.getElementById("q-npcs").value.trim().toLowerCase();
root.innerHTML = "";
let filtered = NPCS;
if(map !== "__all__") filtered = filtered.filter(n => String(n.map) === map);
if(q) filtered = filtered.filter(n => n.name.toLowerCase().includes(q));
filtered.forEach(n=>{
const el = document.createElement("div");
el.className = "item-card";
const tele = `/tele ${n.map} ${n.x} ${n.y}`;
el.innerHTML = `<div class="nm">${n.name}</div><div class="id">map ${n.map} · x ${n.x} · y ${n.y}</div>`;
el.title = "Click to copy: " + tele;
el.addEventListener("click", ()=>{
copyText(tele);
const nm = el.querySelector(".nm");
const prev = nm.textContent;
nm.textContent = "Copied: " + tele;
setTimeout(()=>{ nm.textContent = prev; }, 1200);
});
root.appendChild(el);
});
if(filtered.length===0) root.innerHTML = `<div class="empty">No NPC matches.</div>`;
meta.textContent = `${filtered.length} of ${NPCS.length} NPCs`;
}
document.getElementById("q-npcs").addEventListener("input", renderNpcs);
document.getElementById("npc-map").addEventListener("change", renderNpcs);
/* ---------------- MONSTERS TAB ---------------- */
let MONSTERS = [];
function renderMonsters(){
const root = document.getElementById("results-monsters");
const meta = document.getElementById("resultmeta-monsters");
const q = document.getElementById("q-monsters").value.trim().toLowerCase();
root.innerHTML = "";
let filtered = MONSTERS;
if(q) filtered = filtered.filter(m => m.name.toLowerCase().includes(q) || String(m.id)===q);
const CAP = 180;
const total = filtered.length;
const shown = filtered.slice(0, CAP);
shown.forEach(m=>{
const el = document.createElement("div");
el.className = "item-card";
el.innerHTML = `<div class="nm">${m.name}</div><div class="id">montype ${m.id}</div>`;
el.addEventListener("click", ()=>{
const count = document.getElementById("mon-count").value || 1;
const ai = document.getElementById("mon-ai").value || 0;
const cmd = `/mon ${m.id} ${count} ${ai}`;
copyText(cmd);
const nm = el.querySelector(".nm");
const prev = nm.textContent;
nm.textContent = "Copied: " + cmd;
setTimeout(()=>{ nm.textContent = prev; }, 1200);
});
root.appendChild(el);
});
if(total===0) root.innerHTML = `<div class="empty">No monster matches.</div>`;
meta.textContent = total > CAP
? `Showing first ${CAP} of ${total} matches — narrow your search to see more.`
: `${total} of ${MONSTERS.length} monster types`;
}
document.getElementById("q-monsters").addEventListener("input", renderMonsters);
document.getElementById("mon-count").addEventListener("input", renderMonsters);
document.getElementById("mon-ai").addEventListener("input", renderMonsters);
/* ---------------- boot ---------------- */
buildCommandsNav();
renderCommands("");
@@ -485,6 +600,20 @@ fetch("maps.json").then(r=>r.json()).then(data=>{
MAPS = data;
renderMaps();
});
fetch("npcs.json").then(r=>r.json()).then(data=>{
NPCS = data;
const maps = [...new Set(data.map(n=>n.map))].sort((a,b)=>a-b);
const sel = document.getElementById("npc-map");
sel.innerHTML = `<option value="__all__">All maps</option>` +
maps.map(m=>`<option value="${m}">Map ${m}</option>`).join("");
renderNpcs();
});
fetch("monsters.json").then(r=>r.json()).then(data=>{
MONSTERS = data;
renderMonsters();
});
</script>
</body>
</html>
+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
}
]
+1
View File
@@ -0,0 +1 @@
[{"id":1,"name":"Mini-Jelly Bean"},{"id":2,"name":"Jelly Bean"},{"id":3,"name":"Jelly Nut"},{"id":4,"name":"Royal Jelly Bean"},{"id":5,"name":"Red Jelly Bean"},{"id":8,"name":"Butterfly"},{"id":9,"name":"Butterfly"},{"id":10,"name":"Butterfly"},{"id":11,"name":"Mini-Choropy"},{"id":12,"name":"Choropy"},{"id":13,"name":"Mother Choropy"},{"id":15,"name":"Spotted Choropy"},{"id":21,"name":"Pumpkin"},{"id":22,"name":"Big Pumpkin"},{"id":23,"name":"Elder Pumpkin"},{"id":24,"name":"Cowboy Pumpkin"},{"id":31,"name":"Dalping"},{"id":32,"name":"Ranger Dalping"},{"id":33,"name":"Hunter Dalping"},{"id":34,"name":"Dalping Leader"},{"id":41,"name":"Flanae"},{"id":42,"name":"Elder Flanae"},{"id":43,"name":"Red Flanae"},{"id":44,"name":"Old Flanae"},{"id":45,"name":"Big Flanae"},{"id":51,"name":"Smouly"},{"id":52,"name":"Elder Smouly"},{"id":53,"name":"Old Smouly"},{"id":61,"name":"Needle Honey Bee"},{"id":62,"name":"Honey Bee"},{"id":63,"name":"Needle Hornet"},{"id":64,"name":"Hornet"},{"id":67,"name":"Queen Honey Bee"},{"id":68,"name":"Queen Bibi"},{"id":69,"name":"Master Queen Bibi"},{"id":71,"name":"Needle Pomic"},{"id":72,"name":"Pomic"},{"id":73,"name":"Red Pomic"},{"id":74,"name":"Pomic Soldier"},{"id":75,"name":"Pomic Fighter"},{"id":76,"name":"Pomic Giant"},{"id":81,"name":"Beetle"},{"id":82,"name":"Beetle Fighter"},{"id":84,"name":"Turtle"},{"id":85,"name":"Turtle Guard"},{"id":87,"name":"Crack"},{"id":88,"name":"Crack Fighter"},{"id":91,"name":"Honey Rackie"},{"id":92,"name":"Rackie Hooligan"},{"id":93,"name":"Fighter Rackie"},{"id":94,"name":"Rackie Hooligan"},{"id":95,"name":"Purified Rackie"},{"id":96,"name":"Hunter Rackie"},{"id":97,"name":"Purified Rackie"},{"id":98,"name":"Purified Rackie"},{"id":99,"name":"Purified Rackie"},{"id":101,"name":"Woopie"},{"id":102,"name":"Woopie Chef"},{"id":103,"name":"Woopie Glutton"},{"id":111,"name":"Moldie"},{"id":112,"name":"Coal Mine Moldie"},{"id":113,"name":"Gold Mine Moldie"},{"id":114,"name":"Captain Moldie"},{"id":121,"name":"Krawfy"},{"id":122,"name":"Krawfy Warrior"},{"id":123,"name":"Krawfy Captain"},{"id":127,"name":"Krawfy Warrior"},{"id":128,"name":"Doonga Hunter"},{"id":129,"name":"Krawfy Captain"},{"id":130,"name":"Doonga Captain"},{"id":131,"name":"Mini-Porkie"},{"id":132,"name":"Porkie"},{"id":133,"name":"Porkie Hooligan"},{"id":134,"name":"Grunter"},{"id":135,"name":"Grunter Fighter"},{"id":136,"name":"Grunter Warrior"},{"id":138,"name":"Grunter Leader"},{"id":139,"name":"Grunter Captain"},{"id":141,"name":"Kaiman"},{"id":142,"name":"Kaiman Guard"},{"id":143,"name":"Kaiman Warrior"},{"id":144,"name":"Kaiman Ranger"},{"id":145,"name":"Kaiman Hunter"},{"id":151,"name":"Doonga"},{"id":152,"name":"Elder Doonga"},{"id":153,"name":"Doonga Origin"},{"id":154,"name":"Doonga Fighter"},{"id":155,"name":"Doonga Warrior"},{"id":156,"name":"Doonga Hunter"},{"id":157,"name":"Doonga Leader"},{"id":158,"name":"Doonga Captain"},{"id":159,"name":"Master Doonga"},{"id":161,"name":"Jewel Golem"},{"id":162,"name":"Junon's Golem"},{"id":163,"name":"Master Golem"},{"id":164,"name":"Stone Golem"},{"id":165,"name":"Elder Stone Golem"},{"id":166,"name":"Master Stone Golem"},{"id":169,"name":"Grandmaster Golem"},{"id":171,"name":"Aqua Guard"},{"id":172,"name":"Aqua Warrior"},{"id":173,"name":"Aqua Captain"},{"id":175,"name":"Aqua Ranger"},{"id":176,"name":"Aqua Hunter"},{"id":177,"name":"Aqua Hunter"},{"id":178,"name":"Aqua Captain"},{"id":179,"name":"Coal Mine Moldie"},{"id":180,"name":"Captain Moldie"},{"id":181,"name":"Small Clown"},{"id":182,"name":"Clown"},{"id":183,"name":"Fighter Clown"},{"id":185,"name":"Ranger Clown"},{"id":186,"name":"Hunter Clown"},{"id":187,"name":"Grunter Warrior"},{"id":188,"name":"Old Smouly"},{"id":189,"name":"Hunter Clown"},{"id":190,"name":"Grunter Captain"},{"id":192,"name":"Elder Stone Golem"},{"id":193,"name":"Junon's Golem"},{"id":194,"name":"Master Stone Golem"},{"id":196,"name":"Goblin Guard"},{"id":197,"name":"Goblin Mage"},{"id":198,"name":"Goblin Leader"},{"id":201,"name":"Worm Dragon"},{"id":202,"name":"Little Worm Dragon"},{"id":203,"name":"Jelly King"},{"id":204,"name":"Wandering Rackie"},{"id":205,"name":"Woopie King"},{"id":206,"name":"Wild Gorilla"},{"id":207,"name":"Aqua King"},{"id":208,"name":"Guardian Tree"},{"id":209,"name":"Grunter King"},{"id":210,"name":"Scarab"},{"id":211,"name":"Junon's Doongoliath"},{"id":212,"name":"Krawfy King"},{"id":213,"name":"Aqua Giant"},{"id":215,"name":"Aqua Guardian"},{"id":216,"name":"Grunter Guardian"},{"id":217,"name":"Krawfy Guardian"},{"id":218,"name":"Golem Guardian"},{"id":219,"name":"Goblin Guardian"},{"id":222,"name":"Grunter King"},{"id":223,"name":"Krawfy King"},{"id":224,"name":"Grandmaster Golem"},{"id":226,"name":"Flanae"},{"id":227,"name":"Flanae"},{"id":228,"name":"Elder Flanae"},{"id":229,"name":"Red Flanae"},{"id":230,"name":"Melendino"},{"id":231,"name":"Zombie"},{"id":251,"name":"Candle Ghost"},{"id":252,"name":"Electric Ghost"},{"id":254,"name":"Stone Golem"},{"id":256,"Line truncated
+1
View File
@@ -0,0 +1 @@
[{"id":13,"name":"[Akram Kingdom Minister] Warren","map":1,"x":5209,"y":5113},{"id":19,"name":"[Armor Seller] Carrion","map":1,"x":5314,"y":5198},{"id":16,"name":"[Arumic Merchant] Tryteh","map":1,"x":5313,"y":5154},{"id":4,"name":"[Co-Founder of the Junon Order] Francis","map":1,"x":5080,"y":5066},{"id":15,"name":"[Cornell's Grandson] Cheney","map":1,"x":5439,"y":5492},{"id":6,"name":"[Designer] Keenu","map":1,"x":5274,"y":5257},{"id":7,"name":"[Eccentric Inventor] Spero","map":1,"x":5212,"y":5255},{"id":11,"name":"[Event Info] Judy","map":1,"x":5262,"y":5213},{"id":2,"name":"[Ferrell Guild Staff] Crow","map":1,"x":5094,"y":5260},{"id":3,"name":"[Ferrell Guild Staff] Ulysses","map":1,"x":5071,"y":5207},{"id":10,"name":"[Guide] Lena","map":1,"x":5240,"y":5125},{"id":17,"name":"[Gypsy Jewel Seller] Mina","map":1,"x":5293,"y":5128},{"id":20,"name":"[Keenu's Daughter] Arisa","map":1,"x":5429,"y":5084},{"id":158,"name":"[Kuro-Tejina Staff] Buffy","map":1,"x":5226,"y":5218},{"id":21,"name":"[Lena's Sister] Shirley","map":1,"x":5510,"y":5293},{"id":1,"name":"[Livestock Farmer] Lampa","map":1,"x":5109,"y":5364},{"id":9,"name":"[Resident] Luth","map":1,"x":5131,"y":5155},{"id":5,"name":"[Righteous Crusader] Leonard","map":1,"x":5261,"y":5167},{"id":8,"name":"[Tavern Owner] Sharlin","map":1,"x":5132,"y":5218},{"id":12,"name":"[Teleporter] Selladin","map":1,"x":5247,"y":5223},{"id":14,"name":"[Village Chief] Cornell","map":1,"x":5218,"y":5113},{"id":18,"name":"[Weapon Seller] Raffle","map":1,"x":5302,"y":5232},{"id":36,"name":"[Armor Merchant] Saki","map":2,"x":5722,"y":5291},{"id":43,"name":"[Arumic Merchant] Chester","map":2,"x":5724,"y":5087},{"id":47,"name":"[Arumic Researcher] Carasia","map":2,"x":5731,"y":5094},{"id":24,"name":"[Clan Owner] Burtland","map":2,"x":5289,"y":5264},{"id":40,"name":"[Designer] Lisa","map":2,"x":5729,"y":5136},{"id":27,"name":"[Elder of Junon Order] Gorthein","map":2,"x":5326,"y":5095},{"id":32,"name":"[Event Info] Felice Fete","map":2,"x":5562,"y":5165},{"id":41,"name":"[Ferrell Guild Merchant] Mildun","map":2,"x":5673,"y":5194},{"id":37,"name":"[Ferrell Guild Staff] Charrs","map":2,"x":5713,"y":5369},{"id":45,"name":"[Ferrell Guild Staff] Hayen","map":2,"x":5604,"y":5046},{"id":46,"name":"[Ferrell Guild Staff] Itz","map":2,"x":5604,"y":5035},{"id":44,"name":"[Ferrell Guild Staff] Kiroth","map":2,"x":5604,"y":5058},{"id":26,"name":"[Founder of Junon Order] Raw","map":2,"x":5319,"y":5095},{"id":33,"name":"[Guide] Alphonso","map":2,"x":5521,"y":5064},{"id":28,"name":"[Guide] Eva","map":2,"x":5506,"y":5346},{"id":38,"name":"[Gypsy Jewel Seller] Bellia","map":2,"x":5725,"y":5199},{"id":34,"name":"[Historian] Jones","map":2,"x":5578,"y":4890},{"id":48,"name":"[Livestock Farmer] Sicru","map":2,"x":5818,"y":5488},{"id":35,"name":"[Manager of Ferrell] Arothel","map":2,"x":5713,"y":5360},{"id":31,"name":"[Mayor] Darren","map":2,"x":5514,"y":5238},{"id":22,"name":"[Righteous Crusader] Gawain","map":2,"x":5335,"y":5354},{"id":23,"name":"[Righteous Crusader] Huffe","map":2,"x":5335,"y":5346},{"id":29,"name":"[Soldier] Odelo","map":2,"x":5507,"y":5397},{"id":30,"name":"[Soldier] Winters","map":2,"x":5523,"y":5398},{"id":42,"name":"[Tavern Owner] Harin","map":2,"x":5682,"y":5131},{"id":25,"name":"[Teleporter] Idiosel","map":2,"x":5344,"y":5177},{"id":39,"name":"[Weapon Merchant] Crune","map":2,"x":5729,"y":5225},{"id":49,"name":"[Ferrell Guild Staff] Rooen","map":3,"x":5104,"y":5020},{"id":51,"name":"[Akram Minister] Mel","map":5,"x":5247,"y":5280},{"id":50,"name":"[Akram Minister] Rodath","map":5,"x":5155,"y":5280},{"id":52,"name":"[Akram Minister] Gamp","map":6,"x":5248,"y":5279},{"id":53,"name":"[Referee] Leum","map":9,"x":5200,"y":5390},{"id":54,"name":"[Referee] Pirre","map":9,"x":5202,"y":4766},{"id":55,"name":"[Akram Minister] Nell","map":11,"x":4953,"y":4992},{"id":56,"name":"[Akram Minister] Nell","map":11,"x":4978,"y":5479},{"id":57,"name":"[Akram Minister] Nell","map":11,"x":5456,"y":5479},{"id":58,"name":"[Akram Minister] Nell","map":11,"x":5522,"y":5021},{"id":62,"name":"[Akram Minister] Nell","map":12,"x":5522,"y":5021},{"id":61,"name":"[Akram Minister] Nell","map":12,"x":5456,"y":5479},{"id":60,"name":"[Akram Minister] Nell","map":12,"x":4978,"y":5479},{"id":59,"name":"[Akram Minister] Nell","map":12,"x":4953,"y":4992},{"id":66,"name":"[Akram Minister] Nell","map":13,"x":5522,"y":5021},{"id":65,"name":"[Akram Minister] Nell","map":13,"x":5456,"y":5479},{"id":64,"name":"[Akram Minister] Nell","map":13,"x":4978,"y":5479},{"id":63,"name":"[Akram Minister] Nell","map":13,"x":4953,"y":4992},{"id":84,"name":"[Clan House Manager] Kushard","map":15,"x":5520,"y":4891},{"id":82,"name":"[Clan House Manager] Kushard","map":15,"x":5520,"y":5051},{"id":80,"name":"[Clan House Manager] Kushard","map":15,"x":5520,"y":5211},{"id":78,"name":"[Clan House Manager] Kushard","map":15,"x":5360,"y":4890},{"id":76,"name":"[Clan House Manager] Kushard","map":15,"x":5360,"y":5051},{"id":73,"name":"[Clan HouseLine truncated