Skocz do zawartości

[C++] Komenda Ban + Globalna Informacja

Opublikowano

Cześć, udostępniam wam ciekawy dodatek na serwer. Często bywało tak, że gracze mieli pretensje o brak reakcji Administracji na boty.

Ta komenda znacznie ułatwi wam informowanie graczy, że nie siedzicie na dupie bezczynnie

  • Globalna informacja dla każdego gracza

  • Automatyczne wylogowanie gracza bez odliczania

  • Ustawienie Statusu konta w bazie danych na BLOCK

cmd_gm.cpp

ACMD(do_ban)
{
    char arg1[256], arg2[256], arg3[256];
    one_argument(two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2)), arg3, sizeof(arg3));

    if (!*arg1 || !*arg2)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, "U?ycie: /ban <nick> <czas w minutach> <powod>");
        return;
    }

    LPCHARACTER victim = CHARACTER_MANAGER::instance().FindPC(arg1);

    if (!victim)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, "Nie znaleziono gracza o nicku: %s", arg1);
        return;
    }

    int minutes = atoi(arg2);
    if (minutes <= 0)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, "Czas bana musi być dłuższy niż 0.");
        return;
    }

    std::string reason = *arg3 ? arg3 : "Brak powodu";

    char escaped_reason[256];
    DBManager::instance().EscapeString(escaped_reason, sizeof(escaped_reason), reason.c_str(), reason.length());

    DWORD account_id = victim->GetAID();

    char szQuery[256];
    snprintf(szQuery, sizeof(szQuery),
        "SELECT login FROM account.account WHERE id=%u LIMIT 1", account_id);

    std::unique_ptr<SQLMsg> pLoginMsg(DBManager::instance().DirectQuery(szQuery));
    const char* account = "UNKNOWN";

    if (pLoginMsg->Get()->uiNumRows > 0)
    {
        MYSQL_ROW row = mysql_fetch_row(pLoginMsg->Get()->pSQLResult);
        if (row && row[0])
            account = row[0];
    }

    // Ustawienie statusu na 'BLOCK' w bazie danych
    char szUpdateQuery[512];
    snprintf(szUpdateQuery, sizeof(szUpdateQuery),
        "UPDATE account.account SET status='BLOCK' WHERE id=%u", account_id);
    DBManager::instance().DirectQuery(szUpdateQuery);

    // Automatyczne rozłączanie gracza, bez odliczania
    victim->ChatPacket(CHAT_TYPE_NOTICE, "Zostałe? zbanowany przez GM: %s", ch->GetName());
    victim->Disconnect("ban");

    // Globalny komunikat dla każdego gracza
    char notice[512];
	snprintf(notice, sizeof(notice),
		"|cFFFF0000|hGracz %s został zbanowany przez %s. Powod: %s", victim->GetName(), ch->GetName(), escaped_reason);

    SendNotice(notice);

    // Log do bazy
    char szLogQuery[1024];
    snprintf(szLogQuery, sizeof(szLogQuery),
        "INSERT INTO account.ban_log (player_name, account_login, gm_name, reason, ban_time) "
        "VALUES ('%s', '%s', '%s', '%s', NOW())",
        victim->GetName(), account, ch->GetName(), escaped_reason);
    DBManager::instance().DirectQuery(szLogQuery);

    // Informacja Tylko dla GM
    ch->ChatPacket(CHAT_TYPE_INFO, "Zbanowano gracza %s na %d minut. Powod: %s", victim->GetName(), minutes, reason.c_str());
}

cmd_general.cpp

Na górze dodaj

ACMD(do_ban);

Gdzieś na końcu

	{ "ban",		do_ban,		0,			POS_DEAD,	GM_IMPLEMENTOR	},

9eb6d6c62c5f17863123843590b88b8c.png

Featured Replies

Opublikowano

Source manderia leaked by grzyb

Opublikowano
  • Autor
12 minut temu, Arta napisał(a):

Source manderia leaked by grzyb

Jak nie potrafisz docenić kogoś pracy to się nie wypowiadaj.

Opublikowano

świetna robota ale zamiast komendy kick dopisać wyłączenie clienta użytkownika bo tak na autologinie będzie mógł wejść w nieskończoność chyba że mu się zmieni hasło a to bez sens

smaczek odemnie:

src client >> PythonNetworkStream.cpp

w

void CPythonNetworkStream::AbsoluteExitGame()

nie wiem jak u was w jakims randomowym source mam tak

void CPythonNetworkStream::AbsoluteExitGame()

{

	if (!IsOnline())

		return;

	OnRemoteDisconnect();		

	Disconnect();

}

zamienić na

void CPythonNetworkStream::AbsoluteExitGame()

{

	if (!IsOnline())

		return;

	OnRemoteDisconnect();

	MessageBoxA(NULL, "Zostałeś zbanowany przez administratora.\nGra zostanie zamknięta.", "ZBANOWANY", MB_OK | MB_ICONERROR);

	ExitApplication();



}

Dlaczego tak?

  • AbsoluteExitGame() jest wołane m.in. przez LogOutGame(), a to z kolei przez ExitGame().

  • A jeśli serwer woła victim->Disconnect("ban"), to klient to traktuje jak zwykłe rozłączenie (przechodzi do okna logowania).

  • Więc najlepiej przekierować to wszystko do twardego zamknięcia aplikacji.

Opublikowano

Już lepsza wersja jest Lmao Ban xdd

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...