diff --git a/src/activeobjectmgr.h b/src/activeobjectmgr.h index 369e8acf5..15156a23e 100644 --- a/src/activeobjectmgr.h +++ b/src/activeobjectmgr.h @@ -55,7 +55,7 @@ class ActiveObjectMgr for (auto &it : m_active_objects.iter()) { if (!it.second) continue; - m_active_objects.remove(it.first); + removeObject(it.first); } } while (!m_active_objects.empty()); } diff --git a/src/server/activeobjectmgr.cpp b/src/server/activeobjectmgr.cpp index e11ba166e..8f48e3081 100644 --- a/src/server/activeobjectmgr.cpp +++ b/src/server/activeobjectmgr.cpp @@ -41,7 +41,7 @@ void ActiveObjectMgr::clearIf(const std::function obj) auto obj_id = obj->getId(); m_active_objects.put(obj_id, std::move(obj)); m_spatial_index.insert(pos.toArray(), obj_id); + assert(m_spatial_index.size() == m_active_objects.size()); auto new_size = m_active_objects.size(); verbosestream << "Server::ActiveObjectMgr::addActiveObjectRaw(): " diff --git a/src/util/k_d_tree.h b/src/util/k_d_tree.h index e04f249a6..cca54bdcc 100644 --- a/src/util/k_d_tree.h +++ b/src/util/k_d_tree.h @@ -418,7 +418,7 @@ class DynamicKdTrees { trees.at(it->second.tree_idx).remove(it->second.in_tree); del_entries.erase(it); ++deleted; - if (deleted > n_entries/2) // "shift out" the last tree + if (deleted >= (n_entries+1)/2) // "shift out" the last tree shrink_to_half(); } void update(const Point &newPos, Id id) { @@ -431,6 +431,9 @@ class DynamicKdTrees { for (const auto &tree : trees) tree.rangeQuery(min, max, cb); } + Idx size() const { + return n_entries - deleted; + } private: void updateDelEntries(uint8_t tree_idx) { trees[tree_idx].foreach([&](Idx in_tree_idx, auto _, Id id) {