You are not logged in.
Есть ситуация, при которой мне нужно взаимодействовать с целым поездом, при условии того, что игрок сел в произвольный вагон (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
Как вызвать, как узнать адрес этой функции?
как выполнить обратный процесс - получить хендл вагона, который мы нашли по адресу, считанному нами в 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
привет, попробуй
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
P.S. вот здесь как раз адреса этой функции не нашел https://sannybuilder.com/dev/research/gta_funcs.txt
описаны только соседние
006f5e70 30 _trainGetLastCarriage
006f5eb0 37 _trainGetCarriageHandle
Offline
вот здесь как раз адреса этой функции не нашел https://sannybuilder.com/dev/research/gta_funcs.txt
этот список не обновлялся уже много лет и сейчас есть гораздо более актуальные базы. plugin-sdk, например.
Кстати, в оригинальной SA метод CTrain::FindEngine не используется.
Offline
этот список не обновлялся уже много лет и сейчас есть гораздо более актуальные базы. plugin-sdk, например.
вот там как раз я и нашел что есть функция FindEngine, но к сожалению не смог разобраться по какому принципу определяется адрес для её вызова, потому вышел на этот старый текстовик с адресами...
функцию кстати проверил - работает как надо!
Offline
В Train.cpp можно посмотреть куда устанавливается хук. https://github.com/DK22Pac/plugin-sdk/b … n.cpp#L117
Дальше можно открыть базу IDA с паблика и посмотреть детали
Offline
В Train.cpp можно посмотреть куда устанавливается хук. https://github.com/DK22Pac/plugin-sdk/b … n.cpp#L117
Дальше можно открыть базу IDA с паблика и посмотреть детали
Как обычно, не доглядел в .cpp)
Можно чуть подробнее где эту базу найти? спс
Last edited by Marsi4eg (07-04-2020 08:21)
Offline
Offline