mirror of
https://github.com/minetest/minetest.git
synced 2024-11-23 08:03:45 +01:00
Add minetest.get_objects_in_area (#10668)
This commit is contained in:
parent
09d7fbd645
commit
9250b5205a
@ -4891,6 +4891,9 @@ Environment access
|
|||||||
* `minetest.get_objects_inside_radius(pos, radius)`: returns a list of
|
* `minetest.get_objects_inside_radius(pos, radius)`: returns a list of
|
||||||
ObjectRefs.
|
ObjectRefs.
|
||||||
* `radius`: using an euclidean metric
|
* `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)`
|
* `minetest.set_timeofday(val)`
|
||||||
* `val` is between `0` and `1`; `0` for midnight, `0.5` for midday
|
* `val` is between `0` and `1`; `0` for midnight, `0.5` for midday
|
||||||
* `minetest.get_timeofday()`
|
* `minetest.get_timeofday()`
|
||||||
|
@ -743,6 +743,31 @@ int ModApiEnvMod::l_get_objects_inside_radius(lua_State *L)
|
|||||||
return 1;
|
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)
|
// set_timeofday(val)
|
||||||
// val = 0...1
|
// val = 0...1
|
||||||
int ModApiEnvMod::l_set_timeofday(lua_State *L)
|
int ModApiEnvMod::l_set_timeofday(lua_State *L)
|
||||||
@ -1413,6 +1438,7 @@ void ModApiEnvMod::Initialize(lua_State *L, int top)
|
|||||||
API_FCT(get_node_timer);
|
API_FCT(get_node_timer);
|
||||||
API_FCT(get_connected_players);
|
API_FCT(get_connected_players);
|
||||||
API_FCT(get_player_by_name);
|
API_FCT(get_player_by_name);
|
||||||
|
API_FCT(get_objects_in_area);
|
||||||
API_FCT(get_objects_inside_radius);
|
API_FCT(get_objects_inside_radius);
|
||||||
API_FCT(set_timeofday);
|
API_FCT(set_timeofday);
|
||||||
API_FCT(get_timeofday);
|
API_FCT(get_timeofday);
|
||||||
|
@ -114,6 +114,9 @@ private:
|
|||||||
|
|
||||||
// get_objects_inside_radius(pos, radius)
|
// get_objects_inside_radius(pos, radius)
|
||||||
static int l_get_objects_inside_radius(lua_State *L);
|
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)
|
// set_timeofday(val)
|
||||||
// val = 0...1
|
// val = 0...1
|
||||||
|
@ -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,
|
void ActiveObjectMgr::getAddedActiveObjectsAroundPos(const v3f &player_pos, f32 radius,
|
||||||
f32 player_radius, std::set<u16> ¤t_objects,
|
f32 player_radius, std::set<u16> ¤t_objects,
|
||||||
std::queue<u16> &added_objects)
|
std::queue<u16> &added_objects)
|
||||||
|
@ -38,6 +38,9 @@ public:
|
|||||||
void getObjectsInsideRadius(const v3f &pos, float radius,
|
void getObjectsInsideRadius(const v3f &pos, float radius,
|
||||||
std::vector<ServerActiveObject *> &result,
|
std::vector<ServerActiveObject *> &result,
|
||||||
std::function<bool(ServerActiveObject *obj)> include_obj_cb);
|
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,
|
void getAddedActiveObjectsAroundPos(const v3f &player_pos, f32 radius,
|
||||||
f32 player_radius, std::set<u16> ¤t_objects,
|
f32 player_radius, std::set<u16> ¤t_objects,
|
||||||
|
@ -331,6 +331,13 @@ public:
|
|||||||
{
|
{
|
||||||
return m_ao_manager.getObjectsInsideRadius(pos, radius, objects, include_obj_cb);
|
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
|
// Clear objects, loading and going through every MapBlock
|
||||||
void clearObjects(ClearObjectsMode mode);
|
void clearObjects(ClearObjectsMode mode);
|
||||||
|
Loading…
Reference in New Issue
Block a user