LocalPlayer::accelerateHorizontal: cleanups
[oweals/minetest.git] / src / mapblock.cpp
index ecd9a016b45d1d6fc010a699033cfce4b836c4b7..ca589479419438ab7df7ac56ad4822d0058730cc 100644 (file)
@@ -35,8 +35,31 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #endif
 #include "util/string.h"
 #include "util/serialize.h"
+#include "util/basic_macros.h"
+
+static const char *modified_reason_strings[] = {
+       "initial",
+       "reallocate",
+       "setIsUnderground",
+       "setLightingExpired",
+       "setGenerated",
+       "setNode",
+       "setNodeNoCheck",
+       "setTimestamp",
+       "NodeMetaRef::reportMetadataChange",
+       "clearAllObjects",
+       "Timestamp expired (step)",
+       "addActiveObjectRaw",
+       "removeRemovedObjects/remove",
+       "removeRemovedObjects/deactivate",
+       "Stored list cleared in activateObjects due to overflow",
+       "deactivateFarObjects: Static data moved in",
+       "deactivateFarObjects: Static data moved out",
+       "deactivateFarObjects: Static data changed considerably",
+       "finishBlockMake: expireDayNightDiff",
+       "unknown",
+};
 
-#define PP(x) "("<<(x).X<<","<<(x).Y<<","<<(x).Z<<")"
 
 /*
        MapBlock
@@ -45,45 +68,23 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 MapBlock::MapBlock(Map *parent, v3s16 pos, IGameDef *gamedef, bool dummy):
                m_parent(parent),
                m_pos(pos),
-               m_gamedef(gamedef),
-               m_modified(MOD_STATE_WRITE_NEEDED),
-               m_modified_reason("initial"),
-               m_modified_reason_too_long(false),
-               is_underground(false),
-               m_lighting_expired(true),
-               m_day_night_differs(false),
-               m_day_night_differs_expired(true),
-               m_generated(false),
-               m_timestamp(BLOCK_TIMESTAMP_UNDEFINED),
-               m_disk_timestamp(BLOCK_TIMESTAMP_UNDEFINED),
-               m_usage_timer(0),
-               m_refcount(0)
+               m_pos_relative(pos * MAP_BLOCKSIZE),
+               m_gamedef(gamedef)
 {
-       data = NULL;
        if(dummy == false)
                reallocate();
-
-#ifndef SERVER
-       mesh = NULL;
-#endif
 }
 
 MapBlock::~MapBlock()
 {
 #ifndef SERVER
        {
-               //JMutexAutoLock lock(mesh_mutex);
-
-               if(mesh)
-               {
-                       delete mesh;
-                       mesh = NULL;
-               }
+               delete mesh;
+               mesh = nullptr;
        }
 #endif
 
-       if(data)
-               delete[] data;
+       delete[] data;
 }
 
 bool MapBlock::isValidPositionParent(v3s16 p)
@@ -102,14 +103,35 @@ MapNode MapBlock::getNodeParent(v3s16 p, bool *is_valid_position)
        if (isValidPosition(p) == false)
                return m_parent->getNodeNoEx(getPosRelative() + p, is_valid_position);
 
-       if (data == NULL) {
+       if (!data) {
                if (is_valid_position)
                        *is_valid_position = false;
                return MapNode(CONTENT_IGNORE);
        }
        if (is_valid_position)
                *is_valid_position = true;
-       return data[p.Z*MAP_BLOCKSIZE*MAP_BLOCKSIZE + p.Y*MAP_BLOCKSIZE + p.X];
+       return data[p.Z * zstride + p.Y * ystride + p.X];
+}
+
+std::string MapBlock::getModifiedReasonString()
+{
+       std::string reason;
+
+       const u32 ubound = MYMIN(sizeof(m_modified_reason) * CHAR_BIT,
+               ARRLEN(modified_reason_strings));
+
+       for (u32 i = 0; i != ubound; i++) {
+               if ((m_modified_reason & (1 << i)) == 0)
+                       continue;
+
+               reason += modified_reason_strings[i];
+               reason += ", ";
+       }
+
+       if (reason.length() > 2)
+               reason.resize(reason.length() - 2);
+
+       return reason;
 }
 
 /*
@@ -330,11 +352,11 @@ void MapBlock::copyFrom(VoxelManipulator &dst)
 void MapBlock::actuallyUpdateDayNightDiff()
 {
        INodeDefManager *nodemgr = m_gamedef->ndef();
+
        // Running this function un-expires m_day_night_differs
        m_day_night_differs_expired = false;
 
-       if(data == NULL)
-       {
+       if (!data) {
                m_day_night_differs = false;
                return;
        }
@@ -344,33 +366,35 @@ void MapBlock::actuallyUpdateDayNightDiff()
        /*
                Check if any lighting value differs
        */
-       for(u32 i=0; i<MAP_BLOCKSIZE*MAP_BLOCKSIZE*MAP_BLOCKSIZE; i++)
-       {
-               MapNode &n = data[i];
-               if(n.getLight(LIGHTBANK_DAY, nodemgr) != n.getLight(LIGHTBANK_NIGHT, nodemgr))
-               {
-                       differs = true;
+
+       MapNode previous_n(CONTENT_IGNORE);
+       for (u32 i = 0; i < nodecount; i++) {
+               MapNode n = data[i];
+
+               // If node is identical to previous node, don't verify if it differs
+               if (n == previous_n)
+                       continue;
+
+               differs = !n.isLightDayNightEq(nodemgr);
+               if (differs)
                        break;
-               }
+               previous_n = n;
        }
 
        /*
                If some lighting values differ, check if the whole thing is
-               just air. If it is, differ = false
+               just air. If it is just air, differs = false
        */
-       if(differs)
-       {
+       if (differs) {
                bool only_air = true;
-               for(u32 i=0; i<MAP_BLOCKSIZE*MAP_BLOCKSIZE*MAP_BLOCKSIZE; i++)
-               {
+               for (u32 i = 0; i < nodecount; i++) {
                        MapNode &n = data[i];
-                       if(n.getContent() != CONTENT_AIR)
-                       {
+                       if (n.getContent() != CONTENT_AIR) {
                                only_air = false;
                                break;
                        }
                }
-               if(only_air)
+               if (only_air)
                        differs = false;
        }
 
@@ -380,9 +404,7 @@ void MapBlock::actuallyUpdateDayNightDiff()
 
 void MapBlock::expireDayNightDiff()
 {
-       //INodeDefManager *nodemgr = m_gamedef->ndef();
-
-       if(data == NULL){
+       if (!data) {
                m_day_night_differs = false;
                m_day_night_differs_expired = false;
                return;
@@ -426,16 +448,15 @@ s16 MapBlock::getGroundLevel(v2s16 p2d)
 // sure we can handle all content ids. But it's absolutely worth it as it's
 // a speedup of 4 for one of the major time consuming functions on storing
 // mapblocks.
-static content_t getBlockNodeIdMapping_mapping[USHRT_MAX];
+static content_t getBlockNodeIdMapping_mapping[USHRT_MAX + 1];
 static void getBlockNodeIdMapping(NameIdMapping *nimap, MapNode *nodes,
                INodeDefManager *nodedef)
 {
-       memset(getBlockNodeIdMapping_mapping, 0xFF, USHRT_MAX * sizeof(content_t));
+       memset(getBlockNodeIdMapping_mapping, 0xFF, (USHRT_MAX + 1) * sizeof(content_t));
 
        std::set<content_t> unknown_contents;
        content_t id_counter = 0;
-       for(u32 i=0; i<MAP_BLOCKSIZE*MAP_BLOCKSIZE*MAP_BLOCKSIZE; i++)
-       {
+       for (u32 i = 0; i < MapBlock::nodecount; i++) {
                content_t global_id = nodes[i].getContent();
                content_t id = CONTENT_IGNORE;
 
@@ -451,7 +472,7 @@ static void getBlockNodeIdMapping(NameIdMapping *nimap, MapNode *nodes,
 
                        const ContentFeatures &f = nodedef->get(global_id);
                        const std::string &name = f.name;
-                       if(name == "")
+                       if (name.empty())
                                unknown_contents.insert(global_id);
                        else
                                nimap->set(id, name);
@@ -462,7 +483,7 @@ static void getBlockNodeIdMapping(NameIdMapping *nimap, MapNode *nodes,
        }
        for(std::set<content_t>::const_iterator
                        i = unknown_contents.begin();
-                       i != unknown_contents.end(); i++){
+                       i != unknown_contents.end(); ++i){
                errorstream<<"getBlockNodeIdMapping(): IGNORING ERROR: "
                                <<"Name for node id "<<(*i)<<" not known"<<std::endl;
        }
@@ -478,41 +499,57 @@ static void correctBlockNodeIds(const NameIdMapping *nimap, MapNode *nodes,
        // the information to convert those to names.
        // nodedef contains information to convert our names to globally
        // correct ids.
-       std::set<content_t> unnamed_contents;
-       std::set<std::string> unallocatable_contents;
-       for(u32 i=0; i<MAP_BLOCKSIZE*MAP_BLOCKSIZE*MAP_BLOCKSIZE; i++)
-       {
+       std::unordered_set<content_t> unnamed_contents;
+       std::unordered_set<std::string> unallocatable_contents;
+
+       bool previous_exists = false;
+       content_t previous_local_id = CONTENT_IGNORE;
+       content_t previous_global_id = CONTENT_IGNORE;
+
+       for (u32 i = 0; i < MapBlock::nodecount; i++) {
                content_t local_id = nodes[i].getContent();
+               // If previous node local_id was found and same than before, don't lookup maps
+               // apply directly previous resolved id
+               // This permits to massively improve loading performance when nodes are similar
+               // example: default:air, default:stone are massively present
+               if (previous_exists && local_id == previous_local_id) {
+                       nodes[i].setContent(previous_global_id);
+                       continue;
+               }
+
                std::string name;
-               bool found = nimap->getName(local_id, name);
-               if(!found){
+               if (!nimap->getName(local_id, name)) {
                        unnamed_contents.insert(local_id);
+                       previous_exists = false;
                        continue;
                }
+
                content_t global_id;
-               found = nodedef->getId(name, global_id);
-               if(!found){
+               if (!nodedef->getId(name, global_id)) {
                        global_id = gamedef->allocateUnknownNodeId(name);
-                       if(global_id == CONTENT_IGNORE){
+                       if (global_id == CONTENT_IGNORE) {
                                unallocatable_contents.insert(name);
+                               previous_exists = false;
                                continue;
                        }
                }
                nodes[i].setContent(global_id);
+
+               // Save previous node local_id & global_id result
+               previous_local_id = local_id;
+               previous_global_id = global_id;
+               previous_exists = true;
        }
-       for(std::set<content_t>::const_iterator
-                       i = unnamed_contents.begin();
-                       i != unnamed_contents.end(); i++){
-               errorstream<<"correctBlockNodeIds(): IGNORING ERROR: "
-                               <<"Block contains id "<<(*i)
-                               <<" with no name mapping"<<std::endl;
+
+       for (const content_t c: unnamed_contents) {
+               errorstream << "correctBlockNodeIds(): IGNORING ERROR: "
+                               << "Block contains id " << c
+                               << " with no name mapping" << std::endl;
        }
-       for(std::set<std::string>::const_iterator
-                       i = unallocatable_contents.begin();
-                       i != unallocatable_contents.end(); i++){
-               errorstream<<"correctBlockNodeIds(): IGNORING ERROR: "
-                               <<"Could not allocate global id for node name \""
-                               <<(*i)<<"\""<<std::endl;
+       for (const std::string &node_name: unallocatable_contents) {
+               errorstream << "correctBlockNodeIds(): IGNORING ERROR: "
+                               << "Could not allocate global id for node name \""
+                               << node_name << "\"" << std::endl;
        }
 }
 
@@ -521,12 +558,10 @@ void MapBlock::serialize(std::ostream &os, u8 version, bool disk)
        if(!ser_ver_supported(version))
                throw VersionMismatchException("ERROR: MapBlock format not supported");
 
-       if(data == NULL)
-       {
+       if (!data)
                throw SerializationError("ERROR: Not writing dummy block.");
-       }
 
-       assert(version >= SER_FMT_CLIENT_VER_LOWEST);
+       FATAL_ERROR_IF(version < SER_FMT_VER_LOWEST_WRITE, "Serialisation version error");
 
        // First byte
        u8 flags = 0;
@@ -534,17 +569,17 @@ void MapBlock::serialize(std::ostream &os, u8 version, bool disk)
                flags |= 0x01;
        if(getDayNightDiff())
                flags |= 0x02;
-       if(m_lighting_expired)
-               flags |= 0x04;
        if(m_generated == false)
                flags |= 0x08;
        writeU8(os, flags);
+       if (version >= 27) {
+               writeU16(os, m_lighting_complete);
+       }
 
        /*
                Bulk node data
        */
        NameIdMapping nimap;
-       u32 nodecount = MAP_BLOCKSIZE*MAP_BLOCKSIZE*MAP_BLOCKSIZE;
        if(disk)
        {
                MapNode *tmp_nodes = new MapNode[nodecount];
@@ -574,7 +609,7 @@ void MapBlock::serialize(std::ostream &os, u8 version, bool disk)
                Node metadata
        */
        std::ostringstream oss(std::ios_base::binary);
-       m_node_metadata.serialize(oss);
+       m_node_metadata.serialize(oss, version, disk);
        compressZlib(oss.str(), os);
 
        /*
@@ -603,19 +638,15 @@ void MapBlock::serialize(std::ostream &os, u8 version, bool disk)
        }
 }
 
-void MapBlock::serializeNetworkSpecific(std::ostream &os, u16 net_proto_version)
+void MapBlock::serializeNetworkSpecific(std::ostream &os)
 {
-       if(data == NULL)
-       {
+       if (!data) {
                throw SerializationError("ERROR: Not writing dummy block.");
        }
 
-       if(net_proto_version >= 21){
-               int version = 1;
-               writeU8(os, version);
-               writeF1000(os, 0); // deprecated heat
-               writeF1000(os, 0); // deprecated humidity
-       }
+       writeU8(os, 1); // version
+       writeF1000(os, 0); // deprecated heat
+       writeF1000(os, 0); // deprecated humidity
 }
 
 void MapBlock::deSerialize(std::istream &is, u8 version, bool disk)
@@ -636,7 +667,10 @@ void MapBlock::deSerialize(std::istream &is, u8 version, bool disk)
        u8 flags = readU8(is);
        is_underground = (flags & 0x01) ? true : false;
        m_day_night_differs = (flags & 0x02) ? true : false;
-       m_lighting_expired = (flags & 0x04) ? true : false;
+       if (version < 27)
+               m_lighting_complete = 0xFFFF;
+       else
+               m_lighting_complete = readU16(is);
        m_generated = (flags & 0x08) ? false : true;
 
        /*
@@ -644,7 +678,6 @@ void MapBlock::deSerialize(std::istream &is, u8 version, bool disk)
        */
        TRACESTREAM(<<"MapBlock::deSerialize "<<PP(getPos())
                        <<": Bulk node data"<<std::endl);
-       u32 nodecount = MAP_BLOCKSIZE*MAP_BLOCKSIZE*MAP_BLOCKSIZE;
        u8 content_width = readU8(is);
        u8 params_width = readU8(is);
        if(content_width != 1 && content_width != 2)
@@ -660,20 +693,18 @@ void MapBlock::deSerialize(std::istream &is, u8 version, bool disk)
        TRACESTREAM(<<"MapBlock::deSerialize "<<PP(getPos())
                        <<": Node metadata"<<std::endl);
        // Ignore errors
-       try{
+       try {
                std::ostringstream oss(std::ios_base::binary);
                decompressZlib(is, oss);
                std::istringstream iss(oss.str(), std::ios_base::binary);
-               if(version >= 23)
-                       m_node_metadata.deSerialize(iss, m_gamedef);
+               if (version >= 23)
+                       m_node_metadata.deSerialize(iss, m_gamedef->idef());
                else
                        content_nodemeta_deserialize_legacy(iss,
-                                       &m_node_metadata, &m_node_timers,
-                                       m_gamedef);
-       }
-       catch(SerializationError &e)
-       {
-               errorstream<<"WARNING: MapBlock::deSerialize(): Ignoring an error"
+                               &m_node_metadata, &m_node_timers,
+                               m_gamedef->idef());
+       } catch(SerializationError &e) {
+               warningstream<<"MapBlock::deSerialize(): Ignoring an error"
                                <<" while deserializing node metadata at ("
                                <<PP(getPos())<<": "<<e.what()<<std::endl;
        }
@@ -736,7 +767,7 @@ void MapBlock::deSerializeNetworkSpecific(std::istream &is)
        }
        catch(SerializationError &e)
        {
-               errorstream<<"WARNING: MapBlock::deSerializeNetworkSpecific(): Ignoring an error"
+               warningstream<<"MapBlock::deSerializeNetworkSpecific(): Ignoring an error"
                                <<": "<<e.what()<<std::endl;
        }
 }
@@ -747,12 +778,10 @@ void MapBlock::deSerializeNetworkSpecific(std::istream &is)
 
 void MapBlock::deSerialize_pre22(std::istream &is, u8 version, bool disk)
 {
-       u32 nodecount = MAP_BLOCKSIZE*MAP_BLOCKSIZE*MAP_BLOCKSIZE;
-
        // Initialize default flags
        is_underground = false;
        m_day_night_differs = false;
-       m_lighting_expired = false;
+       m_lighting_complete = 0xFFFF;
        m_generated = true;
 
        // Make a temporary buffer
@@ -760,23 +789,20 @@ void MapBlock::deSerialize_pre22(std::istream &is, u8 version, bool disk)
        SharedBuffer<u8> databuf_nodelist(nodecount * ser_length);
 
        // These have no compression
-       if(version <= 3 || version == 5 || version == 6)
-       {
+       if (version <= 3 || version == 5 || version == 6) {
                char tmp;
                is.read(&tmp, 1);
-               if(is.gcount() != 1)
-                       throw SerializationError
-                                       ("MapBlock::deSerialize: no enough input data");
+               if (is.gcount() != 1)
+                       throw SerializationError(std::string(FUNCTION_NAME)
+                               + ": not enough input data");
                is_underground = tmp;
-               is.read((char*)*databuf_nodelist, nodecount * ser_length);
-               if((u32)is.gcount() != nodecount * ser_length)
-                       throw SerializationError
-                                       ("MapBlock::deSerialize: no enough input data");
-       }
-       else if(version <= 10)
-       {
+               is.read((char *)*databuf_nodelist, nodecount * ser_length);
+               if ((u32)is.gcount() != nodecount * ser_length)
+                       throw SerializationError(std::string(FUNCTION_NAME)
+                               + ": not enough input data");
+       } else if (version <= 10) {
                u8 t8;
-               is.read((char*)&t8, 1);
+               is.read((char *)&t8, 1);
                is_underground = t8;
 
                {
@@ -784,11 +810,10 @@ void MapBlock::deSerialize_pre22(std::istream &is, u8 version, bool disk)
                        std::ostringstream os(std::ios_base::binary);
                        decompress(is, os, version);
                        std::string s = os.str();
-                       if(s.size() != nodecount)
-                               throw SerializationError
-                                               ("MapBlock::deSerialize: invalid format");
-                       for(u32 i=0; i<s.size(); i++)
-                       {
+                       if (s.size() != nodecount)
+                               throw SerializationError(std::string(FUNCTION_NAME)
+                                       + ": not enough input data");
+                       for (u32 i = 0; i < s.size(); i++) {
                                databuf_nodelist[i*ser_length] = s[i];
                        }
                }
@@ -797,38 +822,31 @@ void MapBlock::deSerialize_pre22(std::istream &is, u8 version, bool disk)
                        std::ostringstream os(std::ios_base::binary);
                        decompress(is, os, version);
                        std::string s = os.str();
-                       if(s.size() != nodecount)
-                               throw SerializationError
-                                               ("MapBlock::deSerialize: invalid format");
-                       for(u32 i=0; i<s.size(); i++)
-                       {
+                       if (s.size() != nodecount)
+                               throw SerializationError(std::string(FUNCTION_NAME)
+                                       + ": not enough input data");
+                       for (u32 i = 0; i < s.size(); i++) {
                                databuf_nodelist[i*ser_length + 1] = s[i];
                        }
                }
 
-               if(version >= 10)
-               {
+               if (version >= 10) {
                        // Uncompress and set param2 data
                        std::ostringstream os(std::ios_base::binary);
                        decompress(is, os, version);
                        std::string s = os.str();
-                       if(s.size() != nodecount)
-                               throw SerializationError
-                                               ("MapBlock::deSerialize: invalid format");
-                       for(u32 i=0; i<s.size(); i++)
-                       {
+                       if (s.size() != nodecount)
+                               throw SerializationError(std::string(FUNCTION_NAME)
+                                       + ": not enough input data");
+                       for (u32 i = 0; i < s.size(); i++) {
                                databuf_nodelist[i*ser_length + 2] = s[i];
                        }
                }
-       }
-       // All other versions (newest)
-       else
-       {
+       } else { // All other versions (10 to 21)
                u8 flags;
                is.read((char*)&flags, 1);
                is_underground = (flags & 0x01) ? true : false;
                m_day_night_differs = (flags & 0x02) ? true : false;
-               m_lighting_expired = (flags & 0x04) ? true : false;
                if(version >= 18)
                        m_generated = (flags & 0x08) ? false : true;
 
@@ -836,14 +854,12 @@ void MapBlock::deSerialize_pre22(std::istream &is, u8 version, bool disk)
                std::ostringstream os(std::ios_base::binary);
                decompress(is, os, version);
                std::string s = os.str();
-               if(s.size() != nodecount*3)
-                       throw SerializationError
-                                       ("MapBlock::deSerialize: decompress resulted in size"
-                                       " other than nodecount*3");
+               if (s.size() != nodecount * 3)
+                       throw SerializationError(std::string(FUNCTION_NAME)
+                               + ": decompress resulted in size other than nodecount*3");
 
                // deserialize nodes from buffer
-               for(u32 i=0; i<nodecount; i++)
-               {
+               for (u32 i = 0; i < nodecount; i++) {
                        databuf_nodelist[i*ser_length] = s[i];
                        databuf_nodelist[i*ser_length + 1] = s[i+nodecount];
                        databuf_nodelist[i*ser_length + 2] = s[i+nodecount*2];
@@ -852,53 +868,45 @@ void MapBlock::deSerialize_pre22(std::istream &is, u8 version, bool disk)
                /*
                        NodeMetadata
                */
-               if(version >= 14)
-               {
+               if (version >= 14) {
                        // Ignore errors
-                       try{
-                               if(version <= 15)
-                               {
+                       try {
+                               if (version <= 15) {
                                        std::string data = deSerializeString(is);
                                        std::istringstream iss(data, std::ios_base::binary);
                                        content_nodemeta_deserialize_legacy(iss,
-                                                       &m_node_metadata, &m_node_timers,
-                                                       m_gamedef);
-                               }
-                               else
-                               {
+                                               &m_node_metadata, &m_node_timers,
+                                               m_gamedef->idef());
+                               } else {
                                        //std::string data = deSerializeLongString(is);
                                        std::ostringstream oss(std::ios_base::binary);
                                        decompressZlib(is, oss);
                                        std::istringstream iss(oss.str(), std::ios_base::binary);
                                        content_nodemeta_deserialize_legacy(iss,
-                                                       &m_node_metadata, &m_node_timers,
-                                                       m_gamedef);
+                                               &m_node_metadata, &m_node_timers,
+                                               m_gamedef->idef());
                                }
-                       }
-                       catch(SerializationError &e)
-                       {
-                               errorstream<<"WARNING: MapBlock::deSerialize(): Ignoring an error"
+                       } catch(SerializationError &e) {
+                               warningstream<<"MapBlock::deSerialize(): Ignoring an error"
                                                <<" while deserializing node metadata"<<std::endl;
                        }
                }
        }
 
        // Deserialize node data
-       for(u32 i=0; i<nodecount; i++)
-       {
-               data[i].deSerialize(&databuf_nodelist[i*ser_length], version);
+       for (u32 i = 0; i < nodecount; i++) {
+               data[i].deSerialize(&databuf_nodelist[i * ser_length], version);
        }
 
-       if(disk)
-       {
+       if (disk) {
                /*
                        Versions up from 9 have block objects. (DEPRECATED)
                */
-               if(version >= 9){
+               if (version >= 9) {
                        u16 count = readU16(is);
                        // Not supported and length not known if count is not 0
                        if(count != 0){
-                               errorstream<<"WARNING: MapBlock::deSerialize_pre22(): "
+                               warningstream<<"MapBlock::deSerialize_pre22(): "
                                                <<"Ignoring stuff coming at and after MBOs"<<std::endl;
                                return;
                        }
@@ -907,11 +915,11 @@ void MapBlock::deSerialize_pre22(std::istream &is, u8 version, bool disk)
                /*
                        Versions up from 15 have static objects.
                */
-               if(version >= 15)
+               if (version >= 15)
                        m_static_objects.deSerialize(is);
 
                // Timestamp
-               if(version >= 17){
+               if (version >= 17) {
                        setTimestamp(readU32(is));
                        m_disk_timestamp = m_timestamp;
                } else {
@@ -921,7 +929,7 @@ void MapBlock::deSerialize_pre22(std::istream &is, u8 version, bool disk)
                // Dynamically re-set ids based on node names
                NameIdMapping nimap;
                // If supported, read node definition id mapping
-               if(version >= 21){
+               if (version >= 21) {
                        nimap.deSerialize(is);
                // Else set the legacy mapping
                } else {
@@ -987,8 +995,8 @@ std::string analyze_block(MapBlock *block)
        std::ostringstream desc;
 
        v3s16 p = block->getPos();
-       char spos[20];
-       snprintf(spos, 20, "(%2d,%2d,%2d), ", p.X, p.Y, p.Z);
+       char spos[25];
+       snprintf(spos, sizeof(spos), "(%2d,%2d,%2d), ", p.X, p.Y, p.Z);
        desc<<spos;
 
        switch(block->getModified())
@@ -1016,10 +1024,7 @@ std::string analyze_block(MapBlock *block)
        else
                desc<<"is_ug [ ], ";
 
-       if(block->getLightingExpired())
-               desc<<"lighting_exp [X], ";
-       else
-               desc<<"lighting_exp [ ], ";
+       desc<<"lighting_complete: "<<block->getLightingComplete()<<", ";
 
        if(block->isDummy())
        {