Не нашел ничего по этому поводу, но держи несколько ссылок - может помогут для достижения твоей цели.emulateGTAKey из сампфункса это функция игры? Если да, то какой её адрес?
как можно сделать активацию на команду в asi?
#define SAMP_INPUT_INFO 0x21A0E8
#define SAMP_FUNC_REGISTERCMD 0x65AD0
BOOL RegisterChatCommand(LPCSTR sName, LPVOID lpvFunction)
{
DWORD dwSAMPAddress = reinterpret_cast<DWORD>(GetModuleHandleA("SAMP.DLL"));
if (dwSAMPAddress)
{
LPVOID lpvInputInfo = *reinterpret_cast<LPVOID *>(dwSAMPAddress + SAMP_INPUT_INFO);
if (lpvInputInfo)
{
reinterpret_cast<VOID(__thiscall *)(LPVOID, LPCSTR, LPVOID)>(dwSAMPAddress + SAMP_FUNC_REGISTERCMD)
(lpvInputInfo, sName, lpvFunction);
return TRUE;
}
}
return FALSE;
}
/*
Example:
LPVOID CommandHandler(LPCSTR sParams)
{
// sParams - command parameters.
}
RegisterChatCommand("CommandName", CommandHandler);
*/
Все из за цикла while, возникают несостыковки с основным циклом игры. Как я понял, ты для этих дел создаешь поток, но в твоем случае нужно хукнуть основной цикл игры, и там уже ставить статус клавише. Пример хука можно поглядеть вот тут:Сообщением ранее искал адрес памяти для клавиш гта и получил ответ. Выполнил следующий код:
Все работает, но довольно часто останавливается, будто на микросекунду отжал клавишуC++:while (bThread) { *(int*)(0xB73458 + 0x3) = 255; }
Теперь перестал воспроизводить нажатие, хотя любой другой код исполняетсяВсе из за цикла while, возникают несостыковки с основным циклом игры. Как я понял, ты для этих дел создаешь поток, но в твоем случае нужно хукнуть основной цикл игры, и там уже ставить статус клавише. Пример хука можно поглядеть вот тут:
SA->getSignals()->onLoop += [&]() {
if (bTest)
*(int*)(0xB73458 + 0x3) = 255;
};
Что 255, что 128 - не работаетC++:*reinterpret_cast<BYTE *>(0xB73458 + 0x3) = 255; // Если не сработает, присвой 128.
Это тоже останавливаетНет возможности сейчас проверить, по крайней мере такой код работает идеально:
C++:CreateThread(nullptr, 0, [](LPVOID lpvThreadParameters) -> DWORD { while (true) *reinterpret_cast<DWORD *>(0xB73458 + 0x3) = 255; return 0U; }, nullptr, 0, nullptr);
Ну если так сделать, то оно повторяет это. Персонаж по шагу двигаетсяПопробуй именно технику отжатия/зажатия, т.е присвоить 0/128.
Ну теперь он это делает по заданному таймеруТы на время зажимай, а не в каждой итерации зажимай/отжимай.
Ну я понимаю, что 128 - воспроизведение клавиши, а 0 - отжатие. Если просто поставить 128, то он все равно на микросекунду остановится. А если делать 0/128, то он просто это делает по заданному времениСмотри, когда ты присваиваешь 128 - ты зажимаешь клавишу, когда 0 - отжимаешь.
Можешь просто присвоить 128 и он у тебя вечно бежать будет.
Попробуй писать еще и по этому адресу: 0x00B7358CНу я понимаю, что 128 - воспроизведение клавиши, а 0 - отжатие. Если просто поставить 128, то он все равно на микросекунду остановится. А если делать 0/128, то он просто это делает по заданному времени