Commented out debug statements again
[oweals/minetest.git] / src / map.cpp
index 41c4e17d2cbb5e9bea1bb772da0fe4a3deb65bf7..b1908fe2ea4091b526e4dc98277413c8f1bce09d 100644 (file)
@@ -1408,6 +1408,7 @@ void Map::timerUpdate(float dtime, float unload_timeout,
 
        core::map<v2s16, MapSector*>::Iterator si;
 
+       beginSave();
        si = m_sectors.getIterator();
        for(; si.atEnd() == false; si++)
        {
@@ -1418,7 +1419,6 @@ void Map::timerUpdate(float dtime, float unload_timeout,
                core::list<MapBlock*> blocks;
                sector->getBlocks(blocks);
                
-               beginSave();
                for(core::list<MapBlock*>::Iterator i = blocks.begin();
                                i != blocks.end(); i++)
                {
@@ -1451,13 +1451,13 @@ void Map::timerUpdate(float dtime, float unload_timeout,
                                all_blocks_deleted = false;
                        }
                }
-               endSave();
 
                if(all_blocks_deleted)
                {
                        sector_deletion_queue.push_back(si.getNode()->getKey());
                }
        }
+       endSave();
        
        // Finally delete the empty sectors
        deleteSectors(sector_deletion_queue);
@@ -1894,10 +1894,17 @@ ServerMap::ServerMap(std::string savedir):
 
        //m_chunksize = 8; // Takes a few seconds
 
-       m_seed = (((u64)(myrand()%0xffff)<<0)
-                       + ((u64)(myrand()%0xffff)<<16)
-                       + ((u64)(myrand()%0xffff)<<32)
-                       + ((u64)(myrand()%0xffff)<<48));
+       if (g_settings.get("fixed_map_seed").empty())
+       {
+               m_seed = (((u64)(myrand()%0xffff)<<0)
+                               + ((u64)(myrand()%0xffff)<<16)
+                               + ((u64)(myrand()%0xffff)<<32)
+                               + ((u64)(myrand()%0xffff)<<48));
+       }
+       else
+       {
+               m_seed = g_settings.getU64("fixed_map_seed");
+       }
 
        /*
                Experimental and debug stuff
@@ -2849,8 +2856,9 @@ bool ServerMap::loadFromFolders() {
        return false;
 }
 
-int ServerMap::getBlockAsInteger(const v3s16 pos) {
-       return (pos.Z+2048)*16777216 + (pos.Y+2048)*4096 + pos.X;
+sqlite3_int64 ServerMap::getBlockAsInteger(const v3s16 pos) {
+       return (sqlite3_int64)pos.Z*16777216 +
+               (sqlite3_int64)pos.Y*4096 + (sqlite3_int64)pos.X;
 }
 
 void ServerMap::createDirs(std::string path)
@@ -3318,7 +3326,7 @@ void ServerMap::saveBlock(MapBlock *block)
        std::string tmp = o.str();
        const char *bytes = tmp.c_str();
        
-       if(sqlite3_bind_int(m_database_write, 1, getBlockAsInteger(p3d)) != SQLITE_OK)
+       if(sqlite3_bind_int64(m_database_write, 1, getBlockAsInteger(p3d)) != SQLITE_OK)
                dstream<<"WARNING: Block position failed to bind: "<<sqlite3_errmsg(m_database)<<std::endl;
        if(sqlite3_bind_blob(m_database_write, 2, (void *)bytes, o.tellp(), NULL) != SQLITE_OK) // TODO this mught not be the right length
                dstream<<"WARNING: Block data failed to bind: "<<sqlite3_errmsg(m_database)<<std::endl;
@@ -3389,6 +3397,9 @@ void ServerMap::loadBlock(std::string sectordir, std::string blockfile, MapSecto
                if(version < SER_FMT_VER_HIGHEST || save_after_load)
                {
                        saveBlock(block);
+                       
+                       // Should be in database now, so delete the old file
+                       fs::RecursiveDelete(fullpath);
                }
                
                // We just loaded it from the disk, so it's up-to-date.
@@ -3484,7 +3495,7 @@ MapBlock* ServerMap::loadBlock(v3s16 blockpos)
        if(!loadFromFolders()) {
                verifyDatabase();
                
-               if(sqlite3_bind_int(m_database_read, 1, getBlockAsInteger(blockpos)) != SQLITE_OK)
+               if(sqlite3_bind_int64(m_database_read, 1, getBlockAsInteger(blockpos)) != SQLITE_OK)
                        dstream<<"WARNING: Could not bind block position for load: "
                                <<sqlite3_errmsg(m_database)<<std::endl;
                if(sqlite3_step(m_database_read) == SQLITE_ROW) {
@@ -3593,7 +3604,8 @@ ClientMap::ClientMap(
        m_client(client),
        m_control(control),
        m_camera_position(0,0,0),
-       m_camera_direction(0,0,1)
+       m_camera_direction(0,0,1),
+       m_camera_fov(M_PI)
 {
        m_camera_mutex.Init();
        assert(m_camera_mutex.IsInitialized());
@@ -3702,6 +3714,7 @@ void ClientMap::renderMap(video::IVideoDriver* driver, s32 pass)
        m_camera_mutex.Lock();
        v3f camera_position = m_camera_position;
        v3f camera_direction = m_camera_direction;
+       f32 camera_fov = m_camera_fov;
        m_camera_mutex.Unlock();
 
        /*
@@ -3794,7 +3807,8 @@ void ClientMap::renderMap(video::IVideoDriver* driver, s32 pass)
                        
                        float d = 0.0;
                        if(isBlockInSight(block->getPos(), camera_position,
-                                       camera_direction, range, &d) == false)
+                                       camera_direction, camera_fov,
+                                       range, &d) == false)
                        {
                                continue;
                        }
@@ -3914,6 +3928,35 @@ void ClientMap::renderMap(video::IVideoDriver* driver, s32 pass)
                        <<", rendered "<<vertex_count<<" vertices."<<std::endl;*/
 }
 
+void ClientMap::renderPostFx()
+{
+       // Sadly ISceneManager has no "post effects" render pass, in that case we
+       // could just register for that and handle it in renderMap().
+
+       m_camera_mutex.Lock();
+       v3f camera_position = m_camera_position;
+       m_camera_mutex.Unlock();
+
+       MapNode n = getNodeNoEx(floatToInt(camera_position, BS));
+
+       // - If the player is in a solid node, make everything black.
+       // - If the player is in liquid, draw a semi-transparent overlay.
+       ContentFeatures& features = content_features(n);
+       video::SColor post_effect_color = features.post_effect_color;
+       if(features.solidness == 2 && g_settings.getBool("free_move") == false)
+       {
+               post_effect_color = video::SColor(255, 0, 0, 0);
+       }
+       if (post_effect_color.getAlpha() != 0)
+       {
+               // Draw a full-screen rectangle
+               video::IVideoDriver* driver = SceneManager->getVideoDriver();
+               v2u32 ss = driver->getScreenSize();
+               core::rect<s32> rect(0,0, ss.X, ss.Y);
+               driver->draw2DRectangle(post_effect_color, rect);
+       }
+}
+
 bool ClientMap::setTempMod(v3s16 p, NodeMod mod,
                core::map<v3s16, MapBlock*> *affected_blocks)
 {