000153. Пример полноценной миссии "Ограбление"
Пример полноценной миссии "Ограбление"||wmysterio|wmysterio|[email protected]|||Всем привет! Мы продолжаем писать полноценные миссии, и сегодня будем писать скрипт ограбления. Заодно и познакомимся с магнитами поближе, так как ограбления будут на вертолёте! Допустим, что Торино понадобилась помощь CJ в одной операции. Согласно ней, CJ должен украсть 3 патриота, которые стоят в троих разных посёлках.
Начнём, конечно, со стартера, который поменяет только координаты названия миссии с предыдущего примера полноценной миссии:
{$CLEO}
thread 'STARTER'
while true
wait 0
if
$ONMISSION == 0
then
03A1: show_sphere_at 401.501 2539.6433 16.5452 radius 2.0
if
00EC: actor $PLAYER_ACTOR sphere 0 near_point 401.501 2539.6433 radius 2.0 2.0
then
Player.CanMove(0, 0)
Actor.SetImmunities($PLAYER_ACTOR, 1, 1, 1, 1, 1)
01F0: set_max_wanted_level_to 0
0ACF: show_formatted_styled_text "HEIST" time 4000 style 2
fade 0 1000
0A94: start_custom_mission "HEIST"
wait 1000
end
end
end
|
Точка старта будет в регионе кладбища самолётов.
По просьбе одного из пользователей, я добавлю scm-функции, которые будем использовать на примере этот миссии. Прежде всего, на ум попадет написать ф-ю загрузки моделей, а также установка камеры. Воспользуемся такими "прототипами":
goto @LOAD_MODEL_END
:LOAD_MODEL
Model.Load(0@)
038B: load_requested_models
0AB2: ret 0
:LOAD_MODEL_END // Функция загрузки модели
goto @PASTE_CAMERA_END
:PASTE_CAMERA
04E4: refresh_game_renderer_at 0@ 1@
015F: set_camera_position 0@ 1@ 2@ rotation 0.0 0.0 0.0
0160: set_camera_point_at 3@ 4@ 5@ switchstyle 2
0AB2: ret 0
:PASTE_CAMERA_END // Функция установки камеры
goto @RESTORE_CAMERA_END
:RESTORE_CAMERA
Camera.Restore_WithJumpCut
Camera.SetBehindPlayer
0AB2: ret 0
:RESTORE_CAMERA_END // Функция, которая возвращает камеру в обычное положение
|
В результате мы имеем 3 функции:
0AB1: call_scm_func @LOAD_MODEL 1 #ADMIRAL
0AB1: call_scm_func @PASTE_CAMERA 6 position 401.501 2539.6433 16.5452 point 401.501 2539.6433 16.5452
0AB1: call_scm_func @RESTORE_CAMERA 0
|
Давайте думать, какие ещё полезные функции можно добавить. К примеру мы можем написать функцию спавна транспорта. Она будет иметь примерно такой вид:
goto @SPAWN_CAR_END
:SPAWN_CAR
0AB1: call_scm_func @LOAD_MODEL 1 0@
3@ -= 1.0
5@ = Car.Create(0@, 1@, 2@, 3@)
car.Angle(5@) = 4@
Model.Destroy(0@)
0AB2: ret 1 5@
:SPAWN_CAR_END
|
Мы воспользовались функцией загрузки внутри функции спавна. На выходе мы получаем хендл транспорта. Сигнатура самой функции будет такой:
0AB1: call_scm_func @SPAWN_CAR 5 model #ADMIRAL at 401.501 2539.6433 16.5452 angle 31.1548 handle_as $CAR
|
Следует участь, что описание не имеет значения. Краткий пример такой функции естественно будет таким:
Также полезно будет написать функцию, которая будет управлять за режимы экрана(для видеоролика или обычная). Следующий код будет таким:
goto @ENABLE_SCREEN_MODE_END
:ENABLE_SCREEN_MODE
00BE: text_clear_all
03E6: remove_text_box
if
0@ == 1
then
0826: enable_hud 0
0581: enable_radar 0
02A3: enable_widescreen 1
else
0826: enable_hud 1
0581: enable_radar 1
02A3: enable_widescreen 0
end
0AB2: ret 0
:ENABLE_SCREEN_MODE_END
|
Сигнатура этого прототипа будет такой:
0AB1: call_scm_func @ENABLE_SCREEN_MODE 1 as 1
|
Думаю, такое количество функций будет достаточно. Начнём скриптить миссию. Начало будет, как обычно, такое:
Теперь мы увидим сцену, в которой Торино звонит CJ со своим очередным заданием:
Идёт разработка...
|19|1|0||primer_polnocennoj_missii_ograblenie|1393619746