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([email protected]) 038B: load_requested_models 0AB2: ret 0 :LOAD_MODEL_END // Функция загрузки модели goto @PASTE_CAMERA_END :PASTE_CAMERA 04E4: refresh_game_renderer_at [email protected] [email protected] 015F: set_camera_position [email protected] [email protected] [email protected] rotation 0.0 0.0 0.0 0160: set_camera_point_at [email protected] [email protected] [email protected] 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 [email protected] [email protected] -= 1.0 [email protected] = Car.Create([email protected], [email protected], [email protected], [email protected]) car.Angle([email protected]) = [email protected] Model.Destroy([email protected]) 0AB2: ret 1 [email protected] :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 [email protected] == 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
Copy link
Edit on GitHub