mirror of
https://github.com/Kelsidavis/WoWee.git
synced 2026-04-17 17:43:52 +00:00
fix: world map exploration fallback when server mask is unavailable
When the server has not sent SMSG_INIT_WORLD_STATES or the mask is empty, fall back to locally-accumulated explored zones tracked by player position. The local set is cleared when a real server mask arrives so it doesn't persist stale data.
This commit is contained in:
parent
6928b8ddf6
commit
00a939a733
2 changed files with 16 additions and 4 deletions
|
|
@ -117,6 +117,8 @@ private:
|
||||||
std::vector<uint32_t> serverExplorationMask;
|
std::vector<uint32_t> serverExplorationMask;
|
||||||
bool hasServerExplorationMask = false;
|
bool hasServerExplorationMask = false;
|
||||||
std::unordered_set<int> exploredZones;
|
std::unordered_set<int> exploredZones;
|
||||||
|
// Locally accumulated exploration (used as fallback when server mask is unavailable)
|
||||||
|
std::unordered_set<int> locallyExploredZones_;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace rendering
|
} // namespace rendering
|
||||||
|
|
|
||||||
|
|
@ -233,6 +233,10 @@ void WorldMap::setMapName(const std::string& name) {
|
||||||
|
|
||||||
void WorldMap::setServerExplorationMask(const std::vector<uint32_t>& masks, bool hasData) {
|
void WorldMap::setServerExplorationMask(const std::vector<uint32_t>& masks, bool hasData) {
|
||||||
if (!hasData || masks.empty()) {
|
if (!hasData || masks.empty()) {
|
||||||
|
// New session or no data yet — reset both server mask and local accumulation
|
||||||
|
if (hasServerExplorationMask) {
|
||||||
|
locallyExploredZones_.clear();
|
||||||
|
}
|
||||||
hasServerExplorationMask = false;
|
hasServerExplorationMask = false;
|
||||||
serverExplorationMask.clear();
|
serverExplorationMask.clear();
|
||||||
return;
|
return;
|
||||||
|
|
@ -765,9 +769,12 @@ void WorldMap::updateExploration(const glm::vec3& playerRenderPos) {
|
||||||
}
|
}
|
||||||
if (markedAny) return;
|
if (markedAny) return;
|
||||||
|
|
||||||
|
// Server mask unavailable or empty — fall back to locally-accumulated position tracking.
|
||||||
|
// Add the zone the player is currently in to the local set and display that.
|
||||||
float wowX = playerRenderPos.y;
|
float wowX = playerRenderPos.y;
|
||||||
float wowY = playerRenderPos.x;
|
float wowY = playerRenderPos.x;
|
||||||
|
|
||||||
|
bool foundPos = false;
|
||||||
for (int i = 0; i < static_cast<int>(zones.size()); i++) {
|
for (int i = 0; i < static_cast<int>(zones.size()); i++) {
|
||||||
const auto& z = zones[i];
|
const auto& z = zones[i];
|
||||||
if (z.areaID == 0) continue;
|
if (z.areaID == 0) continue;
|
||||||
|
|
@ -775,15 +782,18 @@ void WorldMap::updateExploration(const glm::vec3& playerRenderPos) {
|
||||||
float minY = std::min(z.locTop, z.locBottom), maxY = std::max(z.locTop, z.locBottom);
|
float minY = std::min(z.locTop, z.locBottom), maxY = std::max(z.locTop, z.locBottom);
|
||||||
if (maxX - minX < 0.001f || maxY - minY < 0.001f) continue;
|
if (maxX - minX < 0.001f || maxY - minY < 0.001f) continue;
|
||||||
if (wowX >= minX && wowX <= maxX && wowY >= minY && wowY <= maxY) {
|
if (wowX >= minX && wowX <= maxX && wowY >= minY && wowY <= maxY) {
|
||||||
exploredZones.insert(i);
|
locallyExploredZones_.insert(i);
|
||||||
markedAny = true;
|
foundPos = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!markedAny) {
|
if (!foundPos) {
|
||||||
int zoneIdx = findZoneForPlayer(playerRenderPos);
|
int zoneIdx = findZoneForPlayer(playerRenderPos);
|
||||||
if (zoneIdx >= 0) exploredZones.insert(zoneIdx);
|
if (zoneIdx >= 0) locallyExploredZones_.insert(zoneIdx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Display the accumulated local set
|
||||||
|
exploredZones = locallyExploredZones_;
|
||||||
}
|
}
|
||||||
|
|
||||||
void WorldMap::zoomIn(const glm::vec3& playerRenderPos) {
|
void WorldMap::zoomIn(const glm::vec3& playerRenderPos) {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue