diff --git a/src/common/timer.c b/src/common/timer.c index aad77d2431..c064edc10d 100644 --- a/src/common/timer.c +++ b/src/common/timer.c @@ -109,28 +109,28 @@ static __inline uint64 _rdtsc(){ } t; asm volatile("rdtsc":"=a"(t.dw[0]), "=d"(t.dw[1]) ); - + return t.qw; } static void rdtsc_calibrate(){ uint64 t1, t2; int32 i; - + ShowStatus("Calibrating Timer Source, please wait... "); - + RDTSC_CLOCK = 0; - + for(i = 0; i < 5; i++){ t1 = _rdtsc(); usleep(1000000); //1000 MS t2 = _rdtsc(); - RDTSC_CLOCK += (t2 - t1) / 1000; + RDTSC_CLOCK += (t2 - t1) / 1000; } RDTSC_CLOCK /= 5; - + RDTSC_BEGINTICK = _rdtsc(); - + ShowMessage(" done. (Frequency: %u Mhz)\n", (uint32)(RDTSC_CLOCK/1000) ); } @@ -243,7 +243,7 @@ static int acquire_timer(void) int add_timer(unsigned int tick, TimerFunc func, int id, intptr_t data) { int tid; - + tid = acquire_timer(); timer_data[tid].tick = tick; timer_data[tid].func = func; @@ -267,7 +267,7 @@ int add_timer_interval(unsigned int tick, TimerFunc func, int id, intptr_t data, ShowError("add_timer_interval: invalid interval (tick=%u %p[%s] id=%d data=%d diff_tick=%d)\n", tick, func, search_timer_func_list(func), id, data, DIFF_TICK(tick, gettick())); return INVALID_TIMER; } - + tid = acquire_timer(); timer_data[tid].tick = tick; timer_data[tid].func = func; @@ -320,7 +320,7 @@ int addtick_timer(int tid, unsigned int tick) int settick_timer(int tid, unsigned int tick) { size_t i; - + // search timer position ARR_FIND(0, BHEAP_LENGTH(timer_heap), i, BHEAP_DATA(timer_heap)[i] == tid); if( i == BHEAP_LENGTH(timer_heap) ) @@ -406,6 +406,78 @@ unsigned long get_uptime(void) return (unsigned long)difftime(time(NULL), start_time); } +/* + * Split given time into year, month, day, hour, minute, second + */ +void split_time(int timein, int* year, int* month, int* day, int* hour, int* minute, int *second) { + struct tm now_tm; + struct tm then_tm; + time_t now = time(NULL); + time_t then = now + timein; // Add time in seconds to the current time + now_tm = *localtime(&now); + then_tm = *localtime(&then); + mktime(&now_tm); + mktime(&then_tm); + + *year = max(then_tm.tm_year - now_tm.tm_year,0); + *month = max(then_tm.tm_mon - now_tm.tm_mon,0); + *day = max(then_tm.tm_mday - now_tm.tm_mday,0); + *hour = max(then_tm.tm_hour - now_tm.tm_hour,0); + *minute = max(then_tm.tm_min - now_tm.tm_min,0); + *second = max(then_tm.tm_sec - now_tm.tm_sec,0); +} + +/* + * Create a "timestamp" with the given argument + */ +int solve_time(char * modif_p) { + int totaltime = 0, value = 0; + struct tm then_tm; + time_t now = time(NULL); + time_t then = now; + then_tm = *localtime(&then); + + while (modif_p[0] != '\0') { + value = atoi(modif_p); + if (value == 0) + modif_p++; + else { + if (modif_p[0] == '-' || modif_p[0] == '+') + modif_p++; + while (modif_p[0] >= '0' && modif_p[0] <= '9') + modif_p++; + if (modif_p[0] == 's') { + then_tm.tm_sec += value; + modif_p++; + } else if (modif_p[0] == 'n') { + then_tm.tm_min += value; + modif_p++; + } else if (modif_p[0] == 'm' && modif_p[1] == 'n') { + then_tm.tm_min += value; + modif_p = modif_p + 2; + } else if (modif_p[0] == 'h') { + then_tm.tm_hour += value; + modif_p++; + } else if (modif_p[0] == 'd' || modif_p[0] == 'j') { + then_tm.tm_yday += value; + modif_p++; + } else if (modif_p[0] == 'm') { + then_tm.tm_mon += value; + modif_p++; + } else if (modif_p[0] == 'y' || modif_p[0] == 'a') { + then_tm.tm_year += value; + modif_p++; + } else if (modif_p[0] != '\0') { + modif_p++; + } + } + } + then = mktime(&then_tm); + totaltime = difftime(then,now); + + return totaltime; +} + void timer_init(void) { #if defined(ENABLE_RDTSC) diff --git a/src/common/timer.h b/src/common/timer.h index de0c8ab40d..10884aabe3 100644 --- a/src/common/timer.h +++ b/src/common/timer.h @@ -50,6 +50,9 @@ int add_timer_func_list(TimerFunc func, char* name); unsigned long get_uptime(void); +void split_time(int time, int* year, int* month, int* day, int* hour, int* minute, int *second); +int solve_time(char * modif_p); + int do_timer(unsigned int tick); void timer_init(void); void timer_final(void); diff --git a/src/map/atcommand.c b/src/map/atcommand.c index f4240f360e..a6b5b7e60c 100644 --- a/src/map/atcommand.c +++ b/src/map/atcommand.c @@ -3741,7 +3741,6 @@ ACMD_FUNC(reload) { clif_displaymessage(fd, msg_txt(sd,516)); // Instance database has been reloaded. } - return 0; } /*========================================== @@ -4525,34 +4524,6 @@ ACMD_FUNC(servertime) return 0; } -//Added by Coltaro -//We're using this function here instead of using time_t so that it only counts player's jail time when he/she's online (and since the idea is to reduce the amount of minutes one by one in status_change_timer...). -//Well, using time_t could still work but for some reason that looks like more coding x_x -static void get_jail_time(int jailtime, int* year, int* month, int* day, int* hour, int* minute) -{ - const int factor_year = 518400; //12*30*24*60 = 518400 - const int factor_month = 43200; //30*24*60 = 43200 - const int factor_day = 1440; //24*60 = 1440 - const int factor_hour = 60; - - *year = jailtime/factor_year; - jailtime -= *year*factor_year; - *month = jailtime/factor_month; - jailtime -= *month*factor_month; - *day = jailtime/factor_day; - jailtime -= *day*factor_day; - *hour = jailtime/factor_hour; - jailtime -= *hour*factor_hour; - *minute = jailtime; - - *year = *year > 0? *year : 0; - *month = *month > 0? *month : 0; - *day = *day > 0? *day : 0; - *hour = *hour > 0? *hour : 0; - *minute = *minute > 0? *minute : 0; - return; -} - /*========================================== * @jail by [Yor] * Special warp! No check with nowarp and nowarpto flag @@ -4576,14 +4547,12 @@ ACMD_FUNC(jail) return -1; } - if (pc_get_group_level(sd) < pc_get_group_level(pl_sd)) - { // you can jail only lower or same GM + if (pc_get_group_level(sd) < pc_get_group_level(pl_sd)) { // you can jail only lower or same GM clif_displaymessage(fd, msg_txt(sd,81)); // Your GM level don't authorise you to do this action on this player. return -1; } - if (pl_sd->sc.data[SC_JAILED]) - { + if (pl_sd->sc.data[SC_JAILED]) { clif_displaymessage(fd, msg_txt(sd,118)); // Player warped in jails. return -1; } @@ -4634,8 +4603,7 @@ ACMD_FUNC(unjail) return -1; } - if (!pl_sd->sc.data[SC_JAILED]) - { + if (!pl_sd->sc.data[SC_JAILED]) { clif_displaymessage(fd, msg_txt(sd,119)); // This player is not in jails. return -1; } @@ -4650,8 +4618,8 @@ ACMD_FUNC(unjail) ACMD_FUNC(jailfor) { struct map_session_data *pl_sd = NULL; - int year, month, day, hour, minute, value; - char * modif_p; + int year = 0, month = 0, day = 0, hour = 0, minute = 0, second = 0; + char * modif_p, output[CHAT_SIZE_MAX]; int jailtime = 0,x,y; short m_index = 0; nullpo_retr(-1, sd); @@ -4664,41 +4632,13 @@ ACMD_FUNC(jailfor) atcmd_output[sizeof(atcmd_output)-1] = '\0'; modif_p = atcmd_output; - year = month = day = hour = minute = 0; - while (modif_p[0] != '\0') { - value = atoi(modif_p); - if (value == 0) - modif_p++; - else { - if (modif_p[0] == '-' || modif_p[0] == '+') - modif_p++; - while (modif_p[0] >= '0' && modif_p[0] <= '9') - modif_p++; - if (modif_p[0] == 'n') { - minute = value; - modif_p++; - } else if (modif_p[0] == 'm' && modif_p[1] == 'n') { - minute = value; - modif_p = modif_p + 2; - } else if (modif_p[0] == 'h') { - hour = value; - modif_p++; - } else if (modif_p[0] == 'd' || modif_p[0] == 'j') { - day = value; - modif_p++; - } else if (modif_p[0] == 'm') { - month = value; - modif_p++; - } else if (modif_p[0] == 'y' || modif_p[0] == 'a') { - year = value; - modif_p++; - } else if (modif_p[0] != '\0') { - modif_p++; - } - } - } + jailtime = solve_time(modif_p)/60; // Change to minutes - if (year == 0 && month == 0 && day == 0 && hour == 0 && minute == 0) { + split_time(jailtime*60,&year,&month,&day,&hour,&minute,&second); + sprintf(output,msg_txt(sd,402),msg_txt(sd,1137),year,month,day,hour,minute); // %s in jail for %d years, %d months, %d days, %d hours and %d minutes + clif_displaymessage(fd, output); + + if (jailtime == 0) { clif_displaymessage(fd, msg_txt(sd,1136)); // Invalid time for jail command. return -1; } @@ -4713,17 +4653,8 @@ ACMD_FUNC(jailfor) return -1; } - jailtime = year*12*30*24*60 + month*30*24*60 + day*24*60 + hour*60 + minute; //In minutes - - if(jailtime==0) { - clif_displaymessage(fd, msg_txt(sd,1136)); // Invalid time for jail command. - return -1; - } - - //Added by Coltaro - if(pl_sd->sc.data[SC_JAILED] && - pl_sd->sc.data[SC_JAILED]->val1 != INT_MAX) - { //Update the player's jail time + // Added by Coltaro + if(pl_sd->sc.data[SC_JAILED] && pl_sd->sc.data[SC_JAILED]->val1 != INT_MAX) { // Update the player's jail time jailtime += pl_sd->sc.data[SC_JAILED]->val1; if (jailtime <= 0) { jailtime = 0; @@ -4731,9 +4662,9 @@ ACMD_FUNC(jailfor) clif_displaymessage(fd, msg_txt(sd,121)); // Player unjailed } else { get_jail_time(jailtime,&year,&month,&day,&hour,&minute); - sprintf(atcmd_output,msg_txt(sd,402),msg_txt(sd,1137),year,month,day,hour,minute); //%s in jail for %d years, %d months, %d days, %d hours and %d minutes + sprintf(atcmd_output,msg_txt(sd,402),msg_txt(sd,1137),year,month,day,hour,minute); // %s in jail for %d years, %d months, %d days, %d hours and %d minutes clif_displaymessage(pl_sd->fd, atcmd_output); - sprintf(atcmd_output,msg_txt(sd,402),msg_txt(sd,1138),year,month,day,hour,minute); //This player is now in jail for %d years, %d months, %d days, %d hours and %d minutes + sprintf(atcmd_output,msg_txt(sd,402),msg_txt(sd,1138),year,month,day,hour,minute); // This player is now in jail for %d years, %d months, %d days, %d hours and %d minutes clif_displaymessage(fd, atcmd_output); } } else if (jailtime < 0) { @@ -4741,14 +4672,13 @@ ACMD_FUNC(jailfor) return -1; } - //Jail locations, add more as you wish. - switch(rnd()%2) - { - case 1: //Jail #1 + // Jail locations, add more as you wish. + switch(rnd()%2) { + case 1: // Jail #1 m_index = mapindex_name2id(MAP_JAIL); x = 49; y = 75; break; - default: //Default Jail + default: // Default Jail m_index = mapindex_name2id(MAP_JAIL); x = 24; y = 75; break; @@ -4758,11 +4688,10 @@ ACMD_FUNC(jailfor) return 0; } - //By Coltaro ACMD_FUNC(jailtime) { - int year, month, day, hour, minute; + int year, month, day, hour, minute, second; nullpo_retr(-1, sd); @@ -4781,10 +4710,9 @@ ACMD_FUNC(jailtime) return -1; } - //Get remaining jail time - get_jail_time(sd->sc.data[SC_JAILED]->val1,&year,&month,&day,&hour,&minute); + // Get remaining jail time + split_time(sd->sc.data[SC_JAILED]->val1*60,&year,&month,&day,&hour,&minute,&second); sprintf(atcmd_output,msg_txt(sd,402),msg_txt(sd,1142),year,month,day,hour,minute); // You will remain in jail for %d years, %d months, %d days, %d hours and %d minutes - clif_displaymessage(fd, atcmd_output); return 0;