TrinityCore
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
22{
23 _eventMap.clear();
24 _time = TimePoint::min();
25 _phase = 0;
26}
27
29{
30 if (!phase)
31 _phase = 0;
32 else if (phase <= 8)
33 _phase = uint8(1 << (phase - 1));
34}
35
36void EventMap::ScheduleEvent(uint32 eventId, Milliseconds time, uint32 group /*= 0*/, uint8 phase /*= 0*/)
37{
38 if (group && group <= 8)
39 eventId |= (1 << (group + 15));
40
41 if (phase && phase <= 8)
42 eventId |= (1 << (phase + 23));
43
44 _eventMap.insert(EventStore::value_type(_time + time, eventId));
45}
46
47void EventMap::ScheduleEvent(uint32 eventId, Milliseconds minTime, Milliseconds maxTime, uint32 group /*= 0*/, uint8 phase /*= 0*/)
48{
49 ScheduleEvent(eventId, randtime(minTime, maxTime), group, phase);
50}
51
52void EventMap::RescheduleEvent(uint32 eventId, Milliseconds time, uint32 group /*= 0*/, uint8 phase /*= 0*/)
53{
54 CancelEvent(eventId);
55 ScheduleEvent(eventId, time, group, phase);
56}
57
58void EventMap::RescheduleEvent(uint32 eventId, Milliseconds minTime, Milliseconds maxTime, uint32 group /*= 0*/, uint8 phase /*= 0*/)
59{
60 RescheduleEvent(eventId, randtime(minTime, maxTime), group, phase);
61}
62
64{
65 _eventMap.insert(EventStore::value_type(_time + time, _lastEvent));
66}
67
69{
70 Repeat(randtime(minTime, maxTime));
71}
72
74{
75 while (!Empty())
76 {
77 EventStore::iterator itr = _eventMap.begin();
78
79 if (itr->first > _time)
80 return 0;
81 else if (_phase && (itr->second & 0xFF000000) && !((itr->second >> 24) & _phase))
82 _eventMap.erase(itr);
83 else
84 {
85 uint32 eventId = (itr->second & 0x0000FFFF);
86 _lastEvent = itr->second; // include phase/group
87 _eventMap.erase(itr);
89 return eventId;
90 }
91 }
92
93 return 0;
94}
95
97{
98 if (Empty())
99 return;
100
101 EventStore delayed = std::move(_eventMap);
102 for (EventStore::iterator itr = delayed.begin(); itr != delayed.end();)
103 {
104 EventStore::node_type node = delayed.extract(itr++);
105 node.key() = node.key() + delay;
106 _eventMap.insert(_eventMap.end(), std::move(node));
107 }
108}
109
111{
112 if (!group || group > 8 || Empty())
113 return;
114
115 EventStore delayed;
116
117 for (EventStore::iterator itr = _eventMap.begin(); itr != _eventMap.end();)
118 {
119 if (itr->second & (1 << (group + 15)))
120 {
121 delayed.insert(EventStore::value_type(itr->first + delay, itr->second));
122 _eventMap.erase(itr++);
123 }
124 else
125 ++itr;
126 }
127
128 _eventMap.insert(delayed.begin(), delayed.end());
129}
130
132{
133 if (Empty())
134 return;
135
136 for (EventStore::iterator itr = _eventMap.begin(); itr != _eventMap.end();)
137 {
138 if (eventId == (itr->second & 0x0000FFFF))
139 _eventMap.erase(itr++);
140 else
141 ++itr;
142 }
143
144 for (EventSeriesStore::iterator itr = _timerSeries.begin(); itr != _timerSeries.end();)
145 {
146 if (eventId == (itr->first & 0x0000FFFF))
147 _timerSeries.erase(itr++);
148 else
149 ++itr;
150 }
151}
152
154{
155 if (!group || group > 8 || Empty())
156 return;
157
158 for (EventStore::iterator itr = _eventMap.begin(); itr != _eventMap.end();)
159 {
160 if (itr->second & (1 << (group + 15)))
161 _eventMap.erase(itr++);
162 else
163 ++itr;
164 }
165
166 for (EventSeriesStore::iterator itr = _timerSeries.begin(); itr != _timerSeries.end();)
167 {
168 if (itr->first & (1 << (group + 15)))
169 _timerSeries.erase(itr++);
170 else
171 ++itr;
172 }
173}
174
176{
177 for (std::pair<TimePoint const, uint32> const& itr : _eventMap)
178 if (eventId == (itr.second & 0x0000FFFF))
179 return std::chrono::duration_cast<Milliseconds>(itr.first - _time);
180
181 return Milliseconds::max();
182}
183
185{
186 EventSeriesStore::iterator itr = _timerSeries.find(eventData);
187 if (itr == _timerSeries.end())
188 return;
189
190 if (itr->first != eventData)
191 return;
192
193 if (itr->second.size() == 0)
194 return;
195
196 Milliseconds time = itr->second.front();
197 itr->second.pop();
198
199 ScheduleEvent(eventData, time);
200}
201
202void EventMap::ScheduleEventSeries(uint32 eventId, uint8 group, uint8 phase, std::initializer_list<Milliseconds> const& timeSeries)
203{
204 if (group && group <= 8)
205 eventId |= (1 << (group + 15));
206
207 if (phase && phase <= 8)
208 eventId |= (1 << (phase + 23));
209
210 for (Milliseconds const& time : timeSeries)
211 _timerSeries[eventId].push(time);
212
213 ScheduleNextFromSeries(eventId);
214}
215
216void EventMap::ScheduleEventSeries(uint32 eventId, std::initializer_list<Milliseconds> const& timeSeries)
217{
218 ScheduleEventSeries(eventId, 0, 0, timeSeries);
219}
uint8_t uint8
Definition: Define.h:144
uint32_t uint32
Definition: Define.h:142
std::chrono::milliseconds Milliseconds
Milliseconds shorthand typedef.
Definition: Duration.h:29
Milliseconds randtime(Milliseconds min, Milliseconds max)
Definition: Random.cpp:62
uint32 ExecuteEvent()
Definition: EventMap.cpp:73
uint8 _phase
Definition: EventMap.h:276
TimePoint _time
Definition: EventMap.h:266
bool Empty() const
Definition: EventMap.h:84
void Repeat(Milliseconds time)
Definition: EventMap.cpp:63
EventStore _eventMap
Definition: EventMap.h:285
void DelayEvents(Milliseconds delay)
Definition: EventMap.cpp:96
void ScheduleEventSeries(uint32 eventId, uint8 group, uint8 phase, std::initializer_list< Milliseconds > const &timeSeries)
Definition: EventMap.cpp:202
void CancelEventGroup(uint32 group)
Definition: EventMap.cpp:153
void ScheduleEvent(uint32 eventId, Milliseconds time, uint32 group=0, uint8 phase=0)
Definition: EventMap.cpp:36
EventSeriesStore _timerSeries
Definition: EventMap.h:297
std::multimap< TimePoint, uint32 > EventStore
Definition: EventMap.h:39
uint32 _lastEvent
Definition: EventMap.h:291
void CancelEvent(uint32 eventId)
Definition: EventMap.cpp:131
void SetPhase(uint8 phase)
Definition: EventMap.cpp:28
Milliseconds GetTimeUntilEvent(uint32 eventId) const
Definition: EventMap.cpp:175
void ScheduleNextFromSeries(uint32 eventData)
Definition: EventMap.cpp:184
void RescheduleEvent(uint32 eventId, Milliseconds time, uint32 group=0, uint8 phase=0)
Definition: EventMap.cpp:52
void Reset()
Definition: EventMap.cpp:21