From bc0f3d9163b28e4ba40e7249e292160145f329ff Mon Sep 17 00:00:00 2001 From: David Markowitz <39972741+EmosewaMC@users.noreply.github.com> Date: Wed, 2 Apr 2025 06:59:21 -0700 Subject: [PATCH] fix: mission states being incorrect after world load (#1750) --- dGame/dComponents/MissionComponent.cpp | 19 ++++++++------ dGame/dMission/Mission.cpp | 36 ++++++++++++++++---------- dGame/dMission/Mission.h | 9 +++++-- 3 files changed, 41 insertions(+), 23 deletions(-) diff --git a/dGame/dComponents/MissionComponent.cpp b/dGame/dComponents/MissionComponent.cpp index ea03d0e0..e430aefc 100644 --- a/dGame/dComponents/MissionComponent.cpp +++ b/dGame/dComponents/MissionComponent.cpp @@ -512,7 +512,7 @@ void MissionComponent::LoadFromXml(const tinyxml2::XMLDocument& doc) { auto* mission = new Mission(this, missionId); - mission->LoadFromXml(*doneM); + mission->LoadFromXmlDone(*doneM); doneM = doneM->NextSiblingElement(); @@ -527,9 +527,9 @@ void MissionComponent::LoadFromXml(const tinyxml2::XMLDocument& doc) { currentM->QueryAttribute("id", &missionId); - auto* mission = new Mission(this, missionId); + auto* mission = m_Missions.contains(missionId) ? m_Missions[missionId] : new Mission(this, missionId); - mission->LoadFromXml(*currentM); + mission->LoadFromXmlCur(*currentM); if (currentM->QueryAttribute("o", &missionOrder) == tinyxml2::XML_SUCCESS && mission->IsMission()) { mission->SetUniqueMissionOrderID(missionOrder); @@ -565,20 +565,23 @@ void MissionComponent::UpdateXml(tinyxml2::XMLDocument& doc) { auto* mission = pair.second; if (mission) { - const auto complete = mission->IsComplete(); + const auto completions = mission->GetCompletions(); auto* m = doc.NewElement("m"); - if (complete) { - mission->UpdateXml(*m); + if (completions > 0) { + mission->UpdateXmlDone(*m); done->LinkEndChild(m); - continue; + if (mission->IsComplete()) continue; + + m = doc.NewElement("m"); } + if (mission->IsMission()) m->SetAttribute("o", mission->GetUniqueMissionOrderID()); - mission->UpdateXml(*m); + mission->UpdateXmlCur(*m); cur->LinkEndChild(m); } diff --git a/dGame/dMission/Mission.cpp b/dGame/dMission/Mission.cpp index 2a841e39..f1f97eab 100644 --- a/dGame/dMission/Mission.cpp +++ b/dGame/dMission/Mission.cpp @@ -65,7 +65,7 @@ Mission::Mission(MissionComponent* missionComponent, const uint32_t missionId) { } } -void Mission::LoadFromXml(const tinyxml2::XMLElement& element) { +void Mission::LoadFromXmlDone(const tinyxml2::XMLElement& element) { // Start custom XML if (element.Attribute("state") != nullptr) { m_State = static_cast(std::stoul(element.Attribute("state"))); @@ -76,11 +76,15 @@ void Mission::LoadFromXml(const tinyxml2::XMLElement& element) { m_Completions = std::stoul(element.Attribute("cct")); m_Timestamp = std::stoul(element.Attribute("cts")); - - if (IsComplete()) { - return; - } } +} + +void Mission::LoadFromXmlCur(const tinyxml2::XMLElement& element) { + // Start custom XML + if (element.Attribute("state") != nullptr) { + m_State = static_cast(std::stoul(element.Attribute("state"))); + } + // End custom XML auto* task = element.FirstChildElement(); @@ -132,7 +136,7 @@ void Mission::LoadFromXml(const tinyxml2::XMLElement& element) { } } -void Mission::UpdateXml(tinyxml2::XMLElement& element) { +void Mission::UpdateXmlDone(tinyxml2::XMLElement& element) { // Start custom XML element.SetAttribute("state", static_cast(m_State)); // End custom XML @@ -141,15 +145,21 @@ void Mission::UpdateXml(tinyxml2::XMLElement& element) { element.SetAttribute("id", static_cast(info.id)); - if (m_Completions > 0) { - element.SetAttribute("cct", static_cast(m_Completions)); + element.SetAttribute("cct", static_cast(m_Completions)); - element.SetAttribute("cts", static_cast(m_Timestamp)); + element.SetAttribute("cts", static_cast(m_Timestamp)); +} - if (IsComplete()) { - return; - } - } +void Mission::UpdateXmlCur(tinyxml2::XMLElement& element) { + // Start custom XML + element.SetAttribute("state", static_cast(m_State)); + // End custom XML + + element.DeleteChildren(); + + element.SetAttribute("id", static_cast(info.id)); + + if (IsComplete()) return; for (auto* task : m_Tasks) { if (task->GetType() == eMissionTaskType::COLLECTION || diff --git a/dGame/dMission/Mission.h b/dGame/dMission/Mission.h index 74b8d352..77f24181 100644 --- a/dGame/dMission/Mission.h +++ b/dGame/dMission/Mission.h @@ -28,8 +28,13 @@ public: Mission(MissionComponent* missionComponent, uint32_t missionId); ~Mission(); - void LoadFromXml(const tinyxml2::XMLElement& element); - void UpdateXml(tinyxml2::XMLElement& element); + // XML functions to load and save completed mission state to xml + void LoadFromXmlDone(const tinyxml2::XMLElement& element); + void UpdateXmlDone(tinyxml2::XMLElement& element); + + // XML functions to load and save current mission state and task data to xml + void LoadFromXmlCur(const tinyxml2::XMLElement& element); + void UpdateXmlCur(tinyxml2::XMLElement& element); /** * Returns the ID of this mission