// L-System tree LUA spawner treegen::error spawn_ltree(ServerEnvironment *env, v3s16 p0, INodeDefManager *ndef, TreeDef tree_definition) { ServerMap *map = &env->getServerMap(); std::map<v3s16, MapBlock*> modified_blocks; ManualMapVoxelManipulator vmanip(map); v3s16 tree_blockp = getNodeBlockPos(p0); treegen::error e; vmanip.initialEmerge(tree_blockp - v3s16(1,1,1), tree_blockp + v3s16(1,3,1)); e = make_ltree (vmanip, p0, ndef, tree_definition); if (e != SUCCESS) return e; vmanip.blitBackAll(&modified_blocks); // update lighting std::map<v3s16, MapBlock*> lighting_modified_blocks; lighting_modified_blocks.insert(modified_blocks.begin(), modified_blocks.end()); map->updateLighting(lighting_modified_blocks, modified_blocks); // Send a MEET_OTHER event MapEditEvent event; event.type = MEET_OTHER; for(std::map<v3s16, MapBlock*>::iterator i = modified_blocks.begin(); i != modified_blocks.end(); ++i) { event.modified_blocks.insert(i->first); } map->dispatchEvent(&event); return SUCCESS; }
int LuaVoxelManip::l_write_to_map(lua_State *L) { MAP_LOCK_REQUIRED; LuaVoxelManip *o = checkobject(L, 1); bool update_light = !lua_isboolean(L, 2) || lua_toboolean(L, 2); GET_ENV_PTR; ServerMap *map = &(env->getServerMap()); if (o->is_mapgen_vm || !update_light) { o->vm->blitBackAll(&(o->modified_blocks)); } else { voxalgo::blit_back_with_light(map, o->vm, &(o->modified_blocks)); } MapEditEvent event; event.type = MEET_OTHER; for (const auto &modified_block : o->modified_blocks) event.modified_blocks.insert(modified_block.first); map->dispatchEvent(&event); o->modified_blocks.clear(); return 0; }
virtual void trigger(ServerEnvironment *env, v3s16 p, MapNode n, u32 active_object_count, u32 active_object_count_wider) { INodeDefManager *ndef = env->getGameDef()->ndef(); ServerMap *map = &env->getServerMap(); MapNode n_below = map->getNodeNoEx(p - v3s16(0, 1, 0)); if (n_below.getContent() != c_dirt && n_below.getContent() != c_dirt_with_grass) return; bool is_jungle_tree = n.getContent() == c_junglesapling; actionstream <<"A " << (is_jungle_tree ? "jungle " : "") << "sapling grows into a tree at " << PP(p) << std::endl; std::map<v3s16, MapBlock*> modified_blocks; v3s16 tree_p = p; ManualMapVoxelManipulator vmanip(map); v3s16 tree_blockp = getNodeBlockPos(tree_p); vmanip.initialEmerge(tree_blockp - v3s16(1,1,1), tree_blockp + v3s16(1,1,1)); if (is_jungle_tree) { treegen::make_jungletree(vmanip, tree_p, ndef, myrand()); } else { bool is_apple_tree = myrand() % 4 == 0; treegen::make_tree(vmanip, tree_p, is_apple_tree, ndef, myrand()); } vmanip.blitBackAll(&modified_blocks); // update lighting std::map<v3s16, MapBlock*> lighting_modified_blocks; lighting_modified_blocks.insert(modified_blocks.begin(), modified_blocks.end()); map->updateLighting(lighting_modified_blocks, modified_blocks); // Send a MEET_OTHER event MapEditEvent event; event.type = MEET_OTHER; // event.modified_blocks.insert(modified_blocks.begin(), modified_blocks.end()); for(std::map<v3s16, MapBlock*>::iterator i = modified_blocks.begin(); i != modified_blocks.end(); ++i) { event.modified_blocks.insert(i->first); } map->dispatchEvent(&event); }
virtual void trigger(ServerEnvironment *env, v3s16 p, MapNode n, u32 active_object_count, u32 active_object_count_wider) { INodeDefManager *ndef = env->getGameDef()->ndef(); ServerMap *map = &env->getServerMap(); actionstream<<"A sapling grows into a tree at " <<PP(p)<<std::endl; core::map<v3s16, MapBlock*> modified_blocks; v3s16 tree_p = p; ManualMapVoxelManipulator vmanip(map); v3s16 tree_blockp = getNodeBlockPos(tree_p); vmanip.initialEmerge(tree_blockp - v3s16(1,1,1), tree_blockp + v3s16(1,1,1)); bool is_apple_tree = myrand()%4 == 0; mapgen::make_tree(vmanip, tree_p, is_apple_tree, ndef); vmanip.blitBackAll(&modified_blocks); // update lighting core::map<v3s16, MapBlock*> lighting_modified_blocks; for(core::map<v3s16, MapBlock*>::Iterator i = modified_blocks.getIterator(); i.atEnd() == false; i++) { lighting_modified_blocks.insert(i.getNode()->getKey(), i.getNode()->getValue()); } map->updateLighting(lighting_modified_blocks, modified_blocks); // Send a MEET_OTHER event MapEditEvent event; event.type = MEET_OTHER; for(core::map<v3s16, MapBlock*>::Iterator i = modified_blocks.getIterator(); i.atEnd() == false; i++) { v3s16 p = i.getNode()->getKey(); event.modified_blocks.insert(p, true); } map->dispatchEvent(&event); }