From: Craig Robbins Date: Wed, 30 Jul 2014 01:39:24 +0000 (+1000) Subject: Fix issue 1527 X-Git-Tag: 0.4.11~337 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=6929206bc29960b0fab8c0a0a65a48992cfff398;p=oweals%2Fminetest.git Fix issue 1527 https://github.com/minetest/minetest/issues/1527 --- diff --git a/src/script/lua_api/l_vmanip.cpp b/src/script/lua_api/l_vmanip.cpp index b48b3a8f1..f3c1fa67a 100644 --- a/src/script/lua_api/l_vmanip.cpp +++ b/src/script/lua_api/l_vmanip.cpp @@ -31,9 +31,8 @@ with this program; if not, write to the Free Software Foundation, Inc., int LuaVoxelManip::gc_object(lua_State *L) { LuaVoxelManip *o = *(LuaVoxelManip **)(lua_touserdata(L, 1)); - if (!o->is_mapgen_vm) - delete o; - + delete o; + return 0; } @@ -41,16 +40,16 @@ int LuaVoxelManip::l_read_from_map(lua_State *L) { LuaVoxelManip *o = checkobject(L, 1); ManualMapVoxelManipulator *vm = o->vm; - + v3s16 bp1 = getNodeBlockPos(read_v3s16(L, 2)); v3s16 bp2 = getNodeBlockPos(read_v3s16(L, 3)); sortBoxVerticies(bp1, bp2); - + vm->initialEmerge(bp1, bp2); - + push_v3s16(L, vm->m_area.MinEdge); push_v3s16(L, vm->m_area.MaxEdge); - + return 2; } @@ -60,39 +59,39 @@ int LuaVoxelManip::l_get_data(lua_State *L) LuaVoxelManip *o = checkobject(L, 1); ManualMapVoxelManipulator *vm = o->vm; - + int volume = vm->m_area.getVolume(); - + lua_newtable(L); for (int i = 0; i != volume; i++) { lua_Integer cid = vm->m_data[i].getContent(); lua_pushinteger(L, cid); lua_rawseti(L, -2, i + 1); } - + return 1; } int LuaVoxelManip::l_set_data(lua_State *L) { NO_MAP_LOCK_REQUIRED; - + LuaVoxelManip *o = checkobject(L, 1); ManualMapVoxelManipulator *vm = o->vm; - + if (!lua_istable(L, 2)) return 0; - + int volume = vm->m_area.getVolume(); for (int i = 0; i != volume; i++) { lua_rawgeti(L, 2, i + 1); content_t c = lua_tointeger(L, -1); - + vm->m_data[i].setContent(c); lua_pop(L, 1); } - + return 0; } @@ -103,7 +102,7 @@ int LuaVoxelManip::l_write_to_map(lua_State *L) vm->blitBackAll(&o->modified_blocks); - return 0; + return 0; } int LuaVoxelManip::l_update_liquids(lua_State *L) @@ -131,7 +130,7 @@ int LuaVoxelManip::l_update_liquids(lua_State *L) int LuaVoxelManip::l_calc_lighting(lua_State *L) { NO_MAP_LOCK_REQUIRED; - + LuaVoxelManip *o = checkobject(L, 1); if (!o->is_mapgen_vm) return 0; @@ -150,7 +149,7 @@ int LuaVoxelManip::l_calc_lighting(lua_State *L) mg.vm = vm; mg.ndef = ndef; mg.water_level = emerge->params.water_level; - + mg.calcLighting(p1, p2); return 0; @@ -159,20 +158,20 @@ int LuaVoxelManip::l_calc_lighting(lua_State *L) int LuaVoxelManip::l_set_lighting(lua_State *L) { NO_MAP_LOCK_REQUIRED; - + LuaVoxelManip *o = checkobject(L, 1); if (!o->is_mapgen_vm) return 0; - + if (!lua_istable(L, 2)) return 0; u8 light; light = (getintfield_default(L, 2, "day", 0) & 0x0F); light |= (getintfield_default(L, 2, "night", 0) & 0x0F) << 4; - + ManualMapVoxelManipulator *vm = o->vm; - + v3s16 p1 = lua_istable(L, 3) ? read_v3s16(L, 3) : vm->m_area.MinEdge + v3s16(0, 1, 0) * MAP_BLOCKSIZE; v3s16 p2 = lua_istable(L, 4) ? read_v3s16(L, 4) : @@ -181,7 +180,7 @@ int LuaVoxelManip::l_set_lighting(lua_State *L) Mapgen mg; mg.vm = vm; - + mg.setLighting(p1, p2, light); return 0; @@ -276,7 +275,7 @@ int LuaVoxelManip::l_update_map(lua_State *L) LuaVoxelManip *o = checkobject(L, 1); if (o->is_mapgen_vm) return 0; - + Environment *env = getEnv(L); if (!env) return 0; @@ -286,9 +285,9 @@ int LuaVoxelManip::l_update_map(lua_State *L) // TODO: Optimize this by using Mapgen::calcLighting() instead std::map lighting_mblocks; std::map *mblocks = &o->modified_blocks; - + lighting_mblocks.insert(mblocks->begin(), mblocks->end()); - + map->updateLighting(lighting_mblocks, *mblocks); MapEditEvent event; @@ -297,12 +296,12 @@ int LuaVoxelManip::l_update_map(lua_State *L) it = mblocks->begin(); it != mblocks->end(); ++it) event.modified_blocks.insert(it->first); - + map->dispatchEvent(&event); mblocks->clear(); - return 0; + return 0; } LuaVoxelManip::LuaVoxelManip(ManualMapVoxelManipulator *mmvm, bool is_mg_vm) @@ -319,7 +318,8 @@ LuaVoxelManip::LuaVoxelManip(Map *map) LuaVoxelManip::~LuaVoxelManip() { - delete vm; + if (!is_mapgen_vm) + delete vm; } // LuaVoxelManip() @@ -327,14 +327,14 @@ LuaVoxelManip::~LuaVoxelManip() int LuaVoxelManip::create_object(lua_State *L) { NO_MAP_LOCK_REQUIRED; - + Environment *env = getEnv(L); if (!env) return 0; - + Map *map = &(env->getMap()); LuaVoxelManip *o = new LuaVoxelManip(map); - + *(void **)(lua_newuserdata(L, sizeof(void *))) = o; luaL_getmetatable(L, className); lua_setmetatable(L, -2); @@ -344,13 +344,13 @@ int LuaVoxelManip::create_object(lua_State *L) LuaVoxelManip *LuaVoxelManip::checkobject(lua_State *L, int narg) { NO_MAP_LOCK_REQUIRED; - + luaL_checktype(L, narg, LUA_TUSERDATA); void *ud = luaL_checkudata(L, narg, className); if (!ud) luaL_typerror(L, narg, className); - + return *(LuaVoxelManip **)ud; // unbox pointer }