TrinityCore
Loading...
Searching...
No Matches
EventMap.cpp
Go to the documentation of this file.
1/*
2 * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the
6 * Free Software Foundation; either version 2 of the License, or (at your
7 * option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18#include "EventMap.h"
19#include "Random.h"
20
21EventMap::EventMap(EventMap const& other) = default;
22EventMap& EventMap::operator=(EventMap const& other) = default;
23EventMap::~EventMap() = default;
24
26{
27 _eventMap.clear();
28 _time = TimePoint::min();
29 _phaseMask = 0;
30}
31
33{
34 if (!phase)
35 _phaseMask = 0;
36 else if (phase <= sizeof(PhaseMask) * 8)
37 _phaseMask = PhaseMask(1u << (phase - 1u));
38}
39
40void EventMap::ScheduleEvent(EventId eventId, Milliseconds time, GroupIndex group /*= 0*/, PhaseIndex phase /*= 0*/)
41{
42 if (group > sizeof(GroupMask) * 8)
43 return;
44
45 if (phase > sizeof(PhaseMask) * 8)
46 return;
47
48 _eventMap.emplace(_time + time, Event(eventId, group, phase));
49}
50
51void EventMap::ScheduleEvent(EventId eventId, Milliseconds minTime, Milliseconds maxTime, GroupIndex group /*= 0*/, PhaseIndex phase /*= 0*/)
52{
53 ScheduleEvent(eventId, randtime(minTime, maxTime), group, phase);
54}
55
57{
58 CancelEvent(eventId);
59 ScheduleEvent(eventId, time, group, phase);
60}
61
62void EventMap::RescheduleEvent(EventId eventId, Milliseconds minTime, Milliseconds maxTime, GroupIndex group /*= 0*/, PhaseIndex phase /*= 0*/)
63{
64 RescheduleEvent(eventId, randtime(minTime, maxTime), group, phase);
65}
66
68{
69 _eventMap.insert(EventStore::value_type(_time + time, _lastEvent));
70}
71
73{
74 Repeat(randtime(minTime, maxTime));
75}
76
78{
79 while (!Empty())
80 {
81 auto itr = _eventMap.begin();
82
83 if (itr->first > _time)
84 return 0;
85 else if (_phaseMask && itr->second._phaseMask && !(itr->second._phaseMask & _phaseMask))
86 _eventMap.erase(itr);
87 else
88 {
89 auto eventId = itr->second._id;
90 _lastEvent = itr->second;
91 _eventMap.erase(itr);
93 return eventId;
94 }
95 }
96
97 return 0;
98}
99
101{
102 if (Empty())
103 return;
104
105 EventStore delayed = std::move(_eventMap);
106 for (auto itr = delayed.begin(); itr != delayed.end();)
107 {
108 EventStore::node_type node = delayed.extract(itr++);
109 node.key() += delay;
110 _eventMap.insert(_eventMap.end(), std::move(node));
111 }
112}
113
115{
116 if (!group || group > sizeof(GroupMask) * 8 || Empty())
117 return;
118
119 EventStore delayed;
120 for (auto itr = _eventMap.begin(); itr != _eventMap.end();)
121 {
122 if (itr->second._groupMask & GroupMask(1u << (group - 1u)))
123 {
124 EventStore::node_type node = _eventMap.extract(itr++);
125 node.key() += delay;
126 delayed.insert(delayed.end(), std::move(node));
127 }
128 else
129 ++itr;
130 }
131
132 _eventMap.merge(delayed);
133}
134
136{
137 if (Empty())
138 return;
139
140 for (auto itr = _eventMap.begin(); itr != _eventMap.end();)
141 {
142 if (eventId == itr->second._id)
143 {
144 if (itr->first < (_time + delay))
145 {
146 _eventMap.insert(EventStore::value_type(_time + delay, itr->second));
147 itr = _eventMap.erase(itr);
148 continue;
149 }
150
151 }
152 ++itr;
153 }
154}
155
157{
158 if (Empty())
159 return;
160
161 for (auto itr = _eventMap.begin(); itr != _eventMap.end();)
162 {
163 if (eventId == itr->second._id)
164 _eventMap.erase(itr++);
165 else
166 ++itr;
167 }
168
169 for (auto itr = _timerSeries.begin(); itr != _timerSeries.end();)
170 {
171 if (eventId == itr->first._id)
172 _timerSeries.erase(itr++);
173 else
174 ++itr;
175 }
176}
177
179{
180 if (!group || group > sizeof(GroupMask) * 8 || Empty())
181 return;
182
183 for (auto itr = _eventMap.begin(); itr != _eventMap.end();)
184 {
185 if (itr->second._groupMask & GroupMask(1u << (group - 1u)))
186 _eventMap.erase(itr++);
187 else
188 ++itr;
189 }
190
191 for (auto itr = _timerSeries.begin(); itr != _timerSeries.end();)
192 {
193 if (itr->first._groupMask & GroupMask(1 << (group - 1u)))
194 _timerSeries.erase(itr++);
195 else
196 ++itr;
197 }
198}
199
201{
202 for (auto const& [time, event] : _eventMap)
203 if (eventId == event._id)
204 return std::chrono::duration_cast<Milliseconds>(time - _time);
205
206 return Milliseconds::max();
207}
208
210{
211 return GetTimeUntilEvent(eventId) != Milliseconds::max();
212}
213
215{
216 EventSeriesStore::iterator itr = _timerSeries.find(eventData);
217 if (itr == _timerSeries.end())
218 return;
219
220 _eventMap.emplace(_time + itr->second.front(), eventData);
221
222 if (itr->second.size() > 1)
223 itr->second.erase(itr->second.begin());
224 else
225 _timerSeries.erase(itr);
226}
227
228void EventMap::ScheduleEventSeries(EventId eventId, GroupIndex group, PhaseIndex phase, std::initializer_list<Milliseconds> timeSeries)
229{
230 if (group > sizeof(GroupMask) * 8)
231 return;
232
233 if (phase > sizeof(PhaseMask) * 8)
234 return;
235
236 if (!timeSeries.size())
237 return;
238
239 Event event(eventId, group, phase);
240
241 std::vector<Milliseconds>& series = _timerSeries[event];
242 series.insert(series.end(), timeSeries.begin(), timeSeries.end());
243
245}
246
247void EventMap::ScheduleEventSeries(EventId eventId, std::initializer_list<Milliseconds> timeSeries)
248{
249 ScheduleEventSeries(eventId, 0, 0, timeSeries);
250}
std::chrono::milliseconds Milliseconds
Milliseconds shorthand typedef.
Definition Duration.h:24
Milliseconds randtime(Milliseconds min, Milliseconds max)
Definition Random.cpp:63
void ScheduleEventSeries(EventId eventId, GroupIndex group, PhaseIndex phase, std::initializer_list< Milliseconds > timeSeries)
Definition EventMap.cpp:228
uint8 PhaseIndex
Definition EventMap.h:32
EventMap()
Definition EventMap.h:59
bool HasEventScheduled(EventId eventId) const
Definition EventMap.cpp:209
uint8 GroupIndex
Definition EventMap.h:30
TimePoint _time
Definition EventMap.h:303
bool Empty() const
Definition EventMap.h:105
void Repeat(Milliseconds time)
Definition EventMap.cpp:67
EventMap & operator=(EventMap const &other)
std::multimap< TimePoint, Event > EventStore
Definition EventMap.h:55
EventStore _eventMap
Definition EventMap.h:322
Milliseconds GetTimeUntilEvent(EventId eventId) const
Definition EventMap.cpp:200
void DelayEvents(Milliseconds delay)
Definition EventMap.cpp:100
Event _lastEvent
Definition EventMap.h:328
EventId ExecuteEvent()
Definition EventMap.cpp:77
void SetMinimalDelay(EventId eventId, Milliseconds delay)
Definition EventMap.cpp:135
void RescheduleEvent(EventId eventId, Milliseconds time, GroupIndex group=0u, PhaseIndex phase=0u)
Definition EventMap.cpp:56
EventSeriesStore _timerSeries
Definition EventMap.h:334
void CancelEvent(EventId eventId)
Definition EventMap.cpp:156
void SetPhase(PhaseIndex phase)
Definition EventMap.cpp:32
uint8 PhaseMask
Definition EventMap.h:33
uint8 GroupMask
Definition EventMap.h:31
PhaseMask _phaseMask
Definition EventMap.h:313
void CancelEventGroup(GroupIndex group)
Definition EventMap.cpp:178
void ScheduleNextFromSeries(Event eventData)
Definition EventMap.cpp:214
uint16 EventId
Definition EventMap.h:29
void ScheduleEvent(EventId eventId, Milliseconds time, GroupIndex group=0u, PhaseIndex phase=0u)
Definition EventMap.cpp:40
void Reset()
Definition EventMap.cpp:25