Fix a memleak pointed by @Zeno- in MeshUpdateQueue
[oweals/minetest.git] / src / mapblock.cpp
index 942457407494f5b70003b81b1a1d3e53b8fb6d3b..ec10a49bb8c83a5346caca9dd385659eea995072 100644 (file)
@@ -35,8 +35,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #endif
 #include "util/string.h"
 #include "util/serialize.h"
-
-#define PP(x) "("<<(x).X<<","<<(x).Y<<","<<(x).Z<<")"
+#include "util/basic_macros.h"
 
 static const char *modified_reason_strings[] = {
        "initial",
@@ -74,7 +73,7 @@ MapBlock::MapBlock(Map *parent, v3s16 pos, IGameDef *gamedef, bool dummy):
                m_modified(MOD_STATE_WRITE_NEEDED),
                m_modified_reason(MOD_REASON_INITIAL),
                is_underground(false),
-               m_lighting_expired(true),
+               m_lighting_complete(0xFFFF),
                m_day_night_differs(false),
                m_day_night_differs_expired(true),
                m_generated(false),
@@ -572,11 +571,12 @@ 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
@@ -611,7 +611,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);
 
        /*
@@ -640,19 +640,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)
@@ -673,7 +669,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;
 
        /*
@@ -707,7 +706,7 @@ void MapBlock::deSerialize(std::istream &is, u8 version, bool disk)
                                &m_node_metadata, &m_node_timers,
                                m_gamedef->idef());
        } catch(SerializationError &e) {
-               errorstream<<"WARNING: MapBlock::deSerialize(): Ignoring an error"
+               warningstream<<"MapBlock::deSerialize(): Ignoring an error"
                                <<" while deserializing node metadata at ("
                                <<PP(getPos())<<": "<<e.what()<<std::endl;
        }
@@ -770,7 +769,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;
        }
 }
@@ -784,7 +783,7 @@ void MapBlock::deSerialize_pre22(std::istream &is, u8 version, bool disk)
        // 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
@@ -796,13 +795,13 @@ void MapBlock::deSerialize_pre22(std::istream &is, u8 version, bool disk)
                char tmp;
                is.read(&tmp, 1);
                if (is.gcount() != 1)
-                       throw SerializationError(std::string(__FUNCTION_NAME)
-                               + ": no enough input data");
+                       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(std::string(__FUNCTION_NAME)
-                               + ": no enough input data");
+                       throw SerializationError(std::string(FUNCTION_NAME)
+                               + ": not enough input data");
        } else if (version <= 10) {
                u8 t8;
                is.read((char *)&t8, 1);
@@ -814,8 +813,8 @@ void MapBlock::deSerialize_pre22(std::istream &is, u8 version, bool disk)
                        decompress(is, os, version);
                        std::string s = os.str();
                        if (s.size() != nodecount)
-                               throw SerializationError(std::string(__FUNCTION_NAME)
-                                       + ": no enough input data");
+                               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];
                        }
@@ -826,8 +825,8 @@ void MapBlock::deSerialize_pre22(std::istream &is, u8 version, bool disk)
                        decompress(is, os, version);
                        std::string s = os.str();
                        if (s.size() != nodecount)
-                               throw SerializationError(std::string(__FUNCTION_NAME)
-                                       + ": no enough input data");
+                               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];
                        }
@@ -839,8 +838,8 @@ void MapBlock::deSerialize_pre22(std::istream &is, u8 version, bool disk)
                        decompress(is, os, version);
                        std::string s = os.str();
                        if (s.size() != nodecount)
-                               throw SerializationError(std::string(__FUNCTION_NAME)
-                                       + ": no enough input data");
+                               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];
                        }
@@ -850,7 +849,6 @@ void MapBlock::deSerialize_pre22(std::istream &is, u8 version, bool disk)
                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;
 
@@ -859,7 +857,7 @@ void MapBlock::deSerialize_pre22(std::istream &is, u8 version, bool disk)
                decompress(is, os, version);
                std::string s = os.str();
                if (s.size() != nodecount * 3)
-                       throw SerializationError(std::string(__FUNCTION_NAME)
+                       throw SerializationError(std::string(FUNCTION_NAME)
                                + ": decompress resulted in size other than nodecount*3");
 
                // deserialize nodes from buffer
@@ -891,7 +889,7 @@ void MapBlock::deSerialize_pre22(std::istream &is, u8 version, bool disk)
                                                m_gamedef->idef());
                                }
                        } catch(SerializationError &e) {
-                               errorstream<<"WARNING: MapBlock::deSerialize(): Ignoring an error"
+                               warningstream<<"MapBlock::deSerialize(): Ignoring an error"
                                                <<" while deserializing node metadata"<<std::endl;
                        }
                }
@@ -910,7 +908,7 @@ void MapBlock::deSerialize_pre22(std::istream &is, u8 version, bool disk)
                        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;
                        }
@@ -1028,10 +1026,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())
        {