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

OpenSource [ghostone] отключаем резервирование первого слота для овнера и админов

Тема в разделе 'Кодинг/Собственные решения', создана пользователем AJlex, 14 май 2015.

  1. AJlex Наш человек

    Сообщения:
    8
    Спасибы:
    8
    Вероятно вы замечали когда вы заходили в лобби то игроков перекидывало на соседние слоты а вас закидывало на первый слот,а если был закрытый слот и лобби было полное то слот открывался
    Фишка неплохая,но в моем случае нудобная

    game_base.cpp
    находим
    Код:
    // check if the owner joined and place him on the first slot.
    перевод:проверка если овнер зашел то распологаем его на первый слот
    далее комментируем или удаляем этот код
    Код:
    bool Owner = IsOwner( joinPlayer->GetName( ) );
     
        if( Owner )
        {
            m_OwnerJoined = true;
            unsigned char SSID = 255;
     
            for( unsigned char i = 0; i < m_Slots.size( ); i++ )
            {
                if( m_Slots[i].GetComputer( ) == 0 )
                {
                    SSID = i;
                    break;
                }
            }
    //        m_Slots[i].GetSlotStatus( ) == SLOTSTATUS_OCCUPIED &&
            if (SSID != SID && SSID !=255)
            {
                unsigned char l;
                unsigned char k;
                l = SSID;
                for (l = SID-1; l>= SSID; l--)
                {
                    if (m_Slots[l].GetComputer()==0)
                    {
                        for (k = l + 1; k<=SID; k++)
                        {
                            if (m_Slots[k].GetComputer()==0)
                            {
                                CGameSlot Slot1 = m_Slots[k];
                                CGameSlot Slot2 = m_Slots[l];
                                if( m_Map->GetMapGameType( ) != GAMETYPE_CUSTOM )
                                {
                                    // regular game - swap everything
                                    m_Slots[k] = Slot2;
                                    m_Slots[l] = Slot1;
                                }
                                else
                                {
                                    // custom game - don't swap the team, colour, or race
     
                                    m_Slots[k] = CGameSlot( Slot2.GetPID( ), Slot2.GetDownloadStatus( ), Slot2.GetSlotStatus( ), Slot2.GetComputer( ), Slot1.GetTeam( ), Slot1.GetColour( ), Slot1.GetRace( ) );
                                    m_Slots[l] = CGameSlot( Slot1.GetPID( ), Slot1.GetDownloadStatus( ), Slot1.GetSlotStatus( ), Slot1.GetComputer( ), Slot2.GetTeam( ), Slot2.GetColour( ), Slot2.GetRace( ) );
                                }
                                m_GHost->UDPChatSend("|swap "+UTIL_ToString(k)+" "+UTIL_ToString(l));
    //                            SendAllSlotInfo( );
     
    //                            SwapSlots(l, k);
                                break;
                            }
                        }
                    }
                    if (l==0)
                        break;
                }
     
    //            SwapSlots(SID, SSID);
                SID = SSID;
    //            SendAllSlotInfo( );
            }
        }
        }
    далее ищем
    Код:
    // check if an admin joined and place him as high as possible
    перевод:проверка если зашел админ то распологаем так высоко на сколько это возможно
    далее комментируем или удаляем этот код
    Код:
    bool isAdmin = false;
        bool isAdmin2;
        string pName;
     
     
        for( vector<CBNET *> :: iterator j = m_GHost->m_BNETs.begin( ); j != m_GHost->m_BNETs.end( ); j++ )
        {
            if( (*j)->IsAdmin(joinPlayer->GetName( ) ) || (*j)->IsRootAdmin( joinPlayer->GetName( ) ) )
            {
                isAdmin = true;
                break;
            }
        }
        if (IsReserved (joinPlayer->GetName()))
            isAdmin=true;
     
        bool dontplacehigher = m_GHost->m_PlaceAdminsHigherOnlyInDota && (m_GetMapType != "dota");
     
        if ( isAdmin && (!dontplacehigher))
        {
            unsigned char SSID = 255;
     
            for( unsigned char i = 0; i < m_Slots.size( ); i++ )
            {
        // find the first slot occupied by a player who's neither an admin nor reserved
                if( m_Slots[i].GetComputer( ) == 0 && m_Slots[i].GetSlotStatus()==SLOTSTATUS_OCCUPIED)
                {
                    isAdmin2=false;
                    if (GetPlayerFromSID(i)!=NULL)
                    {
                        pName = GetPlayerFromSID(i)->GetName();
               
                        for( vector<CBNET *> :: iterator j = m_GHost->m_BNETs.begin( ); j != m_GHost->m_BNETs.end( ); j++ )
                        {
                            if( (*j)->IsAdmin( pName ) || (*j)->IsRootAdmin( pName ) || IsOwner(pName) )
                            {
                                isAdmin2 = true;
                                break;
                            }
                        }
                        if (IsReserved (pName))
                            isAdmin2=true;
                    } else isAdmin2=true;
                    if (!isAdmin2)
                    {
                        SSID = i;
                        break;
                    }
                }
            }
            //        m_Slots[i].GetSlotStatus( ) == SLOTSTATUS_OCCUPIED &&
            if (SSID != SID && SSID !=255 && SSID<SID)
            {
                SwapSlots(SID, SSID);
                SID = SSID;
            }
        }
        }
    для тех, кто не знает,многострочный комментарий
    /* Тут текст */
    Suicider, zlodey и JiLiZART нравится это.