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

OpenSource Продвинутый hcl*** (beta)

Тема в разделе 'Кодинг/Собственные решения', создана пользователем Kirill-782, 31 дек 2017.

  1. Kirill-782 Гуру

    Сообщения:
    105
    Спасибы:
    5
    Сборка бота GHost:
    Ghost ++17.1
    Дата начала использования бота:
    00.00.0000
    HCL позволяет передать ограниченное количество символов в карту и только при старте игры. Продвинутый HCL может передать неограниченное количество символов* в карту. Так же может передать не только при старте, но и во время игры.

    Плюсы
    +Поддержка кириллицы
    +Карта может получить длинную строку

    Минусы
    -Требуется фейкплеер, которого нельзя посадить на слот наблюдателя**.
    -При передаче большой пачки данных игроки со слабым интернетом могут зависнуть.
    -Маленький КПД (~10%)

    Критикуем

    Интеграция с ботом:

    В util.cpp (сохранять в UTF-8 без BOM)

    Код:
    vector<uint32_t> UTIL_EncodeString( string str )
    {
        vector<uint32_t> EncodedString;
     
        string Chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZабвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ -=,.!?*_+=|:;";
     
        for( string :: iterator i = str.begin( ); i != str.end( ); i++ )
        {
            if( Chars.find( *i ) != string :: npos )
                EncodedString.push_back( (Chars.find( *i ) + 1) );
     
        }
     
        return EncodedString;
    }
    
    В util.h после
    Код:
    uint32_t UTIL_Factorial( uint32_t x );
    
    Вставить
    Код:
    // mapstring
     
    vector<uint32_t> UTIL_EncodeString( string str );
    Собственно все. Можно использовать это как в самописном модуле статистики, так и где нибудь в EventGameLoaded.

    Я это описал в виде команды

    Код:
    if( Command == "storestring" && m_GameLoaded && !Payload.empty( ) && m_FakePlayerPID != 255 )
    {
     
    vector<uint32_t> integers = UTIL_EncodeString( Payload );
    BYTEARRAY Data;
    BYTEARRAY crc32;
     
     
    for (vector<uint32_t> :: iterator i = integers.begin( ); i != integers.end( ); i++)
    {
    Data.push_back (0x6B);
    UTIL_AppendByteArray (Data, "Asuna.Dat");
    UTIL_AppendByteArray (Data, "HostBot");
    UTIL_AppendByteArray (Data, UTIL_ToString( m_MapStringIndex++ ));
    UTIL_AppendByteArray (Data, *i, false );
    crc32 = UTIL_CreateByteArray( m_GHost->m_CRC->FullCRC( (unsigned char *)string( Data.begin( ), Data.end( ) ).c_str( ), Data.size( ) ), false );
    m_Actions.push( new CIncomingAction ( m_FakePlayerPID, crc32, Data ) );
    Data.clear();
    }
     
    Data.push_back (0x6B);
    UTIL_AppendByteArray (Data, "Asuna.Dat");
    UTIL_AppendByteArray (Data, "HostBot");
    UTIL_AppendByteArray (Data, UTIL_ToString( m_MapStringIndex++ ));
    UTIL_AppendByteArray (Data, (uint32_t) 50000, false );
    crc32 = UTIL_CreateByteArray( m_GHost->m_CRC->FullCRC( (unsigned char *)string( Data.begin( ), Data.end( ) ).c_str( ), Data.size( ) ), false );
    m_Actions.push( new CIncomingAction ( m_FakePlayerPID, crc32, Data ) );
    }
    

    Ну и трекер когда пришли данные (чисто для теста) ( в CBaseGame :: EventPlayerAction )
    Код:
    if( !action->GetAction( )->empty( ) && (*action->GetAction( ))[0] == 0x6B )
    {
     
    BYTEARRAY filecache = UTIL_ExtractCString( *action->GetAction( ), 1 );
    BYTEARRAY category = UTIL_ExtractCString( *action->GetAction( ), filecache.size( ) + 2 );
    BYTEARRAY label = UTIL_ExtractCString( *action->GetAction( ), category.size( ) + filecache.size( ) + 3 );
    uint32_t number = UTIL_ByteArrayToUInt32( *action->GetAction( ), false, category.size( ) + filecache.size( ) + label.size( ) + 4 );
     
    SendAllChat( player->GetName() + " inputed string " + string ( label.begin( ), label.end( ) ) + ". Trigger ticks: " + UTIL_ToString( number ) );
    }
    
    Скачать карту: click
  2. JiLiZART Администрация

    Сообщения:
    811
    Спасибы:
    33
    Сборка бота GHost:
    Ghost++ 17.1
    Дата начала использования бота:
    12.12.04
  3. molodec Можно доверять

    Сообщения:
    25
    Спасибы:
    2
    Дата начала использования бота:
    1.04.2016
    а что за m_MapStringIndex и для чего нужен?
    я так понял при старте игры
    m_MapStringIndex = 0 ? и изменяется ток в этой команде?
  4. Kirill-782 Гуру

    Сообщения:
    105
    Спасибы:
    5
    Сборка бота GHost:
    Ghost ++17.1
    Дата начала использования бота:
    00.00.0000
    Он меняется при отправке любых данных. Вообще мы разработали новую систему отправки данных, с большим кпд и с дерганьем события в карте, но мы не стали публиковать так как относительно сложно получить нужную константу для передачи.
  5. molodec Можно доверять

    Сообщения:
    25
    Спасибы:
    2
    Дата начала использования бота:
    1.04.2016
    а это вообще обязательный параметр? если вместо него использовать всегда 0, результат будет тот же?
    я, честно говоря, не понял в каких местах в коде его еще нужно добавить, и какое начальное значение
  6. Kirill-782 Гуру

    Сообщения:
    105
    Спасибы:
    5
    Сборка бота GHost:
    Ghost ++17.1
    Дата начала использования бота:
    00.00.0000
    Да он обязателен. Он автоматически инкрементится
  7. molodec Можно доверять

    Сообщения:
    25
    Спасибы:
    2
    Дата начала использования бота:
    1.04.2016
    всмысле? это глобальный параметр, и у меня он не был объявлён вообще (я чекнул ghostpp, auraghost и ghostone - нигде такого не было) или ты только про данный код говоришь? я прост волнуюсь мб его еще где-то нужно инкрементить (помимо этой команды)
    я например писал команды для передачи ресурсов (голды, дерева) фейкплеера реальным игрокам - и я там немного подругому все делал (попроще, методом тыка), я там crc вообще пустой отправлял в функции отправки экшена от бота.
  8. Kirill-782 Гуру

    Сообщения:
    105
    Спасибы:
    5
    Сборка бота GHost:
    Ghost ++17.1
    Дата начала использования бота:
    00.00.0000
    Мой косяк
    В gamebase.h
    uint32_t m_MapStringIndex;
    А в конструктора класса
    m_MapStringIndex = 0;