diff options
Diffstat (limited to 'src/object_properties.cpp')
-rw-r--r-- | src/object_properties.cpp | 84 |
1 files changed, 58 insertions, 26 deletions
diff --git a/src/object_properties.cpp b/src/object_properties.cpp index 79b3eaf72..3368a5883 100644 --- a/src/object_properties.cpp +++ b/src/object_properties.cpp @@ -74,7 +74,7 @@ std::string ObjectProperties::dump() void ObjectProperties::serialize(std::ostream &os) const { - writeU8(os, 1); // version + writeU8(os, 2); // version writeS16(os, hp_max); writeU8(os, physical); writeF1000(os, weight); @@ -96,37 +96,69 @@ void ObjectProperties::serialize(std::ostream &os) const writeU8(os, is_visible); writeU8(os, makes_footstep_sound); writeF1000(os, automatic_rotate); + // Stuff below should be moved to correct place in a version that otherwise changes + // the protocol version } void ObjectProperties::deSerialize(std::istream &is) { int version = readU8(is); - if(version != 1) throw SerializationError( - "unsupported ObjectProperties version"); - hp_max = readS16(is); - physical = readU8(is); - weight = readF1000(is); - collisionbox.MinEdge = readV3F1000(is); - collisionbox.MaxEdge = readV3F1000(is); - visual = deSerializeString(is); - mesh = deSerializeString(is); - visual_size = readV2F1000(is); - textures.clear(); - u32 texture_count = readU16(is); - for(u32 i=0; i<texture_count; i++){ - textures.push_back(deSerializeString(is)); + if(version == 2) // In PROTOCOL_VERSION 14 + { + hp_max = readS16(is); + physical = readU8(is); + weight = readF1000(is); + collisionbox.MinEdge = readV3F1000(is); + collisionbox.MaxEdge = readV3F1000(is); + visual = deSerializeString(is); + mesh = deSerializeString(is); + visual_size = readV2F1000(is); + textures.clear(); + u32 texture_count = readU16(is); + for(u32 i=0; i<texture_count; i++){ + textures.push_back(deSerializeString(is)); + } + u32 color_count = readU16(is); + for(u32 i=0; i<color_count; i++){ + colors.push_back(readARGB8(is)); + } + spritediv = readV2S16(is); + initial_sprite_basepos = readV2S16(is); + is_visible = readU8(is); + makes_footstep_sound = readU8(is); + automatic_rotate = readF1000(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){} } - u32 color_count = readU16(is); - for(u32 i=0; i<color_count; i++){ - colors.push_back(readARGB8(is)); + else if(version == 1) // In PROTOCOL_VERSION 13 + { + hp_max = readS16(is); + physical = readU8(is); + weight = readF1000(is); + collisionbox.MinEdge = readV3F1000(is); + collisionbox.MaxEdge = readV3F1000(is); + visual = deSerializeString(is); + visual_size = readV2F1000(is); + textures.clear(); + u32 texture_count = readU16(is); + for(u32 i=0; i<texture_count; i++){ + textures.push_back(deSerializeString(is)); + } + spritediv = readV2S16(is); + initial_sprite_basepos = readV2S16(is); + is_visible = readU8(is); + makes_footstep_sound = readU8(is); + try{ + automatic_rotate = readF1000(is); + }catch(SerializationError &e){} + } + else + { + throw SerializationError("unsupported ObjectProperties version"); } - spritediv = readV2S16(is); - initial_sprite_basepos = readV2S16(is); - is_visible = readU8(is); - makes_footstep_sound = readU8(is); - try{ - automatic_rotate = readF1000(is); - }catch(SerializationError &e){} } - |