mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-15 23:20:36 +01:00
Core/EventMap: Unify semantics of DelayEvents
DelayEvents(Milliseconds delay) had different semantics than
DelayEvents(Milliseconds delay, uint32 group).
The first method delayed the events only in the case the internal timer
already ticked at least for the amount of delay. In contrast the latter method
delayed events regardless of the internal timer value.
Use the latter semantics for DelayEvents(Milliseconds delay) as well which makes
the outcome more predictable. Adapt tests accordingly.
(cherry picked from commit 4470b91223)
This commit is contained in:
@@ -94,7 +94,16 @@ uint32 EventMap::ExecuteEvent()
|
||||
|
||||
void EventMap::DelayEvents(Milliseconds delay)
|
||||
{
|
||||
_time = delay < _time - _time.min() ? _time - delay : TimePoint::min();
|
||||
if (Empty())
|
||||
return;
|
||||
|
||||
EventStore delayed = std::move(_eventMap);
|
||||
for (EventStore::iterator itr = delayed.begin(); itr != delayed.end();)
|
||||
{
|
||||
EventStore::node_type node = delayed.extract(itr++);
|
||||
node.key() = node.key() + delay;
|
||||
_eventMap.insert(_eventMap.end(), std::move(node));
|
||||
}
|
||||
}
|
||||
|
||||
void EventMap::DelayEvents(Milliseconds delay, uint32 group)
|
||||
|
||||
@@ -179,7 +179,7 @@ public:
|
||||
|
||||
/**
|
||||
* @name DelayEvents
|
||||
* @brief Delays all events. If delay is greater than or equal internal timer, delay will be 0.
|
||||
* @brief Delays all events.
|
||||
* @param delay Amount of delay as std::chrono type.
|
||||
*/
|
||||
void DelayEvents(Milliseconds delay);
|
||||
|
||||
@@ -15,7 +15,9 @@
|
||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#define CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER
|
||||
#include "catch2/catch.hpp"
|
||||
|
||||
#include "EventMap.h"
|
||||
|
||||
enum EVENTS
|
||||
@@ -282,8 +284,8 @@ TEST_CASE("Delay all events", "[EventMap]")
|
||||
{
|
||||
eventMap.DelayEvents(1s);
|
||||
|
||||
// Timer hasn't ticked yet, so maximum delay is 0ms: 1s (init) + 0s (delay) = 1s
|
||||
REQUIRE(eventMap.GetTimeUntilEvent(EVENT_1) == 1s);
|
||||
// 1s (init) + 1s (delay) = 2s
|
||||
REQUIRE(eventMap.GetTimeUntilEvent(EVENT_1) == 2s);
|
||||
}
|
||||
|
||||
SECTION("With timer update smaller than delay")
|
||||
@@ -291,7 +293,8 @@ TEST_CASE("Delay all events", "[EventMap]")
|
||||
eventMap.Update(500);
|
||||
eventMap.DelayEvents(1s);
|
||||
|
||||
REQUIRE(eventMap.GetTimeUntilEvent(EVENT_1) == 1s);
|
||||
// 1s (init) + 1s (delay) - 500ms (tick) = 1500ms
|
||||
REQUIRE(eventMap.GetTimeUntilEvent(EVENT_1) == 1500ms);
|
||||
}
|
||||
|
||||
SECTION("With timer update larger than delay")
|
||||
|
||||
Reference in New Issue
Block a user