- 611
- 261
Если инжектить через cheat engine - то все работает.Код покажи.
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;
}
Название окна становится GTA:SA:MP только после того, как загрузится сам самп (покажется чат и игра, естественно).Если инжектить через cheat engine - то все работает.
ASI инжектится моментально , при запуске процесса(точно не знаю).Если инжектить через 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; }
HWND hWnd = 0;
while(hWnd == 0){
hWnd = FindWindow(0, "GTA:SA:MP");
Sleep(100);
}
Проблема в том, что я не могу добавить цикл, ибо с ним все зависает.ASI инжектится моментально , при запуске процесса(точно не знаю).
Так что добавляй цикл.
C++:HWND hWnd = 0; while(hWnd == 0){ hWnd = FindWindow(0, "GTA:SA:MP"); Sleep(100); }
Возможно.Возможно ли узнать скины других игроков через память игры?
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), но при этом если заноппить "ноги", сервер перестанет реагировать на нажатие, что говорит о том что оно отсылается-таки через них.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);
Ну и вопрос: что не так? коды клавиш взял отсюда, способ заполнения и отправки взял отсюда, даже на всякий проверил на соответствие правильному варианту структуры samp.lua
2 байта - максимум 65535. В цикле лови пакет и выводи значение sKeys на экран, не двигаясь (что бы было 0) нажми N, и узнаешь какое значение за нее отвечаетsync.sKeys = 131072;