]> git.lizzy.rs Git - minetest.git/blobdiff - src/mapblock.cpp
New kind of tool speed and wear calculation thingy
[minetest.git] / src / mapblock.cpp
index 49d215bf6d5b2f14a7a1eff78a4595533b9fd57d..012cbd4d10dd4797f9c13873bc53190db2de95c9 100644 (file)
@@ -23,12 +23,15 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "main.h"
 #include "light.h"
 #include <sstream>
+#include "mapnode_contentfeatures.h"
+#include "nodemetadata.h"
 
 /*
        MapBlock
 */
 
 MapBlock::MapBlock(Map *parent, v3s16 pos, bool dummy):
+               m_node_metadata(new NodeMetadataList),
                m_parent(parent),
                m_pos(pos),
                m_modified(MOD_STATE_WRITE_NEEDED),
@@ -36,7 +39,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)
 {
@@ -44,8 +46,6 @@ MapBlock::MapBlock(Map *parent, v3s16 pos, bool dummy):
        if(dummy == false)
                reallocate();
        
-       //m_spawn_timer = -10000;
-
 #ifndef SERVER
        m_mesh_expired = false;
        mesh_mutex.Init();
@@ -68,6 +68,8 @@ MapBlock::~MapBlock()
        }
 #endif
 
+       delete m_node_metadata;
+
        if(data)
                delete[] data;
 }
@@ -434,17 +436,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)
@@ -643,7 +634,7 @@ void MapBlock::serialize(std::ostream &os, u8 version)
                        {
                                try{
                                        std::ostringstream oss(std::ios_base::binary);
-                                       m_node_metadata.serialize(oss);
+                                       m_node_metadata->serialize(oss);
                                        os<<serializeString(oss.str());
                                }
                                // This will happen if the string is longer than 65535
@@ -656,7 +647,7 @@ void MapBlock::serialize(std::ostream &os, u8 version)
                        else
                        {
                                std::ostringstream oss(std::ios_base::binary);
-                               m_node_metadata.serialize(oss);
+                               m_node_metadata->serialize(oss);
                                compressZlib(oss.str(), os);
                                //os<<serializeLongString(oss.str());
                        }
@@ -795,7 +786,7 @@ void MapBlock::deSerialize(std::istream &is, u8 version)
                                {
                                        std::string data = deSerializeString(is);
                                        std::istringstream iss(data, std::ios_base::binary);
-                                       m_node_metadata.deSerialize(iss);
+                                       m_node_metadata->deSerialize(iss);
                                }
                                else
                                {
@@ -803,7 +794,7 @@ void MapBlock::deSerialize(std::istream &is, u8 version)
                                        std::ostringstream oss(std::ios_base::binary);
                                        decompressZlib(is, oss);
                                        std::istringstream iss(oss.str(), std::ios_base::binary);
-                                       m_node_metadata.deSerialize(iss);
+                                       m_node_metadata->deSerialize(iss);
                                }
                        }
                        catch(SerializationError &e)
@@ -817,10 +808,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 +831,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 +863,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