diff --git a/doc/lua_api.txt b/doc/lua_api.txt index 557fdccb1..f48c433c6 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -1613,7 +1613,7 @@ minetest.get_perlin(seeddiff, octaves, persistence, scale) minetest.get_voxel_manip() ^ Return voxel manipulator object minetest.get_voxel_manip(p1, p2) -^ Return voxel manipulator object with blank data preallocated +^ Return voxel manipulator object with map pre-loaded minetest.set_gen_notify(flags, {deco_ids}) ^ Set the types of on-generate notifications that should be collected ^ flags is a flag field with the available flags: @@ -2215,7 +2215,7 @@ methods: VoxelManip: An interface to the MapVoxelManipulator for Lua - Can be created via VoxelManip() - Also minetest.get_voxel_manip() -- Specify a pmin, pmax in either to allocate a blank chunk of data prefilled with cignore +- Specify a pmin, pmax to create a VoxelManip with map already loaded methods: - read_from_map(p1, p2): Reads a chunk of map from the map containing the region formed by p1 and p2. ^ returns actual emerged pmin, actual emerged pmax diff --git a/src/map.cpp b/src/map.cpp index 05e07212d..7a58c90c7 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -3597,29 +3597,6 @@ ManualMapVoxelManipulator::~ManualMapVoxelManipulator() { } -void ManualMapVoxelManipulator::initializeBlank(v3s16 blockpos_min, - v3s16 blockpos_max) -{ - // Units of these are MapBlocks - v3s16 pmin = blockpos_min; - v3s16 pmax = blockpos_max; - - VoxelArea block_area_nodes(pmin * MAP_BLOCKSIZE, - (pmax + 1) * MAP_BLOCKSIZE - v3s16(1,1,1)); - - addArea(block_area_nodes); - u32 extent = m_area.getVolume(); - for (u32 i = 0; i != extent; i++) - m_data[i] = MapNode(CONTENT_IGNORE); - - for (s32 z = pmin.Z; z <= pmax.Z; z++) - for (s32 y = pmin.Y; y <= pmax.Y; y++) - for (s32 x = pmin.X; x <= pmax.X; x++) - m_loaded_blocks[v3s16(x, y, z)] = 0; - - m_is_dirty = false; -} - void ManualMapVoxelManipulator::initialEmerge(v3s16 blockpos_min, v3s16 blockpos_max, bool load_if_inexistent) { diff --git a/src/map.h b/src/map.h index 57edd7708..f23cd3783 100644 --- a/src/map.h +++ b/src/map.h @@ -189,7 +189,7 @@ public: MapBlock * getBlockNoCreateNoEx(v3s16 p); /* Server overrides */ - virtual MapBlock * emergeBlock(v3s16 p, bool allow_generate=true) + virtual MapBlock * emergeBlock(v3s16 p, bool create_blank=true) { return getBlockNoCreateNoEx(p); } // Returns InvalidPositionException if not found @@ -550,8 +550,6 @@ public: void setMap(Map *map) {m_map = map;} - void initializeBlank(v3s16 pmin, v3s16 pmax); - void initialEmerge(v3s16 blockpos_min, v3s16 blockpos_max, bool load_if_inexistent = true); diff --git a/src/script/lua_api/l_env.cpp b/src/script/lua_api/l_env.cpp index 9e713b9b8..c8c1ca0e1 100644 --- a/src/script/lua_api/l_env.cpp +++ b/src/script/lua_api/l_env.cpp @@ -636,14 +636,9 @@ int ModApiEnvMod::l_get_voxel_manip(lua_State *L) GET_ENV_PTR; Map *map = &(env->getMap()); - LuaVoxelManip *o = new LuaVoxelManip(map); - - if (lua_istable(L, 1) && lua_istable(L, 2)) { - v3s16 p1 = getNodeBlockPos(read_v3s16(L, 1)); - v3s16 p2 = getNodeBlockPos(read_v3s16(L, 2)); - sortBoxVerticies(p1, p2); - o->vm->initializeBlank(p1, p2); - } + LuaVoxelManip *o = (lua_istable(L, 1) && lua_istable(L, 2)) ? + new LuaVoxelManip(map, read_v3s16(L, 1), read_v3s16(L, 2)) : + new LuaVoxelManip(map); *(void **)(lua_newuserdata(L, sizeof(void *))) = o; luaL_getmetatable(L, "VoxelManip"); diff --git a/src/script/lua_api/l_vmanip.cpp b/src/script/lua_api/l_vmanip.cpp index fb52aa21a..6c12baf92 100644 --- a/src/script/lua_api/l_vmanip.cpp +++ b/src/script/lua_api/l_vmanip.cpp @@ -367,6 +367,17 @@ LuaVoxelManip::LuaVoxelManip(Map *map) this->is_mapgen_vm = false; } +LuaVoxelManip::LuaVoxelManip(Map *map, v3s16 p1, v3s16 p2) +{ + this->vm = new ManualMapVoxelManipulator(map); + this->is_mapgen_vm = false; + + v3s16 bp1 = getNodeBlockPos(p1); + v3s16 bp2 = getNodeBlockPos(p2); + sortBoxVerticies(bp1, bp2); + vm->initialEmerge(bp1, bp2); +} + LuaVoxelManip::~LuaVoxelManip() { if (!is_mapgen_vm) @@ -384,14 +395,9 @@ int LuaVoxelManip::create_object(lua_State *L) return 0; Map *map = &(env->getMap()); - LuaVoxelManip *o = new LuaVoxelManip(map); - - if (lua_istable(L, 1) && lua_istable(L, 2)) { - v3s16 p1 = getNodeBlockPos(read_v3s16(L, 1)); - v3s16 p2 = getNodeBlockPos(read_v3s16(L, 2)); - sortBoxVerticies(p1, p2); - o->vm->initializeBlank(p1, p2); - } + LuaVoxelManip *o = (lua_istable(L, 1) && lua_istable(L, 2)) ? + new LuaVoxelManip(map, read_v3s16(L, 1), read_v3s16(L, 2)) : + new LuaVoxelManip(map); *(void **)(lua_newuserdata(L, sizeof(void *))) = o; luaL_getmetatable(L, className); diff --git a/src/script/lua_api/l_vmanip.h b/src/script/lua_api/l_vmanip.h index ead6efbc4..887b18663 100644 --- a/src/script/lua_api/l_vmanip.h +++ b/src/script/lua_api/l_vmanip.h @@ -33,6 +33,7 @@ class ManualMapVoxelManipulator; */ class LuaVoxelManip : public ModApiBase { private: + ManualMapVoxelManipulator *vm; std::map modified_blocks; bool is_mapgen_vm; @@ -64,9 +65,8 @@ private: static int l_get_emerged_area(lua_State *L); public: - ManualMapVoxelManipulator *vm; - LuaVoxelManip(ManualMapVoxelManipulator *mmvm, bool is_mapgen_vm); + LuaVoxelManip(Map *map, v3s16 p1, v3s16 p2); LuaVoxelManip(Map *map); ~LuaVoxelManip();