void ContentFeatures::deSerialize(std::istream &is) { int version = readU8(is); if(version != 5) throw SerializationError("unsupported ContentFeatures version"); 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); // 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 liquid_renewable = readU8(is); }catch(SerializationError &e) {}; }
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); 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){} }
ServerActiveObject* FallingSAO::create(ServerEnvironment *env, v3f pos, const std::string &data) { std::string name; std::string state; s16 hp = 1; v3f velocity; float yaw = 0; if(data != "") { std::istringstream is(data, std::ios::binary); // read version u8 version = readU8(is); // check if version is supported if(version == 0){ name = deSerializeString(is); state = deSerializeLongString(is); } else if(version == 1){ name = deSerializeString(is); state = deSerializeLongString(is); hp = readS16(is); velocity = readV3F1000(is); yaw = readF1000(is); } } // create object //infostream<<"FallingSAO::create(name='%s' state='%s')", name.c_str(), state.c_str(); epixel::FallingSAO *sao = new epixel::FallingSAO(env, pos, name, state); sao->m_hp = hp; sao->m_velocity = velocity; sao->m_yaw = yaw; return sao; }
void deSerialize(std::istream &is) { // Clear everything clear(); // Deserialize int version = readU8(is); if(version != 0) throw SerializationError("unsupported ItemDefManager version"); u16 count = readU16(is); for(u16 i=0; i<count; i++) { // Deserialize a string and grab an ItemDefinition from it std::istringstream tmp_is(deSerializeString(is), std::ios::binary); ItemDefinition def; def.deSerialize(tmp_is); // Register registerItem(def); } u16 num_aliases = readU16(is); for(u16 i=0; i<num_aliases; i++) { std::string name = deSerializeString(is); std::string convert_to = deSerializeString(is); registerAlias(name, convert_to); } }
ServerActiveObject* LuaEntitySAO::create(ServerEnvironment *env, v3f pos, const std::string &data) { std::string name; std::string state; s16 hp = 1; v3f velocity; float yaw = 0; if(data != ""){ std::istringstream is(data, std::ios::binary); // read version u8 version = readU8(is); // check if version is supported if(version == 0){ name = deSerializeString(is); state = deSerializeLongString(is); } else if(version == 1){ name = deSerializeString(is); state = deSerializeLongString(is); hp = readS16(is); velocity = readV3F1000(is); yaw = readF1000(is); } } // create object infostream<<"LuaEntitySAO::create(name=\""<<name<<"\" state=\"" <<state<<"\")"<<std::endl; LuaEntitySAO *sao = new LuaEntitySAO(env, pos, name, state); sao->m_hp = hp; sao->m_velocity = velocity; sao->m_yaw = yaw; return sao; }
void ToolCapabilities::deSerialize(std::istream &is) { int version = readU8(is); if(version != 1 && version != 2) throw SerializationError( "unsupported ToolCapabilities version"); full_punch_interval = readF1000(is); max_drop_level = readS16(is); groupcaps.clear(); u32 groupcaps_size = readU32(is); for(u32 i=0; i<groupcaps_size; i++){ std::string name = deSerializeString(is); ToolGroupCap cap; cap.uses = readS16(is); cap.maxlevel = readS16(is); u32 times_size = readU32(is); for(u32 i=0; i<times_size; i++){ int level = readS16(is); float time = readF1000(is); cap.times[level] = time; } groupcaps[name] = cap; } if(version == 2) { u32 damage_groups_size = readU32(is); for(u32 i=0; i<damage_groups_size; i++){ std::string name = deSerializeString(is); s16 rating = readS16(is); damageGroups[name] = rating; } } }
void CraftDefinitionCooking::deSerializeBody(std::istream &is, int version) { if(version != 1) throw SerializationError( "unsupported CraftDefinitionCooking version"); output = deSerializeString(is); recipe = deSerializeString(is); cooktime = readF1000(is); replacements.deSerialize(is); }
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"); } }
void ItemDefinition::deSerialize(std::istream &is) { // Reset everything reset(); // Deserialize int version = readU8(is); if(version < 1 || version > 3) throw SerializationError("unsupported ItemDefinition version"); type = (enum ItemType)readU8(is); name = deSerializeString(is); description = deSerializeString(is); inventory_image = deSerializeString(is); wield_image = deSerializeString(is); wield_scale = readV3F1000(is); stack_max = readS16(is); usable = readU8(is); liquids_pointable = readU8(is); std::string tool_capabilities_s = deSerializeString(is); if(!tool_capabilities_s.empty()) { std::istringstream tmp_is(tool_capabilities_s, std::ios::binary); tool_capabilities = new ToolCapabilities; tool_capabilities->deSerialize(tmp_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; } if(version == 1){ // We cant be sure that node_placement_prediction is send in version 1 try{ node_placement_prediction = deSerializeString(is); }catch(SerializationError &e) {}; // Set the old default sound sound_place.name = "default_place_node"; sound_place.gain = 0.5; } else if(version >= 2) { node_placement_prediction = deSerializeString(is); //deserializeSimpleSoundSpec(sound_place, is); sound_place.name = deSerializeString(is); sound_place.gain = readF1000(is); } if(version == 3) { range = readF1000(is); } // If you add anything here, insert it primarily inside the try-catch // block to not need to increase the version. try { sound_place_failed.name = deSerializeString(is); sound_place_failed.gain = readF1000(is); } catch(SerializationError &e) {}; }
void CraftDefinition::deSerialize(std::istream &is) { int version = readU8(is); if(version != 0) throw SerializationError( "unsupported CraftDefinition version"); output = deSerializeString(is); input.width = readU8(is); u32 count = readU16(is); for(u32 i=0; i<count; i++) input.items.push_back(deSerializeString(is)); }
void CraftReplacements::deSerialize(std::istream &is) { pairs.clear(); u32 count = readU16(is); for(u32 i=0; i<count; i++) { std::string first = deSerializeString(is); std::string second = deSerializeString(is); pairs.push_back(std::make_pair(first, second)); } }
void CraftDefinitionShapeless::deSerializeBody(std::istream &is, int version) { if(version != 1) throw SerializationError( "unsupported CraftDefinitionShapeless version"); output = deSerializeString(is); recipe.clear(); u32 count = readU16(is); for(u32 i=0; i<count; i++) recipe.push_back(deSerializeString(is)); replacements.deSerialize(is); }
bool DecoSchematic::loadSchematicFile() { std::ifstream is(filename.c_str(), std::ios_base::binary); u32 signature = readU32(is); if (signature != MTSCHEM_FILE_SIGNATURE) { errorstream << "loadSchematicFile: invalid schematic " "file" << std::endl; return false; } u16 version = readU16(is); if (version != 1) { errorstream << "loadSchematicFile: unsupported schematic " "file version" << std::endl; return false; } size = readV3S16(is); int nodecount = size.X * size.Y * size.Z; u16 nidmapcount = readU16(is); node_names = new std::vector<std::string>; for (int i = 0; i != nidmapcount; i++) { std::string name = deSerializeString(is); node_names->push_back(name); } delete schematic; schematic = new MapNode[nodecount]; MapNode::deSerializeBulk(is, SER_FMT_VER_HIGHEST, schematic, nodecount, 2, 2, true); return true; }
void deSerialize(std::istream &is) { clear(); int version = readU8(is); if(version != 1) throw SerializationError("unsupported NodeDefinitionManager version"); u16 count = readU16(is); std::istringstream is2(deSerializeLongString(is), std::ios::binary); for(u16 n=0; n<count; n++){ u16 i = readU16(is2); if(i > MAX_CONTENT){ errorstream<<"ContentFeatures::deSerialize(): " <<"Too large content id: "<<i<<std::endl; continue; } /*// Do not deserialize special types if(i == CONTENT_IGNORE || i == CONTENT_AIR) continue;*/ ContentFeatures *f = &m_content_features[i]; // Read it from the string wrapper std::string wrapper = deSerializeString(is2); std::istringstream wrapper_is(wrapper, std::ios::binary); f->deSerialize(wrapper_is); verbosestream<<"deserialized "<<f->name<<std::endl; if(f->name != "") addNameIdMapping(i, f->name); } }
void TileDef::deSerialize(std::istream &is, u8 contentfeatures_version, NodeDrawType drawtype) { int version = readU8(is); if (version < 6) throw SerializationError("unsupported TileDef version"); name = deSerializeString(is); animation.deSerialize(is, version); u16 flags = readU16(is); backface_culling = flags & TILE_FLAG_BACKFACE_CULLING; tileable_horizontal = flags & TILE_FLAG_TILEABLE_HORIZONTAL; tileable_vertical = flags & TILE_FLAG_TILEABLE_VERTICAL; has_color = flags & TILE_FLAG_HAS_COLOR; bool has_scale = flags & TILE_FLAG_HAS_SCALE; bool has_align_style = flags & TILE_FLAG_HAS_ALIGN_STYLE; if (has_color) { color.setRed(readU8(is)); color.setGreen(readU8(is)); color.setBlue(readU8(is)); } scale = has_scale ? readU8(is) : 0; if (has_align_style) align_style = static_cast<AlignStyle>(readU8(is)); else align_style = ALIGN_STYLE_NODE; }
static void deSerializeSimpleSoundSpec(SimpleSoundSpec &ss, std::istream &is, u8 version) { ss.name = deSerializeString(is); ss.gain = readF1000(is); ss.pitch = readF1000(is); }
CraftDefinition* CraftDefinition::deSerialize(std::istream &is) { int version = readU8(is); if(version != 1) throw SerializationError( "unsupported CraftDefinition version"); std::string name = deSerializeString(is); CraftDefinition *def = NULL; if(name == "shaped") { def = new CraftDefinitionShaped; } else if(name == "shapeless") { def = new CraftDefinitionShapeless; } else if(name == "toolrepair") { def = new CraftDefinitionToolRepair; } else if(name == "cooking") { def = new CraftDefinitionCooking; } else if(name == "fuel") { def = new CraftDefinitionFuel; } else { infostream<<"Unknown CraftDefinition name=\""<<name<<"\""<<std::endl; throw SerializationError("Unknown CraftDefinition name"); } def->deSerializeBody(is, version); return def; }
NodeMetadata* LockingChestNodeMetadata::create(std::istream &is, IGameDef *gamedef) { LockingChestNodeMetadata *d = new LockingChestNodeMetadata(gamedef); d->setOwner(deSerializeString(is)); d->m_inventory = new Inventory(gamedef->idef()); d->m_inventory->deSerialize(is); return d; }
void StaticObject::deSerialize(std::istream &is, u8 version) { // type type = readU8(is); // pos pos = readV3F1000(is); // data data = deSerializeString(is); }
void TileDef::deSerialize(std::istream &is) { int version = readU8(is); name = deSerializeString(is); animation.type = (TileAnimationType)readU8(is); animation.aspect_w = readU16(is); animation.aspect_h = readU16(is); animation.length = readF1000(is); if(version >= 1) backface_culling = readU8(is); }
void TileDef::deSerialize(std::istream &is) { int version = readU8(is); if(version != 0) throw SerializationError("unsupported TileDef version"); name = deSerializeString(is); animation.type = (TileAnimationType)readU8(is); animation.aspect_w = readU16(is); animation.aspect_h = readU16(is); animation.length = readF1000(is); }
void NodeMetadata::deSerialize(std::istream &is) { m_stringvars.clear(); int num_vars = readU32(is); for(int i=0; i<num_vars; i++){ std::string name = deSerializeString(is); std::string var = deSerializeLongString(is); m_stringvars[name] = var; } m_inventory->deSerialize(is); }
void ItemDefinition::deSerialize(std::istream &is) { // Reset everything reset(); // Deserialize int version = readU8(is); if(version != 1) throw SerializationError("unsupported ItemDefinition version"); type = (enum ItemType)readU8(is); name = deSerializeString(is); description = deSerializeString(is); inventory_image = deSerializeString(is); wield_image = deSerializeString(is); wield_scale = readV3F1000(is); stack_max = readS16(is); usable = readU8(is); liquids_pointable = readU8(is); eatable = readU8(is); std::string tool_capabilities_s = deSerializeString(is); if(!tool_capabilities_s.empty()) { std::istringstream tmp_is(tool_capabilities_s, std::ios::binary); tool_capabilities = new ToolCapabilities; tool_capabilities->deSerialize(tmp_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; } }
void ObjectProperties::deSerialize(std::istream &is) { int version = readU8(is); if(version == 1) { try{ 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); automatic_rotate = readF1000(is); mesh = deSerializeString(is); u32 color_count = readU16(is); for(u32 i=0; i<color_count; i++){ colors.push_back(readARGB8(is)); } collideWithObjects = readU8(is); stepheight = readF1000(is); automatic_face_movement_dir = readU8(is); automatic_face_movement_dir_offset = readF1000(is); }catch(SerializationError &e){} } else { throw SerializationError("unsupported ObjectProperties version"); } }
void TestSerialization::testDeSerializeString() { // Test deserialize { std::istringstream is(serializeString(teststring2), std::ios::binary); UASSERT(deSerializeString(is) == teststring2); UASSERT(!is.eof()); is.get(); UASSERT(is.eof()); } // Test deserialize an incomplete length specifier { std::istringstream is(mkstr("\x53"), std::ios::binary); EXCEPTION_CHECK(SerializationError, deSerializeString(is)); } // Test deserialize a string with incomplete data { std::istringstream is(mkstr("\x00\x55 abcdefg"), std::ios::binary); EXCEPTION_CHECK(SerializationError, deSerializeString(is)); } }
static NodeMetadata* create(std::istream &is, IGameDef *gamedef) { GenericNodeMetadata *d = new GenericNodeMetadata(gamedef); d->m_inventory = new Inventory(gamedef->idef()); d->m_inventory->deSerialize(is); d->m_text = deSerializeLongString(is); d->m_owner = deSerializeString(is); d->m_infotext = deSerializeString(is); d->m_inventorydrawspec = deSerializeString(is); d->m_allow_text_input = readU8(is); d->m_removal_disabled = readU8(is); d->m_enforce_owner = readU8(is); int num_vars = readU32(is); for(int i=0; i<num_vars; i++){ std::string name = deSerializeString(is); std::string var = deSerializeLongString(is); d->m_stringvars[name] = var; } return d; }
void StaticObject::deSerialize(std::istream &is, u8 version) { char buf[12]; // type is.read(buf, 1); type = buf[0]; // pos is.read(buf, 12); v3s32 intp = readV3S32((u8*)buf); pos.X = (f32)intp.X/1000; pos.Y = (f32)intp.Y/1000; pos.Z = (f32)intp.Z/1000; // data data = deSerializeString(is); }
void NameIdMapping::deSerialize(std::istream &is) { int version = readU8(is); if(version != 0) throw SerializationError("unsupported NameIdMapping version"); u32 count = readU16(is); m_id_to_name.clear(); m_name_to_id.clear(); for(u32 i=0; i<count; i++){ u16 id = readU16(is); std::string name = deSerializeString(is); m_id_to_name[id] = name; m_name_to_id[name] = id; } }
void CNodeDefManager::deSerialize(std::istream &is) { clear(); int version = readU8(is); if (version != 1) throw SerializationError("unsupported NodeDefinitionManager version"); u16 count = readU16(is); std::istringstream is2(deSerializeLongString(is), std::ios::binary); ContentFeatures f; for (u16 n = 0; n < count; n++) { u16 i = readU16(is2); // Read it from the string wrapper std::string wrapper = deSerializeString(is2); std::istringstream wrapper_is(wrapper, std::ios::binary); f.deSerialize(wrapper_is); // Check error conditions if (i == CONTENT_IGNORE || i == CONTENT_AIR || i == CONTENT_UNKNOWN) { warningstream << "NodeDefManager::deSerialize(): " "not changing builtin node " << i << std::endl; continue; } if (f.name.empty()) { warningstream << "NodeDefManager::deSerialize(): " "received empty name" << std::endl; continue; } // Ignore aliases u16 existing_id; if (m_name_id_mapping.getId(f.name, existing_id) && i != existing_id) { warningstream << "NodeDefManager::deSerialize(): " "already defined with different ID: " << f.name << std::endl; continue; } // All is ok, add node definition with the requested ID if (i >= m_content_features.size()) m_content_features.resize((u32)(i) + 1); m_content_features[i] = f; addNameIdMapping(i, f.name); verbosestream << "deserialized " << f.name << std::endl; getNodeBoxUnion(f.selection_box, f, &m_selection_box_union); fixSelectionBoxIntUnion(); } }
static ServerActiveObject* create(ServerEnvironment *env, v3f pos, const std::string &data) { std::istringstream is(data, std::ios::binary); char buf[1]; // read version is.read(buf, 1); u8 version = buf[0]; // check if version is supported if(version != 0) return NULL; std::string itemstring = deSerializeString(is); infostream<<"create(): Creating item \"" <<itemstring<<"\""<<std::endl; return new ItemSAO(env, pos, itemstring); }