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

twixjr12s

Новичок
17
0
Lua:
function main()
    for i = 48, 57 do
        if isKeyJustPressed(i) then
            if state < 5 then
                state = state + 1
            end
        end
    end
end

function samp.onShowDialog(id, style, title, btn, btn, text)
    state = 0
    dtitle = title

    if dtitle:find('репорт') then
        if state == 1 then
            sampSetCurrentDialogEditboxText("а")
        elseif state == 2 then
            sampSetCurrentDialogEditboxText("ад")
        elseif state == 3 then
            sampSetCurrentDialogEditboxText("адм")
        elseif state == 4 then
            sampSetCurrentDialogEditboxText("адми")
        elseif state == 5 then
            sampSetCurrentDialogEditboxText("админ")
        elseif state == 0 then
            sampSetCurrentDialogEditboxText('')
        end
    end
end
как перенести данное произведение на C++, isKeyPressed не работает в диалоге, GetAsyncState флудит
 

-raymond-

Известный
110
9
Lua:
function main()
    for i = 48, 57 do
        if isKeyJustPressed(i) then
            if state < 5 then
                state = state + 1
            end
        end
    end
end

function samp.onShowDialog(id, style, title, btn, btn, text)
    state = 0
    dtitle = title

    if dtitle:find('репорт') then
        if state == 1 then
            sampSetCurrentDialogEditboxText("а")
        elseif state == 2 then
            sampSetCurrentDialogEditboxText("ад")
        elseif state == 3 then
            sampSetCurrentDialogEditboxText("адм")
        elseif state == 4 then
            sampSetCurrentDialogEditboxText("адми")
        elseif state == 5 then
            sampSetCurrentDialogEditboxText("админ")
        elseif state == 0 then
            sampSetCurrentDialogEditboxText('')
        end
    end
end
как перенести данное произведение на C++, isKeyPressed не работает в диалоге, GetAsyncState флудит
я же ответил, хукни wndprochandler или юзай функцию в потоке
C++:
void checkKey()
{
    static DWORD tick = GetTickCount();

    if (tick - GetTickCount() <= 0)
    {

        if (GetAsyncKeyState(key))
        {
            // code
        }

        tick = GetTickCount() + 800; // 800 - задержка в мс, если будет флудить ставь больше
    }
}
 

twixjr12s

Новичок
17
0
я же ответил, хукни wndprochandler или юзай функцию в потоке
C++:
void checkKey()
{
    static DWORD tick = GetTickCount();

    if (tick - GetTickCount() <= 0)
    {

        if (GetAsyncKeyState(key))
        {
            // code
        }

        tick = GetTickCount() + 800; // 800 - задержка в мс, если будет флудить ставь больше
    }
}
вообще не работает)
 

_Vine_

Активный
154
57
вообще не работает)
C++:
// 1 способ
bool CheckPress() {
    static bool was_pressed = false;

    bool pressed = GetAsyncKeyState(key) & 0x8000;
    if (was_pressed != pressed) {
        was_pressed = pressed;
        if (pressed)
            return true;
    }
    return false;
}

void CALLBACK mainloop() {
    if (CheckPress()) {
        // code
    }
    // ...
}
C++:
// 2 способ
void CheckPressThread() {
    bool was_pressed = false;
    while(true) {
        bool pressed = GetAsyncKeyState(key) & 0x8000;
        if (was_pressed != pressed) {
            was_pressed = pressed;
            if (pressed) {
                // code
            }
        }
        Sleep(50);
    }
}


void CALLBACK mainloop() {
    static bool init = false;
    if (!init) {
        if (...) return;
        CreateThread(0, 0, (LPTHREAD_START_ROUTINE)&CheckPressThread, 0, 0, 0);
        init = true;
    }
}
C++:
// 3 способ
#define GTA_HWND **(HWND**)0xC97C1C

static WNDPROC g_OriginalWndProc = nullptr;

LRESULT __stdcall WndProc(HWND hWnd, UINT msg, LPARAM lParam, WPARAM wParam) {
    switch(msg) {
        case WM_KEYDOWN: case WM_SYSKEYDOWN: {
            if (wParam == key) {
                // code
            }
        } break;
    }
    return CallWindowProc(g_OriginalWndProc, hWnd, msg, lParam, wParam);
}

void CALLBACK mainloop() {
    static bool init = false;
    if (!init) {
        if (...) return;
        g_OriginalWndProc = SetWindowLongPtrA(GTA_HWND, GWLP_WNDPROC, (LONG_PTR)&WndProc);
        init = true;
    }
}
 
Последнее редактирование:
  • Нравится
Реакции: Ya Zaregalsya и twixjr12s

twixjr12s

Новичок
17
0
C++:
// 1 способ
bool CheckPress() {
    static bool was_pressed = false;

    bool pressed = GetAsyncKeyState(key) & 0x8000;
    if (was_pressed != pressed) {
        was_pressed = pressed;
        if (pressed)
            return true;
    }
    return false;
}

void CALLBACK mainloop() {
    if (CheckPress()) {
        // code
    }
    // ...
}
C++:
// 2 способ
void CheckPressThread() {
    bool was_pressed = false;
    while(true) {
        bool pressed = GetAsyncKeyState(key) & 0x8000;
        if (was_pressed != pressed) {
            was_pressed = pressed;
            if (pressed) {
                // code
            }
        }
        Sleep(50);
    }
}


void CALLBACK mainloop() {
    static bool init = false;
    if (!init) {
        if (...) return;
        CreateThread(0, 0, (LPTHREAD_START_ROUTINE)&CheckPressThread, 0, 0, 0);
        init = true;
    }
}
C++:
// 3 способ
#define GTA_HWND **(HWND**)0xC97C1C

static WNDPROC g_OriginalWndProc = nullptr;

LRESULT __stdcall WndProc(HWND hWnd, UINT msg, LPARAM lParam, WPARAM wParam) {
    switch(msg) {
        case WM_KEYDOWN: case WM_SYSKEYDOWN: {
            if (wParam == key) {
                // code
            }
        } break;
    }
    return CallWindowProc(g_OriginalWndProc, hWnd, msg, lParam, wParam);
}

void CALLBACK mainloop() {
    static bool init = false;
    if (!init) {
        if (...) return;
        g_OriginalWndProc = SetWindowLongPtrA(GTA_HWND, GWLP_WNDPROC, (LONG_PTR)&WndProc);
        init = true;
    }
}
C++:
wchar_t *text = SF->getSAMP()->getDialog()->GetInputText();
if (CheckPress(49))
{
    switch (strlen((char*)SF->getSAMP()->getDialog()->GetInputText()))
    {
        case 0: sprintf(result, "с"); break;
        case 1: sprintf(result, "са"); break;
        case 2: sprintf(result, "сас"); break;
        case 3: sprintf(result, "саса"); break;
        case 3: sprintf(result, "сасат"); break;
        default: sprintf(result, "сасать"); break;
    }
    SF->getSAMP()->getDialog()->SetInputText(result);
}
else SF->getSAMP()->getDialog()->SetInputText((char*)text);
Застревает на первой букве, я понимаю что это из-за этой строчки SF->getSAMP()->getDialog()->SetInputText((char*)text), но не знаю чем заменить
 
Последнее редактирование:

_Vine_

Активный
154
57
C++:
wchar_t *text = SF->getSAMP()->getDialog()->GetInputText();
if (CheckPress(49))
{
    switch (strlen((char*)SF->getSAMP()->getDialog()->GetInputText()))
    {
        case 0: sprintf(result, "с"); break;
        case 1: sprintf(result, "са"); break;
        case 2: sprintf(result, "сас"); break;
        case 3: sprintf(result, "саса"); break;
        case 3: sprintf(result, "сасат"); break;
        default: sprintf(result, "сасать"); break;
    }
    SF->getSAMP()->getDialog()->SetInputText(result);
}
else SF->getSAMP()->getDialog()->SetInputText((char*)text);
Застревает на первой букве, я понимаю что это из-за этой строчки SF->getSAMP()->getDialog()->SetInputText((char*)text), но не знаю чем заменить
Попробуй использовать getDialog()->pText вместо Get/SetInputText
 

astap_

Известный
Всефорумный модератор
626
601
Ошибка пикрелейтед, sf-plugin. Возникает от случая к случаю. Обычно после 10-20 минут работы цикла в отдельном потоке. Раскрыть код, увы, не могу. Могу лишь подчеркнуть, что это обычный бесконечный цикл, в котором вызываются некоторые функции. Есть ли какие-нибудь решения этого недоразумения, за исключением переноса цикла в мэйнлуп?

lkFaptM.png
 

rraggerr

проверенный какой-то
1,626
848
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Ошибка пикрелейтед, sf-plugin. Возникает от случая к случаю. Обычно после 10-20 минут работы цикла в отдельном потоке. Раскрыть код, увы, не могу. Могу лишь подчеркнуть, что это обычный бесконечный цикл, в котором вызываются некоторые функции. Есть ли какие-нибудь решения этого недоразумения, за исключением переноса цикла в мэйнлуп?

lkFaptM.png
Через сампфункс нельзя создавать потоки вообще, колхозь с таймерами
 
  • Вау
Реакции: astap_

ALF

Известный
Проверенный
320
539
Ошибка пикрелейтед, sf-plugin. Возникает от случая к случаю. Обычно после 10-20 минут работы цикла в отдельном потоке. Раскрыть код, увы, не могу. Могу лишь подчеркнуть, что это обычный бесконечный цикл, в котором вызываются некоторые функции. Есть ли какие-нибудь решения этого недоразумения, за исключением переноса цикла в мэйнлуп?

lkFaptM.png
Ты создаёшь поток в mainloop? Если да, то это не лучший вариант, создавай его в DLL_PROCESS_ATTACH
 
  • Нравится
Реакции: astap_

twixjr12s

Новичок
17
0
Предлагаю использовать wcslen вместо strlen, дать нормальную нумерацию кейсам и убрать последнюю строчку кода. Не вижу в ней смысла.
смысл в том чтобы заблокировать ввод своего текста
Попробуй использовать getDialog()->pText вместо Get/SetInputText
pText получает текст диалога, нужно получать input (введённый текст)
 
Последнее редактирование:

Gafask

Участник
137
13
1. Как правильно выполнить проверку через if при работает с адресами памяти игры . Просто когда значение должно быть верным и должен выполнится код он не выполнятся . Я написал быстро код который приводит мой пример и описал все что там есть вроде . Типа если денег у меня 100 долларов то вывестись на экран подсказка в игре samp или gta sa типа у вас 100 долларов или что-то такое . А если не 100 то будет раз в 10 сек писаться типа не 100 долларов у вас . Но
проблема в том что когда денег ряльно 100 и даже если через CE ( Чит движок , Чит энерджи , cheat engine ) и поставить там 100 то это один хер не будет работать я уже замучился искать ответ . Спрашивать на форуме и мне там только администратор форума отвечает но он не понимает в чом проблема или не знает почему это так .
Если что я просто пример пример , это не адрес денег а адрес хер пойми чего ))) . Типа он равен 80 но его можно поменять через CE на 100 и один хер не чего не случится . И значение не будет обратно прыгать оно равно таму значению которое записал хоть 1 оно будет равно 1 всю игру . Это так к слову . Просто записал рандом адрес из моей фонотеки.

Вопрос.CPP:
#include <Windows.h>
#include <process.h>
#include "main.h"

void __cdecl MainThread(void *pArg)
{
    while (true)
        Sleep(1);
    {
    if ($ == 100)// Проверка на то что $ = 100 и если оно верное ( true ) то выполнится код нижу.
            {
            Sleep(1);//Задержка 1 мс. Добавил чисто для безопасности шобы не было просадки , ну а вдруг нада .
            AddMessageJumpQ("Проверка выполнена и равна 100 . ", 1500, NULL, false);//Выводит подсказку с текстом , ну это стандарт функция)
            }
        else { //Если $ не равна 100 то выполнится этот код ниже .
            Sleep(10000);// Задержка 10 Сек.
            AddMessageJumpQ("Значение не 100", 1500, NULL, false);//Выводит подсказку с текстом , ну это стандарт функция)
            }
    }  
}


BOOL WINAPI DllMain(_In_ HINSTANCE hinstDLL, _In_ DWORD fdwReason, _In_ PVOID lpvReserved)
{
    if (fdwReason == DLL_PROCESS_ATTACH) _beginthread(MainThread, NULL, nullptr);
    return TRUE;
}
// Проблема в том что когда $ равно в игре 100 но код не выполнятся , вобще хоть функцию хп 0 добавить она не выполнится .

Проблема в коде в том что проверка не проходит даже если оно равно 100 .
main.h:
DWORD Cped = *(DWORD*)0xB6F5F0; // тут мы прочитали указатель на игрока ну адрес игрока типо .
DWORD ZZZ = (Cped + 0x756); // а это смещение адреса для денег , мы его прочитали и записали в $ ну или в что-то другое разницы нету вроде ) . Хоть в 1 .

#define FUNC_CMessages__AddMessageJumpQ 0x69F1E0

void AddMessageJumpQ(PCHAR text, UINT time, USHORT flag, bool bPreviousBrief) // Функция показа сообщения на экране.
{
    ((void(__cdecl *)(PCHAR, UINT, USHORT, bool))FUNC_CMessages__AddMessageJumpQ)(text, time, flag, bPreviousBrief);
}
 
Последнее редактирование:

iAmerican

Известный
Друг
614
260
1. Как правильно выполнить проверку через if при работает с адресами памяти игры . Просто когда значение должно быть верным и должен выполнится код он не выполнятся . Я написал быстро код который приводит мой пример и описал все что там есть вроде . Типа если денег у меня 100 долларов то вывестись на экран подсказка в игре samp или gta sa типа у вас 100 долларов или что-то такое . А если не 100 то будет раз в 10 сек писаться типа не 100 долларов у вас . Но
проблема в том что когда денег ряльно 100 и даже если через CE ( Чит движок , Чит энерджи , cheat engine ) и поставить там 100 то это один хер не будет работать я уже замучился искать ответ . Спрашивать на форуме и мне там только администратор форума отвечает но он не понимает в чом проблема или не знает почему это так .

Вопрос.CPP:
#include <Windows.h>
#include <process.h>
#include "main.h"

void __cdecl MainThread(void *pArg)
{
    while (true)
        Sleep(1);
    {
    if ($ == 100)// Проверка на то что $ = 100 и если оно верное ( true ) то выполнится код нижу.
            {
            Sleep(1);//Задержка 1 мс. Добавил чисто для безопасности шобы не было просадки , ну а вдруг нада .
            AddMessageJumpQ("Проверка выполнена и денег 100 . ", 1500, NULL, false);//Выводит подсказку с текстом , ну это стандарт функция)
            }
        else { //Если $ не равна 100 то выполнится этот код ниже .
            Sleep(10000);// Задержка 10 Сек.
            AddMessageJumpQ("Проверка на то что денег 100 не верно", 1500, NULL, false);//Выводит подсказку с текстом , ну это стандарт функция)
            }
    }
}


BOOL WINAPI DllMain(_In_ HINSTANCE hinstDLL, _In_ DWORD fdwReason, _In_ PVOID lpvReserved)
{
    if (fdwReason == DLL_PROCESS_ATTACH) _beginthread(MainThread, NULL, nullptr);
    return TRUE;
}
// Проблема в том что когда $ равно в игре 100 но код не выполнятся , вобще хоть функцию хп 0 добавить она не выполнится .

Проблема в коде в том что проверка не проходит даже если оно равно 100 .
main.h:
DWORD Cped = *(DWORD*)0xB6F5F0; // тут мы прочитали указатель на игрока ну адрес игрока типо .
DWORD $ = (Cped + 0x756); // а это смещение адреса для денег , мы его прочитали и записали в $ ну или в что-то другое разницы нету вроде ) . Хоть в 1 .

#define FUNC_CMessages__AddMessageJumpQ 0x69F1E0

void AddMessageJumpQ(PCHAR text, UINT time, USHORT flag, bool bPreviousBrief) // Функция показа сообщения на экране.
{
    ((void(__cdecl *)(PCHAR, UINT, USHORT, bool))FUNC_CMessages__AddMessageJumpQ)(text, time, flag, bPreviousBrief);
}
0xB7CE50 - [dword] Деньги \\ - пробуй через это
и поменяй название перменной

P.s. а вообще у тебя цикл while постоянно идет

Писал в блокноте , может что то и не так , но суть думаю понятна будет

sad:
DWORD Cped = *(DWORD*)0xB6F5F0; // тут мы прочитали указатель на игрока ну адрес игрока типо .
DWORD dwMoney = (Cped + 0x756); // а это смещение адреса для денег , мы его прочитали и записали в $ ну или в что-то другое разницы нету вроде ) . Хоть в 1 .

#define FUNC_CMessages__AddMessageJumpQ 0x69F1E0

void AddMessageJumpQ(PCHAR text, UINT time, USHORT flag, bool bPreviousBrief) // Функция показа сообщения на экране.
{
    ((void(__cdecl *)(PCHAR, UINT, USHORT, bool))FUNC_CMessages__AddMessageJumpQ)(text, time, flag, bPreviousBrief);
}


void __cdecl MainThread(void *pArg)
{

    static DWORD dwOldMoney = 0;
    static bool _bInit = false;


    while(true) {
       
        if(!_bInit) {
            dwOldMoney = (Cped + 0x756); // Или тот адресс который я кинул выше.
            _bInit = true;
        }

        if(dwOldMoney != (Cped + 0x756)) {
            if ($ == 100) {
                AddMessageJumpQ("Проверка выполнена и денег 100 . ", 1500, NULL, false);
                dwOldMoney = (Cped + 0x756);
            }
            else  {
                AddMessageJumpQ("Проверка на то что денег 100 не верно", 1500, NULL, false);
                dwOldMoney = (Cped + 0x756);
            }
        }

        Sleep(100);
    }


}
 
Последнее редактирование: