feat: fix go outside and play mission (#1967)

* feat: fix go outside and play mission

* Update dWorldServer/WorldServer.cpp

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update dGame/dComponents/MissionComponent.cpp

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* const

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
This commit is contained in:
David Markowitz
2026-04-08 22:55:57 -07:00
committed by GitHub
parent 247576e101
commit 8061f512aa
6 changed files with 76 additions and 6 deletions

View File

@@ -3,6 +3,7 @@
* Copyright 2019
*/
#include <ranges>
#include <sstream>
#include <string>
@@ -149,7 +150,7 @@ void MissionComponent::Progress(eMissionTaskType type, int32_t value, LWOOBJID a
}
for (const auto& [id, mission] : m_Missions) {
if (!mission || std::find(acceptedAchievements.begin(), acceptedAchievements.end(), mission->GetMissionId()) != acceptedAchievements.end()) continue;
if (!mission || std::ranges::find(acceptedAchievements, mission->GetMissionId()) != acceptedAchievements.end()) continue;
if (mission->IsAchievement() && ignoreAchievements) continue;
@@ -747,3 +748,30 @@ bool MissionComponent::OnMissionNeedsLot(GameMessages::GameMsg& msg) {
const auto& needMsg = static_cast<GameMessages::MissionNeedsLot&>(msg);
return RequiresItem(needMsg.item);
}
void MissionComponent::FixRacingMetaMissions() {
for (auto* const mission : m_Missions | std::views::values) {
if (!mission || mission->IsComplete()) continue;
for (auto* const task : mission->GetTasks()) {
if (!task) continue;
// has to be a racing meta mission and have a taskparam1 of 4
if (task->GetType() != eMissionTaskType::RACING || !task->GetClientInfo().taskParam1.starts_with("4")) continue;
// Each target is racing mission that needs to be completed.
// If its completed, progress the meta task by 1.
uint32_t progress = 0;
for (const auto& target : task->GetAllTargets()) {
if (target == 0) continue;
auto* racingMission = GetMission(target);
if (racingMission && racingMission->IsComplete()) {
progress++;
}
}
task->SetProgress(progress);
}
// in case the mission is actually complete, give them the rewards
mission->CheckCompletion();
}
}