Показать сообщение отдельно

  #14  
Старый 07.01.2026, 17:24
wafq
Новичок
Регистрация: 15.12.2024
Сообщений: 17
С нами: 744380

Репутация: 3
По умолчанию

Цитата:
Сообщение от вайега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 которую я зареверсил с чужого софта
 
Ответить с цитированием