]> git.lizzy.rs Git - minetest.git/blobdiff - src/nodedef.cpp
Update ContentFeatures serialization format now as PROTOCOL_VERSION was changed
[minetest.git] / src / nodedef.cpp
index d0ce3c19d1fe7706f2a076d82c464100ff61a04f..38c04a59da555bec7fd8de1d85460ca425c2e2e7 100644 (file)
@@ -27,39 +27,80 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "log.h"
 #include "settings.h"
 #include "nameidmapping.h"
+#include "util/serialize.h"
 
 /*
        NodeBox
 */
 
+void NodeBox::reset()
+{
+       type = NODEBOX_REGULAR;
+       // default is empty
+       fixed.clear();
+       // default is sign/ladder-like
+       wall_top = aabb3f(-BS/2, BS/2-BS/16., -BS/2, BS/2, BS/2, BS/2);
+       wall_bottom = aabb3f(-BS/2, -BS/2, -BS/2, BS/2, -BS/2+BS/16., BS/2);
+       wall_side = aabb3f(-BS/2, -BS/2, -BS/2, -BS/2+BS/16., BS/2, BS/2);
+}
+
 void NodeBox::serialize(std::ostream &os) const
 {
-       writeU8(os, 0); // version
+       writeU8(os, 1); // version
        writeU8(os, type);
-       writeV3F1000(os, fixed.MinEdge);
-       writeV3F1000(os, fixed.MaxEdge);
-       writeV3F1000(os, wall_top.MinEdge);
-       writeV3F1000(os, wall_top.MaxEdge);
-       writeV3F1000(os, wall_bottom.MinEdge);
-       writeV3F1000(os, wall_bottom.MaxEdge);
-       writeV3F1000(os, wall_side.MinEdge);
-       writeV3F1000(os, wall_side.MaxEdge);
+
+       if(type == NODEBOX_FIXED)
+       {
+               writeU16(os, fixed.size());
+               for(std::vector<aabb3f>::const_iterator
+                               i = fixed.begin();
+                               i != fixed.end(); i++)
+               {
+                       writeV3F1000(os, i->MinEdge);
+                       writeV3F1000(os, i->MaxEdge);
+               }
+       }
+       else if(type == NODEBOX_WALLMOUNTED)
+       {
+               writeV3F1000(os, wall_top.MinEdge);
+               writeV3F1000(os, wall_top.MaxEdge);
+               writeV3F1000(os, wall_bottom.MinEdge);
+               writeV3F1000(os, wall_bottom.MaxEdge);
+               writeV3F1000(os, wall_side.MinEdge);
+               writeV3F1000(os, wall_side.MaxEdge);
+       }
 }
 
 void NodeBox::deSerialize(std::istream &is)
 {
        int version = readU8(is);
-       if(version != 0)
+       if(version != 1)
                throw SerializationError("unsupported NodeBox version");
+
+       reset();
+
        type = (enum NodeBoxType)readU8(is);
-       fixed.MinEdge = readV3F1000(is);
-       fixed.MaxEdge = readV3F1000(is);
-       wall_top.MinEdge = readV3F1000(is);
-       wall_top.MaxEdge = readV3F1000(is);
-       wall_bottom.MinEdge = readV3F1000(is);
-       wall_bottom.MaxEdge = readV3F1000(is);
-       wall_side.MinEdge = readV3F1000(is);
-       wall_side.MaxEdge = readV3F1000(is);
+
+       if(type == NODEBOX_FIXED)
+       {
+               u16 fixed_count = readU16(is);
+               while(fixed_count--)
+               {
+                       aabb3f box;
+                       box.MinEdge = readV3F1000(is);
+                       box.MaxEdge = readV3F1000(is);
+                       fixed.push_back(box);
+               }
+       }
+       else if(type == NODEBOX_WALLMOUNTED)
+       {
+               wall_top.MinEdge = readV3F1000(is);
+               wall_top.MaxEdge = readV3F1000(is);
+               wall_bottom.MinEdge = readV3F1000(is);
+               wall_bottom.MaxEdge = readV3F1000(is);
+               wall_side.MinEdge = readV3F1000(is);
+               wall_side.MaxEdge = readV3F1000(is);
+       }
 }
 
 /*
@@ -162,8 +203,10 @@ void ContentFeatures::reset()
        liquid_alternative_flowing = "";
        liquid_alternative_source = "";
        liquid_viscosity = 0;
+       liquid_renewable = true;
        light_source = 0;
        damage_per_second = 0;
+       node_box = NodeBox();
        selection_box = NodeBox();
        legacy_facedir_simple = false;
        legacy_wallmounted = false;
@@ -174,7 +217,7 @@ void ContentFeatures::reset()
 
 void ContentFeatures::serialize(std::ostream &os)
 {
-       writeU8(os, 4); // version
+       writeU8(os, 6); // version
        os<<serializeString(name);
        writeU16(os, groups.size());
        for(ItemGroupList::const_iterator
@@ -211,20 +254,24 @@ void ContentFeatures::serialize(std::ostream &os)
        os<<serializeString(liquid_alternative_flowing);
        os<<serializeString(liquid_alternative_source);
        writeU8(os, liquid_viscosity);
+       writeU8(os, liquid_renewable);
        writeU8(os, light_source);
        writeU32(os, damage_per_second);
+       node_box.serialize(os);
        selection_box.serialize(os);
        writeU8(os, legacy_facedir_simple);
        writeU8(os, legacy_wallmounted);
        serializeSimpleSoundSpec(sound_footstep, os);
        serializeSimpleSoundSpec(sound_dig, os);
        serializeSimpleSoundSpec(sound_dug, os);
+       // Stuff below should be moved to correct place in a version that otherwise changes
+       // the protocol version
 }
 
 void ContentFeatures::deSerialize(std::istream &is)
 {
        int version = readU8(is);
-       if(version != 4 && version != 3)
+       if(version != 6)
                throw SerializationError("unsupported ContentFeatures version");
        name = deSerializeString(is);
        groups.clear();
@@ -238,22 +285,12 @@ void ContentFeatures::deSerialize(std::istream &is)
        visual_scale = readF1000(is);
        if(readU8(is) != 6)
                throw SerializationError("unsupported tile count");
-       for(u32 i=0; i<6; i++){
-               if(version == 4)
-                       tiledef[i].deSerialize(is);
-               else if(version == 3) // Allow connecting to older servers
-                       tiledef[i].name = deSerializeString(is);
-       }
+       for(u32 i=0; i<6; i++)
+               tiledef[i].deSerialize(is);
        if(readU8(is) != CF_SPECIAL_COUNT)
                throw SerializationError("unsupported CF_SPECIAL_COUNT");
-       for(u32 i=0; i<CF_SPECIAL_COUNT; i++){
-               if(version == 4){
-                       tiledef_special[i].deSerialize(is);
-               } else if(version == 3){ // Allow connecting to older servers
-                       tiledef_special[i].name = deSerializeString(is);
-                       tiledef_special[i].backface_culling = readU8(is);
-               }
-       }
+       for(u32 i=0; i<CF_SPECIAL_COUNT; i++)
+               tiledef_special[i].deSerialize(is);
        alpha = readU8(is);
        post_effect_color.setAlpha(readU8(is));
        post_effect_color.setRed(readU8(is));
@@ -274,8 +311,10 @@ void ContentFeatures::deSerialize(std::istream &is)
        liquid_alternative_flowing = deSerializeString(is);
        liquid_alternative_source = deSerializeString(is);
        liquid_viscosity = readU8(is);
+       liquid_renewable = readU8(is);
        light_source = readU8(is);
        damage_per_second = readU32(is);
+       node_box.deSerialize(is);
        selection_box.deSerialize(is);
        legacy_facedir_simple = readU8(is);
        legacy_wallmounted = readU8(is);
@@ -285,6 +324,8 @@ void ContentFeatures::deSerialize(std::istream &is)
        // If you add anything here, insert it primarily inside the try-catch
        // block to not need to increase the version.
        try{
+               // Stuff below should be moved to correct place in a version that
+               // otherwise changes the protocol version
        }catch(SerializationError &e) {};
 }
 
@@ -343,18 +384,9 @@ class CNodeDefManager: public IWritableNodeDefManager
                }
        }
        // CONTENT_IGNORE = not found
-       content_t getFreeId(bool require_full_param2)
+       content_t getFreeId()
        {
-               // If allowed, first search in the large 4-bit-param2 pool
-               if(!require_full_param2){
-                       for(u16 i=0x800; i<=0xfff; i++){
-                               const ContentFeatures &f = m_content_features[i];
-                               if(f.name == "")
-                                       return i;
-                       }
-               }
-               // Then search from the small 8-bit-param2 pool
-               for(u16 i=0; i<=125; i++){
+               for(u32 i=0; i<=0xffff; i++){
                        const ContentFeatures &f = m_content_features[i];
                        if(f.name == "")
                                return i;
@@ -458,16 +490,8 @@ class CNodeDefManager: public IWritableNodeDefManager
                u16 id = CONTENT_IGNORE;
                bool found = m_name_id_mapping.getId(name, id);  // ignore aliases
                if(!found){
-                       // Determine if full param2 is required
-                       bool require_full_param2 = (
-                               def.param_type_2 == CPT2_FULL
-                               ||
-                               def.param_type_2 == CPT2_FLOWINGLIQUID
-                               ||
-                               def.legacy_wallmounted
-                       );
                        // Get some id
-                       id = getFreeId(require_full_param2);
+                       id = getFreeId();
                        if(id == CONTENT_IGNORE)
                                return CONTENT_IGNORE;
                        if(name != "")
@@ -539,8 +563,6 @@ class CNodeDefManager: public IWritableNodeDefManager
                                        f->solidness = 0;
                                } else {
                                        f->solidness = 1;
-                                       if(f->alpha == 255)
-                                               f->solidness = 2;
                                        f->backface_culling = false;
                                }
                                break;
@@ -576,6 +598,7 @@ class CNodeDefManager: public IWritableNodeDefManager
                        case NDT_PLANTLIKE:
                        case NDT_FENCELIKE:
                        case NDT_RAILLIKE:
+                       case NDT_NODEBOX:
                                f->solidness = 0;
                                break;
                        }