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

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

  1. Dark_Knight

    Dark_Knight Сралик Харчкишиев
    Друг

    Регистрация:
    18.03.13
    Сообщения:
    2.060
    Лайки:
    550
    Репутация:
    178
  2. SR_team

    SR_team BH Team
    BH Team

    Регистрация:
    26.10.13
    Сообщения:
    2.468
    Лайки:
    1.430
    Репутация:
    401
    strcmp
     
    #1282
    RanGoo нравится это.
  3. BlackKnigga

    BlackKnigga Известный пользователь

    Регистрация:
    10.01.16
    Сообщения:
    367
    Лайки:
    84
    Репутация:
    45
    Разобрался уже. Оказалось что если строки равны, strcmp вернет NULL:monkey:
     
    #1283
    RanGoo нравится это.
  4. NarutoUA

    NarutoUA Хокаге
    BH Team

    Регистрация:
    26.05.13
    Сообщения:
    529
    Лайки:
    568
    Репутация:
    273
    Оказалось или это в документации написано?
     
    #1284
    RanGoo нравится это.
  5. p1cador

    p1cador tvoy ded
    Проверенный

    Регистрация:
    19.03.14
    Сообщения:
    112
    Лайки:
    111
    Репутация:
    31
    Ковырял свой .asi, смотрел сурсы соба и сф сдк, нашел в actor_info такую штукенцию:
    Код (C++):
    void                *pNeck;                /* 1164 - void* pNeck
          (pChest?)
           - 4 unknown
           - float height
           - float front/back
           - float left/right
           - void* pObject
           (same struct for the following body-part-pointers [except pLeft/RightArm])
        */

        void                *pHead;                /* 1168 */
        void                *pLeftArm;            /* 1172 */
        void                *pRightArm;            /* 1176 */
        void                *pLeftLowArm;        /* 1180 */
        void                *pRightLowArm;        /* 1184 */
        void                *pLeftLeg;            /* 1188 */
        void                *pRightLeg;            /* 1192 */
        void                *pLeftLowLeg;        /* 1196 */
        void                *pRightLowLeg;        /* 1200 */
        void                *pRightMidLeg;        /* 1204 */
        void                *pLeftMidLeg;        /* 1208 */
        void                *pLeftMidArm;        /* 1212 */
        void                *pRightMidArm;        /* 1216 */
        void                *pLeftShoulder;        /* 1220 */
        void                *pRightShoulder;    /* 1224 */
        void                *pChest;            /* 1228 */
        void                *pMouth;            /* 1232 */
    Указатели на некоторыечасти тела. Если создать соотв. стр-ру
    Код (C++):
    struct stBodyPart
    {
        BYTE bIgnore[0x10];
        CObject* pObject;
    };
    то через pObject можно будет получить инфу о конкретных частях тела игрока, хранящуюся в полях структур CPhysical, CEntity, CPlaceable (т.к. наследование), включая позицию костей, без использования функи? И какая это будет позиция, настоящия, или это какие-то дефолтные оффсеты, необходимые для построения модели? Или я вообще не правильно это понял? Поясните крч плз
     
    #1285
    RanGoo нравится это.
  6. NarutoUA

    NarutoUA Хокаге
    BH Team

    Регистрация:
    26.05.13
    Сообщения:
    529
    Лайки:
    568
    Репутация:
    273
    Скорей всего нет, там другая структура для костей:
    #pragma pack(push, 4)
    class PLUGIN_API AnimBlendFrameData
    {
    public:
    unsigned __int8 m_nFlags;
    CVector m_vOffset;
    class IFrame *m_pIFrame;
    unsigned __int32 m_dwNodeId;
    };
    #pragma pack(pop)

    Лучше не выебыватся и юзать функу (ну я думаю функа считает позицию игрока в мире + оффсет для кости, так что в теории ты можешь считать вручную)
     
    #1286
    RanGoo и p1cador нравится это.
  7. Skadi

    Skadi Активный пользователь

    Регистрация:
    03.11.14
    Сообщения:
    43
    Лайки:
    7
    Репутация:
    8
    как задать путь до файла, который не имеет расширения?
    получается так, что он принимает файл без расширения за папку.
    strcat_s(path, "\\тут какой то путь\\файл");


    решил данную проблему путём копирования файла и изменения его названия.
    не знаю насколько это хорошо, мб кто то подскажет.
     
    #1287
    Последнее редактирование: 2 дек 2016
    RanGoo нравится это.
  8. Woofing Giraffe

    Woofing Giraffe Известный пользователь

    Регистрация:
    14.06.15
    Сообщения:
    369
    Лайки:
    44
    Репутация:
    14
    А что ты с ним собрался делать то?
     
    #1288
    RanGoo нравится это.
  9. p1cador

    p1cador tvoy ded
    Проверенный

    Регистрация:
    19.03.14
    Сообщения:
    112
    Лайки:
    111
    Репутация:
    31
    Хук DirectX, работают все функи, коме DrawLine. Спиздил ее отсюда: https://github.com/BlastHackNet/mod_s0beit_sa/blob/master/src/d3drender.cpp

    Вот вызовы:
    Код (C++):
    pD3DHook->pRender->DrawLine(v[0], v[1], 0xffff0000);
    pD3DHook->pRender->DrawLine(xy[0], xy[1], 0xff00ff00);
    где v[2] и xy[2] имеют тип D3DXVECTOR3
    v
    заполнил вручную (1.0;1.0 ... 500.0, 500.0)
    xy содержит 2д координаты (мои и таргета)
    В результате должно быть две линии - красная(диагональ с левого верхнего угла экрана) и зеленая - от меня до цели.
    Но нихуя. Рисует непонятно что (квадраты мои, на них внимание не обращайте):
    Screenshot_4.png
    Если целюсь в педа с другой стороны - рисует вообще в другом месте:
    Screenshot_5.png
    Если стать по другому. То ее вообще не видно будет.
    Прямо внутри функи CD3DRender:: DrawLine сделал вывод координат в чат, так же отрендерил доп. инфу (слева). Числа правильные. Почему зеленая линия рисуется вообще не там, где мне нужно, а красной вообще нет?

    Вот функция из соба(из сурса, ссылка на который в начале сообщения), в ней абсолютно ничего не менял, только добавил вывод в чат
    Код (C++):
    bool CD3DRender::DrawLine(const D3DXVECTOR3 &a, const D3DXVECTOR3 &b, DWORD dwColor)
    {
        if (FAILED(CD3DBaseRender::BeginRender()))
            return false;

        ////////////////////////////////////////////////////
        // Make sure we have a valid vertex buffer.
        if (m_pD3Dbuf == NULL)
        {
            return false;
        }

        m_pD3Ddev->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG2);
        m_pD3Ddev->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG2);
        //m_pD3Ddev->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
        //m_pD3Ddev->SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE );

        m_pD3Ddev->SetRenderState(D3DRS_CLIPPING, false);
        m_pD3Ddev->SetRenderState(D3DRS_ZENABLE, false);
        //m_pD3Ddev->SetRenderState ( D3DRS_LIGHTING, false );
        D3DLVERTEX    lineList[2];

        //////////////////////////////////////////////////
        // Lock the vertex buffer and copy in the verts.
        m_pD3Dbuf->Lock(0, 0, (void **)&lineList, D3DLOCK_DISCARD | D3DLOCK_NOSYSLOCK); // flogs: D3DLOCK_NOSYSLOCK, D3DLOCK_DISCARD
        {
            lineList[0].x = a.x;
            lineList[0].y = a.y;
            lineList[0].z = a.z;
            lineList[0].color = dwColor;
            lineList[0].specular = dwColor;

            lineList[1].x = b.x;
            lineList[1].y = b.y;
            lineList[1].z = b.z;
            lineList[1].color = dwColor;
            lineList[1].specular = dwColor;
        }

        m_pD3Dbuf->Unlock();

        // store FVF to restore original at the end of this function
        DWORD        fvf;
        m_pD3Ddev->GetFVF(&fvf);
        m_pD3Ddev->SetFVF(D3DFVF_LVERTEX);
        //m_pD3Ddev->SetFVF( D3DFVF_PRIMITIVES );

        ////////////////////////////////////////////////////
        // Draw!
        p1c->addMessageToChat(0xFFe1e1e1, "1) %.1f %.1f %.1f %.1f | %x", a.x, a.y, b.x, b.y, dwColor);
        p1c->addMessageToChat(0xFFc1c1c1, "2) %.1f %.1f %.1f %.1f | %x", lineList[0].x, lineList[0].y, lineList[1].x, lineList[1].y, dwColor);
        m_pD3Ddev->DrawPrimitiveUP(D3DPT_LINESTRIP, 1, lineList, sizeof(lineList) / 2);

        // reset states
        m_pD3Ddev->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);
        m_pD3Ddev->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
        m_pD3Ddev->SetRenderState(D3DRS_ZENABLE, true);
        m_pD3Ddev->SetRenderState(D3DRS_CLIPPING, true);

        // restore FVF
        m_pD3Ddev->SetFVF(fvf);

        CD3DBaseRender::EndRender();

        return true;
    }
     
    #1289
    Последнее редактирование: 5 дек 2016
    RanGoo нравится это.
  10. SR_team

    SR_team BH Team
    BH Team

    Регистрация:
    26.10.13
    Сообщения:
    2.468
    Лайки:
    1.430
    Репутация:
    401
    Была такая проблема. Пизди линии из antTweakBar
     
    Последние данные очков репутации:
    Picador: 2 Очки (бля от души, от атб все запахало) 5 дек 2016
    #1290
    RanGoo и p1cador нравится это.
  11. FYP

    FYP админ какой-то

    Регистрация:
    09.03.13
    Сообщения:
    786
    Лайки:
    1.622
    Репутация:
    674
    @Picador так это же функция рендера линии в мире. она принимает 3д координаты.
     
    #1291
    RanGoo и p1cador нравится это.
  12. p1cador

    p1cador tvoy ded
    Проверенный

    Регистрация:
    19.03.14
    Сообщения:
    112
    Лайки:
    111
    Репутация:
    31
    cerf)
    я еще думал, нахера там z
    ну щас точно все на свои места стало) спс

    Может есть инфа минимальная хотя бы, VAC как-то будет палить, если я сделаю ReadProcessMemory с левого .exe? Ну просто с проверкой на наличие инжекнутых .dll библиотек я согласен, справедливо, VAC это изи палит. А что, если просто прочитать (!не записывать) что-либо через ReadProcessMemory, это вообще может палиться? Хотя бы в теории, оставит ли след где-то в игре сам факт того, что я просто прочитал значение? Просто я плохо шарю в том, как это все устроено и мне кажется, что в прочтении значения по опред. адресу не должно быть ничего серьезного, это вроде как просто в щелочку посмотреть :D Или всё-таки где-то эта операция будет оставлять след? Там регистры какие-нибудь, еще че, я хз
    А то у меня в бошке все как-то слишком изи получается, прочитал координаты игроков через стороннее приложение->отрендерил через него же поверх всех окон = изи вх. Или просто приаттачить к бандикаму там, или еще куда, что поверх всех окон висит и с ваком дружит. Но подозреваю, что я далеко не первый такой умник.
     
    #1292
    Последнее редактирование: 6 дек 2016
    RanGoo нравится это.
  13. FYP

    FYP админ какой-то

    Регистрация:
    09.03.13
    Сообщения:
    786
    Лайки:
    1.622
    Репутация:
    674
    @Picador я особо не вдавался в работу VAC. отследить вызов ReadProcessMemory можно только с помощью драйвера. в MTA, например, он есть. кроме ReadProcessMemory есть и другие способы прочитать память процесса, они сложнее. есть и возможность скрытно загрузить dll в процесс и скрыть её вообще от всего, только это тоже сложно и сам процесс скрытия может детектироваться.
     
    #1293
    RanGoo и p1cador нравится это.
  14. p1cador

    p1cador tvoy ded
    Проверенный

    Регистрация:
    19.03.14
    Сообщения:
    112
    Лайки:
    111
    Репутация:
    31
    Т.е. про наличие этого драйвера в кс го точно сказать не можешь?

    В какую сторону гуглить?

    Ну я подозревал, что это всетаки возможно. Это ж комп, тут, в теории возможно сделать что угодно, но для меня это рил слишком сложно будет. А вот про то, как прочитать значения безпалева, кроме ReadProcessMemory, я бы почитал. Что искать?
    П.С. спс за помощь, от души, хз где еще мне в этом помогут на таком уровне
     
    #1294
    RanGoo нравится это.
  15. Woofing Giraffe

    Woofing Giraffe Известный пользователь

    Регистрация:
    14.06.15
    Сообщения:
    369
    Лайки:
    44
    Репутация:
    14
    Вот есть у меня функция и есть глобальная переменная. Как мне передать в эту функцию переменную, чтобы саму эту переменную функция могла изменить (не переданную, а глобальную)? Указатель не помогает
     
    #1295
    RanGoo нравится это.
  16. legend2360

    legend2360 Ух как люблю скобочки
    Всефорумный модератор

    Регистрация:
    23.03.13
    Сообщения:
    2.022
    Лайки:
    677
    Репутация:
    418
    Но она же глобальная. Зачем передавать ссылку на неё?
     
    #1296
    RanGoo нравится это.
  17. FYP

    FYP админ какой-то

    Регистрация:
    09.03.13
    Сообщения:
    786
    Лайки:
    1.622
    Репутация:
    674
    не могу.
    в сторону обходов обнаружения вызовов Read/WriteProcessMemory.
     
    #1297
    RanGoo и p1cador нравится это.
  18. SR_team

    SR_team BH Team
    BH Team

    Регистрация:
    26.10.13
    Сообщения:
    2.468
    Лайки:
    1.430
    Репутация:
    401
    по этому надо переходить на линукс. Процессы запущенные под вайн чувствуют себя как в винде и могут видеть только виртуальное пространство типа винды, в то время, как со стороны линукс приложений видно все, и они могут воздействовать на процессы линукса. Таким образом можно подцепить линуксовый дебагер к виндовым приложениям и они его никак не смогут задетектить
     
    #1298
    RanGoo и p1cador нравится это.
  19. kiceargy

    kiceargy Известный пользователь

    Регистрация:
    09.08.16
    Сообщения:
    169
    Лайки:
    39
    Репутация:
    -3
    1. Как вызвать диалог выбора файла? Я кнопку создал, у кнопки есть значение, если нажать на нее, воспроизводится код, где я написал ВСТАВИТЬ ДИАЛОГ ВЫБОРА ФАЙЛА СЮДА
    Код (C++):
    case WM_COMMAND:
            switch (wParam)
            {
            case 1:
    ВСТАВИТЬ ДИАЛОГ ВЫБОРА ФАЙЛА СЮДА
                break;
            }
     
    #1299
    RanGoo нравится это.
  20. p1cador

    p1cador tvoy ded
    Проверенный

    Регистрация:
    19.03.14
    Сообщения:
    112
    Лайки:
    111
    Репутация:
    31
    #1300
    RanGoo нравится это.
  21. kiceargy

    kiceargy Известный пользователь

    Регистрация:
    09.08.16
    Сообщения:
    169
    Лайки:
    39
    Репутация:
    -3
    Не работает эта функция, на MSDN не чего нету,
     
    #1301
    RanGoo нравится это.
  22. FYP

    FYP админ какой-то

    Регистрация:
    09.03.13
    Сообщения:
    786
    Лайки:
    1.622
    Репутация:
    674
    если что-то не работает у тебя, это не значит, что оно не работает вовсе.
     
    #1302
    RanGoo нравится это.
  23. kiceargy

    kiceargy Известный пользователь

    Регистрация:
    09.08.16
    Сообщения:
    169
    Лайки:
    39
    Репутация:
    -3
    Я имею ввиду у себя. | Сам сделал, как вспомнил про #include "stdafx.h"

    1. Как переместить файл. Пробовал MoveFile но хз что то
    Код (C++):
        case WM_COMMAND:
            switch (wParam)
            {
            case 1:
                wchar_t fn[1024];
                OPENFILENAMEW ofn;

                fn[0] = L'\0';
                ofn.lStructSize = sizeof(OPENFILENAMEW);
                ofn.hwndOwner = hwnd;
                ofn.lpstrFilter = L"Cleo Script Files | .cs\0*.cs\0\0";
                ofn.lpstrCustomFilter = NULL;
                ofn.nFilterIndex = 1;
                ofn.lpstrFile = fn;
                ofn.nMaxFile = 1024;
                ofn.lpstrFileTitle = NULL;
                ofn.lpstrInitialDir = NULL;
                ofn.lpstrTitle = NULL;
                ofn.Flags = OFN_EXPLORER;
                ofn.lpstrDefExt = NULL;
                ofn.FlagsEx = 0;
                if (GetOpenFileNameW(&ofn))
                {
                    ВОТ ТУТ НУЖЕН КОД ПЕРЕМЕШЕНИЯ
                }

                break;
    1. Как быть? никак не получается переместить с++
    Код (C++):
    case 1:
                wchar_t fn[1024];
                OPENFILENAMEW ofn;

                fn[0] = L'\0';
                ofn.lStructSize = sizeof(OPENFILENAMEW);
                ofn.hwndOwner = hwnd;
                ofn.lpstrFilter = L"Cleo Script Files | .cs\0*.cs\0\0";
                ofn.lpstrCustomFilter = NULL;
                ofn.nFilterIndex = 1;
                ofn.lpstrFile = fn;
                ofn.nMaxFile = 1024;
                ofn.lpstrFileTitle = NULL;
                ofn.lpstrInitialDir = NULL;
                ofn.lpstrTitle = NULL;
                ofn.Flags = OFN_EXPLORER;
                ofn.lpstrDefExt = NULL;
                ofn.FlagsEx = 0;
                if (GetOpenFileNameW(&ofn))
                {
                    MoveFile(fn, "D:\\");
                }
     
    #1303
    Последнее редактирование модератором: 9 дек 2016
    RanGoo нравится это.
  24. Dark_Knight

    Dark_Knight Сралик Харчкишиев
    Друг

    Регистрация:
    18.03.13
    Сообщения:
    2.060
    Лайки:
    550
    Репутация:
    178
    Логируй что возращает GetOpenFileNameW и MoveFile
     
    #1304
    RanGoo нравится это.
  25. kiceargy

    kiceargy Известный пользователь

    Регистрация:
    09.08.16
    Сообщения:
    169
    Лайки:
    39
    Репутация:
    -3
    Это понятно... Вопрос как логировать
     
    #1305
    RanGoo нравится это.
  26. DarkP1xel

    DarkP1xel Smoke Weed Everyday
    BH Team

    Регистрация:
    17.06.13
    Сообщения:
    1.743
    Лайки:
    1.045
    Репутация:
    286
    Лучше не занимайся этим.
     
    #1306
    RanGoo нравится это.
  27. kiceargy

    kiceargy Известный пользователь

    Регистрация:
    09.08.16
    Сообщения:
    169
    Лайки:
    39
    Репутация:
    -3
    сука.. Кто тебя спрашивает?:facepalm:
     
    Последние данные очков репутации:
    DarkP1xel: -3 Очки (Меня никто не спрашивает - вижу дауна, пишу об этом не стесняясь.) 9 дек 2016
    #1307
    RanGoo нравится это.
  28. p1cador

    p1cador tvoy ded
    Проверенный

    Регистрация:
    19.03.14
    Сообщения:
    112
    Лайки:
    111
    Репутация:
    31
    Очень нубский вопрос: максимум, к примеру, может быть 32 игрока, т.е. 32 объекта структуры игрока. Читаю циклом все. Если какого-то игрока нет, то игру нахер крашит. Как попытаться прочитать значение по опред. адресу?
    Например, в client_dll + 0x4AC5E94 лежит моя стр-ра, дальше по адресам client_dll + 0x4AC5E94 + 0x10*i находятся стр-ры других игроков. Пробовал проверять через иф, не помогает вроде, да и хз, должно ли.
    Пробовал что-то такое:
    Код (C++):
    for (short i(0); i < 32; i++)  
                if (client_dll + 0x4AC5E94 + 0x10 * i != NULL)
                {
                    x = *(float*)(0xa0 + *(DWORD*)(client_dll + 0x4AC5E94 + 0x10 * i));
                    y = *(float*)(0xa0 + 0x4 + *(DWORD*)(client_dll + 0x4AC5E94 + 0x10 * i));
                    z = *(float*)(0xa0 + 0x8 + *(DWORD*)(client_dll + 0x4AC5E94 + 0x10 * i));//высота
                    alpha = *(float*)(0x128 + *(DWORD*)(client_dll + 0x4AC5E94 + 0x10 * i));
                    beta = *(float*)(0x12c + *(DWORD*)(client_dll + 0x4AC5E94 + 0x10 * i));
                    hp = *(int*)(0xfc + *(DWORD*)(client_dll + 0x4AC5E94 + 0x10 * i));
                    team = *(short*)(0xf0 + *(DWORD*)(client_dll + 0x4AC5E94 + 0x10 * i));
                }
    пс на самом деле, вак - не такая уж страшная штука, немного про него порасспрашивал
    [​IMG]
     
    #1308
    RanGoo нравится это.
  29. Dark_Knight

    Dark_Knight Сралик Харчкишиев
    Друг

    Регистрация:
    18.03.13
    Сообщения:
    2.060
    Лайки:
    550
    Репутация:
    178
    Получай сначала количество игроков на сервере. Потом уже юзай цикл.
     
    #1309
    RanGoo нравится это.
  30. p1cador

    p1cador tvoy ded
    Проверенный

    Регистрация:
    19.03.14
    Сообщения:
    112
    Лайки:
    111
    Репутация:
    31
    Хотел так сделать, но там, вроде, не всегда адресация по порядку идет
    Да и в любом случае, как можно проверить указатель?
     
    #1310
    Последнее редактирование: 10 дек 2016
    RanGoo нравится это.
  31. FYP

    FYP админ какой-то

    Регистрация:
    09.03.13
    Сообщения:
    786
    Лайки:
    1.622
    Репутация:
    674
    if (*(intptr_t*)(client_dll + 0x4AC5E94 + 0x10 * i) != NULL)

    советую повыпиливать всю эту хуету с оффсетами и заменить их структурами и массивами - это избавит от лишней головной боли.
    а для каких-то отдельных значений можно использовать, например, такое: https://gist.github.com/THE-FYP/81d68e85a198b01b911ff6aa7197910b
     
    #1311
    RanGoo и p1cador нравится это.
  32. AlexDrift

    AlexDrift Активный пользователь

    Регистрация:
    12.04.13
    Сообщения:
    35
    Лайки:
    11
    Репутация:
    7
    [m0d sa]При телепортировании ко всем игрокам цикл находит только ид 0. В чем проблема может быть?
     
    #1312
    RanGoo нравится это.
  33. BlackKnigga

    BlackKnigga Известный пользователь

    Регистрация:
    10.01.16
    Сообщения:
    367
    Лайки:
    84
    Репутация:
    45
    Код
     
    #1313
    RanGoo и AlexDrift нравится это.
  34. p1cador

    p1cador tvoy ded
    Проверенный

    Регистрация:
    19.03.14
    Сообщения:
    112
    Лайки:
    111
    Репутация:
    31
    Как проверить кнопку на однократное нажатие?
    Желательно без огромных хуков клавиатуры.
     
    #1314
    Последнее редактирование: 25 дек 2016
    RanGoo нравится это.
  35. Dark_Knight

    Dark_Knight Сралик Харчкишиев
    Друг

    Регистрация:
    18.03.13
    Сообщения:
    2.060
    Лайки:
    550
    Репутация:
    178
    Можно через событие WM_KEYUP в сообщениях окна.
     
    #1315
    RanGoo и p1cador нравится это.
  36. iAmerican

    iAmerican Известный пользователь

    Регистрация:
    17.02.14
    Сообщения:
    268
    Лайки:
    55
    Репутация:
    11
    Для работы с кнопками можно использовать метод GetAsyncKeyState(Байт_код), но с ней иногда бывают проблеммы(залипание, фантомное срабатывание иногда просто не действует), поэтому опишем свою функцию.
    Прототип:
    Код (C++):
    BOOL  State_Key(int Key,DWORD dwTimeOut);
    Key - байт код клавиши
    dwTimeOut - время до возможности повторного действия в Мсек(не совсем точное определение)

    Определяем структуру.
    Код (C++):
    static struct _Keys
    {
    bool        bPressed;
    DWORD       dwStartTime;
    }kPressingKeys[256];
    функа :
    Код (C++):
    BOOL  State_Key(int Key,DWORD dwTimeOut)
    {
    if(HIWORD(GetKeyState(Key)))
    {
      if(!kPressingKeys[Key].bPressed || (kPressingKeys[Key].dwStartTime && (kPressingKeys[Key].dwStartTime + dwTimeOut) <= GetTickCount()))
      {
       kPressingKeys[Key].bPressed = TRUE;
       if( dwTimeOut > NULL )
        kPressingKeys[Key].dwStartTime = GetTickCount();
       return TRUE;
      }
    }
    else
      kPressingKeys[Key].bPressed = FALSE;
    return FALSE;
    }
    Ставишь в функе время, секунд 15 , думаю хватит.

    Автор "крайслер"
    Взято с zhyk.ru.

    p.s. делал как то без времени , когда запаривался по поводу этого вопроса , но так как все свои сурсы проебал , не помню уже.
     
    #1316
    RanGoo и p1cador нравится это.
  37. Jadson

    Jadson Пользователь

    Регистрация:
    26.12.16
    Сообщения:
    24
    Лайки:
    6
    Репутация:
    0
    Кто нибудь компилил C++ для SAMPFUNCS на Ubuntu? У меня с инклудами проблема, нашел выход только поставить виртуалку и скачать VC 2012
     
    #1317
    RanGoo нравится это.
  38. SR_team

    SR_team BH Team
    BH Team

    Регистрация:
    26.10.13
    Сообщения:
    2.468
    Лайки:
    1.430
    Репутация:
    401
    mingw, winegcc, но нет нормального ассемблера
     
    #1318
    RanGoo нравится это.
  39. Jadson

    Jadson Пользователь

    Регистрация:
    26.12.16
    Сообщения:
    24
    Лайки:
    6
    Репутация:
    0
    Понял, а через CLion кто-то пробовал компилировать? Мне как то продукты JetBrains по душе, использую их давно, VS в новинку и не совсем привычно.
     
    #1319
    RanGoo нравится это.
  40. SR_team

    SR_team BH Team
    BH Team

    Регистрация:
    26.10.13
    Сообщения:
    2.468
    Лайки:
    1.430
    Репутация:
    401
    Тебе IDE нужна или компилятор?
     
    #1320
    RanGoo нравится это.