• Прежде, чем задать вопрос, пожалуйста, убедитесь, что такой вопрос не задавался раньше. Старайтесь описать суть вопроса как можно подробней. • Прежде, чем опубликовать ответ на вопрос, пожалуйста, убедитесь, что обладаете необходимыми для этого знаниями. Старайтесь cформулировать суть ответа как можно лаконичней. • При желании ответить в приватном порядке, пожалуйста, воспользуйтесь ЛС. • При желании поблагодарить ответившего, пожалуйста, воспользуйтесь кнопкой "+" полезного сообщения.
Сообщения, не относящиеся к вопросам по скриптам Papyrus, ответам на них или уточнениям, являются оффтопом и могут быть удалены.
Красное солнце Есть вопросы по скриптам Papyrus? Пиши не в ЛС, а в эту тему.
Господа и дамы есть такой вопрос, может это делается и не при помощи скриптов но как сделать так что бы напарник компаньон лечил вас когда запас вашего здоровья падает до определенной отметки? буду счастлив любому пояснению а если это сделать можно только при помощи скрипта - добрые скриптеры напишите пожалуйста этот сценарий для меня.
Изменение репутации для пользователя nepewka
nepewkaOffline
Сообщение №813
написано: 1 апреля 2014, 23:48
| Отредактировано: nepewka - 1 апреля 2014, 23:49
Event OnEffectStart(Actor akTarget, Actor akCaster)
Fireball.cast(selfRef)
EndEvent
; суть в том, что после Fireball.cast эвент начинает срабатывать по кругу, пока цель не умрет. Ведь кидая в цель фаерболл(из самого скрипта), стартует действие нового эффекта. Из за этого эвент срабатывает вновь и вновь
Надо поставить, чтобы после Fireball.cast(selfRef)
эвент неизбежно прекращал свою работу, скажем в течении 2 секунд.
Сама задумка в том, чтобы после попадания заклинания в цель, эффект explosion, в моем случае повторный каст фаерболла, срабатывал на цели еще 2-3 раза. Потом все
Господа и дамы есть такой вопрос, может это делается и не при помощи скриптов но как сделать так что бы напарник компаньон лечил вас когда запас вашего здоровья падает до определенной отметки? буду счастлив любому пояснению а если это сделать можно только при помощи скрипта - добрые скриптеры напишите пожалуйста этот сценарий для меня.
Именно через скрипт. Свойству 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
nepewkaOffline
Сообщение №817
написано: 2 апреля 2014, 06:11
| Отредактировано: nepewka - 2 апреля 2014, 06:12
Только боюсь эффект именно моего скрипта, прекратит работу раньше, чем через 2 секунды. Или я не прав?
Меня впринципе мой скрипт устраивает в плане работы, но нужно чтобы он прекращал работу после 2 секунд, дабы не убивать цель окончательно.. За 2 секунды, в среднем 3 взрыва происходит от фаерболла.
В твоем, насколько я понимаю, эвент сразу после активации и каста 1 дополнительного фаерболла прекращает работу или же нет?
Добавлено (02 Апреля 2014, 10:11) --------------------------------------------- Да, я был прав. Твой метод останавливает работу моего скрипта, но раньше чем нужно!
есть еще какой нибудь вариант, как нибудь дать моему скрипту поработать, затем уже усыпить его?
Изменение репутации для пользователя LordVadim
LordVadimOffline
Сообщение №818
написано: 2 апреля 2014, 07:11
| Отредактировано: LordVadim - 2 апреля 2014, 07:14
есть еще какой нибудь вариант, как нибудь дать моему скрипту поработать, затем уже усыпить его?
Попробуй такой вариант:
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
LordVadim, боюсь что это у меня была проблема... Извини.
Мой скрипт, даже без твоих наработок, почему то не работал.
И вот только только с 15 попытки заработал. Дело в том, что я каждый день после мод работы, удаляю все скрипты и играю в свое сохранение на чистой игре.
@perture, думаю дело в сохранениях так как для работы скриптов нужно что бы действие с объектом происходило впервые, а если уже лежит в инвентаре не работает ?
это уже давно сменил, я в 1 раз тебе не правильно написал.
чтобы selfRef работало надо её вначале присвоить к актеру.
иначе он пишет undefined variable
Fireball.cast в скобочках надо указывать от кого идет каст, в нашем случае akCaster
мб у меня с игрой что не так? в CK вики пишут что скрипты со спеллами экстендить через Form, я же через activemagiceffect делаю extend. Как сильно это может повлиять?
Изменение репутации для пользователя LordVadim
LordVadimOffline
Сообщение №826
написано: 2 апреля 2014, 10:19
| Отредактировано: LordVadim - 2 апреля 2014, 10:22
Fireball.cast в скобочках надо указывать от кого идет каст, в нашем случае akCaster мб у меня с игрой что не так? в CK вики пишут что скрипты со спеллами экстендить через Form, я же через activemagiceffect делаю extend. Как сильно это может повлиять?
У Cast() в скобках два параметра: первый - источник заклинания (кто это заклинание произносит), второй - цель (на кого это заклинание направлено). Какой скрипт дополнять activemagiceffect или Form зависит от того, куда ты вешаешь скрипт (на актера, на предмет или на заклинание). Список функций Papyrus
Изменение репутации для пользователя nepewka
nepewkaOffline
Сообщение №827
написано: 2 апреля 2014, 13:27
| Отредактировано: nepewka - 2 апреля 2014, 10:41
странно, у меня с 1 значением в Cast работает нормально...
как правильно понять, куда вешаю?
В моем скрипте участвуют 2 актера и 1 спелл(пока самое простое) Так куда я вешаю, на актера или же на спелл?
Добавлено (02 Апреля 2014, 14:39) --------------------------------------------- Кстати всегда спросить хотел, что конкретно означает Get перед командой?
вообще не понять, что это конкретно будет делать..
Добавлено (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 вопрос уже понял ответ) в зависимости от эвента
Кажется просек в чем проблема с работой скриптов с 1 раза. Лоад ордер в лаунчере. Щас опять у меня спелл не работал раз 5-6, изменил новый мод, поставив его на 1 строчку - заработало. Все моды же всегда на последнем слоте появляются после создания
Последняя строка в лаунчере - это так сказать наивысший приоритет. Потому, что моды в последней строке перекрывают (при совпадении) данные предыдущих модов. В твоем случае перемещение на 1 сточку, по идее, никак не должно было влиять на работу скрипта.
Дак а что конкретно будет GetCastTime возвращать? в упор не понимаю =/ ;;;;;;;;;;;;;;; В СК скрипт добавляю на мейджик эффект
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
В описании говорится: Event called when the script has been created and all its properties have been initialized
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Тогда я одного совершенно не понимаю, почему один и тот же скрипт, проверенный уже, первые 5-6 компилов и тестов в игре не работает, а только 7 раза начинает пахать...
Для гарантированного получения события смерти через маг.эффект достаточно в событиии 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, естественно, тоже не получится.
Scriptname newscript extends activemagiceffect
При оконяании эффекта заканчивается работа данного скрипта, и всё, что было в нём - переменные, свойства и т.д. безвозвратно теряются. При следующем возникновении этого эффекта будет работать уже другой скрипт, копия этого, но другой, и все данные в нём будут девственно чисты.
Если необходим просчёт количества стартов этого эффекта, то надо запоминать вне этого эффекта, например в квесте или устойчивом референсе. Наапрмер:
Event OnEffectStart(Actor akTarget, Actor akCaster) (muQuest as muQuestScript).ivCounter += 1 endEvent
*****
Для справки: таким же эффектом обладают массивы (!), при перезапуске скрипта они обнуляюся и их надо назначать по новой. Напимер, если создать массив в квестовом скрипте, то при выключении квеста массив стирается, что не происходит с другими переменными и свойствами в этом скрипте.
Скрипты начинают работать сразу при их создании и инициализации в игре. Если скрипт не запустился, то ищите причину не в порядке загрузки и прочем подобном, а в самом написании скрипта. Скрипт может не запустится, если его команда "зависает" и/или не может выполнится, из-за некорректных команд и т.д. Так же следует проверить "возможно, уже запущен твой маг.эффект", вот скрипт и как бы не срабатывает, т.е. стартеффект не запускается, что вполне естественно. Событие-функция OnInit() отрабатывает только один раз при инициализации скрипта движком. В квестах оно срабатывает ещё и при каждом запуске этого квеста (квестовый скрипт и алиас). Так же не надо забывать о свойствах - они не изменятся, если скрипт уже начал свою работу и вы сохранились. Как не меняй значение этого своёства в СК, оно так и останется тем старым, что было при запуске скрипта, эти данные остаются в сохранке.
Добавлено (02 Апреля 2014, 23:38) --------------------------------------------- Форматирование стёрло содержание спойлера, тот оно:
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
Так же не надо забывать о свойствах - они не изменятся, если скрипт уже начал свою работу и вы сохранились. Как не меняй значение этого своёства в СК, оно так и останется тем старым, что было при запуске скрипта, эти данные остаются в сохранке.
AleksTirex, а что происходит в игре если скрипт попал в сохранение, а после он был полностью заменен, то есть название тоже, а содержание (процедуры, события, свойства) другое. Можно новый скрипт как то заставить работать или это не реально?
Изменение репутации для пользователя nepewka
nepewkaOffline
Сообщение №832
написано: 2 апреля 2014, 20:39
| Отредактировано: nepewka - 2 апреля 2014, 20:57
AleksTirex, а что происходит в игре если скрипт попал в сохранение, а после он был полностью заменен, то есть название тоже, а содержание (процедуры, события, свойства) другое. Можно новый скрипт как то заставить работать или это не реально?
Новые события и новые функции работать должны при любом изменении скрипта. Но желательно, чтобы на момент сохранения ВСЕ команды отработали полностью. Особо это касается циклов и OnUpdate(), они продолжат свою работу и в изменённом виде. Хотя, OnUpdate уже станет отрабатывать новые вложенные в него команды, если старые полностью отработали. Сохранка запоминает своёства и работающие фрагменты скрипта. Если блок (событие/функция) отработали полностью, то их можно смело изменять, они начнут свою работу по новому сценарию. А вот свойства так и останутся теми, что попали в сохранку, и менять их бесполезно, разве что создавать новые с новыми именами. Ну или грузится с чистой сохранки, что лучше.
Так нельзя, ГГ будет бросать спелл себе под ноги. Ведь спелл целевой, а не на себя, поэтому цель надо обозначить. Проблема именно в определении этой цели, в её референсе. С НПС проще, можно взять Target и использовать как цель. С ГГ сложнее, Target толком не работает на нём, т.е. движок не может определить цель игрока.
Но можно схитрить и обмануть движок: 1. Делается свой визуально невидимый Projecticle с большой скоростью. 2. В основной спелл назначается этот Projecticle, и именно этим спеллом будет лупить ГГ. 3. На этот эффект вешается простой скрипт, который отдаёт референс жертвы, она и есть наша цель. Далее отдаёт его в ... это уже дело хозяйское куда именно, но туда, где будет команда для визуальных кастов, хоть дюжины. Это можно сделать и в этом эффекте и никуда не передавать:
4. Делается спелл или берётся уже готовый, который будет визуально кастоваться на уже известную нам цель/референс.
Можно дать небольшую задержку между кастами, для большей визуальности.
Добавлено (03 Апреля 2014, 01:34) --------------------------------------------- Забыл добавить: спеллы надо делать одного типа, чтобы визуально было подобие родного каста, ведь командой кастуется спелл без анимации.
Изменение репутации для пользователя nepewka
nepewkaOffline
Сообщение №837
написано: 2 апреля 2014, 22:15
| Отредактировано: nepewka - 2 апреля 2014, 22:16
а 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
Если попадаешь первым своим кастом, потом просто стоишь на месте и от тебя летят фаерболы один за одним по твоему прицелу. Если прицелиться в землю, кстати, эвент прекращает свою работу
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 Смысл в том, чтобы не кастуя основной спелл, лишь запуская на долю секунды его анимацию, у нас вылетал уже готовый спелл по скрипту..
Но опять же, нужен референс цели akTarget. (а где его взять?..) BeginCastLeft - должно быть событие, а не ID анимации (в настройках анимации оно написано) Писать эти команды можно где угодно и в любом скрипте, событии, функции.
Изменение репутации для пользователя Alliria
AlliriaOffline
Сообщение №839
написано: 2 апреля 2014, 23:19
| Отредактировано: Alliria - 2 апреля 2014, 23:35
Alliria, если у тебя цель скрипта "повесить абилку на НПС и потом её удалить при отдалении или смрти НПС", то не надо никаких массивов и форм-листов, и не надо вообще запрминать каких-либо НПС. Есть решение проще:делаешь цикл только на поиск НПС и раздачу абилок тем, у кого нет такой абилки.
На абилке я пытаюсь добиться устойчивой работы скрипта. Когда это будет, я хочу ввести в скрипт учет типа существ. Для каждого типа будут выдаваться свои абилки. Когда это будет, можно добавлять в маг.эффекты абилок скрипты (как минимум, надо реализовать определение типа входящего урона и разрушение оружия). Потом пойдут манипуляции с инвентарем и уровневыми списками (замена экипировки). Если все это можно сделать в одной абилке - то сделаю, как ты сказал.
Хотя хотелось универсального решения старой задачи "динамического назначения скриптов актерам" не через Cloack эффект с прицепленным скриптом.
Alliria, так нет проблем. Делаешь одну абику, и в ней сколько надо разных маг.эффектов. В каждом эффекте свои условия на своего актёра. Так при получении общей абики у каждого актёра сработает свой эффект, условия которого совпадут.
Все манипуляции можно проводить в том же эффекте, а можно и сделать отдельный эффект для всех актёров, а в нём играться с одеждой и прочим. Если возникнут проблемы нежелательного отключения эффекта и потере данных, то можно все функции и переменные вынести в не выключаемый квестовый скрипт, и уже командой из эффекта запускать нужные функции в том скрипте, при этом передавая все нужные данные в тот скрипт.
Проще, чем простое сканирование и простая раздача - уже никак, меньше просто некуда. Все остальные проверки пусть сам движок делает в своём дефолтном режиме.
Форум » TES V: Skyrim » Мастерская » Вопросы по скриптам Papyrus (О скриптах Papyrus (Skyrim). Скриптеры не проходите мимо!)