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

Mod Очередной ряд нубских вопросов)

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

  1. ViperNight ▒▒▒▒▒▒▒▒▒

    Сообщения:
    311
    Спасибы:
    154
    Сборка бота GHost:
    GHost++ r597M
    Дата начала использования бота:
    20.01.2007
    Skype:
    Мой статус
    Админка на аккаунт выдаётся на том сервере, на котором был root-админ в момент подачи им команды боту на добавление.
  2. fenlod Наш человек

    Сообщения:
    104
    Спасибы:
    3
    Дата начала использования бота:
    12.12.2008
    И ещё унылый вопросик)
    Как сделать что бы админы на закрытый 11 слот не падали?
    Тоесть если фул випов/админов
    на 12 факе плеер тут заходит админ или вип и он падает на 11 слот()
  3. MuP .

    Сообщения:
    653
    Спасибы:
    202
    Сборка бота GHost:
    Ghost++ rev 579
    Дата начала использования бота:
    00.00.0000
    Править ту часть кода, которая отвечает за поиск слота, куда упадет админ/вип при заходе. Ваш К.О.
    по памяти это вроде game_base.cpp :: EventPlayerJoined
    fenlod нравится это.
  4. fenlod Наш человек

    Сообщения:
    104
    Спасибы:
    3
    Дата начала использования бота:
    12.12.2008
    Можно подробней как доступ будет к исходникам)
  5. rost Гуру

    Сообщения:
    1.258
    Спасибы:
    150
    Сборка бота GHost:
    LtG
    Дата начала использования бота:
    01.11.2010
    Skype:
    Мой статус
    заставил исходник открыть агрррр

    я себе правил тут, покачто проблем нет, а возникнут найду новое решение=)
    Код:
    unsigned char CBaseGame :: GetEmptySlot( bool reserved )
    {
        if( m_Slots.size( ) > 255 )
            return 255;
     
        if( m_SaveGame )
        {
            // unfortunately we don't know which slot each player was assigned in the savegame
            // but we do know which slots were occupied and which weren't so let's at least force players to use previously occupied slots
     
            vector<CGameSlot> SaveGameSlots = m_SaveGame->GetSlots( );
     
            for( unsigned char i = 0; i < m_Slots.size( ); i++ )
            {
                if( m_Slots[i].GetSlotStatus( ) == SLOTSTATUS_OPEN && SaveGameSlots[i].GetSlotStatus( ) == SLOTSTATUS_OCCUPIED && SaveGameSlots[i].GetComputer( ) == 0 )
                    return i;
            }
     
            // don't bother with reserved slots in savegames
        }
        else
        {
            // look for an empty slot for a new player to occupy
            // if reserved is true then we're willing to use closed or occupied slots as long as it wouldn't displace a player with a reserved slot
     
            for( unsigned char i = 0; i < m_Slots.size( ); i++ )
            {
                if( m_Slots[i].GetSlotStatus( ) == SLOTSTATUS_OPEN )
                    return i;
            }
     
            if( reserved )
            {
                // no empty slots, but since player is reserved give them a closed slot
     
                for( unsigned char i = 0; i < m_Slots.size( ); i++ )
                {
                    if( m_Slots[i].GetSlotStatus( ) == SLOTSTATUS_CLOSED && (m_Slots[i].GetTeam() == 0 || m_Slots[i].GetTeam() == 1))
                        return i;
                }
     
                // no closed slots either, give them an occupied slot but not one occupied by another reserved player
                // first look for a player who is downloading the map and has the least amount downloaded so far
     
                unsigned char LeastDownloaded = 100;
                unsigned char LeastSID = 255;
     
                for( unsigned char i = 0; i < m_Slots.size( ); i++ )
                {
                    CGamePlayer *Player = GetPlayerFromSID( i );
     
                    if( Player && !Player->GetReserved( ) && m_Slots[i].GetDownloadStatus( ) < LeastDownloaded)
                    {
                        LeastDownloaded = m_Slots[i].GetDownloadStatus( );
                        LeastSID = i;
                    }
                }
     
                if( LeastSID != 255 )
                    return LeastSID;
     
                // nobody who isn't reserved is downloading the map, just choose the first player who isn't reserved
     
                for( unsigned char i = m_Slots.size( )-1; i > 0; i-- )
                {
                    CGamePlayer *Player = GetPlayerFromSID( i );
     
                    if( Player && !Player->GetReserved( ))
                        return i;
                }
            }
        }
     
        return 255;
    }
     
    unsigned char CBaseGame :: GetEmptySlotAdmin( bool reserved )
    {
        if( m_Slots.size( ) > 255 )
            return 255;
     
        if( m_SaveGame )
        {
            // unfortunately we don't know which slot each player was assigned in the savegame
            // but we do know which slots were occupied and which weren't so let's at least force players to use previously occupied slots
     
            vector<CGameSlot> SaveGameSlots = m_SaveGame->GetSlots( );
     
            for( unsigned char i = 0; i < m_Slots.size( ); i++ )
            {
                if( m_Slots[i].GetSlotStatus( ) == SLOTSTATUS_OPEN && SaveGameSlots[i].GetSlotStatus( ) == SLOTSTATUS_OCCUPIED && SaveGameSlots[i].GetComputer( ) == 0)
                    return i;
            }
     
            // don't bother with reserved slots in savegames
        }
        else
        {
            // look for an empty slot for a new player to occupy
            // if reserved is true then we're willing to use closed or occupied slots as long as it wouldn't displace a player with a reserved slot
     
            for( unsigned char i = 0; i < m_Slots.size( ); i++ )
            {
                if( m_Slots[i].GetSlotStatus( ) == SLOTSTATUS_OPEN)
                    return i;
            }
     
            if( reserved )
            {
                // no empty slots, but since player is reserved give them a closed slot
     
                for( unsigned char i = 0; i < m_Slots.size( ); i++ )
                {
                    if( m_Slots[i].GetSlotStatus( ) == SLOTSTATUS_CLOSED && (m_Slots[i].GetTeam() == 0 || m_Slots[i].GetTeam() == 1))
                        return i;
                }
     
                // no closed slots either, give them an occupied slot but not one occupied by another reserved player
                // first look for a player who is downloading the map and has the least amount downloaded so far
     
                unsigned char LeastDownloaded = 100;
                unsigned char LeastSID = 255;
     
                for( unsigned char i = 0; i < m_Slots.size( ); i++ )
                {
                    CGamePlayer *Player = GetPlayerFromSID( i );
     
                    if( Player && !Player->GetReserved( ) && m_Slots[i].GetDownloadStatus( ) < LeastDownloaded)
                    {
                        LeastDownloaded = m_Slots[i].GetDownloadStatus( );
                        LeastSID = i;
                    }
                }
     
                if( LeastSID != 255 )
                    return LeastSID;
     
                // nobody who isn't reserved is downloading the map, just choose the first player who isn't an admin
     
                for( unsigned char i = m_Slots.size( )-1; i > 0; i-- )
                {
                    CGamePlayer *Player = GetPlayerFromSID( i );
                    bool isadmin = false;
                    if (Player)
                    {
                        isadmin = IsOwner(Player->GetName( )) || IsAdmin(Player->GetName( )) || IsRootAdmin(Player->GetName());
                        if (m_GHost->m_SafeLobbyImmunity && IsSafe(Player->GetName()))
                            isadmin = true;
                    }
     
                    if( Player && !isadmin )
                        return i;
                }
            }
        }
     
        return 255;
    }
     
    unsigned char CBaseGame :: GetEmptySlot( unsigned char team, unsigned char PID )
    {
        if( m_Slots.size( ) > 255 )
            return 255;
     
        // find an empty slot based on player's current slot
     
        unsigned char StartSlot = GetSIDFromPID( PID );
     
        if( StartSlot < m_Slots.size( ) )
        {
            if( m_Slots[StartSlot].GetTeam( ) != team )
            {
                // player is trying to move to another team so start looking from the first slot on that team
                // we actually just start looking from the very first slot since the next few loops will check the team for us
     
                StartSlot = 0;
            }
     
            if( m_SaveGame )
            {
                vector<CGameSlot> SaveGameSlots = m_SaveGame->GetSlots( );
     
                for( unsigned char i = StartSlot; i < m_Slots.size( ); i++ )
                {
                    if( m_Slots[i].GetSlotStatus( ) == SLOTSTATUS_OPEN && m_Slots[i].GetTeam( ) == team && SaveGameSlots[i].GetSlotStatus( ) == SLOTSTATUS_OCCUPIED && SaveGameSlots[i].GetComputer( ) == 0 )
                        return i;
                }
     
                for( unsigned char i = 0; i < StartSlot; i++ )
                {
                    if( m_Slots[i].GetSlotStatus( ) == SLOTSTATUS_OPEN && m_Slots[i].GetTeam( ) == team && SaveGameSlots[i].GetSlotStatus( ) == SLOTSTATUS_OCCUPIED && SaveGameSlots[i].GetComputer( ) == 0 )
                        return i;
                }
            }
            else
            {
                // find an empty slot on the correct team starting from StartSlot
     
                for( unsigned char i = StartSlot; i < m_Slots.size( ); i++ )
                {
                    if( m_Slots[i].GetSlotStatus( ) == SLOTSTATUS_OPEN && m_Slots[i].GetTeam( ) == team )
                        return i;
                }
     
                // didn't find an empty slot, but we could have missed one with SID < StartSlot
                // e.g. in the DotA case where I am in slot 4 (yellow), slot 5 (orange) is occupied, and slot 1 (blue) is open and I am trying to move to another slot
     
                for( unsigned char i = 0; i < StartSlot; i++ )
                {
                    if( m_Slots[i].GetSlotStatus( ) == SLOTSTATUS_OPEN && m_Slots[i].GetTeam( ) == team )
                        return i;
                }
            }
        }
     
        return 255;
    }
    fenlod нравится это.
  6. fenlod Наш человек

    Сообщения:
    104
    Спасибы:
    3
    Дата начала использования бота:
    12.12.2008
    спс робит)
  7. fenlod Наш человек

    Сообщения:
    104
    Спасибы:
    3
    Дата начала использования бота:
    12.12.2008
    Ну ещё задам вопросик)
    Как сделать что бы игроку которому мут дали не мог писать команды тоесть;
    Игрок спамит командой !пр например, админ даёт ему мут, но это не остонавливает его)
    Команды то не видно,а текст выводится ну думаю поняли суть)
  8. rost Гуру

    Сообщения:
    1.258
    Спасибы:
    150
    Сборка бота GHost:
    LtG
    Дата начала использования бота:
    01.11.2010
    Skype:
    Мой статус
    защиту в команду введи или минимальный интервал (что лучше)
    fenlod нравится это.
  9. fenlod Наш человек

    Сообщения:
    104
    Спасибы:
    3
    Дата начала использования бота:
    12.12.2008
    А как делается ?) :(
    Можно оба варианта?)
    Ну или любой какой удобней)
  10. fenlod Наш человек

    Сообщения:
    104
    Спасибы:
    3
    Дата начала использования бота:
    12.12.2008
    Ну и помогите убрать возможность втф моды писать плз)
    Ласт 2 вопроса и можно закрывать тему!)
  11. MuP .

    Сообщения:
    653
    Спасибы:
    202
    Сборка бота GHost:
    Ghost++ rev 579
    Дата начала использования бота:
    00.00.0000
    Сделать вывод правил в личку игроку?( я так изначально сделал) Максимум он себе наспамит. Ну и скрытие команды, aka HideCommand=true
    Насчет wtf вроде никак не прокатит, хотя могу и ошибаться. глянуть надо
  12. fenlod Наш человек

    Сообщения:
    104
    Спасибы:
    3
    Дата начала использования бота:
    12.12.2008
    aka HideCommand=true
    Это чёт я не понял)
    ну если сделать sendchat тоже не вариант)
    я в начале пишу !пр чтобы все правила видели)
  13. Synth (LM) Пантограф!

    Сообщения:
    2.762
    Спасибы:
    172
    Сборка бота GHost:
    My own version of GhostOne
    Дата начала использования бота:
    15.06.2008
    Skype:
    Мой статус
    Можно сделать так, чтобы после ввода -wtf мода игра либо завершалась, либо статистика не засчитывалась.
    fenlod нравится это.
  14. fenlod Наш человек

    Сообщения:
    104
    Спасибы:
    3
    Дата начала использования бота:
    12.12.2008
    Ну 1 вариант уж думаю)
    Распиши плз буду признателен
  15. Synth (LM) Пантограф!

    Сообщения:
    2.762
    Спасибы:
    172
    Сборка бота GHost:
    My own version of GhostOne
    Дата начала использования бота:
    15.06.2008
    Skype:
    Мой статус
    Увы, работы много, сча найдутся те кто поможет, просто дождись.
  16. fenlod Наш человек

    Сообщения:
    104
    Спасибы:
    3
    Дата начала использования бота:
    12.12.2008
    Ну есть мысль
    Взять допустим код команды endn
    Заменить саму команду на test wtf
    вывести в нон админ
    поставить условия доступна до 15 сек
    ну вся беда в триггере бота()
  17. MuP .

    Сообщения:
    653
    Спасибы:
    202
    Сборка бота GHost:
    Ghost++ rev 579
    Дата начала использования бота:
    00.00.0000
    Триггер это не беда. В One уже кстати вроде впилено, что при -wtf стата перестает считаться.
    Насчет правил, я у себя сделал ее командой для всех, типа
    Код:
    else if( Command == rules ){
        if( Payload.empty() ){
            // тут делаем вывод правил
            // посылка в чат через SendChat( player, "текст" );
        } else
            SendChat( player, "Моя твоя не понимать, твоя бежать, моя стрелять" );
        HideCommand = true;
    }
    В итоге вывод будет только игроку в приват, общий чат не будет засорен.
    Ну можно еще впилить чтобы раз в 5-10 сек смотреть правила можно было.
    Код:
    else if( Command == rules && GetTime() - m_GameLastSeenRulesTime > 5 ){
        ...
        HideCommand = true;
        m_GameLastSeenRulesTime = GetTime();
    }
    fenlod нравится это.
  18. Synth (LM) Пантограф!

    Сообщения:
    2.762
    Спасибы:
    172
    Сборка бота GHost:
    My own version of GhostOne
    Дата начала использования бота:
    15.06.2008
    Skype:
    Мой статус
    Да, но там нужно фиксить баг, иначе бот вылетит:

    Код:
        // check if we should disable stats (for ex: -wtf detected)
        if (m_DisableStats)
        {
            if (m_Stats)
                delete m_Stats;
     
            m_DisableStats = false;
        }
    Добавив m_Stats = NULL; после delete m_Stats;
    fenlod нравится это.
  19. fenlod Наш человек

    Сообщения:
    104
    Спасибы:
    3
    Дата начала использования бота:
    12.12.2008
    if ( Command == "rules" || Command == "rulez" || Command == "pravila" || Command == "pr"|| Command == "пр")
    {
    string filename = "rules.txt";
    ifstream in;
    in.open( filename.c_str() ); /// поиск файла
    if(!in.fail( ))
    {
    string Line;

    while( !in.eof( ) )
    {
    getline( in, Line );
    SendAllChat(Line);
    }

    }

    }
    Как сюда засунуть это
    Подскажи плз мир)
  20. fenlod Наш человек

    Сообщения:
    104
    Спасибы:
    3
    Дата начала использования бота:
    12.12.2008
    Мне кажется ты издеваешся, но щас проверим )
    а сори сам тупанул не дописал пост(