Модератор форума: 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? Пиши не в ЛС, а в эту тему.
Dsion  Offline  Сообщение №1891 написано: 19 октября 2015, 13:32



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

Нарада  Offline  Сообщение №1892 написано: 19 октября 2015, 15:37



129
Нашел квекст гонца - WICourier. Если я правильно понял, то тут нужно добавить  моеПроперти на моеПисьмо и в скрипт - свою функцию на обработку  моеПроперти. Ну еще можно диалог или обойтись имеющимися обозначив соответствующий GetItemCount. Все верно?

Dsion  Offline  Сообщение №1893 написано: 19 октября 2015, 16:56



Не помню :( И сейчас нету CK, чтоб проверить. Чтоб просто воспользоваться гонцом, там как-то так:

Код
WICourierScript Property WICourier Auto
Book Property MyLetter Auto

Event какой-то
   WICourier.Какая-то-функция(MyLetter)
EndEvent

И всё... Но он не сразу приносит вещь, а после перехода в другой город, например.

Нарада  Offline  Сообщение №1894 написано: 19 октября 2015, 17:35 | Отредактировано: Нарада - 19 октября 2015, 17:38



129
Думаю, что такой скрипт подойдет:


Код
Scriptname aaaStartQuest extends Quest   

WICourierScript Property WICourier Auto
Book Property MyLetter Auto

Event OnInit() 
if !IsRunning() && !IsCompleted() 
  Start() 
  WICourier.addRefToContainer(MyLetter)
endIf 
EndEvent

Dsion  Offline  Сообщение №1895 написано: 19 октября 2015, 17:41 | Отредактировано: Dsion - 19 октября 2015, 17:42



По-моему, там еще была другая функция, кроме addRefToContainer, принимающая не референс, а базовый объект. Book - это же не референс. А может, можно и так... А, ладно, я, лучше, не буду лезть. Помню плохо, а проверить не могу.

Нарада  Offline  Сообщение №1896 написано: 19 октября 2015, 17:52 | Отредактировано: Нарада - 19 октября 2015, 17:55



129
Там есть функция addItemToContainer. Но засада не в этом, все дело в том, что в числе Тип Проперти WICourierScript я не обнаружил. И вообще прямого обращения к скриптам через Проперти я не нашел. Может быть, чего-то недопонимаю? Может быть обращаться нужно через Проперть квеста?

Dsion  Offline  Сообщение №1897 написано: 19 октября 2015, 18:06



Можно проперти с типом Quest, а потом вот так:
(WICourier As WICourierScript).addItemToContainer(MyLetter)

Но лучше все-таки в тип проперти сразу прописать WICourierScript. Для лучшего понимания того, чем вообще являются эти проперти.

Добавлено (19 Октября 2015, 21:06)
---------------------------------------------
И я не уверен, что скрипт называется именно WICourierScript... Может, как-то иначе... Но да, это тот скрипт, на котором addItemToContainer...


keboard  Offline  Сообщение №1898 написано: 20 октября 2015, 20:11 | Отредактировано: keboard - 21 октября 2015, 01:34



6
Приветствую всех, пытаюсь сделать спелл, возник вопрос по скриптам, подскажите, пожалуйста.



Проблема в том, что функция Actor.GetActorValuePercentage работает некорректно, возвращает не то, что должна. В SKSE есть GetMaximumValue, но я не совсем понимаю на чём её
вызывать и как вообще использовать.

P.S. Извиняюсь, если вопрос покажется совсем нубским, это моя первая попытка работы со скриптами, буду рад любым вариантам, заранее благодарю!

baglebld  Offline  Сообщение №1899 написано: 20 октября 2015, 21:08



38
Подскажите как написать скрипт для того чтобы после разговора появился человек( а до этого его не было).

keboard  Offline  Сообщение №1900 написано: 22 октября 2015, 14:18



6
С SKSE функциями тоже не удаётся восстановить изначальный уровень ХП цели, что я делаю неверно?
Код
Event OnEffectStart(Actor akTarget, Actor akCaster) 
; Запоминаем уровень ХП
       ActorValueInfo aviHealth = ActorValueInfo.GetActorValueInfobyName("Health")
       Float currentHealth = aviHealth.GetCurrentValue(akTarget)
       Float maxHealth = aviHealth.GetMaximumValue(akTarget)
       Float dmgHealth = maxHealth - currentHealth 
;"Побочный эффект" - у цели восстанавливается фул ХП
       Debug.SendAnimationEvent(akTarget, "BleedOutStart")
       akTarget.SetUnconscious(true)
; Восстанавливаем изначальный уровень ХП
       akTarget.ForceAV("Health", maxHealth)
       akTarget.DamageAV("Health", dmgHealth)
EndEvent

Dsion  Offline  Сообщение №1901 написано: 22 октября 2015, 16:26



Цитата keboard

что я делаю неверно?


По-моему, ты круто запутался и было бы хорошо начать всё с нуля...
Заодно почитай, что делает функция ForceAV. Она не восстанавливает аттрибут, а перманентно меняет максимальное значение. Но только не подумай, что проблема только в ней.

keboard  Offline  Сообщение №1902 написано: 22 октября 2015, 17:42



6
Цитата Dsion

По-моему, ты круто запутался и было бы хорошо начать всё с нуля...

Да что там с нуля то начинать - три строчки кода омфг, если шаришь, то просто напиши как корректно определить текущее и макс хп цели и после установить цели эти значения, если не сильно трудно, разумеется, я был бы весьма признателен.

Dsion  Offline  Сообщение №1903 написано: 22 октября 2015, 18:01



Попробуй в первой версии скрипта заменить ForceAV на RestoreAV.
Это если не хочешь по-нормальному делать.

keboard  Offline  Сообщение №1904 написано: 22 октября 2015, 22:48 | Отредактировано: keboard - 22 октября 2015, 22:52



6
Цитата Dsion

Попробуй в первой версии скрипта заменить ForceAV на RestoreAV

Спасибо за наводку, удалось решить проблему с хп, кстати, методом тыка установлено:




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

Dsion  Offline  Сообщение №1905 написано: 22 октября 2015, 23:23



Там сложнее. Для каждой характеристики (в том числе для health) хранится, как минимум, три значения:
1. Базовое.
2. Модификаторы (Баффы, дебаффы итп. Если положительное, характеристика в игре подсвечивается зеленым, а если отрицательное - красным.).
3. Повреждение.

GetBaseActorValue возвращает базовое значение.
GetActorValue возвращает текущее значение с учетом всего (базовое + модификаторы - повреждение)
SetActorValue устанавливает базовое значение.
ModActorValue увеличивает или уменьшает модификаторы.
ForceActorValue изменяет модификаторы так, чтоб максимальное значение (базовое + модификаторы) равнялось переданному в функцию.

DamageActorValue добавляет повреждения.
RestoreActorValue убирает повреждения.

Добавлено (23 Октября 2015, 02:23)
---------------------------------------------
Если кто-то собирается из скрипта изменять базовое значение или модификаторы, не забывайте, что пользователь может отключить ваш мод в любой момент. Даже во время действия магического эффекта. Тогда OnEffectFinish никогда не выполнится и характеристики останутся поврежденными. Намного лучше изменять их самим магическим эффектом, без скрипта. Тогда отключение мода отключит и эффект.


keboard  Offline  Сообщение №1906 написано: 23 октября 2015, 01:45



6
Я так понимаю, что независимо от того истекает ли время действия эффекта или он применяется повторно до истечения времени - мы в любом случае попадаем в OnEffectFinish. Можно ли определить, какая из этих двух причин нас туда привела?

Dsion  Offline  Сообщение №1907 написано: 23 октября 2015, 01:47



Я бы просто повесил условие на магический эффект. Если какое-то из условий не выполняется, то эффект не наложится.

keboard  Offline  Сообщение №1908 написано: 23 октября 2015, 02:43 | Отредактировано: keboard - 23 октября 2015, 02:44



6
Повесил условие HasMagicEffect - эффект не накладывается повторно пока предыдущий не спадёт, но косяк с анимацией всё равно полностью не вылечился - если кастануть спелл на цель, когда предыдущий эффект только
закончился и она "в процессе вставания с колен" xD - анимация "вернуться на колени" не срабатывает, она как бы зависает в положении стоя.

Dsion  Offline  Сообщение №1909 написано: 23 октября 2015, 02:59



Вместо ползанья на коленях, можно еще оглушение сделать вот такого типа:
http://www.nexusmods.com/skyrim/mods/55080/?

nine-dragon-art  Offline  Сообщение №1910 написано: 29 октября 2015, 23:00



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

Добавлено (30 Октября 2015, 02:00)
---------------------------------------------
при компиляции скрипта выскакивает эта ошибка "QueueNiNodeUpdate is not a function or does not exist" что не так ?


border="0" alt=""/
PhysxN  Offline  Сообщение №1911 написано: 29 октября 2015, 23:56





nine-dragon-art
Цитата Myprism

Компилятор же выдаёт ошибки:
(9,36): GetOutfit is not a function or does not exist
(12,11): QueueNiNodeUpdate is not a function or does not exist
(21,10): QueueNiNodeUpdate is not a function or does not exist


Оп! Причину нашёл. Оказывается, надо ставить SKSE не в виде инсталлера, а в виде зип-архива. Они различаются папкой src, которая инсталлером не ставится. С ней всё скомпилировалось!


nine-dragon-art  Offline  Сообщение №1912 написано: 1 ноября 2015, 16:32 | Отредактировано: nine-dragon-art - 1 ноября 2015, 16:51



341
можете скрипт подсказать чтобы при использовании заклинания (огненный шар например) у игрока уменьшалось здоровье на 50 единиц ?)
желательно чтобы здоровье отнималось у игрока во время каста.

border="0" alt=""/
andrelo-1  Offline  Сообщение №1913 написано: 2 ноября 2015, 08:36



172
nine-dragon-art, можешь попробовать ловить событие OnAnimationEvent(), где проверять, к примеру, если это BeginCastRight или BeginCastLeft (ну или может что-то более подходящее найдешь), и player.GetEquippedSpell() == <нужное заклинание>, то вычитать здоровье у игрока.

Myprism  Offline  Сообщение №1914 написано: 3 ноября 2015, 03:57


Физик


Кто знает, как определить момент, когда главный герой раздет? Те самые условия, при которых включаются диалоги, мол, так ходить неприлично?

nine-dragon-art  Offline  Сообщение №1915 написано: 6 ноября 2015, 23:22 | Отредактировано: nine-dragon-art - 6 ноября 2015, 23:24



341
Myprism, если я не ошибаюсь
квест где тебе говорят голышом бегать неприлично называется WICommentNaked

border="0" alt=""/
Myprism  Offline  Сообщение №1916 написано: 18 ноября 2015, 18:22 | Отредактировано: Myprism - 18 ноября 2015, 18:22


Физик


nine-dragon-art, спасибо. А по какому событию инициируется диалог и происходит проверка этих условий?

Добавлено (18 Ноября 2015, 21:22)
---------------------------------------------
Специалисты по скриптам, нужна ваша помощь.
Для NPS Скайрима можно установить спальный Outfit/ Но работать он не будет. Он установлен примерно четырём сотням игровых персонажей, но галка применять его в спальных пакетах стоит всего у нескольких и они, не смотря на это, не переодеваются на ночь. Т.е. использование спальной одёжки в игре не активно. Для персонажей своего мода я решил эту проблему, повесив на них следующий скрипт:

Он делает то, что надо для моих персонажей: они переодеваются, когда ложатся в постель. Теперь я хочу реализовать эту функцию для многих уже ванильных персонажей. Тут я сталкиваюсь с проблемой, что скрипт работает только на уникальных персонажах, а многие игровые персонажи не уникальны. Кроме того, игровых персонажей ОЧЕНЬ много и надо каждому ставить скрипт. Может быть есть способы улучшить этот процесс? Т.е. нужно
1. Реализовать переодевание на ночь и для неуникальных персонажей.
2. Может быть это можно сделать с помощью скрипта, повешенного на кровать? Кроватей в Скайриме не много и этот метод кажется красивее. Как это можно сделать?

andrelo-1  Offline  Сообщение №1917 написано: 18 ноября 2015, 19:42 | Отредактировано: andrelo-1 - 18 ноября 2015, 20:00



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

Myprism  Offline  Сообщение №1918 написано: 18 ноября 2015, 20:10 | Отредактировано: Myprism - 19 ноября 2015, 05:19


Физик


andrelo-1, функция GetActorBase().GetOutfit(true) существует только для уникальных персонажей. Она обращается к ActorBase. Пакеты сна очень разные и их много. Для сна может использоваться даже пакет песочницы, так как там по умолчанию стоит флаг "позволить спать".

andrelo-1  Offline  Сообщение №1919 написано: 18 ноября 2015, 21:41



172
Myprism, для неуникальных персонажей есть функция GetLeveledActorBase(), она же работает и для уникальных.

Myprism  Offline  Сообщение №1920 написано: 19 ноября 2015, 05:18 | Отредактировано: Myprism - 19 ноября 2015, 05:20


Физик


andrelo-1, спасибо, переписал скрипт:

Заменил ещё определение типа спального пакета на состояние сна. На уникальных персонажах вроде работает (на тех, с кем ещё не встречался в данном сохранении), а на стражниках - нет :( Ещё выяснилась неприятная деталь: скрипт не вешается на Template, а только на конечного персонажа. Т.е. нельзя ограничиться установкой скрипта на нескольких заготовочных персонажей, а надо на всех конечных. Впрочем, всё равно не работает :(

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





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