Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Add minetest.get_objects_in_area (#10668)
  • Loading branch information
LizzyFleckenstein03 committed Dec 29, 2020
1 parent 09d7fbd commit 9250b52
Show file tree
Hide file tree
Showing 6 changed files with 57 additions and 0 deletions.
3 changes: 3 additions & 0 deletions doc/lua_api.txt
Expand Up @@ -4891,6 +4891,9 @@ Environment access
* `minetest.get_objects_inside_radius(pos, radius)`: returns a list of
ObjectRefs.
* `radius`: using an euclidean metric
* `minetest.get_objects_in_area(pos1, pos2)`: returns a list of
ObjectRefs.
* `pos1` and `pos2` are the min and max positions of the area to search.
* `minetest.set_timeofday(val)`
* `val` is between `0` and `1`; `0` for midnight, `0.5` for midday
* `minetest.get_timeofday()`
Expand Down
26 changes: 26 additions & 0 deletions src/script/lua_api/l_env.cpp
Expand Up @@ -743,6 +743,31 @@ int ModApiEnvMod::l_get_objects_inside_radius(lua_State *L)
return 1;
}

// get_objects_in_area(pos, minp, maxp)
int ModApiEnvMod::l_get_objects_in_area(lua_State *L)
{
GET_ENV_PTR;
ScriptApiBase *script = getScriptApiBase(L);

v3f minp = read_v3f(L, 1) * BS;
v3f maxp = read_v3f(L, 2) * BS;
aabb3f box(minp, maxp);
box.repair();
std::vector<ServerActiveObject *> objs;

auto include_obj_cb = [](ServerActiveObject *obj){ return !obj->isGone(); };
env->getObjectsInArea(objs, box, include_obj_cb);

int i = 0;
lua_createtable(L, objs.size(), 0);
for (const auto obj : objs) {
// Insert object reference into table
script->objectrefGetOrCreate(L, obj);
lua_rawseti(L, -2, ++i);
}
return 1;
}

// set_timeofday(val)
// val = 0...1
int ModApiEnvMod::l_set_timeofday(lua_State *L)
Expand Down Expand Up @@ -1413,6 +1438,7 @@ void ModApiEnvMod::Initialize(lua_State *L, int top)
API_FCT(get_node_timer);
API_FCT(get_connected_players);
API_FCT(get_player_by_name);
API_FCT(get_objects_in_area);
API_FCT(get_objects_inside_radius);
API_FCT(set_timeofday);
API_FCT(get_timeofday);
Expand Down
3 changes: 3 additions & 0 deletions src/script/lua_api/l_env.h
Expand Up @@ -114,6 +114,9 @@ class ModApiEnvMod : public ModApiBase {

// get_objects_inside_radius(pos, radius)
static int l_get_objects_inside_radius(lua_State *L);

// get_objects_in_area(pos, minp, maxp)
static int l_get_objects_in_area(lua_State *L);

// set_timeofday(val)
// val = 0...1
Expand Down
15 changes: 15 additions & 0 deletions src/server/activeobjectmgr.cpp
Expand Up @@ -127,6 +127,21 @@ void ActiveObjectMgr::getObjectsInsideRadius(const v3f &pos, float radius,
}
}

void ActiveObjectMgr::getObjectsInArea(const aabb3f &box,
std::vector<ServerActiveObject *> &result,
std::function<bool(ServerActiveObject *obj)> include_obj_cb)
{
for (auto &activeObject : m_active_objects) {
ServerActiveObject *obj = activeObject.second;
const v3f &objectpos = obj->getBasePosition();
if (!box.isPointInside(objectpos))
continue;

if (!include_obj_cb || include_obj_cb(obj))
result.push_back(obj);
}
}

void ActiveObjectMgr::getAddedActiveObjectsAroundPos(const v3f &player_pos, f32 radius,
f32 player_radius, std::set<u16> &current_objects,
std::queue<u16> &added_objects)
Expand Down
3 changes: 3 additions & 0 deletions src/server/activeobjectmgr.h
Expand Up @@ -38,6 +38,9 @@ class ActiveObjectMgr : public ::ActiveObjectMgr<ServerActiveObject>
void getObjectsInsideRadius(const v3f &pos, float radius,
std::vector<ServerActiveObject *> &result,
std::function<bool(ServerActiveObject *obj)> include_obj_cb);
void getObjectsInArea(const aabb3f &box,
std::vector<ServerActiveObject *> &result,
std::function<bool(ServerActiveObject *obj)> include_obj_cb);

void getAddedActiveObjectsAroundPos(const v3f &player_pos, f32 radius,
f32 player_radius, std::set<u16> &current_objects,
Expand Down
7 changes: 7 additions & 0 deletions src/serverenvironment.h
Expand Up @@ -331,6 +331,13 @@ class ServerEnvironment : public Environment
{
return m_ao_manager.getObjectsInsideRadius(pos, radius, objects, include_obj_cb);
}

// Find all active objects inside a box
void getObjectsInArea(std::vector<ServerActiveObject *> &objects, const aabb3f &box,
std::function<bool(ServerActiveObject *obj)> include_obj_cb)
{
return m_ao_manager.getObjectsInArea(box, objects, include_obj_cb);
}

// Clear objects, loading and going through every MapBlock
void clearObjects(ClearObjectsMode mode);
Expand Down

0 comments on commit 9250b52

Please sign in to comment.