diff --git a/conf/char_athena.conf b/conf/char_athena.conf index 4dc80caa44..174ffc1189 100644 --- a/conf/char_athena.conf +++ b/conf/char_athena.conf @@ -88,9 +88,8 @@ max_connect_user: -1 // See: conf/groups.conf gm_allow_group: 99 -// How often should the server save all files? (In seconds) -// Note: Applies to all data files on TXT servers. -// On SQL servers, it applies to guilds (character save interval is defined on the map config) +// How often should the server save guild infos? (In seconds) +// (character save interval is defined on the map config (autosave_time)) autosave_time: 60 // Display information on the console whenever characters/guilds/parties/pets are loaded/saved? diff --git a/src/char/char.c b/src/char/char.c index b2506cf078..9e490bf21e 100644 --- a/src/char/char.c +++ b/src/char/char.c @@ -2309,14 +2309,14 @@ int mapif_vipack(int mapfd, uint32 aid, uint32 vip_time, uint8 isvip, uint32 gro * @param mapfd: link to mapserv for ack * @return 0 if succes */ -int loginif_reqviddata(uint32 aid, uint8 type, int add_vip_time, int mapfd) { +int loginif_reqviddata(uint32 aid, uint8 type, int32 timediff, int mapfd) { loginif_check(-1); #ifdef VIP_ENABLE WFIFOHEAD(login_fd,15); WFIFOW(login_fd,0) = 0x2742; WFIFOL(login_fd,2) = aid; //aid WFIFOB(login_fd,6) = type; //type - WFIFOL(login_fd,7) = add_vip_time; //req_inc_duration + WFIFOL(login_fd,7) = timediff; //req_inc_duration WFIFOL(login_fd,11) = mapfd; //req_inc_duration WFIFOSET(login_fd,15); #endif @@ -3091,7 +3091,7 @@ int mapif_parse_req_alter_acc(int fd){ int aid = RFIFOL(fd,2); // account_id of who ask (-1 if server itself made this request) const char* name = (char*)RFIFOP(fd,6); // name of the target character int operation = RFIFOW(fd,30); // type of operation: 1-block, 2-ban, 3-unblock, 4-unban, 5 changesex, 6 vip, 7 bank - int timediff = RFIFOL(fd,32); + int32 timediff = RFIFOL(fd,32); int val1 = RFIFOL(fd,36); int val2 = RFIFOL(fd,40); RFIFOSKIP(fd,44); @@ -3157,7 +3157,7 @@ int mapif_parse_req_alter_acc(int fd){ break; case 6: anwser=(val1&4); // vip_req val1=type, &1 login send return, &2 upd timestamp &4 map send awnser - loginif_reqviddata(aid, val1, timediff, fd); + loginif_reqviddata(account_id, val1, timediff, fd); break; case 7: anwser=(val1&1); //val&1 request anwser, val1&2 save data diff --git a/src/login/account_sql.c b/src/login/account_sql.c index 2f7568f6fd..32ebad7175 100644 --- a/src/login/account_sql.c +++ b/src/login/account_sql.c @@ -562,7 +562,7 @@ static bool mmo_auth_fromsql(AccountDB_SQL* db, struct mmo_account* acc, int acc Sql_GetData(sql_handle, 18, &data, NULL); acc->old_group = atoi(data); #endif Sql_FreeResult(sql_handle); - + // retrieve account regs for the specified user if( SQL_ERROR == Sql_Query(sql_handle, "SELECT `str`,`value` FROM `%s` WHERE `type`='1' AND `account_id`='%d'", db->accreg_db, acc->account_id) ) { diff --git a/src/login/login.c b/src/login/login.c index 3703157faf..845311d02d 100644 --- a/src/login/login.c +++ b/src/login/login.c @@ -514,7 +514,7 @@ int chrif_parse_reqvipdata(int fd) { struct mmo_account acc; int aid = RFIFOL(fd,2); int8 type = RFIFOB(fd,6); - int req_duration = RFIFOL(fd,7); + int32 timediff = RFIFOL(fd,7); int mapfd = RFIFOL(fd,11); RFIFOSKIP(fd,15); @@ -523,14 +523,17 @@ int chrif_parse_reqvipdata(int fd) { time_t vip_time = acc.vip_time; bool isvip = false; - if( type&2 ) vip_time = now + req_duration; // set new duration - if( now < vip_time ) { //isvip + if( type&2 ){ + if(!vip_time) vip_time = now; //new entry + vip_time += timediff; // set new duration + } + if( now < vip_time) { //isvip if(acc.group_id != login_config.vip_sys.group) //only upd this if we're not vip already acc.old_group = acc.group_id; acc.group_id = login_config.vip_sys.group; acc.char_slots = login_config.char_per_account + login_config.vip_sys.char_increase; isvip = true; - } else if (vip_time) { //expired or @vip -xx + } else { //expired or @vip -xx vip_time = 0; if(acc.group_id == login_config.vip_sys.group) //prevent alteration in case we wasn't registered vip yet acc.group_id = acc.old_group; @@ -1233,10 +1236,6 @@ int mmo_auth(struct login_session_data* sd, bool isServer) { timestamp2string(acc.lastlogin, sizeof(acc.lastlogin), time(NULL), "%Y-%m-%d %H:%M:%S"); safestrncpy(acc.last_ip, ip, sizeof(acc.last_ip)); acc.unban_time = 0; -#ifdef VIP_ENABLE - acc.vip_time = 0; - acc.old_group = 0; -#endif acc.logincount++; accounts->save(accounts, &acc); diff --git a/src/map/atcommand.c b/src/map/atcommand.c index 07c518fc88..ac32521e17 100644 --- a/src/map/atcommand.c +++ b/src/map/atcommand.c @@ -2788,7 +2788,7 @@ ACMD_FUNC(char_block) ACMD_FUNC(char_ban) { char * modif_p; - int timediff=0; + int32 timediff=0; //don't set this as uint as we may want to decrease banned time int bantype=2; //2=account block, 6=char specific char output[256]; @@ -2807,7 +2807,7 @@ ACMD_FUNC(char_ban) modif_p = atcmd_output; - timediff = (int)solve_time(modif_p); //discard seconds + timediff = (int32)solve_time(modif_p); //discard seconds if (timediff == 0) { //allow negative ? char output[256]; @@ -9160,7 +9160,7 @@ ACMD_FUNC(langtype) ACMD_FUNC(vip) { struct map_session_data *pl_sd = NULL; char * modif_p; - int vipdifftime = 0; + int32 vipdifftime = 0; time_t now=time(NULL); nullpo_retr(-1, sd); @@ -9175,7 +9175,7 @@ ACMD_FUNC(vip) { atcmd_output[sizeof(atcmd_output)-1] = '\0'; modif_p = atcmd_output; - vipdifftime = (int)solve_time(modif_p); + vipdifftime = (int32)solve_time(modif_p); if (vipdifftime == 0) { clif_displaymessage(fd, msg_txt(sd,701)); // Invalid time for vip command. clif_displaymessage(fd, msg_txt(sd,702)); // Time parameter format is +/- to alter. y/a = Year, m = Month, d/j = Day, h = Hour, n/mn = Minute, s = Second. diff --git a/src/map/chrif.c b/src/map/chrif.c index c3b4b95a68..34eb72a42b 100644 --- a/src/map/chrif.c +++ b/src/map/chrif.c @@ -823,7 +823,7 @@ int chrif_changeemail(int id, const char *actual_email, const char *new_email) { * @val1 : extra data value to transfer for operation * @val2 : extra data value to transfer for operation */ -int chrif_req_login_operation(int aid, const char* character_name, unsigned short operation_type, int timediff, int val1, int val2) { +int chrif_req_login_operation(int aid, const char* character_name, unsigned short operation_type, int32 timediff, int val1, int val2) { chrif_check(-1); WFIFOHEAD(char_fd,44); @@ -1071,7 +1071,7 @@ int chrif_ban(int fd) { return 0; } -int chrif_req_charban(int aid, const char* character_name, int timediff){ +int chrif_req_charban(int aid, const char* character_name, int32 timediff){ chrif_check(-1); WFIFOHEAD(char_fd,10+NAME_LENGTH); @@ -1520,20 +1520,25 @@ void chrif_keepalive_ack(int fd) { session[fd]->flag.ping = 0;/* reset ping state, we received a packet */ } +/** + * Received vip-data from char-serv, fill map-serv data + * @param fd : char-serv file descriptor (link to char-serv) + */ void chrif_parse_ack_vipActive(int fd) { #ifdef VIP_ENABLE - int aid = RFIFOL(char_fd,2); - uint32 vip_time = RFIFOL(char_fd,6); - bool isvip = RFIFOB(char_fd,10); - uint32 groupid = RFIFOL(char_fd,11); + int aid = RFIFOL(fd,2); + uint32 vip_time = RFIFOL(fd,6); + bool isvip = RFIFOB(fd,10); + uint32 groupid = RFIFOL(fd,11); TBL_PC *sd = map_id2sd(aid); - if (sd && isvip) { + if(sd == NULL) return ; + + sd->group_id = groupid; + pc_group_pc_load(sd); + if(isvip) { sd->vip.enabled = 1; sd->vip.time = vip_time; - sd->group_id = groupid; - pc_group_pc_load(sd); - // Increase storage size for VIP. sd->storage_size = battle_config.vip_storage_increase + MIN_STORAGE; if (sd->storage_size > MAX_STORAGE) { @@ -1541,9 +1546,16 @@ void chrif_parse_ack_vipActive(int fd) { sd->storage_size = MAX_STORAGE; } // Magic Stone requirement avoidance for VIP. - if (battle_config.vip_gemstone && pc_isvip(sd)) + if (battle_config.vip_gemstone) sd->special_state.no_gemstone = 2; // need to be done after status_calc_bl(bl,first); } + else if (sd->vip.enabled){ + sd->vip.enabled = 0; + sd->vip.time = 0; + sd->storage_size = MIN_STORAGE; + sd->special_state.no_gemstone = 0; + clif_displaymessage(sd->fd,"You're no longer a VIP_Member"); + } #endif } diff --git a/src/map/homunculus.c b/src/map/homunculus.c index 5dcb200249..de4e53ecd9 100644 --- a/src/map/homunculus.c +++ b/src/map/homunculus.c @@ -889,7 +889,7 @@ int merc_call_homunculus(struct map_session_data *sd) /** * Receive homunculus data from char server - * @param account_id : owner account_id of the homon + * @param account_id : owner account_id of the homon * @param sh : homonculus data from char-serv * @param flag : does the creation in inter-serv was a success (0:no,1:yes) * @return 0:failure, 1:sucess diff --git a/src/map/map.c b/src/map/map.c index e25604ac13..6bd8b2bae5 100644 --- a/src/map/map.c +++ b/src/map/map.c @@ -89,14 +89,14 @@ char log_db_db[32] = "log"; Sql* logmysql_handle; // DBMap declaartion -static DBMap* id_db=NULL; // int id -> struct block_list* -static DBMap* pc_db=NULL; // int id -> struct map_session_data* -static DBMap* mobid_db=NULL; // int id -> struct mob_data* -static DBMap* bossid_db=NULL; // int id -> struct mob_data* (MVP db) -static DBMap* map_db=NULL; // unsigned int mapindex -> struct map_data* -static DBMap* nick_db=NULL; // int char_id -> struct charid2nick* (requested names of offline characters) -static DBMap* charid_db=NULL; // int char_id -> struct map_session_data* -static DBMap* regen_db=NULL; // int id -> struct block_list* (status_natural_heal processing) +static DBMap* id_db=NULL; /// int id -> struct block_list* +static DBMap* pc_db=NULL; /// int id -> struct map_session_data* +static DBMap* mobid_db=NULL; /// int id -> struct mob_data* +static DBMap* bossid_db=NULL; /// int id -> struct mob_data* (MVP db) +static DBMap* map_db=NULL; /// unsigned int mapindex -> struct map_data* +static DBMap* nick_db=NULL; /// int char_id -> struct charid2nick* (requested names of offline characters) +static DBMap* charid_db=NULL; /// int char_id -> struct map_session_data* +static DBMap* regen_db=NULL; /// int id -> struct block_list* (status_natural_heal processing) static DBMap* map_msg_db=NULL; static int map_users=0; @@ -4063,7 +4063,7 @@ int do_init(int argc, char *argv[]) add_timer_func_list(map_clearflooritem_timer, "map_clearflooritem_timer"); add_timer_func_list(map_removemobs_timer, "map_removemobs_timer"); add_timer_interval(gettick()+1000, map_freeblock_timer, 0, 0, 60*1000); - + map_do_init_msg(); do_init_atcommand(); do_init_battle(); diff --git a/src/map/pc.c b/src/map/pc.c index e0688cf9a2..d2db4a73c7 100644 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -9415,7 +9415,10 @@ int pc_autosave(int tid, unsigned int tick, int id, intptr_t data) //Save char. last_save_id = sd->bl.id; save_flag = 2; - +#ifdef VIP_ENABLE + if(sd->vip.enabled) //check if we're still vip + chrif_req_login_operation(1, sd->status.name, 6, 0, 1, 0); +#endif chrif_save(sd,0); break; } diff --git a/src/map/pc.h b/src/map/pc.h index d4e27e1584..efea76cd91 100644 --- a/src/map/pc.h +++ b/src/map/pc.h @@ -123,10 +123,17 @@ struct s_autobonus { }; struct skill_cooldown_entry { - unsigned short skill_id; - int timer; + unsigned short skill_id; + int timer; }; +#ifdef VIP_ENABLE + struct vip_info { + unsigned int enabled : 1; + time_t time; + }; +#endif + enum npc_timeout_type { NPCT_INPUT = 0, NPCT_MENU = 1, @@ -553,12 +560,8 @@ struct map_session_data { int storage_size; // Holds player storage size (VIP system). #ifdef VIP_ENABLE - struct { - unsigned int enabled : 1; - time_t time; - } vip; + struct vip_info vip; #endif - //Timed bonus 'bonus_script' struct [Cydh] struct s_script { struct script_code *script; diff --git a/src/map/unit.c b/src/map/unit.c index 47e225613b..3015b916d3 100644 --- a/src/map/unit.c +++ b/src/map/unit.c @@ -199,7 +199,7 @@ int unit_check_start_teleport_timer(struct block_list *sbl) case BL_PET : max_dist = AREA_SIZE; break; case BL_MER : max_dist = MAX_MER_DISTANCE; break; } - // If there is a master and it's a valid type + // If there is a master and it's a valid type if(msd && (msd->bl.type&BL_PC) && max_dist){ ///TODO the bl.type is an hotfix please dig it to remove it int *msd_tid = unit_get_masterteleport_timer(sbl); if(msd_tid == NULL) return 0;