From 816d8ab2d0934f823a1d26f7fcac244f8245f14b Mon Sep 17 00:00:00 2001 From: Lemongrass3110 Date: Mon, 5 Jun 2017 23:07:09 +0200 Subject: [PATCH] Fixed party window for 2017 clients Thanks to @mrdiablo for his help again! --- db/packet_db.txt | 5 ++ src/map/clif.c | 126 ++++++++++++++++++++++++++++++++++++----------- src/map/clif.h | 1 + src/map/pc.c | 12 +++++ 4 files changed, 116 insertions(+), 28 deletions(-) diff --git a/db/packet_db.txt b/db/packet_db.txt index 231fc5b13c..343c9a284f 100644 --- a/db/packet_db.txt +++ b/db/packet_db.txt @@ -2657,5 +2657,10 @@ packet_keys: 0x4C17382A,0x7ED174C9,0x29961E4F // [Winnie] 0x088D,5,hommenu,2:4 0x0940,36,storagepassword,2:4:20 +// 2017-02-15aRagexeRE +0x0A43,85 +0x0A44,-1 +0x0ABD,10 + //Add new packets here //packet_ver: 56 diff --git a/src/map/clif.c b/src/map/clif.c index a6f6aa878f..2c1540d367 100644 --- a/src/map/clif.c +++ b/src/map/clif.c @@ -3239,14 +3239,6 @@ void clif_updatestatus(struct map_session_data *sd,int type) // On officials the HP never go below 1, even if you die [Lemongrass] // On officials the HP Novice class never go below 50%, even if you die [Napster] WFIFOL(fd,4)= sd->battle_status.hp ? sd->battle_status.hp : (sd->class_&MAPID_UPPERMASK) != MAPID_NOVICE ? 1 : sd->battle_status.max_hp/2; - - // TODO: Won't these overwrite the current packet? - if( map[sd->bl.m].hpmeter_visible ) - clif_hpmeter(sd); - if( !battle_config.party_hp_mode && sd->status.party_id ) - clif_party_hp(sd); - if( sd->bg_id ) - clif_bg_hp(sd); break; case SP_SP: WFIFOL(fd,4)=sd->battle_status.sp; @@ -3392,6 +3384,36 @@ void clif_updatestatus(struct map_session_data *sd,int type) return; } WFIFOSET(fd,len); + + // Additional update packets that should be sent right after + switch( type ){ + case SP_BASELEVEL: + if( sd->status.party_id ){ + struct party_data* p; + int i; + + if( ( p = party_search( sd->status.party_id ) ) != NULL ){ + ARR_FIND(0, MAX_PARTY, i, p->party.member[i].char_id == sd->status.char_id); + + if( i < MAX_PARTY ){ + p->party.member[i].lv = sd->status.base_level; + clif_party_job_and_level(sd); + } + } + } + break; + case SP_HP: + if( map[sd->bl.m].hpmeter_visible ){ + clif_hpmeter(sd); + } + if( !battle_config.party_hp_mode && sd->status.party_id ){ + clif_party_hp(sd); + } + if( sd->bg_id ){ + clif_bg_hp(sd); + } + break; + } } @@ -7303,6 +7325,7 @@ void clif_party_created(struct map_session_data *sd,int result) /// Adds new member to a party. /// 0104 .L .L .W .W .B .24B .24B .16B (ZC_ADD_MEMBER_TO_GROUP) /// 01e9 .L .L .W .W .B .24B .24B .16B .B .B (ZC_ADD_MEMBER_TO_GROUP2) +/// 0a43 .L .L .W .W .W .W .B .24B .24B .16B .B .B (ZC_ADD_MEMBER_TO_GROUP3) /// role: /// 0 = leader /// 1 = normal @@ -7311,8 +7334,16 @@ void clif_party_created(struct map_session_data *sd,int result) /// 1 = disconnected void clif_party_member_info(struct party_data *p, struct map_session_data *sd) { - unsigned char buf[81]; int i; +#if PACKETVER < 20170215 + unsigned char buf[81]; + int cmd = 0x1e9; + int offset = 0; +#else + unsigned char buf[85]; + int cmd = 0xa43; + int offset = 4; +#endif if (!sd) { //Pick any party member (this call is used when changing item share rules) ARR_FIND( 0, MAX_PARTY, i, p->data[i].sd != 0 ); @@ -7322,18 +7353,22 @@ void clif_party_member_info(struct party_data *p, struct map_session_data *sd) if (i >= MAX_PARTY) return; //Should never happen... sd = p->data[i].sd; - WBUFW(buf, 0) = 0x1e9; + WBUFW(buf, 0) = cmd; WBUFL(buf, 2) = sd->status.account_id; WBUFL(buf, 6) = (p->party.member[i].leader)?0:1; - WBUFW(buf,10) = sd->bl.x; - WBUFW(buf,12) = sd->bl.y; - WBUFB(buf,14) = (p->party.member[i].online)?0:1; - safestrncpy(WBUFCP(buf,15), p->party.name, NAME_LENGTH); - safestrncpy(WBUFCP(buf,39), sd->status.name, NAME_LENGTH); - mapindex_getmapname_ext(map_mapid2mapname(sd->bl.m), WBUFCP(buf,63)); - WBUFB(buf,79) = (p->party.item&1)?1:0; - WBUFB(buf,80) = (p->party.item&2)?1:0; - clif_send(buf,packet_len(0x1e9),&sd->bl,PARTY); +#if PACKETVER >= 20170215 + WBUFW(buf,10) = sd->status.class_; + WBUFW(buf,12) = sd->status.base_level; +#endif + WBUFW(buf,offset+10) = sd->bl.x; + WBUFW(buf,offset+12) = sd->bl.y; + WBUFB(buf,offset+14) = (p->party.member[i].online)?0:1; + safestrncpy(WBUFCP(buf,offset+15), p->party.name, NAME_LENGTH); + safestrncpy(WBUFCP(buf,offset+39), sd->status.name, NAME_LENGTH); + mapindex_getmapname_ext(map_mapid2mapname(sd->bl.m), WBUFCP(buf,offset+63)); + WBUFB(buf,offset+79) = (p->party.item&1)?1:0; + WBUFB(buf,offset+80) = (p->party.item&2)?1:0; + clif_send(buf,packet_len(cmd),&sd->bl,PARTY); } @@ -7345,15 +7380,23 @@ void clif_party_member_info(struct party_data *p, struct map_session_data *sd) /// state: /// 0 = connected /// 1 = disconnected +/// 0a44 .W .24B { .L .24B .16B .B .B .W .W }* .B .B .L void clif_party_info(struct party_data* p, struct map_session_data *sd) { unsigned char buf[2+2+NAME_LENGTH+(4+NAME_LENGTH+MAP_NAME_LENGTH_EXT+1+1)*MAX_PARTY]; struct map_session_data* party_sd = NULL; int i, c; +#if PACKETVER < 20170215 + int cmd = 0xfb; + int size = 46; +#else + int cmd = 0xa44; + int size = 50; +#endif nullpo_retv(p); - WBUFW(buf,0) = 0xfb; + WBUFW(buf,0) = cmd; safestrncpy(WBUFCP(buf,4), p->party.name, NAME_LENGTH); for(i = 0, c = 0; i < MAX_PARTY; i++) { @@ -7362,14 +7405,25 @@ void clif_party_info(struct party_data* p, struct map_session_data *sd) if(party_sd == NULL) party_sd = p->data[i].sd; - WBUFL(buf,28+c*46) = m->account_id; - safestrncpy(WBUFCP(buf,28+c*46+4), m->name, NAME_LENGTH); - mapindex_getmapname_ext(mapindex_id2name(m->map), WBUFCP(buf,28+c*46+28)); - WBUFB(buf,28+c*46+44) = (m->leader) ? 0 : 1; - WBUFB(buf,28+c*46+45) = (m->online) ? 0 : 1; + WBUFL(buf,28+c*size) = m->account_id; + safestrncpy(WBUFCP(buf,28+c*size+4), m->name, NAME_LENGTH); + mapindex_getmapname_ext(mapindex_id2name(m->map), WBUFCP(buf,28+c*size+28)); + WBUFB(buf,28+c*size+44) = (m->leader) ? 0 : 1; + WBUFB(buf,28+c*size+45) = (m->online) ? 0 : 1; +#if PACKETVER >= 20170215 + WBUFW(buf,28+c*size+46) = m->class_; + WBUFW(buf,28+c*size+48) = m->lv; +#endif c++; } - WBUFW(buf,2) = 28+c*46; +#if PACKETVER < 20170215 + WBUFW(buf,2) = 28+c*size; +#else + WBUFB(buf,28+c*size) = (p->party.item & 1) ? 1 : 0; + WBUFB(buf,28+c*size+1) = (p->party.item & 2) ? 1 : 0; + WBUFL(buf,28+c*size+2) = 0; // unknown + WBUFW(buf,2) = 28+c*size+6; +#endif if(sd) { // send only to self clif_send(buf, WBUFW(buf,2), &sd->bl, SELF); @@ -7612,6 +7666,22 @@ void clif_party_hp(struct map_session_data *sd) clif_send(buf,packet_len(cmd),&sd->bl,PARTY_AREA_WOS); } +/// Updates the job and level of a party member +/// 0abd .L .W .W +void clif_party_job_and_level(struct map_session_data *sd){ +#if PACKETVER >= 20170215 + unsigned char buf[10]; + + nullpo_retv(sd); + + WBUFW(buf, 0) = 0xabd; + WBUFL(buf, 2) = sd->status.account_id; + WBUFW(buf, 6) = sd->status.class_; + WBUFW(buf, 8) = sd->status.base_level; + + clif_send(buf, packet_len(0xabd), &sd->bl, PARTY); +#endif +} /*========================================== * Sends HP bar to a single fd. [Skotlex] @@ -19596,7 +19666,7 @@ void packetdb_readdb(bool reload) 21, 3, 5, 0, 66, 0, 0, 8, 3, 0, 0, -1, 0, -1, 0, 0, 106, 0, 0, 0, 0, 4, 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, //#0x0A40 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 85, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -19604,7 +19674,7 @@ void packetdb_readdb(bool reload) 0, 0, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, //#0x0AC0 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, diff --git a/src/map/clif.h b/src/map/clif.h index 05737a2603..c2fd594700 100644 --- a/src/map/clif.h +++ b/src/map/clif.h @@ -731,6 +731,7 @@ void clif_party_xy(struct map_session_data *sd); void clif_party_xy_single(int fd, struct map_session_data *sd); void clif_party_hp(struct map_session_data *sd); void clif_hpmeter_single(int fd, int id, unsigned int hp, unsigned int maxhp); +void clif_party_job_and_level(struct map_session_data *sd); // guild void clif_guild_created(struct map_session_data *sd,int flag); diff --git a/src/map/pc.c b/src/map/pc.c index c7d8470f63..55c8732089 100755 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -8611,6 +8611,18 @@ bool pc_jobchange(struct map_session_data *sd,int job, char upper) pc_checkallowskill(sd); pc_equiplookall(sd); pc_show_questinfo(sd); + if( sd->status.party_id ){ + struct party_data* p; + + if( ( p = party_search( sd->status.party_id ) ) != NULL ){ + ARR_FIND(0, MAX_PARTY, i, p->party.member[i].char_id == sd->status.char_id); + + if( i < MAX_PARTY ){ + p->party.member[i].class_ = sd->status.class_; + clif_party_job_and_level(sd); + } + } + } chrif_save(sd, CSAVE_NORMAL); //if you were previously famous, not anymore.