Рейтинг - 5.0 (3)

В этом уроке мы рассмотрим как создавать миссии, используя CLEO.

Как и в 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-миссий мы рассмотрели. Создайте несколько своих миссий. Тестируйте на здоровье :)


Теги: cleo-mission, миссии, Mission, Cleo-миссии

Yurko_UA   (14.07.12 00:53)
Респект і уважуха!!! Ясно і зрозуміло написано!

DemonSC   (10.01.15 17:33)
Почему когда я написал actor.Defined компилятор выдаёт ошибку: неизвестная команда?

0
wmysterio   (10.01.15 17:47)
используйте опкод
Код
056D:  actor { вставьте здесь переменную акётра } defined
в место той команды

eugenylt   (11.01.15 10:16)
Почему пишет недостаточно параметров? (Ожидалось 2)
Код
{$CLEO .cm}
//------------------Mission-----------------
:MISSION_0
thread 'MISSION_0'
gosub @MISSION_0_29_57
if
wasted_or_busted
jf @MISSION_0_29_46
gosub @MISSION_0_29_144

:MISSION_0_29_46
$ONMISSION = 0
mission_cleanup
end_thread

:MISSION_0_29_57
increment_mission_attempts
$ONMISSION = 1
actor.SetImmunities($PLAYER_ACTOR,1,1,1,1,1)
player.CanMove($PLAYER_CHAR) = false
016A: fade 0 time 1000
wait 2000
03DE: set_pedestrians_density_multiplier_to 0.0
01EB: set_traffic_density_multiplier_to 0.0
0395: clear_area 0 at 2480.6641 -1708.6151 13.5359 radius 300.0
0826: enable_hud 0
02A3: enable_widescreen 1
actor.PutAt($PLAYER_ACTOR,2481.7048, -1700.1411, 13.5245)
model.Load(#CELLPHONE)
038B: load_requested_models
04E4: unknown_refresh_game_renderer_at 2482.6272, -1701.2502
camera.SetAtPos(2482.6272, -1701.2502, 13.5269)
camera.SetPosition(2482.6272, -1701.2502, 13.5269,0.0,0.0,0.0)
camera.PointAt(2481.7048, -1700.1411, 13.5245,2)
wait 2000
03E6: remove_text_box
00BE: text_clear_all
0729: AS_actor $PLAYER_ACTOR hold_cellphone 1
wait 2000
00BC: show_text_highpriority GXT 'Mis_01' time 2000 flag 1
wait 2000
00BC: show_text_highpriority GXT 'Mis_02' time 5000 flag 1
wait 5000
0729: AS_actor $PLAYER_ACTOR hold_cellphone 0
wait 2000
016A: fade 0 time 1000
wait 1000
03DE: set_pedestrians_density_multiplier_to 1.0
01EB: set_traffic_density_multiplier_to 1.0
0826: enable_hud 1
02A3: enable_widescreen 0
camera.Restore_WithJumpCut
camera.SetBehindPlayer
03E6: remove_text_box
00BE: text_clear_all
wait 2000
actor.SetImmunities($PLAYER_ACTOR,0,0,0,0,0)
player.CanMove($PLAYER_CHAR) = true
model.Load(#BALLAS2)
038B: load_requested_models
:MISSION_0_A
if
model.Available(#BALLAS2)
jf @MISSION_0_A
0@ = actor.Create(7,#BALLAS2,2483.5469, -1722.6053, 13.5547)
actor.Angle(0@)=60.8832
actor.Health(0@) = 300
model.Destroy(#BALLAS2)
077A: set_actor 0@ acquaintance 4 to_actors_pedtype 0 // see ped.dat
1@ = marker.CreateAboveActor(0@)
07E0: set_marker 1@ type_to 0
0168: set_marker 1@ size 2
05E2: AS_actor 0@ kill_actor $PLAYER_ACTOR

:MISSION_0_B
wait 0
if
actor.Dead(0@)
then
marker.Disable(1@)
jump @MISSION_0_C
end
jump @MISSION_0_B

:MISSION_0_C
wait 0
gosub @MISSION_0_END
00BA: show_text_styled GXT "M_PASS" time 5000 style 1  // MISSION passed
0394: play_music 1
0318: set_latest_mission_passed 'MSC_1'  // Big Smoke
player.Money($PLAYER_CHAR)+= 1000
return

:MISSION_0_29_144 // ÁËÎÊ ÏÐÎÂÀËÀ ÌÈÑÑÈÈ
wait 0
00BA: show_text_styled GXT "M_FAIL" time 5000 style 1  // Beefy Baron
gosub @MISSION_0_END
return

:MISSION_0_END
wait 0
actor.RemoveReferences(0@)
actor.DestroyInstantly(0@)
marker.Disable(1@)
return

0
wmysterio   (11.01.15 13:49)
Уберите запяную в опкоде
Код
04E4: unknown_refresh_game_renderer_at 2482.6272, -1701.250// запятая лишняя здесь

eugenylt   (11.01.15 13:58)
Спасибо!
Вход на сайт

Поиск
Категории раздела
Мини-чат
Пожалуйста, все вопросы по скриптингу задавать на форуме!
Наш опрос
Кто из главных героев GTA 5 круче?
Всего ответов: 7
Активность на сайте
Пожертвования
Кошельки WebMoney:
U859420971000
R407741810602
Z331072372430
E314272616890
Друзья сайта
Полезные ресурсы
Статистика

Онлайн всего: 2
Гостей: 1
Пользователей: 1
wmysterio
Сегодня нас посетили:
wmysterio, Dyabda
Реклама