21 декабря 2005
Обновлено 17.05.2023

Создание модификаций для GTA: San Andreas, часть 3

Создание модификаций для GTA: San Andreas, часть 3 - изображение обложка

В двух прошлых статьях цикла мы научились создавать отдельные компоненты миссии для GTA: San Andreas. Сегодня мы сделаем последний шаг: напишем триггер для старта миссии и научимся записывать интересные ролики на движке игры с использованием различных анимаций персонажей. Редактор к бою!

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

Создание триггера

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

018A: $marker_miss = create_checkpoint_at 503.8909 -432.0327 10.59485

03BC: $sphere_miss = create_sphere 503.8909 -432.0327 10.59485 3.0

Первая команда отвечает за создание метки на радаре по определенным координатам, вторая — за создание сферы (красная зона цилиндрической формы) с определенным радиусом (в моем случае радиус равен 3.0).

Также вы можете изменять цвет созданного маркера, используя нижеуказанную команду и изменяя значение цвета “0” на цифры от 0 до 4:

0165: set marker $check_m color to 0

Чтобы выключить маркер и уничтожить созданную вами сферу, используйте следующие команды:

0164: disable_marker $marker_miss

03BD: destroy sphere $sphere_miss

После того как сфера создана, необходимо осуществить ряд проверок, после успешного прохождения которых запустится миссия. Первым делом необходимо проверить — находится ли игрок у места старта миссии (если нет, то повторить проверку):

00D6: if 0

00FF: actor $PLAYER_ACTOR 0 ()near point on foot 154.2018 -1946.346 5.218983 radius 1.0 1.0 2.0

004D: jump_if_false ЈЈ <Метка, если условие не выполняется>

После этого необходимо удостовериться — находится ли игрок на какой-то другой миссии? Если да, то опять же проверка начинается сначала:

00D6: if 0

0038: $ON_MISSION == 0 ;; integer values

004D: jump_if_false ЈЈ <Метка, если условие не выполняется>

Наконец, проверим — существует ли вообще игрок на данном уровне? Такая команда обычно используется при сохранении, когда id игрока стирается, чтобы игра не повисла.

00D6: if 0

0256: player $PLAYER_CHAR defined

004D: jump_if_false ЈЈLabelbet11

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

0417: start_mission 135

Полностью конструкция триггера будет выглядеть следующим образом:

:Starter_mania1

0001: wait 0 ms

018A: $marker_miss = create_checkpoint_at 503.8909 -432.0327 10.59485

03BC: $sphere_miss = create_sphere 503.8909 -432.0327 10.59485 3.0

:Labelmania11

0001: wait 250 ms

00D6: if 0

0256: player $PLAYER_CHAR defined

004D: jump_if_false ЈЈLabelmania11

00D6: if 0

00FF: actor $PLAYER_ACTOR 0 ()near point on foot 503.8909 -432.0327 10.59485 radius 1.0 1.0 2.0

004D: jump_if_false ЈЈLabelmania11

00D6: if 0

0038: $ON_MISSION == 0 ;; integer values

004D: jump_if_false ЈЈLabelmania11

0164: disable_marker $marker_miss

03BD: destroy sphere $sphere_miss

0417: start_mission 135

004E: end_thread

Принципы построения миссии

Триггер создан. Переходим ко второму этапу работы. Для создания любой миссии используется так называемый скелет — основа, на которую как бы “насаживаются” все последующие действия: создание персонажей, роликов и прочие элементы. Рассмотрим, как выглядит стандартный скелет для рядовой миссии.

Для написания миссии с чистого листа используйте нижеприведенный код, заменяя все названия, заключенные в скобках < >, на свои собственные.

Весь нижеприведенный код есть не что иное, как код игровой миссии. Все слова, комментарии, команды, идущие после знака “ ; ” редактором при компиляции не учитываются, так что не экономьте на заметках!

;-------------Mission < номер миссии>---------------

:Mission <номер миссии >

0050: gosub Ј <название блока, с которого начинается код миссии>

00D6: if 0

0112: wasted_or_busted

004D: jump_if_false Ј <блок для пропуска кода провала миссии>

0050: gosub Ј <Блок провала миссии. Выполняется, если игрок умер в текущей миссии или попал в полицейский участок>

: <блок для пропуска кода провала миссии>

0050: gosub Ј <блок, в котором проводится выгрузка моделей и иные действия после данного задания>

004E: end_thread

: <название блока, с которого начинается код миссии>

0317: increment_mission_attempts

03A4: name_thread " "

0004: $onmission = 1

0110: player $PLAYER_CHAR wanted_level = 0

;Здесь вы можете помещать код миссии (загрузка моделей в память игры, создание их на ;карте и т.п.)

0247: request model <номер модели>

038B: load requested models

: <Цикл миссии1>

0001: wait 0 ms

00D6: if 0

0248: model <номер модели> available

0002: jump Ј <Цикл миссии1>

;Здесь вы можете помещать команды по созданию моделей персонажей/транспортных ;средств, пикапов, оружия на карте и т.д.

: <Цикл миссии2>

0001: wait 0 ms

;Здесь вы можете помещать различного рода проверки (добрался ли игрок до нужного ;места, убил ли того или другого персонажа…)

;Количество такого рода циклов не ограничено

0002: jump Ј <Цикл миссии2>

;Здесь вы помещаете новые действия, которые нужно сделать игроку после выполнения ;предыдущих заданий.

: <Блок, переход к которому осуществляется при выполнении всех поставленных вами условий>

01E3: text_1number_styled ‘M_PASS’ 10000 5000 ms 1

0109: player $PLAYER_CHAR money += 10000

0394: play music 2

0110: clear_player $PLAYER_CHAR wanted_level

0051: return

: <Блок провала миссии. Выполняется, если игрок умер в текущей миссии или попал в полицейский участок>

00BA: text_styled “M_FAIL” 4000 ms 1 ; MISSION FAILED!

0051: return

: <блок, в котором проводится выгрузка моделей и иные действия после данного задания>

0004: $ONMISSION = 0

00D8: mission_cleanup

0051: return

После того как миссия будет написана, необходимо поместить ее в файл Maim.scm игры перед следующей строкой:

DEFINE EXTERNAL_SCRIPT_START AAA

Осталось добавить миссию в список игровых. Для этого ищем строчку, начинающуюся на DEFINE MISSIONS. По стандарту текущее значение игровых миссий равно 135, но поскольку мы добавляем одну новую миссию, меняем текущее значение 135 на 136.

После этого найдите следующую строку:

DEFINE MISSION 134 AT ЈЈBUYPRO1_1

После нее добавьте:

DEFINE MISSION 135 AT ЈЈMission <номер миссии>

При этом не забудьте изменить комментарий < номер миссии> на номер, указанный вами в самом начале.

Видеокамера

Мы подошли к самому ответственному моменту: созданию ролика в San Andreas Mission Builder. Начнем с самого простого: вы должны научиться управлять камерой в SAMB. Чтобы установить камеру по определенным координатам, используется следующая команда:

015F: set camera position 664.9277 -479.6112 16.1668 0.0 0.0 0.0

Где 664.9277 -479.6112 16.1668 — координаты, которые определяют позицию камеры. После того как вы выбрали место, с которого будет вестись показ ролика, можно приступать к серии следующих команд, определяющих, куда будет направлена камера. Для того чтобы мгновенно направить камеру в определенную точку, используется следующая команда:

0160: point camera 665.8948 -479.5685 16.4175 2

Чтобы камера плавно переходила от одной точки к другой, используется команда:

0160: point camera 665.8948 -479.5685 16.4175 1

Указать время, в течение которого камера будет менять свое направление, вам поможет команда:

0460: set camera pointing time 0.0 5000

Где 5000 — время (5 сек), в течение которого камера будет плавно менять свое направление.

Чтобы не запутаться в обилии различных команд, рассмотрим конкретный пример:

:Cj_Test

0001: wait 0 ms

015F: set camera position 2496.653 -1668.981 16.1349 0.0 0.0 0.0

0160: point camera 2494.693 -1685.513 16.33689 2

0001: wait 3000 ms

0160: point camera 2481.854 -1654.274 17.24341

0460: set camera pointing time 0.0 5000

0001: wait 5000 ms

004E: end thread

Камера направлена из определенной позиции на дом Сиджея, затем, через 3000 мс или 3 сек, она плавно начинает менять свое положение в течение 5000 мс или 5 сек, после чего ролик заканчивается.

Если вы хотите, чтобы помимо направления камеры изменилась и ее позиция, то перед командой

0160: point camera 665.8948 -479.5685 16.4175 1

вставьте следующую команду:

015F: set camera position 664.9277 -479.6112 16.1668 0.0 0.0 0.0

Чтобы направить камеру на транспортное средство, используйте следующую команду:

0158: camera on vehicle $my_car 15 2

Где my_car — название созданного вами транспортного средства, а цифра 2 — показатель, что камера мгновенно будет направлена на средство передвижения. Если вам нужно, чтобы камера постепенно меняла свою позицию, то вместо цифры 2 поставьте 1.

Для направления камеры на персонажей подходит команда:

0159: camera on ped $my_ped 15 2

Видеоэффекты

Теперь несколько усложним задачу, применим в ролике различные видеоэффекты. Конкретно: тряску экрана (shake), затемнение экрана (fade), эффекты взрывов и некоторые другие. И начнем мы с затемнения экрана, которое применяется между различными сценами игры.

Создается затемнение следующей командой:

016A: fade 0 () 1500 ms

Цифра 0 включает режим затемнения, 1500 — время в мс, за которое произойдет затемнение экрана. Очень удобно во время затемнения создавать авто, производить различные манипуляции, которые рядовой геймер видеть не должен. Но для этого после команды затемнения экрана нужно поставить задержку по времени, равную времени затемнения, прежде чем производить какое-либо действие, иначе игрок еще до того, как свет померкнет, увидит все действия. Ну а когда “скрытые” действия осуществлены, нужно использовать команду, чтобы снять затемнение экрана:

016A: fade 1 () 1500 ms

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

0003: shake camera 40

Цифра 40 — определяет силу тряски камеры. Если поставить 50, то экран будет чуть-чуть подергиваться. Если впечатать значение 250 — начнется настоящее землетрясение. Максимальное значение параметра — 500. Используя эффекты взрывов и огня вкупе с тряской экрана, можно получить красивую картинку! Чтобы создать взрыв по определенным координатам, подходит команда

020C: create explosion with radius 7 at 567.98 1234.3 21.7

Где 7 — радиус взрывной волны, 567.98 1234.3 21.7 — координаты, по которым будет создан взрыв. Напоследок хотелось бы упомянуть про так называемый широкоэкранный режим, вызываемый следующей командой:

02A3: toggle widescreen 1 (on)

Отключается широкий экран командой:

02A3: toggle widescreen 0 (off)

Во многих роликах бывает нужно “заморозить” игрока в текущей позиции. Вызывается “заморозка” командой

01B4: set player $PLAYER_CHAR frozen state 0 (frozen)

А отключается командой

01B4: set player $PLAYER_CHAR frozen state 1 (unfrozen)

Нажатые клавиши

Во многих миссиях необходимо ввести проверку или ряд проверок на нажатие той или иной клавиши. Например, с помощью проверки на нажатие клавиши можно организовать вызов телохранителя, или написать собственный код нитро, или даже внедрить в игру режим замедления времени… При проверке на нажатые клавиши используется следующая команда: 00E1: key pressed 0 13

Цифра 13 означает тип нажатой клавиши, в данном случае — это клавиша смены камеры. Рассмотрим конкретный пример: я хочу, чтобы при нажатии клавиши смены камеры проигралась определенная игровая мелодия.

:DO1

0001: wait 0 ms

00D6: if 0

00E1: key pressed 0 13

004D: jump if false ЈЈDO1

0394: play music 2

004E: end thread

На примере все четко видно: команда 00D6: if 0 означает, что поставлено определенное условие, а именно 00E1: key pressed 0 13. Если нажата клавиша 13, то условие выполняется, проигрывается игровая мелодия, и на этом мод прекращает свое существование, если же нет — проверка начинается сначала и будет продолжаться до тех пор, пока игрок не нажмет клавишу.

С цифровыми значениями различных клавиш вы можете ознакомиться на наших дисках в разделе “ По журналу”/Игрострой”.

Анимация персонажей

Во время создания ролика актерам (игровым персонажам) можно присваивать некоторые анимации игры, чтобы они не стояли без движения. Каждой анимации соответствует своя команда. Если вы хотите присвоить какому-либо персонажу анимацию, используйте одну из ниже перечисленных команд, заменяя имя актера PLAYER_ACTOR на название анимируемого персонажа.

Анимация персонажа задается командой:

0605: unknown_action_sequence $PLAYER_ACTOR “CAR_HOOKERTALK” “PED” 4.0 1 0 0 0 2000

PLAYER_ACTOR — название актера, к которому будет применена анимация, “CAR_HOOKERTALK” “PED” — название анимации, 2000 — время, в течение которого будет проигрываться анимация персонажа.

* * *

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

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

Комментарии
Чтобы оставить комментарий,Войдите или Зарегистрируйтесь