Added support for 2016's guild packets

Thanks to @mrdiablo for his help.
This commit is contained in:
Lemongrass3110 2017-06-03 14:08:06 +02:00
parent c212b2ed05
commit 9412ebb9f7
3 changed files with 67 additions and 25 deletions

View File

@ -403,8 +403,8 @@ struct guild * inter_guild_fromsql(int guild_id)
} }
// load guild member info // 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` " 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` WHERE `guild_id`='%d' ORDER BY `position`", schema_config.guild_member_db, guild_id) ) "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); Sql_ShowDebug(sql_handle);
aFree(g); 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] if( m->position >= MAX_GUILDPOSITION ) // Fix reduction of MAX_GUILDPOSITION [PoW]
m->position = MAX_GUILDPOSITION - 1; m->position = MAX_GUILDPOSITION - 1;
Sql_GetData(sql_handle, 11, &data, &len); memcpy(m->name, data, zmin(len, NAME_LENGTH)); 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; m->modified = GS_MEMBER_UNMODIFIED;
} }

View File

@ -571,6 +571,7 @@ struct guild_member {
char name[NAME_LENGTH]; char name[NAME_LENGTH];
struct map_session_data *sd; struct map_session_data *sd;
unsigned char modified; unsigned char modified;
uint32 last_login;
}; };
struct guild_position { struct guild_position {

View File

@ -8219,9 +8219,17 @@ void clif_guild_masterormember(struct map_session_data *sd)
/// Guild basic information (Territories [Valaris]) /// Guild basic information (Territories [Valaris])
/// 0150 <guild id>.L <level>.L <member num>.L <member max>.L <exp>.L <max exp>.L <points>.L <honor>.L <virtue>.L <emblem id>.L <name>.24B <master name>.24B <manage land>.16B (ZC_GUILD_INFO) /// 0150 <guild id>.L <level>.L <member num>.L <member max>.L <exp>.L <max exp>.L <points>.L <honor>.L <virtue>.L <emblem id>.L <name>.24B <master name>.24B <manage land>.16B (ZC_GUILD_INFO)
/// 01b6 <guild id>.L <level>.L <member num>.L <member max>.L <exp>.L <max exp>.L <points>.L <honor>.L <virtue>.L <emblem id>.L <name>.24B <master name>.24B <manage land>.16B <zeny>.L (ZC_GUILD_INFO2) /// 01b6 <guild id>.L <level>.L <member num>.L <member max>.L <exp>.L <max exp>.L <points>.L <honor>.L <virtue>.L <emblem id>.L <name>.24B <master name>.24B <manage land>.16B <zeny>.L (ZC_GUILD_INFO2)
/// 0a84 <guild id>.L <level>.L <member num>.L <member max>.L <exp>.L <max exp>.L <points>.L <honor>.L <virtue>.L <emblem id>.L <name>.24B <manage land>.16B <zeny>.L <master char id>.L (ZC_GUILD_INFO3)
void clif_guild_basicinfo(struct map_session_data *sd) { void clif_guild_basicinfo(struct map_session_data *sd) {
int fd; int fd;
struct guild *g; struct guild *g;
#if PACKETVER < 20160622
int cmd = 0x1b6;
int offset = NAME_LENGTH;
#else
int cmd = 0xa84;
int offset = 0;
#endif
nullpo_retv(sd); nullpo_retv(sd);
fd = sd->fd; fd = sd->fd;
@ -8229,8 +8237,8 @@ void clif_guild_basicinfo(struct map_session_data *sd) {
if( (g = sd->guild) == NULL ) if( (g = sd->guild) == NULL )
return; return;
WFIFOHEAD(fd,packet_len(0x1b6)); WFIFOHEAD(fd,packet_len(cmd));
WFIFOW(fd, 0)=0x1b6;//0x150; WFIFOW(fd, 0)=cmd;
WFIFOL(fd, 2)=g->guild_id; WFIFOL(fd, 2)=g->guild_id;
WFIFOL(fd, 6)=g->guild_lv; WFIFOL(fd, 6)=g->guild_lv;
WFIFOL(fd,10)=g->connect_member; 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,38)=0; // Virtue: (down) Wicked [-100,100] Righteous (up)
WFIFOL(fd,42)=g->emblem_id; WFIFOL(fd,42)=g->emblem_id;
safestrncpy(WFIFOCP(fd,46),g->name, NAME_LENGTH); safestrncpy(WFIFOCP(fd,46),g->name, NAME_LENGTH);
#if PACKETVER < 20160622
safestrncpy(WFIFOCP(fd,70),g->master, NAME_LENGTH); 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" WFIFOSET(fd,packet_len(cmd));
WFIFOL(fd,110) = 0; // zeny
WFIFOSET(fd,packet_len(0x1b6));
} }
@ -8280,18 +8292,27 @@ void clif_guild_allianceinfo(struct map_session_data *sd)
} }
/// Guild member manager information (ZC_MEMBERMGR_INFO). /// Guild member manager information
/// 0154 <packet len>.W { <account>.L <char id>.L <hair style>.W <hair color>.W <gender>.W <class>.W <level>.W <contrib exp>.L <state>.L <position>.L <memo>.50B <name>.24B }* /// 0154 <packet len>.W { <account>.L <char id>.L <hair style>.W <hair color>.W <gender>.W <class>.W <level>.W <contrib exp>.L <state>.L <position>.L <memo>.50B <name>.24B }* (ZC_MEMBERMGR_INFO)
/// state: /// state:
/// 0 = offline /// 0 = offline
/// 1 = online /// 1 = online
/// memo: /// memo:
/// probably member's self-introduction (unused, no client UI/packets for editing it) /// probably member's self-introduction (unused, no client UI/packets for editing it)
/// 0aa5 <packet len>.W { <account>.L <char id>.L <hair style>.W <hair color>.W <gender>.W <class>.W <level>.W <contrib exp>.L <state>.L <position>.L }* (ZC_MEMBERMGR_INFO2)
void clif_guild_memberlist(struct map_session_data *sd) void clif_guild_memberlist(struct map_session_data *sd)
{ {
int fd; int fd;
int i,c; int i,c;
struct guild *g; struct guild *g;
#if PACKETVER < 20161026
int cmd = 0x154;
int size = 104;
#else
int cmd = 0xaa5;
int size = 34;
#endif
nullpo_retv(sd); nullpo_retv(sd);
if( (fd = sd->fd) == 0 ) if( (fd = sd->fd) == 0 )
@ -8299,27 +8320,31 @@ void clif_guild_memberlist(struct map_session_data *sd)
if( (g = sd->guild) == NULL ) if( (g = sd->guild) == NULL )
return; return;
WFIFOHEAD(fd, g->max_member * 104 + 4); WFIFOHEAD(fd, g->max_member * size + 4);
WFIFOW(fd, 0)=0x154; WFIFOW(fd, 0)=cmd;
for(i=0,c=0;i<g->max_member;i++){ for(i=0,c=0;i<g->max_member;i++){
struct guild_member *m=&g->member[i]; struct guild_member *m=&g->member[i];
if(m->account_id==0) if(m->account_id==0)
continue; continue;
WFIFOL(fd,c*104+ 4)=m->account_id; WFIFOL(fd,c*size+ 4)=m->account_id;
WFIFOL(fd,c*104+ 8)=m->char_id; WFIFOL(fd,c*size+ 8)=m->char_id;
WFIFOW(fd,c*104+12)=m->hair; WFIFOW(fd,c*size+12)=m->hair;
WFIFOW(fd,c*104+14)=m->hair_color; WFIFOW(fd,c*size+14)=m->hair_color;
WFIFOW(fd,c*104+16)=m->gender; WFIFOW(fd,c*size+16)=m->gender;
WFIFOW(fd,c*104+18)=m->class_; WFIFOW(fd,c*size+18)=m->class_;
WFIFOW(fd,c*104+20)=m->lv; WFIFOW(fd,c*size+20)=m->lv;
WFIFOL(fd,c*104+22)=(int)cap_value(m->exp,0,INT32_MAX); WFIFOL(fd,c*size+22)=(int)cap_value(m->exp,0,INT32_MAX);
WFIFOL(fd,c*104+26)=m->online; WFIFOL(fd,c*size+26)=m->online;
WFIFOL(fd,c*104+30)=m->position; WFIFOL(fd,c*size+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. #if PACKETVER < 20161026
safestrncpy(WFIFOCP(fd,c*104+84),m->name,NAME_LENGTH); 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++; c++;
} }
WFIFOW(fd, 2)=c*104+4; WFIFOW(fd, 2)=c*size+4;
WFIFOSET(fd,WFIFOW(fd,2)); 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, -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, 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, 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 { struct {
void (*func)(int, struct map_session_data *); void (*func)(int, struct map_session_data *);