Fix water-glass and water-lava surfaces
[oweals/minetest.git] / src / mapblock.cpp
index 49d215bf6d5b2f14a7a1eff78a4595533b9fd57d..dd47c6ffc28aa4c01c8ad6c1b66ae91bd5e776c1 100644 (file)
@@ -36,7 +36,6 @@ MapBlock::MapBlock(Map *parent, v3s16 pos, bool dummy):
                m_lighting_expired(true),
                m_day_night_differs(false),
                m_generated(false),
-               m_objects(this),
                m_timestamp(BLOCK_TIMESTAMP_UNDEFINED),
                m_usage_timer(0)
 {
@@ -434,17 +433,6 @@ void MapBlock::copyFrom(VoxelManipulator &dst)
                        getPosRelative(), data_size);
 }
 
-void MapBlock::stepObjects(float dtime, bool server, u32 daynight_ratio)
-{
-       /*
-               Step objects
-       */
-       m_objects.step(dtime, server, daynight_ratio);
-
-       setChangedFlag();
-}
-
-
 void MapBlock::updateDayNightDiff()
 {
        if(data == NULL)
@@ -817,10 +805,9 @@ void MapBlock::deSerialize(std::istream &is, u8 version)
 
 void MapBlock::serializeDiskExtra(std::ostream &os, u8 version)
 {
-       // Versions up from 9 have block objects.
+       // Versions up from 9 have block objects. (DEPRECATED)
        if(version >= 9)
        {
-               //serializeObjects(os, version); // DEPRECATED
                // count=0
                writeU16(os, 0);
        }
@@ -841,11 +828,17 @@ void MapBlock::serializeDiskExtra(std::ostream &os, u8 version)
 void MapBlock::deSerializeDiskExtra(std::istream &is, u8 version)
 {
        /*
-               Versions up from 9 have block objects.
+               Versions up from 9 have block objects. (DEPRECATED)
        */
        if(version >= 9)
        {
-               updateObjects(is, version, NULL, 0);
+               u16 count = readU16(is);
+               // Not supported and length not known if count is not 0
+               if(count != 0){
+                       dstream<<"WARNING: MapBlock::deSerializeDiskExtra(): "
+                                       <<"Ignoring stuff coming at and after MBOs"<<std::endl;
+                       return;
+               }
        }
 
        /*
@@ -867,5 +860,130 @@ void MapBlock::deSerializeDiskExtra(std::istream &is, u8 version)
        }
 }
 
+/*
+       Get a quick string to describe what a block actually contains
+*/
+std::string analyze_block(MapBlock *block)
+{
+       if(block == NULL)
+       {
+               return "NULL";
+       }
+
+       std::ostringstream desc;
+       
+       v3s16 p = block->getPos();
+       char spos[20];
+       snprintf(spos, 20, "(%2d,%2d,%2d), ", p.X, p.Y, p.Z);
+       desc<<spos;
+       
+       switch(block->getModified())
+       {
+       case MOD_STATE_CLEAN:
+               desc<<"CLEAN,           ";
+               break;
+       case MOD_STATE_WRITE_AT_UNLOAD:
+               desc<<"WRITE_AT_UNLOAD, ";
+               break;
+       case MOD_STATE_WRITE_NEEDED:
+               desc<<"WRITE_NEEDED,    ";
+               break;
+       default:
+               desc<<"unknown getModified()="+itos(block->getModified())+", ";
+       }
+
+       if(block->isGenerated())
+               desc<<"is_gen [X], ";
+       else
+               desc<<"is_gen [ ], ";
+
+       if(block->getIsUnderground())
+               desc<<"is_ug [X], ";
+       else
+               desc<<"is_ug [ ], ";
+
+#ifndef SERVER
+       if(block->getMeshExpired())
+               desc<<"mesh_exp [X], ";
+       else
+               desc<<"mesh_exp [ ], ";
+#endif
+
+       if(block->getLightingExpired())
+               desc<<"lighting_exp [X], ";
+       else
+               desc<<"lighting_exp [ ], ";
+
+       if(block->isDummy())
+       {
+               desc<<"Dummy, ";
+       }
+       else
+       {
+               // We'll just define the numbers here, don't want to include
+               // content_mapnode.h
+               const content_t content_water = 2;
+               const content_t content_watersource = 9;
+               const content_t content_tree = 0x801;
+               const content_t content_leaves = 0x802;
+               const content_t content_jungletree = 0x815;
+
+               bool full_ignore = true;
+               bool some_ignore = false;
+               bool full_air = true;
+               bool some_air = false;
+               bool trees = false;
+               bool water = false;
+               for(s16 z0=0; z0<MAP_BLOCKSIZE; z0++)
+               for(s16 y0=0; y0<MAP_BLOCKSIZE; y0++)
+               for(s16 x0=0; x0<MAP_BLOCKSIZE; x0++)
+               {
+                       v3s16 p(x0,y0,z0);
+                       MapNode n = block->getNode(p);
+                       content_t c = n.getContent();
+                       if(c == CONTENT_IGNORE)
+                               some_ignore = true;
+                       else
+                               full_ignore = false;
+                       if(c == CONTENT_AIR)
+                               some_air = true;
+                       else
+                               full_air = false;
+                       if(c == content_tree || c == content_jungletree
+                                       || c == content_leaves)
+                               trees = true;
+                       if(c == content_water
+                                       || c == content_watersource)
+                               water = true;
+               }
+               
+               desc<<"content {";
+               
+               std::ostringstream ss;
+               
+               if(full_ignore)
+                       ss<<"IGNORE (full), ";
+               else if(some_ignore)
+                       ss<<"IGNORE, ";
+               
+               if(full_air)
+                       ss<<"AIR (full), ";
+               else if(some_air)
+                       ss<<"AIR, ";
+
+               if(trees)
+                       ss<<"trees, ";
+               if(water)
+                       ss<<"water, ";
+               
+               if(ss.str().size()>=2)
+                       desc<<ss.str().substr(0, ss.str().size()-2);
+
+               desc<<"}, ";
+       }
+
+       return desc.str().substr(0, desc.str().size()-2);
+}
+
 
 //END