mirror of
https://github.com/DarkflameUniverse/DarkflameServer.git
synced 2026-04-09 17:26:58 +00:00
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:
@@ -20,7 +20,8 @@ enum class eCharacterVersion : uint32_t {
|
|||||||
NJ_JAYMISSIONS,
|
NJ_JAYMISSIONS,
|
||||||
NEXUS_FORCE_EXPLORER, // Fixes pet ids in player inventories
|
NEXUS_FORCE_EXPLORER, // Fixes pet ids in player inventories
|
||||||
PET_IDS, // Fixes pet ids in player inventories
|
PET_IDS, // Fixes pet ids in player inventories
|
||||||
UP_TO_DATE, // will become INVENTORY_PERSISTENT_IDS
|
INVENTORY_PERSISTENT_IDS, // Fixes racing meta missions
|
||||||
|
UP_TO_DATE, // will become RACING_META_MISSIONS
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif //!__ECHARACTERVERSION__H__
|
#endif //!__ECHARACTERVERSION__H__
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
* Copyright 2019
|
* Copyright 2019
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <ranges>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
@@ -149,7 +150,7 @@ void MissionComponent::Progress(eMissionTaskType type, int32_t value, LWOOBJID a
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (const auto& [id, mission] : m_Missions) {
|
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;
|
if (mission->IsAchievement() && ignoreAchievements) continue;
|
||||||
|
|
||||||
@@ -747,3 +748,30 @@ bool MissionComponent::OnMissionNeedsLot(GameMessages::GameMsg& msg) {
|
|||||||
const auto& needMsg = static_cast<GameMessages::MissionNeedsLot&>(msg);
|
const auto& needMsg = static_cast<GameMessages::MissionNeedsLot&>(msg);
|
||||||
return RequiresItem(needMsg.item);
|
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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -170,6 +170,8 @@ public:
|
|||||||
bool HasMission(uint32_t missionId);
|
bool HasMission(uint32_t missionId);
|
||||||
|
|
||||||
void ResetMission(const int32_t missionId);
|
void ResetMission(const int32_t missionId);
|
||||||
|
|
||||||
|
void FixRacingMetaMissions();
|
||||||
private:
|
private:
|
||||||
bool OnGetObjectReportInfo(GameMessages::GameMsg& msg);
|
bool OnGetObjectReportInfo(GameMessages::GameMsg& msg);
|
||||||
bool OnGetMissionState(GameMessages::GameMsg& msg);
|
bool OnGetMissionState(GameMessages::GameMsg& msg);
|
||||||
|
|||||||
@@ -407,9 +407,7 @@ void Mission::Catchup() {
|
|||||||
task->Progress(target);
|
task->Progress(target);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
} else if (type == eMissionTaskType::PLAYER_FLAG) {
|
||||||
|
|
||||||
if (type == eMissionTaskType::PLAYER_FLAG) {
|
|
||||||
for (int32_t target : task->GetAllTargets()) {
|
for (int32_t target : task->GetAllTargets()) {
|
||||||
const auto flag = GetCharacter()->GetPlayerFlag(target);
|
const auto flag = GetCharacter()->GetPlayerFlag(target);
|
||||||
|
|
||||||
@@ -423,6 +421,24 @@ void Mission::Catchup() {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else if (type == eMissionTaskType::RACING) {
|
||||||
|
// check if its a racing meta task ("4") and then set its progress to the current completed missions in all tasks
|
||||||
|
const auto& clientInfo = task->GetClientInfo();
|
||||||
|
if (clientInfo.taskParam1.starts_with("4")) {
|
||||||
|
// Each target is racing mission that needs to be completed.
|
||||||
|
// If its completed, progress the meta task by 1.
|
||||||
|
// at the end set the task progress to avoid sending excess msgs across the wire
|
||||||
|
uint32_t progress = 0;
|
||||||
|
for (const auto& target : task->GetAllTargets()) {
|
||||||
|
if (target == 0) continue;
|
||||||
|
|
||||||
|
auto* racingMission = m_MissionComponent->GetMission(target);
|
||||||
|
if (racingMission != nullptr && racingMission->IsComplete()) {
|
||||||
|
progress++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
task->SetProgress(progress);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -418,7 +418,24 @@ void MissionTask::Progress(int32_t value, LWOOBJID associate, const std::string&
|
|||||||
AddProgress(count);
|
AddProgress(count);
|
||||||
} else if (associate == 4 || associate == 5 || associate == 14) {
|
} else if (associate == 4 || associate == 5 || associate == 14) {
|
||||||
if (!InAllTargets(value)) break;
|
if (!InAllTargets(value)) break;
|
||||||
AddProgress(count);
|
if (associate == 4) {
|
||||||
|
// Recount all completed target missions so this stays idempotent with
|
||||||
|
// Catchup, which sets the same value on Accept(). AddProgress would
|
||||||
|
// double-count when LookForAchievements runs Catchup then Progress.
|
||||||
|
auto* entity = mission->GetAssociate();
|
||||||
|
if (entity == nullptr) break;
|
||||||
|
auto* missionComponent = entity->GetComponent<MissionComponent>();
|
||||||
|
if (missionComponent == nullptr) break;
|
||||||
|
uint32_t completedCount = 0;
|
||||||
|
for (const auto& target : GetAllTargets()) {
|
||||||
|
if (target == 0) continue;
|
||||||
|
auto* targetMission = missionComponent->GetMission(target);
|
||||||
|
if (targetMission != nullptr && targetMission->IsComplete()) completedCount++;
|
||||||
|
}
|
||||||
|
SetProgress(completedCount);
|
||||||
|
} else {
|
||||||
|
AddProgress(count);
|
||||||
|
}
|
||||||
} else if (associate == 17) {
|
} else if (associate == 17) {
|
||||||
if (!InAllTargets(value)) break;
|
if (!InAllTargets(value)) break;
|
||||||
AddProgress(count);
|
AddProgress(count);
|
||||||
|
|||||||
@@ -1115,6 +1115,12 @@ void HandlePacket(Packet* packet) {
|
|||||||
case eCharacterVersion::PET_IDS: {
|
case eCharacterVersion::PET_IDS: {
|
||||||
LOG("Regenerating item ids");
|
LOG("Regenerating item ids");
|
||||||
inventoryComponent->RegenerateItemIDs();
|
inventoryComponent->RegenerateItemIDs();
|
||||||
|
levelComponent->SetCharacterVersion(eCharacterVersion::INVENTORY_PERSISTENT_IDS);
|
||||||
|
[[fallthrough]];
|
||||||
|
}
|
||||||
|
case eCharacterVersion::INVENTORY_PERSISTENT_IDS: {
|
||||||
|
LOG("Fixing racing meta missions");
|
||||||
|
missionComponent->FixRacingMetaMissions();
|
||||||
levelComponent->SetCharacterVersion(eCharacterVersion::UP_TO_DATE);
|
levelComponent->SetCharacterVersion(eCharacterVersion::UP_TO_DATE);
|
||||||
[[fallthrough]];
|
[[fallthrough]];
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user