Модератор форума: Kris†a™  
Форум » TES V: Skyrim » Мастерская » Вопросы по скриптам Papyrus (О скриптах Papyrus (Skyrim). Скриптеры не проходите мимо!)

Вопросы по скриптам Papyrus
sansuli  Offline  Сообщение №1 написано: 31 августа 2012, 13:29 | Отредактировано: Multigone - 23 апреля 2020, 14:24


The Red Sun


193
Уроки по скриптованию на языке Papyrus
Прежде чем задать вопрос просмотрите вышеуказанные уроки.
ok


Тема регламентирована.


• Прежде, чем задать вопрос, пожалуйста, убедитесь, что такой вопрос не задавался раньше. Старайтесь описать суть вопроса как можно подробней.
• Прежде, чем опубликовать ответ на вопрос, пожалуйста, убедитесь, что обладаете необходимыми для этого знаниями. Старайтесь cформулировать суть ответа как можно лаконичней.
• При желании ответить в приватном порядке, пожалуйста, воспользуйтесь ЛС.
• При желании поблагодарить ответившего, пожалуйста, воспользуйтесь кнопкой "
+" полезного сообщения.

Сообщения, не относящиеся к вопросам по скриптам Papyrus, ответам на них или уточнениям, являются оффтопом и могут быть удалены.

Красное солнце
Есть вопросы по скриптам Papyrus? Пиши не в ЛС, а в эту тему.
nepewka  Offline  Сообщение №841 написано: 3 апреля 2014, 03:54 | Отредактировано: nepewka - 3 апреля 2014, 04:11



255
AlexTirex, ну для начала огромное спасибо, за такие развернутые посты! А теперь всё по порядку, ведь главное чтобы мы понимали друг друга ;)

Насчет пунктов сразу скажу,  это не перечисление того, как хочется сделать что то 1, а скорее перечисление того, сколько машин я хочу видеть в своем гараже. Разных по своей работе и уникальных. Насколько я понял, ты предлагаешь все эффекты делать через onEffectStart. В дальнейшем так, чтобы было понятнее я буду не название эвента писать, а задумку :)

Теперь по пунктам.

1) OnEffectStart со скоростью прожектайла ~ 25000. Ну как я и говорил выше - не хватает контроля над спеллом...

сначало попробовал

Event OnEffectStart(Actor akTarget, Actor akCaster)
akSpell.Cast(akCaster, akTarget)
akSpell2.Cast(akCaster, akTarget)
akSpell3.Cast(akCaster, akTarget)
endEvent

визуально выглядит конечно, как я изначально и хотел от onEffectStart'a
Вот только вместо двух - трех взрывов, там их штук 20-30 в течении 0.5-1сек происходит, естественно цель моментально умирает.
Причем от бедного стражника Вайтрана, даже тела не остается. Кучка пепла, а порой и её нет.

Мне даже трудно представить, сколько раз срабатывает этот эвент в течении этих несчастных 0.5сек :) Из за такой скорости прожектайла.. . Это всего лишь 3 каста в эвенте, а что будет если больше поставить? Бедные стражники...

Вообщем сам эффект мне впринципе понравился, именно то что я хотел видеть от onEffectStart, но нужны какие то интервалы и временные задержки между срабатыванием эвента, предыдущий способо который описывал LordVadim явно не поможет тут.

2) Не меняя скорость прожектайла, изменил кол-во кастов на стандартный 1

Event OnEffectStart(Actor akTarget, Actor akCaster)

akSpell.Cast(akCaster, akTarget)

endEvent

Ну сам по себе эффект, мне опять же понравился. Было похоже на то, что я хотел видеть от OnSpellCast

Визуально стало видно не взрывы, а то как из моих рук один за одним после первого каста вылетают фаерболлы.. :)

Вот только опять, за 1 секунду штук 15-20 их вылетело. Как из пулемета строчил... Хех, ну тебе самому надо это увидеть, то ещё зрелище :)

Из этого следует, что раз я их визуально стал замечать, то в 1 пункте, явно больше 20-30 вылетало. Бедная игра, этот эвент повторяется с какой то космической скоростью.

Этим мне и не нравится onEffectStart, чуть что попал 1 кастом, эвент в скрипте срабатывает и запускает свой каст, дальше мнгновенно идет 2, 3, 4, 5 и так далее...

Что с этим можно сделать? Повторюсь, хочется именно чтобы в 1 варианте был 1 прожектайл от меня и 3 взрыва его на цели.ъ

"Если Тебе надо один видимый Projecticle и несколько взрывов от него, то это совсем другой вариант, нежели ты описывал ранее. Вот здесь и нужен именно вариант с OnEffectStart в основном эффекте. Тогда при его срабатывании жертва сама на себя кастанёт нужные заклинания и в любом количестве. И не будет лишних визуальных Projecticle, а будет эффект, как будто твой спелл имеет несколько эффектов. "

- Вот вот, это именно то чего я хочу от 1 пункта. PS. (Что прописать в скрипте, чтобы жертва сама на себя кастовала мой фаерболл?)

А от 2 варианта, вот что то типо пулемёта, только не 20 прожектайлов за 1 каст, а скажем 3

3) Вариант. OnHit проехали, переходим сразу к 4 пункту. Постараюсь обьяснить тебе задумку..)

Сразу же, приведу в пример скрипт.







Здесь при проигрывании определенной анимации, будь то силовая атака влево, вправо или по центру кастуется определенный спелл.

Регистрируем http://www.creationkit.com/RegisterForAnimationEvent_-_Form
насколько я понимаю это тоже активмейджикэффект, что вполне подходит нам, если я правильно понимаю.

Выбираем из списка http://www.creationkit.com/Animation_Events

Меня интересуют здесь 
  • BeginCastRight
  • BeginCastLeft


  • CastStop
  • InterruptCast


Пока правда не совсем понимаю, чем CastStop отличается от InterruptCast.

Пойми меня правильно :) Мне понравилась твоя идея с прожектайлом, но смысл этого варианта в том, чтобы без стандартной анимации каста, у нас сработал спелл и вылетел фаерболл.

Как бы тебе обьяснить))

Думаю для тебя не секрет, что у спелла помимо каст тайма (Charge Time в CK), есть ещё кое какая задержка, связанная с анимацией, когда поднимается рука при касте. :)

Даже если мы поставим каст тайм спеллу 0.0 в ките, все равно будет какая то задержка, где то 0.3-0.5 сек, не знаю сколько точно. Это стандартные файлы анимации .hkx их никак не заменить, кроме как замены.

Кароче чтобы кастануть спелл с Charge time 0, все равно приходится задерживать кнопку на мышке на время в предыдущем предложении чтобы каст прошел.

Я хочу сделать, чтобы при малейшем нажатии мышки, не задерживая её, у нас срабатывал animation event, один из тех, которые выше и он же вызывал инстантный фаерболл.

Как думаешь получится сделать?

З.Ы. Извиняюсь за стену, пойми меня правильно [2]. Хочется подхватить побольше знаний, пока есть возможность ;)

Заранее спасибо за ответ!

З.Ы.2

может показаться не вежливым с моей стороны, но можно ли твой скайп или icq в ЛС?
Чтобы ускорить обмен информацией и убрать стены с форума, если ты конечно не против и есть свободная минутка ;)

Alliria  Offline  Сообщение №842 написано: 3 апреля 2014, 06:35 | Отредактировано: Alliria - 3 апреля 2014, 06:39



706
AleksTirexLordVadim, путем манипуляций с блоком OnUpdate выяснила несколько забавных вещей:
- скрипт AleksTirex, который он давал (где цикл внутри цикла) не работал потому, что циклы запускались в блоке OnInit; если его запускать в блоке OnUpdate, то он работает, но AleksTirex сказал, что так делать нельзя, ибо циклы начнут плодиться и -> CTD;
- скрипт LordVadim и любые его модификации, сделанные мной, работал, но вызывал частые вылеты; похоже, CTD происходил при запуске нового цикла проверки, если ГГ в бою, и при очистке мертвых актеров.
Предложите вЫпить йАду и убиться аПстИну? lol
А вот вигвам.
Квестовый скрипт:
Обратите внимание, чистка трупов в одной функции с раздачей. В итоге в бою не вылетает. С расстоянием пока непонятно, к тому же яхз, куда его пихать.
Скрипт алиаса:
Да, я запускаю цикл в OnUpdate, и он работает!


VALKNUT  Offline  Сообщение №843 написано: 3 апреля 2014, 06:42



Цитата LordVadim

Именно через скрипт. Свойству HealOther в СК не забыть присвоить значение.Scriptname CompanionHealthSCRIPT extends Actor ;- Скрипт на компаньоне

Код
Spell Property HealOther Auto ;- Лечение

Event OnInit()
     RegisterForUpdate(3) ;- Включаем процедуру обновления 1 раз в 3 секунды
EndEvent

Event OnUpdate() ;- Процедура обновления
     if Game.GetPlayer().GetAV("Health") < 50 ;- Если здоровье ГГ < 50
         HealOther.Cast(Self, Game.GetPlayer()) ;- Лечим
     EndIf
EndEvent

Что-то у меня это не сработало... Буду признателен, если объяснишь, что еще необходимо выполнить.
Заранее благодарю!

Кто к нам с чем и за чем, тот от того и того... ʘ_ʘ
<a class="link" href="http://modgames.net/load/0-0-200451-0-17" rel="nofollow" target="_blank"> border="0" alt=""/</a>
LordVadim  Offline  Сообщение №844 написано: 3 апреля 2014, 08:47



139
Цитата VALKNUT

Что-то у меня это не сработало... Буду признателен, если объяснишь, что еще необходимо выполнить. Заранее благодарю!



Проверю у себя в СК, потом отпишусь.

AleksTirex  Offline  Сообщение №845 написано: 3 апреля 2014, 11:50


Архимаг


371
nepewka, так ты читай внимательно ;)
 
Но если ты повесишь этот скрипт на основной спелл и назначишь akSpell этот же самый спелл, то получишь цикл, почти бесконечный цикл.


Ты на одно из свойств akSpell назначил этот же спелл, на котором висит этот скрипт, т.е. самого себя. Вот ты и получил цикл. В итоге этот спелл плодит сам себя.
А надо назначать любой другой спелл, хоть самодельный, хоть дефолтный. Тогда при одном касте полетят только те спеллы, что прописаны в свойствах и в количестве равном количеству команд каста. И не будет ГГ строчить как из пулемёта. (я же всё это писал, надо только внимательно читать)

OnEffectEtart работает только один раз, и команды в нём срабатывают тоже только один раз.
 
 
 

Если хочешь сделать "очередь" как из пулемёта, но не бесконечную очередь, а 1-2-3 секунды, то можно так:
 
Event OnEffectStart(Actor akTarget, Actor akCaster)
  int index = 5
  While index > 0
    index -= 1
    akSpellXX.Cast(akCaster, akTarget)
    Utility.Wait(0.2)
  endWhile
endEvent

 
akSpellXX - другой спелл, не этот, на котором висит скрипт (!)
В течении одной секунды вылетит 5 файерболов. Количество кастов и задержку меняй сам по своему желанию.
 
************************
 
Твой пример скрипта не совсем корректный. Там при начале анимации ГГ кастует сам на себя заклинание. Тебе это не подходит, у тебя целевые заклинания (!). А где ты возьмёшь референс цели, на которую должны полететь заряды? Всё упирается именно в это. Пока ты не решишь вопрос с получением референса цели, что-либо дальше делать бесполезно. А вот когда в своём скрипте будет известен этот референс, то можно хоть сотню разных вариантов напридумывать.
 
Вот для этого и нужен скоростной невидимый спелл, который и определит этот референс. Этот спелл/эффект может просто отдать/передать значение референса в любой твой скрипт, и уже в нём можешь как угодно развлекаться с кастами по цели, она ведь будет уже определена.
 
*************
Внимательно прочитай самую первую строчку этого поста и хорошо запомни её. ;)

nepewka  Offline  Сообщение №846 написано: 3 апреля 2014, 12:26 | Отредактировано: nepewka - 3 апреля 2014, 13:21



255
AlexTirex, я понял, благодарю. Всё же когда ты пишешь вот так вот с примерами, всё становится намного понятнее :)

Благодарю за скрипт! add: IT really works!

Последнее, что я могу у тебя попросить, помощи вот с этим

Цитата AleksTirex

Вот для этого и нужен скоростной невидимый спелл, который и определит этот референс. Этот спелл/эффект может просто отдать/передать значение референса в любой твой скрипт, и уже в нём можешь как угодно развлекаться с кастами по цели, она ведь будет уже определена.



В упор не понимаю что нужно сделать.

То есть мне нужно создать совершенно новый спелл, с новым эффектом? Ок.
Скоростной. Я так понимаю velocity в projectile надо ставить что то в районе 100 тысяч, чтобы прожектайла совсем небыло видно?

Невидимый. Что конкретно ты имеешь ввиду? Поставить скорость прожектайла настолько высокой, чтобы его совсем небыло видно? Или же в настройках Magic Effect этого заклинания, все пункты отвечающие за визуальность поставить как None?

Создали мы этот спелл, что дальше. Как сделать из него референс?

Короче говоря, я не могу понять: а) как конкретно спелл может стать референсом? б) Чем спелл может помочь в определении референса цели? (в упор просто не пойму)
в)Как в дальнейшем этот референс можно будет использовать в моих скриптах?
Хотя с моим текущим пониманием ситуации, рано об этом говорить ...)

AleksTirex  Offline  Сообщение №847 написано: 3 апреля 2014, 13:17 | Отредактировано: AleksTirex - 3 апреля 2014, 14:35


Архимаг


371
Цитата nepewka

Создали мы этот спелл, что дальше. Как сделать из него референс?

Короче говоря, я не могу понять: а) как конкретно спелл может стать референсом? б) Чем спелл может помочь в определении референса цели? (в упор просто не пойму)



Из спелла никак не сделать, как и из любого объекта. Референс - это типа как имя, номер изделия, и т.д. У тебя есть имя? Есть, но ведь из тебя не получится сделать твоё имя, его можно только узнать, но не сделать (!).
Так же и с референсом, его можно узнать, какой именно референс у данного объекта, типа "какое имя у объекта".
Каждому объекту в игре назначается свой референс, типа имени или номера, а иначе как бы движок различал объекты в игре. И если надо что-то сделать с объектом, например с Алдуином, надо знать какой у него референс в игре.

Так вот при попадании на НПС заклинания на нём/НПС возникает магический эффект, это ты знаешь, так этот эффект непосредственно висит на этом НПС и он/эффект "знает", на ком именно он висит, что логично. Так можно узнать у этого эффекта, на ком именно он висит, как бы спросить у него.

При возникновении на НПС-жертве маг.эффекта возникает событие - "старт-эффект" Event OnEffectStart(Actor akTarget, Actor akCaster) , которое знает, кто послал это заклинание и в кого оно попало.

Так вот: akCaster - это кто послал этот спелл/заклинание, т.е. кто кастовал его. akTarget - это цель спелла/зклинания, т.е. в кого оно попало и на ком возник данный маг.эффект. Т.е. есть референсы кастующего и жертвы.

Вот этот референс akTarget и надо использовать как цель ГГ для каста новых заклинаний.

******
Сперва пойми и вникни в это. И пойми/разберись, что такое референс и что такое заклинание и маг.эффект. Тогда сможешь дальше сам писать скрипты и делать заклинания. :)

VALKNUT  Offline  Сообщение №848 написано: 3 апреля 2014, 13:25



Ребята, прошу подсказку.

Как отследить момент, когда ГГ дает указание спутнику, чтоб тот взаимодействовал с миром, например обыскал сундук или колол дрова или крафтил ченить?
Благодарю!

Кто к нам с чем и за чем, тот от того и того... ʘ_ʘ
<a class="link" href="http://modgames.net/load/0-0-200451-0-17" rel="nofollow" target="_blank"> border="0" alt=""/</a>
AleksTirex  Offline  Сообщение №849 написано: 3 апреля 2014, 14:23


Архимаг


371
Цитата VALKNUT

Как отследить момент, когда ГГ дает указание спутнику, чтоб тот взаимодействовал с миром, например обыскал сундук или колол дрова или крафтил ченить?



Твой созданный спутник или вообще любой?
 
В Скайриме всё построено на событиях, так вот их и надо отслеживать. Т.е. события, возникающие на НПС-спутнике. Для этого надо записать НПС в свой алиас и в нём отслеживать события, происходящие с НПС. Отслеживать можно изменение пакетов, активацию неписем каких-то объектов (это проще через перк на НПС) и т.д.
 
Если спутник твой, то просто в каждом топике/команде результирующий скрипт, который отдаст "описание" команды, которую даёт ему ГГ.
 
Если НПС может и без приказа что-то начать делать (колоть дрова, крафтить и т.д.), то только первый вариант.

VALKNUT  Offline  Сообщение №850 написано: 3 апреля 2014, 14:32 | Отредактировано: VALKNUT - 3 апреля 2014, 14:36



Цитата AleksTirex

Твой созданный спутник или вообще любой?


Ну, к примеру, я хочу защитить созданного мной персонажа от принесения в жертву Боэтии.
Как решить вопрос игнором этого действия я знаю, но я еще хотел бы встроить в свой мод актуальный ответ ГГ на такой вандализм.
А именно, при указании спутнику на алтарь Боэтии сделать агр персонажа с неизбежной смертью ГГ.

То есть все довольно узко..
Конкретный НПС, конкретная ситуация.

А еще лучше, чтоб вместо НПС к алтарю "примагнитило" ГГ.

Кто к нам с чем и за чем, тот от того и того... ʘ_ʘ
<a class="link" href="http://modgames.net/load/0-0-200451-0-17" rel="nofollow" target="_blank"> border="0" alt=""/</a>
AleksTirex  Offline  Сообщение №851 написано: 3 апреля 2014, 14:45


Архимаг


371
Цитата VALKNUT

А именно, при указании спутнику на алтарь Боэтии сделать агр персонажа с неизбежной смертью ГГ.



Не ругайтесь и не смейтесь - опять заклинание-абилка. :)
 
Делаешь абилку и даёшь алиасу НПС (дак угодно даёшь).
В условиях заклинания (не на эффекте !) ставишь: Target - референс_Боэтии - ==1. И другие нужные условия (если надо).
На эффекте скрипт с нужными тебе командами.
 
Т.е. когда у НПС целью станет статуя Боэтии, тогда запустится эффект и отработает скрипт с твоими командами. Произвольно целью статуя стать не сможет, т.к. цель-Target возникает у НПС в момент, когда НПС "решил" активировать объект и пошёл к нему (вплоть до окончания взаимодействия с этим объектом). Сам по себе НПС ну очень вряд ли пойдёт активировать статую, пока ГГ не даст на это команду.

nepewka  Offline  Сообщение №852 написано: 3 апреля 2014, 15:06 | Отредактировано: nepewka - 3 апреля 2014, 14:55



255
AlexTirex, ну я так, примерно понимаю что референс это существо. Просто ты так написал предыдущий пост, что я подумал что ты знаешь выход))

akTarget как обьект для референса не подходит же?
остается только для каждого обьекта в скрипте указывать индивидуальный референс цели, будь то охраник, дракон или грязекраб

Добавлено (03 Апреля 2014, 19:06)
---------------------------------------------
такой вот вопрос, а если через автостартовый квест задавать референс, такое может прокатить в моем случае?


LordVadim  Offline  Сообщение №853 написано: 3 апреля 2014, 15:11 | Отредактировано: LordVadim - 3 апреля 2014, 15:55



139
Цитата VALKNUT

Что-то у меня это не сработало... Буду признателен, если объяснишь, что еще необходимо выполнить. Заранее благодарю!


Проверил скрипт, у меня работает. Но лучше отслеживать не числовое, а процентное состояние здоровья:

Scriptname aaTestCastSCRIPT extends Actor ;- Скрипт на компаньоне

Spell Property HealOther Auto ;- Лечение

Event OnInit()
    While !IsDead()
        if Game.GetPlayer().GetAVPercentage("Health") < 0.5
 ;- Если здоровье ГГ < 50%
            While Game.GetPlayer().GetAVPercentage("Health") < 1
                HealOther.Cast(Self, Game.GetPlayer())
 ;- Лечим
                Utility.Wait(0.5)
            EndWhile
        EndIf
        Utility.Wait(3)
 ;- Задержка перед очередной проверкой
    EndWhile
EndEvent

AleksTirex  Offline  Сообщение №854 написано: 3 апреля 2014, 15:38


Архимаг


371
nepewka, "выход"... какой выход? Получение референса цели? Так я же всё подробно расписал.
 
Вот этот референс akTarget и надо использовать как цель ГГ для каста новых заклинаний.

 
Референс - это не существо, это идентификационный номер объекта, любого объекта: НПС, грязекраб, статуя, камень на дороге, валяющаяся палка или монетка и т.д. Референс есть у каждого объекта в игровом мире.
 
********************************************
********************************************

LordVadimRegisterForUpdate(3) так нельзя. (читай свой собственный пост немного раньше)
 
Циклы и постоянное обновление вместе делать нельзя. В данном случае это не критично, но всё же не стоит (народ привыкнет так делать и... результат предсказуем ;) )

LordVadim  Offline  Сообщение №855 написано: 3 апреля 2014, 15:40



139
Цитата AleksTirex

Циклы и постоянное обновление вместе делать нельзя. В данном случае это не критично, но всё же не стоит (народ привыкнет так делать и... результат предсказуем )

А так всегда на собственные грабли...  :D
Сейчас подправлю.

nepewka  Offline  Сообщение №856 написано: 3 апреля 2014, 15:48



255
Обьясните, пожалуйста, работу сего скрипта.

Scriptname SpellZapScript extends ObjectReference  
 
import Utility
Actor Property PlayerREF Auto
Float Property xOffset Auto ; Relative X position for the target
Float Property yOffset Auto ; Y Offset for Target
Float Property zOffset Auto ; Z offset for Target
Float Property RandomOffsetX Auto ; Randomness applied to X Offset. Initializes at 0.
Float Property RandomOffsetY Auto ;Randomness applied to Y Offset. Initializes at 0.
Float Property RandomOffsetZ Auto ; Randomness applied to Z Offset. Initializes at 0.
Float Property PulseRate = 1.0 Auto ; How often do we shoot?
Float Property RandomRate Auto ; Add random delay to pulse rate, capped at this value
Activator Property TargetType Auto ; What type of object are we zapping if we're spawning a node?
ObjectReference Property CurrentTarget Auto ; The actual target we're shooting at
Bool Property SpawnNode Auto ; Do we spawn a target? If not, zap the nearest valid target. Initializes 'False'
Spell Property Zap Auto ; What spell shall we use for the effect?
FormList Property TargetTypeList Auto ; List of potential targets
Float Property SeekRange = 1000.0 Auto ; The range it will "Lock into" a target if not making a node.
 
Event OnInit()
    if CurrentTarget ;!= None
    elseIf SpawnNode
        float newXOffset = XOffSet + RandomFloat(-RandomOffsetX, RandomOffsetX)
        float newYOffset = YOffSet + RandomFloat(-RandomOffsetY, RandomOffsetY)
        float newZOffset = ZOffSet + RandomFloat(-RandomOffsetZ, RandomOffsetZ)
        CurrentTarget = PlaceAtme(TargetType)
        CurrentTarget.MoveTo(Self, newXOffSet, newYOffSet, newZOffSet)
    endif
    RegisterForSingleUpdate(PulseRate)
EndEvent
 
Event OnUpdate()
    ; find something nearby to shoot at if we're not making our own target.
    if !SpawnNode && !TargetTypeList && GetDistance(PlayerREF) < SeekRange ; No list given, Default to the player if he is in range.
CurrentTarget = PlayerREF
    elseif TargetTypeList
        CurrentTarget = Game.FindClosestReferenceOfAnyTypeInListfromRef(TargetTypeList, Self, SeekRange)
    endif
    if CurrentTarget ; it's possible that there is no target 
        Zap.Cast(Self,CurrentTarget)
    endif
    RegisterForSingleUpdate(PulseRate + RandomFloat(0.0, RandomRate))
EndEvent

LordVadim  Offline  Сообщение №857 написано: 3 апреля 2014, 17:04



139
AleksTirex, ты случайно не знаешь как просмотреть созданный загрузочный экран (LoadScreen) ?

anton  Offline  Сообщение №858 написано: 3 апреля 2014, 18:08



362
Пришла мне в голову очередная безумная идея, и захотелось узнать такую штуку:
- возможно ли при надетой определённой вещице сделать так, чтобы игровая анимация менялась на мою ?

Например если я надену шапку, то когда подпрыгну - буду висеть в воздухе в позе "лотоса"; а без шапки прыжок оставался бы обычным.
Может кто ни будь встречался с чем то подобным и сможет подсказать как это правильно сделать и какие возможно возникнут проблемы ?

Вот какие функции я думаю использовать:
словить прыжок = RegisterForAnimationEvent() + Event OnAnimationEvent()
запустить свою анимацию = SendAnimationEvent() или PlayAnimation() +FNIS

Мой Блог
сергей007788  Offline  Сообщение №859 написано: 3 апреля 2014, 18:31



76
Подскажите, повесил на дракона камеру и послал далеко. ГГ остался на месте, в итоге локация не подгружается и с дракона видно только лоды. Есть ли команда которая подгружала бы локацию там где находится камера а не гг?

AleksTirex  Offline  Сообщение №860 написано: 3 апреля 2014, 20:33 | Отредактировано: AleksTirex - 3 апреля 2014, 20:41


Архимаг


371
Цитата LordVadim

Например если я надену шапку, то когда подпрыгну - буду висеть в воздухе в позе "лотоса"; а без шапки прыжок оставался бы обычным.



Анимация в Скайриме работает довольно глючно. Отследить событие своей анимации вряд ли получится, разрабы об этом позаботились. :)
Отслеживать событие прыжка тоже... не факт, что сможешь зарегистрировать и получить его событие, ведь довольно мало событий анимации можно так получить.
Если же ты не против SKSE, то всё гораздо проще - следишь за нажатием кнопки "пробел", а это работает стабильно.

Добавлять свою анимацию прыжка и подменять ей дефолтную, скорее всего можно (я именно прыжки не пробовал подменять).
Открываешь в СК анимацию, нужный бехавиор, ActionJamp. Дублируешь JumpRoot и вставляешь его выше родного. Там добавляешь новое условие: "subject - если надета шапка == 1". Возможно, в родной JumpRoot придётся добавить обратное условие: "если не надета шапка". (чаще всего порядок расположения анимаций движком игнорируется)
Далее внутри своего JumpRoot прописываешь свои события анимации. Естественно, что СК надо запускать только после создания своего бехавиора и после обновления мастер-бехавиора FNIS-сом, иначе СК не увидит этих событий. Названия файлов анимации и события должны быть исключительно уникальными, иначе однозначно возникнут лажи (IdleJamp - так писать нельзя).

Далее уже сам крути как хочешь, но зарегистрировать и получить событие этой анимации не получится, просто не сработает, увы. :)
 
Кстати, если ты хочешь сделать последовательную анимацию прыжок+висит, то забудь, FNIS это очень глючно прописывает, и как правило, стартовая анимация (s -a) пропускается и сразу начинает работать бесконечная (+). Это происходит с шансом ~20%, а при первом запуске этой анимации за сеанс ~95%.
Т.е. такую цепочку из анимаций лучше запускать отдельно, каждую анимацию отдельно, а не запускать стартовую в цепочке связанных анимаций.

********************************************

сергей007788, в играх, и Скайрим не исключение, весь мир крутится вокруг игрока, так что... не ищи ответа на этот вопрос. Разве что, телепортировать туда ГГ.

LordVadim  Offline  Сообщение №861 написано: 3 апреля 2014, 21:06 | Отредактировано: LordVadim - 3 апреля 2014, 21:07



139
Цитата сергей007788

Подскажите, повесил на дракона камеру и послал далеко. ГГ остался на месте, в итоге локация не подгружается и с дракона видно только лоды. Есть ли команда которая подгружала бы локацию там где находится камера а не гг?


Попробуй так:

На месте ГГ создаешь Xmarker, чтобы потом его вернуть обратно.
ГГ делаешь невидимым: Game.GetPlayer().SetAlpha(0)
Отключаешь коллизию: Debug.ToggleCollisions()
Цепляешь камеру, отправляешь дракона
Регистрируешь OnUpdate()
И периодически отправляешь ГГ к Дракону:  Game.GetPlayer().TranslateToRef(akDragon, 100000)
...
Потом возвращаешь все обратно:
Отключаешь OnUpdate(), возвращаешь ГГ к Xmarker, включаешь коллизию и видимость игрока.

AleksTirex  Offline  Сообщение №862 написано: 3 апреля 2014, 21:29


Архимаг


371
LordVadim, безумный вариант: делаешь тестовый мод, копируешь в него свой ЗЭ, остальные удаляешь (!), сохраняешься и проверяешь. Поскольку твой там один (и оставь экран майн-меню), то и срабатывать он будет постоянно. Потом ESP удалишь. :)

LordVadim  Offline  Сообщение №863 написано: 3 апреля 2014, 21:40 | Отредактировано: LordVadim - 4 апреля 2014, 08:23



139
Цитата AleksTirex

LordVadim, безумный вариант: делаешь тестовый мод, копируешь в него свой ЗЭ, остальные удаляешь (!), сохраняешься и проверяешь. Поскольку твой там один (и оставь экран майн-меню), то и срабатывать он будет постоянно. Потом ESP удалишь.


Так уже пробовал, почему то не сработало. Сейчас в тестовом моде хочу попробовать в остальные экраны добавить невыполнимое условие. Может так получится.

P.S. Получилось...

nepewka  Offline  Сообщение №864 написано: 4 апреля 2014, 05:21



255
это нормально, что скрипты стакаются?

помню ради интереса наложил на 1 мейджик эффект спелла 5 скриптов с одинаковым содержанием, все они работали...

Alliria  Offline  Сообщение №865 написано: 4 апреля 2014, 06:10



706
Цитата nepewka

это нормально, что скрипты стакаются?

Если не ошибаюсь, стакаются не только скрипты на одном маг.эффекте, но и одинаковые маг.эффекты. Соответственно, если на одну цель наложить один эффект n-цать раз (подозреваю, что 256), двиг вылетит в трубу.

nepewka  Offline  Сообщение №866 написано: 4 апреля 2014, 06:33



255
Цитата Alliria

Если не ошибаюсь, стакаются не только скрипты на одном маг.эффекте, но и одинаковые маг.эффекты. Соответственно, если на одну цель наложить один эффект n-цать раз (подозреваю, что 256), двиг вылетит в трубу.


мало берешь)

сергей007788  Offline  Сообщение №867 написано: 4 апреля 2014, 09:53



76
Спасибо за дракона, и еще вопросик, Когда используешь команду
Translate то перемещаемый объект проходит сквозь стены, если гг поместить на этот объект то гг падает сквозь, есть только лодки из

MovableStatik сквозь них нпк не проваливаются.
Есть ли какие команды или способы сделать чтобы объект к которому применена команда Translate не проходил сквозь стены.
Заранее благодарен.

anton  Offline  Сообщение №868 написано: 4 апреля 2014, 10:47 | Отредактировано: anton - 4 апреля 2014, 11:54



362
AleksTirex, спасибище тебе огромное за идею с "JumpRoot" !!! good

Хотя сам "JumpRoot" мне продублировать не удалось, но зато всё что внутри него - менялось как положено.
Для создания полноценного эффекта пришлось задействовать ещё "FallRoot" и "LandRoot".
Менял я прыжок из неподвижного состояния.
В "JumpRoot" и "LandRoot" я продублировал имеющиеся эвенты и прописал в них одноразовую анимацию.
В "FallRoot" - продублировал и прописал циклическую.
(ну и во всех задействованных эвентах добавил проверку на надетую "шапку").

Теперь без "шапки" работает обычный игровой прыжок. Но если прыгнуть с надетой "шапкой", то запускается вводная анимация из "JupmRoot" плавно переходящая в зацикленную анимацию из "FallRoot". И анимация играет до тех пор, пока не будет активирована боевая стойка (это моё спец. условие на завершение цикличной анимации). Хотя можно сделать направленный прыжок и цикл тоже прервётся, но тогда не отыграет анимация из "LandRoot".

Всё отлично заработало, и даже скрипты писать не пришлось ! :)

Я подозреваю, что таким же образом можно поменять анимацию атаки для уникального оружия, например такого как копьё.
(взял копьё в руки и атаки двуручного меча поменялись на тыканье копьём...)

ПС: непонятно, правда, как игра определяет, когда нужно проиграть анимацию приземления, ведь прыжки могут быть c разной высоты ...
(там какая то переменная "VelocityZ" для этого стоит)

Мой Блог
AleksTirex  Offline  Сообщение №869 написано: 4 апреля 2014, 12:14 | Отредактировано: AleksTirex - 4 апреля 2014, 12:31


Архимаг


371
Цитата anton

MovableStatik сквозь них нпк не проваливаются.

Есть ли какие команды или способы сделать чтобы объект к которому применена команда Translate не проходил сквозь стены.

Заранее благодарен.



Чтобы объект перемещался с сохранением коллизии, надо делать MovableStatik с изменённым нифом, т.е. немного поправить нужный ниф:

bhkRigidBody
Layer:
Заменить OL_STATIC на OL_ANIM_STATIC.
Layer Copy:
Заменить OL_STATIC на OL_ANIM_STATIC.
Motion System:
Заменить MO_SYS_BOX_STABILIZED на MO_SYS_BOX.

В этом случае можно стоять на таком движущемся объекте и не проваливаясь двигаться вместе с ним, т.е. на нём.
При команде TranslateTo() коллизия статиков игнорируется, и объект проходит сквозь них. К сожалению, пока неизвестен вариант это изменить без багов.

anton  Offline  Сообщение №870 написано: 4 апреля 2014, 16:37 | Отредактировано: anton - 4 апреля 2014, 16:51



362
Цитата AleksTirex

Окончание анимации прыжка определяет движок по столкновению с коллизией


Значит в Бихейвиор файле для прыжка должен быть эвент на это событие, попробую его найти...

И ещё, мне показалось, что высота прыжка не зависит от анимации, и определяется как то иначе, возможно через переменные типа SpeedMult (такую я где то видел). Интересно, можно ли будет в прыжке подкинуть своего ГГ повыше, не реализуя это в анимации ?

===========================================================================================

Добавлено (04 Апреля 2014, 20:37)
---------------------------------------------
Отчёт о проделанной работе :) :

1. Коллизия у "статика" сама всё таки не перемещается. (перемещаю триггером со скриптом, командой Stone.TranslateToRef(Place, StoneSpeed))
2. К сожалению да, условия не определяют окончание циклической анимации. Ну и ладно, и так хорошо.
3. Сам не понял чего я там в Бихейвиоре собрался искать и зачем ... но зато (4.)
4. Нашёл в СK "Gameplay"->"Settings" переменную "fJumpHeightMin" отвечающую за высоту прыжка.
(интересно, будет ли работать "SetAnimationVariableFloat("fJumpHeightMin", 200.0)"...) ..... --> не работает :(

Мой Блог
Форум » TES V: Skyrim » Мастерская » Вопросы по скриптам Papyrus (О скриптах Papyrus (Skyrim). Скриптеры не проходите мимо!)
Поиск:





Ответ на жалобу смотрите в разделе жалоб