From ca86ac12c86a5a6d284ec097287b371867385845 Mon Sep 17 00:00:00 2001 From: AoShinHo <126742159+AoShinRO@users.noreply.github.com> Date: Sat, 14 Sep 2024 17:41:36 -0300 Subject: [PATCH] Implemented ZC_BAN_LIST3 packet (#8632) Co-authored-by: Lemongrass3110 --- sql-files/main.sql | 1 + sql-files/upgrades/upgrade_20240914.sql | 1 + src/char/char.cpp | 2 +- src/char/int_guild.cpp | 8 +-- src/common/mmo.hpp | 1 + src/map/clif.cpp | 67 +++++++++++++------------ src/map/clif_packetdb.hpp | 1 - 7 files changed, 43 insertions(+), 38 deletions(-) create mode 100644 sql-files/upgrades/upgrade_20240914.sql diff --git a/sql-files/main.sql b/sql-files/main.sql index 95cdbf23a6..2cd27e886b 100644 --- a/sql-files/main.sql +++ b/sql-files/main.sql @@ -527,6 +527,7 @@ CREATE TABLE IF NOT EXISTS `guild_expulsion` ( `account_id` int(11) unsigned NOT NULL default '0', `name` varchar(24) NOT NULL default '', `mes` varchar(40) NOT NULL default '', + `char_id` int(11) unsigned NOT NULL default '0', PRIMARY KEY (`guild_id`,`name`) ) ENGINE=MyISAM; diff --git a/sql-files/upgrades/upgrade_20240914.sql b/sql-files/upgrades/upgrade_20240914.sql new file mode 100644 index 0000000000..d2222569da --- /dev/null +++ b/sql-files/upgrades/upgrade_20240914.sql @@ -0,0 +1 @@ +ALTER TABLE `guild_expulsion` ADD COLUMN `char_id` int(11) unsigned NOT NULL default '0'; diff --git a/src/char/char.cpp b/src/char/char.cpp index 5298b4c714..cf54c99888 100644 --- a/src/char/char.cpp +++ b/src/char/char.cpp @@ -2425,7 +2425,7 @@ bool char_checkdb(void){ return false; } //checking guild_expulsion_db - if( SQL_ERROR == Sql_Query(sql_handle, "SELECT `guild_id`,`account_id`,`name`,`mes` FROM `%s` LIMIT 1;", schema_config.guild_expulsion_db) ){ + if( SQL_ERROR == Sql_Query(sql_handle, "SELECT `guild_id`,`account_id`,`name`,`mes`,`char_id` FROM `%s` LIMIT 1;", schema_config.guild_expulsion_db) ){ Sql_ShowDebug(sql_handle); return false; } diff --git a/src/char/int_guild.cpp b/src/char/int_guild.cpp index 01cce53e97..9a9343791d 100644 --- a/src/char/int_guild.cpp +++ b/src/char/int_guild.cpp @@ -308,8 +308,8 @@ int inter_guild_tosql( mmo_guild &g, int flag ){ Sql_EscapeStringLen(sql_handle, esc_name, e->name, strnlen(e->name, NAME_LENGTH)); Sql_EscapeStringLen(sql_handle, esc_mes, e->mes, strnlen(e->mes, sizeof(e->mes))); - if( SQL_ERROR == Sql_Query(sql_handle, "REPLACE INTO `%s` (`guild_id`,`account_id`,`name`,`mes`) " - "VALUES ('%d','%d','%s','%s')", schema_config.guild_expulsion_db, g.guild_id, e->account_id, esc_name, esc_mes) ) + if( SQL_ERROR == Sql_Query(sql_handle, "REPLACE INTO `%s` (`guild_id`,`account_id`,`name`,`mes`,`char_id`) " + "VALUES ('%u','%u','%s','%s','%u')", schema_config.guild_expulsion_db, g.guild_id, e->account_id, esc_name, esc_mes, e->char_id) ) Sql_ShowDebug(sql_handle); } } @@ -487,7 +487,7 @@ std::shared_ptr inter_guild_fromsql( int32 guild_id ){ } //printf("- Read guild_expulsion %d from sql \n",guild_id); - if( SQL_ERROR == Sql_Query(sql_handle, "SELECT `account_id`,`name`,`mes` FROM `%s` WHERE `guild_id`='%d'", schema_config.guild_expulsion_db, guild_id) ) + if( SQL_ERROR == Sql_Query(sql_handle, "SELECT `account_id`,`name`,`mes`,`char_id` FROM `%s` WHERE `guild_id`='%d'", schema_config.guild_expulsion_db, guild_id) ) { Sql_ShowDebug(sql_handle); return nullptr; @@ -499,6 +499,7 @@ std::shared_ptr inter_guild_fromsql( int32 guild_id ){ Sql_GetData(sql_handle, 0, &data, nullptr); e->account_id = atoi(data); Sql_GetData(sql_handle, 1, &data, &len); memcpy(e->name, data, zmin(len, NAME_LENGTH)); Sql_GetData(sql_handle, 2, &data, &len); memcpy(e->mes, data, zmin(len, sizeof(e->mes))); + Sql_GetData(sql_handle, 3, &data, nullptr); e->char_id = strtoul(data, nullptr, 10); } //printf("- Read guild_skill %d from sql \n",guild_id); @@ -1343,6 +1344,7 @@ int mapif_parse_GuildLeave(int fd, int guild_id, uint32 account_id, uint32 char_ } // Save the expulsion entry g->guild.expulsion[j].account_id = account_id; + g->guild.expulsion[j].char_id = char_id; safestrncpy(g->guild.expulsion[j].name, g->guild.member[i].name, NAME_LENGTH); safestrncpy(g->guild.expulsion[j].mes, mes, 40); } diff --git a/src/common/mmo.hpp b/src/common/mmo.hpp index 671f40b09f..a6d470bda5 100644 --- a/src/common/mmo.hpp +++ b/src/common/mmo.hpp @@ -741,6 +741,7 @@ struct guild_expulsion { char name[NAME_LENGTH]; char mes[40]; uint32 account_id; + uint32 char_id; }; struct guild_skill { diff --git a/src/map/clif.cpp b/src/map/clif.cpp index aa2d1be441..0fe35cea84 100644 --- a/src/map/clif.cpp +++ b/src/map/clif.cpp @@ -9123,47 +9123,48 @@ void clif_guild_expulsion( map_session_data& sd, const char* name, uint32 char_i } -/// Guild expulsion list (ZC_BAN_LIST). -/// 0163 .W { .24B .24B .40B }* -/// 0163 .W { .24B .40B }* (PACKETVER >= 20100803) -void clif_guild_expulsionlist(map_session_data* sd) -{ -#if PACKETVER < 20100803 - const int offset = NAME_LENGTH*2+40; -#else - const int offset = NAME_LENGTH+40; -#endif - int fd, i, c = 0; +/// Guild expulsion list +/// 0163 .W { .24B .24B .40B }* (ZC_BAN_LIST) +/// 0163 .W { .24B .40B }* (PACKETVER >= 20100803) (ZC_BAN_LIST) +/// 0a87 .W { .L .40B }* (ZC_BAN_LIST2) +/// 0b7c .W { .L .40B .24B }* (ZC_BAN_LIST3) +static void clif_guild_expulsionlist(map_session_data& sd){ - nullpo_retv(sd); - - auto &g = sd->guild; + auto &g = sd.guild; if (!g) return; - fd = sd->fd; + PACKET_ZC_BAN_LIST* p = reinterpret_cast( packet_buffer ); - WFIFOHEAD(fd,4 + MAX_GUILDEXPULSION * offset); - WFIFOW(fd,0) = 0x163; + p->packetType = HEADER_ZC_BAN_LIST; + p->packetLen = sizeof(*p); - for( i = 0; i < MAX_GUILDEXPULSION; i++ ) - { - struct guild_expulsion* e = &g->guild.expulsion[i]; + for( size_t i = 0, c = 0; i < MAX_GUILDEXPULSION; i++ ){ + struct guild_expulsion& e = g->guild.expulsion[i]; - if( e->account_id > 0 ) - { - safestrncpy(WFIFOCP(fd,4 + c*offset), e->name, NAME_LENGTH); -#if PACKETVER < 20100803 - memset(WFIFOP(fd,4 + c*offset+24), 0, NAME_LENGTH); // account name (not used for security reasons) - memcpy(WFIFOP(fd,4 + c*offset+48), e->mes, 40); -#else - memcpy(WFIFOP(fd,4 + c*offset+24), e->mes, 40); -#endif - c++; + if( e.account_id == 0 ){ + continue; } + + PACKET_ZC_BAN_LIST_sub& banned = p->chars[c]; + +#if PACKETVER >= 20161019 + banned.char_id = e.char_id; +#elif PACKETVER < 20100803 + // account name (not used for security reasons) + safestrncpy(banned.account_name, "", sizeof(banned.account_name)); +#endif + +#if PACKETVER >= 20200902 || PACKETVER < 20161019 + safestrncpy(banned.char_name, e.name, sizeof(banned.char_name)); +#endif + + safestrncpy(banned.message, e.mes, sizeof(banned.message)); + p->packetLen += static_castpacketLen)>(sizeof(banned)); + c++; } - WFIFOW(fd,2) = 4 + c*offset; - WFIFOSET(fd,WFIFOW(fd,2)); + + clif_send(p,p->packetLen,&sd.bl,SELF); } @@ -14102,7 +14103,7 @@ void clif_parse_GuildRequestInfo(int fd, map_session_data *sd) clif_guild_skillinfo( *sd ); break; case 4: // Expulsion list - clif_guild_expulsionlist(sd); + clif_guild_expulsionlist(*sd); break; default: ShowError("clif: guild request info: unknown type %d\n", type); diff --git a/src/map/clif_packetdb.hpp b/src/map/clif_packetdb.hpp index fdd967c68d..d606848d23 100644 --- a/src/map/clif_packetdb.hpp +++ b/src/map/clif_packetdb.hpp @@ -180,7 +180,6 @@ packet(0x015f,42); packet(0x0160,-1); parseable_packet(0x0161,-1,clif_parse_GuildChangePositionInfo,2,4); - packet(0x0163,-1); packet(0x0164,-1); parseable_packet(0x0165,30,clif_parse_CreateGuild,2,6); packet(0x0166,-1);