Модератор форума: 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? Пиши не в ЛС, а в эту тему.
Нарада  Offline  Сообщение №2071 написано: 27 апреля 2016, 11:24



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

Добавлено (27 Апреля 2016, 14:24)
---------------------------------------------
Это глобальная переменная  PlayerFollowerCount ?


Dsion  Offline  Сообщение №2072 написано: 27 апреля 2016, 11:42 | Отредактировано: Dsion - 27 апреля 2016, 11:44



В ванильном - она. А авторы модовых спутников могли чего-угодно навертеть.
Наличие модового спутника особо никак и не проверишь.

valambar  Offline  Сообщение №2073 написано: 29 апреля 2016, 17:42



513
Помогите разобраться со структурой мода FusRoDoor - который позволяет открывать двери Безжалостной силой. Если я переношу в TES5Edit все его изменения в другой мод, то почему-то эффект в другом моде не появляется. Спрашиваю в разделе скриптов, потому как сами скрипты, используемые модом, понятны - но непонятно, почему они не работают в другом моде. 

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

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

В общем, как вы поняли, я ищу самый простой способ сделать заклинание, открывающее двери.

Dsion  Offline  Сообщение №2074 написано: 29 апреля 2016, 18:05 | Отредактировано: Dsion - 29 апреля 2016, 18:06



В скайриме магический эффект может накладываться только на живых акторов. И нормального способа определить, во что попадает заклинание, если это не актор, вообще нету... Только если к самой двери каким-то образом (к базовому объекту, референсу или алиасу) прикреплен скрипт, он может узнать о попадании в дверь заклинания...

Добавлено (29 Апреля 2016, 21:05)
---------------------------------------------
Мне только два варианта приходить в голову:
1. Через задницу (заполнение алиасов всеми дверями поблизости игрока при касте, вешание скриптов на все базовые двери или что-то такого типа)
2. Через перк с перехватом активации. Когда игрок клацает на закрытую дверь, ему дается выбор: открыть отмычкой или заклинанием. При выборе заклинания можно даже спецэффекты добавить.

valambar  Offline  Сообщение №2075 написано: 30 апреля 2016, 01:29 | Отредактировано: valambar - 30 апреля 2016, 01:33



513
Цитата Dsion

В скайриме магический эффект может накладываться только на живых акторов.

Вот этого я и боялся. Тогда в моде FusRoDoor придется разбираться глубоко. Там как раз скрипт именно ищет двери в ячейке, где игрок, и присваивает их алиасам. В общем, кто разбирался в этом моде сам, отпишитесь, что вы там в его структуре нашли и как это воспроизвести самому.

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

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

Reboroda  Offline  Сообщение №2076 написано: 2 мая 2016, 18:42 | Отредактировано: Reboroda - 2 мая 2016, 19:36



2
Приветствую мастеров скриптинга, надеюсь что тема еще актуальна. Я плоховато шарю в скриптах папируса, прошу помощи.
Имеется кустарный огород с пшеницей, на котором по айдл-маркерам снуют рабочие - неписи. На моем скрине вид из окна CK.
Суть проблемы: Никак не соображу, как заставить неписей активировать снопы пшеницы с маркеров. Хотелось бы некий образец кода.
Нужно ли обязательно добавлять триггер (на скрине...
- куб оранжевого цвета), или можно как-то обыграть активацией с маркеров?
Обычно я просто делал большой триггер и прописывал в него скрипт с проверкой => является ли нпс с элиасом "рабочий" субъектом фракции рабочих:
Код
Actor worker = akActionRef as Actor
    if worker == worker.isInFaction(WorkersGenericFaction)

Ставил срок сбора урожая по времени c помощью функций:
Код
function HarvTime()
    self.RegisterForUpdateGameTime(10 as Float)
    HarvTime = true
endFunction

function OnupdateGameTime()
    if HarvTime
    gotoState("harvest")
    endIf
endFunction
И по прошествии 10 игро-часов врубался стэйт "harvest". Когда НПС покидал зону триггера => грубо закидывался "урожай" в контейнер, расположенный рядом. Пшеница из FormList'а.

Общий урожай из контейнера, если он в нем имеется, перемалывается в муку на мельнице теми же рабочими (так он возрастает в цене), и автоматом продается в течении 24 часов управляющим поместья.
Потом управдом бежит к ГГ, если тот в нескольких метрах от дома, и вручает ему вырученный доход (минус небольшой процент налога). С этим кодом я уже кое как справился, у управдома спец элиас + пак на поиск ГГ и принудительный диалог с отдачей всей суммы накопленных денег.

Однако это очень грубо и хотелось бы что-то похитрее и покреативнее. ;) Чтобы каждый сноп НПС мог "пожать", активировав его с айдл-маркера, как это делает ГГ (главное чтобы у стога снялась "шапка", было видно), закинуть в контейнер 3 шт пшеницы с этого действия, ну а уже как спрятать-деактивировать сами маркеры вокруг пожатого снопа я соображу и сам. И так я хочу сделать для каждого стога пшеницы и его маркеров. Ну а спустя 10 часов чтобы "шапки" снопов пшеницы снова "отрастали" и были готовы для повторения цикла работы. Такая вот "трудотерапия" ^_^ , может ли кто-нибудь набросать как провернуть подобное в коде? Заранее спасибо!

Lexo  Offline  Сообщение №2077 написано: 4 мая 2016, 19:46 | Отредактировано: Lexo - 4 мая 2016, 19:47


Всепознающий мододел


223
Короче, придётся со снятием зачарований с артефактов поступить обходным путём - сделать проверку наличия артефакта и добавить в инвентарь артефакт с таким же зачарованием, но без кейворда DisallowEnchanting. Но боюсь, без вашей помощи никак... не подскажите, как правильно написать такой скрипт:

    


или такую же муть с formlist... подскажите, пожалуйста, если кому не сложно

"Всё слишком относительно, что бы утверждать столь однозначно..." ©

Multigone  Offline  Сообщение №2078 написано: 5 мая 2016, 17:04



832
Lexo



Lexo  Offline  Сообщение №2079 написано: 9 мая 2016, 13:34 | Отредактировано: Lexo - 9 мая 2016, 13:36


Всепознающий мододел


223
Multigone, ух ты, спасибо огромное! Пойду проверю...

Добавлено (09 Мая 2016, 16:34)
---------------------------------------------
То ли я опять что-то не так делаю, то ли не работает... лично я склоняюсь к первому, поэтому, если не сложно, можете проверить, что не так?

в общем, повесил скрипт просто на игрока, заполнил все - не работает...



потом создал квест, как алиас выбрал игрока - тоже не сработало...


"Всё слишком относительно, что бы утверждать столь однозначно..." ©

Multigone  Offline  Сообщение №2080 написано: 9 мая 2016, 18:51 | Отредактировано: Multigone - 9 мая 2016, 19:06



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

Что делать, чтобы копии попали в инвентарь ДО активации стола - пока хз. Возможно, попробовать перк Entry - Activate, как предлагал Dsion...

Цитата Lexo

повесил скрипт просто на игрока


Он не будет работать, т.к. предназначен исключительно для ReferenceAlias.

Lexo, новая версия. Итак:




Содержание перка:

1) Тип: Entry -> Activate. Отметить флаги: Run Immediately, Replace Default.
2) Условия: Target -> (S) (HasKeyword) (IsEnchanting) (==) (1.0)

Чтобы правильно повесить скрипт на перк, нужно в точности повторить следующие действия:

- повесить на алиас основной скрипт.
- открыть Entry перка и в поле Papyrus Fragment написать:
Код
akactor.kill()

- сохранить перк, нажав OK -> OK.
- открыть папку Scripts / Source и найти там свежесозданный скрипт. Он будет наименован как "PRKF_(EditorID перка)_(FormID перка).psc" (в моем случае это был PRKF__MGTTestPERK_031662DB.psc).
- открыть этот скрипт редактором текста и написать в конце:
Код
<Имя твоего основного скрипта> Property L Auto

... в моем случае это было так:
Код
;END FRAGMENT CODE - Do not edit anything between this and the begin comment
_TestSCPTREFA Property L Auto

- сохранить скрипт.
- СКОМПИЛИРОВАТЬ этот скрипт штатными средствами СК (через Gameplay -> Compile).
- открыть перк и в поле Papyrus Scripts заполнить Property L, указав твой квест и содержащийся в нем алиас, на который навешен основной скрипт. Нажать ОК.
- открыть Entry перка и в поле Papyrus Fragment написать:
Код
L.F(akTargetRef)

- сохранить перк, нажав OK -> OK. Сохранить мод.

PS: Оба скрипта являются неотъемлемой частью мода, что следует учитывать.
PPS: У меня все работает.
PPPS: На скрине под спойлером перепутаны предметы в листах, но в целях теста это не важно.
PPPPS: Долбаные bb-коды.


Lexo  Offline  Сообщение №2081 написано: 9 мая 2016, 21:36


Всепознающий мододел


223
Ого, не думал, что кто-то мне так серьёзно решит помочь. Прям не знаю, как благодарить. Пойду попробую сделать это... очень надеюсь, что справлюсь. Спасибо огромное!

Добавлено (10 Мая 2016, 00:24)
---------------------------------------------

Цитата Multigone

- открыть Entry перка и в поле Papyrus Fragment написать:Код
L.F(akTargetRef)

- сохранить перк, нажав OK -> OK. Сохранить мод.

После того, как вписываю  L.F(akTargetRef) и нажимаю ОК выдаёт ошибку, что нельзя закомпилировать

 
Вроде, всё делаю по написанному... что же не так?

Добавлено (10 Мая 2016, 00:36)
---------------------------------------------
А да... и ещё после взятия перка пентаграмма душ убивает игрока... я так понял, это последствия той самой некомпилирующейся команды...


"Всё слишком относительно, что бы утверждать столь однозначно..." ©

Multigone  Offline  Сообщение №2082 написано: 9 мая 2016, 23:05 | Отредактировано: Multigone - 24 апреля 2020, 10:44



832
Lexo, скрин не показывает саму ошибку, там после (8, 2... есть еще текст.
Скорей всего, переменная L не содержит функцию F. Возможно, имя Property L выбрано неправильно (не соотв. имени осн. скрипта).

Lexo, а, еще кое-что: если тот перк можно выбирать в меню повышения уровня, то следующие элементы надо убрать из скрипта (с последующей компиляцией):

Код
Perk Property ActivatePERK Auto

EVENT OnInit()
    GetActorRef().AddPerk(ActivatePERK)
ENDEVENT
Я-то думал, что новая система снятия чар полностью заменяет старую, поэтому и перк добавлял игроку при инициализации алиаса.

Lexo  Offline  Сообщение №2083 написано: 13 мая 2016, 11:07 | Отредактировано: Lexo - 13 мая 2016, 11:10


Всепознающий мододел


223
Понятно. Сейчас поправим. Но скрипт я сохраню на всякий случай...

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

Добавлено (13 Мая 2016, 14:07)
---------------------------------------------
И ещё сразу накину умным людям... возможно ли сделать, что бы обычные стрелы начали взрываться?
Я знаю, что стрелам можно прописать взрыв в Projectile, но тогда это изменит стрелы навсегда. А возможно ли взрывать их только при определённых условиях (ну, как вы понимаете, опять перк)?
Наверное, надо навешивать скрипт OnHit с
(selfref.GetEquippedItemType(1) == 8) || \
(selfref.GetEquippedItemType(1) == 12)
да?

"Всё слишком относительно, что бы утверждать столь однозначно..." ©

Multigone  Offline  Сообщение №2084 написано: 13 мая 2016, 11:11 | Отредактировано: Multigone - 24 апреля 2020, 10:47



832
Lexo, в общем, я проверил два варианта:

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

2) Через такой фрагмент на перке Activation (условия - игрок в скрытности, цель в бою):


При активации выводится сообщение, мол, вас уже поймали, и меню не открывается.

Пока только такие идеи были.

Lexo, по поводу стрел - скорее всего, да, через OnHit(). Только скрипт должен быть на маг. эффекте заклинания, которое творится от имени игрока через опред. интервалы времени, действует в большом радиусе и игнорирует преграды.

PS: Вместо selfref надо использовать akAggressor, впрочем, все это нюансы.

Dsion  Offline  Сообщение №2085 написано: 13 мая 2016, 14:51



Цитата Lexo

И ещё сразу накину умным людям... возможно ли сделать, что бы обычные стрелы начали взрываться?Я знаю, что стрелам можно прописать взрыв в Projectile, но тогда это изменит стрелы навсегда. А возможно ли взрывать их только при определённых условиях (ну, как вы понимаете, опять перк)?
Наверное, надо навешивать скрипт OnHit с
(selfref.GetEquippedItemType(1) == 8) || \
(selfref.GetEquippedItemType(1) == 12)
да?


Посмотри самый последний перк в ветке лучника.

Lexo  Offline  Сообщение №2086 написано: 13 мая 2016, 20:18


Всепознающий мододел


223
Цитата Dsion

последний перк в ветке лучника

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

"Всё слишком относительно, что бы утверждать столь однозначно..." ©

Dsion  Offline  Сообщение №2087 написано: 13 мая 2016, 20:46



Да на эффекте, вроде, и радиус поставить можно, и Explosion прицепить... Если не выйдет, пиши - я перепроверю.

Lexo  Offline  Сообщение №2088 написано: 14 мая 2016, 18:51 | Отредактировано: Lexo - 14 мая 2016, 20:18


Всепознающий мододел


223
Ни радиус, ни эксплоушен не помогают... заклинания "при ударе" действуют только на 1 цель... очевидно, придётся пробовать скриптом... но с этим я, надеюсь, справлюсь...

Зато теперь у меня другой вопрос - возможно ли сделать:

1) Заклинание, которое на расстоянии будет производить карманные кражи (эдакое телекинетическое обваровывание), или что бы телекинез мог воровать (хотя это я, по-моему, уже спрашивал);
2) Заклинание, которое будет открывать замки на сундуках и дверях с рандомом (т.е. каждую секунду кидает рандом от 1 до 100 и проверяет равенство)?

"Всё слишком относительно, что бы утверждать столь однозначно..." ©

Dsion  Offline  Сообщение №2089 написано: 14 мая 2016, 18:56



Да? Только на одну? Сложно поверить, но может...
Проверю на всякий случай...

Multigone  Offline  Сообщение №2090 написано: 15 мая 2016, 12:27 | Отредактировано: Multigone - 15 мая 2016, 12:34



832
Lexo,

1) Думаю, да. Но реализация может быть разной. Вот какие идеи, когда игрок в скрытности действует телекинезом на актера:
- он активирует его на расстоянии (процесс по умолчанию).
- он заставляет его выбросить случайный (не экипированный) предмет из инвентаря, который затем можно подобрать. Игроку наносится урон магии, скажем, 50 ед., или перезарядка Х сек. Нужен SKSE.
- открывается контейнер-меню для этого НПС. Первый предмет, который выберет игрок, выбрасывается из инвентаря актера (можно выбирать экипированное), меню закрывается и НПС переходит в состояние тревоги (если выбран экипированный предмет, то атакует). Нужен SKSE.

2) На пред. странице Dsion уже говорил про двери и заклинания. Есть еще вариант - искать ближайший референс указанного типа - FindClosestReferenceOfAnyTypeInListFromRef(). Но кол-во дверей и сундуков в сумме больше 400 (или около того), так что искать будет долго. Плюс, модные типы учитываться не будут. Не знаю, стоит ли оно того...

Lexo  Offline  Сообщение №2091 написано: 15 мая 2016, 13:29


Всепознающий мододел


223
Цитата Multigone

- он активирует его на расстоянии (процесс по умолчанию).

А именно с телекинезом это возможно? Он ведь "На себя" кастуется...

"Всё слишком относительно, что бы утверждать столь однозначно..." ©

Multigone  Offline  Сообщение №2092 написано: 15 мая 2016, 15:15 | Отредактировано: Multigone - 15 мая 2016, 15:16



832
Lexo, можно создать отдельное заклинание FF - Target Actor, длительностью 5с и условием "этого заклинания нет на актере". На телекинез повесить скрипт с постоянным апдейтом и кастом этого заклинания (цель не указывать). Тогда, как только игрок наведет прицел на актера, следующее заклинание в апдейте сработает и выполнит повешенный на него скрипт с Activate. Следующие 5с оно срабатывать не будет (типа кулдаун).
Конечно, было бы проще, если б скриптом можно было узнавать референс, на который смотрит игрок. Но я такой функции не нашел (плохо искал?).

Dsion  Offline  Сообщение №2093 написано: 15 мая 2016, 16:11



Multigone, нормально искал :) Без SKSE точно нету. А в SKSE есть, но я не проверял её.

Lexo  Offline  Сообщение №2094 написано: 15 мая 2016, 17:03 | Отредактировано: Lexo - 15 мая 2016, 17:07


Всепознающий мододел


223
Тогда можно сделать так:

Когда кастующий в скрытности, а цель вне боя, то
Цитата Multigone

- открывается контейнер-меню для этого НПС. Первый предмет, который выберет игрок, выбрасывается из инвентаря актера (можно выбирать экипированное), меню закрывается и НПС переходит в состояние тревоги (если выбран экипированный предмет, то атакует). Нужен SKSE.

а когда цель в бою (и не важно крадётся кастующий или нет), то появляется шанс выбить у противника из рук оружие и щит (чем меньше у цели запаса сил, тем больше шанс [учитывая 5 секундный кулдаун, то 100% при 0 запаса сил, и 50% при 100% запаса сил)?

"Всё слишком относительно, что бы утверждать столь однозначно..." ©

Multigone  Offline  Сообщение №2095 написано: 15 мая 2016, 17:15 | Отредактировано: Multigone - 15 мая 2016, 17:24



832
Dsion, как ты знаешь, в Form есть SKSE-событие OnCrosshairRefChange(), но если в момент запуска скрипта с ним игрок уже смотрит на к.-л. референс, то его получить не выйдет. Событие полезное, но не в том конкретном случае.

Lexo, а? Я бы не стал на одно заклинание накручивать много разных вещей. Ванильные тем и хороши, что они простые и игроку легко запомнить, что какое делает.
К тому же то, что ты предложил, уже есть в оригинале у крика... Эм, не помню название.
К тому же, первое уже содержит второе (т.е. до боя можно снять экипированное оружие).
К тому же, эта идея не слишком простая в реализации. Но если надо...

Aksyonov  Offline  Сообщение №2096 написано: 16 мая 2016, 00:44 | Отредактировано: Aksyonov - 16 мая 2016, 00:45



937
Всем снова привет подскажите пожалуйста в общем и по короче - как сделать персонажа который бы становился в боевую стойку при подход гг а при приближении говорил не подходи, вот как в игре уже такое было, сложно сделать? мне вот сейчас надо подобное какие то скрипты используются?

Lexo  Offline  Сообщение №2097 написано: 16 мая 2016, 06:10


Всепознающий мододел


223
Цитата Aksyonov

то скрипты используются?

Может быть, там надо AI-пакеты смотреть, а не скрипты? Не пробовал?

"Всё слишком относительно, что бы утверждать столь однозначно..." ©

Multigone  Offline  Сообщение №2098 написано: 16 мая 2016, 10:25 | Отредактировано: Multigone - 16 мая 2016, 10:26



832
Цитата Dsion

А в SKSE есть, но я не проверял её.


Честно говоря, здесь я не нашел. Может... даже как-то неудобно... эээ... как бы это лучше сказать... напишешь ее? :D

Dsion  Offline  Сообщение №2099 написано: 16 мая 2016, 17:23




Multigone  Offline  Сообщение №2100 написано: 16 мая 2016, 18:10



832
Lexo, в общем, почти реализовал третий способ воровства (как-бы) с телекинезом. Вот он:

1) Заклинание телекинеза (свиток тоже не забыть):





2) Вспомогательное заклинание (с др. стороны, это как раз основное заклинание):





Как работает: при касте телекинеза на актера открывается его инвентарь. Первый выбранный игроком предмет выбрасывается, игроку наносится урон магии 50 ед. за перенапряжение, создается шумовое событие амплитудой (от 10 + 10 за каждый 1 ед. веса выброшенного предмета + 50 за экипированный предмет, максимум 100; нужен тест события). Кулдаун 3с. Не проработана реакция дружественного НПС на такую кражу.

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

PS: Возможно, я что-нибудь забыл указать, т.к. сказывается недостаток времени. Как я и говорил, этот идея не слишком простая в реализации.

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





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