Сообщение от
вайега52
int __stdcall sub_10082582(CScriptThread *a1) { unsigned int Int; // esi Int = CScriptThread::GetInt(a1); *(_WORD *)(2 * Int + 0xB73458) = CScriptThread::GetInt(a1); return 0;
Ну кстати похоже на правду
Спасибо большое всем кто отписался и не прошел мимо, сейчас буду пробовать
Реализация:
Код:
// game-keys (как в 0B56): 0xB73458 + 2*index
static void SetGameKeyState(int key, short state) {
if (GAME_KEY_STATE_ADDR (GAME_KEY_STATE_ADDR + key * 2, state);
}
// пример использования в движении:
if (g_useGameKeyState) {
SetGameKeyState(1, -128); // forward/back
SetGameKeyState(0, 0); // left/right
SetGameKeyState(16, 255); // run
SetGameKeyState(14, 0); // jump
}
https://vkvideo.ru/video-235216022_456239017
По дебагу видно, GameKey fwd/run реально меняются, но движения всё равно нет. Значит amz не читает B73458 как game‑keys.
Сделал пошаговую “скан‑панель” прямо в меню, чтобы без IDA увидеть реальные оффсеты
https://vkvideo.ru/video-235216022_456239018
Мой максимум
Сообщение от
вайега52
Если вам нужно переписать lua/cleo, то просто берете таблицу опкодов:
Таблица соответствия опкодов
wiki.blast.hk
Ищите опкод, и если он является GTA-шным, а не добавляется SAMPFUNCS-ом (а setGameKeyState как раз таки является), то подключаете plugin-sdk в свой проект и вызываешь его при помощи функций псдк:
Другое - С/С++ Вопрос - Ответ
Первый пример кода - не код на языке C++ А как у него работает?
www.blast.hk
Единственное, в том примере не указано то, как получать возвращаемое значение - надо лишь после всех аргументов, передать указатель на переменную, в которую должен записаться результат.
По поводу опкодов SF и setGameKeyState в частности, то тут нужно самому реверсить sampfuncs.asi и смотреть реализацию этих опкодов. Проще всего это сделать в IDA через: Search -> Sequence of bytes -> Ввести нужный опкод и выставить настройки, как на скрине
-> Найти строку, где будет push ваш_опкодh и далее перейти в каллбек функцию.
Чтобы тебе не тратить время, сам нашел реализацию клавиши:
C++:
Код:
int
__stdcall
sub_10082582
(
CScriptThread
*
a1
)
{
unsigned
int
Int
;
// esi
Int
=
CScriptThread
::
GetInt
(
a1
)
;
*
(
_WORD
*
)
(
2
*
Int
+
0xB73458
)
=
CScriptThread
::
GetInt
(
a1
)
;
return
0
;
}
Сейчас буду пробовать plugin sdk
в плагине ниче нового
NewKeyState = 0xB73190
OldKeyState = 0xB72F20
CPad::GetPad = 0x53FB70
CPad::UpdatePads = 0x541DD0
Это совпадает с тем, что я уже зареверсил (особенно UpdatePads и New/OldKeyState)
plugin‑sdk полезен как справочник по структурам и базовым адресам, но не даёт готового решения для setGameKeyState
Итог: Пока что единственная рабочая ***ня это tempkeystate которую я зареверсил с чужого софта