• Прежде, чем задать вопрос, пожалуйста, убедитесь, что такой вопрос не задавался раньше. Старайтесь описать суть вопроса как можно подробней. • Прежде, чем опубликовать ответ на вопрос, пожалуйста, убедитесь, что обладаете необходимыми для этого знаниями. Старайтесь cформулировать суть ответа как можно лаконичней. • При желании ответить в приватном порядке, пожалуйста, воспользуйтесь ЛС. • При желании поблагодарить ответившего, пожалуйста, воспользуйтесь кнопкой "+" полезного сообщения.
Сообщения, не относящиеся к вопросам по скриптам Papyrus, ответам на них или уточнениям, являются оффтопом и могут быть удалены.
Красное солнце Есть вопросы по скриптам Papyrus? Пиши не в ЛС, а в эту тему.
Изменение репутации для пользователя modgms_user
modgms_userOffline
Сообщение №2641
написано: 5 февраля 2018, 12:59
| Отредактировано: Multigone - 22 апреля 2020, 12:47
Приветствую. Есть вопрос о целесообразности определенного кода. Есть такой мод NIOHighHeels, в нем есть скрипт со следующим фрагментом:
Код
Event OnDeath(Actor akKiller) If effectActor Self.RemoveEffect() EndIf EndEvent
Event OnUnload() If effectActor Self.RemoveEffect() EndIf EndEvent
Event OnCellDetach() If effectActor Self.RemoveEffect() EndIf EndEvent
Event OnDetachedFromCell() If effectActor Self.RemoveEffect() EndIf EndEvent
Function RemoveEffect() Self.Dispel() EndFunction
Т.е. при этих событиях установлено снимать эффект. Но в логе вижу периодические сообщения об ошибках:
Error: Unable to call Dispel - no native object bound to the script object, or object is of incorrect type stack: [None].NIOVHHScaleEffect.Dispel() - "" Line ? [None].NIOVHHScaleEffect.RemoveEffect() - "NIOVHHScaleEffect.psc" Line ## [None].NIOVHHScaleEffect.OnCellDetach() - "NIOVHHScaleEffect.psc" Line ##
Есть ли в этом коде вообще смысл? Может эффект прибивается при этих событиях и без надобности его снятия? Эффект поднимает перса, когда на нем высокие сапоги. Может этот кусок кода закомментировать?(точнее, я то закомментировал и проверю, но интересно узнать теорию. )
Просто на одной страничке с интерпретацией различных ошибок папируса читал вот такое:
When a magic effect is ready to expire, the Papyrus VM will aggressively destroy the instance of the script. It will generate errors like this if the script had an event pending before this happened.
можно перком Activate получить референс "активируемого" игроком объекта, сделать что нужно (проверить, положить предметы, еtс.) и потом активировать его по-настоящему
Спасибо за совет, только пока, полагаю, не могу воспользоваться, если правильно думаю. Там есть какие-то особенности, где-то специально галочки надо поставить? Создал перк, сделал Entry Point Activate, выбрал активировать немедленно, вставил скрипт, записал в функцию Fragment_0 код и добавил debug.trace, чтобы проверить, работает ли, но строки в логе нет, хотя в сохранении скрипт есть. Пробовал и условия во все три места добавлять(для перка, для активирующего и активируемого), вроде условия для активирующего GetIsID=Player , в условия перка тоже условие добавлял, вообще удалял все условия, но проверочной строчки так и не увидел. Что-то где-то пропустил и дойти никак не может. Код примерно такой:
Здравствуйте вопрос такой: есть ли скрипт который удаляет все предметы из инвентаря npc кроме одежды? Armor Cloth... очень бы пригодился.
Если можно использовать SKSE то
Код
Keyword Property ArmorCloth Auto Function ReweighIngredientsIn(ObjectReference akContainer, Float afWeight) Global Int iFormIndex = akContainer.GetNumItems() While iFormIndex > 0 iFormIndex -= 1 Form kForm = akContainer.GetNthForm(iFormIndex) If !kForm.HasKeyword(ArmorCloth) akContainer.RemoveItem(kForm, akContainer.GetItemCount(kForm)) EndIf EndWhile EndFunction
Вопрос к скриптерам: существует ли в папирусе аналог консольной команды PCB? PurgeCellBuffers, если точнее, для чистки ячеек. В консоли она вроде как работает, но в функциях не нашел. Хочется смастерить простецкий модик, а то надоело постоянно консоль юзать.
Изменение репутации для пользователя Aksyonov
AksyonovOffline
Сообщение №2647
написано: 2 марта 2018, 04:46
| Отредактировано: Aksyonov - 2 марта 2018, 04:47
Здравствуйте уважаемые - вопрос такой: можно ли применить морфинг скриптом? Нужно изменить навсегда физиономию ГГ что бы он исказился в гримасе ненависти! Это реально организовать? В бою он скалится допустим, как это работает?
Вопрос - как мне "добавить" скрипт в конец сцены? Я пытался посмотреть, на примере сцены из квеста DLC2SoulSteal, но там нет конкретной опции, для того, чтобы добавить существующий скрипт, а есть только непонятное поле с Advanced и вполне ясное Papyrus Fragment. Если я вписываю свой скрипт в Papyrus Fragment, то CK выдаёт ошибку, хотя сам по себе скрипт прекрасно работает и компилируется. Сам скрипт:
Scriptname DSMiraak extends Scene GlobalVariable Property DSMiraakCount Auto float Property DSM Auto Function DoSmth() DSM = DSMiraakCount.Getvalue() DSM+=1 DSMiraakCount.SetValue(DSM) EndFunction
P.s: DSMiraakCount присвоено значение моей глобальной переменной DSMiraakCount, у которой изначальное значение "0" и тип - Short. DSM через Property задано значение "0". По идее, это не важно (так как её значение будет перезаписано другим), но я настроил её, на всякий случай.
По идее, если всё заработает правильно и мне удастся "прикрепить" скрипт к концу сцены, значение DSMiraakCount после каждой проигранной сцены (т.е. после поглощения души Мираком) должно будет увеличиваться на 1. Но как привязать свой рабочий скрипт я не знаю, поэтому и обращаюсь к вам.
Скрипт сохраняется без ошибок, свойства выставил, но в игре звук не работает все же..
- как проверить что маркер находится в конкретной ячейке? какую функцию лучше использовать для проверки (IsInLocation, GetCurrentLocation, GetLocation...), и как?
Заранее спасибо за любую помощь. Подойдет так же пример из игры, если таковой есть.
Скрипт сохраняется без ошибок, свойства выставил, но в игре звук не работает все же..
Если имя переменной совпадает с названием любого типа переменных, компилятор выдаст ошибку "cannot name a variable or property the same as a known type or script".
Для скрипта ActiveMagicEffect это должно быть что-то вроде:
Для скрипта ActiveMagicEffect это должно быть что-то вроде:
Все изменил, но звук так и не заработал. Звук дефолтный из игры. Поменял так же свой звук на звук пчелы в банке (он точно в скриптах используется) - ничего. Возможно звуки просто не могут работать в эффектах?
Multigone, короче смотри - есть заклинание со скриптовым эффектом, и, в зависимости от результата, проигрываются разные звуки. Т.е. если условия соблюдается, то проигрывается 1й звук, если нет то 2й. Собственно я уже впихнул туда Debug.Notification, но хотелось бы еще чтоб звук был. Я не стал весь скрипт приводить полностью, меня интересовало только как можно воспроизвести звук в скрипте. Но если это невозможно, то пусть.
Кстати, да, спасибо за информацию по GetCurrentLocation - работает. Правда, оказалось еще можно использовать GetParentCell() для этих целей
Изменение репутации для пользователя Multigone
MultigoneOffline
Сообщение №2656
написано: 2 апреля 2018, 23:20
| Отредактировано: Multigone - 2 апреля 2018, 23:20
Multigone, а можешь подсказать как сделать противоположный скрипт запирания. Хотелось бы сделать через EVENT OnEffectStart(). Попробовал вот такой вариант:
Код
Import Debug Import Game Bool iLevel
EVENT OnEffectStart(Actor akTarget, Actor akCaster) iLevel = GetPlayer().GetActorValue("Alteration") If akTarget.IsLocked() == 0 akTarget.Lock(iLevel) Notification("Заклинание создало замок!") else Notification("Замок уже есть!") endif ENDEVENT
Опять же, все нормально сохраняется, но скрипт не работает. Такое впечатление, что заклинание вообще не видит этот скрипт.
Изменение репутации для пользователя Multigone
MultigoneOffline
Сообщение №2658
написано: 6 апреля 2018, 00:58
| Отредактировано: Multigone - 6 апреля 2018, 01:00
Wertys, он и не будет работать, т.к. маг. эффект (и его скрипт) будет запускаться только на актерах. Нужно это делать все так же через алиас с onHit().
Код
Spell Property MySpell Auto
EVENT OnHit(... IF akSource == MySpell If !GetRef().IsLocked() GetRef().Lock(GetPlayer().GetActorValue("Alteration")) Notification("Заклинание создало замок!") else Notification("Замок уже есть!") endif ENDIF ENDEVENT
Multigone, да попробовал уже и через Event OnHit, и алиас, и Event OnMagicEffectApply - ничего. Как будто не видит заклинание скрипт, шейдеры работают, скрипт нет. Алиас сделал в том же квесте, что и алиас открытия, надеюсь не нужно для каждого алиаса свой квест создавать.
Изменение репутации для пользователя Multigone
MultigoneOffline
Сообщение №2660
написано: 6 апреля 2018, 14:02
| Отредактировано: Multigone - 6 апреля 2018, 14:15
Wertys, тебе нужно создать новый алиас с условиями...
Код
(S) (GetIsObjectType) (Container) (== 1) AND (S) (GetLocked) (== 0)
...потому что в старый попадают только запертые предметы (я так думаю).
Скрипт:
Код
Spell Property MySpell Auto
EVENT OnHit(... IF akSource == MySpell GetRef().Lock(iInt(GetPlayer().GetActorValue("Alteration") AS Int, 1, 100)) Notification("Заклинание создало замок!") ENDIF ENDEVENT
Int FUNCTION iInt(Int A, Int B = 1, Int C = 0) ; Ограничение А внутри интервала В - С. IF B > C IF A >= B RETURN B ELSEIF A < C RETURN C ENDIF ELSEIF A <= B RETURN B ELSEIF A > C RETURN C ENDIF RETURN A ENDFUNCTION
Здравствуйте,не могли бы вы помочь со скриптом для заклинания.Мне нужно,чтобы после использования заклинания на нпс проигрывалась определённая анимация.Заранее спасибо!
Ребят, помогите пожалуйста, я меч сделал и сделал под него активатор, чтобы он был воткнут в землю, так вот, мне нужен скрипт, что бы при активации сам активатор пропадал а в инвентарь падал меч
Изменение репутации для пользователя modgms_user
modgms_userOffline
Сообщение №2664
написано: 22 мая 2018, 04:34
| Отредактировано: Multigone - 22 апреля 2020, 12:39
Здравствуйте,не могли бы вы помочь со скриптом для заклинания.Мне нужно,чтобы после использования заклинания на нпс проигрывалась определённая анимация.Заранее спасибо!
Есть мод FNIS Spells, так он делает описанное, можно в нем посмотреть скрипты на заклинаниях.
Изменение репутации для пользователя Multigone
MultigoneOffline
Сообщение №2665
написано: 24 мая 2018, 22:09
| Отредактировано: Multigone - 24 мая 2018, 22:13
Добрый день всем, нужна помощь по скриптину, если эта тема ещё жива. Идея такая - при касте заклинания на призыв существа шанс успешного каста будет зависеть от наличия некоторых условий, как уровень навыка и наличия отсутствия перка. Насколько я понял, алгоритм должен быть следующий: 1. активировать скрипт на старте эффекта 2. проверить есть ли у кастера нужный перк (или другие условия) 2.1. если нет, дать getrandompercent для заклинания 2.2. если да, ничего не делать, т.к. по умолчанию спелл кастуется 100процентно
Почему я не сделаю это через creationkit, используя в одном заклинание два маг. эффекта, один из которых содержит условие на getrandompercent и отсутствие перка, а другой 100% шанс и условие на наличие перка? Потому что это работает не совсем корректно - процент вычисляется как нужно, и условия срабатывают так как должны, НО после получения нужных условий спелл призывает ВСЕХ кто не был призван когда условие не срабатывало. Т.е. если ДО взятия условий мы сколдовали 10 раз, из которых 7 были успешными, а 3 нет, то ПОСЛЕ взятия условий 3ое существ всё равно будут призваны, причем в то самое место, куда мы их призывали до взятия условий.
Предполагаю, что скрипты такой проблемы не имеют. Если же всё таки проблема останется, вижу другой алгоритм 1. осуществить призыв 2. проверить условия у кастера 2.1. если да, ничего не делать 2.2. если нет, убить призванное существо через какое-то время с каким-то шансом
Накидал вот что
Scriptname blabla extends activemagiceffect Int ChanceRandom; переменная для шанса Int ChanceRandomWaiting; переменная для времени ожидания event onEffectStart(Actor Target, Actor Caster) ; запускаем на старте маг. эффекта Actor Player=Game.GetPlayer() ;актер это игрок ChanceRandom=Utility.RandomInt(0,2) ;присваиваем 1 из 3ёх значений, использую как 33% шанс ChanceRandomWaiting=Utility.RandomInt(3,7) ;выбираем значение ожидание от 3 до 7 сек If Caster.GetBaseActorValue("Conjuration")<25 && ChanceRandom>0 ; ставим условия - уровень скила и 33% шанс Utility.Wait(ChanceRandomWaiting) ; ждём от 3 до 7 сек ВОТ здесь должно быть убийство призванного существа endif endevent
В условиях эффекта (НЕ в окне Spell - Effect Item конструктора заклинаний):
Если у заклинателя (перк или навык или случай). (S) (HasPerk) (SomePerk) (==) (1.0) OR (S) (GetActorValue) (SkillName) (>=) (75.0) OR (S) (GetRandomPercent) (>=) (33.0)
Если у заклинателя (перк и (навык или случай)). (S) (HasPerk) (SomePerk) (==) (1.0) AND (S) (GetActorValue) (SkillName) (>=) (75.0) OR (S) (GetRandomPercent) (>=) (33.0)
Если у заклинателя (перк или (навык и случай)). (S) (HasPerk) (SomePerk) (==) (1.0) OR (S) (GetActorValue) (SkillName) (>=) (75.0) AND (S) (HasPerk) (SomePerk) (==) (1.0) OR (S) (GetRandomPercent) (>=) (33.0)
Эквивалентно ((перк или навык) и (перк или случай)).
Не верно, multigone В таком случае заклинание ВООБЩЕ не будет кастоваться до тех пор, ПОКА обозначенные условия не будут выполнены. Да, и лучше использовать getBASEactorValue - оно берёт базовое значение, а getActorValue возвращает текущее значение, со всеми бафами и дебафами.
Нужно писать скрипт, убедился в этом пока экспериментировал последние два дня - кит не позволяет создать полноценную динамическую систему условий. Он, собственно, почти написан. Не хватает только функции, которая позволит мне получить доступ к призванному существу. Скрипт будет проверять условия, и убивать призванное существо через какое-то время, давая нам попользоваться призванным небольшое время. Работает корректно, проверил с другими командами, например с placeatme, restoreAV и target.kill (которая, к слову, убивает кастера - видимо когда мы кастуем призыв, мы и target, и caster сразу, не смотря на то, что заклинание колдуется на землю). Единственное, что нужно добавить строку, дающую нам доступ к призванному существу.
ActorBase property summoned auto Actor summoned1 Int ChanceRandom; переменная для шанса Int ChanceRandomWaiting; переменная для шанса ожидания
event onEffectStart(Actor Target, Actor Caster) Actor Player=Game.GetPlayer(); актёр это игрок ChanceRandom=Utility.RandomInt(0,2); присвоить переменной для шанса 1 из 3 значений ChanceRandomWaiting=Utility.RandomInt(3,7); присвоить переменной для ожидания значение от 3 до 7 секунд If Caster.GetBaseActorValue("Conjuration")<25 && ChanceRandom>0; если уровень навыка колдовства меньше 25, шанс рандома 66% Debug.Notification("Функция сработает через " +ChanceRandomWaiting); выводим сообщение сработало ли условие и когда оно включится Utility.Wait(ChanceRandomWaiting); ждём случайное время, от 3 до 7 секунд summoned1 .kill(); вот эта строчка должна убивать призванное существо, но НЕ РАБОТАЕТ endif endevent
Изменение репутации для пользователя Multigone
MultigoneOffline
Сообщение №2669
написано: 17 июня 2018, 19:56
| Отредактировано: Multigone - 17 июня 2018, 19:58
asdklghl, не совсем понял. Заклинание можно бросить независимо от выполнения или невыполнения условий, указанных в его эффектах или в списке конструктора заклинаний. При этом будет поглощена мана и полетит снаряд, если он есть. При невыполнении условий эффект не накладывается на цель. В случае архетипа SummonCreature игрок является и источником, и целью. Таким образом, если условия не выполняются, существо не должно быть призвано.
Узнать референс призванного существа напрямую невозможно, только с помощью Find(), но это не лучший вариант.
Большинство условий продублированы в СК и в папирусе, но делать сложные проверки лучше все-таки вторым.
Код
summoned1 .kill(); вот эта строчка должна убивать призванное существо, но НЕ РАБОТАЕТ
summoned1 объявлена как внутренняя переменная, ее начальное значение none, далее оно нигде не изменяется, поэтому none.kill() убьет никого.
Касательно условий в ките, заклинание просто не кастуется, если ты не удовлетворяешь условиям. Моя задача сделать так чтобы выполнение условий выдавало тебе бонус в успешном касте, условно говоря, с 10% без условий и до 100% со всеми условиями. В любом случае, проблема решена, просто и универсально. Spell property theSpell auto Caster.DispelSpell(theSpell)
Не знаю что сразу не сообразил, все так просто было.
А теперь академический интерес. Чтобы summoned1 заработала, надо было ей присвоить значение призванного актёра? Если да, то знаешь как? Может быть, в будущем пригодится.
Форум » TES V: Skyrim » Мастерская » Вопросы по скриптам Papyrus (О скриптах Papyrus (Skyrim). Скриптеры не проходите мимо!)