В луа особо не шарю , но по аналогии должно быть
1) *(DWORD *)ТвойАдрес = Твое Значение;
2) memset
3) string * str = (string *)Твой Адрес;
Новый поток создай и в нем уже используй sleepКак sleep() сделать в цикле, просто когда юзаю sleep игра зависает...
Инкремент переменной C на 1а чё за
int AlmostMain ( int argc, char ** argv )
{
int C = 2019;
//C++;
size_t _( &C != &C );
for(;C&(_=(_?_<<(C!=~C):(C==C)));C&=~_){}
C|=_;
}
#include "main.h"
void MainThread()
{
do {
samp.dwModule = (DWORD)GetModuleHandle(L"samp.dll");
} while (!samp.dwModule);
do {
Sleep(1);
} while (IsSampInit() != TRUE);
Sleep(2500);
AddChatMessage("Hello world!");
}
BOOL WINAPI DllMain(HINSTANCE hModule, DWORD dwReason, LPVOID lpReserved)
{
switch (dwReason)
{
case DLL_PROCESS_ATTACH:
{
DisableThreadLibraryCalls(hModule);
_beginthread((_beginthread_proc_type)MainThread, NULL, NULL);
break;
}
}
}
#pragma once
#include <Windows.h>
#include <iostream>
#include <string>
#include <process.h>
#include <stdio.h>
struct SAMPStruct
{
DWORD dwModule;
} samp;
struct SAMPOffsets
{
DWORD registerClientCommand = 0x65AC0;
DWORD addChatMessage = 0x64520;
} offset;
bool IsSampInit()
{
return ((bool(__thiscall *)())(samp.dwModule + 0x9BF70))();
}
void RegisterChatCommand(const char *command, void *function)
{
((void(__thiscall *)(DWORD str, const char* cmd, void* func))(samp.dwModule + offset.registerClientCommand))(*(DWORD*)(samp.dwModule + 0x21A0E8), command, function);
}
void AddChatMessage(const char *message)
{
((void(__thiscall *)(DWORD str, const char* text))(samp.dwModule + offset.addChatMessage))(*(DWORD*)(samp.dwModule + 0x21A0E4), message);
}
Определяй версию сампа при загрузке плагина и уже после инициализируй оффсеты для конкретной версии. Пример определения посмотри в собейте, основан на проверке массива байтВсем привет 👋
Есть нужда в создании плагина, который бы запускался на всех последних версиях SAMP, а значит возможность написания SF плагина сразу отпадает. Собственно, в C++ я новичок, можно сказать, но всё равно попытался всё сделать сам - ничего не получилось, по итогам тестирования было установлено, что игра офигевает от происходящего и крашится. Мои цели в данный момент достаточно простые - заставить ASI плагин выводить сообщение в чат после инициализации SAMP'a.
Пожалуйста, не нужно советовать различные ASI Framework - это не то, что мне нужно. Помогите разобраться с тем, как это работает в идеале, пожалуйста.
main.cpp:#include "main.h" void MainThread() { do { samp.dwModule = (DWORD)GetModuleHandle(L"samp.dll"); } while (!samp.dwModule); do { Sleep(1); } while (IsSampInit() != TRUE); Sleep(2500); AddChatMessage("Hello world!"); } BOOL WINAPI DllMain(HINSTANCE hModule, DWORD dwReason, LPVOID lpReserved) { switch (dwReason) { case DLL_PROCESS_ATTACH: { DisableThreadLibraryCalls(hModule); _beginthread((_beginthread_proc_type)MainThread, NULL, NULL); break; } } }
main.h:#pragma once #include <Windows.h> #include <iostream> #include <string> #include <process.h> #include <stdio.h> struct SAMPStruct { DWORD dwModule; } samp; struct SAMPOffsets { DWORD registerClientCommand = 0x65AC0; DWORD addChatMessage = 0x64520; } offset; bool IsSampInit() { return ((bool(__thiscall *)())(samp.dwModule + 0x9BF70))(); } void RegisterChatCommand(const char *command, void *function) { ((void(__thiscall *)(DWORD str, const char* cmd, void* func))(samp.dwModule + offset.registerClientCommand))(*(DWORD*)(samp.dwModule + 0x21A0E8), command, function); } void AddChatMessage(const char *message) { ((void(__thiscall *)(DWORD str, const char* text))(samp.dwModule + offset.addChatMessage))(*(DWORD*)(samp.dwModule + 0x21A0E4), message); }
Посмотри исходный код под спойлером, там есть всё, кроме определения, но оно даже так не работает. Там явно где-то есть ошибка, но я её не вижу.Определяй версию сампа при загрузке плагина и уже после инициализируй оффсеты для конкретной версии. Пример определения посмотри в собейте, основан на проверке массива байт
Проблема в прототипе функции.Посмотри исходный код под спойлером, там есть всё, кроме определения, но оно даже так не работает. Там явно где-то есть ошибка, но я её не вижу.
void AddChatMessage(const char *message)
{
((void(__cdecl *)(DWORD str, const char* text, ...))(samp.dwModule + offset.addChatMessage))(*(DWORD*)(samp.dwModule + 0x21A0E4), message);
}
Как через .exe C++ получить уровень хп игрока? К примеру, через Read Process Memory
unsigned cPED_ptr;
float health;
ReadProcessMemory(hGTA, 0xB6F5F0, &cPED_ptr, 4, 0);
ReadProcessMemory(hGTA, cPED_ptr + 0x540, &health, 4, 0);
Что не так?C++:unsigned cPED_ptr; float health; ReadProcessMemory(hGTA, 0xB6F5F0, &cPED_ptr, 4, 0); ReadProcessMemory(hGTA, cPED_ptr + 0x540, &health, 4, 0);
Я конечно не эксперт, но мне кажется, что Sleep не стоит засовывать в цикл, и ещё ты дважды объявил hGTA, а вообще где main?Что не так?