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:
1 parent
16dccc94f2
commit
e0d1f629db
4 files changed
+468
-36
No files matched your search
+135
-6
@@ -175,6 +175,8 @@
|
|||||||
<div class="tab active" data-view="commands"><span class="ico">⌘</span> GM Commands</div>
|
<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="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="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>
|
<a class="tab-link" href="/admin/"><span class="ico">⚙</span> Admin Panel</a>
|
||||||
</nav>
|
</nav>
|
||||||
|
|
||||||
@@ -200,6 +202,22 @@
|
|||||||
</select>
|
</select>
|
||||||
</div>
|
</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="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-any">any</span> usable by any GM character</div>
|
||||||
<div class="row"><span class="pill pill-gm">gm 300+</span> accesslevel ≥ 300</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">
|
<section class="view" id="view-maps">
|
||||||
<div class="pagehead">
|
<div class="pagehead">
|
||||||
<h1>Every map with active spawn or NPC data</h1>
|
<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>
|
||||||
<div class="map-empty-note">
|
<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
|
No minimap images are shipped here — this repo only ships the server side of KTRose, not the client's 3D/texture
|
||||||
client's 3D/texture assets, and the localized zone-name strings aren't parsed by the server's simplified STB
|
assets. A handful of zone names are untranslated Korean (the dev-tool STB just was never localized for those rows).
|
||||||
loader either. What's below (spawn counts, monster totals, coordinate bounds) is real, queried straight from
|
|
||||||
the running database.
|
|
||||||
</div>
|
</div>
|
||||||
<div class="map-grid" id="results-maps"></div>
|
<div class="map-grid" id="results-maps"></div>
|
||||||
</section>
|
</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>
|
</main>
|
||||||
</div>
|
</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>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>`;
|
: `<div>Coordinates</div><b>no spawn data</b><div></div><b></b>`;
|
||||||
el.innerHTML = `
|
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>` : ""}
|
${m.note ? `<div class="note">${m.note}</div>` : ""}
|
||||||
<div class="map-stats">
|
<div class="map-stats">
|
||||||
<div>Spawn points</div><b>${m.spawnPoints}</b>
|
<div>Spawn points</div><b>${m.spawnPoints}</b>
|
||||||
@@ -469,6 +509,81 @@ function renderMaps(){
|
|||||||
}
|
}
|
||||||
document.getElementById("map-sort").addEventListener("change", 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 ---------------- */
|
/* ---------------- boot ---------------- */
|
||||||
buildCommandsNav();
|
buildCommandsNav();
|
||||||
renderCommands("");
|
renderCommands("");
|
||||||
@@ -485,6 +600,20 @@ fetch("maps.json").then(r=>r.json()).then(data=>{
|
|||||||
MAPS = data;
|
MAPS = data;
|
||||||
renderMaps();
|
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>
|
</script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
+331
-30
@@ -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": 1,
|
||||||
{"id":3,"spawnPoints":0,"totalMonsters":0,"npcCount":1,"bounds":null},
|
"name": "Canyon City of Zant",
|
||||||
{"id":5,"spawnPoints":0,"totalMonsters":0,"npcCount":2,"bounds":null},
|
"spawnPoints": 45,
|
||||||
{"id":6,"spawnPoints":0,"totalMonsters":0,"npcCount":1,"bounds":null},
|
"totalMonsters": 225,
|
||||||
{"id":9,"spawnPoints":0,"totalMonsters":0,"npcCount":2,"bounds":null},
|
"npcCount": 22,
|
||||||
{"id":11,"spawnPoints":0,"totalMonsters":0,"npcCount":4,"bounds":null},
|
"bounds": {
|
||||||
{"id":12,"spawnPoints":0,"totalMonsters":0,"npcCount":4,"bounds":null},
|
"minX": 5097,
|
||||||
{"id":13,"spawnPoints":0,"totalMonsters":0,"npcCount":4,"bounds":null},
|
"maxX": 5500,
|
||||||
{"id":15,"spawnPoints":0,"totalMonsters":0,"npcCount":18,"bounds":null},
|
"minY": 5050,
|
||||||
{"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)"},
|
"maxY": 5448
|
||||||
{"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": 2,
|
||||||
{"id":25,"spawnPoints":74,"totalMonsters":232,"npcCount":3,"bounds":{"minX":5023,"maxX":5688,"minY":4871,"maxY":5520}},
|
"name": "City of Junon Polis",
|
||||||
{"id":26,"spawnPoints":97,"totalMonsters":241,"npcCount":1,"bounds":{"minX":5053,"maxX":5695,"minY":4873,"maxY":5544}},
|
"spawnPoints": 43,
|
||||||
{"id":27,"spawnPoints":100,"totalMonsters":250,"npcCount":5,"bounds":{"minX":5005,"maxX":5831,"minY":4979,"maxY":5509}},
|
"totalMonsters": 92,
|
||||||
{"id":28,"spawnPoints":55,"totalMonsters":126,"npcCount":1,"bounds":{"minX":5027,"maxX":5567,"minY":4769,"maxY":5518}},
|
"npcCount": 27,
|
||||||
{"id":31,"spawnPoints":27,"totalMonsters":75,"npcCount":0,"bounds":{"minX":5028,"maxX":5446,"minY":5057,"maxY":5449}},
|
"bounds": {
|
||||||
{"id":32,"spawnPoints":31,"totalMonsters":74,"npcCount":0,"bounds":{"minX":5079,"maxX":5523,"minY":5138,"maxY":5541}},
|
"minX": 5075,
|
||||||
{"id":33,"spawnPoints":2,"totalMonsters":20,"npcCount":0,"bounds":{"minX":5246,"maxX":5251,"minY":5352,"maxY":5372}},
|
"maxX": 5767,
|
||||||
{"id":37,"spawnPoints":0,"totalMonsters":0,"npcCount":1,"bounds":null},
|
"minY": 5433,
|
||||||
{"id":38,"spawnPoints":7,"totalMonsters":53,"npcCount":2,"bounds":{"minX":5080,"maxX":5164,"minY":5371,"maxY":5478}},
|
"maxY": 5535
|
||||||
{"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": 3,
|
||||||
{"id":61,"spawnPoints":0,"totalMonsters":0,"npcCount":17,"bounds":null},
|
"name": "Dolphin Island",
|
||||||
{"id":62,"spawnPoints":0,"totalMonsters":0,"npcCount":8,"bounds":null}
|
"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
|
||||||
|
}
|
||||||
]
|
]
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
Reference in new issue
Block a user