Здрасти всем. Если тут еще кто-то есть, можете помочь? Я тут создал несколько paired animations, и при помощи FNISS зарегистрировал соответствующие Anim Events. Теперь CK видит мои анимации. Я создал заклинание с магическим эффектом со скриптом, что бы проигрывать эти анимации. Все работает, но есть проблема. Эти анимации не Killmovesб после их проигрывания не предусматривается убийство NPC. И тут оказывается что если вызвать анимации во время боя, после проигрывания непись перестает сражаться и вообще что-либо делать, он тупо бегает вокруг игрока и ничего не делает)) Есть ли возможность как то это исправить, что бы после проигрывания парной анимации непись возвращался в прежнее состояние? Вообще я новичок в скриптах, прошу тапками не закидывать.
Idle Property pa_01 Auto
Event OnEffectStart(Actor akTarget, Actor akCaster) akCaster.PlayIdleWithTarget(pa_01, akTarget)
Endevent
[b]Добавлено[/b] (31 Мая 2020, 12:09) --------------------------------------------- Дополню. Путем многочисленных проб я обнаружил, что если в мое заклинание, инициирующее проигрывание анимации, добавить ванильный магический эффект - calm, который понижает агрессию NPC и выставить его длительность больше, чем длительность парной анимации, то после проигрывания анимации во время боя, непись снова продолжает бой, а не бегает вокруг. Видимо это как то связано с behaviors NPC во время боя, ведь парные анимации это по сути айдлы, которые должны работать в спокойном состоянии, а я пытаюсь их впихнуть во время боя. Есть ли возможность добиться такого же эффекта в самом скрипте без дополнительного эффекта calm в моем заклинании.
Мне просто захотелось освежить немного боевку скайрима эффектами типа killmoves, но только без убийства, что бы после анимации бой продолжился. Кстати, я сейчас подумал, а можно ли с помощью скрипта на время проигрывания анимации замедлить время для остальных персонажей, такой эффект слоумо, но только что бы парная анимация воспроизводилась без замедления на персонаже и NPC? Еще забыл упомянуть, помимо всего прочего, после проигрывания моей анимации персонаж игрока переходит в состояние вне боя, приходится переэкипировать оружие каждый раз, есть ли какая нибудь команда как его принудительно вернуть в состояние в котором он был до воспроизведения анимации, проблема не критична, но надоедлива.
Изменение репутации для пользователя xCYNICx
xCYNICxOffline
Сообщение №2
| Тема: Вопросы по скриптам Papyrus
написано: 31 мая 2020, 12:26
| Отредактировано: Multigone - 31 мая 2020, 14:22
Попробуй ре-экипировать оружие скриптом (UnequipItem / EquipItem).
Спасибо за совет. Я пока только учусь папирусу, поэтому не знаю как снять конкретное оружие с NPC, но я использовал команду aktarget.unequipall(), а затем после проигрывания IdleStop_Loose анимации - akTarget.DrawWeapon().
В результате эффект получился почти такой же как я и ожидал. Неписи реагируют на обстановку и сражаются, только в трусах. Осталось понять как снимать с них только оружие, а не всю экипировку. Вт что я добавил в своем скрипте:
xCYNICx, все функции есть в исходниках (Data/Scripts/Source). Смотри, что расширяет скрипт, который ты пишешь (Например, заголовок "Script MyScript Extends Actor"), ищи в исходниках .psc с таким именем (Actor.psc), в нем будут все допустимые функции для этого типа форм с комментами. Больше инфо о любой функции можно получить здесь, набрав в поиске ее название. Также смотри, что расширяет Actor.psc (ObjectReference), ищи ObjectReference.psc и смотри все функции, многие из них могут применяться в том числе к Actor. И так далее. Большинство скрипт-объектов имеют иерархию.
Спасибо за подсказку. Теперь буду знать где искать полезные функции. Попробую все предложенные тобой варианты. Надеюсь все заработает)
У меня возник еще один вопрос. Как можно определить под каким углом стоит НПС по отношению к игроку. Например я хочу чтобы событие (анимация) произошло когда НПС стоит спиной или лицом к персонажу. Я вписал в скрипт такой код. Но работает он как то не правильно, как будто рандомно. Видимо я использую не ту функцию:
xCYNICx, посмотри функцию GetHeadingAngle(). Скорее всего, это то, что нужно.
Спасибо большое. Это, действительно то что нужно. Работает замечательно. Единственное чего я не пойму, если я напрямую вставляю функцию akTarget.GetHeadingAngle(akCaster) в условие, тогда компиляция проходит успешно, но когда пытаюсь присвоить переменную - скрипт не хочет компилироваться - блокнот вылетает:
Код
Event OnEffectStart(Actor akTarget, Actor akCaster)
direction = akTarget.GetHeadingAngle(akCaster) ; пытаюсь присвоить переменную - вылет
if direction > 90 && direction < 180 akCaster.PlayIdleWithTarget(pa_01, akTarget) Debug.MessageBox("Back") Else akCaster.PlayIdleWithTarget(pa_02, akTarget) Debug.MessageBox("Front") endif Endevent
Вообще, спасибо, ребята, я сегодня на вашем форуме узнал и освоил намного больше полезной инфы, чем за две недели копания в гугле на тему папируса.
Изменение репутации для пользователя xCYNICx
xCYNICxOffline
Сообщение №5
| Тема: Вопросы по скриптам Papyrus
написано: 12 июня 2020, 14:37
| Отредактировано: Multigone - 12 июня 2020, 20:24
Всем привет. У меня снова возник вопрос. Я тут написал скрипт, который показывает меню messagebox с несколькими опциями, каждая из котороых запускает ту или иную анимацию. Все работает хорошо, но вот я хотел бы немного расширить эту функцию, мне нужно что бы после проигрывания выбранной анимации, всплывал еще один messagebox с другими опциями и возможностью отменить все, вернувшись в игру. Вот мой код:
Код
Idle Property pa_05 Auto Idle Property pa_06 Auto Idle Property pa_07 Auto Idle Property pa_08 Auto Message Property MsgNPC_01 Auto
Event OnEffectStart(Actor akTarget, Actor akCaster) Int iButton = MsgNPC_01.Show() If (iButton != -1) If (iButton == 0) Debug.Notification("pa_05") akCaster.PlayIdleWithTarget(pa_05, akTarget) ElseIf (iButton == 1) Debug.Notification("pa_06") akCaster.PlayIdleWithTarget(pa_06, akTarget) EndIf EndIf Endevent
Заранее спасибо
Изменение репутации для пользователя xCYNICx
xCYNICxOffline
Сообщение №6
| Тема: Вопросы по скриптам Papyrus
написано: 12 июня 2020, 19:16
| Отредактировано: Multigone - 12 июня 2020, 20:23
А зачем вы проверяете на -1? Окно возвращает от 0 и выше.
Если честно я и сам толком не знаю, подсмотрел кусок кода у кого-то. Но, сейчас главное для меня, что скрипт работает как я задумывал. А, вообще, я новичок в скриптинге, только недели три как начал разбираться с папирусом. Пока для меня тут много непонятного. Сейчас попробую скрипт без этого условия ( ibutton != -1).