Skip to content

Commit 0013040

Browse files
Merge pull request #2437 from 4144/rodexfixes
Different rodex fixes
2 parents ab81d40 + 9ae815c commit 0013040

18 files changed

+561
-77
lines changed

src/char/int_rodex.c

Lines changed: 132 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -346,11 +346,128 @@ static int64 inter_rodex_savemessage(struct rodex_message *msg)
346346
return msg->id;
347347
}
348348

349+
static int64 inter_rodex_getzeny(int64 mail_id)
350+
{
351+
Assert_retr(-1, mail_id > 0);
352+
353+
if (SQL_ERROR == SQL->Query(inter->sql_handle, "SELECT `zeny`, `type` FROM `%s` WHERE `mail_id` = '%"PRId64"'", rodex_db, mail_id)) {
354+
Sql_ShowDebug(inter->sql_handle);
355+
} else {
356+
if (SQL_SUCCESS == SQL->NextRow(inter->sql_handle)) {
357+
char *data;
358+
SQL->GetData(inter->sql_handle, 0, &data, NULL);
359+
int64 zeny = atoi(data);
360+
SQL->GetData(inter->sql_handle, 1, &data, NULL);
361+
uint8 type = atoi(data);
362+
SQL->FreeResult(inter->sql_handle);
363+
if ((type & MAIL_TYPE_ZENY) == 0)
364+
return -1;
365+
return zeny;
366+
}
367+
}
368+
SQL->FreeResult(inter->sql_handle);
369+
370+
return -1;
371+
}
372+
373+
static int inter_rodex_getitems(int64 mail_id, struct rodex_item *items)
374+
{
375+
Assert_retr(-1, mail_id > 0);
376+
nullpo_retr(-1, items);
377+
378+
if (SQL_ERROR == SQL->Query(inter->sql_handle, "SELECT `type` FROM `%s` WHERE `mail_id` = '%"PRId64"'", rodex_db, mail_id)) {
379+
Sql_ShowDebug(inter->sql_handle);
380+
return -1;
381+
} else {
382+
if (SQL_SUCCESS == SQL->NextRow(inter->sql_handle)) {
383+
char *data;
384+
SQL->GetData(inter->sql_handle, 0, &data, NULL);
385+
uint8 type = atoi(data);
386+
SQL->FreeResult(inter->sql_handle);
387+
if ((type & MAIL_TYPE_ITEM) == 0)
388+
return -1;
389+
} else {
390+
SQL->FreeResult(inter->sql_handle);
391+
return -1;
392+
}
393+
}
394+
395+
396+
int itemsCount = 0;
397+
398+
struct SqlStmt *stmt_items = SQL->StmtMalloc(inter->sql_handle);
399+
400+
if (stmt_items == NULL) {
401+
return -1;
402+
}
403+
404+
StringBuf buf;
405+
StrBuf->Init(&buf);
406+
407+
StrBuf->AppendStr(&buf, "SELECT `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `expire_time`, `bound`, `unique_id`");
408+
for (int i = 0; i < MAX_SLOTS; i++) {
409+
StrBuf->Printf(&buf, ", `card%d`", i);
410+
}
411+
for (int i = 0; i < MAX_ITEM_OPTIONS; i++) {
412+
StrBuf->Printf(&buf, ", `opt_idx%d`, `opt_val%d`", i, i);
413+
}
414+
StrBuf->Printf(&buf, "FROM `%s` WHERE mail_id = ? ORDER BY `mail_id` ASC", rodex_item_db);
415+
416+
struct item it = { 0 };
417+
418+
if (SQL_ERROR == SQL->StmtPrepareStr(stmt_items, StrBuf->Value(&buf))
419+
|| SQL_ERROR == SQL->StmtBindParam(stmt_items, 0, SQLDT_INT64, &mail_id, sizeof mail_id)
420+
) {
421+
SqlStmt_ShowDebug(stmt_items);
422+
}
423+
424+
if (SQL_ERROR == SQL->StmtExecute(stmt_items)
425+
|| SQL_ERROR == SQL->StmtBindColumn(stmt_items, 0, SQLDT_INT, &it.nameid, sizeof it.nameid, NULL, NULL)
426+
|| SQL_ERROR == SQL->StmtBindColumn(stmt_items, 1, SQLDT_SHORT, &it.amount, sizeof it.amount, NULL, NULL)
427+
|| SQL_ERROR == SQL->StmtBindColumn(stmt_items, 2, SQLDT_UINT, &it.equip, sizeof it.equip, NULL, NULL)
428+
|| SQL_ERROR == SQL->StmtBindColumn(stmt_items, 3, SQLDT_CHAR, &it.identify, sizeof it.identify, NULL, NULL)
429+
|| SQL_ERROR == SQL->StmtBindColumn(stmt_items, 4, SQLDT_CHAR, &it.refine, sizeof it.refine, NULL, NULL)
430+
|| SQL_ERROR == SQL->StmtBindColumn(stmt_items, 5, SQLDT_CHAR, &it.attribute, sizeof it.attribute, NULL, NULL)
431+
|| SQL_ERROR == SQL->StmtBindColumn(stmt_items, 6, SQLDT_UINT, &it.expire_time, sizeof it.expire_time, NULL, NULL)
432+
|| SQL_ERROR == SQL->StmtBindColumn(stmt_items, 7, SQLDT_UCHAR, &it.bound, sizeof it.bound, NULL, NULL)
433+
|| SQL_ERROR == SQL->StmtBindColumn(stmt_items, 8, SQLDT_UINT64, &it.unique_id, sizeof it.unique_id, NULL, NULL)
434+
) {
435+
SqlStmt_ShowDebug(stmt_items);
436+
}
437+
for (int i = 0; i < MAX_SLOTS; i++) {
438+
if (SQL_ERROR == SQL->StmtBindColumn(stmt_items, 9 + i, SQLDT_INT, &it.card[i], sizeof it.card[i], NULL, NULL))
439+
SqlStmt_ShowDebug(stmt_items);
440+
}
441+
for (int i = 0; i < MAX_ITEM_OPTIONS; i++) {
442+
if (SQL_ERROR == SQL->StmtBindColumn(stmt_items, 9 + MAX_SLOTS + i * 2, SQLDT_INT16, &it.option[i].index, sizeof it.option[i].index, NULL, NULL)
443+
|| SQL_ERROR == SQL->StmtBindColumn(stmt_items, 10 + MAX_SLOTS + i * 2, SQLDT_INT16, &it.option[i].value, sizeof it.option[i].value, NULL, NULL)
444+
) {
445+
SqlStmt_ShowDebug(stmt_items);
446+
}
447+
}
448+
449+
for (int i = 0; i < RODEX_MAX_ITEM && SQL_SUCCESS == SQL->StmtNextRow(stmt_items); ++i) {
450+
items[i].item = it;
451+
items[i].idx = itemsCount;
452+
itemsCount++;
453+
}
454+
455+
SQL->StmtFreeResult(stmt_items);
456+
457+
StrBuf->Destroy(&buf);
458+
SQL->StmtFree(stmt_items);
459+
460+
return itemsCount;
461+
}
462+
349463
/*==========================================
350464
* Update/Delete mail
351465
*------------------------------------------*/
352-
static bool inter_rodex_updatemail(int64 mail_id, int8 flag)
466+
static bool inter_rodex_updatemail(int fd, int account_id, int char_id, int64 mail_id, uint8 opentype, int8 flag)
353467
{
468+
Assert_retr(false, fd >= 0);
469+
Assert_retr(false, account_id > 0);
470+
Assert_retr(false, char_id > 0);
354471
Assert_retr(false, mail_id > 0);
355472
Assert_retr(false, flag >= 0 && flag <= 4);
356473

@@ -361,17 +478,26 @@ static bool inter_rodex_updatemail(int64 mail_id, int8 flag)
361478
break;
362479

363480
case 1: // Get Zeny
364-
if (SQL_ERROR == SQL->Query(inter->sql_handle, "UPDATE `%s` SET `zeny` = 0, `type` = `type` & (~2) WHERE `mail_id` = '%"PRId64"'", rodex_db, mail_id))
481+
{
482+
const int64 zeny = inter_rodex->getzeny(mail_id);
483+
if (SQL_ERROR == SQL->Query(inter->sql_handle, "UPDATE `%s` SET `zeny` = 0, `type` = `type` & (~2) WHERE `mail_id` = '%"PRId64"'", rodex_db, mail_id)) {
365484
Sql_ShowDebug(inter->sql_handle);
485+
break;
486+
}
487+
mapif->rodex_getzenyack(fd, char_id, mail_id, opentype, zeny);
366488
break;
367-
489+
}
368490
case 2: // Get Items
491+
{
492+
struct rodex_item items[RODEX_MAX_ITEM];
493+
const int count = inter_rodex->getitems(mail_id, &items[0]);
369494
if (SQL_ERROR == SQL->Query(inter->sql_handle, "DELETE FROM `%s` WHERE `mail_id` = '%"PRId64"'", rodex_item_db, mail_id))
370495
Sql_ShowDebug(inter->sql_handle);
371496
if (SQL_ERROR == SQL->Query(inter->sql_handle, "UPDATE `%s` SET `zeny` = 0, `type` = `type` & (~4) WHERE `mail_id` = '%"PRId64"'", rodex_db, mail_id))
372497
Sql_ShowDebug(inter->sql_handle);
498+
mapif->rodex_getitemsack(fd, char_id, mail_id, opentype, count, &items[0]);
373499
break;
374-
500+
}
375501
case 3: // Delete Mail
376502
if (SQL_ERROR == SQL->Query(inter->sql_handle, "DELETE FROM `%s` WHERE `mail_id` = '%"PRId64"'", rodex_db, mail_id))
377503
Sql_ShowDebug(inter->sql_handle);
@@ -429,4 +555,6 @@ void inter_rodex_defaults(void)
429555
inter_rodex->hasnew = inter_rodex_hasnew;
430556
inter_rodex->checkname = inter_rodex_checkname;
431557
inter_rodex->updatemail = inter_rodex_updatemail;
558+
inter_rodex->getzeny = inter_rodex_getzeny;
559+
inter_rodex->getitems = inter_rodex_getitems;
432560
}

src/char/int_rodex.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,9 @@ struct inter_rodex_interface {
3636
bool (*hasnew) (int char_id, int account_id);
3737
bool (*checkname) (const char *name, int *target_char_id, int *target_class, int *target_level);
3838
int64 (*savemessage) (struct rodex_message* msg);
39-
bool (*updatemail) (int64 mail_id, int8 flag);
39+
bool (*updatemail) (int fd, int account_id, int char_id, int64 mail_id, uint8 opentype, int8 flag);
40+
int64 (*getzeny) (int64 mail_id);
41+
int (*getitems) (int64 mail_id, struct rodex_item *items);
4042
};
4143

4244
#ifdef HERCULES_CORE

src/char/inter.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ static int inter_recv_packet_length[] = {
7979
6,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 3060- Quest system [Kevin] [Inkfish]
8080
-1,10, 6,-1, 0, 0, 0, 0, 0, 0, 0, 0, -1,10, 6,-1, // 3070- Mercenary packets [Zephyrus], Elemental packets [pakpil]
8181
56,14,-1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 3080-
82-
-1,10,-1, 6, 0, 20,10,11, -1,6 + NAME_LENGTH, 0, 0, 0, 0, 0, 0, // 3090- Homunculus packets [albator], RoDEX packets
82+
-1,10,-1, 6, 0, 20,10,20, -1,6 + NAME_LENGTH, 0, 0, 0, 0, 0, 0, // 3090- Homunculus packets [albator], RoDEX packets
8383
};
8484

8585
static struct DBMap *wis_db = NULL; // int wis_id -> struct WisData*

src/char/mapif.c

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1744,10 +1744,13 @@ static void mapif_rodex_sendhasnew(int fd, int char_id, bool has_new)
17441744
*------------------------------------------*/
17451745
static void mapif_parse_rodex_updatemail(int fd)
17461746
{
1747-
int64 mail_id = RFIFOL(fd, 2);
1748-
int8 flag = RFIFOB(fd, 10);
1747+
int account_id = RFIFOL(fd, 2);
1748+
int char_id = RFIFOL(fd, 6);
1749+
int64 mail_id = RFIFOQ(fd, 10);
1750+
uint8 opentype = RFIFOB(fd, 18);
1751+
int8 flag = RFIFOB(fd, 19);
17491752

1750-
inter_rodex->updatemail(mail_id, flag);
1753+
inter_rodex->updatemail(fd, account_id, char_id, mail_id, opentype, flag);
17511754
}
17521755

17531756
/*==========================================
@@ -2461,6 +2464,29 @@ static void mapif_achievement_save(int char_id, struct char_achievements *p)
24612464
inter_achievement->tosql(char_id, cp, p);
24622465
}
24632466

2467+
static void mapif_rodex_getzenyack(int fd, int char_id, int64 mail_id, uint8 opentype, int64 zeny)
2468+
{
2469+
WFIFOHEAD(fd, 23);
2470+
WFIFOW(fd, 0) = 0x3899;
2471+
WFIFOL(fd, 2) = char_id;
2472+
WFIFOQ(fd, 6) = zeny;
2473+
WFIFOQ(fd, 14) = mail_id;
2474+
WFIFOB(fd, 22) = opentype;
2475+
WFIFOSET(fd, 23);
2476+
}
2477+
2478+
static void mapif_rodex_getitemsack(int fd, int char_id, int64 mail_id, uint8 opentype, int count, const struct rodex_item *items)
2479+
{
2480+
WFIFOHEAD(fd, 15 + sizeof(struct rodex_item) * RODEX_MAX_ITEM);
2481+
WFIFOW(fd, 0) = 0x389a;
2482+
WFIFOL(fd, 2) = char_id;
2483+
WFIFOQ(fd, 6) = mail_id;
2484+
WFIFOB(fd, 14) = opentype;
2485+
WFIFOB(fd, 15) = count;
2486+
memcpy(WFIFOP(fd, 16), items, sizeof(struct rodex_item) * RODEX_MAX_ITEM);
2487+
WFIFOSET(fd, 16 + sizeof(struct rodex_item) * RODEX_MAX_ITEM);
2488+
}
2489+
24642490
void mapif_defaults(void)
24652491
{
24662492
mapif = &mapif_s;
@@ -2605,6 +2631,8 @@ void mapif_defaults(void)
26052631
mapif->rodex_send = mapif_rodex_send;
26062632
mapif->parse_rodex_checkname = mapif_parse_rodex_checkname;
26072633
mapif->rodex_checkname = mapif_rodex_checkname;
2634+
mapif->rodex_getzenyack = mapif_rodex_getzenyack;
2635+
mapif->rodex_getitemsack = mapif_rodex_getitemsack;
26082636
mapif->load_guild_storage = mapif_load_guild_storage;
26092637
mapif->save_guild_storage_ack = mapif_save_guild_storage_ack;
26102638
mapif->parse_LoadGuildStorage = mapif_parse_LoadGuildStorage;

src/char/mapif.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#include "common/mmo.h"
2525

2626
struct WisData;
27+
struct rodex_item;
2728

2829
/**
2930
* mapif interface
@@ -168,6 +169,8 @@ struct mapif_interface {
168169
void (*rodex_send) (int fd, int sender_id, int receiver_id, int receiver_accountid, bool result);
169170
void (*parse_rodex_checkname) (int fd);
170171
void (*rodex_checkname) (int fd, int reqchar_id, int target_char_id, int target_class, int target_level, char *name);
172+
void (*rodex_getzenyack) (int fd, int char_id, int64 mail_id, uint8 opentype, int64 zeny);
173+
void (*rodex_getitemsack) (int fd, int char_id, int64 mail_id, uint8 opentype, int count, const struct rodex_item *items);
171174
int (*load_guild_storage) (int fd, int account_id, int guild_id, char flag);
172175
int (*save_guild_storage_ack) (int fd, int account_id, int guild_id, int fail);
173176
int (*parse_LoadGuildStorage) (int fd);

src/common/HPMDataCheck.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,7 @@ HPExport const struct s_HPMDataCheck HPMDataCheck[] = {
230230
{ "party_member", sizeof(struct party_member), SERVER_TYPE_ALL },
231231
{ "point", sizeof(struct point), SERVER_TYPE_ALL },
232232
{ "quest", sizeof(struct quest), SERVER_TYPE_ALL },
233+
{ "rodex_item", sizeof(struct rodex_item), SERVER_TYPE_ALL },
233234
{ "rodex_maillist", sizeof(struct rodex_maillist), SERVER_TYPE_ALL },
234235
{ "rodex_message", sizeof(struct rodex_message), SERVER_TYPE_ALL },
235236
{ "s_elemental", sizeof(struct s_elemental), SERVER_TYPE_ALL },

src/common/mmo.h

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -978,6 +978,11 @@ enum fame_list_type {
978978
RANKTYPE_PK = 3, //Not supported yet
979979
};
980980

981+
struct rodex_item {
982+
struct item item;
983+
int idx;
984+
};
985+
981986
struct rodex_message {
982987
int64 id;
983988
int sender_id;
@@ -987,10 +992,7 @@ struct rodex_message {
987992
char receiver_name[NAME_LENGTH];
988993
char title[RODEX_TITLE_LENGTH];
989994
char body[RODEX_BODY_LENGTH];
990-
struct {
991-
struct item item;
992-
int idx;
993-
} items[RODEX_MAX_ITEM];
995+
struct rodex_item items[RODEX_MAX_ITEM];
994996
int64 zeny;
995997
uint8 type;
996998
int8 opentype;

src/map/intif.c

Lines changed: 44 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2754,16 +2754,21 @@ static void intif_parse_RodexNotifications(int fd)
27542754
/// 2 - user got Items
27552755
/// 3 - delete
27562756
/// 4 - sender Read (returned mail)
2757-
static int intif_rodex_updatemail(int64 mail_id, int8 flag)
2757+
static int intif_rodex_updatemail(struct map_session_data *sd, int64 mail_id, uint8 opentype, int8 flag)
27582758
{
2759+
nullpo_ret(sd);
2760+
27592761
if (intif->CheckForCharServer())
27602762
return 0;
27612763

2762-
WFIFOHEAD(inter_fd, 11);
2764+
WFIFOHEAD(inter_fd, 20);
27632765
WFIFOW(inter_fd, 0) = 0x3097;
2764-
WFIFOQ(inter_fd, 2) = mail_id;
2765-
WFIFOB(inter_fd, 10) = flag;
2766-
WFIFOSET(inter_fd, 11);
2766+
WFIFOL(inter_fd, 2) = sd->status.account_id;
2767+
WFIFOL(inter_fd, 6) = sd->status.char_id;
2768+
WFIFOQ(inter_fd, 10) = mail_id;
2769+
WFIFOB(inter_fd, 18) = opentype;
2770+
WFIFOB(inter_fd, 19) = flag;
2771+
WFIFOSET(inter_fd, 20);
27672772

27682773
return 0;
27692774
}
@@ -2855,6 +2860,35 @@ static void intif_parse_RodexCheckName(int fd)
28552860
clif->rodex_checkname_result(sd, target_char_id, target_class, target_level, name);
28562861
}
28572862

2863+
static void intif_parse_GetZenyAck(int fd)
2864+
{
2865+
int char_id = RFIFOL(fd, 2);
2866+
int64 zeny = RFIFOL(fd, 6);
2867+
int64 mail_id = RFIFOQ(fd, 14);
2868+
uint8 opentype = RFIFOB(fd, 22);
2869+
struct map_session_data *sd = map->charid2sd(char_id);
2870+
2871+
if (sd == NULL) // User is not online anymore
2872+
return;
2873+
rodex->getZenyAck(sd, mail_id, opentype, zeny);
2874+
}
2875+
2876+
static void intif_parse_GetItemsAck(int fd)
2877+
{
2878+
int char_id = RFIFOL(fd, 2);
2879+
2880+
struct map_session_data *sd = map->charid2sd(char_id);
2881+
if (sd == NULL) // User is not online anymore
2882+
return;
2883+
2884+
int64 mail_id = RFIFOQ(fd, 6);
2885+
uint8 opentype = RFIFOB(fd, 14);
2886+
int count = RFIFOB(fd, 15);
2887+
struct rodex_item items[RODEX_MAX_ITEM];
2888+
memcpy(&items[0], RFIFOP(fd, 16), sizeof(struct rodex_item) * RODEX_MAX_ITEM);
2889+
rodex->getItemsAck(sd, mail_id, opentype, count, &items[0]);
2890+
}
2891+
28582892
//-----------------------------------------------------------------
28592893
// Communication from the inter server
28602894
// Return a 0 (false) if there were any errors.
@@ -2972,6 +3006,8 @@ static int intif_parse(int fd)
29723006
case 0x3896: intif->pRodexHasNew(fd); break;
29733007
case 0x3897: intif->pRodexSendMail(fd); break;
29743008
case 0x3898: intif->pRodexCheckName(fd); break;
3009+
case 0x3899: intif->pGetZenyAck(fd); break;
3010+
case 0x389a: intif->pGetItemsAck(fd); break;
29753011

29763012
// Clan System
29773013
case 0x3858: intif->pRecvClanMemberAction(fd); break;
@@ -3001,7 +3037,7 @@ void intif_defaults(void)
30013037
-1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //0x3860 Quests [Kevin] [Inkfish]
30023038
-1, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 3, 3, 0, //0x3870 Mercenaries [Zephyrus] / Elemental [pakpil]
30033039
14,-1, 7, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //0x3880
3004-
-1,-1, 7, 3, 0,-1, 7, 15,18 + NAME_LENGTH, 0, 0, 0, 0, 0, 0, 0, //0x3890 Homunculus [albator] / RoDEX [KirieZ]
3040+
-1,-1, 7, 3, 0,-1, 7, 15,18 + NAME_LENGTH, 23, 16 + sizeof(struct rodex_item) * RODEX_MAX_ITEM, 0, 0, 0, 0, 0, //0x3890 Homunculus [albator] / RoDEX [KirieZ]
30053041
};
30063042

30073043
intif = &intif_s;
@@ -3171,6 +3207,8 @@ void intif_defaults(void)
31713207
intif->pRodexHasNew = intif_parse_RodexNotifications;
31723208
intif->pRodexSendMail = intif_parse_RodexSendMail;
31733209
intif->pRodexCheckName = intif_parse_RodexCheckName;
3210+
intif->pGetZenyAck = intif_parse_GetZenyAck;
3211+
intif->pGetItemsAck = intif_parse_GetItemsAck;
31743212
/* Clan System */
31753213
intif->pRecvClanMemberAction = intif_parse_RecvClanMemberAction;
31763214
/* Achievement System */

src/map/intif.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,9 +135,11 @@ struct intif_interface {
135135
// RoDEX
136136
int(*rodex_requestinbox) (int char_id, int account_id, int8 flag, int8 opentype, int64 mail_id);
137137
int(*rodex_checkhasnew) (struct map_session_data *sd);
138-
int(*rodex_updatemail) (int64 mail_id, int8 flag);
138+
int(*rodex_updatemail) (struct map_session_data *sd, int64 mail_id, uint8 opentype, int8 flag);
139139
int(*rodex_sendmail) (struct rodex_message *msg);
140140
int(*rodex_checkname) (struct map_session_data *sd, const char *name);
141+
void (*pGetZenyAck) (int fd);
142+
void (*pGetItemsAck) (int fd);
141143
/* Clan System */
142144
int (*clan_kickoffline) (int clan_id, int kick_interval);
143145
int (*clan_membercount) (int clan_id, int kick_interval);

0 commit comments

Comments
 (0)