You are not logged in.
@~AquaZ~ - только что проверил на gta_sa_compact.exe | stripped.scm все работает.
Так, а как получить оффсет, имея хендл?
1 | 0A97: $CarStruct = car $MyCar struct |
Offline
Ой, совсем забыл такую простую команду... Спасибо! А что за адрес 0x40?
Offline
@~AquaZ~ -
1 | 00000040 immunities dd ? |
Offline
Я вот такое написал... Не вылетает и не очень-то работает...
1 2 3 4 5 6 7 8 9 10 | 0A97: 1@ = car 0@ struct while 1@ <> 0 1@ += 0x5B 9 0A8D: 2@ = read_memory 1@ size 1 virtual_protect 0 // *(byte*)(CVehicle + 0x5B9) 08BA: set 2@ bit 0 0A8C: write_memory 1@ size 1 value 2@ virtual_protect 0 // *(byte*)(CVehicle + 0x5B9) |= 0x01 1@ += 0x1B 0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0 0A97: 1@ = car 1@ struct end |
Offline
0B10 и 0B11 - это битовые операции.
Из какой библиотеки эти опкоды?
флаг нужно было выставлять для всех варонов поезда (0x5D4 - указатель на седующий вагон)
Иначе получалось, что в голове/середине поезда образовался один сошедший с рельсов вагон.
Лично я экспериментировал с поездом, состоящим из одного вагона, так что думаю не в этом дело.
Вообще могу ошибаться, но по-моему можно производить действия и над отдельными вагонами. Однажды я создал поезд, а затем во время движения удалил один вагон из середины состава. Предположение, что игра вылетит, не подтвердилось - вагон удалился, а последующие за ним вагоны отцепились и плавно остановились.
Last edited by Den_spb (11-05-2010 14:18)
Offline
Вот часть моего кода
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 0407: store_coords_to 2@ 3@ 4@ from_car 1@ with_offset 0 0 5.0 Actor.PutAt( $PLAYER_ACTOR , 2@ , 3@ , 4@ ) wait 1000 06DC: set_train 1@ accel 33.0 06DD: set_train 1@ speed 33.0 wait 5000 0AB1: @derail 1 params train 1@ :derail { 0AB1: @derail 1 params train 0@ } 0A97: 1@ = car 0@ struct while 1@ <> 0 1@ += 0x5B 9 0A8D: 2@ = read_memory 1@ size 1 virtual_protect 0 // *(byte*)(CVehicle + 0x5B9) 08BA: set 2@ bit 0 0A8C: write_memory 1@ size 1 value 2@ virtual_protect 0 // *(byte*)(CVehicle + 0x5B9) |= 0x01 1@ += 0x1B 0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0 end 0AB2: ret 0 |
Результат - поезд мгновенно замирает. На грузовую платформу заскочить невозможно, будто он едет. Стоя на платформе меня медленно сносит в сторону тягача... 1.0 US Light, Stripped
Offline
@~AquaZ~ -
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | :derail 0A97: 1@ = car 0@ struct while 1@ <> 0 0A8E: 2@ = 1@ + 0x 40 // int 0A8E: 3@ = 1@ + 0x5B 9 // int 0A8D: 4@ = read_memory 2@ size 4 virtual_protect 0 0A8D: 5@ = read_memory 3@ size 1 virtual_protect 0 08C3: clear 4@ bit 2 08C3: clear 4@ bit 17 08BD: set 5@ bit 0 0A8C: write_memory 2@ size 4 value 4@ virtual_protect 0 0A8C: write_memory 3@ size 1 value 5@ virtual_protect 0 1@ += 0x5D 4 0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0 end 0AB2: ret 0 |
Offline
Здесь ты просто вдобавок убираешь immunities - то же самое можно сделать через Car.SetImmunities?
Offline
@~AquaZ~ - Car.SetImmunities выставляет / убирает 18, 19, 23, 20, 21 биты соответственно.
Offline
Всё! Достали!!! Я возвращаюсь в моддинг!!!11 Буду тестировать скрипт...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | :derail 0A97: 1@ = car 0@ struct while 1@ <> 0 0A8E: 2@ = 1@ + 0x 40 // int 0A8E: 3@ = 1@ + 0x5B 9 // int 0A8D: 4@ = read_memory 2@ size 4 virtual_protect 0 0A8D: 5@ = read_memory 3@ size 1 virtual_protect 0 08C3: clear 4@ bit 2 08C3: clear 4@ bit 17 08BD: set 5@ bit 0 0A8C: write_memory 2@ size 4 value 4@ virtual_protect 0 0A8C: write_memory 3@ size 1 value 5@ virtual_protect 0 1@ += 0x5D 4 0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0 end 0AB2: ret 0 |
Вагоны после первого не особо летят... Просто сходят. Как бы их так отцеплять в обратном порядке? Есть флаг предыдущего вагона?
Last edited by ~AquaZ~ (19-12-2010 17:51)
Offline
В структуре вагона есть смещение 0x5D0, в котором записан указатель на предыдущий вагон.
Кстати, есть возможность расцеплять вагоны поезда без свода с рельсов. Для этого надо записать нули по смещению 0x5D0 структуры вагона N и по смещению 0x5D4 структуры вагона N-1. Для того, чтобы снова сцепить вагоны, надо заново прописать указатели по смещениям (я делал скрипт на данную тему).
Last edited by Den_spb (19-12-2010 22:21)
Offline
Offline
Поезд разделяет, но вагоны остаются позади просто очень медленно падают, а тягач летит вперёд.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | :derail 06DE: 0@ = get_train 0@ last_carriage_handle 0A97: 1@ = car 0@ struct while 1@ <> 0 0A8E: 2@ = 1@ + 0x 40 // int 0A8E: 3@ = 1@ + 0x5B 9 // int 0A8D: 4@ = read_memory 2@ size 4 virtual_protect 0 0A8D: 5@ = read_memory 3@ size 1 virtual_protect 0 08C3: clear 4@ bit 2 08C3: clear 4@ bit 17 08BD: set 5@ bit 0 0A8C: write_memory 2@ size 4 value 4@ virtual_protect 0 0A8C: write_memory 3@ size 1 value 5@ virtual_protect 0 1@ += 0x5D 0 0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0 end 0AB2: ret 0 |
Offline
Провёл древний эксперимент. Разогнал поезд и дождался отлёта вагонов. Вагоны отлетали сзади и ехали по траве рядом с тягачом, а когда настал и его час, он просто замер.
Last edited by ~AquaZ~ (20-12-2010 12:24)
Offline