diff options
Diffstat (limited to 'src/nodetimer.cpp')
-rw-r--r-- | src/nodetimer.cpp | 98 |
1 files changed, 47 insertions, 51 deletions
diff --git a/src/nodetimer.cpp b/src/nodetimer.cpp index 5fc652bb7..ec8611a01 100644 --- a/src/nodetimer.cpp +++ b/src/nodetimer.cpp @@ -45,38 +45,38 @@ void NodeTimer::deSerialize(std::istream &is) void NodeTimerList::serialize(std::ostream &os, u8 map_format_version) const { - if(map_format_version == 24){ + if (map_format_version == 24) { // Version 0 is a placeholder for "nothing to see here; go away." - if(m_data.size() == 0){ + if (m_timers.empty()) { writeU8(os, 0); // version return; } writeU8(os, 1); // version - writeU16(os, m_data.size()); + writeU16(os, m_timers.size()); } - if(map_format_version >= 25){ - writeU8(os, 2+4+4); - writeU16(os, m_data.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(std::map<v3s16, NodeTimer>::const_iterator - i = m_data.begin(); - i != m_data.end(); i++){ - v3s16 p = i->first; - NodeTimer t = i->second; + 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; + u16 p16 = p.Z * MAP_BLOCKSIZE * MAP_BLOCKSIZE + p.Y * MAP_BLOCKSIZE + p.X; writeU16(os, p16); - t.serialize(os); + nt.serialize(os); } } void NodeTimerList::deSerialize(std::istream &is, u8 map_format_version) { - m_data.clear(); - - if(map_format_version == 24){ + clear(); + + if (map_format_version == 24) { u8 timer_version = readU8(is); if(timer_version == 0) return; @@ -84,7 +84,7 @@ void NodeTimerList::deSerialize(std::istream &is, u8 map_format_version) throw SerializationError("unsupported NodeTimerList version"); } - if(map_format_version >= 25){ + if (map_format_version >= 25) { u8 timer_data_len = readU8(is); if(timer_data_len != 2+4+4) throw SerializationError("unsupported NodeTimer data length"); @@ -92,63 +92,59 @@ void NodeTimerList::deSerialize(std::istream &is, u8 map_format_version) u16 count = readU16(is); - for(u16 i=0; i<count; i++) - { + 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; + 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; + NodeTimer t(p); t.deSerialize(is); - if(t.timeout <= 0) - { - infostream<<"WARNING: NodeTimerList::deSerialize(): " + if (t.timeout <= 0) { + warningstream<<"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(): " + if (m_iterators.find(p) != m_iterators.end()) { + warningstream<<"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)); + insert(t); } } -std::map<v3s16, NodeTimer> NodeTimerList::step(float dtime) +std::vector<NodeTimer> NodeTimerList::step(float dtime) { - std::map<v3s16, NodeTimer> elapsed_timers; - // Increment timers - for(std::map<v3s16, NodeTimer>::iterator - i = m_data.begin(); - i != m_data.end(); i++){ - v3s16 p = i->first; + std::vector<NodeTimer> elapsed_timers; + m_time += dtime; + if (m_next_trigger_time == -1. || m_time < m_next_trigger_time) { + return elapsed_timers; + } + std::multimap<double, NodeTimer>::iterator i = m_timers.begin(); + // Process timers + for (; i != m_timers.end() && i->first <= m_time; ++i) { NodeTimer t = i->second; - t.elapsed += dtime; - if(t.elapsed >= t.timeout) - elapsed_timers.insert(std::make_pair(p, t)); - else - i->second = t; + t.elapsed = t.timeout + (f32)(m_time - i->first); + elapsed_timers.push_back(t); + m_iterators.erase(t.position); } // Delete elapsed timers - for(std::map<v3s16, NodeTimer>::const_iterator - i = elapsed_timers.begin(); - i != elapsed_timers.end(); i++){ - v3s16 p = i->first; - m_data.erase(p); - } + m_timers.erase(m_timers.begin(), i); + if (m_timers.empty()) + m_next_trigger_time = -1.; + else + m_next_trigger_time = m_timers.begin()->first; return elapsed_timers; } |