X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fnodetimer.h;h=40e54ccc569221e5e679965423d63ad5a38561ab;hb=54dccc480eb03adcf219a7add58f547284f40f76;hp=b9598673c2b383b5bc0f0293c1eff851df978e39;hpb=037b2591971d752e67fa7d47095b996b3f56da5a;p=dragonfireclient.git diff --git a/src/nodetimer.h b/src/nodetimer.h index b9598673c..40e54ccc5 100644 --- a/src/nodetimer.h +++ b/src/nodetimer.h @@ -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 @@ -17,12 +17,12 @@ with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef NODETIMER_HEADER -#define NODETIMER_HEADER +#pragma once -#include "irrlichttypes.h" +#include "irr_v3d.h" #include #include +#include /* NodeTimer provides per-node timed callback functionality. @@ -35,16 +35,19 @@ with this program; if not, write to the Free Software Foundation, Inc., class NodeTimer { public: - NodeTimer(): duration(0.), elapsed(0.) {} - NodeTimer(f32 duration_, f32 elapsed_): - duration(duration_), elapsed(elapsed_) {} - ~NodeTimer() {} - + NodeTimer() = default; + NodeTimer(const v3s16 &position_): + position(position_) {} + NodeTimer(f32 timeout_, f32 elapsed_, v3s16 position_): + timeout(timeout_), elapsed(elapsed_), position(position_) {} + ~NodeTimer() = default; + void serialize(std::ostream &os) const; void deSerialize(std::istream &is); - - f32 duration; - f32 elapsed; + + f32 timeout = 0.0f; + f32 elapsed = 0.0f; + v3s16 position; }; /* @@ -54,38 +57,72 @@ class NodeTimer class NodeTimerList { public: - NodeTimerList() {} - ~NodeTimerList() {} - - void serialize(std::ostream &os) const; - void deSerialize(std::istream &is); - + NodeTimerList() = default; + ~NodeTimerList() = default; + + void serialize(std::ostream &os, u8 map_format_version) const; + void deSerialize(std::istream &is, u8 map_format_version); + // Get timer - NodeTimer get(v3s16 p){ - std::map::iterator n = m_data.find(p); - if(n == m_data.end()) + NodeTimer get(const v3s16 &p) { + std::map::iterator>::iterator n = + m_iterators.find(p); + if (n == m_iterators.end()) return NodeTimer(); - return n->second; + NodeTimer t = n->second->second; + t.elapsed = t.timeout - (n->second->first - m_time); + return t; } // Deletes timer - void remove(v3s16 p){ - m_data.erase(p); + void remove(v3s16 p) { + std::map::iterator>::iterator n = + m_iterators.find(p); + if(n != m_iterators.end()) { + double removed_time = n->second->first; + m_timers.erase(n->second); + m_iterators.erase(n); + // Yes, this is float equality, but it is not a problem + // since we only test equality of floats as an ordered type + // and thus we never lose precision + if (removed_time == m_next_trigger_time) { + if (m_timers.empty()) + m_next_trigger_time = -1.; + else + m_next_trigger_time = m_timers.begin()->first; + } + } + } + // Undefined behaviour if there already is a timer + void insert(NodeTimer timer) { + v3s16 p = timer.position; + double trigger_time = m_time + (double)(timer.timeout - timer.elapsed); + std::multimap::iterator it = + m_timers.insert(std::pair( + trigger_time, timer + )); + m_iterators.insert( + std::pair::iterator>(p, it)); + if (m_next_trigger_time == -1. || trigger_time < m_next_trigger_time) + m_next_trigger_time = trigger_time; } // Deletes old timer and sets a new one - void set(v3s16 p, NodeTimer t){ - m_data[p] = t; + inline void set(const NodeTimer &timer) { + remove(timer.position); + insert(timer); } // Deletes all timers - void clear(){ - m_data.clear(); + void clear() { + m_timers.clear(); + m_iterators.clear(); + m_next_trigger_time = -1.; } - // A step in time. Returns map of elapsed timers. - std::map step(float dtime); + // Move forward in time, returns elapsed timers + std::vector step(float dtime); private: - std::map m_data; + std::multimap m_timers; + std::map::iterator> m_iterators; + double m_next_trigger_time = -1.0; + double m_time = 0.0; }; - -#endif -