Ban sistemi

  • Konuyu açan Konuyu açan texas1343
  • Açılış Tarihi Açılış Tarihi
  • Yanıt Yanıt 1
  • Gösterim Gösterim 223

texas1343

MT Üye
MT Üye
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

cmd_gm:
Genişlet Daralt Kopyala
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:
Genişlet Daralt Kopyala
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:
Genişlet Daralt Kopyala
ACMD(do_ban);
ACMD(do_unban);

    { "ban", do_ban, 0, POS_DEAD, GM_IMPLEMENTOR },
    { "unban", do_unban, 0, POS_DEAD, GM_IMPLEMENTOR },
 
Geri
Üst