aboutsummaryrefslogtreecommitdiff
path: root/src/server
ModeNameSize
-rw-r--r--CMakeLists.txt355logplain
-rw-r--r--activeobjectmgr.cpp5289logplain
-rw-r--r--activeobjectmgr.h1776logplain
-rw-r--r--luaentity_sao.cpp14362logplain
-rw-r--r--luaentity_sao.h3491logplain
-rw-r--r--mods.cpp3439logplain
-rw-r--r--mods.h1447logplain
-rw-r--r--player_sao.cpp20448logplain
-rw-r--r--player_sao.h7732logplain
-rw-r--r--serveractiveobject.cpp2398logplain
-rw-r--r--serveractiveobject.h8420logplain
-rw-r--r--serverinventorymgr.cpp5432logplain
-rw-r--r--serverinventorymgr.h1750logplain
-rw-r--r--unit_sao.cpp9774logplain
-rw-r--r--unit_sao.h4469logplain
p;cb) { std::vector<u16> objects_to_remove; for (auto &it : m_active_objects) { if (cb(it.second, it.first)) { // Id to be removed from m_active_objects objects_to_remove.push_back(it.first); } } // Remove references from m_active_objects for (u16 i : objects_to_remove) { m_active_objects.erase(i); } } void ActiveObjectMgr::step( float dtime, const std::function<void(ServerActiveObject *)> &f) { g_profiler->avg("ActiveObjectMgr: SAO count [#]", m_active_objects.size()); for (auto &ao_it : m_active_objects) { f(ao_it.second); } } // clang-format off bool ActiveObjectMgr::registerObject(ServerActiveObject *obj) { assert(obj); // Pre-condition if (obj->getId() == 0) { u16 new_id = getFreeId(); if (new_id == 0) { errorstream << "Server::ActiveObjectMgr::addActiveObjectRaw(): " << "no free id available" << std::endl; if (obj->environmentDeletes()) delete obj; return false; } obj->setId(new_id); } else { verbosestream << "Server::ActiveObjectMgr::addActiveObjectRaw(): " << "supplied with id " << obj->getId() << std::endl; } if (!isFreeId(obj->getId())) { errorstream << "Server::ActiveObjectMgr::addActiveObjectRaw(): " << "id is not free (" << obj->getId() << ")" << std::endl; if (obj->environmentDeletes()) delete obj; return false; } if (objectpos_over_limit(obj->getBasePosition())) { v3f p = obj->getBasePosition(); warningstream << "Server::ActiveObjectMgr::addActiveObjectRaw(): " << "object position (" << p.X << "," << p.Y << "," << p.Z << ") outside maximum range" << std::endl; if (obj->environmentDeletes()) delete obj; return false; } m_active_objects[obj->getId()] = obj; verbosestream << "Server::ActiveObjectMgr::addActiveObjectRaw(): " << "Added id=" << obj->getId() << "; there are now " << m_active_objects.size() << " active objects." << std::endl; return true; } void ActiveObjectMgr::removeObject(u16 id) { verbosestream << "Server::ActiveObjectMgr::removeObject(): " << "id=" << id << std::endl; ServerActiveObject *obj = getActiveObject(id); if (!obj) { infostream << "Server::ActiveObjectMgr::removeObject(): " << "id=" << id << " not found" << std::endl; return; } m_active_objects.erase(id); delete obj; } // clang-format on void ActiveObjectMgr::getObjectsInsideRadius( const v3f &pos, float radius, std::vector<u16> &result) { float r2 = radius * radius; for (auto &activeObject : m_active_objects) { ServerActiveObject *obj = activeObject.second; u16 id = activeObject.first; const v3f &objectpos = obj->getBasePosition(); if (objectpos.getDistanceFromSQ(pos) > r2) continue; result.push_back(id); } } void ActiveObjectMgr::getAddedActiveObjectsAroundPos(const v3f &player_pos, f32 radius, f32 player_radius, std::set<u16> &current_objects, std::queue<u16> &added_objects) { /* Go through the object list, - discard removed/deactivated objects, - discard objects that are too far away, - discard objects that are found in current_objects. - add remaining objects to added_objects */ for (auto &ao_it : m_active_objects) { u16 id = ao_it.first; // Get object ServerActiveObject *object = ao_it.second; if (!object) continue; if (object->isGone()) continue; f32 distance_f = object->getBasePosition().getDistanceFrom(player_pos); if (object->getType() == ACTIVEOBJECT_TYPE_PLAYER) { // Discard if too far if (distance_f > player_radius && player_radius != 0) continue; } else if (distance_f > radius) continue; // Discard if already on current_objects auto n = current_objects.find(id); if (n != current_objects.end()) continue; // Add to added_objects added_objects.push(id); } } } // namespace server