fixed revert last point completion

the elements in unordered_set are not sorted in any particular order. so when insert point data , it will insert at begin or end or somewhere. so i changed it to list to make sure the last inserted element must be at the end of the list
This commit is contained in:
Miya 2022-07-21 22:31:11 +08:00
parent 592b80d430
commit 66f168bc51
2 changed files with 18 additions and 9 deletions

View File

@ -563,13 +563,13 @@ namespace cheat::feature
std::lock_guard _userDataLock(m_UserDataMutex); std::lock_guard _userDataLock(m_UserDataMutex);
LOG_WARNING("Complete point at %.0f.", game::EntityManager::instance().avatar()->distance(pointData->levelPosition)); LOG_WARNING("Complete point at %.0f.", game::EntityManager::instance().avatar()->distance(pointData->levelPosition));
if (m_CompletedPoints.count(pointData) > 0) if (std::find_if(m_CompletedPoints.begin(), m_CompletedPoints.end(), [=](PointData* data) { return pointData->id == data->id; }) != std::end(m_CompletedPoints))
return; return;
pointData->completed = true; pointData->completed = true;
pointData->completeTimestamp = util::GetCurrentTimeMillisec(); pointData->completeTimestamp = util::GetCurrentTimeMillisec();
m_ScenesData[pointData->sceneID].labels[pointData->labelID].completedCount++; m_ScenesData[pointData->sceneID].labels[pointData->labelID].completedCount++;
m_CompletedPoints.insert(pointData); m_CompletedPoints.push_back(pointData);
SaveCompletedPoints(); SaveCompletedPoints();
} }
@ -578,13 +578,14 @@ namespace cheat::feature
{ {
std::lock_guard _userDataLock(m_UserDataMutex); std::lock_guard _userDataLock(m_UserDataMutex);
if (m_CompletedPoints.count(pointData) == 0) auto pointDataIterator = std::find_if(m_CompletedPoints.begin(), m_CompletedPoints.end(), [=](PointData* data) { return pointData->id == data->id; });
if (pointDataIterator == m_CompletedPoints.end())
return; return;
pointData->completed = false; pointData->completed = false;
pointData->completeTimestamp = 0; pointData->completeTimestamp = 0;
m_ScenesData[pointData->sceneID].labels[pointData->labelID].completedCount--; m_ScenesData[pointData->sceneID].labels[pointData->labelID].completedCount--;
m_CompletedPoints.erase(pointData); m_CompletedPoints.erase(pointDataIterator);
SaveCompletedPoints(); SaveCompletedPoints();
} }
@ -595,11 +596,12 @@ namespace cheat::feature
if (m_CompletedPoints.empty()) if (m_CompletedPoints.empty())
return; return;
PointData* pointData = *--m_CompletedPoints.end(); auto pointDataIterator = --m_CompletedPoints.end();
PointData* pointData = *pointDataIterator;
pointData->completed = false; pointData->completed = false;
pointData->completeTimestamp = 0; pointData->completeTimestamp = 0;
m_ScenesData[pointData->sceneID].labels[pointData->labelID].completedCount--; m_ScenesData[pointData->sceneID].labels[pointData->labelID].completedCount--;
m_CompletedPoints.erase(pointData); m_CompletedPoints.erase(pointDataIterator);
SaveCompletedPoints(); SaveCompletedPoints();
} }
@ -916,7 +918,7 @@ namespace cheat::feature
} }
auto& point = points[pointID]; auto& point = points[pointID];
if (m_CompletedPoints.count(&point) > 0) if (std::find_if(m_CompletedPoints.begin(), m_CompletedPoints.end(), [=](PointData* data) { return point.id == data->id; }) != std::end(m_CompletedPoints))
{ {
LOG_WARNING("Completed point %u duplicate.", pointID); LOG_WARNING("Completed point %u duplicate.", pointID);
return; return;
@ -926,7 +928,7 @@ namespace cheat::feature
point.completeTimestamp = data["complete_timestamp"]; point.completeTimestamp = data["complete_timestamp"];
labelData->completedCount++; labelData->completedCount++;
m_CompletedPoints.insert(&point); m_CompletedPoints.push_back(&point);
} }
void InteractiveMap::LoadFixedPointData(LabelData* labelData, const nlohmann::json& data) void InteractiveMap::LoadFixedPointData(LabelData* labelData, const nlohmann::json& data)
@ -1026,6 +1028,7 @@ namespace cheat::feature
void InteractiveMap::LoadCompletedPoints() void InteractiveMap::LoadCompletedPoints()
{ {
LoadUserData(f_CompletedPointsJson, &InteractiveMap::LoadCompletedPointData); LoadUserData(f_CompletedPointsJson, &InteractiveMap::LoadCompletedPointData);
ReorderCompletedPointDataByTimestamp();
} }
void InteractiveMap::SaveCompletedPoints() void InteractiveMap::SaveCompletedPoints()
@ -1040,6 +1043,11 @@ namespace cheat::feature
m_CompletedPoints.clear(); m_CompletedPoints.clear();
} }
void InteractiveMap::ReorderCompletedPointDataByTimestamp()
{
m_CompletedPoints.sort([](PointData* a, PointData* b) { return a->completeTimestamp < b->completeTimestamp; });
}
void InteractiveMap::LoadCustomPoints() void InteractiveMap::LoadCustomPoints()
{ {
LoadUserData(f_CustomPointsJson, &InteractiveMap::LoadCustomPointData); LoadUserData(f_CustomPointsJson, &InteractiveMap::LoadCustomPointData);

View File

@ -146,7 +146,7 @@ namespace cheat::feature
std::unordered_set<PointData*> m_CustomPoints; std::unordered_set<PointData*> m_CustomPoints;
std::unordered_set<PointData*> m_FixedPoints; std::unordered_set<PointData*> m_FixedPoints;
std::unordered_set<PointData*> m_CompletedPoints; std::list<PointData*> m_CompletedPoints;
std::mutex m_PointMutex; std::mutex m_PointMutex;
// PointData* m_SelectedPoint; // PointData* m_SelectedPoint;
@ -182,6 +182,7 @@ namespace cheat::feature
void LoadCompletedPointData(LabelData* labelData, const nlohmann::json& data); void LoadCompletedPointData(LabelData* labelData, const nlohmann::json& data);
void SaveCompletedPointData(nlohmann::json& jObject, PointData* point); void SaveCompletedPointData(nlohmann::json& jObject, PointData* point);
bool ResetCompletedPointData(LabelData* label, PointData* point); bool ResetCompletedPointData(LabelData* label, PointData* point);
void ReorderCompletedPointDataByTimestamp();
void LoadCustomPointData(LabelData* labelData, const nlohmann::json& data); void LoadCustomPointData(LabelData* labelData, const nlohmann::json& data);
void SaveCustomPointData(nlohmann::json& jObject, PointData* point); void SaveCustomPointData(nlohmann::json& jObject, PointData* point);