Implemented ZC_BAN_LIST3 packet (#8632)

Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
This commit is contained in:
AoShinHo 2024-09-14 17:41:36 -03:00 committed by GitHub
parent fca803220b
commit ca86ac12c8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 43 additions and 38 deletions

View File

@ -527,6 +527,7 @@ CREATE TABLE IF NOT EXISTS `guild_expulsion` (
`account_id` int(11) unsigned NOT NULL default '0', `account_id` int(11) unsigned NOT NULL default '0',
`name` varchar(24) NOT NULL default '', `name` varchar(24) NOT NULL default '',
`mes` varchar(40) NOT NULL default '', `mes` varchar(40) NOT NULL default '',
`char_id` int(11) unsigned NOT NULL default '0',
PRIMARY KEY (`guild_id`,`name`) PRIMARY KEY (`guild_id`,`name`)
) ENGINE=MyISAM; ) ENGINE=MyISAM;

View File

@ -0,0 +1 @@
ALTER TABLE `guild_expulsion` ADD COLUMN `char_id` int(11) unsigned NOT NULL default '0';

View File

@ -2425,7 +2425,7 @@ bool char_checkdb(void){
return false; return false;
} }
//checking guild_expulsion_db //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); Sql_ShowDebug(sql_handle);
return false; return false;
} }

View File

@ -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_name, e->name, strnlen(e->name, NAME_LENGTH));
Sql_EscapeStringLen(sql_handle, esc_mes, e->mes, strnlen(e->mes, sizeof(e->mes))); 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`) " if( SQL_ERROR == Sql_Query(sql_handle, "REPLACE INTO `%s` (`guild_id`,`account_id`,`name`,`mes`,`char_id`) "
"VALUES ('%d','%d','%s','%s')", schema_config.guild_expulsion_db, g.guild_id, e->account_id, esc_name, esc_mes) ) "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); Sql_ShowDebug(sql_handle);
} }
} }
@ -487,7 +487,7 @@ std::shared_ptr<CharGuild> inter_guild_fromsql( int32 guild_id ){
} }
//printf("- Read guild_expulsion %d from sql \n",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); Sql_ShowDebug(sql_handle);
return nullptr; return nullptr;
@ -499,6 +499,7 @@ std::shared_ptr<CharGuild> inter_guild_fromsql( int32 guild_id ){
Sql_GetData(sql_handle, 0, &data, nullptr); e->account_id = atoi(data); 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, 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, 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); //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 // Save the expulsion entry
g->guild.expulsion[j].account_id = account_id; 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].name, g->guild.member[i].name, NAME_LENGTH);
safestrncpy(g->guild.expulsion[j].mes, mes, 40); safestrncpy(g->guild.expulsion[j].mes, mes, 40);
} }

View File

@ -741,6 +741,7 @@ struct guild_expulsion {
char name[NAME_LENGTH]; char name[NAME_LENGTH];
char mes[40]; char mes[40];
uint32 account_id; uint32 account_id;
uint32 char_id;
}; };
struct guild_skill { struct guild_skill {

View File

@ -9123,47 +9123,48 @@ void clif_guild_expulsion( map_session_data& sd, const char* name, uint32 char_i
} }
/// Guild expulsion list (ZC_BAN_LIST). /// Guild expulsion list
/// 0163 <packet len>.W { <char name>.24B <account name>.24B <reason>.40B }* /// 0163 <packet len>.W { <char name>.24B <account name>.24B <reason>.40B }* (ZC_BAN_LIST)
/// 0163 <packet len>.W { <char name>.24B <reason>.40B }* (PACKETVER >= 20100803) /// 0163 <packet len>.W { <char name>.24B <reason>.40B }* (PACKETVER >= 20100803) (ZC_BAN_LIST)
void clif_guild_expulsionlist(map_session_data* sd) /// 0a87 <packet len>.W { <charid>.L <reason>.40B }* (ZC_BAN_LIST2)
{ /// 0b7c <packet len>.W { <charid>.L <reason>.40B <char name>.24B }* (ZC_BAN_LIST3)
#if PACKETVER < 20100803 static void clif_guild_expulsionlist(map_session_data& sd){
const int offset = NAME_LENGTH*2+40;
#else
const int offset = NAME_LENGTH+40;
#endif
int fd, i, c = 0;
nullpo_retv(sd); auto &g = sd.guild;
auto &g = sd->guild;
if (!g) if (!g)
return; return;
fd = sd->fd; PACKET_ZC_BAN_LIST* p = reinterpret_cast<PACKET_ZC_BAN_LIST*>( packet_buffer );
WFIFOHEAD(fd,4 + MAX_GUILDEXPULSION * offset); p->packetType = HEADER_ZC_BAN_LIST;
WFIFOW(fd,0) = 0x163; p->packetLen = sizeof(*p);
for( i = 0; i < MAX_GUILDEXPULSION; i++ ) for( size_t i = 0, c = 0; i < MAX_GUILDEXPULSION; i++ ){
{ struct guild_expulsion& e = g->guild.expulsion[i];
struct guild_expulsion* e = &g->guild.expulsion[i];
if( e->account_id > 0 ) if( e.account_id == 0 ){
{ continue;
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) PACKET_ZC_BAN_LIST_sub& banned = p->chars[c];
memcpy(WFIFOP(fd,4 + c*offset+48), e->mes, 40);
#else #if PACKETVER >= 20161019
memcpy(WFIFOP(fd,4 + c*offset+24), e->mes, 40); 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 #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_cast<decltype(p->packetLen)>(sizeof(banned));
c++; c++;
} }
}
WFIFOW(fd,2) = 4 + c*offset; clif_send(p,p->packetLen,&sd.bl,SELF);
WFIFOSET(fd,WFIFOW(fd,2));
} }
@ -14102,7 +14103,7 @@ void clif_parse_GuildRequestInfo(int fd, map_session_data *sd)
clif_guild_skillinfo( *sd ); clif_guild_skillinfo( *sd );
break; break;
case 4: // Expulsion list case 4: // Expulsion list
clif_guild_expulsionlist(sd); clif_guild_expulsionlist(*sd);
break; break;
default: default:
ShowError("clif: guild request info: unknown type %d\n", type); ShowError("clif: guild request info: unknown type %d\n", type);

View File

@ -180,7 +180,6 @@
packet(0x015f,42); packet(0x015f,42);
packet(0x0160,-1); packet(0x0160,-1);
parseable_packet(0x0161,-1,clif_parse_GuildChangePositionInfo,2,4); parseable_packet(0x0161,-1,clif_parse_GuildChangePositionInfo,2,4);
packet(0x0163,-1);
packet(0x0164,-1); packet(0x0164,-1);
parseable_packet(0x0165,30,clif_parse_CreateGuild,2,6); parseable_packet(0x0165,30,clif_parse_CreateGuild,2,6);
packet(0x0166,-1); packet(0x0166,-1);