Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 35 additions & 0 deletions src/common/timer.c
Original file line number Diff line number Diff line change
Expand Up @@ -468,6 +468,40 @@ static int64 timer_settick(int tid, int64 tick)
return tick;
}

/**
* Modifies a timer's interval.
*
* @param tid The timer ID.
* @param interval New interval value.
* @return 0 on success, -1 on failure.
*/
static int timer_set_interval(int tid, int interval)
{
if (tid < 1 || tid >= timer_data_num) {
ShowError("timer_set_interval error : no such timer [%d]\n", tid);
Assert_retr(-1, 0);
return -1;
}
if (timer_data[tid].type == 0 || timer_data[tid].type == TIMER_REMOVE_HEAP) {
ShowError("timer_set_interval error: set interval for deleted timer %d, [%d](%p(%s))\n", timer_data[tid].type, tid, timer_data[tid].func, search_timer_func_list(timer_data[tid].func));
Assert_retr(-1, 0);
return -1;
}
if (timer_data[tid].func == NULL) {
ShowError("timer_set_interval error: set interval for timer with wrong func [%d](%p(%s))\n", tid, timer_data[tid].func, search_timer_func_list(timer_data[tid].func));
Assert_retr(-1, 0);
return -1;
}
if (interval < 1) {
ShowError("timer_set_interval: invalid interval %d for timer [%d]\n", interval, tid);
Assert_retr(-1, 0);
return -1;
}

timer_data[tid].interval = interval;
return 0;
}

/**
* Executes all expired timers.
*
Expand Down Expand Up @@ -657,6 +691,7 @@ void timer_defaults(void)
timer->delete = timer_do_delete;
timer->addtick = timer_addtick;
timer->settick = timer_settick;
timer->set_interval = timer_set_interval;
timer->get_uptime = timer_get_uptime;
timer->perform = do_timer;
timer->init = timer_init;
Expand Down
1 change: 1 addition & 0 deletions src/common/timer.h
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ struct timer_interface {

int64 (*addtick) (int tid, int64 tick);
int64 (*settick) (int tid, int64 tick);
int (*set_interval) (int tid, int interval);

int (*add_func_list) (TimerFunc func, char* name);

Expand Down
20 changes: 19 additions & 1 deletion src/map/pc.c
Original file line number Diff line number Diff line change
Expand Up @@ -11076,6 +11076,8 @@ static int pc_autosave(int tid, int64 tick, int id, intptr_t data)
struct s_mapiterator* iter;
struct map_session_data* sd;
static int last_save_id = 0, save_flag = 0;
static int autosave_tid = INVALID_TIMER;
static int current_interval = 0;

if(save_flag == 2) //Someone was saved on last call, normal cycle
save_flag = 0;
Expand Down Expand Up @@ -11104,7 +11106,23 @@ static int pc_autosave(int tid, int64 tick, int id, intptr_t data)
interval = map->autosave_interval/(map->usercount()+1);
if(interval < map->minsave_interval)
interval = map->minsave_interval;
timer->add(timer->gettick()+interval,pc->autosave,0,0);

// Update timer interval if it has changed
if(autosave_tid != INVALID_TIMER && current_interval != interval) {
// Update the interval directly
if(timer->set_interval(autosave_tid, interval) == 0) {
current_interval = interval;
} else {
// Fallback: delete and recreate if set_interval fails
timer->delete(autosave_tid, pc->autosave);
autosave_tid = timer->add_interval(timer->gettick()+interval, pc->autosave, 0, 0, interval);
current_interval = interval;
}
} else if(autosave_tid == INVALID_TIMER) {
// First time - create interval timer
autosave_tid = timer->add_interval(timer->gettick()+interval, pc->autosave, 0, 0, interval);
current_interval = interval;
}

return 0;
}
Expand Down
Loading