diff options
author | Kahrl <kahrl@gmx.net> | 2012-03-19 01:08:04 +0100 |
---|---|---|
committer | Perttu Ahola <celeron55@gmail.com> | 2012-06-03 22:31:00 +0300 |
commit | 704782c95b8a4194a9383da55d93f37fd0f7278f (patch) | |
tree | 6f69d40659b463b54670b487ee4a0d0c2c63891b /src/nodetimer.cpp | |
parent | 67059e193229137e88f5e10e08c9c7e18c408281 (diff) | |
download | minetest-704782c95b8a4194a9383da55d93f37fd0f7278f.tar.gz minetest-704782c95b8a4194a9383da55d93f37fd0f7278f.tar.bz2 minetest-704782c95b8a4194a9383da55d93f37fd0f7278f.zip |
WIP node metadata, node timers
Diffstat (limited to 'src/nodetimer.cpp')
-rw-r--r-- | src/nodetimer.cpp | 141 |
1 files changed, 141 insertions, 0 deletions
diff --git a/src/nodetimer.cpp b/src/nodetimer.cpp new file mode 100644 index 000000000..b081bf66e --- /dev/null +++ b/src/nodetimer.cpp @@ -0,0 +1,141 @@ +/* +Minetest-c55 +Copyright (C) 2010-2012 celeron55, Perttu Ahola <celeron55@gmail.com> + +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 +(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. + +You should have received a copy of the GNU 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" + +/* + NodeTimer +*/ + +void NodeTimer::serialize(std::ostream &os) const +{ + writeF1000(os, duration); + writeF1000(os, elapsed); +} + +void NodeTimer::deSerialize(std::istream &is) +{ + duration = readF1000(is); + elapsed = readF1000(is); +} + +/* + NodeTimerList +*/ + +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::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.duration <= 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)); + } +} + +std::map<v3s16, f32> NodeTimerList::step(float dtime) +{ + std::map<v3s16, f32> elapsed_timers; + // Increment timers + for(std::map<v3s16, NodeTimer>::iterator + i = m_data.begin(); + 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)); + else + i->second = t; + } + // Delete elapsed timers + for(std::map<v3s16, f32>::const_iterator + i = elapsed_timers.begin(); + i != elapsed_timers.end(); i++){ + v3s16 p = i->first; + m_data.erase(p); + } + return elapsed_timers; +} |