00061. Cleo-миссии

Cleo-миссии|В этом уроке мы рассмотрим как создавать миссии, используя CLEO.|wmysterio|wmysterio||||Как и в main.scm в Cleo можно создавать миссии. Преимущество в Cleo в том, что количество миссий неограниченное! То есть если в мейне максимум 200, то в Cleo может быть 500, 600 и так дальше. Сегодня мы напишем первую Cleo-миссию ;)

Что бы компилятор сделал Cleo-миссию, нужно указать ему в директиве расширение "*.cm" ( custom mission ):

{$cleo .cm}

Дальше указать код миссии. Вот очень стабильный код миссий:

{$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

//
{ Код миссии }
//


gosub @MISSION_END
00BA: show_text_styled GXT 'M_PASS' time 5000 style 1 // MISSION PASSED
0318: set_latest_mission_passed 'MISS_01' // GXT mission name
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
return

Обратите внимание, что завершается поток командой "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

Last updated