000178. RRR-файлы в GTA SA. Как их делать и использовать-

RRR-файлы в GTA SA. Как их делать и использовать?|В этом уроке мы познакомимся с очередным типом файлов. Научимся их создавать и использовать в игре.|wmysterio|wmysterio||||Привет, друзья! Сегодня мы будем изучать файлы путей автомобилей, которые имеют расширение "RRR". Эти файлы являются бинарными и обычно хранятся в IMG-архиве за адресом:

X:\GTA SA\data\Paths\carrec.img

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

Вот для таких случаев часто и создают RRR-файлы, которые хранят все точки маршрута со всеми углами машины, параметрами двигателя, моменты когда она притормаживает и всё в таком духе. В итоге мы имеем так называемый "Playback record", который мы будем называть маршрутом.

Главный недостаток ( а иногда и преимущество ), что автомобиль теряет физические свойства. Иными словами будет выполнять воспроизведение маршрута в таком виде, в котором он был записан. Если между точками находятся автомобили или другие объекты, то машина будет проходить сквозь них, а другой транспорт будет отскакивать, как от поезда.

Для начала научимся создавать путь. Для этого часто используют старенький скрипт от Seemann'а, который имеет название Carrec.cs. Его желательно открыть ( исходники прилагаются ) и настроить под себя. В основном нужно настраивать 3 параметра:

КонстантаЗначение

REC_INTERVAL_MS

Отвечает за то, как часто будет делаться новая запись точки маршрута. Чем значение меньше, тем чаще будет добавлятся точка.

FILE_PATH

Путь к выходному файлу.

KEY_REC

Код клавиши, которая запускает и останавливает запись маршрута ( в сочетании с клавишей Shift` )

Скрипт работает по следующему принципу: садимся в нужный транспорт, нажимаем клавиши Shift+<kbd>R. Далее начинаем ехать как и куда Вам угодно. Скрипт будет записывать точки маршрута. Когда нужно остановится, нажимаем эту комбинацию клавиш ещё раз и путь готов!

× **ВАЖНО:** имя файла обязательно должно содержать числа, больше за ноль! Рекомендую сначала проверить доступность имени в архиве ( нужно, чтобы такого файла небыло ), чтобы случайно не перезаписать существующий файл.× **Примечание:** рекомендую для записи маршрута использовать тот же транспорт, что Вы планируете создавать в скрипте. Иначе могут быть нестыковки.

Для успешной загрузки такого пути, нам необходимо добавить его в "carrec.img" спомощью любого IMG-редактора. Ну и с конце писать скрипт. Рассмотрим базовые опкоды для работы с RRR-путями:

// Загружает путь
07C0: load_path 908

// Проверка: путь загрузился?
07C1: path 908 available

// Выгружает путь с памяти
0873: release_path 908

908 в этом случае является именем файла, поэтому всегда сохраняйте файлы с числовым именем, как уже было сказано выше. После этого мы можем заставить транспорт воспроизвести наш путь следующими опкодами:

// Машина будет ехать по загруженному пути:
05EB: assign_car $hCar to_path 908

// Машина будет ехать по загруженному пути.
// Как только путь достигнет конца, воспроизведение начнётся сначала
085E: assign_car $hCar to_looped_path 908

// Проверка: транспорт едет по какому-то пути?
060E: car $hCar assigned_to_path

// Установить скорость воспроизведения пути. Значения могут быть от 0.0 до 1.0!
// Увы, маршрут по времени выполнения будет чуть быстрее, поэтому лучше устанавливать
// скорость, которая будет более-менее соответствовать скорости в момент записи пути.
06FD: set_car $hCar speed_on_path_to 1.0

// Пропускает маршрут. Я не тестировал этот опкод, но догадываюсь, что значение 1.0
// отвечает за позицию, в которой остановить машину ( по времени выполнения ).
// Значения могут быть от 0.0 до 1.0!
0706: advance_car $hCar further_along_path 1.0

// Останавливает воспроизведение маршрута и устанавливает его в конец пути по времени.
06C5: release_car $hCar from_path

Поскольку маршрут сам по себе является "записью воспроизведения", скорость мы приравниваем к общей длительности маршрута. Это дополнительно позволяет нам использовать опкоды, которые бывают пелезными при определённых обстоятельствах:

// Окончательно останавливает воспроизведение маршрута
05EC: release_car $hCar from_path

// Приостанавливает воспроизведение маршрута ( ставит на паузу )
05ED: freeze_car $hCar while_on_path

// Продолжает воспроизведение маршрута ( отмена паузы )
05EE: unfreeze_car $hCar while_on_path

Следующие опкоды я не тестировал, поэтому их описания могут быть неточными:

// Воспроизводит путь, но управление осуществляется с помощью искусственного интеллекта
0705: car $hCar assign_to_path 908 and_drive_normal

// Изменяет способ воспроизведения со строгого на искусственный интеллект
099B: unknown_enable_car $hCar collision_on_path

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

Ну и, наконец, пример скрипта, где машина будет ехать по записанному маршруту:

{$CLEO}

// ! Нужно создать путь 900

:PATH
thread 'PATH'
wait 5000
Model.Load(#COMET) 
07C0: load_path 900
038B: load_requested_models

:PATH_CHECK1
wait 0
if and 
Model.Available(#COMET) 
07C1: path 900 available
jf @PATH_CHECK1 
0@ = Car.Create(#COMET, -1596.8551, -1604.5587, 35.8839)
Car.Angle(0@) = 293.6649 
0430: put_actor $PLAYER_ACTOR into_car 0@ passenger_seat 0 
Model.Destroy(#COMET)
05EB: assign_car 0@ to_path 900
06FD: set_car 0@ speed_on_path_to 0.97

:PATH_CHECK2
wait 0
if
8256: not player $PLAYER_CHAR defined
then
jump @PATH_CAR_CLEAR
end
if
856E: not car 0@ defined
then
jump @PATH_RELEASE
end
if or
00DB: actor $PLAYER_ACTOR in_car 0@
01C1: car 0@ stopped
then
jump @PATH_CAR_CLEAR
end
jump @PATH_CHECK2 

:PATH_CAR_CLEAR
if
056E: car 0@ defined
then 
06C5: release_car 0@ from_path
Car.RemoveReferences(0@)
end

:PATH_RELEASE
0873: release_path 900
0A93: end_custom_thread

Этим способом я делал гонки для мода 'Проект "Неизвестный": Чёрный список', где соперник использовал путь, тем самым его "интеллект" был намного выше, чем могли бы быть без такого маршрута:

Надеюсь, этот материал был для Вас полезным. На этом у меня всё. С Вами попрежднему - wmysterio.|1125|1|0|38913452png640359320`180``||rrr_fajly_v_gta_sa_kak_ikh_delat_i_ispolzovat|1510794350

Last updated