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

Fakeplayer

Тема в разделе 'Кодинг/Собственные решения', создана пользователем Ex--, 10 ноя 2019.

  1. Ex-- Гуру

    Сообщения:
    151
    Спасибы:
    1
    Дата начала использования бота:
    17.17.11
    Все здрасти. возник вопросик.
    Fakeplayer стоит на 12 слоте, но когда даю команду !start и доходит от 1 до 10. Кикает всех с игры. Как решить проблемку?
    Что собственно не так сделал? Тыкните в глаз
    Код:
    if ( m_FakePlayerPID == 255 ){
    CreateFakePlayer( );
    SwapSlots( (unsigned char)( 2 - 1 ), (unsigned char)( 12 - 1 ) );}
    вот и сама карта
    Код:
    map_slot1 = 0 255 0 0 0 1 4 1 100
    map_slot2 = 0 255 0 0 0 2 4 1 100
    map_slot3 = 0 255 0 0 0 3 4 1 100
    map_slot4 = 0 255 0 0 0 4 4 1 100
    map_slot5 = 0 255 0 0 0 5 4 1 100
    map_slot6 = 0 255 0 0 1 7 8 1 100
    map_slot7 = 0 255 0 0 1 8 8 1 100
    map_slot8 = 0 255 0 0 1 9 8 1 100
    map_slot9 = 0 255 0 0 1 10 8 1 100
    map_slot10 = 0 255 0 0 1 11 8 1 100
    map_slot11 = 0 255 0 0 12 12 96 1 100
    map_slot12 = 0 255 1 0 12 12 96 1 100
  2. ]PaLaCh[ Гуру

    Сообщения:
    139
    Спасибы:
    35
    Сборка бота GHost:
    GHost One PaLACh
    Дата начала использования бота:
    10.11.2012
    Попробуй так

    if( m_FakePlayerPID == 255 )
    {
    CreateFakePlayer( );
    m_GHost->m_CurrentGame->SwapSlots( (unsigned char)( 2 - 1 ), (unsigned char)( 12 - 1 ) );
    }
    слоты
    map_slot11 = 0 255 1 0 12 12 96 1 100
    map_slot12 = 0 255 0 0 12 12 96 1 100
  3. halyon Парнишка с небывалым умом

    Сообщения:
    7
    Спасибы:
    5
    Дата начала использования бота:
    00.00.0000
    а что за рандомный свап? откуда ты знаешь что 2-ой слот занят? и на каком этапе выполняется этот код? может ты уже после отправки SEND_W3GS_COUNTDOWN_END свапаешь? и вообще странные слоты у тебя) 11 и 12 зрители, цвета нестандартные, это для доты что ли?
    в любом случае свап рандомный убери и сразу добавляй фп на последний зрительский слот, предварительно его открыв. если лень менять что-то и если функция CreateFakePlayer у тя дефолтная, то при добавлении фп открой 12 слот, свапни на него 10 слот, добавь фп, и обратно свапни, ы
  4. Max5 Старожила

    Сообщения:
    360
    Спасибы:
    68
    Сборка бота GHost:
    GhostOne 1.7.266
    Дата начала использования бота:
    14.05.2013
    это не рандомный свап, условие if( m_FakePlayerPID == 255 ) говорит о том что фейка еще нет, оно срабатывает при заходе(наверно, не суть) в общем когда зайдет любой человек в игру, фейк создастся и окажется на 2 слоте, а потом будет свапнут на 12, теперь фейк в игре уже сидит и не важно зайдет еще кто или все выйдут, в этой игре фейк уже создан и условие if( m_FakePlayerPID == 255 ) более не выполнится.

    у меня сидит в конце EventPlayerJoinedWithScore и всё норм работает.
    Код:
        if( m_FakePlayerPID == 255 ){
            CreateFakePlayer( );
            m_GHost->m_CurrentGame->SwapSlots( (unsigned char)( 2 - 1 ), (unsigned char)( m_GHost->m_fakeplayernomber - 1 ) );
            m_GHost->m_CurrentGame->OpenSlot( (unsigned char)( 2 - 1 ), true );
        }
  5. halyon Парнишка с небывалым умом

    Сообщения:
    7
    Спасибы:
    5
    Дата начала использования бота:
    00.00.0000
    если в eventplayerjoined этот код то да) в другом случае это был бы рандомный свап)
    да и вообще нет гарантии что фп добавляется на первый свободный слот, а не на последний, например
    у меня прост с конца добавляет, и я уже не помню писал ли я эту функцую сам или копипастил с дефолтного ghost
  6. Max5 Старожила

    Сообщения:
    360
    Спасибы:
    68
    Сборка бота GHost:
    GhostOne 1.7.266
    Дата начала использования бота:
    14.05.2013
    так он по дефолу занимает первый не занятый слот, в нашем случае получается 2, если ничего не менять, что он из раза в раз будет сидеть на 2 слоте без сбоев
  7. Kirill-782 Гуру

    Сообщения:
    109
    Спасибы:
    5
    Сборка бота GHost:
    Ghost ++17.1
    Дата начала использования бота:
    00.00.0000
    Странный код. Я бы для начала попробовал посадить на слот игрока.
  8. Kirill-782 Гуру

    Сообщения:
    109
    Спасибы:
    5
    Сборка бота GHost:
    Ghost ++17.1
    Дата начала использования бота:
    00.00.0000
    Мне кажется этот кусок кода либо в конструкторе либо в Update. Плеер сядет сядет на первый слот. Но не ясно почему swap 2 12
  9. Suicider Старожила

    Сообщения:
    673
    Спасибы:
    117
    Сборка бота GHost:
    Ghost++ 17.1 by w3gh
    Дата начала использования бота:
    12.07.2011
    Зачем такие сложности? Можно в Update сделать создание фейка в созданной игре... А то условие которое он написал очень похоже на мой код.
    Код:
    void CBaseGame :: CreateFakePlayer( )
    {
        if( m_FakePlayerPID != 255 )
            return;
     
        unsigned char SID = GetEmptySlot( false );
     
        if( m_MapType == "dota" )
        {
            m_FakePlayerLock = true;
            SID = (unsigned char)(10);
     
            CGamePlayer *Player = GetPlayerFromSID( SID );
            unsigned char SID2 = (unsigned char)(11);
     
            if( Player )
            {
                if( IsOwner( Player->GetName( ) ) )
                {
                    if( SID < m_Slots.size( ) && SID2 < m_Slots.size( ) && SID != SID2 )
                    {
                        CGameSlot Slot1 = m_Slots[SID];
                        CGameSlot Slot2 = m_Slots[SID2];
     
                        if( m_Map->GetMapOptions( ) & MAPOPT_FIXEDPLAYERSETTINGS )
                        {
                            // don't swap the team, colour, or race
     
                            m_Slots[SID] = CGameSlot( Slot2.GetPID( ), Slot2.GetDownloadStatus( ), Slot2.GetSlotStatus( ), Slot2.GetComputer( ), Slot1.GetTeam( ), Slot1.GetColour( ), Slot1.GetRace( ), Slot2.GetComputerType( ), Slot2.GetHandicap( ) );
                            m_Slots[SID2] = CGameSlot( Slot1.GetPID( ), Slot1.GetDownloadStatus( ), Slot1.GetSlotStatus( ), Slot1.GetComputer( ), Slot2.GetTeam( ), Slot2.GetColour( ), Slot2.GetRace( ), Slot1.GetComputerType( ), Slot1.GetHandicap( ) );
                        }
                        else
                        {
                            // swap everything
     
                            m_Slots[SID] = Slot2;
                            m_Slots[SID2] = Slot1;
                        }
     
                        SendAllSlotInfo( );
                        OpenSlot( (unsigned char)( SID ), true );
                    }
                }
                else
                    OpenSlot( (unsigned char)( SID ), true );
            }
        }
     
        if( SID < m_Slots.size( ) )
        {
    //        if( GetNumPlayers( ) >= 11 )
            if( ( GetSlotsOccupied( ) >= m_Slots.size( ) - 1 ) || m_FakePlayerLock )
                DeleteVirtualHost( );
     
            m_FakePlayerPID = GetNewPID( );
            BYTEARRAY IP;
            IP.push_back( 0 );
            IP.push_back( 0 );
            IP.push_back( 0 );
            IP.push_back( 0 );
            SendAll( m_Protocol->SEND_W3GS_PLAYERINFO( m_FakePlayerPID, m_FakePlayerName, IP, IP ) );
            m_Slots[SID] = CGameSlot( m_FakePlayerPID, 100, SLOTSTATUS_OCCUPIED, 0, m_Slots[SID].GetTeam( ), m_Slots[SID].GetColour( ), m_Slots[SID].GetRace( ) );
            SendAllSlotInfo( );
        }
    }
    
  10. Ex-- Гуру

    Сообщения:
    151
    Спасибы:
    1
    Дата начала использования бота:
    17.17.11
    спасибо большое помогли. еще вопрос как можно сделать если к примеру бот сидит на 12 слоте никого не трогая. можно ли запретить !swap (свапать) зрителя ? : Пример[] !swap 12 или 11 не работает а с 1 по 10 работает
  11. Suicider Старожила

    Сообщения:
    673
    Спасибы:
    117
    Сборка бота GHost:
    Ghost++ 17.1 by w3gh
    Дата начала использования бота:
    12.07.2011
    Условия добавить в команду swap, перед выполнением SwapSlots, если GhostOne, то перед проверкой на рута
    что-то типо этого:
    Код:
    if( m_MapType == "dota" )
    if( здесь первая переменная свапа == здесь номер слота, где будешь создавать фейка || здесь вторая переменная свапа == здесь номер слота, где будешь создавать фейка )
    {
    SendChat( player, "Вы не можете изменять положение слота [здесь номер слота, где будешь создавать фейка]" );
    return HideCommand;
    }
    Писал с головы, возможно с кодом что-то не так будет. Но смысл тот же
  12. Ex-- Гуру

    Сообщения:
    151
    Спасибы:
    1
    Дата начала использования бота:
    17.17.11
    Код:
    if( здесь первая переменная свапа == здесь номер слота, где будешь создавать фейка || здесь вторая переменная свапа == здесь номер слота, где будешь создавать фейка )
    [FONT=Consolas]SendChat( player, "Вы не можете изменять положение слота [здесь номер слота, где будешь создавать фейка]" );[/FONT]
    
    Что-то не могу не до понять. с кодом не ладно разбираюсь помоги ))
  13. Suicider Старожила

    Сообщения:
    673
    Спасибы:
    117
    Сборка бота GHost:
    Ghost++ 17.1 by w3gh
    Дата начала использования бота:
    12.07.2011
    Если элементарные переменные не знаешь как вставить, то поможет тебе только учебник :)