Skip to content

Commit 9250b52

Browse files
authoredDec 29, 2020
Add minetest.get_objects_in_area (#10668)
1 parent 09d7fbd commit 9250b52

File tree

6 files changed

+57
-0
lines changed

6 files changed

+57
-0
lines changed
 

Diff for: ‎doc/lua_api.txt

+3
Original file line numberDiff line numberDiff line change
@@ -4891,6 +4891,9 @@ Environment access
48914891
* `minetest.get_objects_inside_radius(pos, radius)`: returns a list of
48924892
ObjectRefs.
48934893
* `radius`: using an euclidean metric
4894+
* `minetest.get_objects_in_area(pos1, pos2)`: returns a list of
4895+
ObjectRefs.
4896+
* `pos1` and `pos2` are the min and max positions of the area to search.
48944897
* `minetest.set_timeofday(val)`
48954898
* `val` is between `0` and `1`; `0` for midnight, `0.5` for midday
48964899
* `minetest.get_timeofday()`

Diff for: ‎src/script/lua_api/l_env.cpp

+26
Original file line numberDiff line numberDiff line change
@@ -743,6 +743,31 @@ int ModApiEnvMod::l_get_objects_inside_radius(lua_State *L)
743743
return 1;
744744
}
745745

746+
// get_objects_in_area(pos, minp, maxp)
747+
int ModApiEnvMod::l_get_objects_in_area(lua_State *L)
748+
{
749+
GET_ENV_PTR;
750+
ScriptApiBase *script = getScriptApiBase(L);
751+
752+
v3f minp = read_v3f(L, 1) * BS;
753+
v3f maxp = read_v3f(L, 2) * BS;
754+
aabb3f box(minp, maxp);
755+
box.repair();
756+
std::vector<ServerActiveObject *> objs;
757+
758+
auto include_obj_cb = [](ServerActiveObject *obj){ return !obj->isGone(); };
759+
env->getObjectsInArea(objs, box, include_obj_cb);
760+
761+
int i = 0;
762+
lua_createtable(L, objs.size(), 0);
763+
for (const auto obj : objs) {
764+
// Insert object reference into table
765+
script->objectrefGetOrCreate(L, obj);
766+
lua_rawseti(L, -2, ++i);
767+
}
768+
return 1;
769+
}
770+
746771
// set_timeofday(val)
747772
// val = 0...1
748773
int ModApiEnvMod::l_set_timeofday(lua_State *L)
@@ -1413,6 +1438,7 @@ void ModApiEnvMod::Initialize(lua_State *L, int top)
14131438
API_FCT(get_node_timer);
14141439
API_FCT(get_connected_players);
14151440
API_FCT(get_player_by_name);
1441+
API_FCT(get_objects_in_area);
14161442
API_FCT(get_objects_inside_radius);
14171443
API_FCT(set_timeofday);
14181444
API_FCT(get_timeofday);

Diff for: ‎src/script/lua_api/l_env.h

+3
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,9 @@ class ModApiEnvMod : public ModApiBase {
114114

115115
// get_objects_inside_radius(pos, radius)
116116
static int l_get_objects_inside_radius(lua_State *L);
117+
118+
// get_objects_in_area(pos, minp, maxp)
119+
static int l_get_objects_in_area(lua_State *L);
117120

118121
// set_timeofday(val)
119122
// val = 0...1

Diff for: ‎src/server/activeobjectmgr.cpp

+15
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,21 @@ void ActiveObjectMgr::getObjectsInsideRadius(const v3f &pos, float radius,
127127
}
128128
}
129129

130+
void ActiveObjectMgr::getObjectsInArea(const aabb3f &box,
131+
std::vector<ServerActiveObject *> &result,
132+
std::function<bool(ServerActiveObject *obj)> include_obj_cb)
133+
{
134+
for (auto &activeObject : m_active_objects) {
135+
ServerActiveObject *obj = activeObject.second;
136+
const v3f &objectpos = obj->getBasePosition();
137+
if (!box.isPointInside(objectpos))
138+
continue;
139+
140+
if (!include_obj_cb || include_obj_cb(obj))
141+
result.push_back(obj);
142+
}
143+
}
144+
130145
void ActiveObjectMgr::getAddedActiveObjectsAroundPos(const v3f &player_pos, f32 radius,
131146
f32 player_radius, std::set<u16> &current_objects,
132147
std::queue<u16> &added_objects)

Diff for: ‎src/server/activeobjectmgr.h

+3
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,9 @@ class ActiveObjectMgr : public ::ActiveObjectMgr<ServerActiveObject>
3838
void getObjectsInsideRadius(const v3f &pos, float radius,
3939
std::vector<ServerActiveObject *> &result,
4040
std::function<bool(ServerActiveObject *obj)> include_obj_cb);
41+
void getObjectsInArea(const aabb3f &box,
42+
std::vector<ServerActiveObject *> &result,
43+
std::function<bool(ServerActiveObject *obj)> include_obj_cb);
4144

4245
void getAddedActiveObjectsAroundPos(const v3f &player_pos, f32 radius,
4346
f32 player_radius, std::set<u16> &current_objects,

Diff for: ‎src/serverenvironment.h

+7
Original file line numberDiff line numberDiff line change
@@ -331,6 +331,13 @@ class ServerEnvironment : public Environment
331331
{
332332
return m_ao_manager.getObjectsInsideRadius(pos, radius, objects, include_obj_cb);
333333
}
334+
335+
// Find all active objects inside a box
336+
void getObjectsInArea(std::vector<ServerActiveObject *> &objects, const aabb3f &box,
337+
std::function<bool(ServerActiveObject *obj)> include_obj_cb)
338+
{
339+
return m_ao_manager.getObjectsInArea(box, objects, include_obj_cb);
340+
}
334341

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

0 commit comments

Comments
 (0)
Please sign in to comment.