# 000122. Типы чекпоинтов, маркеров. Детальный обзор

Типы чекпоинтов, маркеров. Детальный обзор|Всем привет! Этот урок я полностью посвятил чекпоинтам и маркерам.|wmysterio|wmysterio||||Сами маркеры можно образно разделить на две большие группы: статические и плавающие. Статические маркеры - это объекты, которые прикреплены на карте, то есть не могут перемещаться. Плавающие - на оборот: свободно двигаются за игровыми субъектами. Как правило создаются они опкодами с описанием "AboveTo"( над чем-то ). Статичные же имеют разделение примерно на три ветви: чекпоинты, радарные и входные. Входные маркеры являют собою желтую "стрелку", идентичную плавающим маркерам, только не перемещается. Как правило их ставят при входе в какой-то интерьер.

Радарные маркеры являют собою сферу в игре с иконкой на карте. Такие маркеры обычно используют для обозначения важных мест, таких как закусочных, миссий и т.п.

Чекпоинты - это маркеры пути, то есть указатели места, куда нужно добраться. Они делятся также на два вида - обычные и гоночные. Последний вид используется, как правило, в гоночных миссиях. Они имеют точку позиции и точку, куда будет смотреть маркер.

Чтобы лучше понять эту классификацию я нарисовал картинку:

![](https://github.com/wmysterio/scm-scripting-lessons/raw/resources/_pu/1/86296398.png)

Существует несколько вариантов отображения плавающих маркеров на радаре. Для этого используется опкод:

```
018B: set_marker 0@ radar_mode 2
```

Здесь:\
0@ - хэндл маркера\
2 - режим отображения. Режимы указаны в таблице ниже

| Режим | Описание                                                       |
| ----- | -------------------------------------------------------------- |
| 0     | На радаре показывается маркер и стрелка ( он же по-умолчанию ) |
| 1     | Есть стрелка над субъектом, но на радаре ничего не показано    |
| 2     | На радаре ничего не показано и нет стрелки                     |

Так же мы можем указать тип чекпоинта:

```
08FB: set_checkpoint 1@ type_to 0
```

Здесь:\
0@ - хэндл чекпоинта\
0 - тип чекпоинта. Типы указаны в таблице ниже

| Тип | Описание          |
| --- | ----------------- |
| 0   | Желтый квадратик  |
| 1   | Синий квадратик   |
| 2   | Красный квадратик |

Гоночные чекпоинты имеют свою особенность. Дело в том, что их можно перемещать. Если обычные прикреплены к месту, то другое дело с ГЧ ( они же гоночные чекпоинты ). К тому же мы можем задать размер. Создаются ГЧ следующим образом:

```
06D5: 0@ = create_racing_checkpoint_at -2699.3767 95.7964 4.3359 point_to -2699.5322 74.057 4.3359 type 0 radius 4.0
```

Здесь:\
0@ - хэндл чекпоинта\
-2699.3767 95.7964 4.3359 - место, где должна разместится контрольная точка\
-2699.5322 74.057 4.3359 - координаты, куда будет смотреть ГЧ\
0 - тип ГЧ\
4.0 - размер гоночного чекпоинта

Отключается гоночные чекпоинты следующим опкодом:

```
06D6: disable_racing_checkpoint 0@
```

Переместить ГЧ можно следующим образом:

```
07F3: move_racing_checkpoint 0@ to -2710.7253 74.4686 4.1797
```

Здесь:\
0@ - хэндл чекпоинта\
-2710.7253 74.4686 4.1797 - новая позиция гоночного чекпоинта.

Можно ещё задать угол разворота ГЧ:

```
0996: set_racing_checkpoint 0@ Z_angle_to 179.2693
```

× \*\*ВАЖНО:\*\* Гоночные чекпоинты не отображаются на экране!

Давайте напишем небольшую миссию, где игроку нужно на "кукурузнике" облетать часть города Лос Сантос:

```
{$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 
00C0: set_current_time 4 0
03DE: set_pedestrians_density_multiplier_to 0.0
01EB: set_traffic_density_multiplier_to 0.0
0395: clear_area 0 at 2244.7144 -1851.5718 -0.1345 radius 300.0
Model.Load(#CROPDUST)
038B: load_requested_models
0@ = Car.Create(#CROPDUST, 2244.7144, -1851.5718, -0.1345)
Car.Angle(0@) = 269.8951
Model.Destroy(#CROPDUST)
072A: put_actor $PLAYER_ACTOR into_car 0@ driverseat
wait 2000
Camera.Restore_WithJumpCut
fade 1 1000
wait 1000
0ACF: show_formatted_styled_text "3" time 1000 style 4
097A: at 0.0 0.0 0.0 play_sound 1056
wait 1000
0ACF: show_formatted_styled_text "2" time 1000 style 4 
097A: at 0.0 0.0 0.0 play_sound 1056
wait 1000
0ACF: show_formatted_styled_text "1" time 1000 style 4 
097A: at 0.0 0.0 0.0 play_sound 1056
wait 1000
0ACF: show_formatted_styled_text "G0!" time 1000 style 4
097A: at 0.0 0.0 0.0 play_sound 1057
Player.CanMove(0) = true
Actor.SetImmunities($PLAYER_ACTOR, 0, 0, 0, 0, 0)
Car.SetImmunities(0@, 1, 1, 1, 1, 1)
0423: set_car 0@ improved_handling_to 2.0 // (float)
1@ = 0 // Index Point
9@ = 4 // Type Race Chackpoint

:MISSION_C
wait 0
06D6: disable_racing_checkpoint 8@
marker.Disable(10@)
if
1@ == 0
then
2@ = 2413.0439 
3@ = -1841.1782
5@ = 2413.2087
6@ = -2048.9414
end
if
1@ == 1
then
2@ = 2413.2087 
3@ = -2048.9414 
5@ = 2394.0317 
6@ = -2267.0752 
end
if
1@ == 2
then
2@ = 2394.0317 
3@ = -2267.0752 
5@ = 2225.1492 
6@ = -2451.5432 
end
if
1@ == 3
then
2@ = 2225.1492 
3@ = -2451.5432 
5@ = 2221.7722 
6@ = -2627.5698 
end
if
1@ == 4
then
2@ = 2221.7722 
3@ = -2627.5698 
5@ = 2380.2559 
6@ = -2664.9453 
end
if
1@ == 5
then
2@ = 2380.2559 
3@ = -2664.9453 
5@ = 2407.147 
6@ = -2510.7278 
end
if
1@ == 6
then
2@ = 2407.147 
3@ = -2510.7278 
5@ = 2489.533 
6@ = -2308.1719 
end
if
1@ == 7
then
2@ = 2489.533 
3@ = -2308.1719 
5@ = 2579.6653 
6@ = -2235.9314 
end
if
1@ == 8
then
2@ = 2579.6653 
3@ = -2235.9314 
5@ = 2582.5527 
6@ = -2116.0264 
end
if
1@ == 9
then
2@ = 2582.5527 
3@ = -2116.0264 
5@ = 2583.7729 
6@ = -2082.8301 
9@ = 1 // Finish!
end
if
1@ == 10
then
jump @MISSION_A
end
06D5: 8@ = create_racing_checkpoint_at 2@ 3@ 100.0 point_to 5@ 6@ 100.0 type 9@ radius 4.0
018A: 10@ = create_checkpoint_at 2@ 3@ 50.0

:MISSION_B
wait 0
if OR
Car.Wrecked(0@)
02BF: car 0@ sunk
then
jump @MISSION_29_144_END_CAR
end
if
not actor.InCar($PLAYER_ACTOR, 0@)
then
jump @MISSION_29_144_PLAYER_NOT_CAR
end
if
00EC: actor $PLAYER_ACTOR sphere 0 near_point 2@ 3@ radius 4.5 4.5
then
1@ += 1
097A: at 0.0 0.0 0.0 play_sound 1056
jump @MISSION_C
end
jump @MISSION_B

:MISSION_A
wait 2000
gosub @MISSION_END
Player.Money(0) += 10000
0394: play_music 1
01E3: show_text_1number_styled GXT 'M_PASS' number 10000 time 5000 style 1 // MISSION PASSED + MONEY
return 

:MISSION_29_144
wait 0 
gosub @MISSION_END
00BA: show_text_styled GXT 'M_FAIL' time 5000 style 1 // MISSION FAILED
return

:MISSION_29_144_END_CAR
wait 0 
gosub @MISSION_END
0AD0: show_formatted_text_lowpriority "Џpa®cЈop¦ y®њ¤¦o›e®!" time 5000 // Car Wrecked!
00BA: show_text_styled GXT 'M_FAIL' time 5000 style 1 // MISSION FAILED
return

:MISSION_29_144_PLAYER_NOT_CAR
wait 0 
gosub @MISSION_END
0AD0: show_formatted_text_lowpriority "‹Ё Јokњ®yћњ ¦pa®cЈop¦!" time 5000 // You not in car!
00BA: show_text_styled GXT 'M_FAIL' time 5000 style 1 // MISSION FAILED
return

:MISSION_END
wait 0
03DE: set_pedestrians_density_multiplier_to 1.0
01EB: set_traffic_density_multiplier_to 1.0
06D6: disable_racing_checkpoint 8@
marker.Disable(10@)
return
```

А также стартер к нему:

```
{$CLEO}
0000:

while 8AB0: not key_pressed 9 // Tab
wait 0
end

fade 0 1000
0ACF: show_formatted_styled_text "Fly in City" time 4000 style 2
Player.CanMove(0) = false
Actor.SetImmunities($PLAYER_ACTOR, 1, 1, 1, 1, 1)
wait 1000
0A94: start_custom_mission "Miss"
0A93: end_custom_thread
```

Результат:

![](https://github.com/wmysterio/scm-scripting-lessons/raw/resources/_pu/1/96220810.png)

Таким образом сюда ещё можно добавить таймер, что бы игрок живее летел к точке :) На этом урок окончен. Спасибо всем за время, которое вы уделили этой статье!|3133|1|0|96220810`png`600`337`400`224``\|86296398`png`507`263`400`207\`\`||tipy\_chekpointov\_markerov\_detalnyj\_obzor|1504591681


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://lessons.sannybuilder.com/00100/00200/000122.-tipy-chekpointov-markerov.-detalnyi-obzor.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
