Модератор форума: 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? Пиши не в ЛС, а в эту тему.
LordVadim  Offline  Сообщение №811 написано: 1 апреля 2014, 09:46



139
Цитата nepewka

LordVadim, можешь скачать один скрипт .pex декомпилировать и выложить мне назад? если не трудно

Лови: cccMagicRainScript10.psc

Aksyonov  Offline  Сообщение №812 написано: 1 апреля 2014, 14:47



937
Господа и дамы есть такой вопрос, может это делается и не при помощи скриптов но как сделать так что бы напарник компаньон лечил вас когда запас вашего здоровья падает до определенной отметки? буду счастлив любому пояснению а если это сделать можно только при помощи скрипта - добрые скриптеры напишите пожалуйста этот сценарий для меня.  ^_^

nepewka  Offline  Сообщение №813 написано: 1 апреля 2014, 23:48 | Отредактировано: nepewka - 1 апреля 2014, 23:49



255
LordVadim, спасибо!

;;;

Воoбщем делаю скрипт под спелл, который накладывает первый эффект на таргет, а после срабатывания первого, накдывает 2 эффект. OnEffectStart

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

Хочу решить добавлением в эвент команды, которая бы после 2 секунд времени работы эвента, неизбежно закрывала его.

Что нужно написать?

LordVadim  Offline  Сообщение №814 написано: 2 апреля 2014, 04:32



139
Цитата nepewka

Хочу решить добавлением в эвент команды, которая бы после 2 секунд времени работы эвента, неизбежно закрывала его. Что нужно написать?


Покажи скрипт.

nepewka  Offline  Сообщение №815 написано: 2 апреля 2014, 05:21 | Отредактировано: nepewka - 2 апреля 2014, 05:28



255
LordVadim

Scriptname newscript extends activemagiceffect

Spell property Fireball auto

Event OnEffectStart(Actor akTarget, Actor akCaster)

Fireball.cast(selfRef)

EndEvent

; суть в том, что после Fireball.cast эвент начинает срабатывать по кругу, пока цель не умрет. Ведь кидая в цель фаерболл(из самого скрипта), стартует действие нового эффекта. Из за этого эвент срабатывает вновь и вновь

Надо поставить, чтобы после Fireball.cast(selfRef)

эвент неизбежно прекращал свою работу, скажем в течении 2 секунд.

Сама задумка в том, чтобы после попадания заклинания в цель, эффект explosion, в моем случае повторный каст фаерболла, срабатывал на цели еще 2-3 раза. Потом все

LordVadim  Offline  Сообщение №816 написано: 2 апреля 2014, 05:46



139
Цитата Aksyonov

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

 
Именно через скрипт. Свойству 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

nepewka  Offline  Сообщение №817 написано: 2 апреля 2014, 06:11 | Отредактировано: nepewka - 2 апреля 2014, 06:12



255
LordVadim, благодарю за скрипт!

Только боюсь эффект именно моего скрипта, прекратит работу раньше, чем через 2 секунды. Или я не прав?

Меня впринципе мой скрипт устраивает в плане работы, но нужно чтобы он прекращал работу после 2 секунд, дабы не убивать цель окончательно.. За 2 секунды, в среднем 3 взрыва происходит от фаерболла.

В твоем, насколько я понимаю, эвент сразу после активации и каста 1 дополнительного фаерболла прекращает работу или же нет?

Добавлено (02 Апреля 2014, 10:11)
---------------------------------------------
Да, я был прав. Твой метод останавливает работу моего скрипта, но раньше чем нужно! :)

есть еще какой нибудь вариант, как нибудь дать моему скрипту поработать, затем уже усыпить его? :)

LordVadim  Offline  Сообщение №818 написано: 2 апреля 2014, 07:11 | Отредактировано: LordVadim - 2 апреля 2014, 07:14



139
Цитата nepewka

есть еще какой нибудь вариант, как нибудь дать моему скрипту поработать, затем уже усыпить его?


Попробуй такой вариант:

Scriptname newscript extends activemagiceffect

Spell property Fireball auto
Int ivCounter = 0

Event OnEffectStart(Actor akTarget, Actor akCaster)
    Fireball.cast(selfRef)
    ivCounter += 1

    if ivCounter > 2 ;- Скрипт сработает 3 раза потом выключится и перезагрузится
        ivCounter = 0
        GoToState("DoNotWork") ;- Переводим скрипт в состояние ничего не делать
        Utility.Wait(2) ;- Задержка 2 сек.
        GoToState("") ;- Возвращаем скрипт в нормальное состояние
    EndIf
EndEvent

State DoNotWork
 ;- Скрипт в состоянии: "Ничего не делать"
    Event OnEffectStart(Actor akTarget, Actor akCaster)
    EndEvent
EndState

nepewka  Offline  Сообщение №819 написано: 2 апреля 2014, 07:27



255
LordVadim, боюсь что это у меня была проблема... Извини. 

Мой скрипт, даже без твоих наработок, почему то не работал.

И вот только только с 15 попытки заработал. Дело в том, что я каждый день после мод работы, удаляю все скрипты и играю в свое сохранение на чистой игре.

Мб такое что игра читает новые скрипты не сразу?

p.s. щас еще раз попробую 2 скрипта твоих

@perture  Offline  Сообщение №820 написано: 2 апреля 2014, 07:34


$cience innov@tor


Цитата nepewka

Мб такое что игра читает новые скрипты не сразу?

Вполне. Я когда на шмот вешал скрипты, то они работали после того, как шмот выкинешь и подберешь снова.

"Не спорьте с идиотами! Вы опуститесь до их уровня, а там они вас задавят своим опытом!" ©
Aksyonov  Offline  Сообщение №821 написано: 2 апреля 2014, 07:36



937
@perture, думаю дело в сохранениях так как для работы скриптов нужно что бы действие с объектом происходило впервые, а если уже лежит в инвентаре не работает ?

@perture  Offline  Сообщение №822 написано: 2 апреля 2014, 07:42


$cience innov@tor


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

"Не спорьте с идиотами! Вы опуститесь до их уровня, а там они вас задавят своим опытом!" ©
nepewka  Offline  Сообщение №823 написано: 2 апреля 2014, 09:33



255
LordVadim, вообще проверил ещё раз оба скрипта..

К сожалению, никакого эффекта от них замечено небыло.

Даже не знаю, вот просто никакого...

LordVadim  Offline  Сообщение №824 написано: 2 апреля 2014, 09:54



139
Цитата nepewka

LordVadim, вообще проверил ещё раз оба скрипта.. К сожалению, никакого эффекта от них замечено небыло. Даже не знаю, вот просто никакого...


Значит причина, скорей всего, в этом: Fireball.cast(selfRef)
Замени на :  Fireball.Cast(akCaster, akTarget)

nepewka  Offline  Сообщение №825 написано: 2 апреля 2014, 10:05 | Отредактировано: nepewka - 2 апреля 2014, 10:06



255
это уже давно сменил, я в 1 раз тебе не правильно написал.

чтобы selfRef работало надо её вначале присвоить к актеру.

иначе он пишет undefined variable

Fireball.cast в скобочках надо указывать от кого идет каст, в нашем случае akCaster

мб у меня с игрой что не так? в CK вики пишут что скрипты со спеллами  экстендить через Form, я же через  activemagiceffect делаю extend. Как сильно это может повлиять?

LordVadim  Offline  Сообщение №826 написано: 2 апреля 2014, 10:19 | Отредактировано: LordVadim - 2 апреля 2014, 10:22



139
Цитата nepewka

Fireball.cast в скобочках надо указывать от кого идет каст, в нашем случае akCaster мб у меня с игрой что не так? в CK вики пишут что скрипты со спеллами  экстендить через Form, я же через  activemagiceffect делаю extend. Как сильно это может повлиять?


У Cast() в скобках два параметра: первый - источник заклинания (кто это заклинание произносит), второй - цель (на кого это заклинание направлено).
Какой скрипт дополнять activemagiceffect или Form зависит от того, куда ты вешаешь скрипт (на актера, на предмет или на заклинание).
Список функций Papyrus

nepewka  Offline  Сообщение №827 написано: 2 апреля 2014, 13:27 | Отредактировано: nepewka - 2 апреля 2014, 10:41



255
странно, у меня с 1 значением в Cast работает нормально...

как правильно понять, куда вешаю?

В моем скрипте участвуют 2 актера и 1 спелл(пока самое простое)
Так куда я вешаю, на актера или же на спелл?

Добавлено (02 Апреля 2014, 14:39)
---------------------------------------------
Кстати всегда спросить хотел, что конкретно означает Get перед командой?

Переводится типа получить, но в некоторых случаях, таких как
GetCastTime или GetNthEffectMagnitude - Spell

вообще не понять, что это конкретно будет делать..

Добавлено (02 Апреля 2014, 14:59)
---------------------------------------------
Кстати, может быть после создания скрипта вот такой вот эвент запускать?

Event OnInit() ; This event will run once, when the script is initialized
   RegisterForSingleUpdate(2.0)
EndEvent

Добавлено (02 Апреля 2014, 17:05)
---------------------------------------------
ADD3  :

Кажется просек в чем проблема с работой скриптов с 1 раза.

Лоад ордер в лаунчере.

Щас опять у меня спелл не работал раз 5-6, изменил новый мод, поставив его на 1 строчку - заработало.

Все моды же всегда на последнем слоте появляются после создания

Добавлено (02 Апреля 2014, 17:27)
---------------------------------------------
на 1 вопрос уже понял ответ) в зависимости от эвента


LordVadim  Offline  Сообщение №828 написано: 2 апреля 2014, 13:41



139
Цитата nepewka

Кажется просек в чем проблема с работой скриптов с 1 раза. Лоад ордер в лаунчере. Щас опять у меня спелл не работал раз 5-6, изменил новый мод, поставив его на 1 строчку - заработало. Все моды же всегда на последнем слоте появляются после создания



Последняя строка в лаунчере - это так сказать наивысший приоритет. Потому, что моды в последней строке перекрывают (при совпадении) данные предыдущих модов.
В твоем случае перемещение на 1 сточку, по идее, никак не должно было влиять на работу скрипта.

nepewka  Offline  Сообщение №829 написано: 2 апреля 2014, 15:04



255
Дак а что конкретно будет GetCastTime возвращать? в упор не понимаю =/
                               ;;;;;;;;;;;;;;;
В СК скрипт добавляю на мейджик эффект :)

                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

В описании говорится: Event called when the script has been created and all its properties have been initialized

 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Тогда я одного совершенно не понимаю, почему один и тот же скрипт, проверенный уже, первые 5-6 компилов и тестов в игре не работает, а только 7 раза начинает пахать...

AleksTirex  Offline  Сообщение №830 написано: 2 апреля 2014, 19:38


Архимаг


371
Для справки:
 
Так делать нельзя, возможны лажи, т.к. событие смерти скорее всего придёт позже окончания эффекта (если не стоит галочка No Dispel Death).
 

 


 
Для гарантированного получения события смерти через маг.эффект достаточно в событиии OnEffectFinish() обозначить условие IsDead() (галочку No Dispel Death обязательно снять), и уже там прописать нужное действие.
 
Event OnEffectFinish(Actor akTarget, Actor akCaster)
  if akTarget.IsDead()
    ; делаем
  endIf
endEvent

 

***********************************************************************************
 
Для получения референса кастующего и цели в маг.эффекте не обязательно использовать перенос переменной из OnEffectStart наружу и запоминать его. Можно их получать непосредственно в теле любой функции скрипта:
 
Function AAA()
Actor akActorCaster = GetCasterActor()
Actor akActorTarget = GetTargetActor()
 ;
endFunction

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

Alliria, если у тебя цель скрипта "повесить абилку на НПС и потом её удалить при отдалении или смрти НПС", то не надо никаких массивов и форм-листов, и не надо вообще запрминать каких-либо НПС. Есть решение проще:
делаешь цикл только на поиск НПС и раздачу абилок тем, у кого нет такой абилки. Это работает на порядок быстрее и надёжнее. На самой абилке условие: расстояние self-player < №№ и GetDead == 0. Тогда абилка сама выключится. Для полного удаления абилки на её эффекте вешается простой скрипт:
 
Spell Property akSpell Auto
Event OnEffectFinish(Actor akTarget, Actor akCaster)
  akTarget.RemoveSpell(akSpell)
endEvent

 
В результате в рабочем скрипте останется только цикл на поиск и раздачу. Несовместимостей и лаж будет минимум.
 
***********************************************************************
 
Так делать нельзя, точнее бесполезно. Пересчёта запусков не будет.
Статус тоже бесполезен, второго OnEffectStart в данном эффекте по определению возниктуть не может. Считать количество OnEffectStart, естественно, тоже не получится.
 



При оконяании эффекта заканчивается работа данного скрипта, и всё, что было в нём - переменные, свойства и т.д. безвозвратно теряются. При следующем возникновении этого эффекта будет работать уже другой скрипт, копия этого, но другой, и все данные в нём будут девственно чисты.
 
Если необходим просчёт количества стартов этого эффекта, то надо запоминать вне этого эффекта, например в квесте или устойчивом референсе. Наапрмер:
 
Event OnEffectStart(Actor akTarget, Actor akCaster)
  (muQuest as muQuestScript).ivCounter += 1
endEvent

 
*****

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

Добавлено (02 Апреля 2014, 23:38)
---------------------------------------------
Форматирование стёрло содержание спойлера, тот оно:
 





LordVadim  Offline  Сообщение №831 написано: 2 апреля 2014, 20:30



139
Цитата AleksTirex

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



AleksTirex, а что происходит в игре если скрипт попал в сохранение, а после он был полностью заменен, то есть название тоже, а содержание (процедуры, события, свойства) другое. Можно новый скрипт как то заставить работать или это не реально?

nepewka  Offline  Сообщение №832 написано: 2 апреля 2014, 20:39 | Отредактировано: nepewka - 2 апреля 2014, 20:57



255
Ух, а вот и чародеи скриптовского цеха подошли 

Ну что же, пока усваивую всю эту информацию и пока учителя тут, закину ещё одну задачку.

Задумка - при спелл касте заклинания, заставить игру помимо основного эффекта, одновременно кинуть ещё 2-3 спелла

(скрипт с соседнего форума)

Spell Property FireballSpell Auto
Int Count
Event OnSpellCast(Form akSpell)
Spell spellCast = akSpell as Spell
if spellCast == FireballSpell
if Count == 2
Count = 0
Else
spellCast.cast(Game.GetPlayer())
Count += 1
endIf
endif
endEvent

Вопрос куда добавляем сей скрипт, чтобы игра его приняла? Добавление в magiceffect результата не принесло. И от чего тут надо расширяться?

LordVadim  Offline  Сообщение №833 написано: 2 апреля 2014, 21:05



139
Цитата nepewka

Вопрос куда добавляем сей скрипт, чтобы игра его приняла? Добавление в magiceffect результата не принесло. И от чего тут надо расширяться?


Можно повесить на алиас игрока, тогда расширять надо ReferenceAlias

AleksTirex  Offline  Сообщение №834 написано: 2 апреля 2014, 21:06


Архимаг


371
Цитата LordVadim

AleksTirex, а что происходит в игре если скрипт попал в сохранение, а после он был полностью заменен, то есть название тоже, а содержание (процедуры, события, свойства) другое. Можно новый скрипт как то заставить работать или это не реально?



Новые события и новые функции работать должны при любом изменении скрипта. Но желательно, чтобы на момент сохранения ВСЕ команды отработали полностью. Особо это касается циклов и OnUpdate(), они продолжат свою работу и в изменённом виде. Хотя, OnUpdate уже станет отрабатывать новые вложенные в него команды, если старые полностью отработали.
Сохранка запоминает своёства и работающие фрагменты скрипта. Если блок (событие/функция) отработали полностью, то их можно смело изменять, они начнут свою работу по новому сценарию.
А вот свойства так и останутся теми, что попали в сохранку, и менять их бесполезно, разве что создавать новые с новыми именами. Ну или грузится с чистой сохранки, что лучше.

nepewka  Offline  Сообщение №835 написано: 2 апреля 2014, 21:08



255
Чем вы так занимаетесь, ребята, что пишите скрипты на таком уровне?

AleksTirex  Offline  Сообщение №836 написано: 2 апреля 2014, 21:34 | Отредактировано: AleksTirex - 2 апреля 2014, 21:29


Архимаг


371
spellCast.cast(Game.GetPlayer())

Так нельзя, ГГ будет бросать спелл себе под ноги. Ведь спелл целевой, а не на себя, поэтому цель надо обозначить.
Проблема именно в определении этой цели, в её референсе. С НПС проще, можно взять Target и использовать как цель. С ГГ сложнее, Target толком не работает на нём, т.е. движок не может определить цель игрока.

Но можно схитрить и обмануть движок:
1. Делается свой визуально невидимый Projecticle с большой скоростью.
2. В основной спелл назначается этот Projecticle, и именно этим спеллом будет лупить ГГ.
3. На этот эффект вешается простой скрипт, который отдаёт референс жертвы, она и есть наша цель. Далее отдаёт его в ... это уже дело хозяйское куда именно, но туда, где будет команда для визуальных кастов, хоть дюжины.
Это можно сделать и в этом эффекте и никуда не передавать:

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

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

Добавлено (03 Апреля 2014, 01:34)
---------------------------------------------
Забыл добавить: спеллы надо делать одного типа, чтобы визуально было подобие родного каста, ведь командой кастуется спелл без анимации.


nepewka  Offline  Сообщение №837 написано: 2 апреля 2014, 22:15 | Отредактировано: nepewka - 2 апреля 2014, 22:16



255
AleksTirex, это onEffectStart

а onSpellCast, чтобы за 1 каст спелла 2-3 прожектайла вылетало вместо одного, можно сделать?

;================;

Вообще мне больше всего хочется, научится делать эффекты следущего типа:

1) OnEffectStart ( Пока дополнительные фаирболлы летят от меня, а можно ли сделать так, чтобы не от меня они летели, а после попадания основного первого фаерболла, взрывались на цели. То есть щас при срабатывания скрипта, от меня летят ещё касты.

Понимаю, что конечно проще сделать так, чтобы в 1 фаерболе были эффекте трех спеллов, но для красоты хочется именно чтобы Спелл летел один, а на цели взрывался уже как 3 каста.

2) OnSpellCast. Ну тут хочется сделать всё то, что есть в первом пункте, только чтобы от меня летели фаерболлы не после старта эффекта на таргете, а после запуска спелла от меня.

3) onHit. Хотел изначально и с этим что то сделать, но уж слишком будет схоже с 1 пунктом. Что можно с этим эвентом и спеллом каким нибудь сделать уникального, может вы подскажете? =) Какие нибудь ещё эвенты, в которых спелл благодаря скрипту мог бы работать уникально и отличаться, так скажем, от своих собратьев =)

4) SpellCast on Animation event. Самое главное и последний пункт. Что то на уровне бладскал блейда хочется сделать.

Animation events в CK wiki. Там есть анимации, BeginCastLeft, BeginCastRight, StopCast

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

Как думаешь, Алекс, насколько всё реально реализовать?

Да, моих знаний на данном этапе совершенно не достаточно, но уж очень хочется и интересно учится в такой сфере. Мечта, скажем так :)

Добавлено (03 Апреля 2014, 02:15)
---------------------------------------------
add:

Кстати, проблема кастов в пол без обходов не решаема, как я понял.

спелл от тебя всегда будет лететь по твоему прицелу.

К примеру, простейший скрипт

Scriptname AAAfire1 extends activemagiceffect

Spell Property Fireball Auto

Event OnEffectStart(Actor akTarget, Actor akCaster)

Fireball.cast(akCaster, akTarget)

EndEvent

Если попадаешь первым своим кастом, потом просто стоишь на месте и от тебя летят фаерболы один за одним по твоему прицелу. Если прицелиться в землю, кстати, эвент прекращает свою работу :)

AleksTirex  Offline  Сообщение №838 написано: 2 апреля 2014, 23:15


Архимаг


371
nepewka, а почему именно onSpellCast? Чем плохо событие OnEffectStart?
 
Тогда внимательно читаем мой пост:
Проблема именно в определении этой цели, в её референсе.
Так вот при любом событии, хоть onSpellCast, хоть при OnHit и т.д. нужно знать референс цели, куда направить заклинание. А где его взять то? Вот OnEffectStart и выдаст нам этот референс.
 
Если сделать быстрый Projecticle, то практически срезу при касте будет известен референс цели. И видимый спелл полетит в цель почти сразу же, так будет видимость, что именно этот спелл и кастовал ГГ.
 
Если Тебе надо один видимый Projecticle и несколько взрывов от него, то это совсем другой вариант, нежели ты описывал ранее. Вот здесь и нужен именно вариант с OnEffectStart в основном эффекте. Тогда при его срабатывании жертва сама на себя кастанёт нужные заклинания и в любом количестве. И не будет лишних визуальных Projecticle, а будет эффект, как будто твой спелл имеет несколько эффектов.

№ 3) - OnHit работать не будет. Какие либо другие события тоже не будут. Ведь любое событие должно на чём-то висеть. И оно отслеживает "что именно произошло с этим объектом". Так OnHit - это событие возникает, когда объект получает удар. И именно тот объект, на котором висит этот скрипт с этим событием. Чтобы его использовать, надо на всех возможных в игре жертвах повесить скрипт с этим событием, а это... сам понимаешь. Точно так же и с любым другим событием.
 
№ 4) вообще не понял.
 
"Смысл в том, чтобы не кастуя основной спелл, лишь запуская на долю секунды его анимацию, у нас вылетал уже готовый спелл по скрипту.. "
Вот это я и предлагал с быстрым Projecticle. (смотри начало этого поста)
 
Ты определись, сколько видимых Projecticle ты хочешь, и сколько и как видимых "взрывов". В разных пунктах своего поста у тебя разные мнения/пожелания.

Добавлено (03 Апреля 2014, 02:43)
---------------------------------------------

Цитата nepewka

Animation events в CK wiki. Там есть анимации, BeginCastLeft, BeginCastRight, StopCast  Смысл в том, чтобы не кастуя основной спелл, лишь запуская на долю секунды его анимацию, у нас вылетал уже готовый спелл по скрипту..



Вот сам принцип этого:
 
Debug.SendAnimationEvent(Game.GetPlayer(), "BeginCastLeft")
Utility.Wait(0.5)
akSpell.Cast(Game.GetPlayer(), akTarget)

 
Но опять же, нужен референс цели akTarget. (а где его взять?..)
BeginCastLeft - должно быть событие, а не ID анимации (в настройках анимации оно написано)
Писать эти команды можно где угодно и в любом скрипте, событии, функции.

Alliria  Offline  Сообщение №839 написано: 2 апреля 2014, 23:19 | Отредактировано: Alliria - 2 апреля 2014, 23:35



706
Цитата AleksTirex

Alliria, если у тебя цель скрипта "повесить абилку на НПС и потом её удалить при отдалении или смрти НПС", то не надо никаких массивов и форм-листов, и не надо вообще запрминать каких-либо НПС. Есть решение проще:делаешь цикл только на поиск НПС и раздачу абилок тем, у кого нет такой абилки.

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

Хотя хотелось универсального решения старой задачи "динамического назначения скриптов актерам" не через Cloack эффект с прицепленным скриптом. unsure

AleksTirex  Offline  Сообщение №840 написано: 2 апреля 2014, 23:40


Архимаг


371
Alliria, так нет проблем. ;)
Делаешь одну абику, и в ней сколько надо разных маг.эффектов. В каждом эффекте свои условия на своего актёра. Так при получении общей абики у каждого актёра сработает свой эффект, условия которого совпадут.
 
Все манипуляции можно проводить в том же эффекте, а можно и сделать отдельный эффект для всех актёров, а в нём играться с одеждой и прочим. Если возникнут проблемы нежелательного отключения эффекта и потере данных, то можно все функции и переменные вынести в не выключаемый квестовый скрипт, и уже командой из эффекта запускать нужные функции в том скрипте, при этом передавая все нужные данные в тот скрипт.
 
Проще, чем простое сканирование и простая раздача - уже никак, меньше просто некуда. Все остальные проверки пусть сам движок делает в своём дефолтном режиме.

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





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