From b7d9d54b29faeffcaf882841666e0dfa99864d5f Mon Sep 17 00:00:00 2001 From: Kelsi Date: Wed, 6 May 2026 02:35:29 -0700 Subject: [PATCH] feat(sql): emit creature_queststarter/questender for quest-NPC links quest_template alone tells the server about the quest but not who hands it out. Without creature_queststarter/questender entries, players can't acquire or turn in the quest. Now writes both tables when the quest has questGiverNpcId / turnInNpcId set. --- tools/editor/sql_exporter.cpp | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/tools/editor/sql_exporter.cpp b/tools/editor/sql_exporter.cpp index b7ef1c6c..a941501d 100644 --- a/tools/editor/sql_exporter.cpp +++ b/tools/editor/sql_exporter.cpp @@ -170,6 +170,23 @@ bool SQLExporter::exportQuests(const std::vector& quests, << ") ON DUPLICATE KEY UPDATE `LogTitle`='" << escapeSql(q.title) << "';\n"; } + // creature_queststarter / creature_questender link quests to NPCs. + // Without these the player can pick up the quest from no one. + f << "\n-- =============================================\n"; + f << "-- creature_queststarter / _questender (quest links)\n"; + f << "-- =============================================\n\n"; + for (const auto& q : quests) { + uint32_t entry = startEntry + q.id; + if (q.questGiverNpcId > 0) { + f << "INSERT IGNORE INTO `creature_queststarter` (`id`, `quest`) VALUES (" + << q.questGiverNpcId << ", " << entry << ");\n"; + } + if (q.turnInNpcId > 0) { + f << "INSERT IGNORE INTO `creature_questender` (`id`, `quest`) VALUES (" + << q.turnInNpcId << ", " << entry << ");\n"; + } + } + LOG_INFO("SQL quests exported: ", quests.size(), " quests"); return true; }