Use proper CMakeLists.txt for network and client directories
[oweals/minetest.git] / src / mapblock.h
index 501ab75dafb944132801aa8f256fa05f3c75c34f..76ba94c3437baa9653f5b77428f0db0009ff2749 100644 (file)
@@ -166,6 +166,29 @@ public:
                        }
                }
        }
+       void raiseModified(u32 mod, const char *reason)
+       {
+               if (mod > m_modified){
+                       m_modified = mod;
+                       m_modified_reason = reason;
+                       m_modified_reason_too_long = false;
+
+                       if (m_modified >= MOD_STATE_WRITE_AT_UNLOAD){
+                               m_disk_timestamp = m_timestamp;
+                       }
+               }
+               else if (mod == m_modified){
+                       if (!m_modified_reason_too_long){
+                               if (m_modified_reason.size() < 40)
+                                       m_modified_reason += ", " + std::string(reason);
+                               else{
+                                       m_modified_reason += "...";
+                                       m_modified_reason_too_long = true;
+                               }
+                       }
+               }
+       }
+
        u32 getModified()
        {
                return m_modified;
@@ -251,37 +274,39 @@ public:
                Regular MapNode get-setters
        */
        
+       bool isValidPosition(s16 x, s16 y, s16 z)
+       {
+               return data != NULL
+                               && x >= 0 && x < MAP_BLOCKSIZE
+                               && y >= 0 && y < MAP_BLOCKSIZE
+                               && z >= 0 && z < MAP_BLOCKSIZE;
+       }
+
        bool isValidPosition(v3s16 p)
        {
-               if(data == NULL)
-                       return false;
-               return (p.X >= 0 && p.X < MAP_BLOCKSIZE
-                               && p.Y >= 0 && p.Y < MAP_BLOCKSIZE
-                               && p.Z >= 0 && p.Z < MAP_BLOCKSIZE);
+               return isValidPosition(p.X, p.Y, p.Z);
        }
 
-       MapNode getNode(s16 x, s16 y, s16 z)
+       MapNode getNode(s16 x, s16 y, s16 z, bool *valid_position)
        {
-               if(data == NULL)
-                       throw InvalidPositionException();
-               if(x < 0 || x >= MAP_BLOCKSIZE) throw InvalidPositionException();
-               if(y < 0 || y >= MAP_BLOCKSIZE) throw InvalidPositionException();
-               if(z < 0 || z >= MAP_BLOCKSIZE) throw InvalidPositionException();
+               *valid_position = isValidPosition(x, y, z);
+
+               if (!*valid_position)
+                       return MapNode(CONTENT_IGNORE);
+
                return data[z*MAP_BLOCKSIZE*MAP_BLOCKSIZE + y*MAP_BLOCKSIZE + x];
        }
        
-       MapNode getNode(v3s16 p)
+       MapNode getNode(v3s16 p, bool *valid_position)
        {
-               return getNode(p.X, p.Y, p.Z);
+               return getNode(p.X, p.Y, p.Z, valid_position);
        }
        
        MapNode getNodeNoEx(v3s16 p)
        {
-               try{
-                       return getNode(p.X, p.Y, p.Z);
-               }catch(InvalidPositionException &e){
-                       return MapNode(CONTENT_IGNORE);
-               }
+               bool is_valid;
+               MapNode node = getNode(p.X, p.Y, p.Z, &is_valid);
+               return is_valid ? node : MapNode(CONTENT_IGNORE);
        }
        
        void setNode(s16 x, s16 y, s16 z, MapNode & n)
@@ -304,16 +329,18 @@ public:
                Non-checking variants of the above
        */
 
-       MapNode getNodeNoCheck(s16 x, s16 y, s16 z)
+       MapNode getNodeNoCheck(s16 x, s16 y, s16 z, bool *valid_position)
        {
-               if(data == NULL)
-                       throw InvalidPositionException();
+               *valid_position = data != NULL;
+               if(!valid_position)
+                       return MapNode(CONTENT_IGNORE);
+
                return data[z*MAP_BLOCKSIZE*MAP_BLOCKSIZE + y*MAP_BLOCKSIZE + x];
        }
        
-       MapNode getNodeNoCheck(v3s16 p)
+       MapNode getNodeNoCheck(v3s16 p, bool *valid_position)
        {
-               return getNodeNoCheck(p.X, p.Y, p.Z);
+               return getNodeNoCheck(p.X, p.Y, p.Z, valid_position);
        }
        
        void setNodeNoCheck(s16 x, s16 y, s16 z, MapNode & n)
@@ -334,9 +361,8 @@ public:
                is not valid on this MapBlock.
        */
        bool isValidPositionParent(v3s16 p);
-       MapNode getNodeParent(v3s16 p);
+       MapNode getNodeParent(v3s16 p, bool *is_valid_position = NULL);
        void setNodeParent(v3s16 p, MapNode & n);
-       MapNode getNodeParentNoEx(v3s16 p);
 
        void drawbox(s16 x0, s16 y0, s16 z0, s16 w, s16 h, s16 d, MapNode node)
        {
@@ -421,7 +447,7 @@ public:
        {
                m_usage_timer += dtime;
        }
-       u32 getUsageTimer()
+       float getUsageTimer()
        {
                return m_usage_timer;
        }
@@ -468,6 +494,7 @@ public:
        
        // These don't write or read version by itself
        // Set disk to true for on-disk format, false for over-the-network format
+       // Precondition: version >= SER_FMT_CLIENT_VER_LOWEST
        void serialize(std::ostream &os, u8 version, bool disk);
        // If disk == true: In addition to doing other things, will add
        // unknown blocks from id-name mapping to wndef
@@ -513,11 +540,6 @@ public:
        NodeMetadataList m_node_metadata;
        NodeTimerList m_node_timers;
        StaticObjectList m_static_objects;
-       
-       s16 heat;
-       s16 humidity;
-       u32 heat_last_update;
-       u32 humidity_last_update;
 
 private:
        /*
@@ -592,6 +614,8 @@ private:
        int m_refcount;
 };
 
+typedef std::vector<MapBlock*> MapBlockVect;
+
 inline bool blockpos_over_limit(v3s16 p)
 {
        return
@@ -621,6 +645,16 @@ inline s16 getNodeBlockY(s16 y)
        return getContainerPos(y, MAP_BLOCKSIZE);
 }
 
+inline void getNodeBlockPosWithOffset(const v3s16 &p, v3s16 &block, v3s16 &offset)
+{
+       getContainerPosWithOffset(p, MAP_BLOCKSIZE, block, offset);
+}
+
+inline void getNodeSectorPosWithOffset(const v2s16 &p, v2s16 &block, v2s16 &offset)
+{
+       getContainerPosWithOffset(p, MAP_BLOCKSIZE, block, offset);
+}
+
 /*
        Get a quick string to describe what a block actually contains
 */