Index: src/map/intif.c =================================================================== --- src/map/intif.c (revision 17327) +++ src/map/intif.c (working copy) @@ -43,7 +43,7 @@ -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //0x3860 Quests [Kevin] [Inkfish] -1, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 3, 3, 0, //0x3870 Mercenaries [Zephyrus] / Elemental [pakpil] 11,-1, 7, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //0x3880 - -1,-1, 7, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //0x3890 Homunculus [albator] + -1,-1, 7, 3, 15, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //0x3890 Homunculus [albator] / VIP }; extern int char_fd; // inter server Fd used for char_fd @@ -2152,6 +2152,28 @@ return; } +void intif_parse_ack_vipActive(int fd){ + int aid = RFIFOL(inter_fd,2); + uint32 vip_time = RFIFOL(inter_fd,6); + TBL_PC *sd = map_id2sd(aid); + if(sd && vip_time) + ; //do stuff with sd +} + +void intif_req_vipActive(TBL_PC *sd, int8 req_duration, int8 type){ + int len; + if (CheckForCharServer() || sd == NULL) + return 0; + len = packet_len_table[0x3894-0x3800]; + WFIFOHEAD(inter_fd,len); + WFIFOW(inter_fd,0) = 0x3894; + WFIFOL(inter_fd,2) = sd->fd; //user fd + WFIFOL(inter_fd,6) = sd.bl.id; //aid + WFIFOB(inter_fd,10) = type; //type&1 select, type&2 update for new_duration + WFIFOL(inter_fd,11) = req_duration; + WFIFOSET(inter_fd,len); +} + //----------------------------------------------------------------- // Communication from the inter server // Return a 0 (false) if there were any errors. @@ -2160,7 +2182,7 @@ { int packet_len, cmd; cmd = RFIFOW(fd,0); - // Verify ID of the packet + // Verify ID of the packet if(cmd<0x3800 || cmd>=0x3800+(sizeof(packet_len_table)/sizeof(packet_len_table[0])) || packet_len_table[cmd-0x3800]==0){ return 0; @@ -2252,6 +2274,7 @@ case 0x3891: intif_parse_RecvHomunculusData(fd); break; case 0x3892: intif_parse_SaveHomunculusOk(fd); break; case 0x3893: intif_parse_DeleteHomunculusOk(fd); break; + case 0x3895: intif_parse_ack_vipActive(fd); break; default: ShowError("intif_parse : unknown packet %d %x\n",fd,RFIFOW(fd,0)); return 0; Index: src/char/inter.c =================================================================== --- src/char/inter.c (revision 17327) +++ src/char/inter.c (working copy) @@ -55,7 +55,7 @@ 6,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 3060- Quest system [Kevin] [Inkfish] -1,10, 6,-1, 0, 0, 0, 0, 0, 0, 0, 0, -1,10, 6,-1, // 3070- Mercenary packets [Zephyrus], Elemental packets [pakpil] 48,14,-1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 3080- - -1,10,-1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 3090- Homunculus packets [albator] + -1,10,-1, 6, 15, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 3090- Homunculus packets [albator] }; struct WisData { @@ -1153,6 +1153,7 @@ case 0x3005: mapif_parse_RegistryRequest(fd); break; case 0x3006: mapif_parse_NameChangeRequest(fd); break; case 0x3007: mapif_parse_accinfo(fd); break; + case 0x3894: inter_parse_vipactive(fd); break; /* 0x3008 is used by the report stuff */ default: if( inter_party_parse_frommap(fd) @@ -1194,4 +1195,50 @@ return 0; } +void inter_vipactive(int fd, int aid, uint32 vip_time){ + int len = inter_recv_packet_length[0x3895-3000]; //actually we sending this but well + WFIFOHEAD(fd,len); + WFIFOW(fd,0) = 0x3895; + WFIFOL(fd,2) = aid; + WFIFOL(fd,6) = vip_time; + WFIFOSET(fd,len); +} +void inter_parse_vipactive(int fd){ + int u_fd = RFIFOL(fd,2); + int aid = RFIFOL(fd,6); + int8 type = RFIFOB(fd,10); + uint32 req_duration = RFIFOL(fd,11); + uint32 vip_time=0; + char data; + if ( SQL_ERROR == Sql_Query(sql_handle, "SELECT `vip_time` FROM `login` WHERE `account_id` = %d LIMIT 1", aid) + || Sql_NumRows(sql_handle) == 0 ) { + if( Sql_NumRows(sql_handle) == 0 ) { + inter_to_fd(fd, u_fd, aid, "No matches were found for your criteria, '%s'", aid); + } else { + Sql_ShowDebug(sql_handle); + inter_to_fd(fd, u_fd, aid, "An error occured, bother your admin about it."); + } + Sql_FreeResult(sql_handle); + return; + } else { + if(type&1) { + Sql_NextRow(sql_handle); + Sql_GetData(sql_handle, 0, &data, NULL); vip_time = data; + Sql_FreeResult(sql_handle); + } + if(type&2) { + time_t duration = time(NULL)+req_duration; + if(SQL_ERROR == Sql_Query(sql_handle, "UPDATE `login` set `vip_time`= %d WHERE `account_id` = %d LIMIT 1",aid,duration)) + Sql_ShowDebug(sql_handle); + if(SQL_SUCCESS == Sql_Query(sql_handle, "SELECT `vip_time` FROM `login` WHERE `account_id` = %d LIMIT 1", aid)) { + Sql_NextRow(sql_handle); + Sql_GetData(sql_handle, 0, &data, NULL); vip_time = data; + Sql_FreeResult(sql_handle); + } + } + } + + inter_vipactive(fd,aid,vip_time); //send anwser to map +} + Index: src/common/timer.c =================================================================== --- src/common/timer.c (revision 17327) +++ src/common/timer.c (working copy) @@ -109,28 +109,28 @@ } 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 @@ 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 @@ 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 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,91 @@ return (unsigned long)difftime(time(NULL), start_time); } +void time2str(char *timestr, char *format, int timein){ + time_t timeout = time(NULL) + timein; + strftime(timestr, 24, format, localtime(&timeout)); +} + +/* + * Split given timein into your years,month,day,hours,minutes,second + */ +void split_time(int timein, int* year, int* month, int* day, int* hour, int* minute, int *second){ + const int factor_min = 60; + const int factor_hour = factor_min*60; + const int factor_day = factor_hour*24; + const int factor_month = factor_day*30; //approx + const int factor_year = factor_month*12; //even worse approx + + *year = timein/factor_year; + timein -= *year*factor_year; + *month = timein/factor_month; + timein -= *month*factor_month; + *day = timein/factor_day; + timein -= *day*factor_day; + *hour = timein/factor_hour; + timein -= *hour*factor_hour; + *minute = timein/factor_min; + timein -= *minute*factor_min; + *second = timein; + + *year = max(0,*year); + *month = max(0,*month); + *day = max(0,*day); + *hour = max(0,*hour); + *minute = max(0,*minute); + *second = max(0,*second); +} + +/* + * 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_mday += 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) Index: src/common/timer.h =================================================================== --- src/common/timer.h (revision 17327) +++ src/common/timer.h (working copy) @@ -51,6 +51,10 @@ 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); +void time2str(char *timestr, char *format, int timein); + int do_timer(unsigned int tick); void timer_init(void); void timer_final(void);