| 370 | } |
| 371 | |
| 372 | void QuestManager::update(float dt) { |
| 373 | startInitialQuests(); |
| 374 | |
| 375 | if (m_trackedQuestId && !isActive(*m_trackedQuestId)) |
| 376 | m_trackedQuestId = {}; |
| 377 | |
| 378 | if (m_onWorldQuestId) { |
| 379 | auto active = isActive(*m_onWorldQuestId); |
| 380 | if (active) { |
| 381 | auto worldId = getQuest(*m_onWorldQuestId)->worldId(); |
| 382 | if (!worldId || m_player->clientContext()->playerWorldId() != *worldId) |
| 383 | active = false; |
| 384 | } |
| 385 | if (!active) |
| 386 | m_onWorldQuestId = {}; |
| 387 | } else if (m_trackOnWorldQuests) { |
| 388 | auto playerWorldId = m_client->clientContext()->playerWorldId(); |
| 389 | auto trackedWorld = currentQuest().sequence([](QuestPtr q) { return q->worldId(); }); |
| 390 | if (!trackedWorld || playerWorldId != *trackedWorld) { |
| 391 | // the currently tracked quest is not on this world, track another quest on this world |
| 392 | for (auto quest : listActiveQuests()) { |
| 393 | if (auto questWorld = quest->worldId()) { |
| 394 | if (playerWorldId == *questWorld) |
| 395 | m_onWorldQuestId = quest->questId(); |
| 396 | } |
| 397 | } |
| 398 | } |
| 399 | } |
| 400 | |
| 401 | List<String> expiredQuests; |
| 402 | for (auto& entry : m_quests) { |
| 403 | auto quest = entry.second; |
| 404 | QuestState state = quest->state(); |
| 405 | bool finished = state == QuestState::Complete || state == QuestState::Failed; |
| 406 | if (state == QuestState::New || (finished && quest->ephemeral() && !quest->showDialog())) { |
| 407 | quest->uninit(); |
| 408 | expiredQuests.append(entry.first); |
| 409 | } |
| 410 | } |
| 411 | |
| 412 | for (auto& questId : expiredQuests) |
| 413 | m_quests.remove(questId); |
| 414 | |
| 415 | for (auto& q : m_quests.values()) { |
| 416 | if (questValidOnServer(q)) |
| 417 | q->update(dt); |
| 418 | } |
| 419 | } |
| 420 | |
| 421 | void QuestManager::startInitialQuests() { |
| 422 | auto startingQuests = |
nothing calls this directly
no test coverage detected