Cleo-миссии|В этом уроке мы рассмотрим как создавать миссии, используя CLEO.|wmysterio|wmysterio||||Как и в main.scm в Cleo можно создавать миссии. Преимущество в Cleo в том, что количество миссий неограниченное! То есть если в мейне максимум 200, то в Cleo может быть 500, 600 и так дальше. Сегодня мы напишем первую Cleo-миссию ;)
Что бы компилятор сделал Cleo-миссию, нужно указать ему в директиве расширение "*.cm" ( custom mission ):
{$cleo .cm}
Дальше указать код миссии. Вот очень стабильный код миссий:
Обратите внимание, что завершается поток командой "end_thread"! После компиляции, SB создаст файл "*.cm" в папке Cleo. Вы можете поместить его и в другую директорию, например в папку "CLEO\MISSIONS", что бы отделить написанные миссии от Cleo-скриптов.
Давайте напишем миссию, что бы на CJ-я нападали три тела и нужно их убить. После убийства мы получим 1000$.
{$CLEO .cm}
//------------- Mission ---------------
:MISSION
thread 'MISSION'
gosub @MISSION_29_57
if
wasted_or_busted
jf @MISSION_29_46
gosub @MISSION_29_144
:MISSION_29_46
$ONMISSION = 0
mission_cleanup
end_thread
:MISSION_29_57
increment_mission_attempts
$ONMISSION = 1
model.Load(#BALLAS1)
038B: load_requested_models
:MISSION_1
wait 0
if
model.Available(#BALLAS1)
jf @MISSION_1
actor.PutAt($PLAYER_ACTOR, 2488.8188, -1678.9363, 12.3361)
actor.Angle($PLAYER_ACTOR) = 7.1576
0@ = actor.Create(7, #BALLAS1, 2484.7991, -1660.7439, 12.3359)
actor.Angle(0@) = 199.2093
077A: set_actor 0@ acquaintance 4 to_actors_pedtype 0
1@ = actor.Create(7, #BALLAS1, 2480.4097, -1661.7654, 12.3437)
actor.Angle(1@) = 207.3561
077A: set_actor 1@ acquaintance 4 to_actors_pedtype 0
2@ = actor.Create(7, #BALLAS1, 2490.8955, -1661.2186, 12.3359)
actor.Angle(2@) = 167.8757
077A: set_actor 2@ acquaintance 4 to_actors_pedtype 0
Camera.Restore_WithJumpCut
Camera.SetBehindPlayer
wait 2000
fade 1 1000
wait 1000
05E2: AS_actor 0@ kill_actor $PLAYER_ACTOR
05E2: AS_actor 1@ kill_actor $PLAYER_ACTOR
05E2: AS_actor 2@ kill_actor $PLAYER_ACTOR
actor.SetImmunities($PLAYER_ACTOR, 0, 0, 0, 0, 0)
player.CanMove($PLAYER_CHAR) = true
3@ = marker.CreateAboveActor(0@)
4@ = marker.CreateAboveActor(1@)
5@ = marker.CreateAboveActor(2@)
07E0: set_marker 3@ type_to 0
07E0: set_marker 4@ type_to 0
07E0: set_marker 5@ type_to 0
:MISSION_2
wait 0
if
actor.Dead(0@)
then
marker.Disable(3@)
end
if
actor.Dead(1@)
then
marker.Disable(4@)
end
if
actor.Dead(2@)
then
marker.Disable(5@)
end
if AND
actor.Dead(0@)
actor.Dead(1@)
actor.Dead(2@)
then
jump @MISSION_3
end
jump @MISSION_2
:MISSION_3
wait 0
gosub @MISSION_END
01E3: show_text_1number_styled GXT 'M_PASS' number 1000 time 5000 style 1
Player.Money($PLAYER_CHAR) += 1000
return
:MISSION_29_144
wait 0
gosub @MISSION_END
00BA: show_text_styled GXT 'M_FAIL' time 5000 style 1 // MISSION FAILED
return
:MISSION_END
wait 0
if
056D: actor 0@ defined
then
actor.RemoveReferences(0@)
actor.DestroyInstantly(0@)
end
if
056D: actor 1@ defined
then
actor.RemoveReferences(1@)
actor.DestroyInstantly(1@)
end
if
056D: actor 2@ defined
then
actor.RemoveReferences(2@)
actor.DestroyInstantly(2@)
end
marker.Disable(3@)
marker.Disable(4@)
marker.Disable(5@)
return
Компилируем файл. В нас получился файл "MISSION.cm". Отлично! Мы создали миссию!
Как и в мейне, нам необходимо написать стартер для миссии - набор условий для запуска. Кстати, что бы запустить Cleo-миссию, необходимо использовать опкод:
0A94: start_custom_mission "MISSION"
Здесь:
"MISSION" - имя миссии ( название файла! ). Обратите внимание, что расширение "*.cm" писать не надо!
Давайте напишем простой стартер. Для этого создадим Cleo-скрипт с таким содержимым:
{$CLEO}
0000:
:STARTER
thread 'STARTER'
wait 0
if
$ONMISSION == 0
jf @STARTER
02A7: 0@ = create_icon_marker_and_sphere 15 at 2496.6348 -1684.6963 12.3935
:STARTER_1
wait 0
if
$ONMISSION == 1
then
marker.Disable(0@)
jump @STARTER
end
if AND
not actor.Dead($PLAYER_ACTOR)
not actor.Driving($PLAYER_ACTOR)
8A0C: not player $PLAYER_CHAR on_jetpack
8741: not actor $PLAYER_ACTOR busted
then
if
0102: actor $PLAYER_ACTOR in_sphere 2496.6348 -1684.6963 12.3935 radius 2.0 2.0 2.0 sphere 0 stopped_on_foot
then
jump @STARTER_2
end
end
jump @STARTER_1
:STARTER_2
wait 0
player.CanMove($PLAYER_CHAR) = false
actor.SetImmunities($PLAYER_ACTOR, 1, 1, 1, 1, 1)
Marker.Disable(0@)
00BE: text_clear_all
03E6: remove_text_box
00BA: show_text_styled GXT 'MISS_01' time 1000 style 2
fade 0 1000
wait 2000
0A94: start_custom_mission "MISSION"
jump @STARTER
Таким образом мы сделали полноценный стартер и миссия запустилась без проблем:
Обратите внимание на последний "jump". Мы перейдём на начало потока, что даёт возможность пройти миссию ещё раз. Если поставить в место неё опкод "0A93: end_custom_thread", то пройти миссию мы сможем только 1 раз за загрузку игры ( в том числе когда миссия провалена ), так что оставляем "jump".
Так по-немножку, мы подошли к стартерам. В следующем уроке мы подробнее рассмотрим стартеры, а именно будем учится запускать миссии по-очереди, делать что бы при завершении одной миссии открывались две новых и в таком духе. Материал достаточно сложный в освоении, так как нужно всегда всё держать в своей памяти.
Думаю основу создания cleo-миссий мы рассмотрели. Создайте несколько своих миссий. Тестируйте на здоровье :)|4071|1|0|01068717png600375400`250``||cleo_missii|1499616943