diff options
author | Trisjdc <trisjdc@gmail.com> | 2014-06-02 23:59:35 +0100 |
---|---|---|
committer | Trisjdc <trisjdc@gmail.com> | 2014-06-02 23:59:35 +0100 |
commit | 8db02c52acbdbf2c3d0280a01ca6a8b367eb5617 (patch) | |
tree | 671e2e030b5fab72bbd4ab3d6e4e47d3c3a3db8c /src/server/game/AI/CreatureAIImpl.h | |
parent | 01b33a67726d04a2862fd079c02fb432e2b9ec9b (diff) |
Core/Util: A couple useful new functions for EventMap, as well as getting rid of some old junk
Diffstat (limited to 'src/server/game/AI/CreatureAIImpl.h')
-rw-r--r-- | src/server/game/AI/CreatureAIImpl.h | 68 |
1 files changed, 32 insertions, 36 deletions
diff --git a/src/server/game/AI/CreatureAIImpl.h b/src/server/game/AI/CreatureAIImpl.h index 7447e290ba9..378d3ca18ab 100644 --- a/src/server/game/AI/CreatureAIImpl.h +++ b/src/server/game/AI/CreatureAIImpl.h @@ -327,7 +327,7 @@ class EventMap typedef std::multimap<uint32, uint32> EventStore; public: - EventMap() : _time(0), _phase(0) { } + EventMap() : _time(0), _phase(0), _lastEvent(0) { } /** * @name Reset @@ -447,27 +447,22 @@ class EventMap /** * @name RepeatEvent - * @brief Cancels the closest event and reschedules it. + * @brief Repeats the mostly recently executed event. * @param time Time until the event occurs. */ - void RepeatEvent(uint32 time) + void Repeat(uint32 time) { - if (Empty()) - return; - - uint32 eventId = _eventMap.begin()->second; - _eventMap.erase(_eventMap.begin()); - ScheduleEvent(eventId, time); + _eventMap.insert(EventStore::value_type(_time + time, _lastEvent)); } /** - * @name PopEvent - * @brief Remove the first event in the map. + * @name RepeatEvent + * @brief Repeats the mostly recently executed event. + * @param time Time until the event occurs. Equivalent to Repeat(urand(minTime, maxTime). */ - void PopEvent() + void Repeat(uint32 minTime, uint32 maxTime) { - if (!Empty()) - _eventMap.erase(_eventMap.begin()); + Repeat(urand(minTime, maxTime)); } /** @@ -488,6 +483,7 @@ class EventMap else { uint32 eventId = (itr->second & 0x0000FFFF); + _lastEvent = itr->second; // include phase/group _eventMap.erase(itr); return eventId; } @@ -497,28 +493,6 @@ class EventMap } /** - * @name GetEvent - * @brief Returns the next event to execute. - * @return Id of the event to execute. - */ - uint32 GetEvent() - { - while (!Empty()) - { - EventStore::iterator itr = _eventMap.begin(); - - if (itr->first > _time) - return 0; - else if (_phase && (itr->second & 0xFF000000) && !(itr->second & (_phase << 24))) - _eventMap.erase(itr); - else - return (itr->second & 0x0000FFFF); - } - - return 0; - } - - /** * @name DelayEvents * @brief Delays all events in the map. If delay is greater than or equal internal timer, delay will be 0. * @param delay Amount of delay. @@ -631,6 +605,21 @@ class EventMap return phase <= 8 && (!phase || _phase & (1 << (phase - 1))); } + /** + * @name GetTimeUntilEvent + * @brief Returns time in milliseconds until next event. + * @param Id of the event. + * @return Time of next event. + */ + uint32 GetTimeUntilEvent(uint32 eventId) const + { + for (EventStore::const_iterator itr = _eventMap.begin(); itr != _eventMap.end(); ++itr) + if (eventId == (itr->second & 0x0000FFFF)) + return itr->first - _time; + + return std::numeric_limits<uint32>::max(); + } + private: /** * @name _time @@ -662,6 +651,13 @@ class EventMap * details. */ EventStore _eventMap; + + + /** + * @name _lastEvent + * @brief Stores information on the most recently executed event + */ + uint32 _lastEvent; }; enum AITarget |