Создаем миссию [Уроки по созданию модов GTA SA]

Скриптинг GTA. Инструкции по скриптингу в GTA.
Автор
Сообщение
Аватара пользователя
Не в сети Vovka
Автор темы
Продвинутый

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

Вот сам скрипт миссии, мы будем его подробно разбирать

:MYMISS //Стартовый поток
thread 'SA' //Называем его ‘SA’
gosub @START //Прыгаем на поток нашей миссии
if
wasted_or_busted //Во время миссии эта проверка практически не используется..
else_jump @MYMISS_1 // .. но всё-таки
gosub @MYMISS_2 //они должны быть в скрипте

:MYMISS_1
wait 100
gosub @MYMISS_OFF
end_thread

:START
increment_mission_attempts
fade 0 0
054C: use_GXT_table 'INTRO1' //Теперь тексты миссии будут использоватся из GXT таблицы 'INTRO1'
$ONMISSION = 1 // integer values //Меняем значение переменной на 1, это значит, что миссия включена

:START_01
IF AND
Player.Defined($PLAYER_CHAR) //Проверяем, жив ли игрок
wait 100
jf @START_01

:START_1
01B5: force_weather 1 //Ставим погоду
00C0: set_current_time 20 00 //И время
04E4: unknown_refresh_game_renderer_at 1350.1012 -665.0075 //Рендерим территорию в заданных координатах
03CB: set_camera 989.2311 -852.3323 95.4973 //Прорисовываем местность
0826: toggle_hud 0 //Выключаем интерфейс
02A3: toggle_widescreen 1 //Включаем широкий экран
IF AND
Player.Defined($PLAYER_CHAR) //На всякий случай проверяем ещё разок
wait 100
jf @START_2
Player.CanMove($PLAYER_CHAR) = False //Замораживаем игрока
Actor.PutAt($PLAYER_ACTOR, 1349.0804, -661.3611, 109.1349 ) //Ставим в координаты
Actor.Angle($PLAYER_ACTOR) = 190.0 //Поворачиваем его

:START_2
Model.Load(#MAVERICK) //Загружаем модель

:START_3
wait 100
if AND
Model.Available(#MAVERICK) //Если модель загружена..
jf @START_3
$HELI = Car.Create(#MAVERICK, 1290.8029, -788.6552, 96.4609 ) //..То создаём вертолёт в заданных координатах
Car.Angle($HELI) = 218.0 //Поворачиваем её на 218 градусов
0229: set_car $HELI color_to 11 0 //Устанавливаем цвет
Car.SetImmunities($HELI, 1,1,1,1,1) //Ставим иммунитеты.. на всякий случай
fade 1 1000 //Ставим фейд
015F: set_camera_position 1354.7966 -663.8769 109.138 0.0 0.0 0.0 //Устанавливаем камеру
0160: point_camera 1354.1356 -665.1297 109.138 2 //И ее поинт
wait 3000 //ждем 3 секунды
0936: set_camera 1354.7966 -663.8769 109.138 position_to 1299.8623 -778.5202 96.4609 15000 ms unknown 1
0920: point_camera 1354.1356 -665.1297 109.138 transverse_to 1290.681 -788.3284 96.4609 15000 ms unknown 1
// Этими опкодами делаем плавное передвижение камеры из одной точки в другую
wait 15000 //Ждем 15 секунд, пока камера не передвинется
0826: toggle_hud 1 //Включаем интерфейс
02A3: toggle_widescreen 0 //Выключаем широкий экран
Camera.SetBehindPlayer //Ставим игровую камеру
Camera.Restore_WithJumpCut
Player.CanMove($PLAYER_CHAR) = True //Размораживаем игрока
$MARK = Marker.CreateAboveCar($HELI) //Создаём маркер над вертолетом
0006: $UNL = 1 ;; integer values //Создаем переменную $UNL, она будет служить для управления выгрузки моделей

:START_4
IF AND
Player.Defined($PLAYER_CHAR)
wait 100
jf @FAILED //Если игрок убит, то переходим на поток, где выключается миссия и выгружаются модели
if and
wait 100
00EC: actor $PLAYER_ACTOR 0 ()near_point 1290.8029 -788.6552 radius 30.0 30.0 //Если игрок стоит рядом с вертолетом..
jf @START_4
Model.Load(#BALLAS1) //.. то загружаем модель балласа

:START_5
if
Model.Available(#BALLAS1) //.. Если модель загружена
wait 100
jf @START_5
49@ = Actor.Create(Mission2, #BALLAS1, 1293.4708, -799.9387, 95.4609 ) //То создаем балласа
Player.CanMove($PLAYER_CHAR) = FALSE //Замораживаем игрока
0826: toggle_hud 0 //Выключаем хад
02A3: toggle_widescreen 1 //Делаем широкий экран
015F: set_camera_position 1302.1816 -786.0975 96.4554 0.0 0.0 0.0 //Устанавливаем камеру
05CB: unknown_action_sequence 49@ $HELI 10000 //Баллас садится в вертолет
wait 300
0159: camera_on_ped 49@ 15 2 //А камера за ним следит
wait 5000 //Ждем 5 секунд
0826: toggle_hud 1 //Включаем интерфейс
02A3: toggle_widescreen 0 //Выключаем широкий экран
Camera.SetBehindPlayer
Camera.Restore_WithJumpCut //Ставим обычную игровую камеру камеру
Player.CanMove($PLAYER_CHAR) = True //Размораживаем игрока
0724: flying_vehicle $HELI follow_and_attack_actor $PLAYER_CHAR radius 100.0 //Даём команду следовать вертолету за //игроком
Car.SetImmunities($HELI, 0,0,0,0,0) //Выключаем иммунитеты вертолету

:START_6
Model.Load(#AK47) //Загружаем модель игрока
0006: $UNL = 2 //Обновляем переменную для выгрузки моделей

:START_7
if AND
Player.Defined($PLAYER_CHAR)
wait 100
jf @FAILED //Если игрок убит, то переходим на поток, где выключается миссия и выгружаются модели
if
Model.Available(#AK47) //Если модель оружия загружена
wait 100
jf @START_7
01B2: give_actor $PLAYER_ACTOR weapon 30 ammo 300 //То даем её игроку

:START_8
if and
Player.Defined($PLAYER_CHAR)
wait 100
jf @FAILED //Если игрок убит, то переходим на поток, где выключается миссия и выгружаются модели
if and
Car.Wrecked($HELI) //Если вертолет взорван
wait 100
jf @START_8
01E3: text_1number_styled 'M_PASSR' 10 5000 ms 1 // MISSION PASSED!~n~~w~RESPECT +
//То выводим текст ‘Mission Passed’
0998: add_respect 5 //Добавляем Respect
0394: play_music 1 //Включаем музыку после завершения миссии
Player.ClearWantedLevel($PLAYER_CHAR) //Очищаем уровень розыска
Model.Destroy(#AK47) //Выгружаем модель оружия
Marker.Disable($MARK) //Выключаем маркер
Car.Destroy($HELI) //Убираем вертолет
Model.Destroy(#MAVERICK) //И выгружаем моедль
Actor.DestroyInstantly(49@) //Убираем балласа
Model.Destroy(#BALLAS1) //И его модель
01B7: release_weather //Выгружаем погоду
$ONMISSION = 0 // integer values //Меняем переменную
mission_cleanup //Выгружаем миссию
return //Возвращаемся
end_thread //Закрываем поток, хотя эта команда игрорируется

:MYMISS_2
00BA: text_styled 'M_FAIL' 5000 ms 1 // В случае проигрыша выводим текст ‘миссия провалена’
return

//А это скрипт, работающий в случае провала миссии
:MYMISS_OFF
$ONMISSION = 0 //Меняем переменную
mission_cleanup //Выгружаем миссию
if AND
$UNL >= 1 //Если игрок прошел до определенного момента в миссии, то выгружаем нужные модели, а если нет, то
//завершаем поток
jf @MYMISS_OFF1
wait 100
Marker.Disable($MARK) //Выключаем маркер
Car.Destroy($HELI) //Убираем вертолет
Model.Destroy(#MAVERICK) //И выгружаем модель
01B7: release_weather //Выгружаем погоду
if AND
$UNL >= 2 Если игрок прошел до определенного момента в миссии, то выгружаем нужные модели, а если нет, то
//завершаем поток
jf @MYMISS_OFF1
Actor.DestroyInstantly(49@) //Убираем балласа
Model.Destroy(#BALLAS1) //И его модель
Model.Destroy(#AK47) //Выгружаем модель оружия
return

:MYMISS_OFF1
return

//Тот же самый поток, но используется по-иному
:FAILED
00BA: text_styled 'M_FAIL' 5000 ms 1
$ONMISSION = 0 // integer values
mission_cleanup
if AND
$UNL >= 1
jf @MYMISS_OFF1
wait 100
Marker.Disable($MARK)
Car.Destroy($HELI)
Model.Destroy(#MAVERICK)
01B7: release_weather
if AND
$UNL >= 2
jf @MYMISS_OFF1
Actor.DestroyInstantly(49@)
Model.Destroy(#BALLAS1)
Model.Destroy(#AK47)
end_thread

Изображение

Теперь мы создали простую миссию, практически лишенную багов (благодаря постоянным проверкам).
Ну что ж, исходя из этой статьи, вы без особых проблем сможете делать качественные миссии, ничем не уступающие от конкурентов ;)
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Скриптинг в GTA San Andreas»