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
22{
23 _eventMap.clear();
24 _time = TimePoint::min();
25 _phaseMask = 0;
26}
27
29{
30 if (!phase)
31 _phaseMask = 0;
32 else if (phase <= sizeof(PhaseMask) * 8)
33 _phaseMask = PhaseMask(1u << (phase - 1u));
34}
35
36void EventMap::ScheduleEvent(EventId eventId, Milliseconds time, GroupIndex group /*= 0*/, PhaseIndex phase /*= 0*/)
37{
38 if (group > sizeof(GroupMask) * 8)
39 return;
40
41 if (phase > sizeof(PhaseMask) * 8)
42 return;
43
44 _eventMap.insert(EventStore::value_type(_time + time, Event(eventId, group, phase)));
45}
46
47void EventMap::ScheduleEvent(EventId eventId, Milliseconds minTime, Milliseconds maxTime, GroupIndex group /*= 0*/, PhaseIndex phase /*= 0*/)
48{
49 ScheduleEvent(eventId, randtime(minTime, maxTime), group, phase);
50}
51
53{
54 CancelEvent(eventId);
55 ScheduleEvent(eventId, time, group, phase);
56}
57
58void EventMap::RescheduleEvent(EventId eventId, Milliseconds minTime, Milliseconds maxTime, GroupIndex group /*= 0*/, PhaseIndex 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 auto itr = _eventMap.begin();
78
79 if (itr->first > _time)
80 return 0;
81 else if (_phaseMask && itr->second._phaseMask && !(itr->second._phaseMask & _phaseMask))
82 _eventMap.erase(itr);
83 else
84 {
85 auto eventId = itr->second._id;
86 _lastEvent = itr->second;
87 _eventMap.erase(itr);
88 return eventId;
89 }
90 }
91
92 return 0;
93}
94
96{
97 if (Empty())
98 return;
99
100 EventStore delayed = std::move(_eventMap);
101 for (auto itr = delayed.begin(); itr != delayed.end();)
102 {
103 EventStore::node_type node = delayed.extract(itr++);
104 node.key() = node.key() + delay;
105 _eventMap.insert(_eventMap.end(), std::move(node));
106 }
107}
108
110{
111 if (!group || group > sizeof(GroupMask) * 8 || Empty())
112 return;
113
114 EventStore delayed;
115
116 for (auto itr = _eventMap.begin(); itr != _eventMap.end();)
117 {
118 if (itr->second._groupMask & GroupMask(1u << (group - 1u)))
119 {
120 delayed.insert(EventStore::value_type(itr->first + delay, itr->second));
121 _eventMap.erase(itr++);
122 }
123 else
124 ++itr;
125 }
126
127 _eventMap.insert(delayed.begin(), delayed.end());
128}
129
131{
132 if (Empty())
133 return;
134
135 for (auto itr = _eventMap.begin(); itr != _eventMap.end();)
136 {
137 if (eventId == itr->second._id)
138 {
139 if (itr->first < (_time + delay))
140 {
141 _eventMap.insert(EventStore::value_type(_time + delay, itr->second));
142 itr = _eventMap.erase(itr);
143 continue;
144 }
145
146 }
147 ++itr;
148 }
149}
150
152{
153 if (Empty())
154 return;
155
156 for (auto itr = _eventMap.begin(); itr != _eventMap.end();)
157 {
158 if (eventId == itr->second._id)
159 _eventMap.erase(itr++);
160 else
161 ++itr;
162 }
163}
164
166{
167 if (!group || group > sizeof(GroupMask) * 8 || Empty())
168 return;
169
170 for (auto itr = _eventMap.begin(); itr != _eventMap.end();)
171 {
172 if (itr->second._groupMask & GroupMask(1u << (group - 1u)))
173 _eventMap.erase(itr++);
174 else
175 ++itr;
176 }
177}
178
180{
181 for (auto const& [time, event] : _eventMap)
182 if (eventId == event._id)
183 return std::chrono::duration_cast<Milliseconds>(time - _time);
184
185 return Milliseconds::max();
186}
187
189{
190 return GetTimeUntilEvent(eventId) != Milliseconds::max();
191}
std::chrono::milliseconds Milliseconds
Milliseconds shorthand typedef.
Definition Duration.h:24
Milliseconds randtime(Milliseconds min, Milliseconds max)
Definition Random.cpp:62
uint8 PhaseIndex
Definition EventMap.h:30
bool HasEventScheduled(EventId eventId) const
Definition EventMap.cpp:188
uint8 GroupIndex
Definition EventMap.h:28
TimePoint _time
Definition EventMap.h:269
bool Empty() const
Definition EventMap.h:95
void Repeat(Milliseconds time)
Definition EventMap.cpp:63
std::multimap< TimePoint, Event > EventStore
Definition EventMap.h:51
EventStore _eventMap
Definition EventMap.h:288
Milliseconds GetTimeUntilEvent(EventId eventId) const
Definition EventMap.cpp:179
void DelayEvents(Milliseconds delay)
Definition EventMap.cpp:95
Event _lastEvent
Definition EventMap.h:294
EventId ExecuteEvent()
Definition EventMap.cpp:73
void SetMinimalDelay(EventId eventId, Milliseconds delay)
Definition EventMap.cpp:130
void RescheduleEvent(EventId eventId, Milliseconds time, GroupIndex group=0u, PhaseIndex phase=0u)
Definition EventMap.cpp:52
void CancelEvent(EventId eventId)
Definition EventMap.cpp:151
void SetPhase(PhaseIndex phase)
Definition EventMap.cpp:28
uint8 PhaseMask
Definition EventMap.h:31
uint8 GroupMask
Definition EventMap.h:29
PhaseMask _phaseMask
Definition EventMap.h:279
void CancelEventGroup(GroupIndex group)
Definition EventMap.cpp:165
uint16 EventId
Definition EventMap.h:27
void ScheduleEvent(EventId eventId, Milliseconds time, GroupIndex group=0u, PhaseIndex phase=0u)
Definition EventMap.cpp:36
void Reset()
Definition EventMap.cpp:21