X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fnodetimer.cpp;h=ec8611a013f94a9220ed37412dbb3a4ec7bd0114;hb=1fa4f58080b068920d7611291709377072d0cd00;hp=468c177fd30f3f719bd4de3ea9c562fe17af20d1;hpb=d0ea6f9920d30f46d1f5d44e8823a8d932f9f29d;p=minetest.git diff --git a/src/nodetimer.cpp b/src/nodetimer.cpp index 468c177fd..ec8611a01 100644 --- a/src/nodetimer.cpp +++ b/src/nodetimer.cpp @@ -1,6 +1,6 @@ /* -Minetest-c55 -Copyright (C) 2010-2012 celeron55, Perttu Ahola +Minetest +Copyright (C) 2010-2013 celeron55, Perttu Ahola This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by @@ -19,6 +19,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "nodetimer.h" #include "log.h" +#include "serialization.h" #include "util/serialize.h" #include "constants.h" // MAP_BLOCKSIZE @@ -28,13 +29,13 @@ with this program; if not, write to the Free Software Foundation, Inc., void NodeTimer::serialize(std::ostream &os) const { - writeF1000(os, duration); + writeF1000(os, timeout); writeF1000(os, elapsed); } void NodeTimer::deSerialize(std::istream &is) { - duration = readF1000(is); + timeout = readF1000(is); elapsed = readF1000(is); } @@ -42,101 +43,108 @@ void NodeTimer::deSerialize(std::istream &is) NodeTimerList */ -void NodeTimerList::serialize(std::ostream &os) const +void NodeTimerList::serialize(std::ostream &os, u8 map_format_version) const { - /* - Version 0 is a placeholder for "nothing to see here; go away." - */ - - if(m_data.size() == 0){ - writeU8(os, 0); // version - return; + 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()); } - writeU8(os, 1); // version - 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::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) +void NodeTimerList::deSerialize(std::istream &is, u8 map_format_version) { - m_data.clear(); + 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"); + } - u8 version = readU8(is); - if(version == 0) - return; - if(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 NodeTimerList::step(float dtime) +std::vector NodeTimerList::step(float dtime) { - std::map elapsed_timers; - // Increment timers - for(std::map::iterator - i = m_data.begin(); - i != m_data.end(); i++){ - v3s16 p = i->first; + std::vector elapsed_timers; + m_time += dtime; + if (m_next_trigger_time == -1. || m_time < m_next_trigger_time) { + return elapsed_timers; + } + std::multimap::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.duration) - elapsed_timers.insert(std::make_pair(p, t.elapsed)); - 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::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; }