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



139
Цитата Artem13

а конструкция в стиле С тоже не канаеть? " \< "


Тоже не работает.

Artem13  Offline  Сообщение №542 написано: 25 ноября 2013, 14:06


Mercenaries. Со смертью на ты.


LordVadim, тогда попробуй еще один финт из С - " \0x3C "

<a class="link" href="http://nick-name.ru/sertificates/278209/" rel="nofollow" target="_blank"> border="0" alt=""/</a>
Да, мы бандиты и бродяги, как злословит молва,
Мы попадаем в передряги, помня эти слова.
Смотри вперед и не сдавайся ты на милость судьбе!
Предай их всех, останься верен себе. (Канцлер Ги - Кантри Бреган Д'Эрт)
AleksTirex  Offline  Сообщение №543 написано: 25 ноября 2013, 14:31 | Отредактировано: AleksTirex - 25 ноября 2013, 14:36


Архимаг


371
Символ "<" - это служебный символ, он используется для форматирования сообщений, и чем его ни "замазывай", само его наличие воспринимается Папирусом как команда. Он как раз и служит для того, чтобы отсекать/оставлять всё то, что до и после него, поэтому он и отсекает, и ему по барабану что именно отсекать. Это типа "точки с запятой", как её ни замазывай, но всё, что после неё Папирус всегда будет игнорировать.

Используй стандартные Up и Down вместо < и > (ведь именно это ты хотел написать на кнопках?).

**************
Посмотрите на сайте у разрабов, и если я не ошибаюсь, то там написан принцип форматирования сообщений, и там < фигурирует в этом процессе (но это было давно, я мог и что-то забыть/перепутать).

Artem13  Offline  Сообщение №544 написано: 25 ноября 2013, 16:05


Mercenaries. Со смертью на ты.


Цитата AleksTirex

Символ "<" - это служебный символ, он используется для форматирования сообщений, и чем его ни "замазывай", само его наличие воспринимается Папирусом как команда. Он как раз и служит для того, чтобы отсекать/оставлять всё то, что до и после него, поэтому он и отсекает, и ему по барабану что именно отсекать. Это типа "точки с запятой", как её ни замазывай, но всё, что после неё Папирус всегда будет игнорировать.


Беседка во всей своей убогости :(

<a class="link" href="http://nick-name.ru/sertificates/278209/" rel="nofollow" target="_blank"> border="0" alt=""/</a>
Да, мы бандиты и бродяги, как злословит молва,
Мы попадаем в передряги, помня эти слова.
Смотри вперед и не сдавайся ты на милость судьбе!
Предай их всех, останься верен себе. (Канцлер Ги - Кантри Бреган Д'Эрт)
DarkVetal  Сообщение №545 написано: 25 ноября 2013, 16:15

LordVadimAleksTirex, повесил скрипты на активатор, при компиляции выдает ошибку. Обьекты sFire и akWater создал, но каким способом привязать к ним рукоятку-активатор? Через LinkedRef или ActivateParent? Галочку Initially Disable ставил.

AleksTirex  Offline  Сообщение №546 написано: 25 ноября 2013, 17:22


Архимаг


371
DarkVetal, а какой именно скрипт ты создал? От этого зависит привязка активатора, да и ошибка при компиляции... тоже нужен полный скрипт.

LordVadim  Offline  Сообщение №547 написано: 25 ноября 2013, 17:30 | Отредактировано: LordVadim - 25 ноября 2013, 17:33



139
Цитата Artem13

тогда попробуй еще один финт из С - " \0x3C "


Не работает.
Алекс - прав. Управляющий символ вставить, наверное не получится.
Хотя интересно - в тесте сообщений он спокойно отображается, а в названии кнопки нет. Где логика?

Заменю символы   <    >   на   {==    ==}    Похоже на стрелки?

Artem13  Offline  Сообщение №548 написано: 25 ноября 2013, 17:58


Mercenaries. Со смертью на ты.


Цитата LordVadim

Где логика?


Эээ, ты о чём? У беседки с логикой вообще напряжне. Они существуют в разных параллельных вселенных.

<a class="link" href="http://nick-name.ru/sertificates/278209/" rel="nofollow" target="_blank"> border="0" alt=""/</a>
Да, мы бандиты и бродяги, как злословит молва,
Мы попадаем в передряги, помня эти слова.
Смотри вперед и не сдавайся ты на милость судьбе!
Предай их всех, останься верен себе. (Канцлер Ги - Кантри Бреган Д'Эрт)
DarkVetal  Сообщение №549 написано: 25 ноября 2013, 19:08 | Отредактировано: DarkVetal - 25 ноября 2013, 19:09

AleksTirex, ну вот этот скрипт, повесил на ручку нордическую, ручку через LinkedRef привязал к модели воды, ID которой akWater, воду выключил галочкой, при заходе в игру все вылетает к чертям.

ObjectReference Property akWater  Auto

Event OnActivate(ObjectReference akActionRef)
if akWater.IsDisabled()
akWater.Enable()
else
akWater.Disable()
endif
endEvent

AleksTirex  Offline  Сообщение №550 написано: 25 ноября 2013, 19:39


Архимаг


371
DarkVetal, а строка Scriptname myObjectScript extends ObjectReference есть в твоём скрипте? Я ведь писал "нужен полный скрипт". (myObjectScript - это ID скрипта, оно должно быть своим и уникальным)

Совет: когда что-то делаешь в СК или пишешь скрипты, то думай, что и главное зачем это делаешь.
Вот зачем в твоём скрипте строка со свойством akWater?
Если имеется написанное свойство, то значит, на него надо что-то назначить, иначе это только буковки и не более. Ты назначил что-нибудь на него?
Зачем назначать рычагу LinkedRef, если он не используется?
Во втором скрипте есть такое GetLinkedRef(), так разве нет сходства буковок "LinkedRef" во втором скрипте и твоих действиях с назначение в одноимённой вкладке какой-то ссылки?
 
Ты не обижайся на такой ответ, я просто лишь хочу научить думать, чтобы ты сам смог что-то создавать и это после того оно ещё бы и работало. Если будешь только копировать написанное кем-то, то ничему не научишься.
Ты почитай внимательно совет, и попробуй сам найти свои ошибки, так пользы будет больше, для тебя.

DarkVetal  Сообщение №551 написано: 26 ноября 2013, 15:20 | Отредактировано: DarkVetal - 26 ноября 2013, 15:33

AleksTirex, я не обижаюсь, я дурак косорукий (в некоторых вопросах), но скрипт для меня - что китайские иероглифы. Что такое свойство akWater и как на него что-то назначить? Вот это я и хотел узнать, назначил по-своему, через LinkedRef, надо ж как-то рычаг со скриптом привязать к огню\воде (как двери).
Например я беру обьект GenPullBar01 (нордский рычаг) и обьект C06FXfireBlueWithEmbersHeavy (синий огонь). Нужно при нажатии рычага чтобы в указанном месте появился огонь. Значит на ручку вешаю скрипт:
Scriptname AllActivator extends ObjectReference
Event OnActivate(ObjectReference akActionRef)
if GetLinkedRef().IsDisabled()
GetLinkedRef().Enable()
else
GetLinkedRef().Disable()
endif
endEvent

Потом через LinkedRef назначаю включаемый обьект (или несколько).
Ну как, ничего не пропустил?

Все работает! Разобрался, AleksTirex спасибо тебе огромнейшее, тебе с такими знаниями нада мегамоды клепать!

LordVadim  Offline  Сообщение №552 написано: 27 ноября 2013, 13:06 | Отредактировано: LordVadim - 27 ноября 2013, 13:07



139
AleksTirex, не подскажешь: есть ли возможность в скрипте дать команду актеру сесть/лечь ели ID актера и ID мебели известны?

Myprism  Offline  Сообщение №553 написано: 27 ноября 2013, 13:43


Физик


LordVadim, обычно сажают или кладут актёра, давая ему соответствующий AI-пакет.

LordVadim  Offline  Сообщение №554 написано: 27 ноября 2013, 13:45



139
Цитата Myprism

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


Как это выглядит в скрипте?

AleksTirex  Offline  Сообщение №555 написано: 27 ноября 2013, 13:51


Архимаг


371
LordVadim, сесть/лечь - это "активировать" данную мебель актёром (эту команду ты знаешь - activate).
Хотя, обычно для этого используют пакеты ActivateSpecialFurniture.
 
****
У меня сейчас в голове "каша", поэтому не смогу точно сказать, будет ли НПС именно садиться при активации мебели, а с пакетом точно будет. По крайней мере, при активации мебели, если НПС сидит, то он точно встанет.

LordVadim  Offline  Сообщение №556 написано: 27 ноября 2013, 16:42



139
Цитата AleksTirex

LordVadim, сесть/лечь - это "активировать" данную мебель актёром (эту команду ты знаешь - activate). Хотя, обычно для этого используют пакеты ActivateSpecialFurniture.   **** У меня сейчас в голове "каша", поэтому не смогу точно сказать, будет ли НПС именно садиться при активации мебели, а с пакетом точно будет. По крайней мере, при активации мебели, если НПС сидит, то он точно встанет.


Просто активация не срабатывает ни с пакетом ни без.
Добавил ActivateSpecialFurniture - НПС садится только если в СК назначить референс мебели в Public Package Data. Вопрос как этот референс менять скриптом?

AleksTirex  Offline  Сообщение №557 написано: 27 ноября 2013, 17:21


Архимаг


371
Цитата LordVadim

Добавил ActivateSpecialFurniture - НПС садится только если в СК назначить референс мебели в Public Package Data. Вопрос как этот референс менять скриптом?



Пакет должен быть у алиаса. (галочки Optional и пустая позиция SpecificRefererce) 
Пакет делается собственностью этого квеста.
Делается второй алиас (настройки как у первого).
В пакете для цели выбирается позиция алиас, и там назначается второй алиас.
 
Перед использованием фурнитуры на второй алиас назначается референс этой фурнитуры.
akAlias02.ForceRefTo(akObjectRef)
Для запуска пакета первому алиасу назначается этот актёр.
akAlias01.ForceRefTo(akActor)
 
По окончании или для окончания сидения оба алиаса очищаются.

LordVadim  Offline  Сообщение №558 написано: 27 ноября 2013, 21:21



139
AleksTirex, спасибо. С алиасами пока не сталкивался. Буду разбираться.

Добавлено (28 Ноября 2013, 01:21)
---------------------------------------------
Разобрался. Работает. Но это не совсем то, что мне нужно.
Такая схема работает для одного НПС, а мне нужно для произвольного количества.
Есть ли возможность в скрипте делать копии квеста для каждого НПС наподобие PlaceAtMe.


AleksTirex  Offline  Сообщение №559 написано: 27 ноября 2013, 21:45


Архимаг


371
Цитата LordVadim

Такая схема работает для одного НПС, а мне нужно для произвольного количества.



Один алиас - один пакет и один стул.
Если надо 20 стульев и НПС задействовать одновременно, тогда надо делать 20 алиасов.
Как именно делается такое количество - надо смотреть в этой теме или в теме по скриптам, в этом месяце (или в прошлом) я приводил подробную инструкцию со скриптом. Разница с тем вариантом только в разных пакетах, но это в принципе вообще не разница. Поищи.
(вряд ли у тебя одновременно будут сидеть более 20-30 НПС)
 
К сожалению, с пакетами работают только алиасы и сцены, а в сценах опять алиасы, вот и всё упирается в алиасы. В Скайриме нельзя добавить пакет скриптом, как это было в Обливионе, вот и приходится использовать что есть.

LordVadim  Offline  Сообщение №560 написано: 27 ноября 2013, 22:07



139
Цитата AleksTirex

В Скайриме нельзя добавить пакет скриптом


Изменить референс добавленного пакета ActivateSpecialFurniture я так понимаю тоже в скрипте не получиться, только СK?

AleksTirex  Offline  Сообщение №561 написано: 27 ноября 2013, 22:33


Архимаг


371
Цитата LordVadim

Изменить референс добавленного пакета ActivateSpecialFurniture я так понимаю тоже в скрипте не получиться, только СK?



О как! Менять ID базовых объектов... сильно, но увы, не получится, а равно добавлять и удалять сами пакеты.
А зачем, если не секрет?
Один пакет можно использовать на множество разных целей, просто меняется референс на алиасе, который является целью пакета.

******
референс - ссылка на объект, а ActivateSpecialFurniture - ID базового объекта, к тому же это Package Template, т.е. базовый объект для других базовых объектов. Пакеты, квесты, заклинания и подобное, по определению не могут иметь референса (в его истинном значении), т.к. не могут находиться в игровом мире.

Myprism  Offline  Сообщение №562 написано: 28 ноября 2013, 02:42


Физик


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

LordVadim  Offline  Сообщение №563 написано: 28 ноября 2013, 06:48 | Отредактировано: LordVadim - 28 ноября 2013, 08:24



139
Цитата AleksTirex

О как! Менять ID базовых объектов... сильно, но увы, не получится, а равно добавлять и удалять сами пакеты. А зачем, если не секрет? Один пакет можно использовать на множество разных целей, просто меняется референс на алиасе, который является целью пакета. ****** референс - ссылка на объект, а ActivateSpecialFurniture - ID базового объекта, к тому же это Package Template, т.е. базовый объект для других базовых объектов. Пакеты, квесты, заклинания и подобное, по определению не могут иметь референса (в его истинном значении), т.к. не могут находиться в игровом мире.


Я неправильно выразил свою мысль. Я имел ввиду изменить значение переменной Target процедуры Activate из  ActivateSpecialFurniture. Ведь если этой переменной можно назначить референс в СК, то по идее и через скрипт ее можно как то изменить. Вообще то, в нормальном объектно ориентированном языке, я бы получил дочерний объект используя в качестве родителя свой Quest и далее работал бы с ним. в Papyrus я такой возможности пока не нашел.

А вообще, расскажу подробнее суть проблемы, может есть иной подход к ее решению:
Я все еще допиливаю манекены, так сказать снимаю стружку, оживляю и превращаю из манекена в модель. Написал и на ум почему то пришел папа Карло... :)
Командой SetDoingFavor я передаю игроку управление моделью. С передвижением проблем нет. Под управлением игрока модель ходит, садится, ложится... всё нормально (вообще без каких либо AI пакетов). Но если с сидящей/лежащей моделью покинуть локацию и вновь войти - модель оказывается стоящей рядом с мебелью. Проблема: как заставить модель сидеть/лежать при загрузке локации. Использование ActivateSpecialFurniture проблему решает частично - при загрузке локации модель появляется стоящей, а потом идет и садится/ложится (а хочется, чтобы она загружалась уже сидящей/лежащей).
Да, чуть не забыл: моделей может быть много... поэтому при смене референса на алиасе в пакете работает только текущая модель, а остальные нет.

Myprism  Offline  Сообщение №564 написано: 28 ноября 2013, 07:47 | Отредактировано: Myprism - 28 ноября 2013, 07:51


Физик


Цитата LordVadim

Как управлять условиями пакетов из скрипта?

Условия устанавливаются на значения переменных в квесте. А вот переменные в квесте изменяются скриптами в данном же квесте или другими. Самая простая такая переменная - стадия квеста. Мы можем скриптом поменять стадию квеста и персонаж встанет со стула и ляжет на кровать потому что у него выключился пакет сидения и включился пакет сна. Можно и без квеста. Например, такой переменной может быть открыта или закрыта дверь. Пока дверь закрыта, выполняется пакет заключённого в камере. Как только откроется, включится песочница дома и персонаж пойдёт домой заниматься своими делами. Таким образом, я управлял своими персонажами, когда ещё не умел писать квесты :) Впрочем, и сейчас не очень умею :(

LordVadim  Offline  Сообщение №565 написано: 28 ноября 2013, 08:20



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

Myprism  Offline  Сообщение №566 написано: 28 ноября 2013, 08:43


Физик


LordVadim, К сожалению, я не знаю, как полностью решить твою задачу, но предложенный мной способ работает на произвольное число персонажей. Это у тебя в голове сидит, что ты должен управлять каждым персонажем, и тогда - их число это проблема. В моём варианте персонажами совсем не надо управлять. Они действуют сами в соответствии со своими пакетами. А условие на выполнение пакетов одно, и не зависит от числа персонажей. Только те же пакеты должны стоять у всех. Условием должна быть некая глобальная переменная. Её можно создать и изменять помимо квестов. Но в квесте это получается правильнее.

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

LordVadim  Offline  Сообщение №567 написано: 28 ноября 2013, 09:16 | Отредактировано: LordVadim - 28 ноября 2013, 09:22



139
Цитата Myprism

К сожалению, я не знаю, как полностью решить твою задачу


Буду надеяться на Алекса. Может он поможет?

AleksTirex  Offline  Сообщение №568 написано: 28 ноября 2013, 11:29


Архимаг


371
Цитата LordVadim

Я имел ввиду изменить значение переменной Target процедуры Activate из  ActivateSpecialFurniture.



Так именно это я уже два раза тебе писал:
Пакет делается собственностью твоего квеста, тогда в нём можно будет в качестве цели использовать алиас из твоего квеста. Вот этот алиас ты можешь менять/переназначать хоть каждую минуту и каждый раз целю этого пакета будет новый референс, который ты назначаешь на этот алиас. Это и есть менять Target в процедуре.
 
 
Вот сам твой пакет имеет процедуру активации, вот НПС и активирует с анимацией "сесть". А тебе надо процедура "сидеть", тогда и при загрузки эта процедура уже сразу загрузит сидящего НПС. Можно вместо Activate дать пакет Sit, или собрать свой пакет на основе Sit.
 

LordVadim  Offline  Сообщение №569 написано: 28 ноября 2013, 11:59



139
Цитата AleksTirex

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


AleksTirex, да с квестом я уже понял концепцию. Я спрашивал нельзя ли это менять если пакет не к квесту привязан а к НПС?

AleksTirex  Offline  Сообщение №570 написано: 28 ноября 2013, 12:24


Архимаг


371
Цитата LordVadim

AleksTirex, да с квестом я уже понял концепцию. Я спрашивал нельзя ли это менять если пакет не к квесту привязан а к НПС?



Так назначь алиасу №1 твоего НПС, а на этом алиасе пакет с динамической целью - алиаас №2. Менять как либо параметры пакета, кроме как изменение параметров алиаса, никак.
 
Единственно, что можно сделать, так в пакете кучу процедур со своей целью и с условием на срабатывание, тогда в зависимости от условия будет срабатывать нужная процедура и нужная цель. Но в этом случае всё равно придётся заранее прописывать сами цели, они должны быть заранее известны и назначены в пакете.

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





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