Luanti 5.15.0-dev
 
Loading...
Searching...
No Matches
nodetimer.h
Go to the documentation of this file.
1// Luanti
2// SPDX-License-Identifier: LGPL-2.1-or-later
3// Copyright (C) 2010-2013 celeron55, Perttu Ahola <celeron55@gmail.com>
4
5#pragma once
6
7#include "irr_v3d.h"
8#include <iostream>
9#include <map>
10#include <vector>
11
12/*
13 NodeTimer provides per-node timed callback functionality.
14 Can be used for:
15 - Furnaces, to keep the fire burnin'
16 - "activated" nodes that snap back to their original state
17 after a fixed amount of time (mesecons buttons, for example)
18*/
19
21{
22public:
23 NodeTimer() = default;
24 NodeTimer(const v3s16 &position_):
25 position(position_) {}
26 NodeTimer(f32 timeout_, f32 elapsed_, v3s16 position_):
27 timeout(timeout_), elapsed(elapsed_), position(position_) {}
28 ~NodeTimer() = default;
29
30 void serialize(std::ostream &os) const;
31 void deSerialize(std::istream &is);
32
33 f32 timeout = 0.0f;
34 f32 elapsed = 0.0f;
36};
37
38/*
39 List of timers of all the nodes of a block
40*/
41
43{
44public:
45 NodeTimerList() = default;
46 ~NodeTimerList() = default;
47
48 void serialize(std::ostream &os, u8 map_format_version) const;
49 void deSerialize(std::istream &is, u8 map_format_version);
50
51 // Get timer
52 NodeTimer get(const v3s16 &p) {
53 auto n = m_iterators.find(p);
54 if (n == m_iterators.end())
55 return NodeTimer();
56 NodeTimer t = n->second->second;
57 t.elapsed = t.timeout - (n->second->first - m_time);
58 return t;
59 }
60 // Deletes timer
61 void remove(v3s16 p) {
62 auto n = m_iterators.find(p);
63 if(n != m_iterators.end()) {
64 double removed_time = n->second->first;
65 m_timers.erase(n->second);
66 m_iterators.erase(n);
67 // Yes, this is float equality, but it is not a problem
68 // since we only test equality of floats as an ordered type
69 // and thus we never lose precision
70 if (removed_time == m_next_trigger_time) {
71 if (m_timers.empty())
73 else
74 m_next_trigger_time = m_timers.begin()->first;
75 }
76 }
77 }
78 // Undefined behavior if there already is a timer
79 void insert(const NodeTimer &timer) {
80 v3s16 p = timer.position;
81 double trigger_time = m_time + (double)(timer.timeout - timer.elapsed);
82 auto it = m_timers.emplace(trigger_time, timer);
83 m_iterators.emplace(p, it);
84 if (m_next_trigger_time == -1. || trigger_time < m_next_trigger_time)
85 m_next_trigger_time = trigger_time;
86 }
87 // Deletes old timer and sets a new one
88 inline void set(const NodeTimer &timer) {
89 remove(timer.position);
90 insert(timer);
91 }
92 // Deletes all timers
93 void clear() {
94 m_timers.clear();
95 m_iterators.clear();
97 }
98
99 // Move forward in time, returns elapsed timers
100 std::vector<NodeTimer> step(float dtime);
101
102private:
103 std::multimap<double, NodeTimer> m_timers;
104 std::map<v3s16, std::multimap<double, NodeTimer>::iterator> m_iterators;
105 double m_next_trigger_time = -1.0;
106 double m_time = 0.0;
107};
Definition nodetimer.h:43
~NodeTimerList()=default
std::multimap< double, NodeTimer > m_timers
Definition nodetimer.h:103
void insert(const NodeTimer &timer)
Definition nodetimer.h:79
std::map< v3s16, std::multimap< double, NodeTimer >::iterator > m_iterators
Definition nodetimer.h:104
void remove(v3s16 p)
Definition nodetimer.h:61
double m_time
Definition nodetimer.h:106
void set(const NodeTimer &timer)
Definition nodetimer.h:88
NodeTimer get(const v3s16 &p)
Definition nodetimer.h:52
double m_next_trigger_time
Definition nodetimer.h:105
std::vector< NodeTimer > step(float dtime)
Definition nodetimer.cpp:112
void clear()
Definition nodetimer.h:93
void serialize(std::ostream &os, u8 map_format_version) const
Definition nodetimer.cpp:30
NodeTimerList()=default
void deSerialize(std::istream &is, u8 map_format_version)
Definition nodetimer.cpp:59
Definition nodetimer.h:21
NodeTimer()=default
f32 timeout
Definition nodetimer.h:33
f32 elapsed
Definition nodetimer.h:34
~NodeTimer()=default
v3s16 position
Definition nodetimer.h:35
void serialize(std::ostream &os) const
Definition nodetimer.cpp:14
NodeTimer(const v3s16 &position_)
Definition nodetimer.h:24
NodeTimer(f32 timeout_, f32 elapsed_, v3s16 position_)
Definition nodetimer.h:26
void deSerialize(std::istream &is)
Definition nodetimer.cpp:20
core::vector3d< s16 > v3s16
Definition irr_v3d.h:13
static std::string p(std::string path)
Definition test_filesys.cpp:64