-void NodeMetadataList::serialize(std::ostream &os)
-{
- u8 buf[6];
-
- u16 version = 1;
- writeU16(buf, version);
- os.write((char*)buf, 2);
-
- u16 count = m_data.size();
- writeU16(buf, count);
- os.write((char*)buf, 2);
-
- for(core::map<v3s16, NodeMetadata*>::Iterator
- i = m_data.getIterator();
- i.atEnd()==false; i++)
- {
- v3s16 p = i.getNode()->getKey();
- NodeMetadata *data = i.getNode()->getValue();
-
- u16 p16 = p.Z*MAP_BLOCKSIZE*MAP_BLOCKSIZE + p.Y*MAP_BLOCKSIZE + p.X;
- writeU16(buf, p16);
- os.write((char*)buf, 2);
-
- data->serialize(os);
+void NodeMetadataList::serialize(std::ostream &os, u8 blockver, bool disk,
+ bool absolute_pos) const
+{
+ /*
+ Version 0 is a placeholder for "nothing to see here; go away."
+ */
+
+ u16 count = countNonEmpty();
+ if (count == 0) {
+ writeU8(os, 0); // version
+ return;
+ }
+
+ u8 version = (blockver > 27) ? 2 : 1;
+ writeU8(os, version);
+ writeU16(os, count);
+
+ for (NodeMetadataMap::const_iterator
+ i = m_data.begin();
+ i != m_data.end(); ++i) {
+ v3s16 p = i->first;
+ NodeMetadata *data = i->second;
+ if (data->empty())
+ continue;
+
+ if (absolute_pos) {
+ writeS16(os, p.X);
+ writeS16(os, p.Y);
+ writeS16(os, p.Z);
+ } else {
+ // Serialize positions within a mapblock
+ u16 p16 = (p.Z * MAP_BLOCKSIZE + p.Y) * MAP_BLOCKSIZE + p.X;
+ writeU16(os, p16);
+ }
+ data->serialize(os, version, disk);