Fix issue 1527
authorCraig Robbins <crobbins@localhost.localdomain>
Wed, 30 Jul 2014 01:39:24 +0000 (11:39 +1000)
committerkwolekr <kwolekr@minetest.net>
Wed, 30 Jul 2014 02:39:39 +0000 (22:39 -0400)
https://github.com/minetest/minetest/issues/1527

src/script/lua_api/l_vmanip.cpp

index b48b3a8f1d42c60dd3a0f03a43228cf61a058e27..f3c1fa67ae0869b55cffcb1860ea4980440fe834 100644 (file)
@@ -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<v3s16, MapBlock *> lighting_mblocks;
        std::map<v3s16, MapBlock *> *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
 }