Модератор форума: 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  Сообщение №1861 написано: 9 сентября 2015, 18:07



Ну, значит, ты его так написал :)
Функции сами собой не начинают повторяться, если этого не прописать в коде... Ну и если они не прописаны внутри повторяющегося ивента...

W@nTeD  Offline  Сообщение №1862 написано: 9 сентября 2015, 18:17 | Отредактировано: W@nTeD - 9 сентября 2015, 18:18


l3g3nD@rY cR3@tuR3





Скажем так, он не совсем мой, я его позаимствовал у одного мода, и изменил по своему! Он так-же привязан к книге!

Тема по Hammer Editor
Dsion  Offline  Сообщение №1863 написано: 9 сентября 2015, 18:39



Вряд ли он действительно зацикливается. Но он ведь должен добавить три слова крика, да? Для каждого слова играет музыка и появляется сообщение на экране. 3 раза. Или у тебя больше?

И можно еще вот так переписать скрипт, чтоб было красивее и понятнее:

Код
Scriptname SionBookScript extends ObjectReference

WordOfPower Property First Auto
WordOfPower Property Second Auto
WordOfPower Property Third Auto

Event OnRead()
     Game.TeachWord(First)
     Game.TeachWord(Second)
     Game.TeachWord(Third)
EndEvent

W@nTeD  Offline  Сообщение №1864 написано: 9 сентября 2015, 18:57


l3g3nD@rY cR3@tuR3


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

Тема по Hammer Editor
Dsion  Offline  Сообщение №1865 написано: 9 сентября 2015, 19:37



А...
Функции, которой можно было бы проверить, знает ли уже Довакин какое-то слово, вроде, нету...
Если добавить переменную в сам скрипт вот так:

Код
Scriptname SionNoteScript extends ObjectReference

WordOfPower Property First Auto
WordOfPower Property Second Auto
WordOfPower Property Third Auto

Bool Knows = False

Event OnRead()
     If (!Knows)
         Game.TeachWord(First)
         Game.TeachWord(Second)
         Game.TeachWord(Third)
         Knows = True
     EndIf
EndEven

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

Можно сделать с глобальной переменной:

Код
Scriptname SionNoteScript extends ObjectReference

WordOfPower Property First Auto
WordOfPower Property Second Auto
WordOfPower Property Third Auto

GlobalVariable Property Knows Auto

Event OnRead()
     If (Knows.GetValue() == 0)
         Game.TeachWord(First)
         Game.TeachWord(Second)
         Game.TeachWord(Third)
         Knows.SetValue(1)
     EndIf
EndEvent

Тогда всё будет ништяк, но как-то не изящно... Лучше бы обойтись без глобальной... Но что-то прямо сходу ничего в сонную голову не приходит.

W@nTeD  Offline  Сообщение №1866 написано: 9 сентября 2015, 19:57


l3g3nD@rY cR3@tuR3


Цитата Dsion

И если Довакин найдет где-то еще одну такую же книгу, снова будет "получать" слова.


Ну по моему плану, он получает только один экземпляр книги! Если конечно не клепать их консолью!

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

Тема по Hammer Editor
Dsion  Offline  Сообщение №1867 написано: 9 сентября 2015, 20:22



Цитата W@nTeD

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

Удалить - не, нельзя... Удалить можно книгу после прочтения.
А с отключением проблема в том, что у каждого референса свой скрипт. Отключишь на одной книге, на на другой он снова сработает.

Ладно, если вдруг еще что-то придет в голову, я обязательно напишу.

Добавлено (09 Сентября 2015, 23:19)
---------------------------------------------
Вообще, вариантов дофига... Но тебе они должны быть виднее... Мы же не знаем, что ты задумал...

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

Или сделать, чтоб она сгорела нафиг сразу после прочтения...

Или не вешать скрипт на базовую книгу, а выбросить её куда-то в мир и повесить скрипт на один конкретный референс...

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

Или еще что-то...

Добавлено (09 Сентября 2015, 23:22)
---------------------------------------------
После прочтения тихонько отобрать у игрока книгу со скриптом и подсунуть такую же, но без скрипта :-D


andrelo-1  Offline  Сообщение №1868 написано: 9 сентября 2015, 21:11



172
Цитата Dsion

Функции, которой можно было бы проверить, знает ли уже Довакин какое-то слово, вроде, нету...


Такая не подойдет - Form.PlayerKnows() ?

W@nTeD  Offline  Сообщение №1869 написано: 9 сентября 2015, 21:55 | Отредактировано: W@nTeD - 9 сентября 2015, 21:46


l3g3nD@rY cR3@tuR3


Цитата Dsion

После прочтения тихонько отобрать у игрока книгу со скриптом и подсунуть такую же, но без скрипта :-D


Хм интересная мысль ^_^ Но думаю после прочтения, она будет не нужна! Ну это так, мое мнение ^_^

Добавлено (10 Сентября 2015, 00:55)
---------------------------------------------
Все ребят, я нашёл идеальное решение!


Тема по Hammer Editor
Dsion  Offline  Сообщение №1870 написано: 10 сентября 2015, 07:36



Надеюсь, оно действительно идеальное :)
А то тут недавно один чувак (не буду тыкать пальцем) писал что-то такого типа:
Не, потсоны, есть суп ложкой - это вообще лажа. Я пробовал-пробовал, но у меня ничего не получилось. Я нашел намного более удачное решение. Берем младшую сестру, даем ей кастрюлю с супом. Сами запрокидываем голову назад и открываем рот. Сестра должна каждые 2 секунды спрашивать "Хочешь ли еще супа? Если хочешь, моргни 2 раза." Ты моргаешь два раза и сестра заливает в тебя сверху суп. И не нужна никакая ложка. И те, кто советовал ложку, - вообще нубы...

W@nTeD  Offline  Сообщение №1871 написано: 10 сентября 2015, 08:23 | Отредактировано: W@nTeD - 10 сентября 2015, 08:24


l3g3nD@rY cR3@tuR3


Dsion, Лол lol

Решил не париться по поводу скрипта, и самой книги, дополнив скрипт, командой. Книга просто удаляется из инвентаря Довакина при прочтении, тем самым, он больше не сможет, каждый полчаса тыркать бедную книгу, чтобы выучить, уже знающий ему ту'ум!

Тема по Hammer Editor
Ronolus  Offline  Сообщение №1872 написано: 30 сентября 2015, 05:24



71
Всем доброго времени суток, уважаемые форумчане! Сегодня у меня парочка вопросов:
1) я хочу встроить скрипт в мод, чтобы этот скрипт при активном моде "брал" определенное оружие и менял его урон. Вопросы - как лучше "брать" оружие - через свойство или по formID? И как запускать скрипт (какой эвент) и от кого он должен происходить (extends), чтобы он работал тогда и только тогда, когда активен мой мод? С обязательным отключением при отключении мода. (Догадываюсь, что скрипт стОит засунуть в BSA).
2) я хочу изменять содержимое LeveledSpell и LeveledItem скриптом (добавлять заклинания и книги заклинаний в сундуки торговцам, не изменяя сами сундуки для лучшей совместимости с другими модами). Вопрос - опять же, как это реализовать при активном моде? В каком эвенте и от чего должен происходить (extends) скрипт? И в каком виде лучше добавлять туда объекты типа form - с использованием свойств?

andrelo-1  Offline  Сообщение №1873 написано: 30 сентября 2015, 09:13 | Отредактировано: andrelo-1 - 30 сентября 2015, 09:18



172
Ronolus,
1. Лучше через свойство чем по id, помогает избежать очепяток в id, да и самому будет понятнее, что именно меняешь, чем потом вспоминать к чему относится этот id. От чего происходить (extends) и какой эвент это зависит от того, в какой момент ты хочешь запустить скрипт. Если хочешь во время загрузки игры - ищешь тут событие OnPlayerLoadGame(). Оно вызывается только на player'e, значит нужно скрипт вешать на player'a. Делать это лучше через алиас на player'a, чтобы не конфликтовать с другими модами. Создаешь квест, в нем алиас на player'a, на него скрипт. Там реализуешь событие OnPlayerLoadGame(). Как-то так. Еще тоже самое нужно будет сделать на событие OnInit(), потому что при первом запуске OnPlayerLoadGame() не вызывается, а вызывается OnInit().
2. То же самое, что в первом случае.

На счет активного мода. Скрипты привязаны к объектам через esp файл. Соответственно, если ты удаляешь esp, скрипты тоже перестают работать. Есть правда нюансы, вроде того, что скрипты на самом деле остаются в сейве, но без esp он не сможет нормально работать, если интересны подробности, то можно почитать на том же сайте.
Засовывать в bsa или нет, это уж сам решай, принципиально это ничего не меняет.

Dsion  Offline  Сообщение №1874 написано: 30 сентября 2015, 12:09



Ronolus, я тоже поделюсь мыслями.

1. А просто перезаписать в моде оружие нельзя? Пока мод включен, будет другой урон. Это самый простой вариант.
Скриптом урон поменять тоже можно, но только с SKSE. Зависимость от SKSE приемлема? Скорее всего, изменение урона не будет сохраняться в сэйве. Потому, как правильно сказал andrelo-1, нужно вешаться именно на ивент OnPlayerLoadGame() на алиасе игрока, чтоб прописывался нужный урон каждый раз при загрузке игры.
Если ни SKSE, ни перезапись оружия не приемлемы, то сдаваться рано. Можно зафигарить ПЕРК, который будет поднимать урон для какого-то оружия. Перком не изменить базовые характеристики этого оружия, но увеличить урон, скажем, в полтора раза или уменьшить в два раза можно. Скриптик, дающий перк, можно повесить, например, на ивент OnInit() собственного квеста.

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

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



38
Game.GetPlayer().RemoveItem(Gold,1)
akspeaker.additem(gold,
1)
FavorJobsBeggarsAbility.Cast(Game.GetPlayer(),
Game.GetPlayer())
FavorJobsBeggarsMessage.Show()
 
If
akspeaker.GetRelationshipRank(Game.GetPlayer()) == 0
  akspeaker.SetRelationshipRank(Game.GetPlayer(),
1)
Endif

Starting 1 compile threads for 1 files...
Compiling "TIF__01002332"...
C:\Games\Skyrim - Legendary Edition\Data\Scripts\Source\temp\TIF__01002332.psc(9,28): variable Gold is undefined
C:\Games\Skyrim - Legendary Edition\Data\Scripts\Source\temp\TIF__01002332.psc(10,18): variable gold is undefined
C:\Games\Skyrim - Legendary Edition\Data\Scripts\Source\temp\TIF__01002332.psc(11,0): variable FavorJobsBeggarsAbility is undefined
C:\Games\Skyrim - Legendary Edition\Data\Scripts\Source\temp\TIF__01002332.psc(11,24): none is not a known user-defined type
C:\Games\Skyrim - Legendary Edition\Data\Scripts\Source\temp\TIF__01002332.psc(12,0): variable FavorJobsBeggarsMessage is undefined
C:\Games\Skyrim - Legendary Edition\Data\Scripts\Source\temp\TIF__01002332.psc(12,24): none is not a known user-defined type

на что он ругается?

Dsion  Offline  Сообщение №1876 написано: 10 октября 2015, 03:53



Наверное, не созданы и не заполнены Property: Gold, FavorJobsBeggarsAbility итд

baglebld  Offline  Сообщение №1877 написано: 10 октября 2015, 12:37



38
Game.GetPlayer().RemoveItem(Gold001)
akspeaker.additem(gold001)

Как сделать так чтобы игрок не 1 монету отдавал а 20?

valambar  Offline  Сообщение №1878 написано: 10 октября 2015, 18:42



513
Цитата baglebld

Как сделать так чтобы игрок не 1 монету отдавал а 20?


В функциях removeitem и additem  должно быть указано не только EditorID предмета, но и количество предметов. Тогда будет удаляться-даваться то количество, которое указано.

Dsion  Offline  Сообщение №1879 написано: 10 октября 2015, 19:38



baglebld, тут и описание есть, и примеры:
http://www.creationkit.com/AddItem_-_ObjectReference
И не только для этой функции, а для всех.

Хотя лично мне кажется, что ты нас троллить пытаешься.

_Dark_Assassin_  Offline  Сообщение №1880 написано: 10 октября 2015, 19:43


I returned...


363
Всем привет, вообщем хочу заменить оригинальное горение глаз вампира, из мода "DVA" Когда в моде вампир начинает бой, у него пылают глаза в бою. Вообщем хочу всегда такие глаза. Помогите пожалуйста, что нужно cделать ? Вот скрин:

В Showracemenu ставлю такие глаза, но потом они возвращаются в оригинальное значение по умолчанию...

Dsion  Offline  Сообщение №1881 написано: 10 октября 2015, 19:57



_Dark_Assassin_, скорее всего, там глаза скрипт меняет... И, скорее всего, SKSE-шный...
Можно либо оставить этот DVA, но подпилить скрипт так, как тебе надо. Либо вообще удалить DVA, а глаза стырить и вынести в отдельный модик.

baglebld  Offline  Сообщение №1882 написано: 10 октября 2015, 20:14



38
Люди я наверно надоел с глупыми вопросами, но опять возникла проблема. Деньги он отдает, только не показывает сколько. Как сделать ток чтобы было видно что ты отдал 20 монет.
Game.GetPlayer().RemoveItem(Gold001, 20, true)
akspeaker.additem(gold001)

Нарада  Offline  Сообщение №1883 написано: 11 октября 2015, 10:07



129
В описании по умолчанию abSilent = false.
Поставьте вместо true, false - должно помочь

Holtof55  Offline  Сообщение №1884 написано: 12 октября 2015, 23:55 | Отредактировано: Holtof55 - 13 октября 2015, 00:01



49
Привет всем, хочу в мсм меню добавить два блока:
1) Один с ползунком, на регулировку громкости музыки, которая звучит в моде
2) На возможность, снять ваобще либо сменить одежду\броню, на костюм танцовщицы
Мод вот этот , если что... Скачать -"Танцы в Скайриме"
Видео с танцами здесь
...и здесь

Кто может помочь?

Очень много времени уходит на сами анимации(конвертация, редактирование-подгонка, подбор музыки..и т.п....), так что нет возможности углубленного изучения папируса

Нарада  Offline  Сообщение №1885 написано: 18 октября 2015, 13:33 | Отредактировано: Нарада - 18 октября 2015, 13:35



129
Уважаемые знатоки, не подскажите, как сделать, чтобы после открытия локации к ГГ подбегал посыльный и вручал ему письмо? Или подскажите в каком квесте ванили данное действо реализовано?

Myprism  Offline  Сообщение №1886 написано: 19 октября 2015, 05:39


Физик


Нарада, в игре посыльные сделаны внутри квестов. Если игрок делает что-то в мире появляется посыльный с интеллектуальным пакетом найти игрока и т.д. Квест это просто удобный способ объединения скриптов, пакетов и персонажей. :)

Kepper  Offline  Сообщение №1887 написано: 19 октября 2015, 06:40



860
Устранение одной из причин вылета при загрузке сохранения.

Как-то мне надоело что игра вылетает при загрузке и я включил трассировку для каждой строчки кода у нескольких скриптовых модов из сборки.
Оказалось что на одном сохранении игра стабильно вылетает на строке:
Utility.Wait(4)
Данная строка кода была призвана снизить нагрузку на систему при старте путём разнесения по времени.
Попытки заменить её на RegisterForSingleUpdate(4) или RegisterForUpdate(4) не избавили от вылетов.
Помогло применение заклинания на игрока с временем жизни в 4 секуды.

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

Подобную картину я наблюдал при запуске квеста с большим числом алиасов(15 штук) у которых в скрипту в событии OnInit стояла строка Utility.Wait(0.1).
Вылетов не было, но и квест, то запускался, то нет.

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

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



172
Kepper, по моему личному мнению, завалить игру с помощью скрипта практически невозможно, если не делать чего-то экстраординарного. Papyrus - это виртуальная машина, Utility.Wait() просто останавливает поток на какое-то время. Типичная причина вылета Скайрима - это проблемы с  памятью. Я думаю, вылет во время Wait() - это всего лишь совпадение, и причина, скорее всего, именно в памяти.

Нарада  Offline  Сообщение №1889 написано: 19 октября 2015, 11:44 | Отредактировано: Нарада - 19 октября 2015, 11:44



129
Цитата Myprism

Нарада, в игре посыльные сделаны внутри квестов. Если игрок делает что-то в мире появляется посыльный с интеллектуальным пакетом найти игрока

 Спасибо за ответ, но пакета типа "найти игрока" (типа find player) я не нашел. Есть ForceGreet (сила приветствовать), FollowPlayer - следовать за игроком. Есть еще SayToPlayer - говорить с игроком. Так какой из них нужно выбрать, чтобы НПС искал ГГ?

Kepper  Offline  Сообщение №1890 написано: 19 октября 2015, 12:30



860
andrelo-1, может быть проблема в памяти может ещё в чем-то.
Я ищу такой вариант кода, при котором не будет вылетов при загрузке игры на моём компьютере. Может быть найденный метод подойдёт ещё кому-нибудь.

Были опробованы следующие варинаты кода:


На одном из сохранений стабильно выкидывало при любом из этих трёх вариантов.
В лог файле строки "OnPlayerLoadGame 2" не было.
Вылеты на этом сохранении прекратились только тогда, когда я убрал  из кода предыдущую строку.

Функции RegisterForSingleUpdate и RegisterForUpdate на мой взгляд не имеют отношения к приостановке потока выполнения, но их вызов приводил к вылету.

Для того чтобы всё же отсрочить выполнение части кода, я повесил этот блок кода на окончание работы заклинания. А при старте применяю это заклинание на игрока.

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





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