1. Соблюдайте Правила форума и проявляйте уважение к другим участникам беседы.

OpenSource !LOBBYBAN (Лучше чем у роста)

Тема в разделе 'Кодинг/Собственные решения', создана пользователем Synth (LM), 19 сен 2012.

  1. Synth (LM) Пантограф!

    Сообщения:
    2.762
    Спасибы:
    172
    Сборка бота GHost:
    My own version of GhostOne
    Дата начала использования бота:
    15.06.2008
    Skype:
    Мой статус
    Объявим в зоне видимости protected, файла game_base.h
    Код:
    vector<string> m_BanSlot;
    Кодим в game.cpp
    Код:
    if( ( Command == "bs" ) && !Payload.empty( ) && !m_GHost->m_BNETs.empty( ) && !m_GameLoaded )
    {
    
    uint32_t SID;
    SID = UTIL_ToInt32(Payload);
    stringstream SS;
    SS << Payload;
    
    while( !SS.eof( ) )
    {
    uint32_t SID;
    SS >> SID;
    
    if( SS.fail( ) )
    {
    CONSOLE_Print( "[GAME: " + m_GameName + "] bad input to open command" );
    break;
    }
    else
    {
    bool isAdmin = false;
    bool isRootAdmin = false;
    CGamePlayer *Player = GetPlayerFromSID( SID - 1 );
    
    if (Player)
    {
    if (IsAdmin(Player->GetName()) || IsRootAdmin(Player->GetName()))
    isAdmin = true;
    if (IsRootAdmin(Player->GetName()))
    isRootAdmin = true;
    }
    if (isRootAdmin)
    {
    SendChat( player->GetPID(), "You can't kick a rootadmin!");
    return HideCommand;
    }
    if (isAdmin && !(IsOwner(User) || RootAdminCheck))
    {
    SendChat( player->GetPID(), "You can't kick an admin!");
    return HideCommand;
    } else if (Player)
    {
    OpenSlot( (unsigned char)( SID - 1 ), true );
    
    m_BanSlot.push_back(Player->GetName( ));
    
    
    }
    
    }
    }
    }
    
    
    Накодили. Теперь найти бы что нибудь похожее на это
    Код:
    bool Reserved = IsReserved( joinPlayer->GetName( ) ) || AdminCheck || IsOwner( joinPlayer->GetName( )) || SafeCheck;
    
    // check if the new player's name is banned
    if (m_GHost->m_Banning != 0)
    if (!Reserved)
    if (!m_ScoreCheckChecked)
    for( vector<CBNET *> :: iterator i = m_GHost->m_BNETs.begin( ); i != m_GHost->m_BNETs.end( ); i++ )
    {
    CDBBan *Ban = (*i)->IsBannedName( joinPlayer->GetName( ) );
    
    if( Ban )
    {
    
    и сделать после окончания ветвления - ELSE (если не забанен, то проверим в списке лобби-бана) >>

    Код:
    
    else
    {
    
    bool next = false;
    
    for( vector<string> :: iterator i = m_BanSlot.begin( ); i != m_BanSlot.end( ); i++ )
    if( (*i) == joinPlayer->GetName( ) )
    next = true;
    
    
    if(next)
    if (joinPlayer)
    {
    
    vector<CGameSlot> Slots = m_Map->GetSlots( );
    potential->Send( m_Protocol->SEND_W3GS_SLOTINFOJOIN( 1, potential->GetSocket( )->GetPort( ), potential->GetExternalIP( ), Slots, 0, m_Map->GetMapGameType( ) == GAMETYPE_CUSTOM ? 3 : 0, m_Map->GetMapNumPlayers( ) ) );
    potential->SetDeleteMe( true );
    return;
    }
    }
    
    
    Обратную команду автор пожелал оставить за юзерами. :D
    Suicider, MuP и Doterok нравится это.
  2. Synth (LM) Пантограф!

    Сообщения:
    2.762
    Спасибы:
    172
    Сборка бота GHost:
    My own version of GhostOne
    Дата начала использования бота:
    15.06.2008
    Skype:
    Мой статус
    Ах да, забыл указать как использовать команду:
    !bs N1 N2 Nm... , где Nm - номер слота.
  3. Suicider Старожила

    Сообщения:
    673
    Спасибы:
    117
    Сборка бота GHost:
    Ghost++ 17.1 by w3gh
    Дата начала использования бота:
    12.07.2011
    Skype:
    Мой статус
    Сравнительно недавно захотел использовать эту команду у себя на боте...
    Переделал немного под себя:

    Объявим в зоне видимости protected, файла game_base.h
    Код:
    vector<string> m_LobbyBan;
    Объявим в зоне видимости public, файла game_base.h
    Код:
    virtual void AddToLobbyBan( string name );
    virtual void DelFromLobbyBan( string name );
    virtual bool IsLobbyBan( string name );
    В game_base.cpp найти бы что нибудь похожее на это
    Код:
    bool Reserved = IsReserved( joinPlayer->GetName( ) ) || AdminCheck || IsOwner( joinPlayer->GetName( )) || SafeCheck;
     
    // check if the new player's name is banned
    if (m_GHost->m_Banning != 0)
    if (!Reserved)
    if (!m_ScoreCheckChecked)
    for( vector<CBNET *> :: iterator i = m_GHost->m_BNETs.begin( ); i != m_GHost->m_BNETs.end( ); i++ )
    {
    CDBBan *Ban = (*i)->IsBannedName( joinPlayer->GetName( ) );
     
    if( Ban )
    {
    и сделать после окончания ветвления - ELSE (если не забанен, то проверим в списке лобби-бана) >>
    Код:
    else
    {
        if( IsLobbyBan( joinPlayer->GetName() ) )
        {
            if (m_GHost->m_Verbose)
                SendAllChat( "Забаненый в лобби (" + joinPlayer->GetName()+ ") пытался присоединиться" );
     
            if (joinPlayer)
            {
                vector<CGameSlot> Slots = m_Map->GetSlots( );
                potential->Send( m_Protocol->SEND_W3GS_SLOTINFOJOIN( 1, potential->GetSocket( )->GetPort( ), potential->GetExternalIP( ), Slots, 0, m_Map->GetMapGameType( ) == GAMETYPE_CUSTOM ? 3 : 0, m_Map->GetMapNumPlayers( ) ) );
                potential->SetDeleteMe( true );
                return;
            }
        }
    }
    В game_base.cpp в самом конце добавляем
    Код:
    void CBaseGame :: AddToLobbyBan( string name )
    {
        transform( name.begin( ), name.end( ), name.begin( ), (int(*)(int))tolower );
     
        // check that the user is not already lobby ban
     
        for( vector<string> :: iterator i = m_LobbyBan.begin( ); i != m_LobbyBan.end( ); i++ )
        {
            if( *i == name )
            {
                return;
            }
        }
     
        m_LobbyBan.push_back( name );
    }
     
    void CBaseGame :: DelFromLobbyBan( string name )
    {
        transform( name.begin( ), name.end( ), name.begin( ), (int(*)(int))tolower );
     
        for( vector<string> :: iterator i = m_LobbyBan.begin( ); i != m_LobbyBan.end( ); i++ )
        {
            if( *i == name )
            {
                m_LobbyBan.erase(i);
                return;
            }
        }
    }
     
    bool CBaseGame :: IsLobbyBan( string name )
    {
        transform( name.begin( ), name.end( ), name.begin( ), (int(*)(int))tolower );
     
        for( vector<string> :: iterator i = m_LobbyBan.begin( ); i != m_LobbyBan.end( ); i++ )
        {
            if( *i == name )
                return true;
        }
     
        return false;
    }
    
    В game.cpp скажем перед командой Ban добавить
    Код:
    //
    // !LOBBYLIST
    //
     
    if( Command == "lobbybanlist" || Command == "lblist" )
    {
        if( m_GameLoading || m_GameLoaded )
        {
            SendChat( player, "Эту команду можно использовать только в лобби" );
            return HideCommand;
        }
     
        string lobbybans;
        uint32_t total = 0;
        for( vector<string> :: iterator i = m_LobbyBan.begin( ); i != m_LobbyBan.end( ); i++ )
        {
            total++;
     
            if( lobbybans.empty( ) )
                lobbybans = *i;
            else
                lobbybans += ", " + *i;
        }
        if( !lobbybans.empty( ) )
            SendChat( player, "Забаненные в лобби: (Всего = " + UTIL_ToString( total ) + ") " + lobbybans );
        else
            SendChat( player, "Забаненных в лобби нет" );
    }
     
    //
    // !LOBBYBAN (ban a player in lobby game)
    // !LB
    //
     
    else if( Command == "lobbyban" || Command == "lb" )
    {
        if( m_GameLoading || m_GameLoaded )
        {
            SendChat( player, "Эту команду можно использовать только в лобби" );
            return HideCommand;
        }
     
        if( Payload.empty( ) )
        {
            SendChat( player, "Используйте: lobbyban [имя]" );
            SendChat( player, "Забанить игрока в лобби игру" );
            return HideCommand;
        }
     
        CGamePlayer *LastMatch = NULL;
        uint32_t Matches = GetPlayerFromNamePartial( Payload, &LastMatch );
     
        if( Matches == 0 )
            SendChat( player->GetPID(), "Невозможно забанить в лобби игрока " + Payload + " | Совпадения не найдены" );
        else if( Matches == 1 )
        {
            bool isAdmin = false;
            bool isReserv = false;
            for( vector<CBNET *> :: iterator j = m_GHost->m_BNETs.begin( ); j != m_GHost->m_BNETs.end( ); j++ )
            {
                if( (*j)->IsRootAdmin( LastMatch->GetName() ) )
                {
                    isAdmin = true;
                    break;
                }
            }
     
            for( vector<CBNET *> :: iterator j = m_GHost->m_BNETs.begin( ); j != m_GHost->m_BNETs.end( ); j++ )
            {
                if( (*j)->IsAdmin( LastMatch->GetName() ) || (*j)->IsSafe( LastMatch->GetName() ) )
                {
                    isReserv = true;
                    break;
                }
            }
     
            if (isAdmin)
            {
                SendChat( player->GetPID(), "Вы не можете забанить в лобби игру РутАдмина!");
                return HideCommand;
            }
            else if (isReserv)
            {
                SendChat( player->GetPID(), "Вы не можете забанить в лобби игру этого игрока!");
                return HideCommand;
            }
            else if (IsOwner(LastMatch->GetName()))
            {
                SendChat( player->GetPID(), "Вы не можете забанить в лобби игру Владельца игры!");
                return HideCommand;
            }
            else if (LastMatch->GetName() == User)
            {
                SendChat( player->GetPID(), "Вы не можете забанить в лобби игру самого себя!");
                return HideCommand;
            }
     
            LastMatch->SetDeleteMe( true );
            LastMatch->SetLeftCode( PLAYERLEAVE_LOBBY );
            OpenSlot( GetSIDFromPID( LastMatch->GetPID( ) ), false );
     
            AddToLobbyBan( LastMatch->GetName() );
     
            SendAllChat( LastMatch->GetName() + " забанен в лобби игру (" + User + ")" );
        }
        else
            SendAllChat( "Невозможно забанить в лобби игрока " + Payload + " | Найдено больше одного совпадения" );
    }
     
    //
    // !ULB
    // !DLB
    //
     
    else if( Command == "dellobbyban" || Command == "unlobbyban" || Command == "ulb" || Command == "dlb" )
    {
        if( Payload.empty( ) )
        {
            SendChat( player, "Используйте: unban [имя]" );
            SendChat( player, "Удалить игрока из списка забаненных в лобби игру" );
            return HideCommand;
        }
     
        if ( !IsLobbyBan (Payload) )
            SendAllChat( Payload + " не был забанен в лобби игру" );
        else
        {
            SendAllChat( Payload + " удалён из списка забаненных в лобби игру" );
            DelFromLobbyBan( Payload);
        }
    }
    Банит в лобби игре при поиске по совпадению.
    Не забываем менять кодировку в затрагиваемых файлах для кириллицы
    molodec и Pro100Dva нравится это.