Статус-тексты|В этом уроке мы рассмотрим статус-тексты.|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~
Вот я, например создал такие записи:
Что бы удалить статус-текст, используем опкод:
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
После этого добавим новую миссию. Прежде всего создадим случайного актёра опкодом:
Цель миссии - дойти до точки вместе с рандомным другом. Но чтобы заставить актёра следовать за СЖ, переместим его в группу игрока а так же сделаем, чтобы созданный нами актёр уважал СЖ:
Всё необходимое уже сделано. Теперь нам нужно заставить статус-текст правильно работать, чтобы полоска нормально и без ошибок показывала здоровье друга. Здесь есть некоторая закономерность. Если мы задали актёру 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
Результат кажет сам за себя:
Вы можете усовершенствовать этот скрипт. Добавьте несколько противников, которые будут атаковать СЖ и его друга. Вот и сам исходник: смотреть/скачать.|1344|1|0|52828888jpg600360400240``\|05065016png430316400293\|61518594`png`640`400`400`250||status_teksty|1499072355