X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fnodetimer.cpp;h=35094054691da236e30e0369af5046f9a3f1407d;hb=9719aded5430dd57591310c9cae06944dc345d42;hp=b081bf66e95bbd0c8d05d692dc65d11d41ad48ee;hpb=704782c95b8a4194a9383da55d93f37fd0f7278f;p=oweals%2Fminetest.git diff --git a/src/nodetimer.cpp b/src/nodetimer.cpp index b081bf66e..350940546 100644 --- a/src/nodetimer.cpp +++ b/src/nodetimer.cpp @@ -1,25 +1,27 @@ /* -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 General Public License as published by -the Free Software Foundation; either version 2 of the License, or +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. +GNU Lesser General Public License for more details. -You should have received a copy of the GNU General Public License along +You should have received a copy of the GNU Lesser General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "nodetimer.h" -#include "utility.h" #include "log.h" +#include "serialization.h" +#include "util/serialize.h" +#include "constants.h" // MAP_BLOCKSIZE /* NodeTimer @@ -27,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); } @@ -41,41 +43,52 @@ 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_data.empty()) { + writeU8(os, 0); // version + return; + } + writeU8(os, 1); // version + writeU16(os, m_data.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_data.size()); + } - for(std::map::const_iterator + for (std::map::const_iterator i = m_data.begin(); - i != m_data.end(); i++){ + 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; + 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) +void NodeTimerList::deSerialize(std::istream &is, u8 map_format_version) { m_data.clear(); - u8 version = readU8(is); - if(version == 0) - return; - if(version != 1) - throw SerializationError("unsupported NodeTimerList version"); + 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); @@ -83,19 +96,19 @@ void NodeTimerList::deSerialize(std::istream &is) { 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; t.deSerialize(is); - if(t.duration <= 0) + if(t.timeout <= 0) { - infostream<<"WARNING: NodeTimerList::deSerialize(): " + warningstream<<"NodeTimerList::deSerialize(): " <<"invalid data at position" <<"("< NodeTimerList::step(float dtime) +std::map NodeTimerList::step(float dtime) { - std::map elapsed_timers; + std::map elapsed_timers; // Increment timers for(std::map::iterator i = m_data.begin(); - i != m_data.end(); i++){ + i != m_data.end(); ++i){ v3s16 p = i->first; NodeTimer t = i->second; t.elapsed += dtime; - if(t.elapsed >= t.duration) - elapsed_timers.insert(std::make_pair(p, t.elapsed)); + if(t.elapsed >= t.timeout) + elapsed_timers.insert(std::make_pair(p, t)); else i->second = t; } // Delete elapsed timers - for(std::map::const_iterator + for(std::map::const_iterator i = elapsed_timers.begin(); - i != elapsed_timers.end(); i++){ + i != elapsed_timers.end(); ++i){ v3s16 p = i->first; m_data.erase(p); }