00063. Работа со стартерами ( MAIN.SCM - Часть 2 )
Работа со стартерами ( MAIN.SCM - Часть 2 )|В предыдущем уроке мы рассмотрели запуск миссий по очереди. Сегодня мы попытаемся сделать возможность выбора миссий. То есть нам будет предоставлено два маркера и зависимости от выбранного маркера будет запускается та или иная миссия.|wmysterio|wmysterio||||Что бы это сделать нам необходимо создать несколько стартеров. Обычно миссии делят на части: миссии Свита, миссии СЖ, миссии ОG и т.п. Мы поступим также.
Давайте у нас будут миссии СЖ и Свита. Как и в предыдущем уроке, нам понадобятся глобальные переменные для каждого стартера. Допустим это будут "$MISSION_CJ_TOTAL" и "$MISSION_SWIT_TOTAL". Они будут равны нулю в начале игры. Так же мы должны завести переменные для координат маркера. Создадим такое в потоке "MAIN":
Теперь нам необходимо создать стартера для каждой части. Первый поток будет стартером для миссий CJ. Допустим там будет 5 миссий ( номера 0, 1, 2, 3, 4 ):
:STARTER_CJ
thread 'STARTER_CJ'
wait 0
$MARKER_CJ = marker.CreateIconAndSphere(15, $MARKER_X_CJ, $MARKER_Y_CJ, $MARKER_Z_CJ)
:STARTER_CJ_1
wait 0
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
$ONMISSION == 0
then
if AND
$MISSION_CJ_TOTAL == 0
0102: actor $PLAYER_ACTOR in_sphere $MARKER_X_CJ $MARKER_Y_CJ $MARKER_Z_CJ radius 2.0 2.0 2.0 sphere 0 stopped_on_foot
then
jump @STARTER_CJ_2
end
if AND
$MISSION_CJ_TOTAL == 1
0102: actor $PLAYER_ACTOR in_sphere $MARKER_X_CJ $MARKER_Y_CJ $MARKER_Z_CJ radius 2.0 2.0 2.0 sphere 0 stopped_on_foot
then
jump @STARTER_CJ_3
end
if AND
$MISSION_CJ_TOTAL == 2
0102: actor $PLAYER_ACTOR in_sphere $MARKER_X_CJ $MARKER_Y_CJ $MARKER_Z_CJ radius 2.0 2.0 2.0 sphere 0 stopped_on_foot
then
jump @STARTER_CJ_4
end
if AND
$MISSION_CJ_TOTAL == 3
0102: actor $PLAYER_ACTOR in_sphere $MARKER_X_CJ $MARKER_Y_CJ $MARKER_Z_CJ radius 2.0 2.0 2.0 sphere 0 stopped_on_foot
then
jump @STARTER_CJ_5
end
if AND
$MISSION_CJ_TOTAL == 4
0102: actor $PLAYER_ACTOR in_sphere $MARKER_X_CJ $MARKER_Y_CJ $MARKER_Z_CJ radius 2.0 2.0 2.0 sphere 0 stopped_on_foot
then
jump @STARTER_CJ_6
end
end
end
jump @STARTER_CJ_1
:STARTER_CJ_2
wait 0
Marker.Disable($MARKER_CJ)
00BE: text_clear_all
03E6: remove_text_box
00BA: show_text_styled GXT 'MISS_01' time 1000 style 2
fade 0 1000
wait 2000
start_mission 0
end_thread
:STARTER_CJ_3
wait 0
Marker.Disable($MARKER_CJ)
00BE: text_clear_all
03E6: remove_text_box
00BA: show_text_styled GXT 'MISS_02' time 1000 style 2
fade 0 1000
wait 2000
start_mission 1
end_thread
:STARTER_CJ_4
wait 0
Marker.Disable($MARKER_CJ)
00BE: text_clear_all
03E6: remove_text_box
00BA: show_text_styled GXT 'MISS_03' time 1000 style 2
fade 0 1000
wait 2000
start_mission 2
end_thread
:STARTER_CJ_5
wait 0
Marker.Disable($MARKER_CJ)
00BE: text_clear_all
03E6: remove_text_box
00BA: show_text_styled GXT 'MISS_04' time 1000 style 2
fade 0 1000
wait 2000
start_mission 3
end_thread
:STARTER_CJ_6
wait 0
Marker.Disable($MARKER_CJ)
00BE: text_clear_all
03E6: remove_text_box
00BA: show_text_styled GXT 'MISS_05' time 1000 style 2
fade 0 1000
wait 2000
start_mission 4
end_thread
Аналогично создаём поток для миссий Свита:
:STARTER_SWIT
thread 'STARTER_SWIT'
wait 0
$MARKER_SWIT = marker.CreateIconAndSphere(38, $MARKER_X_SWEET, $MARKER_Y_SWEET, $MARKER_Z_SWEET)
:STARTER_SWIT_1
wait 0
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
$ONMISSION == 0
then
if AND
$MISSION_SWIT_TOTAL == 0
0102: actor $PLAYER_ACTOR in_sphere $MARKER_X_SWIT $MARKER_Y_SWIT $MARKER_Z_SWIT radius 2.0 2.0 2.0 sphere 0 stopped_on_foot
then
jump @STARTER_SWIT_2
end
if AND
$MISSION_SWIT_TOTAL == 1
0102: actor $PLAYER_ACTOR in_sphere $MARKER_X_SWIT $MARKER_Y_SWIT $MARKER_Z_SWIT radius 2.0 2.0 2.0 sphere 0 stopped_on_foot
then
jump @STARTER_SWIT_3
end
if AND
$MISSION_SWIT_TOTAL == 2
0102: actor $PLAYER_ACTOR in_sphere $MARKER_X_SWIT $MARKER_Y_SWIT $MARKER_Z_SWIT radius 2.0 2.0 2.0 sphere 0 stopped_on_foot
then
jump @STARTER_SWIT_4
end
if AND
$MISSION_SWIT_TOTAL == 3
0102: actor $PLAYER_ACTOR in_sphere $MARKER_X_SWIT $MARKER_Y_SWIT $MARKER_Z_SWIT radius 2.0 2.0 2.0 sphere 0 stopped_on_foot
then
jump @STARTER_SWIT_5
end
if AND
$MISSION_SWIT_TOTAL == 4
0102: actor $PLAYER_ACTOR in_sphere $MARKER_X_SWIT $MARKER_Y_SWIT $MARKER_Z_SWIT radius 2.0 2.0 2.0 sphere 0 stopped_on_foot
then
jump @STARTER_SWIT_6
end
end
end
jump @STARTER_SWIT_1
:STARTER_SWIT_2
wait 0
Marker.Disable($MARKER_SWIT)
00BE: text_clear_all
03E6: remove_text_box
00BA: show_text_styled GXT 'MISS_06' time 1000 style 2
fade 0 1000
wait 2000
start_mission 5
end_thread
:STARTER_SWIT_3
wait 0
Marker.Disable($MARKER_SWIT)
00BE: text_clear_all
03E6: remove_text_box
00BA: show_text_styled GXT 'MISS_07' time 1000 style 2
fade 0 1000
wait 2000
start_mission 6
end_thread
:STARTER_SWIT_4
wait 0
Marker.Disable($MARKER_SWIT)
00BE: text_clear_all
03E6: remove_text_box
00BA: show_text_styled GXT 'MISS_08' time 1000 style 2
fade 0 1000
wait 2000
start_mission 7
end_thread
:STARTER_SWIT_5
wait 0
Marker.Disable($MARKER_SWIT)
00BE: text_clear_all
03E6: remove_text_box
00BA: show_text_styled GXT 'MISS_09' time 1000 style 2
fade 0 1000
wait 2000
start_mission 8
end_thread
:STARTER_SWIT_6
wait 0
Marker.Disable($MARKER_SWIT)
00BE: text_clear_all
03E6: remove_text_box
00BA: show_text_styled GXT 'MISS_010' time 1000 style 2
fade 0 1000
wait 2000
start_mission 9
end_thread
Номера миссий для Свита будут 5, 6, 7, 8, 9. Следовательно в списке "DEFINE MISSIONS" будут номера и метки миссий. Для примера пусть будет такой список:
//...
DEFINE MISSIONS 10
DEFINE MISSION 0 AT @MISSION_CJ_1
DEFINE MISSION 1 AT @MISSION_CJ_2
DEFINE MISSION 2 AT @MISSION_CJ_3
DEFINE MISSION 3 AT @MISSION_CJ_4
DEFINE MISSION 4 AT @MISSION_CJ_5
DEFINE MISSION 5 AT @MISSION_SWIT_1
DEFINE MISSION 6 AT @MISSION_SWIT_2
DEFINE MISSION 7 AT @MISSION_SWIT_3
DEFINE MISSION 8 AT @MISSION_SWIT_4
DEFINE MISSION 9 AT @MISSION_SWIT_5
//...
Дальше нам уже нужно написать блок миссий. Они должны идти в том порядке, в котором написано в "DEFINE MISSIONS". Используя шаблон в предыдущем уроке напишем миссии для СJ и SWIT. Код блока я сохранин в текстовом файде, который можно скачать здесь.
И, что бы метки появлялись в начале игры, активируем метки в потоке "MAIN":
Теперь при начале новой игры появляться 2 маркера с иконкой "CJ" и "S". Если стать на одну из них, то будут запускаться миссии в зависимости от того на какую метку стал игрок.
Таким образом мы предоставили игроку выбор. Это очень важно, так как если игрок никак не может выполнить миссию, то он может свободно двигаться дальше, пройдя другие миссии а затем вернутся и завершить миссию, на которой он застрял ранее.
Как сделать, что бы при прохождении 2-х миссий CJ, открывались миссии SWIT? Это очень просто сделать. В потоке "MAIN" удаляем или закомментируем строку "create_thread @STARTER_SWIT":
//...
$MISSION_CJ_TOTAL = 0
$MISSION_SWIT_TOTAL = 0
$MARKER_X_CJ = 2498.2966
$MARKER_Y_CJ = -1684.5094
$MARKER_Z_CJ = 12.41
$MARKER_X_SWEET = 2516.5918
$MARKER_Y_SWEET = -1674.5015
$MARKER_Z_SWEET = 12.973
create_thread @STARTER_CJ
//create_thread @STARTER_SWIT удаляем эту строчку и не позволяем запустится стартеру сначала игры
end_thread
//...
Дальше находим в блоке миссий "MISSION_CJ_2" и запускаем стартер для миссий Свита в месте, где миссия CJ считается пройденной. Вот код:
Перерь в начале игры будет только миссии CJ. После прохождения 2-й миссии CJ появится маркер Свита и можно уже выполнять миссии Свита. По аналогии вы можете создать свои стартеры и миссии, но сначала продумайте ход событий :) В следующем уроке мы погорим о стартерах в Cleo. С вами был wmysterio, спасибо за внимание!|717|1|0||rabota_so_starterami_main_scm_chast_2|1499618913