Use std::vector instead of std::set for Environment::getObjectsInsideRadius
authorLoic Blot <loic.blot@unix-experience.fr>
Thu, 16 Apr 2015 12:11:46 +0000 (14:11 +0200)
committerLoic Blot <loic.blot@unix-experience.fr>
Thu, 16 Apr 2015 16:37:29 +0000 (18:37 +0200)
We are only iterating sequentially, we don't need a set here
Also use a vector reference instead of a copy

src/collision.cpp
src/environment.cpp
src/environment.h
src/script/lua_api/l_env.cpp

index c759f20c066bfc2f2bf8ba1ea272b37eecc25a18..27e3b5e949ec796d3ea421525b2f87e5aca7b10c 100644 (file)
@@ -318,8 +318,9 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef,
                        ServerEnvironment *s_env = dynamic_cast<ServerEnvironment*>(env);
                        if (s_env != 0) {
                                f32 distance = speed_f.getLength();
-                               std::set<u16> s_objects = s_env->getObjectsInsideRadius(pos_f,distance * 1.5);
-                               for (std::set<u16>::iterator iter = s_objects.begin(); iter != s_objects.end(); iter++) {
+                               std::vector<u16> s_objects;
+                               s_env->getObjectsInsideRadius(s_objects, pos_f, distance * 1.5);
+                               for (std::vector<u16>::iterator iter = s_objects.begin(); iter != s_objects.end(); iter++) {
                                        ServerActiveObject *current = s_env->getActiveObject(*iter);
                                        if ((self == 0) || (self != current)) {
                                                objects.push_back((ActiveObject*)current);
index af213e5e21cbb563612dbcd93aa175d95b03c531..8ade7fe05a3f40d4388697ed4646e1b887592560 100644 (file)
@@ -840,9 +840,8 @@ bool ServerEnvironment::swapNode(v3s16 p, const MapNode &n)
        return true;
 }
 
-std::set<u16> ServerEnvironment::getObjectsInsideRadius(v3f pos, float radius)
+void ServerEnvironment::getObjectsInsideRadius(std::vector<u16> &objects, v3f pos, float radius)
 {
-       std::set<u16> objects;
        for(std::map<u16, ServerActiveObject*>::iterator
                        i = m_active_objects.begin();
                        i != m_active_objects.end(); ++i)
@@ -852,9 +851,8 @@ std::set<u16> ServerEnvironment::getObjectsInsideRadius(v3f pos, float radius)
                v3f objectpos = obj->getBasePosition();
                if(objectpos.getDistanceFrom(pos) > radius)
                        continue;
-               objects.insert(id);
+               objects.push_back(id);
        }
-       return objects;
 }
 
 void ServerEnvironment::clearAllObjects()
index c9c3744139648d82f07bd85ae1a27d5cc7ce5635..415a9ec31a208c524e82f1b72f3d1b23d9050908 100644 (file)
@@ -305,7 +305,7 @@ public:
        bool swapNode(v3s16 p, const MapNode &n);
 
        // Find all active objects inside a radius around a point
-       std::set<u16> getObjectsInsideRadius(v3f pos, float radius);
+       void getObjectsInsideRadius(std::vector<u16> &objects, v3f pos, float radius);
 
        // Clear all objects, loading and going through every MapBlock
        void clearAllObjects();
index 840c3459506d416da0bac9c84702aed084cb1c5b..0fe1ddec38592bf0a6991c9f7a8367145b7be0eb 100644 (file)
@@ -438,10 +438,11 @@ int ModApiEnvMod::l_get_objects_inside_radius(lua_State *L)
        // Do it
        v3f pos = checkFloatPos(L, 1);
        float radius = luaL_checknumber(L, 2) * BS;
-       std::set<u16> ids = env->getObjectsInsideRadius(pos, radius);
+       std::vector<u16> ids;
+       env->getObjectsInsideRadius(ids, pos, radius);
        ScriptApiBase *script = getScriptApiBase(L);
        lua_createtable(L, ids.size(), 0);
-       std::set<u16>::const_iterator iter = ids.begin();
+       std::vector<u16>::const_iterator iter = ids.begin();
        for(u32 i = 0; iter != ids.end(); iter++) {
                ServerActiveObject *obj = env->getActiveObject(*iter);
                // Insert object reference into table