Другое С/С++ Вопрос - Ответ

Тема в разделе "C/C++", создана пользователем Jesik, 10 май 2013.

  1. Imbecil

    Imbecil Участник

    Регистрация:
    6 апр 2019
    Сообщения:
    5
    Симпатии:
    0
    а можно как то не добавлять сообщение в чат если в нем есть определенная строка. например, чтобы не отображались сообщения от определенных игроков
     
  2. social enemy

    social enemy $$$$$$$$$$$$$$$$$$$$$$$
    Проверенный

    Регистрация:
    2 авг 2018
    Сообщения:
    626
    Симпатии:
    210
    можно пример работы с DrawText?
     
  3. Rjx13

    Rjx13 Интересующийся

    Регистрация:
    2 июн 2018
    Сообщения:
    142
    Симпатии:
    61
    bool CALLBACK incomingRPC(stRakNetHookParams * params)
    {
        if (params->packetId == ScriptRPCEnumeration::RPC_ScrClientMessage)
        {
                DWORD color;
                DWORD strlen;
                char string[2048];
                params->bitStream->ResetReadPointer();
                params->bitStream->Read(color);
                params->bitStream->Read(strlen);
                params->bitStream->Read(string, strlen);
                string[strlen] = '\0';
               
                if (strlen > 10) { //Если символов в строке больше 10, значит не показывать строку
                    return false;
                }
               
                if (strstr(string, "Vasya_Pupok") != 0) { //Если найдена произвольная строка, тогда не показывать ее
                    return false;
                }
        }
       
        return true;
    }
    
    SF->getRakNet()->registerRakNetCallback(RakNetScriptHookType::RAKHOOK_TYPE_INCOMING_RPC, incomingRPC);
    https://blast.hk/threads/23412/
     
    social enemy и Imbecil нравится это.
  4. social enemy

    social enemy $$$$$$$$$$$$$$$$$$$$$$$
    Проверенный

    Регистрация:
    2 авг 2018
    Сообщения:
    626
    Симпатии:
    210
    Спасибо конечно, но мне не для сампа, а в общем
     
  5. Rjx13

    Rjx13 Интересующийся

    Регистрация:
    2 июн 2018
    Сообщения:
    142
    Симпатии:
    61
    social enemy нравится это.
  6. social enemy

    social enemy $$$$$$$$$$$$$$$$$$$$$$$
    Проверенный

    Регистрация:
    2 авг 2018
    Сообщения:
    626
    Симпатии:
    210
  7. CatKnight

    CatKnight Интересующийся

    Регистрация:
    26 ноя 2015
    Сообщения:
    116
    Симпатии:
    26
    Где лучше всего вызывать функцию SetCursor? Пробовал разово вставлять в колбеке команды, но так курсор не проявляется, а если запихать в презент, то всё нормально работает. Как правильно делать? Хочу юзать совместно с имгуи.
     
  8. Rjx13

    Rjx13 Интересующийся

    Регистрация:
    2 июн 2018
    Сообщения:
    142
    Симпатии:
    61
    Если ты про SF->getSAMP()->getMisc()->ToggleCursor(), то его нужно постоянно вызывать до тех пор, пока он тебе нужен
     
    CatKnight нравится это.
  9. CatKnight

    CatKnight Интересующийся

    Регистрация:
    26 ноя 2015
    Сообщения:
    116
    Симпатии:
    26
    Не, я про системный курсор SetCursor(LoadCursor(NULL, IDC_ARROW)). Я почему-то так и подумал. Спасибо.
     
  10. _Vine_

    _Vine_ Интересующийся

    Регистрация:
    6 янв 2016
    Сообщения:
    119
    Симпатии:
    21
    Как реализовать собственную функцию DecodeString из SF API?
    void SFRakNet::DecodeString(char *output, int maxCharsToWrite, BitStream *input);
     
  11. loganhackerdff

    loganhackerdff Интересующийся

    Регистрация:
    24 июл 2017
    Сообщения:
    116
    Симпатии:
    41
    при огткрытии файла .cpp через visual studio 2017 вместо нормальной отладки, кнопка "присоединение" , до переустановки винды было всё нормально
     

    Вложения:

  12. Rinat_Namazov

    Rinat_Namazov ( ͡° ͜ʖ ͡°)
    Друг

    Регистрация:
    9 авг 2015
    Сообщения:
    1.123
    Симпатии:
    549
    http://www.jenkinssoftware.com/raknet/manual/Doxygen/classRakNet_1_1StringCompressor.html
    .sln открывать надо, простой чистый .cpp файл не скомпилировать.
     
    loganhackerdff и _Vine_ нравится это.
  13. CatKnight

    CatKnight Интересующийся

    Регистрация:
    26 ноя 2015
    Сообщения:
    116
    Симпатии:
    26
    У меня вопрос насчёт выгрузки имгуи. Я посмотрел, в этой теме имгуи выгружается в GameDestructorCallback. Но там же пишется, что деструктор не вызывается при выходе из игры, и советуется выгружать его в DLL_PROCESS_DETACH. Собственно, в чём вопрос: нужно ли использовать оба способа одновременно? У меня в таком случае при выходе идёт краш игры. Если же оставить один DLL_PROCESS_DETACH, то в целом всё нормально. Как тут быть?
     
  14. Rinat_Namazov

    Rinat_Namazov ( ͡° ͜ʖ ͡°)
    Друг

    Регистрация:
    9 авг 2015
    Сообщения:
    1.123
    Симпатии:
    549
    Сделать мьютекс с проверкой, если уже вызван деструктор, то ничего не делать.
     
    cakebou и CatKnight нравится это.
  15. Natami

    Natami Свой человек

    Регистрация:
    2 ноя 2018
    Сообщения:
    357
    Симпатии:
    21
    Нажимаю ctrl + f5 (чтобы скомпилировать), вылазит (см.скрин). Не особо разобрался.
     

    Вложения:

  16. Harryss

    Harryss Знающий

    Регистрация:
    7 мар 2015
    Сообщения:
    228
    Симпатии:
    21
    дак с SF API работают на Visual Studio, на IDE, а у тебя, судя по скриншоту, VS Code.
     
    CatKnight нравится это.
  17. SR_team

    SR_team BH Team
    BH Team

    Регистрация:
    26 окт 2013
    Сообщения:
    3.198
    Симпатии:
    3.190
  18. checkdasound

    Проверенный

    Регистрация:
    12 янв 2018
    Сообщения:
    908
    Симпатии:
    253
    Есть адрес (0xB700F0), по которому находится ид модели машины, в которой ты находишься, но он не работает на велосипеды и мотоциклы. Есть ли аналоги и как узнать ид модели, если ты сидишь на двухколесном транспорте?
     
  19. _=Gigant=_

    _=Gigant=_ Постоянный участник

    Регистрация:
    19 янв 2017
    Сообщения:
    80
    Симпатии:
    54
    GUI::style() must be called in render
     
  20. Vintik

    Vintik Участник

    Регистрация:
    18 авг 2017
    Сообщения:
    9
    Симпатии:
    1
    Всем здравствуйте. Надеюсь, эксперты помогут мне в решении проблемы. Суть в том, что хочу как-то использовать встоенные в GTA SA функции (пример: написать белый текст снизу экрана) своей программой. У DarkP1xel`я заметил следующее:
    Но это для DLL библиотеки, я же хочу для стандартного "консольного приложения".
     
  21. rumpate

    rumpate Участник

    Регистрация:
    17 мар 2019
    Сообщения:
    11
    Симпатии:
    0
    Как сделать рандомный слип например от 50 до 100 мс?
     
  22. _=Gigant=_

    _=Gigant=_ Постоянный участник

    Регистрация:
    19 янв 2017
    Сообщения:
    80
    Симпатии:
    54
    use rand() % 100
     
  23. SR_team

    SR_team BH Team
    BH Team

    Регистрация:
    26 окт 2013
    Сообщения:
    3.198
    Симпатии:
    3.190
    Google: CreateRemoteThread
     
  24. cakebou

    cakebou Интересующийся

    Регистрация:
    4 апр 2017
    Сообщения:
    172
    Симпатии:
    11
    Как получить коорды объекта / модели? Попытался сам написать, что-то не то вообщем
    float pos[3];
    
        for (int i = 0; i < SAMP_MAX_OBJECTS; i++)
        {
            if (SF->getSAMP()->getInfo()->pPools->pObject->iIsListed[i] != 1)
                continue;
            if (SF->getSAMP()->getInfo()->pPools->pObject->object[i] == NULL)
                continue;
            if (SF->getSAMP()->getInfo()->pPools->pObject->object[i]->pGTAEntity == NULL)
                continue;
    
            pos[0] = SF->getSAMP()->getInfo()->pPools->pObject->object[i]->fPos[0];
            pos[1] = SF->getSAMP()->getInfo()->pPools->pObject->object[i]->fPos[1];
            pos[2] = SF->getSAMP()->getInfo()->pPools->pObject->object[i]->fPos[2];
     
  25. SiTrak

    SiTrak Интересующийся

    Регистрация:
    14 янв 2018
    Сообщения:
    135
    Симпатии:
    36
                            if (pObj->iModel == objes[4])
                            {
                                memcpy(pos, &SF->getSAMP()->getInfo()->pPools->pObject->object[i]->pGTAEntity->base.matrix[12], sizeof(float)* 3);
                                //    uint16_t    model_id = SF->getSAMP()->getInfo()->pPools->pObject->object[i]->pGTAEntity->base.model_alt_id;
    
    
                                SF->getGame()->convert3DCoordsToScreen(position[0], position[1], position[2], &obmypos[0], &obmypos[1]);
    
                                SF->getGame()->convert3DCoordsToScreen(pos[0], pos[1], pos[2], &obsreen[0], &obsreen[1]);
                                if (IsOnScreen(i))
                                {
                                    SF->getRender()->DrawLine(obmypos[0], obmypos[1], obsreen[0], obsreen[1], sizelin[4], 0xFF00FF00);
                                }
                            }
     
  26. index

    index Постоянный участник

    Регистрация:
    5 мар 2018
    Сообщения:
    55
    Симпатии:
    18
    Небольшая абстрактная задачка: имеется объект Cell, полем которого является указатель на объект (pMan) одного из возможных других классов с разным поведением и полями (virtual не предлагать :) ). Когда указатель на Cell передадут в какую-либо функцию (в приведенном примере все происходит в main) эта функция должна будет вызывать конкретный метод объекта класса, на который указывает pMan, но в зависимости от того, на какой класс там вообще идет указание.
    Код (не цепляйтесь к тому, что все паблик, суть вопроса в самой концепции):
    #include <iostream>
    using namespace std;
    
    class Man1 {
    public:
        void do1() {
            cout << "Man1" << endl;
        }
    };
    
    class Man2 {
    public:
        void do2() {
            cout << "Man2" << endl;
        }
    };
    
    class Cell {
    public:
        enum class Type {
            man1, man2
        }; // Всевозможные типы
    
        Type type;
        void *pMan; // Указатель на Man1 или Man2, в зависимости от того, что находится в type
    
        Cell(Type x, void *px) : type(x), pMan(px) {}
    };
    
    int main(void)
    {
        Cell *cell = new Cell(Cell::Type::man2, new Man2);
    
        if(cell->type == Cell::Type::man1)       // false
            static_cast<Man1*>(cell->pMan)->do1();
        else if (cell->type == Cell::Type::man2) // true
            static_cast<Man2*>(cell->pMan)->do2(); // выведет Man2
        return 0;
    }
    И сам вопрос: как реализовать подобную вещь более адекватно и канонично? В приведенном примере конструктор Cell может схавать
    Cell(Cell::Type::man1, new Man2);
    и в дальнейшем получить неопределенное поведение. Хотелось бы видеть подобные ошибки на этапе компиляции.
     
    #3491 index, 15 апр 2019 в 12:44
    Последнее редактирование: 15 апр 2019 в 13:38
  27. babulya

    babulya Постоянный участник

    Регистрация:
    30 янв 2018
    Сообщения:
    68
    Симпатии:
    63
    Как из данной строки получить "97.1445.1541.67" ?
    {"as":"AS21127 JSC \"Zap-Sib TransTeleCom\", FFFFFFF","city":"FFFFFFF","country":"SSSSSS","countryCode":"RU","isp":"JSC \"Zap-Sib TransTeleCom\"","lat":12.1234,"lon":23.34,"org":"JSC Zap-Sib TransTeleCom","query":"97.1445.1541.67","region":"WER","regionName":"QWERTY","status":"success","timezone":"Asia/ESFFF","zip":"653008"}
     
  28. imring

    imring чо тут
    Всефорумный модератор

    Регистрация:
    3 авг 2016
    Сообщения:
    1.796
    Симпатии:
    1.174
    https://github.com/nlohmann/json
     
  29. babulya

    babulya Постоянный участник

    Регистрация:
    30 янв 2018
    Сообщения:
    68
    Симпатии:
    63
    через регулярки можно же вроде без json. На LUA делал - работало.
    ip = text:match('"query":"(.*)","region"')
     
  30. Natami

    Natami Свой человек

    Регистрация:
    2 ноя 2018
    Сообщения:
    357
    Симпатии:
    21
    DLL

    Есть ли уроки по созданию меню (не imgui)?
     
  31. _=Gigant=_

    _=Gigant=_ Постоянный участник

    Регистрация:
    19 янв 2017
    Сообщения:
    80
    Симпатии:
    54
    take a look in sobeit source or check unknown cheats -> directx forum
     
    Natami нравится это.
  32. san0

    Друг

    Регистрация:
    15 дек 2013
    Сообщения:
    395
    Симпатии:
    288
    Мне кажется, немножко детали упущены по поводу того, как это все должно использоваться. Это к тому, что, возможно, задачу можно будет свести к использованию обвертки с помощью std::bind или лямбда-выражения, либо же, всегда применить другую парадигму.

    В любом случае, хотелось бы посоветовать либо использовать типобезопасный variant
    
    #include <variant>
    using Cell = std::variant<Man1*, Man2*>;
    
    void usage_one(Cell cell) {
        if (auto man1 = std::get_if<Man1*>(&cell)) {
            (*man1)->do1();
        } else if (auto man2 = std::get_if<Man2*>(&cell)) {
            (*man2)->do2();
        }
    }
    Либо, если очень хочется написать обвертку, то что-то такое
    
    #include <type_traits>
    
    namespace std {
        template <class T, class... R>
        struct is_any : std::disjunction<std::is_same<T, R>...> {};
    }
    
    template <typename C>
    class CellWrapper {
    public:
        C* pMan;
     
        CellWrapper(C* ptr) : pMan(ptr) {
             // static_assert(std::is_class<C>::value);
             static_assert(std::is_any<C, Man1, Man2>::value, 
                 "CellWrapper could be created only with Man1 and Man2"
             );
        };
     
        C* operator->() {
            return this->pMan;
        }
    };
    
    template<typename C>
    void usage_two(CellWrapper<C>* cell) {
        if constexpr (std::is_same<C, Man1>()) {
            (*cell)->do1();
        } else if constexpr (std::is_same<C, Man2>()) {
            (*cell)->do2();
        }
    }
    Использование
    
    int main(void) {
        {
            auto cell = Cell(new Man1);
            usage_one(cell);
        }
        {
            auto cell = CellWrapper(new Man2);
            usage_two(&cell); // как и просилось, именно указатель
        }
    }
    
    Поправьте, если это не то, что требовалось.
    P.S. Хотелось бы посоветовать не использовать new в современных проектах: начиная с C++20 new является deprecated. Даже в примерах выше по причине использования new была продемонстрирована утечка памяти
     
    #3497 san0, 18 апр 2019 в 02:18
    Последнее редактирование: 18 апр 2019 в 02:46
    index нравится это.
  33. index

    index Постоянный участник

    Регистрация:
    5 мар 2018
    Сообщения:
    55
    Симпатии:
    18
    Есть массив (обертка не подойдет) объектов Cell. Из этого массива произвольным образом выбирается элемент, и, в зависимости от типа ассоциированного с ним объекта другого класса, выполняются определенные действия. По сути, полиморфизм времени выполнения. На псевдокоде это выглядит так:
    // Cell type1 fileds: index, name, doSmth11(), doSmth12()
    // Cell type2 fileds: cost, group, doSmth21(), doSmth22()
    
    Cell cellArr[N];
    fill(cellArr);
    a = cellArr[random(0,N-1)];
    if (a.type == type1)
    {
      a.doSmth11();
      a.doSmth12();
    }
    else if (a.type == type2)
    {
      a.doSmth21();
      a.doSmth22();
    }
    Пример больше подходит для языков с динамической типизацией, но хотелось бы увидеть реализацию подобного на c++.
    Благодарю за совет)