Модератор форума: 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  Сообщение №2461 написано: 25 июня 2017, 22:05



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

m4mk203  Offline  Сообщение №2462 написано: 26 июня 2017, 11:50



29
Цитата Dsion

На алиасе игрока скрипт с ивентом смены локации

Правильно ли я понял систему с алиасами: создаем пустой квест без стадий и флагом стартовать в начале игы. В список алиасов вешаем игрока. И уже на алиас игрока все нужные скриптовые отработки. Так?

Теперь по дверям. Дело в том, что в нордских подземельях я хочу отрабатывать не только два класса дверей (первый - с драконьим когтем и замками-ребусами, второй - все остальные) но и точки логического разделения подземелий на области, а там уже к объекту не привяжешся. 
Под точками логического разделения я понимаю такие вещи как выход с винтовой лестницы в обрядную комнату на Ветренном Пике, то есть места, где происходит доступ в некие значимые обрядово или логически учатки подземелья, а вот дверей там может и не быть. По сути это некие "дверные проемы", небольшие комнаты, мосты. Там без триггерных областей ИМХО никак. Ну и не хочется мне трогать событие смены локаций. Как бы вылетов не наплодить.

Еще момент по поводу квестов и алиасов. Нужно реализовать такую штуку:

При начале новой игры после создания и подтверждения персонажа у гг нужно запустить эффект оглушения с анимацией и закинуть с соответствующим уведомлением ему в инвентарь записку и пару плюшек. Никакой квест при этом начинаться не должен. Событие одноразовое и происходит безусловно. При этом фокус должен корректно сработать даже при установленном моде "Живи другой жизнью". Как такое реализовать?

m4mk203  Offline  Сообщение №2463 написано: 26 июня 2017, 14:10 | Отредактировано: Multigone - 22 апреля 2020, 15:46



29
Все-таки как разрулить вопрос с добавлением ГГ при старте записочки под анимацию оглушения?

Dsion  Offline  Сообщение №2464 написано: 26 июня 2017, 14:38



m4mk203, вопрос, скорее, в том, к чему подцепиться... И как должен отреагировать мод, если его подключили уже после старта игры?

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

Можно к расе игрока, к стадии главного квеста, входу в любую конкретную локацию. Или просто к смене локации, но при условии, что игрок уже полностью контролирует персонажа. Или просто проверять каждый игровой час, контролирует ли игрок персонажа. К первому входу в нордские руины итд итп.

m4mk203  Offline  Сообщение №2465 написано: 26 июня 2017, 15:27 | Отредактировано: m4mk203 - 26 июня 2017, 15:30



29
Dsion, а можно отплясать таким колхозно-ломовым методом: нужное событие случается при достижении игроком скажем 2-го уровня? На получении 2-го уровня гг вряд-ли успеет сунуться хоть в один данж драугров. Если да, то как именно это реализовать? Событие одноразовое и никакого квеста на нем не стартует. Просто кидаем в инвенталь записку, пару приблуд и проигрываем под это все анимацию оглушения секунд на 10.

Вот сокращенный (без описания квестов и стадий) вариант ТЗ для мода.


Фактически нужно решить три основных задачи:
1. Серьезно мотивировать ГГ лезть в данжи.
2. Устроить в этих данжах реальное зверство при чем не банальным задиранием уровня неписей
3. Обеспечить реиграбельность пройденных данжей в рамках даже текущего прохождения (мотивировать ГГ возвращаться туда)

Dsion  Offline  Сообщение №2466 написано: 26 июня 2017, 18:16 | Отредактировано: Dsion - 26 июня 2017, 18:24



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

m4mk203  Offline  Сообщение №2467 написано: 26 июня 2017, 18:34



29
Dsion, выбор я уже сделал. Выдать бумагу гг при получении 2-го левела и при этом включить эффект оглушения на 5 секунд. Как это реализовать?

Dsion  Offline  Сообщение №2468 написано: 26 июня 2017, 18:36



А если игрок 11-го уровня в момент подключения мода?

MagicalDagger  Offline  Сообщение №2469 написано: 26 июня 2017, 18:38 | Отредактировано: MagicalDagger - 26 июня 2017, 18:52



48
Всем снова привет.
Нашел альтернативный вариант относительно своего последнего вопроса, но возникли проблемы. Собственно, вот фрагмент кода:




Notification  в игре выводит Nonchecked, судя по всему, не хочет кастоваться тип переменной, так как результатов нижеследующих действий нет (заполненные обычные камни душ не удаляются, проверял именно на них). Событие срабатывает, так как другие действия скрипта успешно выполняются.
1. Прав ли я?
2. Как это обойти/исправить?

Dsion  Offline  Сообщение №2470 написано: 26 июня 2017, 18:45 | Отредактировано: Dsion - 26 июня 2017, 18:47



m4mk203, попробуй, лучше, вот такой вариант (скрипт на квесте)

Код
Event OnInit()
    RegisterForSingleUpdateGameTime(0.1);
EndEvent

Event OnUpdate()
    Debug.MessageBox("111");
EndEvent


Я сейчас на море без СК, но, по-моему, такой вариант срабатывает через 1/10 часа после начала отсчета игрового времени (освобождение игрока от наручиков). А если мод был подключен не с самого начала игры, то через 1/10 часа после входа игрока в мир со включенным модом.

А вариант с гонцом точно не хочешь? Оглушение и прилетающие из ниоткуда предметы - как-то не лорово.

m4mk203  Offline  Сообщение №2471 написано: 26 июня 2017, 18:47



29
Dsion, ох.... Ладно. Давай тоггда попробуем вариант универсального типа - с гонцом. Но я слыхал, что этот кадр глюковат. Правда сам с ним за три года общения со скаем проблем не имел. Расскажи как с гонцом запилить

Dsion  Offline  Сообщение №2472 написано: 26 июня 2017, 18:51



m4mk203, а я не помню :(
Помню только, что где-то есть квест гонца (что-то там со словом "Courier"). На квесте скрипт, а в скрипте функция, которую достаточно вызвать и всё.
Как-то так:

Код
Имя_скрипта_на_квесте_курьера Property Siski Auto

Event OnInit()
    Siski.Какая-то_функция(Какой-то предмет);
EndEvent

Нарада  Offline  Сообщение №2473 написано: 27 июня 2017, 10:02



129

m4mk203  Offline  Сообщение №2474 написано: 27 июня 2017, 12:13



29
1. Реализую такую задачку

Выдача наград за убийство именованых драконьих жрецов (тех из них, что имеют маски).



Проблема: глобальный счетчик убийств должен тикать только при условии, что жреца грохнул именно ГГ. Как это однозначно отловить? Че делать с остальным - понятно.

2. Нужна помощь в создании чудоплюшки.

"Стрела вора"



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

Dsion  Offline  Сообщение №2475 написано: 27 июня 2017, 12:54



m4mk203, попробуй сначала на стрелу хоть какое-то зачарование повесить. Я на море без СК, но не помню, чтоб такое было возможно.
На арбалетных болтах висит Explosion - но это взрыв, а не зачарование. Там хрен получишь референсы тех, кого задел взрыв.
А вот с помощью перка на ГГ можно сделать... Там можно к любому попаданию из любого оружия подцепиться или даже ко взмаху этим оружием.

Вот еще глянь:
OnDeath
другого способа не приходит в голову. вешать можно на базового актора, на конкретный референс или на алиас.

m4mk203  Offline  Сообщение №2476 написано: 27 июня 2017, 13:02



29
Цитата Dsion

m4mk203, попробуй сначала на стрелу хоть какое-то зачарование повесить

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

OnDeath  имеется в виду то событие, что срабатывает на жреце и типа отдает референс на киллера? То есть вешаю скрипт на актора-жреца в СК и отрабатываю в скрипте его событие OnDeath. Правильно?

Dsion  Offline  Сообщение №2477 написано: 27 июня 2017, 15:06



Цитата m4mk203

Делал таким макаром отравленные стрелы


мм, я такого не помню( Но если ты можешь через стрелу повесить на кого-то эффект, то получить реферес - вообще не проблема:
https://www.creationkit.com/fallout...._Script
см. ивент. OnEffectStart

m4mk203  Offline  Сообщение №2478 написано: 29 июня 2017, 01:05



29
Dsion, скрипт привязал к стреле, но всплыла проблемка: OnEffectStart в этом варианте срабатывает только на живых целях и трупаках. Больше ни на каком типе контейнера этого события не возникает.

Dsion  Offline  Сообщение №2479 написано: 29 июня 2017, 09:33



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

m4mk203  Offline  Сообщение №2480 написано: 29 июня 2017, 12:42 | Отредактировано: m4mk203 - 29 июня 2017, 12:49



29
Dsion,  с сундуками дело гнилое. Ок. Буду развивать тему с живыми и мертвыми. Эффект прикольный получился :)

Такой вот прикол

Задача считать трупы по категориям.
Подробнее.
Есть два типа трупешников, за которые ГГ будет получать вознаграждение. Механизм не квестового типа. Предположим я пробежался по владению Истмарк и нарезал в нем пару десятков бандюков (в разных локациях этого владения). В какой-то момент я прихожу к ярлу Истмарка и через диалог с ним (отдельно созданную для этого ветку) получаю некую награду (по рандому из формлиста) за убиенных. После этого счетчик убийств для данного владения обнуляется и я снова иду на охоту. Счетчик не для локации, а именно для всего конкретного владения. 9 владений - 9 счетчиков.

Вопрос. К чему лепить скрипт-обработчик OnDeath для подсчета убийства бандюков в конкретном владении (независимо от конкретной локации этого владения)?

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

Ну и главное... А вобще можно определить кого именно (бандюка, солдата, гражданского, драугра, фалмера и т.д.) я убил? И если да, то как именно определяется класс жертвы?

П.С.

Если нужен зачар на стрелы

В СК

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

Dsion  Offline  Сообщение №2481 написано: 29 июня 2017, 13:28



Цитата m4mk203

А вобще можно определить кого именно (бандюка, солдата, гражданского, драугра, фалмера и т.д.) я убил? И если да, то как именно определяется класс жертвы?


Я бы начал даже еще более издали: можно ли вообще поймать событие убийства кого-либо игроком, не вешая скрипт на жертву.
Кроме вот этого, лично мне других вариантов в голову и не приходит:
https://www.creationkit.com/index.php?title=OnStoryKillActor_-_Quest
А проверить класс жертвы - это уже легко. По кейвордам делается:
https://www.creationkit.com/index.php?title=HasKeyword_-_Form

m4mk203  Offline  Сообщение №2482 написано: 29 июня 2017, 13:36 | Отредактировано: m4mk203 - 29 июня 2017, 14:09



29
Dsion, ну, мысль о подсчете приперлась после взгляда на статистику прохождения в главном меню игры. Там же подсчитывается количество убийств. И при  этом скриптов на неписи нима. Видимо, присутствует некая системная функция... Буду копать.
Цитата Dsion

А проверить класс жертвы

То есть ты имееш в виду что у каждой локации и НПС есть кейворд, определяющий класс или некую принадлежность? Я просто там еще не копался основательно.

Вариант со скриптовым событием предполагает примерно  такое решение?

Приходит в голову такой алгоритм (правильно ли я думаю)
1. Делаем перманентный квест
2. Вешаем туду обработку события OnStoryKillActor
3. В обработчике события определяем фракцию убиенного и тикаем соответствующий глобальный счетчик.

То есть этот скрипт будет работать в любой локации и на событии убийства игроком любого НПС. Я правильно понимаю?

Dsion  Offline  Сообщение №2483 написано: 29 июня 2017, 15:00 | Отредактировано: Dsion - 29 июня 2017, 15:02



Цитата m4mk203

Я правильно понимаю?


А я почём знаю? Я так не извращался! Да, нужен квест и в квесте событие. А еще запись в SM Event Node. И не забыть снова остановить квест после обработки события.

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

Статистика в меню - есть такая. Эти цифры можно считывать из скрипта. Но изменять или устанавливать условия измнения - нельзя. Скайрим, в основном, на С++ написан, а скрипты ограничены в возможностях.

m4mk203  Offline  Сообщение №2484 написано: 29 июня 2017, 16:04



29
Цитата Dsion

И не забыть снова остановить квест после обработки события.

А тут можно как для тупых? зачем останавливать квест? Мне ж нужно чтобы он работал на протяжении всей игры. Я имел в виду отработку ситуации не когда ярл дает квест игроку на отстрел бандюков, а когда гг просто шатается по скаю, отстреливает бандитов и потом может прийти к ярлу владения мол "я тебе тут закоулки подчистил, кинь деньжат на развитие". Получил награду (квест при этом завершаться не должен) пошол дальше терорить скайрим снова вернулся за наградой ну и так до бесконечности.

Dsion  Offline  Сообщение №2485 написано: 29 июня 2017, 17:30 | Отредактировано: Dsion - 29 июня 2017, 17:32



Цитата m4mk203

зачем останавливать квест?


Ну OnStoryKillActor - это один из способов старта квеста. Квест может быть запущен изначально (Start game enabled), может запускаться из предыдущего квеста в цепочке, может запускаться из скрипта в любом месте. А может еще по ивентам вот такого типа, как OnStoryKillActor - их много.
Но если его не остановить, то следующее убийство его и не запустит, ясно дело.

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

Хм... Другие вариаты? Не знаю даже... Ну можно дать пассивную абилити каждой расе, но перезаписывать все расы - бред.
Еще можно подождать. Вдруг кто-то другой что-то придумает.

Начни пока реализовывать хоть что-то :) А то размечтался тут, заданий себе наставил)

m4mk203  Offline  Сообщение №2486 написано: 2 июля 2017, 22:30 | Отредактировано: m4mk203 - 2 июля 2017, 22:32



29
Dsion, ага. Если стартует квест по ивенту то вариант вполне себе норм. Со стрелами было хуже. Я просто в самой механике квестов пока ноль.

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

Добавлено (03 Июля 2017, 01:30)
---------------------------------------------
Так. Счетчики убитых драугров, бандюков, драконьих жрецов сделать удалось. Прекрасно отлавливаются по фракциям.

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

Вот скрипт


Суть скрипта: отловить событие ухода когтя из инвентаря ГГ и при этом проверить, что у ГГ не осталось других когтей из списка ClawList.

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

Как это побороть?

Dsion  Offline  Сообщение №2487 написано: 3 июля 2017, 10:03 | Отредактировано: Dsion - 3 июля 2017, 10:25



m4mk203, а что за OnStoryRemoveFromPlayer? Я такого и не видел. Через обычный OnItemRemoved работало бы точно. А если через старт квеста... Не пробовал переместить проверку предмета из самого скрипта в условие на SM Event Node?
Но лучше скрипт с OnItemRemoved на алиас игрока.

m4mk203  Offline  Сообщение №2488 написано: 3 июля 2017, 11:02



29
Цитата Dsion

Но лучше скрипт с OnItemRemoved на алиас игрока.

Ни разу еще не игрался с алиасом игрока. Можешь расписать пошагово как на него вешать обработку события?

Dsion  Offline  Сообщение №2489 написано: 3 июля 2017, 11:27



Цитата m4mk203

Можешь расписать пошагово как на него вешать обработку события?


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

m4mk203  Offline  Сообщение №2490 написано: 3 июля 2017, 11:42



29
Цитата Dsion

Да просто фигаришь квест (должен быть запущенным)

То есть это квест с маркером стартовать в начале игры и который ни при каких условиях не стопается?

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





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