При инжекте DLL персонаж начинает бегать.

otherwise

Участник
Автор темы
46
7
При инжекте я просто начинаю бегать по кругу, самп перестает реагировать на нажатие каких-либо клавиш.

C++:
float* coordinates = (*(DWORD*)0xB6F5F0) ? (float*)(*(DWORD*)(*(DWORD*)0xB6F5F0 + 0x14) + 0x30) : NULL;
DWORD Gravity = *(DWORD*)0x863984;

WNDPROC Wnd = NULL;
bool CheatOn = false;
LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
   
    switch (uMsg)
    {
    case WM_KEYUP:
    {
        switch (wParam)
        {

        case VK_RSHIFT:
        {

            if (CheatOn == false)
                CheatOn = true;
            else
                CheatOn = false;
        }
        case VK_UP:
            CheatOn == true ? coordinates[2] += 0.001f : NULL;
        case VK_DOWN:
            CheatOn == true ? coordinates[2] -= 0.001f : NULL;
        case VK_LEFT:
            CheatOn == true ? coordinates[0] -= 0.001f : NULL;
        case VK_RIGHT:
            CheatOn == true ? coordinates[0] += 0.001f : NULL;
        case 0x57:
            CheatOn == true ? coordinates[1] += 0.001f : NULL;
        case 0x53:
            CheatOn == true ? coordinates[1] -= 0.001f : NULL;

        break;
        }
 
        }
    }
   
    return CallWindowProcA(WNDPROC(Wnd), hwnd, uMsg, wParam, lParam);
}

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
    switch (fdwReason)
    {
    case DLL_PROCESS_ATTACH:
    {
        Wnd = (WNDPROC)SetWindowLong(FindWindowA(0, "GTA:SA:MP"), GWL_WNDPROC, (LONG)WndProc);
    }
    }
    return TRUE;
}
 
Решение
Возможно стоит попробовать сделать так:
upd:
C++:
WNDPROC pWndProc = nullptr;

float* coordinates = (*(DWORD*)0xB6F5F0) ? (float*)(*(DWORD*)(*(DWORD*)0xB6F5F0 + 0x14) + 0x30) : NULL;

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    static bool enabled = false;
    if (uMsg == WM_KEYUP)
    {
        if (wParam == VK_SHIFT && lParam == 0xC0360001) // костыль 
        {
            enabled ^= true;
            if (enabled)
            {
                *(float*)0x863984 = 0.0f;
            }
            else
            {
                *(float*)0x863984 = 0.008f;
            }
        }
    }

    if (enabled && uMsg == WM_KEYDOWN)
    {
        switch (wParam)
        {
        case VK_UP...

otherwise

Участник
Автор темы
46
7
Ну ты как бы подмениваешь WndProc на свой и естественно весь WndProc SA-MP'a накрывается.
Ну так а как мне это исправить? Просто написали что создавать поток это хуйня, а хук меня уже бесит, не могу никак нормально сделать
 

redcode

🤔
Друг
144
1,260
Возможно стоит попробовать сделать так:
upd:
C++:
WNDPROC pWndProc = nullptr;

float* coordinates = (*(DWORD*)0xB6F5F0) ? (float*)(*(DWORD*)(*(DWORD*)0xB6F5F0 + 0x14) + 0x30) : NULL;

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    static bool enabled = false;
    if (uMsg == WM_KEYUP)
    {
        if (wParam == VK_SHIFT && lParam == 0xC0360001) // костыль 
        {
            enabled ^= true;
            if (enabled)
            {
                *(float*)0x863984 = 0.0f;
            }
            else
            {
                *(float*)0x863984 = 0.008f;
            }
        }
    }

    if (enabled && uMsg == WM_KEYDOWN)
    {
        switch (wParam)
        {
        case VK_UP:
            coordinates[2] += 1.f;
            break;
        case VK_DOWN:
            coordinates[2] -= 1.f;
            break;
        case 0x41: // 'A' key
            coordinates[0] -= 1.f;
            break;
        case 0x44: // 'D' key
            coordinates[0] += 1.f;
            break;
        case 0x53: // 'S' key
            coordinates[1] -= 1.f;
            break;
        case 0x57: // 'W' key
            coordinates[1] += 1.f;
            break;
        default:
            break;
        }
    }
    return CallWindowProcA(WNDPROC(pWndProc), hwnd, uMsg, wParam, lParam);
}

bool WINAPI DllMain(HMODULE hModule, DWORD dwReasonForCall, LPVOID lpReserved)
{
    if (dwReasonForCall == DLL_PROCESS_ATTACH)
        pWndProc = (WNDPROC)SetWindowLongPtr(FindWindowA(nullptr, "GTA:SA:MP"), GWL_WNDPROC, (LONG_PTR)WndProc);
    return true;
}
 
Последнее редактирование:

otherwise

Участник
Автор темы
46
7
Возможно стоит попробовать сделать так:
upd:
C++:
WNDPROC pWndProc = nullptr;

float* coordinates = (*(DWORD*)0xB6F5F0) ? (float*)(*(DWORD*)(*(DWORD*)0xB6F5F0 + 0x14) + 0x30) : NULL;

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    static bool enabled = false;
    if (uMsg == WM_KEYUP)
    {
        if (wParam == VK_SHIFT && lParam == 0xC0360001) // костыль
        {
            enabled ^= true;
            if (enabled)
            {
                *(float*)0x863984 = 0.0f;
            }
            else
            {
                *(float*)0x863984 = 0.008f;
            }
        }
    }

    if (enabled && uMsg == WM_KEYDOWN)
    {
        switch (wParam)
        {
        case VK_UP:
            coordinates[2] += 1.f;
            break;
        case VK_DOWN:
            coordinates[2] -= 1.f;
            break;
        case 0x41: // 'A' key
            coordinates[0] -= 1.f;
            break;
        case 0x44: // 'D' key
            coordinates[0] += 1.f;
            break;
        case 0x53: // 'S' key
            coordinates[1] -= 1.f;
            break;
        case 0x57: // 'W' key
            coordinates[1] += 1.f;
            break;
        default:
            break;
        }
    }
    return CallWindowProcA(WNDPROC(pWndProc), hwnd, uMsg, wParam, lParam);
}

bool WINAPI DllMain(HMODULE hModule, DWORD dwReasonForCall, LPVOID lpReserved)
{
    if (dwReasonForCall == DLL_PROCESS_ATTACH)
        pWndProc = (WNDPROC)SetWindowLongPtr(FindWindowA(nullptr, "GTA:SA:MP"), GWL_WNDPROC, (LONG_PTR)WndProc);
    return true;
}
не обьсянишь за что отвечает lParam == 0xC0360001??
Вот код
C++:
 if (wParam == VK_SHIFT && lParam == 0xC0360001) // костыль
 

redcode

🤔
Друг
144
1,260
не обьсянишь за что отвечает lParam == 0xC0360001??
Вот код
C++:
 if (wParam == VK_SHIFT && lParam == 0xC0360001) // костыль
wParam содержит информацию о том, что был нажат шифт, но какой именно - неизвестно.
lParam даёт расширенную информацию, в том числе о том, является ли клавиша 'расширеной', коей является VK_RSHIFT.

Это должно выглядеть так:
C++:
if (wParam == VK_SHIFT && lParam & 0x40000) // не костыль