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

_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
596
Ошибка пикрелейтед, sf-plugin. Возникает от случая к случаю. Обычно после 10-20 минут работы цикла в отдельном потоке. Раскрыть код, увы, не могу. Могу лишь подчеркнуть, что это обычный бесконечный цикл, в котором вызываются некоторые функции. Есть ли какие-нибудь решения этого недоразумения, за исключением переноса цикла в мэйнлуп?

lkFaptM.png
 

rraggerr

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

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

ALF

Известный
Проверенный
320
537
Ошибка пикрелейтед, 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

Известный
Друг
615
257
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);
    }


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

Gafask

Участник
137
13
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);
    }


}
Неа , 0 эмоции . Я если что в том коде который кидал там есть пару косяков и недочетов . Но смысл вроде я донес . По логике цикл бесконечный лаги не вызывает у меня и работает стабильно . И по логике если цикл бесконечный то он проверяет всегда эту = или нет ( я про if ) , мне просто не понятно почему при считывании из памяти игры и потом проверки это значения толку 0 . Я хотел это реализовать типа проверку координат игрока и потом уже выполнение кода типа если ровно то это а если нет то будет то-то выполнено , а когда я вроде проверяю и значение одинаковы толку 0 . Я даже ставил промежуток между этими значениями типа проверку между 1 и 4 ( типа если равно 1 или 2 или 3 или 4) то код выполнится но нет . Ну у меня были предположение что иза того что значение флоат и типа оно плавает ( проще говоря с точкой ) то тогда можно же выполнить проверку денег и если оно верно то вывести на экран но и это тоже не хочет . Типа сама проблема в том что у меня не получается сделать проверку значения из адреса памяти ( if как будто его не читает ) . Код который ты дал я поправил ( там был старый мой косяк , указатели были не все заменены ) и вгрызся в игру ( заинжектил) то не чего не показало ( там должно было высветится типа подсказки ) . Потом поставив через CE значение на 100 и там и там и поменяв на 1-4 байт то толку не было ( менял для того что-бы убедится что точно не работает ) .
 

CleanLegend

Известный
Всефорумный модератор
476
928
  • Нравится
Реакции: Gafask

twixjr12s

Новичок
17
0
как сделать shadow by pass? как я понял в ShadowPlay можно не записывать рабочий стол и скрипт запускается от имени explorer'a или самого shadowplay, no kak?
 

Gafask

Участник
137
13
Попробуй так.
C++:
0xB7CE50 - адрес денег

if (*(DWORD*)0xB7CE50 == 100)

Еще можешь использовать вот этот плагин для логирования значений - https://blast.hk/threads/22179/
2.Cпасибо заработало , лайк поставил . А не подскажешь как можно еще реализовать это с 1-2 смещениями ? ( смещения адреса памяти )
 
Последнее редактирование: