diff --git a/db/GeoIP.dat b/db/GeoIP.dat index 00510d552d..9d014999f7 100644 Binary files a/db/GeoIP.dat and b/db/GeoIP.dat differ diff --git a/src/char/inter.c b/src/char/inter.c index 4f2eb8c456..3cba1ae691 100644 --- a/src/char/inter.c +++ b/src/char/inter.c @@ -426,10 +426,10 @@ void mapif_parse_accinfo(int fd) { /* it will only get here if we have a single match */ if( account_id ) { - char userid[NAME_LENGTH], user_pass[NAME_LENGTH], email[40], last_ip[20], lastlogin[30]; + char userid[NAME_LENGTH], user_pass[NAME_LENGTH], email[40], last_ip[20], lastlogin[30], pincode[5]; short level = -1; int logincount = 0,state = 0; - if ( SQL_ERROR == Sql_Query(sql_handle, "SELECT `userid`, `user_pass`, `email`, `last_ip`, `group_id`, `lastlogin`, `logincount`, `state` FROM `login` WHERE `account_id` = '%d' LIMIT 1", account_id) + if ( SQL_ERROR == Sql_Query(sql_handle, "SELECT `userid`, `user_pass`, `email`, `last_ip`, `group_id`, `lastlogin`, `logincount`, `state`,`pincode` FROM `login` WHERE `account_id` = '%d' LIMIT 1", account_id) || Sql_NumRows(sql_handle) == 0 ) { if( Sql_NumRows(sql_handle) == 0 ) { inter_to_fd(fd, u_fd, aid, "No account with ID '%d' was found.", account_id ); @@ -447,6 +447,7 @@ void mapif_parse_accinfo(int fd) { Sql_GetData(sql_handle, 5, &data, NULL); safestrncpy(lastlogin, data, sizeof(lastlogin)); Sql_GetData(sql_handle, 6, &data, NULL); logincount = atoi(data); Sql_GetData(sql_handle, 7, &data, NULL); state = atoi(data); + Sql_GetData(sql_handle, 8, &data, NULL); safestrncpy(pincode, data, sizeof(pincode)); } Sql_FreeResult(sql_handle); @@ -457,8 +458,12 @@ void mapif_parse_accinfo(int fd) { inter_to_fd(fd, u_fd, aid, "-- Account %d --", account_id ); inter_to_fd(fd, u_fd, aid, "User: %s | GM Group: %d | State: %d", userid, level, state ); - if (level < castergroup) /* only show pass if your gm level is greater than the one you're searching for */ - inter_to_fd(fd, u_fd, aid, "Password: %s", user_pass ); + if (level < castergroup) { /* only show pass if your gm level is greater than the one you're searching for */ + if( strlen(pincode) ) + inter_to_fd(fd, u_fd, aid, "Password: %s (PIN:%s)", user_pass, pincode ); + else + inter_to_fd(fd, u_fd, aid, "Password: %s", user_pass ); + } inter_to_fd(fd, u_fd, aid, "Account e-mail: %s", email); inter_to_fd(fd, u_fd, aid, "Last IP: %s (%s)", last_ip, geoip_getcountry(str2ip(last_ip)) ); diff --git a/src/map/atcommand.c b/src/map/atcommand.c index 9043a514f9..005fc3512f 100644 --- a/src/map/atcommand.c +++ b/src/map/atcommand.c @@ -8554,7 +8554,7 @@ ACMD_FUNC(accinfo) { //remove const type safestrncpy(query, message, NAME_LENGTH); - intif_request_accinfo( sd->fd, sd->bl.id, sd->group_id, query ); + intif_request_accinfo( sd->fd, sd->bl.id, pc_get_group_level(sd), query ); return 0; } diff --git a/src/map/intif.c b/src/map/intif.c index 9391e02752..f11ba23500 100644 --- a/src/map/intif.c +++ b/src/map/intif.c @@ -2121,7 +2121,7 @@ int intif_parse_elemental_saved(int fd) return 0; } -void intif_request_accinfo( int u_fd, int aid, int group_id, char* query ) { +void intif_request_accinfo( int u_fd, int aid, int group_lv, char* query ) { WFIFOHEAD(inter_fd,2 + 4 + 4 + 4 + NAME_LENGTH); @@ -2129,8 +2129,8 @@ void intif_request_accinfo( int u_fd, int aid, int group_id, char* query ) { WFIFOW(inter_fd,0) = 0x3007; WFIFOL(inter_fd,2) = u_fd; WFIFOL(inter_fd,6) = aid; - WFIFOL(inter_fd,10) = group_id; - safestrncpy((char *)WFIFOP(inter_fd,14), query, NAME_LENGTH); + WFIFOL(inter_fd,10) = group_lv; + safestrncpy((char *)WFIFOP(inter_fd,14), query, NAME_LENGTH); WFIFOSET(inter_fd,2 + 4 + 4 + 4 + NAME_LENGTH); diff --git a/src/map/intif.h b/src/map/intif.h index 65cc19830a..75b48d6255 100644 --- a/src/map/intif.h +++ b/src/map/intif.h @@ -105,7 +105,7 @@ int intif_elemental_delete(int ele_id); int intif_elemental_save(struct s_elemental *ele); /* @accinfo */ -void intif_request_accinfo( int u_fd, int aid, int group_id, char* query ); +void intif_request_accinfo( int u_fd, int aid, int group_lv, char* query ); int CheckForCharServer(void); diff --git a/src/map/pc.c b/src/map/pc.c index c837a16c48..b7c8a8312c 100644 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -65,7 +65,7 @@ struct fame_list smith_fame_list[MAX_FAME_LIST]; struct fame_list chemist_fame_list[MAX_FAME_LIST]; struct fame_list taekwon_fame_list[MAX_FAME_LIST]; -static unsigned short equip_pos[EQI_MAX]={EQP_ACC_L,EQP_ACC_R,EQP_SHOES,EQP_GARMENT,EQP_HEAD_LOW,EQP_HEAD_MID,EQP_HEAD_TOP,EQP_ARMOR,EQP_HAND_L,EQP_HAND_R,EQP_COSTUME_HEAD_TOP,EQP_COSTUME_HEAD_MID,EQP_COSTUME_HEAD_LOW,EQP_AMMO}; +static unsigned short equip_pos[EQI_MAX]={EQP_ACC_L,EQP_ACC_R,EQP_SHOES,EQP_GARMENT,EQP_HEAD_LOW,EQP_HEAD_MID,EQP_HEAD_TOP,EQP_ARMOR,EQP_HAND_L,EQP_HAND_R,EQP_COSTUME_HEAD_TOP,EQP_COSTUME_HEAD_MID,EQP_COSTUME_HEAD_LOW,EQP_COSTUME_GARMENT,EQP_AMMO}; #define MOTD_LINE_SIZE 128 static char motd_text[MOTD_LINE_SIZE][CHAT_SIZE_MAX]; // Message of the day buffer [Valaris] @@ -1437,7 +1437,7 @@ int pc_calc_skilltree(struct map_session_data *sd) sd->status.skill[id].id = id; sd->status.skill[id].flag = SKILL_FLAG_TEMPORARY; // So it is not saved, and tagged as a "bonus" skill. } - else if( id != NV_BASIC) + else if( id != NV_BASIC ) { sd->status.skill[id].flag = SKILL_FLAG_REPLACED_LV_0 + sd->status.skill[id].lv; // Remember original level } @@ -7525,7 +7525,7 @@ int pc_equiplookall(struct map_session_data *sd) clif_changelook(&sd->bl,LOOK_HEAD_BOTTOM,sd->status.head_bottom); clif_changelook(&sd->bl,LOOK_HEAD_TOP,sd->status.head_top); clif_changelook(&sd->bl,LOOK_HEAD_MID,sd->status.head_mid); - clif_changelook(&sd->bl, LOOK_ROBE, sd->status.robe); + clif_changelook(&sd->bl,LOOK_ROBE, sd->status.robe); return 0; } @@ -8570,11 +8570,14 @@ int pc_equipitem(struct map_session_data *sd,int n,int req_pos) } if(pos & EQP_SHOES) clif_changelook(&sd->bl,LOOK_SHOES,0); - if( pos&EQP_GARMENT ) - { + if(pos&EQP_GARMENT) { sd->status.robe = id ? id->look : 0; clif_changelook(&sd->bl, LOOK_ROBE, sd->status.robe); } + if(pos & EQP_COSTUME_GARMENT) { + sd->status.robe = id ? id->look : 0; + clif_changelook(&sd->bl,LOOK_ROBE,sd->status.robe); + } pc_checkallowskill(sd); //Check if status changes should be halted. iflag = sd->npc_item_flag; @@ -8710,12 +8713,17 @@ int pc_unequipitem(struct map_session_data *sd,int n,int flag) { if(sd->status.inventory[n].equip & EQP_SHOES) clif_changelook(&sd->bl,LOOK_SHOES,0); - if( sd->status.inventory[n].equip&EQP_GARMENT ) - { + + if(sd->status.inventory[n].equip&EQP_GARMENT && pc_checkequip(sd,EQP_COSTUME_GARMENT) == -1) { sd->status.robe = 0; clif_changelook(&sd->bl, LOOK_ROBE, 0); } + if(sd->status.inventory[n].equip & EQP_COSTUME_GARMENT) { + sd->status.robe = ( pc_checkequip(sd,EQP_GARMENT) >= 0 ) ? sd->inventory_data[pc_checkequip(sd,EQP_GARMENT)]->look : 0; + clif_changelook(&sd->bl,LOOK_ROBE,sd->status.robe); + } + clif_unequipitemack(sd,n,sd->status.inventory[n].equip,1); if((sd->status.inventory[n].equip & EQP_ARMS) && diff --git a/src/map/pc.h b/src/map/pc.h index 9811803252..b24e60c53a 100644 --- a/src/map/pc.h +++ b/src/map/pc.h @@ -536,28 +536,28 @@ enum ammo_type { //Equip position constants enum equip_pos { - EQP_HEAD_LOW = 0x0001, - EQP_HEAD_MID = 0x0200, //512 - EQP_HEAD_TOP = 0x0100, //256 - EQP_HAND_R = 0x0002, - EQP_HAND_L = 0x0020, //32 - EQP_ARMOR = 0x0010, //16 - EQP_SHOES = 0x0040, //64 - EQP_GARMENT = 0x0004, - EQP_ACC_L = 0x0008, - EQP_ACC_R = 0x0080, //128 - EQP_AMMO = 0x8000, //32768 - EQP_COSTUME_HEAD_LOW = 0x1000, - EQP_COSTUME_HEAD_MID = 0x0800, - EQP_COSTUME_HEAD_TOP = 0x0400, - //EQP_COSTUME_GARMENT = 0x2000, - //EQP_COSTUME_FLOOR = 0x4000, - //EQP_SHADOW_ARMOR = 0x10000,//Shadow equip slots will be left disabled until client's supporting them are usable. [Rytech] - //EQP_SHADOW_WEAPON = 0x20000, - //EQP_SHADOW_SHIELD = 0x40000, - //EQP_SHADOW_SHOES = 0x80000, - //EQP_SHADOW_ACC_R = 0x100000, - //EQP_SHADOW_ACC_L = 0x200000, + EQP_HEAD_LOW = 0x0001, + EQP_HEAD_MID = 0x0200, //512 + EQP_HEAD_TOP = 0x0100, //256 + EQP_HAND_R = 0x0002, //2 + EQP_HAND_L = 0x0020, //32 + EQP_ARMOR = 0x0010, //16 + EQP_SHOES = 0x0040, //64 + EQP_GARMENT = 0x0004, //4 + EQP_ACC_L = 0x0008, //8 + EQP_ACC_R = 0x0080, //128 + EQP_COSTUME_HEAD_TOP = 0x0400, //1024 + EQP_COSTUME_HEAD_MID = 0x0800, //2048 + EQP_COSTUME_HEAD_LOW = 0x1000, //4096 + EQP_COSTUME_GARMENT = 0x2000, //8192 + EQP_AMMO = 0x8000, //32768 + //EQP_COSTUME_FLOOR = 0x4000, + //EQP_SHADOW_ARMOR = 0x10000,//Shadow equip slots will be left disabled until client's supporting them are usable. [Rytech] + //EQP_SHADOW_WEAPON = 0x20000, + //EQP_SHADOW_SHIELD = 0x40000, + //EQP_SHADOW_SHOES = 0x80000, + //EQP_SHADOW_ACC_R = 0x100000, + //EQP_SHADOW_ACC_L = 0x200000, }; #define EQP_WEAPON EQP_HAND_R @@ -565,7 +565,7 @@ enum equip_pos { #define EQP_ARMS (EQP_HAND_R|EQP_HAND_L) #define EQP_HELM (EQP_HEAD_LOW|EQP_HEAD_MID|EQP_HEAD_TOP) #define EQP_ACC (EQP_ACC_L|EQP_ACC_R) -#define EQP_COSTUME (EQP_COSTUME_HEAD_TOP|EQP_COSTUME_HEAD_MID|EQP_COSTUME_HEAD_LOW) +#define EQP_COSTUME (EQP_COSTUME_HEAD_TOP|EQP_COSTUME_HEAD_MID|EQP_COSTUME_HEAD_LOW|EQP_COSTUME_GARMENT) //#define EQP_SHADOW_GEAR (EQP_SHADOW_ARMOR|EQP_SHADOW_WEAPON|EQP_SHADOW_SHIELD|EQP_SHADOW_SHOES|EQP_SHADOW_ACC_R|EQP_SHADOW_ACC_L) /// Equip positions that use a visible sprite @@ -591,6 +591,7 @@ enum equip_index { EQI_COSTUME_TOP, EQI_COSTUME_MID, EQI_COSTUME_LOW, + EQI_COSTUME_GARMENT, EQI_AMMO, EQI_MAX }; diff --git a/src/map/script.c b/src/map/script.c index 7911847021..95474ab947 100644 --- a/src/map/script.c +++ b/src/map/script.c @@ -7346,7 +7346,7 @@ BUILDIN_FUNC(strnpcinfo) // aegis->athena slot position conversion table -static unsigned int equip[] = {EQP_HEAD_TOP,EQP_ARMOR,EQP_HAND_L,EQP_HAND_R,EQP_GARMENT,EQP_SHOES,EQP_ACC_L,EQP_ACC_R,EQP_HEAD_MID,EQP_HEAD_LOW,EQP_COSTUME_HEAD_LOW,EQP_COSTUME_HEAD_MID,EQP_COSTUME_HEAD_TOP}; +static unsigned int equip[] = {EQP_HEAD_TOP,EQP_ARMOR,EQP_HAND_L,EQP_HAND_R,EQP_GARMENT,EQP_SHOES,EQP_ACC_L,EQP_ACC_R,EQP_HEAD_MID,EQP_HEAD_LOW,EQP_COSTUME_HEAD_LOW,EQP_COSTUME_HEAD_MID,EQP_COSTUME_HEAD_TOP,EQP_COSTUME_GARMENT}; /*========================================== * GetEquipID(Pos); Pos: 1-13 @@ -12958,26 +12958,27 @@ BUILDIN_FUNC(npcstop) *------------------------------------------*/ BUILDIN_FUNC(getlook) { - int type,val; - TBL_PC *sd; - sd=script_rid2sd(st); + int type,val; + TBL_PC *sd; + sd=script_rid2sd(st); - type=script_getnum(st,2); - val=-1; - switch(type) { - case LOOK_HAIR: val=sd->status.hair; break; //1 - case LOOK_WEAPON: val=sd->status.weapon; break; //2 - case LOOK_HEAD_BOTTOM: val=sd->status.head_bottom; break; //3 - case LOOK_HEAD_TOP: val=sd->status.head_top; break; //4 - case LOOK_HEAD_MID: val=sd->status.head_mid; break; //5 - case LOOK_HAIR_COLOR: val=sd->status.hair_color; break; //6 - case LOOK_CLOTHES_COLOR: val=sd->status.clothes_color; break; //7 - case LOOK_SHIELD: val=sd->status.shield; break; //8 - case LOOK_SHOES: break; //9 - } + type=script_getnum(st,2); + val=-1; + switch(type) { + case LOOK_HAIR: val=sd->status.hair; break; //1 + case LOOK_WEAPON: val=sd->status.weapon; break; //2 + case LOOK_HEAD_BOTTOM: val=sd->status.head_bottom; break; //3 + case LOOK_HEAD_TOP: val=sd->status.head_top; break; //4 + case LOOK_HEAD_MID: val=sd->status.head_mid; break; //5 + case LOOK_HAIR_COLOR: val=sd->status.hair_color; break; //6 + case LOOK_CLOTHES_COLOR: val=sd->status.clothes_color; break; //7 + case LOOK_SHIELD: val=sd->status.shield; break; //8 + case LOOK_SHOES: break; //9 + case LOOK_ROBE: val=sd->status.robe; break; //12 + } - script_pushint(st,val); - return 0; + script_pushint(st,val); + return 0; } /*========================================== diff --git a/src/map/skill.c b/src/map/skill.c index 655af080ac..4ca1e5a427 100644 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -4391,7 +4391,8 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint else // Last spell to be released status_change_end(src, SC_READING_SB, INVALID_TIMER); - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + if( bl->type != BL_SKILL ) /* skill types will crash the client */ + clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); if( !skill_check_condition_castbegin(sd, skill_id, skill_lv) ) break;