/* Minetest Schematic File Format All values are stored in big-endian byte order. [u32] signature: 'MTSM' [u16] version: 3 [u16] size X [u16] size Y [u16] size Z For each Y: [u8] slice probability value [Name-ID table] Name ID Mapping Table [u16] name-id count For each name-id mapping: [u16] name length [u8[]] name ZLib deflated { For each node in schematic: (for z, y, x) [u16] content For each node in schematic: [u8] probability of occurance (param1) For each node in schematic: [u8] param2 } Version changes: 1 - Initial version 2 - Fixed messy never/always place; 0 probability is now never, 0xFF is always 3 - Added y-slice probabilities; this allows for variable height structures */ void DecoSchematic::saveSchematicFile(INodeDefManager *ndef) { std::ostringstream ss(std::ios_base::binary); writeU32(ss, MTSCHEM_FILE_SIGNATURE); // signature writeU16(ss, MTSCHEM_FILE_VER_HIGHEST_WRITE); // version writeV3S16(ss, size); // schematic size for (int y = 0; y != size.Y; y++) // Y slice probabilities writeU8(ss, slice_probs[y]); std::vector<content_t> usednodes; int nodecount = size.X * size.Y * size.Z; build_nnlist_and_update_ids(schematic, nodecount, &usednodes); u16 numids = usednodes.size(); writeU16(ss, numids); // name count for (int i = 0; i != numids; i++) ss << serializeString(ndef->get(usednodes[i]).name); // node names // compressed bulk node data MapNode::serializeBulk(ss, SER_FMT_VER_HIGHEST_WRITE, schematic, nodecount, 2, 2, true); fs::safeWriteToFile(filename, ss.str()); }
/* Minetest Schematic File Format All values are stored in big-endian byte order. [u32] signature: 'MTSM' [u16] version: 1 [u16] size X [u16] size Y [u16] size Z [Name-ID table] Name ID Mapping Table [u16] name-id count For each name-id mapping: [u16] name length [u8[]] name ZLib deflated { For each node in schematic: (for z, y, x) [u16] content For each node in schematic: [u8] probability of occurance (param1) For each node in schematic: [u8] param2 } */ void DecoSchematic::saveSchematicFile(INodeDefManager *ndef) { std::ofstream os(filename.c_str(), std::ios_base::binary); writeU32(os, MTSCHEM_FILE_SIGNATURE); // signature writeU16(os, 1); // version writeV3S16(os, size); // schematic size std::vector<content_t> usednodes; int nodecount = size.X * size.Y * size.Z; build_nnlist_and_update_ids(schematic, nodecount, &usednodes); u16 numids = usednodes.size(); writeU16(os, numids); // name count for (int i = 0; i != numids; i++) os << serializeString(ndef->get(usednodes[i]).name); // node names // compressed bulk node data MapNode::serializeBulk(os, SER_FMT_VER_HIGHEST, schematic, nodecount, 2, 2, true); }