- Mesaj
- 579
- Çözümler
- 25
- Beğeni
- 355
- Puan
- 799
- Ticaret Puanı
- 0
iyi günler herkese ban sistemi paylaşmak istiyorum bu paylaştığım ip,hwid,veya mac değil oyuncu ban yedimi tekrar kayıt olup giriş yapabilir ama banladığı hesabına giriş yapamaz. 2.çeşit birisi ban açar birisi banlar account tablosundaki statüs işliyor.
/ban oyuncuadi ---- banlar
/unban oyuncuadi ---- ban açar
/ban oyuncuadi ---- banlar
/unban oyuncuadi ---- ban açar
cmd_gm:
ACMD(do_ban)
{
char arg1[256];
one_argument(argument, arg1, sizeof(arg1));
if (!*arg1)
{
ch->ChatPacket(CHAT_TYPE_INFO, "Kullanım: /ban <karakter_ismi>");
return;
}
// Online oyuncu varsa, disconnect atmak için kullanılır
LPCHARACTER tch = CHARACTER_MANAGER::instance().FindPC(arg1);
DWORD accountId = 0;
if (tch && tch->GetDesc())
{
if (tch == ch)
{
ch->ChatPacket(CHAT_TYPE_INFO, "Kendini banlayamazsın.");
return;
}
if (tch->GetGMLevel() > GM_PLAYER)
{
ch->ChatPacket(CHAT_TYPE_INFO, "GM seviyesindeki oyuncuları banlayamazsın.");
return;
}
accountId = tch->GetDesc()->GetAccountTable().id;
}
else
{
// Oyuncu offline › account_id'yi veritabanından al
char query[256];
snprintf(query, sizeof(query),
"SELECT account_id FROM player.player WHERE name = '%s'", arg1);
std::unique_ptr<SQLMsg> pMsg(DBManager::instance().DirectQuery(query));
if (!pMsg || pMsg->Get()->uiNumRows == 0)
{
ch->ChatPacket(CHAT_TYPE_INFO, "%s isimli karakter bulunamadı.", arg1);
return;
}
MYSQL_ROW row = mysql_fetch_row(pMsg->Get()->pSQLResult);
str_to_number(accountId, row[0]);
}
// Şimdi banı uygula
char banQuery[256];
snprintf(banQuery, sizeof(banQuery),
"UPDATE account.account SET status = 'BLOCK' WHERE id = %u", accountId);
DBManager::instance().DirectQuery(banQuery);
if (tch && tch->GetDesc())
tch->GetDesc()->DelayedDisconnect(5);
ch->ChatPacket(CHAT_TYPE_INFO, "%s kalıcı olarak banlandı (status = BLOCK).", arg1);
sys_log(0, "%s[%d] /ban komutuyla %s (account_id: %u) banlandı.",
ch->GetName(), ch->GetPlayerID(), arg1, accountId);
}
cmd_gm:
ACMD(do_unban)
{
char arg1[256];
one_argument(argument, arg1, sizeof(arg1));
if (!*arg1)
{
ch->ChatPacket(CHAT_TYPE_INFO, "Kullanım: /unban <karakter_ismi>");
return;
}
// Veritabanından account_id'yi çekiyoruz
char szQuery[256];
snprintf(szQuery, sizeof(szQuery),
"SELECT account_id FROM player.player WHERE name = '%s'", arg1);
std::unique_ptr<SQLMsg> pMsg(DBManager::instance().DirectQuery(szQuery));
if (!pMsg || pMsg->Get()->uiNumRows == 0)
{
ch->ChatPacket(CHAT_TYPE_INFO, "Karakter bulunamadı: %s", arg1);
return;
}
MYSQL_ROW row = mysql_fetch_row(pMsg->Get()->pSQLResult);
DWORD account_id = 0;
str_to_number(account_id, row[0]);
// Banı kaldır
char szUpdateQuery[256];
snprintf(szUpdateQuery, sizeof(szUpdateQuery),
"UPDATE account.account SET status = 'OK', availDt = 0 WHERE id = %u", account_id);
DBManager::instance().DirectQuery(szUpdateQuery);
ch->ChatPacket(CHAT_TYPE_INFO, "%s karakterinin banı kaldırıldı.", arg1);
sys_log(0, "%s[%d] /unban komutuyla %s (account_id: %u) banını kaldırdı.",
ch->GetName(), ch->GetPlayerID(), arg1, account_id);
}
cmd.cpp:
ACMD(do_ban);
ACMD(do_unban);
{ "ban", do_ban, 0, POS_DEAD, GM_IMPLEMENTOR },
{ "unban", do_unban, 0, POS_DEAD, GM_IMPLEMENTOR },