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

В этом уроке мы рассмотрим статус-тексты.

Здравствуйте, уважаемые пользователи сайта 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

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

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'

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

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

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

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

Вы можете усовершенствовать этот скрипт. Добавьте несколько противников, которые будут атаковать СЖ и его друга. Вот и сам исходник: смотреть/скачать.


Теги: status-text, статус-текст

undead099032   (27.08.12 22:41)
А как сделать чтобы эта полоска отвечала за СЖ? Например: сытность если полоска сытности упадет СЖ умрет.

GeniusZ   (04.07.15 14:09)
В цикле while 0@ == 0 должна быть хотя бы минимальная задержка, иначе друг в мгновенье умрет.

0
wmysterio   (04.07.15 14:25)
В цикле while 0@ == 0 есть минимальная задержка.

и друг не умрёт, если задержки не будет, а умрёт игра wink
Вход на сайт

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

Онлайн всего: 1
Гостей: 1
Пользователей: 0

Сегодня нас посетили:
Рекомендую
Реклама