Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --- git/minetest/src/environment.h 2012-01-07 15:00:59.000000000 +0100
- +++ minetest/src/environment.h 2012-01-07 14:41:16.000000000 +0100
- @@ -270,6 +270,9 @@
- -------------------------------------------
- */
- + // Find all nodes inside a radius around a point
- + core::list<MapNode> getNodesInsideRadius(v3s16 pos, float radius);
- +
- // Find all active objects inside a radius around a point
- std::set<u16> getObjectsInsideRadius(v3f pos, float radius);
- --- git/minetest/src/environment.cpp 2012-01-07 15:00:59.000000000 +0100
- +++ minetest/src/environment.cpp 2012-01-07 14:42:47.000000000 +0100
- @@ -765,6 +766,32 @@
- abmhandler.apply(block);
- }
- +core::list<MapNode> ServerEnvironment::getNodesInsideRadius(v3s16 pos, float radius)
- +{
- + core::list<MapNode> nodes;
- +
- +
- + for (int i = pos.X - radius; i < pos.X + radius; i ++) {
- +
- + for (int j = pos.Y - radius; j <pos.Y + radius; j ++) {
- +
- + for (int k = pos.Z - radius; k < pos.Z + radius; k ++) {
- + v3s16 current_pos = v3s16(i,j,k);
- +
- + if (current_pos.getDistanceFrom(pos) < radius) {
- +
- + MapNode n = m_map->getNodeNoEx(current_pos);
- +
- + nodes.push_back(n);
- + }
- +
- + }
- + }
- +
- + }
- + return nodes;
- +}
- +
- void ServerEnvironment::addActiveBlockModifier(ActiveBlockModifier *abm)
- {
- m_abms.push_back(ABMWithState(abm));
- --- git/minetest/src/scriptapi.cpp 2012-01-07 15:01:00.000000000 +0100
- +++ minetest/src/scriptapi.cpp 2012-01-07 14:41:23.000000000 +0100
- @@ -2543,6 +2543,35 @@
- return 1;
- }
- + // EnvRef:get_objects_inside_radius(pos, radius)
- + static int l_get_nodes_inside_radius(lua_State *L)
- + {
- + // Get the table insert function
- + lua_getglobal(L, "table");
- + lua_getfield(L, -1, "insert");
- + int table_insert = lua_gettop(L);
- + // Get environemnt
- + EnvRef *o = checkobject(L, 1);
- + ServerEnvironment *env = o->m_env;
- + if(env == NULL) return 0;
- + // Do it
- + v3s16 pos = read_v3s16(L, 2);
- + float radius = luaL_checknumber(L, 3);// * BS;
- + core::list<MapNode> nodes = env->getNodesInsideRadius(pos, radius);
- + lua_newtable(L);
- + int table = lua_gettop(L);
- + for(core::list<MapNode>::Iterator
- + i = nodes.begin(); i != nodes.end(); i++){
- + // Insert object reference into table
- + lua_pushvalue(L, table_insert);
- + lua_pushvalue(L, table);
- + pushnode(L, *i, env->getGameDef()->ndef());
- + if(lua_pcall(L, 2, 0, 0))
- + script_error(L, "error: %s", lua_tostring(L, -1));
- + }
- + return 1;
- + }
- +
- static int gc_object(lua_State *L) {
- EnvRef *o = *(EnvRef **)(lua_touserdata(L, 1));
- delete o;
- @@ -2620,6 +2649,7 @@
- method(EnvRef, get_meta),
- method(EnvRef, get_player_by_name),
- method(EnvRef, get_objects_inside_radius),
- + method(EnvRef, get_nodes_inside_radius),
- {0,0}
- };
Advertisement
Add Comment
Please, Sign In to add comment