mirror of
https://github.com/mod-playerbots/azerothcore-wotlk.git
synced 2026-01-23 05:36:23 +00:00
fix(Core/Util): EventMap::RepeatEvent when eventId is retrieved by ExecuteEvent() call (#3426)
This commit is contained in:
@@ -18,7 +18,7 @@
|
||||
#include <map>
|
||||
#include <ace/INET_Addr.h>
|
||||
|
||||
// Searcher for map of structs
|
||||
// Searcher for map of structs
|
||||
template<typename T, class S> struct Finder
|
||||
{
|
||||
T val_;
|
||||
@@ -440,7 +440,7 @@ public:
|
||||
part[0] == right.part[0] &&
|
||||
part[1] == right.part[1] &&
|
||||
part[2] == right.part[2]
|
||||
);
|
||||
);
|
||||
}
|
||||
|
||||
inline bool operator!=(flag96 const& right) const
|
||||
@@ -541,20 +541,20 @@ bool CompareValues(ComparisionType type, T val1, T val2)
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case COMP_TYPE_EQ:
|
||||
return val1 == val2;
|
||||
case COMP_TYPE_HIGH:
|
||||
return val1 > val2;
|
||||
case COMP_TYPE_LOW:
|
||||
return val1 < val2;
|
||||
case COMP_TYPE_HIGH_EQ:
|
||||
return val1 >= val2;
|
||||
case COMP_TYPE_LOW_EQ:
|
||||
return val1 <= val2;
|
||||
default:
|
||||
// incorrect parameter
|
||||
ABORT();
|
||||
return false;
|
||||
case COMP_TYPE_EQ:
|
||||
return val1 == val2;
|
||||
case COMP_TYPE_HIGH:
|
||||
return val1 > val2;
|
||||
case COMP_TYPE_LOW:
|
||||
return val1 < val2;
|
||||
case COMP_TYPE_HIGH_EQ:
|
||||
return val1 >= val2;
|
||||
case COMP_TYPE_LOW_EQ:
|
||||
return val1 <= val2;
|
||||
default:
|
||||
// incorrect parameter
|
||||
ABORT();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -578,7 +578,7 @@ class EventMap
|
||||
typedef std::multimap<uint32, uint32> EventStore;
|
||||
|
||||
public:
|
||||
EventMap() : _time(0), _phase(0) { }
|
||||
EventMap() : _time(0), _phase(0), _lastEvent(0) { }
|
||||
|
||||
/**
|
||||
* @name Reset
|
||||
@@ -641,9 +641,13 @@ public:
|
||||
void SetPhase(uint8 phase)
|
||||
{
|
||||
if (!phase)
|
||||
{
|
||||
_phase = 0;
|
||||
}
|
||||
else if (phase <= 8)
|
||||
{
|
||||
_phase = (1 << (phase - 1));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -654,7 +658,9 @@ public:
|
||||
void AddPhase(uint8 phase)
|
||||
{
|
||||
if (phase && phase <= 8)
|
||||
{
|
||||
_phase |= (1 << (phase - 1));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -665,7 +671,9 @@ public:
|
||||
void RemovePhase(uint8 phase)
|
||||
{
|
||||
if (phase && phase <= 8)
|
||||
{
|
||||
_phase &= ~(1 << (phase - 1));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -679,10 +687,14 @@ public:
|
||||
void ScheduleEvent(uint32 eventId, uint32 time, uint32 group = 0, uint32 phase = 0)
|
||||
{
|
||||
if (group && group <= 8)
|
||||
{
|
||||
eventId |= (1 << (group + 15));
|
||||
}
|
||||
|
||||
if (phase && phase <= 8)
|
||||
{
|
||||
eventId |= (1 << (phase + 23));
|
||||
}
|
||||
|
||||
_eventMap.insert(EventStore::value_type(_time + time, eventId));
|
||||
}
|
||||
@@ -711,22 +723,7 @@ public:
|
||||
*/
|
||||
void RepeatEvent(uint32 time)
|
||||
{
|
||||
if (Empty())
|
||||
return;
|
||||
|
||||
uint32 eventId = _eventMap.begin()->second;
|
||||
_eventMap.erase(_eventMap.begin());
|
||||
ScheduleEvent(eventId, time);
|
||||
}
|
||||
|
||||
/**
|
||||
* @name PopEvent
|
||||
* @brief Remove the first event in the map.
|
||||
*/
|
||||
void PopEvent()
|
||||
{
|
||||
if (!Empty())
|
||||
_eventMap.erase(_eventMap.begin());
|
||||
_eventMap.insert(EventStore::value_type(_time + time, _lastEvent));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -741,12 +738,17 @@ public:
|
||||
EventStore::iterator itr = _eventMap.begin();
|
||||
|
||||
if (itr->first > _time)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
else if (_phase && (itr->second & 0xFF000000) && !((itr->second >> 24) & _phase))
|
||||
{
|
||||
_eventMap.erase(itr);
|
||||
}
|
||||
else
|
||||
{
|
||||
uint32 eventId = (itr->second & 0x0000FFFF);
|
||||
_lastEvent = itr->second;
|
||||
_eventMap.erase(itr);
|
||||
return eventId;
|
||||
}
|
||||
@@ -755,28 +757,6 @@ public:
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* @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.
|
||||
@@ -796,9 +776,10 @@ public:
|
||||
ScheduleEvent(itr->second, delay);
|
||||
_eventMap.erase(itr);
|
||||
itr = _eventMap.begin();
|
||||
continue;
|
||||
}
|
||||
else
|
||||
++itr;
|
||||
|
||||
++itr;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -811,7 +792,9 @@ public:
|
||||
void DelayEvents(uint32 delay, uint32 group)
|
||||
{
|
||||
if (group > 8 || Empty())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
EventStore delayed;
|
||||
|
||||
@@ -820,10 +803,11 @@ public:
|
||||
if (!group || (itr->second & (1 << (group + 15))))
|
||||
{
|
||||
delayed.insert(EventStore::value_type(itr->first + delay, itr->second));
|
||||
_eventMap.erase(itr++);
|
||||
itr = _eventMap.erase(itr);
|
||||
continue;
|
||||
}
|
||||
else
|
||||
++itr;
|
||||
|
||||
++itr;
|
||||
}
|
||||
|
||||
_eventMap.insert(delayed.begin(), delayed.end());
|
||||
@@ -837,14 +821,19 @@ public:
|
||||
void CancelEvent(uint32 eventId)
|
||||
{
|
||||
if (Empty())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
for (EventStore::iterator itr = _eventMap.begin(); itr != _eventMap.end();)
|
||||
{
|
||||
if (eventId == (itr->second & 0x0000FFFF))
|
||||
_eventMap.erase(itr++);
|
||||
else
|
||||
++itr;
|
||||
{
|
||||
itr = _eventMap.erase(itr);
|
||||
continue;
|
||||
}
|
||||
|
||||
++itr;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -856,7 +845,9 @@ public:
|
||||
void CancelEventGroup(uint32 group)
|
||||
{
|
||||
if (!group || group > 8 || Empty())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
uint32 groupMask = (1 << (group + 15));
|
||||
for (EventStore::iterator itr = _eventMap.begin(); itr != _eventMap.end();)
|
||||
@@ -865,9 +856,10 @@ public:
|
||||
{
|
||||
_eventMap.erase(itr);
|
||||
itr = _eventMap.begin();
|
||||
continue;
|
||||
}
|
||||
else
|
||||
++itr;
|
||||
|
||||
++itr;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -880,11 +872,17 @@ public:
|
||||
uint32 GetNextEventTime(uint32 eventId) const
|
||||
{
|
||||
if (Empty())
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
for (EventStore::const_iterator itr = _eventMap.begin(); itr != _eventMap.end(); ++itr)
|
||||
if (eventId == (itr->second & 0x0000FFFF))
|
||||
return itr->first;
|
||||
for (auto const& itr : _eventMap)
|
||||
{
|
||||
if (eventId == (itr.second & 0x0000FFFF))
|
||||
{
|
||||
return itr.first;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -912,6 +910,7 @@ public:
|
||||
private:
|
||||
uint32 _time;
|
||||
uint32 _phase;
|
||||
uint32 _lastEvent;
|
||||
|
||||
EventStore _eventMap;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user