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

memir

🇷🇺
Всефорумный модератор
333
599
Если инжектить через cheat engine - то все работает.
C++:
LRESULT defwndproc;
LRESULT CALLBACK WindowProc(HWND   hwnd, UINT   uMsg, WPARAM wParam, LPARAM lParam)
{
    if (uMsg == WM_KEYDOWN)
    {
        switch (wParam)
        {
        case VK_LEFT:
            CallWindowProcA(WNDPROC(defwndproc), hwnd, WM_KEYDOWN, VK_NUMPAD4, lParam);
            break;
        case VK_RIGHT:
            CallWindowProcA(WNDPROC(defwndproc), hwnd, WM_KEYDOWN, VK_NUMPAD6, lParam);
            break;
        case VK_UP:
            CallWindowProcA(WNDPROC(defwndproc), hwnd, WM_KEYDOWN, VK_NUMPAD8, lParam);
            break;
        case VK_DOWN:
            CallWindowProcA(WNDPROC(defwndproc), hwnd, WM_KEYDOWN, VK_NUMPAD2, lParam);
            break;
        }
    }
    if (uMsg == WM_KEYUP)
    {
        switch (wParam)
        {
        case VK_LEFT:
            CallWindowProcA(WNDPROC(defwndproc), hwnd, WM_KEYUP, VK_NUMPAD4, lParam);
            break;
        case VK_RIGHT:
            CallWindowProcA(WNDPROC(defwndproc), hwnd, WM_KEYUP, VK_NUMPAD6, lParam);
            break;
        case VK_UP:
            CallWindowProcA(WNDPROC(defwndproc), hwnd, WM_KEYUP, VK_NUMPAD8, lParam);
            break;
        case VK_DOWN:
            CallWindowProcA(WNDPROC(defwndproc), hwnd, WM_KEYUP, VK_NUMPAD2, lParam);
            break;
        }
    }
    return CallWindowProcA(WNDPROC(defwndproc), hwnd, uMsg, wParam, lParam);
}
BOOL APIENTRY DllMain( HMODULE hModule,DWORD  ul_reason_for_call,LPVOID lpReserved)
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        defwndproc = SetWindowLongA(FindWindowA(0, "GTA:SA:MP"), GWL_WNDPROC, LONG(WindowProc));
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}
 

Alfinity

Известный
94
52
Ребят, может кто объяснить как работать с камерой средствами СФ(устанавливать позицию) ну и мелкие нюансы, если есть?
 
Последнее редактирование:

iAmerican

Известный
Друг
615
257
Если инжектить через cheat engine - то все работает.
C++:
LRESULT defwndproc;
LRESULT CALLBACK WindowProc(HWND   hwnd, UINT   uMsg, WPARAM wParam, LPARAM lParam)
{
    if (uMsg == WM_KEYDOWN)
    {
        switch (wParam)
        {
        case VK_LEFT:
            CallWindowProcA(WNDPROC(defwndproc), hwnd, WM_KEYDOWN, VK_NUMPAD4, lParam);
            break;
        case VK_RIGHT:
            CallWindowProcA(WNDPROC(defwndproc), hwnd, WM_KEYDOWN, VK_NUMPAD6, lParam);
            break;
        case VK_UP:
            CallWindowProcA(WNDPROC(defwndproc), hwnd, WM_KEYDOWN, VK_NUMPAD8, lParam);
            break;
        case VK_DOWN:
            CallWindowProcA(WNDPROC(defwndproc), hwnd, WM_KEYDOWN, VK_NUMPAD2, lParam);
            break;
        }
    }
    if (uMsg == WM_KEYUP)
    {
        switch (wParam)
        {
        case VK_LEFT:
            CallWindowProcA(WNDPROC(defwndproc), hwnd, WM_KEYUP, VK_NUMPAD4, lParam);
            break;
        case VK_RIGHT:
            CallWindowProcA(WNDPROC(defwndproc), hwnd, WM_KEYUP, VK_NUMPAD6, lParam);
            break;
        case VK_UP:
            CallWindowProcA(WNDPROC(defwndproc), hwnd, WM_KEYUP, VK_NUMPAD8, lParam);
            break;
        case VK_DOWN:
            CallWindowProcA(WNDPROC(defwndproc), hwnd, WM_KEYUP, VK_NUMPAD2, lParam);
            break;
        }
    }
    return CallWindowProcA(WNDPROC(defwndproc), hwnd, uMsg, wParam, lParam);
}
BOOL APIENTRY DllMain( HMODULE hModule,DWORD  ul_reason_for_call,LPVOID lpReserved)
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        defwndproc = SetWindowLongA(FindWindowA(0, "GTA:SA:MP"), GWL_WNDPROC, LONG(WindowProc));
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}
ASI инжектится моментально , при запуске процесса(точно не знаю).

Так что добавляй цикл.

C++:
HWND hWnd = 0;

while(hWnd == 0){
       hWnd = FindWindow(0, "GTA:SA:MP");
       Sleep(100);
   }
 
  • Нравится
Реакции: leak.

samp is meme

Активный
183
63
Какие сервисы существуют для работы нескольких людей над одним сурсом? Чтобы несколько людей могло вносить изменения туда.
 

NarutoUA

NarutoUA
BH Team
692
1,538
Еще могу посоветовать gitlab, там есть приватные репозитории (бесплатно). Но если ты полный нуб то лучше тфс использовать, он интегрирован в студию и в гуи все нужные команды
 

memir

🇷🇺
Всефорумный модератор
333
599
ASI инжектится моментально , при запуске процесса(точно не знаю).

Так что добавляй цикл.

C++:
HWND hWnd = 0;

while(hWnd == 0){
       hWnd = FindWindow(0, "GTA:SA:MP");
       Sleep(100);
   }
Проблема в том, что я не могу добавить цикл, ибо с ним все зависает.
 
Последнее редактирование:

C&J

Известный
41
22
Возможно ли узнать скины других игроков через память игры?
 

ishi

Известный
493
110
C++:
stOnFootData sync;
         memset(&sync, 0, sizeof(stOnFootData));
         sync = SF->getSAMP()->getPlayers()->pLocalPlayer->onFootData;
         sync.sKeys = 131072;
         BitStream bsActorSync;
         bsActorSync.Write((BYTE)ID_PLAYER_SYNC);
         bsActorSync.Write((PCHAR)&sync, sizeof(stOnFootData));
        
         SF->getRakNet()->SendPacket(&bsActorSync);
Пытаюсь отправить нажатие клавиши N через синхру, но почему-то именно эта клавиша (а ещё Y) не отсылается (при нажатии sKeys остаётся 0), но при этом если заноппить "ноги", сервер перестанет реагировать на нажатие, что говорит о том что оно отсылается-таки через них.
Ну и вопрос: что не так? коды клавиш взял отсюда, способ заполнения и отправки взял отсюда, даже на всякий проверил на соответствие правильному варианту структуры samp.lua