Не обязательно, любой тип данных на 4 байтаfloat.
Скорее всего будет DWORDSize 4 это какой тип данных?
Не обязательно, любой тип данных на 4 байтаfloat.
Скорее всего будет DWORDSize 4 это какой тип данных?
Не увидел твой ответ. Крашит :(C++:DWORD some = 0x00002042 *(DWORD *)0x718D14 = some *(float *)0x858A10 = 32.0 *(float *)0x866B70 = 53.0 *(float *)0x866B78 = 76.0 *(float *)0x866B74 = 49.0
ну без переменной some на прямуб подставь значение. К тому же, у тебя в клео коде используется virtual_protect 1, а в C++ коде не юзаешьНе увидел твой ответ. Крашит :(
DWORD VP = 0;
VirtualProtect((void*)Адрес, размер_для_тебя_4_байта, 0x01, &VP);
//запись в память
VirtualProtect((void*)Адрес, размер, VP, NULL);
Там, по моему, ещё указатель указывается, а не значение.C++:DWORD some = 0x00002042 *(DWORD *)0x718D14 = some *(float *)0x858A10 = 32.0 *(float *)0x866B70 = 53.0 *(float *)0x866B78 = 76.0 *(float *)0x866B74 = 49.0
Да, точно. 0ac6 указатель отдает.Там, по моему, ещё указатель указывается, а не значение.
DWORD some = 0x00002042;
*(PDWORD*)0x718D14 = &some;
DWORD some = 0x42200000; // 40.0 = 0x42200000 ?
*(PDWORD*)0x718D14 = &some;
float some = 40.0;
*(PFLOAT*)0x718D14 = &some;
По нажатию на нумпад 1 изменяет позиию радара на 100.0С Vitual Protect крашит еще при загрузке. В остальных случаях текстдравов нет (адрес отвечает за размер текстдравов(?)).
Пробовал так:
И так:C++:DWORD some = 0x00002042; *(PDWORD*)0x718D14 = &some;
И даже так:Код:DWORD some = 0x42200000; // 40.0 = 0x42200000 ? *(PDWORD*)0x718D14 = &some;
Вот код Легенд'а: https://www.blast.hk/threads/34/page-153#post-81158Код:float some = 40.0; *(PFLOAT*)0x718D14 = &some;
CLEO:{$CLEO} {$INCLUDE SF} 0001: wait 0 ms 0662: "by legend2360" 0662: "BlastHack - cheating is art" 0AC6: 0@ = label @font_size offset 0A8C: write_memory 0x0718D14 size 4 value 0@ virtual_protect 1 // записываем новый адрес памяти откуда будет читаться значение // (gta_sa.exe+318D12 - D8 0D 108A8500 - fmul dword ptr [gta_sa.exe+458A10] | gta_sa.exe+458A10 заменяем на адрес "лейбла") 0A8C: write_memory 0x0858A10 size 4 value 100.0 virtual_protect 1 // Меняем позицию радара while true wait 0 end :font_size // standart hex 00 00 20 42 // 40.0 end
#include <windows.h>
#include <string>
#include <assert.h>
#include "SAMPFUNCS_API.h"
#include "game_api\game_api.h"
SAMPFUNCS *SF = new SAMPFUNCS();
float RadarPos = 40.0;
void CALLBACK mainloop()
{
static bool init = false;
if (!init)
{
if (GAME == nullptr)
return;
if (GAME->GetSystemState() != eSystemState::GS_PLAYING_GAME)
return;
if (!SF->getSAMP()->IsInitialized())
return;
init = true;
}
if (SF->getGame()->isKeyPressed(0x61))
{
*(DWORD*)(0x0718D14) = (DWORD)&RadarPos;
*(float*)(0x0858A10) = 100.0;
}
}
BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReasonForCall, LPVOID lpReserved)
{
switch (dwReasonForCall)
{
case DLL_PROCESS_ATTACH:
SF->initPlugin(mainloop, hModule);
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
Попробуй статическую переменную.С Vitual Protect крашит еще при загрузке. В остальных случаях текстдравов нет (адрес отвечает за размер текстдравов(?)).
Работает. Спасибо! :)По нажатию на нумпад 1 изменяет позиию радара на 100.0
*Внимание на объявление RadarPos.
Код:#include <windows.h> #include <string> #include <assert.h> #include "SAMPFUNCS_API.h" #include "game_api\game_api.h" SAMPFUNCS *SF = new SAMPFUNCS(); float RadarPos = 40.0; void CALLBACK mainloop() { static bool init = false; if (!init) { if (GAME == nullptr) return; if (GAME->GetSystemState() != eSystemState::GS_PLAYING_GAME) return; if (!SF->getSAMP()->IsInitialized()) return; init = true; } if (SF->getGame()->isKeyPressed(0x61)) { *(DWORD*)(0x0718D14) = (DWORD)&RadarPos; *(float*)(0x0858A10) = 100.0; } } BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReasonForCall, LPVOID lpReserved) { switch (dwReasonForCall) { case DLL_PROCESS_ATTACH: SF->initPlugin(mainloop, hModule); break; case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; }
создай новый поток и выполняй код оттуда, тогда сможешь юзать Sleep(задержка); без геймфриза, по моему удобнее.Таймер возможно сделать? Не 0001: wait 5000, а именно таймер.