mirror of
https://github.com/mod-playerbots/azerothcore-wotlk.git
synced 2025-11-29 17:38:24 +08:00
feat(Core/Scripting): Implement TaskScheduler GetNextGroupOccurrence() (#20714)
This commit is contained in:
@@ -124,6 +124,11 @@ bool TaskScheduler::IsGroupScheduled(group_t const group)
|
||||
return _task_holder.IsGroupQueued(group);
|
||||
}
|
||||
|
||||
Milliseconds TaskScheduler::GetNextGroupOcurrence(group_t const group) const
|
||||
{
|
||||
return std::chrono::duration_cast<std::chrono::milliseconds>(_task_holder.GetNextGroupOcurrence(group) - clock_t::now());
|
||||
}
|
||||
|
||||
void TaskScheduler::TaskQueue::Push(TaskContainer&& task)
|
||||
{
|
||||
container.insert(task);
|
||||
@@ -189,6 +194,18 @@ bool TaskScheduler::TaskQueue::IsGroupQueued(group_t const group)
|
||||
return false;
|
||||
}
|
||||
|
||||
TaskScheduler::timepoint_t TaskScheduler::TaskQueue::GetNextGroupOcurrence(group_t const group) const
|
||||
{
|
||||
TaskScheduler::timepoint_t next = TaskScheduler::timepoint_t::max();
|
||||
for (auto const& task : container)
|
||||
{
|
||||
if (task->IsInGroup(group) && task->_end < next)
|
||||
next = task->_end;
|
||||
}
|
||||
|
||||
return next;
|
||||
}
|
||||
|
||||
bool TaskScheduler::TaskQueue::IsEmpty() const
|
||||
{
|
||||
return container.empty();
|
||||
@@ -231,6 +248,11 @@ TaskScheduler::repeated_t TaskContext::GetRepeatCounter() const
|
||||
return _task->_repeated;
|
||||
}
|
||||
|
||||
TaskScheduler::timepoint_t TaskContext::GetNextOcurrence() const
|
||||
{
|
||||
return _task->_end;
|
||||
}
|
||||
|
||||
TaskContext& TaskContext::Async(std::function<void()> const& callable)
|
||||
{
|
||||
return Dispatch(std::bind(&TaskScheduler::Async, std::placeholders::_1, callable));
|
||||
|
||||
@@ -148,6 +148,9 @@ class TaskScheduler
|
||||
/// Check if the group exists and is currently scheduled.
|
||||
bool IsGroupQueued(group_t const group);
|
||||
|
||||
// Returns the next group occurrence.
|
||||
TaskScheduler::timepoint_t GetNextGroupOcurrence(group_t const group) const;
|
||||
|
||||
bool IsEmpty() const;
|
||||
};
|
||||
|
||||
@@ -373,6 +376,9 @@ public:
|
||||
return RescheduleGroup(group, RandomDurationBetween(min, max));
|
||||
}
|
||||
|
||||
// Returns the next group occurrence.
|
||||
Milliseconds GetNextGroupOcurrence(group_t const group) const;
|
||||
|
||||
private:
|
||||
/// Insert a new task to the enqueued tasks.
|
||||
TaskScheduler& InsertTask(TaskContainer task);
|
||||
@@ -477,6 +483,8 @@ public:
|
||||
/// Returns the repeat counter which increases every time the task is repeated.
|
||||
TaskScheduler::repeated_t GetRepeatCounter() const;
|
||||
|
||||
TaskScheduler::timepoint_t GetNextOcurrence() const;
|
||||
|
||||
/// Repeats the event and sets a new duration.
|
||||
/// std::chrono::seconds(5) for example.
|
||||
/// This will consume the task context, its not possible to repeat the task again
|
||||
|
||||
Reference in New Issue
Block a user