#1 04-04-2020 19:00

Marsi4eg
Registered: 29-03-2020
Posts: 4

Как найти хендл локомотива, если игрок сел в произвольный вагон?

Есть ситуация, при которой мне нужно взаимодействовать с целым поездом, при условии того, что игрок сел в произвольный вагон (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@?

Offline

#2 05-04-2020 04:44

Seemann
Registered: 07-08-2006
Posts: 2,090

Re: Как найти хендл локомотива, если игрок сел в произвольный вагон?

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

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

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

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 // получить скриптовый хендл по указателю

Offline

#3 05-04-2020 09:48

Marsi4eg
Registered: 29-03-2020
Posts: 4

Re: Как найти хендл локомотива, если игрок сел в произвольный вагон?

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

Offline

#4 06-04-2020 03:01

Seemann
Registered: 07-08-2006
Posts: 2,090

Re: Как найти хендл локомотива, если игрок сел в произвольный вагон?

вот здесь как раз адреса этой функции не нашел https://sannybuilder.com/dev/research/gta_funcs.txt

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

Кстати, в оригинальной SA метод CTrain::FindEngine не используется.

Offline

#5 06-04-2020 11:03

Marsi4eg
Registered: 29-03-2020
Posts: 4

Re: Как найти хендл локомотива, если игрок сел в произвольный вагон?

Seemann wrote:

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

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

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

Offline

#6 06-04-2020 16:37

Seemann
Registered: 07-08-2006
Posts: 2,090

Re: Как найти хендл локомотива, если игрок сел в произвольный вагон?

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

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

Offline

#7 07-04-2020 08:19

Marsi4eg
Registered: 29-03-2020
Posts: 4

Re: Как найти хендл локомотива, если игрок сел в произвольный вагон?

Seemann wrote:

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

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

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

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

Last edited by Marsi4eg (07-04-2020 08:21)

Offline

#8 09-04-2020 00:16

Seemann
Registered: 07-08-2006
Posts: 2,090

Re: Как найти хендл локомотива, если игрок сел в произвольный вагон?

Offline

Board footer

Powered by FluxBB