Модератор форума: 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? Пиши не в ЛС, а в эту тему.
nepewka  Offline  Сообщение №3061 написано: 25 апреля 2022, 11:44



255
MultigoneLexo

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

nepewka  Offline  Сообщение №3062 написано: 27 апреля 2022, 08:11 | Отредактировано: Multigone - 27 апреля 2022, 10:08



255
А пока жду вашего ответа не вопрос выше, у меня назрел ещё один.

В Perk -> Perk entry есть есть вот такой Papyrus fragment.
Скажите, могу ли я через него обратиться к актёру и изменить скажем actor value через ModAv ?
Причём желательно не через game.getplayer(), а как-нибудь через akAktor.
Нужно чтобы это срабатывало на всех актёрах, на которых висит данный перк энтри, не только к игроку.

Можно и через Ability это делать, но это не совсем удобно. В мире F4 существуют перки с большим кол-вом Pekr Entry, которые активируются в разных ситуациях на разных актёрах по кейворду, поэтому было бы здорово если бы через этот fragment я мог как-то взаимодействовать с actor value актёра на котором работает данный Perk entry (не перк в целом, а Perk entry) если это возможно конечно ?

Multigone  Offline  Сообщение №3063 написано: 27 апреля 2022, 10:21



832
nepewka, https://www.creationkit.com/fallout4/index.php?title=Perk_Fragments

nepewka  Offline  Сообщение №3064 написано: 27 апреля 2022, 11:40



255
Цитата Multigone

nepewka, https://www.creationkit.com/fallout4/index.php?title=Perk_Fragments


я это видел, а если по русски можно ли через это добиться того, что я написал выше ?

nepewka  Offline  Сообщение №3065 написано: 27 апреля 2022, 12:41 | Отредактировано: Multigone - 27 апреля 2022, 16:47



255
Не понимаю что я должен сделать, чтобы это сработало так, как я хочу ?

Multigone  Offline  Сообщение №3066 написано: 27 апреля 2022, 14:20



832
nepewka, там же написано, что следует избегать Perk Fragments, если можно это сделать другим путем. Потому, что 1) Perk Fragments работают не для всех Entries, 2) Для Entries, не являющихся Activate, Perk Fragments будут срабатывать постоянно / непрерывно, чрезмерно загружая систему скриптов, 3) Желательно использовать Perk Fragments только для Entries - Activate, потому что код будет выполняться один раз при активации чего-либо, как в Скайриме.

Цитата nepewka

что я должен сделать, чтобы это сработало

Убрать первые 3 строки.


nepewka  Offline  Сообщение №3067 написано: 27 апреля 2022, 16:10 | Отредактировано: Multigone - 27 апреля 2022, 16:51



255
Цитата Multigone

Убрать первые 3 строки.

Ссылка на изображение с ошибкой компиляции 1.

А Когда через проперти указываю как обычно в скриптах делаю, то такая ошибка:

Multigone  Offline  Сообщение №3068 написано: 27 апреля 2022, 16:44



832
nepewka,

1) Вон же написано - тип переменной "текстовая" не соответствует ожидаемому "ActorValue". Все функции в F4, использующие Actor Values, имеют в качестве аргумента переменные с типом ActorValue. В отличие от Скайрима.

2) Думаю, нужно сперва написать ";" в тексте, затем скомпилировать, закрыть и заново открыть окно перка, в окне редактирования свойств скрипта добавить новую ActorValue Property Health, и только потом писать akActor.ModValue(Health, 10.0). Впрочем, я не знаю, не разбираюсь, не могу проверить.

nepewka  Offline  Сообщение №3069 написано: 27 апреля 2022, 17:07



255
Цитата Multigone

2) Думаю, нужно сперва написать ";" в тексте, затем скомпилировать, закрыть и заново открыть окно перка, в окне редактирования свойств скрипта добавить новую ActorValue Property Health, и только потом писать akActor.ModValue(Health, 10.0). Впрочем, я не знаю, не разбираюсь, не могу проверить


не помогает(
но без property нормально компилирует
actorvalue health

что ему не нравится...

nepewka  Offline  Сообщение №3070 написано: 27 апреля 2022, 17:37



255
Multigone
в общем уже и не важно, оно не работает так, как я хотел был, добавляет непонятно как значение AV
видимо придётся искать ответ в Ability...
либо возможно попробовать Quest как Perk entry ?

nepewka  Offline  Сообщение №3071 написано: 27 апреля 2022, 17:45



255
Я изначально хотел просто вести подсчёт % увеличения урона в созданном мною Actor value
то есть если перк даёт 1.20 множитель, я просто приписываю к актёру скажем в этом же перке сразу ModValue(CustomAV, 1.20)
и так в каждом перке.

чтобы потом в каком-нибудь скрипте взять базовый урон, допустим в магии или энчанте и перемножить его на этот CustomAV

но этот перк fragment работает без затычки, накладывая много много раз

есть идеи, как выполнить эту задачу по подсчёту всего урона через ВСЕ Perk Entry, но так чтобы это срабатывало один раз, а не множество ?

Multigone  Offline  Сообщение №3072 написано: 27 апреля 2022, 18:58 | Отредактировано: Multigone - 27 апреля 2022, 19:24



832
nepewka, связать актера со скриптом, в котором (периодически?) будут проверяться блоки условий, соответствующих условиям всех требуемых Perk Entry, имеющихся у этого актера. В Скайриме, например, не все условия, что есть в СК Conditions, имеют аналоги в Papyrus.

V. 2: для каждого Perk Entry каждого перка создать копию, которая будет только Add Value твоего счетчика. Для этого надо найти такой тип Entry Point, который меняет какое-то неиспользуемое Actor Value, оставшееся от Скайрима (напр., Mod Armor Rating?), и значение которого можно узнать (GetAV). Нагрузка на проверку условий удваивается. Опять-таки, многие Entry Point имеют доп. вкладки с условиями, которых не будет у Mod Armor Rating. И все это в случае, если старые Entry еще работают.

Короче, не знаю. Мы тут Скайрим обсуждаем.

nepewka  Offline  Сообщение №3073 написано: 27 апреля 2022, 19:22



255
Цитата Multigone

V. 2: для каждого Perk Entry каждого перка создать копию, которая будет только Add Value твоего счетчика. Нагрузка на проверку условий удваивается.



имеешь ввиду тот самый Perk entry - Activate ? чтобы срабатывало 1 раз

Multigone  Offline  Сообщение №3074 написано: 27 апреля 2022, 19:30



832
nepewka, нет. Activate добавляет выбор или доп. действие при активации предмета (игроком?). Как с помощью этого поменять AV у актера-НПС? Никак.

nepewka  Offline  Сообщение №3075 написано: 27 апреля 2022, 19:36 | Отредактировано: nepewka - 27 апреля 2022, 19:37



255
Цитата Multigone

nepewka, нет. Activate добавляет выбор или доп. действие при активации предмета (игроком?). Как с помощью этого поменять AV у актера-НПС? Никак.



а если создать Perk Entry - Quest, каждый новый перк энтри будет иметь свою стадию квеста, а в квесте по каждой стадии прописать фрагмент с изменением значения AV, это сработает на актёрах или только на игроке ?

Multigone  Offline  Сообщение №3076 написано: 27 апреля 2022, 19:42



832
nepewka, а как работают фрагменты стадий? Не выполняют ли они свой код только при переходе квеста на эти стадии? А если у тебя такой перк, который, к примеру, увеличивает урон только в случае, когда у актера уровень здоровья ниже 50%? Здоровье - переменная, меняющая свое значение, следовательно, перк может как добавлять урон, так и нет. Тебе нужно будет отследить бонус или его отсутствие через стадию квеста.

nepewka  Offline  Сообщение №3077 написано: 27 апреля 2022, 19:51



255
Цитата Multigone

когда у актера уровень здоровья ниже 50%


здорово подметил..

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

Multigone  Offline  Сообщение №3078 написано: 27 апреля 2022, 20:12



832
nepewka, оптимальный способ, как я и говорил - когда необходимо узнать множители урона / прочего у актера, скриптом проверяются условия, соответствующие условиям требуемых Perk Entry. На основании проверок делаются выводы, какие Perk Entry в данный момент активны, и высчитывается множитель (по такой же формуле, что указана в Entry Point). Проблема, что не все условия СК можно проверить в папирусе. Проблема 2 в том, что бонус урона может предоставляться против опред. целей (вкладка условий Target), значит, чтобы узнать, применяется ли этот бонус, нужно еще и знать, какую цель атакует этот актер.

nepewka  Offline  Сообщение №3079 написано: 29 апреля 2022, 08:36 | Отредактировано: Multigone - 29 апреля 2022, 16:52



255
Multigone, Привет, не могу понять, в F4 не работает эвенты OnUpdate или что ? по такой же схеме в скайриме всё работало.

Пожалуйста, размещайте изображения большого разрешения в виде ссылок (п. 2.1.13 Правил сайта).

Multigone  Offline  Сообщение №3080 написано: 29 апреля 2022, 17:08



832
nepewka, посмотри OnTimer() и OnTimerGameTime(), похоже, это аналоги OnUpdate() и OnUpdateGameTime(), только лучше, потому что в одном скрипте можно использовать сразу несколько таймеров. Впрочем, не уверен.

nepewka  Offline  Сообщение №3081 написано: 29 апреля 2022, 21:03



255
Цитата Multigone

nepewka, посмотри OnTimer() и OnTimerGameTime(), похоже, это аналоги OnUpdate() и OnUpdateGameTime(), только лучше, потому что в одном скрипте можно использовать сразу несколько таймеров. Впрочем, не уверен.


не, судя по всему нельзя...

C:\Users\nepej\AppData\Local\Temp\PapyrusTemp\MyMod01\AAAsc10.psc(19,0): script event ontimer already defined in the same state

Multigone  Offline  Сообщение №3082 написано: 29 апреля 2022, 21:33



832
nepewka, нельзя что? Код покажи-то.

nepewka  Offline  Сообщение №3083 написано: 29 апреля 2022, 21:39



255
Цитата Multigone

nepewka, нельзя что? Код покажи-то.



Скриншот1



Multigone  Offline  Сообщение №3084 написано: 29 апреля 2022, 21:41



832
nepewka, кхм, тебе нужно:

Эвент ОнТаймер (ИД_Таймер)

   Если ИД_Таймер == Т1

       Код 1

   ИначеЕсли ИД_Таймер == Т2

      Код 2


nepewka  Offline  Сообщение №3085 написано: 29 апреля 2022, 21:47



255
Цитата Multigone

nepewka, кхм, тебе нужно:

Эвент ОнТаймер (ИД_Таймер)

   Если ИД_Таймер == Т1

       Код 1

   ИначеЕсли ИД_Таймер == Т2

      Код 2



всё равно не понимаю, чем ты считаешь это лучше апдейта. а если у них разные таймеры, как они будут работать ?

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

Multigone  Offline  Сообщение №3086 написано: 29 апреля 2022, 22:06



832
Цитата nepewka

всё равно не понимаю, чем ты считаешь это лучше апдейта. а если у них разные таймеры, как они будут работать ?

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

Цитата nepewka

тогда как старый добрый апдейт насколько я помню код выполнял до конца несмотря на слетевший эффект

И OnUpdate() и OnUpdateGameTime() точно так же кончались, когда прекращал действовать маг. эффект. Только цикл WHILE c Wait() продолжает работать, пока условия выполняются, с сохранением всех переменных скрипта.


nepewka  Offline  Сообщение №3087 написано: 30 апреля 2022, 11:22 | Отредактировано: nepewka - 30 апреля 2022, 11:23



255
Цитата Multigone

И OnUpdate() и OnUpdateGameTime() точно так же кончались, когда прекращал действовать маг. эффект. Только цикл WHILE c Wait() продолжает работать, пока условия выполняются, с сохранением всех переменных скрипта.


Понял, спасибо)

Напомни пожалуйста, как через скрипт в одном модуле, получить доступ к форм ид другого модуля ?
Ну то есть есть модуль1 и модуль2
Как в скрипте в модуль1, получить доступ например к спеллу из модуль2, чтобы использовать его в командах cast

модули имею ввиду обычные esp и esl(те которые создаются сверхлимита), но к последним я так понимаю доступа через скрипт не получишь, ведь так ?

Multigone  Offline  Сообщение №3088 написано: 30 апреля 2022, 11:43



832
nepewka,

Spell MySPEL= Game.GetFormFromFile(0x001234, "MyESPModName.esp") AS Spell

; 0x001234 - FormID формы, первые 2 цифры всегда 0
; MyESPModName.esp - имя и расширение мода, содержащего форму

nepewka  Offline  Сообщение №3089 написано: 30 апреля 2022, 12:11



255
Цитата Multigone

nepewka,

Spell MySPEL= Game.GetFormFromFile(0x001234, "MyESPModName.esp") AS Spell

; 0x001234 - FormID формы, первые 2 цифры всегда 0
; MyESPModName.esp - имя и расширение мода, содержащего форму



плагин из которого подгружается спелл должен быть подключен в списке модов или это необязательно ?

nepewka  Offline  Сообщение №3090 написано: 30 апреля 2022, 12:56



255
Проверил уже, да, должен быть подгружен. А я уже подумал, что можно таким способом из какого угодно файла подгружать формы, наплевав таким образом на лимит подгрузки в 255 плагинов

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





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