void NodeTimerList::serialize(std::ostream &os) const { /* Version 0 is a placeholder for "nothing to see here; go away." */ if(m_data.size() == 0){ writeU8(os, 0); // version return; } writeU8(os, 1); // version writeU16(os, m_data.size()); for(std::map<v3s16, NodeTimer>::const_iterator i = m_data.begin(); i != m_data.end(); i++){ v3s16 p = i->first; NodeTimer t = i->second; u16 p16 = p.Z*MAP_BLOCKSIZE*MAP_BLOCKSIZE + p.Y*MAP_BLOCKSIZE + p.X; writeU16(os, p16); t.serialize(os); } }
void NodeTimerList::serialize(std::ostream &os, u8 map_format_version) const { if (map_format_version == 24) { // Version 0 is a placeholder for "nothing to see here; go away." if (m_timers.empty()) { writeU8(os, 0); // version return; } writeU8(os, 1); // version writeU16(os, m_timers.size()); } if (map_format_version >= 25) { writeU8(os, 2 + 4 + 4); // length of the data for a single timer writeU16(os, m_timers.size()); } for (const auto &timer : m_timers) { NodeTimer t = timer.second; NodeTimer nt = NodeTimer(t.timeout, t.timeout - (f32)(timer.first - m_time), t.position); v3s16 p = t.position; u16 p16 = p.Z * MAP_BLOCKSIZE * MAP_BLOCKSIZE + p.Y * MAP_BLOCKSIZE + p.X; writeU16(os, p16); nt.serialize(os); } }
void NodeTimerList::serialize(std::ostream &os, u8 map_format_version) const { if(map_format_version == 24){ // Version 0 is a placeholder for "nothing to see here; go away." if(m_data.empty()){ writeU8(os, 0); // version return; } writeU8(os, 1); // version writeU16(os, m_data.size()); } if(map_format_version >= 25){ writeU8(os, 2+4+4); writeU16(os, m_data.size()); } for(std::map<v3s16, NodeTimer>::const_iterator i = m_data.begin(); i != m_data.end(); i++){ v3s16 p = i->first; NodeTimer t = i->second; u16 p16 = p.Z*MAP_BLOCKSIZE*MAP_BLOCKSIZE + p.Y*MAP_BLOCKSIZE + p.X; writeU16(os, p16); t.serialize(os); } }
void NodeTimerList::deSerialize(std::istream &is, u8 map_format_version) { m_data.clear(); if(map_format_version == 24){ u8 timer_version = readU8(is); if(timer_version == 0) return; if(timer_version != 1) throw SerializationError("unsupported NodeTimerList version"); } if(map_format_version >= 25){ u8 timer_data_len = readU8(is); if(timer_data_len != 2+4+4) throw SerializationError("unsupported NodeTimer data length"); } u16 count = readU16(is); for(u16 i=0; i<count; i++) { u16 p16 = readU16(is); v3s16 p; p.Z = p16 / MAP_BLOCKSIZE / MAP_BLOCKSIZE; p16 &= MAP_BLOCKSIZE * MAP_BLOCKSIZE - 1; p.Y = p16 / MAP_BLOCKSIZE; p16 &= MAP_BLOCKSIZE - 1; p.X = p16; NodeTimer t; t.deSerialize(is); if(t.timeout <= 0) { infostream<<"WARNING: NodeTimerList::deSerialize(): " <<"invalid data at position" <<"("<<p.X<<","<<p.Y<<","<<p.Z<<"): Ignoring." <<std::endl; continue; } if(m_data.find(p) != m_data.end()) { infostream<<"WARNING: NodeTimerList::deSerialize(): " <<"already set data at position" <<"("<<p.X<<","<<p.Y<<","<<p.Z<<"): Ignoring." <<std::endl; continue; } m_data.insert(std::make_pair(p, t)); } }
void NodeTimerList::deSerialize(std::istream &is) { m_data.clear(); u8 version = readU8(is); if(version == 0) return; if(version != 1) throw SerializationError("unsupported NodeTimerList version"); u16 count = readU16(is); for(u16 i=0; i<count; i++) { u16 p16 = readU16(is); v3s16 p(0,0,0); p.Z += p16 / MAP_BLOCKSIZE / MAP_BLOCKSIZE; p16 -= p.Z * MAP_BLOCKSIZE * MAP_BLOCKSIZE; p.Y += p16 / MAP_BLOCKSIZE; p16 -= p.Y * MAP_BLOCKSIZE; p.X += p16; NodeTimer t; t.deSerialize(is); if(t.timeout <= 0) { infostream<<"WARNING: NodeTimerList::deSerialize(): " <<"invalid data at position" <<"("<<p.X<<","<<p.Y<<","<<p.Z<<"): Ignoring." <<std::endl; continue; } if(m_data.find(p) != m_data.end()) { infostream<<"WARNING: NodeTimerList::deSerialize(): " <<"already set data at position" <<"("<<p.X<<","<<p.Y<<","<<p.Z<<"): Ignoring." <<std::endl; continue; } m_data.insert(std::make_pair(p, t)); } }