BlastHackNet/mod_s0beit_sa(https://github.com/BlastHackNet/mod_s0beit_sa/blob/master/src/samp.cpp#L675)Как вывести локально сообщение в asi?
cheat_state->state maybe can't change, check itwhy this not working i wanted to check when i'm driving to put gravity back to normal
if (cheat_state->state == CHEAT_STATE_ACTOR)
{
gta_gravity_set(10.0000);
}
else if (cheat_state->state == CHEAT_STATE_VEHICLE)
{
gta_gravity_set(0.0080);
}
в sf wndproc уже перехвачен, достаточно зарегать каллбек.Здравствуйте.
Заметил, что из за перехвата оконной процедуры(wndproc) через SetWindowLongPtr, при выгрузке плагина через консоль сф командой "pfree SFPlugin" происходит краш. В коллбэке деструктора игры и DLL PROCESS DETACH'e пытался восстанавливать оригинальный WndProc, но краш все равно был.
Может быть, кто нибудь знает, из за чего такое происходит?
C++:#define _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS #include <windows.h> #include <string> #include <assert.h> #include <process.h> #include "SAMPFUNCS_API.h" #include "game_api\game_api.h" #pragma comment(lib, "user32.lib") SAMPFUNCS *SF = new SAMPFUNCS(); WNDPROC oWndProc = 0; LRESULT __stdcall WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { SF->getSAMP()->getChat()->AddChatMessage(-1, "WNDPROC CALLED"); return CallWindowProcA(oWndProc, hWnd, uMsg, wParam, lParam); } void __stdcall Destructor() { static bool once = false; if (!once) { SetWindowLongPtr(GetForegroundWindow(), GWLP_WNDPROC, (long)oWndProc); once = true; } } void CALLBACK mainloop() { static bool init = false; if (!init) { if (GAME == nullptr || GAME->GetSystemState() != eSystemState::GS_PLAYING_GAME || !SF->getSAMP()->IsInitialized()) return; oWndProc = (WNDPROC)SetWindowLongPtr(GetForegroundWindow(), GWLP_WNDPROC, (long)WndProc); SF->getGame()->registerGameDestructorCallback(Destructor); init = true; } } BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReasonForCall, LPVOID lpReserved) { if (dwReasonForCall == DLL_PROCESS_ATTACH) SF->initPlugin(mainloop, hModule); else if (dwReasonForCall == DLL_PROCESS_DETACH) Destructor(); return TRUE; }
тут пример - Гайд - API SF | Урок 5 - Подключение ImGui(https://blast.hk/threads/23083/)