VoltMod
C++23 framework for CS2 server plugins
Loading...
Searching...
No Matches
Scheduler.cpp
Go to the documentation of this file.
3#include <utility>
4
5namespace VoltMod
6{
7
8int64_t Scheduler::GetCurrentTimeMs() const
9{
10 return Time::MonotonicMs();
11}
12
13Subscription Scheduler::AddTimer(int64_t nextFireTime, int64_t interval, std::function<void()> callback)
14{
15 const uint64_t id = _timers.Add({nextFireTime, interval, std::move(callback), 0});
16 _timers.Find(id)->Id = id;
17 return Subscription([this, id] { _timers.Remove(id); });
18}
19
21{
22 return AddTimer(GetCurrentTimeMs() + delayMs, 0, std::move(callback));
23}
24
26{
27 return AddTimer(GetCurrentTimeMs() + intervalMs, intervalMs, std::move(callback));
28}
29
31{
32 return Delay(0, std::move(callback));
33}
34
36{
37 // -1 repeats every frame, 0 is one-shot, and positive values wait between calls.
38 return AddTimer(0, -1, std::move(callback));
39}
40
42{
43 const int64_t now = GetCurrentTimeMs();
44
45 // Timers added by a callback start next frame.
46 _timers.DispatchIf([now](const Timer& timer) { return now >= timer.NextFireTime; },
47 [this, now](Timer& timer) {
48 if (timer.Callback)
49 {
50 timer.Callback();
51 }
52
53 // The callback may have cancelled this timer.
54 if (!_timers.Find(timer.Id))
55 {
56 return;
57 }
58
59 if (timer.Interval > 0)
60 {
61 timer.NextFireTime = now + timer.Interval;
62 }
63 else if (timer.Interval < 0)
64 {
65 timer.NextFireTime = now; // repeat on the next frame
66 }
67 else
68 {
69 _timers.Remove(timer.Id);
70 }
71 });
72}
73
74} // namespace VoltMod
void DispatchIf(std::predicate< const T & > auto &&pred, std::invocable< T & > auto &&fn)
Subscription NextTick(std::function< void()> callback)
Definition Scheduler.cpp:30
Subscription Repeat(int64_t intervalMs, std::function< void()> callback)
Definition Scheduler.cpp:25
Subscription EveryFrame(std::function< void()> callback)
Definition Scheduler.cpp:35
Subscription Delay(int64_t delayMs, std::function< void()> callback)
Definition Scheduler.cpp:20
Owns one registration and releases it on destruction.
static int64_t MonotonicMs()
Definition Durations.hpp:35
static std::string ReadFile(const std::filesystem::path &path)
Definition Loader.cpp:56