]> git.lizzy.rs Git - minetest.git/blobdiff - src/nodedef.cpp
Make m_media_fetch_threads to contain MediaFetchThread* instead of MediaFetchThread
[minetest.git] / src / nodedef.cpp
index 180219ba854f1c0dd8a17b732d74994c4958666c..36fa798fd4492a2c734d220e554314f5ce607d45 100644 (file)
@@ -215,9 +215,14 @@ void ContentFeatures::reset()
        sound_dug = SimpleSoundSpec();
 }
 
-void ContentFeatures::serialize(std::ostream &os)
+void ContentFeatures::serialize(std::ostream &os, u16 protocol_version)
 {
-       writeU8(os, 5); // version
+       if(protocol_version < 14){
+               serializeOld(os, protocol_version);
+               return;
+       }
+
+       writeU8(os, 6); // version
        os<<serializeString(name);
        writeU16(os, groups.size());
        for(ItemGroupList::const_iterator
@@ -254,6 +259,7 @@ 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);
@@ -265,14 +271,16 @@ void ContentFeatures::serialize(std::ostream &os)
        serializeSimpleSoundSpec(sound_dug, os);
        // Stuff below should be moved to correct place in a version that otherwise changes
        // the protocol version
-       writeU8(os, liquid_renewable);
 }
 
 void ContentFeatures::deSerialize(std::istream &is)
 {
        int version = readU8(is);
-       if(version != 5)
-               throw SerializationError("unsupported ContentFeatures version");
+       if(version != 6){
+               deSerializeOld(is, version);
+               return;
+       }
+
        name = deSerializeString(is);
        groups.clear();
        u32 groups_size = readU16(is);
@@ -311,6 +319,7 @@ 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);
@@ -325,7 +334,6 @@ void ContentFeatures::deSerialize(std::istream &is)
        try{
                // Stuff below should be moved to correct place in a version that
                // otherwise changes the protocol version
-               liquid_renewable = readU8(is);
        }catch(SerializationError &e) {};
 }
 
@@ -547,6 +555,7 @@ class CNodeDefManager: public IWritableNodeDefManager
                                        tiledef[j].name = "unknown_block.png";
                        }
 
+                       bool is_liquid = false;
                        switch(f->drawtype){
                        default:
                        case NDT_NORMAL:
@@ -565,12 +574,14 @@ class CNodeDefManager: public IWritableNodeDefManager
                                        f->solidness = 1;
                                        f->backface_culling = false;
                                }
+                               is_liquid = true;
                                break;
                        case NDT_FLOWINGLIQUID:
                                assert(f->liquid_type == LIQUID_FLOWING);
                                f->solidness = 0;
                                if(opaque_water)
                                        f->alpha = 255;
+                               is_liquid = true;
                                break;
                        case NDT_GLASSLIKE:
                                f->solidness = 0;
@@ -603,16 +614,24 @@ class CNodeDefManager: public IWritableNodeDefManager
                                break;
                        }
 
+                       u8 material_type = 0;
+                       if(is_liquid){
+                               if(f->alpha == 255)
+                                       material_type = TILE_MATERIAL_LIQUID_OPAQUE;
+                               else
+                                       material_type = TILE_MATERIAL_LIQUID_TRANSPARENT;
+                       } else{
+                               material_type = TILE_MATERIAL_BASIC;
+                       }
+
                        // Tiles (fill in f->tiles[])
                        for(u16 j=0; j<6; j++){
                                // Texture
                                f->tiles[j].texture = tsrc->getTexture(tiledef[j].name);
                                // Alpha
                                f->tiles[j].alpha = f->alpha;
-                               if(f->alpha == 255)
-                                       f->tiles[j].material_type = MATERIAL_ALPHA_SIMPLE;
-                               else
-                                       f->tiles[j].material_type = MATERIAL_ALPHA_VERTEX;
+                               // Material type
+                               f->tiles[j].material_type = material_type;
                                // Material flags
                                f->tiles[j].material_flags = 0;
                                if(f->backface_culling)
@@ -653,10 +672,8 @@ class CNodeDefManager: public IWritableNodeDefManager
                                                tsrc->getTexture(f->tiledef_special[j].name);
                                // Alpha
                                f->special_tiles[j].alpha = f->alpha;
-                               if(f->alpha == 255)
-                                       f->special_tiles[j].material_type = MATERIAL_ALPHA_SIMPLE;
-                               else
-                                       f->special_tiles[j].material_type = MATERIAL_ALPHA_VERTEX;
+                               // Material type
+                               f->special_tiles[j].material_type = material_type;
                                // Material flags
                                f->special_tiles[j].material_flags = 0;
                                if(f->tiledef_special[j].backface_culling)
@@ -693,7 +710,7 @@ class CNodeDefManager: public IWritableNodeDefManager
                }
 #endif
        }
-       void serialize(std::ostream &os)
+       void serialize(std::ostream &os, u16 protocol_version)
        {
                writeU8(os, 1); // version
                u16 count = 0;
@@ -709,7 +726,7 @@ class CNodeDefManager: public IWritableNodeDefManager
                        // Wrap it in a string to allow different lengths without
                        // strict version incompatibilities
                        std::ostringstream wrapper_os(std::ios::binary);
-                       f->serialize(wrapper_os);
+                       f->serialize(wrapper_os, protocol_version);
                        os2<<serializeString(wrapper_os.str());
                        count++;
                }
@@ -766,3 +783,122 @@ IWritableNodeDefManager* createNodeDefManager()
        return new CNodeDefManager();
 }
 
+/*
+       Serialization of old ContentFeatures formats
+*/
+
+void ContentFeatures::serializeOld(std::ostream &os, u16 protocol_version)
+{
+       if(protocol_version == 13)
+       {
+               writeU8(os, 5); // version
+               os<<serializeString(name);
+               writeU16(os, groups.size());
+               for(ItemGroupList::const_iterator
+                               i = groups.begin(); i != groups.end(); i++){
+                       os<<serializeString(i->first);
+                       writeS16(os, i->second);
+               }
+               writeU8(os, drawtype);
+               writeF1000(os, visual_scale);
+               writeU8(os, 6);
+               for(u32 i=0; i<6; i++)
+                       tiledef[i].serialize(os);
+               writeU8(os, CF_SPECIAL_COUNT);
+               for(u32 i=0; i<CF_SPECIAL_COUNT; i++){
+                       tiledef_special[i].serialize(os);
+               }
+               writeU8(os, alpha);
+               writeU8(os, post_effect_color.getAlpha());
+               writeU8(os, post_effect_color.getRed());
+               writeU8(os, post_effect_color.getGreen());
+               writeU8(os, post_effect_color.getBlue());
+               writeU8(os, param_type);
+               writeU8(os, param_type_2);
+               writeU8(os, is_ground_content);
+               writeU8(os, light_propagates);
+               writeU8(os, sunlight_propagates);
+               writeU8(os, walkable);
+               writeU8(os, pointable);
+               writeU8(os, diggable);
+               writeU8(os, climbable);
+               writeU8(os, buildable_to);
+               os<<serializeString(""); // legacy: used to be metadata_name
+               writeU8(os, liquid_type);
+               os<<serializeString(liquid_alternative_flowing);
+               os<<serializeString(liquid_alternative_source);
+               writeU8(os, liquid_viscosity);
+               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);
+       }
+       else
+       {
+               throw SerializationError("ContentFeatures::serialize(): Unsupported version requested");
+       }
+}
+
+void ContentFeatures::deSerializeOld(std::istream &is, int version)
+{
+       if(version == 5) // In PROTOCOL_VERSION 13
+       {
+               name = deSerializeString(is);
+               groups.clear();
+               u32 groups_size = readU16(is);
+               for(u32 i=0; i<groups_size; i++){
+                       std::string name = deSerializeString(is);
+                       int value = readS16(is);
+                       groups[name] = value;
+               }
+               drawtype = (enum NodeDrawType)readU8(is);
+               visual_scale = readF1000(is);
+               if(readU8(is) != 6)
+                       throw SerializationError("unsupported tile count");
+               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++)
+                       tiledef_special[i].deSerialize(is);
+               alpha = readU8(is);
+               post_effect_color.setAlpha(readU8(is));
+               post_effect_color.setRed(readU8(is));
+               post_effect_color.setGreen(readU8(is));
+               post_effect_color.setBlue(readU8(is));
+               param_type = (enum ContentParamType)readU8(is);
+               param_type_2 = (enum ContentParamType2)readU8(is);
+               is_ground_content = readU8(is);
+               light_propagates = readU8(is);
+               sunlight_propagates = readU8(is);
+               walkable = readU8(is);
+               pointable = readU8(is);
+               diggable = readU8(is);
+               climbable = readU8(is);
+               buildable_to = readU8(is);
+               deSerializeString(is); // legacy: used to be metadata_name
+               liquid_type = (enum LiquidType)readU8(is);
+               liquid_alternative_flowing = deSerializeString(is);
+               liquid_alternative_source = deSerializeString(is);
+               liquid_viscosity = 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);
+               deSerializeSimpleSoundSpec(sound_footstep, is);
+               deSerializeSimpleSoundSpec(sound_dig, is);
+               deSerializeSimpleSoundSpec(sound_dug, is);
+       }
+       else
+       {
+               throw SerializationError("unsupported ContentFeatures version");
+       }
+}
+