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 _phase = 0;
30}
31
33{
34 if (!phase)
35 _phase = 0;
36 else if (phase <= 8)
37 _phase = uint8(1 << (phase - 1));
38}
39
40void EventMap::ScheduleEvent(uint32 eventId, Milliseconds time, uint32 group /*= 0*/, uint8 phase /*= 0*/)
41{
42 if (group && group <= 8)
43 eventId |= (1 << (group + 15));
44
45 if (phase && phase <= 8)
46 eventId |= (1 << (phase + 23));
47
48 _eventMap.insert({ _time + time, eventId });
49}
50
51void EventMap::ScheduleEvent(uint32 eventId, Milliseconds minTime, Milliseconds maxTime, uint32 group /*= 0*/, uint8 phase /*= 0*/)
52{
53 ScheduleEvent(eventId, randtime(minTime, maxTime), group, phase);
54}
55
56void EventMap::RescheduleEvent(uint32 eventId, Milliseconds time, uint32 group /*= 0*/, uint8 phase /*= 0*/)
57{
58 CancelEvent(eventId);
59 ScheduleEvent(eventId, time, group, phase);
60}
61
62void EventMap::RescheduleEvent(uint32 eventId, Milliseconds minTime, Milliseconds maxTime, uint32 group /*= 0*/, uint8 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 EventStore::iterator itr = _eventMap.begin();
82
83 if (itr->first > _time)
84 return 0;
85 else if (_phase && (itr->second & 0xFF000000) && !((itr->second >> 24) & _phase))
86 _eventMap.erase(itr);
87 else
88 {
89 uint32 eventId = (itr->second & 0x0000FFFF);
90 _lastEvent = itr->second; // include phase/group
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 (EventStore::iterator 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 > 8 || Empty())
117 return;
118
119 EventStore delayed;
120 for (EventStore::iterator itr = _eventMap.begin(); itr != _eventMap.end();)
121 {
122 if (itr->second & (1 << (group + 15)))
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 (EventStore::iterator itr = _eventMap.begin(); itr != _eventMap.end();)
141 {
142 if (eventId == (itr->second & 0x0000FFFF))
143 _eventMap.erase(itr++);
144 else
145 ++itr;
146 }
147
148 for (EventSeriesStore::iterator itr = _timerSeries.begin(); itr != _timerSeries.end();)
149 {
150 if (eventId == (itr->first & 0x0000FFFF))
151 _timerSeries.erase(itr++);
152 else
153 ++itr;
154 }
155}
156
158{
159 if (!group || group > 8 || Empty())
160 return;
161
162 for (EventStore::iterator itr = _eventMap.begin(); itr != _eventMap.end();)
163 {
164 if (itr->second & (1 << (group + 15)))
165 _eventMap.erase(itr++);
166 else
167 ++itr;
168 }
169
170 for (EventSeriesStore::iterator itr = _timerSeries.begin(); itr != _timerSeries.end();)
171 {
172 if (itr->first & (1 << (group + 15)))
173 _timerSeries.erase(itr++);
174 else
175 ++itr;
176 }
177}
178
180{
181 for (std::pair<TimePoint const, uint32> const& itr : _eventMap)
182 if (eventId == (itr.second & 0x0000FFFF))
183 return std::chrono::duration_cast<Milliseconds>(itr.first - _time);
184
185 return Milliseconds::max();
186}
187
189{
190 EventSeriesStore::iterator itr = _timerSeries.find(eventData);
191 if (itr == _timerSeries.end())
192 return;
193
194 ScheduleEvent(eventData, itr->second.front());
195
196 if (itr->second.size() > 1)
197 itr->second.erase(itr->second.begin());
198 else
199 _timerSeries.erase(itr);
200}
201
202void EventMap::ScheduleEventSeries(uint32 eventId, uint8 group, uint8 phase, std::initializer_list<Milliseconds> timeSeries)
203{
204 if (!timeSeries.size())
205 return;
206
207 if (group && group <= 8)
208 eventId |= (1 << (group + 15));
209
210 if (phase && phase <= 8)
211 eventId |= (1 << (phase + 23));
212
213 std::vector<Milliseconds>& series = _timerSeries[eventId];
214 series.insert(series.end(), timeSeries.begin(), timeSeries.end());
215
216 ScheduleNextFromSeries(eventId);
217}
218
219void EventMap::ScheduleEventSeries(uint32 eventId, std::initializer_list<Milliseconds> timeSeries)
220{
221 ScheduleEventSeries(eventId, 0, 0, timeSeries);
222}
uint8_t uint8
Definition Define.h:156
uint32_t uint32
Definition Define.h:154
std::chrono::milliseconds Milliseconds
Milliseconds shorthand typedef.
Definition Duration.h:24
Milliseconds randtime(Milliseconds min, Milliseconds max)
Definition Random.cpp:62
uint32 ExecuteEvent()
Definition EventMap.cpp:77
void ScheduleEventSeries(uint32 eventId, uint8 group, uint8 phase, std::initializer_list< Milliseconds > timeSeries)
Definition EventMap.cpp:202
EventMap()
Definition EventMap.h:43
uint8 _phase
Definition EventMap.h:281
TimePoint _time
Definition EventMap.h:271
bool Empty() const
Definition EventMap.h:89
void Repeat(Milliseconds time)
Definition EventMap.cpp:67
EventMap & operator=(EventMap const &other)
EventStore _eventMap
Definition EventMap.h:290
void DelayEvents(Milliseconds delay)
Definition EventMap.cpp:100
void CancelEventGroup(uint32 group)
Definition EventMap.cpp:157
void ScheduleEvent(uint32 eventId, Milliseconds time, uint32 group=0, uint8 phase=0)
Definition EventMap.cpp:40
EventSeriesStore _timerSeries
Definition EventMap.h:302
std::multimap< TimePoint, uint32 > EventStore
Definition EventMap.h:39
uint32 _lastEvent
Definition EventMap.h:296
void CancelEvent(uint32 eventId)
Definition EventMap.cpp:135
void SetPhase(uint8 phase)
Definition EventMap.cpp:32
Milliseconds GetTimeUntilEvent(uint32 eventId) const
Definition EventMap.cpp:179
void ScheduleNextFromSeries(uint32 eventData)
Definition EventMap.cpp:188
void RescheduleEvent(uint32 eventId, Milliseconds time, uint32 group=0, uint8 phase=0)
Definition EventMap.cpp:56
void Reset()
Definition EventMap.cpp:25