Вверх Вниз


Модератор форума: Kris†a™  
Форум » TES V: Skyrim » Мастерская » Вопросы по скриптам Papyrus (О скриптах Papyrus (Skyrim). Скриптеры не проходите мимо!)
Вопросы по скриптам Papyrus
sansuli  Offline Сообщение №1 написано: 31 Августа 2012 в 17:29 | Отредактировано: sansuli - Пятница, 17 Апреля 2015, 21:08


The Red Sun


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

Красное солнце
Есть вопросы по скриптам Papyrus? Пиши не в ЛС, а в эту тему.
Wertys  Offline Сообщение №2821 написано: 01 Апреля 2018 в 23:50 | Отредактировано: Wertys - Воскресенье, 01 Апреля 2018, 23:51


Странник


29
Цитата Multigone ()
Для скрипта ActiveMagicEffect это должно быть что-то вроде:
Все изменил, но звук так и не заработал. Звук дефолтный из игры.
Поменял так же свой звук на звук пчелы в банке (он точно в скриптах используется) - ничего.
Возможно звуки просто не могут работать в эффектах?

Multigone  Offline Сообщение №2822 написано: 02 Апреля 2018 в 17:22



643
Wertys, а что надо-то? Поменять дефолтный звук эффекта на другой? Так это в маг. эффекте в полях Sounds (в центральной правой части окна).

Wertys  Offline Сообщение №2823 написано: 02 Апреля 2018 в 23:08


Странник


29
Multigone, короче смотри - есть заклинание со скриптовым эффектом, и, в зависимости от результата, проигрываются разные звуки. Т.е. если условия соблюдается, то проигрывается 1й звук, если нет то 2й. Собственно я уже впихнул туда Debug.Notification, но хотелось бы еще чтоб звук был. 
Я не стал весь скрипт приводить полностью, меня интересовало только как можно воспроизвести звук в скрипте. Но если это невозможно, то пусть.

Кстати, да, спасибо за информацию по GetCurrentLocation - работает. Правда, оказалось еще можно использовать GetParentCell() для этих целей blush

Multigone  Offline Сообщение №2824 написано: 03 Апреля 2018 в 02:20 | Отредактировано: Multigone - Вторник, 03 Апреля 2018, 02:20



643
Wertys, звук может играться откуда угодно, будь то скрипт алиаса, эффекта, актера и т.д. Дай его - посмотрим, в чем дело.

Wertys  Offline Сообщение №2825 написано: 06 Апреля 2018 в 02:29


Странник


29
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  Offline Сообщение №2826 написано: 06 Апреля 2018 в 03:58 | Отредактировано: Multigone - Пятница, 06 Апреля 2018, 04:00



643
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

Wertys  Offline Сообщение №2827 написано: 06 Апреля 2018 в 07:21


Странник


29
Multigone, да попробовал уже и через Event OnHit, и алиас, и Event OnMagicEffectApply - ничего. Как будто не видит заклинание скрипт, шейдеры работают, скрипт нет. Алиас сделал в том же квесте, что и алиас открытия, надеюсь не нужно для каждого алиаса свой квест создавать.

Multigone  Offline Сообщение №2828 написано: 06 Апреля 2018 в 17:02 | Отредактировано: Multigone - Пятница, 06 Апреля 2018, 17:15



643
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

Wertys  Offline Сообщение №2829 написано: 07 Апреля 2018 в 05:08


Странник


29
Multigone, разобрался, ошибка была еще в квесте.

Скрипт, в целом рабочий, но он почему-то закрывал мне ящики только на 0-й уровень, независимо от уровня навыка. Проблему решил так:

Код
GetRef().Lock(true)
GetRef().SetLockLevel(iInt(GetPlayer().GetActorValue("Alteration") AS Int, 1, 100))
Еще раз спасибо за помощь!

Хисимэль  Offline Сообщение №2830 написано: 15 Апреля 2018 в 18:48 | Отредактировано: Хисимэль - Среда, 18 Апреля 2018, 19:21


Эльфийка-оборотень


108
В Скайриме есть нажимные пластины: нажал - и что-то там открылось.
Есть даже такой вариант: нажал повторно - закрылось.
А как в скрипте прописать, чтобы при нажатии открывалось, а когда отжато - открывалось?
______________
Вопрос решен.

Фэнтези песни менестрелей - тут можно прослушать мой голос
Настройка гитары онлайн - онлайн софт для музыкантов

Ругательство модмейкера: Чтоб тебе всю жизнь навмеши по спиральной лестнице прокладывать! (с)
Sithis380  Offline Сообщение №2831 написано: 19 Мая 2018 в 18:35


Странник


1
Здравствуйте,не могли бы вы помочь со скриптом для заклинания.Мне нужно,чтобы после использования заклинания на нпс проигрывалась определённая анимация.Заранее спасибо! thanks

SoulEx  Offline Сообщение №2832 написано: 22 Мая 2018 в 00:07


Ashes to ashes, dust to dust


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

modgms_user  Offline Сообщение №2833 написано: 22 Мая 2018 в 07:34


Странник


20
[quote=Sithis380;1309852]Здравствуйте,не могли бы вы помочь со скриптом для заклинания.Мне нужно,чтобы после использования заклинания на нпс проигрывалась определённая анимация.Заранее спасибо! thanks[/quote]
Есть мод FNIS Spells, так он делает описанное, можно в нем посмотреть скрипты на заклинаниях.

Multigone  Offline Сообщение №2834 написано: 25 Мая 2018 в 01:09 | Отредактировано: Multigone - Пятница, 25 Мая 2018, 01:13



643
SoulEx,


Код
ScriptName MyScript Extends ObjectReference
    
ObjectReference Property MyRef Auto ; Референс меча.

EVENT OnActivate(ObjectReference xR)
    IF xR == Game.GetPlayer()
        xR.AddItem(MyRef)
        Disable()
    ;    Delete()
    ENDIF
ENDEVENT

asdklghl  Offline Сообщение №2835 написано: 15 Июня 2018 в 19:33 | Отредактировано: asdklghl - Пятница, 15 Июня 2018, 23:25


Странник


4
Добрый день всем, нужна помощь по скриптину, если эта тема ещё жива.
Идея такая - при касте заклинания на призыв существа шанс успешного каста будет зависеть от наличия некоторых условий, как уровень навыка и наличия отсутствия перка.
Насколько я понял, алгоритм должен быть следующий:
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

Multigone  Offline Сообщение №2836 написано: 17 Июня 2018 в 19:28



643
asdklghl,

В условиях эффекта (НЕ в окне 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)

Эквивалентно ((перк или навык) и (перк или случай)).

Ссылки: принцип условий, функции условий.

asdklghl  Offline Сообщение №2837 написано: 17 Июня 2018 в 21:17 | Отредактировано: asdklghl - Воскресенье, 17 Июня 2018, 21:21


Странник


4
Не верно, multigone
В таком случае заклинание ВООБЩЕ не будет кастоваться до тех пор, ПОКА обозначенные условия не будут выполнены.
Да, и лучше использовать getBASEactorValue - оно берёт базовое значение, а getActorValue возвращает текущее значение, со всеми бафами и дебафами.

Нужно писать скрипт, убедился в этом пока экспериментировал последние два дня - кит не позволяет создать полноценную динамическую систему условий.
Он, собственно, почти написан. Не хватает только функции, которая позволит мне получить доступ к призванному существу.
Скрипт будет проверять условия, и убивать призванное существо через какое-то время, давая нам попользоваться призванным небольшое время.
Работает корректно, проверил с другими командами, например с placeatme, restoreAV и target.kill (которая, к слову, убивает кастера - видимо когда мы кастуем призыв, мы и target, и caster сразу, не смотря на то, что заклинание колдуется на землю).
Единственное, что нужно добавить строку, дающую нам доступ к призванному существу.

Scriptname MGSummonChance extends activemagiceffect
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  Offline Сообщение №2838 написано: 17 Июня 2018 в 22:56 | Отредактировано: Multigone - Воскресенье, 17 Июня 2018, 22:58



643
asdklghl, не совсем понял. Заклинание можно бросить независимо от выполнения или невыполнения условий, указанных в его эффектах или в списке конструктора заклинаний. При этом будет поглощена мана и полетит снаряд, если он есть. При невыполнении условий эффект не накладывается на цель. В случае архетипа SummonCreature игрок является и источником, и целью. Таким образом, если условия не выполняются, существо не должно быть призвано.

Узнать референс призванного существа напрямую невозможно, только с помощью Find(), но это не лучший вариант.

Большинство условий продублированы в СК и в папирусе, но делать сложные проверки лучше все-таки вторым.


Код
summoned1 .kill(); вот эта строчка должна убивать призванное существо, но НЕ РАБОТАЕТ
summoned1 объявлена как внутренняя переменная, ее начальное значение none, далее оно нигде не изменяется, поэтому none.kill() убьет никого.

asdklghl  Offline Сообщение №2839 написано: 17 Июня 2018 в 23:08


Странник


4
Касательно условий в ките, заклинание просто не кастуется, если ты не удовлетворяешь условиям. Моя задача сделать так чтобы выполнение условий выдавало тебе бонус в успешном касте, условно говоря, с 10% без условий и до 100% со всеми условиями.
В любом случае, проблема решена, просто и универсально.
Spell property theSpell auto
Caster.DispelSpell(theSpell)

Не знаю что сразу не сообразил, все так просто было.

А теперь академический интерес. Чтобы summoned1 заработала, надо было ей присвоить значение призванного актёра? Если да, то знаешь как? Может быть, в будущем пригодится.

Multigone  Offline Сообщение №2840 написано: 18 Июня 2018 в 01:12



643
asdklghl, наверное, как-то так:


Код
Actor FUNCTION MyFun(Actor xCaster, ActorBase xCreatureBase, MiscObject xMarkerItem = none, Float fRadius = 500.0, Int iAttempts = 10)
    Actor xSomething
    WHILE iAttempts > 0
        xSomething = Game.FindRandomActorFromRef(xCaster, fRadius)
        IF xSomething && xSomething != xCaster && xSomething.GetActorBase() == xCreatureBase && !xSomething.GetItemCount(xMarkerItem)
            xSomething.AddItem(xMarkerItem)
            RETURN xSomething
        ENDIF
        iAttempts -= 1
    ENDWHILE
ENDFUNCTION

Пример вызова:


Код
ActorBase Property SummonAtronachFire Auto
MiscObject Property xDetector Auto ; Создать пустой неиграбельный предмет, служит для отметки существа, что оно найдено.

Actor xSummoned

EVENT OnEffectStart(Actor xT, Actor xC)
    Utility.Wait(1.0) ; Ждем, пока будет кого искать.
    xSummoned = MyFun(xT, SummonAtronachFire, xDetector)
    Utility.Wait(5.0)
    xSummoned.Kill()
ENDEVENT

asdklghl  Offline Сообщение №2841 написано: 19 Июня 2018 в 22:34


Странник


4
Как изменить количество отмычек в тюрьме? Мб за это отвечает какая-то global, или скрипт? Есть желание поменять их количество. На нексусе информации не нашёл по этому вопросу.

Aksyonov  Offline Сообщение №2842 написано: 14 Июля 2018 в 08:22 | Отредактировано: Aksyonov - Суббота, 14 Июля 2018, 08:22



921
Всем привет кто нибудь знает как заставить говорить (вызвать диалоги с призванным существом) именно с призванным а не с Actror, так как вот когда призывной персонаж Actor является призывным, и призывается заклинанием почему то он не говорит хотя диалоги прописаны в квесте и реплики тоже, окно диалога не появляется в чём проблема, раньше не озвучивал призраков, призывных - может призывные не могут говорить вообще? Если так может кто знает как тогда призвать (псевдо призвать) актера при надевании кольца - что бы выглядел как призыв но вызывался актер с шейдером духа а не призванное существо? (эффект внешний духа сделать не проблема) надо как то решать вопрос, буду рад любой подсказки, спасибо.

Мой сайт - Сообщество - YouTube Канал - Группа Вконтакте
Multigone  Offline Сообщение №2843 написано: 14 Июля 2018 в 10:12



643
Aksyonov, попробуй поменять призываемого актера на НПС, например, Лидию, или любого, кто гарантированно имеет возможность диалога. Убедись, что в расе твоего призываемого существа есть флаг Allow PC Dialogue.

Aksyonov  Offline Сообщение №2844 написано: 14 Июля 2018 в 12:34 | Отредактировано: Aksyonov - Суббота, 14 Июля 2018, 12:35



921
Цитата Multigone ()
попробуй поменять призываемого актера на НПС, например, Лидию

Призвал Лидию таким же способом через выбор Assoc. item 1 магическом эффекте, молчит, получается все NPC у которых отмечен флажок: Summonable, не говорят, а значит реализовать призыв полноценного компаньона через добавление заклинания когда одеваешь кольцо, не получиться, остаётся использовать какую нибудь функцию типа Place at me, и так далее что бы просто поместить NPC обычного возле игрока на тригер а до появления Npc кастовать на его место ещё и эффект с призывом (саму сферу) что то не могу припомнить реального призрака который бы хоть что то бормотал после призыва - хотя они же вроде стонут, это тоже реплика, звук, и каким же образом она тогда выводиться у конкретного призрака? Надо потрошись наверное самих призраков подобных верно? В правильном ли направлении копаю?

Мой сайт - Сообщество - YouTube Канал - Группа Вконтакте
Multigone  Offline Сообщение №2845 написано: 14 Июля 2018 в 13:41



643
Aksyonov, посмотри, как сделан дремора-торговец в драгонборне.

Aksyonov  Offline Сообщение №2846 написано: 14 Июля 2018 в 15:06 | Отредактировано: Aksyonov - Суббота, 14 Июля 2018, 15:06



921
Цитата Multigone ()
посмотри, как сделан дремора-торговец в драгонборне.

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

Добавлено (01 Августа 2018, 11:37)
---------------------------------------------
Всем привет, скажите может кто из вас знает как можно скриптом добавить заклинание определенному NPC - ну скажем эффект свечение из NPC в совангарде обычному NPC что бы у него появилось свечение, нужно для задачи небольшой, хочу превратить обычных оживших трупов в призраков после того как они возродятся (визуально в призраков)


Мой сайт - Сообщество - YouTube Канал - Группа Вконтакте
Нарада  Offline Сообщение №2847 написано: 11 Августа 2018 в 15:22 | Отредактировано: Нарада - Суббота, 11 Августа 2018, 15:22



141
Здравствуйте, делаю мод и столкнулся с проблемой, что не могу программно добавить торговцам предмет, в часности кофе барману в таверне.
Такой код ни к чему не приводит. Кофе не появляется у торговца.

Potion Property Coffe  Auto
ObjectReference Property ChefSudiREF  Auto

ChefSudiREF.additem(Coffe,10)
ChefSudiREF.Reset()

Multigone  Offline Сообщение №2848 написано: 11 Августа 2018 в 15:41



643
Нарада, у торговцев для продажи есть спец. сундук, у каждого свой, указывается в одной из его faction во вкладке Vendor, одноразовое добавление в долгосрочной перспективе ни к чему не приведет, поскольку сундук каждые несколько дней перезагружает свой лут.

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

Нарада  Offline Сообщение №2849 написано: 11 Августа 2018 в 15:54



141
Multigone,  Я тоже подумывал относительно алиаса, но как сделать перезапускаемый квест?

Dsion  Offline Сообщение №2850 написано: 11 Августа 2018 в 17:10 | Отредактировано: Dsion - Суббота, 11 Августа 2018, 17:12



1221
Нарада, а найти у всех барменов общий LeveledItem и добавить туда предмет скриптом нельзя? Или нужно только одному?

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