Skip to content

Commit b795322

Browse files
committed
Implement timer's (set interval & pause/resume)
1 parent 596ece7 commit b795322

File tree

5 files changed

+97
-2
lines changed

5 files changed

+97
-2
lines changed

SDK

Server/Components/Pawn/Manager/Manager.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -460,6 +460,9 @@ void PawnManager::openAMX(PawnScript& script, bool isEntryScript, bool restartin
460460
script.Register("IsRepeatingTimer", &utils::pawn_IsRepeatingTimer);
461461
script.Register("GetTimerRemaining", &utils::pawn_GetTimerRemaining);
462462
script.Register("GetTimerInterval", &utils::pawn_GetTimerInterval);
463+
script.Register("SetTimerInterval", &utils::pawn_SetTimerInterval);
464+
script.Register("ToggleTimerPause", &utils::pawn_ToggleTimerPause);
465+
script.Register("IsTimerPaused", &utils::pawn_IsTimerPaused);
463466
script.Register("SetModeRestartTime", &utils::pawn_SetModeRestartTime);
464467
script.Register("GetModeRestartTime", &utils::pawn_GetModeRestartTime);
465468

Server/Components/Pawn/utils.hpp

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,36 @@ inline cell AMX_NATIVE_CALL pawn_settimerex(AMX* amx, cell const* params)
202202
return PawnTimerImpl::Get()->setTimerEx(callback, Milliseconds(params[2]), params[3], fmt, amx, &params[5]);
203203
}
204204

205+
inline cell AMX_NATIVE_CALL pawn_IsTimerPaused(AMX* amx, cell const* params)
206+
{
207+
AMX_MIN_PARAMETERS("IsTimerPaused", params, 1);
208+
ITimer* timer = PawnTimerImpl::Get()->getTimer(params[1]);
209+
if (timer == nullptr || !timer->running())
210+
{
211+
return false;
212+
}
213+
214+
if (!timer->paused())
215+
{
216+
return false;
217+
}
218+
219+
return true;
220+
}
221+
222+
inline cell AMX_NATIVE_CALL pawn_ToggleTimerPause(AMX* amx, cell const* params)
223+
{
224+
AMX_MIN_PARAMETERS("ToggleTimerPause", params, 2);
225+
ITimer* timer = PawnTimerImpl::Get()->getTimer(params[1]);
226+
if (timer == nullptr || !timer->running())
227+
{
228+
return false;
229+
}
230+
231+
timer->togglePause(params[2]);
232+
return true;
233+
}
234+
205235
#define GET_TIMER(timer, name, failRet) \
206236
AMX_MIN_PARAMETERS(name, params, 1); \
207237
ITimer* timer = PawnTimerImpl::Get()->getTimer(params[1]); \
@@ -235,6 +265,26 @@ inline cell AMX_NATIVE_CALL pawn_GetTimerInterval(AMX* amx, cell const* params)
235265
return timer->interval().count();
236266
}
237267

268+
inline cell AMX_NATIVE_CALL pawn_SetTimerInterval(AMX* amx, cell const* params)
269+
{
270+
AMX_MIN_PARAMETERS("SetTimerInterval", params, 2);
271+
ITimer* timer = PawnTimerImpl::Get()->getTimer(params[1]);
272+
if (timer == nullptr || !timer->running())
273+
{
274+
return false;
275+
}
276+
277+
int interval = static_cast<int>(params[2]);
278+
279+
if(interval < 1)
280+
{
281+
return false;
282+
}
283+
284+
timer->setInterval(static_cast<Milliseconds>(interval));
285+
return true;
286+
}
287+
238288
inline cell AMX_NATIVE_CALL pawn_IsRepeatingTimer(AMX* amx, cell const* params)
239289
{
240290
GET_TIMER(timer, "IsRepeatingTimer", false)

Server/Components/Timers/timer.hpp

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,11 @@ class Timer final : public ITimer
1212
{
1313
private:
1414
bool running_;
15+
bool paused_;
1516
unsigned int count_;
16-
const Milliseconds interval_;
17+
Milliseconds interval_;
1718
TimePoint timeout_;
19+
TimePoint pausedTime_;
1820
TimerTimeOutHandler* const handler_;
1921

2022
public:
@@ -28,8 +30,30 @@ class Timer final : public ITimer
2830
timeout_ = timeout;
2931
}
3032

33+
TimePoint getPausedTime() const
34+
{
35+
return pausedTime_;
36+
}
37+
38+
void togglePause(bool paused) override
39+
{
40+
paused_ = paused;
41+
42+
if (paused)
43+
{
44+
pausedTime_ = Time::now();
45+
}
46+
else
47+
{
48+
TimePoint now = Time::now();
49+
Milliseconds pauseDuration = duration_cast<Milliseconds>(now - pausedTime_);
50+
timeout_ += pauseDuration;
51+
}
52+
}
53+
3154
Timer(TimerTimeOutHandler* handler, Milliseconds initial, Milliseconds interval, unsigned int count)
3255
: running_(true)
56+
, paused_(false)
3357
, count_(count)
3458
, interval_(interval)
3559
, timeout_(Time::now() + initial)
@@ -42,6 +66,11 @@ class Timer final : public ITimer
4266
return running_;
4367
}
4468

69+
bool paused() const override
70+
{
71+
return paused_;
72+
}
73+
4574
Milliseconds remaining() const override
4675
{
4776
return duration_cast<Milliseconds>(timeout_ - Time::now());
@@ -57,6 +86,12 @@ class Timer final : public ITimer
5786
return interval_;
5887
}
5988

89+
void setInterval(Milliseconds interval) override
90+
{
91+
interval_ = interval;
92+
timeout_ = Time::now() + interval_;
93+
}
94+
6095
TimerTimeOutHandler* handler() const override
6196
{
6297
return handler_;
@@ -65,6 +100,7 @@ class Timer final : public ITimer
65100
void kill() override
66101
{
67102
running_ = false;
103+
paused_ = false;
68104
}
69105

70106
bool trigger() override

Server/Components/Timers/timers_main.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,12 @@ class TimersComponent final : public ITimersComponent, public CoreEventHandler
7373
}
7474
else
7575
{
76+
if (timer->paused())
77+
{
78+
++it;
79+
continue;
80+
}
81+
7682
const TimePoint now = Time::now();
7783
const Milliseconds diff = duration_cast<Milliseconds>(now - timer->getTimeout());
7884
if (diff.count() >= 0)

0 commit comments

Comments
 (0)