# 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


---

# 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/00098.-posledovatelnost-v-animacii.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.
