> For the complete documentation index, see [llms.txt](https://lessons.sannybuilder.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://lessons.sannybuilder.com/00100/00200/00098.-posledovatelnost-v-animacii.md).

# 00098. Последовательность в анимации

Последовательность в анимации|Всем привет! С вами wmysterio! Сейчас поговорим детальнее об анимации. Существует целый ряд опоков, связанных с ними, но остановлюсь я на последовательностях или так называемых AS-паках ( action sequences ).|wmysterio|wmysterio||||Перейдём к опкодам.

```
0615: define_AS_pack_begin $ActSeq // Создаёт начало экшн-пака
0616: define_AS_pack_end $ActSeq // Создаёт конец экшн-пака
```

Заставить выполнять актёра последовательность анимации можно с помощью опкода:

```
0618: assign_actor $0@ to_AS_pack $ActSeq
```

Здесь:\
0@ - хендл, актёра\
$ActSeq - естественно имя AS-пака

Заставить выполнять последовательность анимации целую группу можно с помощью опкода:

```
087D: assign_group $PLAYER_GROUP to_AS_pack $ActSeq
```

Здесь:\
$PLAYER\_GROUP - группа, что будет вкалывать :)\
$ActSeq - имя AS-пака<br>

Следующий опкод выгружает последовательность:

```
061B: remove_references_to_AS_pack $ActSeq
```

Между опкодами "0615" и "0616" пишутся списки анимаций, которые будут выполняться последовательно. Для примера, я взял "3" анимации, которые актёр будет выполнять:

```
0605: actor -1 perform_animation_sequence "BOM_PLANT_IN" from_file "BOMBER" 4.0 loop 0 0 0 1 -1
0605: actor -1 perform_animation_sequence "BOM_PLANT_LOOP" from_file "BOMBER" 4.0 loop 0 0 0 0 -1
0605: actor -1 perform_animation_sequence "BOM_Plant_2Idle" from_file "BOMBER" 4.0 loop 0 0 0 0 -1
```

× \*\*Примечание:\*\* нужно именовать актёра именно как -1, так как мы будем передавать указатель актёра опкодом 0618. Если нужно более длительно выполнять анимацию, то пишут время в место -1

В этот список можно указывать анимации с любых IFP-файлов ( даже разных ), главное их загрузить перед процессом выполнения. Перейдём к скриптам. Давайте создадим экшн-пак, и заставим актёра выполнять его:

```
{$CLEO}
0000:

:SEQ
thread 'SEQ'
wait 5000
04ED: load_animation "BOMBER"
model.Load(#WMYDRUG)
038B: load_requested_models

:SEQ_1
wait 0
if and
04EE: animation "BOMBER" loaded
model.Available(#WMYDRUG)
jf @SEQ_1

0615: define_AS_pack_begin $ActSeq
0605: actor -1 perform_animation_sequence "BOM_PLANT_IN" from_file "BOMBER" 4.0 loop 0 0 0 1 -1
0605: actor -1 perform_animation_sequence "BOM_PLANT_LOOP" from_file "BOMBER" 4.0 loop 0 0 0 0 8000
0605: actor -1 perform_animation_sequence "BOM_Plant_2Idle" from_file "BOMBER" 4.0 loop 0 0 0 0 -1
0616: define_AS_pack_end $ActSeq

04C4: store_coords_to 1@ 2@ 3@ from_actor $PLAYER_ACTOR with_offset 0.0 5.0 -1.0
4@ = actor.Angle($PLAYER_ACTOR)
4@ += 180.0
0@ = actor.Create(5, #WMYDRUG, 1@, 2@, 3@)
model.destroy(#WMYDRUG)
actor.Angle(0@) = 4@
0618: assign_actor $0@ to_AS_pack $ActSeq
0AD0: show_formatted_text_lowpriority "ežo¢ek ¢¨£ož®¬e¦ £ocžešo¢a¦ež©®oc¦© a®œ¯a œœ." time 4000
wait 4000
0AD0: show_formatted_text_lowpriority "­eže™ko e¯y :)" time 4000
wait 4000
061B: remove_references_to_AS_pack $ActSeq
04EF: release_animation "BOMBER"
0A93: end_custom_thread
```

В результате наш актёр выполняет указанные анимации:

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

Если вы искали в поисковике опкодов воспроизведение анимации актёра, то наверняка вы сталкивались с сутуацией, когда находило целых три опкода. Вот эти:

```
0605: actor $PLAYER_ACTOR perform_animation_sequence "phone_talk" IFP_file "PED" 4.0 loop 0 0 0 0 time 2000 // versionA
0812: AS_actor $PLAYER_ACTOR perform_animation "phone_talk" IFP_file "PED" 4.0 loopA 0 lockX 0 lockY 0 lockF 0 time 2000 // versionB
0A1A: actor $PLAYER_ACTOR perform_animation "phone_talk" IFP_file "PED" 4.0 loopA 0 lockX 0 lockY 0 lockF 0 2000 ms // versionC
```

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

| Версия | Описание                                                                                                                                                                                                      |
| ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| A      | Анимация будет останавливаться, когда актёра ударили, выстрелили в него или когда нужно выполнять анимации, запрограммированных в EXE-шнике.                                                                  |
| B      | Анимация будет проигрываться, в независимо от ситуации. Чаще используется в AS-паках. Вообще все опкоды с приставкой AS используются в основном в последовательностях, причем не только анимационные команды. |
| C      | Позволяет актёру двигаться, выполняя анимацию. Прерывается, когда актёр прыгает, падает, плывёт.                                                                                                              |

Я, правда, остаюсь верным опкоду "0605" :)

Рассмотрим так же опкоды, которые привлекли моё внимание:

```
0611: actor $PLAYER_ACTOR performing_animation "phone_talk"
```

Проверка: "Выполняет ли актёр $PLAYER\_ACTOR анимацию 'phone\_talk'?".

```
0613: 26@ = actor $PLAYER_ACTOR animation "phone_talk" time
```

Заносит в переменную "26@" время выполнения актёром "$PLAYER\_ACTOR" анимации "phone\_talk".

```
0614: set_actor $PLAYER_ACTOR animation "phone_talk" progress_to 2@ // 0.0 to 1.0
```

Устанавливает прогресс выполения актёром "$PLAYER\_ACTOR" анимации "phone\_talk".

Здесь:\
2@ - дробное число от 0.0 до 1.0. Например, если нам нужно, что бы актёр начал выполнять анимацию не сначала а с середины, то устанавливают анимации прогресс в 0.5.

Пример использования:

```
0605: actor $PLAYER_ACTOR perform_animation_sequence "phone_talk" IFP_file "PED" 4.0 loop 0 0 0 0 time 2000 // versionA
0614: set_actor $PLAYER_ACTOR animation "phone_talk" progress_to 0.5
```

Опкод записывает общее время воспроизведения актёром "$PLAYER\_ACTOR" анимации "phone\_talk" в переменную "23@":

```
061A: get_actor $PLAYER_ACTOR animation "phone_talk" total_time_to 23@
```

Есть ещё этот:

```
0612: set_actor $PLAYER_ACTOR animation "phone_talk" paused 0
```

По-идеи, опкод должен ставить анимацию на паузу и продолжать воспроизведение, однако он у меня как-то неадекватно ведёт себя, а точнее, вообще никакой реакции :) Что-же, урок подошел к концу. Надеюсь мои находки будут для вас новыми и интересными ;)|2170|1|0|64667491`png`600`337`400\`224\`\`||posledovatelnost\_v\_animacii|1504463144
