diff options
Diffstat (limited to 'src/common/Utilities/EventMap.cpp')
-rw-r--r-- | src/common/Utilities/EventMap.cpp | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/src/common/Utilities/EventMap.cpp b/src/common/Utilities/EventMap.cpp index d2ff65a14c5..dcfe4686f6b 100644 --- a/src/common/Utilities/EventMap.cpp +++ b/src/common/Utilities/EventMap.cpp @@ -85,6 +85,7 @@ uint32 EventMap::ExecuteEvent() uint32 eventId = (itr->second & 0x0000FFFF); _lastEvent = itr->second; // include phase/group _eventMap.erase(itr); + ScheduleNextFromSeries(_lastEvent); return eventId; } } @@ -139,6 +140,14 @@ void EventMap::CancelEvent(uint32 eventId) else ++itr; } + + for (EventSeriesStore::iterator itr = _timerSeries.begin(); itr != _timerSeries.end();) + { + if (eventId == (itr->first & 0x0000FFFF)) + _timerSeries.erase(itr++); + else + ++itr; + } } void EventMap::CancelEventGroup(uint32 group) @@ -153,6 +162,14 @@ void EventMap::CancelEventGroup(uint32 group) else ++itr; } + + for (EventSeriesStore::iterator itr = _timerSeries.begin(); itr != _timerSeries.end();) + { + if (itr->first & (1 << (group + 15))) + _timerSeries.erase(itr++); + else + ++itr; + } } Milliseconds EventMap::GetTimeUntilEvent(uint32 eventId) const @@ -163,3 +180,40 @@ Milliseconds EventMap::GetTimeUntilEvent(uint32 eventId) const return Milliseconds::max(); } + +void EventMap::ScheduleNextFromSeries(uint32 eventData) +{ + EventSeriesStore::iterator itr = _timerSeries.find(eventData); + if (itr == _timerSeries.end()) + return; + + if (itr->first != eventData) + return; + + if (itr->second.size() == 0) + return; + + Milliseconds time = itr->second.front(); + itr->second.pop(); + + ScheduleEvent(eventData, time); +} + +void EventMap::ScheduleEventSeries(uint32 eventId, uint8 group, uint8 phase, std::initializer_list<Milliseconds> const& timeSeries) +{ + if (group && group <= 8) + eventId |= (1 << (group + 15)); + + if (phase && phase <= 8) + eventId |= (1 << (phase + 23)); + + for (Milliseconds const& time : timeSeries) + _timerSeries[eventId].push(time); + + ScheduleNextFromSeries(eventId); +} + +void EventMap::ScheduleEventSeries(uint32 eventId, std::initializer_list<Milliseconds> const& timeSeries) +{ + ScheduleEventSeries(eventId, 0, 0, timeSeries); +} |