# 00050. Статус-тексты

Статус-тексты|В этом уроке мы рассмотрим статус-тексты.|wmysterio|wmysterio||||Здравствуйте, уважаемые пользователи сайта ru-script.3dn.ru. В оригинальных миссиях можно увидеть полоску жизни дружественной цели и при получении ею урона полоска начинает показывать уровень здоровья. Если полоска станет пустой, то миссия будет считаться проваленной. Сегодня мы напишем миссию с использованием статус-текстов. Но прежде всего рассмотрим необходимые опкоды. Что бы создать статус-текст, используем опкод:

```
04F7: status_text $Health type 0 line 1 GXT 'BB_18'
```

Здесь:\
$Health - переменная, которая будет отвечать за движение полоски. Например: она будет хранить жизнь актёра или автомобиля\
0 - тип статус-текста. Если поставить 0 - выводит обыкновенные числа. Например: количество пойманных ящиков. Если поставить 1 - то вместо числа будет отображаться полоска ( похожая на жизнь СЖ )\
1 - указываем номер линии ( по-сути мы располагаем текст от места, где выводятся деньги СЖ). Чем больше число, тем ниже относительно денег будет полоска ( число от 0 до 4 )\
'BB\_18' - GXT-запись. Она будет выведена возле полоски. Запись должна содержать одно или несколько коротких слов, без использования \~1\~

Вот я, например создал такие записи:

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

Что бы удалить статус-текст, используем опкод:

```
0151: remove_status_text $Health
```

Теперь давайте создадим новый стартер:

```
:STARTER_4
thread 'STARTER_4'
wait 0
$ICON4 = marker.CreateIconAndSphere(22, 2371.0364, -1758.7781, 13.547)

:STARTER_4_1
wait 0
if AND
$ONMISSION == 0
0102: actor $PLAYER_ACTOR in_sphere 2371.0364 -1758.7781 13.547 radius 2.0 2.0 2.0 sphere 0 stopped_on_foot 
jf @STARTER_4_1
if AND
8741: not actor $PLAYER_ACTOR busted
not actor.Dead($PLAYER_ACTOR)
jf @STARTER_4_1
if
not actor.Driving($PLAYER_ACTOR)
jf @STARTER_4_1
marker.Disable($ICON4)
player.CanMove($PLAYER_CHAR) = false
actor.SetImmunities($PLAYER_ACTOR, 1, 1, 1, 1, 1)
00BA: show_text_styled GXT 'MIS_04' time 1000 style 2
fade 0 2000
wait 2000
start_mission 3
end_thread
```

После этого добавим новую миссию. Прежде всего создадим случайного актёра опкодом:

```
0376: 1@ = create_random_actor_at 2370.4766 -1767.1378 13.5469
```

И зададим ему жизнь в 1000 единиц. После этого создадим статус-текст:

```
actor.Health(1@) = 1000
$HEALTH = actor.Health(1@)
0084: $TEMP = $HEALTH // (int)
04F7: status_text $TEMP type 1 line 1 GXT 'HEALACT'
```

Вот что в нас получилось:

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

Цель миссии - дойти до точки вместе с рандомным другом. Но чтобы заставить актёра следовать за СЖ, переместим его в группу игрока а так же сделаем, чтобы созданный нами актёр уважал СЖ:

```
077A: set_actor 1@ acquaintance 0 to_actors_pedtype 0
0631: put_actor 1@ in_group $PLAYER_GROUP
```

Всё необходимое уже сделано. Теперь нам нужно заставить статус-текст правильно работать, чтобы полоска нормально и без ошибок показывала здоровье друга. Здесь есть некоторая закономерность. Если мы задали актёру 1000 жизни - нужно делить их на 10, если 2000 - нужно делить их на 20, если 3000 - делить на 30 и так дальше. Таким образом делаем цикл:

```
0@ == 0

while 0@ == 0
 $HEALTH = actor.Health(1@) // считываем текущее значение жизни друга
 $HEALTH /= 10 // делим их на 10, так как мы задали 1000 жизней перед объявлением статус-текста
 0084: $TEMP = $HEALTH // (int) присваиваем статус-тексту значение переменной жизни актёра, что бы отобразить состояние жизни на экране
wait 0
end
```

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

```
:MISSION_3
thread 'MISSION_3'
gosub @MISSION_3_29_57 
if 
wasted_or_busted 
jf @MISSION_3_29_46 
gosub @MISSION_3_29_144 

:MISSION_3_29_46
$ONMISSION = 0 
mission_cleanup 
end_thread 

:MISSION_3_29_57
increment_mission_attempts 
$ONMISSION = 1 
0395: clear_area 1 at 2370.4766 -1767.1378 13.5469 radius 300.0
0376: 1@ = create_random_actor_at 2370.4766 -1767.1378 13.5469
wait 1500
actor.Health(1@) = 1000
077A: set_actor 1@ acquaintance 0 to_actors_pedtype 0
0631: put_actor 1@ in_group $PLAYER_GROUP
$HEALTH = actor.Health(1@)
0084: $TEMP = $HEALTH // (int)
04F7: status_text $TEMP type 1 line 1 GXT 'HEALACT'
fade 1 1000
wait 1000
actor.SetImmunities($PLAYER_ACTOR, 0, 0, 0, 0, 0)
player.CanMove($PLAYER_CHAR) = true
03BC: 2@ = create_sphere_at 2225.8528 -1724.875 13.5585 radius 2.0
018A: 3@ = create_checkpoint_at 2225.8528 -1724.875 13.5585
4@ = marker.CreateAboveActor(1@)
07E0: set_marker 4@ type_to 1
00BC: show_text_highpriority GXT 'M_RU_ST' time 4000 flag 1 // Отведи друга к спортзалу
0@ = 0

while 0@ == 0
 if OR
 actor.Dead($PLAYER_ACTOR)
 0741: actor $PLAYER_ACTOR busted
 then
 0@ = 1
 end
 
 if
 actor.Dead(1@)
 then
 0@ = 2
 end
 
 if AND
 0102: actor $PLAYER_ACTOR in_sphere 2225.8528 -1724.875 13.5585 radius 3.0 3.0 3.0 sphere 0 stopped_on_foot 
 0102: actor 1@ in_sphere 2225.8528 -1724.875 13.5585 radius 3.0 3.0 3.0 sphere 0 stopped_on_foot 
 then
 0@ = 3
 end
 
 $HEALTH = actor.Health(1@)
 $HEALTH /= 10 
 0084: $TEMP = $HEALTH // (int)
wait 0
end

if
0@ == 1
then
jump @MISSION_3_29_144
end

if
0@ == 2
then
jump @MISSION_3_29_DRUG
end

fade 0 500
wait 500
actor.DestroyInstantly(1@)
wait 100
fade 1 500
wait 500
0318: set_latest_mission_passed 'HEALACT' 
01E3: show_text_1number_styled GXT 'M_PASS' number 10000 time 4000 style 1 
Player.Money($PLAYER_CHAR) += 10000
play_music 1
gosub @MISSION_3_END
create_thread @STARTER_4
return 

:MISSION_3_29_144
wait 0 
gosub @MISSION_3_END
00BA: show_text_styled GXT 'M_FAIL' time 5000 style 1 
create_thread @STARTER_4 
return

:MISSION_3_29_DRUG
wait 0 
gosub @MISSION_3_END
00BA: show_text_styled GXT 'M_FAIL' time 5000 style 1
00BC: show_text_highpriority GXT 'M_PA_ST' time 4000 flag 1 // Друг мёртв!
create_thread @STARTER_4 
return

:MISSION_3_END
wait 0 
if
056D: actor 1@ defined
then
actor.DestroyInstantly(1@)
end
0151: remove_status_text $TEMP
03BD: destroy_sphere 2@
marker.Disable(3@)
marker.Disable(4@)
return
```

Результат кажет сам за себя:

![](https://github.com/wmysterio/scm-scripting-lessons/raw/resources/_pu/0/52828888.jpg)

Вы можете усовершенствовать этот скрипт. Добавьте несколько противников, которые будут атаковать СЖ и его друга. Вот и сам исходник: [смотреть/скачать](https://github.com/wmysterio/scm-scripting-lessons/blob/main/data_base/sa/STATUS_TEXT.txt).|1344|1|0|52828888`jpg`600`360`400`240``\|05065016`png`430`316`400`293``\|61518594`png`640`400`400`250``||status\_teksty|1499072355


---

# 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/00300/00050.-status-teksty.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.
