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

Help Авто-старт со зрителями!

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

  1. KradaBash Гуру

    Сообщения:
    275
    Спасибы:
    6
    Дата начала использования бота:
    12.12.12
    Всем привет. Думаю кто-то уже решил эту проблему, бот стартует независимо где находится зритель. Например карта 1х1, старт при 2-х игроков. Есть зрители - 4. Заходят 2 игрока, переходят на зрителей и Бот стартует с пустыми слотами, лол.
    Кто подскажет где подправить? :limon:
  2. MuP .

    Сообщения:
    653
    Спасибы:
    202
    Сборка бота GHost:
    Ghost++ rev 579
    Дата начала использования бота:
    00.00.0000
    game_base.cpp => CBaseGame :: StartCountDownAuto
    ввести переменную типа uint32_t, равную возврату функции GetNumHumanPlayers( )
    Потом обойти все слоты, на каждом слоте, который имеет статус "занят" и в нем не сидит FakePlayer, делать дикремент нашей переменной.
    В итоге в переменной будет то кол-во игроков, которые сидят на обычных слотх( не судьи )
    И осталось подставить её в условия типа if( GetNumHumanPlayers( ) < m_AutoStartPlayers ), в левую часть неравенства
    Max5 и KradaBash нравится это.
  3. KradaBash Гуру

    Сообщения:
    275
    Спасибы:
    6
    Дата начала использования бота:
    12.12.12
    Во другое дело, наконец-то всё понятно стало :D
  4. MuP .

    Сообщения:
    653
    Спасибы:
    202
    Сборка бота GHost:
    Ghost++ rev 579
    Дата начала использования бота:
    00.00.0000
    поправка, при обходе слотов сначала проверять на то что слот принадлежит команде судей, потом на занятость \ Fakeplayer, слоты с обычными игроками пропускать сразу
  5. KradaBash Гуру

    Сообщения:
    275
    Спасибы:
    6
    Дата начала использования бота:
    12.12.12
    Да я это уже понял, осталось коддинг выучить :)
  6. Sparko_Dima Старожила

    Сообщения:
    744
    Спасибы:
    104
    Сборка бота GHost:
    Ghost Sparko
    Дата начала использования бота:
    10.10.09
    ну или так
    Код:
    uint32_t CBaseGame :: GetNumAutostartPlayers( )
    {
            uint32_t NumAutostartPlayers = 0;
     
            for( vector<CGamePlayer *> :: iterator i = m_Players.begin( ); i != m_Players.end( ); ++i )
            {
                if( !(*i)->GetLeftMessageSent( ) )
                    {
                        char SID = GetSIDFromPID( (*i)->GetPID( ) );
     
                if( SID < m_Slots.size( ) && ( m_Slots[SID].GetTeam( ) == 1 || m_Slots[SID].GetTeam( ) == 3 ) )
                            {
                            NumAutostartPlayers++;
                            }
            }
            }
    
    KradaBash нравится это.
  7. Sparko_Dima Старожила

    Сообщения:
    744
    Спасибы:
    104
    Сборка бота GHost:
    Ghost Sparko
    Дата начала использования бота:
    10.10.09
    а и обьявить
    Код:
    virtual uint32_t GetNumAutostartPlayers( );
  8. KradaBash Гуру

    Сообщения:
    275
    Спасибы:
    6
    Дата начала использования бота:
    12.12.12
    Другое дело, попробую. :avtoradolf:
  9. MuP .

    Сообщения:
    653
    Спасибы:
    202
    Сборка бота GHost:
    Ghost++ rev 579
    Дата начала использования бота:
    00.00.0000
    Код:
    char SID = GetSIDFromPID( (*i)->GetPID( ) );
    функция GetSIDFromPID возвращает значение unsigned char, либо искомый номер слота, либо 255, если пида не найдено. Тут unsigned не указано, так что в случае возврата 255 переменнная SID примет значение -1.
    К счастью выражение
    Код:
    SID < m_Slots.size( )
    не становится истинным, т.к. судя по всему сначала SID преобразуется к типу size_t ( а это как правило unsigned int ), получается большое положительное число, и только потом сравнивается с размером вектора m_Slots, который не превышает 12. В итоге несмотря на ошибку условие не сработает и вылета за пределы вектора не будет.
    Второй недочет в том, что мы не знаем конфига карты заранее, и какие команды надо учитывать, зато точно знаем что нам не надо учитывать судей. Поэтому лучше пойти от обратного и код тела функции будет примерно такой:

    Код:
    uint32_t NumAutostartPlayers = 0;
     
    for( vector<CGamePlayer *> :: iterator i = m_Players.begin( ); i != m_Players.end( ); ++i )
    {
        if( !(*i)->GetLeftMessageSent( ) )
        {
            unsigned char SID = GetSIDFromPID( (*i)->GetPID( ) );
            if( SID != 255 ){
                if( m_Slots[SID].GetTeam() != 12 )
                    NumAutostartPlayers++;
            }
        }
    }
     
    return NumAutostartPlayers;
  10. Sparko_Dima Старожила

    Сообщения:
    744
    Спасибы:
    104
    Сборка бота GHost:
    Ghost Sparko
    Дата начала использования бота:
    10.10.09
    заметил уже)) ошибку но все же с кем не бывает:D