#1 Re: Работа с памятью, EXE » Как найти хендл локомотива, если игрок сел в произвольный вагон? » 07-04-2020 08:19

Seemann wrote:

В Train.cpp можно посмотреть куда устанавливается хук. https://github.com/DK22Pac/plugin-sdk/b … n.cpp#L117

Дальше можно открыть базу IDA с паблика и посмотреть детали

Как обычно, не доглядел в .cpp)

Можно чуть подробнее где эту базу найти? спс

#2 Re: Работа с памятью, EXE » Как найти хендл локомотива, если игрок сел в произвольный вагон? » 06-04-2020 11:03

Seemann wrote:

этот список не обновлялся уже много лет и сейчас есть гораздо более актуальные базы. plugin-sdk, например.

вот там как раз я и нашел что есть функция FindEngine, но к сожалению не смог разобраться по какому принципу определяется адрес для её вызова, потому вышел на этот старый текстовик с адресами...

функцию кстати проверил - работает как надо! smile

#3 Re: Работа с памятью, EXE » Как найти хендл локомотива, если игрок сел в произвольный вагон? » 05-04-2020 09:48

Seemann wrote:

привет, попробуй

0A97: 0@ = car $TRAIN struct
0AA7: call_function 0x6F5E90 num_params 1 pop 1 0@ 1@ // 1@ = CTrain::FindEngine($TRAIN)
0AEB: $FIRST_CARRIAGE = car_struct 1@ handle // получить скриптовый хендл по указателю

Привет! Спасибо большое, попробую, отпишу.
Странно, но я ранее пробовал работать с опкодом 0AEB, но последующее взаимодействие с полученным хендлом приводило к крашу игры. Не исключено, конечно, что я накосячил где-то рядом, а не в 0AEB grin

P.S. вот здесь как раз адреса этой функции не нашел https://sannybuilder.com/dev/research/gta_funcs.txt
описаны только соседние
006f5e70    30    _trainGetLastCarriage
006f5eb0    37    _trainGetCarriageHandle

#4 Работа с памятью, EXE » Как найти хендл локомотива, если игрок сел в произвольный вагон? » 04-04-2020 19:00

Marsi4eg
Replies: 7

Есть ситуация, при которой мне нужно взаимодействовать с целым поездом, при условии того, что игрок сел в произвольный вагон (streakc).

Прямого опкода для получения хендла локомотива нет, есть только 06DE (last carriage) и 078A (конкретный вагон).
Если игрок сидит, скажем, в вагоне номер 3, а всего их 10, то при запросе хендла нулевого вагона будет фактически получен хендл вагона номер 3. А нужно получить локомотив.

В CTrain.h вижу есь функция

static CTrain* FindEngine(CTrain* train);

Как вызвать, как узнать адрес этой функции?

Еще есть возможность косвенно определить локомотив через получение структуры предыдущего вагона, но я тоже столкнулся со сложностью:
Допустим, наш вагон номер 3 это 1@

0A97: 2@ = car 1@ struct
2@ += 0x5D0
0A8D: 4@ = read_memory 2@ size 4 virtual_protect 0

И таким образом можно в цикле дойти до головы поезда.

Но как выполнить обратный процесс - получить хендл вагона, который мы нашли по адресу, считанному нами в 4@?

Board footer

Powered by FluxBB