Ban sistemi

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

texas1343

Yardımsever Üye
Yardımsever Üye
MT Üye
Mesaj
684
Çözümler
32
Beğeni
892
Puan
899
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 },
 
Uyarı: Bu konu açıldığından bu yana baya zaman geçmiş.
Muhtemelen daha fazla tartışma gerekli değildir ki bu durumda yeni bir konu başlatmayı öneririz. Eğer yine de cevabınızın gerekli olduğunu düşünüyorsanız buna rağmen cevap verebilirsiniz.
Geri
Üst