feat(editor): fly-to-object, export README, quality of life

- "Fly To" button on selected objects and NPCs: moves camera 30 units
  above the selected item for quick navigation on large zones
- Export now generates README.txt with zone summary: map name, tile
  coords, object/NPC counts, and file listing
- Complete export package: zone.json + WDT + ADT + objects.json +
  creatures.json + README.txt
This commit is contained in:
Kelsi 2026-05-05 05:16:43 -07:00
parent 8c9407e0f5
commit d9ed7be36c
3 changed files with 39 additions and 2 deletions

View file

@ -603,6 +603,24 @@ void EditorApp::exportZone(const std::string& outputDir) {
objectPlacer_.saveToFile(objPath);
}
// Write zone info README
{
std::ofstream readme(base + "/README.txt");
if (readme) {
readme << "Zone: " << loadedMap_ << "\n";
readme << "Tile: [" << loadedTileX_ << ", " << loadedTileY_ << "]\n";
readme << "Objects: " << objectPlacer_.objectCount() << "\n";
readme << "NPCs: " << npcSpawner_.spawnCount() << "\n";
readme << "Created with Wowee World Editor\n\n";
readme << "Files:\n";
readme << " zone.json - Zone manifest (for client)\n";
readme << " " << loadedMap_ << ".wdt - Map definition\n";
readme << " " << loadedMap_ << "_" << loadedTileX_ << "_" << loadedTileY_ << ".adt - Terrain tile\n";
if (objectPlacer_.objectCount() > 0) readme << " objects.json - Placed M2/WMO objects\n";
if (npcSpawner_.spawnCount() > 0) readme << " creatures.json - NPC/monster spawns\n";
}
}
// Write zone manifest (for client loading)
ZoneManifest manifest;
manifest.mapName = loadedMap_;
@ -696,6 +714,18 @@ void EditorApp::addAdjacentTile(int offsetX, int offsetY) {
std::to_string(newX) + "_" + std::to_string(newY) + ".adt");
}
void EditorApp::flyToSelected() {
auto* sel = objectPlacer_.getSelected();
if (sel) {
camera_.setPosition(sel->position + glm::vec3(0, 0, 30));
return;
}
auto* npc = npcSpawner_.getSelected();
if (npc) {
camera_.setPosition(npc->position + glm::vec3(0, 0, 30));
}
}
void EditorApp::snapSelectedToGround() {
auto* sel = objectPlacer_.getSelected();
if (!sel || !terrain_.isLoaded()) return;