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));
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;
method(EnvRef, get_meta),
method(EnvRef, get_player_by_name),
method(EnvRef, get_objects_inside_radius),
+ method(EnvRef, get_nodes_inside_radius),
{0,0}
};