From 9412ebb9f7b009e3ae3b69e5eb1ae8a3d341a5f2 Mon Sep 17 00:00:00 2001 From: Lemongrass3110 Date: Sat, 3 Jun 2017 14:08:06 +0200 Subject: [PATCH] Added support for 2016's guild packets Thanks to @mrdiablo for his help. --- src/char/int_guild.c | 5 +-- src/common/mmo.h | 1 + src/map/clif.c | 86 ++++++++++++++++++++++++++++++++------------ 3 files changed, 67 insertions(+), 25 deletions(-) diff --git a/src/char/int_guild.c b/src/char/int_guild.c index 6ad64ec0b4..14794e545e 100644 --- a/src/char/int_guild.c +++ b/src/char/int_guild.c @@ -403,8 +403,8 @@ struct guild * inter_guild_fromsql(int guild_id) } // load guild member info - if( SQL_ERROR == Sql_Query(sql_handle, "SELECT `account_id`,`char_id`,`hair`,`hair_color`,`gender`,`class`,`lv`,`exp`,`exp_payper`,`online`,`position`,`name` " - "FROM `%s` WHERE `guild_id`='%d' ORDER BY `position`", schema_config.guild_member_db, guild_id) ) + if( SQL_ERROR == Sql_Query(sql_handle, "SELECT `m`.`account_id`,`m`.`char_id`,`m`.`hair`,`m`.`hair_color`,`m`.`gender`,`m`.`class`,`m`.`lv`,`m`.`exp`,`m`.`exp_payper`,`m`.`online`,`m`.`position`,`m`.`name`,coalesce(UNIX_TIMESTAMP(`c`.`last_login`),0) " + "FROM `%s` `m` INNER JOIN `%s` `c` on `c`.`char_id`=`m`.`char_id` WHERE `m`.`guild_id`='%d' ORDER BY `position`", schema_config.guild_member_db, schema_config.char_db, guild_id) ) { Sql_ShowDebug(sql_handle); aFree(g); @@ -428,6 +428,7 @@ struct guild * inter_guild_fromsql(int guild_id) if( m->position >= MAX_GUILDPOSITION ) // Fix reduction of MAX_GUILDPOSITION [PoW] m->position = MAX_GUILDPOSITION - 1; Sql_GetData(sql_handle, 11, &data, &len); memcpy(m->name, data, zmin(len, NAME_LENGTH)); + Sql_GetData(sql_handle, 12, &data, NULL); m->last_login = atoi(data); m->modified = GS_MEMBER_UNMODIFIED; } diff --git a/src/common/mmo.h b/src/common/mmo.h index 13b8b86f6b..0b5ff59efa 100644 --- a/src/common/mmo.h +++ b/src/common/mmo.h @@ -571,6 +571,7 @@ struct guild_member { char name[NAME_LENGTH]; struct map_session_data *sd; unsigned char modified; + uint32 last_login; }; struct guild_position { diff --git a/src/map/clif.c b/src/map/clif.c index 4d05c961f6..275198a644 100644 --- a/src/map/clif.c +++ b/src/map/clif.c @@ -8219,9 +8219,17 @@ void clif_guild_masterormember(struct map_session_data *sd) /// Guild basic information (Territories [Valaris]) /// 0150 .L .L .L .L .L .L .L .L .L .L .24B .24B .16B (ZC_GUILD_INFO) /// 01b6 .L .L .L .L .L .L .L .L .L .L .24B .24B .16B .L (ZC_GUILD_INFO2) +/// 0a84 .L .L .L .L .L .L .L .L .L .L .24B .16B .L .L (ZC_GUILD_INFO3) void clif_guild_basicinfo(struct map_session_data *sd) { int fd; struct guild *g; +#if PACKETVER < 20160622 + int cmd = 0x1b6; + int offset = NAME_LENGTH; +#else + int cmd = 0xa84; + int offset = 0; +#endif nullpo_retv(sd); fd = sd->fd; @@ -8229,8 +8237,8 @@ void clif_guild_basicinfo(struct map_session_data *sd) { if( (g = sd->guild) == NULL ) return; - WFIFOHEAD(fd,packet_len(0x1b6)); - WFIFOW(fd, 0)=0x1b6;//0x150; + WFIFOHEAD(fd,packet_len(cmd)); + WFIFOW(fd, 0)=cmd; WFIFOL(fd, 2)=g->guild_id; WFIFOL(fd, 6)=g->guild_lv; WFIFOL(fd,10)=g->connect_member; @@ -8243,12 +8251,16 @@ void clif_guild_basicinfo(struct map_session_data *sd) { WFIFOL(fd,38)=0; // Virtue: (down) Wicked [-100,100] Righteous (up) WFIFOL(fd,42)=g->emblem_id; safestrncpy(WFIFOCP(fd,46),g->name, NAME_LENGTH); +#if PACKETVER < 20160622 safestrncpy(WFIFOCP(fd,70),g->master, NAME_LENGTH); +#endif + safestrncpy(WFIFOCP(fd,70+offset),msg_txt(sd,300+guild_checkcastles(g)),16); // "'N' castles" + WFIFOL(fd,70+offset+16) = 0; // zeny +#if PACKETVER >= 20160622 + WFIFOL(fd,70+offset+20) = g->member[0].char_id; // leader +#endif - safestrncpy(WFIFOCP(fd,94),msg_txt(sd,300+guild_checkcastles(g)),16); // "'N' castles" - WFIFOL(fd,110) = 0; // zeny - - WFIFOSET(fd,packet_len(0x1b6)); + WFIFOSET(fd,packet_len(cmd)); } @@ -8280,18 +8292,27 @@ void clif_guild_allianceinfo(struct map_session_data *sd) } -/// Guild member manager information (ZC_MEMBERMGR_INFO). -/// 0154 .W { .L .L .W .W .W .W .W .L .L .L .50B .24B }* +/// Guild member manager information +/// 0154 .W { .L .L .W .W .W .W .W .L .L .L .50B .24B }* (ZC_MEMBERMGR_INFO) /// state: /// 0 = offline /// 1 = online /// memo: /// probably member's self-introduction (unused, no client UI/packets for editing it) +/// 0aa5 .W { .L .L .W .W .W .W .W .L .L .L }* (ZC_MEMBERMGR_INFO2) void clif_guild_memberlist(struct map_session_data *sd) { int fd; int i,c; struct guild *g; +#if PACKETVER < 20161026 + int cmd = 0x154; + int size = 104; +#else + int cmd = 0xaa5; + int size = 34; +#endif + nullpo_retv(sd); if( (fd = sd->fd) == 0 ) @@ -8299,27 +8320,31 @@ void clif_guild_memberlist(struct map_session_data *sd) if( (g = sd->guild) == NULL ) return; - WFIFOHEAD(fd, g->max_member * 104 + 4); - WFIFOW(fd, 0)=0x154; + WFIFOHEAD(fd, g->max_member * size + 4); + WFIFOW(fd, 0)=cmd; for(i=0,c=0;imax_member;i++){ struct guild_member *m=&g->member[i]; if(m->account_id==0) continue; - WFIFOL(fd,c*104+ 4)=m->account_id; - WFIFOL(fd,c*104+ 8)=m->char_id; - WFIFOW(fd,c*104+12)=m->hair; - WFIFOW(fd,c*104+14)=m->hair_color; - WFIFOW(fd,c*104+16)=m->gender; - WFIFOW(fd,c*104+18)=m->class_; - WFIFOW(fd,c*104+20)=m->lv; - WFIFOL(fd,c*104+22)=(int)cap_value(m->exp,0,INT32_MAX); - WFIFOL(fd,c*104+26)=m->online; - WFIFOL(fd,c*104+30)=m->position; - memset(WFIFOP(fd,c*104+34),0,50); //[Ind] - This is displayed in the 'note' column but being you can't edit it it's sent empty. - safestrncpy(WFIFOCP(fd,c*104+84),m->name,NAME_LENGTH); + WFIFOL(fd,c*size+ 4)=m->account_id; + WFIFOL(fd,c*size+ 8)=m->char_id; + WFIFOW(fd,c*size+12)=m->hair; + WFIFOW(fd,c*size+14)=m->hair_color; + WFIFOW(fd,c*size+16)=m->gender; + WFIFOW(fd,c*size+18)=m->class_; + WFIFOW(fd,c*size+20)=m->lv; + WFIFOL(fd,c*size+22)=(int)cap_value(m->exp,0,INT32_MAX); + WFIFOL(fd,c*size+26)=m->online; + WFIFOL(fd,c*size+30)=m->position; +#if PACKETVER < 20161026 + memset(WFIFOP(fd,c*size+34),0,50); //[Ind] - This is displayed in the 'note' column but being you can't edit it it's sent empty. + safestrncpy(WFIFOCP(fd,c*size+84),m->name,NAME_LENGTH); +#else + WFIFOL(fd,c*size+34)=m->last_login; +#endif c++; } - WFIFOW(fd, 2)=c*104+4; + WFIFOW(fd, 2)=c*size+4; WFIFOSET(fd,WFIFOW(fd,2)); } @@ -19560,6 +19585,21 @@ void packetdb_readdb(bool reload) -1, 0, 0, 26, 0, 0, 0, 0, 14, 2, 23, 2, -1, 2, 3, 2, 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, 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, + //#0x0A80 + 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, + //#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, + 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, //0x0AFF is currently defined as maximum }; struct { void (*func)(int, struct map_session_data *);