• Прежде, чем задать вопрос, пожалуйста, убедитесь, что такой вопрос не задавался раньше. Старайтесь описать суть вопроса как можно подробней. • Прежде, чем опубликовать ответ на вопрос, пожалуйста, убедитесь, что обладаете необходимыми для этого знаниями. Старайтесь cформулировать суть ответа как можно лаконичней. • При желании ответить в приватном порядке, пожалуйста, воспользуйтесь ЛС. • При желании поблагодарить ответившего, пожалуйста, воспользуйтесь кнопкой "+" полезного сообщения.
Сообщения, не относящиеся к вопросам по скриптам Papyrus, ответам на них или уточнениям, являются оффтопом и могут быть удалены.
Красное солнце Есть вопросы по скриптам Papyrus? Пиши не в ЛС, а в эту тему.
LordVadim, тогда попробуй еще один финт из С - " \0x3C "
<a class="link" href="http://nick-name.ru/sertificates/278209/" rel="nofollow" target="_blank"> border="0" alt=""/</a> Да, мы бандиты и бродяги, как злословит молва, Мы попадаем в передряги, помня эти слова. Смотри вперед и не сдавайся ты на милость судьбе! Предай их всех, останься верен себе. (Канцлер Ги - Кантри Бреган Д'Эрт)
Изменение репутации для пользователя AleksTirex
AleksTirexOffline
Сообщение №543
написано: 25 ноября 2013, 14:31
| Отредактировано: AleksTirex - 25 ноября 2013, 14:36
Символ "<" - это служебный символ, он используется для форматирования сообщений, и чем его ни "замазывай", само его наличие воспринимается Папирусом как команда. Он как раз и служит для того, чтобы отсекать/оставлять всё то, что до и после него, поэтому он и отсекает, и ему по барабану что именно отсекать. Это типа "точки с запятой", как её ни замазывай, но всё, что после неё Папирус всегда будет игнорировать.
Используй стандартные Up и Down вместо < и > (ведь именно это ты хотел написать на кнопках?).
************** Посмотрите на сайте у разрабов, и если я не ошибаюсь, то там написан принцип форматирования сообщений, и там < фигурирует в этом процессе (но это было давно, я мог и что-то забыть/перепутать).
Символ "<" - это служебный символ, он используется для форматирования сообщений, и чем его ни "замазывай", само его наличие воспринимается Папирусом как команда. Он как раз и служит для того, чтобы отсекать/оставлять всё то, что до и после него, поэтому он и отсекает, и ему по барабану что именно отсекать. Это типа "точки с запятой", как её ни замазывай, но всё, что после неё Папирус всегда будет игнорировать.
Беседка во всей своей убогости
<a class="link" href="http://nick-name.ru/sertificates/278209/" rel="nofollow" target="_blank"> border="0" alt=""/</a> Да, мы бандиты и бродяги, как злословит молва, Мы попадаем в передряги, помня эти слова. Смотри вперед и не сдавайся ты на милость судьбе! Предай их всех, останься верен себе. (Канцлер Ги - Кантри Бреган Д'Эрт)
LordVadim, AleksTirex, повесил скрипты на активатор, при компиляции выдает ошибку. Обьекты sFire и akWater создал, но каким способом привязать к ним рукоятку-активатор? Через LinkedRef или ActivateParent? Галочку Initially Disable ставил.
Не работает. Алекс - прав. Управляющий символ вставить, наверное не получится. Хотя интересно - в тесте сообщений он спокойно отображается, а в названии кнопки нет. Где логика?
Эээ, ты о чём? У беседки с логикой вообще напряжне. Они существуют в разных параллельных вселенных.
<a class="link" href="http://nick-name.ru/sertificates/278209/" rel="nofollow" target="_blank"> border="0" alt=""/</a> Да, мы бандиты и бродяги, как злословит молва, Мы попадаем в передряги, помня эти слова. Смотри вперед и не сдавайся ты на милость судьбе! Предай их всех, останься верен себе. (Канцлер Ги - Кантри Бреган Д'Эрт)
Изменение репутации для пользователя DarkVetal
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
DarkVetal, а строка Scriptname myObjectScript extends ObjectReference есть в твоём скрипте? Я ведь писал "нужен полный скрипт". (myObjectScript - это ID скрипта, оно должно быть своим и уникальным)
Совет: когда что-то делаешь в СК или пишешь скрипты, то думай, что и главное зачем это делаешь. Вот зачем в твоём скрипте строка со свойством akWater? Если имеется написанное свойство, то значит, на него надо что-то назначить, иначе это только буковки и не более. Ты назначил что-нибудь на него? Зачем назначать рычагуLinkedRef, если он не используется? Во втором скрипте есть такое GetLinkedRef(), так разве нет сходства буковок "LinkedRef" во втором скрипте и твоих действиях с назначение в одноимённой вкладке какой-то ссылки?
Ты не обижайся на такой ответ, я просто лишь хочу научить думать, чтобы ты сам смог что-то создавать и это после того оно ещё бы и работало. Если будешь только копировать написанное кем-то, то ничему не научишься. Ты почитай внимательно совет, и попробуй сам найти свои ошибки, так пользы будет больше, для тебя.
Изменение репутации для пользователя DarkVetal
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
LordVadimOffline
Сообщение №552
написано: 27 ноября 2013, 13:06
| Отредактировано: LordVadim - 27 ноября 2013, 13:07
LordVadim, сесть/лечь - это "активировать" данную мебель актёром (эту команду ты знаешь - activate). Хотя, обычно для этого используют пакеты ActivateSpecialFurniture.
**** У меня сейчас в голове "каша", поэтому не смогу точно сказать, будет ли НПС именно садиться при активации мебели, а с пакетом точно будет. По крайней мере, при активации мебели, если НПС сидит, то он точно встанет.
LordVadim, сесть/лечь - это "активировать" данную мебель актёром (эту команду ты знаешь - activate). Хотя, обычно для этого используют пакеты ActivateSpecialFurniture. **** У меня сейчас в голове "каша", поэтому не смогу точно сказать, будет ли НПС именно садиться при активации мебели, а с пакетом точно будет. По крайней мере, при активации мебели, если НПС сидит, то он точно встанет.
Просто активация не срабатывает ни с пакетом ни без. Добавил ActivateSpecialFurniture - НПС садится только если в СК назначить референс мебели в Public Package Data. Вопрос как этот референс менять скриптом?
Добавил ActivateSpecialFurniture - НПС садится только если в СК назначить референс мебели в Public Package Data. Вопрос как этот референс менять скриптом?
Пакет должен быть у алиаса. (галочки Optional и пустая позиция SpecificRefererce) Пакет делается собственностью этого квеста. Делается второй алиас (настройки как у первого). В пакете для цели выбирается позиция алиас, и там назначается второй алиас.
Перед использованием фурнитуры на второй алиас назначается референс этой фурнитуры. akAlias02.ForceRefTo(akObjectRef) Для запуска пакета первому алиасу назначается этот актёр. akAlias01.ForceRefTo(akActor)
По окончании или для окончания сидения оба алиаса очищаются.
AleksTirex, спасибо. С алиасами пока не сталкивался. Буду разбираться.
Добавлено (28 Ноября 2013, 01:21) --------------------------------------------- Разобрался. Работает. Но это не совсем то, что мне нужно. Такая схема работает для одного НПС, а мне нужно для произвольного количества. Есть ли возможность в скрипте делать копии квеста для каждого НПС наподобие PlaceAtMe.
Такая схема работает для одного НПС, а мне нужно для произвольного количества.
Один алиас - один пакет и один стул. Если надо 20 стульев и НПС задействовать одновременно, тогда надо делать 20 алиасов. Как именно делается такое количество - надо смотреть в этой теме или в теме по скриптам, в этом месяце (или в прошлом) я приводил подробную инструкцию со скриптом. Разница с тем вариантом только в разных пакетах, но это в принципе вообще не разница. Поищи. (вряд ли у тебя одновременно будут сидеть более 20-30 НПС)
К сожалению, с пакетами работают только алиасы и сцены, а в сценах опять алиасы, вот и всё упирается в алиасы. В Скайриме нельзя добавить пакет скриптом, как это было в Обливионе, вот и приходится использовать что есть.
Изменить референс добавленного пакета ActivateSpecialFurniture я так понимаю тоже в скрипте не получиться, только СK?
О как! Менять ID базовых объектов... сильно, но увы, не получится, а равно добавлять и удалять сами пакеты. А зачем, если не секрет? Один пакет можно использовать на множество разных целей, просто меняется референс на алиасе, который является целью пакета.
****** референс - ссылка на объект, а ActivateSpecialFurniture - ID базового объекта, к тому же это Package Template, т.е. базовый объект для других базовых объектов. Пакеты, квесты, заклинания и подобное, по определению не могут иметь референса (в его истинном значении), т.к. не могут находиться в игровом мире.
О как! Менять ID базовых объектов... сильно, но увы, не получится, а равно добавлять и удалять сами пакеты. А зачем, если не секрет? Один пакет можно использовать на множество разных целей, просто меняется референс на алиасе, который является целью пакета. ****** референс - ссылка на объект, а ActivateSpecialFurniture - ID базового объекта, к тому же это Package Template, т.е. базовый объект для других базовых объектов. Пакеты, квесты, заклинания и подобное, по определению не могут иметь референса (в его истинном значении), т.к. не могут находиться в игровом мире.
Я неправильно выразил свою мысль. Я имел ввиду изменить значение переменной Target процедуры Activate из ActivateSpecialFurniture. Ведь если этой переменной можно назначить референс в СК, то по идее и через скрипт ее можно как то изменить. Вообще то, в нормальном объектно ориентированном языке, я бы получил дочерний объект используя в качестве родителя свой Quest и далее работал бы с ним. в Papyrus я такой возможности пока не нашел.
А вообще, расскажу подробнее суть проблемы, может есть иной подход к ее решению: Я все еще допиливаю манекены, так сказать снимаю стружку, оживляю и превращаю из манекена в модель. Написал и на ум почему то пришел папа Карло... Командой SetDoingFavor я передаю игроку управление моделью. С передвижением проблем нет. Под управлением игрока модель ходит, садится, ложится... всё нормально (вообще без каких либо AI пакетов). Но если с сидящей/лежащей моделью покинуть локацию и вновь войти - модель оказывается стоящей рядом с мебелью. Проблема: как заставить модель сидеть/лежать при загрузке локации. Использование ActivateSpecialFurniture проблему решает частично - при загрузке локации модель появляется стоящей, а потом идет и садится/ложится (а хочется, чтобы она загружалась уже сидящей/лежащей). Да, чуть не забыл: моделей может быть много... поэтому при смене референса на алиасе в пакете работает только текущая модель, а остальные нет.
Изменение репутации для пользователя Myprism
MyprismOffline
Сообщение №564
написано: 28 ноября 2013, 07:47
| Отредактировано: Myprism - 28 ноября 2013, 07:51
Условия устанавливаются на значения переменных в квесте. А вот переменные в квесте изменяются скриптами в данном же квесте или другими. Самая простая такая переменная - стадия квеста. Мы можем скриптом поменять стадию квеста и персонаж встанет со стула и ляжет на кровать потому что у него выключился пакет сидения и включился пакет сна. Можно и без квеста. Например, такой переменной может быть открыта или закрыта дверь. Пока дверь закрыта, выполняется пакет заключённого в камере. Как только откроется, включится песочница дома и персонаж пойдёт домой заниматься своими делами. Таким образом, я управлял своими персонажами, когда ещё не умел писать квесты Впрочем, и сейчас не очень умею
Myprism, если мою задачу реализовывать посредством квеста возникает проблема - квест должен одновременно работать для произвольного количества НПС, а я не представляю как это сделать без создания дополнительных алиасов для каждого НПС и каждой фурнитуры. То есть придется заморачиваться с созданием в скрипте квеста динамически изменяющихся массивов с алиасами на актеров и фурнитуру. Сделать то можно, но возникает вопрос: неужели мою задачу нельзя решить как нибудь попроще?
LordVadim, К сожалению, я не знаю, как полностью решить твою задачу, но предложенный мной способ работает на произвольное число персонажей. Это у тебя в голове сидит, что ты должен управлять каждым персонажем, и тогда - их число это проблема. В моём варианте персонажами совсем не надо управлять. Они действуют сами в соответствии со своими пакетами. А условие на выполнение пакетов одно, и не зависит от числа персонажей. Только те же пакеты должны стоять у всех. Условием должна быть некая глобальная переменная. Её можно создать и изменять помимо квестов. Но в квесте это получается правильнее.
Кстати, в ванильной игре при заходе в локацию мы обнаруживаем, что оружие, расставленное ранее на стойках, лежит на полу, а манекены стоят где попало. На наших глазах всё это расставляется по своим местам. Т.е. это подход разработчиков, что локация формируется при заходе в неё.
Изменение репутации для пользователя LordVadim
LordVadimOffline
Сообщение №567
написано: 28 ноября 2013, 09:16
| Отредактировано: LordVadim - 28 ноября 2013, 09:22
Я имел ввиду изменить значение переменной Target процедуры Activate из ActivateSpecialFurniture.
Так именно это я уже два раза тебе писал: Пакет делается собственностью твоего квеста, тогда в нём можно будет в качестве цели использовать алиас из твоего квеста. Вот этот алиас ты можешь менять/переназначать хоть каждую минуту и каждый раз целю этого пакета будет новый референс, который ты назначаешь на этот алиас. Это и есть менять Target в процедуре.
Вот сам твой пакет имеет процедуру активации, вот НПС и активирует с анимацией "сесть". А тебе надо процедура "сидеть", тогда и при загрузки эта процедура уже сразу загрузит сидящего НПС. Можно вместо Activate дать пакет Sit, или собрать свой пакет на основе Sit.
Так именно это я уже два раза тебе писал: Пакет делается собственностью твоего квеста, тогда в нём можно будет в качестве цели использовать алиас из твоего квеста. Вот этот алиас ты можешь менять/переназначать хоть каждую минуту и каждый раз целю этого пакета будет новый референс, который ты назначаешь на этот алиас. Это и есть менять Target в процедуре.
AleksTirex, да с квестом я уже понял концепцию. Я спрашивал нельзя ли это менять если пакет не к квесту привязан а к НПС?
AleksTirex, да с квестом я уже понял концепцию. Я спрашивал нельзя ли это менять если пакет не к квесту привязан а к НПС?
Так назначь алиасу №1 твоего НПС, а на этом алиасе пакет с динамической целью - алиаас №2. Менять как либо параметры пакета, кроме как изменение параметров алиаса, никак.
Единственно, что можно сделать, так в пакете кучу процедур со своей целью и с условием на срабатывание, тогда в зависимости от условия будет срабатывать нужная процедура и нужная цель. Но в этом случае всё равно придётся заранее прописывать сами цели, они должны быть заранее известны и назначены в пакете.
Форум » TES V: Skyrim » Мастерская » Вопросы по скриптам Papyrus (О скриптах Papyrus (Skyrim). Скриптеры не проходите мимо!)