feat: show quest objective progress toasts on kill and item collection

Adds a visual progress overlay at bottom-right when quest kill counts
or item collection updates arrive. Each toast shows the quest title,
objective name, a fill-progress bar, and an X/Y count. Toasts coalesce
when the same objective updates multiple times, and auto-dismiss after 4s.
Wires a new QuestProgressCallback through GameHandler to trigger the UI.
This commit is contained in:
Kelsi 2026-03-12 15:57:09 -07:00
parent 5216582f15
commit c3afe543c6
4 changed files with 152 additions and 0 deletions

View file

@ -4484,6 +4484,10 @@ void GameHandler::handlePacket(network::Packet& packet) {
progressMsg += std::to_string(count) + "/" + std::to_string(reqCount);
addSystemChatMessage(progressMsg);
if (questProgressCallback_) {
questProgressCallback_(quest.title, creatureName, count, reqCount);
}
LOG_INFO("Updated kill count for quest ", questId, ": ",
count, "/", reqCount);
break;
@ -4538,6 +4542,26 @@ void GameHandler::handlePacket(network::Packet& packet) {
updatedAny = true;
}
addSystemChatMessage("Quest item: " + itemLabel + " (" + std::to_string(count) + ")");
if (questProgressCallback_ && updatedAny) {
// Find the quest that tracks this item to get title and required count
for (const auto& quest : questLog_) {
if (quest.complete) continue;
if (quest.itemCounts.count(itemId) == 0) continue;
uint32_t required = 0;
auto rIt = quest.requiredItemCounts.find(itemId);
if (rIt != quest.requiredItemCounts.end()) required = rIt->second;
if (required == 0) {
for (const auto& obj : quest.itemObjectives) {
if (obj.itemId == itemId) { required = obj.required; break; }
}
}
if (required == 0) required = count;
questProgressCallback_(quest.title, itemLabel, count, required);
break;
}
}
LOG_INFO("Quest item update: itemId=", itemId, " count=", count,
" trackedQuestsUpdated=", updatedAny);
}